From 931af3d3af91f4118aa0e5a374fae3ead955b8f5 Mon Sep 17 00:00:00 2001 From: cryptooda Date: Mon, 8 Dec 2025 23:37:10 +0700 Subject: [PATCH] Refactor SpotBot and ExchangeService for balance retrieval - Updated SpotBot to fetch token balance directly using the new GetBalance method in IExchangeService. - Modified IExchangeService to include a method for retrieving balance by ticker. - Enhanced ExchangeService to implement the new balance retrieval logic for both EVM and non-EVM exchanges. - Updated TokenService to streamline contract address and decimal retrieval for various tokens. - Adjusted TradesModal to reflect changes in position status handling. --- .../Services/IExchangeService.cs | 3 +- .../TradingBaseTests.cs | 9 +- src/Managing.Application/Bots/SpotBot.cs | 9 +- .../ExchangeService.cs | 41 +++++- .../ExchangeServicesTests.cs | 9 +- .../EvmManager.cs | 3 +- .../Referentials/Arbitrum.cs | 77 +++++++++- .../Services/TokenService.cs | 132 +++++++++++++----- .../mollecules/TradesModal/TradesModal.tsx | 3 +- 9 files changed, 232 insertions(+), 54 deletions(-) diff --git a/src/Managing.Application.Abstractions/Services/IExchangeService.cs b/src/Managing.Application.Abstractions/Services/IExchangeService.cs index 213225cd..b864b93d 100644 --- a/src/Managing.Application.Abstractions/Services/IExchangeService.cs +++ b/src/Managing.Application.Abstractions/Services/IExchangeService.cs @@ -1,4 +1,4 @@ -using Managing.Domain.Accounts; +using Managing.Domain.Accounts; using Managing.Domain.Candles; using Managing.Domain.Statistics; using Managing.Domain.Trades; @@ -24,6 +24,7 @@ public interface IExchangeService decimal? takeProfitPrice = null); Task GetBalance(Account account, bool isForPaperTrading = false); + Task GetBalance(Account account, Ticker ticker); Task> GetBalances(Account account, bool isForPaperTrading = false); Task GetPrice(Account account, Ticker ticker, DateTime date); Task GetCurrentPrice(Account account, Ticker ticker); diff --git a/src/Managing.Application.Tests/TradingBaseTests.cs b/src/Managing.Application.Tests/TradingBaseTests.cs index e718c824..bfdf17e6 100644 --- a/src/Managing.Application.Tests/TradingBaseTests.cs +++ b/src/Managing.Application.Tests/TradingBaseTests.cs @@ -1,4 +1,4 @@ -using Managing.Application.Abstractions.Repositories; +using Managing.Application.Abstractions.Repositories; using Managing.Application.Abstractions.Services; using Managing.Application.Backtests; using Managing.Application.Bots; @@ -47,8 +47,11 @@ namespace Managing.Application.Tests evmProcessor }; - return new ExchangeService(loggerFactory.CreateLogger(), GetCandleRepository(), - exchangeProcessors); + return new ExchangeService( + loggerFactory.CreateLogger(), + GetCandleRepository(), + exchangeProcessors, + evmManager); } public static ILogger CreateTradingBotLogger() diff --git a/src/Managing.Application/Bots/SpotBot.cs b/src/Managing.Application/Bots/SpotBot.cs index 944dab89..a13004ce 100644 --- a/src/Managing.Application/Bots/SpotBot.cs +++ b/src/Managing.Application/Bots/SpotBot.cs @@ -85,14 +85,9 @@ public class SpotBot : TradingBotBase, ITradingBot // For spot trading, fetch token balance directly and update PnL based on current price try { - var balances = await ServiceScopeHelpers.WithScopedService>( + var tokenBalance = await ServiceScopeHelpers.WithScopedService( _scopeFactory, - async exchangeService => { return await exchangeService.GetBalances(Account); }); - - // Find the token balance for the ticker - var tickerString = Config.Ticker.ToString(); - var tokenBalance = balances.FirstOrDefault(b => - b.TokenName?.Equals(tickerString, StringComparison.OrdinalIgnoreCase) == true); + async exchangeService => await exchangeService.GetBalance(Account, Config.Ticker)); if (tokenBalance == null || tokenBalance.Amount <= 0) { diff --git a/src/Managing.Infrastructure.Exchanges/ExchangeService.cs b/src/Managing.Infrastructure.Exchanges/ExchangeService.cs index 7cf7c009..f95f178a 100644 --- a/src/Managing.Infrastructure.Exchanges/ExchangeService.cs +++ b/src/Managing.Infrastructure.Exchanges/ExchangeService.cs @@ -1,5 +1,6 @@ -using Managing.Application.Abstractions.Repositories; +using Managing.Application.Abstractions.Repositories; using Managing.Application.Abstractions.Services; +using Managing.Common; using Managing.Domain.Accounts; using Managing.Domain.Candles; using Managing.Domain.Statistics; @@ -16,13 +17,18 @@ namespace Managing.Infrastructure.Exchanges private readonly ILogger _logger; private readonly ICandleRepository _candleRepository; private readonly IEnumerable _exchangeProcessor; + private readonly IEvmManager _evmManager; - public ExchangeService(ILogger logger, ICandleRepository candleRepository, - IEnumerable processor) + public ExchangeService( + ILogger logger, + ICandleRepository candleRepository, + IEnumerable processor, + IEvmManager evmManager) { _logger = logger; _candleRepository = candleRepository; _exchangeProcessor = processor; + _evmManager = evmManager; } #region Trades @@ -253,6 +259,35 @@ namespace Managing.Infrastructure.Exchanges return await processor.GetBalance(account); } + public async Task GetBalance(Account account, Ticker ticker) + { + if (!IsEvmExchange(account)) + { + var processor = GetProcessor(account); + var balances = await processor.GetBalances(account); + + return balances.FirstOrDefault(balance => + string.Equals(balance.TokenName, ticker.ToString(), StringComparison.InvariantCultureIgnoreCase)); + } + + var evmBalance = await _evmManager.GetTokenBalance(Constants.Chains.Arbitrum, ticker, account.Key); + + if (evmBalance == null) + { + return null; + } + + return new Balance + { + TokenName = evmBalance.TokenName, + Price = evmBalance.Price, + Value = evmBalance.Value, + Amount = evmBalance.Balance, + TokenAdress = evmBalance.TokenAddress, + Chain = evmBalance.Chain + }; + } + public async Task GetFee(Account account, bool isForPaperTrading = false) { var processor = GetProcessor(account); diff --git a/src/Managing.Infrastructure.Tests/ExchangeServicesTests.cs b/src/Managing.Infrastructure.Tests/ExchangeServicesTests.cs index 928894a0..d03937c0 100644 --- a/src/Managing.Infrastructure.Tests/ExchangeServicesTests.cs +++ b/src/Managing.Infrastructure.Tests/ExchangeServicesTests.cs @@ -1,4 +1,4 @@ -using Managing.Application.Abstractions.Repositories; +using Managing.Application.Abstractions.Repositories; using Managing.Application.Abstractions.Services; using Managing.Domain.Candles; using Managing.Domain.Trades; @@ -35,8 +35,11 @@ namespace Managing.Infrastructure.Tests evmProcessor }; - _exchangeService = new ExchangeService(doesntDoMuch.CreateLogger(), candleRepository, - exchangeProcessors); + _exchangeService = new ExchangeService( + doesntDoMuch.CreateLogger(), + candleRepository, + exchangeProcessors, + evmManager); } [Theory] diff --git a/src/Managing.Infrastructure.Web3/EvmManager.cs b/src/Managing.Infrastructure.Web3/EvmManager.cs index f679db90..b9350abc 100644 --- a/src/Managing.Infrastructure.Web3/EvmManager.cs +++ b/src/Managing.Infrastructure.Web3/EvmManager.cs @@ -248,8 +248,7 @@ public class EvmManager : IEvmManager return null; var balance = await queryHandler - .QueryAsync(contractAddress, balanceOfMessage) - .ConfigureAwait(false); + .QueryAsync(contractAddress, balanceOfMessage); var lastCandle = await GetCandle(ticker); var tokenUsdPrice = lastCandle.Close; diff --git a/src/Managing.Infrastructure.Web3/Referentials/Arbitrum.cs b/src/Managing.Infrastructure.Web3/Referentials/Arbitrum.cs index 98b4b07c..b345ffe1 100644 --- a/src/Managing.Infrastructure.Web3/Referentials/Arbitrum.cs +++ b/src/Managing.Infrastructure.Web3/Referentials/Arbitrum.cs @@ -1,4 +1,4 @@ -namespace Managing.Infrastructure.Evm.Referentials; +namespace Managing.Infrastructure.Evm.Referentials; public class Arbitrum { @@ -10,10 +10,84 @@ public class Arbitrum public const string UNI = "0xfa7f8980b0f1e64a2062791cc3b0871572f1f7f0"; public const string USDC = "0xaf88d065e77c8cc2239327c5edb3a432268e5831"; + public const string USDCe = "0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8"; public const string USDT = "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9"; public const string DAI = "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1"; public const string MIM = "0xFEa7a6a0B346362BF88A9e4A88416B77a57D6c2A"; public const string FRAX = "0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F"; + public const string ARB = "0x912CE59144191C1204E64559FE8253a0e49E6548"; + public const string SOL = "0x2bcC6D6CdBbDC0a4071e48bb3B969b06B3330c07"; + public const string GMX = "0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a"; + public const string BNB = "0xa9004A5421372E1D83fB1f85b0fc986c912f91f3"; + public const string DOGE = "0xC4da4c24fd591125c3F47b340b6f4f76111883d8"; + public const string LTC = "0xB46A094Bc4B0adBD801E14b9DB95e05E28962764"; + public const string XRP = "0xc14e065b0067dE91534e032868f5Ac6ecf2c6868"; + public const string ATOM = "0x7D7F1765aCbaF847b9A1f7137FE8Ed4931FbfEbA"; + public const string NEAR = "0x1FF7F3EFBb9481Cbd7db4F932cBCD4467144237C"; + public const string AAVE = "0xba5DdD1f9d7F570dc94a51479a000E3BCE967196"; + public const string AVAX = "0x565609fAF65B92F7be02468acF86f8979423e514"; + public const string OP = "0xaC800FD6159c2a2CB8fC31EF74621eB430287a5A"; + public const string PEPE = "0x25d887Ce7a35172C62FeBFD67a1856F20FaEbB00"; + public const string WIF = "0xA1b91fe9FD52141Ff8cac388Ce3F10BFDc1dE79d"; + public const string ORDI = "0x1E15d08f3CA46853B692EE28AE9C7a0b88a9c994"; + public const string STX = "0xBaf07cF91D413C0aCB2b7444B9Bf13b4e03c9D71"; + public const string USDE = "0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34"; + public const string WSTETH = "0x5979D7b546E38E414F7E9822514be443A4800529"; + public const string SHIB = "0x3E57D02f9d196873e55727382974b02EdebE6bfd"; + public const string TBTC = "0x6c84a8f1c29108F47a79964b5Fe888D4f4D0dE40"; + public const string EIGEN = "0x606C3e5075e5555e79Aa15F1E9FACB776F96C248"; + public const string SATS = "0x2cD2eB61D17b78239Fcd19aafF72981B5D5eF319"; + public const string POL = "0x9c74772b713a1B032aEB173E28683D937E51921c"; + public const string APE = "0x7f9FBf9bDd3F4105C478b996B648FE6e828a1e98"; + public const string SUI = "0x197aa2DE1313c7AD50184234490E12409B2a1f95"; + public const string SEI = "0x55e85A147a1029b985384822c0B2262dF8023452"; + public const string APT = "0x3f8f0dCE4dCE4d0D1d0871941e79CDA82cA50d0B"; + public const string TIA = "0x38676f62d166f5CE7De8433F51c6B3D6D9d66C19"; + public const string TRX = "0xb06aa7E4af937C130dDade66f6ed7642716fe07A"; + public const string TON = "0xB2f7cefaeEb08Aa347705ac829a7b8bE2FB560f3"; + public const string WLD = "0x75B9AdD873641b253718810E6c65dB6d72311FD0"; + public const string BONK = "0x1FD10E767187A92f0AB2ABDEEF4505e319cA06B2"; + public const string TAO = "0x938aef36CAaFbcB37815251B602168087eC14648"; + public const string BOME = "0x3Eea56A1ccCdbfB70A26aD381C71Ee17E4c8A15F"; + public const string FLOKI = "0x6792c5B8962ffbDD020c6b6FD0Be7b182e0e33a3"; + public const string MEME = "0xaF770F03518686a365300ab35AD860e99967B2f0"; + public const string MEW = "0x5503CF72f54b6d692d36BBCD391516A7dE068687"; + public const string PENDLE = "0x0c880f6761F1af8d9Aa9C466984b80DAb9a8c9e8"; + public const string ADA = "0x53186c8419BEB83fE4Da74F7875041a1287337ED"; + public const string BCH = "0xc33D9C096e74aa4f571E9417b69a19C4A1e72ef2"; + public const string DOT = "0xE958f107b467d5172573F761d26931D658C1b436"; + public const string ICP = "0xdaf0A71608938F762e37eC5F72F670Cc44703454"; + public const string XLM = "0xc5dbD52Ae5a927Cf585B884011d0C7631C9974c6"; + public const string RENDER = "0x82BB89fcc64c5d4016C5Ed1AB016bB0D1C20D6C3"; + public const string FIL = "0x3AeBb98f57081DcBEb0B8EA823Cf84900A31e5D8"; + public const string DYDX = "0x0739Ad7AeA69aD36EdEb91b0e55cAC140427c632"; + public const string INJ = "0xfdE73EddbE6c5712A12B72c470F8FE5c77A7fF17"; + public const string TRUMP = "0x30021aFA4767Ad66aA52A06dF8a5AB3acA9371fD"; + public const string MELANIA = "0xfa4F8E582214eBCe1A08eB2a65e08082053E441F"; + public const string ENA = "0xfe1Aac2CD9C5cC77b58EeCfE75981866ed0c8b7a"; + public const string AI16Z = "0xBb69bd9dc152C2c0F083507641a46193d2B61EBb"; + public const string ANIME = "0x37a645648dF29205C6261289983FB04ECD70b4B3"; + public const string FARTCOIN = "0xaca341E61aB6177B0b0Df46a612e4311F8a7605f"; + public const string BERA = "0x67ADABbAd211eA9b3B4E2fd0FD165E593De1e983"; + public const string LDO = "0x9D678B4Dd38a6E01df8090aEB7974aD71142b05f"; + public const string VIRTUAL = "0xB6672496214C90134A9223894e709F26A5eED362"; + public const string PENGU = "0x4C1dac9b6eAf122Fe3DE824c1C2220413F3aC197"; + public const string FET = "0x83D5944E7f5EF1d8432002d3cb062e1012f6F8e6"; + public const string ONDO = "0xEcFB4718aD19b626A77491895a2f99ea0cedEd08"; + public const string AIXBT = "0xcA543Cb8bCC76e4E0A034F56EB40a1029bDFd70E"; + public const string S = "0x8F6cCb99d4Fd0B4095915147b5ae3bbDb8075394"; + public const string CAKE = "0x580b373Ac16803BB0133356F470f3c7EEF54151B"; + public const string HYPE = "0xfDFA0A749dA3bCcee20aE0B4AD50E39B26F58f7C"; + public const string JUP = "0xfEd500Df379427Fbc48BDaf3b511b519c7eCCD26"; + public const string MKR = "0x8904De84c3bB3B7D2383F934Af40FcB3Ef82F28b"; + public const string OM = "0x1f3407Ea067DfBDF6dEb6bBFdA4869215fB0ab77"; + public const string DOLO = "0x97Ce1F309B949f7FBC4f58c5cb6aa417A5ff8964"; + public const string XMR = "0x13674172E6E44D31d4bE489d5184f3457c40153A"; + public const string CRV = "0xe5f01aeAcc8288E9838A60016AB00d7b6675900b"; + public const string ALGO = "0x72Cd3a21aA7A898028d9501868Fbe6dED0020434"; + public const string CRO = "0xB7EfE7c7f059E84Ab87A83A169c583Fb4A54fAc3"; + public const string HBAR = "0xEb2A83b973f4dbB9511D92dd40d2ba4C683f0971"; + public const string CVX = "0x3B6f801C0052Dfe0Ac80287D611F31B7c47B9A6b"; public const string Vault = "0x489ee077994B6658eAfA855C308275EAd8097C4A"; public const string VaultPriceFeed = "0x2d68011bcA022ed0E474264145F46CC4de96a002"; @@ -25,7 +99,6 @@ public class Arbitrum public const string RewardReader = "0xe725Ad0ce3eCf68A7B93d8D8091E83043Ff12e9A"; public const string GLP = "0x4277f8f2c384827b5273592ff7cebd9f2c1ac258"; - public const string GMX = "0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a"; public const string ES_GMX = "0xf42ae1d54fd613c9bb14810b0588faaa09a426ca"; public const string BN_GMX = "0x35247165119B69A40edD5304969560D0ef486921"; public const string USDG = "0x45096e7aA921f27590f8F19e457794EB09678141"; diff --git a/src/Managing.Infrastructure.Web3/Services/TokenService.cs b/src/Managing.Infrastructure.Web3/Services/TokenService.cs index 16ce898f..9364acb6 100644 --- a/src/Managing.Infrastructure.Web3/Services/TokenService.cs +++ b/src/Managing.Infrastructure.Web3/Services/TokenService.cs @@ -14,6 +14,90 @@ public static class TokenService public static string GeckoJson = @"[{'Id':'blockstack','Symbol':'stx'},{'Id':'bitcoin','Symbol':'btc'},{'Id':'liquidity-dividends-protocol','Symbol':'LID'},{'Id':'uma','Symbol':'uma'},{'Id':'uptrennd','Symbol':'1up'},{'Id':'math','Symbol':'math'},{'Id':'dos-network','Symbol':'dos'},{'Id':'xdai-stake','Symbol':'stake'},{'Id':'tellor','Symbol':'trb'},{'Id':'yearn-finance','Symbol':'yfi'},{'Id':'streamr-datacoin','Symbol':'data'},{'Id':'wrapped-nxm','Symbol':'wnxm'},{'Id':'basic-attention-token','Symbol':'bat'},{'Id':'the-abyss','Symbol':'abyss'},{'Id':'decentraland','Symbol':'mana'},{'Id':'xio','Symbol':'xio'},{'Id':'grid','Symbol':'grid'},{'Id':'howdoo','Symbol':'udoo'},{'Id':'curio','Symbol':'cur'},{'Id':'tendies','Symbol':'tend'},{'Id':'numeraire','Symbol':'nmr'},{'Id':'owl','Symbol':'owl'},{'Id':'parachute','Symbol':'par'},{'Id':'reserve','Symbol':'rsv'},{'Id':'bancor','Symbol':'bnt'},{'Id':'sapien','Symbol':'spn'},{'Id':'wrapped-bitcoin','Symbol':'wbtc'},{'Id':'raiden-network','Symbol':'rdn'},{'Id':'toshify-finance','Symbol':'YFT'},{'Id':'idextools','Symbol':'dext'},{'Id':'airswap','Symbol':'ast'},{'Id':'yflink','Symbol':'yfl'},{'Id':'blitzpredict','Symbol':'xbp'},{'Id':'hex','Symbol':'hex'},{'Id':'cream-2','Symbol':'cream'},{'Id':'simple-token','Symbol':'ost'},{'Id':'bilira','Symbol':'tryb'},{'Id':'viberate','Symbol':'vib'},{'Id':'global-digital-content','Symbol':'gdc'},{'Id':'usd-bancor','Symbol':'usdb'},{'Id':'dark-energy-crystals','Symbol':'dec'},{'Id':'q-dao-governance-token-v1-0','Symbol':'qdao'},{'Id':'blockv','Symbol':'vee'},{'Id':'aidcoin','Symbol':'aid'},{'Id':'tokenbox','Symbol':'tbx'},{'Id':'peerex-network','Symbol':'PERX'},{'Id':'rivetz','Symbol':'rvt'},{'Id':'republic-protocol','Symbol':'ren'},{'Id':'oracolxor','Symbol':'xor'},{'Id':'funfair','Symbol':'fun'},{'Id':'civic','Symbol':'cvc'},{'Id':'spankchain','Symbol':'spank'},{'Id':'cap','Symbol':'cap'},{'Id':'v-id-blockchain','Symbol':'vidt'},{'Id':'vision','Symbol':'vsn'},{'Id':'libertas-token','Symbol':'libertas'},{'Id':'foam-protocol','Symbol':'foam'},{'Id':'usdq','Symbol':'usdq'},{'Id':'quant-network','Symbol':'qnt'},{'Id':'zinc','Symbol':'zinc'},{'Id':'ghost-by-mcafee','Symbol':'ghost'},{'Id':'key','Symbol':'key'},{'Id':'mini','Symbol':'mini'},{'Id':'mcdex','Symbol':'mcb'},{'Id':'digix-gold','Symbol':'dgx'},{'Id':'binance-usd','Symbol':'busd'},{'Id':'chainlink','Symbol':'link'},{'Id':'daostack','Symbol':'gen'},{'Id':'bzx-protocol','Symbol':'bzrx'},{'Id':'bluzelle','Symbol':'blz'},{'Id':'trust','Symbol':'trust'},{'Id':'livepeer','Symbol':'lpt'},{'Id':'power-ledger','Symbol':'powr'},{'Id':'dether','Symbol':'DTH'},{'Id':'cosplay-token','Symbol':'cot'},{'Id':'deviantcoin','Symbol':'dev'},{'Id':'cdai','Symbol':'cdai'},{'Id':'mybit-token','Symbol':'myb'},{'Id':'seth','Symbol':'seth'},{'Id':'defipie','Symbol':'PIE'},{'Id':'iexec-rlc','Symbol':'rlc'},{'Id':'linkart','Symbol':'lar'},{'Id':'martexcoin','Symbol':'mxt'},{'Id':'jetswap-token','Symbol':'wings'},{'Id':'smart-mfg','Symbol':'mfg'},{'Id':'gnosis','Symbol':'gno'},{'Id':'sirin-labs-token','Symbol':'srn'},{'Id':'bankroll-vault','Symbol':'vlt'},{'Id':'geeq','Symbol':'GEEQ'},{'Id':'unifi-protocol','Symbol':'up'},{'Id':'holotoken','Symbol':'hot'},{'Id':'polytrade','Symbol':'trade'},{'Id':'props','Symbol':'props'},{'Id':'amon','Symbol':'amn'},{'Id':'status','Symbol':'SNT'},{'Id':'boxx','Symbol':'boxx'},{'Id':'morpheus-network','Symbol':'mrph'},{'Id':'dfohub','Symbol':'buidl'},{'Id':'santiment-network-token','Symbol':'san'},{'Id':'robonomics-network','Symbol':'xrt'},{'Id':'ethlend','Symbol':'lend'},{'Id':'measurable-data-token','Symbol':'mdt'},{'Id':'origin-protocol','Symbol':'ogn'},{'Id':'atlantis-token','Symbol':'atis'},{'Id':'remme','Symbol':'rem'},{'Id':'goldmint','Symbol':'mntp'},{'Id':'unibright','Symbol':'ubt'},{'Id':'dia-data','Symbol':'DIA'},{'Id':'reserve-rights-token','Symbol':'rsr'},{'Id':'penta','Symbol':'pnt'},{'Id':'akropolis','Symbol':'akro'},{'Id':'nervenetwork','Symbol':'nvt'},{'Id':'swipe','Symbol':'sxp'},{'Id':'paxos-standard','Symbol':'pax'},{'Id':'request-network','Symbol':'req'},{'Id':'orion-protocol','Symbol':'orn'},{'Id':'real','Symbol':'real'},{'Id':'kleros','Symbol':'pnk'},{'Id':'lock-token','Symbol':'lock'},{'Id':'deipool','Symbol':'dip'},{'Id':'ocean-protocol','Symbol':'ocean'},{'Id':'strong','Symbol':'strong'},{'Id':'polymath-network','Symbol':'poly'},{'Id':'digital-rand','Symbol':'dzar'},{'Id':'eth-rsi-60-40-yield-set','Symbol':'ethrsiapy'},{'Id':'maker','Symbol':'mkr'},{'Id':'usd-coin','Symbol':'usdc'},{'Id':'pundi-x','Symbol':'npxs'},{'Id':'yfii-finance','Symbol':'yfii'},{'Id':'dxdao','Symbol':'dxd'},{'Id':'meta','Symbol':'mta'},{'Id':'metronome','Symbol':'met'},{'Id':'equus-mining-token','Symbol':'eqmt'},{'Id':'stableusd','Symbol':'USDS'},{'Id':'loom-network-new','Symbol':'loom'},{'Id':'agrinovuscoin','Symbol':'agri'},{'Id':'celsius-degree-token','Symbol':'cel'},{'Id':'tokencard','Symbol':'tkn'},{'Id':'transcodium','Symbol':'tns'},{'Id':'ceek','Symbol':'ceek'},{'Id':'compound-0x','Symbol':'czrx'},{'Id':'cryptofranc','Symbol':'xchf'},{'Id':'rocket-pool','Symbol':'rpl'},{'Id':'perlin','Symbol':'perl'},{'Id':'stonk','Symbol':'stonk'},{'Id':'bitsou','Symbol':'btu'},{'Id':'release-ico-project','Symbol':'rel'},{'Id':'balancer','Symbol':'bal'},{'Id':'band-protocol','Symbol':'band'},{'Id':'pangea','Symbol':'xpat'},{'Id':'loopring','Symbol':'lrc'},{'Id':'ink-protocol','Symbol':'xnk'},{'Id':'meter-governance-mapped-by-meter-io','Symbol':'eMTRG'},{'Id':'kardiachain','Symbol':'kai'},{'Id':'storm','Symbol':'stmx'},{'Id':'aelf','Symbol':'elf'},{'Id':'compound-coin','Symbol':'comp'},{'Id':'havven','Symbol':'snx'},{'Id':'aleph','Symbol':'aleph'},{'Id':'weth','Symbol':'weth'},{'Id':'compound-wrapped-btc','Symbol':'cwbtc'},{'Id':'auctus','Symbol':'auc'},{'Id':'lamden','Symbol':'tau'},{'Id':'quadrant-protocol','Symbol':'equad'},{'Id':'trendering','Symbol':'trnd'},{'Id':'gifto','Symbol':'gto'},{'Id':'zzz-finance','Symbol':'zzz'},{'Id':'trustswap','Symbol':'swap'},{'Id':'nectar-token','Symbol':'nec'},{'Id':'anj','Symbol':'anj'},{'Id':'yffi-finance','Symbol':'yffi'},{'Id':'cbi-index-7','Symbol':'cbix7'},{'Id':'machix','Symbol':'mcx'},{'Id':'omisego','Symbol':'omg'},{'Id':'ong','Symbol':'ong'},{'Id':'ampleforth','Symbol':'ampl'},{'Id':'cindicator','Symbol':'cnd'},{'Id':'fintrux','Symbol':'ftx'},{'Id':'dfohub','Symbol':'buidl'},{'Id':'sociall','Symbol':'scl'},{'Id':'pluton','Symbol':'plu'},{'Id':'tether','Symbol':'usdt'},{'Id':'stasis-eurs','Symbol':'eurs'},{'Id':'kyber-network','Symbol':'kncl'},{'Id':'mainframe','Symbol':'mft'},{'Id':'husd','Symbol':'husd'},{'Id':'karma-dao','Symbol':'karma'},{'Id':'rmpl','Symbol':'rmpl'},{'Id':'shipchain','Symbol':'ship'},{'Id':'pillar','Symbol':'plr'},{'Id':'0x','Symbol':'zrx'},{'Id':'2key','Symbol':'2key'},{'Id':'renbtc','Symbol':'renbtc'},{'Id':'melon','Symbol':'mln'},{'Id':'zippie','Symbol':'zipt'},{'Id':'askobar-network','Symbol':'asko'},{'Id':'ethereum-vault','Symbol':'ethv'},{'Id':'finnexus','Symbol':'fnx'},{'Id':'evo','Symbol':'evo'},{'Id':'flixxo','Symbol':'flixx'},{'Id':'pamp-cc','Symbol':'PAMP'},{'Id':'hedgetrade','Symbol':'hedg'},{'Id':'dmst','Symbol':'dmst'},{'Id':'unicrypt','Symbol':'unc'},{'Id':'unipower','Symbol':'power'},{'Id':'metal','Symbol':'mtl'},{'Id':'enjincoin','Symbol':'enj'},{'Id':'compound-usdt','Symbol':'cusdt'},{'Id':'indorse','Symbol':'ind'},{'Id':'antiample','Symbol':'xamp'},{'Id':'ripio-credit-network','Symbol':'rcn'},{'Id':'trueaud','Symbol':'taud'},{'Id':'truegbp','Symbol':'tgbp'},{'Id':'truehkd','Symbol':'thkd'},{'Id':'gastoken','Symbol':'gst2'},{'Id':'chai','Symbol':'chai'},{'Id':'compound-basic-attention-token','Symbol':'cbat'},{'Id':'compound-sai','Symbol':'csai'},{'Id':'compound-ether','Symbol':'ceth'},{'Id':'compound-usd-coin','Symbol':'cusdc'},{'Id':'compound-augur','Symbol':'crep'},{'Id':'leo-token','Symbol':'leo'},{'Id':'huobi-token','Symbol':'ht'},{'Id':'matic-network','Symbol':'matic'},{'Id':'dai','Symbol':'dai'},{'Id':'sai','Symbol':'sai'},{'Id':'nusd','Symbol':'susd'},{'Id':'seur','Symbol':'seur'},{'Id':'ibtc','Symbol':'iBTC'},{'Id':'sbtc','Symbol':'sbtc'},{'Id':'saud','Symbol':'saud'},{'Id':'scex','Symbol':'scex'},{'Id':'sada','Symbol':'sada'},{'Id':'sdash','Symbol':'sdash'},{'Id':'seos','Symbol':'seos'},{'Id':'setc','Symbol':'setc'},{'Id':'sxmr','Symbol':'sxmr'},{'Id':'sxrp','Symbol':'sxrp'},{'Id':'sxag','Symbol':'sxag'},{'Id':'sltc','Symbol':'sltc'},{'Id':'ieth','Symbol':'ieth'},{'Id':'sdefi','Symbol':'sdefi'},{'Id':'sxau','Symbol':'sxau'},{'Id':'sbnb','Symbol':'sbnb'},{'Id':'sxtz','Symbol':'sxtz'},{'Id':'shiba-link','Symbol':'slink'},{'Id':'ibnb-2','Symbol':'ibnb'},{'Id':'ieos','Symbol':'ieos'},{'Id':'dollars','Symbol':'usdx'},{'Id':'true-usd','Symbol':'tusd'},{'Id':'trustline-network','Symbol':'tln'},{'Id':'lunch-money','Symbol':'lmy'},{'Id':'ybusd','Symbol':'ybusd'},{'Id':'ytusd','Symbol':'ytusd'},{'Id':'blockchain-certified-data-token','Symbol':'bcdt'},{'Id':'lendroid-support-token','Symbol':'lst'},{'Id':'marketpeak','Symbol':'peak'},{'Id':'pantos','Symbol':'pan'},{'Id':'gemini-dollar','Symbol':'gusd'},{'Id':'proton','Symbol':'xpr'},{'Id':'keep-network','Symbol':'keep'},{'Id':'renzec','Symbol':'renzec'},{'Id':'renbch','Symbol':'renbch'},{'Id':'t-bitcoin','Symbol':'tbtc'},{'Id':'huobi-btc','Symbol':'hbtc'},{'Id':'shuffle-monster','Symbol':'shuf'},{'Id':'donut','Symbol':'donut'},{'Id':'chi-gastoken','Symbol':'chi'},{'Id':'switch','Symbol':'esh'},{'Id':'pax-gold','Symbol':'paxg'},{'Id':'0xmonero','Symbol':'0xmr'},{'Id':'storj','Symbol':'storj'},{'Id':'salt','Symbol':'salt'},{'Id':'curve-fi-ydai-yusdc-yusdt-ytusd','Symbol':'yCurve'},{'Id':'rarible','Symbol':'rari'},{'Id':'pareto-network','Symbol':'pareto'},{'Id':'plutus-defi','Symbol':'plt'},{'Id':'ptokens-btc','Symbol':'pbtc'},{'Id':'serum','Symbol':'srm'},{'Id':'autonio','Symbol':'niox'},{'Id':'defi-stoa','Symbol':'sta'},{'Id':'falcon-token','Symbol':'fnt'},{'Id':'yam-2','Symbol':'yam'},{'Id':'addax','Symbol':'adx'},{'Id':'curve-dao-token','Symbol':'crv'},{'Id':'darwinia-network-native-token','Symbol':'ring'},{'Id':'cartesi','Symbol':'ctsi'},{'Id':'unilayer','Symbol':'layer'},{'Id':'degenerator','Symbol':'meme'},{'Id':'origintrail','Symbol':'trac'},{'Id':'yam-v2','Symbol':'YAMv2'},{'Id':'jarvis-reward-token','Symbol':'jrt'},{'Id':'neutrino','Symbol':'usdn'},{'Id':'parsiq','Symbol':'prq'},{'Id':'hakka-finance','Symbol':'hakka'},{'Id':'robonomics-web-services','Symbol':'rws'},{'Id':'growth-defi','Symbol':'gro'},{'Id':'concentrated-voting-power','Symbol':'cvp'},{'Id':'ethopt','Symbol':'opt'},{'Id':'sushi','Symbol':'sushi'},{'Id':'stacktical','Symbol':'dsla'},{'Id':'swapfolio','Symbol':'swfl'},{'Id':'fsw-token','Symbol':'fsw'},{'Id':'akropolis-delphi','Symbol':'adel'},{'Id':'swerve-dao','Symbol':'swrv'},{'Id':'multiplier','Symbol':'mxx'},{'Id':'genesis-vision','Symbol':'gvt'},{'Id':'step-finance','Symbol':'step'},{'Id':'safe-coin','Symbol':'safe'},{'Id':'predix-network','Symbol':'prdx'},{'Id':'defipulse-index','Symbol':'dpi'},{'Id':'aavegotchi','Symbol':'ghst'},{'Id':'unicorn-token','Symbol':'uni'},{'Id':'game-x-coin','Symbol':'gxc'},{'Id':'pickle-finance','Symbol':'pickle'},{'Id':'frontier-token','Symbol':'front'},{'Id':'dhedge-dao','Symbol':'dht'},{'Id':'harvest-finance','Symbol':'farm'},{'Id':'golff','Symbol':'gof'},{'Id':'xbtc','Symbol':'xbtc'},{'Id':'origin-dollar','Symbol':'ousd'},{'Id':'aave','Symbol':'aave'},{'Id':'dodo','Symbol':'dodo'},{'Id':'safe2','Symbol':'safe2'},{'Id':'spaceswap-shake','Symbol':'shake'},{'Id':'spaceswap-milk2','Symbol':'milk2'},{'Id':'cvault-finance','Symbol':'core'},{'Id':'perpetual-protocol','Symbol':'perp'},{'Id':'value-liquidity','Symbol':'value'},{'Id':'sparkle','Symbol':'sprkl'},{'Id':'usdk','Symbol':'usdk'},{'Id':'swag-finance','Symbol':'swag'},{'Id':'piedao-dough-v2','Symbol':'dough'},{'Id':'kush-finance','Symbol':'kseed'},{'Id':'ccomp','Symbol':'ccomp'},{'Id':'compound-uniswap','Symbol':'cuni'},{'Id':'quras-token','Symbol':'xqc'},{'Id':'master-usd','Symbol':'musd'},{'Id':'zeroswap','Symbol':'zee'},{'Id':'hegic','Symbol':'hegic'},{'Id':'definer','Symbol':'fin'},{'Id':'astro','Symbol':'astro'},{'Id':'amp-token','Symbol':'amp'},{'Id':'barnbridge','Symbol':'bond'},{'Id':'antcoin','Symbol':'ant'},{'Id':'fuse-network-token','Symbol':'fuse'},{'Id':'empty-set-dollar','Symbol':'esd'},{'Id':'keep3rv1','Symbol':'kp3r'},{'Id':'defidollar','Symbol':'dusd'},{'Id':'aurora-dao','Symbol':'idex'},{'Id':'nix-bridge-token','Symbol':'voice'},{'Id':'hermez-network-token','Symbol':'hez'},{'Id':'surfexutilitytoken','Symbol':'surf'},{'Id':'wrapped-anatha','Symbol':'wanatha'},{'Id':'audius','Symbol':'audio'},{'Id':'atari','Symbol':'atri'},{'Id':'index-cooperative','Symbol':'index'},{'Id':'powertrade-fuel','Symbol':'ptf'},{'Id':'defidollar-dao','Symbol':'dfd'},{'Id':'apy-finance','Symbol':'apy'},{'Id':'geyser','Symbol':'gysr'},{'Id':'keep4r','Symbol':'kp4r'},{'Id':'axie-infinity','Symbol':'axs'},{'Id':'smart-valor','Symbol':'valor'},{'Id':'allianceblock','Symbol':'albt'},{'Id':'tomoe','Symbol':'tomoe'},{'Id':'lua-token','Symbol':'lua'},{'Id':'holyheld','Symbol':'holy'},{'Id':'polkastarter','Symbol':'pols'},{'Id':'rio-defi','Symbol':'rfuel'},{'Id':'unlend-finance','Symbol':'uft'},{'Id':'lgcy-network','Symbol':'lgcy'},{'Id':'rope-token','Symbol':'rope'},{'Id':'plotx','Symbol':'plot'},{'Id':'keysians-network','Symbol':'ken'},{'Id':'nsure-network','Symbol':'nsure'},{'Id':'chronobank','Symbol':'time'},{'Id':'saffron-finance','Symbol':'sfi'},{'Id':'88mph','Symbol':'mph'},{'Id':'oro','Symbol':'oro'},{'Id':'e-radix','Symbol':'exrd'},{'Id':'boosted-finance','Symbol':'boost'},{'Id':'dforce-token','Symbol':'df'},{'Id':'synlev','Symbol':'syn'},{'Id':'lto-network','Symbol':'lto'},{'Id':'synth-soil','Symbol':'soil'},{'Id':'cache-gold','Symbol':'cgt'},{'Id':'nucypher','Symbol':'nu'},{'Id':'octree','Symbol':'oct'},{'Id':'quiverx','Symbol':'qrx'},{'Id':'bitsong','Symbol':'btsg'},{'Id':'radium','Symbol':'val'},{'Id':'api3','Symbol':'api3'},{'Id':'basis-cash','Symbol':'bac'},{'Id':'basis-share','Symbol':'bas'},{'Id':'power-index-pool-token','Symbol':'pipt'},{'Id':'megacryptopolis','Symbol':'mega'},{'Id':'base-protocol','Symbol':'base'},{'Id':'bondly','Symbol':'bondly'},{'Id':'neutrino-system-base-token','Symbol':'nsbt'},{'Id':'nexo','Symbol':'nexo'},{'Id':'aave-aave','Symbol':'aAAVE'},{'Id':'aave-bat','Symbol':'abat'},{'Id':'aave-busd','Symbol':'abusd'},{'Id':'aave-dai','Symbol':'adai'},{'Id':'aave-enj','Symbol':'aenj'},{'Id':'aave-knc','Symbol':'aknc'},{'Id':'aave-link','Symbol':'alink'},{'Id':'aave-mana','Symbol':'amana'},{'Id':'aave-mkr','Symbol':'amkr'},{'Id':'aave-ren','Symbol':'aren'},{'Id':'aave-snx','Symbol':'asnx'},{'Id':'aave-susd','Symbol':'asusd'},{'Id':'aave-tusd','Symbol':'atusd'},{'Id':'aave-uni','Symbol':'auni'},{'Id':'aave-usdc','Symbol':'ausdc'},{'Id':'aave-usdt','Symbol':'ausdt'},{'Id':'aave-wbtc','Symbol':'awbtc'},{'Id':'aave-weth','Symbol':'aweth'},{'Id':'aave-yfi','Symbol':'aYFI'},{'Id':'aave-zrx','Symbol':'azrx'},{'Id':'coinlion','Symbol':'lion'},{'Id':'zlot','Symbol':'zlot'},{'Id':'ecofi','Symbol':'eco'},{'Id':'utrust','Symbol':'utk'},{'Id':'badger-dao','Symbol':'badger'},{'Id':'golden-ratio-token','Symbol':'grt'},{'Id':'lido-dao','Symbol':'ldo'},{'Id':'tornado-cash','Symbol':'torn'},{'Id':'staked-ether','Symbol':'steth'},{'Id':'mahadao','Symbol':'maha'},{'Id':'marlin','Symbol':'pond'},{'Id':'frax-share','Symbol':'fxs'},{'Id':'spice','Symbol':'spice'},{'Id':'1inch','Symbol':'1inch'},{'Id':'plasma-finance','Symbol':'ppay'},{'Id':'mithril-share','Symbol':'mis'},{'Id':'basiscoin-share','Symbol':'bcs'},{'Id':'exeedme','Symbol':'xed'},{'Id':'wozx','Symbol':'wozx'},{'Id':'defi-nation-signals-dao','Symbol':'dsd'},{'Id':'fox-finance','Symbol':'fox'},{'Id':'cover-protocol','Symbol':'cover'},{'Id':'wise-token11','Symbol':'wise'},{'Id':'fera','Symbol':'fera'},{'Id':'furucombo','Symbol':'combo'},{'Id':'usdfreeliquidity','Symbol':'usdfl'},{'Id':'fetch-ai','Symbol':'fet'},{'Id':'pha','Symbol':'pha'},{'Id':'pbtc35a','Symbol':'pbtc35a'},{'Id':'frax','Symbol':'frax'},{'Id':'injective-protocol','Symbol':'inj'},{'Id':'legolas-exchange','Symbol':'lgo'},{'Id':'yield','Symbol':'yld'},{'Id':'cyberfi','Symbol':'cfi'},{'Id':'rari-governance-token','Symbol':'rgt'},{'Id':'rook','Symbol':'rook'},{'Id':'yield-optimization-platform','Symbol':'yop'},{'Id':'nftx','Symbol':'nftx'},{'Id':'robbocoach','Symbol':'rbc'},{'Id':'stake-dao','Symbol':'sdt'},{'Id':'ethos','Symbol':'vgx'},{'Id':'debase','Symbol':'debase'},{'Id':'ankr','Symbol':'ankr'},{'Id':'thorchain','Symbol':'rune'},{'Id':'bao-finance','Symbol':'bao'},{'Id':'reef-finance','Symbol':'reef'},{'Id':'truebit-protocol','Symbol':'tru'},{'Id':'indexed-finance','Symbol':'ndx'},{'Id':'benchmark-protocol','Symbol':'mark'},{'Id':'zero-exchange','Symbol':'zero'},{'Id':'octofi','Symbol':'octo'},{'Id':'oraichain-token','Symbol':'orai'},{'Id':'duckdaodime','Symbol':'ddim'},{'Id':'birdchain','Symbol':'bird'},{'Id':'spacechain','Symbol':'spc'},{'Id':'ramp','Symbol':'ramp'},{'Id':'stabilize','Symbol':'stbz'},{'Id':'insured-finance','Symbol':'infi'},{'Id':'crypto-com-chain','Symbol':'cro'},{'Id':'lukso-token','Symbol':'lyxe'},{'Id':'terra-virtua-kolect','Symbol':'tvk'},{'Id':'digg','Symbol':'digg'},{'Id':'freeliquid','Symbol':'fl'},{'Id':'alpha-finance','Symbol':'alpha'},{'Id':'cudos','Symbol':'cudos'},{'Id':'dexe','Symbol':'dexe'},{'Id':'san-diego-coin','Symbol':'sand'},{'Id':'covir','Symbol':'cvr'},{'Id':'typhoon-cash','Symbol':'phoon'},{'Id':'farmer-defi','Symbol':'frm'},{'Id':'polkabridge','Symbol':'pbr'},{'Id':'snowblossom','Symbol':'snow'},{'Id':'tosdis','Symbol':'dis'},{'Id':'poolz-finance','Symbol':'poolz'},{'Id':'zkswap','Symbol':'zks'},{'Id':'armor','Symbol':'armor'},{'Id':'armor-nxm','Symbol':'arnxm'},{'Id':'opium','Symbol':'opium'},{'Id':'yearn-ecosystem-token-index','Symbol':'yeti'},{'Id':'assy-index','Symbol':'assy'},{'Id':'defi-yield-protocol','Symbol':'dyp'},{'Id':'yusdc-busd-pool','Symbol':'yusdc'},{'Id':'veth2','Symbol':'veth2'},{'Id':'aave-eth-v1','Symbol':'aeth'},{'Id':'cream-eth2','Symbol':'creth2'},{'Id':'fantom','Symbol':'ftm'},{'Id':'prosper','Symbol':'pros'},{'Id':'fastswap','Symbol':'fast'},{'Id':'reflect-finance','Symbol':'rfi'},{'Id':'terrausd','Symbol':'ust'},{'Id':'rendoge','Symbol':'rendoge'},{'Id':'mir-coin','Symbol':'mir'},{'Id':'flex-coin','Symbol':'flex'},{'Id':'metric-exchange','Symbol':'metric'},{'Id':'chartex','Symbol':'chart'},{'Id':'bridge-mutual','Symbol':'bmi'},{'Id':'digitex-futures-exchange','Symbol':'dgtx'},{'Id':'millimeter','Symbol':'mm'},{'Id':'tokenlon','Symbol':'lon'},{'Id':'archer-dao-governance-token','Symbol':'arch'},{'Id':'biblepay','Symbol':'bbp'},{'Id':'sx-network','Symbol':'sx'},{'Id':'lattice-token','Symbol':'ltx'},{'Id':'clash-token','Symbol':'sct'},{'Id':'leverj-gluon','Symbol':'l2'},{'Id':'onix','Symbol':'onx'},{'Id':'beefy-finance','Symbol':'bifi'},{'Id':'stafi','Symbol':'fis'},{'Id':'lina','Symbol':'lina'},{'Id':'oin-finance','Symbol':'oin'},{'Id':'xinchb','Symbol':'xINCHb'},{'Id':'xincha','Symbol':'xINCHa'},{'Id':'crowns','Symbol':'cws'},{'Id':'shiba-inu','Symbol':'shib'},{'Id':'portion','Symbol':'prt'},{'Id':'name-changing-token','Symbol':'nct'},{'Id':'muse-2','Symbol':'muse'},{'Id':'maps','Symbol':'maps'},{'Id':'build-finance','Symbol':'build'},{'Id':'gourmetgalaxy','Symbol':'gum'},{'Id':'defi-top-5-tokens-index','Symbol':'defi5'},{'Id':'cryptocurrency-top-10-tokens-index','Symbol':'cc10'},{'Id':'tixl-new','Symbol':'txl'},{'Id':'razor-network','Symbol':'razor'},{'Id':'strudel-finance','Symbol':'trdl'},{'Id':'yvs-finance','Symbol':'yvs'},{'Id':'bundles','Symbol':'bund'},{'Id':'sashimi','Symbol':'sashimi'},{'Id':'hedget','Symbol':'hget'},{'Id':'option-room','Symbol':'room'},{'Id':'wrapped-crescofin','Symbol':'wcres'},{'Id':'gala','Symbol':'gala'},{'Id':'seigniorage-shares','Symbol':'share'},{'Id':'unistake','Symbol':'unistake'},{'Id':'azuki','Symbol':'azuki'},{'Id':'coin-artist','Symbol':'coin'},{'Id':'dextf','Symbol':'dextf'},{'Id':'mp3','Symbol':'mp3'},{'Id':'litentry','Symbol':'lit'},{'Id':'terra-luna','Symbol':'luna'},{'Id':'easyfi','Symbol':'ez'},{'Id':'sync-network','Symbol':'sync'},{'Id':'finxflo','Symbol':'fxf'},{'Id':'bot-ocean','Symbol':'bots'},{'Id':'mar-network','Symbol':'mars'},{'Id':'nftlootbox','Symbol':'loot'},{'Id':'dlp-duck-token','Symbol':'duck'},{'Id':'the-famous-token','Symbol':'tft'},{'Id':'everid','Symbol':'id'},{'Id':'skale','Symbol':'skl'},{'Id':'dao-maker','Symbol':'dao'},{'Id':'bitenium-token','Symbol':'bt'},{'Id':'flash','Symbol':'flash'},{'Id':'butterfly-protocol-2','Symbol':'bfly'},{'Id':'safedot','Symbol':'sdot'},{'Id':'scomp','Symbol':'scomp'},{'Id':'saave','Symbol':'saave'},{'Id':'idot','Symbol':'idot'},{'Id':'soft-yearn','Symbol':'syfi'},{'Id':'suni','Symbol':'suni'},{'Id':'sren','Symbol':'sren'},{'Id':'umbrella-network','Symbol':'umb'},{'Id':'ichi-farm','Symbol':'ichi'},{'Id':'usdp','Symbol':'usdp'},{'Id':'unisocks','Symbol':'socks'},{'Id':'stsla','Symbol':'stsla'},{'Id':'marginswap','Symbol':'mfi'},{'Id':'envion','Symbol':'evn'},{'Id':'klondike-finance','Symbol':'klon'},{'Id':'klondike-btc','Symbol':'kbtc'},{'Id':'open-governance-token','Symbol':'open'},{'Id':'cryptotask-2','Symbol':'ctask'},{'Id':'pylon-finance','Symbol':'pylon'},{'Id':'peanut','Symbol':'nux'},{'Id':'depay','Symbol':'depay'},{'Id':'fyooz','Symbol':'fyz'},{'Id':'scifi-index','Symbol':'scifi'},{'Id':'0chain','Symbol':'zcn'},{'Id':'unicrypt-2','Symbol':'uncx'},{'Id':'warp-finance','Symbol':'warp'},{'Id':'idle','Symbol':'idle'},{'Id':'sparkpoint','Symbol':'srk'},{'Id':'glitch-protocol','Symbol':'glch'},{'Id':'unimex-network','Symbol':'umx'},{'Id':'whiteheart','Symbol':'white'},{'Id':'dent','Symbol':'dent'},{'Id':'zenfuse','Symbol':'zefu'},{'Id':'moontools','Symbol':'moons'},{'Id':'sake-token','Symbol':'sake'},{'Id':'micro-bitcoin-finance','Symbol':'mbtc'},{'Id':'vesper-finance','Symbol':'vsp'},{'Id':'sharedstake-governance-token','Symbol':'sgt'},{'Id':'shroom-finance','Symbol':'shroom'},{'Id':'gameswap-org','Symbol':'gswap'},{'Id':'fudfinance','Symbol':'fud'},{'Id':'rai','Symbol':'rai'},{'Id':'unidex','Symbol':'unidx'},{'Id':'doki-doki-finance','Symbol':'doki'},{'Id':'essentia','Symbol':'ess'},{'Id':'gather','Symbol':'gth'},{'Id':'offshift','Symbol':'xft'},{'Id':'seen','Symbol':'seen'},{'Id':'ethart','Symbol':'arte'},{'Id':'alpaca','Symbol':'alpa'},{'Id':'utu-coin','Symbol':'utu'},{'Id':'achain-coin','Symbol':'ac'},{'Id':'royale','Symbol':'roya'},{'Id':'premia','Symbol':'premia'},{'Id':'rigel-finance','Symbol':'rigel'},{'Id':'poolcoin','Symbol':'pool'},{'Id':'smartcredit-token','Symbol':'smartcredit'},{'Id':'rootkit','Symbol':'root'},{'Id':'revv','Symbol':'revv'},{'Id':'phoenixdao','Symbol':'phnx'},{'Id':'dexkit','Symbol':'kit'},{'Id':'wootrade-network','Symbol':'woo'},{'Id':'modefi','Symbol':'mod'},{'Id':'hydro','Symbol':'hydro'},{'Id':'mask-network','Symbol':'mask'},{'Id':'anyswap','Symbol':'any'},{'Id':'rally-2','Symbol':'rly'},{'Id':'kira-network','Symbol':'kex'},{'Id':'ultra','Symbol':'uos'},{'Id':'geocoin','Symbol':'geo'},{'Id':'get-token','Symbol':'get'},{'Id':'apoyield','Symbol':'soul'},{'Id':'unifi','Symbol':'unifi'},{'Id':'derivadao','Symbol':'ddx'},{'Id':'quick','Symbol':'quick'},{'Id':'redfox-labs-2','Symbol':'rfox'},{'Id':'monacoin','Symbol':'mona'},{'Id':'hybrix','Symbol':'hy'},{'Id':'supercoin','Symbol':'super'},{'Id':'wrapped-dgld','Symbol':'wdgld'},{'Id':'coinshares-gold-and-cryptoassets-index-lite','Symbol':'cgi'},{'Id':'mushroom','Symbol':'mush'},{'Id':'launchpool','Symbol':'lpool'},{'Id':'xtake','Symbol':'xtk'},{'Id':'signal-token','Symbol':'sig'},{'Id':'hopr','Symbol':'hopr'},{'Id':'foundrydao-logistics','Symbol':'fry'},{'Id':'gamecredits','Symbol':'game'},{'Id':'grap-finance','Symbol':'grap'},{'Id':'render-token','Symbol':'rndr'},{'Id':'ovr','Symbol':'ovr'},{'Id':'mettalex','Symbol':'mtlx'},{'Id':'polkamarkets','Symbol':'polk'},{'Id':'bancor-governance-token','Symbol':'vbnt'},{'Id':'nord-finance','Symbol':'nord'},{'Id':'shadows','Symbol':'dows'},{'Id':'mint-club','Symbol':'mint'},{'Id':'degen-index','Symbol':'degen'},{'Id':'bifrost','Symbol':'bfc'},{'Id':'siren','Symbol':'si'},{'Id':'font','Symbol':'font'},{'Id':'moon','Symbol':'moon'},{'Id':'jupiter','Symbol':'jup'},{'Id':'sentiment-token','Symbol':'sent'},{'Id':'dego-finance','Symbol':'dego'},{'Id':'decentral-games','Symbol':'dg'},{'Id':'sota-finance','Symbol':'sota'},{'Id':'noderunners','Symbol':'ndr'},{'Id':'daofi','Symbol':'daofi'},{'Id':'radicle','Symbol':'rad'},{'Id':'alchemix','Symbol':'alcx'},{'Id':'bankless-dao','Symbol':'bank'},{'Id':'antimatter','Symbol':'matter'},{'Id':'fractal','Symbol':'fcl'},{'Id':'verasity','Symbol':'vra'},{'Id':'nft-index','Symbol':'nfti'},{'Id':'bidipass','Symbol':'bdp'},{'Id':'earnscoin','Symbol':'ern'},{'Id':'kylin-network','Symbol':'kyl'},{'Id':'robot','Symbol':'robot'},{'Id':'etha-lend','Symbol':'etha'},{'Id':'paint','Symbol':'paint'},{'Id':'ruler-protocol','Symbol':'ruler'},{'Id':'xfund','Symbol':'xfund'},{'Id':'balpha','Symbol':'balpha'},{'Id':'dea','Symbol':'dea'},{'Id':'chiliz','Symbol':'chz'},{'Id':'inverse-finance','Symbol':'inv'},{'Id':'govi','Symbol':'govi'},{'Id':'bet-protocol','Symbol':'bepro'},{'Id':'non-fungible-yearn','Symbol':'nfy'},{'Id':'blank','Symbol':'blank'},{'Id':'smol','Symbol':'smol'},{'Id':'definitex','Symbol':'dfx'},{'Id':'b20','Symbol':'b20'},{'Id':'tapmydata','Symbol':'tap'},{'Id':'taco-finance','Symbol':'taco'},{'Id':'fyznft','Symbol':'fyznft'},{'Id':'swgtoken','Symbol':'swg'},{'Id':'dusk-network','Symbol':'dusk'},{'Id':'lcx','Symbol':'lcx'},{'Id':'insurace','Symbol':'insur'},{'Id':'tozex','Symbol':'toz'},{'Id':'visor','Symbol':'visr'},{'Id':'aluna','Symbol':'aln'},{'Id':'chain-guardians','Symbol':'cgg'},{'Id':'crust-network','Symbol':'cru'},{'Id':'my-neighbor-alice','Symbol':'alice'},{'Id':'tower','Symbol':'tower'},{'Id':'polyyield-token','Symbol':'yield'},{'Id':'konomi-network','Symbol':'kono'},{'Id':'soar-2','Symbol':'soar'},{'Id':'dovu','Symbol':'dov'},{'Id':'circleex','Symbol':'cx'},{'Id':'juggernaut','Symbol':'jgn'},{'Id':'hoge-finance','Symbol':'hoge'},{'Id':'changenow','Symbol':'now'},{'Id':'connect-financial','Symbol':'cnfi'},{'Id':'hodltree','Symbol':'htre'},{'Id':'polkafoundry','Symbol':'pkf'},{'Id':'exrt-network','Symbol':'exrt'},{'Id':'deri-protocol','Symbol':'deri'},{'Id':'blockchain-cuties-universe-governance','Symbol':'bcug'},{'Id':'labs-group','Symbol':'labs'},{'Id':'kine-protocol','Symbol':'kine'},{'Id':'hapi','Symbol':'hapi'},{'Id':'k21','Symbol':'k21'},{'Id':'union-protocol-governance-token','Symbol':'unn'},{'Id':'habitat','Symbol':'hbt'},{'Id':'cash-tech','Symbol':'cate'},{'Id':'doraemoon','Symbol':'dora'},{'Id':'sifchain','Symbol':'erowan'},{'Id':'sentivate','Symbol':'sntvt'},{'Id':'chain-games','Symbol':'chain'},{'Id':'xdefi-governance-token','Symbol':'xdex'},{'Id':'upbots','Symbol':'ubxt'},{'Id':'graphlinq-protocol','Symbol':'glq'},{'Id':'lympo','Symbol':'lym'},{'Id':'vidya','Symbol':'vidya'},{'Id':'fireball','Symbol':'fire'},{'Id':'dafi-protocol','Symbol':'dafi'},{'Id':'oddz','Symbol':'oddz'},{'Id':'paypolitan-token','Symbol':'epan'},{'Id':'ara-token','Symbol':'ara'},{'Id':'2gether-2','Symbol':'2gt'},{'Id':'venus-eth','Symbol':'veth'},{'Id':'coinfirm-amlt','Symbol':'amlt'},{'Id':'volentix-vtx','Symbol':'vtx'},{'Id':'vvsp','Symbol':'vvsp'},{'Id':'tribe-2','Symbol':'tribe'},{'Id':'fei-protocol','Symbol':'fei'},{'Id':'xsgd','Symbol':'xsgd'},{'Id':'aioz-network','Symbol':'aioz'},{'Id':'spheroid-universe','Symbol':'sph'},{'Id':'pocmon','Symbol':'pmon'},{'Id':'sylo','Symbol':'sylo'},{'Id':'overline-emblem','Symbol':'emb'},{'Id':'ureeqa','Symbol':'urqa'},{'Id':'linkpool','Symbol':'lpl'},{'Id':'curate','Symbol':'xcur'},{'Id':'cook','Symbol':'cook'},{'Id':'cellframe','Symbol':'cell'},{'Id':'mad-network','Symbol':'mad'},{'Id':'convergence','Symbol':'conv'},{'Id':'swarm','Symbol':'swm'},{'Id':'eddaswap','Symbol':'edda'},{'Id':'tidal-finance','Symbol':'tidal'},{'Id':'deracoin','Symbol':'drc'},{'Id':'xyo-network','Symbol':'xyo'},{'Id':'arcona','Symbol':'arcona'},{'Id':'vulcan-forged','Symbol':'pyr'},{'Id':'roobee','Symbol':'roobee'},{'Id':'deeper-network','Symbol':'dpr'},{'Id':'gains','Symbol':'gains'},{'Id':'liquity-usd','Symbol':'lusd'},{'Id':'equalizer','Symbol':'eqz'},{'Id':'genesis-shards','Symbol':'gs'},{'Id':'internxt','Symbol':'inxt'},{'Id':'olympus','Symbol':'ohm'},{'Id':'raze-network','Symbol':'raze'},{'Id':'alchemist','Symbol':'mist'},{'Id':'cardstarter','Symbol':'cards'},{'Id':'ethbox-token','Symbol':'ebox'},{'Id':'presearch','Symbol':'pre'},{'Id':'ethereum-push-notification-service','Symbol':'push'},{'Id':'zoracles','Symbol':'zora'},{'Id':'boson-protocol','Symbol':'boson'},{'Id':'universal-basic-income','Symbol':'ubi'},{'Id':'total-crypto-market-cap-token','Symbol':'tcap'},{'Id':'basketdao','Symbol':'bask'},{'Id':'nkn','Symbol':'nkn'},{'Id':'the-4th-pillar','Symbol':'four'},{'Id':'dentacoin','Symbol':'dcn'},{'Id':'ampleforth-governance-token','Symbol':'forth'},{'Id':'s1inch','Symbol':'s1inch'},{'Id':'srune','Symbol':'srune'},{'Id':'scrv','Symbol':'scrv'},{'Id':'snflx','Symbol':'snflx'},{'Id':'sfb','Symbol':'sfb'},{'Id':'sgoog','Symbol':'sgoog'},{'Id':'samzn','Symbol':'samzn'},{'Id':'blind-boxes','Symbol':'bles'},{'Id':'stakewise','Symbol':'swise'},{'Id':'kyber-network-crystal','Symbol':'knc'},{'Id':'yaxis','Symbol':'yaxis'},{'Id':'orbs','Symbol':'orbs'},{'Id':'wirex','Symbol':'wxt'},{'Id':'shincoin','Symbol':'scoin'},{'Id':'baguette','Symbol':'bag'},{'Id':'occamfi','Symbol':'occ'},{'Id':'illuvium','Symbol':'ilv'},{'Id':'unfederalreserve','Symbol':'ersdl'},{'Id':'ice-token','Symbol':'ice'},{'Id':'xend-finance','Symbol':'xend'},{'Id':'unmarshal','Symbol':'marsh'},{'Id':'aga-token','Symbol':'aga'},{'Id':'circuits-of-value','Symbol':'coval'},{'Id':'tenset','Symbol':'10set'},{'Id':'bonfi','Symbol':'bnf'},{'Id':'kin','Symbol':'kin'},{'Id':'golem','Symbol':'glm'},{'Id':'telcoin','Symbol':'tel'},{'Id':'unlock-protocol','Symbol':'udt'},{'Id':'pendle','Symbol':'pendle'},{'Id':'waxe','Symbol':'waxe'},{'Id':'coinstarter','Symbol':'stc'},{'Id':'route','Symbol':'route'},{'Id':'nahmii','Symbol':'nii'},{'Id':'paid-network','Symbol':'paid'},{'Id':'keytango','Symbol':'tango'},{'Id':'splyt','Symbol':'shopx'},{'Id':'ares-protocol','Symbol':'ares'},{'Id':'aga-rewards-2','Symbol':'agar'},{'Id':'cryptex-finance','Symbol':'ctx'},{'Id':'shih-tzu','Symbol':'shih'},{'Id':'somidax','Symbol':'smdx'},{'Id':'kishu-inu','Symbol':'kishu'},{'Id':'feg-token','Symbol':'feg'},{'Id':'stobox-token','Symbol':'stbu'},{'Id':'o3-swap','Symbol':'o3'},{'Id':'woofy','Symbol':'woofy'},{'Id':'shibaken-finance','Symbol':'shibaken'},{'Id':'kirobo','Symbol':'kiro'},{'Id':'convex-finance','Symbol':'cvx'},{'Id':'seedswap','Symbol':'snft'},{'Id':'8pay','Symbol':'8pay'},{'Id':'game','Symbol':'gtc'},{'Id':'graviton','Symbol':'gton'},{'Id':'alchemix-usd','Symbol':'alusd'},{'Id':'sarcophagus','Symbol':'sarco'},{'Id':'terablock','Symbol':'tbc'},{'Id':'value-usd','Symbol':'vusd'},{'Id':'hokkaidu-inu','Symbol':'hokk'},{'Id':'boringdao-[old]','Symbol':'bor'},{'Id':'zoo-token','Symbol':'zoot'},{'Id':'dogelon-mars','Symbol':'elon'},{'Id':'superbid','Symbol':'superbid'},{'Id':'nft-tone','Symbol':'tone'},{'Id':'smartkey','Symbol':'skey'},{'Id':'nimbus','Symbol':'nbu'},{'Id':'leash','Symbol':'leash'},{'Id':'district0x','Symbol':'dnt'},{'Id':'defi-factory-token','Symbol':'deft'},{'Id':'dfyn-network','Symbol':'dfyn'},{'Id':'metaverse-index','Symbol':'mvi'},{'Id':'akita-inu','Symbol':'akita'},{'Id':'liquity','Symbol':'lqty'},{'Id':'verox','Symbol':'vrx'},{'Id':'baby-bitcoin','Symbol':'bbtc'},{'Id':'munch-token','Symbol':'munch'},{'Id':'bezoge-earth','Symbol':'bezoge'},{'Id':'island-coin','Symbol':'isle'},{'Id':'bitcashpay','Symbol':'bcp'},{'Id':'ethereummax','Symbol':'emax'},{'Id':'instadapp','Symbol':'inst'},{'Id':'cavapoo','Symbol':'cava'},{'Id':'swapp','Symbol':'swapp'},{'Id':'dvision-network','Symbol':'dvi'},{'Id':'cad-coin','Symbol':'cadc'},{'Id':'arc-governance','Symbol':'arcx'},{'Id':'amun-defi-index','Symbol':'dfi'},{'Id':'amun-defi-momentum-index','Symbol':'dmx'},{'Id':'xsushi','Symbol':'xsushi'},{'Id':'nxm','Symbol':'nxm'},{'Id':'unit-protocol','Symbol':'col'},{'Id':'auction','Symbol':'auction'},{'Id':'singularitynet','Symbol':'agix'},{'Id':'olyseum','Symbol':'oly'},{'Id':'unizen','Symbol':'zcx'},{'Id':'fnkcom','Symbol':'fnk'},{'Id':'gerowallet','Symbol':'gero'},{'Id':'unobtanium','Symbol':'uno', 'Id': 'gmx', 'Symbol': 'GMX'}, {'Id':'usdc', 'Symbol':'USDC'}]"; + private static readonly IReadOnlyDictionary ArbitrumTokenMetadata = + new Dictionary + { + [Ticker.BTC] = (Arbitrum.Address.WBTC, 8), + [Ticker.ETH] = (Arbitrum.Address.ETH, 18), + [Ticker.LINK] = (Arbitrum.Address.LINK, 18), + [Ticker.UNI] = (Arbitrum.Address.UNI, 18), + [Ticker.GMX] = (Arbitrum.Address.GMX, 18), + [Ticker.USDT] = (Arbitrum.Address.USDT, 6), + [Ticker.USDC] = (Arbitrum.Address.USDC, 6), + [Ticker.USDC_e] = (Arbitrum.Address.USDCe, 6), + [Ticker.DAI] = (Arbitrum.Address.DAI, 18), + [Ticker.ARB] = (Arbitrum.Address.ARB, 18), + [Ticker.SOL] = (Arbitrum.Address.SOL, 9), + [Ticker.BNB] = (Arbitrum.Address.BNB, 18), + [Ticker.DOGE] = (Arbitrum.Address.DOGE, 8), + [Ticker.LTC] = (Arbitrum.Address.LTC, 8), + [Ticker.XRP] = (Arbitrum.Address.XRP, 6), + [Ticker.ATOM] = (Arbitrum.Address.ATOM, 6), + [Ticker.NEAR] = (Arbitrum.Address.NEAR, 24), + [Ticker.AAVE] = (Arbitrum.Address.AAVE, 18), + [Ticker.AVAX] = (Arbitrum.Address.AVAX, 18), + [Ticker.OP] = (Arbitrum.Address.OP, 18), + [Ticker.PEPE] = (Arbitrum.Address.PEPE, 18), + [Ticker.WIF] = (Arbitrum.Address.WIF, 6), + [Ticker.ORDI] = (Arbitrum.Address.ORDI, 18), + [Ticker.STX] = (Arbitrum.Address.STX, 6), + [Ticker.USDe] = (Arbitrum.Address.USDE, 18), + [Ticker.wstETH] = (Arbitrum.Address.WSTETH, 18), + [Ticker.SHIB] = (Arbitrum.Address.SHIB, 18), + [Ticker.tBTC] = (Arbitrum.Address.TBTC, 18), + [Ticker.EIGEN] = (Arbitrum.Address.EIGEN, 18), + [Ticker.SATS] = (Arbitrum.Address.SATS, 6), + [Ticker.POL] = (Arbitrum.Address.POL, 18), + [Ticker.APE] = (Arbitrum.Address.APE, 18), + [Ticker.SUI] = (Arbitrum.Address.SUI, 9), + [Ticker.SEI] = (Arbitrum.Address.SEI, 18), + [Ticker.APT] = (Arbitrum.Address.APT, 8), + [Ticker.TIA] = (Arbitrum.Address.TIA, 6), + [Ticker.TRX] = (Arbitrum.Address.TRX, 6), + [Ticker.TON] = (Arbitrum.Address.TON, 9), + [Ticker.WLD] = (Arbitrum.Address.WLD, 18), + [Ticker.BONK] = (Arbitrum.Address.BONK, 5), + [Ticker.TAO] = (Arbitrum.Address.TAO, 9), + [Ticker.BOME] = (Arbitrum.Address.BOME, 6), + [Ticker.FLOKI] = (Arbitrum.Address.FLOKI, 9), + [Ticker.MEME] = (Arbitrum.Address.MEME, 18), + [Ticker.MEW] = (Arbitrum.Address.MEW, 5), + [Ticker.PENDLE] = (Arbitrum.Address.PENDLE, 18), + [Ticker.ADA] = (Arbitrum.Address.ADA, 6), + [Ticker.BCH] = (Arbitrum.Address.BCH, 8), + [Ticker.DOT] = (Arbitrum.Address.DOT, 10), + [Ticker.ICP] = (Arbitrum.Address.ICP, 8), + [Ticker.XLM] = (Arbitrum.Address.XLM, 7), + [Ticker.RENDER] = (Arbitrum.Address.RENDER, 18), + [Ticker.FIL] = (Arbitrum.Address.FIL, 18), + [Ticker.DYDX] = (Arbitrum.Address.DYDX, 18), + [Ticker.INJ] = (Arbitrum.Address.INJ, 18), + [Ticker.TRUMP] = (Arbitrum.Address.TRUMP, 6), + [Ticker.MELANIA] = (Arbitrum.Address.MELANIA, 6), + [Ticker.ENA] = (Arbitrum.Address.ENA, 18), + [Ticker.AI16Z] = (Arbitrum.Address.AI16Z, 9), + [Ticker.ANIME] = (Arbitrum.Address.ANIME, 18), + [Ticker.FARTCOIN] = (Arbitrum.Address.FARTCOIN, 6), + [Ticker.BERA] = (Arbitrum.Address.BERA, 18), + [Ticker.LDO] = (Arbitrum.Address.LDO, 18), + [Ticker.VIRTUAL] = (Arbitrum.Address.VIRTUAL, 18), + [Ticker.PENGU] = (Arbitrum.Address.PENGU, 6), + [Ticker.FET] = (Arbitrum.Address.FET, 18), + [Ticker.ONDO] = (Arbitrum.Address.ONDO, 18), + [Ticker.AIXBT] = (Arbitrum.Address.AIXBT, 18), + [Ticker.S] = (Arbitrum.Address.S, 18), + [Ticker.CAKE] = (Arbitrum.Address.CAKE, 18), + [Ticker.HYPE] = (Arbitrum.Address.HYPE, 8), + [Ticker.JUP] = (Arbitrum.Address.JUP, 6), + [Ticker.MKR] = (Arbitrum.Address.MKR, 18), + [Ticker.OM] = (Arbitrum.Address.OM, 18), + [Ticker.DOLO] = (Arbitrum.Address.DOLO, 18), + [Ticker.XMR] = (Arbitrum.Address.XMR, 12), + [Ticker.CRV] = (Arbitrum.Address.CRV, 18), + [Ticker.ALGO] = (Arbitrum.Address.ALGO, 6), + [Ticker.CRO] = (Arbitrum.Address.CRO, 8), + }; + public static List GetTokens() { return JsonConvert.DeserializeObject(TokensJSON).Tokens; @@ -31,41 +115,25 @@ public static class TokenService t => string.Equals(t.Symbol, ticker, StringComparison.CurrentCultureIgnoreCase)); } - public static string GetContractAddress(Ticker ticker) => ticker switch - { - Ticker.BTC => Arbitrum.Address.WBTC, - Ticker.ETH => Arbitrum.Address.ETH, - Ticker.LINK => Arbitrum.Address.LINK, - Ticker.UNI => Arbitrum.Address.UNI, - Ticker.GMX => Arbitrum.Address.GMX, - Ticker.USDT => Arbitrum.Address.USDT, - Ticker.USDC => Arbitrum.Address.USDC, - _ => Arbitrum.Address.Zero - }; + public static string GetContractAddress(Ticker ticker) => + ArbitrumTokenMetadata.TryGetValue(ticker, out var metadata) + ? metadata.Address + : Arbitrum.Address.Zero; - public static int GetDecimal(Ticker ticker) => ticker switch - { - Ticker.BTC => 8, - Ticker.ETH => 18, - Ticker.LINK => 18, - Ticker.UNI => 18, - Ticker.GMX => 18, - Ticker.USDT => 6, - Ticker.USDC => 6, - _ => throw new Exception($"No decimal for {ticker}") - }; + public static int GetDecimal(Ticker ticker) => + ArbitrumTokenMetadata.TryGetValue(ticker, out var metadata) + ? metadata.Decimals + : throw new Exception($"No decimal for {ticker}"); - public static Ticker GetTicker(string address) => address.ToLowerInvariant() switch + public static Ticker GetTicker(string address) { - Arbitrum.Address.WBTC => Ticker.BTC, - Arbitrum.Address.ETH => Ticker.ETH, - Arbitrum.Address.LINK => Ticker.LINK, - Arbitrum.Address.UNI => Ticker.UNI, - Arbitrum.Address.GMX => Ticker.GMX, - Arbitrum.Address.USDT => Ticker.USDT, - Arbitrum.Address.USDC => Ticker.USDC, - _ => throw new NotImplementedException(), - }; + var matched = ArbitrumTokenMetadata.FirstOrDefault( + kvp => string.Equals(kvp.Value.Address, address, StringComparison.OrdinalIgnoreCase)); + + return matched.Equals(default(KeyValuePair)) + ? throw new NotImplementedException() + : matched.Key; + } public static List GetEligibleTickersForBalance() { diff --git a/src/Managing.WebApp/src/components/mollecules/TradesModal/TradesModal.tsx b/src/Managing.WebApp/src/components/mollecules/TradesModal/TradesModal.tsx index 0a456108..498fa01f 100644 --- a/src/Managing.WebApp/src/components/mollecules/TradesModal/TradesModal.tsx +++ b/src/Managing.WebApp/src/components/mollecules/TradesModal/TradesModal.tsx @@ -5,6 +5,7 @@ import type { UserStrategyDetailsViewModel } from '../../../generated/ManagingApi' import {BotClient, DataClient} from '../../../generated/ManagingApi' +import {PositionStatus} from '../../../generated/ManagingApiTypes' import useApiUrlStore from '../../../app/store/apiStore' import Modal from '../Modal/Modal' import Toast from '../Toast/Toast' @@ -134,7 +135,7 @@ const TradesModal: React.FC = ({ {position.ProfitAndLoss?.realized?.toFixed(2) || '0.00'} $ - {position.status !== 'Finished' && ( + {position.status === PositionStatus.Filled && (