package evm import ( "fmt" "strings" "sync" "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" ) type TokenMapper interface { AddToken(symbol string, address common.Address) AddAlias(alias string, symbol string) GetTokenAddress(symbol string) (common.Address, error) } type tokenMapper struct { aliases map[string]string tokens map[string]common.Address lock *sync.Mutex } func NewTokenMapper() TokenMapper { return &tokenMapper{ aliases: make(map[string]string), tokens: make(map[string]common.Address), lock: &sync.Mutex{}, } } func (t *tokenMapper) AddToken(symbol string, address common.Address) { t.lock.Lock() defer t.lock.Unlock() t.tokens[strings.ToUpper(symbol)] = address } func (t *tokenMapper) AddAlias(alias string, symbol string) { t.lock.Lock() defer t.lock.Unlock() t.aliases[strings.ToUpper(alias)] = strings.ToUpper(symbol) } func (t *tokenMapper) GetTokenAddress(symbol string) (common.Address, error) { t.lock.Lock() defer t.lock.Unlock() symbol = strings.ToUpper(symbol) lsymbol := symbol if alias, ok := t.aliases[symbol]; ok { lsymbol = alias } address, ok := t.tokens[lsymbol] if !ok { aliasmsg := "" if lsymbol != symbol { aliasmsg = fmt.Sprintf(" (alias of %s", symbol) } return common.Address{}, errors.Errorf("no address registered for symbol %s%s", lsymbol, aliasmsg) } return address, nil }