@ref-finance/ref-sdk 1.3.6 → 1.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"ref-sdk.cjs.production.min.js","sources":["../src/constant.ts","../src/stable-swap.ts","../src/swap-widget/constant.ts","../src/metaIcons.ts","../src/indexer.ts","../src/v1-swap/parallelSwapLogic.ts","../src/v1-swap/smartRoutingLogic.js","../src/v1-swap/swap.ts","../src/utils.ts","../src/near.ts","../src/ref.ts","../src/dcl-swap/dcl-pool.ts","../src/error.ts","../src/v1-swap/instantSwap.ts","../src/v1-swap/pool.ts","../src/swap-widget/state.tsx","../node_modules/style-inject/dist/style-inject.es.js","../src/swap-widget/components.tsx","../src/swap-widget/defaultTokenList.ts","../src/dcl-swap/swap.ts","../src/dcl-swap/limit-order.ts","../src/swap-widget/index.tsx"],"sourcesContent":["import { TokenMetadata } from './types';\n\nexport const FEE_DIVISOR = 10000;\n\nexport const STABLE_LP_TOKEN_DECIMALS = 18;\nexport const RATED_POOL_LP_TOKEN_DECIMALS = 24;\nexport const STORAGE_TO_REGISTER_WITH_MFT = '0.1';\nexport const ONE_YOCTO_NEAR = '0.000000000000000000000001';\nlet ENV: string | undefined = '';\nlet INDEXER_URL: string | undefined = '';\nexport function getConfig(\n env: string | undefined = ENV ||\n process.env.NEAR_ENV ||\n process.env.REACT_APP_REF_SDK_ENV,\n indexerUrl: string | undefined = INDEXER_URL\n) {\n ENV = env;\n INDEXER_URL = indexerUrl;\n switch (env) {\n case 'mainnet':\n return {\n networkId: 'mainnet',\n nodeUrl: 'https://rpc.mainnet.near.org',\n walletUrl: 'https://wallet.near.org',\n WRAP_NEAR_CONTRACT_ID: 'wrap.near',\n REF_FI_CONTRACT_ID: 'v2.ref-finance.near',\n REF_TOKEN_ID: 'token.v2.ref-finance.near',\n indexerUrl: indexerUrl || 'https://indexer.ref.finance',\n explorerUrl: 'https://testnet.nearblocks.io',\n REF_DCL_SWAP_CONTRACT_ID: 'dclv2.ref-labs.near',\n };\n case 'testnet':\n return {\n networkId: 'testnet',\n nodeUrl: 'https://rpc.testnet.near.org',\n walletUrl: 'https://wallet.testnet.near.org',\n indexerUrl: indexerUrl || 'https://testnet-indexer.ref-finance.com',\n WRAP_NEAR_CONTRACT_ID: 'wrap.testnet',\n REF_FI_CONTRACT_ID: 'ref-finance-101.testnet',\n REF_TOKEN_ID: 'ref.fakes.testnet',\n explorerUrl: 'https://testnet.nearblocks.io',\n REF_DCL_SWAP_CONTRACT_ID: 'dclv2.ref-dev.testnet',\n };\n case 'dev':\n return {\n networkId: 'testnet',\n nodeUrl: 'https://rpc.testnet.near.org',\n walletUrl: 'https://wallet.testnet.near.org',\n indexerUrl: indexerUrl || 'https://dev-indexer.ref-finance.com',\n WRAP_NEAR_CONTRACT_ID: 'wrap.testnet',\n REF_FI_CONTRACT_ID: 'exchange.ref-dev.testnet',\n REF_TOKEN_ID: 'ref.fakes.testnet',\n explorerUrl: 'https://testnet.nearblocks.io',\n REF_DCL_SWAP_CONTRACT_ID: 'refv2-dev.ref-dev.testnet',\n };\n default:\n return {\n networkId: 'mainnet',\n nodeUrl: 'https://rpc.mainnet.near.org',\n walletUrl: 'https://wallet.near.org',\n REF_FI_CONTRACT_ID: 'v2.ref-finance.near',\n WRAP_NEAR_CONTRACT_ID: 'wrap.near',\n REF_TOKEN_ID: 'token.v2.ref-finance.near',\n indexerUrl: indexerUrl || 'https://indexer.ref.finance',\n explorerUrl: 'https://nearblocks.io',\n REF_DCL_SWAP_CONTRACT_ID: 'dclv2.ref-labs.near',\n };\n }\n}\n\nexport let config = getConfig();\n\nexport let REF_FI_CONTRACT_ID = config.REF_FI_CONTRACT_ID;\n\nexport let WRAP_NEAR_CONTRACT_ID = config.WRAP_NEAR_CONTRACT_ID;\n\nexport let REF_TOKEN_ID = config.REF_TOKEN_ID;\n\nexport let WNEAR_META_DATA: TokenMetadata = {\n id: WRAP_NEAR_CONTRACT_ID,\n name: 'wNEAR',\n symbol: 'wNEAR',\n decimals: 24,\n icon: 'https://assets.ref.finance/images/w-NEAR-no-border.png',\n};\n\nexport let REF_META_DATA = {\n decimals: 18,\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='16 24 248 248' style='background: %23000'%3E%3Cpath d='M164,164v52h52Zm-45-45,20.4,20.4,20.6-20.6V81H119Zm0,18.39V216h41V137.19l-20.6,20.6ZM166.5,81H164v33.81l26.16-26.17A40.29,40.29,0,0,0,166.5,81ZM72,153.19V216h43V133.4l-11.6-11.61Zm0-18.38,31.4-31.4L115,115V81H72ZM207,121.5h0a40.29,40.29,0,0,0-7.64-23.66L164,133.19V162h2.5A40.5,40.5,0,0,0,207,121.5Z' fill='%23fff'/%3E%3Cpath d='M189 72l27 27V72h-27z' fill='%2300c08b'/%3E%3C/svg%3E%0A\",\n id: REF_TOKEN_ID,\n name: 'Ref Finance Token',\n symbol: 'REF',\n};\n\nexport const NEAR_META_DATA: TokenMetadata = {\n id: 'NEAR',\n name: 'NEAR',\n symbol: 'NEAR',\n decimals: 24,\n icon:\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2AAAANgCAIAAADF8JzzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR4nO3d7VXb2rqw4eQd57/cgZ0KLCqwVwWIChAVYCrAqQBTgUUFERVEVBBTwTYdmArWO/by3uzMfBA+bHlK87r+nTP2WBFSjO/o8SN//Pvvvz8AAMB//T9nAgCA7wlEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAAC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ICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAID/+fDhw/8H0I0VimXUJpsAAAAASUVORK5CYII=',\n};\n\nexport const TokenLinks = {\n NEAR: 'https://awesomenear.com/near-protocol',\n wNEAR: 'https://awesomenear.com/near-protocol',\n REF: 'https://awesomenear.com/ref-finance',\n OCT: 'https://awesomenear.com/octopus-network',\n PARAS: 'https://awesomenear.com/paras',\n SKYWARD: 'https://awesomenear.com/skyward-finance',\n FLX: 'https://awesomenear.com/flux',\n PULSE: 'https://awesomenear.com/pulse',\n DBIO: 'https://awesomenear.com/debio-network',\n MYRIA: 'https://awesomenear.com/myriad-social',\n PXT: 'https://awesomenear.com/cryptoheroes',\n HAPI: 'https://awesomenear.com/hapi',\n OIN: 'https://awesomenear.com/oin-finance',\n ABR: 'https://awesomenear.com/allbridge',\n '1MIL': 'https://awesomenear.com/1millionnfts',\n MARMAJ: 'https://awesomenear.com/marmaj-foundation',\n marmaj: 'https://awesomenear.com/marmaj-foundation',\n USN: 'https://awesomenear.com/decentral-bank',\n '1INCH': 'https://awesomenear.com/1inch-network',\n GRT: 'https://awesomenear.com/the-graph',\n LINK: 'https://awesomenear.com/chainlink',\n Cheddar: 'https://awesomenear.com/cheddar-farm',\n AURORA: 'https://awesomenear.com/aurora-dev',\n $META: 'https://awesomenear.com/meta-pool',\n UMINT: 'https://awesomenear.com/youminter',\n UTO: 'https://awesomenear.com/secret-skellies-society',\n DEIP: 'https://awesomenear.com/deip',\n WOO: 'https://awesomenear.com/woo-dex',\n LINEAR: 'https://awesomenear.com/linear-protocol',\n PEM: 'https://awesomenear.com/pembrock-finance',\n ATO: 'https://awesomenear.com/atocha-protocol',\n SEAT: 'https://awesomenear.com/seatlab-nft',\n FAR: 'https://awesomenear.com/few-and-far',\n BSTN: 'https://awesomenear.com/bastion',\n BRRR: 'https://awesomenear.com/burrow',\n XNL: 'https://awesomenear.com/chronicle',\n KSW: 'https://awesomenear.com/killswitch-finance',\n STNEAR: 'https://awesomenear.com/meta-pool',\n NearX: 'https://awesomenear.com/stader',\n SD: 'https://awesomenear.com/stader',\n DISC: 'https://awesomenear.com/discovol',\n} as Record<string, string>;\n\nexport const CONSTANT_D = 1.0001;\n\nexport const POINTLEFTRANGE = -800000;\nexport const POINTRIGHTRANGE = 800000;\n\nexport const switchEnv = () => {\n config = getConfig();\n REF_FI_CONTRACT_ID = config.REF_FI_CONTRACT_ID;\n WRAP_NEAR_CONTRACT_ID = config.WRAP_NEAR_CONTRACT_ID;\n REF_TOKEN_ID = config.REF_TOKEN_ID;\n REF_META_DATA = {\n decimals: 18,\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='16 24 248 248' style='background: %23000'%3E%3Cpath d='M164,164v52h52Zm-45-45,20.4,20.4,20.6-20.6V81H119Zm0,18.39V216h41V137.19l-20.6,20.6ZM166.5,81H164v33.81l26.16-26.17A40.29,40.29,0,0,0,166.5,81ZM72,153.19V216h43V133.4l-11.6-11.61Zm0-18.38,31.4-31.4L115,115V81H72ZM207,121.5h0a40.29,40.29,0,0,0-7.64-23.66L164,133.19V162h2.5A40.5,40.5,0,0,0,207,121.5Z' fill='%23fff'/%3E%3Cpath d='M189 72l27 27V72h-27z' fill='%2300c08b'/%3E%3C/svg%3E%0A\",\n id: REF_TOKEN_ID,\n name: 'Ref Finance Token',\n symbol: 'REF',\n };\n WNEAR_META_DATA = {\n id: WRAP_NEAR_CONTRACT_ID,\n name: 'wNEAR',\n symbol: 'wNEAR',\n decimals: 24,\n icon: 'https://assets.ref.finance/images/w-NEAR-no-border.png',\n };\n return {\n config,\n REF_FI_CONTRACT_ID,\n WRAP_NEAR_CONTRACT_ID,\n REF_TOKEN_ID,\n REF_META_DATA,\n WNEAR_META_DATA,\n };\n};\n","import { StablePool } from './types';\nimport { FEE_DIVISOR } from './constant';\n\nimport {\n toReadableNumber,\n toNonDivisibleNumber,\n scientificNotationToString,\n} from './utils';\n\nimport Big from 'big.js';\n\nimport _ from 'lodash';\n\nconst tradeFee = (amount: number, trade_fee: number) => {\n return (amount * trade_fee) / FEE_DIVISOR;\n};\n\nexport const calc_d = (amp: number, c_amounts: number[]) => {\n const token_num = c_amounts.length;\n const sum_amounts = _.sum(c_amounts);\n let d_prev = 0;\n let d = sum_amounts;\n for (let i = 0; i < 256; i++) {\n let d_prod = d;\n for (let c_amount of c_amounts) {\n d_prod = (d_prod * d) / (c_amount * token_num);\n }\n d_prev = d;\n const ann = amp * token_num ** token_num;\n const numerator = d_prev * (d_prod * token_num + ann * sum_amounts);\n const denominator = d_prev * (ann - 1) + d_prod * (token_num + 1);\n d = numerator / denominator;\n if (Math.abs(d - d_prev) <= 1) break;\n }\n return d;\n};\n\nexport const calc_y = (\n amp: number,\n x_c_amount: number,\n current_c_amounts: number[],\n index_x: number,\n index_y: number\n) => {\n const token_num = current_c_amounts.length;\n const ann = amp * token_num ** token_num;\n const d = calc_d(amp, current_c_amounts);\n let s = x_c_amount;\n let c = (d * d) / x_c_amount;\n for (let i = 0; i < token_num; i++) {\n if (i !== index_x && i !== index_y) {\n s += current_c_amounts[i];\n c = (c * d) / current_c_amounts[i];\n }\n }\n c = (c * d) / (ann * token_num ** token_num);\n const b = d / ann + s;\n let y_prev = 0;\n let y = d;\n for (let i = 0; i < 256; i++) {\n y_prev = y;\n const y_numerator = y ** 2 + c;\n const y_denominator = 2 * y + b - d;\n y = y_numerator / y_denominator;\n if (Math.abs(y - y_prev) <= 1) break;\n }\n\n return y;\n};\n\nexport const calc_swap = (\n amp: number,\n in_token_idx: number,\n in_c_amount: number,\n out_token_idx: number,\n old_c_amounts: number[],\n trade_fee: number\n) => {\n const y = calc_y(\n amp,\n in_c_amount + old_c_amounts[in_token_idx],\n old_c_amounts,\n in_token_idx,\n out_token_idx\n );\n const dy = old_c_amounts[out_token_idx] - y;\n const fee = tradeFee(dy, trade_fee);\n const amount_swapped = dy - fee;\n return [amount_swapped, fee, dy];\n};\n\nexport const getSwappedAmount = (\n tokenInId: string,\n tokenOutId: string,\n amountIn: string,\n stablePool: StablePool,\n STABLE_LP_TOKEN_DECIMALS: number\n) => {\n const amp = stablePool.amp;\n const trade_fee = stablePool.total_fee;\n\n // depended on pools\n const in_token_idx = stablePool.token_account_ids.findIndex(\n id => id === tokenInId\n );\n const out_token_idx = stablePool.token_account_ids.findIndex(\n id => id === tokenOutId\n );\n\n const rates = stablePool.rates.map(r =>\n toReadableNumber(STABLE_LP_TOKEN_DECIMALS, r)\n );\n\n const base_old_c_amounts = stablePool.c_amounts.map(amount =>\n toReadableNumber(STABLE_LP_TOKEN_DECIMALS, amount)\n );\n\n const old_c_amounts = base_old_c_amounts\n .map((amount, i) =>\n toNonDivisibleNumber(\n STABLE_LP_TOKEN_DECIMALS,\n scientificNotationToString(\n new Big(amount || 0).times(new Big(rates[i])).toString()\n )\n )\n )\n .map(amount => Number(amount));\n\n const in_c_amount = Number(\n toNonDivisibleNumber(\n STABLE_LP_TOKEN_DECIMALS,\n scientificNotationToString(\n new Big(amountIn).times(new Big(rates[in_token_idx])).toString()\n )\n )\n );\n\n const [amount_swapped, fee, dy] = calc_swap(\n amp,\n in_token_idx,\n in_c_amount,\n out_token_idx,\n old_c_amounts,\n trade_fee\n );\n\n return [\n amount_swapped / Number(rates[out_token_idx]),\n fee,\n dy / Number(rates[out_token_idx]),\n ];\n};\n","import { getConfig } from '../constant';\nexport const REF_WIDGET_STAR_TOKEN_LIST_KEY =\n 'REF_WIDGET_STAR_TOKEN_LIST_VALUE';\n\nexport const REF_WIDGET_ALL_TOKENS_LIST_KEY =\n 'REF_WIDGET_ALL_TOKENS_LIST_VALUE';\nexport const REF_WIDGET_ALL_LIGHT_TOKENS_LIST_KEY =\n 'REF_WIDGET_ALL_LIGHT_TOKENS_LIST_VALUE';\n\nexport const REF_WIDGET_SWAP_IN_KEY = 'REF_WIDGET_SWAP_IN_VALUE';\n\nexport const REF_WIDGET_SWAP_OUT_KEY = 'REF_WIDGET_SWAP_OUT_VALUE';\n\nexport const REF_WIDGET_SWAP_DETAIL_KEY = 'REF_WIDGET_SWAP_DETAIL_VALUE';\n\nexport const DEFAULT_START_TOKEN_LIST_TESTNET = [\n 'wrap.testnet',\n 'usdtt.fakes.testnet',\n 'usdt.fakes.testnet',\n 'ref.fakes.testnet',\n 'usdn.testnet',\n 'eth.fakes.testnet',\n];\n\nexport const DEFAULT_START_TOKEN_LIST_MAINNET = [\n 'wrap.near',\n 'usdt.tether-token.near',\n 'dac17f958d2ee523a2206206994597c13d831ec7.factory.bridge.near',\n 'token.v2.ref-finance.near',\n 'usn',\n 'aurora',\n 'token.sweat',\n];\n\nexport interface Theme {\n container: string; // container background\n buttonBg: string; // button background\n primary: string; // primary theme color\n secondary: string; // secondary theme color\n borderRadius: string; // border radius\n fontFamily: string; // font family\n hover: string; // hovering color\n active: string; // active color\n secondaryBg: string; // secondary background color\n borderColor: string; // border color\n iconDefault: string; // default icon color\n iconHover: string; // icon hovering color\n refIcon?: string; // ref icon color\n}\n\nexport const defaultTheme: Theme = {\n container: '#FFFFFF',\n buttonBg: '#00C6A2',\n primary: '#000000',\n secondary: '#7E8A93',\n borderRadius: '4px',\n fontFamily: 'sans-serif',\n hover: 'rgba(126, 138, 147, 0.2)',\n active: 'rgba(126, 138, 147, 0.2)',\n secondaryBg: '#F7F7F7',\n borderColor: 'rgba(126, 138, 147, 0.2)',\n iconDefault: 'rgba(126, 138, 147, 1)',\n iconHover: 'rgba(62, 62, 62, 1)',\n};\n\nexport const defaultDarkModeTheme: Theme = {\n container: '#26343E',\n buttonBg: '#00C6A2',\n primary: '#FFFFFF',\n secondary: '#7E8A93',\n borderRadius: '4px',\n fontFamily: 'sans-serif',\n hover: 'rgba(126, 138, 147, 0.2)',\n active: 'rgba(126, 138, 147, 0.2)',\n secondaryBg: 'rgba(0, 0, 0, 0.2)',\n borderColor: 'rgba(126, 138, 147, 0.2)',\n iconDefault: 'rgba(126, 138, 147, 1)',\n iconHover: 'rgba(183, 201, 214, 1)',\n refIcon: 'white',\n};\n","const icons: { [tokenId: string]: string } = {\n '4691937a7508860f876c9c0a2a617e7d9e945d4b.factory.bridge.near':\n 'https://ref-finance-images.s3.amazonaws.com/images/woo-wtrue.png',\n 'wrap.near':\n 'data:image/png;base64,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',\n 'wrap.testnet':\n 'data:image/png;base64,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',\n '6b175474e89094c44da98b954eedeac495271d0f.factory.bridge.near':\n 'https://assets.ref.finance/images/4943.png',\n 'berryclub.ek.near': 'https://assets.ref.finance/images/banana.png',\n 'dac17f958d2ee523a2206206994597c13d831ec7.factory.bridge.near':\n 'https://assets.ref.finance/images/825.png',\n '1f9840a85d5af5bf1d1762f925bdaddc4201f984.factory.bridge.near':\n 'https://assets.ref.finance/images/7083.png',\n '514910771af9ca656af840dff83e8264ecf986ca.factory.bridge.near':\n 'https://assets.ref.finance/images/1975.png',\n 'a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.factory.bridge.near':\n 'https://assets.ref.finance/images/3408.png',\n '2260fac5e5542a773aa44fbcfedf7c193bc2c599.factory.bridge.near':\n 'https://assets.ref.finance/images/3717.png',\n '7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9.factory.bridge.near':\n 'https://assets.ref.finance/images/7278.png',\n 'a0b73e1ff0b80914ab6fe0444e65848c4c34450b.factory.bridge.near':\n 'https://assets.ref.finance/images/3635.png',\n '50d1c9771902476076ecfc8b2a83ad6b9355a4c9.factory.bridge.near':\n 'https://assets.ref.finance/images/4195.png',\n '4fabb145d64652a948d72533023f6e7a623c7c53.factory.bridge.near':\n 'https://assets.ref.finance/images/4687.png',\n '6f259637dcd74c767781e37bc6133cd6a68aa161.factory.bridge.near':\n 'https://assets.ref.finance/images/2502.png',\n '6b3595068778dd592e39a122f4f5a5cf09c90fe2.factory.bridge.near':\n 'https://assets.ref.finance/images/6758.png',\n 'c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f.factory.bridge.near':\n 'https://assets.ref.finance/images/2586.png',\n 'c944e90c64b2c07662a292be6244bdf05cda44a7.factory.bridge.near':\n 'https://assets.ref.finance/images/6719.png',\n '9f8f72aa9304c8b593d555f12ef6589cc3a579a2.factory.bridge.near':\n 'https://assets.ref.finance/images/1518.png',\n '0bc529c00c6401aef6d220be8c6ea1667f6ad93e.factory.bridge.near':\n 'https://assets.ref.finance/images/5864.png',\n 'c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2.factory.bridge.near':\n 'https://assets.ref.finance/images/2396.png',\n '0316eb71485b0ab14103307bf65a021042c6d380.factory.bridge.near':\n 'https://assets.ref.finance/images/6941.png',\n '111111111117dc0aa78b770fa6a738034120c302.factory.bridge.near':\n 'https://assets.ref.finance/images/8104.png',\n 'f5cfbc74057c610c8ef151a439252680ac68c6dc.factory.bridge.near':\n 'https://assets.ref.finance/images/55sGoBm.png',\n 'de30da39c46104798bb5aa3fe8b9e0e1f348163f.factory.bridge.near':\n 'https://assets.ref.finance/images/10052.png',\n 'a4ef4b0b23c1fc81d3f9ecf93510e64f58a4a016.factory.bridge.near':\n 'https://assets.ref.finance/images/4222.png',\n 'token.cheddar.near': 'https://assets.ref.finance/images/cheddar.png',\n 'farm.berryclub.ek.near': 'https://assets.ref.finance/images/cucumber.png',\n 'd9c2d319cd7e6177336b0a9c93c21cb48d84fb54.factory.bridge.near':\n 'https://assets.ref.finance/images/HAPI.png',\n};\n\nexport default icons;\n","import { config, WRAP_NEAR_CONTRACT_ID, NEAR_META_DATA } from './constant';\nimport {\n REF_WIDGET_ALL_TOKENS_LIST_KEY,\n REF_WIDGET_ALL_LIGHT_TOKENS_LIST_KEY,\n} from './swap-widget/constant';\nimport { REPLACE_TOKENS } from './ref';\nimport metaIconDefaults from './metaIcons';\n\nexport const getTokenPriceList = async (): Promise<any> => {\n return await fetch(config.indexerUrl + '/list-token-price', {\n method: 'GET',\n headers: { 'Content-type': 'application/json; charset=UTF-8' },\n })\n .then(res => res.json())\n .then(list => {\n return list;\n });\n};\n\nexport const getTokens = async (reload?: boolean) => {\n const storagedTokens =\n typeof window !== 'undefined' && !reload\n ? localStorage.getItem(REF_WIDGET_ALL_TOKENS_LIST_KEY)\n : null;\n\n return storagedTokens\n ? JSON.parse(storagedTokens)\n : await fetch(config.indexerUrl + '/list-token', {\n method: 'GET',\n headers: { 'Content-type': 'application/json; charset=UTF-8' },\n })\n .then(res => res.json())\n .then(tokens => {\n const newTokens = Object.values(tokens).reduce(\n (acc: any, cur: any, i) => {\n const id = Object.keys(tokens)[i];\n return {\n ...acc,\n [id]: {\n ...cur,\n id,\n icon:\n !cur.icon || REPLACE_TOKENS.includes(id)\n ? metaIconDefaults[id]\n : cur.icon,\n },\n };\n },\n {}\n );\n\n return newTokens;\n })\n .then(res => {\n typeof window !== 'undefined' &&\n !reload &&\n localStorage.setItem(\n REF_WIDGET_ALL_TOKENS_LIST_KEY,\n JSON.stringify(res)\n );\n return res;\n });\n};\nexport const getTokensTiny = async (reload?: boolean) => {\n const storagedTokens =\n typeof window !== 'undefined' && !reload\n ? localStorage.getItem(REF_WIDGET_ALL_LIGHT_TOKENS_LIST_KEY)\n : null;\n\n return storagedTokens\n ? JSON.parse(storagedTokens)\n : await fetch(config.indexerUrl + '/list-token-v2', {\n method: 'GET',\n headers: { 'Content-type': 'application/json; charset=UTF-8' },\n })\n .then(res => res.json())\n .then(tokens => {\n const newTokens = Object.values(tokens).reduce(\n (acc: any, cur: any, i) => {\n const id = Object.keys(tokens)[i];\n return {\n ...acc,\n [id]: {\n ...cur,\n id,\n },\n };\n },\n {}\n );\n\n return newTokens;\n })\n .then(res => {\n typeof window !== 'undefined' &&\n !reload &&\n localStorage.setItem(\n REF_WIDGET_ALL_LIGHT_TOKENS_LIST_KEY,\n JSON.stringify(res)\n );\n return res;\n });\n};\n\nexport const getWhiteListTokensIndexer = async (whiteListIds: string[]) => {\n return await fetch(config.indexerUrl + '/list-token', {\n method: 'GET',\n headers: { 'Content-type': 'application/json; charset=UTF-8' },\n })\n .then(res => res.json())\n .then(res => {\n return whiteListIds.reduce((acc, cur, i) => {\n if (\n !res[cur] ||\n !Object.values(res[cur]) ||\n Object.values(res[cur]).length === 0\n )\n return acc;\n\n return {\n ...acc,\n [cur]: { ...res[cur], id: cur },\n };\n }, {});\n })\n .then(res => {\n return Object.values(res);\n });\n};\n","//@ts-nocheck\nimport Big from 'big.js';\n\nimport { Pool } from '../types';\n\nBig.RM = 0;\nBig.DP = 40;\nBig.NE = -40;\nBig.PE = 40;\n\ninterface FormatedPool extends Pool {\n x?: string;\n y?: string;\n gamma_bps?: Big;\n}\n\n///////////////////////////////\n// Parallel Swap Logic Below //\n///////////////////////////////\n\n/** formatPoolNew\n * This function appends to the existing standard Pool struct and adds attributes that simplify the parallel swap algorithms.\n * Adds attributes \"x\" (for input token reserves in pool), \"y\" (for output token reserves in pool), and \"gamma_bps\" (for 1- fee in bps)\n * Our convention for our algorithm has been to use \"x\" as the input token and \"y\" as the output token.\n * @param pool AMM structure containing reserves of inputToken and outputToken\n * @param inputToken the name of the inputToken being traded in.\n * @param outputToken the name of the outputToken being traded out.\n * @returns newFormatPool\n */\nexport function formatPoolNew(\n pool: Pool,\n inputToken: string,\n outputToken: string\n) {\n let p: FormatedPool = pool;\n let x = p.supplies[inputToken];\n let y = p.supplies[outputToken];\n p['gamma_bps'] = new Big(10000).minus(p.fee);\n p['x'] = x;\n p['y'] = y;\n return p;\n}\n\n/** solveForMuFloat\n * This function takes the set of token pools, the total input of inputToken, and the names of inputToken and outputToken and\n * solves for the Lagrange Multiplier \"mu\". Note that mu must be allowed to be aritrary precision floating point number. Mu will\n * be used in subsequent function calls to determine the best allocations of intputToken to be made per pool.\n * For more detailed math on how this function was derived, please see the white paper:\n * https://github.com/giddyphysicist/ParallelSwapForRefFinance/blob/main/ParallelSwapWhitePaper.pdf\n * @param pools list of pools that contain inputToken and outputToken\n * @param totalDeltaX total allocation (among all pools) being input of inputToken\n * @param inputToken the name of the inputToken being traded in.\n * @param outputToken the name of the outputToken being traded out.\n * @returns mu the lagrange multiplier value calculated for a set of pools and inputToken amount.\n */\nexport function solveForMuFloat(\n pools: Pool[],\n totalDeltaX: string,\n inputToken: string,\n outputToken: string\n) {\n if (pools.length > 0) {\n let numerator = new Big(totalDeltaX);\n let denominator = new Big(0);\n\n for (var i = 0; i < pools.length; i++) {\n let p = formatPoolNew(pools[i], inputToken, outputToken);\n let numAdd = new Big(p.x).times(10000).div(p.gamma_bps);\n numerator = numerator.plus(numAdd);\n let denomAdd = new Big(p.x)\n .times(p.y)\n .div(p.gamma_bps)\n .sqrt()\n .times(100);\n denominator = denominator.plus(denomAdd);\n }\n\n const mu = new Big(numerator).div(denominator);\n return mu;\n } else {\n // console.log('ERROR - could not find pools that satisfy token pair');\n const mu = NaN;\n return mu;\n }\n}\n\n/** calculate_dx_float\n * Once mu has been calculated for a set of pools and total input amount, the next step is\n * determining the total allocation per pool. This function evaluates the amount of input Token to be\n * allocated to the given pool. Note, in our original algorithmic convention, the 'x' variable was for the input token,\n * and the 'y' variable was for the output token. Here, the value dx is the part of the full amount of input token X.\n * Again, the detailed formulae for these operations can be found in the white paper referenced above.\n * @param mu the lagrange multiplier value calculated for a set of pools and inputToken amount.\n * @param pool AMM structure containing reserves of inputToken and outputToken\n * @param inputToken the name of the inputToken being traded in.\n * @param outputToken the name of the outputToken being traded out.\n * @returns dxFloat the allocation amount determined for the given pool\n */\nexport function calculate_dx_float(\n mu: number | Big,\n pool: FormatedPool,\n inputToken: string,\n outputToken: string\n) {\n let p = formatPoolNew(pool, inputToken, outputToken);\n let radical = new Big(p.x).times(p.y).div(p.gamma_bps);\n let dxFloat = new Big(mu)\n .times(100)\n .times(radical.sqrt())\n .minus(new Big(p.x).times(10000).div(p.gamma_bps));\n return dxFloat;\n}\n\n/** calculate_dy_float\n * Once you have an allocation amount for a given pool, you can use the AMM constant-product formula to determine\n * the expected output amount of output Token.\n * Note, here, as earlier, our algorithmic convention uses \"y\" as the output token, and so \"dy\" is the fraction of\n * the total output of output Token, assuming there could be dy contributions from other parallel pools as well.\n * @param dx_float input allocation amount of inputToken for the given pool\n * @param pool a structure representing the reserves and fees for a given pool.\n * @param inputToken the name of the inputToken being traded in.\n * @param outputToken the name of the outputToken being traded out.\n * @returns dyFloat the expected trade out amount out of outputToken\n */\nexport function calculate_dy_float(\n dx_float: number,\n pool: FormatedPool,\n inputToken: string,\n outputToken: string\n) {\n if (dx_float <= 0) {\n return new Big(0);\n }\n let p = formatPoolNew(pool, inputToken, outputToken);\n let dx = new Big(dx_float);\n let denom = new Big(10000).times(p.x).plus(new Big(p.gamma_bps).times(dx));\n let numerator = new Big(p.y).times(dx).times(p.gamma_bps);\n let dyFloat = numerator.div(denom).round();\n return dyFloat;\n}\n\n/** calculateOptimalOutput\n * This is the main function, which calculates optimal values of inputToken to swap into each pool.\n * @param pools list of relevant AMM pools containing inputToken and outputToken\n * @param inputAmount the numeric total amount of inputToken to be traded into the group of swap pools.\n * @param inputToken the name of the inputToken being traded in.\n * @param outputToken the name of the outputToken being traded out.\n * @returns normalizedDxArray an array containing the amount allocations of inputToken per pool in the list of pools.\n */\nexport function calculateOptimalOutput(\n pools: Pool[],\n inputAmount: string,\n inputToken: string,\n outputToken: string\n) {\n let mu = solveForMuFloat(pools, inputAmount, inputToken, outputToken);\n let dxArray: Big[] = [];\n let negativeDxValsFlag = false;\n for (var i = 0; i < pools.length; i++) {\n let pool = formatPoolNew(pools[i], inputToken, outputToken);\n let dx = calculate_dx_float(mu, pool, inputToken, outputToken);\n if (dx.lt(0)) {\n negativeDxValsFlag = true;\n }\n let dxInt = new Big(dx).round();\n dxArray.push(dxInt);\n }\n if (negativeDxValsFlag) {\n dxArray = reducePools(pools, dxArray, inputAmount, inputToken, outputToken);\n }\n let dxArraySum = new Big(0);\n for (var i = 0; i < dxArray.length; i++) {\n dxArraySum = dxArraySum.plus(dxArray[i]);\n }\n let tempAllocationsArray = [];\n for (var i = 0; i < dxArray.length; i++) {\n let ndx = new Big(dxArray[i])\n .times(inputAmount)\n .div(dxArraySum)\n .round();\n tempAllocationsArray.push(ndx);\n }\n let allocationsArray = checkIntegerSumOfAllocations(\n tempAllocationsArray,\n inputAmount\n );\n let normalizedDxArray = [];\n for (var i = 0; i < allocationsArray.length; i++) {\n let ndx = allocationsArray[i];\n normalizedDxArray.push(BigInt(ndx));\n pools[i]['partialAmountIn'] = ndx.toString();\n }\n return normalizedDxArray;\n}\n\n/** reducePools\n * This function is used to implement part of the non-linear slack variables in the lagrange - multiplier\n * solution for parallel swap. Part of what comes out of the math is that sometimes, the optimal allocation for a pool\n * can be negative, which makes no physical sense. When this occurs, that particular pool needs to be flagged and the\n * lagrange constraint applied to force the allocation to be zero.\n * This function takes an already-solved set of pools, input allocation per pool, the total input amount, and the\n * inputToken name and outputToken name, and determines which, if any, allocations need to be set to zero.\n * However, when this occurs, and a pool is essentially ignored from the list, then the calculation for mu must be re-done.\n * So the calculateOptimalOutput function is then called on the reduced set of pools, and if no negative allocation values remain,\n * then the allocations on the reduced set is determined, and values of zero are put in for the 'failed' pools.\n * @param pools list of pools that contain inputToken and outputToken\n * @param dxArray list of input allocation per pool\n * @param inputAmount total amount of inputToken to be traded among the pools\n * @param inputToken the name of the inputToken\n * @param outputToken the name of the outputToken\n * @returns newFullDxVec the new full list of input allocations the same length as dxArray, containing zeros for failed pools.\n */\nexport function reducePools(\n pools: Pool[],\n dxArray: Big[],\n inputAmount: string,\n inputToken: string,\n outputToken: string\n) {\n let goodIndices = [];\n for (var i = 0; i < dxArray.length; i++) {\n let dx = dxArray[i];\n if (dx.gte(0)) {\n goodIndices.push(i);\n }\n }\n if (goodIndices.length < 1) {\n // console.log(\"ERROR OCCURRED -- ALL DX VALUES WERE NEGATIVE\")\n return dxArray;\n }\n let newPools = [];\n for (var j = 0; j < dxArray.length; j++) {\n if (goodIndices.includes(j)) {\n newPools.push(pools[j]);\n }\n }\n let newDxVec = calculateOptimalOutput(\n newPools,\n inputAmount,\n inputToken,\n outputToken\n );\n let goodInd2newdx = {};\n for (var k = 0; k < newDxVec.length; k++) {\n goodInd2newdx[goodIndices[k]] = newDxVec[k];\n }\n let newFullDxVec = [];\n for (var ii = 0; ii < pools.length; ii++) {\n if (goodIndices.includes(ii)) {\n newFullDxVec.push(goodInd2newdx[ii]);\n } else {\n newFullDxVec.push(0);\n }\n }\n return newFullDxVec;\n}\n\nexport function checkIntegerSumOfAllocations(\n allocations: Big[] | string[] | BigInt[],\n totalInput: Big | string | BigInt\n) {\n var totalInput = new Big(totalInput);\n var allocations:\n | Big[]\n | string[]\n | BigInt[] = allocations.map((item: Big | string | BigInt) =>\n new Big(item).round()\n );\n let alloSum = allocations\n .map(item => new Big(item))\n .reduce((a, b) => a.plus(b), new Big(0));\n let offset = totalInput.minus(alloSum);\n //get largest allocation.\n let currMax = new Big(0);\n let currMaxInd = 0;\n for (var i = 0; i < allocations.length; i++) {\n if (allocations[i].gt(currMax)) {\n currMaxInd = i;\n currMax = allocations[i];\n }\n }\n let newAllocations = [];\n for (var j = 0; j < allocations.length; j++) {\n if (j === currMaxInd) {\n newAllocations.push(allocations[j].plus(offset).toString());\n } else {\n newAllocations.push(allocations[j].toString());\n }\n }\n return newAllocations;\n}\n","/* eslint-disable no-undef */\n////////////////////////////////////////////////////////////////////////////\n// SMART ROUTE SWAP LOGIC\n////////////////////////////////////////////////////////////////////////////\nimport Big from 'big.js';\nimport { checkIntegerSumOfAllocations } from './parallelSwapLogic';\n\nimport { TokenMetadata } from '../types';\n\nimport { ftGetTokenMetadata } from '../ref';\n\nimport { percentLess, toNonDivisibleNumber } from '../utils';\nBig.RM = 0;\nBig.DP = 40;\nBig.NE = -40;\nBig.PE = 40;\n\nfunction bisqrt(value) {\n // For some ridiculous reason, the .sqrt() method for Big decimals is extremely slow (~10-20ms),\n // which isn't so bad until you need to use it a bunch of times.\n // Since we're dealing with super large numbers anyway, we can convert the Big decimal number into a BigInt,\n // then run this BigInt Newton iteration square root function instead, and then convert back into a\n // Big number. And it speeds up the operation by a crazy factor, ~10x faster.\n if (value < BigInt(0)) {\n throw 'square root of negative numbers is not supported';\n }\n\n if (value < BigInt(2)) {\n return value;\n }\n\n function newtonIteration(n, x0) {\n const x1 = (n / x0 + x0) >> BigInt(1);\n if (x0 === x1 || x0 === x1 - BigInt(1)) {\n return x0;\n }\n return newtonIteration(n, x1);\n }\n\n return newtonIteration(value, BigInt(1));\n}\n\nfunction getBetaForRoute(route, path) {\n if (!route.length) {\n route = [route];\n }\n if (route.length == 1) {\n let p = route[0];\n var beta = new Big(p.reserves[path[0]]);\n } else if (route.length == 2) {\n let p1 = route[0];\n let p2 = route[1];\n var beta = new Big(p1.reserves[path[0]]).times(\n new Big(p2.reserves[path[1]])\n );\n }\n return beta;\n}\n\nfunction getEpsilonForRoute(route, path) {\n if (!route.length) {\n route = [route];\n }\n if (route.length == 1) {\n // Single Hop case\n let p = route[0];\n let gamma = new Big(10000).minus(new Big(p.fee)).div(new Big(10000));\n var epsilon = Big(gamma);\n } else if (route.length == 2) {\n //Double Hop Case\n let p1 = route[0];\n let p2 = route[1];\n let gamma1 = new Big(10000).minus(new Big(p1.fee)).div(new Big(10000));\n let gamma2 = new Big(10000).minus(new Big(p2.fee)).div(Big(10000));\n var epsilon = new Big(p2.reserves[path[1]])\n .times(new Big(gamma1))\n .plus(new Big(p1.reserves[path[1]]).times(gamma1).times(gamma2));\n }\n return epsilon;\n}\n\nfunction getAlphaForRoute(route, path) {\n if (!route.length) {\n route = [route];\n }\n if (route.length == 1) {\n //console.log('single hop')\n let p = route[0];\n let inputToken = path[0];\n let outputToken = path[1];\n let gamma = new Big(10000).minus(new Big(p.fee)).div(new Big(10000));\n let key1 = p.token1Id;\n let key2 = p.token2Id;\n let val1 = p.token1Supply;\n let val2 = p.token2Supply;\n p['reserves'] = { [key1]: val1, [key2]: val2 };\n var alpha = new Big(p.reserves[inputToken]).times(\n new Big(p.reserves[outputToken]).times(new Big(gamma))\n );\n } else if (route.length == 2) {\n //console.log('double hop')\n let p1 = route[0];\n let p2 = route[1];\n let key11 = p1.token1Id;\n let key12 = p1.token2Id;\n let val11 = p1.token1Supply;\n let val12 = p1.token2Supply;\n p1['reserves'] = { [key11]: val11, [key12]: val12 };\n let key21 = p2.token1Id;\n let key22 = p2.token2Id;\n let val21 = p2.token1Supply;\n let val22 = p2.token2Supply;\n p2['reserves'] = { [key21]: val21, [key22]: val22 };\n let inputToken = path[0];\n let middleToken = path[1];\n let outputToken = path[2];\n let gamma1 = new Big(10000).minus(Big(p1.fee)).div(new Big(10000));\n let gamma2 = new Big(10000).minus(new Big(p2.fee)).div(new Big(10000));\n let alpha1 = new Big(p1.reserves[inputToken])\n .times(new Big(p1.reserves[middleToken]))\n .times(gamma1);\n let alpha2 = new Big(p2.reserves[middleToken])\n .times(new Big(p2.reserves[outputToken]))\n .times(gamma2);\n var alpha = alpha1.times(alpha2);\n }\n return alpha;\n}\n\nfunction getAlphaSumFromRoutes(routes, nodeRoutes) {\n let alphaSum = new Big(0);\n for (var i in routes) {\n let route = routes[i];\n let nodeRoute = nodeRoutes[i];\n let alpha = getAlphaForRoute(route, nodeRoute);\n // console.log('alpha is...');\n // console.log(alpha.toString());\n // below, we are replacing the built-in Big sqrt() method with a\n // newton-iteration BigInt sqrt function, to speed it up by 10x.\n let radical = new Big(bisqrt(BigInt(new Big(alpha).round().toFixed())));\n // let radical = new Big(alpha).sqrt();\n let epsilon = getEpsilonForRoute(route, nodeRoute);\n let denom = new Big(epsilon);\n alphaSum = alphaSum.plus(radical.div(denom));\n }\n return alphaSum;\n}\n\nfunction getBetaSumFromRoutes(routes, nodeRoutes) {\n let betaSum = new Big(0);\n for (var i in routes) {\n let route = routes[i];\n let nodeRoute = nodeRoutes[i];\n let num = new Big(getBetaForRoute(route, nodeRoute));\n let denom = new Big(getEpsilonForRoute(route, nodeRoute));\n betaSum = betaSum.plus(num.div(denom));\n }\n return betaSum;\n}\n\nfunction getPhiFromRoutes(routes, nodeRoutes, totalInput) {\n let alphaSum = getAlphaSumFromRoutes(routes, nodeRoutes);\n let betaSum = getBetaSumFromRoutes(routes, nodeRoutes);\n let phi = new Big(totalInput).plus(betaSum).div(alphaSum);\n return phi;\n}\n\nfunction getAllocationForRoute(phi, route, path) {\n let alpha = getAlphaForRoute(route, path);\n let beta = getBetaForRoute(route, path);\n let epsilon = getEpsilonForRoute(route, path);\n // below, we are replacing the built-in Big sqrt() method with a\n // newton-iteration BigInt sqrt function, to speed it up by 10x.\n let allocation = new Big(phi)\n .abs()\n .times(new Big(bisqrt(BigInt(new Big(alpha).round().toFixed()))))\n .minus(beta)\n .div(epsilon);\n return allocation;\n}\n\nfunction getAllocationVectorForRoutes(phi, routes, nodeRoutes) {\n let allocationVec = [];\n for (var i in routes) {\n allocationVec.push(getAllocationForRoute(phi, routes[i], nodeRoutes[i]));\n }\n return allocationVec;\n}\n\nfunction getOptimalAllocationForRoutes(routes, nodeRoutes, totalInput) {\n // console.log(\"CALLING GET OPTIMAL ALLOCATION FOR ROUTES:\")\n // console.log(routes)\n var totalInput = new Big(totalInput);\n let phi = getPhiFromRoutes(routes, nodeRoutes, totalInput);\n // console.log('PHI CALCULATED TO BE...')\n // console.log(phi.toString())\n let allocations = getAllocationVectorForRoutes(phi, routes, nodeRoutes);\n if (allocations.every(item => item.lt(new Big(0)))) {\n allocations = allocations.map(item => item.times(new Big(-1.0)));\n }\n if (allocations.some(item => item.lt(new Big(0)))) {\n allocations = reduceRoutes(routes, nodeRoutes, allocations, totalInput);\n }\n let sumAllocations = allocations.reduce((a, b) => a.plus(b), new Big(0));\n let normalizedAllocations = allocations.map(a =>\n a.div(sumAllocations).times(new Big(totalInput))\n );\n return normalizedAllocations;\n}\n\nfunction reduceRoutes(routes, nodeRoutes, allocationVec, totalInput) {\n // console.log(\"RUNNING REDUCE ROUTES\")\n var totalInput = new Big(totalInput);\n let goodIndices = [];\n for (var i in allocationVec) {\n let dx = allocationVec[i];\n // console.log('DX IS...')\n // console.log(dx.toString())\n if (dx.gt(new Big(0))) {\n goodIndices.push(i);\n }\n }\n // console.log('GOOD INDICES ARE...');\n // console.log(goodIndices);\n let newRoutes = [];\n let newNodeRoutes = [];\n for (var i in goodIndices) {\n let goodIndex = goodIndices[i];\n newRoutes.push(routes[goodIndex]);\n newNodeRoutes.push(nodeRoutes[goodIndex]);\n }\n allocationVec = getOptimalAllocationForRoutes(\n newRoutes,\n newNodeRoutes,\n totalInput\n );\n let allocationDict = {};\n for (var i in goodIndices) {\n allocationDict[goodIndices[i]] = allocationVec[i];\n }\n var allocationVecNew = [];\n for (var i in routes) {\n if (goodIndices.includes(i)) {\n allocationVecNew.push(allocationDict[i]);\n } else {\n let zeroAllocation = new Big(0);\n allocationVecNew.push(zeroAllocation);\n }\n }\n return allocationVecNew;\n}\n\nfunction getNodeRoutesFromPathsAndPoolChains(paths, poolChains) {\n let multiplicity = [];\n for (var i in poolChains) {\n let pc = poolChains[i];\n let mul = pc\n .map(item => item.length)\n .reduce((elem1, elem2) => elem1 * elem2, 1);\n multiplicity.push(mul);\n }\n let nodeRoutes = [];\n for (var j in paths) {\n let path = paths[j];\n let m = multiplicity[j];\n for (var k = 0; k < m; k++) {\n nodeRoutes.push(path);\n }\n }\n return nodeRoutes;\n}\n\nfunction getPoolChainFromPaths(paths, pools, threshold = 0.001) {\n let poolChains = [];\n for (var pathInd in paths) {\n let path = paths[pathInd];\n let chain = [];\n let pairs = [];\n for (var i = 0; i < path.length - 1; i++) {\n pairs.push([path[i], path[i + 1]]);\n }\n for (var pairInd in pairs) {\n let pair = pairs[pairInd];\n // console.log(pair);\n let tokenPools = getPoolsByToken1ANDToken2(pools, pair[0], pair[1]);\n chain.push(tokenPools);\n }\n poolChains.push(chain);\n }\n // return poolChains;\n let culledPoolChains = getCulledPoolChains(poolChains, threshold);\n\n return culledPoolChains;\n}\n\nfunction getCulledPoolChains(poolChains, threshold = 0.001) {\n let newChains = [];\n for (var pathInd in poolChains) {\n let path = poolChains[pathInd];\n let newPath = [];\n for (var legInd in path) {\n let leg = path[legInd];\n let culledPath = cullPoolsWithInsufficientLiquidity(leg, threshold);\n newPath.push(culledPath);\n }\n newChains.push(newPath);\n }\n return newChains;\n}\n\nfunction getRoutesFromPoolChain(poolChains) {\n let routes = [];\n for (var pci in poolChains) {\n let poolChain = poolChains[pci];\n //get cartesian product of each pool chain to get the list of routes.\n let newRoutes = cartesianProduct(poolChain);\n routes.push(...newRoutes);\n }\n for (var i in routes) {\n if (!routes[i].length) {\n routes[i] = [routes[i]];\n }\n }\n return routes;\n}\n\nfunction getOutputSingleHop(pool, inputToken, outputToken, totalInput) {\n var totalInput = new Big(totalInput);\n // check if pool is forward or backward for inputToken/outputToken cf. token1Id/token2Id\n if (inputToken === pool.token1Id && outputToken === pool.token2Id) {\n // forward Pool\n var reserves = {\n [inputToken]: new Big(pool.token1Supply),\n [outputToken]: new Big(pool.token2Supply),\n };\n } else if (inputToken === pool.token2Id && outputToken === pool.token1Id) {\n // reverse pool\n var reserves = {\n [outputToken]: new Big(pool.token1Supply),\n [inputToken]: new Big(pool.token2Supply),\n };\n } else {\n return new Big(0);\n }\n let gamma = new Big(10000).minus(new Big(pool.fee)).div(new Big(10000));\n // console.log(totalInput)\n // console.log(gamma)\n // console.log(reserves)\n let num = totalInput.times(gamma).times(reserves[outputToken]);\n let denom = reserves[inputToken].plus(gamma.times(totalInput));\n return num.div(denom);\n}\n\nfunction getOutputDoubleHop(\n pools,\n inputToken,\n middleToken,\n outputToken,\n totalInput\n) {\n var totalInput = new Big(totalInput);\n for (var poolIndex in pools) {\n let p = pools[poolIndex];\n p['gamma'] = new Big(10000).minus(new Big(p.fee)).div(new Big(10000));\n }\n let p1 = pools[0];\n let p2 = pools[1];\n\n if (inputToken === p1.token1Id && middleToken === p1.token2Id) {\n // forward Pool\n p1['reserves'] = {\n [inputToken]: new Big(p1.token1Supply),\n [middleToken]: new Big(p1.token2Supply),\n };\n } else if (middleToken === p1.token1Id && inputToken === p1.token2Id) {\n //reverse pool\n p1['reserves'] = {\n [middleToken]: new Big(p1.token1Supply),\n [inputToken]: new Big(p1.token2Supply),\n };\n }\n\n if (middleToken === p2.token1Id && outputToken === p2.token2Id) {\n // forward Pool\n p2['reserves'] = {\n [middleToken]: new Big(p2.token1Supply),\n [outputToken]: new Big(p2.token2Supply),\n };\n } else if (outputToken === p2.token1Id && middleToken === p2.token2Id) {\n //reverse pool\n p2['reserves'] = {\n [outputToken]: new Big(p2.token1Supply),\n [middleToken]: new Big(p2.token2Supply),\n };\n }\n\n let c1 = new Big(p1.reserves[middleToken]);\n let a1 = new Big(p1.reserves[inputToken]);\n let c2 = new Big(p2.reserves[middleToken]);\n let b2 = new Big(p2.reserves[outputToken]);\n let gamma1 = p1.gamma;\n let gamma2 = p2.gamma;\n let num = totalInput\n .times(c1)\n .times(b2)\n .times(gamma1)\n .times(gamma2);\n let denom = c2\n .times(a1)\n .plus(\n totalInput.times(c2.times(gamma1).plus(c1.times(gamma1).times(gamma2)))\n );\n // denom = c2*a1 + totalInput * (c2*gamma1 + c1*gamma1*gamma2)\n\n return num.div(denom);\n}\n\nfunction getOutputFromRoute(route, nodeRoute, allocation) {\n if (new Big(allocation).eq(new Big(0))) {\n return new Big(0);\n } else {\n var allocation = new Big(allocation);\n }\n if (!route.length) {\n route = [route];\n }\n if (route.length == 1) {\n // single hop\n let inputToken = nodeRoute[0];\n let outputToken = nodeRoute[1];\n let pool = route[0];\n var output = getOutputSingleHop(pool, inputToken, outputToken, allocation);\n } else if (route.length == 2) {\n // DOUBLE HOP\n let inputToken = nodeRoute[0];\n let middleToken = nodeRoute[1];\n let outputToken = nodeRoute[2];\n let pools = route;\n var output = getOutputDoubleHop(\n pools,\n inputToken,\n middleToken,\n outputToken,\n allocation\n );\n }\n return output;\n}\n\nfunction getOptOutputVec(routes, nodeRoutes, totalInput) {\n let allocations = getOptimalAllocationForRoutes(\n routes,\n nodeRoutes,\n totalInput\n );\n let result = [];\n for (var i in routes) {\n let route = routes[i];\n let nodeRoute = nodeRoutes[i];\n let allocation = allocations[i];\n let output = getOutputFromRoute(route, nodeRoute, allocation);\n result.push(output);\n }\n return {\n result: result,\n allocations: allocations,\n };\n //NOTE -- I made this return an object instead of the tuple returned in python. need to check the places it is called, and specify\n // result field instead of tuple 0 position, and allocations field instead of tuple 1 position.\n}\n\nfunction getBestOptInputAndOutputSlower(routes, nodeRoutes, totalInput) {\n let refDict = getOptOutputVecRefined(routes, nodeRoutes, totalInput);\n let outputRefined = refDict.result;\n let inputRefined = refDict.allocations;\n inputRefined = checkIntegerSumOfAllocations(inputRefined, totalInput);\n let rawDict = getOptOutputVec(routes, nodeRoutes, totalInput);\n let outputRaw = rawDict.result;\n let inputRaw = rawDict.allocations;\n inputRaw = checkIntegerSumOfAllocations(inputRaw, totalInput);\n let res1 = new Big(0);\n let res2 = new Big(0);\n\n for (var n in outputRefined) {\n res1 = res1.plus(outputRefined[n]);\n }\n for (var nn in outputRaw) {\n res2 = res2.plus(outputRaw[nn]);\n }\n // console.log('COMPARING SINGLE HOPS VS DOUBLE')\n // console.log(res1.toString())\n // console.log(res2.toString())\n if (res1.gt(res2)) {\n return { input: inputRefined, output: res1 };\n } else {\n return { input: inputRaw, output: res2 };\n }\n}\n\nfunction getBestOptInputAndOutput(routes, nodeRoutes, totalInput) {\n // let refDict = getOptOutputVecRefined(routes, nodeRoutes, totalInput);\n // let outputRefined = refDict.result;\n // let inputRefined = refDict.allocations;\n // inputRefined = checkIntegerSumOfAllocations(inputRefined, totalInput);\n let rawDict = getOptOutputVec(routes, nodeRoutes, totalInput);\n let outputRaw = rawDict.result;\n let inputRaw = rawDict.allocations;\n inputRaw = checkIntegerSumOfAllocations(inputRaw, totalInput);\n let res1 = new Big(0);\n let res2 = new Big(0);\n\n let res = outputRaw\n .map(v => new Big(v))\n .reduce((bv1, bv2) => bv1.plus(bv2), new Big(0));\n\n return {\n input: inputRaw,\n output: res,\n };\n}\n\nfunction getBestOptOutput(routes, nodeRoutes, totalInput) {\n let outputRefined = getOptOutputVecRefined(routes, nodeRoutes, totalInput)\n .result;\n let outputRaw = getOptOutputVec(routes, nodeRoutes, totalInput).result;\n let res1 = new Big(0);\n let res2 = new Big(0);\n\n for (var n in outputRefined) {\n res1 = res1.plus(outputRefined[n]);\n }\n for (var nn in outputRaw) {\n res2 = res2.plus(outputRaw[nn]);\n }\n if (res1.gt(res2)) {\n return res1;\n } else {\n return res2;\n }\n}\n\nfunction getBestOptInput(routes, nodeRoutes, totalInput) {\n let refDict = getOptOutputVecRefined(routes, nodeRoutes, totalInput);\n let outputRefined = refDict.result;\n let inputRefined = refDict.allocations;\n inputRefined = checkIntegerSumOfAllocations(inputRefined, totalInput);\n let rawDict = getOptOutputVec(routes, nodeRoutes, totalInput);\n let outputRaw = rawDict.result;\n let inputRaw = rawDict.allocations;\n inputRaw = checkIntegerSumOfAllocations(inputRaw, totalInput);\n let res1 = new Big(0);\n let res2 = new Big(0);\n\n for (var n in outputRefined) {\n res1 = res1.plus(outputRefined[n]);\n }\n for (var nn in outputRaw) {\n res2 = res2.plus(outputRaw[nn]);\n }\n // console.log('COMPARING SINGLE HOPS VS DOUBLE')\n // console.log(res1.toString())\n // console.log(res2.toString())\n if (res1.gt(res2)) {\n return inputRefined;\n } else {\n return inputRaw;\n }\n}\n\nfunction getOptOutputVecRefined(routes, nodeRoutes, totalInput) {\n // need to calculate full result.\n // if direct pools exist, need to calculate parallel result. if not, this portion is set to zero output.\n\n // need to compare between outputs of the two results above.\n\n let initLengthRoutes = routes.length;\n let directRouteInds = [];\n for (var routeInd in routes) {\n let route = routes[routeInd];\n if (!route.length) {\n route = [route];\n }\n if (route.length == 1) {\n directRouteInds.push(routeInd);\n }\n }\n // console.log('DIRECT ROUTE INDS ARE')\n // console.log(directRouteInds)\n // if (directRouteInds.length < 1) {\n var fullResultAllocations = getOptimalAllocationForRoutes(\n routes,\n nodeRoutes,\n totalInput\n );\n var fullResult = [];\n for (var i in routes) {\n let r = routes[i];\n let nr = nodeRoutes[i];\n let a = fullResultAllocations[i];\n let output = getOutputFromRoute(r, nr, a);\n fullResult.push(output);\n }\n var fullResultTotal = fullResult.reduce((a, b) => a.plus(b), new Big(0));\n\n // } else {\n if (directRouteInds.length > 0) {\n // console.log('DOING SINGLE HOP ONLY')\n let droutes = [];\n let dnodeRoutes = [];\n for (var dri in directRouteInds) {\n let ind = directRouteInds[dri];\n droutes.push(routes[ind]);\n dnodeRoutes.push(nodeRoutes[ind]);\n }\n let dallocations = getOptimalAllocationForRoutes(\n droutes,\n dnodeRoutes,\n totalInput\n );\n let dallocDict = {};\n for (var dd in dallocations) {\n dallocDict[directRouteInds[dd]] = dallocations[dd];\n }\n var pallocations = [];\n\n for (var ii = 0; ii < initLengthRoutes; ii++) {\n if (directRouteInds.includes(ii.toString())) {\n //console.log('ADDING ALLOCATION FOR SINGLE ROUTE')\n pallocations.push(dallocDict[ii]);\n } else {\n pallocations.push(new Big(0));\n }\n }\n var presult = [];\n for (var j in routes) {\n let route = routes[j];\n let nodeRoute = nodeRoutes[j];\n let allocation = pallocations[j];\n let output = getOutputFromRoute(route, nodeRoute, allocation);\n presult.push(output);\n }\n var presultTotal = presult.reduce((a, b) => a.plus(b), new Big(0));\n } else {\n var presultTotal = new Big(0);\n }\n if (presultTotal.gt(fullResultTotal)) {\n var result = presult;\n var allocations = pallocations;\n } else {\n var result = fullResult;\n var allocations = fullResultAllocations;\n }\n // NEED TO COMPARE BETWEEEN DIRECT AND MULTI HOP TO GET BEST OUTPUT\n return {\n result: result,\n allocations: allocations,\n };\n}\n\nasync function getBestOptimalAllocationsAndOutputs(\n pools,\n inputToken,\n outputToken,\n totalInput,\n maxPathLength = 3,\n threshold = 0.001\n) {\n var totalInput = new Big(totalInput);\n let paths = await getPathsFromPools(\n pools,\n inputToken,\n outputToken,\n maxPathLength\n );\n if (!paths.length) {\n return {\n allocations: [],\n outputs: new Big(0),\n routes: [],\n nodeRoutes: [],\n };\n }\n let poolChains = await getPoolChainFromPaths(paths, pools, threshold);\n\n let routes = await getRoutesFromPoolChain(poolChains);\n let nodeRoutes = await getNodeRoutesFromPathsAndPoolChains(paths, poolChains);\n // let allocations = await getBestOptInput(routes, nodeRoutes, totalInput);\n // // fix integer rounding for allocations:\n // allocations = checkIntegerSumOfAllocations(allocations, totalInput);\n // let outputs = getBestOptOutput(routes, nodeRoutes, totalInput);\n let inputOutput = await getBestOptInputAndOutput(\n routes,\n nodeRoutes,\n totalInput\n );\n let allocations = inputOutput.input;\n let outputs = inputOutput.output;\n\n return {\n allocations: allocations,\n outputs: outputs,\n routes: routes,\n nodeRoutes: nodeRoutes,\n };\n}\n\nfunction getHopsFromRoutes(routes, nodeRoutes, allocations) {\n let hops = [];\n for (var i in routes) {\n var route = routes[i];\n var nodeRoute = nodeRoutes[i];\n var allocation = allocations[i];\n if (!route.length) {\n route = [route];\n }\n if (!route[0]) {\n continue;\n }\n let hop = {\n pool: route[0],\n allocation: allocation,\n inputToken: nodeRoute[0],\n outputToken: nodeRoute[1],\n };\n hops.push(hop);\n }\n return hops;\n}\n\nfunction distillHopsByPool(hops) {\n // console.log('some HOPS =');\n // console.log(hops);\n let distilledHops = [];\n let poolIds = [];\n let poolId2allocation = {};\n for (var i in hops) {\n let hop = hops[i];\n if (hop.allocation === '0') {\n continue;\n }\n // console.log(`HOP ${i} IS...`);\n // console.log(hop);\n let poolId = hop.pool['id'];\n if (poolIds.includes(poolId)) {\n poolId2allocation[poolId] = new Big(poolId2allocation[poolId])\n .plus(new Big(hop.allocation))\n .toString();\n } else {\n poolId2allocation[poolId] = new Big(hop.allocation).toString();\n poolIds.push(poolId);\n }\n }\n // let poolsWithOrder = [...new Set(...hops.map((item) => item.pool))]\n let keys = Object.keys(poolId2allocation);\n for (var j in keys) {\n var poolId = keys[j];\n let hop = hops.filter(\n item => item.pool.id.toString() === poolId.toString()\n )[0];\n let distilledHop = {\n pool: hop.pool,\n allocation: poolId2allocation[poolId],\n inputToken: hop.inputToken,\n outputToken: hop.outputToken,\n };\n distilledHops.push(distilledHop);\n }\n return distilledHops;\n}\n\nfunction getDistilledHopActions(distilledHops, slippageTolerance) {\n let actions = [];\n for (var i in distilledHops) {\n let hop = distilledHops[i];\n let expectedAmountOut = getOutputSingleHop(\n hop.pool,\n hop.inputToken,\n hop.outputToken,\n hop.allocation\n );\n let minimumAmountOut = new Big(expectedAmountOut)\n .times(new Big(1).minus(new Big(slippageTolerance).div(100)))\n .round()\n .toString(); //Here, assume slippage tolerance is a percentage. So 1% would be 1.0\n let action = {\n pool_id: hop.pool.id,\n token_in: hop.inputToken,\n token_out: hop.outputToken,\n amount_in: hop.allocation,\n min_amount_out: minimumAmountOut,\n };\n actions.push(action);\n }\n return actions;\n}\nfunction getMiddleTokenTotalsFromFirstHopActions(firstHopActions) {\n let middleTokens = [...new Set(firstHopActions.map(item => item.token_out))];\n let middleTokenTotals = {};\n for (var i in middleTokens) {\n let middleToken = middleTokens[i];\n let mtActions = firstHopActions.filter(\n item => item.token_out === middleToken\n );\n let mtTotal = mtActions\n .map(item => new Big(item.min_amount_out))\n .reduce((a, b) => a.plus(b), new Big(0))\n .toString();\n middleTokenTotals[middleToken] = mtTotal;\n }\n return middleTokenTotals;\n}\nfunction getRoutesAndAllocationsForMiddleToken(\n routes,\n nodeRoutes,\n allocations,\n middleToken,\n middleTokenTotal\n) {\n // get routes that use middle token.\n // (input route alloction) /sum(input allocations of routes with middle token) * (total_middleToken)\n let mask = [];\n for (var i in nodeRoutes) {\n if (nodeRoutes[i][1] === middleToken) {\n mask.push(true);\n } else {\n mask.push(false);\n }\n }\n let froutes = [];\n let fallocations = [];\n let fnoderoutes = [];\n for (var i in routes) {\n if (mask[i]) {\n froutes.push(routes[i]);\n fallocations.push(allocations[i]);\n fnoderoutes.push(nodeRoutes[i]);\n }\n }\n let sumfallocations = fallocations.reduce(\n (a, b) => new Big(a).plus(new Big(b)),\n new Big(0)\n );\n let middleAllocations = fallocations.map(item =>\n new Big(item).div(sumfallocations).times(new Big(middleTokenTotal))\n );\n let secondHopRoutes = froutes.map(item => [item[1]]);\n let secondHopNodeRoutes = fnoderoutes.map(item => [item[1], item[2]]);\n middleAllocations = checkIntegerSumOfAllocations(\n middleAllocations,\n middleTokenTotal\n );\n return {\n routes: secondHopRoutes,\n nodeRoutes: secondHopNodeRoutes,\n allocations: middleAllocations,\n };\n}\n\nfunction getHopActionsFromRoutes(routes, nodeRoutes, allocations) {\n // console.log('INSIDE GET HOP ACTIONS FROM ROUTES');\n // console.log('ROUTES ARE...');\n // console.log(routes);\n // console.log('NODE ROUTES ARE...');\n // console.log(nodeRoutes);\n // console.log('ALLOCATIONS ARE...');\n // console.log(allocations);\n let totalInput = allocations\n .map(a => new Big(a))\n .reduce((a, b) => a.plus(b), new Big(0))\n .toString();\n let hops = [];\n for (var i in routes) {\n var route = routes[i];\n var nodeRoute = nodeRoutes[i];\n var allocation = allocations[i];\n if (new Big(allocation).eq(new Big(0))) {\n continue;\n }\n if (!route.length) {\n route = [route];\n }\n if (!route[0]) {\n continue;\n }\n for (var j in route) {\n let pool = route[j];\n // console.log('J IS...');\n // console.log(j);\n // console.log('NODE ROUTE IS...');\n // console.log(nodeRoute);\n if (j == 0) {\n //first hop.\n // console.log(nodeRoute[0]);\n // console.log(nodeRoute[1]);\n var hop = {\n pool: pool,\n allocation: allocation.toString(),\n inputToken: nodeRoute[0],\n outputToken: nodeRoute[1],\n nodeRoute: nodeRoute,\n route: route,\n allRoutes: routes,\n allNodeRoutes: nodeRoutes,\n totalInputAmount: totalInput,\n allAllocations: allocations,\n };\n // console.log('FIRST HOP IS...');\n // console.log(hop);\n hops.push(hop);\n if (nodeRoute.length > 2) {\n var middleTokenAllocation = getOutputSingleHop(\n pool,\n nodeRoute[0],\n nodeRoute[1],\n allocation\n );\n }\n } else {\n // second hop\n var hop = {\n pool: pool,\n allocation: middleTokenAllocation.toString(),\n inputToken: nodeRoute[1],\n outputToken: nodeRoute[2],\n nodeRoute: nodeRoute,\n route: route,\n allRoutes: routes,\n allNodeRoutes: nodeRoutes,\n totalInputAmount: totalInput,\n allAllocations: allocations,\n };\n // console.log('SECOND HOP IS...');\n // console.log(hop);\n hops.push(hop);\n }\n }\n }\n // console.log('HOP ACTIONS FOUND TO BE');\n // console.log(hops);\n return hops;\n}\n\n// TODO: Clean this function. I don't need all the \"actions\" just the hops.\n// TODO: re-order actions to ensure each route is complete with zero input for second hop before starting next route.\nfunction getActionListFromRoutesAndAllocations(\n routes,\n nodeRoutes,\n allocations\n) {\n // REPLACE THE CODE BELOW WITH THE FUNCTION HERE.\n return getHopActionsFromRoutes(routes, nodeRoutes, allocations);\n var actions = [];\n var all_hops = [];\n let firstHops = getHopsFromRoutes(routes, nodeRoutes, allocations);\n\n firstHops = firstHops.filter(hop => new Big(hop.allocation).gt(new Big(0)));\n all_hops.push(...firstHops);\n let distilledFirstHops = distillHopsByPool(firstHops);\n let firstHopActions = getDistilledHopActions(\n distilledFirstHops,\n slippageTolerance\n );\n actions.push(...firstHopActions);\n let middleTokenTotals = getMiddleTokenTotalsFromFirstHopActions(\n firstHopActions\n );\n // console.log('first hop actions are...');\n // console.log(firstHopActions);\n let middleTokens = Object.keys(middleTokenTotals);\n // console.log('middle token totals are...');\n // console.log(middleTokenTotals);\n // console.log('middle tokens are...');\n // console.log(middleTokens);\n for (var tokenIndex in middleTokens) {\n var secondHops = [];\n let middleToken = middleTokens[tokenIndex];\n // console.log('current middle token is ');\n // console.log(middleToken);\n let middleTokenTotal = middleTokenTotals[middleToken];\n // console.log('current middle token total is...');\n // console.log(middleTokenTotal);\n let middleTokenRoutesWithAllocations = getRoutesAndAllocationsForMiddleToken(\n routes,\n nodeRoutes,\n allocations,\n middleToken,\n middleTokenTotal\n );\n // console.log('current middle tokens routes with allocations are...');\n // console.log(middleTokenRoutesWithAllocations);\n let middleTokenRoutes = middleTokenRoutesWithAllocations.routes;\n let middleTokenAllocations = middleTokenRoutesWithAllocations.allocations;\n let middleTokenNodeRoutes = middleTokenRoutesWithAllocations.nodeRoutes;\n // console.log('middle token routes are...');\n // console.log(middleTokenRoutes);\n // console.log('middle token allocations are...');\n // console.log(middleTokenAllocations);\n // console.log('middle token node routes are...');\n // console.log(middleTokenNodeRoutes);\n secondHops.push(\n ...getHopsFromRoutes(\n middleTokenRoutes,\n middleTokenNodeRoutes,\n middleTokenAllocations\n )\n );\n // console.log('CURRENT SECOND HOPS', secondHops);\n // console.log(secondHops.length);\n // console.log(secondHops.map((hop) => hop.allocation));\n // console.log('filter out zero allocation 2nd hops:');\n secondHops = secondHops.filter(hop =>\n new Big(hop.allocation).gt(new Big(0))\n );\n // console.log(secondHops);\n all_hops.push(...secondHops);\n // console.log('second hops are currently...');\n // console.log(secondHops);\n let distilledSecondHopsForToken = distillHopsByPool(secondHops);\n // console.log('distilled second hops are...');\n let secondHopActionsForToken = getDistilledHopActions(\n distilledSecondHopsForToken,\n slippageTolerance\n );\n // console.log(secondHopActionsForToken);\n actions.push(...secondHopActionsForToken);\n }\n\n //TODO: NEED TO RUN INTEGER ROUNDING FUNCTION ON MIDDLE TOKEN ALLOCATIONS\n\n // TODO: check the node routes. for double-hop cases, find the hop action for each hop.\n // For now, we are assuming no parallel swaps if there is a double-hop.\n\n // Possible cases:\n // (1) 1 single-hop.\n // (2) Parallel single-hop ?\n // (3) 1 double-hop\n // (4) 2 double-hops\n\n // We only have to worry about re-ordering the actions for cases (3) and (4).\n\n let orderedHops = orderHops(all_hops, routes, nodeRoutes, allocations);\n\n // console.log('ALL HOPS', all_hops);\n return orderedHops;\n // return actions;\n}\n\nfunction orderHops(hops, routes, nodeRoutes, allocations) {\n // first get rid of zero allocation routes\n // console.log('NODE ROUTES ARE...');\n // console.log(nodeRoutes);\n let filteredRoutes = [];\n let filteredNodeRoutes = [];\n let filteredAllocations = [];\n for (var i in routes) {\n // remove zero-allocation routes.\n let allocation = new Big(allocations[i]);\n if (allocation.gt(new Big(0))) {\n filteredAllocations.push(allocation);\n filteredRoutes.push(routes[i]);\n filteredNodeRoutes.push(nodeRoutes[i]);\n }\n // console.log('FILTERED NODE ROUTES ARE...');\n // console.log(filteredNodeRoutes);\n }\n // next check node routes to see if it is case 1, 2, 3, or 4.\n // Possible cases:\n // (1) 1 single-hop.\n // (2) Parallel single-hop ?\n // (3) 1 double-hop\n // (4) 2 double-hops\n\n if (filteredNodeRoutes.length === 1) {\n // only one route.\n let currentNodeRoute = filteredNodeRoutes[0];\n if (currentNodeRoute.length === 2) {\n // case 1.\n return hops;\n } else {\n // case 3. assume there are only 3 nodes (double-hop)\n //make sure order of hops is such that input token precedes output token.\n //make sure the amount_in for second hop is zero (which will grab all of output of first hop to use.)\n let firstHop = hops.filter(\n hop => hop.inputToken === currentNodeRoute[0]\n )[0];\n let secondHop = hops.filter(\n hop => hop.inputToken === currentNodeRoute[1]\n )[0];\n // set second hop amount in to 0 so that it will use whatever was generated by hop 1.\n secondHop.pool.partialAmountIn = '0';\n\n let orderedHops = [firstHop, secondHop];\n return orderedHops;\n }\n } else if (filteredNodeRoutes.length === 2) {\n // two routes.\n let lengthNodeRoutes = filteredNodeRoutes.map(nr => nr.length);\n // sub cases:\n // [2,2] -- parallel swap. (direct) -- case 2\n // [2,3] -- direct swap in parallel with double hop.\n // [3,2] -- double hop in parallel with direct swap.\n // [3,3] -- double hop in parallel with double hop. -- case 4\n let orderedHops = [];\n if (arrayEquals(lengthNodeRoutes, [2, 2])) {\n return hops;\n } else if (arrayEquals(lengthNodeRoutes, [2, 3])) {\n directNodeRoute = filteredNodeRoutes[0];\n doubleNodeRoute = filteredNodeRoutes[1];\n let firstHop = hops.filter(\n hop =>\n hop.inputToken === directNodeRoute[0] &&\n hop.outputToken === directNodeRoute[1]\n )[0];\n let secondHop = hops.filter(\n hop => hop.inputToken === doubleNodeRoute[0]\n )[0];\n let thirdHop = hops.filter(\n hop => hop.outputToken === doubleNodeRoute[2]\n )[0];\n // set third hop amount in to 0 so that it will use whatever was generated by hop 2.\n thirdHop.pool.partialAmountIn = '0';\n orderedHops = [firstHop, secondHop, thirdHop];\n return orderedHops;\n } else if (arrayEquals(lengthNodeRoutes, [3, 2])) {\n directNodeRoute = filteredNodeRoutes[1];\n doubleNodeRoute = filteredNodeRoutes[0];\n let firstHop = hops.filter(\n hop =>\n hop.inputToken === directNodeRoute[0] &&\n hop.outputToken === directNodeRoute[1]\n )[0];\n let secondHop = hops.filter(\n hop => hop.inputToken === doubleNodeRoute[0]\n )[0];\n let thirdHop = hops.filter(\n hop => hop.outputToken === doubleNodeRoute[2]\n )[0];\n // set third hop amount in to 0 so that it will use whatever was generated by hop 2.\n thirdHop.pool.partialAmountIn = '0';\n orderedHops = [firstHop, secondHop, thirdHop];\n return orderedHops;\n } else if (arrayEquals(lengthNodeRoutes, [3, 3])) {\n orderedHops = [];\n\n for (var i in filteredNodeRoutes) {\n let doubleNodeRoute = filteredNodeRoutes[i];\n let doubleHopMiddleToken = doubleNodeRoute[1];\n let firstHop = hops.filter(\n hop =>\n hop.inputToken === doubleNodeRoute[0] &&\n hop.outputToken === doubleHopMiddleToken\n )[0];\n let secondHop = hops.filter(\n hop =>\n hop.inputToken === doubleHopMiddleToken &&\n hop.outputToken === doubleNodeRoute[2]\n )[0];\n // set second hop amount in to 0 so that it will use whatever was generated by hop 1.\n secondHop.pool.partialAmountIn = '0';\n orderedHops.push(firstHop);\n orderedHops.push(secondHop);\n }\n return orderedHops;\n } else {\n return hops;\n }\n for (var i in filteredNodeRoutes) {\n let currentNodeRoute = filteredNodeRoutes[i];\n if (currentNodeRoute.length === 2) {\n }\n }\n }\n\n return hops;\n}\n\n// function getActionListFromRoutesAndAllocationsORIG(\n// routes,\n// nodeRoutes,\n// allocations,\n// slippageTolerance\n// ) {\n// let actions = [];\n// for (var i in routes) {\n// let route = routes[i];\n// let nodeRoute = nodeRoutes[i];\n// let allocation = new Big(allocations[i]);\n// if (allocation.eq(new Big(0))) {\n// continue;\n// }\n// if (!route.length) {\n// route = [route];\n// }\n// if (route.length === 1) {\n// //single hop. only one action.\n// let pool = route[0];\n// let poolId = pool.id;\n// let inputToken = nodeRoute[0];\n// let outputToken = nodeRoute[1];\n// let expectedAmountOut = getOutputSingleHop(\n// pool,\n// inputToken,\n// outputToken,\n// allocation\n// );\n// let minimumAmountOut = expectedAmountOut\n// .times(new Big(1).minus(new Big(slippageTolerance).div(100)))\n// .round()\n// .toString(); //Here, assume slippage tolerance is a percentage. So 1% would be 1.0\n// let action = {\n// pool_id: poolId,\n// token_in: inputToken,\n// token_out: outputToken,\n// amount_in: allocation.round().toString(),\n// min_amount_out: minimumAmountOut.toString(),\n// };\n// actions.push(action);\n// } else if (route.length === 2) {\n// // double hop. two actions.\n// let pool1 = route[0];\n// let pool2 = route[1];\n// let pool1Id = pool1.id;\n// let pool2Id = pool2.id;\n// let inputToken = nodeRoute[0];\n// let middleToken = nodeRoute[1];\n// let outputToken = nodeRoute[2];\n// let expectedAmountOutFirstHop = getOutputSingleHop(\n// pool1,\n// inputToken,\n// middleToken,\n// allocation\n// );\n// let minimumAmountOutFirstHop = expectedAmountOutFirstHop\n// .times(new Big(1).minus(new Big(slippageTolerance).div(100)))\n// .round()\n// .toString(); //Here, assume slippage tolerance is a percentage. So 1% would be 1.0\n\n// let action1 = {\n// pool_id: pool1Id,\n// token_in: inputToken,\n// token_out: middleToken,\n// amount_in: allocation.round().toString(),\n// min_amount_out: minimumAmountOutFirstHop,\n// };\n// let expectedFinalAmountOut = getOutputSingleHop(\n// pool2,\n// middleToken,\n// outputToken,\n// minimumAmountOutFirstHop\n// );\n// let minimumAMountOutSecondHop = expectedFinalAmountOut\n// .times(new Big(1).minus(new Big(slippageTolerance).div(100)))\n// .round()\n// .toString();\n// let action2 = {\n// pool_id: pool2Id,\n// token_in: middleToken,\n// token_out: outputToken,\n// amount_in: minimumAmountOutFirstHop,\n// min_amount_out: minimumAMountOutSecondHop,\n// };\n// actions.push(action1);\n// actions.push(action2);\n// }\n// }\n// return actions;\n// }\n\nfunction* range(start, end) {\n for (; start <= end; ++start) {\n yield start;\n }\n}\n\nfunction last(arr) {\n return arr[arr.length - 1];\n}\n\nfunction* numericCombinations(n, r, loc = []) {\n var idx = loc.length;\n if (idx === r) {\n yield loc;\n return;\n }\n for (let next of range(idx ? last(loc) + 1 : 0, n - r + idx)) {\n yield* numericCombinations(n, r, loc.concat(next));\n }\n}\n\nfunction* combinations(arr, r) {\n for (let idxs of numericCombinations(arr.length, r)) {\n yield idxs.map(i => arr[i]);\n }\n}\n\n// #middleTokenTotals = getMiddleTokenTotals(routes,nodeRoutes,allocations)\n// #TODO: complete this function with middle token checks.\n\n// #consider all routes of length 2 with non-zero allocation. (double-hops)\n// # among these, check for parallel swaps. That is, check for common node routes\n// # for first hop. Then check for common node routes on second hop.\n// # when common node routes occur for the first hop:\n// # 1. Calculate the total expected output of intermediate token.\n// # 2.\n// # when common node routes occur for the second hop:\n// # 1. get a ratio of the input allocations of the full routes associated with\n// # these common node routes. allocate the total intermediate token output\n// # toward these 2nd hop routes in the same ratio as their route input allocations.\n\nexport async function getSmartRouteSwapActions(\n pools,\n inputToken,\n outputToken,\n totalInput,\n allTokens,\n maxPathLength = 3,\n threshold = 0.001,\n numberOfRoutesLimit = 2,\n MAX_NUMBER_PARALLEL_POOLS = 4,\n decimalsCulledPoolIds = []\n) {\n if (!totalInput) {\n return [];\n }\n var totalInput = new Big(totalInput);\n\n // remove pools that have an id from the decimalCulledPoolIds\n pools = pools.filter(p => !decimalsCulledPoolIds.includes(p.id));\n\n let resDict = await getBestOptimalAllocationsAndOutputs(\n pools,\n inputToken,\n outputToken,\n totalInput,\n maxPathLength,\n threshold\n );\n\n let allocations = resDict.allocations;\n\n // let outputs = resDict.outputs;\n let routes = resDict.routes;\n let nodeRoutes = resDict.nodeRoutes;\n\n let sortedIndexValues = argsort(allocations);\n let topIndices = sortedIndexValues.slice(0, 10);\n var reducedRoutes = [];\n var reducedNodeRoutes = [];\n for (var ind of topIndices) {\n reducedRoutes.push(routes[ind]);\n reducedNodeRoutes.push(nodeRoutes[ind]);\n }\n routes = reducedRoutes;\n nodeRoutes = reducedNodeRoutes;\n\n // TODO: compare pairs of routes to get the best allocation pair-wise.\n var currentBestOutput = new Big(0);\n var bestResDict = { routes: [] };\n var bestAllocations = resDict.allocations;\n var bestNodeRoutes = resDict.nodeRoutes;\n var bestRoutes = resDict.routes;\n // first check parallel swap with 4 actions. store result.\n var parallelNodeRoutes = [];\n var parallelRoutes = [];\n for (var n in bestRoutes) {\n let currentNodeRoute = bestNodeRoutes[n];\n if (currentNodeRoute.length == 2) {\n parallelNodeRoutes.push(currentNodeRoute);\n parallelRoutes.push(bestRoutes[n]);\n }\n }\n // console.log(`${parallelNodeRoutes.length} parallel routes found...`);\n var bestRoutesAreParallel = false;\n if (parallelNodeRoutes.length > 0) {\n // first calculate the expected result using only parallel routes.\n // let filteredAllocationsAndOutputs = getOptOutputVecRefined(parallelRoutes, parallelNodeRoutes, totalInput);\n let filteredAllocationsAndOutputs = getOptOutputVec(\n parallelRoutes,\n parallelNodeRoutes,\n totalInput\n );\n let parallellAllocations = filteredAllocationsAndOutputs.allocations;\n let parallelOutputs = filteredAllocationsAndOutputs.result;\n\n if (parallellAllocations.length > MAX_NUMBER_PARALLEL_POOLS) {\n // now sort by allocation value to the top 4 parallel swaps:\n let sortIndices = argsort(parallellAllocations);\n\n sortIndices = sortIndices.slice(0, MAX_NUMBER_PARALLEL_POOLS);\n var filteredParallelRoutes = [];\n var filteredParallelNodeRoutes = [];\n for (var i in sortIndices) {\n filteredParallelRoutes.push(parallelRoutes[sortIndices[i]]);\n filteredParallelNodeRoutes.push(parallelNodeRoutes[sortIndices[i]]);\n }\n filteredAllocationsAndOutputs = getOptOutputVec(\n filteredParallelRoutes,\n filteredParallelNodeRoutes,\n totalInput\n );\n parallellAllocations = filteredAllocationsAndOutputs.allocations;\n parallelOutputs = filteredAllocationsAndOutputs.result;\n }\n\n let parallelOutput = parallelOutputs.reduce(\n (a, b) => a.plus(b),\n new Big(0)\n );\n if (new Big(parallelOutput).gt(currentBestOutput)) {\n bestAllocations = parallellAllocations;\n currentBestOutput = parallelOutput;\n // console.log(\n // 'BEST OUTPUT FROM PARALLEL SWAPS IS NOW... ',\n // currentBestOutput.toString()\n // );\n bestRoutes = parallelRoutes;\n bestNodeRoutes = parallelNodeRoutes;\n bestRoutesAreParallel = true;\n }\n }\n var canHaveTwoRoutes = false;\n // initialize this variable to check if we can have two routes, or if all routes share a pool for an edge case.\n // console.log('THE NUMBER OF ROUTES IS...', routes.length);\n\n for (var i in routes) {\n for (var j in routes) {\n if (j > i) {\n var route1 = routes[i];\n var route2 = routes[j];\n var nodeRoute1 = nodeRoutes[i];\n var nodeRoute2 = nodeRoutes[j];\n // check if they share a pool.\n let route1PoolIds = new Set(route1.map(r => r.id));\n let route2PoolIds = new Set(route2.map(r => r.id));\n var sharePool = false;\n for (var route1PoolId of route1PoolIds) {\n if (route2PoolIds.has(route1PoolId)) {\n sharePool = true;\n }\n }\n if (sharePool) {\n // routes are not independent. skip this pair.\n // console.log('skipping this pair because pool was shared.');\n continue;\n } else {\n canHaveTwoRoutes = true;\n let currentRoutes = [route1, route2];\n let currentNodeRoutes = [nodeRoute1, nodeRoute2];\n\n let filteredAllocationsAndOutputs = getOptOutputVec(\n currentRoutes,\n currentNodeRoutes,\n totalInput\n );\n\n let filteredAllocations = filteredAllocationsAndOutputs.allocations;\n let filteredOutputs = filteredAllocationsAndOutputs.result;\n // console.log('FILTERED ALLOCATIONS:');\n // console.log(filteredAllocations.map((i) => i.toString()));\n // console.log(filteredOutputs);\n let totalOutput = filteredOutputs.reduce(\n (a, b) => a.plus(b),\n new Big(0)\n );\n if (new Big(totalOutput).gt(currentBestOutput)) {\n bestAllocations = filteredAllocations;\n currentBestOutput = totalOutput;\n // console.log('BEST OUTPUT IS NOW... ', currentBestOutput.toString());\n bestRoutes = currentRoutes;\n bestNodeRoutes = currentNodeRoutes;\n bestRoutesAreParallel = false;\n // bestResDict = currentResDict\n }\n\n // if (currentResDict.outputs.gt(currentBestOutput)) {\n // console.log('DIFF IS...', currentResDict.outputs.minus(currentBestOutput).toString());\n // bestResDict = currentResDict;\n // currentBestOutput = bestResDict.outputs;\n // console.log('BEST OUTPUT IS NOW... ', currentBestOutput.toString());\n // console.log(bestResDict.routes);\n // console.log(bestResDict.allocations.map((i) => i.toString()));\n // console.log(bestResDict.outputs.toString());\n }\n }\n }\n }\n\n if (!canHaveTwoRoutes) {\n // now we need to check through the routes in single manner to find the best one:\n for (var i in routes) {\n let currentRoutes = [routes[i]];\n let currentNodeRoutes = [nodeRoutes[i]];\n // let filteredAllocationsAndOutputs = getOptOutputVecRefined(currentRoutes, currentNodeRoutes, totalInput);\n let filteredAllocationsAndOutputs = getOptOutputVec(\n currentRoutes,\n currentNodeRoutes,\n totalInput\n );\n\n let filteredAllocations = filteredAllocationsAndOutputs.allocations;\n let filteredOutputs = filteredAllocationsAndOutputs.result;\n // console.log('FILTERED ALLOCATIONS:');\n // console.log(filteredAllocations.map((i) => i.toString()));\n // console.log(filteredOutputs);\n let totalOutput = filteredOutputs.reduce((a, b) => a.plus(b), new Big(0));\n if (new Big(totalOutput).gt(currentBestOutput)) {\n bestAllocations = filteredAllocations;\n currentBestOutput = totalOutput;\n // console.log('BEST OUTPUT IS NOW... ', currentBestOutput.toString());\n bestRoutes = currentRoutes;\n bestNodeRoutes = currentNodeRoutes;\n bestRoutesAreParallel = false;\n // bestResDict = currentResDict\n }\n }\n }\n\n // resDict = bestResDict;\n\n allocations = bestAllocations;\n\n // let outputs = resDict.outputs;\n routes = bestRoutes;\n nodeRoutes = bestNodeRoutes;\n\n if (routes.length < 1) {\n return [];\n }\n\n // check the top numberOfRoutesLimit\n // console.log('initial allocations are...');\n // console.log(allocations.map((a) => a.toString()));\n // console.log('fixed allocations are...');\n // console.log(allocations.map((a) => new Big(a).toFixed()));\n //SORT BY ALLOCATIONS\n let allSortedIndices = argsort(allocations.map(a => new Big(a)));\n if (bestRoutesAreParallel) {\n numberOfRoutesLimit = 4;\n }\n let sortedIndices = allSortedIndices.slice(0, numberOfRoutesLimit);\n\n // console.log('sorted Indices are');\n // console.log(sortedIndices);\n var filteredRoutes = [];\n var filteredNodeRoutes = [];\n for (var i in sortedIndices) {\n let index = sortedIndices[i];\n filteredRoutes.push(routes[index]);\n filteredNodeRoutes.push(nodeRoutes[index]);\n }\n\n // console.log('filteredRoutes are ...');\n // console.log(filteredRoutes);\n for (var i in filteredRoutes) {\n if (!filteredRoutes[i].length) {\n filteredRoutes[i] = [filteredRoutes[i]];\n }\n }\n // console.log('filtered Node routes are...');\n // console.log(filteredNodeRoutes);\n\n // THE BELOW CODE WILL ENSURE THAT ROUTES ARE INDEPENDENT (e.g. THE ROUTES WILL NOT SHARE A POOL)\n\n let route1PoolIds = filteredRoutes[0].map(pool => pool.id);\n // console.log('route 1 pool ids:');\n // console.log(route1PoolIds);\n if (filteredRoutes.length > 1) {\n let route2PoolIds = filteredRoutes[1].map(pool => pool.id);\n // console.log('route 2 pool ids:');\n // console.log(route2PoolIds);\n var sharedRoute = false;\n for (var i in route2PoolIds) {\n if (route1PoolIds.includes(route2PoolIds[i])) {\n // a pool was shared between routes. need to calculate a new second route.\n // console.log(\n // 'a pool was shared between routes. going to calculate a new second route'\n // );\n sharedRoute = true;\n break;\n }\n }\n }\n\n // NOTE -- this is a much simpler solution than that below. Instead of choosing the next best second route that doesn't share a\n // pool with the first route, we could just use the first route and allocate all inputs to it.\n // but, for larger transactions, it would be better to have option of two independent routes to spread out slippage.\n\n // if (sharedRoute) {\n // filteredRoutes = [filteredRoutes[0]];\n // filteredNodeRoutes = [filteredNodeRoutes[0]];\n // // TODO -- later can add in a second route that doesn't share a pool with first.\n // }\n\n // We're going to find the next-highest allocation route that doesn't share a pool with the first route.\n if (sharedRoute) {\n let allFilteredRoutes = [];\n let allFilteredNodeRoutes = [];\n for (var i in allSortedIndices) {\n allFilteredRoutes.push(routes[allSortedIndices[i]]);\n allFilteredNodeRoutes.push(nodeRoutes[allSortedIndices[i]]);\n }\n let firstRoute = allFilteredRoutes[0];\n // console.log('first route is...');\n // console.log(firstRoute);\n let firstRoutePoolIds = firstRoute.map(pool => pool.id);\n for (var i in allFilteredRoutes) {\n if (!allFilteredRoutes[i].length) {\n allFilteredRoutes[i] = [allFilteredRoutes[i]];\n }\n }\n // console.log('FIRST ROUTE POOL IDS ARE');\n // console.log(firstRoutePoolIds);\n let allFilteredRouteIds = allFilteredRoutes.map(route =>\n route.map(pool => pool.id)\n );\n // console.log('allFilteredRouteIds are ...');\n // console.log(allFilteredRouteIds);\n for (var i in allFilteredRouteIds) {\n // console.log('i is', i);\n // console.log('ALL FILTERED ROUTES [i] IS...');\n // console.log(allFilteredRouteIds[i]);\n for (var j in allFilteredRouteIds[i]) {\n // console.log('j is', j);\n // console.log('ALL FILTERED ROUTES [i][j] IS...');\n // console.log(allFilteredRouteIds[i][j]);\n if (firstRoutePoolIds.includes(allFilteredRouteIds[i][j])) {\n break;\n }\n\n var secondRoute = allFilteredRoutes[i];\n if (!secondRoute.length) {\n secondRoute = [secondRoute];\n }\n filteredRoutes = [allFilteredRoutes[0], secondRoute];\n filteredNodeRoutes = [\n allFilteredNodeRoutes[0],\n allFilteredNodeRoutes[i],\n ];\n break;\n }\n }\n // console.log('new filteredRoutes are ...');\n // console.log(filteredRoutes);\n // console.log('new filtered Node routes are...');\n // console.log(filteredNodeRoutes);\n }\n\n // let filteredAllocations_check = getBestOptInput(\n // filteredRoutes,\n // filteredNodeRoutes,\n // totalInput\n // );\n // let filteredAllocationsAndOutputs = getOptOutputVecRefined(filteredRoutes, filteredNodeRoutes, totalInput);\n let filteredAllocationsAndOutputs = getOptOutputVec(\n filteredRoutes,\n filteredNodeRoutes,\n totalInput\n );\n\n let filteredAllocations = filteredAllocationsAndOutputs.allocations;\n let filteredOutputs = filteredAllocationsAndOutputs.result;\n\n filteredAllocations = checkIntegerSumOfAllocations(\n filteredAllocations,\n totalInput\n ).map(stringAllo => new Big(stringAllo));\n\n let hops = getActionListFromRoutesAndAllocations(\n filteredRoutes,\n filteredNodeRoutes,\n filteredAllocations\n );\n\n var actions = [];\n // console.log('hops are...');\n // console.log(hops);\n\n for (var i in hops) {\n let hopInputTokenMeta = allTokens[hops[i].inputToken]\n ? allTokens[hops[i].inputToken]\n : await ftGetTokenMetadata(hops[i].inputToken, 'token input');\n\n let hopOutputTokenMeta = allTokens[hops[i].outputToken]\n ? allTokens[hops[i].outputToken]\n : await ftGetTokenMetadata(hops[i].outputToken, 'token sm');\n let hopOutputTokenDecimals = hopOutputTokenMeta.decimals;\n\n let expectedHopOutput = getOutputSingleHop(\n hops[i].pool,\n hops[i].inputToken,\n hops[i].outputToken,\n hops[i].allocation\n );\n let decimalEstimate = new Big(expectedHopOutput)\n .div(new Big(10).pow(hopOutputTokenDecimals))\n .toString();\n\n // Need to check if expected Hop Output is > 1. If not, then cull the corresponding pool and re-calculate.\n if (new Big(expectedHopOutput).lt(new Big(1))) {\n // purge the pool and recalculate.\n\n decimalsCulledPoolIds.push(hops[i].pool.id);\n return getSmartRouteSwapActions(\n pools,\n inputToken,\n outputToken,\n totalInput,\n allTokens,\n (maxPathLength = maxPathLength),\n (threshold = threshold),\n (numberOfRoutesLimit = numberOfRoutesLimit),\n (MAX_NUMBER_PARALLEL_POOLS = MAX_NUMBER_PARALLEL_POOLS),\n (decimalsCulledPoolIds = decimalsCulledPoolIds)\n );\n }\n\n if (\n hops[i].inputToken == inputToken &&\n hops[i].outputToken == outputToken\n ) {\n var status = 'parallel swap';\n } else {\n var status = 'stableSmart';\n }\n\n let tokens = await Promise.all(\n hops[i].nodeRoute.map(async t =>\n allTokens[t] ? allTokens[t] : await ftGetTokenMetadata(t, 'smart')\n )\n );\n\n actions[i] = {\n estimate: decimalEstimate,\n pool: {\n fee: hops[i].pool.fee,\n gamma_bps: new Big(10000).minus(new Big(hops[i].pool.fee)), //.div(new Big(10000)), //hops[i].pool.gamma, //new Big(10000).minus(new Big(hops[i].pool.fee)).div(new Big(10000));\n id: hops[i].pool.id,\n partialAmountIn: new Big(hops[i].allocation).round().toString(),\n supplies: {\n [hops[i].pool.token1Id]: hops[i].pool.token1Supply,\n [hops[i].pool.token2Id]: hops[i].pool.token2Supply,\n },\n token0_ref_price: hops[i].pool.token0_price,\n tokenIds: [hops[i].pool.token1Id, hops[i].pool.token2Id],\n Dex: hops[i].pool.Dex,\n },\n status: status,\n token: hopInputTokenMeta,\n outputToken: hops[i].outputToken,\n inputToken: hops[i].inputToken,\n nodeRoute: hops[i].nodeRoute,\n route: hops[i].route,\n allRoutes: hops[i].allRoutes,\n allNodeRoutes: hops[i].allNodeRoutes,\n totalInputAmount: hops[i].totalInputAmount,\n allAllocations: hops[i].allAllocations,\n tokens: tokens,\n routeInputToken: inputToken,\n routeOutputToken: outputToken,\n overallPriceImpact: '0',\n };\n // console.log('INPUT TOKEN IS...');\n // console.log(hops[i].inputToken);\n actions[i].pool.x = actions[i].pool.supplies[hops[i].inputToken];\n actions[i].pool.y = actions[i].pool.supplies[hops[i].outputToken];\n }\n // now set partial amount in for second hops equal to zero:\n // also, set the total price impact value.\n let overallPriceImpact = await calculateSmartRouteV2PriceImpact(\n actions,\n allTokens\n );\n for (var i in actions) {\n let action = actions[i];\n action.overallPriceImpact = overallPriceImpact;\n if (action.outputToken === outputToken && action.inputToken != inputToken) {\n // only want to set second hop partial amount in to zero\n action.pool.partialAmountIn = '0';\n }\n }\n\n return actions;\n}\n\nasync function calculateSmartRouteV2PriceImpact(actions, allTokens) {\n // the goal is to take a weighted average of the price impact per route, treating each one at a time.\n // for single hop (parallel swaps), the price impact is calculated as before.\n // for double-hop, the market price, P, is determined using reserves of tokens in each pool in the route.\n // in both cases, we compare the 'market price', P , determined solely by reserves in pools, and the actual\n // average price, R, expected to be paid in the transaction.\n // the price impact is then defined as (P-R)/R * 100 and is a percentage number, returned as a string.\n\n let deltaY = actions\n .filter(a => a.outputToken == a.routeOutputToken)\n .map(a => new Big(a.estimate))\n .reduce((a, b) => a.plus(b), new Big(0));\n // console.log('DELTA Y IS...');\n // console.log(deltaY.toString());\n\n let inputTokenMeta = actions[0].tokens[0];\n let deltaX = new Big(actions[0].totalInputAmount).div(\n new Big(10).pow(inputTokenMeta.decimals)\n );\n let R = deltaY.div(deltaX);\n var P = new Big(0);\n let routes = actions[0].allRoutes;\n let nodeRoutes = actions[0].allNodeRoutes;\n let allocations = actions[0].allAllocations.map(a => new Big(a));\n let totalAllocations = allocations\n .map(a => new Big(a))\n .reduce((a, b) => a.plus(b), new Big(0));\n\n let weights = allocations.map(a => a.div(totalAllocations));\n\n for (var i in routes) {\n let route = routes[i];\n let nodeRoute = nodeRoutes[i];\n let tokens = await Promise.all(\n nodeRoute.map(async t => {\n return allTokens[t]\n ? allTokens[t]\n : await ftGetTokenMetadata(t, 'sm routes');\n })\n );\n let weight = weights[i];\n if (route.length == 1) {\n let num = new Big(route[0].reserves[nodeRoute[0]]).div(\n new Big(10).pow(tokens[0].decimals)\n );\n let denom = new Big(route[0].reserves[nodeRoute[1]]).div(\n new Big(10).pow(tokens[1].decimals)\n );\n var routeMarketPrice = num.div(denom);\n } else {\n let num1 = new Big(route[0].reserves[nodeRoute[0]]).div(\n new Big(10).pow(tokens[0].decimals)\n );\n\n let denom1 = new Big(route[0].reserves[nodeRoute[1]]).div(\n new Big(10).pow(tokens[1].decimals)\n );\n\n let num2 = new Big(route[1].reserves[nodeRoute[1]]).div(\n new Big(10).pow(tokens[1].decimals)\n );\n\n let denom2 = new Big(route[1].reserves[nodeRoute[2]]).div(\n new Big(10).pow(tokens[2].decimals)\n );\n\n var routeMarketPrice = num1\n .div(denom1)\n .times(num2)\n .div(denom2);\n }\n P = P.plus(weight.times(new Big(1).div(routeMarketPrice)));\n }\n\n let priceImpact = P.minus(R)\n .div(R)\n .times(new Big(100))\n .toString();\n return priceImpact;\n}\n\nfunction decor(arr) {\n var res = [];\n for (var i in arr) {\n res.push([arr[i], i]);\n }\n return res;\n}\nfunction argsort(arr) {\n let undecor = a => a[1]; // leave only index\n let decorated = decor(arr);\n\n return decorated\n .sort((a, b) => new Big(b[0]).minus(new Big(a[0])))\n .map(undecor);\n}\n\nfunction getPoolsByToken1ORToken2(pools, token1, token2) {\n let filteredPools = pools.filter(\n item =>\n item.token1Id === token1 ||\n item.token2Id === token1 ||\n item.token1Id === token2 ||\n item.token2Id === token2\n );\n return filteredPools;\n}\n\nfunction getPoolsByToken1ANDToken2(\n pools,\n token1,\n token2,\n cullZeroLiquidityPools = true\n) {\n let filteredPools = pools.filter(\n item =>\n (item.token1Id === token1 && item.token2Id === token2) ||\n (item.token1Id === token2 && item.token2Id === token1)\n );\n if (cullZeroLiquidityPools) {\n filteredPools = filteredPools.filter(\n item => item.token1Supply != '0' && item.token2Supply != '0'\n );\n }\n return filteredPools;\n}\n\nfunction getLiqudityOfPoolsFromList(pools) {\n let liquidities = [];\n for (var poolInd in pools) {\n let pool = pools[poolInd];\n pool.amounts = [pool.token1Supply, pool.token2Supply];\n let poolBigAmounts = pool.amounts.map(item => new Big(item));\n let liquidity = poolBigAmounts[0].times(poolBigAmounts[1]);\n liquidities.push(liquidity);\n }\n return liquidities;\n}\n\nfunction getNormalizedLiquiditiesFromList(pools) {\n let liquidities = getLiqudityOfPoolsFromList(pools);\n let maxLiq = bigMax(liquidities);\n let normalizedLiquidities = liquidities.map(item => item.div(maxLiq));\n return normalizedLiquidities;\n}\n\nfunction bigMax(arrayOfBigs) {\n if (arrayOfBigs.length < 1) {\n return null;\n }\n let maxElem = arrayOfBigs[0];\n for (var ind in arrayOfBigs) {\n let val = arrayOfBigs[ind];\n if (val.gt(maxElem)) {\n maxElem = val;\n }\n }\n return maxElem;\n}\n\nfunction cullPoolsWithInsufficientLiquidity(pools, threshold = 0.0001) {\n var thresh = new Big(threshold);\n let normLiq = getNormalizedLiquiditiesFromList(pools);\n let filteredPools = [];\n for (var i = 0; i < normLiq.length; i++) {\n if (normLiq[i] > thresh) {\n filteredPools.push(pools[i]);\n }\n }\n return filteredPools;\n}\n\nfunction cartesianProduct(a) {\n let result = a.reduce((a, b) => a.flatMap(d => b.map(e => [d, e].flat())));\n return result;\n}\n\nfunction addEdge(g, edge) {\n let src = edge[0];\n let dst = edge[1];\n if (Object.keys(g).includes(src)) {\n if (!Object.keys(g[src]).includes(dst)) {\n g[src][dst] = 1;\n }\n } else {\n g[src] = {};\n g[src][dst] = 1;\n }\n if (Object.keys(g).includes(dst)) {\n if (!Object.keys(g[dst]).includes(src)) {\n g[dst][src] = 1;\n }\n } else {\n g[dst] = {};\n g[dst][src] = 1;\n }\n}\n\nfunction addEdges(g, edgeList) {\n for (var n in edgeList) {\n let edge = edgeList[n];\n addEdge(g, edge);\n }\n}\n\nfunction deleteEdge(g, edge) {\n let gNew = JSON.parse(JSON.stringify(g)); // using this to deep clone graph structure\n let e1 = edge[0];\n let e2 = edge[1];\n if (Object.keys(gNew).includes(e1)) {\n if (Object.keys(gNew[e1]).includes(e2)) {\n delete gNew[e1][e2];\n }\n }\n if (Object.keys(gNew).includes(e2)) {\n if (Object.keys(gNew[e2]).includes(e1)) {\n delete gNew[e2][e1];\n }\n }\n return gNew;\n}\n\nfunction deleteNode(g, node) {\n let gNew = JSON.parse(JSON.stringify(g)); // using this to deep clone graph structure\n if (Object.keys(gNew).includes(node)) {\n delete gNew[node];\n }\n let keys = Object.keys(gNew);\n for (var nodeInd in keys) {\n let nodeNow = keys[nodeInd];\n if (Object.keys(gNew[nodeNow]).includes(node)) {\n delete gNew[nodeNow][node];\n }\n }\n return gNew;\n}\n\nfunction dijkstra(graph, s) {\n var solutions = {};\n solutions[s] = {};\n solutions[s].path = [];\n solutions[s].dist = 0;\n\n while (true) {\n var parent = null;\n var nearest = null;\n var dist = Infinity;\n\n //for each existing solution\n for (var n in solutions) {\n if (!solutions[n]) {\n solutions[n] = {};\n }\n if (!solutions[n].path) continue;\n var ndist = solutions[n].dist;\n var adj = graph[n];\n //for each of its adjacent nodes...\n for (var a in adj) {\n //without a solution already...\n if (!solutions[a]) {\n solutions[a] = {};\n }\n if (solutions[a].path) continue;\n //choose nearest node with lowest *total* cost\n var d = adj[a] + ndist;\n if (d < dist) {\n //reference parent\n parent = solutions[n].path;\n nearest = a;\n dist = d;\n }\n }\n }\n\n //no more solutions\n if (dist === Infinity) {\n break;\n }\n\n //extend parent's solution path\n solutions[nearest].path = parent.concat(nearest);\n //extend parent's cost\n solutions[nearest].dist = dist;\n }\n\n return solutions;\n}\n\nfunction shortestPath(g, src, dst, ignore_nodes = [], ignore_edges = []) {\n let gTemp = JSON.parse(JSON.stringify(g)); // using this to deep clone graph structure. If we can use lodash, could use _.cloneDeep(obj)\n // remove nodes\n for (var nodeInd in ignore_nodes) {\n let nodeNow = ignore_nodes[nodeInd];\n gTemp = deleteNode(gTemp, nodeNow);\n }\n // remove edges\n for (var edgeInd in ignore_edges) {\n let edgeNow = ignore_edges[edgeInd];\n gTemp = deleteEdge(gTemp, edgeNow);\n }\n let solution = dijkstra(gTemp, src)[dst];\n solution.path.unshift(src); // original algorithm doesn't include source node in path\n return solution;\n}\n\nfunction* count(firstval = 0, step = 1) {\n let x = firstval;\n while (true) {\n yield x;\n x = x + 1;\n }\n}\n\nclass PathBuffer {\n constructor() {\n this.paths = [];\n this.sortedpaths = [];\n //this.counter = count();\n }\n len() {\n return this.sortedpaths.length;\n }\n\n push(cost, path) {\n if (path && !arrayContains(this.paths, path)) {\n this.sortedpaths.push([cost, path]);\n this.sortedpaths.sort(function(a, b) {\n return a[0] - b[0];\n });\n //heappush(this.sortedpaths, (cost, this.counter.next().value,path));\n this.paths.push(path);\n }\n }\n\n pop() {\n //let val = heappop(this.sortedpaths);\n let val = this.sortedpaths.shift();\n let cost = val[0];\n let path = val[1];\n this.paths.splice(this.paths.indexOf(path), 1);\n return path;\n }\n}\n\nfunction arrayEquals(a, b) {\n return (\n Array.isArray(a) &&\n Array.isArray(b) &&\n a.length === b.length &&\n a.every((val, index) => val === b[index])\n );\n}\n\nfunction arrayContains(arr, obj) {\n // checks to see if the input array contains a reference object, obj, using\n // JSON.stringify() .\n let obj_json = JSON.stringify(obj);\n for (var itemInd in arr) {\n if (JSON.stringify(arr[itemInd]) == obj_json) {\n return true;\n }\n }\n return false;\n}\n\nfunction* yenFromPy(g, source, target) {\n //adapted from the python implementation in networkx.algorithms.simple_paths.shortest_simple_paths()\n let listA = [];\n let listB = new PathBuffer();\n let prev_path = null;\n\n while (true) {\n if (!prev_path) {\n let sol = shortestPath(g, source, target);\n let length = sol.dist;\n let path = sol.path;\n listB.push(length, path);\n } else {\n let ignore_nodes = [];\n let ignore_edges = [];\n for (var i = 1; i < prev_path.length; i++) {\n let root = prev_path.slice(0, i);\n let root_length = root.length;\n for (var pathInd in listA) {\n let path = listA[pathInd];\n\n if (arrayEquals(path.slice(0, i), root)) {\n let edgeToIgnore = [path[i - 1], path[i]];\n ignore_edges.push(edgeToIgnore);\n }\n }\n try {\n let sol = shortestPath(\n g,\n root[root.length - 1],\n target,\n (ignore_nodes = ignore_nodes),\n (ignore_edges = ignore_edges)\n );\n let length = sol.dist;\n let spur = sol.path;\n let path = root.slice(0, root.length - 1).concat(spur);\n listB.push(root_length + length, path);\n } catch (e) {\n //console.log(`yenFromPy error was... ${e}`)\n //dont do anything.\n }\n ignore_nodes.push(root[root.length - 1]);\n }\n }\n if (listB.sortedpaths) {\n try {\n let path = listB.pop();\n yield path;\n listA.push(path);\n prev_path = path;\n } catch (e) {\n break;\n }\n } else {\n break;\n }\n }\n}\n\nfunction getKShortestPaths(g, source, target, k, maxPathLength = 3) {\n let paths = [];\n if (maxPathLength < 2) {\n var maxPathLength = 2;\n }\n let gen = yenFromPy(g, source, target);\n for (var n = 1; n <= k; n++) {\n try {\n let res = gen.next().value;\n if (res && !arrayContains(paths, res)) {\n if (res.length > maxPathLength) {\n // console.log(\n // `found all hops of length ${\n // maxPathLength - 1\n // } or less... breaking out of generator`\n // );\n break;\n }\n paths.push(res);\n }\n } catch (e) {\n break;\n }\n }\n return paths;\n}\n\nasync function getPathsFromPools(\n pools,\n inputToken,\n outputToken,\n maxPathLength = 3\n) {\n let graph = getGraphFromPoolList(pools);\n return getKShortestPaths(graph, inputToken, outputToken, 100, maxPathLength);\n}\n\nasync function getAllPathsBelowLengthN(g, source, target, N, limit = 100) {\n // use Yen's algorithm to find the paths of length N or below between source and target nodes in graph g.\n\n let paths = [];\n\n let gen = await yenFromPy(g, source, target);\n let currentPathLength = 0;\n let count = 1;\n while (currentPathLength <= N) {\n // console.log(`CURRENT PATH LENGTH IS ${currentPathLength}`)\n try {\n let res = await gen.next().value;\n // console.log(`RES IS ${res}`)\n if (res && !arrayContains(paths, res)) {\n if (res.length > currentPathLength) {\n currentPathLength = res.length;\n if (currentPathLength > N) {\n break;\n }\n }\n paths.push(res);\n }\n count = count + 1;\n if (count > limit) {\n break;\n }\n } catch (e) {\n // console.log(e)\n break;\n }\n }\n return paths;\n}\n\nfunction getGraphFromPoolList(poolList) {\n let pools = poolList.filter(\n item => item.token1Supply != '0' && item.token2Supply != '0'\n );\n let transitions = pools.map(item => [item.token1Id, item.token2Id]);\n let g = {};\n addEdges(g, transitions);\n return g;\n}\n\n////////////////////////////////////\n\n// MAIN FUNCTION\n\n////////////////////////////////////\n\n// TODO -- incorporate the following integrated function, which tries to\n// account for stablecoins within the context of smart routing.\n\n//TODO -- need the right API / hooks for GETSTABLESWAPACTION function and GETPARALLELSWAPACTIONS functions.\n\n//TODO -- transform the actions generated in this function into tranaction to execute.\n\n//TRYING: GETSTABLESWAPACTION <==> instantSwapGetTransactions\n\nexport async function stableSmart(\n pools,\n inputToken,\n outputToken,\n totalInput,\n allTokens\n) {\n let smartRouteActions = await getSmartRouteSwapActions(\n pools,\n inputToken,\n outputToken,\n totalInput,\n allTokens\n );\n return smartRouteActions;\n}\n\nexport function getExpectedOutputFromActionsORIG(actions, outputToken) {\n return actions\n .filter(item => item.outputToken === outputToken)\n .map(item => new Big(item.estimate))\n .reduce((a, b) => a.plus(b), new Big(0));\n}\n\nfunction getFeeForRoute(route) {\n if (!route.length) {\n route = [route];\n }\n if (route.length == 1) {\n // Single Hop case\n let p = route[0];\n return p.fee;\n } else if (route.length == 2) {\n //Double Hop Case\n let p1 = route[0];\n let p2 = route[1];\n let fee1 = p1.fee;\n let fee2 = p2.fee;\n return fee1 + fee2;\n }\n}\n\nexport function getAverageFeeForRoutes(routes, nodeRoutes, totalInput) {\n let normalizedAllocations = getOptimalAllocationForRoutes(\n routes,\n nodeRoutes,\n totalInput\n ).map(a => a.div(new Big(totalInput)));\n let averageFee = 0;\n for (var i in routes) {\n averageFee += normalizedAllocations[i] * getFeeForRoute(routes[i]);\n }\n return averageFee;\n}\n","import { TokenMetadata, Pool, StablePool, EstimateSwapView } from '../types';\nimport {\n toReadableNumber,\n toNonDivisibleNumber,\n scientificNotationToString,\n} from '../utils';\nimport Big from 'big.js';\nimport { SameInputTokenError, ZeroInputError, NoPoolError } from '../error';\nimport { ONLY_ZEROS, toPrecision } from '../utils';\nimport _ from 'lodash';\nimport { FEE_DIVISOR } from '../constant';\nimport { getSwappedAmount } from '../stable-swap';\nimport { ftGetTokenMetadata, ftGetTokensMetadata } from '../ref';\nimport { isStablePool } from '../utils';\nimport { getTokensTiny } from '../indexer';\nimport {\n getStablePoolDecimal,\n isStablePoolToken,\n poolFormatter,\n} from '../utils';\nimport {\n stableSmart,\n getExpectedOutputFromActionsORIG,\n //@ts-ignore\n} from './smartRoutingLogic.js';\n\nexport enum PoolMode {\n PARALLEL = 'parallel swap',\n SMART = 'smart routing',\n SMART_V2 = 'stableSmart',\n STABLE = 'stable swap',\n}\n\nexport interface SwapParams {\n tokenIn: TokenMetadata;\n tokenOut: TokenMetadata;\n amountIn: string;\n simplePools: Pool[];\n options?: SwapOptions;\n}\n\nexport interface SwapOptions {\n enableSmartRouting?: boolean;\n stablePools?: Pool[];\n stablePoolsDetail?: StablePool[];\n}\n\nexport const getSimplePoolEstimate = ({\n tokenIn,\n tokenOut,\n pool,\n amountIn,\n}: {\n tokenIn: TokenMetadata;\n tokenOut: TokenMetadata;\n pool: Pool;\n amountIn: string;\n}) => {\n const amount_with_fee = Number(amountIn) * (FEE_DIVISOR - pool.fee);\n const in_balance = toReadableNumber(\n tokenIn.decimals,\n pool.supplies[tokenIn.id]\n );\n const out_balance = toReadableNumber(\n tokenOut.decimals,\n pool.supplies[tokenOut.id]\n );\n const estimate = new Big(\n (\n (amount_with_fee * Number(out_balance)) /\n (FEE_DIVISOR * Number(in_balance) + amount_with_fee)\n ).toString()\n ).toFixed();\n\n return {\n estimate,\n pool,\n outputToken: tokenOut.id,\n inputToken: tokenIn.id,\n };\n};\n\nexport const getStablePoolEstimate = ({\n tokenIn,\n tokenOut,\n amountIn,\n stablePool,\n pool,\n}: {\n tokenIn: TokenMetadata;\n tokenOut: TokenMetadata;\n amountIn: string;\n stablePool: StablePool;\n pool?: Pool;\n}) => {\n const STABLE_LP_TOKEN_DECIMALS = getStablePoolDecimal(stablePool);\n\n const [amount_swapped, _, dy] = getSwappedAmount(\n tokenIn.id,\n tokenOut.id,\n amountIn,\n stablePool,\n STABLE_LP_TOKEN_DECIMALS\n );\n\n const amountOut =\n amount_swapped < 0 || isNaN(amount_swapped)\n ? '0'\n : toPrecision(scientificNotationToString(amount_swapped.toString()), 0);\n\n const dyOut =\n amount_swapped < 0 || isNaN(amount_swapped) || isNaN(dy)\n ? '0'\n : toPrecision(scientificNotationToString(dy.toString()), 0);\n\n const rates = stablePool.rates.reduce((acc, cur, i) => {\n return {\n ...acc,\n [stablePool.token_account_ids[i]]: cur,\n };\n }, {});\n\n return {\n estimate: toReadableNumber(STABLE_LP_TOKEN_DECIMALS, amountOut),\n noFeeAmountOut: toReadableNumber(STABLE_LP_TOKEN_DECIMALS, dyOut),\n pool: {\n ...stablePool,\n rates,\n },\n outputToken: tokenOut.id,\n inputToken: tokenIn.id,\n };\n};\n\n/**\n * @description Get the estimate of the amount of tokenOut that can be received\n *\n */\nexport const singlePoolSwap = ({\n tokenIn,\n tokenOut,\n simplePools,\n amountIn,\n stablePools,\n}: {\n tokenIn: TokenMetadata;\n tokenOut: TokenMetadata;\n simplePools: Pool[];\n amountIn: string;\n stablePools?: StablePool[];\n}) => {\n if (!simplePools || simplePools.length === 0) {\n throw NoPoolError;\n }\n\n const parsedAmountIn = toNonDivisibleNumber(tokenIn.decimals, amountIn);\n\n // const pools = simplePools.concat(stablePools);\n\n const simplePoolsThisPair = simplePools.filter(\n p =>\n p.tokenIds.includes(tokenIn.id) &&\n p.tokenIds.includes(tokenOut.id) &&\n (!stablePools || !isStablePool(stablePools, p.id))\n );\n\n const estimatesSimplePool = simplePoolsThisPair.map(pool =>\n getSimplePoolEstimate({\n tokenIn,\n tokenOut,\n pool,\n amountIn,\n })\n );\n\n const stablePoolThisPair = stablePools?.filter(\n sp =>\n sp.token_account_ids.includes(tokenIn.id) &&\n sp.token_account_ids.includes(tokenOut.id)\n );\n\n // different stable lp token decimal for different type of pools\n const estimatesStablePool = stablePoolThisPair?.map(stablePool => {\n return getStablePoolEstimate({\n tokenIn,\n tokenOut,\n amountIn,\n stablePool,\n pool: simplePools.find(p => p.id === stablePool.id) as Pool,\n });\n });\n\n const maxSimplePoolEstimate =\n estimatesSimplePool === undefined || estimatesSimplePool.length === 0\n ? undefined\n : estimatesSimplePool.length === 1\n ? estimatesSimplePool[0]\n : _.maxBy(estimatesSimplePool, estimate => Number(estimate.estimate));\n\n const maxStablePoolEstimate =\n estimatesStablePool === undefined || estimatesStablePool.length === 0\n ? undefined\n : estimatesStablePool.length === 1\n ? estimatesStablePool[0]\n : _.maxBy(estimatesStablePool, estimate => Number(estimate.estimate));\n\n if (!maxStablePoolEstimate && !maxSimplePoolEstimate) throw NoPoolError;\n\n maxSimplePoolEstimate &&\n (maxSimplePoolEstimate.pool.partialAmountIn = parsedAmountIn);\n\n maxStablePoolEstimate &&\n (maxStablePoolEstimate.pool.partialAmountIn = parsedAmountIn);\n\n if (!maxStablePoolEstimate) {\n maxSimplePoolEstimate &&\n (maxSimplePoolEstimate.pool.partialAmountIn = parsedAmountIn);\n\n return maxSimplePoolEstimate;\n } else if (!maxSimplePoolEstimate) {\n return maxStablePoolEstimate;\n } else {\n return Number(maxSimplePoolEstimate?.estimate) >\n Number(maxStablePoolEstimate?.estimate)\n ? maxSimplePoolEstimate\n : maxStablePoolEstimate;\n }\n};\n\nexport const getStablePoolsThisPair = ({\n tokenInId,\n tokenOutId,\n stablePools,\n}: {\n tokenInId: string;\n tokenOutId: string;\n stablePools: Pool[];\n}) => {\n return stablePools.filter(\n p =>\n p.tokenIds.includes(tokenInId) &&\n p.tokenIds.includes(tokenOutId) &&\n tokenInId !== tokenOutId\n );\n};\n\nexport const getPoolsByTokens = ({\n pools,\n tokenInId,\n tokenOutId,\n}: {\n pools: Pool[];\n tokenInId: string;\n tokenOutId: string;\n}) => {\n if (tokenInId === tokenOutId) return [];\n\n return pools.filter(\n p => p.tokenIds.includes(tokenInId) && p.tokenIds.includes(tokenOutId)\n );\n};\n\nexport const getPoolEstimate = async ({\n tokenIn,\n tokenOut,\n amountIn,\n stablePoolDetail,\n pool,\n}: {\n tokenIn: TokenMetadata;\n tokenOut: TokenMetadata;\n amountIn: string;\n pool: Pool;\n stablePoolDetail?: StablePool;\n}) => {\n if (!!stablePoolDetail) {\n return getStablePoolEstimate({\n tokenIn,\n tokenOut,\n stablePool: stablePoolDetail,\n amountIn,\n pool,\n });\n } else {\n return getSimplePoolEstimate({\n tokenIn,\n tokenOut,\n pool,\n amountIn,\n });\n }\n};\n\nexport async function getHybridStableSmart(\n tokenIn: TokenMetadata,\n tokenOut: TokenMetadata,\n amountIn: string,\n stablePools: Pool[],\n stablePoolsDetail: StablePool[],\n simplePools: Pool[],\n allTokens: Record<string, TokenMetadata>\n) {\n if (\n !isStablePoolToken(stablePoolsDetail, tokenIn.id) &&\n !isStablePoolToken(stablePoolsDetail, tokenOut.id)\n ) {\n return { actions: [], estimate: '0' };\n }\n\n const stablePoolsDetailById = stablePoolsDetail.reduce((acc, cur) => {\n return {\n ...acc,\n [cur.id]: cur,\n };\n }, {} as Record<string, StablePool>);\n\n const parsedAmountIn = toNonDivisibleNumber(tokenIn.decimals, amountIn);\n\n let pool1: Pool, pool2: Pool;\n\n let pools1: Pool[] = [];\n let pools2: Pool[] = [];\n\n let pools1Right: Pool[] = [];\n let pools2Right: Pool[] = [];\n\n let candidatePools: Pool[][] = [];\n\n /**\n * find possible routes for this pair\n *\n *\n */\n\n if (isStablePoolToken(stablePoolsDetail, tokenIn.id)) {\n // first hop will be through stable pool.\n pools1 = stablePools.filter(pool => pool.tokenIds.includes(tokenIn.id));\n\n const otherStables = pools1\n .map(pool => pool.tokenIds.filter(id => id !== tokenIn.id))\n .flat();\n\n for (var otherStable of otherStables) {\n let stablePoolsThisPair = getStablePoolsThisPair({\n tokenInId: otherStable,\n tokenOutId: tokenOut.id,\n stablePools,\n });\n\n let tmpPools = getPoolsByTokens({\n tokenInId: otherStable,\n tokenOutId: tokenOut.id,\n pools: simplePools,\n });\n const tobeAddedPools = tmpPools.concat(stablePoolsThisPair);\n pools2.push(\n ...tobeAddedPools.filter(p => {\n const supplies = Object.values(p.supplies);\n return new Big(supplies[0]).times(new Big(supplies[1])).gt(0);\n })\n );\n }\n }\n\n if (isStablePoolToken(stablePoolsDetail, tokenOut.id)) {\n // second hop will be through stable pool.\n pools2Right = stablePools.filter(pool =>\n pool.tokenIds.includes(tokenOut.id)\n );\n\n const otherStables = pools2Right\n .map(pool => pool.tokenIds.filter(id => id !== tokenOut.id))\n .flat();\n for (let otherStable of otherStables) {\n let stablePoolsThisPair = getStablePoolsThisPair({\n tokenInId: tokenIn.id,\n tokenOutId: otherStable,\n stablePools,\n });\n\n let tmpPools = getPoolsByTokens({\n tokenInId: tokenIn.id,\n tokenOutId: otherStable,\n pools: simplePools,\n });\n\n const tobeAddedPools = tmpPools.concat(stablePoolsThisPair);\n\n pools1Right.push(\n ...tobeAddedPools.filter(p => {\n const supplies = Object.values(p.supplies);\n return new Big(supplies[0]).times(new Big(supplies[1])).gt(0);\n })\n );\n }\n }\n\n // find candidate pools\n\n for (let p1 of pools1) {\n let middleTokens = p1.tokenIds.filter((id: string) => id !== tokenIn.id);\n for (let middleToken of middleTokens) {\n let p2s = pools2.filter(\n p =>\n p.tokenIds.includes(middleToken) &&\n p.tokenIds.includes(tokenOut.id) &&\n middleToken !== tokenOut.id\n );\n let p2 = _.maxBy(p2s, p =>\n Number(\n new Big(toReadableNumber(tokenOut.decimals, p.supplies[tokenOut.id]))\n )\n );\n\n if (middleToken === tokenOut.id) {\n p2 = p1;\n }\n\n if (p1 && p2) {\n if (p1.id === p2.id) candidatePools.push([p1]);\n else candidatePools.push([p1, p2]);\n }\n }\n }\n for (let p1 of pools1Right) {\n let middleTokens = p1.tokenIds.filter((id: string) => id !== tokenIn.id);\n for (let middleToken of middleTokens) {\n let p2s = pools2Right.filter(\n p =>\n p.tokenIds.includes(middleToken) &&\n p.tokenIds.includes(tokenOut.id) &&\n middleToken !== tokenOut.id\n );\n let p2 = _.maxBy(p2s, p =>\n Number(\n new Big(toReadableNumber(tokenOut.decimals, p.supplies[tokenOut.id]))\n )\n );\n\n if (middleToken === tokenOut.id) {\n p2 = p1;\n }\n\n if (p1 && p2) {\n if (p1.id === p2.id) candidatePools.push([p1]);\n else candidatePools.push([p1, p2]);\n }\n }\n }\n\n if (candidatePools.length > 0) {\n const tokensMedata = await ftGetTokensMetadata(\n candidatePools.map(cp => cp.map(p => p.tokenIds).flat()).flat(),\n allTokens\n );\n\n const BestPoolPair =\n candidatePools.length === 1\n ? candidatePools[0]\n : _.maxBy(candidatePools, poolPair => {\n // only one pool case, only for stable tokens\n if (poolPair.length === 1) {\n if (isStablePool(stablePoolsDetail, poolPair[0].id)) {\n const stablePoolThisPair = getStablePoolsThisPair({\n tokenInId: tokenIn.id,\n tokenOutId: tokenOut.id,\n stablePools,\n })[0];\n\n const stablePoolDetailThisPair = stablePoolsDetail.find(\n spd => spd.id === stablePoolThisPair.id\n );\n\n return Number(\n getStablePoolEstimate({\n tokenIn,\n tokenOut,\n stablePool: stablePoolDetailThisPair as StablePool,\n amountIn,\n pool: poolPair[0],\n }).estimate\n );\n } else {\n return Number(\n getSimplePoolEstimate({\n tokenIn,\n tokenOut,\n amountIn,\n pool: poolPair[0],\n }).estimate\n );\n }\n }\n\n const [tmpPool1, tmpPool2] = poolPair;\n const tokenMidId = poolPair[0].tokenIds.find((t: string) =>\n poolPair[1].tokenIds.includes(t)\n ) as string;\n\n const tokenMidMeta = tokensMedata[tokenMidId];\n\n const estimate1 = {\n ...(isStablePool(stablePoolsDetail, tmpPool1.id)\n ? getStablePoolEstimate({\n tokenIn,\n tokenOut: tokenMidMeta,\n amountIn,\n stablePool: stablePoolsDetailById[tmpPool1.id],\n pool: tmpPool1,\n })\n : getSimplePoolEstimate({\n tokenIn,\n tokenOut: tokenMidMeta,\n amountIn,\n pool: tmpPool1,\n })),\n status: PoolMode.SMART,\n };\n\n const estimate2 = {\n ...(isStablePool(stablePoolsDetail, tmpPool2.id)\n ? getStablePoolEstimate({\n tokenIn: tokenMidMeta,\n tokenOut,\n amountIn: estimate1.estimate,\n stablePool: stablePoolsDetailById[tmpPool2.id],\n pool: tmpPool2,\n })\n : getSimplePoolEstimate({\n tokenIn: tokenMidMeta,\n tokenOut,\n pool: tmpPool2,\n amountIn: estimate1.estimate,\n })),\n status: PoolMode.SMART,\n };\n\n return Number(estimate2.estimate);\n });\n\n // one pool case only get best price\n\n if (!BestPoolPair) return { actions: [], estimate: '0' };\n\n if (BestPoolPair.length === 1) {\n const bestPool = BestPoolPair[0];\n const estimate = await getPoolEstimate({\n tokenIn,\n tokenOut,\n amountIn,\n pool: bestPool,\n stablePoolDetail: stablePoolsDetailById[bestPool.id],\n });\n\n return {\n actions: [\n {\n ...estimate,\n status: PoolMode.STABLE,\n\n pool: { ...estimate.pool, partialAmountIn: parsedAmountIn },\n tokens: [tokenIn, tokenOut],\n inputToken: tokenIn.id,\n outputToken: tokenOut.id,\n totalInputAmount: toNonDivisibleNumber(tokenIn.decimals, amountIn),\n },\n ],\n estimate: estimate.estimate,\n };\n }\n\n // two pool case get best price\n [pool1, pool2] = BestPoolPair;\n\n const tokenMidId = BestPoolPair[0].tokenIds.find((t: string) =>\n BestPoolPair[1].tokenIds.includes(t)\n ) as string;\n\n const tokenMidMeta =\n allTokens[tokenMidId] ||\n (await ftGetTokenMetadata(tokenMidId, 'hybridSmartRoutingEstimate'));\n\n const estimate1 = {\n ...(isStablePool(stablePoolsDetail, pool1.id)\n ? getStablePoolEstimate({\n tokenIn,\n tokenOut: tokenMidMeta,\n amountIn,\n stablePool: stablePoolsDetailById[pool1.id],\n pool: pool1,\n })\n : getSimplePoolEstimate({\n tokenIn,\n tokenOut: tokenMidMeta,\n amountIn,\n pool: pool1,\n })),\n tokens: [tokenIn, tokenMidMeta, tokenOut],\n inputToken: tokenIn.id,\n outputToken: tokenMidMeta.id,\n status: PoolMode.SMART,\n };\n\n estimate1.pool = {\n ...estimate1.pool,\n partialAmountIn: parsedAmountIn,\n };\n\n const estimate2 = {\n ...(isStablePool(stablePoolsDetail, pool2.id)\n ? getStablePoolEstimate({\n tokenIn: tokenMidMeta,\n tokenOut,\n amountIn: estimate1.estimate,\n stablePool: stablePoolsDetailById[pool2.id],\n pool: pool2,\n })\n : getSimplePoolEstimate({\n tokenIn: tokenMidMeta,\n tokenOut,\n amountIn: estimate1.estimate,\n pool: pool2,\n })),\n\n tokens: [tokenIn, tokenMidMeta, tokenOut],\n inputToken: tokenMidMeta.id,\n outputToken: tokenOut.id,\n status: PoolMode.SMART,\n };\n\n return { actions: [estimate1, estimate2], estimate: estimate2.estimate };\n }\n\n return { actions: [], estimate: '0' };\n}\n\n// simple pools and stable pools for this pair\nexport const estimateSwap = async ({\n tokenIn,\n tokenOut,\n amountIn,\n simplePools,\n options,\n}: SwapParams) => {\n if (tokenIn.id === tokenOut.id) throw SameInputTokenError;\n\n if (ONLY_ZEROS.test(amountIn)) throw ZeroInputError;\n\n const { enableSmartRouting, stablePools, stablePoolsDetail } = options || {};\n\n const parsedAmountIn = toNonDivisibleNumber(tokenIn.decimals, amountIn);\n\n let singleRouteEstimate: EstimateSwapView[] = [];\n\n try {\n const estimate = singlePoolSwap({\n tokenIn,\n tokenOut,\n simplePools,\n amountIn,\n stablePools: stablePoolsDetail,\n });\n\n singleRouteEstimate = [\n {\n ...estimate,\n status: PoolMode.PARALLEL,\n pool: { ...estimate?.pool, partialAmountIn: parsedAmountIn },\n totalInputAmount: toNonDivisibleNumber(tokenIn.decimals, amountIn),\n tokens: [tokenIn, tokenOut],\n },\n ] as EstimateSwapView[];\n if (!enableSmartRouting) {\n return singleRouteEstimate;\n }\n } catch (error) {\n if (!enableSmartRouting) throw error;\n }\n\n const inputPools = simplePools.map(p => poolFormatter(p));\n\n const allTokens = (await getTokensTiny()) as Record<string, TokenMetadata>;\n\n const simplePoolSmartRoutingActions = await stableSmart(\n inputPools,\n tokenIn.id,\n tokenOut.id,\n parsedAmountIn,\n allTokens\n );\n\n const simplePoolSmartRoutingEstimate = getExpectedOutputFromActionsORIG(\n simplePoolSmartRoutingActions,\n tokenOut.id\n ).toString();\n\n const hybridSmartRoutingRes = await getHybridStableSmart(\n tokenIn,\n tokenOut,\n amountIn,\n stablePools || [],\n stablePoolsDetail || [],\n simplePools,\n allTokens\n );\n\n const hybridSmartRoutingEstimate = hybridSmartRoutingRes.estimate.toString();\n\n if (\n new Big(simplePoolSmartRoutingEstimate || '0').gte(\n hybridSmartRoutingEstimate || '0'\n )\n ) {\n if (!simplePoolSmartRoutingActions?.length) throw NoPoolError;\n\n if (\n typeof singleRouteEstimate !== 'undefined' &&\n singleRouteEstimate &&\n singleRouteEstimate?.[0]?.estimate &&\n new Big(singleRouteEstimate[0].estimate || '0').gt(\n simplePoolSmartRoutingEstimate || '0'\n )\n ) {\n return singleRouteEstimate;\n }\n return simplePoolSmartRoutingActions as EstimateSwapView[];\n } else {\n if (\n typeof singleRouteEstimate !== 'undefined' &&\n singleRouteEstimate &&\n singleRouteEstimate?.[0]?.estimate &&\n new Big(singleRouteEstimate[0].estimate || '0').gt(\n hybridSmartRoutingEstimate || '0'\n )\n ) {\n return singleRouteEstimate;\n }\n\n return hybridSmartRoutingRes.actions as EstimateSwapView[];\n }\n};\n","import {\n Pool,\n PoolRPCView,\n StablePool,\n SmartRoutingInputPool,\n Transaction,\n EstimateSwapView,\n} from './types';\nimport {\n FEE_DIVISOR,\n RATED_POOL_LP_TOKEN_DECIMALS,\n STABLE_LP_TOKEN_DECIMALS,\n} from './constant';\n\nimport {\n transactions,\n utils,\n transactions as nearTransactions,\n} from 'near-api-js';\n\nimport _, { sortBy } from 'lodash';\n\nimport BN from 'bn.js';\n\nimport * as math from 'mathjs';\nimport {\n REF_FI_CONTRACT_ID,\n WRAP_NEAR_CONTRACT_ID,\n STORAGE_TO_REGISTER_WITH_MFT,\n} from './constant';\nimport Big from 'big.js';\nimport { SignAndSendTransactionsParams } from '@near-wallet-selector/core/lib/wallet';\nimport { TokenMetadata } from './types';\nimport { PoolMode } from './v1-swap/swap';\nimport { getSwappedAmount } from './stable-swap';\nimport { NoFeeToPool } from './error';\nimport { CONSTANT_D, POINTLEFTRANGE, POINTRIGHTRANGE } from './constant';\nimport { DCL_POOL_FEE_LIST } from './dcl-swap/dcl-pool';\n\nexport const parsePool = (pool: PoolRPCView, id?: number): Pool => ({\n id: Number(typeof id === 'number' ? id : pool.id),\n tokenIds: pool.token_account_ids,\n supplies: pool.amounts.reduce(\n (acc: { [tokenId: string]: string }, amount: string, i: number) => {\n acc[pool.token_account_ids[i]] = amount;\n return acc;\n },\n {}\n ),\n fee: pool.total_fee,\n shareSupply: pool.shares_total_supply,\n tvl: pool.tvl,\n token0_ref_price: pool.token0_ref_price,\n pool_kind: pool.pool_kind,\n});\n\nexport const poolFormatter = (pool: Pool) => {\n return {\n id: pool.id,\n token1Id: pool.tokenIds[0],\n token2Id: pool.tokenIds[1],\n token1Supply: pool.supplies[pool.tokenIds[0]],\n token2Supply: pool.supplies[pool.tokenIds[1]],\n fee: pool.fee,\n shares: pool.shareSupply,\n token0_price: pool.token0_ref_price || '0',\n } as SmartRoutingInputPool;\n};\n\nexport const isStablePoolToken = (\n stablePools: StablePool[],\n tokenId: string | Number\n) => {\n return stablePools\n .map(p => p.token_account_ids)\n .flat()\n .includes(tokenId.toString());\n};\n\nexport const isStablePool = (\n stablePools: StablePool[],\n poolId: string | number\n) => {\n return stablePools.map(p => p.id.toString()).includes(poolId.toString());\n};\n\nexport const getStablePoolDecimal = (stablePool: StablePool) => {\n return stablePool.pool_kind === 'RATED_SWAP'\n ? RATED_POOL_LP_TOKEN_DECIMALS\n : STABLE_LP_TOKEN_DECIMALS;\n};\n\nexport const round = (decimals: number, minAmountOut: string) => {\n return Number.isInteger(Number(minAmountOut))\n ? minAmountOut\n : Math.ceil(\n Math.round(Number(minAmountOut) * Math.pow(10, decimals)) /\n Math.pow(10, decimals)\n ).toString();\n};\n\nexport const convertToPercentDecimal = (percent: number) => {\n return math.divide(percent, 100);\n};\n\nexport const percentOf = (percent: number, num: number | string) => {\n return math.evaluate(`${convertToPercentDecimal(percent)} * ${num}`);\n};\n\nexport const percentLess = (percent: number, num: number | string) => {\n return math.format(math.evaluate(`${num} - ${percentOf(percent, num)}`), {\n notation: 'fixed',\n });\n};\n\nexport const getGas = (gas: string | undefined) =>\n gas ? new BN(gas) : new BN('100000000000000');\n\nexport const getAmount = (amount: string) =>\n amount ? new BN(utils.format.parseNearAmount(amount) || '0') : new BN('0');\n\nexport const ONLY_ZEROS = /^0*\\.?0*$/;\n\nexport const toReadableNumber = (\n decimals: number,\n number: string = '0'\n): string => {\n if (!decimals) return number;\n\n const wholeStr = number.substring(0, number.length - decimals) || '0';\n const fractionStr = number\n .substring(number.length - decimals)\n .padStart(decimals, '0')\n .substring(0, decimals);\n\n return `${wholeStr}.${fractionStr}`.replace(/\\.?0+$/, '');\n};\n\nexport const toNonDivisibleNumber = (\n decimals: number,\n number: string\n): string => {\n if (decimals === null || decimals === undefined) return number;\n const [wholePart, fracPart = ''] = number.split('.');\n\n return `${wholePart}${fracPart.padEnd(decimals, '0').slice(0, decimals)}`\n .replace(/^0+/, '')\n .padStart(1, '0');\n};\n\nexport const scientificNotationToString = (strParam: string) => {\n let flag = /e/.test(strParam);\n if (!flag || !strParam) return strParam;\n\n let sysbol = true;\n if (/e-/.test(strParam)) {\n sysbol = false;\n }\n\n const negative = Number(strParam) < 0 ? '-' : '';\n\n let index = Number(strParam.match(/\\d+$/)?.[0]);\n\n let basis = strParam.match(/[\\d\\.]+/)?.[0];\n\n if (!index || !basis) return strParam;\n\n const ifFraction = basis.includes('.');\n\n let wholeStr;\n let fractionStr;\n\n if (ifFraction) {\n wholeStr = basis.split('.')[0];\n fractionStr = basis.split('.')[1];\n } else {\n wholeStr = basis;\n fractionStr = '';\n }\n\n if (sysbol) {\n if (!ifFraction) {\n return negative + wholeStr.padEnd(index + wholeStr.length, '0');\n } else {\n if (fractionStr.length <= index) {\n return negative + wholeStr + fractionStr.padEnd(index, '0');\n } else {\n return (\n negative +\n wholeStr +\n fractionStr.substring(0, index) +\n '.' +\n fractionStr.substring(index)\n );\n }\n }\n } else {\n if (!ifFraction)\n return (\n negative +\n wholeStr.padStart(index + wholeStr.length, '0').replace(/^0/, '0.')\n );\n else {\n return (\n negative +\n wholeStr.padStart(index + wholeStr.length, '0').replace(/^0/, '0.') +\n fractionStr\n );\n }\n }\n};\n\nexport const formatWithCommas = (value: string) => {\n const pattern = /(-?\\d+)(\\d{3})/;\n while (pattern.test(value)) {\n value = value.replace(pattern, '$1,$2');\n }\n return value;\n};\n\nexport const toPrecision = (\n number: string,\n precision: number,\n withCommas: boolean = false,\n atLeastOne: boolean = true\n): string => {\n const [whole, decimal = ''] = number.split('.');\n\n let str = `${withCommas ? formatWithCommas(whole) : whole}.${decimal.slice(\n 0,\n precision\n )}`.replace(/\\.$/, '');\n if (atLeastOne && Number(str) === 0 && str.length > 1) {\n var n = str.lastIndexOf('0');\n str = str.slice(0, n) + str.slice(n).replace('0', '1');\n }\n\n return str;\n};\n\nexport const transformTransactions = (\n transactions: Transaction[],\n AccountId: string\n) => {\n const parsedTransactions = transactions.map((t: Transaction) => {\n return {\n signerId: AccountId,\n receiverId: t.receiverId,\n actions: t.functionCalls.map(fc => {\n return {\n type: 'FunctionCall',\n params: {\n methodName: fc.methodName,\n args: fc.args || {},\n gas: getGas(fc.gas)\n .toNumber()\n .toFixed(),\n deposit: utils.format.parseNearAmount(fc.amount || '0')!,\n },\n };\n }),\n };\n });\n\n return parsedTransactions;\n};\n\nexport const WalletSelectorTransactions = (\n transactions: Transaction[],\n AccountId: string\n) => {\n const parsedTransactions = transactions.map((t: Transaction) => {\n return {\n signerId: AccountId,\n receiverId: t.receiverId,\n actions: t.functionCalls.map(fc => {\n return {\n type: 'FunctionCall',\n params: {\n methodName: fc.methodName,\n args: fc.args || {},\n gas: getGas(fc.gas)\n .toNumber()\n .toFixed(),\n deposit: utils.format.parseNearAmount(fc.amount || '0')!,\n },\n };\n }),\n };\n });\n\n return { transactions: parsedTransactions } as SignAndSendTransactionsParams;\n};\n\nexport const separateRoutes = (\n actions: EstimateSwapView[],\n outputToken: string\n) => {\n const res = [];\n let curRoute = [];\n\n for (let i in actions) {\n curRoute.push(actions[i]);\n if (actions[i].outputToken === outputToken) {\n res.push(curRoute);\n curRoute = [];\n }\n }\n\n return res;\n};\n\nexport const calculateExchangeRate = (\n from: string,\n to: string,\n precision?: number\n) => {\n return math\n .floor(math.evaluate(`${to} / ${from}`), precision || 4)\n .toString();\n};\n\nexport const getAvgFee = (\n estimates: EstimateSwapView[],\n outputToken: string,\n parsedAmountIn: string\n) => {\n if (!estimates || estimates.length === 0) {\n return 0;\n }\n\n const routes = separateRoutes(estimates, outputToken);\n\n let fee = new Big(0);\n\n routes.forEach(r => {\n const partialAmountIn = r[0].pool.partialAmountIn || '0';\n\n fee = fee.plus(\n r\n .reduce(\n (acc, cur) => acc.plus(cur.pool.fee || cur.pool.total_fee || 0),\n new Big(0)\n )\n .times(partialAmountIn)\n .div(ONLY_ZEROS.test(parsedAmountIn) ? '1' : parsedAmountIn)\n );\n });\n\n return fee.toNumber();\n};\n\nexport const getAccountName = (AccountId: string) => {\n if (!AccountId) return AccountId;\n\n const [account, network] = AccountId.split('.');\n const niceAccountId = `${account.slice(0, 10)}...${network || ''}`;\n\n return account.length > 10 ? niceAccountId : AccountId;\n};\n\nexport const symbolsArr = ['e', 'E', '+', '-'];\n\nexport const multiply = (factor1: string, factor2: string) => {\n return math.format(math.evaluate(`${factor1} * ${factor2}`), {\n notation: 'fixed',\n });\n};\n\nexport const toInternationalCurrencySystemLongString = (\n labelValue: string,\n percent?: number\n) => {\n return Math.abs(Number(labelValue)) >= 1.0e9\n ? (Math.abs(Number(labelValue)) / 1.0e9).toFixed(percent || 2) + 'B'\n : Math.abs(Number(labelValue)) >= 1.0e6\n ? (Math.abs(Number(labelValue)) / 1.0e6).toFixed(percent || 2) + 'M'\n : Math.abs(Number(labelValue)).toFixed(percent || 2);\n};\n\nexport const percentOfBigNumber = (\n percent: number,\n num: number | string,\n precision: number\n) => {\n const valueBig = math.bignumber(num);\n const percentBig = math.bignumber(percent).div(100);\n\n return toPrecision(\n scientificNotationToString(valueBig.mul(percentBig).toString()),\n precision\n );\n};\n\nexport const toRealSymbol = (symbol: string) => {\n if (!symbol) return '';\n const blackList = ['nUSDO'];\n\n if (symbol === 'nWETH' || symbol === 'WETH') return 'wETH';\n if (blackList.includes(symbol)) return symbol;\n return symbol.charAt(0) === 'n' &&\n symbol.charAt(1) === symbol.charAt(1).toUpperCase()\n ? symbol.substring(1)\n : symbol;\n};\n\nexport const calculateFeeCharge = (fee: number, total: string) => {\n return math.floor(math.evaluate(`(${fee} / ${FEE_DIVISOR}) * ${total}`), 3);\n};\n\nexport const calculateFeePercent = (fee: number) => {\n return math.divide(fee, 100);\n};\n\nexport function getExpectedOutputFromSwapTodos(\n estimates: EstimateSwapView[],\n outputToken: string\n) {\n if (!estimates || estimates.length === 0) return new Big(0);\n\n return estimates\n .filter(item => item.outputToken === outputToken)\n .map(item => new Big(item.estimate || 0))\n .reduce((a, b) => a.plus(b), new Big(0));\n}\n\nexport const calculateAmountReceived = (\n pool: Pool,\n amountIn: string,\n tokenIn: TokenMetadata,\n tokenOut: TokenMetadata\n) => {\n const partialAmountIn = toReadableNumber(tokenIn.decimals, amountIn);\n\n const in_balance = toReadableNumber(\n tokenIn.decimals,\n pool.supplies[tokenIn.id]\n );\n const out_balance = toReadableNumber(\n tokenOut.decimals,\n pool.supplies[tokenOut.id]\n );\n\n const big_in_balance = math.bignumber(in_balance);\n const big_out_balance = math.bignumber(out_balance);\n\n const constant_product = big_in_balance.mul(big_out_balance);\n\n const new_in_balance = big_in_balance.plus(math.bignumber(partialAmountIn));\n\n const new_out_balance = constant_product.div(new_in_balance);\n\n const tokenOutReceived = big_out_balance.minus(new_out_balance);\n\n return tokenOutReceived;\n};\n\nexport const calculateMarketPrice = (\n pool: Pool,\n tokenIn: TokenMetadata,\n tokenOut: TokenMetadata\n) => {\n const cur_in_balance = toReadableNumber(\n tokenIn.decimals,\n pool.supplies[tokenIn.id]\n );\n\n const cur_out_balance = toReadableNumber(\n tokenOut.decimals,\n pool.supplies[tokenOut.id]\n );\n\n return math.evaluate(`(${cur_in_balance} / ${cur_out_balance})`);\n};\n\nexport const calculateSmartRoutingPriceImpact = (\n tokenInAmount: string,\n swapTodos: EstimateSwapView[],\n tokenIn: TokenMetadata,\n tokenMid: TokenMetadata,\n tokenOut: TokenMetadata,\n stablePools: StablePool[]\n) => {\n const isPool1StablePool = isStablePool(stablePools, swapTodos[0].pool.id);\n const isPool2StablePool = isStablePool(stablePools, swapTodos[1].pool.id);\n\n const marketPrice1 = isPool1StablePool\n ? (\n Number(swapTodos[0].pool.rates?.[tokenMid.id]) /\n Number(swapTodos[0].pool.rates?.[tokenIn.id])\n ).toString()\n : calculateMarketPrice(swapTodos[0].pool, tokenIn, tokenMid);\n\n const marketPrice2 = isPool2StablePool\n ? (\n Number(swapTodos[1].pool.rates?.[tokenOut.id]) /\n Number(swapTodos[1].pool.rates?.[tokenMid.id])\n ).toString()\n : calculateMarketPrice(swapTodos[1].pool, tokenMid, tokenOut);\n\n const generalMarketPrice = math.evaluate(`${marketPrice1} * ${marketPrice2}`);\n\n const tokenMidReceived = isPool1StablePool\n ? swapTodos[0].noFeeAmountOut\n : calculateAmountReceived(\n swapTodos[0].pool,\n toNonDivisibleNumber(tokenIn.decimals, tokenInAmount),\n tokenIn,\n tokenMid\n );\n\n const formattedTokenMidReceived = scientificNotationToString(\n tokenMidReceived?.toString() || '0'\n );\n\n let stableOutPool2;\n if (isPool2StablePool) {\n const stablePool2 =\n stablePools.find(p => p.id === swapTodos[1].pool.id) || stablePools[0];\n\n const stableOut = getSwappedAmount(\n tokenMid.id,\n tokenOut.id,\n formattedTokenMidReceived,\n stablePool2,\n getStablePoolDecimal(stablePool2)\n );\n stableOutPool2 =\n stableOut[0] < 0\n ? '0'\n : toPrecision(scientificNotationToString(stableOut[2].toString()), 0);\n stableOutPool2 = toReadableNumber(\n getStablePoolDecimal(stablePool2),\n stableOutPool2\n );\n }\n\n const tokenOutReceived = isPool2StablePool\n ? stableOutPool2\n : calculateAmountReceived(\n swapTodos[1].pool,\n toNonDivisibleNumber(tokenMid.decimals, formattedTokenMidReceived),\n tokenMid,\n tokenOut\n );\n\n const newMarketPrice = math.evaluate(\n `${tokenInAmount} / ${tokenOutReceived}`\n );\n\n const PriceImpact = new Big(newMarketPrice)\n .minus(new Big(generalMarketPrice))\n .div(newMarketPrice)\n .times(100)\n .toString();\n\n return scientificNotationToString(PriceImpact);\n};\nexport const percent = (numerator: string, denominator: string) => {\n return math.evaluate(`(${numerator} / ${denominator}) * 100`);\n};\nexport const calcStableSwapPriceImpact = (\n from: string,\n to: string,\n marketPrice: string = '1'\n) => {\n const newMarketPrice = math.evaluate(`${from} / ${to}`);\n\n return math.format(\n percent(\n math.evaluate(`${newMarketPrice} - ${marketPrice}`),\n newMarketPrice\n ),\n {\n notation: 'fixed',\n }\n );\n};\n\nexport const calculatePriceImpact = (\n pools: Pool[],\n tokenIn: TokenMetadata,\n tokenOut: TokenMetadata,\n tokenInAmount: string\n) => {\n let in_balance: string = '0',\n out_balance: string = '0';\n\n pools.forEach((pool, i) => {\n const cur_in_balance = toReadableNumber(\n tokenIn.decimals,\n pool.supplies[tokenIn.id]\n );\n\n const cur_out_balance = toReadableNumber(\n tokenOut.decimals,\n pool.supplies[tokenOut.id]\n );\n\n in_balance = new Big(in_balance).plus(cur_in_balance).toString();\n out_balance = new Big(out_balance).plus(cur_out_balance).toString();\n });\n\n const finalMarketPrice = math.evaluate(`(${in_balance} / ${out_balance})`);\n\n const separatedReceivedAmount = pools.map(pool => {\n return calculateAmountReceived(\n pool,\n pool.partialAmountIn || '0',\n tokenIn,\n tokenOut\n );\n });\n\n const finalTokenOutReceived = math.sum(...separatedReceivedAmount);\n\n const newMarketPrice = math.evaluate(\n `${tokenInAmount} / ${finalTokenOutReceived}`\n );\n\n const PriceImpact = new Big(newMarketPrice)\n .minus(new Big(finalMarketPrice))\n .div(newMarketPrice)\n .times(100)\n .toString();\n\n return scientificNotationToString(PriceImpact);\n};\n\nexport function calculateSmartRoutesV2PriceImpact(\n actions: any,\n outputToken: string,\n tokenInPara: TokenMetadata,\n stablePools: StablePool[]\n) {\n const routes = separateRoutes(actions, outputToken);\n\n const tokenIn = routes[0][0].tokens?.[0] || tokenInPara;\n\n const totalInputAmount = routes[0][0].totalInputAmount;\n\n const priceImpactForRoutes = routes.map((r, i) => {\n const readablePartialAmountIn = toReadableNumber(\n tokenIn.decimals,\n r[0].pool.partialAmountIn\n );\n\n if (r.length > 1) {\n const tokenIn = r[0].tokens?.[0];\n const tokenMid = r[0].tokens?.[1];\n const tokenOut = r[0].tokens?.[2];\n\n return calculateSmartRoutingPriceImpact(\n readablePartialAmountIn,\n routes[i],\n tokenIn || tokenInPara,\n tokenMid || tokenInPara,\n tokenOut || tokenInPara,\n stablePools\n );\n } else {\n return isStablePool(stablePools, r[0].pool.id)\n ? calcStableSwapPriceImpact(\n readablePartialAmountIn,\n r[0].noFeeAmountOut || '0',\n (\n Number(r[0].pool.rates?.[outputToken]) /\n Number(r[0].pool.rates?.[tokenIn.id])\n ).toString()\n )\n : calculatePriceImpact(\n [r[0].pool],\n r[0].tokens?.[0] || tokenIn,\n r[0].tokens?.[1] || tokenIn,\n readablePartialAmountIn\n );\n }\n });\n\n const rawRes = priceImpactForRoutes.reduce(\n (pre, cur, i) => {\n return pre.plus(\n new Big(routes[i][0].pool.partialAmountIn || '0')\n .div(new Big(totalInputAmount || '1'))\n .mul(cur)\n );\n },\n\n new Big(0)\n );\n\n return scientificNotationToString(rawRes.toString());\n}\n\nexport const getPriceImpact = ({\n estimates,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut,\n stablePools,\n}: {\n estimates: EstimateSwapView[];\n tokenIn: TokenMetadata;\n tokenOut: TokenMetadata;\n amountIn: string;\n amountOut: string;\n stablePools: StablePool[];\n}) => {\n let PriceImpactValue: string = '0';\n let priceImpactValueSmartRouting: string = '0';\n let priceImpactValueSmartRoutingV2: string = '0';\n\n if (typeof estimates === 'undefined') return '0';\n\n try {\n if (estimates?.length === 2 && estimates[0].status === PoolMode.SMART) {\n priceImpactValueSmartRouting = calculateSmartRoutingPriceImpact(\n amountIn,\n estimates,\n tokenIn,\n estimates[0].tokens?.[1] || tokenIn,\n tokenOut,\n stablePools\n );\n } else if (\n estimates?.length === 1 &&\n estimates[0].status === PoolMode.STABLE\n ) {\n priceImpactValueSmartRouting = calcStableSwapPriceImpact(\n toReadableNumber(tokenIn.decimals, estimates[0].totalInputAmount),\n estimates[0].noFeeAmountOut || '0',\n (\n Number(estimates[0].pool.rates?.[tokenOut.id]) /\n Number(estimates[0].pool.rates?.[tokenIn.id])\n ).toString()\n );\n } else priceImpactValueSmartRouting = '0';\n } catch (error) {\n priceImpactValueSmartRouting = '0';\n }\n\n try {\n priceImpactValueSmartRoutingV2 = calculateSmartRoutesV2PriceImpact(\n estimates,\n tokenOut.id,\n tokenIn,\n stablePools\n );\n } catch (error) {\n priceImpactValueSmartRoutingV2 = '0';\n }\n\n try {\n if (\n estimates[0].status === PoolMode.SMART ||\n estimates[0].status === PoolMode.STABLE\n ) {\n PriceImpactValue = priceImpactValueSmartRouting;\n } else {\n PriceImpactValue = priceImpactValueSmartRoutingV2;\n }\n\n return PriceImpactValue;\n } catch (error) {\n return '0';\n }\n};\n\nexport const subtraction = (initialValue: string, toBeSubtract: string) => {\n return math.format(math.evaluate(`${initialValue} - ${toBeSubtract}`), {\n notation: 'fixed',\n });\n};\n\nexport function getPoolAllocationPercents(pools: Pool[]) {\n if (pools.length === 1) return ['100'];\n\n if (pools) {\n const partialAmounts = pools.map(pool => {\n return math.bignumber(pool.partialAmountIn);\n });\n\n const ps: string[] = new Array(partialAmounts.length).fill('0');\n\n const sum =\n partialAmounts.length === 1\n ? partialAmounts[0]\n : math.sum(...partialAmounts);\n\n const sortedAmount = sortBy(partialAmounts, p => Number(p));\n\n let minIndexes: number[] = [];\n\n for (let k = 0; k < sortedAmount.length - 1; k++) {\n let minIndex = -1;\n\n for (let j = 0; j < partialAmounts.length; j++) {\n if (partialAmounts[j].eq(sortedAmount[k]) && !minIndexes.includes(j)) {\n minIndex = j;\n minIndexes.push(j);\n break;\n }\n }\n const res = math\n .round(percent(partialAmounts[minIndex].toString(), sum))\n .toString();\n\n if (Number(res) === 0) {\n ps[minIndex] = '1';\n } else {\n ps[minIndex] = res;\n }\n }\n\n const finalPIndex = ps.indexOf('0');\n\n ps[finalPIndex] = subtraction(\n '100',\n ps.length === 1 ? Number(ps[0]) : math.sum(...ps.map(p => Number(p)))\n ).toString();\n\n return ps;\n } else {\n return [];\n }\n}\n\nexport const isMobile = (): boolean => {\n return window.screen.width <= 600;\n};\nexport function divide(numerator: string, denominator: string) {\n return math.format(math.evaluate(`${numerator} / ${denominator}`), {\n notation: 'fixed',\n });\n}\n\nexport const getMax = function(id: string, amount: string) {\n return id !== WRAP_NEAR_CONTRACT_ID\n ? amount\n : Number(amount) <= 0.5\n ? '0'\n : String(Number(amount) - 0.5);\n};\n\nexport function getPointByPrice(\n pointDelta: number,\n price: string,\n decimalRate: number,\n noNeedSlot?: boolean\n) {\n const point = Math.log(+price * decimalRate) / Math.log(CONSTANT_D);\n const point_int = Math.round(point);\n let point_int_slot = point_int;\n if (!noNeedSlot) {\n point_int_slot = Math.floor(point_int / pointDelta) * pointDelta;\n }\n if (point_int_slot < POINTLEFTRANGE) {\n return POINTLEFTRANGE;\n } else if (point_int_slot > POINTRIGHTRANGE) {\n return 800000;\n }\n return point_int_slot;\n}\nexport const feeToPointDelta = (fee: number) => {\n switch (fee) {\n case 100:\n return 1;\n case 400:\n return 8;\n case 2000:\n return 40;\n case 10000:\n return 200;\n default:\n throw NoFeeToPool(fee);\n }\n};\n\nexport const priceToPoint = ({\n tokenA,\n tokenB,\n amountA,\n amountB,\n fee,\n}: {\n tokenA: TokenMetadata;\n tokenB: TokenMetadata;\n amountA: string;\n amountB: string;\n fee: number;\n}) => {\n if (DCL_POOL_FEE_LIST.indexOf(fee) === -1) throw NoFeeToPool(fee);\n\n const decimal_price_A_by_B = new Big(amountB).div(amountA);\n const undecimal_price_A_by_B = decimal_price_A_by_B\n .times(new Big(10).pow(tokenB.decimals))\n .div(new Big(10).pow(tokenA.decimals));\n\n const pointDelta = feeToPointDelta(fee);\n\n const price = decimal_price_A_by_B;\n\n const decimalRate = new Big(10)\n .pow(tokenB.decimals)\n .div(new Big(10).pow(tokenA.decimals))\n .toNumber();\n\n return getPointByPrice(\n pointDelta,\n scientificNotationToString(price.toString()),\n decimalRate\n );\n};\n\nexport const pointToPrice = ({\n tokenA,\n tokenB,\n point,\n}: {\n tokenA: TokenMetadata;\n tokenB: TokenMetadata;\n point: number;\n}) => {\n const undecimal_price = Math.pow(CONSTANT_D, point);\n const decimal_price_A_by_B = new Big(undecimal_price)\n .times(new Big(10).pow(tokenA.decimals))\n .div(new Big(10).pow(tokenB.decimals));\n\n return scientificNotationToString(decimal_price_A_by_B.toString());\n};\n\nexport const registerAccountOnToken = (AccountId: string) => {\n return {\n methodName: 'storage_deposit',\n args: {\n registration_only: true,\n account_id: AccountId,\n },\n gas: '30000000000000',\n amount: STORAGE_TO_REGISTER_WITH_MFT,\n };\n};\n","import {\n keyStores,\n KeyPair,\n InMemorySigner,\n providers,\n transactions as nearTransactions,\n utils,\n} from 'near-api-js';\nimport BN from 'bn.js';\nimport { getConfig } from './constant';\nimport fs from 'fs';\nimport os from 'os';\nimport {\n NoPuiblicKeyError,\n InValidAccessKeyError,\n NoCredential,\n} from './error';\nimport { AccessKeyView } from 'near-api-js/lib/providers/provider';\nimport { TransformedTransaction } from './types';\nimport { Transaction } from './types';\nimport { transformTransactions } from './utils';\nimport { AccountIdMisMatch } from './error';\n\nexport const getKeyStore = () => {\n return typeof window === 'undefined'\n ? new keyStores.InMemoryKeyStore()\n : new keyStores.BrowserLocalStorageKeyStore();\n};\n\nexport const provider = new providers.JsonRpcProvider({\n url: getConfig().nodeUrl,\n});\n\nexport const getMemorySigner = async ({\n AccountId,\n keyPath,\n}: {\n AccountId: string;\n keyPath: string;\n}) => {\n try {\n // const homedir = os.homedir();\n const credentials = JSON.parse(fs.readFileSync(keyPath).toString());\n\n const credentialAccountId = credentials?.account_id;\n\n if (!credentialAccountId) throw NoCredential;\n\n if (credentialAccountId !== AccountId) throw AccountIdMisMatch;\n\n const myKeyStore = new keyStores.InMemoryKeyStore();\n myKeyStore.setKey(\n getConfig().networkId,\n AccountId,\n KeyPair.fromString(credentials.private_key)\n );\n\n const signer = new InMemorySigner(myKeyStore);\n\n return signer;\n } catch (error) {\n throw error;\n }\n};\n\nconst validateAccessKey = (\n transaction: TransformedTransaction,\n accessKey: AccessKeyView\n) => {\n if (accessKey.permission === 'FullAccess') {\n return accessKey;\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { receiver_id, method_names } = accessKey.permission.FunctionCall;\n\n if (transaction.receiverId !== receiver_id) {\n return null;\n }\n\n return transaction.actions.every(action => {\n if (action.type !== 'FunctionCall') {\n return false;\n }\n\n const { methodName, deposit } = action.params;\n\n if (method_names.length && method_names.includes(methodName)) {\n return false;\n }\n\n return parseFloat(deposit) <= 0;\n });\n};\n\nexport const getSignedTransactionsByMemoryKey = async ({\n transactionsRef,\n AccountId,\n keyPath,\n}: {\n transactionsRef: Transaction[];\n AccountId: string;\n keyPath: string;\n}) => {\n const transactions = transformTransactions(transactionsRef, AccountId);\n\n const block = await provider.block({ finality: 'final' });\n\n const signedTransactions: Array<nearTransactions.SignedTransaction> = [];\n const signer = await getMemorySigner({\n AccountId,\n keyPath,\n });\n\n for (let i = 0; i < transactions.length; i += 1) {\n const transaction = transactions[i];\n\n const publicKey = await signer.getPublicKey(\n AccountId,\n getConfig().networkId\n );\n if (!publicKey) {\n throw NoPuiblicKeyError;\n }\n\n const accessKey = await provider.query<AccessKeyView>({\n request_type: 'view_access_key',\n finality: 'final',\n account_id: AccountId,\n public_key: publicKey.toString(),\n });\n\n if (!validateAccessKey(transaction, accessKey)) {\n throw InValidAccessKeyError;\n }\n\n const tx = nearTransactions.createTransaction(\n AccountId,\n utils.PublicKey.from(publicKey.toString()),\n transactions[i].receiverId,\n accessKey.nonce + i + 1,\n transaction.actions.map(action => {\n const { methodName, args, gas, deposit } = action.params;\n return nearTransactions.functionCall(\n methodName,\n args,\n new BN(gas),\n new BN(deposit)\n );\n }),\n utils.serialize.base_decode(block.header.hash)\n );\n\n const [, signedTx] = await nearTransactions.signTransaction(\n tx,\n signer,\n transactions[i].signerId,\n getConfig().networkId\n );\n signedTransactions.push(signedTx);\n }\n\n return signedTransactions;\n};\n\nexport const sendTransactionsByMemoryKey = async ({\n signedTransactions,\n}: {\n signedTransactions: nearTransactions.SignedTransaction[];\n}) => {\n try {\n const results: Array<providers.FinalExecutionOutcome> = [];\n\n for (let i = 0; i < signedTransactions.length; i += 1) {\n results.push(await provider.sendTransaction(signedTransactions[i]));\n }\n\n return results;\n } catch (err) {\n throw err;\n }\n};\n","import {\n REF_FI_CONTRACT_ID,\n config,\n WRAP_NEAR_CONTRACT_ID,\n NEAR_META_DATA,\n getConfig,\n switchEnv,\n} from './constant';\nimport {\n keyStores,\n Near,\n providers,\n WalletConnection,\n utils,\n} from 'near-api-js';\nimport { NoAccountIdFound, TokenNotExistError, DCLInValid } from './error';\nimport { getKeyStore } from './near';\n\nimport {\n TokenMetadata,\n FTStorageBalance,\n RefFiViewFunctionOptions,\n} from './types';\nimport { AccountView } from 'near-api-js/lib/providers/provider';\nimport { Transaction } from './types';\nimport { ONE_YOCTO_NEAR, REF_TOKEN_ID, REF_META_DATA } from './constant';\n\nimport metaIconDefaults from './metaIcons';\n\nconst BANANA_ID = 'berryclub.ek.near';\nconst CHEDDAR_ID = 'token.cheddar.near';\nconst CUCUMBER_ID = 'farm.berryclub.ek.near';\nconst HAPI_ID = 'd9c2d319cd7e6177336b0a9c93c21cb48d84fb54.factory.bridge.near';\nconst WOO_ID = '4691937a7508860f876c9c0a2a617e7d9e945d4b.factory.bridge.near';\n\nexport const REPLACE_TOKENS = [\n BANANA_ID,\n CHEDDAR_ID,\n CUCUMBER_ID,\n HAPI_ID,\n WOO_ID,\n];\n\nlet near = new Near({\n keyStore: getKeyStore(),\n headers: {},\n ...getConfig(),\n});\nexport const init_env = (env: string, indexerUrl?: string) => {\n near = new Near({\n keyStore: getKeyStore(),\n headers: {},\n ...getConfig(env, indexerUrl),\n });\n return switchEnv();\n};\n\nexport const refFiViewFunction = async ({\n methodName,\n args,\n}: RefFiViewFunctionOptions) => {\n const nearConnection = await near.account(REF_FI_CONTRACT_ID);\n\n return nearConnection.viewFunction(REF_FI_CONTRACT_ID, methodName, args);\n};\n\nexport const ftViewFunction = async (\n tokenId: string,\n { methodName, args }: RefFiViewFunctionOptions\n) => {\n const nearConnection = await near.account(REF_FI_CONTRACT_ID);\n\n return nearConnection.viewFunction(tokenId, methodName, args);\n};\n\nexport const ftGetStorageBalance = (\n tokenId: string,\n AccountId: string\n): Promise<FTStorageBalance | null> => {\n if (!AccountId) throw NoAccountIdFound;\n\n return ftViewFunction(tokenId, {\n methodName: 'storage_balance_of',\n args: { account_id: AccountId },\n });\n};\n\nexport const ftGetBalance = async (tokenId: string, AccountId: string) => {\n if (!AccountId) return '0';\n\n if (tokenId === 'NEAR') {\n return getAccountNearBalance(AccountId).catch(() => '0');\n }\n\n return ftViewFunction(tokenId, {\n methodName: 'ft_balance_of',\n args: {\n account_id: AccountId,\n },\n })\n .then(res => {\n return res;\n })\n .catch(() => '0');\n};\n\nexport const getTotalPools = async () => {\n return refFiViewFunction({\n methodName: 'get_number_of_pools',\n });\n};\n\nexport const ftGetTokenMetadata = async (\n id: string,\n tag?: string\n): Promise<TokenMetadata> => {\n if (id === REF_TOKEN_ID) return REF_META_DATA;\n\n const metadata = await ftViewFunction(id, {\n methodName: 'ft_metadata',\n }).catch(() => {\n throw TokenNotExistError(id);\n });\n\n if (\n !metadata.icon ||\n id === BANANA_ID ||\n id === CHEDDAR_ID ||\n id === CUCUMBER_ID ||\n id === HAPI_ID ||\n id === WOO_ID ||\n id === WRAP_NEAR_CONTRACT_ID\n ) {\n return {\n ...metadata,\n icon: metaIconDefaults[id],\n id,\n };\n }\n\n return { ...metadata, id };\n};\n\nexport const ftGetTokensMetadata = async (\n tokenIds?: string[],\n allTokens?: Record<string, TokenMetadata>\n) => {\n const ids = tokenIds || (await getGlobalWhitelist());\n\n const tokensMetadata = await Promise.all(\n ids.map(\n (id: string) =>\n allTokens?.[id] || ftGetTokenMetadata(id).catch(() => null)\n )\n );\n\n return tokensMetadata.reduce((pre, cur, i) => {\n return {\n ...pre,\n [ids[i]]: cur,\n };\n }, {}) as Record<string, TokenMetadata>;\n};\n\nexport const getGlobalWhitelist = async (): Promise<string[]> => {\n const globalWhitelist = await refFiViewFunction({\n methodName: 'get_whitelisted_tokens',\n });\n return Array.from(new Set(globalWhitelist));\n};\n\nexport const getUserRegisteredTokens = async (\n AccountId?: string\n): Promise<string[]> => {\n if (!AccountId) return [];\n\n return refFiViewFunction({\n methodName: 'get_user_whitelisted_tokens',\n args: { account_id: AccountId },\n });\n};\n\nexport const getAccountNearBalance = async (accountId: string) => {\n const provider = new providers.JsonRpcProvider({\n url: getConfig().nodeUrl,\n });\n\n return provider\n .query<AccountView>({\n request_type: 'view_account',\n finality: 'final',\n account_id: accountId,\n })\n .then(data => data.amount);\n};\n\nexport const nearDepositTransaction = (amount: string) => {\n const transaction: Transaction = {\n receiverId: WRAP_NEAR_CONTRACT_ID,\n functionCalls: [\n {\n methodName: 'near_deposit',\n args: {},\n gas: '50000000000000',\n amount,\n },\n ],\n };\n\n return transaction;\n};\n\nexport const nearWithdrawTransaction = (amount: string) => {\n const transaction: Transaction = {\n receiverId: WRAP_NEAR_CONTRACT_ID,\n functionCalls: [\n {\n methodName: 'near_withdraw',\n args: { amount: utils.format.parseNearAmount(amount) },\n amount: ONE_YOCTO_NEAR,\n },\n ],\n };\n return transaction;\n};\n\nexport const refDCLSwapViewFunction = async ({\n methodName,\n args,\n}: RefFiViewFunctionOptions) => {\n const nearConnection = await near.account(REF_FI_CONTRACT_ID);\n\n if (!config.REF_DCL_SWAP_CONTRACT_ID) throw DCLInValid;\n\n return nearConnection.viewFunction(\n config.REF_DCL_SWAP_CONTRACT_ID,\n methodName,\n args\n );\n};\n\nexport const DCLSwapGetStorageBalance = (\n tokenId: string,\n AccountId: string\n) => {\n return refDCLSwapViewFunction({\n methodName: 'storage_balance_of',\n args: { account_id: AccountId },\n });\n};\n","import { TokenMetadata, Transaction } from '../types';\nimport {\n priceToPoint,\n toNonDivisibleNumber,\n toPrecision,\n registerAccountOnToken,\n} from '../utils';\nimport { ONE_YOCTO_NEAR, WRAP_NEAR_CONTRACT_ID, config } from '../constant';\nimport {\n nearDepositTransaction,\n ftGetStorageBalance,\n refDCLSwapViewFunction,\n} from '../ref';\nimport { NoFeeToPool } from '../error';\n\nexport const DCL_POOL_FEE_LIST = [100, 400, 2000, 10000];\n\ninterface PoolInfo {\n pool_id?: string;\n token_x?: string;\n token_y?: string;\n fee: number;\n point_delta?: number;\n current_point?: number;\n state?: string;\n liquidity?: string;\n liquidity_x?: string;\n max_liquidity_per_point?: string;\n percent?: string;\n total_x?: string;\n total_y?: string;\n tvl?: number;\n token_x_metadata?: TokenMetadata;\n token_y_metadata?: TokenMetadata;\n}\n\nexport const getDCLPoolId = (tokenA: string, tokenB: string, fee: number) => {\n if (DCL_POOL_FEE_LIST.indexOf(fee) === -1) throw NoFeeToPool(fee);\n\n const tokenSeq = [tokenA, tokenB].sort().join('|');\n\n return `${tokenSeq}|${fee}`;\n};\nexport const listDCLPools = () => {\n return refDCLSwapViewFunction({\n methodName: 'list_pools',\n });\n};\n\nexport const getDCLPool = async (pool_id: string) => {\n const [token_x, token_y, fee] = pool_id.split('|');\n\n const token_seq = [token_x, token_y].sort().join('|');\n\n const new_pool_id = `${token_seq}|${fee}`;\n\n return refDCLSwapViewFunction({\n methodName: 'get_pool',\n args: {\n pool_id: new_pool_id,\n },\n }) as Promise<PoolInfo>;\n};\n","import { config, getConfig } from './constant';\nimport { DCL_POOL_FEE_LIST } from './dcl-swap/dcl-pool';\n\nexport const formatError = (msg: string) => {\n return new Error(msg);\n};\n\nexport const unNamedError = formatError('Something wrong happened');\n\nexport const SameInputTokenError = formatError(\n 'Input token should be different with output token'\n);\n\nexport const ZeroInputError = formatError(\n 'Input amount should be greater than 0'\n);\n\nexport const NoPoolError = formatError('No pool found for the input tokens');\n\nexport const NotLoginError = formatError('Please login in first');\n\nexport const SwapRouteError = formatError(\n \"Something wrong happened, we don't get correct routes corrreponding to current input\"\n);\n\nexport const TokenNotExistError = (id: string) =>\n formatError(`${id} doesn't exist in ${getConfig().networkId}`);\n\nexport const NoPuiblicKeyError = formatError('No public key found');\n\nexport const NoLocalSignerError = formatError('No local signer found');\n\nexport const InValidAccessKeyError = formatError('Invalid access key');\n\nexport const AccountIdMisMatch = formatError(\n \"Your input account id doesn't match the account id in the credential\"\n);\n\nexport const NoCredential = formatError('No Credential to such path');\n\nexport const NoAccountIdFound = formatError('No account id found');\n\nexport const NoFeeToPool = (fee: number) =>\n formatError(\n `InValid fee ${fee} to DCL pool, the valid fee should be one of ${DCL_POOL_FEE_LIST}`\n );\n\nexport const DCLInValid = formatError(\n `DCL contract currently in Valid on ${config.networkId}`\n);\n\nexport const NoPoolOnThisPair = (tokenA: string, tokenB: string) =>\n formatError(`No pools on pair ${tokenA} <> ${tokenB}`);\n\nexport const SlippageError = formatError(\n 'slippage tolerance should be in range (0, 100)'\n);\n\nexport const NoOrderFound = (order_id?: string) =>\n formatError(`No order ${order_id || ''} found`);\n\nexport const OrderNoRemainedAmount = formatError(\n 'No remained amount on this order'\n);\n","import { TokenMetadata, EstimateSwapView, Transaction } from '../types';\nimport { ftGetStorageBalance } from '../ref';\nimport {\n STORAGE_TO_REGISTER_WITH_MFT,\n REF_FI_CONTRACT_ID,\n ONE_YOCTO_NEAR,\n} from '../constant';\nimport { round, percentLess } from '../utils';\nimport { toNonDivisibleNumber } from '../utils';\nimport { config } from '../constant';\nimport { SwapRouteError } from '../error';\n\nexport const instantSwap = async ({\n tokenIn,\n tokenOut,\n amountIn,\n slippageTolerance,\n swapTodos,\n AccountId,\n referralId,\n}: {\n tokenIn: TokenMetadata;\n tokenOut: TokenMetadata;\n amountIn: string;\n slippageTolerance: number;\n swapTodos: EstimateSwapView[];\n AccountId: string;\n referralId?: string;\n}) => {\n const transactions: Transaction[] = [];\n\n if (swapTodos?.[swapTodos?.length - 1]?.outputToken !== tokenOut.id)\n throw SwapRouteError;\n\n const registerToken = async (token: TokenMetadata) => {\n const tokenRegistered = await ftGetStorageBalance(\n token.id,\n AccountId\n ).catch(() => {\n throw new Error(`${token.id} doesn't exist.`);\n });\n\n if (tokenRegistered === null) {\n transactions.push({\n receiverId: token.id,\n functionCalls: [\n {\n methodName: 'storage_deposit',\n args: {\n registration_only: true,\n account_id: AccountId,\n },\n gas: '30000000000000',\n amount: STORAGE_TO_REGISTER_WITH_MFT,\n },\n ],\n });\n }\n };\n\n if (tokenIn.id === config.WRAP_NEAR_CONTRACT_ID) {\n const registered = await ftGetStorageBalance(\n config.WRAP_NEAR_CONTRACT_ID,\n AccountId\n );\n if (registered === null) {\n await registerToken(tokenIn);\n }\n }\n\n await registerToken(tokenOut);\n let actionsList: any = [];\n let allSwapsTokens = swapTodos.map(s => [s.inputToken, s.outputToken]); // to get the hop tokens\n for (let i in allSwapsTokens) {\n let swapTokens = allSwapsTokens[i];\n if (swapTokens[0] === tokenIn.id && swapTokens[1] === tokenOut.id) {\n // parallel, direct hop route.\n actionsList.push({\n pool_id: swapTodos[i].pool.id,\n token_in: tokenIn.id,\n token_out: tokenOut.id,\n amount_in: swapTodos[i].pool.partialAmountIn,\n min_amount_out: round(\n tokenOut.decimals,\n toNonDivisibleNumber(\n tokenOut.decimals,\n percentLess(slippageTolerance, swapTodos[i].estimate)\n )\n ),\n });\n } else if (swapTokens[0] === tokenIn.id) {\n // first hop in double hop route\n //TODO -- put in a check to make sure this first hop matches with the next (i+1) hop as a second hop.\n actionsList.push({\n pool_id: swapTodos[i].pool.id,\n token_in: swapTokens[0],\n token_out: swapTokens[1],\n amount_in: swapTodos[i].pool.partialAmountIn,\n min_amount_out: '0',\n });\n } else {\n // second hop in double hop route.\n //TODO -- put in a check to make sure this second hop matches with the previous (i-1) hop as a first hop.\n actionsList.push({\n pool_id: swapTodos[i].pool.id,\n token_in: swapTokens[0],\n token_out: swapTokens[1],\n min_amount_out: round(\n tokenOut.decimals,\n toNonDivisibleNumber(\n tokenOut.decimals,\n percentLess(slippageTolerance, swapTodos[i].estimate)\n )\n ),\n });\n }\n }\n\n transactions.push({\n receiverId: tokenIn.id,\n functionCalls: [\n {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: REF_FI_CONTRACT_ID,\n amount: toNonDivisibleNumber(tokenIn.decimals, amountIn),\n msg: !!referralId\n ? JSON.stringify({\n force: 0,\n actions: actionsList,\n referral_id: referralId,\n })\n : JSON.stringify({\n force: 0,\n actions: actionsList,\n }),\n },\n gas: '180000000000000',\n amount: ONE_YOCTO_NEAR,\n },\n ],\n });\n\n return transactions;\n};\n","import { getTotalPools, refFiViewFunction } from '../ref';\nimport { Pool, PoolRPCView } from '../types';\nimport { parsePool, toNonDivisibleNumber } from '../utils';\nimport { STABLE_LP_TOKEN_DECIMALS } from '../constant';\n\nlet DEFAULT_PAGE_LIMIT = 100;\nconst BLACK_TOKEN_LIST = ['meta-token.near'];\n\nexport const getRatedPoolDetail = async ({ id }: { id: string | number }) => {\n return refFiViewFunction({\n methodName: 'get_rated_pool',\n args: { pool_id: Number(id) },\n }).then(pool_info => ({\n ...pool_info,\n id: Number(id),\n pool_kind: 'RATED_SWAP',\n }));\n};\n\nexport const getUnRatedPoolDetail = async ({ id }: { id: string | number }) => {\n return refFiViewFunction({\n methodName: 'get_stable_pool',\n args: { pool_id: Number(id) },\n }).then(pool_info => ({\n ...pool_info,\n id: Number(id),\n pool_kind: 'STABLE_SWAP',\n rates: pool_info.c_amounts.map((_: any) =>\n toNonDivisibleNumber(STABLE_LP_TOKEN_DECIMALS, '1')\n ),\n }));\n};\n\nexport const getStablePools = async (stablePools: Pool[]) => {\n return Promise.all(\n stablePools.map(pool =>\n pool.pool_kind === 'RATED_SWAP'\n ? getRatedPoolDetail({ id: pool.id })\n : getUnRatedPoolDetail({ id: pool.id })\n )\n );\n};\n\nexport const getPool = async (id: number): Promise<Pool> => {\n return await refFiViewFunction({\n methodName: 'get_pool',\n args: { pool_id: id },\n }).then((pool: PoolRPCView) => parsePool(pool, id));\n};\n\nexport const getPoolByIds = async (ids: number[]): Promise<Pool[]> => {\n return await refFiViewFunction({\n methodName: 'get_pool_by_ids',\n args: { pool_ids: ids },\n }).then((pools: PoolRPCView[]) => pools.map((p, i) => parsePool(p, ids[i])));\n};\n\nexport const getRefPools = async (\n page: number = 1,\n perPage: number = DEFAULT_PAGE_LIMIT\n): Promise<Pool[]> => {\n const index = (page - 1) * perPage;\n const poolData: PoolRPCView[] = await refFiViewFunction({\n methodName: 'get_pools',\n args: { from_index: index, limit: perPage },\n });\n return poolData\n .map((rawPool, i) => parsePool(rawPool, i + index))\n .filter(\n p => !p.tokenIds?.find(tokenId => BLACK_TOKEN_LIST.includes(tokenId))\n );\n};\n\nexport const fetchAllPools = async (perPage?: number) => {\n if (perPage) {\n DEFAULT_PAGE_LIMIT = Math.min(perPage, 500);\n }\n const totalPools = await getTotalPools();\n const pages = Math.ceil(totalPools / DEFAULT_PAGE_LIMIT);\n const pools = (\n await Promise.all(\n [...Array(pages)].fill(0).map((_, i) => getRefPools(i + 1))\n )\n ).flat() as Pool[];\n return {\n simplePools: pools.filter(\n p => p.pool_kind && p.pool_kind === 'SIMPLE_POOL'\n ),\n unRatedPools: pools.filter(\n p => p.pool_kind && p.pool_kind === 'STABLE_SWAP'\n ),\n ratedPools: pools.filter(p => p.pool_kind && p.pool_kind === 'RATED_SWAP'),\n };\n};\n","import React, {\n useEffect,\n useState,\n useContext,\n createContext,\n ReactNode,\n} from 'react';\nimport {\n ftGetBalance,\n ftGetTokenMetadata,\n getGlobalWhitelist,\n nearDepositTransaction,\n nearWithdrawTransaction,\n REPLACE_TOKENS,\n} from '../ref';\nimport {\n EstimateSwapView,\n Pool,\n StablePool,\n TokenMetadata,\n Transaction,\n} from '../types';\nimport { fetchAllPools, getStablePools } from '../v1-swap/pool';\nimport { estimateSwap, SwapOptions, SwapParams } from '../v1-swap/swap';\nimport { SwapOutParams } from './types';\nimport {\n percentLess,\n separateRoutes,\n toNonDivisibleNumber,\n calculateExchangeRate,\n getAvgFee,\n} from '../utils';\nimport Big from 'big.js';\nimport { instantSwap } from '../v1-swap/instantSwap';\n\nimport { getExpectedOutputFromActionsORIG } from '../v1-swap/smartRoutingLogic.js';\nimport { Theme } from './constant';\nimport { defaultTheme } from './constant';\nimport {\n getTokenPriceList,\n getTokens,\n getWhiteListTokensIndexer,\n} from '../indexer';\nimport {\n toReadableNumber,\n ONLY_ZEROS,\n getExpectedOutputFromSwapTodos,\n} from '../utils';\nimport { getUserRegisteredTokens } from '../ref';\nimport { WRAP_NEAR_CONTRACT_ID, NEAR_META_DATA } from '../constant';\nimport { scientificNotationToString } from '../utils';\nimport metaIconDefaults from '../metaIcons';\n\nexport const ThemeContext = createContext<Theme>(defaultTheme);\n\nexport const ThemeContextProvider: React.FC<{\n customTheme: Theme | undefined;\n}> = ({ customTheme, children }) => {\n const [theme, setTheme] = useState<Theme>(customTheme || defaultTheme);\n\n useEffect(() => {\n if (!customTheme) return;\n setTheme(customTheme);\n }, [customTheme]);\n\n return (\n <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>\n );\n};\n\nexport const estimateValidator = (\n swapTodos: EstimateSwapView[],\n tokenIn: TokenMetadata,\n parsedAmountIn: string,\n tokenOut: TokenMetadata\n) => {\n const tokenInId = swapTodos[0]?.inputToken;\n const tokenOutId = swapTodos[swapTodos.length - 1]?.outputToken;\n\n const totalPartialAmountIn =\n swapTodos.length === 0\n ? new Big(swapTodos[0].pool.partialAmountIn || 0)\n : swapTodos.reduce(\n (acc, cur, i) => acc.plus(cur.pool.partialAmountIn || 0),\n new Big(0)\n );\n\n if (\n tokenInId !== tokenIn.id ||\n tokenOutId !== tokenOut.id ||\n !totalPartialAmountIn.eq(parsedAmountIn || '0')\n ) {\n return false;\n }\n return true;\n};\n\nexport const useAllTokens = ({ reload }: { reload?: boolean }) => {\n const [tokens, setTokens] = useState<Record<string, TokenMetadata>>();\n const [tokensLoading, setTokensLoading] = useState<boolean>(true);\n\n useEffect(() => {\n const fetchTokens = async () => {\n const tokens = await getTokens(reload);\n setTokens(tokens);\n setTokensLoading(false);\n };\n fetchTokens();\n }, [reload]);\n\n return { tokens, tokensLoading };\n};\n\nexport const useTokensIndexer = ({\n defaultTokenList,\n AccountId,\n}: {\n defaultTokenList?: TokenMetadata[];\n AccountId?: string;\n}) => {\n const [tokens, setTokens] = useState<TokenMetadata[]>([]);\n\n const [tokenLoading, setTokenLoading] = useState<boolean>(false);\n\n useEffect(() => {\n setTokenLoading(true);\n\n const getTokensList = async () => {\n const whiteList = await getGlobalWhitelist();\n const globalWhiteListTokens = (\n await getWhiteListTokensIndexer(whiteList)\n ).filter(token => !!token) as TokenMetadata[];\n\n const parsedTokens = globalWhiteListTokens.map(t => {\n return t.id === WRAP_NEAR_CONTRACT_ID\n ? {\n ...NEAR_META_DATA,\n id: t.id,\n }\n : t;\n });\n\n if (!defaultTokenList || defaultTokenList.length === 0) {\n setTokens(parsedTokens);\n setTokenLoading(false);\n } else {\n const newList = defaultTokenList\n .map(t => {\n return t.id === WRAP_NEAR_CONTRACT_ID\n ? {\n ...NEAR_META_DATA,\n id: t.id,\n }\n : t;\n })\n .filter(t => {\n return parsedTokens.findIndex(p => p.id === t.id) !== -1;\n });\n setTokens(\n newList.map(t =>\n !t.icon || REPLACE_TOKENS.includes(t.id)\n ? {\n ...t,\n icon: metaIconDefaults[t.id],\n }\n : t\n )\n );\n setTokenLoading(false);\n }\n };\n\n getTokensList();\n }, [AccountId, defaultTokenList]);\n\n return { tokens, tokenLoading };\n};\n\nexport const useRefPools = (refreshTrigger: boolean) => {\n const [allPools, setAllPools] = useState<{\n simplePools: Pool[];\n ratedPools: Pool[];\n unRatedPools: Pool[];\n }>({\n simplePools: [],\n ratedPools: [],\n unRatedPools: [],\n });\n\n const [poolFetchingState, setPoolFetchingState] = useState<'loading' | 'end'>(\n 'loading'\n );\n\n const [allStablePools, setAllStablePools] = useState<StablePool[]>([]);\n\n useEffect(() => {\n setPoolFetchingState('loading');\n\n fetchAllPools()\n .then(allPools => {\n setAllPools(allPools);\n\n return allPools;\n })\n .then(allPools => {\n const pools: Pool[] = allPools.unRatedPools.concat(allPools.ratedPools);\n\n return getStablePools(pools).then(setAllStablePools);\n })\n .finally(() => {\n setPoolFetchingState('end');\n });\n }, [refreshTrigger]);\n\n return {\n allPools,\n allStablePools,\n poolFetchingState,\n };\n};\n\nexport const useSwap = (\n params: {\n tokenIn?: TokenMetadata;\n tokenOut?: TokenMetadata;\n amountIn: string;\n simplePools: Pool[];\n options?: SwapOptions;\n } & {\n slippageTolerance: number;\n refreshTrigger: boolean;\n onSwap: (transactionsRef: Transaction[]) => void;\n AccountId?: string;\n poolFetchingState?: 'loading' | 'end';\n referralId?: string;\n }\n): SwapOutParams => {\n const {\n slippageTolerance,\n refreshTrigger,\n onSwap,\n AccountId,\n poolFetchingState,\n referralId,\n ...swapParams\n } = params;\n\n const { tokenIn, tokenOut, amountIn } = params;\n\n const [estimates, setEstimates] = useState<EstimateSwapView[]>([]);\n\n const [canSwap, setCanSwap] = useState(false);\n\n const [swapError, setSwapError] = useState<Error | null>(null);\n\n const [amountOut, setAmountOut] = useState<string>('');\n\n const [isEstimating, setIsEstimating] = useState<boolean>(false);\n\n const [forceEstimate, setForceEstimate] = useState<boolean>(false);\n\n const minAmountOut = amountOut\n ? percentLess(slippageTolerance, amountOut)\n : '';\n\n const fee =\n !params.tokenOut || !params.tokenIn\n ? 0\n : getAvgFee(\n estimates,\n params.tokenOut.id,\n toNonDivisibleNumber(params.tokenIn.decimals, params.amountIn)\n );\n\n const rate = calculateExchangeRate(\n ONLY_ZEROS.test(params.amountIn) ? '1' : params.amountIn,\n amountOut || '1'\n );\n\n const makeSwap = async () => {\n if (!params.tokenIn || !params.tokenOut) return;\n\n const transactionsRef = await instantSwap({\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n swapTodos: estimates,\n slippageTolerance,\n AccountId: AccountId || '',\n referralId,\n });\n if (tokenIn && tokenIn.id === WRAP_NEAR_CONTRACT_ID) {\n transactionsRef.splice(-1, 0, nearDepositTransaction(amountIn));\n }\n if (tokenOut && tokenOut.id === WRAP_NEAR_CONTRACT_ID) {\n let outEstimate = new Big(0);\n const routes = separateRoutes(estimates, tokenOut.id);\n\n const bigEstimate = routes.reduce((acc, cur) => {\n const curEstimate = cur[cur.length - 1].estimate;\n return acc.plus(curEstimate);\n }, outEstimate);\n\n const minAmountOut = percentLess(\n slippageTolerance,\n\n scientificNotationToString(bigEstimate.toString())\n );\n\n transactionsRef.push(nearWithdrawTransaction(minAmountOut));\n }\n\n onSwap(transactionsRef);\n };\n\n const getEstimate = () => {\n if (\n !params.tokenIn ||\n !params.tokenOut ||\n poolFetchingState === 'loading'\n ) {\n setCanSwap(false);\n return;\n }\n setCanSwap(false);\n\n if (\n ONLY_ZEROS.test(params.amountIn) ||\n !params.tokenOut ||\n !params.tokenIn\n ) {\n setAmountOut('');\n setEstimates([]);\n return;\n }\n\n setSwapError(null);\n setIsEstimating(true);\n estimateSwap({\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n simplePools: params.simplePools,\n options: params.options,\n })\n .then(estimates => {\n if (\n ONLY_ZEROS.test(params.amountIn) ||\n !params.tokenOut ||\n !params.tokenIn\n ) {\n setAmountOut('');\n return;\n }\n setSwapError(null);\n\n const expectAmountOut = getExpectedOutputFromSwapTodos(\n estimates,\n params.tokenOut.id\n ).toString();\n\n setAmountOut(expectAmountOut);\n\n setEstimates(estimates);\n setCanSwap(true);\n })\n .catch(e => {\n setSwapError(e);\n setCanSwap(false);\n setAmountOut('');\n })\n .finally(() => {\n setIsEstimating(false);\n setForceEstimate(false);\n });\n };\n\n useEffect(() => {\n const estimateValidationPass =\n estimates.length > 0 &&\n params.tokenIn &&\n params.tokenOut &&\n estimateValidator(\n estimates,\n params.tokenIn,\n toNonDivisibleNumber(params.tokenIn.decimals, params.amountIn),\n params.tokenOut\n );\n\n if (isEstimating && estimates && !forceEstimate) return;\n if ((estimateValidationPass || swapError) && !forceEstimate) return;\n getEstimate();\n }, [\n params.amountIn,\n params.tokenIn?.id,\n params.tokenOut?.id,\n refreshTrigger,\n poolFetchingState,\n isEstimating,\n forceEstimate,\n ]);\n\n useEffect(() => {\n // setEstimating(false);\n\n setForceEstimate(true);\n }, [\n params.tokenIn?.id,\n params.tokenOut?.id,\n params.options?.enableSmartRouting,\n ]);\n\n return {\n amountOut,\n minAmountOut,\n fee,\n rate,\n estimates,\n makeSwap,\n canSwap,\n swapError,\n setAmountOut,\n isEstimating,\n };\n};\n\nexport const TokenPriceContext = createContext<Record<string, any> | null>(\n null\n);\n\nexport const useTokenPriceList = () => {\n const [tokenPriceList, setTokenPriceList] = useState<Record<string, any>>({});\n\n useEffect(() => {\n getTokenPriceList().then(setTokenPriceList);\n }, []);\n\n return tokenPriceList;\n};\n\nexport const TokenPriceContextProvider: React.FC = ({ children }) => {\n const tokenPriceList = useTokenPriceList();\n\n return (\n <TokenPriceContext.Provider value={tokenPriceList}>\n {children}\n </TokenPriceContext.Provider>\n );\n};\n\nexport const useTokenBalnces = (tokens: TokenMetadata[], AccountId: string) => {\n const [balances, setBalances] = useState<Record<string, string>>({});\n\n useEffect(() => {\n const validTokens = tokens.filter(t => !!t?.id);\n\n const ids = validTokens.map(token => token.id);\n\n Promise.all(\n ids.map(id =>\n ftGetBalance(id === WRAP_NEAR_CONTRACT_ID ? 'NEAR' : id, AccountId)\n )\n ).then(balances => {\n const balancesMap = validTokens.reduce((acc, token, index) => {\n return {\n ...acc,\n [token.id]: toReadableNumber(token.decimals, balances[index]),\n };\n }, {});\n\n setBalances(balancesMap);\n });\n }, [tokens.map(t => t?.id).join('-')]);\n\n return balances;\n};\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import React, { useState, useEffect, useContext, useRef, useMemo } from 'react';\nimport { TokenMetadata, EstimateSwapView, Pool } from '../types';\nimport {\n ThemeContext,\n useTokenPriceList,\n TokenPriceContext,\n useTokenBalnces,\n} from './state';\n\nimport { FiChevronDown } from '@react-icons/all-files/fi/FiChevronDown';\n\nimport { FiChevronLeft } from '@react-icons/all-files/fi/FiChevronLeft';\n\nimport { FiChevronUp } from '@react-icons/all-files/fi/FiChevronUp';\n\nimport { FaSearch } from '@react-icons/all-files/fa/FaSearch';\n\nimport { RiRefreshLine } from '@react-icons/all-files/ri/RiRefreshLine';\n\nimport { TiArrowSortedUp } from '@react-icons/all-files/ti/TiArrowSortedUp';\n\nimport { TiArrowSortedDown } from '@react-icons/all-files/ti/TiArrowSortedDown';\n\nimport { HiOutlineExternalLink } from '@react-icons/all-files/hi/HiOutlineExternalLink';\n\nimport { AiFillPushpin } from '@react-icons/all-files/ai/AiFillPushpin';\n\nimport { AiOutlinePushpin } from '@react-icons/all-files/ai/AiOutlinePushpin';\n\nimport { RiExchangeFill } from '@react-icons/all-files/ri/RiExchangeFill';\n\nimport { IoWarning } from '@react-icons/all-files/io5/IoWarning';\n\nimport { IoCloseOutline } from '@react-icons/all-files/io5/IoCloseOutline';\n\nimport { AiOutlineClose } from '@react-icons/all-files/ai/AiOutlineClose';\n\nimport './style.css';\nimport {\n getAccountName,\n symbolsArr,\n multiply,\n percentOfBigNumber,\n ONLY_ZEROS,\n toRealSymbol,\n toPrecision,\n toInternationalCurrencySystemLongString,\n calculateFeeCharge,\n calculateFeePercent,\n} from '../utils';\nimport { REF_WIDGET_STAR_TOKEN_LIST_KEY } from './constant';\nimport Big from 'big.js';\nimport {\n config,\n FEE_DIVISOR,\n getConfig,\n NEAR_META_DATA,\n TokenLinks,\n WRAP_NEAR_CONTRACT_ID,\n} from '../constant';\nimport {\n scientificNotationToString,\n percent,\n getPoolAllocationPercents,\n} from '../utils';\nimport {\n REF_WIDGET_SWAP_DETAIL_KEY,\n DEFAULT_START_TOKEN_LIST_TESTNET,\n DEFAULT_START_TOKEN_LIST_MAINNET,\n} from './constant';\nimport { PoolMode } from '../v1-swap/swap';\nimport { isMobile, separateRoutes, divide, getMax } from '../utils';\n\ninterface TokenAmountProps {\n balance?: string;\n reloading?: JSX.Element;\n token?: TokenMetadata;\n onSelectToken: () => void;\n amount: string;\n onChangeAmount?: (amount: string) => void;\n price?: string;\n onForceUpdate?: () => void;\n poolFetchingState?: 'loading' | 'end';\n}\n\nexport const getPriceImpact = (\n value: string,\n tokenIn: TokenMetadata,\n tokenInAmount: string\n) => {\n const textColor =\n Number(value) <= 1\n ? 'text-greenLight'\n : 1 < Number(value) && Number(value) <= 2\n ? 'text-warn'\n : 'text-error';\n\n const displayValue = scientificNotationToString(\n multiply(tokenInAmount || '0', divide(value, '100'))\n );\n\n const tokenInInfo =\n Number(displayValue) <= 0\n ? ` / 0 ${toRealSymbol(tokenIn.symbol)}`\n : ` / -${toInternationalCurrencySystemLongString(\n displayValue,\n 3\n )} ${toRealSymbol(tokenIn.symbol)}`;\n\n if (Number(value) < 0.01)\n return (\n <span className=\"text-greenLight\">\n {`< -0.01%`}\n {tokenInInfo}\n </span>\n );\n\n if (Number(value) > 1000)\n return (\n <span className=\"text-error\">\n {`< -1000%`}\n {tokenInInfo}\n </span>\n );\n\n return (\n <span className={`${textColor} font-sans`}>\n {`≈ -${toPrecision(value, 2)}%`}\n {tokenInInfo}\n </span>\n );\n};\n\nexport const SmartRouteV2 = ({\n tokens: tokensRaw,\n p,\n pools,\n}: {\n tokens: TokenMetadata[];\n p: string;\n pools: Pool[];\n}) => {\n const theme = useContext(ThemeContext);\n\n const tokens = tokensRaw.map(t =>\n t.id === WRAP_NEAR_CONTRACT_ID\n ? { ...NEAR_META_DATA, id: WRAP_NEAR_CONTRACT_ID }\n : t\n );\n\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n iconDefault,\n iconHover,\n } = theme;\n\n const ParaTokenFrom = ({\n tokenIn,\n p,\n }: {\n tokenIn: TokenMetadata;\n p: string;\n }) => {\n return (\n <div\n className=\"__ref-swap-widget-row-flex-center \"\n style={{\n width: '60px',\n }}\n >\n <span\n style={{\n marginRight: '4px',\n }}\n >\n {p}%\n </span>\n <span className=\"\">\n <Icon token={tokenIn} />\n </span>\n </div>\n );\n };\n const Icon = ({ token }: { token: TokenMetadata }) => {\n if (token.icon) {\n return (\n <img\n src={token.icon}\n alt=\"\"\n style={{\n borderRadius: '100%',\n height: '16px',\n width: '16px',\n flexShrink: 0,\n }}\n />\n );\n } else {\n return (\n <div\n style={{\n borderRadius: '100%',\n height: '16px',\n width: '16px',\n }}\n />\n );\n }\n };\n const Hub = ({ token, poolId }: { token: TokenMetadata; poolId: number }) => {\n return (\n <div\n className={`__ref-swap-widget-row-flex-center`}\n style={{\n width: '62px',\n height: '22px',\n }}\n >\n <div\n className={`w-full flex items-center justify-start pl-2 `}\n style={{\n marginRight: '4px',\n }}\n >\n <span className=\"text-gray-400\">{`#${poolId}`}</span>\n </div>\n <Icon token={token} />\n </div>\n );\n };\n\n if (tokens.length === 3) {\n return (\n <div className=\"__ref-swap-widget-row-flex-center __ref-swap-widget-swap_route_row\">\n {/* <Hub token={tokens[0]} /> */}\n\n <ParaTokenFrom tokenIn={tokens[0]} p={p} />\n <div\n className=\"\"\n style={{\n position: 'relative',\n bottom: '1px',\n }}\n >\n <ArrowRight />\n </div>\n\n <Hub token={tokens[1]} poolId={pools?.[0]?.id} />\n <div\n className=\"px-3\"\n style={{\n position: 'relative',\n bottom: '1px',\n }}\n >\n <ArrowRight />\n </div>\n\n <Hub token={tokens[2]} poolId={pools?.[1]?.id} />\n </div>\n );\n } else if (tokens.length === 2) {\n return (\n <div className=\"__ref-swap-widget-row-flex-center __ref-swap-widget-swap_route_row\">\n <ParaTokenFrom tokenIn={tokens[0]} p={p} />\n <div className=\"px-3\">\n <ArrowRight />\n </div>\n <Hub token={tokens[1]} poolId={pools?.[0]?.id} />\n </div>\n );\n } else {\n return null;\n }\n};\n\nexport const DetailView = ({\n tokenIn,\n tokenOut,\n rate,\n fee,\n minReceived,\n amountIn,\n amountOut,\n priceImpact,\n estimates,\n}: {\n tokenIn: TokenMetadata | undefined;\n tokenOut: TokenMetadata | undefined;\n rate: string;\n fee: number;\n minReceived: string;\n amountIn: string;\n amountOut: string;\n priceImpact: string;\n estimates: EstimateSwapView[];\n}) => {\n const theme = useContext(ThemeContext);\n\n const storagedOpen = !!localStorage.getItem(REF_WIDGET_SWAP_DETAIL_KEY);\n\n const [showDetail, setShowDetail] = useState(storagedOpen || false);\n const [isRateReverse, setIsRateReverse] = useState(false);\n\n const tokensPerRoute = estimates\n .filter(swap => swap.inputToken === tokenIn?.id)\n .map(swap => swap.tokens);\n\n const identicalRoutes = separateRoutes(\n estimates,\n estimates[estimates.length - 1]?.outputToken || ''\n );\n\n const pools = identicalRoutes.map(r => r[0]).map(hub => hub.pool);\n const percents = useMemo(() => {\n if (!pools || pools.length === 0) return [];\n return getPoolAllocationPercents(pools);\n }, [pools]);\n\n const priceImpactDisplay = useMemo(() => {\n if (!priceImpact || !tokenIn || !amountIn) return null;\n return getPriceImpact(priceImpact, tokenIn, amountIn);\n }, [priceImpact, tokenIn, amountIn]);\n if (!tokenIn || !tokenOut) return null;\n\n const displayRate = `1 ${toRealSymbol(tokenIn.symbol)} ≈ ${\n Number(rate) < 0.01 ? '< 0.01' : toPrecision(rate, 2)\n } ${toRealSymbol(tokenOut.symbol)}`;\n\n const revertRate = new Big(1).div(ONLY_ZEROS.test(rate) ? '1' : rate || '1');\n\n const revertDisplayRate = `1 ${toRealSymbol(tokenOut.symbol)} ≈ ${\n Number(revertRate) < 0.01 ? '< 0.01' : toPrecision(revertRate.toString(), 2)\n } ${toRealSymbol(tokenIn.symbol)}`;\n\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n iconDefault,\n iconHover,\n } = theme;\n\n return (\n <div\n className=\"__ref-widget-swap-detail-view __ref-swap-widget-col-flex-start\"\n style={{\n color: secondary,\n }}\n >\n <div className=\"__ref-swap-widget-row-flex-center __ref-swap-widget-swap-detail-view-item\">\n <div\n style={{\n color: primary,\n cursor: 'pointer',\n }}\n className=\"__ref-swap-widget-row-flex-center\"\n onClick={() => {\n if (showDetail) localStorage.removeItem(REF_WIDGET_SWAP_DETAIL_KEY);\n else {\n localStorage.setItem(REF_WIDGET_SWAP_DETAIL_KEY, '1');\n }\n setShowDetail(!showDetail);\n }}\n >\n <div>Detail</div>\n <div\n style={{\n position: 'relative',\n }}\n >\n {!showDetail ? <FiChevronDown /> : <FiChevronUp />}\n </div>\n </div>\n\n {amountIn && amountOut && (\n <div className=\"__ref-swap-widget-row-flex-center\">\n <div>{isRateReverse ? revertDisplayRate : displayRate}</div>\n\n <RiExchangeFill\n onClick={() => {\n setIsRateReverse(!isRateReverse);\n }}\n size={16}\n style={{\n marginLeft: '4px',\n cursor: 'pointer',\n }}\n fill={iconDefault}\n />\n </div>\n )}\n </div>\n {!showDetail ? null : (\n <>\n <div className=\"__ref-swap-widget-row-flex-center __ref-swap-widget-swap-detail-view-item\">\n <div>Minimum received</div>\n <div>{toPrecision(minReceived || '0', 8)}</div>\n </div>\n\n <div className=\"__ref-swap-widget-row-flex-center __ref-swap-widget-swap-detail-view-item\">\n <div>Fee</div>\n\n <div>\n {!amountIn\n ? '0'\n : `${calculateFeeCharge(fee, amountIn)} ${toRealSymbol(\n tokenIn.symbol\n )}(${toPrecision(calculateFeePercent(fee).toString(), 2)}%)`}\n </div>\n </div>\n </>\n )}\n\n {!showDetail ? null : (\n <>\n <div className=\"__ref-swap-widget-row-flex-center __ref-swap-widget-swap-detail-view-item\">\n <div>Price impact</div>\n\n <div>{priceImpactDisplay}</div>\n </div>\n </>\n )}\n\n {estimates && estimates.length > 1 && showDetail && (\n <div\n className=\"__ref-swap-widget-swap_routes __ref-swap-widget-row-flex-center\"\n style={{\n border: `1px solid ${borderColor}`,\n flexDirection: isMobile() ? 'column' : 'row',\n position: 'relative',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n }}\n >\n <div className=\"__ref-swap-widget-row-flex-center\">\n <RouterIcon />\n <span\n className=\"__ref-swap-widget-valueStyle\"\n style={{\n marginLeft: '4px',\n whiteSpace: 'nowrap',\n }}\n >\n {'Auto Router'}\n </span>\n </div>\n\n <div\n className=\"\"\n style={{\n width: isMobile() ? '100%' : 'auto',\n minWidth: !isMobile() ? '70%' : '',\n }}\n >\n {tokensPerRoute.every(r => !!r) &&\n tokensPerRoute.map((tokens, index) => {\n if (!tokens) return null;\n return (\n <SmartRouteV2\n key={index + '-swap-route'}\n tokens={tokens}\n p={percents[index]}\n pools={identicalRoutes[index].map(hub => hub.pool)}\n />\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport const HalfAndMaxAmount = ({\n max,\n onChangeAmount,\n token,\n amount,\n}: {\n max: string;\n token: TokenMetadata;\n onChangeAmount: (amount: string) => void;\n amount: string;\n}) => {\n const halfValue = percentOfBigNumber(50, max, token.decimals);\n\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n } = theme;\n\n const [hoverHalf, setHoverHalf] = useState<boolean>(false);\n const [hoverMax, setHoverMax] = useState<boolean>(false);\n\n return (\n <div className=\"__ref-swap-widget-token-amount_quick_selector __ref-swap-widget-row-flex-center\">\n <span\n className=\"__ref-swap-widget-token-amount_quick_selector_item \"\n style={{\n color: secondary,\n borderRadius,\n border: `1px solid ${borderColor}`,\n marginRight: '4px',\n\n background:\n amount === halfValue && !ONLY_ZEROS.test(halfValue)\n ? active\n : hoverHalf\n ? hover\n : 'transparent',\n }}\n onMouseEnter={() => setHoverHalf(true)}\n onMouseLeave={() => setHoverHalf(false)}\n onClick={() => {\n const half = percentOfBigNumber(50, max, token.decimals);\n\n onChangeAmount(half);\n }}\n >\n Half\n </span>\n\n <span\n className=\"__ref-swap-widget-token-amount_quick_selector_item\"\n onClick={() => {\n onChangeAmount(max);\n }}\n onMouseEnter={() => setHoverMax(true)}\n onMouseLeave={() => setHoverMax(false)}\n style={{\n color: secondary,\n borderRadius,\n border: `1px solid ${borderColor}`,\n background:\n amount === max && !ONLY_ZEROS.test(max)\n ? active\n : hoverMax\n ? hover\n : 'transparent',\n }}\n >\n Max\n </span>\n </div>\n );\n};\n\nexport const TokenAmount = (props: TokenAmountProps) => {\n const {\n balance,\n reloading,\n token,\n onSelectToken,\n amount,\n onChangeAmount,\n price,\n onForceUpdate,\n poolFetchingState,\n } = props;\n\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n } = theme;\n\n const ref = useRef<HTMLInputElement>(null);\n\n const [hoverSelect, setHoverSelect] = useState<boolean>(false);\n\n const handleChange = (amount: string) => {\n if (onChangeAmount) {\n onChangeAmount(amount);\n }\n if (ref.current) {\n ref.current.value = amount;\n }\n };\n\n useEffect(() => {\n if (\n ref.current &&\n onChangeAmount &&\n token &&\n balance &&\n token.id === WRAP_NEAR_CONTRACT_ID &&\n Number(balance) - Number(ref.current.value) < 0.5\n ) {\n ref.current.setCustomValidity(\n 'Must have 0.5N or more left in wallet for gas fee.'\n );\n } else {\n ref.current?.setCustomValidity('');\n }\n }, [ref, balance, ref.current, ref.current?.value, token, amount]);\n\n const curMax = token ? getMax(token.id, balance || '0') : '0';\n\n return (\n <>\n <div\n className=\"__ref-swap-widger-token-amount \"\n style={{\n background: secondaryBg,\n flexDirection: isMobile() ? 'column' : 'row',\n }}\n >\n <div\n className=\"__ref-swap-widget-row-flex-center\"\n style={{\n width: isMobile() ? 'auto' : '40%',\n }}\n >\n <div\n className=\"__ref-swap-widget-row-flex-center __ref-swap-widget-token-amount_token-select-button\"\n style={{\n color: primary,\n background: hoverSelect ? hover : 'transparent',\n border: `1px solide ${hoverSelect ? borderColor : 'transparent'}`,\n }}\n onClick={onSelectToken}\n onMouseEnter={() => setHoverSelect(true)}\n onMouseLeave={() => setHoverSelect(false)}\n >\n {!token ? (\n <>\n <span\n style={{\n whiteSpace: 'nowrap',\n height: '26px',\n }}\n className=\"__ref-swap-widget-row-flex-center\"\n >\n Select Token\n </span>\n </>\n ) : (\n <>\n <img\n src={token?.icon}\n alt=\"\"\n className=\"__ref-swap-widget_token_icon\"\n style={{\n height: '26px',\n width: '26px',\n marginRight: '8px',\n }}\n />\n <span>{toRealSymbol(token?.symbol)}</span>\n </>\n )}\n <FiChevronDown\n style={{\n marginLeft: '4px',\n flexShrink: 0,\n }}\n />\n </div>\n\n {onForceUpdate && (\n <RiRefreshLine\n className={`${\n poolFetchingState === 'loading'\n ? '__ref-swap-widget-loading '\n : ''\n }`}\n style={{\n cursor: 'pointer',\n color: secondary,\n }}\n size={18}\n onClick={() => {\n onForceUpdate();\n }}\n />\n )}\n </div>\n\n <div\n className=\" __ref-swap-widget-token-amount_input\"\n style={{\n width: isMobile() ? '100%' : '60%',\n }}\n >\n <input\n ref={ref}\n max={!!onChangeAmount ? curMax : undefined}\n min=\"0\"\n onWheel={() => {\n if (ref.current) {\n ref.current.blur();\n }\n }}\n className=\"__ref-swap-widget-input-class\"\n step=\"any\"\n value={amount}\n type=\"number\"\n placeholder={!onChangeAmount ? '-' : '0.0'}\n onChange={({ target }) => {\n target.setCustomValidity('');\n handleChange(target.value);\n }}\n disabled={!onChangeAmount}\n onKeyDown={e => symbolsArr.includes(e.key) && e.preventDefault()}\n style={{\n color: primary,\n marginBottom: '8px',\n width: '100%',\n textAlign: 'right',\n fontSize: '20px',\n }}\n />\n\n <div\n style={{\n fontSize: '12px',\n color: secondary,\n textAlign: 'right',\n }}\n >\n {!price\n ? '$-'\n : '~$' +\n toInternationalCurrencySystemLongString(\n multiply(price, amount || '0'),\n 2\n )}\n </div>\n </div>\n </div>\n\n {!balance || !token || !onChangeAmount ? null : (\n <div\n className=\"__ref-swap-widger-token-amount_balance __ref-swap-widget-row-flex-center\"\n style={{\n fontSize: '12px',\n color: secondary,\n }}\n >\n <span>\n Balance:&nbsp;\n {toPrecision(balance, 2)}\n </span>\n {token && (\n <HalfAndMaxAmount\n token={token}\n max={getMax(token.id, balance)}\n onChangeAmount={handleChange}\n amount={amount}\n />\n )}\n </div>\n )}\n </>\n );\n};\n\nexport const SlippageSelector = ({\n slippageTolerance,\n onChangeSlippageTolerance,\n showSlip,\n setShowSlip,\n}: {\n slippageTolerance: number;\n onChangeSlippageTolerance: (slippageTolerance: number) => void;\n showSlip: boolean;\n setShowSlip: (showSlip: boolean) => void;\n}) => {\n const [invalid, setInValid] = useState<boolean>(false);\n\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n } = theme;\n\n const ref = useRef<HTMLInputElement>(null);\n\n const handleChange = (amount: string) => {\n onChangeSlippageTolerance(Number(amount));\n\n if (Number(amount) > 0 && Number(amount) < 100) {\n setInValid(false);\n } else {\n setInValid(true);\n }\n\n if (ref.current) {\n ref.current.value = amount;\n }\n };\n\n useEffect(() => {\n if (!showSlip) return;\n\n document.onclick = () => setShowSlip(false);\n\n return () => {\n document.onclick = null;\n };\n }, [showSlip, setShowSlip]);\n\n if (!showSlip) return null;\n\n return (\n <div\n className=\"__ref-swap-widget_slippage_selector __ref-swap-widget-col-flex-start\"\n onClick={e => e.stopPropagation()}\n style={{\n background: container,\n border: `1px solid ${borderColor}`,\n }}\n >\n <span\n style={{\n color: primary,\n paddingBottom: '14px',\n }}\n >\n Slippage tolerance\n </span>\n\n <div\n className={`__ref-swap-widget-row-flex-center\n `}\n >\n <div\n className={`__ref-swap-widget-row-flex-center\n __ref-swap-widget_slippage_selector_input_container`}\n style={{\n border: `1px solid ${invalid ? '#FF7575' : borderColor}`,\n borderRadius,\n }}\n >\n <input\n ref={ref}\n max={99.99999}\n min={0.000001}\n defaultValue={slippageTolerance ? slippageTolerance : 0.5}\n onWheel={() => {\n if (ref.current) {\n ref.current.blur();\n }\n }}\n value={slippageTolerance}\n step=\"any\"\n type=\"number\"\n required={true}\n placeholder=\"\"\n onChange={({ target }) => handleChange(target.value)}\n onKeyDown={e => symbolsArr.includes(e.key) && e.preventDefault()}\n style={{\n width: '100%',\n color: invalid ? '#FF7575' : primary,\n }}\n className=\"__ref-swap-widget-input-class\"\n />\n <span className=\"ml-2\">%</span>\n </div>\n\n <button\n className={`__ref-swap-widget_slippage_selector_button __ref-swap-widget-button ${\n isMobile()\n ? '__ref-swap-widget-opacity-active'\n : '__ref-swap-widget-opacity-hover'\n }`}\n style={{\n color: primary,\n background: buttonBg,\n borderRadius,\n }}\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n onChangeSlippageTolerance(0.5);\n setInValid(false);\n }}\n >\n Auto\n </button>\n </div>\n {invalid && (\n <div\n className=\" text-xs py-3 __ref-swap-widget-row-flex-center\"\n style={{\n color: '#FF7575',\n fontSize: '12px',\n padding: '10px 0px',\n alignItems: 'start',\n }}\n >\n <IoWarning\n className=\"\"\n style={{\n marginRight: '4px',\n }}\n size={20}\n />\n <div>{'The slippage tolerance is invalid.'}</div>\n </div>\n )}\n </div>\n );\n};\n\nconst StarToken = ({\n price,\n token,\n onDelete,\n onClick,\n}: {\n token: TokenMetadata;\n price: string;\n onDelete: (token: TokenMetadata) => void;\n onClick: (token: TokenMetadata) => void;\n}) => {\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n iconDefault,\n iconHover,\n } = theme;\n\n const [hoverIcon, setHoverIcon] = useState(false);\n\n const [hoverClose, setHoverClose] = useState(false);\n\n return (\n <div\n className=\"__ref-swap-widget_star_token __ref-swap-widget-row-flex-center\"\n onMouseEnter={() => setHoverIcon(true)}\n onMouseLeave={() => setHoverIcon(false)}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n onClick(token);\n }}\n style={{\n background: hoverIcon ? hover : 'transparent',\n border: `1px solid ${borderColor}`,\n }}\n >\n {hoverIcon && (\n <div\n style={{\n position: 'absolute',\n top: '-4px',\n right: '-4px',\n boxShadow: '0px 0px 2px rgba(0, 0, 0, 0.25)',\n border: `1px solid ${borderColor}`,\n borderRadius: '100%',\n width: '16px',\n height: '16px',\n background: '#E3E3E3',\n }}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n onDelete(token);\n }}\n onMouseEnter={() => setHoverClose(true)}\n onMouseLeave={() => setHoverClose(false)}\n >\n <IoCloseOutline stroke={hoverClose ? 'black' : '#7e8a93'} />\n </div>\n )}\n\n <img\n src={token.icon}\n alt=\"\"\n className=\"__ref-swap-widget_token_icon\"\n style={{\n height: '26px',\n width: '26px',\n marginRight: '2px',\n }}\n />\n\n <div className=\"__ref-swap-widget-col-flex-start\">\n <span\n style={{\n fontSize: '14px',\n color: primary,\n }}\n >\n {toRealSymbol(token.symbol)}\n </span>\n\n <span\n style={{\n fontSize: '10px',\n color: secondary,\n }}\n >\n {!price\n ? '$-'\n : '$' + toInternationalCurrencySystemLongString(price, 2)}\n </span>\n </div>\n </div>\n );\n};\n\ninterface TokenProps {\n token: TokenMetadata;\n onClick: (token: TokenMetadata) => void;\n onClickPin: (token: TokenMetadata) => void;\n balance: string;\n price?: string;\n isSticky?: boolean;\n index: number;\n setHoverIndex: (index: number) => void;\n hoverIndex: number;\n}\n\nconst Token = ({\n token,\n onClick,\n price,\n balance,\n isSticky,\n onClickPin,\n index,\n setHoverIndex,\n hoverIndex,\n}: TokenProps) => {\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n iconDefault,\n iconHover,\n } = theme;\n\n const displayBalance =\n 0 < Number(balance) && Number(balance) < 0.001\n ? '< 0.001'\n : toPrecision(String(balance), 3);\n\n const [hoverOutLink, setHoverOutLink] = useState(false);\n\n const [hoverPin, setHoverPin] = useState(false);\n\n return (\n <div\n className=\"__ref-swap-widget_token-selector-token-list-item __ref-swap-widget-row-flex-center\"\n style={{\n background: hoverIndex === index ? hover : 'transparent',\n }}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n onClick(token);\n }}\n onMouseEnter={() => setHoverIndex(index)}\n onMouseLeave={() => setHoverIndex(-1)}\n >\n <div\n className=\"__ref-swap-widget-row-flex-center\"\n style={{\n justifyContent: 'space-between',\n }}\n >\n <img\n src={token.icon}\n alt=\"\"\n className=\"__ref-swap-widget_token_icon\"\n style={{\n height: '36px',\n width: '36px',\n marginRight: '10px',\n }}\n />\n\n <div className=\"__ref-swap-widget-col-flex-start\">\n <span\n style={{\n fontSize: '14px',\n color: primary,\n }}\n className=\"__ref-swap-widget-row-flex-center\"\n >\n {toRealSymbol(token.symbol)}\n\n {TokenLinks[token.symbol] && (\n <HiOutlineExternalLink\n onMouseEnter={() => setHoverOutLink(true)}\n onMouseLeave={() => setHoverOutLink(false)}\n style={{\n marginLeft: '4px',\n marginTop: '2px',\n }}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n window.open(TokenLinks[token.symbol], '_blank');\n }}\n stroke={hoverOutLink ? iconHover : iconDefault}\n />\n )}\n </span>\n\n <span\n style={{\n fontSize: '10px',\n color: secondary,\n marginTop: '2px',\n }}\n >\n {!price\n ? '$-'\n : '$' + toInternationalCurrencySystemLongString(price, 2)}\n </span>\n </div>\n </div>\n\n <div\n className=\"__ref-swap-widget-row-flex-center\"\n style={{\n color: primary,\n }}\n >\n {displayBalance}\n\n {isSticky ? (\n <AiFillPushpin\n onMouseEnter={() => setHoverPin(true)}\n onMouseLeave={() => setHoverPin(false)}\n fill={hoverPin && hoverIndex === index ? iconHover : iconDefault}\n style={{\n marginLeft: '10px',\n cursor: 'pointer',\n }}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n onClickPin(token);\n }}\n />\n ) : (\n <AiOutlinePushpin\n style={{\n marginLeft: '10px',\n cursor: 'pointer',\n }}\n onMouseEnter={() => setHoverPin(true)}\n onMouseLeave={() => setHoverPin(false)}\n fill={hoverPin && hoverIndex === index ? iconHover : iconDefault}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n onClickPin(token);\n }}\n />\n )}\n </div>\n </div>\n );\n};\n\ninterface TokenListProps {\n tokens: TokenMetadata[];\n onClick: (token: TokenMetadata) => void;\n balances: { [tokenId: string]: string };\n tokenPriceList: Record<string, any> | null;\n starList: string[];\n setStarList: (starList: string[]) => void;\n onDelete: (token: TokenMetadata) => void;\n}\n\nexport const TokenListTable = ({\n tokens,\n onClick,\n balances,\n tokenPriceList,\n starList,\n setStarList,\n onDelete,\n}: TokenListProps) => {\n const [currentSort, setCurrentSort] = useState('down');\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n iconDefault,\n iconHover,\n } = theme;\n\n const onClickPin = (token: TokenMetadata) => {\n if (starList.includes(token.id)) {\n onDelete(token);\n } else {\n const newList = [...starList, token.id];\n setStarList(newList);\n }\n };\n\n const [hoverIndex, setHoverIndex] = useState(-1);\n\n const tokenSorting = (a: TokenMetadata, b: TokenMetadata) => {\n const b1 = balances[a.id];\n const b2 = balances[b.id];\n\n if (currentSort === 'up') {\n return Number(b1) - Number(b2);\n } else return Number(b2) - Number(b1);\n };\n\n return !tokens || tokens.length === 0 ? null : (\n <div className=\"__ref-swap-widget_token_list_table\">\n <div\n className=\"__ref-swap-widget_token_list_table_header\"\n style={{\n color: secondary,\n borderBottom: `1px solid ${borderColor}`,\n }}\n >\n <span className=\"\">Asset</span>\n\n <span\n onClick={() => {\n setCurrentSort(currentSort === 'up' ? 'down' : 'up');\n }}\n style={{\n cursor: 'pointer',\n }}\n className=\"__ref-swap-widget-row-flex-center\"\n >\n <span className=\"ml-1\">Balance</span>\n {currentSort === 'up' ? <TiArrowSortedUp /> : <TiArrowSortedDown />}\n </span>\n </div>\n\n <div className=\"__ref-swap-widget_token_list_table_content\">\n {tokens.sort(tokenSorting).map((token, index) => (\n <Token\n key={token.id + '-select-token-list-item-' + index}\n onClick={onClick}\n index={index}\n token={token}\n price={tokenPriceList?.[token.id]?.price}\n balance={balances?.[token.id] || '0'}\n onClickPin={onClickPin}\n isSticky={starList.includes(token.id)}\n setHoverIndex={setHoverIndex}\n hoverIndex={hoverIndex}\n />\n ))}\n </div>\n </div>\n );\n};\n\nexport const TokenSelector = ({\n onSelect,\n width,\n tokens,\n onClose,\n AccountId,\n balances,\n className,\n}: {\n onSelect: (token: TokenMetadata) => void;\n width: string;\n tokens: TokenMetadata[];\n onClose: () => void;\n AccountId: string;\n balances: { [tokenId: string]: string };\n className?: string;\n}) => {\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n iconDefault,\n iconHover,\n } = theme;\n\n const [searchValue, setSearchValue] = useState<string>('');\n\n const tokenPriceList = useContext(TokenPriceContext);\n\n const handleSearch = (value: string) => {\n setSearchValue(value);\n };\n\n const storagedStartList = localStorage.getItem(REF_WIDGET_STAR_TOKEN_LIST_KEY)\n ? JSON.parse(localStorage.getItem(REF_WIDGET_STAR_TOKEN_LIST_KEY) || '[]')\n : null;\n\n const DEFAULT_START_TOKEN_LIST =\n getConfig().networkId === 'testnet'\n ? DEFAULT_START_TOKEN_LIST_TESTNET\n : DEFAULT_START_TOKEN_LIST_MAINNET;\n\n const [starList, setStarList] = useState<string[]>(\n storagedStartList || DEFAULT_START_TOKEN_LIST\n );\n\n const onDelete = (token: TokenMetadata) => {\n const newStarList = starList.filter(starToken => starToken !== token.id);\n\n setStarList(newStarList);\n\n localStorage.setItem(\n REF_WIDGET_STAR_TOKEN_LIST_KEY,\n JSON.stringify(newStarList)\n );\n };\n\n const tableListFilter = (token: TokenMetadata) => {\n if (!searchValue) return true;\n\n const searchValueLower = searchValue.toLowerCase();\n\n return token.symbol?.toLowerCase().includes(searchValueLower) || false;\n };\n\n return (\n <div\n className={`__ref-swap_widget-token_selector __ref-swap-widget-container ${className}`}\n style={{\n position: 'relative',\n width,\n background: container,\n }}\n >\n <FiChevronLeft\n onClick={onClose}\n style={{\n color: primary,\n position: 'absolute',\n cursor: 'pointer',\n }}\n />\n <div\n className=\"__ref-swap-widget-header-title __ref-swap-widget-row-flex-center\"\n style={{\n color: primary,\n justifyContent: 'center',\n paddingBottom: '24px',\n }}\n >\n Select a token\n </div>\n\n <div\n className=\"__ref-swap-widget-select-token_input __ref-swap-widget-row-flex-center\"\n style={{\n border: `1px solid ${buttonBg}`,\n background: secondaryBg,\n }}\n >\n <FaSearch\n fill={iconDefault}\n style={{\n marginRight: '8px',\n }}\n />\n\n <input\n className=\"__ref-swap-widget-input-class\"\n placeholder=\"Search token...\"\n onChange={evt => handleSearch(evt.target.value)}\n style={{\n fontSize: '14px',\n color: primary,\n }}\n />\n </div>\n\n <div className=\"__ref-swap-widget_token-selector-star-tokens __ref-swap-widget-row-flex-center\">\n {starList.map(id => {\n if (!tokens || tokens.length === 0) return null;\n\n const token = tokens.find(token => token.id === id);\n\n return !token ? null : (\n <StarToken\n key={token.id + '-star-token'}\n token={token}\n price={tokenPriceList?.[token.id]?.price}\n onDelete={onDelete}\n onClick={onSelect}\n />\n );\n })}\n </div>\n\n <TokenListTable\n tokens={tokens.filter(tableListFilter)}\n tokenPriceList={tokenPriceList}\n onClick={onSelect}\n balances={balances}\n starList={starList}\n setStarList={starList => {\n setStarList(starList);\n localStorage.setItem(\n REF_WIDGET_STAR_TOKEN_LIST_KEY,\n JSON.stringify(starList)\n );\n }}\n onDelete={onDelete}\n />\n </div>\n );\n};\n\nexport const Slider = ({\n showSlip,\n setShowSlip,\n}: {\n showSlip: boolean;\n setShowSlip: (show: boolean) => void;\n}) => {\n const [hover, setHover] = useState(false);\n\n return (\n <svg\n width=\"17\"\n height=\"17\"\n viewBox=\"0 0 17 17\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n onClick={() => setShowSlip(true)}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12.6957 13.0652C12.6957 14.1338 11.8294 15 10.7609 15C9.69235 15 8.82611 14.1338 8.82611 13.0652C8.82612 11.9967 9.69235 11.1304 10.7609 11.1304C11.8294 11.1304 12.6957 11.9967 12.6957 13.0652ZM14.5749 12.0941C14.6145 12.0894 14.6548 12.0869 14.6957 12.0869L15.9565 12.0869C16.5088 12.0869 16.9565 12.5346 16.9565 13.0869C16.9565 13.6392 16.5088 14.0869 15.9565 14.0869L14.6957 14.0869C14.651 14.0869 14.6071 14.084 14.564 14.0783C14.1171 15.7605 12.5837 17 10.7609 17C8.93806 17 7.40472 15.7605 6.95777 14.0783C6.91471 14.084 6.87078 14.0869 6.82617 14.0869L1.00009 14.0869C0.447802 14.0869 8.61245e-05 13.6392 8.61728e-05 13.0869C8.62211e-05 12.5346 0.447802 12.0869 1.00009 12.0869L6.82617 12.0869C6.86702 12.0869 6.90729 12.0894 6.94686 12.0941C7.37926 10.3906 8.92291 9.13044 10.7609 9.13044C12.5989 9.13044 14.1425 10.3906 14.5749 12.0941ZM4.26086 3.93478C4.26086 2.86623 5.1271 2 6.19565 2C7.2642 2 8.13043 2.86623 8.13043 3.93478C8.13043 5.00333 7.2642 5.86957 6.19565 5.86957C5.1271 5.86956 4.26086 5.00333 4.26086 3.93478ZM6.19565 9.66601e-07C4.3728 8.07243e-07 2.83946 1.23952 2.39252 2.92168C2.34944 2.91601 2.3055 2.91309 2.26087 2.91309L0.999999 2.91309C0.447715 2.91309 -7.14972e-07 3.3608 -7.63254e-07 3.91309C-8.11537e-07 4.46537 0.447715 4.91309 0.999999 4.91309L2.26087 4.91309C2.30173 4.91309 2.34202 4.91063 2.3816 4.90587C2.81401 6.60936 4.35766 7.86956 6.19565 7.86957C8.03363 7.86957 9.57728 6.60936 10.0097 4.90588C10.0493 4.91064 10.0895 4.91309 10.1304 4.91309L15.9565 4.91309C16.5087 4.91309 16.9565 4.46537 16.9565 3.91309C16.9565 3.3608 16.5087 2.91309 15.9565 2.91309L10.1304 2.91309C10.0858 2.91309 10.0418 2.91601 9.99877 2.92167C9.55182 1.23952 8.01849 1.12596e-06 6.19565 9.66601e-07Z\"\n fill={hover || showSlip ? '#00C6A2' : '#7E8A93'}\n />\n </svg>\n );\n};\n\nexport const RefIcon = (props: any) => {\n return (\n <svg\n {...props}\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M6.36365 10H10L6.36365 6.36363V10Z\" fill=\"currentColor\" />\n <path\n d=\"M10 4.05312e-06L7.87879 3.86767e-06L10 2.12122L10 4.05312e-06Z\"\n fill=\"#00C6A2\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.51531 6.36364C6.46444 6.36364 6.41387 6.36232 6.36365 6.35971V4.08371L8.83901 1.78516C9.18802 2.26148 9.3941 2.8491 9.3941 3.48485C9.3941 5.07476 8.10522 6.36364 6.51531 6.36364ZM8.19255 1.14486L6.36365 2.84313V0.60999C6.41387 0.607383 6.46444 0.606064 6.51531 0.606064C7.14111 0.606064 7.72027 0.805743 8.19255 1.14486Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.06046 0.606064H3.33319V3.29661L4.55696 4.52039L6.06046 3.12428V0.606064ZM6.06046 4.36486L4.5336 5.78267L3.33319 4.58226V10H6.06046V4.36486Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3.0303 0.606064H0V4.50881L2.27284 2.23598L3.0303 2.99344V0.606064ZM3.0303 4.27909L2.27284 3.52162L0 5.79446V10H3.0303V4.27909Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n\nexport const Loading = () => {\n return (\n <svg\n width=\"38\"\n height=\"38\"\n viewBox=\"0 0 38 38\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"__ref-swap-widget-loading\"\n >\n <circle\n cx=\"19\"\n cy=\"19\"\n r=\"16\"\n stroke=\"#EEEEEE\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M19 35C27.8366 35 35 27.8366 35 19C35 10.1634 27.8366 3 19 3C10.1634 3 3 10.1634 3 19\"\n stroke=\"#00C6A2\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n};\n\nexport const Warning = () => {\n return (\n <svg\n width=\"49\"\n height=\"49\"\n viewBox=\"0 0 49 49\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21.0359 5.99999C22.5755 3.33333 26.4245 3.33333 27.9641 6L42.2535 30.75C43.7931 33.4167 41.8686 36.75 38.7894 36.75H10.2106C7.13137 36.75 5.20688 33.4167 6.74648 30.75L21.0359 5.99999Z\"\n stroke=\"#FF689E\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"24\"\n y1=\"14\"\n x2=\"24\"\n y2=\"24\"\n stroke=\"#FF689E\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"24\" cy=\"30\" r=\"2\" fill=\"#FF689E\" />\n </svg>\n );\n};\n\nexport const Success = () => {\n return (\n <div\n style={{\n position: 'relative',\n height: '32px',\n width: '32px',\n }}\n >\n <svg\n width=\"38\"\n height=\"38\"\n viewBox=\"0 0 38 38\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n <circle\n cx=\"19\"\n cy=\"19\"\n r=\"16\"\n stroke=\"#EEEEEE\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n </svg>\n\n <svg\n width=\"30\"\n height=\"23\"\n viewBox=\"0 0 30 23\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n position: 'absolute',\n top: 4,\n left: 4,\n }}\n >\n <path\n d=\"M2 11.2727L10.4898 20L28 2\"\n stroke=\"#00C6A2\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n </div>\n );\n};\n\nexport const RouterIcon = () => {\n return (\n <svg\n width=\"16\"\n height=\"12\"\n viewBox=\"0 0 16 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"mr-2\"\n >\n <path\n d=\"M13.4862 6.25488C12.2813 6.25488 11.2485 7.10159 11.019 8.28698H6.02703L4.7647 7.21448C4.93684 6.8758 5.05159 6.48067 5.10897 6.0291C5.10897 5.52107 4.93684 4.9566 4.59257 4.56147L6.02703 3.1503H11.0763C11.478 4.44858 12.8551 5.23884 14.1748 4.84371C15.4945 4.44858 16.2978 3.09385 15.8961 1.79557C15.4945 0.497295 14.1174 -0.292963 12.7977 0.102166C11.937 0.327954 11.3059 1.00532 11.0763 1.79557H5.51062L3.50237 3.77122C3.21548 3.65832 2.92859 3.60188 2.58432 3.60188C1.20723 3.54543 0.0596573 4.61792 0.00227872 5.97265C-0.0550999 7.32738 0.977715 8.45632 2.3548 8.51276H2.58432C3.04334 8.51276 3.44499 8.39987 3.84664 8.17408L5.568 9.6417H11.1911C11.7075 10.8835 13.142 11.5045 14.4043 11.0529C15.6666 10.5449 16.2978 9.13368 15.8388 7.89185C15.4371 6.8758 14.5191 6.25488 13.4862 6.25488V6.25488ZM13.4862 1.344C14.1174 1.344 14.6338 1.85202 14.6338 2.47294C14.6338 3.09385 14.1174 3.60188 13.4862 3.60188C12.8551 3.60188 12.3387 3.09385 12.3387 2.47294C12.3387 1.85202 12.8551 1.344 13.4862 1.344ZM2.58432 7.15804C1.95315 7.15804 1.43674 6.65001 1.43674 6.0291C1.43674 5.40818 1.95315 4.90016 2.58432 4.90016C3.21548 4.90016 3.73189 5.40818 3.73189 6.0291C3.73189 6.65001 3.21548 7.15804 2.58432 7.15804ZM13.4862 9.86749C12.8551 9.86749 12.3387 9.35947 12.3387 8.73855C12.3387 8.11763 12.8551 7.60961 13.4862 7.60961C14.1174 7.60961 14.6338 8.11763 14.6338 8.73855C14.6338 9.35947 14.1174 9.86749 13.4862 9.86749Z\"\n fill=\"url(#paint0_linear_12461_2312)\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_12461_2312\"\n x1=\"8\"\n y1=\"0\"\n x2=\"8\"\n y2=\"11.2\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#00C6A2\" />\n <stop offset=\"1\" stopColor=\"#8C78FF\" />\n </linearGradient>\n </defs>\n </svg>\n );\n};\n\nexport const Notification = ({\n state,\n tx,\n detail,\n open,\n setOpen,\n setState,\n}: {\n state?: 'success' | 'fail' | null;\n setState?: (state: 'success' | 'fail' | null) => void;\n tx?: string;\n detail?: string;\n\n open: boolean;\n setOpen: (open: boolean) => void;\n}) => {\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n } = theme;\n\n if (!open) return null;\n\n return (\n <div\n className=\"__ref-swap-widget-notification\"\n style={{\n color: primary,\n background: container,\n }}\n >\n <div className=\"__ref-swap-widget-notification__icon\">\n {state === null && <Loading />}\n {state === 'fail' && <Warning />}\n {state === 'success' && <Success />}\n </div>\n\n <div\n style={{\n fontSize: '16px',\n marginTop: '10px',\n marginBottom: '6px',\n }}\n >\n {state === 'success' && <p>Success!</p>}\n {state === 'fail' && <p>Swap Failed!</p>}\n </div>\n <div\n className=\"__ref-swap-widget-notification__text\"\n style={{\n color: primary,\n }}\n >\n {(state === null || state === undefined) && (\n <p>Waiting for confirmation</p>\n )}\n {state === 'fail' && !!tx && (\n <a\n className=\"text-primary font-semibold\"\n href={`${config.explorerUrl}/txns/${tx}`}\n target=\"_blank\"\n style={{\n textDecoration: 'underline',\n fontSize: '14px',\n color: primary,\n }}\n rel=\"noreferrer\"\n >\n Click to view.\n </a>\n )}\n\n {state === 'success' && detail}\n </div>\n {state !== null && (\n <button\n className=\"__ref-swap-widget-notification__button __ref-swap-widget-button\"\n style={{\n background: buttonBg,\n fontWeight: 700,\n color: 'white',\n }}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n setOpen(false);\n setState && setState(null);\n }}\n >\n Close\n </button>\n )}\n </div>\n );\n};\n\nexport const ArrowRight = () => {\n return (\n <div className=\"mx-1\">\n <svg\n width=\"12\"\n height=\"5\"\n viewBox=\"0 0 12 5\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.864 4.4C9.024 4.05867 9.17867 3.76 9.328 3.504C9.488 3.248 9.64267 3.03467 9.792 2.864H0.464V2.192H9.792C9.64267 2.01067 9.488 1.792 9.328 1.536C9.17867 1.28 9.024 0.986666 8.864 0.656H9.424C10.096 1.43467 10.8 2.01067 11.536 2.384V2.672C10.8 3.03467 10.096 3.61067 9.424 4.4H8.864Z\"\n fill=\"#7E8A93\"\n />\n </svg>\n </div>\n );\n};\n\nexport const AccountButton = ({\n AccountId,\n onDisConnect,\n}: {\n AccountId: string;\n onDisConnect: () => void;\n}) => {\n const [hoverAccount, setHoverAccount] = useState<boolean>(false);\n\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n iconDefault,\n iconHover,\n borderColor,\n } = theme;\n\n return !AccountId ? null : (\n <div\n className=\"__ref-swap-widget-header-button-account __ref-swap-widget-row-flex-center\"\n style={{\n color: primary,\n background: secondaryBg,\n border: `1px solid ${borderColor}`,\n cursor: 'pointer',\n }}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n hoverAccount && onDisConnect();\n }}\n onMouseEnter={() => setHoverAccount(true)}\n onMouseLeave={() => setHoverAccount(false)}\n >\n {hoverAccount ? 'Disconnect' : getAccountName(AccountId)}\n </div>\n );\n};\n","import { getConfig } from '../constant';\n\nexport const DefaultTestnetTokenList = [\n {\n spec: 'ft-1.0.0',\n name: 'Wrapped NEAR fungible token',\n symbol: 'wNEAR',\n icon: null,\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'wrap.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Banana',\n symbol: 'BANANA',\n icon:\n 'https://assets.onlinelabels.com/images/clip-art/pitr/pitr_Bananas_icon.png',\n reference: null,\n reference_hash: null,\n decimals: 6,\n id: 'banana.ft-fin.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'NEAR Wrapped USDC',\n symbol: 'nUSDC',\n icon: 'https://s2.coinmarketcap.com/static/img/coins/64x64/3408.png',\n reference: null,\n reference_hash: null,\n decimals: 2,\n id: 'nusdc.ft-fin.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'NEAR Wrapped Tether',\n symbol: 'nUSDT',\n icon: 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png',\n reference: null,\n reference_hash: null,\n decimals: 6,\n id: 'nusdt.ft-fin.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Ref Finance Token',\n symbol: 'RFT',\n icon: '',\n reference: null,\n reference_hash: null,\n decimals: 8,\n id: 'rft.tokenfactory.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'USD Coin',\n symbol: 'USDC',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none'%3E%3Ccircle cx='16' cy='16' r='16' fill='%232775C9'/%3E%3Cpath d='M15.75 27.5C9.26 27.5 4 22.24 4 15.75S9.26 4 15.75 4 27.5 9.26 27.5 15.75A11.75 11.75 0 0115.75 27.5zm-.7-16.11a2.58 2.58 0 00-2.45 2.47c0 1.21.74 2 2.31 2.33l1.1.26c1.07.25 1.51.61 1.51 1.22s-.77 1.21-1.77 1.21a1.9 1.9 0 01-1.8-.91.68.68 0 00-.61-.39h-.59a.35.35 0 00-.28.41 2.73 2.73 0 002.61 2.08v.84a.705.705 0 001.41 0v-.85a2.62 2.62 0 002.59-2.58c0-1.27-.73-2-2.46-2.37l-1-.22c-1-.25-1.47-.58-1.47-1.14 0-.56.6-1.18 1.6-1.18a1.64 1.64 0 011.59.81.8.8 0 00.72.46h.47a.42.42 0 00.31-.5 2.65 2.65 0 00-2.38-2v-.69a.705.705 0 00-1.41 0v.74zm-8.11 4.36a8.79 8.79 0 006 8.33h.14a.45.45 0 00.45-.45v-.21a.94.94 0 00-.58-.87 7.36 7.36 0 010-13.65.93.93 0 00.58-.86v-.23a.42.42 0 00-.56-.4 8.79 8.79 0 00-6.03 8.34zm17.62 0a8.79 8.79 0 00-6-8.32h-.15a.47.47 0 00-.47.47v.15a1 1 0 00.61.9 7.36 7.36 0 010 13.64 1 1 0 00-.6.89v.17a.47.47 0 00.62.44 8.79 8.79 0 005.99-8.34z' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 6,\n id: 'usdc.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Tether USD',\n symbol: 'USDT.e',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Ccircle cx='16' cy='16' r='16' fill='%2326A17B'/%3E%3Cpath fill='%23FFF' d='M17.922 17.383v-.002c-.11.008-.677.042-1.942.042-1.01 0-1.721-.03-1.971-.042v.003c-3.888-.171-6.79-.848-6.79-1.658 0-.809 2.902-1.486 6.79-1.66v2.644c.254.018.982.061 1.988.061 1.207 0 1.812-.05 1.925-.06v-2.643c3.88.173 6.775.85 6.775 1.658 0 .81-2.895 1.485-6.775 1.657m0-3.59v-2.366h5.414V7.819H8.595v3.608h5.414v2.365c-4.4.202-7.709 1.074-7.709 2.118 0 1.044 3.309 1.915 7.709 2.118v7.582h3.913v-7.584c4.393-.202 7.694-1.073 7.694-2.116 0-1.043-3.301-1.914-7.694-2.117'/%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 6,\n id: 'usdt.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Dai Stablecoin',\n symbol: 'DAI',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Ccircle fill='%23F4B731' fill-rule='nonzero' cx='16' cy='16' r='16'/%3E%3Cpath d='M9.277 8h6.552c3.985 0 7.006 2.116 8.13 5.194H26v1.861h-1.611c.031.294.047.594.047.898v.046c0 .342-.02.68-.06 1.01H26v1.86h-2.08C22.767 21.905 19.77 24 15.83 24H9.277v-5.131H7v-1.86h2.277v-1.954H7v-1.86h2.277V8zm1.831 10.869v3.462h4.72c2.914 0 5.078-1.387 6.085-3.462H11.108zm11.366-1.86H11.108v-1.954h11.37c.041.307.063.622.063.944v.045c0 .329-.023.65-.067.964zM15.83 9.665c2.926 0 5.097 1.424 6.098 3.528h-10.82V9.666h4.72z' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'dai.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Wrapped Ether',\n symbol: 'WETH',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='256' height='256'%3E%3Cdefs%3E%3Ctext id='A' x='50' y='180' font-size='180'%3E🍌%3C/text%3E%3C/defs%3E%3Cuse xlink:href='%23A'/%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'weth.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'HAPI',\n symbol: 'HAPI',\n icon:\n \"data:image/svg+xml,%3Csvg version='1.1' id='Layer_2' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='600px' height='600px' viewBox='0 0 600 600' enable-background='new 0 0 600 600' xml:space='preserve'%3E %3Cg%3E %3Cg%3E %3Cpath fill='%23141414' d='M263.7,122.8c-3.6,0.3-7.1,0.9-10.7,1.8c-24.5,6-40.3,18.1-50.4,31c24.5-4.7,49.9,1.3,67.3,7.4 c0.5,0.2,1,0.4,1.6,0.6c-2.7-4.2-5.2-9-7.2-14.4C261.2,141.1,261.6,131.6,263.7,122.8z'/%3E %3Cpath fill='%23141414' d='M201.2,197.7c-9.8-1.1-19.1-2.1-24.6-2.1c-0.7,0-1.4,0-2,0.1c-38.1,2.6-67.2,37.3-69.1,82.4 c-1.4,32.2,13.5,53.1,23.3,63.4c-1.5-12.5-0.1-25,4.3-37.3c11.7-32.6,34.3-42.1,60.6-53.1c10.8-4.5,22.5-9.5,34.3-16.6l50.1-39.6 c-10.1,2.2-24.4,4.5-42.9,5.3C227.1,200.6,213.9,199.1,201.2,197.7z'/%3E %3Cpath fill='%23141414' d='M319.1,176.5c-0.5,1.1,0.9,2.1,1.8,1.2c5.3-5.4,16.3-14.3,30.8-14.2c15.6,0.1,35.5,10.2,40.5,22.1 c4,9.8-6.6,16.5-6.6,16.5l0,0c-2.5-2.7-8-6.3-18.2-6.6c-15-0.5-25.3,12.1-24.1,12.9c7.5,4.7,17.3,3.7,23.1,3.5 c5.8-0.2,15.1-2.5,17.8-3.5c4.7-1.8,11.7-7.8,14.9-16.1c2.5-6.5,8.4-28.7-25.2-34.4C352.7,154.3,327,159.6,319.1,176.5z'/%3E %3Cpath fill='%23141414' d='M473.1,225.1c-0.5-0.6-1.1-1.3-1.7-2l-0.3-0.3c-3.9-4.4-7.6-8.3-9.4-10.1c1.2-4.2,4-16.2,1-26.1 c-2.3-7.7-6.8-15.5-9.2-19.4l-0.8-1.2h0c-0.4-0.6-0.8-1.2-1.1-1.7c-0.3-0.4-0.5-0.7-0.6-1l-0.2-0.7c-2.5-7-8.6-22.3-16.4-28.1 l59.4-91.7c2.3-3.5-2.1-7.5-5.4-5l-86.8,66.5c-8.7-12.3-21.1-21.8-21.8-22.4c-0.8-0.6-2-0.7-2.9-0.2c-0.9,0.5-1.4,1.6-1.3,2.6 c0,0.1,0.6,5.9-2.9,17.6c7.5,2.7,13.9,6,19.3,9.7l-4.5,3.5c-8.8-5.7-20-10.5-34.3-12.6c-17.7-2.6-31.9,1-42.1,10.7c0,0,0,0,0,0 c5.9,3.8,13.1,8.7,17,12.4c0.8,0.7,1.5,1.5,2.2,2.3c-3.1,0.9-6.2,1.9-9.3,2.9c-0.3-0.2-0.5-0.5-0.8-0.7c-1.9-1.7-4.4-3.4-7-5.3 c-5.4-3.8-11.7-8.3-15.8-14c-2.2-3.1-3.8-6.5-4.3-10.4c-0.3-2.4-1-4-2.2-4.9c0,0,0,0,0,0c0,0,0,0,0,0c-0.6-0.5-2.8-2-5.8,0.3 c-2,1.6-4.4,5.3-6.5,10.3c-5.2,12.3-8.7,32.1-1.8,46.1c1.2,2.3,2.4,4.5,3.7,6.6c-0.4,1-0.7,2.1-0.9,3.1c-0.6,3.4-0.9,7.8-1.2,12.7 c-19.8-8.3-50.5-17.5-78.5-10.7c-23.9,5.8-39.4,17.5-49.6,30c7.4-3.1,15.2-5,23.5-5.6c5.6-0.4,16.4,0.8,27.9,2.1 c11.8,1.3,25.3,2.8,32.9,2.4c19.2-0.8,33.7-3.3,43.5-5.6c0,5.4,0.1,11.1,0.4,16.9c0.7,16.8,2.5,34.3,5,46.5 c3.6,17.9,16.5,55.2,31.4,64.6c5.5,3.5,13.5,8.2,22.9,13.4c-2.5,6.4-5.1,15.1-5.1,23.5c0,15.2,5.2,26.6,11,37 c4.6,8.2,9.6,15.7,12.8,24c2.5,6.5-2.7,27.7-5.6,38.9c-1.2,4.5-1.9,7.3-1.7,7c3.7-5.1,7.5-10.8,11.3-16.8 c15.3-24.2,19.4-47,19.5-48l0.2-1.4l-1.1-1c-0.2-0.2-17.2-15.7-18.3-33.3c-0.4-6.9,1-11.5,4.3-13.8c0.5-0.3,1-0.6,1.6-0.9 c7.5,3.7,15,7.3,22.2,10.5c2.8,3.5,9,9.4,11.8,12c3.4,3.2,6.9,7.8,12.2,7.8c5.3,0,15.9,0,21.3,0s13.1,0,17.3-2.1 c4.2-2.1,10.9-5.6,11-12.6c0-1.5,0.4-3.9,0.9-6.8c3.7-4.9,4.1-10.6,4.8-19.2c0.5-5.7,1.7-15.5,3-25.9c2-15.7,4.1-32,3.9-37.9 c-0.2-8.2-1.1-14.3-1.4-16.2C475.3,249.4,479.5,232.4,473.1,225.1z M318,310.6c-13.3-8.4-25.6-44.6-29-61.2 c-4.8-23.9-6.9-68.5-3.9-86.8c2.7-16.7,49-34.5,81.7-35.6c1.9-0.1,3.8-0.1,5.6-0.1c1,0,2,0,3,0c-0.1,4.9,1.3,15.6,13.8,25.5 c13.9,11,30.4,5,30.4,5l12.1-18.7c4.5,3.5,9.4,12.7,13,22.1c-0.9-0.4-1.9-0.7-3.1-0.9c-8.1-1.3-31.6-0.9-24,31.3 c1,4,5.2,9.4,17.2,22.3c2.8,3,5.1,5.3,7,7.2c5.6,5.6,7.4,7.4,7.5,11.8c0,0.3-0.2,1.6-0.4,3c-0.8-0.6-1.9-1.1-3.4-1 c-3.6-0.2-33.7,5.6-42.4,15.1c-1.7,1.9-4.5,2.6-6.7,1.4c-0.1-0.1-0.2-0.1-0.3-0.2c-1.4-0.8-2.3-1.9-2.8-3.5 c-1.3-5.1,2.9-13.2,4.6-16c0.6-1,0.3-2.3-0.6-2.9c-1-0.6-2.3-0.3-2.9,0.6c-0.1,0.2-0.9,1.5-1.9,3.5c-3.3,6.6-8.2,12.2-14.3,16.3 c-9.8,6.6-24,15.2-35.5,18.2c-18,4.7-24.9-8.2-25.2-8.8c-0.5-1-1.8-1.4-2.8-0.9c-1,0.5-1.5,1.8-0.9,2.8 c0.1,0.1,6.3,12.1,21.5,12.1c0.6,0,1.4-0.1,2.2-0.2c4.3-0.5,8.6,0.5,12.3,2.7c3.5,2.1,8,4.7,12.5,7c12.6,6.3,14.7,6.2,19.5,5.4 c1.1-0.2,49.8-2.4,80.1-8.2l3.6,0.2c2.4,0.1,4.3,2.3,4,4.7l0,0.1c-0.2,1.4-1,2.6-2.2,3.3c-2.7,1.5-6.5,3.5-9.9,4.9 c-1.6,0.6-3.3,1.2-5.1,1.6c-5.5,1.3-11.1,1.6-11.1,1.6s-5.4,1.2-13.5,2.1c-3.4,0.4-7.2,0.7-11.3,0.9c-14,0.7-13,1.6-24.8,1 c-2.9-0.1-5.7-0.3-8.3-0.6c-2.5-0.3-3.2,3.4-0.7,4c6.1,1.5,13.3,2.6,21.3,2.5c1,0,1.9,0,2.9,0c12.8-0.1,24.4,7.5,29.4,19.3 c2.1,5,4.1,12,5.4,18.5c1.8,8.4-5.3,16.1-13.8,15.3c-12.5-1.3-26.6-4.8-34.6-8.3C365.3,338.1,332.4,319.8,318,310.6z M448.7,169.2 l1.2,1.9c2.4,4,5.9,10.5,7.9,16.9c3.1,10.4-1.4,24.4-1.4,24.5l-0.5,1.5l1.1,1.1c0,0.1,5,5.2,10.3,11.1l0.1,0.2 c0.6,0.7,1.2,1.3,1.8,2c3.7,4.3,1.9,17-0.1,23.9l-0.2,0.6l0.1,0.6c0,0,0.3,1.5,0.6,3.9c-2.7,0.3-4.7,2.7-4.4,5.5l0.8,7.5l-8.6,0.1 l-13.5-15.3c-1-1.2-1-3,0.2-4c0,0,0,0,0,0c7.1-6.4,8.1-9.5,8.3-10.7c0.9-5.4,1.2-7.4,1.2-8.1c0-6.1-2.9-9-8.7-14.8 c-1.9-1.9-4.2-4.2-6.9-7.1c-0.6-0.6-1.1-1.2-1.7-1.8c2.1,0.6,4.9,1.2,8.5,1.5c8.4,0.7,10.9-1.4,10.9-1.4s1.5-2.7-1.1-6.6 c-2.6-3.9-6.2-6.7-13.2-6.9c-5-0.2-9.5,3.7-11.7,6c-0.9-1-2.9-4.7-3.8-10.9c-1.5-9.7,2.1-14.2,4.7-16.4c4.6-3.9,10.9-7.7,14.4-7.5 c0.9,0.1,1.9,0.2,2.7,0.4C447.8,167.7,448.2,168.4,448.7,169.2z M463.4,332.9c-0.7,8.2-1.1,12.8-3.8,16.5c-2.3,3.1-7.3,0.8-6.6-3 c0.4-2.1,0.7-4.3,0.8-6.4c0.3-10.7-4.9-20.9-6.7-27.7c0,0,0-0.1,0-0.1c-0.9-3.8,1.2-7.7,4.8-9.3c1.6-0.7,3.4-1.6,5.3-2.6 c4.6-2.3,9.9,1.3,9.2,6.4l0,0.1C465.2,317.2,463.9,327.1,463.4,332.9z M385.1,249.4c1.8-1.3,4.4-0.8,5.6,1.2 c0.8,1.4,1.9,2.9,3.4,4.1c4.5,3.7,9.8,3.5,13.2,3.5c3.3,0,5.4-0.6,6-0.8c0,0,0,0,0,0c2.4-0.5,4.3,2,3.1,4.2 c-2.6,4.8-6.1,11.1-6.5,11.4c-0.7,0.5-22.8,5.1-25.6,5.4s-11.6,1.2-18.2-3c-2.8-1.7-5.5-3.7-7.7-5.3c-1.7-1.2-1.4-3.8,0.4-4.7 C368.8,260.4,378.7,253.9,385.1,249.4z M436.8,263.8l8.3,9.1c1.5,1.7,0.5,4.4-1.7,4.7c-5,0.6-10,1.2-14.9,1.7 c-2.3,0.2-3.9-2.3-2.7-4.3c1.9-3,4.3-7,6.5-10.8C433.2,262.6,435.5,262.4,436.8,263.8z M396.4,117.1l83.5-69.1l-76.9,76.9 c-2.5,2.4-6.6,1.6-8.1-1.5h0C393.9,121.2,394.5,118.5,396.4,117.1z'/%3E %3Cpath fill='%23141414' d='M196.6,258.1c-25.6,10.7-45.8,19.2-56.4,48.7c-15.1,42,9.4,88.5,62.5,120.1c-17.4-68,3.5-93.1,22.1-115.3 c6.4-7.7,12.5-15,16.9-23.7c12.9-25.8,12.3-50.5,11.1-62C233.7,242.5,214.1,250.8,196.6,258.1z'/%3E %3C/g%3E %3Cg%3E %3Cpath d='M201.6,477.1h-9.1l-2.8,17.1h-14.3l2.8-17.1h-9.1l-2.8,17.1h-9.3l-1.5,9.1h9.3l-2.3,14h-9.4l-1.5,9.1h9.4l-2.8,17.1h9.1 l2.8-17.1h14.3l-2.8,17.1h9.1l2.8-17.1h9.3l1.5-9.1h-9.3l2.3-14h9.4l1.5-9.1h-9.4L201.6,477.1z M186,517.4h-14.3l2.3-14h14.3 L186,517.4z'/%3E %3Cpolygon points='260.8,505.3 230,505.3 230,477.1 218,477.1 218,543.6 230,543.6 230,515.4 260.8,515.4 260.8,543.6 272.9,543.6 272.9,477.1 260.8,477.1 '/%3E %3Cpath d='M307.1,477.1l-23.4,66.4h12.8l5.5-16.4h25l5.5,16.4h12.8l-23.4-66.4H307.1z M305.3,517.5l9-26.8h0.5l9,26.8H305.3z'/%3E %3Cpath d='M394,480c-3.5-1.9-7.8-2.9-12.9-2.9h-24.9v66.4h12v-22.4H381c5.1,0,9.4-0.9,12.9-2.8s6.2-4.5,7.9-7.8 c1.8-3.3,2.7-7.1,2.7-11.3c0-4.2-0.9-8-2.7-11.3C400.1,484.5,397.4,481.9,394,480z M390.9,505.4c-0.9,1.8-2.3,3.2-4.2,4.3 c-1.9,1-4.3,1.6-7.3,1.6h-11.1v-24h11c3,0,5.5,0.5,7.4,1.5c1.9,1,3.3,2.4,4.2,4.2c0.9,1.8,1.4,3.9,1.4,6.2 S391.8,503.6,390.9,505.4z'/%3E %3Crect x='417.1' y='477.1' width='12' height='66.4'/%3E %3C/g%3E %3C/g%3E %3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'hapi.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'PARAS',\n symbol: 'PARAS',\n icon:\n 'data:image/png;base64,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',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'paras.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Ref Finance Token',\n symbol: 'REF',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='16 24 248 248' style='background: %23000'%3E%3Cpath d='M164,164v52h52Zm-45-45,20.4,20.4,20.6-20.6V81H119Zm0,18.39V216h41V137.19l-20.6,20.6ZM166.5,81H164v33.81l26.16-26.17A40.29,40.29,0,0,0,166.5,81ZM72,153.19V216h43V133.4l-11.6-11.61Zm0-18.38,31.4-31.4L115,115V81H72ZM207,121.5h0a40.29,40.29,0,0,0-7.64-23.66L164,133.19V162h2.5A40.5,40.5,0,0,0,207,121.5Z' fill='%23fff'/%3E%3Cpath d='M189 72l27 27V72h-27z' fill='%2300c08b'/%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'ref.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Pulse',\n symbol: 'PULSE',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmlld0JveD0iMCAwIDIwMCAyMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjEwMCIgY3k9IjEwMCIgcj0iMTAwIiBmaWxsPSIjMEYyQUMzIi8+CjxwYXRoIGQ9Ik0xMDMuNTc0IDg0LjU3M0MxMDIuMDUyIDg2LjU4MDggMTAwLjg1MyA4OS4xNDAyIDk5LjY5NzIgOTEuNjU1OUM5OC41NDA5IDk0LjE3MTYgOTcuMzkyIDk2LjY1OTYgOTYuMjE0OSA5OC40MjU1Qzk1LjAzNzggMTAwLjE5MSA5My45Mjg0IDEwMS4wNTggOTIuNzMyNiAxMDEuMDU4QzkxLjI3MDMgMTAxLjA1OCA5MC40NDI1IDEwMC42NDMgODkuNzEwMiA5OS44NjcyQzg4Ljk3NzYgOTkuMDkxNiA4OC40MDY1IDk3LjkwNSA4Ny44NzAzIDk2LjY3MDRDODcuMzMzOSA5NS40MzU4IDg2Ljg0NzcgOTQuMTM1MSA4Ni4wMzA1IDkzLjAzNDlDODUuMjEzMyA5MS45MzQ3IDgzLjkxMDQgOTEuMDI5MSA4Mi4yMTk4IDkxLjAyOTFDODEuMjYzMyA5MS4wMjkxIDgwLjQyMzcgOTEuNDQ1MSA3OS43ODg2IDkyLjAzMkM3OS4xNTM0IDkyLjYxODkgNzguNjkwMSA5My4zOTAxIDc4LjI3NzQgOTQuMjI1OUM3Ny40NTIxIDk1Ljg5NjggNzYuODM1NCA5Ny45NjgyIDc2LjA0MzUgOTkuOTkyN0M3NS4yNTE2IDEwMi4wMTcgNzQuMjc3MSAxMDMuOTk1IDcyLjk1NTUgMTA1LjM4M0M3MS42MzM2IDEwNi43NzIgNjkuOTk5MiAxMDcuNjQgNjcuNTAxOCAxMDcuNjRIMzguMDY2MkMzNy42ODcxIDEwNy42MzUgMzcuMzM0NSAxMDcuODI1IDM3LjE0MzMgMTA4LjEzN0MzNi45NTIyIDEwOC40NDkgMzYuOTUyMiAxMDguODM2IDM3LjE0MzMgMTA5LjE0OEMzNy4zMzQ1IDEwOS40NjEgMzcuNjg3MSAxMDkuNjUxIDM4LjA2NjIgMTA5LjY0Nkg2Ny41MDE4QzcwLjU0NzkgMTA5LjY0NiA3Mi44OTg1IDEwOC40MTYgNzQuNTMyMyAxMDYuN0M3Ni4xNjYyIDEwNC45ODQgNzcuMTg3NSAxMDIuNzk3IDc4LjAxNDYgMTAwLjY4MkM3OC44NDE3IDk4LjU2NzUgNzkuNDc1IDk2LjQ3NDEgODAuMTgyOCA5NS4wNDA3QzgwLjUzNyA5NC4zMjQgODAuODg5MyA5My43OTE5IDgxLjIzNDEgOTMuNDczOEM4MS41Nzg5IDkzLjE1NTIgODEuODI2NiA5My4wMzQ5IDgyLjIxOTggOTMuMDM0OUM4My4yMjc5IDkzLjAzNDkgODMuNzQyNyA5My40NDUzIDg0LjMyMjIgOTQuMjI1OUM4NC45MDE4IDk1LjAwNiA4NS40MTIgOTYuMjEyNyA4NS45NjQ5IDk3LjQ4NTRDODYuNTE3NyA5OC43NTc3IDg3LjA4OTYgMTAwLjA3OCA4OC4xMzMxIDEwMS4xODRDODkuMTc2NiAxMDIuMjg5IDkwLjczNzUgMTAzLjA2NCA5Mi43MzI2IDEwMy4wNjRDOTQuOTkzOCAxMDMuMDY0IDk2LjY1OTEgMTAxLjQ4NiA5Ny45ODg4IDk5LjQ5MTJDOTkuMzE4NSA5Ny40OTYyIDEwMC40NTQgOTQuOTY5NSAxMDEuNjAzIDkyLjQ3MDlDMTAyLjc1MSA4OS45NzE4IDEwMy45NTMgODcuNTE2OSAxMDUuMjgyIDg1Ljc2MzhDMTA2LjYxMSA4NC4wMTA3IDEwNy45MjUgODMuMDA1OCAxMDkuNTUzIDgzLjAwNThDMTEwLjI5NSA4My4wMDU4IDExMC45NDYgODMuMjcyOCAxMTEuNjU2IDgzLjg4MzRDMTEyLjM2NSA4NC40OTM5IDExMy4wNjggODUuNDUxNyAxMTMuNzU4IDg2LjY0MTRDMTE1LjEzOCA4OS4wMjA3IDExNi40NDcgOTIuMzI4OCAxMTcuODMyIDk1LjY2NzVDMTE5LjIxNiA5OS4wMDYyIDEyMC43MTcgMTAyLjM3NiAxMjIuNjk0IDEwNS4wMDdDMTI0LjY3MSAxMDcuNjM4IDEyNy4yMzQgMTA5LjU4MyAxMzAuNTc4IDEwOS41ODNIMTYwLjkzNEMxNjEuMzEzIDEwOS41ODggMTYxLjY2NiAxMDkuMzk4IDE2MS44NTcgMTA5LjA4NkMxNjIuMDQ4IDEwOC43NzMgMTYyLjA0OCAxMDguMzg3IDE2MS44NTcgMTA4LjA3NEMxNjEuNjY2IDEwNy43NjIgMTYxLjMxMyAxMDcuNTcyIDE2MC45MzQgMTA3LjU3N0gxMzAuNTc4QzEyOC4wNjcgMTA3LjU3NyAxMjYuMTcgMTA2LjIzMiAxMjQuNDAyIDEwMy44NzlDMTIyLjYzNCAxMDEuNTI2IDEyMS4xMDggOTguMjgzNyAxMTkuNzM3IDk0Ljk3ODFDMTE4LjM2NiA5MS42NzIxIDExNy4xMDggODguMzA1MiAxMTUuNTk4IDg1LjcwMTJDMTE0Ljg0MyA4NC4zOTkxIDExNC4wOCA4My4yODQ2IDExMy4xMDEgODIuNDQxOEMxMTIuMTIyIDgxLjU5ODcgMTEwLjg4MyA4MSAxMDkuNTUzIDgxQzEwNy4wMzYgODEgMTA1LjA5NiA4Mi41NjUzIDEwMy41NzQgODQuNTczWiIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSI1Ii8+Cjwvc3ZnPgo=',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'pulse.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Ether',\n symbol: 'ETH',\n icon:\n 'data:image/png;base64,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',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'eth.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Aurora',\n symbol: 'AURORA',\n icon:\n \"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 288 288' style='enable-background:new 0 0 288 288;' xml:space='preserve'%3E %3Cstyle type='text/css'%3E .st0%7Bfill:%2370D44B;%7D .st1%7Bfill:%23FFFFFF;%7D %3C/style%3E %3Cpath class='st0' d='M144,0L144,0c79.5,0,144,64.5,144,144v0c0,79.5-64.5,144-144,144h0C64.5,288,0,223.5,0,144v0 C0,64.5,64.5,0,144,0z'/%3E %3Cpath class='st1' d='M144,58.8c7.6,0,14.5,4.3,17.9,11.1l56.2,112.5c4.9,9.9,0.9,21.9-9,26.8c-2.8,1.4-5.8,2.1-8.9,2.1H87.8 c-11,0-20-9-20-20c0-3.1,0.7-6.2,2.1-8.9l56.2-112.5C129.5,63,136.4,58.7,144,58.8 M144,45c-12.8,0-24.5,7.2-30.2,18.7L57.6,176.2 c-8.3,16.7-1.6,36.9,15.1,45.3c4.7,2.3,9.9,3.6,15.1,3.6h112.5c18.6,0,33.8-15.1,33.8-33.7c0-5.2-1.2-10.4-3.6-15.1L174.2,63.7 C168.5,52.2,156.8,45,144,45z'/%3E %3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'aurora.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Skyward Finance Token',\n symbol: 'SKYWARD',\n icon:\n 'data:image/png;base64,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',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'skyward.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Staked NEAR',\n symbol: 'STNEAR',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 67.79 67.79' version='1.1'%3E%3Cpath style='fill:%23fff' d='M33.934.311a33.9 33.9 0 1 0 33.89 33.9 33.9 33.9 0 0 0-33.89-33.9z' id='path505'%3E%3C/path%3E%3Cpath style='fill:%23ffbd00;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1' d='m11.803 27.8 12.387.359 2.361 5.959 7.616 3.31 8.523-3.322 2.348-5.87 12.269.03L54.822 54.2 31.837 58.86 12.89 52.648z' id='path1051'%3E%3C/path%3E%3Cpath style='fill:%23a0a0ff;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1' d='m34.657 12.575-10.43 9.633 1.096 10.01 8.844 5.21 9.785-5.287 1.086-11.33z' id='path1815'%3E%3C/path%3E%3Cpath id='path928' style='fill:%23666;fill-opacity:1' d='M33.928 4.282a29.93 29.93 0 0 1 4.682.367 29.93 29.93 0 0 1 25.244 29.572 29.93 29.93 0 0 1-29.92 29.92 29.93 29.93 0 0 1-.006-59.86zm.729 8.293c-2.03 5.668-8.815 9.76-8.815 14.521 0 4.76 3.912 8.62 8.737 8.62 4.824 0 8.736-3.86 8.736-8.62s-6.707-8.697-8.658-14.521zM37.84 22.67a2.524 2.446 0 0 1 .246.012 2.524 2.446 0 0 1 .246.035 2.524 2.446 0 0 1 .24.059 2.524 2.446 0 0 1 .233.08 2.524 2.446 0 0 1 .225.104 2.524 2.446 0 0 1 .213.123 2.524 2.446 0 0 1 .197.142 2.524 2.446 0 0 1 .183.162 2.524 2.446 0 0 1 .168.178 2.524 2.446 0 0 1 .147.191 2.524 2.446 0 0 1 .127.207 2.524 2.446 0 0 1 .105.217 2.524 2.446 0 0 1 .084.227 2.524 2.446 0 0 1 .06.232 2.524 2.446 0 0 1 .038.237 2.524 2.446 0 0 1 .012.24 2.524 2.446 0 0 1-.086.633 2.524 2.446 0 0 1-.252.59 2.524 2.446 0 0 1-.403.507 2.524 2.446 0 0 1-.521.389 2.524 2.446 0 0 1-.61.244 2.524 2.446 0 0 1-.652.084 2.524 2.446 0 0 1-.654-.084 2.524 2.446 0 0 1-.607-.244 2.524 2.446 0 0 1-.524-.389 2.524 2.446 0 0 1-.4-.508 2.524 2.446 0 0 1-.252-.59 2.524 2.446 0 0 1-.086-.632 2.524 2.446 0 0 1 .086-.633 2.524 2.446 0 0 1 .252-.59 2.524 2.446 0 0 1 .4-.506A2.524 2.446 0 0 1 36.58 23a2.524 2.446 0 0 1 .607-.247 2.524 2.446 0 0 1 .654-.082zM24.19 28.16a16.579 2.485 0 0 0-6.502 1.965 16.579 2.485 0 0 0 7.635 2.093 10.483 10.6 0 0 1-1.133-4.058zm20.848.078a10.483 10.6 0 0 1-1.086 3.904 16.579 2.485 0 0 0 6.894-2.017 16.579 2.485 0 0 0-5.808-1.887zm6.925 3.21c-.455 1.177-4.097 2.154-9.273 2.659a10.483 10.6 0 0 1-8.072 3.861 10.483 10.6 0 0 1-8.067-3.85c-5.276-.506-8.978-1.498-9.398-2.64h-.049v5.17h.049a.69.69 0 0 0-.049.24c0 1.8 7.81 3.25 17.43 3.25 9.62 0 17.43-1.45 17.43-3.25a.69.69 0 0 0 0-.24zm.032 7.323c-.67 1.73-8.22 3.03-17.43 3.03-9.23 0-16.771-1.34-17.381-3h-.049v5.17h.049a.69.69 0 0 0-.049.24c0 1.8 7.81 3.25 17.43 3.25 9.62 0 17.43-1.45 17.43-3.25a.69.69 0 0 0 0-.24zm0 7.21c-.67 1.69-8.22 3.03-17.43 3.03-9.23 0-16.771-1.34-17.381-3h-.049v5.17h.049a.69.69 0 0 0-.049.24c0 1.8 7.81 3.25 17.43 3.25 9.62 0 17.43-1.45 17.43-3.25a.69.69 0 0 0 0-.24z'%3E%3C/path%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'stnear.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Octopus Network Token',\n symbol: 'OCT',\n icon:\n \"data:image/svg+xml,%3Csvg version='1.1' id='O' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 113.39 113.39' style='enable-background:new 0 0 113.39 113.39;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23014299;%7D .st1%7Bfill:%23FFFFFF;%7D %3C/style%3E%3Ccircle class='st0' cx='56.69' cy='56.69' r='56.69'/%3E%3Cg%3E%3Cpath class='st1' d='M44.25,59.41c-1.43,0-2.59,1.16-2.59,2.59v20.28c0,1.43,1.16,2.59,2.59,2.59c1.43,0,2.59-1.16,2.59-2.59V62 C46.84,60.57,45.68,59.41,44.25,59.41z'/%3E%3Cpath class='st1' d='M56.69,59.41c-1.45,0-2.62,1.17-2.62,2.62v26.47c0,1.45,1.17,2.62,2.62,2.62s2.62-1.17,2.62-2.62V62.02 C59.31,60.58,58.14,59.41,56.69,59.41z'/%3E%3Cpath class='st1' d='M79.26,78.87c-0.33,0.15-0.64,0.28-0.95,0.38c0,0-0.01,0-0.01,0c-0.59,0.19-1.13,0.29-1.63,0.31h-0.06 c-1,0.03-1.84-0.27-2.59-0.75c-0.49-0.32-0.91-0.73-1.25-1.23c-0.3-0.43-0.53-0.93-0.71-1.51c0-0.01-0.01-0.02-0.01-0.03 c-0.22-0.74-0.34-1.61-0.34-2.59V62.02c0-1.45-1.17-2.62-2.62-2.62c-1.45,0-2.62,1.17-2.62,2.62v11.43c0,4.5,1.64,8.03,4.63,9.96 c1.5,0.97,3.21,1.45,5.04,1.45c1.68,0,3.45-0.41,5.25-1.22c1.32-0.59,1.9-2.14,1.31-3.46C82.13,78.86,80.57,78.27,79.26,78.87z'/%3E%3Cpath class='st1' d='M68.33,45.9c0-2.15-1.75-3.9-3.9-3.9c-2.15,0-3.9,1.75-3.9,3.9s1.75,3.9,3.9,3.9 C66.58,49.8,68.33,48.05,68.33,45.9z'/%3E%3Cpath class='st1' d='M48.96,41.99c-2.15,0-3.9,1.75-3.9,3.9s1.75,3.9,3.9,3.9s3.9-1.75,3.9-3.9S51.11,41.99,48.96,41.99z'/%3E%3Cpath class='st1' d='M56.69,22.28c-15.17,0-27.52,12.34-27.52,27.52v15.09c0,1.46,1.18,2.64,2.64,2.64s2.64-1.18,2.64-2.64V49.8 c0-12.26,9.98-22.24,22.24-22.24c12.26,0,22.24,9.98,22.24,22.24v15.09c0,1.46,1.18,2.64,2.64,2.64s2.64-1.18,2.64-2.64V49.8 C84.21,34.62,71.87,22.28,56.69,22.28z'/%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'oct.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Debio',\n symbol: 'DBIO',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIxOTAgOTcgNDIwIDQyMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgODAwIDgwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVmcz48c3R5bGU+LnN0MHtmaWxsOiMzNjM2MzZ9LnN0M3tmaWxsOiNmZjU2ZTB9PC9zdHlsZT48L2RlZnM+PGNpcmNsZSBjbGFzcz0ic3QzIiBjeD0iNDAwIiBjeT0iMzA3LjM5IiByPSIyMDguNTgiLz48cGF0aCBkPSJNNDczLjk5IDIxMS4zczIuMzQgNTYuMjUtNzcuMzQgOTguNDMtNzAuMzEgOTMuNzQtNzAuMzEgOTMuNzQiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiNlNmU2ZTY7c3Ryb2tlLXdpZHRoOjM3LjQ5NzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNMzI2LjAxIDIxMS4zcy0yLjM0IDU2LjI1IDc3LjM0IDk4LjQzIDcwLjMxIDkzLjc0IDcwLjMxIDkzLjc0IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS13aWR0aDozNy40OTc1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwIi8+PGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iNDAwIiBjeT0iMjE2LjQyIiByPSIyMC40OSIvPjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjQwMCIgY3k9IjM5OC4zNiIgcj0iMjAuNDkiLz48dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzYuMzQyIDY1OC4wNzUpIiBjbGFzcz0ic3QzIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlO2ZvbnQtc2l6ZToxMTIuNDkyNXB4O2ZvbnQtZmFtaWx5OidBcnRlZ3JhU2Fucy1TZW1pQm9sZCciPkRlQmlvPC90ZXh0Pjwvc3ZnPg==',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'dbio.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Game GEM!!',\n symbol: 'gGEM',\n icon: null,\n reference: null,\n reference_hash: null,\n decimals: 4,\n id: 'gem.thegame.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Game Gold!!',\n symbol: 'gGOLD',\n icon: null,\n reference: null,\n reference_hash: null,\n decimals: 2,\n id: 'gold.thegame.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Game Elixir!!',\n symbol: 'gELXR',\n icon: null,\n reference: null,\n reference_hash: null,\n decimals: 2,\n id: 'elixir.thegame.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'USN',\n symbol: 'USN',\n icon:\n \"data:image/svg+xml;charset=UTF-8,%3Csvg width='38' height='38' viewBox='0 0 38 38' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='38' height='38' rx='19' fill='black'/%3E%3Cpath d='M14.8388 10.6601C14.4203 10.1008 13.6748 9.86519 12.9933 10.0768C12.3119 10.2885 11.85 10.8991 11.85 11.5883V14.7648H8V17.9412H11.85V20.0589H8V23.2353H11.85V28H15.15V16.5108L23.1612 27.2165C23.5797 27.7758 24.3252 28.0114 25.0067 27.7997C25.6881 27.5881 26.15 26.9775 26.15 26.2882V23.2353H30V20.0589H26.15V17.9412H30V14.7648H26.15V10.0001H22.85V21.3658L14.8388 10.6601Z' fill='white'/%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'usdn.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Learn NEAR Club',\n symbol: 'LNC',\n icon:\n 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAQwAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAAHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAAAChnVFJDAAABoAAAAChiVFJDAAABoAAAACh3dHB0AAAByAAAABRjcHJ0AAAB3AAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAFgAAAAcAHMAUgBHAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z3BhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLW1sdWMAAAAAAAAAAQAAAAxlblVTAAAAIAAAABwARwBvAG8AZwBsAGUAIABJAG4AYwAuACAAMgAwADEANv/bAEMAAwICAgICAwICAgMDAwMEBgQEBAQECAYGBQYJCAoKCQgJCQoMDwwKCw4LCQkNEQ0ODxAQERAKDBITEhATDxAQEP/bAEMBAwMDBAMECAQECBALCQsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/AABEIACAAIAMBIgACEQEDEQH/xAAZAAADAAMAAAAAAAAAAAAAAAAABgcDBAj/xAAjEAACAgICAgMAAwAAAAAAAAABAgMEBQYAEQcSEyExFCJB/8QAGAEAAgMAAAAAAAAAAAAAAAAAAQMABwj/xAAlEQACAQMDBAIDAAAAAAAAAAABEQMAAgQxQWESIZHwUXGBwfH/2gAMAwEAAhEDEQA/AOqOHNHN5vF67jnyuZtCtVSSKJpCjN00kixoOlBP27qPz/fv64qZDzBq+L8h2/Gt2rk0yVXFJlROK3tVlVhMwhEoPSzeteZgr+vsqMVJ9W6zZHBLKCbLSV38J+GKva+aONC8p/v+U88ORWv5t3fyTFTbwTpWPvxpjMfl8lc2O49SvCLldbENGMwLJ72vidWf7CxB4ifcSDqmaPseS2rXIMtmdYva9kRJLWuY632TDPE5jf436HyxFlJjlAAdCrADvrjZ8OXHt6pEOGGPhjUP3alxZUc9ys78oo/R0rD5E1O3u+oXdboZaPGWrD15oLctU2EikhnjlUtGHQuCYwCPZf394jZDwNc2pdht75uMF3LZ2ji4I72LxQpGhZoT25YLMKySzdN1aVSpJBCOD2shVa7w5IcyaC3ojKDegex1T2HbTtRkxYpruq8MpannbTc1EcB4D3jx3UxaeLPK1fFSpgcfhsxBkcH/AC6V+epWirR5CKFZ42gn+OPpv7uHCQq31GDymeP9XymnarTwed27JbPk0LzXcrfIElmeRy8jKgJEUfsxCRKSqIFUdgd8YuHDPmzZIUpB5QB4ZAZ9+BQhxIoC4wR+SvDXvNf/2Q==',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'lnc.factory.tokenhub.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Wrapped BTC',\n symbol: 'WBTC',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none'%3E%3Ccircle fill='%23201A2D' cx='16' cy='16' r='16'/%3E%3Cg fill='%23FFF'%3E%3Cpath d='M22.818 9.586l-.6.6a8.494 8.494 0 010 11.464l.6.6a9.352 9.352 0 000-12.678v.014zM10.2 9.638a8.494 8.494 0 0111.464 0l.6-.6a9.352 9.352 0 00-12.678 0l.614.6zm-.562 12.018a8.494 8.494 0 010-11.458l-.6-.6a9.352 9.352 0 000 12.678l.6-.62zm12.018.554a8.494 8.494 0 01-11.464 0l-.6.6a9.352 9.352 0 0012.678 0l-.614-.6zm-1.942-8.286c-.12-1.252-1.2-1.672-2.566-1.8V10.4h-1.056v1.692h-.844V10.4H14.2v1.736h-2.142v1.13s.78-.014.768 0a.546.546 0 01.6.464v4.752a.37.37 0 01-.128.258.366.366 0 01-.272.092c.014.012-.768 0-.768 0l-.2 1.262h2.122v1.764h1.056V20.12h.844v1.73h1.058v-1.744c1.784-.108 3.028-.548 3.184-2.218.126-1.344-.506-1.944-1.516-2.186.614-.302.994-.862.908-1.778zm-1.48 3.756c0 1.312-2.248 1.162-2.964 1.162v-2.328c.716.002 2.964-.204 2.964 1.166zm-.49-3.28c0 1.2-1.876 1.054-2.472 1.054v-2.116c.596 0 2.472-.188 2.472 1.062z'/%3E%3Cpath d='M15.924 26.852C9.89 26.851 5 21.959 5 15.925 5 9.892 9.892 5 15.925 5c6.034 0 10.926 4.89 10.927 10.924a10.926 10.926 0 01-10.928 10.928zm0-21c-5.559.004-10.062 4.513-10.06 10.072.002 5.559 4.51 10.064 10.068 10.064 5.559 0 10.066-4.505 10.068-10.064A10.068 10.068 0 0015.924 5.852z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 8,\n id: 'wbtc.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Huobi BTC',\n symbol: 'HBTC',\n icon: null,\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'hbtc.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Celo Dollar',\n symbol: 'cUSD',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHdpZHRoPSIxMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTEwMCA1MGMwLTI3LjYxNDItMjIuMzg1OC01MC01MC01MHMtNTAgMjIuMzg1OC01MCA1MCAyMi4zODU4IDUwIDUwIDUwIDUwLTIyLjM4NTggNTAtNTB6IiBmaWxsPSIjNDVjZDg1Ii8+PGcgZmlsbD0iI2ZmZiI+PHBhdGggZD0ibTY5Ljg4MDUgNjIuNjQzOGMtMS41NjcxIDMuMzkzMS0zLjkzNzUgNi4zNTMyLTYuOTA2MSA4LjYyNDEtMi45Njg1IDIuMjcwOC02LjQ0NTggMy43ODQxLTEwLjEzMDcgNC40MDg3LTMuNjg1LjYyNDYtNy40NjY3LjM0MTctMTEuMDE3Ny0uODI0MS0zLjU1MTEtMS4xNjU4LTYuNzY0Ni0zLjE3OTQtOS4zNjIzLTUuODY2Ni0yLjU5NzgtMi42ODcxLTQuNTAxNS01Ljk2NjktNS41NDY1LTkuNTU1NC0xLjA0NDktMy41ODg1LTEuMTk5Ni03LjM3NzUtLjQ1MDctMTEuMDM5My43NDg5LTMuNjYxNyAyLjM3ODktNy4wODU3IDQuNzQ4OS05Ljk3NTggMi4zNzAxLTIuODkgNS40MDg3LTUuMTU4OSA4Ljg1MjktNi42MTAzbDIuMjY2OCA1LjM3OTJjLTIuNTcgMS4wODMxLTQuODM3NSAyLjc3NjEtNi42MDYgNC45MzI3LTEuNzY4NSAyLjE1NjUtMi45ODQ4IDQuNzExNS0zLjU0MzYgNy40NDM5LS41NTg5IDIuNzMyNC0uNDQzNSA1LjU1OTguMzM2MyA4LjIzNzYuNzc5OCAyLjY3NzcgMi4yMDAzIDUuMTI1MSA0LjEzODggNy4xMzAyIDEuOTM4NCAyLjAwNTIgNC4zMzYzIDMuNTA3OCA2Ljk4NjEgNC4zNzc3czUuNDcxNyAxLjA4MSA4LjIyMTUuNjE0OWMyLjc0OTctLjQ2NjEgNS4zNDQ0LTEuNTk1MyA3LjU1OTUtMy4yODk4IDIuMjE1Mi0xLjY5NDUgMy45ODQtMy45MDMzIDUuMTUzNC02LjQzNTNsNS45MTg5LjMwNDJ6Ii8+PHBhdGggZD0ibTU2LjEwNjEgMjQuNXYtNGg0LjUwMDV2NGMyIDAgNS4xNjY3LjY2NjcgNi41IDF2NC41Yy0xOS0zLTE1LjUwMTEgMy44NDYyLTggNSA2LjcyMTcgMS4wMzM5IDExIDIgMTEuNSA5IC40IDUuNi01LjgzMzMgNy42NjY3LTkgOHYzLjVoLTV2LTMuNWMtMi40IDAtNi42NjY3LTEuNjY2Ny04LjUtMi41di01LjVjNC41IDIuNSAxNyA0LjUgMTcgMHMtMTYuNTAxMS0zLTE4LjAwMDUtMTFjLTEuMDAyMy01LjM0NzUgNS4zMzMzLTcuODMzMyA5LTguNXoiLz48L2c+PC9zdmc+',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'cusd.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'LiNEAR',\n symbol: 'LINEAR',\n icon:\n \"data:image/svg+xml,%3Csvg width='40' height='40' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M30.74 28.78c.21-.36.32-.78.32-1.21v-6.33c0-.24-.06-.46-.17-.66-.12-.21-.28-.38-.48-.49l-16.86-9.77c-.35-.2-.73-.31-1.13-.32-.64 0-1.24.26-1.69.72-.45.45-.7 1.07-.71 1.71v6.39c0 .24.06.47.18.67.11.21.28.37.48.48l16.82 9.71c.36.22.77.32 1.19.32.41 0 .82-.12 1.19-.33.36-.21.66-.52.86-.89zm.32-16.27c0-.42-.1-.84-.29-1.21-.2-.38-.49-.7-.85-.93-.36-.22-.78-.34-1.21-.34-.42 0-.84.12-1.21.34l-4.97 2.81c-.04.02-.08.07-.1.12-.03.04-.04.1-.04.14 0 .06.01.11.04.16.02.04.06.08.1.1l8.05 4.62c.05.02.1.04.15.04.05 0 .1-.02.15-.05.04-.02.08-.06.11-.11.02-.04.04-.1.03-.15l.04-5.54zM10.05 27.5c-.01.43.08.86.28 1.23.2.38.49.7.85.93.36.22.78.34 1.2.34.42 0 .83-.12 1.2-.34l4.92-2.85c.04-.02.08-.06.1-.11.03-.04.05-.1.05-.15 0-.05-.02-.11-.05-.15-.02-.05-.06-.09-.1-.12l-8.05-4.6c-.05-.03-.09-.04-.15-.04-.05 0-.1.01-.15.04-.05.02-.08.07-.11.12-.02.04-.04.09-.04.14l.05 5.56z' fill='url(%23paint0_linear_186_370)'/%3E%3Cdefs%3E%3ClinearGradient id='paint0_linear_186_370' x1='11.135' y1='11.152' x2='30.145' y2='30.457' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%231BB3CC'/%3E%3Cstop offset='1' stop-color='%23824ACC'/%3E%3C/linearGradient%3E%3C/defs%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'linear-protocol.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Staked NEAR',\n symbol: 'STNEAR',\n icon:\n \"data:image/svg+xml,%3Csvg width='96' height='96' viewBox='0 0 96 96' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='96' height='96' rx='48' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M48.0006 20L41.2575 26.7431L48.0006 33.4862L54.7437 26.7431L48.0006 20ZM37.281 30.7188L30.7144 37.2853L47.9998 54.5707L65.2851 37.2853L58.7186 30.7188L47.9998 41.4376L37.281 30.7188ZM26.7384 41.261L19.9953 48.0041L47.9995 76.0083L76.0037 48.0041L69.2606 41.2611L47.9995 62.5221L26.7384 41.261Z' fill='%23231B51'/%3E%3C/svg%3E\",\n reference: 'https://metapool.app',\n reference_hash: null,\n decimals: 24,\n id: 'meta-v2.pool.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'NearX',\n symbol: 'NearX',\n icon:\n \"data:image/svg+xml,%0A%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M24 12C24 18.6274 18.6274 24 12 24C5.37258 24 0 18.6274 0 12C0 5.37258 5.37258 0 12 0C18.6274 0 24 5.37258 24 12ZM17.1421 21.3848L21.3848 17.1421L19.3669 15.1243C18.5576 17.0303 17.0303 18.5576 15.1243 19.3669L17.1421 21.3848ZM9.43294 19.5793C7.45322 18.909 5.82115 17.4848 4.87848 15.6484L3.24264 17.2843L7.48528 21.5269L9.43294 19.5793ZM4.63306 8.8757C5.44239 6.96975 6.96975 5.44239 8.8757 4.63306L7.24264 3L3 7.24264L4.63306 8.8757ZM15.6484 4.87848L17.3848 3.14214L21.6274 7.38478L19.5793 9.43294C18.909 7.45322 17.4848 5.82115 15.6484 4.87848Z' fill='black'/%3E%3Cpath d='M8.00119 11.9921C8.00119 11.0268 8.00119 10.0615 8.00119 9.09612C8.00119 8.50505 8.16497 8.1743 8.56285 8.05781C8.97778 7.93628 9.40619 7.97917 9.79565 8.45228C11.3533 10.3447 12.9343 12.218 14.5092 14.0959C14.5692 14.1676 14.6117 14.3122 14.734 14.2626C14.8496 14.2157 14.7858 14.0805 14.786 13.9878C14.7904 12.6326 14.7898 11.2774 14.7868 9.92226C14.7868 9.83668 14.838 9.7162 14.7271 9.67372C14.6401 9.64029 14.5824 9.74185 14.522 9.79358C14.0492 10.1981 13.5804 10.6073 13.1088 11.0133C13.0208 11.089 12.9332 11.2118 12.8002 11.1012C12.6657 10.9894 12.7696 10.8872 12.8364 10.7881C13.3547 10.0186 13.8728 9.24898 14.3909 8.47919C14.6656 8.07085 15.0079 7.92282 15.4056 8.04141C15.786 8.15475 15.9986 8.48592 15.9992 8.97668C16.0007 10.0905 15.9996 11.2045 15.9996 12.3183C15.9996 13.2094 16.0003 14.1005 15.9994 14.9916C15.999 15.4826 15.8137 15.798 15.4512 15.9324C15.0256 16.0901 14.5767 15.9683 14.2734 15.6058C12.6823 13.705 11.0924 11.8029 9.50198 9.90144C9.46029 9.85161 9.42303 9.7961 9.37377 9.75489C9.28998 9.68487 9.21967 9.68108 9.21314 9.81797C9.20999 9.88273 9.21188 9.94791 9.21188 10.0129C9.21188 11.3496 9.21062 12.6862 9.2142 14.0227C9.21441 14.1186 9.15609 14.2557 9.26114 14.3038C9.38093 14.3587 9.45061 14.2178 9.52998 14.1503C9.98259 13.7651 10.4291 13.3728 10.8805 12.9859C10.9729 12.9066 11.0626 12.7651 11.208 12.8973C11.3402 13.0176 11.2213 13.1196 11.159 13.2127C10.6323 13.9989 10.1032 14.7837 9.57145 15.5663C9.32788 15.9248 8.9881 16.056 8.61085 15.9488C8.23739 15.8428 8.00498 15.5246 8.00287 15.0827C7.99761 14.0523 8.00119 13.022 8.00119 11.9917V11.9921Z' fill='white'/%3E%3C/svg%3E\",\n reference: 'https://near.staderlabs.com',\n reference_hash: null,\n decimals: 24,\n id: 'v2-nearx.staderlabs.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'refLove Finance Token',\n symbol: 'refLove',\n icon:\n 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIxLjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAyODggMzI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyODggMzI0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzAwQzA4Qjt9Cjwvc3R5bGU+CjxnPgoJPHBhdGggZD0iTTE3My40LDE5MS40VjI2OEgyNTBMMTczLjQsMTkxLjR6IE0xMDcuMiwxMjUuMmwzMCwzMGwzMC4zLTMwLjNWNjkuMmgtNjAuNFYxMjUuMnogTTEwNy4yLDE1Mi4zVjI2OGg2MC40VjE1MmwtMzAuMywzMC4zCgkJTDEwNy4yLDE1Mi4zeiBNMTc3LjEsNjkuMmgtMy43VjExOUwyMTIsODAuNUMyMDEuOCw3My4yLDE4OS42LDY5LjIsMTc3LjEsNjkuMnogTTM4LDE3NS41VjI2OGg2My4zVjE0Ni40bC0xNy4xLTE3LjFMMzgsMTc1LjV6CgkJIE0zOCwxNDguNWw0Ni4yLTQ2LjJsMTcuMSwxNy4xVjY5LjJIMzhWMTQ4LjV6IE0yMzYuOCwxMjguOUwyMzYuOCwxMjguOWMwLTEyLjUtMy45LTI0LjctMTEuMi0zNC44bC01Mi4xLDUydjQyLjRoMy43CgkJQzIxMC4xLDE4OC41LDIzNi44LDE2MS44LDIzNi44LDEyOC45eiIvPgoJPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIyMTAuMiw1NiAyNTAsOTUuOCAyNTAsNTYgCSIvPgo8L2c+Cjwvc3ZnPgo=',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'v010.refve.testnet',\n },\n {\n decimals: 18,\n icon:\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAs3SURBVHhe7Z1XqBQ9FMdFsYu999577wUfbCiiPoggFkQsCKJP9t57V7AgimLBjg8qKmLBXrD33hVUEAQ1H7+QXMb9Zndnd+/MJJf7h8Pu3c3Mzua3yTk5SeZmEZkySplADFMmEMOUCcQwZQggHz58EHfu3FF/2a0MAWTjxo2iWbNm6i+7ZT2QW7duiUWLFolixYqJQ4cOqVftlfVAZs6cKdauXSuqV68uKlWqpF61V1YDoUXMmTNHrFu3TtSoUUNCmTBhgnrXTlkL5Nu3b2Ly5MmyuwJIzZo1RaNGjUTx4sXFu3fvVCn7ZC2QVatWiQULFvwPSL169USnTp1UKftkJZCbN2+KGTNmSBiLFy/+BwhWoUIFsX//flXaLlkJZPr06WkwIoE0btxYNGzYUFSsWFGVtkvWATlw4IB05BqGGxAMBz9u3Dh1lD2yCsjXr1/THHk8IDwvVaqUeP36tTraDlkFZOXKldKRO2HEAoKD79ixozraDlkD5Pr16/848nhANBQc/N69e9VZzJc1QCIduRcgGA4eKLbICiD79u37nyN3WiwgvMZ7Y8eOVWczW8YDwZFPmTIlauvA4gHhsUSJEuLFixfqrObKeCArVqxwdeROiwUE43UcfNu2bdVZzZXRQK5duyYduRsEp8UDog1fsnPnTnV2M2U0kFiO3GlegeDgy5cvr85upowFQqg6d+5cVwCR5hUI71NuzJgx6lPMk5FAPn365Doij2ZegWCUIUX/9OlT9WlmyUggy5Yti+vInZYIEAwH37JlS/VpZsk4IJcvX5bTsl5bB5YoEMqRDd62bZv6VHNkHJBp06YlBANLFAiGgy9btqz6VHNkFJBdu3Z5duROSwYIxjEjRoxQn26GjAHy8ePHuCPyaJYsEMozgn/48KG6ivBlDJAlS5Yk5MidlgqQ+vXri+bNm6urCF9GALl48aJ05G6V7cWSBYJxDOu5Nm/erK4mXBkBJBlH7rRUgGAmOfjQgZBbSsaROy1VIBjHDxs2TF1VeAoVyPv37+WI3K2SE7H0AMKxJUuWFHfv3lVXF45CBZKKI3daegDBcPBNmzZVVxeOQgNy/vz5hEfkbsbxAGFtb6pAOL5y5cpye0NYCg1Iqo5c29KlS2WEVKdOHdGkSZOUoeDgS5cura4yeIUCZMeOHWLevHkpASEBScvAB/Xs2VMUKVJE1K1bV44pUgHDcbVq1RJDhgxRVxusAgfy5s0bMXXq1IRgOMsuX75c7gcZP368aN++vez3W7VqJfLnzy8KFCggU+tUKNncZMFwDA6eNcRBK3AgCxculOas8HiG82duffXq1WLkyJGiRYsWokGDBrI1UPHMlQOjaNGisqUUKlRIPrKclLKA0RUdWfnRDNCUD1qBAjl79qyYNWuWa6VHGq0CEGw7oHsaNGiQrCBMg9DmBKJNgylYsKAciQOFfYhUtlcwHEe3GKQCA/Lnzx/PyUMc9Zo1a+SAsV+/fvLXSgXxa3eCiAXECaZw4cISDPPpGijniweG93HwXHtQCgwIk0E4cjcAGhItAf8AuG7dukknzbgAENFgYLGAaNNgKMcibGYNdXdGxUeDgz8aOHCg+hb+KxAgr169kpUcCUKb01GzOJrKonuJB0KbFyBOAw4thgCgdu3aaWAA4AYGB8/a4iAUCBBG405Hrv2Dm6MGhFulx7JEgWjTYHisVq2a/GxapBMGgLguLAj5DuTMmTP/OHLtqPETdAW6u4h01IlYskC06e6MIICROlA0GH19vM51+y1fgfz+/TvNkWtHjR/p27ev7JboJrx2S7EsVSAYUDCgcC4CAEbtXJsGg4PnO/kpX4Fs3bpVwiB0BEz37t09O+pELD2AOE23GM5ZpkwZGeVxraRnBgwYoL6dP/INCCNyfAeOukOHDmmZVLcKTdXSG4jTNBidAaDlXLlyRX3L9JdvQPr06SObvHbU6dUa3MxPINp0d5Y3b16RJ08e9S3TX74Befz4sejcubOoWrWqdNi2AgEEj8DIkiWLdO4PHjxQ3zL95asPQQcPHpSTR/gOv6D4BUQ7+uzZs4usWbOK7du3q2/ln3wHosU+j3LlysmIxa1SUzG/gOTLl0+2ilGjRqlv4b8CA4K+fPkievXqJZt9MgPAaJbeQHT3hA9kJX6QChSI1smTJ+U4RKct3Co5EUsvIHRP2bJlEzlz5hRHjhxRVxusfANy4cIF9Sy6GLnrAZhbRXu1VIEAguiJVuHlfltbtmxRz9JfvgHhxpQMBt++fatecdfPnz/lYIvtAcmOU1IBQi4LEG3atJHXEkssEWK0fvv2bfVK+svXLosJKW4AQ3QSb07h6tWr0uEz+Eq0G0sGCAM+IieOI98WS3///hVDhw4VOXLkkAlRP+W7D9mwYYNMLtJa4n1xRBqe3bIMKL2CSQQI3VPu3Lllq+C64olsNPMnBCJdunRRr/qnQJw6IS/pdypg/vz5cff38YscPny49C9eujGvQCgDiB49eqhPii4WgJPuAQQ+Lqi1v4EAefToUVrWFzCsyWIx2q9fv1QJd92/f1+0bt1aLlaINdqPB4TuCRD80rmtbCzhR8hG66SizvKeOHFClfBXgQBBe/bskfcr0dO1pOFZU3Xs2DFVIrqY/q1SpUpa1tUrELqnXLlySRhe5jKYw2d2kHBcz4OwIjLIXVaBAUF0V5Ezh7Nnz5Z27949VSq6CBDoOphHiQYECDyyTgsQ/fv3V0dH1/Hjx2V6h7wbEAguMH4ABBlBKlAgbneE090Yd21Yv369+P79uyrtrpcvX/6TtIwEorsnlvA8efJEHeUuRuFdu3aVKR2CCCcMnpNyf/78uSodjAIFgk6fPh11txQtCGBebhlO0pLuhKSlBkISEBhMjMXTxIkTZYVzvBOEhgFQriloBQ4EEUrGWhKEryEyu3HjhjoiuggWqDxAeOnrufcW5QkUIkFoGEBiUi0MhQKEeel4q995DyjcZ/Hz58/qSHfRrcTbSUuZdu3ayTEOYawbDIz3iLDiRYB+KRQgiP/3waJrNxjagMI0MK2AKC1ZjR49Wm5/JqEZDQTGe8A4fPiwOjJ4hQYEsS3By/5CwFCOVsWAzatIAhKVed3MQznWEIepUIEg/IUzFI5lgCEgYG1XrKQlyT9CY3wFXZBb5UcaURZ+JWyFDoSs8KRJk2L6E6dRDoB0YyQtneukSGAOHjxYDu70KNut8iONckRcJvzbpNCBIAZmXrcpYBoekRpgyBQzhiE1wkDOKwiMsuSr6BJNkBFAENEU45DIyo9nwGGxNs44ERAY5QlxmQsxRcYAIcxMdKubtmS3RVOe7u3Hjx/qKsKXMUAQA0EiKbdKj2XJAiEC2717t/p0M2QUEETaw0so7LREgVCO8l4Sj0HLOCAIB+81FMYSAUIZQmGSkybKSCAs1I7MCseyRIEwaveSJwtDRgJBR48e9RwKewXC+0x0AdtUGQsEMSL3cnMaL0B4j1wWc/Qmy2ggzG/ruXg3ENq8AmHgyCSZyTIaCLp06VLce8DHA8LrrGDxMnEVtowHgjZt2hR1QguLB4R0Su/evdXZzJYVQJBe25UoELK4Nv1PQ2uAPHv2LKo/iQaEv0mNeFn4bYqsAYL4p5IsGfIChOfMb7Dp1CZZBQTRQiJDYTcgerrWNlkHhHVbkV1XJBAemXDirqe2yTog6Ny5c9LJayhOIBgrS1h1b6OsBIKocB0KO4FwtwVu7WSrrAWC9NouDYQsLstCbZbVQNjmwCwjQFjCwzTuqVOn1Lt2ymogiBk/PafOfbdsl/VAEEBs+gfEsZQhgDChxVKgjKAMASQjKROIYcoEYpgygRglIf4D6lp/+XognSwAAAAASUVORK5CYII=',\n name: 'Ether',\n reference: null,\n reference_hash: null,\n spec: 'ft-1.0.0',\n symbol: 'ETH',\n id: 'aurora',\n },\n {\n spec: 'ft-1.0.0',\n name: 'USDT',\n symbol: 'USDT',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 288 288'%3E%3Cg id='l' data-name='l'%3E%3Cpath d='M187.58,79.81l-30.1,44.69a3.2,3.2,0,0,0,4.75,4.2L191.86,103a1.2,1.2,0,0,1,2,.91v80.46a1.2,1.2,0,0,1-2.12.77L102.18,77.93A15.35,15.35,0,0,0,90.47,72.5H87.34A15.34,15.34,0,0,0,72,87.84V201.16A15.34,15.34,0,0,0,87.34,216.5h0a15.35,15.35,0,0,0,13.08-7.31l30.1-44.69a3.2,3.2,0,0,0-4.75-4.2L96.14,186a1.2,1.2,0,0,1-2-.91V104.61a1.2,1.2,0,0,1,2.12-.77l89.55,107.23a15.35,15.35,0,0,0,11.71,5.43h3.13A15.34,15.34,0,0,0,216,201.16V87.84A15.34,15.34,0,0,0,200.66,72.5h0A15.35,15.35,0,0,0,187.58,79.81Z'/%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'usdt.itachicara.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'USDC',\n symbol: 'USDC',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 288 288'%3E%3Cg id='l' data-name='l'%3E%3Cpath d='M187.58,79.81l-30.1,44.69a3.2,3.2,0,0,0,4.75,4.2L191.86,103a1.2,1.2,0,0,1,2,.91v80.46a1.2,1.2,0,0,1-2.12.77L102.18,77.93A15.35,15.35,0,0,0,90.47,72.5H87.34A15.34,15.34,0,0,0,72,87.84V201.16A15.34,15.34,0,0,0,87.34,216.5h0a15.35,15.35,0,0,0,13.08-7.31l30.1-44.69a3.2,3.2,0,0,0-4.75-4.2L96.14,186a1.2,1.2,0,0,1-2-.91V104.61a1.2,1.2,0,0,1,2.12-.77l89.55,107.23a15.35,15.35,0,0,0,11.71,5.43h3.13A15.34,15.34,0,0,0,216,201.16V87.84A15.34,15.34,0,0,0,200.66,72.5h0A15.35,15.35,0,0,0,187.58,79.81Z'/%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'usdc.itachicara.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Staked CORN',\n symbol: 'xCORN',\n icon:\n \"data:image/svg+xml,%3Csvg width='300' height='300' viewBox='0 0 300 300' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M150.43 32L99.7144 61.4389L150.43 90.8705L201.145 61.4389L150.43 32Z' fill='%235C65A5'/%3E%3Cpath d='M201.146 61.4388L150.431 90.8703L201.146 120.309L251.854 90.8703L201.146 61.4388Z' fill='%233B4274'/%3E%3Cpath d='M99.7152 61.4388L49 90.8703L99.7152 120.309L150.43 90.8703L99.7152 61.4388Z' fill='%233B4274'/%3E%3Cpath d='M150.43 90.8707L99.7144 120.31L150.43 149.749L201.145 120.31L150.43 90.8707Z' fill='%235C65A5'/%3E%3Cpath d='M99.7152 120.31L49 90.8707V149.749L99.7152 179.187V120.31Z' fill='%235C65A5'/%3E%3Cpath d='M150.43 149.748L99.7144 120.309V179.187L150.43 208.626V149.748Z' fill='%233B4274'/%3E%3Cpath d='M99.7152 179.187L49 149.748V208.626L99.7152 238.058V179.187Z' fill='%233B4274'/%3E%3Cpath d='M150.43 208.626L99.7144 179.187V238.057L150.43 267.496V208.626Z' fill='%235C65A5'/%3E%3Cpath d='M150.431 267.496L201.146 238.057L150.431 208.626V267.496Z' fill='%233B4274'/%3E%3Cpath d='M224.085 213.702L209.447 198.197L194.809 213.702H167.656L195.643 182.183L167.656 150.665H194.809L209.447 166.933L224.085 150.665H251.086L223.175 182.183L251.086 213.702H224.085Z' fill='%233B4274'/%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'xcorn.corndao.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Tether USD',\n symbol: 'USDt',\n icon:\n \"data:image/svg+xml,%3Csvg width='111' height='90' viewBox='0 0 111 90' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M24.4825 0.862305H88.0496C89.5663 0.862305 90.9675 1.64827 91.7239 2.92338L110.244 34.1419C111.204 35.7609 110.919 37.8043 109.549 39.1171L58.5729 87.9703C56.9216 89.5528 54.2652 89.5528 52.6139 87.9703L1.70699 39.1831C0.305262 37.8398 0.0427812 35.7367 1.07354 34.1077L20.8696 2.82322C21.6406 1.60483 23.0087 0.862305 24.4825 0.862305ZM79.8419 14.8003V23.5597H61.7343V29.6329C74.4518 30.2819 83.9934 32.9475 84.0642 36.1425L84.0638 42.803C83.993 45.998 74.4518 48.6635 61.7343 49.3125V64.2168H49.7105V49.3125C36.9929 48.6635 27.4513 45.998 27.3805 42.803L27.381 36.1425C27.4517 32.9475 36.9929 30.2819 49.7105 29.6329V23.5597H31.6028V14.8003H79.8419ZM55.7224 44.7367C69.2943 44.7367 80.6382 42.4827 83.4143 39.4727C81.0601 36.9202 72.5448 34.9114 61.7343 34.3597V40.7183C59.7966 40.8172 57.7852 40.8693 55.7224 40.8693C53.6595 40.8693 51.6481 40.8172 49.7105 40.7183V34.3597C38.8999 34.9114 30.3846 36.9202 28.0304 39.4727C30.8066 42.4827 42.1504 44.7367 55.7224 44.7367Z' fill='%23009393'/%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 6,\n id: 'usdtt.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Staked CORN',\n symbol: 'xCORN',\n icon:\n \"data:image/svg+xml,%3Csvg width='300' height='300' viewBox='0 0 300 300' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M150.43 32L99.7144 61.4389L150.43 90.8705L201.145 61.4389L150.43 32Z' fill='%235C65A5'/%3E%3Cpath d='M201.146 61.4388L150.431 90.8703L201.146 120.309L251.854 90.8703L201.146 61.4388Z' fill='%233B4274'/%3E%3Cpath d='M99.7152 61.4388L49 90.8703L99.7152 120.309L150.43 90.8703L99.7152 61.4388Z' fill='%233B4274'/%3E%3Cpath d='M150.43 90.8707L99.7144 120.31L150.43 149.749L201.145 120.31L150.43 90.8707Z' fill='%235C65A5'/%3E%3Cpath d='M99.7152 120.31L49 90.8707V149.749L99.7152 179.187V120.31Z' fill='%235C65A5'/%3E%3Cpath d='M150.43 149.748L99.7144 120.309V179.187L150.43 208.626V149.748Z' fill='%233B4274'/%3E%3Cpath d='M99.7152 179.187L49 149.748V208.626L99.7152 238.058V179.187Z' fill='%233B4274'/%3E%3Cpath d='M150.43 208.626L99.7144 179.187V238.057L150.43 267.496V208.626Z' fill='%235C65A5'/%3E%3Cpath d='M150.431 267.496L201.146 238.057L150.431 208.626V267.496Z' fill='%233B4274'/%3E%3Cpath d='M224.085 213.702L209.447 198.197L194.809 213.702H167.656L195.643 182.183L167.656 150.665H194.809L209.447 166.933L224.085 150.665H251.086L223.175 182.183L251.086 213.702H224.085Z' fill='%233B4274'/%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'xcorn.v1.corndao.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Tiptoken',\n symbol: 'TT',\n icon: null,\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'tiptoken.testnet',\n },\n];\n\nexport const DefaultMainnetTokenList = [\n {\n spec: 'ft-1.0.0',\n name: 'Wrapped NEAR fungible token',\n symbol: 'wNEAR',\n icon: null,\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'wrap.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'USD Coin',\n symbol: 'USDC',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none'%3E%3Ccircle cx='16' cy='16' r='16' fill='%232775C9'/%3E%3Cpath d='M15.75 27.5C9.26 27.5 4 22.24 4 15.75S9.26 4 15.75 4 27.5 9.26 27.5 15.75A11.75 11.75 0 0115.75 27.5zm-.7-16.11a2.58 2.58 0 00-2.45 2.47c0 1.21.74 2 2.31 2.33l1.1.26c1.07.25 1.51.61 1.51 1.22s-.77 1.21-1.77 1.21a1.9 1.9 0 01-1.8-.91.68.68 0 00-.61-.39h-.59a.35.35 0 00-.28.41 2.73 2.73 0 002.61 2.08v.84a.705.705 0 001.41 0v-.85a2.62 2.62 0 002.59-2.58c0-1.27-.73-2-2.46-2.37l-1-.22c-1-.25-1.47-.58-1.47-1.14 0-.56.6-1.18 1.6-1.18a1.64 1.64 0 011.59.81.8.8 0 00.72.46h.47a.42.42 0 00.31-.5 2.65 2.65 0 00-2.38-2v-.69a.705.705 0 00-1.41 0v.74zm-8.11 4.36a8.79 8.79 0 006 8.33h.14a.45.45 0 00.45-.45v-.21a.94.94 0 00-.58-.87 7.36 7.36 0 010-13.65.93.93 0 00.58-.86v-.23a.42.42 0 00-.56-.4 8.79 8.79 0 00-6.03 8.34zm17.62 0a8.79 8.79 0 00-6-8.32h-.15a.47.47 0 00-.47.47v.15a1 1 0 00.61.9 7.36 7.36 0 010 13.64 1 1 0 00-.6.89v.17a.47.47 0 00.62.44 8.79 8.79 0 005.99-8.34z' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 6,\n id: 'a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Tether USD',\n symbol: 'USDT.e',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Ccircle cx='16' cy='16' r='16' fill='%2326A17B'/%3E%3Cpath fill='%23FFF' d='M17.922 17.383v-.002c-.11.008-.677.042-1.942.042-1.01 0-1.721-.03-1.971-.042v.003c-3.888-.171-6.79-.848-6.79-1.658 0-.809 2.902-1.486 6.79-1.66v2.644c.254.018.982.061 1.988.061 1.207 0 1.812-.05 1.925-.06v-2.643c3.88.173 6.775.85 6.775 1.658 0 .81-2.895 1.485-6.775 1.657m0-3.59v-2.366h5.414V7.819H8.595v3.608h5.414v2.365c-4.4.202-7.709 1.074-7.709 2.118 0 1.044 3.309 1.915 7.709 2.118v7.582h3.913v-7.584c4.393-.202 7.694-1.073 7.694-2.116 0-1.043-3.301-1.914-7.694-2.117'/%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 6,\n id: 'dac17f958d2ee523a2206206994597c13d831ec7.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Dai Stablecoin',\n symbol: 'DAI',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Ccircle fill='%23F4B731' fill-rule='nonzero' cx='16' cy='16' r='16'/%3E%3Cpath d='M9.277 8h6.552c3.985 0 7.006 2.116 8.13 5.194H26v1.861h-1.611c.031.294.047.594.047.898v.046c0 .342-.02.68-.06 1.01H26v1.86h-2.08C22.767 21.905 19.77 24 15.83 24H9.277v-5.131H7v-1.86h2.277v-1.954H7v-1.86h2.277V8zm1.831 10.869v3.462h4.72c2.914 0 5.078-1.387 6.085-3.462H11.108zm11.366-1.86H11.108v-1.954h11.37c.041.307.063.622.063.944v.045c0 .329-.023.65-.067.964zM15.83 9.665c2.926 0 5.097 1.424 6.098 3.528h-10.82V9.666h4.72z' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '6b175474e89094c44da98b954eedeac495271d0f.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Wrapped Ether',\n symbol: 'WETH',\n icon: null,\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: 'c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: '1INCH Token',\n symbol: '1INCH',\n icon: null,\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '111111111117dc0aa78b770fa6a738034120c302.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Graph Token',\n symbol: 'GRT',\n icon: null,\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: 'c944e90c64b2c07662a292be6244bdf05cda44a7.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Skyward Finance Token',\n symbol: 'SKYWARD',\n icon:\n 'data:image/png;base64,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',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'token.skyward.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Banana',\n symbol: 'BANANA',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='256' height='256'%3E%3Cdefs%3E%3Ctext id='A' x='50' y='180' font-size='180'%3E🍌%3C/text%3E%3C/defs%3E%3Cuse xlink:href='%23A'/%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'berryclub.ek.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Cucumber',\n symbol: 'CUCUMBER',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='256' height='256'%3E%3Cdefs%3E%3Ctext id='A' x='50' y='180' font-size='180'%3E🥒%3C/text%3E%3C/defs%3E%3Cuse xlink:href='%23A'/%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'farm.berryclub.ek.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'HuobiToken',\n symbol: 'HT',\n icon: null,\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '6f259637dcd74c767781e37bc6133cd6a68aa161.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Gitcoin',\n symbol: 'GTC',\n icon: null,\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: 'de30da39c46104798bb5aa3fe8b9e0e1f348163f.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Uniswap',\n symbol: 'UNI',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Ccircle fill='%23FF007A' fill-rule='nonzero' cx='16' cy='16' r='16'/%3E%3Cg fill='%23FFF'%3E%3Cpath d='M12.261 5.767c-.285-.044-.297-.05-.163-.07.257-.04.865.015 1.284.114.977.233 1.866.828 2.816 1.885l.252.28.36-.057c1.52-.245 3.067-.05 4.36.547.356.164.917.491.987.576.023.026.064.199.091.383.096.637.048 1.125-.146 1.49-.106.198-.112.26-.041.43a.416.416 0 00.372.236c.322 0 .668-.52.828-1.243l.064-.287.126.143c.692.784 1.235 1.853 1.328 2.613l.025.199-.117-.18c-.2-.31-.4-.522-.658-.693-.464-.307-.955-.411-2.255-.48-1.174-.062-1.839-.162-2.497-.377-1.121-.365-1.686-.852-3.018-2.599-.591-.776-.957-1.205-1.32-1.55-.827-.786-1.639-1.198-2.678-1.36z' fill-rule='nonzero'/%3E%3Cpath d='M22.422 7.5c.03-.52.1-.863.242-1.176.056-.124.109-.226.117-.226a.773.773 0 01-.055.204c-.103.304-.12.72-.049 1.203.09.614.142.702.79 1.365.305.311.659.703.787.872l.233.306-.233-.219c-.285-.267-.941-.79-1.086-.864-.097-.05-.112-.049-.172.01-.055.056-.067.138-.074.529-.012.608-.095 1-.296 1.39-.108.21-.125.166-.027-.073.073-.178.08-.256.08-.845 0-1.184-.141-1.468-.966-1.956a9.046 9.046 0 00-.764-.396 2.916 2.916 0 01-.374-.182c.023-.023.827.211 1.15.336.482.185.561.209.62.186.039-.015.058-.129.077-.464zm-9.607 2.025c-.579-.797-.937-2.02-.86-2.934l.024-.283.132.024c.248.045.675.204.875.326.548.333.786.772 1.027 1.898.071.33.164.703.207.83.068.203.328.678.54.987.152.222.05.327-.286.297-.514-.047-1.21-.527-1.659-1.145zm8.905 5.935c-2.707-1.09-3.66-2.036-3.66-3.632 0-.235.008-.427.017-.427.01 0 .115.077.233.172.549.44 1.164.628 2.865.876 1.001.147 1.565.265 2.085.437 1.652.548 2.674 1.66 2.918 3.174.07.44.029 1.265-.086 1.7-.09.344-.367.963-.44.987-.02.006-.04-.071-.046-.178-.028-.568-.315-1.122-.798-1.537-.549-.471-1.286-.847-3.089-1.572zm-1.9.452a4.808 4.808 0 00-.131-.572l-.07-.206.129.144c.177.2.318.454.436.794.091.259.101.336.1.757 0 .414-.011.5-.095.734a2.32 2.32 0 01-.571.908c-.495.504-1.13.782-2.048.898-.16.02-.624.054-1.033.075-1.03.054-1.707.164-2.316.378a.488.488 0 01-.174.042c-.024-.025.39-.272.733-.437.483-.233.963-.36 2.04-.539.532-.089 1.082-.196 1.221-.239 1.318-.404 1.995-1.446 1.778-2.737z' fill-rule='nonzero'/%3E%3Cpath d='M21.06 18.116c-.36-.773-.442-1.52-.245-2.216.021-.074.055-.135.075-.135a.73.73 0 01.189.102c.166.112.498.3 1.383.782 1.105.603 1.735 1.07 2.164 1.602.375.467.607.999.719 1.647.063.367.026 1.25-.068 1.62-.297 1.166-.988 2.082-1.972 2.616a2.53 2.53 0 01-.288.143c-.014 0 .038-.133.117-.297.33-.692.369-1.366.118-2.116-.153-.459-.466-1.02-1.097-1.966-.734-1.1-.914-1.394-1.095-1.782zm-10.167 4.171c1.005-.848 2.254-1.45 3.393-1.635.49-.08 1.308-.048 1.762.068.728.186 1.38.604 1.719 1.101.33.486.473.91.62 1.852.06.372.123.745.142.83.11.488.327.879.595 1.075.425.311 1.158.33 1.878.05a.981.981 0 01.236-.074c.026.026-.336.269-.592.397a2.014 2.014 0 01-.983.238c-.66 0-1.208-.335-1.665-1.02-.09-.135-.292-.538-.45-.897-.482-1.1-.72-1.436-1.28-1.803-.489-.32-1.118-.377-1.591-.145-.622.305-.795 1.1-.35 1.603.177.2.507.373.777.406a.83.83 0 00.939-.83c0-.332-.128-.52-.448-.665-.437-.197-.907.033-.905.444.001.175.077.285.253.365.113.05.115.055.023.036-.401-.084-.495-.567-.172-.888.387-.386 1.188-.216 1.463.31.116.221.129.662.028.928-.225.595-.883.907-1.55.737-.454-.116-.639-.241-1.186-.805-.951-.98-1.32-1.17-2.692-1.384l-.263-.041.3-.253z' fill-rule='nonzero'/%3E%3Cpath d='M6.196 3.35l.096.117c3.708 4.54 5.624 6.896 5.746 7.064.2.278.125.527-.219.723-.191.109-.585.219-.781.219-.223 0-.474-.107-.657-.28-.129-.123-.65-.901-1.853-2.768a188.53 188.53 0 00-1.712-2.633c-.049-.046-.048-.045 1.618 2.936 1.046 1.872 1.4 2.533 1.4 2.622 0 .18-.05.274-.272.522-.37.413-.535.877-.655 1.837-.134 1.077-.51 1.837-1.554 3.138-.61.762-.71.902-.865 1.209-.194.386-.247.603-.269 1.091-.023.516.022.85.18 1.343.138.432.282.718.65 1.288.318.493.501.859.501 1.002 0 .114.022.114.515.003 1.179-.266 2.136-.735 2.675-1.309.333-.355.411-.551.414-1.038.001-.318-.01-.385-.096-.568-.14-.298-.395-.546-.957-.93-.737-.504-1.051-.91-1.138-1.467-.072-.457.011-.78.419-1.634.421-.884.526-1.26.597-2.151.045-.576.108-.803.274-.985.172-.19.328-.255.755-.313.696-.095 1.139-.275 1.503-.61.316-.292.448-.573.468-.995l.016-.32-.177-.206c-.254-.296-2.355-2.614-6.304-6.956l-.106-.115-.212.165zM7.91 19.732a.566.566 0 00-.174-.746c-.228-.152-.583-.08-.583.118 0 .06.033.104.108.143.127.065.136.139.037.288-.101.152-.093.286.023.377.186.146.45.065.59-.18zm5.524-7.176c-.327.1-.644.447-.743.81-.06.221-.026.61.064.73.145.194.286.245.666.242.744-.005 1.39-.324 1.466-.723.062-.327-.223-.78-.614-.98-.202-.102-.631-.143-.839-.079zm.87.68c.115-.163.064-.34-.13-.458-.372-.227-.934-.04-.934.312 0 .174.293.365.561.365.18 0 .424-.107.503-.219z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '1f9840a85d5af5bf1d1762f925bdaddc4201f984.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Wrapped BTC',\n symbol: 'WBTC',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none'%3E%3Ccircle fill='%23201A2D' cx='16' cy='16' r='16'/%3E%3Cg fill='%23FFF'%3E%3Cpath d='M22.818 9.586l-.6.6a8.494 8.494 0 010 11.464l.6.6a9.352 9.352 0 000-12.678v.014zM10.2 9.638a8.494 8.494 0 0111.464 0l.6-.6a9.352 9.352 0 00-12.678 0l.614.6zm-.562 12.018a8.494 8.494 0 010-11.458l-.6-.6a9.352 9.352 0 000 12.678l.6-.62zm12.018.554a8.494 8.494 0 01-11.464 0l-.6.6a9.352 9.352 0 0012.678 0l-.614-.6zm-1.942-8.286c-.12-1.252-1.2-1.672-2.566-1.8V10.4h-1.056v1.692h-.844V10.4H14.2v1.736h-2.142v1.13s.78-.014.768 0a.546.546 0 01.6.464v4.752a.37.37 0 01-.128.258.366.366 0 01-.272.092c.014.012-.768 0-.768 0l-.2 1.262h2.122v1.764h1.056V20.12h.844v1.73h1.058v-1.744c1.784-.108 3.028-.548 3.184-2.218.126-1.344-.506-1.944-1.516-2.186.614-.302.994-.862.908-1.778zm-1.48 3.756c0 1.312-2.248 1.162-2.964 1.162v-2.328c.716.002 2.964-.204 2.964 1.166zm-.49-3.28c0 1.2-1.876 1.054-2.472 1.054v-2.116c.596 0 2.472-.188 2.472 1.062z'/%3E%3Cpath d='M15.924 26.852C9.89 26.851 5 21.959 5 15.925 5 9.892 9.892 5 15.925 5c6.034 0 10.926 4.89 10.927 10.924a10.926 10.926 0 01-10.928 10.928zm0-21c-5.559.004-10.062 4.513-10.06 10.072.002 5.559 4.51 10.064 10.068 10.064 5.559 0 10.066-4.505 10.068-10.064A10.068 10.068 0 0015.924 5.852z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 8,\n id: '2260fac5e5542a773aa44fbcfedf7c193bc2c599.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'ChainLink Token',\n symbol: 'LINK',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none'%3E%3Ccircle fill='%232A5ADA' cx='16' cy='16' r='16'/%3E%3Cpath d='M16 6l-1.799 1.055L9.3 9.945 7.5 11v10l1.799 1.055 4.947 2.89L16.045 26l1.799-1.055 4.857-2.89L24.5 21V11l-1.799-1.055-4.902-2.89L16 6zm-4.902 12.89v-5.78L16 10.22l4.902 2.89v5.78L16 21.78l-4.902-2.89z' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '514910771af9ca656af840dff83e8264ecf986ca.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Octopus Network Token',\n symbol: 'OCT',\n icon:\n \"data:image/svg+xml,%3Csvg version='1.1' id='O' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 113.39 113.39' style='enable-background:new 0 0 113.39 113.39;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23014299;%7D .st1%7Bfill:%23FFFFFF;%7D %3C/style%3E%3Ccircle class='st0' cx='56.69' cy='56.69' r='56.69'/%3E%3Cg%3E%3Cpath class='st1' d='M44.25,59.41c-1.43,0-2.59,1.16-2.59,2.59v20.28c0,1.43,1.16,2.59,2.59,2.59c1.43,0,2.59-1.16,2.59-2.59V62 C46.84,60.57,45.68,59.41,44.25,59.41z'/%3E%3Cpath class='st1' d='M56.69,59.41c-1.45,0-2.62,1.17-2.62,2.62v26.47c0,1.45,1.17,2.62,2.62,2.62s2.62-1.17,2.62-2.62V62.02 C59.31,60.58,58.14,59.41,56.69,59.41z'/%3E%3Cpath class='st1' d='M79.26,78.87c-0.33,0.15-0.64,0.28-0.95,0.38c0,0-0.01,0-0.01,0c-0.59,0.19-1.13,0.29-1.63,0.31h-0.06 c-1,0.03-1.84-0.27-2.59-0.75c-0.49-0.32-0.91-0.73-1.25-1.23c-0.3-0.43-0.53-0.93-0.71-1.51c0-0.01-0.01-0.02-0.01-0.03 c-0.22-0.74-0.34-1.61-0.34-2.59V62.02c0-1.45-1.17-2.62-2.62-2.62c-1.45,0-2.62,1.17-2.62,2.62v11.43c0,4.5,1.64,8.03,4.63,9.96 c1.5,0.97,3.21,1.45,5.04,1.45c1.68,0,3.45-0.41,5.25-1.22c1.32-0.59,1.9-2.14,1.31-3.46C82.13,78.86,80.57,78.27,79.26,78.87z'/%3E%3Cpath class='st1' d='M68.33,45.9c0-2.15-1.75-3.9-3.9-3.9c-2.15,0-3.9,1.75-3.9,3.9s1.75,3.9,3.9,3.9 C66.58,49.8,68.33,48.05,68.33,45.9z'/%3E%3Cpath class='st1' d='M48.96,41.99c-2.15,0-3.9,1.75-3.9,3.9s1.75,3.9,3.9,3.9s3.9-1.75,3.9-3.9S51.11,41.99,48.96,41.99z'/%3E%3Cpath class='st1' d='M56.69,22.28c-15.17,0-27.52,12.34-27.52,27.52v15.09c0,1.46,1.18,2.64,2.64,2.64s2.64-1.18,2.64-2.64V49.8 c0-12.26,9.98-22.24,22.24-22.24c12.26,0,22.24,9.98,22.24,22.24v15.09c0,1.46,1.18,2.64,2.64,2.64s2.64-1.18,2.64-2.64V49.8 C84.21,34.62,71.87,22.28,56.69,22.28z'/%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: 'f5cfbc74057c610c8ef151a439252680ac68c6dc.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Ref Finance Token',\n symbol: 'REF',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='16 24 248 248' style='background: %23000'%3E%3Cpath d='M164,164v52h52Zm-45-45,20.4,20.4,20.6-20.6V81H119Zm0,18.39V216h41V137.19l-20.6,20.6ZM166.5,81H164v33.81l26.16-26.17A40.29,40.29,0,0,0,166.5,81ZM72,153.19V216h43V133.4l-11.6-11.61Zm0-18.38,31.4-31.4L115,115V81H72ZM207,121.5h0a40.29,40.29,0,0,0-7.64-23.66L164,133.19V162h2.5A40.5,40.5,0,0,0,207,121.5Z' fill='%23fff'/%3E%3Cpath d='M189 72l27 27V72h-27z' fill='%2300c08b'/%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'token.v2.ref-finance.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'HAPI',\n symbol: 'HAPI',\n icon:\n \"data:image/svg+xml,%3Csvg version='1.1' id='Layer_2' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='600px' height='600px' viewBox='0 0 600 600' enable-background='new 0 0 600 600' xml:space='preserve'%3E %3Cg%3E %3Cg%3E %3Cpath fill='%23141414' d='M263.7,122.8c-3.6,0.3-7.1,0.9-10.7,1.8c-24.5,6-40.3,18.1-50.4,31c24.5-4.7,49.9,1.3,67.3,7.4 c0.5,0.2,1,0.4,1.6,0.6c-2.7-4.2-5.2-9-7.2-14.4C261.2,141.1,261.6,131.6,263.7,122.8z'/%3E %3Cpath fill='%23141414' d='M201.2,197.7c-9.8-1.1-19.1-2.1-24.6-2.1c-0.7,0-1.4,0-2,0.1c-38.1,2.6-67.2,37.3-69.1,82.4 c-1.4,32.2,13.5,53.1,23.3,63.4c-1.5-12.5-0.1-25,4.3-37.3c11.7-32.6,34.3-42.1,60.6-53.1c10.8-4.5,22.5-9.5,34.3-16.6l50.1-39.6 c-10.1,2.2-24.4,4.5-42.9,5.3C227.1,200.6,213.9,199.1,201.2,197.7z'/%3E %3Cpath fill='%23141414' d='M319.1,176.5c-0.5,1.1,0.9,2.1,1.8,1.2c5.3-5.4,16.3-14.3,30.8-14.2c15.6,0.1,35.5,10.2,40.5,22.1 c4,9.8-6.6,16.5-6.6,16.5l0,0c-2.5-2.7-8-6.3-18.2-6.6c-15-0.5-25.3,12.1-24.1,12.9c7.5,4.7,17.3,3.7,23.1,3.5 c5.8-0.2,15.1-2.5,17.8-3.5c4.7-1.8,11.7-7.8,14.9-16.1c2.5-6.5,8.4-28.7-25.2-34.4C352.7,154.3,327,159.6,319.1,176.5z'/%3E %3Cpath fill='%23141414' d='M473.1,225.1c-0.5-0.6-1.1-1.3-1.7-2l-0.3-0.3c-3.9-4.4-7.6-8.3-9.4-10.1c1.2-4.2,4-16.2,1-26.1 c-2.3-7.7-6.8-15.5-9.2-19.4l-0.8-1.2h0c-0.4-0.6-0.8-1.2-1.1-1.7c-0.3-0.4-0.5-0.7-0.6-1l-0.2-0.7c-2.5-7-8.6-22.3-16.4-28.1 l59.4-91.7c2.3-3.5-2.1-7.5-5.4-5l-86.8,66.5c-8.7-12.3-21.1-21.8-21.8-22.4c-0.8-0.6-2-0.7-2.9-0.2c-0.9,0.5-1.4,1.6-1.3,2.6 c0,0.1,0.6,5.9-2.9,17.6c7.5,2.7,13.9,6,19.3,9.7l-4.5,3.5c-8.8-5.7-20-10.5-34.3-12.6c-17.7-2.6-31.9,1-42.1,10.7c0,0,0,0,0,0 c5.9,3.8,13.1,8.7,17,12.4c0.8,0.7,1.5,1.5,2.2,2.3c-3.1,0.9-6.2,1.9-9.3,2.9c-0.3-0.2-0.5-0.5-0.8-0.7c-1.9-1.7-4.4-3.4-7-5.3 c-5.4-3.8-11.7-8.3-15.8-14c-2.2-3.1-3.8-6.5-4.3-10.4c-0.3-2.4-1-4-2.2-4.9c0,0,0,0,0,0c0,0,0,0,0,0c-0.6-0.5-2.8-2-5.8,0.3 c-2,1.6-4.4,5.3-6.5,10.3c-5.2,12.3-8.7,32.1-1.8,46.1c1.2,2.3,2.4,4.5,3.7,6.6c-0.4,1-0.7,2.1-0.9,3.1c-0.6,3.4-0.9,7.8-1.2,12.7 c-19.8-8.3-50.5-17.5-78.5-10.7c-23.9,5.8-39.4,17.5-49.6,30c7.4-3.1,15.2-5,23.5-5.6c5.6-0.4,16.4,0.8,27.9,2.1 c11.8,1.3,25.3,2.8,32.9,2.4c19.2-0.8,33.7-3.3,43.5-5.6c0,5.4,0.1,11.1,0.4,16.9c0.7,16.8,2.5,34.3,5,46.5 c3.6,17.9,16.5,55.2,31.4,64.6c5.5,3.5,13.5,8.2,22.9,13.4c-2.5,6.4-5.1,15.1-5.1,23.5c0,15.2,5.2,26.6,11,37 c4.6,8.2,9.6,15.7,12.8,24c2.5,6.5-2.7,27.7-5.6,38.9c-1.2,4.5-1.9,7.3-1.7,7c3.7-5.1,7.5-10.8,11.3-16.8 c15.3-24.2,19.4-47,19.5-48l0.2-1.4l-1.1-1c-0.2-0.2-17.2-15.7-18.3-33.3c-0.4-6.9,1-11.5,4.3-13.8c0.5-0.3,1-0.6,1.6-0.9 c7.5,3.7,15,7.3,22.2,10.5c2.8,3.5,9,9.4,11.8,12c3.4,3.2,6.9,7.8,12.2,7.8c5.3,0,15.9,0,21.3,0s13.1,0,17.3-2.1 c4.2-2.1,10.9-5.6,11-12.6c0-1.5,0.4-3.9,0.9-6.8c3.7-4.9,4.1-10.6,4.8-19.2c0.5-5.7,1.7-15.5,3-25.9c2-15.7,4.1-32,3.9-37.9 c-0.2-8.2-1.1-14.3-1.4-16.2C475.3,249.4,479.5,232.4,473.1,225.1z M318,310.6c-13.3-8.4-25.6-44.6-29-61.2 c-4.8-23.9-6.9-68.5-3.9-86.8c2.7-16.7,49-34.5,81.7-35.6c1.9-0.1,3.8-0.1,5.6-0.1c1,0,2,0,3,0c-0.1,4.9,1.3,15.6,13.8,25.5 c13.9,11,30.4,5,30.4,5l12.1-18.7c4.5,3.5,9.4,12.7,13,22.1c-0.9-0.4-1.9-0.7-3.1-0.9c-8.1-1.3-31.6-0.9-24,31.3 c1,4,5.2,9.4,17.2,22.3c2.8,3,5.1,5.3,7,7.2c5.6,5.6,7.4,7.4,7.5,11.8c0,0.3-0.2,1.6-0.4,3c-0.8-0.6-1.9-1.1-3.4-1 c-3.6-0.2-33.7,5.6-42.4,15.1c-1.7,1.9-4.5,2.6-6.7,1.4c-0.1-0.1-0.2-0.1-0.3-0.2c-1.4-0.8-2.3-1.9-2.8-3.5 c-1.3-5.1,2.9-13.2,4.6-16c0.6-1,0.3-2.3-0.6-2.9c-1-0.6-2.3-0.3-2.9,0.6c-0.1,0.2-0.9,1.5-1.9,3.5c-3.3,6.6-8.2,12.2-14.3,16.3 c-9.8,6.6-24,15.2-35.5,18.2c-18,4.7-24.9-8.2-25.2-8.8c-0.5-1-1.8-1.4-2.8-0.9c-1,0.5-1.5,1.8-0.9,2.8 c0.1,0.1,6.3,12.1,21.5,12.1c0.6,0,1.4-0.1,2.2-0.2c4.3-0.5,8.6,0.5,12.3,2.7c3.5,2.1,8,4.7,12.5,7c12.6,6.3,14.7,6.2,19.5,5.4 c1.1-0.2,49.8-2.4,80.1-8.2l3.6,0.2c2.4,0.1,4.3,2.3,4,4.7l0,0.1c-0.2,1.4-1,2.6-2.2,3.3c-2.7,1.5-6.5,3.5-9.9,4.9 c-1.6,0.6-3.3,1.2-5.1,1.6c-5.5,1.3-11.1,1.6-11.1,1.6s-5.4,1.2-13.5,2.1c-3.4,0.4-7.2,0.7-11.3,0.9c-14,0.7-13,1.6-24.8,1 c-2.9-0.1-5.7-0.3-8.3-0.6c-2.5-0.3-3.2,3.4-0.7,4c6.1,1.5,13.3,2.6,21.3,2.5c1,0,1.9,0,2.9,0c12.8-0.1,24.4,7.5,29.4,19.3 c2.1,5,4.1,12,5.4,18.5c1.8,8.4-5.3,16.1-13.8,15.3c-12.5-1.3-26.6-4.8-34.6-8.3C365.3,338.1,332.4,319.8,318,310.6z M448.7,169.2 l1.2,1.9c2.4,4,5.9,10.5,7.9,16.9c3.1,10.4-1.4,24.4-1.4,24.5l-0.5,1.5l1.1,1.1c0,0.1,5,5.2,10.3,11.1l0.1,0.2 c0.6,0.7,1.2,1.3,1.8,2c3.7,4.3,1.9,17-0.1,23.9l-0.2,0.6l0.1,0.6c0,0,0.3,1.5,0.6,3.9c-2.7,0.3-4.7,2.7-4.4,5.5l0.8,7.5l-8.6,0.1 l-13.5-15.3c-1-1.2-1-3,0.2-4c0,0,0,0,0,0c7.1-6.4,8.1-9.5,8.3-10.7c0.9-5.4,1.2-7.4,1.2-8.1c0-6.1-2.9-9-8.7-14.8 c-1.9-1.9-4.2-4.2-6.9-7.1c-0.6-0.6-1.1-1.2-1.7-1.8c2.1,0.6,4.9,1.2,8.5,1.5c8.4,0.7,10.9-1.4,10.9-1.4s1.5-2.7-1.1-6.6 c-2.6-3.9-6.2-6.7-13.2-6.9c-5-0.2-9.5,3.7-11.7,6c-0.9-1-2.9-4.7-3.8-10.9c-1.5-9.7,2.1-14.2,4.7-16.4c4.6-3.9,10.9-7.7,14.4-7.5 c0.9,0.1,1.9,0.2,2.7,0.4C447.8,167.7,448.2,168.4,448.7,169.2z M463.4,332.9c-0.7,8.2-1.1,12.8-3.8,16.5c-2.3,3.1-7.3,0.8-6.6-3 c0.4-2.1,0.7-4.3,0.8-6.4c0.3-10.7-4.9-20.9-6.7-27.7c0,0,0-0.1,0-0.1c-0.9-3.8,1.2-7.7,4.8-9.3c1.6-0.7,3.4-1.6,5.3-2.6 c4.6-2.3,9.9,1.3,9.2,6.4l0,0.1C465.2,317.2,463.9,327.1,463.4,332.9z M385.1,249.4c1.8-1.3,4.4-0.8,5.6,1.2 c0.8,1.4,1.9,2.9,3.4,4.1c4.5,3.7,9.8,3.5,13.2,3.5c3.3,0,5.4-0.6,6-0.8c0,0,0,0,0,0c2.4-0.5,4.3,2,3.1,4.2 c-2.6,4.8-6.1,11.1-6.5,11.4c-0.7,0.5-22.8,5.1-25.6,5.4s-11.6,1.2-18.2-3c-2.8-1.7-5.5-3.7-7.7-5.3c-1.7-1.2-1.4-3.8,0.4-4.7 C368.8,260.4,378.7,253.9,385.1,249.4z M436.8,263.8l8.3,9.1c1.5,1.7,0.5,4.4-1.7,4.7c-5,0.6-10,1.2-14.9,1.7 c-2.3,0.2-3.9-2.3-2.7-4.3c1.9-3,4.3-7,6.5-10.8C433.2,262.6,435.5,262.4,436.8,263.8z M396.4,117.1l83.5-69.1l-76.9,76.9 c-2.5,2.4-6.6,1.6-8.1-1.5h0C393.9,121.2,394.5,118.5,396.4,117.1z'/%3E %3Cpath fill='%23141414' d='M196.6,258.1c-25.6,10.7-45.8,19.2-56.4,48.7c-15.1,42,9.4,88.5,62.5,120.1c-17.4-68,3.5-93.1,22.1-115.3 c6.4-7.7,12.5-15,16.9-23.7c12.9-25.8,12.3-50.5,11.1-62C233.7,242.5,214.1,250.8,196.6,258.1z'/%3E %3C/g%3E %3Cg%3E %3Cpath d='M201.6,477.1h-9.1l-2.8,17.1h-14.3l2.8-17.1h-9.1l-2.8,17.1h-9.3l-1.5,9.1h9.3l-2.3,14h-9.4l-1.5,9.1h9.4l-2.8,17.1h9.1 l2.8-17.1h14.3l-2.8,17.1h9.1l2.8-17.1h9.3l1.5-9.1h-9.3l2.3-14h9.4l1.5-9.1h-9.4L201.6,477.1z M186,517.4h-14.3l2.3-14h14.3 L186,517.4z'/%3E %3Cpolygon points='260.8,505.3 230,505.3 230,477.1 218,477.1 218,543.6 230,543.6 230,515.4 260.8,515.4 260.8,543.6 272.9,543.6 272.9,477.1 260.8,477.1 '/%3E %3Cpath d='M307.1,477.1l-23.4,66.4h12.8l5.5-16.4h25l5.5,16.4h12.8l-23.4-66.4H307.1z M305.3,517.5l9-26.8h0.5l9,26.8H305.3z'/%3E %3Cpath d='M394,480c-3.5-1.9-7.8-2.9-12.9-2.9h-24.9v66.4h12v-22.4H381c5.1,0,9.4-0.9,12.9-2.8s6.2-4.5,7.9-7.8 c1.8-3.3,2.7-7.1,2.7-11.3c0-4.2-0.9-8-2.7-11.3C400.1,484.5,397.4,481.9,394,480z M390.9,505.4c-0.9,1.8-2.3,3.2-4.2,4.3 c-1.9,1-4.3,1.6-7.3,1.6h-11.1v-24h11c3,0,5.5,0.5,7.4,1.5c1.9,1,3.3,2.4,4.2,4.2c0.9,1.8,1.4,3.9,1.4,6.2 S391.8,503.6,390.9,505.4z'/%3E %3Crect x='417.1' y='477.1' width='12' height='66.4'/%3E %3C/g%3E %3C/g%3E %3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: 'd9c2d319cd7e6177336b0a9c93c21cb48d84fb54.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'PARAS',\n symbol: 'PARAS',\n icon:\n 'data:image/png;base64,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',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'token.paras.near',\n },\n {\n spec: 'ft-1.0.0',\n name: '1MILNFT',\n symbol: '1MIL',\n icon:\n \"data:image/svg+xml,%3Csvg version='1.1' id='O' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 146 146' xml:space='preserve'%3E %3Cpath style='fill:%23ff00c6; stroke:none;' d='M0 0L0 31L31 31L31 0L0 0z'/%3E %3Cpath style='fill:%23df01ae; stroke:none;' d='M31 0L31 31L32 31L31 0z'/%3E %3Cpath style='fill:%23000000; stroke:none;' d='M32 0L32 32L0 32L0 38L32 38L32 70L0 70L0 76L32 76L32 109L0 109L0 114L32 114L32 146L38 146L38 114L70 114L70 146L76 146L76 114C82.7843 114 102.446 110.653 107.397 115.603C112.241 120.448 109 139.378 109 146L114 146L114 114L146 114L146 109C139.378 109 120.448 112.241 115.603 107.397C110.653 102.446 114 82.7843 114 76L146 76L146 70L114 70L114 38L146 38L146 32C139.378 32 120.448 35.2414 115.603 30.3966C110.759 25.5518 114 6.6225 114 0L109 0L109 32L76 32L76 0L71 0L71 32L38 32L38 0L32 0z'/%3E %3Cpath style='fill:%23459f00; stroke:none;' d='M38 0L38 32L70 32L70 31L39 31L38 0z'/%3E %3Cpath style='fill:%236fff00; stroke:none;' d='M39 0L39 31L70 31L70 0L39 0z'/%3E %3Cpath style='fill:%230d2000; stroke:none;' d='M70 0L70 32L71 32L70 0z'/%3E %3Cpath style='fill:%233f0180; stroke:none;' d='M76 0L76 32L108 32L108 31L77 31L76 0z'/%3E %3Cpath style='fill:%237f00ff; stroke:none;' d='M77 0L77 31L108 31L108 0L77 0z'/%3E %3Cpath style='fill:%232f0060; stroke:none;' d='M108 0L108 32L109 32L108 0z'/%3E %3Cpath style='fill:%231d4101; stroke:none;' d='M114 0L114 31L115 31L114 0z'/%3E %3Cpath style='fill:%236fff00; stroke:none;' d='M115 0L115 31L146 31L146 0L115 0z'/%3E %3Cpath style='fill:%239f017c; stroke:none;' d='M0 31L0 32L32 32L0 31z'/%3E %3Cpath style='fill:%23459f00; stroke:none;' d='M115 31L115 32L146 32L115 31z'/%3E %3Cpath style='fill:%2300f0ff; stroke:none;' d='M0 38L0 69L31 69L31 38L0 38z'/%3E %3Cpath style='fill:%2300d2df; stroke:none;' d='M31 38L31 69L0 69L0 70L32 70L31 38z'/%3E %3Cpath style='fill:%23be0094; stroke:none;' d='M38 38L38 70L39 70L38 38z'/%3E %3Cpath style='fill:%23ff00c6; stroke:none;' d='M39 38L39 69L70 69L70 38L39 38z'/%3E %3Cpath style='fill:%23200018; stroke:none;' d='M70 38L70 70L71 70L70 38z'/%3E %3Cpath style='fill:%23007880; stroke:none;' d='M76 38L76 70L77 70L76 38z'/%3E %3Cpath style='fill:%2300f0ff; stroke:none;' d='M77 38L77 69L108 69L108 38L77 38z'/%3E %3Cpath style='fill:%23015a60; stroke:none;' d='M108 38L108 70L109 70L108 38z'/%3E %3Cpath style='fill:%23400032; stroke:none;' d='M114 38L114 70L115 70L114 38z'/%3E %3Cpath style='fill:%23de00ad; stroke:none;' d='M115 38L115 39L146 39L115 38z'/%3E %3Cpath style='fill:%23ff00c6; stroke:none;' d='M115 39L115 70L146 70L146 39L115 39z'/%3E %3Cpath style='fill:%23df01ae; stroke:none;' d='M39 69L39 70L70 70L39 69z'/%3E %3Cpath style='fill:%2300d2df; stroke:none;' d='M77 69L77 70L108 70L77 69z'/%3E %3Cpath style='fill:%2354bf00; stroke:none;' d='M0 76L0 77L32 77L0 76z'/%3E %3Cpath style='fill:%235f00be; stroke:none;' d='M38 76L38 108L39 108L39 77L70 77L38 76z'/%3E %3Cpath style='fill:%230f001f; stroke:none;' d='M70 76L70 108L71 108L70 76z'/%3E %3Cpath style='fill:%23388000; stroke:none;' d='M76 76L76 108L77 108L76 76z'/%3E %3Cpath style='fill:%2354bf00; stroke:none;' d='M77 76L77 77L108 77L77 76z'/%3E %3Cpath style='fill:%232a6000; stroke:none;' d='M108 76L108 108L109 108L108 76z'/%3E %3Cpath style='fill:%23003d40; stroke:none;' d='M114 76L114 108L115 108L114 76z'/%3E %3Cpath style='fill:%2300b4bf; stroke:none;' d='M115 76L115 77L146 77L115 76z'/%3E %3Cpath style='fill:%236fff00; stroke:none;' d='M0 77L0 108L32 108L32 77L0 77z'/%3E %3Cpath style='fill:%237f00ff; stroke:none;' d='M39 77L39 108L70 108L70 77L39 77z'/%3E %3Cpath style='fill:%236fff00; stroke:none;' d='M77 77L77 108L108 108L108 77L77 77z'/%3E %3Cpath style='fill:%2300f0ff; stroke:none;' d='M115 77L115 108L146 108L146 77L115 77z'/%3E %3Cpath style='fill:%230f2000; stroke:none;' d='M0 108L0 109L32 109L0 108M76 108L76 109L108 109L76 108z'/%3E %3Cpath style='fill:%23001e20; stroke:none;' d='M115 108L115 109L146 109L115 108z'/%3E %3Cpath style='fill:%23810064; stroke:none;' d='M0 114L0 115L32 115L0 114z'/%3E %3Cpath style='fill:%23398000; stroke:none;' d='M38 114L38 115L70 115L38 114z'/%3E %3Cpath style='fill:%23800063; stroke:none;' d='M76 114L76 146L77 146L77 115L108 115L76 114z'/%3E %3Cpath style='fill:%23200041; stroke:none;' d='M114 114L114 146L115 146L114 114z'/%3E %3Cpath style='fill:%23410080; stroke:none;' d='M115 114L115 115L146 115L115 114z'/%3E %3Cpath style='fill:%23ff00c6; stroke:none;' d='M0 115L0 146L31 146L31 115L0 115z'/%3E %3Cpath style='fill:%23df01ae; stroke:none;' d='M31 115L31 146L32 146L31 115z'/%3E %3Cpath style='fill:%2354bf00; stroke:none;' d='M38 115L38 146L39 146L38 115z'/%3E %3Cpath style='fill:%236fff00; stroke:none;' d='M39 115L39 146L70 146L70 115L39 115z'/%3E %3Cpath style='fill:%23ff00c6; stroke:none;' d='M77 115L77 146L108 146L108 115L77 115z'/%3E %3Cpath style='fill:%2360004a; stroke:none;' d='M108 115L108 146L109 146L108 115z'/%3E %3Cpath style='fill:%237f00ff; stroke:none;' d='M115 115L115 146L146 146L146 115L115 115z'/%3E %3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: 'a4ef4b0b23c1fc81d3f9ecf93510e64f58a4a016.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'marma j token',\n symbol: 'marmaj',\n icon:\n 'data:image/jpeg;base64,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',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'marmaj.tkn.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Staked NEAR',\n symbol: 'STNEAR',\n icon:\n \"data:image/svg+xml,%3csvg width='96' height='96' viewBox='0 0 96 96' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='96' height='96' rx='48' fill='white'/%3e%3cpath fill-rule='evenodd' clip-rule='evenodd' d='M48.0006 20L41.2575 26.7431L48.0006 33.4862L54.7437 26.7431L48.0006 20ZM37.281 30.7188L30.7144 37.2853L47.9998 54.5707L65.2851 37.2853L58.7186 30.7188L47.9998 41.4376L37.281 30.7188ZM26.7384 41.261L19.9953 48.0041L47.9995 76.0083L76.0037 48.0041L69.2606 41.2611L47.9995 62.5221L26.7384 41.261Z' fill='%23231B51'/%3e%3c/svg%3e\",\n reference: 'https://metapool.app',\n reference_hash: null,\n decimals: 24,\n id: 'meta-pool.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Cheddar',\n symbol: 'Cheddar',\n icon:\n 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI1LjMuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCA2NCA2NCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNjQgNjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDp1cmwoI1hNTElEXzE2Xyk7fQoJLnN0MXtmaWxsOiNGRkU5NTk7fQoJLnN0MntvcGFjaXR5OjAuMjt9Cgkuc3Qze2ZpbGw6IzQyNDI0Mjt9Cgkuc3Q0e29wYWNpdHk6MC45O2ZpbGw6dXJsKCNYTUxJRF8xN18pO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAgICA7fQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMV8pO30KCS5zdDZ7ZmlsbDp1cmwoI1hNTElEXzE4Xyk7fQoJLnN0N3tvcGFjaXR5OjAuOTtmaWxsOnVybCgjWE1MSURfMTlfKTtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDh7ZmlsbDp1cmwoI1hNTElEXzIwXyk7fQoJLnN0OXtvcGFjaXR5OjAuOTtmaWxsOnVybCgjWE1MSURfMjFfKTtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDEwe2ZpbGw6dXJsKCNTVkdJRF8yXyk7fQoJLnN0MTF7b3BhY2l0eTowLjk7ZmlsbDp1cmwoI1hNTElEXzIyXyk7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cgkuc3QxMntmaWxsOnVybCgjWE1MSURfMjNfKTt9Cgkuc3QxM3tvcGFjaXR5OjAuOTtmaWxsOnVybCgjWE1MSURfMjRfKTtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDE0e2ZpbGw6dXJsKCNTVkdJRF8zXyk7fQoJLnN0MTV7ZmlsbDp1cmwoI1hNTElEXzI2Xyk7fQoJLnN0MTZ7b3BhY2l0eTowLjk7ZmlsbDp1cmwoI1hNTElEXzI3Xyk7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cgkuc3QxN3tmaWxsOnVybCgjWE1MSURfMzFfKTt9Cgkuc3QxOHtvcGFjaXR5OjAuOTtmaWxsOnVybCgjWE1MSURfMzNfKTtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDE5e2ZpbGw6dXJsKCNTVkdJRF80Xyk7fQoJLnN0MjB7b3BhY2l0eTowLjk7ZmlsbDp1cmwoI1hNTElEXzM0Xyk7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cgkuc3QyMXtmaWxsOnVybCgjWE1MSURfMzZfKTt9Cgkuc3QyMntvcGFjaXR5OjAuOTtmaWxsOnVybCgjWE1MSURfMzdfKTtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDIze2ZpbGw6dXJsKCNTVkdJRF81Xyk7fQoJLnN0MjR7ZmlsbDp1cmwoI1hNTElEXzM4Xyk7fQoJLnN0MjV7b3BhY2l0eTowLjk7ZmlsbDp1cmwoI1hNTElEXzM5Xyk7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cgkuc3QyNntmaWxsOnVybCgjWE1MSURfNDBfKTt9Cgkuc3QyN3tvcGFjaXR5OjAuOTtmaWxsOnVybCgjWE1MSURfNDFfKTtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDI4e2ZpbGw6dXJsKCNTVkdJRF82Xyk7fQoJLnN0Mjl7b3BhY2l0eTowLjk7ZmlsbDp1cmwoI1hNTElEXzQyXyk7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cjwvc3R5bGU+CjxnIGlkPSJMYXllcl8xXzFfIj4KCQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iWE1MSURfMTZfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ii0xODIxLjEzNTMiIHkxPSI5ODMuMTc0MyIgeDI9Ii0xODIxLjEzNTMiIHkyPSI5OTguMDU0MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMSAwIDAgMSAtMTc5MC4yNzUzIC05NDYpIj4KCQk8c3RvcCAgb2Zmc2V0PSIxLjk3MDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNGN0JDMDAiLz4KCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojRkNENzNFIi8+Cgk8L2xpbmVhckdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzY4XyIgY2xhc3M9InN0MCIgZD0iTTUyLjMsNDAuMnYxNC4xbC00MC4yLTYuMWMtMS41LTAuMy0yLjYtMS4zLTIuNi0yLjNjMC4xLTMuOC0wLjEtNy41LDAtMTEuMQoJCWMwLTAuNywwLjEtMS41LDEuMi0xLjdjMC43LTAuMSwxLjYsMC4yLDIuMywwLjNsNC45LDAuOGMwLDAuMSwwLDAuMywwLDAuNGMwLDEuNiwxLjcsMyw0LDMuMWMyLDAuMSwzLjYtMC44LDMuOS0yLjJMNDAuNiwzOAoJCWMtMC4xLDAuMi0wLjIsMC40LTAuMiwwLjVjMCwwLjcsMC45LDEuMywxLjksMS40YzEuMSwwLjEsMS45LTAuNCwxLjktMS4yYzAtMC4xLDAtMC4xLDAtMC4yQzQ0LjEsMzguNiw1Mi4zLDQwLjIsNTIuMyw0MC4yeiIvPgoJPHBhdGggY2xhc3M9InN0MSIgZD0iTTkuNSwzNC44YzAuMy0xLjItMC40LTIuNiwzLjUtMS41bDQuOSwwLjhjMC40LTEsMi0xLjYsMy44LTEuNGMyLjIsMC4xLDQsMS4zLDQsMi41YzAsMC4xLDAsMC4yLDAsMC4zCgkJTDQwLjUsMzhsMCwwYzAuMy0wLjMsMS0wLjQsMS43LTAuNGMxLDAuMSwxLjksMC41LDEuOSwxLjFsOC4yLDEuNkwzMC44LDI3LjVjLTItMS4yLTQuNS0xLjctNi43LTEuM2MtMi4yLDAuMy01LDAuOC03LjEsMS42CgkJYy0yLjUsMC45LTQuOCwyLjQtNi4yLDMuNmMtMC4xLDAuMS0wLjYsMC41LTAuOSwxLjFDOS41LDMzLDkuNSwzMy44LDkuNSwzNC44eiIvPgoJPGcgY2xhc3M9InN0MiI+CgkJPHBhdGggY2xhc3M9InN0MyIgZD0iTTI1LjQsMjdjMS42LDAsMy4zLDAuNCw0LjcsMS4zbDIxLDEyLjV2MTIuNmwtMzguOC01LjljLTAuOS0wLjItMS43LTAuOC0xLjYtMS40YzAtMi4yLDAtNC4zLDAtNi41CgkJCWMwLTEuNSwwLTMuMSwwLTQuN2MwLTAuMSwwLTAuMiwwLTAuNGwwLDBjMC0wLjUsMC4xLTEuMiwwLjMtMS42YzAuMi0wLjQsMC41LTAuNywwLjYtMC44YzEuNC0xLjEsMy42LTIuNSw1LjgtMy40CgkJCWMxLjYtMC42LDQtMS4xLDYuOC0xLjVDMjQuNiwyNywyNC45LDI3LDI1LjQsMjcgTTI1LjQsMjYuMWMtMC40LDAtMC45LDAtMS4zLDAuMWMtMi4yLDAuMy01LDAuOC03LjEsMS42CgkJCWMtMi41LDAuOS00LjgsMi40LTYuMiwzLjZjLTAuMSwwLjEtMC42LDAuNS0wLjksMS4xYy0wLjMsMC41LTAuMywxLjItMC40LDEuOWMwLDAuMiwwLDAuMywwLDAuNGMwLDMuNywwLjEsNy41LDAuMSwxMS4xCgkJCWMwLDEuMSwxLjEsMi4xLDIuNiwyLjNsNDAuMiw2LjFWNDAuMkwzMC44LDI3LjVDMjkuMiwyNi42LDI3LjMsMjYuMSwyNS40LDI2LjFMMjUuNCwyNi4xeiIvPgoJPC9nPgoJCgkJPHJhZGlhbEdyYWRpZW50IGlkPSJYTUxJRF8xN18iIGN4PSItMzA0NS4xOTg3IiBjeT0iMjA0Ny40NDY5IiByPSI2Ljg2ODciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDI1OCAwIDAgMC4zMjI1IC0xMjc5Ljk4MTMgLTYxNy4xODk5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguMTMwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0RFN0YxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzM4OSIgc3R5bGU9InN0b3AtY29sb3I6I0RBN0QxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNTk5MyIgc3R5bGU9InN0b3AtY29sb3I6I0NFNzYwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuODYwMiIgc3R5bGU9InN0b3AtY29sb3I6I0JBNkMwNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQUQ2NTAwIi8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzM1XyIgY2xhc3M9InN0NCIgZD0iTTE4LjQsNDMuOGMwLDEuMi0xLjMsMi4xLTMsMmMtMS42LTAuMS0zLTEuMi0zLTIuM3MxLjMtMi4xLDMtMkMxNyw0MS41LDE4LjQsNDIuNiwxOC40LDQzLjh6IgoJCS8+CgkKCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzFfIiBjeD0iLTMwNjQuNDI3NSIgY3k9IjIwMTUuOTU3IiByPSIxNC4xMzIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQyNTggMCAwIDAuMzIyNSAtMTI3OS45ODEzIC02MTcuMTg5OSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4LjEzMDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNERTdGMTQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjMzODkiIHN0eWxlPSJzdG9wLWNvbG9yOiNEQTdEMTIiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjU5OTMiIHN0eWxlPSJzdG9wLWNvbG9yOiNDRTc2MEQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjg2MDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQTZDMDUiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4NyIgc3R5bGU9InN0b3AtY29sb3I6I0FENjUwMCIvPgoJPC9yYWRpYWxHcmFkaWVudD4KCTxwYXRoIGNsYXNzPSJzdDUiIGQ9Ik0xNy44LDM0LjRjMCwxLjYsMS43LDMsNCwzLjFjMiwwLjEsMy42LTAuOCwzLjktMi4yaC0wLjFsLTAuMy0wLjFsMC40LDAuMWMwLTAuMSwwLTAuMiwwLTAuMwoJCWMwLTEuMy0xLjgtMi40LTQtMi41Yy0xLjgtMC4xLTMuNCwwLjUtMy44LDEuNEMxNy44LDM0LjIsMTcuOCwzNC40LDE3LjgsMzQuNHoiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMThfIiBjeD0iLTEzMjguMjIwMiIgY3k9IjM0ODEuNzQ3MSIgcj0iNy4xMDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMzA3OCAwLjIyMjggMC4yNDA5IDAuMTkwOSAtMTIyMS41MjUxIC0zNDAuNzk4NCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4Ljc1MDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNEOTk5MTQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjQwOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiNENTk2MTIiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjczNSIgc3R5bGU9InN0b3AtY29sb3I6I0M5OEQwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQkE4MjA3Ii8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzMyXyIgY2xhc3M9InN0NiIgZD0iTTI2LjgsMjkuNGMwLDAuNS0wLjksMS0yLDAuOXMtMi0wLjYtMi0xLjJzMC45LTEsMi0wLjlDMjYsMjguMiwyNi44LDI4LjgsMjYuOCwyOS40eiIvPgoJCgkJPHJhZGlhbEdyYWRpZW50IGlkPSJYTUxJRF8xOV8iIGN4PSItMzA3OS41NTMiIGN5PSIyMDQ0LjQxMSIgcj0iMTUuNjcyNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC40MjU4IDAgMCAwLjMyMjUgLTEyNzkuOTgxMyAtNjE3LjE4OTkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJPHN0b3AgIG9mZnNldD0iOC4xMzAwMDBlLTAyIiBzdHlsZT0ic3RvcC1jb2xvcjojREU3RjE0Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC4zMzg5IiBzdHlsZT0ic3RvcC1jb2xvcjojREE3RDEyIi8+CgkJPHN0b3AgIG9mZnNldD0iMC41OTkzIiBzdHlsZT0ic3RvcC1jb2xvcjojQ0U3NjBEIi8+CgkJPHN0b3AgIG9mZnNldD0iMC44NjAyIiBzdHlsZT0ic3RvcC1jb2xvcjojQkE2QzA1Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC45ODciIHN0eWxlPSJzdG9wLWNvbG9yOiNBRDY1MDAiLz4KCTwvcmFkaWFsR3JhZGllbnQ+Cgk8cGF0aCBpZD0iWE1MSURfMzBfIiBjbGFzcz0ic3Q3IiBkPSJNMzUuMSw0My40YzAsMi4xLTIuMiwzLjUtNSwzLjNzLTUtMi01LTRjMC0yLjEsMi4yLTMuNSw1LTMuM0MzMi44LDM5LjYsMzUuMSw0MS40LDM1LjEsNDMuNHoiCgkJLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMjBfIiBjeD0iLTMwNzYuMzYxNiIgY3k9IjIwMTEuMTY0OCIgcj0iMTAuOTExOCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC40MjU4IDAgMCAwLjMyMjUgLTEyNzkuOTgxMyAtNjE3LjE4OTkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJPHN0b3AgIG9mZnNldD0iOC43NTAwMDBlLTAyIiBzdHlsZT0ic3RvcC1jb2xvcjojRDk5OTE0Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC40MDk4IiBzdHlsZT0ic3RvcC1jb2xvcjojRDU5NjEyIi8+CgkJPHN0b3AgIG9mZnNldD0iMC43MzUiIHN0eWxlPSJzdG9wLWNvbG9yOiNDOThEMEQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4NyIgc3R5bGU9InN0b3AtY29sb3I6I0JBODIwNyIvPgoJPC9yYWRpYWxHcmFkaWVudD4KCTxwYXRoIGlkPSJYTUxJRF8yOV8iIGNsYXNzPSJzdDgiIGQ9Ik0zNS44LDMzLjFjMCwwLjgtMS4zLDEuMy0yLjksMS4yYy0xLjYtMC4yLTIuOS0wLjgtMi45LTEuNmMwLTAuOCwxLjMtMS4zLDIuOS0xLjIKCQlDMzQuNiwzMS43LDM1LjgsMzIuMywzNS44LDMzLjF6Ii8+CgkKCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlhNTElEXzIxXyIgY3g9Ii0zMTAyLjMwMzUiIGN5PSIyMDU5Ljc2NjgiIHI9IjUuOTI4NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC40MjU4IDAgMCAwLjMyMjUgLTEyNzkuOTgxMyAtNjE3LjE4OTkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJPHN0b3AgIG9mZnNldD0iOC4xMzAwMDBlLTAyIiBzdHlsZT0ic3RvcC1jb2xvcjojREU3RjE0Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC4zMzg5IiBzdHlsZT0ic3RvcC1jb2xvcjojREE3RDEyIi8+CgkJPHN0b3AgIG9mZnNldD0iMC41OTkzIiBzdHlsZT0ic3RvcC1jb2xvcjojQ0U3NjBEIi8+CgkJPHN0b3AgIG9mZnNldD0iMC44NjAyIiBzdHlsZT0ic3RvcC1jb2xvcjojQkE2QzA1Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC45ODciIHN0eWxlPSJzdG9wLWNvbG9yOiNBRDY1MDAiLz4KCTwvcmFkaWFsR3JhZGllbnQ+Cgk8cGF0aCBpZD0iWE1MSURfMjhfIiBjbGFzcz0ic3Q5IiBkPSJNNDIuMyw0Ny43YzAsMS0xLjIsMS44LTIuNiwxLjdjLTEuNC0wLjEtMi42LTEtMi42LTIuMWMwLTEuMSwxLjItMS44LDIuNi0xLjcKCQlDNDEuMSw0NS45LDQyLjMsNDYuOCw0Mi4zLDQ3Ljd6Ii8+CgkKCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzJfIiBjeD0iLTMxMDYuODA4OCIgY3k9IjIwMzAuMDM0MyIgcj0iOC44NDA4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQyNTggMCAwIDAuMzIyNSAtMTI3OS45ODEzIC02MTcuMTg5OSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4LjYwMDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNDNzczMTUiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjM3NzQiIHN0eWxlPSJzdG9wLWNvbG9yOiNDMzcxMTMiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjY3MTgiIHN0eWxlPSJzdG9wLWNvbG9yOiNCNzZDMEYiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjk2NjkiIHN0eWxlPSJzdG9wLWNvbG9yOiNBMzY0MDciLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4NyIgc3R5bGU9InN0b3AtY29sb3I6I0ExNjMwNiIvPgoJPC9yYWRpYWxHcmFkaWVudD4KCTxwYXRoIGNsYXNzPSJzdDEwIiBkPSJNNDAuMiwzOC41YzAsMC43LDAuOSwxLjMsMS45LDEuNGMxLjEsMC4xLDEuOS0wLjQsMS45LTEuMmMwLTAuMSwwLTAuMSwwLTAuMmwwLDBjMC0wLjUtMC45LTEtMS45LTEuMQoJCWMtMC43LTAuMS0xLjQsMC4xLTEuNywwLjRsMCwwQzQwLjMsMzguMSw0MC4yLDM4LjMsNDAuMiwzOC41eiIvPgoJCgkJPHJhZGlhbEdyYWRpZW50IGlkPSJYTUxJRF8yMl8iIGN4PSItMzExOS4yMjA1IiBjeT0iMjA0OC44OTk5IiByPSI0LjM5ODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDI1OCAwIDAgMC4zMjI1IC0xMjc5Ljk4MTMgLTYxNy4xODk5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguMTMwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0RFN0YxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzM4OSIgc3R5bGU9InN0b3AtY29sb3I6I0RBN0QxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNTk5MyIgc3R5bGU9InN0b3AtY29sb3I6I0NFNzYwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuODYwMiIgc3R5bGU9InN0b3AtY29sb3I6I0JBNkMwNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQUQ2NTAwIi8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzI1XyIgY2xhc3M9InN0MTEiIGQ9Ik00OC43LDQ0YzAsMC41LTAuNiwxLTEuMywwLjljLTAuNy0wLjEtMS4zLTAuNS0xLjMtMS4xYzAtMC41LDAuNi0xLDEuMy0wLjkKCQlDNDgsNDMsNDguNyw0My40LDQ4LjcsNDR6Ii8+CjwvZz4KPGcgaWQ9IkxheWVyXzFfMl8iPgoJCgkJPGxpbmVhckdyYWRpZW50IGlkPSJYTUxJRF8yM18iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iLTIxMjYuNTcyIiB5MT0iMTAyNi43NzYxIiB4Mj0iLTIxMjYuNTcyIiB5Mj0iMTAzOS45Mzc5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjc2NTIgLTEuNjc0MTIzZS0wMiAtMS44Nzk5NDdlLTAyIDAuODU5MyAtMTU3Ni4yMTU3IC04OTMuNDA4NSkiPgoJCTxzdG9wICBvZmZzZXQ9IjEuOTcwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0Y3QkMwMCIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGQ0Q3M0UiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBpZD0iWE1MSURfN18iIGNsYXNzPSJzdDEyIiBkPSJNNDcsMjdsLTAuNCwxMC45bC0yOC41LTUuMWMtMS4xLTAuMi0xLjgtMS0xLjgtMS44YzAuMi0yLjksMC4xLTUuOCwwLjMtOC42CgkJYzAtMC41LDAuMS0xLjIsMC45LTEuM2MwLjUtMC4xLDEuMiwwLjIsMS43LDAuM2wzLjQsMC43YzAsMC4xLDAsMC4yLDAsMC4zYzAsMS4yLDEuMiwyLjMsMi43LDIuNGMxLjQsMC4xLDIuNi0wLjYsMi44LTEuNgoJCWwxMC41LDIuMmMtMC4xLDAuMS0wLjIsMC4zLTAuMiwwLjRjMCwwLjUsMC41LDEuMSwxLjMsMS4yYzAuNywwLjEsMS4zLTAuNCwxLjMtMC45YzAtMC4xLDAtMC4xLDAtMC4yQzQxLjEsMjUuNiw0NywyNyw0NywyN3oiLz4KCTxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xNi41LDIyLjRjMC4yLTAuOS0wLjItMiwyLjUtMS4ybDMuNCwwLjdjMC4zLTAuNywxLjQtMS4yLDIuOC0xLjFjMS41LDAuMSwyLjgsMS4xLDIuOCwyYzAsMC4xLDAsMC4yLDAsMC4yCgkJbDEwLjUsMi4ybDAsMGMwLjItMC4zLDAuNy0wLjQsMS4zLTAuNGMwLjcsMC4xLDEuMywwLjQsMS4zLDAuOGw1LjgsMS4zTDMyLDE3Yy0xLjMtMC45LTMuMS0xLjMtNC44LTEuMWMtMS42LDAuMi0zLjYsMC41LTUuMSwxLjIKCQljLTEuOCwwLjYtMy40LDEuOC00LjUsMi43Yy0wLjEsMC4xLTAuNCwwLjQtMC42LDAuOEMxNi42LDIxLjEsMTYuNiwyMS43LDE2LjUsMjIuNHoiLz4KCTxnIGNsYXNzPSJzdDIiPgoJCTxwYXRoIGNsYXNzPSJzdDMiIGQ9Ik0yOC4xLDE2LjVjMS4yLDAsMi4zLDAuNCwzLjMsMWwxNC43LDkuOEw0NS45LDM3bC0yNy42LTQuOWMtMC42LTAuMS0xLjItMC42LTEuMi0xLjIKCQkJYzAuMS0xLjYsMC4xLTMuMywwLjItNC45YzAtMS4yLDAuMS0yLjQsMC4xLTMuNmMwLTAuMSwwLTAuMiwwLTAuM2wwLDBjMC0wLjQsMC4xLTAuOSwwLjItMS4zYzAuMS0wLjMsMC40LTAuNSwwLjQtMC42CgkJCWMxLTAuOCwyLjYtMS45LDQuMy0yLjVjMS4yLTAuNCwyLjktMC44LDQuOS0xLjFDMjcuNSwxNi41LDI3LjgsMTYuNSwyOC4xLDE2LjUgTTI4LjEsMTUuOGMtMC40LDAtMC42LDAtMSwwLjEKCQkJYy0xLjYsMC4yLTMuNiwwLjUtNS4xLDEuMmMtMS44LDAuNi0zLjQsMS44LTQuNSwyLjdjLTAuMSwwLjEtMC40LDAuNC0wLjYsMC44Yy0wLjIsMC40LTAuMywwLjktMC4zLDEuNGMwLDAuMSwwLDAuMiwwLDAuMwoJCQljLTAuMSwyLjktMC4xLDUuOC0wLjMsOC42YzAsMC44LDAuNywxLjYsMS44LDEuOGwyOC41LDUuMUw0NywyN0wzMS45LDE3QzMwLjgsMTYuMywyOS40LDE1LjgsMjguMSwxNS44TDI4LjEsMTUuOHoiLz4KCTwvZz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMjRfIiBjeD0iLTM5OTEuOTUyOSIgY3k9IjI0MDEuOTY1MSIgcj0iNi44Njg3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjMwMzcgLTQuMzQ2MjA4ZS0wMyAtNy41ODc3MjFlLTAzIDAuMjQ4NCAtMTE3Mi42NTQ4IC01ODUuMTI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguMTMwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0RFN0YxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzM4OSIgc3R5bGU9InN0b3AtY29sb3I6I0RBN0QxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNTk5MyIgc3R5bGU9InN0b3AtY29sb3I6I0NFNzYwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuODYwMiIgc3R5bGU9InN0b3AtY29sb3I6I0JBNkMwNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQUQ2NTAwIi8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzZfIiBjbGFzcz0ic3QxMyIgZD0iTTIyLjcsMjkuNGMwLDAuOS0xLDEuNi0yLjIsMS40Yy0xLjItMC4yLTIuMS0wLjktMi4xLTEuOWMwLTEsMS0xLjYsMi4yLTEuNAoJCVMyMi43LDI4LjUsMjIuNywyOS40eiIvPgoJCgkJPHJhZGlhbEdyYWRpZW50IGlkPSJTVkdJRF8zXyIgY3g9Ii00MDExLjE4MTYiIGN5PSIyMzcwLjQ3NTMiIHI9IjE0LjEzMjEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMzAzNyAtNC4zNDYyMDhlLTAzIC03LjU4NzcyMWUtMDMgMC4yNDg0IC0xMTcyLjY1NDggLTU4NS4xMjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJPHN0b3AgIG9mZnNldD0iOC4xMzAwMDBlLTAyIiBzdHlsZT0ic3RvcC1jb2xvcjojREU3RjE0Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC4zMzg5IiBzdHlsZT0ic3RvcC1jb2xvcjojREE3RDEyIi8+CgkJPHN0b3AgIG9mZnNldD0iMC41OTkzIiBzdHlsZT0ic3RvcC1jb2xvcjojQ0U3NjBEIi8+CgkJPHN0b3AgIG9mZnNldD0iMC44NjAyIiBzdHlsZT0ic3RvcC1jb2xvcjojQkE2QzA1Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC45ODciIHN0eWxlPSJzdG9wLWNvbG9yOiNBRDY1MDAiLz4KCTwvcmFkaWFsR3JhZGllbnQ+Cgk8cGF0aCBjbGFzcz0ic3QxNCIgZD0iTTIyLjQsMjIuMmMwLDEuMiwxLjIsMi4zLDIuNywyLjRjMS40LDAuMSwyLjYtMC42LDIuOC0xLjZoLTAuMWgtMC4ybDAuMywwLjFjMC0wLjEsMC0wLjIsMC0wLjIKCQljMC0xLTEuMy0xLjktMi44LTJjLTEuMy0wLjEtMi40LDAuNC0yLjgsMS4xQzIyLjUsMjIsMjIuNCwyMi4xLDIyLjQsMjIuMnoiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMjZfIiBjeD0iLTE3NjcuOTQ2NSIgY3k9IjQ1OTMuOTUyMSIgcj0iNy4xMDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMjI0OCAwLjE2ODUgMC4xNjczIDAuMTQ5NSAtMTEzNy40NjU2IC0zNzEuNjE3OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4Ljc1MDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNEOTk5MTQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjQwOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiNENTk2MTIiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjczNSIgc3R5bGU9InN0b3AtY29sb3I6I0M5OEQwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQkE4MjA3Ii8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzVfIiBjbGFzcz0ic3QxNSIgZD0iTTI5LjEsMTguNGMwLDAuNC0wLjYsMC43LTEuNCwwLjdjLTAuNy0wLjEtMS4zLTAuNC0xLjMtMC45YzAtMC40LDAuNi0wLjcsMS40LTAuNwoJCUMyOC40LDE3LjYsMjkuMSwxNy45LDI5LjEsMTguNHoiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMjdfIiBjeD0iLTQwMjYuMzA3MSIgY3k9IjIzOTguOTI5MiIgcj0iMTUuNjcyNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4zMDM3IC00LjM0NjIwOGUtMDMgLTcuNTg3NzIxZS0wMyAwLjI0ODQgLTExNzIuNjU0OCAtNTg1LjEyOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4LjEzMDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNERTdGMTQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjMzODkiIHN0eWxlPSJzdG9wLWNvbG9yOiNEQTdEMTIiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjU5OTMiIHN0eWxlPSJzdG9wLWNvbG9yOiNDRTc2MEQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjg2MDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQTZDMDUiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4NyIgc3R5bGU9InN0b3AtY29sb3I6I0FENjUwMCIvPgoJPC9yYWRpYWxHcmFkaWVudD4KCTxwYXRoIGlkPSJYTUxJRF80XyIgY2xhc3M9InN0MTYiIGQ9Ik0zNC42LDI5LjNjLTAuMSwxLjUtMS43LDIuNy0zLjcsMi41Yy0yLTAuMi0zLjYtMS42LTMuNS0zLjFjMC4xLTEuNSwxLjctMi43LDMuNy0yLjUKCQlDMzMsMjYuMywzNC42LDI3LjcsMzQuNiwyOS4zeiIvPgoJCgkJPHJhZGlhbEdyYWRpZW50IGlkPSJYTUxJRF8zMV8iIGN4PSItNDAyMy4xMTU3IiBjeT0iMjM2NS42ODMxIiByPSIxMC45MTE4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjMwMzcgLTQuMzQ2MjA4ZS0wMyAtNy41ODc3MjFlLTAzIDAuMjQ4NCAtMTE3Mi42NTQ4IC01ODUuMTI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguNzUwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0Q5OTkxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNDA5OCIgc3R5bGU9InN0b3AtY29sb3I6I0Q1OTYxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNzM1IiBzdHlsZT0ic3RvcC1jb2xvcjojQzk4RDBEIi8+CgkJPHN0b3AgIG9mZnNldD0iMC45ODciIHN0eWxlPSJzdG9wLWNvbG9yOiNCQTgyMDciLz4KCTwvcmFkaWFsR3JhZGllbnQ+Cgk8cGF0aCBpZD0iWE1MSURfM18iIGNsYXNzPSJzdDE3IiBkPSJNMzUuNCwyMS4zYzAsMC42LTEsMS0yLjEsMC45Yy0xLjEtMC4xLTIuMS0wLjYtMi4xLTEuM3MxLTEsMi4xLTAuOQoJCUMzNC41LDIwLjIsMzUuNCwyMC43LDM1LjQsMjEuM3oiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMzNfIiBjeD0iLTQwNDkuMDU3OSIgY3k9IjI0MTQuMjg1MiIgcj0iNS45Mjg1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjMwMzcgLTQuMzQ2MjA4ZS0wMyAtNy41ODc3MjFlLTAzIDAuMjQ4NCAtMTE3Mi42NTQ4IC01ODUuMTI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguMTMwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0RFN0YxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzM4OSIgc3R5bGU9InN0b3AtY29sb3I6I0RBN0QxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNTk5MyIgc3R5bGU9InN0b3AtY29sb3I6I0NFNzYwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuODYwMiIgc3R5bGU9InN0b3AtY29sb3I6I0JBNkMwNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQUQ2NTAwIi8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzJfIiBjbGFzcz0ic3QxOCIgZD0iTTM5LjYsMzIuN2MwLDAuOC0wLjksMS4zLTEuOSwxLjNjLTEtMC4xLTEuOC0wLjgtMS44LTEuNnMwLjktMS4zLDEuOS0xLjMKCQlDMzguOSwzMS4yLDM5LjcsMzEuOSwzOS42LDMyLjd6Ii8+CgkKCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzRfIiBjeD0iLTQwNTMuNTYzIiBjeT0iMjM4NC41NTI1IiByPSI4Ljg0MDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMzAzNyAtNC4zNDYyMDhlLTAzIC03LjU4NzcyMWUtMDMgMC4yNDg0IC0xMTcyLjY1NDggLTU4NS4xMjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJPHN0b3AgIG9mZnNldD0iOC42MDAwMDBlLTAyIiBzdHlsZT0ic3RvcC1jb2xvcjojQzc3MzE1Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC4zNzc0IiBzdHlsZT0ic3RvcC1jb2xvcjojQzM3MTEzIi8+CgkJPHN0b3AgIG9mZnNldD0iMC42NzE4IiBzdHlsZT0ic3RvcC1jb2xvcjojQjc2QzBGIi8+CgkJPHN0b3AgIG9mZnNldD0iMC45NjY5IiBzdHlsZT0ic3RvcC1jb2xvcjojQTM2NDA3Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC45ODciIHN0eWxlPSJzdG9wLWNvbG9yOiNBMTYzMDYiLz4KCTwvcmFkaWFsR3JhZGllbnQ+Cgk8cGF0aCBjbGFzcz0ic3QxOSIgZD0iTTM4LjQsMjUuNmMwLDAuNSwwLjUsMS4xLDEuMywxLjJjMC43LDAuMSwxLjMtMC40LDEuMy0wLjljMC0wLjEsMC0wLjEsMC0wLjJsMCwwYzAtMC40LTAuNi0wLjgtMS4zLTAuOAoJCWMtMC41LTAuMS0xLDAuMS0xLjMsMC40bDAsMEMzOC40LDI1LjMsMzguNCwyNS41LDM4LjQsMjUuNnoiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMzRfIiBjeD0iLTQwNjUuOTc0NiIgY3k9IjI0MDMuNDE4MiIgcj0iNC4zOTg1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjMwMzcgLTQuMzQ2MjA4ZS0wMyAtNy41ODc3MjFlLTAzIDAuMjQ4NCAtMTE3Mi42NTQ4IC01ODUuMTI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguMTMwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0RFN0YxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzM4OSIgc3R5bGU9InN0b3AtY29sb3I6I0RBN0QxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNTk5MyIgc3R5bGU9InN0b3AtY29sb3I6I0NFNzYwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuODYwMiIgc3R5bGU9InN0b3AtY29sb3I6I0JBNkMwNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQUQ2NTAwIi8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzFfIiBjbGFzcz0ic3QyMCIgZD0iTTQ0LjMsMjkuOWMwLDAuNC0wLjQsMC43LTEsMC43cy0xLTAuNC0xLTAuOWMwLTAuNCwwLjQtMC43LDEtMC43CgkJQzQzLjgsMjkuMSw0NC4zLDI5LjQsNDQuMywyOS45eiIvPgo8L2c+CjxnIGlkPSJMYXllcl8xXzNfIj4KCQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iWE1MSURfMzZfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ii0yNDIyLjUxNzMiIHkxPSIxMDA1LjY1NDYiIHgyPSItMjQyMi41MTczIiB5Mj0iMTAxNC43NjQzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjYyODcgLTMuOTI5MDMwZS0wMiAtNS4wNDc5OThlLTAyIDAuODA3NyAtMTQ0MC42ODE1IC04OTIuMDUxMykiPgoJCTxzdG9wICBvZmZzZXQ9IjEuOTcwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0Y3QkMwMCIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGQ0Q3M0UiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBpZD0iWE1MSURfMTRfIiBjbGFzcz0ic3QyMSIgZD0iTTQwLjYsMTcuMmwtMC42LDcuMmwtMTYuNy0zLjhjLTAuNi0wLjItMS4xLTAuNy0xLTEuM2MwLjItMS45LDAuMy0zLjksMC40LTUuOAoJCWMwLTAuNCwwLjEtMC44LDAuNS0wLjljMC40LTAuMSwwLjcsMC4xLDEsMC4ybDIsMC41YzAsMC4xLDAsMC4yLDAsMC4yYy0wLjEsMC44LDAuNiwxLjUsMS41LDEuNmMwLjgsMC4xLDEuNS0wLjQsMS43LTEuMWw2LjIsMS41CgkJYy0wLjEsMC4xLTAuMSwwLjItMC4xLDAuM2MwLDAuNCwwLjMsMC43LDAuNywwLjhzMC44LTAuMiwwLjktMC41di0wLjFDMzcuMiwxNi4yLDQwLjYsMTcuMiw0MC42LDE3LjJ6Ii8+Cgk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMjIuOCwxMy43YzAuMi0wLjUsMC0xLjMsMS41LTAuN2wyLDAuNWMwLjItMC40LDAuOS0wLjgsMS43LTAuN2MwLjksMC4xLDEuNiwwLjcsMS41LDEuM2MwLDAuMSwwLDAuMSwwLDAuMgoJCWw2LjIsMS41bDAsMGMwLjItMC4yLDAuNC0wLjMsMC43LTAuMmMwLjQsMC4xLDAuNywwLjMsMC43LDAuNWwzLjQsMUwzMiwxMC4zYy0wLjgtMC42LTEuOC0wLjktMi44LTAuOGMtMSwwLjItMi4yLDAuNC0zLjEsMC43CgkJYy0xLjEsMC40LTIuMSwxLjItMi44LDEuN2MwLDAtMC4zLDAuMy0wLjQsMC41QzIyLjksMTIuOCwyMi44LDEzLjIsMjIuOCwxMy43eiIvPgoJPGcgY2xhc3M9InN0MiI+CgkJPHBhdGggY2xhc3M9InN0MyIgZD0iTTI5LjgsOS45YzAuNywwLDEuMywwLjMsMS45LDAuN2w4LjQsNi43bC0wLjUsNi41bC0xNi4xLTMuN2MtMC40LTAuMS0wLjYtMC40LTAuNi0wLjgKCQkJYzAuMS0xLjEsMC4yLTIuMiwwLjMtMy4zYzAuMS0wLjgsMC4xLTEuNiwwLjItMi40YzAtMC4xLDAtMC4xLDAtMC4ybDAsMGMwLTAuMywwLjEtMC42LDAuMi0wLjhjMC4xLTAuMiwwLjMtMC40LDAuMy0wLjQKCQkJYzAuNi0wLjUsMS42LTEuMywyLjYtMS42YzAuNy0wLjMsMS43LTAuNSwzLTAuNkMyOS40LDkuOSwyOS42LDkuOSwyOS44LDkuOSBNMjkuOSw5LjVjLTAuMiwwLTAuNCwwLTAuNiwwYy0xLDAuMi0yLjIsMC40LTMuMSwwLjcKCQkJYy0xLjEsMC40LTIuMSwxLjItMi44LDEuN2MwLDAtMC4zLDAuMy0wLjQsMC41Yy0wLjEsMC4zLTAuMiwwLjUtMC4yLDFjMCwwLjEsMCwwLjIsMCwwLjJjLTAuMiwxLjktMC4zLDMuOS0wLjQsNS44CgkJCWMtMC4xLDAuNSwwLjQsMS4xLDEsMS4zbDE2LjYsMy45bDAuNi03LjNMMzIsMTAuM0MzMS40LDkuOCwzMC42LDkuNiwyOS45LDkuNUwyOS45LDkuNXoiLz4KCTwvZz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMzdfIiBjeD0iLTYzMDAuMDcxMyIgY3k9IjMxODQuNDk5MyIgcj0iNi44Njg3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjE3OTYgLTYuODIyNTU0ZS0wMyAtMS4zOTA2NjJlLTAyIDAuMTY1NiAtMTA2MS43Nzg2IC01NTIuMjIzMykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4LjEzMDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNERTdGMTQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjMzODkiIHN0eWxlPSJzdG9wLWNvbG9yOiNEQTdEMTIiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjU5OTMiIHN0eWxlPSJzdG9wLWNvbG9yOiNDRTc2MEQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjg2MDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQTZDMDUiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4NyIgc3R5bGU9InN0b3AtY29sb3I6I0FENjUwMCIvPgoJPC9yYWRpYWxHcmFkaWVudD4KCTxwYXRoIGlkPSJYTUxJRF8xM18iIGNsYXNzPSJzdDIyIiBkPSJNMjYuMSwxOC41Yy0wLjEsMC42LTAuNiwxLjEtMS4zLDFjLTAuNy0wLjEtMS4yLTAuNi0xLjItMS4zYzAuMS0wLjYsMC42LTEuMSwxLjMtMQoJCUMyNS43LDE3LjMsMjYuMiwxNy45LDI2LjEsMTguNXoiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iU1ZHSURfNV8iIGN4PSItNjMxOS4zMDAzIiBjeT0iMzE1My4wMDk1IiByPSIxNC4xMzIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjE3OTYgLTYuODIyNTU0ZS0wMyAtMS4zOTA2NjJlLTAyIDAuMTY1NiAtMTA2MS43Nzg2IC01NTIuMjIzMykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4LjEzMDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNERTdGMTQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjMzODkiIHN0eWxlPSJzdG9wLWNvbG9yOiNEQTdEMTIiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjU5OTMiIHN0eWxlPSJzdG9wLWNvbG9yOiNDRTc2MEQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjg2MDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQTZDMDUiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4NyIgc3R5bGU9InN0b3AtY29sb3I6I0FENjUwMCIvPgoJPC9yYWRpYWxHcmFkaWVudD4KCTxwYXRoIGNsYXNzPSJzdDIzIiBkPSJNMjYuMywxMy43Yy0wLjEsMC44LDAuNiwxLjUsMS41LDEuNmMwLjgsMC4xLDEuNS0wLjQsMS43LTEuMWgtMC4xaC0wLjFoMC4yYzAtMC4xLDAtMC4xLDAtMC4yCgkJYzAuMS0wLjYtMC42LTEuMy0xLjUtMS4zYy0wLjgtMC4xLTEuNCwwLjItMS43LDAuN0MyNi4zLDEzLjUsMjYuMywxMy42LDI2LjMsMTMuN3oiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMzhfIiBjeD0iLTI4OTUuMTQ2NyIgY3k9IjcyMzAuOTM4NSIgcj0iNy4xMDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTM5NSAwLjEwOTUgOS4zMzg2MjdlLTAyIDAuMTAxOSAtMTA0OS4wOTQyIC00MDkuMzQ3OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4Ljc1MDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNEOTk5MTQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjQwOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiNENTk2MTIiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjczNSIgc3R5bGU9InN0b3AtY29sb3I6I0M5OEQwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQkE4MjA3Ii8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzEyXyIgY2xhc3M9InN0MjQiIGQ9Ik0zMC4zLDExLjJjMCwwLjMtMC40LDAuNC0wLjksMC40cy0wLjgtMC40LTAuOC0wLjZzMC40LTAuNCwwLjktMC40CgkJQzMwLDEwLjYsMzAuMywxMC45LDMwLjMsMTEuMnoiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMzlfIiBjeD0iLTYzMzQuNDI1OCIgY3k9IjMxODEuNDYzNCIgcj0iMTUuNjcyNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xNzk2IC02LjgyMjU1NGUtMDMgLTEuMzkwNjYyZS0wMiAwLjE2NTYgLTEwNjEuNzc4NiAtNTUyLjIyMzMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJPHN0b3AgIG9mZnNldD0iOC4xMzAwMDBlLTAyIiBzdHlsZT0ic3RvcC1jb2xvcjojREU3RjE0Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC4zMzg5IiBzdHlsZT0ic3RvcC1jb2xvcjojREE3RDEyIi8+CgkJPHN0b3AgIG9mZnNldD0iMC41OTkzIiBzdHlsZT0ic3RvcC1jb2xvcjojQ0U3NjBEIi8+CgkJPHN0b3AgIG9mZnNldD0iMC44NjAyIiBzdHlsZT0ic3RvcC1jb2xvcjojQkE2QzA1Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC45ODciIHN0eWxlPSJzdG9wLWNvbG9yOiNBRDY1MDAiLz4KCTwvcmFkaWFsR3JhZGllbnQ+Cgk8cGF0aCBpZD0iWE1MSURfMTFfIiBjbGFzcz0ic3QyNSIgZD0iTTMzLjIsMTguNWMtMC4xLDEuMS0xLjEsMS44LTIuMiwxLjZzLTIuMS0xLjEtMi0yLjJjMC4xLTEuMSwxLjEtMS44LDIuMi0xLjYKCQlDMzIuNCwxNi42LDMzLjMsMTcuNSwzMy4yLDE4LjV6Ii8+CgkKCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlhNTElEXzQwXyIgY3g9Ii02MzMxLjIzNDQiIGN5PSIzMTQ4LjIxNzMiIHI9IjEwLjkxMTgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTc5NiAtNi44MjI1NTRlLTAzIC0xLjM5MDY2MmUtMDIgMC4xNjU2IC0xMDYxLjc3ODYgLTU1Mi4yMjMzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguNzUwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0Q5OTkxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNDA5OCIgc3R5bGU9InN0b3AtY29sb3I6I0Q1OTYxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNzM1IiBzdHlsZT0ic3RvcC1jb2xvcjojQzk4RDBEIi8+CgkJPHN0b3AgIG9mZnNldD0iMC45ODciIHN0eWxlPSJzdG9wLWNvbG9yOiNCQTgyMDciLz4KCTwvcmFkaWFsR3JhZGllbnQ+Cgk8cGF0aCBpZD0iWE1MSURfMTBfIiBjbGFzcz0ic3QyNiIgZD0iTTMzLjksMTMuMmMwLDAuNC0wLjYsMC42LTEuMywwLjVjLTAuNi0wLjEtMS4yLTAuNC0xLjItMC45YzAtMC40LDAuNi0wLjYsMS4zLTAuNQoJCVMzMy45LDEyLjksMzMuOSwxMy4yeiIvPgoJCgkJPHJhZGlhbEdyYWRpZW50IGlkPSJYTUxJRF80MV8iIGN4PSItNjM1Ny4xNzYzIiBjeT0iMzE5Ni44MTkzIiByPSI1LjkyODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTc5NiAtNi44MjI1NTRlLTAzIC0xLjM5MDY2MmUtMDIgMC4xNjU2IC0xMDYxLjc3ODYgLTU1Mi4yMjMzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguMTMwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0RFN0YxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzM4OSIgc3R5bGU9InN0b3AtY29sb3I6I0RBN0QxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNTk5MyIgc3R5bGU9InN0b3AtY29sb3I6I0NFNzYwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuODYwMiIgc3R5bGU9InN0b3AtY29sb3I6I0JBNkMwNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQUQ2NTAwIi8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzlfIiBjbGFzcz0ic3QyNyIgZD0iTTM2LDIwLjljMCwwLjUtMC41LDAuOS0xLjIsMC44Yy0wLjYtMC4xLTEuMS0wLjUtMS0xLjFjMC0wLjUsMC41LTAuOSwxLjItMC44CgkJQzM1LjYsMTkuOSwzNi4xLDIwLjMsMzYsMjAuOXoiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iU1ZHSURfNl8iIGN4PSItNjM2MS42ODE2IiBjeT0iMzE2Ny4wODY3IiByPSI4Ljg0MDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTc5NiAtNi44MjI1NTRlLTAzIC0xLjM5MDY2MmUtMDIgMC4xNjU2IC0xMDYxLjc3ODYgLTU1Mi4yMjMzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguNjAwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0M3NzMxNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzc3NCIgc3R5bGU9InN0b3AtY29sb3I6I0MzNzExMyIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNjcxOCIgc3R5bGU9InN0b3AtY29sb3I6I0I3NkMwRiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTY2OSIgc3R5bGU9InN0b3AtY29sb3I6I0EzNjQwNyIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQTE2MzA2Ii8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggY2xhc3M9InN0MjgiIGQ9Ik0zNS41LDE2LjFjMCwwLjQsMC4zLDAuNywwLjcsMC44YzAuNCwwLjEsMC44LTAuMiwwLjktMC41di0wLjFsMCwwYzAtMC4zLTAuNC0wLjUtMC43LTAuNQoJCWMtMC40LDAtMC42LDAtMC43LDAuMmwwLDBDMzUuNiwxNS45LDM1LjUsMTYsMzUuNSwxNi4xeiIvPgoJCgkJPHJhZGlhbEdyYWRpZW50IGlkPSJYTUxJRF80Ml8iIGN4PSItNjM3NC4wOTMzIiBjeT0iMzE4NS45NTI0IiByPSI0LjM5ODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTc5NiAtNi44MjI1NTRlLTAzIC0xLjM5MDY2MmUtMDIgMC4xNjU2IC0xMDYxLjc3ODYgLTU1Mi4yMjMzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguMTMwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0RFN0YxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzM4OSIgc3R5bGU9InN0b3AtY29sb3I6I0RBN0QxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNTk5MyIgc3R5bGU9InN0b3AtY29sb3I6I0NFNzYwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuODYwMiIgc3R5bGU9InN0b3AtY29sb3I6I0JBNkMwNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQUQ2NTAwIi8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzhfIiBjbGFzcz0ic3QyOSIgZD0iTTM4LjksMTkuMWMwLDAuMy0wLjMsMC40LTAuNiwwLjRjLTAuNCwwLTAuNS0wLjMtMC41LTAuNnMwLjMtMC40LDAuNi0wLjQKCQlDMzguNywxOC41LDM4LjksMTguOCwzOC45LDE5LjF6Ii8+CjwvZz4KPC9zdmc+Cg==',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'token.cheddar.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Pulse',\n symbol: 'PULSE',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNi41NTAzNSAxOS4xMjM5TDkuMTcxNjYgMTQuOTQ5MkM5LjMyNzMxIDE0LjcwMTMgOS41OTk0OCAxNC41NTA4IDkuODkyMiAxNC41NTA4SDE4LjQxNEMxOS41NDEyIDE0LjU1MDggMjAuNTYxNCAxMy44ODM2IDIxLjAxMzMgMTIuODUwOUMyMS4zNjQ3IDEyLjA0NzYgMjAuNzc2MSAxMS4xNDc3IDE5Ljg5OTMgMTEuMTQ3N0gxMS45NzQyTDExLjU0ODggMTEuMjU0TDEzLjY0NjEgNy40NDA3OEMxMy43OTU2IDcuMTY4OTEgMTQuMDgxMyA3IDE0LjM5MTUgN0gyMi4wNzU0QzI1LjA1NDMgNyAyNy4xMTA3IDkuOTgyNzkgMjYuMDUxMyAxMi43NjdMMjUuODYzMSAxMy4yNjEzQzI0LjU0NDQgMTYuNzI2OSAyMS4yMjE4IDE5LjAxNzYgMTcuNTEzOCAxOS4wMTc2SDYuOTc1NzVMNi41NTAzNSAxOS4xMjM5Wk04LjM2ODg0IDE5Ljk3NDdDNy4wNTA0MiAxOS45NzQ3IDUuODM2NTUgMjAuNjkyNSA1LjIwMTE4IDIxLjg0NzdDNC42MTIyMyAyMi45MTg1IDUuMzg2OTQgMjQuMjI4NyA2LjYwOTAzIDI0LjIyODdIMTAuODA0NEwxMy40NjMxIDE5Ljg2ODRMMTMuMTQ0MSAxOS45NzQ3SDguMzY4ODRaIiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfMjBfMykiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yMF8zIiB4MT0iMTguMDI2NiIgeTE9IjUuNTI5MjYiIHgyPSIyLjI2ODYxIiB5Mj0iMzAuMTExNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjREQ1OUZGIi8+CjxzdG9wIG9mZnNldD0iMC40NzM5NTgiIHN0b3AtY29sb3I9IiM1MDY5RkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDAyNUZGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==',\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '52a047ee205701895ee06a375492490ec9c597ce.factory.bridge.near',\n },\n {\n decimals: 18,\n icon:\n 'data:image/png;base64,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',\n name: 'Ether',\n reference: null,\n reference_hash: null,\n spec: 'ft-1.0.0',\n symbol: 'ETH',\n id: 'aurora',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Pixeltoken',\n symbol: 'PXT',\n icon:\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAANdJREFUWIXll70RwjAMhWUuNGwARVgEmuyQJRgo7AA7uGESGioaGlpTcK+w7nR+gcIyfJ1zys/7dHKSsO53SSqyqHlzEZFu7gm364Wq22z3VF07BpB8CANXn971JRP+Dejk8fSgLoz6kgm/Btjk58MqW4/TM6svmfBrQIOkSAiO92W2Hmc+gF8D6BV6h17qhOxUWPg18C16OizaN2AlxXTEFEWkxZ2QRe8DoJQctG8AIDH4vS8iFjY5aM8Au8Ox+DdgvRUBO+8W/g0AbUIf/5TqBsLf/x2/ADJHSOenTxC2AAAAAElFTkSuQmCC',\n reference: '',\n reference_hash: '',\n decimals: 6,\n id: 'pixeltoken.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Debio',\n symbol: 'DBIO',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIxOTAgOTcgNDIwIDQyMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgODAwIDgwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVmcz48c3R5bGU+LnN0MHtmaWxsOiMzNjM2MzZ9LnN0M3tmaWxsOiNmZjU2ZTB9PC9zdHlsZT48L2RlZnM+PGNpcmNsZSBjbGFzcz0ic3QzIiBjeD0iNDAwIiBjeT0iMzA3LjM5IiByPSIyMDguNTgiLz48cGF0aCBkPSJNNDczLjk5IDIxMS4zczIuMzQgNTYuMjUtNzcuMzQgOTguNDMtNzAuMzEgOTMuNzQtNzAuMzEgOTMuNzQiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiNlNmU2ZTY7c3Ryb2tlLXdpZHRoOjM3LjQ5NzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNMzI2LjAxIDIxMS4zcy0yLjM0IDU2LjI1IDc3LjM0IDk4LjQzIDcwLjMxIDkzLjc0IDcwLjMxIDkzLjc0IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS13aWR0aDozNy40OTc1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwIi8+PGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iNDAwIiBjeT0iMjE2LjQyIiByPSIyMC40OSIvPjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjQwMCIgY3k9IjM5OC4zNiIgcj0iMjAuNDkiLz48dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzYuMzQyIDY1OC4wNzUpIiBjbGFzcz0ic3QzIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlO2ZvbnQtc2l6ZToxMTIuNDkyNXB4O2ZvbnQtZmFtaWx5OidBcnRlZ3JhU2Fucy1TZW1pQm9sZCciPkRlQmlvPC90ZXh0Pjwvc3ZnPg==',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'dbio.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Aurora',\n symbol: 'AURORA',\n icon:\n \"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 288 288' style='enable-background:new 0 0 288 288;' xml:space='preserve'%3E %3Cstyle type='text/css'%3E .st0%7Bfill:%2370D44B;%7D .st1%7Bfill:%23FFFFFF;%7D %3C/style%3E %3Cpath class='st0' d='M144,0L144,0c79.5,0,144,64.5,144,144v0c0,79.5-64.5,144-144,144h0C64.5,288,0,223.5,0,144v0 C0,64.5,64.5,0,144,0z'/%3E %3Cpath class='st1' d='M144,58.8c7.6,0,14.5,4.3,17.9,11.1l56.2,112.5c4.9,9.9,0.9,21.9-9,26.8c-2.8,1.4-5.8,2.1-8.9,2.1H87.8 c-11,0-20-9-20-20c0-3.1,0.7-6.2,2.1-8.9l56.2-112.5C129.5,63,136.4,58.7,144,58.8 M144,45c-12.8,0-24.5,7.2-30.2,18.7L57.6,176.2 c-8.3,16.7-1.6,36.9,15.1,45.3c4.7,2.3,9.9,3.6,15.1,3.6h112.5c18.6,0,33.8-15.1,33.8-33.7c0-5.2-1.2-10.4-3.6-15.1L174.2,63.7 C168.5,52.2,156.8,45,144,45z'/%3E %3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: 'aaaaaa20d9e0e2461697782ef11675f668207961.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Meta Token',\n symbol: '$META',\n icon:\n \"data:image/svg+xml,%3csvg width='96' height='96' viewBox='0 0 96 96' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='96' height='96' rx='48' fill='white'/%3e%3cpath d='M29.2241 28.7456C28.396 27.9423 27.0094 28.5289 27.0091 29.6825L27 66.6773C26.9997 67.8501 28.4257 68.4286 29.2426 67.5872L48.6529 47.5943L29.2241 28.7456Z' fill='%23231B51'/%3e%3cpath d='M66.7759 28.7456C67.604 27.9423 68.9906 28.5289 68.9909 29.6825L69 66.6773C69.0003 67.8501 67.5743 68.4286 66.7574 67.5872L47.3471 47.5943L66.7759 28.7456Z' fill='%23231B51'/%3e%3c/svg%3e\",\n reference: 'https://metapool.app',\n reference_hash: null,\n decimals: 24,\n id: 'meta-token.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Potato 🥔',\n symbol: 'POTATO',\n icon:\n 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAQwAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAAHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAAAChnVFJDAAABoAAAAChiVFJDAAABoAAAACh3dHB0AAAByAAAABRjcHJ0AAAB3AAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAFgAAAAcAHMAUgBHAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z3BhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLW1sdWMAAAAAAAAAAQAAAAxlblVTAAAAIAAAABwARwBvAG8AZwBsAGUAIABJAG4AYwAuACAAMgAwADEANv/bAEMAAwICAgICAwICAgMDAwMEBgQEBAQECAYGBQYJCAoKCQgJCQoMDwwKCw4LCQkNEQ0ODxAQERAKDBITEhATDxAQEP/bAEMBAwMDBAMECAQECBALCQsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/AABEIAGAAYAMBIgACEQEDEQH/xAAcAAACAwEBAQEAAAAAAAAAAAAHCAAGCQUEAwL/xAA9EAABAgUDAgMFBQYFBQAAAAABAgMABAUGEQcSITFBCBNhFCJRcYEJMpGhwRYjQ1JTYhUkY3KCkqKx0fD/xAAbAQEBAQADAQEAAAAAAAAAAAAGBQQAAgcDAf/EAC0RAAEDAwIDBwQDAAAAAAAAAAEAAgMEBREhMRJxsQYiQVFhodETFIGRMlLw/9oADAMBAAIRAxEAPwDVOPBXa9RrYpMzXbgqcvT6fKI3vTD6whCBnHJPxJAA7k4j4XVdFEsu3p+6bjnkSlOpzKn33VdgOwHck4AA5JIEZceILxKXRrdcqmlzLkjQWHtkhTkL91AJwFrx95w9z26DiMFdXsoWcTtT5LbRUT6x+Bt4lMjqZ47pqaqDtE0go6FMoO3/ABSebJUv4lDXYfAq5/tED5OsGvN0PpmZ2/aw1nB2SbnsyR9GtsCrT6hNtFBeG9Z56QwFp0BHkIJbGTziPNbp2grJn4Y4gemiaQW+ko4/4gn1XytrV3WymOEftTUnQgkf5xaZgKGevvgmC3aHibq0q43K35R0vMqODNyadq0+pRnB+hHyMVn9mGvL3ITyRHGrNvrlmlPlrcQMgAZjJBeLnRkPEhx6nI/RXxkhoqrulg6H9hNxb1yUO6qairUCoszksvjc2eUn+VQ6pPoeY6cIxbN0XJaNQTXrUqLksr+KwsHY4AeULQevOR6djDLaa6825e3l0qrBNJrJwnyXFfunlf6av0PPwzD20dpqe4Yim7knseXwfdH6+yy0uXxd5vuOfz0RRiRIkJ1EUiRIkcXEg32j+sM41UadpVSptSZaUZTUKihJx5jy8+Uk/wC1OVY6e+D2EJxZSQ4/57+FLcOcH5wVvH3MODxI3M2snA9iCc9h7IzAiteY2N7m07l549IBX6Rz3u59E9s0DWwNx5Z/aYWyfIC0FCQcd/SDda9Yl1PNygeTvACto6gdoWi1ayZdafMzjHvesGK0a9LqcamSU7sDHygQ/LXZKpVEPEEf5Qh5IBIziPs/JsTKfJWgE44J7xWaLX2HWkqCvePeLC1PtutjaoZ+eMRSjmY9mCoDonscqrWqBLNqUlDQOevHSKJWqWiVJWvCNp91Y4wYLM8lD5G4jd1Hr/7jgVKlJmUlKkBQJx07RCrI3MdxRbK1STbB66mk3iKnaNMtW3fcwubkMhtqeOVOsdhvPVSfXqPXoGcl5hibYbmpV5DrLqQttxCgpKkkZBBHUQjlStIomS60kJCx73HPHT/zBC0e1VndPp5q2LmeUugzLm1t1XJk1nuP7Ceo7dR3yy7M9q3NIpK46bBx8PQ+nTltJvVkjkBnpBr4jz5evXmmliR+W3EOoS42sKQsBSVA5BB7x+o9NQtZmfaWWBMUrVGTvRpsmXr8ihW4D+MyA2of9Pln6wqlvzyZZaAOB3OY2K8SWicjrpppO2uoNN1WXzNUt9fGyYSD7pPZKgSk/MHtGN9z0GtWLck5QK5IuykzKPKaeadSUqQpJwQR9IJXmjPGSBodflM7HWtdGGE6t0+ETaLVm1EbFY3CL9b9wqldoDgwcAAmARSK2kBOxQ7DB7Ra5Kv7AHEqICfePxgTNTa4S3gD25CZW371WlCUqdOO6R8YuzV8MSEmqemlLLbeCvYNxwTjoPnC32zXlOIBW5tJGR24+EE62K22paf3wyMd+nETpIzCdFhlgGdUe5B/25CXSjhSQQon8o6XsaVpUSk89sRTrbrSHNqQ4B+oi9Sc2y+BhSTn1jTA1s41UmYujOi56qOl9KdyMLx2GRFauS1y4ytKW+SODiCahlopBbPIj4Tsg3NMKKwncOwEflRa8jiZuukdcWu12Xk0C1NmpKZb03up9WelLfcPb+iT+aSfUfAQwEJhe0g6w77dTni3MyTgcQtBwpCk8jnsehhltHdQ29R7Nl6s8UpqEsfZp5AwMOpA94DsFAg/UjtDfsjeH1Ef2VQe83Y+Y8vx05KRe6ENxVxDQ7+h8/z15q8wr3jC8ItN1rpbt5WlLNMXZJs4W2lISmooT0So/wBQDgKPUAJPYhoYkMJoWzs4HqFBM+neHsOqwIuGi1qzarMU2fl3pd+WcU2424kpUhSSQUkHoQRzHToddUrAUo5/SH++0K8OErVaWrWK2JAJeb2tVlptIAPZExgDr0Sr/ifiYzglku06dLSgQAcEQOuVAGkgjUe6e2q4fXYDnTojBS6sAjd5nHz4xF8tisKacC9/JPIBgO0ad3NpSgnBxk/OLjSKh5DiVKcBB5BzBeSHQhXCQ8apiqDcqm9qku8n4HHMXu3LxX56GSMhffPSF6olWS4AC/nP3jnrF4o1bRJlBS4CfnEwAwu0WWSBrgmeoNYZeQkKUCVDuesdxxLb7e5B/CAfbF3pccCUufnBHkrkBZSC4Mnjr1ipFUhzMPUCopXNflq5F2UKUK5ualkKQ5NEF0FZwSO4HbrHl8NFamLf1QnLX3EytYlVKCT2cbBUk/huH1j3XDVGHZZw7xlPQ94qGh815viCo6EqyfKmSfl5DkdrTltxjfH/AGHucH2X0nBdRyMf/U+2ydOJEiR62gy8tUpkhWqbNUiqSqJmTnWVy77KxlLjawUqSfQgkRj14tfD/UNE9RpqnNtuOUidJmaZMlPDjBP3Sf5k/dV9D0IjY+Bvr1ojbeu1iTVqVpttqcQFO02e2ZVKv44PxKT0UnuPUAjFXUv3LNNwqFurTRy5P8Tv8rFqh1Myyg2pRz9eIu0jPMLZLvmgJbG4/qfyzFa1Q06uXS28J+1bkp7krO054tuoPQjqFJPdJBBBHUGPFQ6upQ8l1eUqGMHpAaqpC08QXolLUMlaMIn0+rOJSh5pStigFAjvFnkKzM7AS8MYxgfpA6l6mllpHlDcn4DpjHSOvLVxsYUlwEJGEjOT9YlOiydlrJBCLluXC8wtKlqIyeOeYupvaYclHGWZravGEneRj8CD+EL9LXO42sAPAkfEx1F3gplKQFErPGOekZ3UxcdFkeADkoxzd7TMvSEomZ9bz4Tt8wnlRx1P/wB2gg+CijzV0ak1u939ypajyvs7ayOC89xgHpwlKsj+4QrDU9WbqqMpQaFLPztRn3Ey8uwyncpa1HAAEabeHzSdGjmmdPtV9aHKm6TOVN1Bylc0sDcEnulICUg9wnPeFXZ62H6omeNuqNXqqEURjbu7oiVEiRIcogpEiRI4uIHeJ/ww234gbaK0JakbnkGz7BPlPCxyfJdwMlBJyD1SeRwSDkvfmml3aX3LNW7c9HmJCdlV7XGnU8+hBHCknqCMgxuzFE1V0S041mpYpt9W+1NLaSUy8437kzL5/kcHOM87TlJ7iJ1ZQCo7zND1VWgubqQ8LtW9FiZLVSYSSlSiQeAOmY9iKw6lJAVjPTmHZ1B+zNuBibemtObvkZ6VKiW5aogsPIT2G9IKVH1wn5QMX/s/fEPLPeS1asm+gHhbdUlwn/uUD+UH32yRp1Yf9ySeK8QPGeMflLxL1Wa90pJB7+96xa7bpFxXZVJajUanzE/PTiw2zLsIK1rUemABDMaffZv6jT8427fNbpdCkwQXEML9qfUM8gAYQPmVH5GHU0i0A000WkizZ1FBnnEbH6lNEOTTo7grwNqeB7qQBwOI10tpc45c3A9fhYa29RtGGHiP+8UN/Ct4VZPSCTReF4tszd3TTWEpACm6agjlCD3cPRSx8hxkqY+JEhFFE2FoYwaItNM+d5e86r//2Q==',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'v1.dacha-finance.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Flux Token',\n symbol: 'FLX',\n icon:\n \"data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='140px' height='140px' viewBox='0 0 140 140' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3EFlux Logo New%3C/title%3E%3Cdefs%3E%3CradialGradient cx='50%25' cy='0%25' fx='50%25' fy='0%25' r='248.533062%25' gradientTransform='translate(0.500000,0.000000),scale(1.000000,0.393939),rotate(90.000000),translate(-0.500000,-0.000000)' id='radialGradient-1'%3E%3Cstop stop-color='%23FE84FC' offset='0%25'%3E%3C/stop%3E%3Cstop stop-color='%232ED1FF' offset='100%25'%3E%3C/stop%3E%3C/radialGradient%3E%3C/defs%3E%3Cg id='logos' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cg id='Group' transform='translate(-143.000000, -251.000000)'%3E%3Cg id='Group-2' transform='translate(0.000000, 251.000000)'%3E%3Cg id='Flux-Logo' transform='translate(143.000000, 0.000000)'%3E%3Cg id='Flux-Logo-New' transform='translate(70.000000, 70.000000) rotate(90.000000) translate(-70.000000, -70.000000) '%3E%3Ccircle id='Oval' fill='%23FFFFFF' cx='70' cy='70' r='70'%3E%3C/circle%3E%3Crect id='Rectangle' fill='%230F0E25' transform='translate(70.000000, 83.000000) rotate(90.000000) translate(-70.000000, -83.000000) ' x='57' y='50' width='26' height='66' rx='13'%3E%3C/rect%3E%3Cpath d='M50,30 C57.1797017,30 63,35.8202983 63,43 L63,96 L63,96 L50,96 C42.8202983,96 37,90.1797017 37,83 L37,43 C37,35.8202983 42.8202983,30 50,30 Z' id='Rectangle' fill='%230F0E25'%3E%3C/path%3E%3Cpath d='M63,44 L76,44 C83.1797017,44 89,49.8202983 89,57 L89,97 C89,104.179702 83.1797017,110 76,110 C68.8202983,110 63,104.179702 63,97 L63,44 L63,44 Z' id='Rectangle' fill='url(%23radialGradient-1)'%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '3ea8ea4237344c9931214796d9417af1a1180770.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'nUSDO',\n symbol: 'nUSDO',\n icon:\n 'data:image/png;base64,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',\n reference: '',\n reference_hash: '',\n decimals: 8,\n id: 'v3.oin_finance.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'oinfinance',\n symbol: 'OIN',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 974.66 974.66'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bisolation:isolate;%7D.cls-2%7Bfill:%235a8dff;%7D.cls-3%7Bfill:%23fff;%7D.cls-4,.cls-5%7Bfill:%231b57f6;%7D.cls-5%7Bmix-blend-mode:multiply;%7D%3C/style%3E%3C/defs%3E%3Cg class='cls-1'%3E%3Cg id='图层_1' data-name='图层 1'%3E%3Ccircle class='cls-2' cx='487.33' cy='484.76' r='473.82'/%3E%3Ccircle class='cls-3' cx='487.33' cy='484.76' r='358.99'/%3E%3Cpath class='cls-4' d='M487.33,98.08c-213.55,0-386.67,173.12-386.67,386.68S273.78,871.43,487.33,871.43,874,698.31,874,484.76,700.88,98.08,487.33,98.08ZM368.59,297.83a9,9,0,0,1,12.71-.14,287,287,0,0,0,137.53,75,110.56,110.56,0,0,1,51.78,28.2,9,9,0,0,1-12.49,12.93,92.54,92.54,0,0,0-43.3-23.61,304.9,304.9,0,0,1-146.09-79.66A9,9,0,0,1,368.59,297.83Zm216.7,197.36a9,9,0,0,1,17.93,1.3c-1.86,25.6-15.92,49.6-38.58,65.86-18.31,13.13-40.08,19.87-63.28,19.87a130.41,130.41,0,0,1-32.7-4.3,9,9,0,0,1,4.52-17.4c29.91,7.76,58.67,3.23,81-12.78C572.48,534.61,583.82,515.45,585.29,495.19Zm-9.7-47.57a15.39,15.39,0,1,1,12.8,17.6A15.39,15.39,0,0,1,575.59,447.62Zm-244-118.07a9,9,0,0,1,12.71,0,335.48,335.48,0,0,0,163.36,90.53c30.07,6.9,50.7,33.19,48,61.16-1.64,17.07-9.08,30.42-21.52,38.59-8.23,5.41-18.1,8.14-28.9,8.14a76.36,76.36,0,0,1-23.39-3.91,9,9,0,1,1,5.52-17.1c14.54,4.69,27.64,3.93,36.9-2.15,7.73-5.08,12.39-13.82,13.49-25.29,2-20.88-15.76-37.71-34.1-41.92a353.42,353.42,0,0,1-172.1-95.35A9,9,0,0,1,331.59,329.55Zm-30,41.34a9,9,0,0,1,12.71-.23c36.29,35,81.18,62.68,133.43,82.22a9,9,0,0,1-3.15,17.41,8.89,8.89,0,0,1-3.14-.58c-54.58-20.41-101.55-49.38-139.62-86.11A9,9,0,0,1,301.56,370.89ZM452.39,512.8a15.39,15.39,0,1,1-12.8-17.6A15.38,15.38,0,0,1,452.39,512.8ZM278.9,429.48a9,9,0,0,1,12.54-2.07c38.33,27.47,67.76,43.32,105.66,61.43a9,9,0,1,1-7.75,16.21c-38.8-18.53-69-34.79-108.38-63A9,9,0,0,1,278.9,429.48Zm-4.46,60.34A9,9,0,0,1,287,487.67c45.31,32,91.6,55,137.57,68.37a9,9,0,0,1-2.5,17.62,8.76,8.76,0,0,1-2.51-.36c-47.9-13.9-96-37.78-142.94-70.95A9,9,0,0,1,274.44,489.82Zm18.28,73.95a9,9,0,0,1,12.38-2.89c44.19,27.46,93.91,45,123.06,51.75,27.43,6.32,56.78,9,65.69,9,77.91,0,141.29-63.38,141.29-141.29,0-65.78-46.6-123.81-110.81-138L516,340.57l0-.24a257.48,257.48,0,0,1-100.58-53,9,9,0,1,1,11.69-13.66A239.17,239.17,0,0,0,528.3,324.87l8.22,1.9,0,.16c68.06,19,116.62,82.18,116.62,153.46,0,87.82-71.45,159.27-159.27,159.27-9.61,0-40.9-2.87-69.72-9.51-30.5-7-82.46-25.38-128.52-54A9,9,0,0,1,292.72,563.77ZM493.85,688.36l-9-.07c-5.35-.12-10.74-.42-16.1-.9a302.94,302.94,0,0,1-109.22-31.85,9,9,0,1,1,8.2-16,284.85,284.85,0,0,0,102.64,29.94,225.63,225.63,0,0,0,23.34.87l7.29-.11c101.46-3.78,182.84-87.49,182.84-189.86,0-89.16-63.2-167.31-150.26-185.83l-.12,0-.11,0a206.73,206.73,0,0,1-49.14-18.68A9,9,0,0,1,492.69,260,188.85,188.85,0,0,0,537.56,277h0c95.18,20.37,164.23,105.85,164.23,203.35C701.82,595.07,608.53,688.36,493.85,688.36Z'/%3E%3Cpath class='cls-5' d='M144.68,484.76c0-206.19,161.39-374.67,364.73-386-7.27-.41-14.58-.64-21.94-.64-213.56,0-386.68,173.12-386.68,386.68S273.91,871.43,487.47,871.43c7.36,0,14.67-.23,21.94-.64C306.07,859.42,144.68,690.94,144.68,484.76Z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 8,\n id: '9aeb50f542050172359a0e1a25a9933bc8c01259.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Myria',\n symbol: 'MYRIA',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgNjAwIj48ZGVmcz48Y2xpcFBhdGggaWQ9ImNsaXAtcGF0aCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtLjEzKSI+PHBhdGggc3R5bGU9ImZpbGw6bm9uZSIgZD0iTTAgMGg2MDB2NjAwSDB6Ii8+PC9jbGlwUGF0aD48c3R5bGU+LmNscy00e2ZpbGw6I2ZmZn08L3N0eWxlPjwvZGVmcz48ZyBzdHlsZT0iY2xpcC1wYXRoOnVybCgjY2xpcC1wYXRoKSI+PHBhdGggZD0iTTYwMCAzMDAuMTNjMCAxNjUuNjktMTM0LjMxIDMwMC0zMDAgMzAwUzAgNDY1LjgxIDAgMzAwLjEzIDEzNC4zMS4xMyAzMDAgLjEzczMwMCAxMzQuMzEgMzAwIDMwMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtLjEzKSIgc3R5bGU9ImZpbGw6Izg2MmFlOSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTQ3MS4xMSA0MjEuMjFhMTcuNzUgMTcuNzUgMCAwIDAgMi4wNy04IDcuMjQgNy4yNCAwIDAgMCAwLTEuMVYyNjMuNDdhOTUuMzYgOTUuMzYgMCAwIDAtMTQyLjYxLTgxLjcybC0xLjQ5Ljg1LTEyNi42NCA3My4xMi0xLjExLjY1YTE4LjE4IDE4LjE4IDAgMCAwLTUuNzcgNS43NWMtLjE1LjIxLS4yNi40MS0uMzkuNjNhMTguMzMgMTguMzMgMCAwIDAgNi43MSAyNWwyNDMuODQgMTQwLjgzYTE4LjMzIDE4LjMzIDAgMCAwIDI1LTYuNzFjLjEzLS4yMi4yNC0uNDIuMzUtLjY1TTIxMi41NCAyNzEuOTNsMTQuNzQtOC41MyA2Mi44NC0zNi4yNiA0OS4zOC0yOC41MSAxLjYtLjkxYTc2LjM0IDc2LjM0IDAgMCAxIDExMyA2NS4yNnYxNDguNDNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0uMTMpIi8+PHBhdGggY2xhc3M9ImNscy00IiBkPSJNMTI4Ljg5IDQyMS4yMWExNy43NyAxNy43NyAwIDAgMS0yLjA4LTggNy41IDcuNSAwIDAgMSAwLTEuMVYyNjMuNDdhOTUuMzYgOTUuMzYgMCAwIDEgMTQyLjYxLTgxLjcybDEuNDkuODUgMTI2LjY1IDczLjExIDEuMTEuNjVhMTguMTcgMTguMTcgMCAwIDEgNS43NyA1Ljc1Yy4xNS4yMS4yNi40MS4zOS42M2ExOC4zMyAxOC4zMyAwIDAgMS02LjcxIDI1TDE1NC4yOCA0MjguNThhMTguMzMgMTguMzMgMCAwIDEtMjUtNi43MWMtLjEzLS4yMi0uMjQtLjQyLS4zNS0uNjVtMjU4LjUzLTE0OS4yOS0xNC43NC04LjUzLTYyLjgzLTM2LjI2LTQ5LjM5LTI4LjUyLTEuNi0uOTFhNzYuMzQgNzYuMzQgMCAwIDAtMTEzIDY1LjI2djE0OC40NFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLS4xMykiLz48L2c+PC9zdmc+',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'myriadcore.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'xRef Finance Token',\n symbol: 'xREF',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNjIiIHZpZXdCb3g9IjAgMCA1NiA2MiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEuODU2OTMgMTcuODg1NkMxLjg1NjkzIDE2LjAyNzggMi44ODY5MiAxNC4zMjMyIDQuNTMxNTEgMTMuNDU5MkwyNS45MjE2IDIuMjIxNzJDMjcuMzc3NSAxLjQ1NjgzIDI5LjExNjUgMS40NTY4MyAzMC41NzI0IDIuMjIxNzJMNTEuOTYyNCAxMy40NTkyQzUzLjYwNyAxNC4zMjMyIDU0LjYzNyAxNi4wMjc4IDU0LjYzNyAxNy44ODU2VjQ1LjYzMDRDNTQuNjM3IDQ3LjYwMjEgNTMuNDc4MiA0OS4zODk4IDUxLjY3ODMgNTAuMTk0N0wzMC4yODgyIDU5Ljc2MDZDMjguOTg5NCA2MC4zNDE0IDI3LjUwNDYgNjAuMzQxNSAyNi4yMDU3IDU5Ljc2MDZMNC44MTU3IDUwLjE5NDdDMy4wMTU3NCA0OS4zODk4IDEuODU2OTMgNDcuNjAyMSAxLjg1NjkzIDQ1LjYzMDRMMS44NTY5MyAxNy44ODU2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzEyNDYxXzIwNzUpIiBzdHJva2U9IiMwMEM2QTIiIHN0cm9rZS13aWR0aD0iMiIvPgo8cGF0aCBkPSJNMTMuNjk3OCAyMC4zMzJMMjguMjQ3MSAxNEwyOC4yMjAyIDMwLjU0MTdMMjAuMjgwMyAyMy43MTE2TDEyLjMxMzUgMzAuOTI5NVYyMi4zNjU0QzEyLjMxNTIgMjEuNDkyMiAxMi44NTM4IDIwLjY5OTMgMTMuNjk3OCAyMC4zMzJaIiBmaWxsPSIjMDBDNkEyIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8cGF0aCBkPSJNMTQuMTAyMyA0Mi43NjQ1TDI4LjI0NzEgNDYuODYyNkwyOC4yMjAyIDM0LjU5NDRMMjAuMjc5NCAyNy45NDE0TDEyLjMxMzUgMzQuOTcyMlY0MC41Mjc0QzEyLjMxMzUgNDEuNTUxNSAxMy4wMzY3IDQyLjQ1NTkgMTQuMTAyMyA0Mi43NjQ1WiIgZmlsbD0iIzAwQzZBMiIgZmlsbC1vcGFjaXR5PSIwLjUiLz4KPHBhdGggZD0iTTQzLjY0NDUgNDIuNzYzM0wyOC4yNzQ0IDQ2Ljg2MzJMMjguMjQ2OCAzNC41MTU3TDQzLjIyMSAyMi40NjQ4QzQzLjIyMSAyMi40NjQ4IDQ1Ljc5MyAyNC4zOTk2IDQ1LjAzNzMgMjcuODE5NkM0My43MDQ4IDMzLjg1MTEgMzUuMTc5NiAzNS45ODY5IDM1LjE3OTYgMzUuOTg2OUw0My45MDk2IDQxLjE1NjFDNDQuNjE1NSA0MS41NzggNDQuNDU1NCA0Mi41NDcgNDMuNjQ0NSA0Mi43NjMzWiIgZmlsbD0iIzQ1RkZERSIvPgo8cGF0aCBkPSJNMzguNTkwMyAxOC45NzkzTDI4LjI3MzQgMTRMMjguMjQ2OCAzMC40MzE1TDQwLjY5NSAyMC4zNTA5QzQwLjY5NSAyMC4zNTA5IDQwLjQyNzEgMjAuMDU5NyAzOS42OTAxIDE5LjU4MDVDMzkuNDI4OSAxOS40MTE0IDM4LjU5MDMgMTguOTc5MyAzOC41OTAzIDE4Ljk3OTNaIiBmaWxsPSIjNDVGRkRFIi8+CjxwYXRoIGQ9Ik00MC41NTEgMTYuMDEwMUw0Ni42NjAyIDE4LjI4MDVDNDYuOTY3NSAxOC4zOTQzIDQ3LjE2OCAxOC42NjU2IDQ3LjE2OCAxOC45NjVWMjMuMTIwN0M0Ny4xNjggMjMuNDM4OCA0Ni43MjYgMjMuNTgyMiA0Ni41MDQyIDIzLjMzNDNMNDAuMjU1MyAxNi4zNjg3QzQwLjA4OTMgMTYuMTgzMSA0MC4zMDYyIDE1LjkxODEgNDAuNTUxIDE2LjAxMDFaIiBmaWxsPSIjNDVGRkRFIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMTI0NjFfMjA3NSIgeDE9IjI4LjI0NyIgeTE9IjEiIHgyPSIyOC4yNDciIHkyPSI2MC42NzM1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMwMTEzMjAiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDAxMzIwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'xtoken.ref-finance.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Solana',\n symbol: 'SOL',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHdpZHRoPSIxMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1MCIgeDI9IjUwIiB5MT0iMjciIHkyPSI3NCI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMTRlNmFkIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYTk2NGRlIi8+PC9saW5lYXJHcmFkaWVudD48Y2xpcFBhdGggaWQ9ImIiPjxwYXRoIGQ9Im0wIDBoMTAwdjEwMGgtMTAweiIvPjwvY2xpcFBhdGg+PGcgY2xpcC1wYXRoPSJ1cmwoI2IpIj48cGF0aCBkPSJtNTAgMGM5Ljg4OTEgMCAxOS41NTYxIDIuOTMyNDUgMjcuNzc4NSA4LjQyNjUyIDguMjIyNSA1LjQ5NDA4IDE0LjYzMTEgMTMuMzAyOTggMTguNDE1NSAyMi40MzkyOHM0Ljc3NSAxOS4xODk3IDIuODQ1MyAyOC44ODg3Yy0xLjkyOTMgOS42OTkxLTYuNjkxMyAxOC42MDgyLTEzLjY4NCAyNS42MDA4LTYuOTkyNiA2Ljk5MjctMTUuOTAxNyAxMS43NTQ3LTI1LjYwMDggMTMuNjg0LTkuNjk5IDEuOTI5Ny0xOS43NTI0LjkzOTEtMjguODg4Ny0yLjg0NTNzLTE2Ljk0NTItMTAuMTkzLTIyLjQzOTI4LTE4LjQxNTVjLTUuNDk0MDctOC4yMjI0LTguNDI2NTItMTcuODg5NC04LjQyNjUyLTI3Ljc3ODUgMC0xMy4yNjA4IDUuMjY3ODQtMjUuOTc4NSAxNC42NDQ3LTM1LjM1NTMgOS4zNzY4LTkuMzc2ODYgMjIuMDk0NS0xNC42NDQ3IDM1LjM1NTMtMTQuNjQ0N3oiIGZpbGw9IiMwMDAiLz48ZyBmaWxsPSJ1cmwoI2EpIiBmaWxsLW9wYWNpdHk9Ii45MiI+PHBhdGggZD0ibTMwLjM4MDYgNjIuNzg4OWMuMzEzMS0uMzIzNC44MzQ5LS41MzkgMS4zNTY3LS41MzloNDYuMjMwN2MuODM0OSAwIDEuMjUyMyAxLjA3NzkuNjI2MiAxLjcyNDdsLTkuMTgzNiA5LjQ4NjRjLS4zMTMuMzIzNC0uODM0OC41MzktMS4zNTY2LjUzOWgtNDYuMTI2NGMtLjgzNDggMC0xLjI1MjItMS4wNzgtLjYyNjEtMS43MjQ4eiIvPjxwYXRoIGQ9Im0zMC4zODA2IDI3LjUzOWMuMzEzMS0uMzIzNC44MzQ5LS41MzkgMS4zNTY3LS41MzloNDYuMjMwN2MuODM0OSAwIDEuMjUyMyAxLjA3OC42MjYxIDEuNzI0OGwtOS4xODM1IDkuNDg2M2MtLjMxMzEuMzIzNC0uODM0OC41MzktMS4zNTY2LjUzOWgtNDYuMTI2NGMtLjgzNDkgMC0xLjI1MjMtMS4wNzgtLjYyNjEtMS43MjQ4eiIvPjxwYXRoIGQ9Im02OS41MTUgNDUuMDAxOGMtLjMxMzEtLjMyMzQtLjgzNDktLjUzOS0xLjM1NjctLjUzOWgtNDYuMjMwN2MtLjgzNDggMC0xLjI1MjIgMS4wNzgtLjYyNjEgMS43MjQ4bDkuMTgzNSA5LjQ4NjRjLjMxMzEuMzIzMy44MzQ5LjUzODkgMS4zNTY3LjUzODloNDYuMjMwNmMuODM0OSAwIDEuMjUyNC0xLjA3OC42MjYyLTEuNzI0OHoiLz48L2c+PC9nPjwvc3ZnPg==',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'sol.token.a11bd.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'TerraUSD',\n symbol: 'UST',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHdpZHRoPSIxMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTgxLjA5NiAxMy43MjItLjAxLS4wMS4wMTQtLjAwOGE0NC4xNzQgNDQuMTc0IDAgMCAwIC0yOC43NjUtMTAuNTc0IDQ0LjE2NyA0NC4xNjcgMCAwIDAgLTE4LjAxIDMuODI1Yy0zLjcwNSAxLjU2NS02LjcxNSAzLjYzNS05LjE5NSA2Ljg4NS0xMi43NCAxNi44MyAyOS45NiAyOS4wNiA1Mi43OSAyOS4xMDQgMTAuNDkyIDcuNTI4IDEzLjQ0Ni0yMS4yMzYgMy4xNzctMjkuMjIyeiIgZmlsbD0iIzBkM2NhNCIvPjxwYXRoIGQ9Im0zNi44OTMgMTQuMDYzYy01Ljg2MyA4LjgxNi0yNS40MDMgMTUuMDI3LTI4LjYxNSAxNC4wNTdsLS4wMTktLjA0Yy4xMzItLjI2OC4yNjgtLjUzMi40LS43OTVhNDYuNjcyIDQ2LjY3MiAwIDAgMSA4LjQ4LTExLjU4IDQ3LjIxIDQ3LjIxIDAgMCAxIDkuMTg1LTcuMTUxYzIuNzM3LTEuNTg0IDUuNTM2LTEuNjg4IDYuNDU4LTEuNzIgOC43MDguMTc3IDQuMTYgNy4xNiA0LjExIDcuMjI5em0tNC44MDYgNjIuMzAzYy40MTggMi43NzItLjAwOSAxMy43MTMtLjU4IDE0LjYzNC0uNDg2LjAzMi0xLjUwMy4wOTUtNC40NDgtMS41NTdhNDYuODI3IDQ2LjgyNyAwIDAgMSAtOS45Mi03LjU3MyA0Ni45NTIgNDYuOTUyIDAgMCAxIC04LjQ4LTExLjU4IDQ2LjUyNCA0Ni41MjQgMCAwIDEgLTUuMjIzLTIxLjVjMC0yLjU4MS4yMDgtNS4xMTguNjEyLTcuNTg3YTQ2LjUxMSA0Ni41MTEgMCAwIDEgMi4yNjUtOC41OThjMy4zNzYgNC40ODMgNy4yNzggOC41NDQgMTAuNTk1IDEzLjA3MyAzLjE1OSA0LjMxNSA3LjUwNiAxMS4zNDQgOC4zODYgMTIuODUgNS41IDkuMzE2IDYuMzc2IDE1LjA3NCA2Ljc5MyAxNy44Mzh6bS0zLjMxMi0zOC44NTdjLTIuMDA2LTE1LjMxIDI5LjA1NS0yNS45NzkgNDIuNzA1LTI2LjM4MiAxLjYzOC4wMTggNi42MTYuMDc3IDkuNTI1IDIuNDM2IDUzLjQ5NSA1MC45MzctNDYuOTU3IDY0LjI0LTUyLjIzIDIzLjk0N3oiIGZpbGw9IiM1NDk0ZjgiLz48cGF0aCBkPSJtMjAuNDU3IDkyLjM1YzAgMS44MjUgMS4yNyAzLjMwNCAyLjg0NSAzLjMxMyAzNy40OTYuMjU5IDczLjY5NC0xLjQ2IDczLjY5NC03LjA4MyAwLTE3LjAwNy03Ni41MzkgMy43Ny03Ni41MzkgMy43N3oiIGZpbGw9IiM3NjAxMDEiLz48cGF0aCBkPSJtMjMuMzIgNDQuMTg3YTIuODYzIDIuODYzIDAgMCAwIC0yLjg2MyAyLjg2M3Y0NS4zYzAgMS41NzQgMS4yNyAyLjg1IDIuODQ1IDIuODU4IDM3LjQ5Ni0uMjc2IDczLjc0LTEyLjY4NyA3My42OTQtNi42M3YtNTEuMDI0Yy4wNDUtNi4wNTMtMzYuMTg5IDYuMzUzLTczLjY3NiA2LjYzNHoiIGZpbGw9IiNkZTMwMzAiLz48cGF0aCBkPSJtODQgODBjOC44LTEuNiAxMi4zMzMtLjMzMyAxMyAuNXYzLjVjLTEuNi0xLjYtOS4zMzMtLjY2Ny0xMyAwLTIwLjUgNC41LTQ3LjgzMyA2LjMzMy02My41IDcuNXYtNGMxMS41IDAgNTIuNS01LjUgNjMuNS03LjV6bTAtOC4yMzJjOC44LTEuNiAxMi4zMzMtLjMzMyAxMyAuNXYzLjVjLTEuNi0xLjYtOS4zMzMtLjY2Ny0xMyAwLTIwLjUgNC41LTQ3LjgzMyA2LjMzMy02My41IDcuNXYtNGMxNC41IDEgNTIuNS01LjUgNjMuNS03LjV6bTAtOC4yMzJjOC44LTEuNiAxMi4zMzMtLjMzNCAxMyAuNXYzLjVjLTEuNi0xLjYtOS4zMzMtLjY2OC0xMyAwLTIwLjUgNC41LTQ3LjgzMyA2LjMzMi02My41IDcuNXYtNGMxNC41IDEgNTIuNS01LjUgNjMuNS03LjV6bTAtOC4yMzNjOC44LTEuNiAxMi4zMzMtLjMzMyAxMyAuNXYzLjVjLTEuNi0xLjYtOS4zMzMtLjY2Ny0xMyAwLTIwLjUgNC41LTQ3LjgzMyA2LjMzMy02My41IDcuNXYtNGMxNC41IDEgNTIuNS01LjUgNjMuNS03LjV6bTAtOC4yMzNjOC44LTEuNiAxMi4zMzMtLjMzMyAxMyAuNXYzLjVjLTEuNi0xLjYtOS4zMzMtLjY2Ni0xMyAwLTIwLjUgNC41LTQ3LjgzMyA2LjMzNC02My41IDcuNXYtNGMxNC41IDEgNTIuNS01LjUgNjMuNS03LjV6bTAtOC4yMzJjOC44LTEuNiAxMi4zMzMtLjMzMyAxMyAuNXYzLjVjLTEuNi0xLjYtOS4zMzMtLjY2Ny0xMyAwLTIwLjUgNC41LTQ3LjgzMyA2LjMzMy02My41IDcuNXYtNGMxNC41IDEgNTIuNS01LjUgNjMuNS03LjV6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0ibTI4LjU5MyA3MS41NGEyMDQuMTEyIDIwNC4xMTIgMCAwIDAgNy4wNjYtLjM3NiAyNTEuNzQ1IDI1MS43NDUgMCAwIDAgNi43MDYtLjU3MmMxLjEzLS4xMDkgMi4yNy0uMjIyIDMuNDQ1LS4zNSAxLjE3LS4xMjYgMi4zNjgtLjI1OCAzLjYxMi0uNDEyIDEuMjQzLS4xNSAyLjUzNi0uMzEzIDMuODg5LS40OSAxLjM1Mi0uMTczIDIuNzYzLS4zNzIgNC4yMzgtLjU5di0yNy41M2MtMTAuNTMyIDEuNTU2LTIyLjMxNyAyLjg3Mi0zNC4yMjkgMi45NThhMi44NjMgMi44NjMgMCAwIDAgLTIuODYzIDIuODY0djI0LjY1M2MxLjQ4NCAwIDIuODk1LS4wMTggNC4yNDctLjA1IDEuMzUzLS4wMTggMi42NDYtLjA2IDMuODktLjEwNXoiIGZpbGw9IiMxYTNhYjkiLz48cGF0aCBkPSJtMjMuMDUzIDQ2LjQ4IDEuMjIxIDEuODYzLTIuMjIzLjEyNiAxLjAwMi0xLjk4OHptNS4xMzUtLjI5IDEuMjIgMS44NjItMi4yMjIuMTI2em01LjEzNS0uMjkyIDEuMjIgMS44NjItMi4yMjMuMTI2em01LjEzNS0uMjkxIDEuMjIgMS44NjItMi4yMjMuMTI2em01LjEzNC0uMjkyIDEuMjIxIDEuODYyLTIuMjIzLjEyNnptNS4xMzUtLjI5MSAxLjIyMSAxLjg2Mi0yLjIyMy4xMjZ6bTUuMTMzLS4yOTIgMS4yMiAxLjg2Mi0yLjIyMi4xMjZ6bS0yOC4wNDcgNS4wMjYgMS4yMiAxLjg2Mi0yLjIyMi4xMjd6bTUuMTM1LS4yOTEgMS4yMiAxLjg2My0yLjIyMy4xMjZ6bTUuMTM1LS4yOTIgMS4yMiAxLjg2My0yLjIyMy4xMjZ6bTUuMTM0LS4yOTEgMS4yMjEgMS44NjItMi4yMjMuMTI3em01LjEzNS0uMjkyIDEuMjIxIDEuODYzLTIuMjIzLjEyNnptNS4xMzUtLjI5MSAxLjIyIDEuODYyLTIuMjIzLjEyN3ptLTI4LjA0NyA1LjAyNiAxLjIyIDEuODYyLTIuMjIzLjEyNnptNS4xMzUtLjI5MiAxLjIyIDEuODYzLTIuMjIzLjEyNnptNS4xMzUtLjI5MiAxLjIyIDEuODYzLTIuMjIzLjEyNiAxLjAwMi0xLjk4OXptNS4xMzQtLjI5IDEuMjIxIDEuODYyLTIuMjIzLjEyNiAxLjAwMi0xLjk4OXptNS4xMzUtLjI5MyAxLjIyIDEuODYzLTIuMjIyLjEyNnptNS4xMzUtLjI5IDEuMjIgMS44NjItMi4yMjMuMTI2em01LjEzMi0uMjkyIDEuMjIxIDEuODYyLTIuMjIzLjEyNiAxLjAwMi0xLjk4OXptLTI4LjA0MiA1LjAyNiAxLjIyIDEuODYyLTIuMjIzLjEyNyAxLjAwMy0xLjk5em01LjEzNC0uMjkxIDEuMjIxIDEuODYyLTIuMjIzLjEyNnptNS4xMzUtLjI5MyAxLjIyMSAxLjg2My0yLjIyMy4xMjd6bTUuMTM1LS4yOSAxLjIyIDEuODYyLTIuMjIzLjEyNnptNS4xMzUtLjI5MiAxLjIyIDEuODYyLTIuMjIzLjEyNnptNS4xMzQtLjI5MSAxLjIyMSAxLjg2Mi0yLjIyMy4xMjZ6bS0yOC4wNDggNS4wMjYgMS4yMiAxLjg2My0yLjIyMy4xMjZ6bTUuMTM0LS4yOTEgMS4yMjEgMS44NjMtMi4yMjMuMTI2em01LjEzNS0uMjkyIDEuMjIxIDEuODYzLTIuMjIzLjEyNnptNS4xMzUtLjI5IDEuMjIgMS44NjItMi4yMjMuMTI2IDEuMDAzLTEuOTg5em01LjEzNS0uMjkzIDEuMjIgMS44NjMtMi4yMjMuMTI2em01LjEzNC0uMjkxIDEuMjIxIDEuODYyLTIuMjIzLjEyN3ptNS4xMzMtLjI5MiAxLjIyMSAxLjg2My0yLjIyMy4xMjZ6bS0zMC42NTUgOS4wNDEgMS4yMjIgMS44NjMtMi4yMjMuMTI2IDEuMDAyLTEuOTg5em01LjEzNi0uMjkxIDEuMjIgMS44NjMtMi4yMjMuMTI2em01LjEzNC0uMjkyIDEuMjIxIDEuODYzLTIuMjIzLjEyNnptNS4xMzUtLjI5MSAxLjIyMSAxLjg2My0yLjIyMy4xMjZ6bTUuMTM1LS4yOTEgMS4yMjEgMS44NjItMi4yMjMuMTI2IDEuMDAyLTEuOTg5em01LjEzNS0uMjkyIDEuMjIgMS44NjMtMi4yMjMuMTI2em01LjEzMy0uMjkyIDEuMjIgMS44NjMtMi4yMjMuMTI2em0tMjguMTk2LTIuMjY2IDEuMjIxIDEuODYzLTIuMjIzLjEyNiAxLjAwMi0xLjk4OHptNS4xMzUtLjI5IDEuMjIxIDEuODYyLTIuMjIzLjEyNnptNS4xMzUtLjI5MiAxLjIyIDEuODYyLTIuMjIzLjEyNnptNS4xMzQtLjI5MSAxLjIyMSAxLjg2Mi0yLjIyMy4xMjZ6bTUuMTM1LS4yOTIgMS4yMjEgMS44NjItMi4yMjMuMTI2em01LjEzNS0uMjkyIDEuMjIxIDEuODYzLTIuMjIzLjEyNnoiIGZpbGw9IiNmZmYiLz48L3N2Zz4=',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'ust.token.a11bd.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Celo',\n symbol: 'CELO',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHdpZHRoPSIxMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxjbGlwUGF0aCBpZD0iYSI+PHBhdGggZD0ibTAgMGgxMDB2MTAwaC0xMDB6Ii8+PC9jbGlwUGF0aD48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxwYXRoIGQ9Im01MCAwYzkuODg5MSAwIDE5LjU1NjEgMi45MzI0NSAyNy43Nzg1IDguNDI2NTIgOC4yMjI1IDUuNDk0MDggMTQuNjMxMSAxMy4zMDI5OCAxOC40MTU1IDIyLjQzOTI4czQuNzc1IDE5LjE4OTcgMi44NDUzIDI4Ljg4ODdjLTEuOTI5MyA5LjY5OTEtNi42OTEzIDE4LjYwODItMTMuNjg0IDI1LjYwMDgtNi45OTI2IDYuOTkyNy0xNS45MDE3IDExLjc1NDctMjUuNjAwOCAxMy42ODQtOS42OTkgMS45Mjk3LTE5Ljc1MjQuOTM5MS0yOC44ODg3LTIuODQ1M3MtMTYuOTQ1Mi0xMC4xOTMtMjIuNDM5MjgtMTguNDE1NWMtNS40OTQwNy04LjIyMjQtOC40MjY1Mi0xNy44ODk0LTguNDI2NTItMjcuNzc4NSAwLTEzLjI2MDggNS4yNjc4NC0yNS45Nzg1IDE0LjY0NDctMzUuMzU1MyA5LjM3NjgtOS4zNzY4NiAyMi4wOTQ1LTE0LjY0NDcgMzUuMzU1My0xNC42NDQ3eiIgZmlsbD0iI2ZiY2M1YyIvPjxnIGZpbGw9IiNmZmYiPjxwYXRoIGQ9Im00My41NDIxIDczLjcyNDljMy40MDg1LjAwODMgNi43NDI5LS45OTQ4IDkuNTgxMS0yLjg4MjUgMi44MzgxLTEuODg3NiA1LjA1MjQtNC41NzQ4IDYuMzYyNi03LjcyMTVzMS42NTczLTYuNjExNC45OTc1LTkuOTU1NWMtLjY1OTktMy4zNDQtMi4yOTcxLTYuNDE3Mi00LjcwNDMtOC44MzAzLTIuNDA3My0yLjQxMzItNS40NzY0LTQuMDU3OS04LjgxODktNC43MjU5LTMuMzQyNC0uNjY4MS02LjgwNzktLjMyOTQtOS45NTc4Ljk3My0zLjE0OTkgMS4zMDI1LTUuODQyNSAzLjUxMDItNy43MzcxIDYuMzQzOC0xLjg5NDYgMi44MzM1LTIuOTA1OSA2LjE2NTQtMi45MDU5IDkuNTc0IDAgNC41NjEgMS44MDkgOC45MzU5IDUuMDMwMiAxMi4xNjQ5IDMuMjIxMiAzLjIyOTEgNy41OTE2IDUuMDQ4OCAxMi4xNTI2IDUuMDZ6bTAgNi4yNzUxYy00LjY0OTYuMDA4My05LjE5NzMtMS4zNjI5LTEzLjA2NzMtMy45NC0zLjg3MDEtMi41NzcyLTYuODg4Ny02LjI0NDQtOC42NzM4LTEwLjUzNzgtMS43ODUyLTQuMjkzMy0yLjI1NjYtOS4wMTk3LTEuMzU0Ni0xMy41ODFzMy4xMzY5LTguNzUyNSA2LjQyMTctMTIuMDQzM2MzLjI4NDgtMy4yOTA3IDcuNDcyMS01LjUzMzEgMTIuMDMxOC02LjQ0MzMgNC41NTk3LS45MTAxIDkuMjg2OS0uNDQ3MiAxMy41ODM0IDEuMzMwMnM3Ljk2OTIgNC43ODk0IDEwLjU1MzMgOC42NTQ5YzIuNTg0IDMuODY1NSAzLjk2MzQgOC40MTA2IDMuOTYzNCAxMy4wNjAzLjAwNTUgMy4wODQtLjU5NzIgNi4xMzg5LTEuNzczNiA4Ljk4OTgtMS4xNzYzIDIuODUwOS0yLjkwMzQgNS40NDE5LTUuMDgyMiA3LjYyNDZzLTQuNzY2NiAzLjkxNDQtNy42MTU0IDUuMDk1OS01LjkwMjYgMS43ODk3LTguOTg2NyAxLjc4OTd6Ii8+PHBhdGggZD0ibTU2LjUgNjAuNzI0OWMzLjQwODYuMDA4MyA2Ljc0MjktLjk5NDggOS41ODExLTIuODgyNHM1LjA1MjUtNC41NzQ5IDYuMzYyNi03LjcyMTZjMS4zMTAyLTMuMTQ2NyAxLjY1NzMtNi42MTEzLjk5NzUtOS45NTU0LS42NTk5LTMuMzQ0MS0yLjI5NzEtNi40MTcyLTQuNzA0My04LjgzMDQtMi40MDczLTIuNDEzMS01LjQ3NjQtNC4wNTc4LTguODE4OC00LjcyNTktMy4zNDI1LS42NjgtNi44MDgtLjMyOTQtOS45NTc5Ljk3MzEtMy4xNDk5IDEuMzAyNC01Ljg0MjUgMy41MTAyLTcuNzM3MSA2LjM0MzdzLTIuOTA1OSA2LjE2NTQtMi45MDU5IDkuNTc0YzAgNC41NjEgMS44MDkgOC45MzU5IDUuMDMwMiAxMi4xNjVzNy41OTE2IDUuMDQ4OCAxMi4xNTI2IDUuMDU5OXptMCA2LjI3NTFjLTQuNjQ3OSAwLTkuMTkxMy0xLjM3ODItMTMuMDU1OS0zLjk2MDUtMy44NjQ1LTIuNTgyMi02Ljg3NjYtNi4yNTI0LTguNjU1My0xMC41NDY0LTEuNzc4Ni00LjI5NDEtMi4yNDQtOS4wMTkyLTEuMzM3Mi0xMy41Nzc3LjkwNjctNC41NTg2IDMuMTQ0OS04Ljc0NTkgNi40MzE0LTEyLjAzMjRzNy40NzM4LTUuNTI0NyAxMi4wMzI0LTYuNDMxNGM0LjU1ODUtLjkwNjggOS4yODM2LS40NDE0IDEzLjU3NzcgMS4zMzcyIDQuMjk0IDEuNzc4NyA3Ljk2NDIgNC43OTA4IDEwLjU0NjQgOC42NTUzIDIuNTgyMiAzLjg2NDYgMy45NjA1IDguNDA4IDMuOTYwNSAxMy4wNTU5LS4wMTExIDYuMjI5Mi0yLjQ5MDYgMTIuMi02Ljg5NTMgMTYuNjA0N3MtMTAuMzc1NSA2Ljg4NDItMTYuNjA0NyA2Ljg5NTN6Ii8+PHBhdGggZD0ibTU3LjY4ODkgNjcuODU3MWMxLjYyMzQtMS45NzM4IDIuNzg2LTQuMjg0OCAzLjQwMzQtNi43NjQ3IDIuNDczNy0uNjM0MSA0Ljc4MTItMS43OTUgNi43NjQ3LTMuNDAzNC0uMDk4MyAyLjg5MDUtLjcyNDkgNS43Mzg2LTEuODQ4NyA4LjQwMzQtMi42NDQxIDEuMDg1MS01LjQ2MjUgMS42ODMtOC4zMTk0IDEuNzY0N3ptLTE3LjQzNy0yNy42MDVjLTIuNDM1NC42MzQ2LTQuNzAxNiAxLjc5NjQtNi42Mzg2IDMuNDAzMy4wNzI1LTIuODkzNi43MDAxLTUuNzQ2NCAxLjg0ODctOC40MDMzIDIuNjU4NS0xLjE0MzcgNS41MTA0LTEuNzcxMSA4LjQwMzQtMS44NDg4LTEuNjIzNCAxLjk3MzgtMi43ODYgNC4yODQ4LTMuNDAzNCA2Ljc2NDd6Ii8+PC9nPjwvZz48L3N2Zz4=',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'celo.token.a11bd.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Celo Dollar',\n symbol: 'cUSD',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHdpZHRoPSIxMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTEwMCA1MGMwLTI3LjYxNDItMjIuMzg1OC01MC01MC01MHMtNTAgMjIuMzg1OC01MCA1MCAyMi4zODU4IDUwIDUwIDUwIDUwLTIyLjM4NTggNTAtNTB6IiBmaWxsPSIjNDVjZDg1Ii8+PGcgZmlsbD0iI2ZmZiI+PHBhdGggZD0ibTY5Ljg4MDUgNjIuNjQzOGMtMS41NjcxIDMuMzkzMS0zLjkzNzUgNi4zNTMyLTYuOTA2MSA4LjYyNDEtMi45Njg1IDIuMjcwOC02LjQ0NTggMy43ODQxLTEwLjEzMDcgNC40MDg3LTMuNjg1LjYyNDYtNy40NjY3LjM0MTctMTEuMDE3Ny0uODI0MS0zLjU1MTEtMS4xNjU4LTYuNzY0Ni0zLjE3OTQtOS4zNjIzLTUuODY2Ni0yLjU5NzgtMi42ODcxLTQuNTAxNS01Ljk2NjktNS41NDY1LTkuNTU1NC0xLjA0NDktMy41ODg1LTEuMTk5Ni03LjM3NzUtLjQ1MDctMTEuMDM5My43NDg5LTMuNjYxNyAyLjM3ODktNy4wODU3IDQuNzQ4OS05Ljk3NTggMi4zNzAxLTIuODkgNS40MDg3LTUuMTU4OSA4Ljg1MjktNi42MTAzbDIuMjY2OCA1LjM3OTJjLTIuNTcgMS4wODMxLTQuODM3NSAyLjc3NjEtNi42MDYgNC45MzI3LTEuNzY4NSAyLjE1NjUtMi45ODQ4IDQuNzExNS0zLjU0MzYgNy40NDM5LS41NTg5IDIuNzMyNC0uNDQzNSA1LjU1OTguMzM2MyA4LjIzNzYuNzc5OCAyLjY3NzcgMi4yMDAzIDUuMTI1MSA0LjEzODggNy4xMzAyIDEuOTM4NCAyLjAwNTIgNC4zMzYzIDMuNTA3OCA2Ljk4NjEgNC4zNzc3czUuNDcxNyAxLjA4MSA4LjIyMTUuNjE0OWMyLjc0OTctLjQ2NjEgNS4zNDQ0LTEuNTk1MyA3LjU1OTUtMy4yODk4IDIuMjE1Mi0xLjY5NDUgMy45ODQtMy45MDMzIDUuMTUzNC02LjQzNTNsNS45MTg5LjMwNDJ6Ii8+PHBhdGggZD0ibTU2LjEwNjEgMjQuNXYtNGg0LjUwMDV2NGMyIDAgNS4xNjY3LjY2NjcgNi41IDF2NC41Yy0xOS0zLTE1LjUwMTEgMy44NDYyLTggNSA2LjcyMTcgMS4wMzM5IDExIDIgMTEuNSA5IC40IDUuNi01LjgzMzMgNy42NjY3LTkgOHYzLjVoLTV2LTMuNWMtMi40IDAtNi42NjY3LTEuNjY2Ny04LjUtMi41di01LjVjNC41IDIuNSAxNyA0LjUgMTcgMHMtMTYuNTAxMS0zLTE4LjAwMDUtMTFjLTEuMDAyMy01LjM0NzUgNS4zMzMzLTcuODMzMyA5LTguNXoiLz48L2c+PC9zdmc+',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'cusd.token.a11bd.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'ABR',\n symbol: 'ABR',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjEyMSIgdmlld0JveD0iMCAwIDEyMSAxMjEiIHdpZHRoPSIxMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGN4PSI2MC41IiBjeT0iNjAuNSIgZmlsbD0iIzBlMGIwZiIgZmlsbC1ydWxlPSJub256ZXJvIiByPSI2MC41Ii8+PGNpcmNsZSBjeD0iNjAuNSIgY3k9IjYwLjUiIHI9IjYwIiBzdHJva2U9IiMyZDJjMmUiIHN0cm9rZS1vcGFjaXR5PSIuODEiLz48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iPjxwYXRoIGQ9Im04MS4xNjg3IDUyLjIxNDctMTEuNjUzLTExLjY1MjloLTE3LjY1NTlsLTUuNjQ5MyA1LjY0OTl2LTIwLjEyNzdoLTYuMDAzN3YzNS42NjQ4IDcuNzY4NmwxMS42NTMgMTEuNjUyOWgxNy42NTU5bDUuNjUwMi01LjY0OTl2MjAuMTI3N2g2LjM1NjN2LTMzLjU0NjJ6bS0xNC40NzgxIDIyLjk1MjZoLTExLjY1MjJsLTguNDc1My04LjQ3NDh2LTQuOTQzNy02LjcwOTJsOC40NzUzLTguNDc0OGgxMS42NTIybDguNDc1MyA4LjQ3NDh2Ny40MTU1IDQuMjM3NHoiIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJtMzEuNzMzNCA3Mi42OTUydi0zMi4xMzM3aC02LjAwMjh2MzQuOTU4NmwyMC40ODEgMjAuNDgwOGgyMC40ODAxdi02LjAwM2gtMTcuNjU1OXoiIGZpbGw9IiM2ZGQiLz48cGF0aCBkPSJtNTUuMDM4OCAyNS43MzA1djYuMDAzaDE3LjY1NTlsMTcuMzAyNCAxNy4zMDI3djMyLjEzMzdoNi4wMDI4di0zNC45NTg2bC0yMC40ODEtMjAuNDgwOHoiIGZpbGw9IiM2ZGQiLz48L2c+PC9nPjwvc3ZnPg==',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'abr.a11bd.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Utopia',\n symbol: 'UTO',\n icon:\n \"data:image/svg+xml,%3Csvg id='Layer_1' data-name='Layer 1' xmlns='http://www.w3.org/2000/svg' viewBox='-40 -40 600 600'%3E%3Cdefs%3E%3Cstyle%3E .cls-1%7Bfill:%239f9f9f%7D.cls-2%7Bfill:%23fefefe%7D.cls-4%7Bfill:%23030303%7D %3C/style%3E%3C/defs%3E%3Cpath d='M371.65 15v23.92l-.47.71C368.82 41.48 366 41 363.36 41q-36.94.09-73.88 0h-176c-3.06 0-6.31.67-9.1-1.37l-.47-.71V15ZM55.21 355.33H31.66a2.81 2.81 0 0 1-.26-.3.82.82 0 0 1-.13-.37v-24H6.67V136.41h24.6l.69.44c2 2.64 1.38 5.75 1.39 8.67q.07 73.11 0 146.2c0 12.44.26 12.68 12.64 12.76 3 0 6-.29 8.85 1a3 3 0 0 1 1.23 1.1 12.38 12.38 0 0 1 1.18 6.17q.1 18 0 36.05c0 2.09.17 4.28-1.36 6.06ZM420.4 452.82v23.51c-3.87.66-178.64.93-195 .29v-23.8l.47-.71c2.79-2 6-1.37 9.1-1.37q75.33-.09 150.68 0c9.25 0 18.49-.06 27.74 0 2.25 0 4.6-.25 6.54 1.37ZM176.66 428H128v-23.83H79.16v-24.9l.39-.66c1.9-1.69 4.27-1.4 6.51-1.42 10.55-.08 21.09 0 31.63-.05 6.6-.05 7.89-1.5 8.12-8.1.16-4.52-.77-9.14 1.06-13.53a2.94 2.94 0 0 1 1.1-1.14 58.19 58.19 0 0 1 24.44-.12 3 3 0 0 1 1.2 1.07c1.29 2.36 1.19 4.95 1.2 7.5v30.75c.05 6.74 1.61 8.24 8.36 8.37 3.7.08 7.41-.1 11.1.23 2.23.2 3.9 1.14 4.1 3.54a107.23 107.23 0 0 1-.06 20 3.93 3.93 0 0 1-1 1.85c-.2.17-.43.31-.65.44Z'/%3E%3Cpath d='M225.4 452.82h-48.74V428c1.46-1.94 3.61-2 5.74-2.06 6.36-.1 12.72-.14 19.08.09 6.33-.23 12.67-.21 19-.07 1.93 0 4-.19 5.56 1.42 2.71 7.57 1.34 15.33 1 23-.04 1.09-.97 1.72-1.64 2.44ZM31.27 136.41V87.67h23.94l.7.45c1.36 1.51 1.34 3.39 1.35 5.22q.18 18.9 0 37.8a11.41 11.41 0 0 1-1 5 3.12 3.12 0 0 1-1.12 1.24c-7.1 2.15-14.32 1.17-21.51.74-1.03-.12-1.63-1.04-2.36-1.71Z'/%3E%3Cpath d='M55.21 87.67v-24.8h23.95l.69.44a3.53 3.53 0 0 1 1 1.84c.36 7.46 1.36 14.94-.69 22.33A3 3 0 0 1 79 88.65c-7.08 2-14.25 1.13-21.4.67-1.07-.06-1.67-.99-2.39-1.65ZM469.14 404.07V428h-24.8l-.71-.47a5.34 5.34 0 0 1-1.24-3.54q-.37-8.07 0-16.15a7 7 0 0 1 1.61-4.3 8.54 8.54 0 0 1 5.24-1.52c5-.13 10-.14 15 0 1.86.09 3.65.41 4.9 2.05Z'/%3E%3Cpath d='M79.16 62.87V38.92H104c.79.8 1.71 1.56 1.76 2.78.29 7 1.2 14-.69 20.86a3 3 0 0 1-1.13 1.23C96.52 66 89 64.92 81.56 64.53c-1.07-.06-1.68-1-2.4-1.66ZM444.34 428v24.8H420.4c-.67-.72-1.62-1.34-1.66-2.38-.33-7.7-1.67-15.44 1-23 1.15-1.33 2.78-1.33 4.32-1.4 5.11-.22 10.23-.18 15.35 0 1.9.03 3.68.36 4.93 1.98ZM79.16 379.27H55.21v-23.94c.52-.48.95-1.21 1.63-1.34a70.78 70.78 0 0 1 21.55-.16c1.55.19 2.36 1.57 2.5 3.09a109.82 109.82 0 0 1 0 19.53 4.76 4.76 0 0 1-1.73 2.82ZM444.34 111.61h24.8v73.54c-1.36 1.8-3.33 2-5.35 2-5 .13-9.94.18-14.9 0-5.5-.2-6.49-1.05-6.55-6.57-.18-14.62-.28-29.24.06-43.86-.24-6.35-.22-12.7-.12-19.06 0-2-.09-4 1.36-5.63ZM395.59 62.87h24.81v24.8c-.15.23-.3.46-.44.69a3.62 3.62 0 0 1-1.84 1c-7.43.4-14.88 1.3-22.25-.61a3 3 0 0 1-1.2-1.1c-1.72-8.12-2.21-16.24.23-24.32Z'/%3E%3Cpath d='M420.4 87.67h23.94v23.94c-.79.79-1.55 1.71-2.77 1.76-7 .29-14 1.2-20.87-.69a3.11 3.11 0 0 1-1.23-1.13c-2.14-7.1-1.16-14.3-.74-21.49.07-1.06 1-1.67 1.67-2.39ZM371.65 38.92h23.94v23.95c-.79.79-1.55 1.7-2.77 1.75-7 .3-14 1.2-20.87-.68a3.18 3.18 0 0 1-1.23-1.13c-2.13-7.1-1.16-14.31-.73-21.49.06-1.07 1.01-1.67 1.66-2.4Z'/%3E%3Cpath class='cls-1' d='M371.65 38.92v23.95c-.9 1.57-2.44 1.81-4 2-1.85.17-3.7.15-5.55.15q-124.27 0-248.55-.06c-3.25 0-6.93 1.15-9.57-2.05V38.92Z'/%3E%3Cpath class='cls-2' d='M104 62.87h267.65c1.92 1.47 2 3.6 2.07 5.74.1 3.68-.12 7.36.14 11 .28 4.05 1.77 5.54 5.81 5.83 3.53.25 7.07 0 10.6.14 2 .07 4 .3 5.32 2.07 1.93 1.47 2 3.6 2.08 5.74.11 3.53-.09 7.07.15 10.6.23 3.35 2 5.16 5.38 5.38 3.82.24 7.64 0 11.45.15 2.15.06 4.28.15 5.75 2.07 1.92 1.47 2 3.6 2.07 5.75.1 3.67-.12 7.35.13 11 .28 4 1.78 5.54 5.82 5.83 3.53.25 7.07 0 10.6.14 2 .06 4 .29 5.32 2.06v48.74h24.8v72.69c-1.25 1.62-3 2-4.92 2-3 .11-6 .06-9 .08-7.41.08-8.77 1.36-8.79 8.67-.05 14.34 0 28.68 0 43 0 3.27-.09 6.54 0 9.8.21 5.2 1.79 6.74 7.07 6.93 3.4.12 6.81 0 10.22.09 2 .06 4 .29 5.35 2.06v24.8c-1.45 1.93-3.59 2-5.71 2.05-6.32.1-12.64.16-19-.11-8 .24-16 .29-24 0-6.61.26-13.22.21-19.84.11a11 11 0 0 1-4.52-.85 3.53 3.53 0 0 1-1.28-.81c-1.44-2.28-1.36-4.85-1.38-7.4 0-3.11.09-6.23-.06-9.34-.22-4.62-1.65-6.06-6.2-6.29a67.32 67.32 0 0 0-7.65 0c-4.07.28-5.5 1.71-5.74 5.85-.22 3.68 0 7.37-.11 11.05-.06 2.4-.11 4.83-1.82 6.81-4.08 1.73-8.36.85-12.56 1s-8.19.09-12.28-.15c-6.36.26-12.72.22-19.08.12a11 11 0 0 1-4.54-.85 3.47 3.47 0 0 1-1.28-.82c-1.36-2.15-1.35-4.57-1.37-7 0-3.26.09-6.53-.07-9.79-.22-4.59-1.67-6-6.26-6.25-2.4-.12-4.82-.09-7.23 0-5.4.14-6.83 1.53-7 6.83-.11 3.54 0 7.09-.08 10.63-.07 2.27-.19 4.55-1.89 6.36-2.12 1.1-4.43.92-6.69.92q-29.41.09-58.84 0c-2.41 0-4.85.08-7.08-1.09-2.15-1.51-2.23-3.84-2.31-6.12-.14-3.56 0-7.12-.09-10.68-.17-5.33-1.6-6.72-7-6.86-2.13-.06-4.27-.09-6.41 0-4.58.25-6 1.68-6.19 6.35-.18 5.55.05 11.11-.27 16.67.34 6.24.22 12.48.14 18.72a11 11 0 0 1-1 4.55 2.94 2.94 0 0 1-1 1.19c-7.82 2.28-15.77 1.2-23.67.74-2.42-.14-2.95-2.34-3.11-4.45-.3-4 0-8-.22-11.93-.23-5.19-1.87-6.82-7-7-3.12-.14-6.25 0-9.38-.11-2-.07-4-.27-5.36-2.05-1.78-1.35-2-3.28-2.07-5.32-.09-3.82.1-7.65-.12-11.46-.24-4.14-1.67-5.57-5.75-5.83a69.87 69.87 0 0 0-8.92 0c-4.09.26-5.51 1.69-5.75 5.83-.23 3.81 0 7.64-.12 11.46 0 2-.29 4-2.07 5.32-.52.48-1 1.22-1.62 1.35a70.79 70.79 0 0 1-21.6.17c-2.15-.26-2.53-2.44-2.67-4.35-.32-4.26 0-8.53-.23-12.78-.22-5.2-1.85-6.83-7-7-4.26-.17-8.52 0-12.78-.2-3.1-.17-4.62-1.69-4.78-4.79-.22-4 0-8-.21-11.93-.23-5.18-1.86-6.8-7-7-3.12-.14-6.25 0-9.38-.11-2-.07-4-.28-5.36-2.05a5.39 5.39 0 0 1-2-4.1c-.09-1.71-.14-3.41-.14-5.12V145.58c0-3.16-.87-6.66 2.07-9.22 1.37-1.78 3.35-2 5.37-2 3.14-.11 6.27 0 9.4-.11 5.22-.22 6.91-1.8 7-7 .18-10.54 0-21.07.1-31.61 0-2.78-.52-5.79 2.08-7.93 1.47-1.93 3.6-2 5.74-2.08 3.68-.1 7.36.13 11-.13 4-.29 5.54-1.78 5.82-5.83.26-3.66 0-7.34.14-11 .15-2.2.21-4.33 2.21-5.8ZM469.14 404.07h-24.8l-.71-.47a5.84 5.84 0 0 1-1.28-3.92c-.19-5.76-.23-11.51 0-17.26.07-1.4.18-2.84 1.39-3.84 7.57-2.59 15.3-1.31 23-1 1 0 1.66 1 2.37 1.65Z'/%3E%3Cpath class='cls-1' d='M469.14 379.27h-24.8c-1.66-.8-1.87-2.36-1.95-3.92-.26-5.33-.25-10.66 0-16a5.23 5.23 0 0 1 1.95-4h24.8Z'/%3E%3Cpath d='M469.14 330.53h-24.36c-.65-3.68-.88-58.4-.29-72.69h24.65Z'/%3E%3Cpath class='cls-1' d='M55.21 136.41v170.18H31.72a2.76 2.76 0 0 1-.3-.29.64.64 0 0 1-.15-.36V136.41Z'/%3E%3Cpath d='M55.21 306.59H78.7a1.67 1.67 0 0 1 .31.28.73.73 0 0 1 .14.36v23.15h24.21a4.48 4.48 0 0 1 .45.45.8.8 0 0 1 .14.36v24.14h24v23.94H79.16v-23.94H55.21Z' fill='%23a1a1a1'/%3E%3Cpath class='cls-1' d='M420.4 428v24.8h-195V428c.7-1.53 2.11-1.78 3.55-1.94a48.57 48.57 0 0 1 5.12-.17h177.66c2.95.11 6.36-.98 8.67 2.11ZM152.71 355.33h23.49a1.72 1.72 0 0 1 .31.29.7.7 0 0 1 .14.36v23.29h24.8c2 1.24 2 3.31 2 5.26q.24 19.08 0 38.16c0 2-.25 4-2 5.33h-24.8v-23.5a1.7 1.7 0 0 0-.3-.3.62.62 0 0 0-.36-.14h-23.28Z'/%3E%3Cpath class='cls-1' d='M127.91 355.33V331a1.64 1.64 0 0 1 .29-.3.62.62 0 0 1 .36-.14h24.15v24.8Z'/%3E%3Cpath class='cls-2' d='M201.46 428v-48.73c1.48-1.95 3.64-2 5.79-2 6-.09 11.95-.17 17.92.12 7-.27 14-.31 20.93-.08 5.06.17 5.88 1.07 6.13 6.13.21 4-.06 8 .17 12 .27 4.69 1.92 6.25 6.65 6.56 11.72.77 13-.4 13-12.27 0-12.46 0-12.47 12.37-12.48h30.76c2.41 0 4.86-.13 7.15.88a3.53 3.53 0 0 1 1.27.77c2.32 4.12 1.32 8.63 1.39 13 .15 9.66.55 10.16 10.16 10.16h.85c7.68 0 8.7-1 8.75-8.55v-8.54a11.49 11.49 0 0 1 1.24-5.78 3 3 0 0 1 1.23-1 13.24 13.24 0 0 1 5.42-.92c14.31 0 28.63-.21 42.94.11 6.25-.24 12.51-.16 18.76-.12a14.32 14.32 0 0 1 6.23 1.14c1.93 1.13 1.76 3.1 1.84 4.9.2 4 0 7.93.14 11.88.2 5 1.73 6.58 6.68 6.8 3.26.15 6.51 0 9.77.1 2 .07 4 .29 5.33 2.06V428H201.46Z'/%3E%3Cpath class='cls-1' d='M79.16 87.67v48.74H55.21V87.67ZM104 62.87v24.8H79.16v-24.8ZM444.34 136.41H420.4v-24.8h23.94ZM395.59 87.67h-23.94v-24.8h23.94ZM420.4 111.61h-24.81V87.67h24.81Z'/%3E%3Cpath d='M322.9 379.27h-48.27a2.07 2.07 0 0 0-.31.27.68.68 0 0 0-.16.36v24h-23.67c.06.06-.06 0-.14-.14a.7.7 0 0 1-.14-.36v-24.15H225.4c-.46-.52-1.24-.92-1.33-1.59-.92-7.32-1.93-14.66.63-21.89l.7-.46h72.7c4-3.06 20.75-3.06 24.8 0 3.1 4.03 3.1 20.08 0 23.96ZM274.15 257.84H225.4V209.1c1.37-1.8 3.35-2 5.37-2q19-.19 38 0c2 0 4 .24 5.37 2 1.8 1.36 2 3.34 2 5.37q.19 19 0 38c.03 2.03-.14 4.01-1.99 5.37ZM395.59 257.84h-48.74V209.1c1.36-1.8 3.34-2 5.36-2q19-.19 38 0c2 0 4 .24 5.37 2 1.81 1.36 2 3.34 2 5.37q.21 19 0 38c.03 2.03-.18 4.01-1.99 5.37Z'/%3E%3Cpath class='cls-1' d='M395.59 257.84V209.1H420c.64 3.58.85 35.66.29 48.74Z'/%3E%3Cpath d='M444.34 404.07H420.4v-24.8c-3-4-3-19.92 0-23.94h23.94v48.74ZM395.59 379.27h-48.74c-.36-.45 0 .24-.35-.23-2.73-3.92-2.49-20 .35-23.71h24.8c4-3 19.93-3 23.94 0 3.04 4.02 3.04 19.93 0 23.94Z'/%3E%3Cpath class='cls-1' d='M274.15 209.1H225.4v-23.5c3.58-.64 35.65-.85 48.75-.3ZM395.59 209.1h-48.74v-23.5c3.58-.64 35.65-.85 48.74-.3ZM274.15 257.84V209.1h23.5c.64 3.58.85 35.65.3 48.74ZM322.9 355.33h-24.8V331a1.64 1.64 0 0 1 .29-.3.62.62 0 0 1 .36-.14h24.15ZM395.59 355.33h-23.94V331a1.64 1.64 0 0 1 .29-.3.62.62 0 0 1 .36-.14h23.29Z'/%3E%3Cpath d='M201.46 355.33V331a1.64 1.64 0 0 1 .29-.3.62.62 0 0 1 .36-.14h23.29v24.8c-4.01 3-19.93 3-23.94-.03Z'/%3E%3Cpath class='cls-1' d='M127.78 136.53v23.73h-23.64v-23.73ZM346.85 355.33v23.94c-4 3-19.93 3-24 0v-23.94ZM152.83 111.49V87.76h23.64v23.73Z'/%3E%3Cpath d='M322.9 379.27h24v24.35a2.07 2.07 0 0 1-.29.3.67.67 0 0 1-.37.15H322.9Z'/%3E%3Cpath class='cls-1' d='M127.79 136.27V111.7h24.91v24.57ZM201.45 379.25v-23.91h23.94v23.91ZM395.57 379.25v-23.91h24.86v23.91Z'/%3E%3Cpath class='cls-4' d='M469.17 404.08v-73.61h23.92v73.61ZM469.17 257.76v-72.61h23.92v72.61Z'/%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 8,\n id: 'utopia.secretskelliessociety.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'DEIP Token',\n symbol: 'DEIP',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDUiIGhlaWdodD0iNDUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3QgeD0iLjg5MiIgeT0iLjkxIiB3aWR0aD0iNDMuMTYxIiBoZWlnaHQ9IjQzLjE2MSIgcng9IjIxLjU4MSIgZmlsbD0iI0Y4RkVGQSIvPjxwYXRoIGQ9Ik05LjcgMTAuNmgxNC41MzRjNi41NjcgMCAxMS44OTIgNS4zMjMgMTEuODkyIDExLjg5IDAgNi41NjgtNS4zMjQgMTEuODkyLTExLjg5MiAxMS44OTJIOS43VjEwLjZaIiBmaWxsPSJ1cmwoI2EpIi8+PGNpcmNsZSBjeD0iMjIuNDczIiBjeT0iMjIuNDkxIiByPSI0Ljg0NSIgZmlsbD0iIzAwMCIvPjxkZWZzPjxyYWRpYWxHcmFkaWVudCBpZD0iYSIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjE2IDExLjY5NTUgLTExLjkyNjc3IC4yMjAyOCAyMi42OTcgMjIuNjg3KSI+PHN0b3Agb2Zmc2V0PSIuMzU5IiBzdG9wLWNvbG9yPSIjRTlGRjAwIi8+PHN0b3Agb2Zmc2V0PSIuNzYiIHN0b3AtY29sb3I9IiMyNjM4MDAiLz48c3RvcCBvZmZzZXQ9IjEiLz48L3JhZGlhbEdyYWRpZW50PjwvZGVmcz48L3N2Zz4=',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'deip-token.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Wootrade Network',\n symbol: 'WOO',\n icon:\n \"data:image/svg+xml,%3Csvg width='125' height='83' viewBox='0 0 125 83' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M102.422 0H122.958L113.203 30.9433H92.9243L102.422 0ZM75.982 29.4048L86.0788 53.3388L89.8436 41.0299H109.951L98.5713 78.0422C97.6301 80.9485 94.9776 82.9145 91.8972 82.9145H80.4314C77.6078 82.9145 75.0408 81.2049 73.9285 78.5551L61.2648 47.8682L48.8578 78.5551C47.831 81.2904 45.2641 83 42.3549 83H30.718C27.6376 83 24.9851 80.9485 24.0439 78.0422L0 5.85842e-05H20.1934L36.2797 53.3388L46.8898 29.3193C49.2857 23.3358 55.0185 19.4038 61.4359 19.4038C67.8533 19.4038 73.6718 23.3358 75.982 29.4048Z' fill='%2320252F'/%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '4691937a7508860f876c9c0a2a617e7d9e945d4b.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'LiNEAR',\n symbol: 'LINEAR',\n icon:\n \"data:image/svg+xml,%3Csvg width='40' height='40' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M30.74 28.78c.21-.36.32-.78.32-1.21v-6.33c0-.24-.06-.46-.17-.66-.12-.21-.28-.38-.48-.49l-16.86-9.77c-.35-.2-.73-.31-1.13-.32-.64 0-1.24.26-1.69.72-.45.45-.7 1.07-.71 1.71v6.39c0 .24.06.47.18.67.11.21.28.37.48.48l16.82 9.71c.36.22.77.32 1.19.32.41 0 .82-.12 1.19-.33.36-.21.66-.52.86-.89zm.32-16.27c0-.42-.1-.84-.29-1.21-.2-.38-.49-.7-.85-.93-.36-.22-.78-.34-1.21-.34-.42 0-.84.12-1.21.34l-4.97 2.81c-.04.02-.08.07-.1.12-.03.04-.04.1-.04.14 0 .06.01.11.04.16.02.04.06.08.1.1l8.05 4.62c.05.02.1.04.15.04.05 0 .1-.02.15-.05.04-.02.08-.06.11-.11.02-.04.04-.1.03-.15l.04-5.54zM10.05 27.5c-.01.43.08.86.28 1.23.2.38.49.7.85.93.36.22.78.34 1.2.34.42 0 .83-.12 1.2-.34l4.92-2.85c.04-.02.08-.06.1-.11.03-.04.05-.1.05-.15 0-.05-.02-.11-.05-.15-.02-.05-.06-.09-.1-.12l-8.05-4.6c-.05-.03-.09-.04-.15-.04-.05 0-.1.01-.15.04-.05.02-.08.07-.11.12-.02.04-.04.09-.04.14l.05 5.56z' fill='url(%23paint0_linear_186_370)'/%3E%3Cdefs%3E%3ClinearGradient id='paint0_linear_186_370' x1='11.135' y1='11.152' x2='30.145' y2='30.457' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%231BB3CC'/%3E%3Cstop offset='1' stop-color='%23824ACC'/%3E%3C/linearGradient%3E%3C/defs%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'linear-protocol.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'USN',\n symbol: 'USN',\n icon:\n \"data:image/svg+xml;charset=UTF-8,%3Csvg width='38' height='38' viewBox='0 0 38 38' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='38' height='38' rx='19' fill='black'/%3E%3Cpath d='M14.8388 10.6601C14.4203 10.1008 13.6748 9.86519 12.9933 10.0768C12.3119 10.2885 11.85 10.8991 11.85 11.5883V14.7648H8V17.9412H11.85V20.0589H8V23.2353H11.85V28H15.15V16.5108L23.1612 27.2165C23.5797 27.7758 24.3252 28.0114 25.0067 27.7997C25.6881 27.5881 26.15 26.9775 26.15 26.2882V23.2353H30V20.0589H26.15V17.9412H30V14.7648H26.15V10.0001H22.85V21.3658L14.8388 10.6601Z' fill='white'/%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'usn',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Huobi BTC',\n symbol: 'HBTC',\n icon:\n \"data:image/svg+xml,%3C%3Fxml version='1.0' standalone='no'%3F%3E%3C!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN' 'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'%3E%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' id='body_1' width='32' height='32'%3E%3Cg transform='matrix(1.3333334 0 0 1.3333334 0 0)'%3E%3Cimage x='0' y='0' xlink:href='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA/tJREFUWIXtln9oVWUYxz/vOc67iWtNS9IkjcSui8RUsv40TbLfVoZE5R+li1JJioqYFlKI/bBQo+417A+pTSgkiH5p0ETIBIvaaosiRcRqYVM3t3Oe97zv0x+eO27jXt1kWoFfOJzDeX59npf3fc6B8/o/atNXOmKocgVnEmSt3vOvAaxr1stEdN5QAQwbbIAV7kO0dqgABrUCDR9rpVhdJqIO4KUdmjmnAEnCMon0Uom18/ltekXVSNafM4CVH+h4SVglkUdEDwELgoBHNu7RG846wIomb2xCXoQLpMdhRX8GrnWWwMDWV5v9mLMK0JuYx8QyX3ocNlZEtAWY3HPcE51w47z4rU9t1zM60qc9BYu36ExreQWArgTjNB5WEbaqMjE+AVZcZAzhyMBPA74ZUoBFeT/aJrwPZJAE0+sA9o2p9aPiKCYMg2dC53NrFlUdHWzhAQEk1mzGMAFVzFEBpxjDrrg3qg3CYOr6+pqDUT477tlc9iHgOqAW6AT2YGisXNp++HQAppzhttf9LcaYjwDoEUy3ABAYbtz+QvXOOHdVqLjVwNNAqXkQA+sM4ZpM/Q+uXJ2yG8cmZpVYEFFspyCxYkW7vHO7JV8XKK4RWN2v+ALgMNCUvl+tuEbJ15WtU9Iwe63WiWWWWLBdFht5rCgS66YP114YefVPAgsLrMBc4DmD+Q5oAT4vSrcw9R84gLXMEQtiQdLuJVa1lrfi3JQaoKHIvQK4tbK+fU2mvm1/EAY3pxDfFvk0pHEDAxDLlWIViRy2O0FEEdG25jdrDip6O1BdKk+Uy272zjdhOATcVWSvTuMGCJBQJYkpLo6I/pSap5cI2Zne64C7USabwPwB+CKfUnFlV6BDrCLdCTbWwtVd6KafuzXGfBnlspOAN4wJLq+sb9+lXh/tl79/XHkAm+hesWB7fd8KxHHfP0BHkWsvsCWztK0LuBd4V9X/GOWzNZycB8XqoIRKDqLEmU+d0yNBwmgTa+H1tAnzOg1cv7vItRl4OX1uArqA2iAIurzzyj+1mxIquQL7N5pem/CimLB4D4y3ksw0ATuAA6nrTcAvcX7KJOABjNlmCPLe6QxOzoiCDpjA7BgwAEDizIZ4+PBPxFI4hljxT2SWtFtgOVDo8IiqzgXGovq44n8D3QtMTO0KLM8sabOl6pQdxQCjFmuV6+h+jz9P3NmXTJl/bN8ln0W57ArgtaImfgdC4OKiFB5YWVnfvqFcjVMCAIy43xtz8NiDelwacH6SwhFVZketY1uiXHZOCnF1idCWtPgXp8p/WoCCLrrDmuO//jWdxF+jQEXIOz2tY52+PdXEzs4AnUXf19B8nQkr9pmHv++/Ec/rv6e/AQ/TFRmUSxQZAAAAAElFTkSuQmCC' width='24' height='24'/%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '0316eb71485b0ab14103307bf65a021042c6d380.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'PembRock',\n symbol: 'PEM',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyMDAgMjAwIj48cGF0aCBmaWxsPSIjMUUxRTFGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMTMuMiAxNzAuNDJhODMuNTEgODMuNTEgMCAwIDAgNzAuNy04Mi42IDgzLjUgODMuNSAwIDAgMC01Ljc4LTMwLjYxbDEzLjY4LTIzLjg3aC0yOC4wOGE4My4xIDgzLjEgMCAwIDAtNjMuMi0yOS4wNiA4My4xIDgzLjEgMCAwIDAtNjMuMiAyOS4wNkg4LjU4TDIyLjcgNTcuNzhhODMuNSA4My41IDAgMCAwLTUuNTUgMzAuMDUgODMuNTEgODMuNTEgMCAwIDAgNzAuNiA4Mi41N2wxMi43NyAyMi4xMSAxMi42Ny0yMi4xWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI0VBRUNFRiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTAwLjUzIDcuOTJBNzguNjYgNzguNjYgMCAwIDAgNDAuNjEgMzUuNmwtMS4xOCAxLjE3SDE2LjY1TDI4LjIzIDU3LjFsLS42OCAxLjc3Yy0zLjQgOC44Ny02LjA3IDE4LjEtNi4wNyAyOC4yIDAgMzkuNzcgMjkuMDMgNzMuMTQgNjYuOTQgNzlsMS44Ni4zIDEwLjM0IDE3Ljc5IDEwLjA2LTE3Ljc4IDEuODctLjNjMzcuOTUtNS44MSA2Ny4wMy0zOC44IDY3LjAzLTc4LjYxIDAtMTAuMy0yLjI0LTIwLjEzLTUuNzgtMjkuMTVsLS42OS0xLjc4IDExLjE4LTE5Ljc3aC0yMi42NWwtMS4xOC0xLjE3YTc4LjY2IDc4LjY2IDAgMCAwLTU5LjkzLTI3LjY3Wk0zNS44NCAyOS4wNEE4Ni40OCA4Ni40OCAwIDAgMSAxMDAuNTQgMGE4Ni40OCA4Ni40OCAwIDAgMSA2NC42OCAyOS4wNGgzMi42N0wxODEuODEgNTcuMmMzLjQ2IDkuNDMgNS42NSAxOS42MyA1LjY1IDMwLjI2IDAgNDMuMTItMzEuMDIgNzguOTUtNzEuODMgODYuMTRMMTAwLjY1IDIwMGwtMTUuMy0yNi40MmMtNDAuNzctNy4yMy03MS43NC00My40NC03MS43NC04Ni41MyAwLTEwLjQgMi42Mi0xOS45OSA1LjkzLTI5LjI1TDMgMjkuMDRoMzIuODRaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjRjY4MjFGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0zMS44NSA0NS40MSA2OC43NSAxMjAuNDIgOC4wNi0xNC4xMi0yNy40Ny00OC4xM2gyNC4zTDcyLjMzIDQ1LjRIMzEuODVabTQ5LjE5IDAgNDQuMTUgNzcuMzIgNy42Ny0xMy40NC0yOC4xOC00OS4zNGg4LjM3bDIzLjk5IDQyLjAyTDE0NSA4OGwtMTYuMDItMjguMDVoMTYuNDJsLTQuNDMgNy43NiA3LjgxIDEzLjcgMjAuNTctMzZIODEuMDRaTTU2LjMgNTkuOTVsMTYuNjIgMjkuMTFoOC42N0w2NC45NyA1OS45NUg1Ni4zWk00NC4yIDg0LjZhNTYuNjUgNTYuNjUgMCAwIDAgMzEuMDUgNTQuMTJsNi4zMiAxMS4wMWE2NC40NSA2NC40NSAwIDAgMS00NS4yOS02MS43YzAtNC45Ny41Ni05LjggMS42LTE0LjQ0bDYuMzMgMTEuMDJabTc5LjY1LTQ3LjlhNTUuNDYgNTUuNDYgMCAwIDAtMjMuNjYtNS4yNyA1NS40NSA1NS40NSAwIDAgMC0yMy42NSA1LjI2SDYxLjVhNjMuMjYgNjMuMjYgMCAwIDEgMzguNy0xMy4xNmMxNC41NCAwIDI3Ljk1IDQuOSAzOC43IDEzLjE2aC0xNS4wNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNGNjgyMUYiIGQ9Ik00NC4xIDg4LjAyYzAtMS4xNC4wNC0yLjI4LjEtMy40MWwtNi4zLTExLjAyYTY1LjI2IDY1LjI2IDAgMCAwLTEuNiAxNC40MyA2NC40NSA2NC40NSAwIDAgMCA0NS4yOCA2MS43MWwtNi4zMS0xMWE1Ni42NSA1Ni42NSAwIDAgMS0zMS4xNS01MC43Wm0xMTMuMTIgMGMwLTEuMTQtLjItMi4yOC0uMjctMy40MWw2LjI1LTExLjAyYTY1LjMxIDY1LjMxIDAgMCAxIDEuODQgMTQuNDMgNjQuNDUgNjQuNDUgMCAwIDEtNDUuMjkgNjEuNzFsNi4zMS0xMWE1Ni42NSA1Ni42NSAwIDAgMCAzMS4xNi01MC43WiIvPjwvc3ZnPg==',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'token.pembrock.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Atocha Coin',\n symbol: 'ATO',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMzYuODggMTM2Ljg4Ij48Y2lyY2xlIGN4PSI2OC40NCIgY3k9IjY4LjQ0IiByPSI2OC40NCIgc3R5bGU9ImZpbGw6Z29sZCIgZGF0YS1uYW1lPSJMYXllciAyIi8+PGcgZGF0YS1uYW1lPSJMYXllciAxIj48cGF0aCBkPSJNNzEuNjUgNzkuNXYyNC40MWMwIDEuMjcuMjQgMS40OSAxLjQ3IDEuMTcgMS4wOC0uMjkgMi4xMy0uNjggMy4xOC0xYTExLjU4IDExLjU4IDAgMCAwIDEuNS0uNTljMS40MS0uNzIgMi44NC0xLjQgNC4xOC0yLjIyYTI1LjU5IDI1LjU5IDAgMCAwIDUuNTktNC42NGMxLjM2LTEuNTIgMi41NC0zLjIgMy43OC00LjgyLjMzLS40My4xOS0uNzItLjM1LS43MS0uODYgMC0xLjcyLjEzLTIuNTguMjItLjQ5IDAtMSAuMTMtMS40Ny4xOWEuMzkuMzkgMCAwIDEtLjQ4LS4zN2wtLjMzLTJhMS41NSAxLjU1IDAgMCAwLS4wNy0uNDIgNS43OCA1Ljc4IDAgMCAxLS4zMy0yLjEzYy0uMDktMS0uMjUtMS45NC0uMzQtMi45Mi0uMDctLjc4LjA1LS44NC44My0uOTQgMS41OS0uMTkgMy4xOC0uNDQgNC43Ny0uNjVsMi43OS0uMzcgMS4xNC0uMTUgNC44Ny0uNzRjLjI3IDAgLjU0LS4wNS44LS4wOWwyLjE4LS4zNWEyLjc1IDIuNzUgMCAwIDEgLjU1LS4wOC40Ny40NyAwIDAgMSAuMzUuMTcgOS44NSA5Ljg1IDAgMCAxIC40NCAxLjFjLjI0LjY5LjQ2IDEuMzkuNjkgMi4wOGEyLjY5IDIuNjkgMCAwIDEgLjA5LjI4Yy4xNy44My4zMyAxLjY2LjUxIDIuNDkuMjYgMS4xNC41NCAyLjI3LjgxIDMuNC4zMSAxLjMxLjYgMi42My45MyAzLjkzLjE5Ljc1LjQ1IDEuNDkuNjUgMi4yNHMuNDUgMS44MS42NiAyLjcxYS40LjQgMCAwIDEtLjE0LjM0IDMuMzkgMy4zOSAwIDAgMS0uODEuMzVjLTEuMzYuMzYtMi43Mi42OS00LjA5IDFsLTIuNTEuNjVjLS42My4xNy0uNzcuMDgtLjkyLS41NHEtLjM5LTEuNTktLjgyLTMuMTdjMC0uMTQtLjIxLS4zNC0uMzItLjM0YS45MS45MSAwIDAgMC0uNTkuMjRjLS4yOS4zMy0uNDguNzQtLjc1IDEuMDgtLjkzIDEuMTgtMS45IDIuMzMtMi44MyAzLjUxYTMwIDMwIDAgMCAxLTQuNiA0LjMgMzkuNCAzOS40IDAgMCAxLTMuNzQgMi41OCAyNi41OSAyNi41OSAwIDAgMS0yLjcxIDEuNTljLTEuMDguNTMtMi4yIDEtMy4zMiAxLjQycy0yIC43OC0zLjA3IDEuMTFjLS43MS4yMy0xLjQ1LjM3LTIuMTcuNTUtLjIuMDUtLjQuMTQtLjYuMjFhNC41MSA0LjUxIDAgMCAxLS40NC4xNmMtLjYxLjE1LTEuMjMuMy0xLjg1LjQzYS42Mi42MiAwIDAgMC0uNTMuN2MwIC43OCAwIDEuNTctLjA2IDIuMzRhNS4yOCA1LjI4IDAgMCAxLS44IDIuNDkgMy44OCAzLjg4IDAgMCAxLTEuNTIgMS4zMiAxMi41NyAxMi41NyAwIDAgMS0xLjU0LjcxIDEuMjQgMS4yNCAwIDAgMS0uNzguMDcgNS44NiA1Ljg2IDAgMCAxLTMuNzMtMi45MiA4IDggMCAwIDEtLjQtMi42MiAxMCAxMCAwIDAgMSAwLTEuMjguNjcuNjcgMCAwIDAtLjYxLS43NGMtLjc1LS4xNC0xLjUtLjI2LTIuMjQtLjQ0cy0xLjU3LS40NC0yLjM1LS42OGMtLjUtLjE1LTEtLjI4LTEuNS0uNDctMS42My0uNjEtMy4yOC0xLjE5LTQuODktMS44NmExNS4xMiAxNS4xMiAwIDAgMS0yLjI3LTEuMjljLTEuMzgtLjg5LTIuNzgtMS43Ny00LjEtMi43Ni0xLS43Ni0xLjkyLTEuNjgtMi44OC0yLjUyYTM2LjMzIDM2LjMzIDAgMCAxLTQuODEtNS42OGMtLjU4LS43Ny0xLjEtMS41OC0xLjY4LTIuMzVhLjgxLjgxIDAgMCAwLS42LS4yOWMtLjE2IDAtLjM3LjI1LS40My40My0uMzEgMS0uNTcgMi4wNy0uODYgMy4xMXEtLjE5LjctLjQgMS4zOWMtLjExLjM1LS4zOS4zNC0uNjYuMjgtLjU4LS4xMy0xLjE2LS4yOC0xLjczLS40My0xLjYyLS40Mi0zLjI0LS44NC00Ljg2LTEuMjhhNi41NSA2LjU1IDAgMCAxLTEtLjQuMzQuMzQgMCAwIDEtLjEyLS4zYy4yMS0xIC40MS0xLjkzLjY2LTIuODkuMzMtMS4yNC43Mi0yLjQ3IDEtMy43Mi4zOC0xLjQ4LjcyLTMgMS4wOC00LjQ3LjIyLS44OS40Ni0xLjc4LjY4LTIuNjguMTgtLjcyLjM0LTEuNDUuNTItMi4xN3MuMzItMS4yMy41Mi0xLjgzLjM4LS41NS44OC0uNDJhNi43NCA2Ljc0IDAgMCAwIC45Mi4xNWMxLjIuMTUgMi4zOS4yOCAzLjU5LjQ0bDUuNi43NSA0LjYxLjU3Yy44NS4xMSAxLjY5LjI1IDIuNTMuMzYuMyAwIC40Ny4xOS40NC41MXYuNDNjLS4xMyAxLjI0LS4yMiAyLjQ5LS40IDMuNzJzLS40NSAyLjM4LS42NiAzLjU4Yy0uMDYuMzQtLjIzLjQ3LS41NS40MmwtMi4xNC0uMzVhMi4yIDIuMiAwIDAgMC0uNDcgMGMtLjQgMC0uNTcuMjItLjQyLjU5YTcuOTIgNy45MiAwIDAgMCAuNzEgMS4zNCAyNC45NCAyNC45NCAwIDAgMCAzLjUyIDQuMjFjLjkxLjg4IDEuODIgMS43NiAyLjc4IDIuNTdhMTkgMTkgMCAwIDAgNC4yOSAyLjY5YzEuMTEuNTEgMi4yMiAxIDMuMzcgMS40N3MyLjM4LjggMy41OCAxLjE4YTIgMiAwIDAgMCAuNTEuMDUuNDcuNDcgMCAwIDAgLjUyLS40IDIuOTEgMi45MSAwIDAgMCAuMDctLjU1Yy4wNy0zLjYuMTgtNy4xOS4yLTEwLjc5LjA1LTguMzIuMDYtMTYuNjQuMDgtMjVWNTQuODVjMC0uOS0uMi0xLjA5LTEuMS0xLjA5aC0xNmExMy41MSAxMy41MSAwIDAgMS0yLjc4LS4zOSAxLjMxIDEuMzEgMCAwIDEtLjczLS43IDMuNDUgMy40NSAwIDAgMS0uMzMtMS4zNXYtNC4zMWEzLjQ1IDMuNDUgMCAwIDEgLjMxLTEuMSAxIDEgMCAwIDEgLjk1LS42M2MxLjMtLjExIDIuNi0uMjQgMy45MS0uMjYgMy42MyAwIDcuMjUgMCAxMC44OC0uMDVoMy44M2MuNjYgMCAxLS4yNyAxLS45M1YzMi41NmExLjQzIDEuNDMgMCAwIDAtLjc1LTEuMzQgMTAuNDkgMTAuNDkgMCAwIDEtMy41NS0zLjU2IDcuNTcgNy41NyAwIDAgMS0xLjI5LTMuN2MtLjA2LTEuMTkgMC0yLjM5IDAtMy41OEE4LjM1IDguMzUgMCAwIDEgNTguNDEgMTdhOS41IDkuNSAwIDAgMSA0LTMuNzYgNi41MyA2LjUzIDAgMCAxIDIuNjgtMWMuNzMtLjA4IDEuNDQtLjMgMi4xNy0uMzRhNi4xNiA2LjE2IDAgMCAxIDEuNDIuMjJjLjEzIDAgLjI1LjA4LjM3LjA5YTEwLjM1IDEwLjM1IDAgMCAxIDUgMi4zNSA3LjYyIDcuNjIgMCAwIDEgMi4xOCAyLjhjLjQ2LjkzLjggMS45MyAxLjE3IDIuOWEyLjEyIDIuMTIgMCAwIDEgLjEuNjd2MS40NWE4LjEyIDguMTIgMCAwIDEtLjcxIDMuNTUgMTIuMzEgMTIuMzEgMCAwIDEtMi4xNyAzLjYzIDUuOCA1LjggMCAwIDEtMS45MyAxLjU3IDEuNjggMS42OCAwIDAgMC0xLjA2IDEuNzR2MTEuMjZjMCAuNjIuMjkuODYuOTIuODhIODUuNjljMS43NiAwIDMuNTIuMTQgNS4yOC4xNmExLjgyIDEuODIgMCAwIDEgMS42OCAxLjg1djQuNjFhMi4zMyAyLjMzIDAgMCAxLS41NyAxLjQ0IDEuMzUgMS4zNSAwIDAgMS0uNy40MSAyMC4wNyAyMC4wNyAwIDAgMS01LjE4LjM0SDcyLjY3Yy0uOTEgMC0xLjA3LjE2LTEuMDcgMS4wNnEuMDUgMTIuMzQuMDUgMjQuNjJabS00LjQ5LTUxLjU1YTUuNzQgNS43NCAwIDAgMCA1LjcxLTUuNjQgNS44MiA1LjgyIDAgMCAwLTYuMDgtNS42M2MtMi41Mi4wNS01LjExIDIuODMtNS4wNyA1LjcxYTUuNiA1LjYgMCAwIDAgNS40NCA1LjU2WiIvPjxwYXRoIGQ9Ik04MC45NCA3Ny41YTIwIDIwIDAgMCAxLTIuNjktLjM3IDcuMzMgNy4zMyAwIDAgMS00LjM0LTMgNy43IDcuNyAwIDAgMS0xLTYuMjQgNy43OCA3Ljc4IDAgMCAxIDMuNzYtNSAxMC4yNSAxMC4yNSAwIDAgMSA2LjM4LTEuNTEgOC4xIDguMSAwIDAgMSA2LjE3IDMuNEE3LjY1IDcuNjUgMCAwIDEgOTAuNTcgNzFhNi40NiA2LjQ2IDAgMCAxLTIuMTQgMy40NiAxMi4yNyAxMi4yNyAwIDAgMS0zLjQ2IDIuMjEgMTAuNjQgMTAuNjQgMCAwIDEtNC4wMy44M1ptMy01LjY2YTYuNjkgNi42OSAwIDAgMCAwLS44NSAyMi41IDIyLjUgMCAwIDAtMS4xNy00Ljc3IDEuODMgMS44MyAwIDAgMC0xLjQ4LTEuMzFjLTEuMjYtLjEzLTEuOTIgMS0xLjggMi4xOWEyMy43MiAyMy43MiAwIDAgMCAuNjQgMy40IDEzLjA3IDEzLjA3IDAgMCAwIC44NiAyLjM5IDEuNDggMS40OCAwIDAgMCAyLjMzLjU2IDEuODEgMS44MSAwIDAgMCAuNjEtMS42M1pNNDMuOTQgNzMuMzFhMy44NyAzLjg3IDAgMCAxIDItMy42QTguOTEgOC45MSAwIDAgMSA1MSA2OC4zOWE1LjU5IDUuNTkgMCAwIDAgLjYgMCAxIDEgMCAwIDAgMS0xIDEwIDEwIDAgMCAwLS4yNy0yLjU2IDEuMzMgMS4zMyAwIDAgMC0yLjM0LS41NGMtLjU3LjU1LTEgMS4yMS0xLjU3IDEuNzlhMi41NiAyLjU2IDAgMCAxLTIuMjIuOTQgMS40NyAxLjQ3IDAgMCAxLTEuMjEtMiAzLjkzIDMuOTMgMCAwIDEgMi0yLjA5IDEzLjI2IDEzLjI2IDAgMCAxIDIuNTctMS4wOCAxMC4zMSAxMC4zMSAwIDAgMSA1LjEzLS4yNyA3LjM1IDcuMzUgMCAwIDEgMi45MyAxLjM2QTMuMzggMy4zOCAwIDAgMSA1OSA2NS4zOWMuMDcgMS4yNy4wOCAyLjU0LjE1IDMuODEuMDYgMSAuMTYgMiAuMjYgM2ExLjIzIDEuMjMgMCAwIDAgLjg4IDEuMDVjLjY3LjI3Ljc0LjQ2LjU3IDEuMTRhMy44IDMuOCAwIDAgMS0yIDIuMzUgNC4zOCA0LjM4IDAgMCAxLTMuNjguNDUgMy4zIDMuMyAwIDAgMS0xLjE1LS42OWMtLjc0LS42OC0uODItLjc1LTEuNjItLjE5YTYuMjEgNi4yMSAwIDAgMS00LjY5IDEgNC4yMSA0LjIxIDAgMCAxLTMuMS0xLjgxIDMuMSAzLjEgMCAwIDEtLjY4LTIuMTlabTcuNy0yLjkxYTIgMiAwIDAgMC0xLjE3IDMuNDMgMS4yMiAxLjIyIDAgMCAwIDEuNzQtLjI0IDIuOSAyLjkgMCAwIDAgLjI2LTIuNjIuNzYuNzYgMCAwIDAtLjgyLS41N1oiLz48L2c+PC9zdmc+',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'atocha-token.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'SeatlabNFT',\n symbol: 'SEAT',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' x='0px' y='0px' width='32px' height='32px' viewBox='0 0 32 32' style='enable-background:new 0 0 32 32;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23050035;%7D .st1%7Bfill:url(%23SVGID_1_);%7D%0A%3C/style%3E%3Cg id='Layer_1'%3E%3Ccircle class='st0' cx='16' cy='16' r='16'/%3E%3C/g%3E%3Cg id='Isolation_Mode'%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='6.2375' y1='16' x2='25.7625' y2='16'%3E%3Cstop offset='0' style='stop-color:%2300C2FF'/%3E%3Cstop offset='1' style='stop-color:%230067FF'/%3E%3C/linearGradient%3E%3Cpath class='st1' d='M14,6.1c-0.3,0-0.5,0.1-0.8,0.2L8.1,9.4L7.8,9.6L7.2,10c-0.5,0.3-0.9,0.6-0.9,1.7v4.1c0,0.9,0.3,1.6,0.9,1.9 l6.2,3.8c1,0.6,2.3-0.1,2.3-1.3v-2.9c0-0.7-0.4-1.4-1-1.8l-2.9-1.8l3-1.9c0.5-0.3,0.8-0.9,0.8-1.5V7.6C15.6,6.7,14.8,6.1,14,6.1z M14.7,10.4c0,0.3-0.2,0.6-0.4,0.8l-3.4,2.1l-1.8-1.1c-0.5-0.3-0.8-0.5-1.1-0.8c-0.3-0.3-0.2-0.8,0.2-1c0,0,0,0,0,0L13.7,7 C13.8,7,13.9,6.9,14,6.9c0.3,0,0.7,0.3,0.7,0.7V10.4z M24.9,14.3l-6.2-3.8c-1-0.6-2.3,0.1-2.3,1.3v2.9c0,0.7,0.4,1.4,1,1.8l2.9,1.8 l-3,1.9c-0.5,0.3-0.8,0.9-0.8,1.5v2.8c0,0.9,0.8,1.6,1.6,1.6c0.3,0,0.5-0.1,0.8-0.2l5.1-3.1l0.4-0.2l0.6-0.4 c0.5-0.3,0.9-0.6,0.9-1.7v-4.1C25.8,15.3,25.4,14.6,24.9,14.3z M23.8,21.6C23.8,21.6,23.8,21.6,23.8,21.6L18.3,25 c-0.1,0.1-0.2,0.1-0.4,0.1c-0.3,0-0.7-0.3-0.7-0.7v-2.8c0-0.3,0.2-0.6,0.4-0.8l3.4-2.1l1.8,1.1c0.5,0.3,0.8,0.5,1.1,0.8 C24.3,20.9,24.2,21.4,23.8,21.6z'/%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 5,\n id: 'token.stlb.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Burrow Token',\n symbol: 'BRRR',\n icon:\n 'data:image/png;base64,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',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'token.burrow.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'FUSOTAO',\n symbol: 'TAO',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTU1LjQxIDI5LjYzNS03LjI5NiA2LjE0N2ExLjY1OSAxLjY1OSAwIDAgMS0uNjc1IDIuMzlsMS44NDggOS41NDZjLjgwNS0uMjA4IDEuNTM2LS43MDIgMi4wODktMS41MzlhMTIuODE2IDEyLjgxNiAwIDAgMCAxLjk4Mi01LjI4OWMuMTctMS4yNTEuNTY0LTIuNDczIDEuMTU2LTMuNTg2YTEyLjgzMyAxMi44MzMgMCAwIDAgMS40ODItNS40NjljLjAzNS0uODYzLS4xODYtMS42LS41ODctMi4yeiIgZmlsbD0idXJsKCNhKSIvPjxwYXRoIGQ9Ik00NS4zNDIgMzUuOTA2YTEuNjM3IDEuNjM3IDAgMCAxIDIuMTgzLS42M2w3LjM3OC02LjE5M2MtMS4yODMtMS4xOTMtMy40NTktMS41NDctNS40NDUtLjkwM2wtMTIuNzQyIDQuMTM1Yy0uMzEuMS0uNTUzLjI5Ny0uNzE2LjU0Mmw5LjM0MiAzLjA0OXoiIGZpbGw9InVybCgjYikiLz48cGF0aCBkPSJNNDMuODkyIDQ1LjM3YzEuMTQ5IDEuNTkyIDIuOTQ3IDIuNTcyIDQuNTk5IDIuNTI0bC0xLjg0NC05LjQ4N2ExLjY0NCAxLjY0NCAwIDAgMS0xLjUzOC0xLjY4bC05LjM2NC0zLjA1NWMuMDA0LjI2OC4wODcuNTQuMjYuNzhsNy44ODcgMTAuOTE5eiIgZmlsbD0idXJsKCNjKSIvPjxwYXRoIGQ9Im00MS40MSA1My4yMjMtOC4wNTYtNS4wOTJhMS42MzEgMS42MzEgMCAwIDEtMi40NjQuMDkxbC04LjQzOCA0LjcyMWMuNDQ0LjcwOCAxLjEzNiAxLjI1NiAyLjA5NyAxLjUyNyAxLjc5NC41MDYgMy43NC42MDMgNS42MDUuMjY1YTEwLjUzNiAxMC41MzYgMCAwIDEgMy43NDIgMGMxLjg3LjMzOSAzLjgyMS4yNCA1LjYxOS0uMjcuODI2LS4yMzMgMS40NTMtLjY3MyAxLjg5NS0xLjI0MnoiIGZpbGw9InVybCgjZCkiLz48cGF0aCBkPSJNMzIuMzg5IDQ1LjQzOGExLjY0NiAxLjY0NiAwIDAgMSAxLjI3IDEuODlsOC4xNDUgNS4xMzRjLjczNC0xLjU5NC4zOTctMy43ODItLjgyNy01LjQ4TDMzLjEyMyAzNi4wOWExLjM1NCAxLjM1NCAwIDAgMC0uNzM0LS41MTZ2OS44NjR6IiBmaWxsPSJ1cmwoI2UpIi8+PHBhdGggZD0iTTIyLjk3IDQ3LjAxN2MtMS4xNTEgMS41ODgtMS41MjQgMy42MDgtLjk2OSA1LjE3bDguNDItNC42OTJhMS42NDggMS42NDggMCAwIDEgMS4xMTctMS45ODd2LTkuODg0Yy0uMjUzLjA4Ny0uNDg1LjI1LS42NTkuNDlsLTcuOTA4IDEwLjkwM3oiIGZpbGw9InVybCgjZikiLz48cGF0aCBkPSJtMTUuODg2IDM1Ljc4Mi03LjI5NS02LjE0N2MtLjQwMS42LS42MjIgMS4zMzctLjU4NyAyLjJhMTIuODMgMTIuODMgMCAwIDAgMS40ODIgNS40NjkgMTAuNzUxIDEwLjc1MSAwIDAgMSAxLjE1NiAzLjU4NmMuMjU4IDEuODkyLjk1IDMuNzI3IDEuOTgyIDUuMjkuNTUzLjgzNiAxLjI4NCAxLjMzIDIuMDg5IDEuNTM4bDEuODQ4LTkuNTQ2YTEuNjU5IDEuNjU5IDAgMCAxLS42NzUtMi4zOXoiIGZpbGw9InVybCgjZykiLz48cGF0aCBkPSJNMTUuNTY4IDQ3Ljg1NmMxLjY0OS4wNDggMy40NDUtLjkzMiA0LjU5Mi0yLjUyMWw3Ljg3NS0xMC45MDhhMS4zNiAxLjM2IDAgMCAwIC4yNi0uNzhsLTkuMzUgMy4wNTJhMS42NDcgMS42NDcgMCAwIDEtMS41MzYgMS42NzlsLTEuODQgOS40Nzh6IiBmaWxsPSJ1cmwoI2gpIi8+PHBhdGggZD0iTTE2Ljc0NSAzNS4xOTNhMS42NCAxLjY0IDAgMCAxIDEuOTI3Ljc0bDkuMzU2LTMuMDUyYTEuMzU3IDEuMzU3IDAgMCAwLS43MTctLjU0M2wtMTIuNzYxLTQuMTRjLTEuOTktLjY0NC00LjE2OC0uMjktNS40NTMuOTA1bDcuMzkgNi4yYy4wOC0uMDQ0LjE2Ny0uMDguMjU4LS4xMXoiIGZpbGw9InVybCgjaSkiLz48cGF0aCBkPSJtNDAuNTcxIDE4LjA5LTMuNTQ2LTguODkyYy42ODktLjE5OCAxLjQ1My0uMTgyIDIuMjU4LjExOGExMi42NSAxMi42NSAwIDAgMSA0LjcwMyAzLjExIDEwLjYxNCAxMC42MTQgMCAwIDAgMy4wMjcgMi4yMTYgMTIuNjc2IDEyLjY3NiAwIDAgMSA0LjM4IDMuNTM1Yy42MTkuNzg4Ljg2IDEuNjQxLjgwNiAyLjQ3N2wtOS41OC0xLjE3OWExLjY0OSAxLjY0OSAwIDAgMC0uNjYyLTEuMTI2IDEuNjI2IDEuNjI2IDAgMCAwLTEuMzg2LS4yNnoiIGZpbGw9InVybCgjaikiLz48cGF0aCBkPSJNMzkuNzY0IDE4Ljc5Yy0uNDYzLjY0LS40IDEuNS4xMDQgMi4wNjZsLTUuNzczIDcuOThhMS4zNjMgMS4zNjMgMCAwIDEtLjI5Mi0uODVsLjAyMS0xMy40NDljLjAwNC0yLjA5NiAxLjAxMi00LjA2NCAyLjUzOC00LjkybDMuNTg1IDguOTZhMS42NiAxLjY2IDAgMCAwLS4xODMuMjEzeiIgZmlsbD0idXJsKCNrKSIvPjxwYXRoIGQ9Ik01Mi4xNiAyMS41NDhjLS40NjUgMS41OTEtMS45NSAzLjAwNi0zLjgxMiAzLjYxbC0xMi43ODIgNC4xNTVhMS4zNTIgMS4zNTIgMCAwIDEtLjgyLjAwOGw1Ljc4OC03Ljk5NmExLjY0IDEuNjQgMCAwIDAgMi4wNjctLjk0OWw5LjU1OSAxLjE3MnoiIGZpbGw9InVybCgjbCkiLz48cGF0aCBkPSJtMjcuNDYgOS4xOTgtMy41NDcgOC44OTJhMS42MjYgMS42MjYgMCAwIDAtMS4zODYuMjYgMS42NSAxLjY1IDAgMCAwLS42NjIgMS4xMjVsLTkuNTggMS4xNzljLS4wNTMtLjgzNi4xODctMS42OS44MDYtMi40NzdhMTIuNjc3IDEyLjY3NyAwIDAgMSA0LjM4LTMuNTM0IDEwLjYxNiAxMC42MTYgMCAwIDAgMy4wMjctMi4yMTcgMTIuNjUgMTIuNjUgMCAwIDEgNC43MDMtMy4xMWMuODA1LS4zIDEuNTY5LS4zMTYgMi4yNTgtLjExOHoiIGZpbGw9InVybCgjbSkiLz48cGF0aCBkPSJNMTYuMTk1IDI1LjE0M2MtMS44Ni0uNjA1LTMuMzQyLTIuMDE3LTMuODA2LTMuNjA3bDkuNTQ0LTEuMTdhMS42MzYgMS42MzYgMCAwIDAgMi4wNjQuOTQ4bDUuNzggNy45ODdhMS4zNDkgMS4zNDkgMCAwIDEtLjgxOS0uMDA4bC0xMi43NjMtNC4xNXoiIGZpbGw9InVybCgjbikiLz48cGF0aCBkPSJNMjQuNjM5IDIwLjg2N2ExLjY1NCAxLjY1NCAwIDAgMC0uMDc5LTIuMjgxbDMuNTktOC45N2MxLjUzLjg1NyAyLjUzOSAyLjgyOCAyLjU0MiA0LjkyNmwuMDIxIDEzLjQ2MmMuMDAxLjMyNy0uMTEuNjItLjI5Mi44NTJsLTUuNzgyLTcuOTg5eiIgZmlsbD0idXJsKCNvKSIvPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iaCIgeDE9IjgiIHkxPSI0My40NjciIHgyPSIxNi4zOTkiIHkyPSIzNy45MzgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjOUEwQTBFIi8+PHN0b3Agb2Zmc2V0PSIuODY5IiBzdG9wLWNvbG9yPSIjREExODFGIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI0NS45MjYiIHkxPSIzNi4wNTMiIHgyPSI1MS4wNjgiIHkyPSI0My41NjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9Ii40NjQiIHN0b3AtY29sb3I9IiNFQTMwMkEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNDNTE1MUIiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjQ1LjkyNiIgeTE9IjM2LjA1MyIgeDI9IjUxLjA2OCIgeTI9IjQzLjU2MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iLjQ2NCIgc3RvcC1jb2xvcj0iI0VBMzAyQSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0M1MTUxQiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMzEuOTAxIiB5MT0iNTQuOTMzIiB4Mj0iMzEuOTAxIiB5Mj0iNDcuNDIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzlFMEIwRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0RBMTgxRiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMzEuOTAxIiB5MT0iNTQuOTMzIiB4Mj0iMzEuOTAxIiB5Mj0iNDcuNDIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzlFMEIwRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0RBMTgxRiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMzEuOTAxIiB5MT0iNTQuOTMzIiB4Mj0iMzEuOTAxIiB5Mj0iNDcuNDIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzlFMEIwRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0RBMTgxRiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJnIiB4MT0iOCIgeTE9IjQzLjQ2NyIgeDI9IjE2LjM5OSIgeTI9IjM3LjkzOCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM5QTBBMEUiLz48c3RvcCBvZmZzZXQ9Ii44NjkiIHN0b3AtY29sb3I9IiNEQTE4MUYiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQ1LjkyNiIgeTE9IjM2LjA1MyIgeDI9IjUxLjA2OCIgeTI9IjQzLjU2MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iLjQ2NCIgc3RvcC1jb2xvcj0iI0VBMzAyQSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0M1MTUxQiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iOCIgeTE9IjQzLjQ2NyIgeDI9IjE2LjM5OSIgeTI9IjM3LjkzOCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM5QTBBMEUiLz48c3RvcCBvZmZzZXQ9Ii44NjkiIHN0b3AtY29sb3I9IiNEQTE4MUYiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9IjQyLjk2MyIgeTE9IjEyLjIzIiB4Mj0iMzMuODY1IiB5Mj0iMjcuMDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjRjlCMTk4Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRUUxQzI1Ii8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImsiIHgxPSI0Mi45NjMiIHkxPSIxMi4yMyIgeDI9IjMzLjg2NSIgeTI9IjI3LjA1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI0Y5QjE5OCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0VFMUMyNSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJsIiB4MT0iNDIuOTYzIiB5MT0iMTIuMjMiIHgyPSIzMy44NjUiIHkyPSIyNy4wNSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNGOUIxOTgiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFRTFDMjUiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0ibSIgeDE9IjE4Ljc2NSIgeTE9IjEzLjQxNiIgeDI9IjI5LjU0NSIgeTI9IjMyLjU4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNFRTI3MjkiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFRTFDMjUiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0ibiIgeDE9IjE4Ljc2NSIgeTE9IjEzLjQxNiIgeDI9IjI5LjU0NSIgeTI9IjMyLjU4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNFRTI3MjkiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFRTFDMjUiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0ibyIgeDE9IjE4Ljc2NSIgeTE9IjEzLjQxNiIgeDI9IjI5LjU0NSIgeTI9IjMyLjU4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNFRTI3MjkiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFRTFDMjUiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48L3N2Zz4=',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'fusotao-token.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'NearX',\n symbol: 'NearX',\n icon:\n \"data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M24 12C24 18.6274 18.6274 24 12 24C5.37258 24 0 18.6274 0 12C0 5.37258 5.37258 0 12 0C18.6274 0 24 5.37258 24 12ZM17.1421 21.3847L21.3848 17.1421L19.3669 15.1243C18.5576 17.0302 17.0303 18.5576 15.1243 19.3669L17.1421 21.3847ZM9.4329 19.5792C7.45318 18.9089 5.82112 17.4847 4.87847 15.6484L3.24263 17.2842L7.48527 21.5269L9.4329 19.5792ZM4.63307 8.87568C5.4424 6.96973 6.96977 5.44237 8.87573 4.63305L7.24263 2.99995L2.99999 7.24259L4.63307 8.87568ZM15.6484 4.87847L17.3848 3.14209L21.6274 7.38473L19.5792 9.4329C18.9089 7.45318 17.4847 5.82112 15.6484 4.87847Z' fill='%232FA8AF'/%3E%3Cpath d='M8.00119 11.9921C8.00119 11.0268 8.00119 10.0615 8.00119 9.09612C8.00119 8.50505 8.16497 8.1743 8.56285 8.05781C8.97778 7.93628 9.40619 7.97917 9.79565 8.45228C11.3533 10.3447 12.9343 12.218 14.5092 14.0959C14.5692 14.1676 14.6117 14.3122 14.734 14.2626C14.8496 14.2157 14.7858 14.0805 14.786 13.9878C14.7904 12.6326 14.7898 11.2774 14.7868 9.92226C14.7868 9.83668 14.838 9.7162 14.7271 9.67372C14.6401 9.64029 14.5824 9.74185 14.522 9.79358C14.0492 10.1981 13.5804 10.6073 13.1088 11.0133C13.0208 11.089 12.9332 11.2118 12.8002 11.1012C12.6657 10.9894 12.7696 10.8872 12.8364 10.7881C13.3547 10.0186 13.8728 9.24898 14.3909 8.47919C14.6656 8.07085 15.0079 7.92282 15.4056 8.04141C15.786 8.15475 15.9986 8.48592 15.9992 8.97668C16.0007 10.0905 15.9996 11.2045 15.9996 12.3183C15.9996 13.2094 16.0003 14.1005 15.9994 14.9916C15.999 15.4826 15.8137 15.798 15.4512 15.9324C15.0256 16.0901 14.5767 15.9683 14.2734 15.6058C12.6823 13.705 11.0924 11.8029 9.50198 9.90144C9.46029 9.85161 9.42303 9.7961 9.37377 9.75489C9.28998 9.68487 9.21967 9.68108 9.21314 9.81797C9.20999 9.88273 9.21188 9.94791 9.21188 10.0129C9.21188 11.3496 9.21062 12.6862 9.2142 14.0227C9.21441 14.1186 9.15609 14.2557 9.26114 14.3038C9.38093 14.3587 9.45061 14.2178 9.52998 14.1503C9.98259 13.7651 10.4291 13.3728 10.8805 12.9859C10.9729 12.9066 11.0626 12.7651 11.208 12.8973C11.3402 13.0176 11.2213 13.1196 11.159 13.2127C10.6323 13.9989 10.1032 14.7837 9.57145 15.5663C9.32788 15.9248 8.9881 16.056 8.61085 15.9488C8.23739 15.8428 8.00498 15.5246 8.00287 15.0827C7.99761 14.0523 8.00119 13.022 8.00119 11.9917V11.9921Z' fill='white'/%3E%3C/svg%3E%0A\",\n reference: 'https://near.staderlabs.com',\n reference_hash: null,\n decimals: 24,\n id: 'v2-nearx.stader-labs.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'DISCOVOL TOKEN',\n symbol: 'DISC',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSLlm77lsYJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgMTQxLjcgMTQxLjciIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDE0MS43IDE0MS43IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOiNmOTcxMTZ9PC9zdHlsZT48cGF0aCBjbGFzcz0ic3QwIiBkPSJNNDYuMSAxOC43djEwNS42czIxLjMtNS41IDMzLjEtMjljMCAwIDEyLjctMjIuMi0uOS00OS43IDAgMC0xMC4xLTIwLjktMzIuMi0yNi45eiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMDUuNyA5LjRjMzEuMSAxOC4zIDM0LjUgNDguNCAzNC41IDQ4LjQgNi40IDM3LjktMTcgNjAuMy0xNyA2MC4zLTMxLjQgMzQuNS03My40IDIwLjMtNzMuNCAyMC4zIDMwLjYtOS4zIDQxLjktMzUuMSA0MS45LTM1LjEgMTYuNi0zNS41IDAtNjMuMiAwLTYzLjJDNzcgOS43IDQ3LjMgMy45IDQ3LjMgMy45YzMyLjQtMTEuMyA1OC40IDUuNSA1OC40IDUuNXptNyAxMS41UzExMS4xIDM4IDk0LjcgMzhjMCAwIDE2IDIuOCAxNy41IDE4LjggMCAwIDEuNC0xNy41IDE4LjItMTguMy0uMSAwLTE4LjUtMS41LTE3LjctMTcuNnpNMjUuNiAxNS45aDUuOXYxMTAuOEgyN1M4IDExMiAyLjIgODkuMmMwIDAtNy43LTI2LjIgNS01MC40LjEuMSA5LjUtMTcgMTguNC0yMi45eiIvPjwvc3ZnPg==',\n reference: null,\n reference_hash: null,\n decimals: 14,\n id: 'discovol-token.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Stader',\n symbol: 'SD',\n icon:\n \"data:image/svg+xml,%3Csvg width='256' height='256' viewBox='0 0 256 256' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M128 256C198.692 256 256 198.692 256 128C256 57.3075 198.692 0 128 0C57.3075 0 0 57.3075 0 128C0 198.692 57.3075 256 128 256Z' fill='%236259D4'/%3E%3Cpath d='M126.852 191.869L126.822 181.088L153.98 165.105L153.886 133.025L163.667 127.882L164.056 170.723L126.852 191.869Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M153.98 165.105L126.822 181.088L126.852 191.869L164.056 170.723L163.667 127.882L153.886 133.025L153.98 165.105ZM154.207 133.218L154.3 165.104C154.301 165.218 154.241 165.323 154.143 165.381L127.143 181.271L127.171 191.32L163.735 170.538L163.352 128.41L154.207 133.218Z' fill='%236259D4'/%3E%3Cpath d='M134.785 112.611L145.906 106.314L173.184 123.396L173.334 175.037L164.063 170.734L163.673 127.894L134.785 112.611Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M163.673 127.894L164.063 170.734L173.334 175.037L173.184 123.396L145.906 106.314L134.785 112.611L163.673 127.894ZM135.451 112.601L163.823 127.611C163.927 127.666 163.992 127.773 163.993 127.891L164.381 170.529L173.013 174.535L172.865 123.574L145.898 106.687L135.451 112.601Z' fill='%236259D4'/%3E%3Cpath d='M126.443 53.3335L173.06 79.8728L173.094 90.9255L126.49 64.9081L126.443 53.3335Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M126.443 53.3335L126.49 64.9081L173.094 90.9255L173.06 79.8728L126.443 53.3335ZM126.766 53.8852L126.81 64.7198L172.773 90.3795L172.741 80.0592L126.766 53.8852Z' fill='%236259D4'/%3E%3Cpath d='M80.1584 134.322L80 80.4074L126.432 53.3335L126.48 64.9081L88.7187 86.0335L88.5731 128.106L80.1584 134.322Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M88.7187 86.0335L126.48 64.9081L126.432 53.3335L80 80.4074L80.1584 134.322L88.5731 128.106L88.7187 86.0335ZM88.2536 127.944L88.3987 86.0324C88.3991 85.9169 88.4617 85.8106 88.5624 85.7542L126.159 64.7209L126.115 53.8892L80.3205 80.5909L80.4766 133.689L88.2536 127.944Z' fill='%236259D4'/%3E%3Cpath d='M107.511 149.374L80.1562 134.324L88.5709 128.108L135.44 154.885L107.58 170.601L98.2445 175.794L126.85 191.879L164.054 170.733L173.325 175.035L126.619 202.66L80.2804 176.371L117.215 154.711L107.511 149.374Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M107.58 170.601L135.44 154.885L88.5709 128.108L80.1562 134.324L117.215 154.711L80.2804 176.371L126.619 202.66L173.325 175.035L164.054 170.733L126.85 191.879L98.2445 175.794L107.58 170.601ZM164.069 171.092L127.008 192.157C126.91 192.213 126.791 192.213 126.693 192.158L98.0877 176.073C97.9866 176.016 97.9242 175.909 97.9245 175.794C97.9248 175.678 97.9877 175.571 98.0889 175.515L107.423 170.322L134.792 154.884L88.5932 128.49L80.7483 134.285L107.666 149.093L117.369 154.431C117.47 154.486 117.533 154.592 117.535 154.707C117.536 154.822 117.476 154.929 117.377 154.987L80.9208 176.367L126.615 202.29L172.639 175.069L164.069 171.092Z' fill='%236259D4'/%3E%3Cpath d='M88.7207 86.0458L126.482 64.9204L173.085 90.9378L145.902 106.323L134.781 112.619L163.669 127.902L153.888 133.044L116.808 112.11L153.764 90.4499L144.947 85.4178L126.512 74.8955L99.0623 90.6069L88.7207 86.0458Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M173.085 90.9378L126.482 64.9204L88.7207 86.0458L99.0623 90.6069L126.512 74.8955L153.764 90.4499L116.808 112.11L153.888 133.044L163.669 127.902L134.781 112.619L173.085 90.9378ZM162.983 127.901L134.631 112.902C134.528 112.847 134.462 112.741 134.461 112.624C134.459 112.507 134.521 112.398 134.623 112.341L145.744 106.044L172.432 90.9397L126.482 65.287L89.4368 86.0119L99.0436 90.2489L126.353 74.6177C126.451 74.5614 126.572 74.5614 126.67 74.6175L153.923 90.172C154.022 90.2286 154.083 90.3338 154.084 90.4481C154.085 90.5623 154.024 90.6682 153.926 90.726L117.45 112.105L153.894 132.68L162.983 127.901Z' fill='%236259D4'/%3E%3Cpath d='M98.252 175.789L107.587 170.596L126.827 181.093L126.857 191.874L98.252 175.789Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M98.252 175.789L126.857 191.874L126.827 181.093L107.587 170.596L98.252 175.789ZM98.9075 175.791L126.536 191.326L126.508 181.283L107.589 170.962L98.9075 175.791Z' fill='%236259D4'/%3E%3Cpath d='M80.2804 176.368L80.2461 164.785L107.511 149.371L117.215 154.708L80.2804 176.368Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M80.2804 176.368L117.215 154.708L107.511 149.371L80.2461 164.785L80.2804 176.368ZM80.5987 175.81L116.567 154.717L107.513 149.737L80.5666 164.971L80.5987 175.81Z' fill='%236259D4'/%3E%3Cpath d='M116.809 112.109L116.92 101.073L144.947 85.417L153.764 90.4491L116.809 112.109Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M116.809 112.109L153.764 90.4491L144.947 85.417L116.92 101.073L116.809 112.109ZM117.134 111.547L153.125 90.4528L144.946 85.7845L117.238 101.262L117.134 111.547Z' fill='%236259D4'/%3E%3Cpath d='M88.5723 128.087L88.7179 86.0142L99.0595 90.5753L99.1537 123.589L135.407 143.582L135.442 154.864L88.5723 128.087Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M99.1537 123.589L99.0595 90.5753L88.7179 86.0142L88.5723 128.087L135.442 154.864L135.407 143.582L99.1537 123.589ZM135.088 143.771L98.9992 123.869C98.8974 123.813 98.8341 123.706 98.8337 123.59L98.7401 90.7841L89.0362 86.5043L88.8929 127.901L135.12 154.311L135.088 143.771Z' fill='%236259D4'/%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '30d20208d987713f46dfd34ef128bb16c404d10f.factory.bridge.near',\n },\n {\n spec: 'ft-1.0',\n name: 'SWEAT',\n symbol: 'SWEAT',\n icon:\n \"data:image/svg+xml,%3Csvg viewBox='0 0 100 100' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100' height='100' rx='50' fill='%23FF0D75'/%3E%3Cg clip-path='url(%23clip0_283_2788)'%3E%3Cpath d='M39.4653 77.5455L19.0089 40.02L35.5411 22.2805L55.9975 59.806L39.4653 77.5455Z' stroke='white' stroke-width='10'/%3E%3Cpath d='M66.0253 77.8531L45.569 40.3276L62.1012 22.5882L82.5576 60.1136L66.0253 77.8531Z' stroke='white' stroke-width='10'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_283_2788'%3E%3Crect width='100' height='56' fill='white' transform='translate(0 22)'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'token.sweat',\n },\n {\n spec: 'ft-1.0.0',\n name: 'APYSwap',\n symbol: 'APYS',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iLTEwIC0xMCAxMjAgMTIwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMTQ2OF81MTk1KSI+CjxwYXRoIGQ9Ik0zOC40MzUzIDEyLjY4NUw3NC41ODY5IDc3Ljg2NzdMOTguOTk5OSA3OC41NjYzTDYyLjY3NDkgMTMuMzc4N0wzOC40MzUzIDEyLjY4NVoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl8xNDY4XzUxOTUpIi8+CjxwYXRoIGQ9Ik0xMi43NjcyIDU1LjQwNzFMODYuOTM2NiA1Ni42MzI2TDk4Ljk5ODIgNzcuODM0OEwwLjAxMTcwNDYgNzYuMTk5MkwxMi43NjcyIDU1LjQwNzFaIiBmaWxsPSJ1cmwoI3BhaW50MV9saW5lYXJfMTQ2OF81MTk1KSIvPgo8cGF0aCBkPSJNNjIuMjQxMSAxMy4wOTRMMjMuODY5OCA3Ny4wODU2TC0wLjUxMDgwNSA3Ni45MTIyTDM3Ljg2NzMgMTIuOTIwN0w2Mi4yNDExIDEzLjA5NFoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8xNDY4XzUxOTUpIi8+CjwvZz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8xNDY4XzUxOTUiIHgxPSI1NS45Njc3IiB5MT0iMjMuODc4MSIgeDI9Ijg1LjQ4MjUiIHkyPSI3Ny4wMTI2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMwOEFFRUEiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMkFGNTk4Ii8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQxX2xpbmVhcl8xNDY4XzUxOTUiIHgxPSIyOS40ODcxIiB5MT0iNjcuODQzIiB4Mj0iNjguOTYzNiIgeTI9IjY4LjgwMzIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzA4QUVFQSIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyQUY1OTgiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyXzE0NjhfNTE5NSIgeDE9IjUxLjk4MzUiIHkxPSIzLjEzMzQ1IiB4Mj0iMzEuMjQxOCIgeTI9IjM2LjE3MzUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzA4QUVFQSIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyQUY1OTgiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xNDY4XzUxOTUiPgo8cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4=',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'apys.token.a11bd.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Tether USD',\n symbol: 'USDt',\n icon:\n \"data:image/svg+xml,%3Csvg width='111' height='90' viewBox='0 0 111 90' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M24.4825 0.862305H88.0496C89.5663 0.862305 90.9675 1.64827 91.7239 2.92338L110.244 34.1419C111.204 35.7609 110.919 37.8043 109.549 39.1171L58.5729 87.9703C56.9216 89.5528 54.2652 89.5528 52.6139 87.9703L1.70699 39.1831C0.305262 37.8398 0.0427812 35.7367 1.07354 34.1077L20.8696 2.82322C21.6406 1.60483 23.0087 0.862305 24.4825 0.862305ZM79.8419 14.8003V23.5597H61.7343V29.6329C74.4518 30.2819 83.9934 32.9475 84.0642 36.1425L84.0638 42.803C83.993 45.998 74.4518 48.6635 61.7343 49.3125V64.2168H49.7105V49.3125C36.9929 48.6635 27.4513 45.998 27.3805 42.803L27.381 36.1425C27.4517 32.9475 36.9929 30.2819 49.7105 29.6329V23.5597H31.6028V14.8003H79.8419ZM55.7224 44.7367C69.2943 44.7367 80.6382 42.4827 83.4143 39.4727C81.0601 36.9202 72.5448 34.9114 61.7343 34.3597V40.7183C59.7966 40.8172 57.7852 40.8693 55.7224 40.8693C53.6595 40.8693 51.6481 40.8172 49.7105 40.7183V34.3597C38.8999 34.9114 30.3846 36.9202 28.0304 39.4727C30.8066 42.4827 42.1504 44.7367 55.7224 44.7367Z' fill='%23009393'/%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 6,\n id: 'usdt.tether-token.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'NEAT',\n symbol: 'NEAT',\n icon:\n \"data:image/svg+xml,%3Csvg width='40' height='40' viewBox='0 0 40 40' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='40' height='40' rx='4.8' fill='%23202020'/%3E%3Crect width='40' height='40' rx='4.8' fill='url(%23paint0_linear_1_5571)'/%3E%3Crect x='10.4' y='12.6001' width='4.8' height='4.8' fill='white'/%3E%3Crect x='15.2' y='12.6001' width='4.8' height='4.8' fill='white'/%3E%3Crect x='24.8' y='12.6001' width='4.8' height='4.8' fill='white'/%3E%3Crect x='10.4' y='17.4001' width='4.8' height='4.8' fill='white'/%3E%3Crect x='24.8' y='17.4001' width='4.8' height='4.8' fill='white'/%3E%3Crect x='10.4' y='22.2002' width='4.8' height='4.8' fill='white'/%3E%3Crect x='24.8' y='22.2002' width='4.8' height='4.8' fill='white'/%3E%3Crect x='20' y='22.2002' width='4.8' height='4.8' fill='white'/%3E%3Crect x='17.6' y='17.4001' width='4.8' height='4.8' fill='white'/%3E%3Cdefs%3E%3ClinearGradient id='paint0_linear_1_5571' x1='20' y1='0' x2='20' y2='40' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%23262626'/%3E%3Cstop offset='1' stop-color='%23121212'/%3E%3C/linearGradient%3E%3C/defs%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 8,\n id: 'neat.nrc-20.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'USMeme',\n symbol: 'USM',\n icon:\n 'https://storage.herewallet.app/upload/13151331-8f9c-4851-8038-36794688c693.jpg',\n reference: null,\n reference_hash: null,\n decimals: 8,\n id: 'usmeme.tg',\n },\n];\n\nexport function getDefaultTokenList() {\n const env = getConfig().networkId;\n\n switch (env) {\n case 'mainnet':\n return DefaultMainnetTokenList;\n case 'testnet':\n return DefaultTestnetTokenList;\n default:\n return DefaultMainnetTokenList;\n }\n}\n","import { TokenMetadata, Transaction } from '../types';\n\nimport {\n priceToPoint,\n toNonDivisibleNumber,\n toPrecision,\n registerAccountOnToken,\n} from '../utils';\nimport { ONE_YOCTO_NEAR, WRAP_NEAR_CONTRACT_ID, config } from '../constant';\nimport { DCLSwapGetStorageBalance } from '../ref';\nimport { DCL_POOL_FEE_LIST, getDCLPoolId } from './dcl-pool';\nimport {\n nearDepositTransaction,\n ftGetStorageBalance,\n refDCLSwapViewFunction,\n} from '../ref';\nimport _ from 'lodash';\nimport { toReadableNumber, percentLess } from '../utils';\nimport { NoPoolOnThisPair, SlippageError } from '../error';\n\ninterface SwapInfo {\n tokenA: TokenMetadata;\n tokenB: TokenMetadata;\n amountA: string;\n}\n\ninterface DCLSwapProps {\n swapInfo: SwapInfo;\n Swap?: {\n pool_ids: string[];\n min_output_amount: string;\n };\n SwapByOutput?: {\n pool_ids: string[];\n output_amount: string;\n };\n LimitOrderWithSwap?: {\n pool_id: string;\n output_amount: string;\n };\n SwapByStopPoint?: {\n pool_id: string;\n stop_point: number;\n skip_unwrap_near: boolean;\n };\n AccountId: string;\n}\nexport const DCL_POOL_SPLITER = '|';\n\nexport const DCLSwap = async ({\n Swap,\n SwapByOutput,\n LimitOrderWithSwap,\n SwapByStopPoint,\n AccountId,\n swapInfo,\n}: DCLSwapProps) => {\n const transactions: Transaction[] = [];\n\n const { tokenA, tokenB, amountA } = swapInfo;\n\n if (Swap) {\n const pool_ids = Swap.pool_ids;\n\n const tokenRegistered = await ftGetStorageBalance(\n tokenB.id,\n AccountId\n ).catch(() => {\n throw new Error(`${tokenB.id} doesn't exist.`);\n });\n\n if (tokenRegistered === null) {\n transactions.push({\n receiverId: tokenB.id,\n functionCalls: [registerAccountOnToken(AccountId)],\n });\n }\n\n const output_token = tokenB.id;\n const min_output_amount = toPrecision(Swap.min_output_amount, 0);\n\n const msg = JSON.stringify({\n Swap: {\n pool_ids,\n output_token,\n min_output_amount,\n client_id: '',\n },\n });\n\n transactions.push({\n receiverId: tokenA.id,\n functionCalls: [\n {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: config.REF_DCL_SWAP_CONTRACT_ID,\n amount: toNonDivisibleNumber(tokenA.decimals, amountA),\n msg,\n },\n gas: '180000000000000',\n amount: ONE_YOCTO_NEAR,\n },\n ],\n });\n } else if (SwapByOutput) {\n const pool_ids = SwapByOutput.pool_ids;\n const output_token = tokenB.id;\n const output_amount = toNonDivisibleNumber(\n tokenB.decimals,\n SwapByOutput.output_amount\n );\n const msg = JSON.stringify({\n SwapByOutput: {\n pool_ids,\n output_token,\n output_amount,\n client_id: '',\n },\n });\n const tokenRegistered = await ftGetStorageBalance(\n tokenB.id,\n AccountId\n ).catch(() => {\n throw new Error(`${tokenB.id} doesn't exist.`);\n });\n\n if (tokenRegistered === null) {\n transactions.push({\n receiverId: tokenB.id,\n functionCalls: [registerAccountOnToken(AccountId)],\n });\n }\n\n transactions.push({\n receiverId: tokenA.id,\n functionCalls: [\n {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: config.REF_DCL_SWAP_CONTRACT_ID,\n amount: toNonDivisibleNumber(tokenA.decimals, amountA),\n msg,\n },\n gas: '180000000000000',\n amount: ONE_YOCTO_NEAR,\n },\n ],\n });\n } else if (LimitOrderWithSwap) {\n const pool_id = LimitOrderWithSwap.pool_id;\n\n const fee = Number(pool_id.split(DCL_POOL_SPLITER)[2]);\n\n const buy_token = tokenB.id;\n const point = priceToPoint({\n amountA,\n amountB: LimitOrderWithSwap.output_amount,\n tokenA,\n tokenB,\n fee,\n });\n\n const tokenRegistered = await ftGetStorageBalance(\n tokenB.id,\n AccountId\n ).catch(() => {\n throw new Error(`${tokenB.id} doesn't exist.`);\n });\n\n if (tokenRegistered === null) {\n transactions.push({\n receiverId: tokenB.id,\n functionCalls: [registerAccountOnToken(AccountId)],\n });\n }\n\n const DCLRegistered = await DCLSwapGetStorageBalance(\n tokenB.id,\n AccountId\n ).catch(() => {\n throw new Error(`${tokenB.id} doesn't exist.`);\n });\n\n if (DCLRegistered === null) {\n transactions.push({\n receiverId: config.REF_DCL_SWAP_CONTRACT_ID,\n functionCalls: [\n {\n methodName: 'storage_deposit',\n args: {\n registration_only: true,\n account_id: AccountId,\n },\n gas: '30000000000000',\n amount: '0.5',\n },\n ],\n });\n }\n\n const new_point =\n pool_id.split(DCL_POOL_SPLITER)[0] === tokenA.id ? point : -point;\n\n const msg = JSON.stringify({\n LimitOrderWithSwap: {\n pool_id,\n buy_token,\n point: new_point,\n client_id: '',\n },\n });\n\n transactions.push({\n receiverId: tokenA.id,\n functionCalls: [\n {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: config.REF_DCL_SWAP_CONTRACT_ID,\n amount: toNonDivisibleNumber(tokenA.decimals, amountA),\n msg,\n },\n gas: '180000000000000',\n amount: ONE_YOCTO_NEAR,\n },\n ],\n });\n } else if (SwapByStopPoint) {\n const tokenRegistered = await ftGetStorageBalance(\n tokenB.id,\n AccountId\n ).catch(() => {\n throw new Error(`${tokenB.id} doesn't exist.`);\n });\n\n if (tokenRegistered === null) {\n transactions.push({\n receiverId: tokenB.id,\n functionCalls: [registerAccountOnToken(AccountId)],\n });\n }\n const msg = JSON.stringify({\n SwapByStopPoint: SwapByStopPoint,\n });\n transactions.push({\n receiverId: tokenA.id,\n functionCalls: [\n {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: config.REF_DCL_SWAP_CONTRACT_ID,\n amount: toNonDivisibleNumber(tokenA.decimals, amountA),\n msg,\n },\n gas: '180000000000000',\n amount: ONE_YOCTO_NEAR,\n },\n ],\n });\n }\n\n if (tokenA.id === WRAP_NEAR_CONTRACT_ID) {\n const registered = await ftGetStorageBalance(\n WRAP_NEAR_CONTRACT_ID,\n AccountId\n );\n if (registered === null) {\n transactions.unshift({\n receiverId: WRAP_NEAR_CONTRACT_ID,\n functionCalls: [registerAccountOnToken(AccountId)],\n });\n }\n }\n\n return transactions;\n};\n\nexport const quote = async ({\n pool_ids,\n input_amount,\n input_token,\n output_token,\n tag,\n}: {\n pool_ids: string[];\n input_token: TokenMetadata;\n output_token: TokenMetadata;\n input_amount: string;\n tag?: string;\n}) => {\n return refDCLSwapViewFunction({\n methodName: 'quote',\n args: {\n pool_ids,\n input_token: input_token.id,\n output_token: output_token.id,\n input_amount: toNonDivisibleNumber(input_token.decimals, input_amount),\n tag,\n },\n });\n};\n\nexport const list_user_assets = async (AccountId: string) => {\n if (!AccountId) return;\n\n return refDCLSwapViewFunction({\n methodName: 'list_user_assets',\n args: {\n account_id: AccountId,\n },\n });\n};\n\nexport const DCLSwapByInputOnBestPool = async ({\n tokenA,\n tokenB,\n amountA,\n slippageTolerance,\n AccountId,\n}: {\n tokenA: TokenMetadata;\n tokenB: TokenMetadata;\n amountA: string;\n slippageTolerance: number;\n AccountId: string;\n}) => {\n if (slippageTolerance <= 0 || slippageTolerance >= 100) {\n throw SlippageError;\n }\n\n const estimates = await Promise.all(\n DCL_POOL_FEE_LIST.map(async fee => {\n const pool_id = getDCLPoolId(tokenA.id, tokenB.id, fee);\n return quote({\n pool_ids: [pool_id],\n input_token: tokenA,\n output_token: tokenB,\n input_amount: amountA,\n tag: `${tokenA.id}-${fee}-${amountA}`,\n }).catch(e => null);\n })\n );\n\n if (!estimates || estimates.every(e => e === null)) {\n throw NoPoolOnThisPair(tokenA.id, tokenB.id);\n }\n\n const bestEstimate =\n estimates && estimates?.some(e => !!e)\n ? _.maxBy(estimates, e => Number(!e || !e.tag ? -1 : e.amount))\n : null;\n\n const bestFee =\n bestEstimate &&\n bestEstimate.tag &&\n bestEstimate?.tag?.split('-')?.[1] &&\n Number(bestEstimate?.tag?.split('-')?.[1]);\n\n return DCLSwap({\n swapInfo: {\n tokenA,\n tokenB,\n amountA,\n },\n Swap: {\n pool_ids: [getDCLPoolId(tokenA.id, tokenB.id, bestFee)],\n min_output_amount: percentLess(slippageTolerance, bestEstimate.amount),\n },\n AccountId,\n });\n};\n\nexport const quote_by_output = ({\n pool_ids,\n output_amount,\n input_token,\n output_token,\n}: {\n pool_ids: string[];\n input_token: TokenMetadata;\n output_token: TokenMetadata;\n output_amount: string;\n}) => {\n return refDCLSwapViewFunction({\n methodName: 'quote_by_output',\n args: {\n pool_ids,\n input_token: input_token.id,\n output_token: output_token.id,\n output_amount: toNonDivisibleNumber(output_token.decimals, output_amount),\n },\n });\n};\n","import { TokenMetadata, Transaction } from '../types';\nimport { NoOrderFound, OrderNoRemainedAmount } from '../error';\nimport {\n priceToPoint,\n toNonDivisibleNumber,\n toPrecision,\n registerAccountOnToken,\n} from '../utils';\nimport {\n ONE_YOCTO_NEAR,\n WRAP_NEAR_CONTRACT_ID,\n config,\n POINTLEFTRANGE,\n POINTRIGHTRANGE,\n} from '../constant';\nimport {\n nearDepositTransaction,\n ftGetStorageBalance,\n refDCLSwapViewFunction,\n} from '../ref';\n\nexport interface UserOrderInfo {\n order_id: string;\n owner_id: string;\n pool_id: string;\n point: number;\n sell_token: string;\n created_at: string;\n original_amount: string;\n remain_amount: string; // 0 means history order: ;\n cancel_amount: string;\n // amount through ft_transfer_call\n\n original_deposit_amount: string;\n // earn token amount through swap before actual place order\n\n swap_earn_amount: string;\n buy_token: string;\n unclaimed_amount: string; // claim will push it to inner account\n bought_amount: string; // accumalated amount into inner account\n}\n\nexport const list_history_orders = (AccountId: string) => {\n return refDCLSwapViewFunction({\n methodName: 'list_history_orders',\n args: {\n account_id: AccountId,\n },\n });\n};\n\nexport const list_active_orders = (AccountId: string) => {\n return refDCLSwapViewFunction({\n methodName: 'list_active_orders',\n args: {\n account_id: AccountId,\n },\n });\n};\n\nexport const get_order = async (order_id: string) => {\n return refDCLSwapViewFunction({\n methodName: 'get_order',\n args: {\n order_id,\n },\n }).catch(() => {\n throw NoOrderFound(order_id);\n });\n};\n\nexport const find_order = async ({\n pool_id,\n point,\n AccountId,\n}: {\n pool_id: string;\n point: number;\n AccountId: string;\n}) => {\n return refDCLSwapViewFunction({\n methodName: 'find_order',\n args: {\n account_id: AccountId,\n pool_id,\n point,\n },\n }).catch(() => {\n throw NoOrderFound();\n }) as Promise<UserOrderInfo>;\n};\nexport const cancel_order = async (order_id: string) => {\n const order = await get_order(order_id);\n\n if (!order.remain_amount) throw OrderNoRemainedAmount;\n\n const transactions: Transaction[] = [\n {\n receiverId: config.REF_DCL_SWAP_CONTRACT_ID,\n functionCalls: [\n {\n methodName: 'cancel_order',\n args: {\n order_id,\n amount: order.remain_amount,\n },\n gas: '180000000000000',\n },\n ],\n },\n ];\n\n return transactions;\n};\n\nexport const claim_order = (order_id: string) => {\n const transactions: Transaction[] = [\n {\n receiverId: config.REF_DCL_SWAP_CONTRACT_ID,\n functionCalls: [\n {\n methodName: 'cancel_order',\n args: {\n order_id,\n amount: '0',\n },\n gas: '180000000000000',\n },\n ],\n },\n ];\n\n return transactions;\n};\n\nexport const get_pointorder_range = ({\n pool_id,\n left_point,\n right_point,\n}: {\n pool_id: string;\n left_point?: number;\n right_point?: number;\n}) => {\n return refDCLSwapViewFunction({\n methodName: 'get_pointorder_range',\n args: {\n pool_id,\n left_point: left_point || POINTLEFTRANGE,\n right_point: right_point || POINTRIGHTRANGE,\n },\n });\n};\n","import React, { useEffect, useMemo, useState } from 'react';\n\nimport { SwapWidgetProps } from './types';\nimport { TokenMetadata } from '../types';\nimport {\n useRefPools,\n useSwap,\n ThemeContextProvider,\n TokenPriceContextProvider,\n useAllTokens,\n} from './state';\nimport { ftGetBalance, ftGetTokenMetadata } from '../ref';\nimport {\n getAccountName,\n toReadableNumber,\n toPrecision,\n getPriceImpact,\n isMobile,\n} from '../utils';\nimport {\n Slider,\n SlippageSelector,\n TokenSelector,\n TokenAmount,\n DetailView,\n Notification,\n} from './components';\nimport { FiChevronDown } from '@react-icons/all-files/fi/FiChevronDown';\n\nimport { TiWarning } from '@react-icons/all-files/ti/TiWarning';\n\nimport './style.css';\nimport { useTokenPriceList, useTokenBalnces, useTokensIndexer } from './state';\n\nimport { CgArrowsExchangeAltV } from '@react-icons/all-files/cg/CgArrowsExchangeAltV';\nimport { RefIcon, AccountButton } from './components';\nimport Big from 'big.js';\nimport { ONLY_ZEROS } from '../utils';\nimport {\n defaultTheme,\n defaultDarkModeTheme,\n REF_WIDGET_SWAP_IN_KEY,\n REF_WIDGET_SWAP_OUT_KEY,\n} from './constant';\nimport {\n WRAP_NEAR_CONTRACT_ID,\n NEAR_META_DATA,\n REF_TOKEN_ID,\n REF_META_DATA,\n} from '../constant';\n\nexport const SwapWidget = (props: SwapWidgetProps) => {\n const {\n theme,\n defaultTokenList,\n onSwap,\n connection,\n width,\n height,\n enableSmartRouting,\n className,\n transactionState,\n onConnect,\n defaultTokenIn,\n defaultTokenOut,\n onDisConnect,\n darkMode,\n referralId,\n } = props;\n\n const curTheme = theme || (darkMode ? defaultDarkModeTheme : defaultTheme);\n\n const STORAGED_TOKEN_IN = localStorage.getItem(REF_WIDGET_SWAP_IN_KEY);\n\n const STORAGED_TOKEN_OUT = localStorage.getItem(REF_WIDGET_SWAP_OUT_KEY);\n\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n iconDefault,\n iconHover,\n refIcon,\n } = curTheme;\n\n const { AccountId, isSignedIn: isSignedInProp } = connection;\n\n const isSignedIn = !!AccountId && isSignedInProp;\n\n const [tokenIn, setTokenIn] = useState<TokenMetadata>();\n\n const handleSetTokenIn = (token: TokenMetadata) => {\n setTokenIn(token);\n localStorage.setItem(REF_WIDGET_SWAP_IN_KEY, token.id);\n };\n\n const handleSetTokenOut = (token: TokenMetadata) => {\n setTokenOut(token);\n localStorage.setItem(REF_WIDGET_SWAP_OUT_KEY, token.id);\n };\n\n const [tokenOut, setTokenOut] = useState<TokenMetadata>();\n const [tokenInBalance, setTokenInBalance] = useState<string>('');\n\n const [tokenOutBalance, setTokenOutBalance] = useState<string>('');\n\n const [notOpen, setNotOpen] = useState<boolean>(false);\n\n useEffect(() => {\n if (!transactionState) return;\n\n if (transactionState && transactionState.state !== null) {\n setNotOpen(true);\n }\n transactionState?.setState(transactionState?.state || null);\n }, [transactionState]);\n\n const [widgetRoute, setWidgetRoute] = useState<\n 'swap' | 'token-selector-in' | 'token-selector-out'\n >('swap');\n\n const [amountIn, setAmountIn] = useState<string>('1');\n\n const [showSlip, setShowSlip] = useState<boolean>(false);\n\n const [slippageTolerance, setSlippageTolerance] = useState<number>(0.5);\n\n const { tokens, tokenLoading } = useTokensIndexer({\n defaultTokenList,\n AccountId,\n });\n\n // cache list tokens\n useAllTokens({ reload: true });\n\n const balances = useTokenBalnces(tokens, AccountId);\n\n const [refreshTrigger, setRreshTrigger] = useState<boolean>(false);\n\n const tokenPriceList = useTokenPriceList();\n\n const { allPools, allStablePools, poolFetchingState } = useRefPools(\n refreshTrigger\n );\n\n useEffect(() => {\n const defaultIn =\n STORAGED_TOKEN_IN || defaultTokenIn || WRAP_NEAR_CONTRACT_ID;\n\n const defaultOut = STORAGED_TOKEN_OUT || defaultTokenOut || REF_TOKEN_ID;\n\n if (\n tokens.length > 0 &&\n defaultIn &&\n tokens.findIndex(t => t.id === defaultIn) !== -1\n ) {\n if (defaultIn === WRAP_NEAR_CONTRACT_ID || defaultIn === 'NEAR') {\n handleSetTokenIn({\n ...NEAR_META_DATA,\n id: WRAP_NEAR_CONTRACT_ID,\n });\n } else {\n ftGetTokenMetadata(defaultIn).then(handleSetTokenIn);\n }\n } else if (\n tokens.length > 0 &&\n defaultIn &&\n tokens.findIndex(t => t.id === defaultIn) === -1\n ) {\n handleSetTokenIn({\n ...NEAR_META_DATA,\n id: WRAP_NEAR_CONTRACT_ID,\n });\n }\n if (\n tokens.length > 0 &&\n defaultOut &&\n tokens.findIndex(t => t.id === defaultOut) !== -1\n ) {\n if (defaultOut === WRAP_NEAR_CONTRACT_ID || defaultOut === 'NEAR') {\n handleSetTokenOut({\n ...NEAR_META_DATA,\n id: WRAP_NEAR_CONTRACT_ID,\n });\n } else {\n ftGetTokenMetadata(defaultOut).then(handleSetTokenOut);\n }\n } else if (\n tokens.length > 0 &&\n defaultOut &&\n tokens.findIndex(t => t.id === defaultOut) === -1\n ) {\n handleSetTokenOut(REF_META_DATA);\n }\n }, [tokens, tokenLoading]);\n\n useEffect(() => {\n if (!tokenIn) return;\n\n const wrapedId = tokenIn.id === WRAP_NEAR_CONTRACT_ID ? 'NEAR' : tokenIn.id;\n\n if (balances[wrapedId]) {\n setTokenInBalance(balances[wrapedId]);\n return;\n }\n\n ftGetBalance(wrapedId, AccountId).then(available => {\n setTokenInBalance(toReadableNumber(tokenIn.decimals, available));\n });\n }, [tokenIn, AccountId, balances]);\n\n useEffect(() => {\n if (!tokenOut) return;\n\n const wrapedId =\n tokenOut.id === WRAP_NEAR_CONTRACT_ID ? 'NEAR' : tokenOut.id;\n\n if (balances[wrapedId]) {\n setTokenOutBalance(balances[wrapedId]);\n return;\n }\n ftGetBalance(wrapedId, AccountId).then(available => {\n setTokenOutBalance(toReadableNumber(tokenOut.decimals, available));\n });\n }, [tokenOut, AccountId, balances]);\n\n const {\n amountOut,\n minAmountOut,\n rate,\n fee,\n estimates,\n canSwap,\n swapError,\n makeSwap,\n setAmountOut,\n } = useSwap({\n tokenIn: tokenIn,\n tokenOut: tokenOut,\n amountIn,\n simplePools: allPools.simplePools.filter(p => Number(p.shareSupply) > 0),\n options: {\n enableSmartRouting,\n stablePools: allPools.ratedPools\n .concat(allPools.unRatedPools)\n .filter(p => Number(p.shareSupply) > 0),\n stablePoolsDetail: allStablePools.filter(\n p => Number(p.shares_total_supply) > 0\n ),\n },\n slippageTolerance,\n onSwap,\n AccountId,\n refreshTrigger,\n poolFetchingState,\n referralId,\n });\n\n const priceImpact = useMemo(() => {\n if (!tokenIn || !tokenOut) return '0';\n\n return getPriceImpact({\n estimates,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut,\n stablePools: allStablePools,\n });\n }, [estimates, tokenIn, tokenOut, amountIn, amountOut, allStablePools]);\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n setNotOpen(true);\n makeSwap();\n };\n\n const canSubmit =\n tokenIn &&\n tokenOut &&\n canSwap &&\n !swapError &&\n isSignedIn &&\n new Big(tokenInBalance || '0').gte(amountIn || '0') &&\n slippageTolerance > 0 &&\n slippageTolerance < 100 &&\n !ONLY_ZEROS.test(tokenInBalance);\n\n return (\n <ThemeContextProvider customTheme={curTheme}>\n <TokenPriceContextProvider>\n {widgetRoute === 'swap' && (\n <form\n className={`__ref-swap-widget-container ${className}`}\n onSubmit={handleSubmit}\n style={{\n background: container,\n fontFamily,\n width,\n height,\n }}\n >\n <div className=\"__ref-swap-widget-header __ref-swap-widget-row-flex-center\">\n <div\n style={{\n color: primary,\n }}\n className=\"__ref-swap-widget-header-title\"\n >\n Swap\n </div>\n\n <div\n className=\"__ref-swap-widget-header-button __ref-swap-widget-row-flex-center\"\n style={{\n position: 'relative',\n }}\n >\n <AccountButton\n onDisConnect={onDisConnect}\n AccountId={AccountId}\n />\n\n <Slider showSlip={showSlip} setShowSlip={setShowSlip} />\n\n <SlippageSelector\n slippageTolerance={slippageTolerance}\n onChangeSlippageTolerance={setSlippageTolerance}\n showSlip={showSlip}\n setShowSlip={setShowSlip}\n />\n </div>\n </div>\n\n <TokenAmount\n amount={amountIn}\n balance={tokenInBalance}\n token={tokenIn}\n price={!tokenIn ? null : tokenPriceList?.[tokenIn.id]?.price}\n onChangeAmount={setAmountIn}\n onSelectToken={() => {\n setWidgetRoute('token-selector-in');\n }}\n />\n\n <div\n className={`__ref-swap-widget-exchange-button __ref-swap-widget-row-flex-center `}\n style={{\n color: iconDefault,\n }}\n >\n <CgArrowsExchangeAltV\n style={{\n cursor: 'pointer',\n }}\n className={`__ref-swap-widget-exchange-button-icon ${\n isMobile()\n ? '__ref-swap-widget-active'\n : '__ref-swap-widget-hover'\n }`}\n size={30}\n onClick={() => {\n tokenOut && handleSetTokenIn(tokenOut);\n tokenIn && handleSetTokenOut(tokenIn);\n setAmountIn('1');\n setAmountOut('');\n }}\n />\n </div>\n\n <TokenAmount\n amount={toPrecision(amountOut, 8)}\n balance={tokenOutBalance}\n token={tokenOut}\n price={!tokenOut ? null : tokenPriceList?.[tokenOut.id]?.price}\n onSelectToken={() => {\n setWidgetRoute('token-selector-out');\n }}\n onForceUpdate={() => {\n setRreshTrigger(!refreshTrigger);\n }}\n poolFetchingState={poolFetchingState}\n />\n {!swapError && amountIn && amountOut && (\n <DetailView\n fee={fee}\n rate={rate}\n amountIn={amountIn}\n minReceived={minAmountOut}\n tokenIn={tokenIn}\n tokenOut={tokenOut}\n amountOut={amountOut}\n priceImpact={priceImpact}\n estimates={estimates}\n />\n )}\n\n {swapError && (\n <div\n className=\"__ref-swap-widget-row-flex-center\"\n style={{\n color: '#DE9450',\n fontSize: '14px',\n\n paddingTop: '16px',\n }}\n >\n <TiWarning fill=\"#DE9450\" size={20} />\n &nbsp;\n {swapError.message}\n </div>\n )}\n {isSignedIn ? (\n <button\n type=\"submit\"\n className=\"__ref-swap-widget-submit-button __ref-swap-widget-button\"\n style={{\n color: 'white',\n background: buttonBg,\n opacity: !canSubmit ? 0.5 : 1,\n cursor: !canSubmit ? 'not-allowed' : 'pointer',\n }}\n disabled={!canSubmit}\n >\n {'Swap'}\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"__ref-swap-widget-submit-button __ref-swap-widget-button\"\n onClick={onConnect}\n style={{\n color: 'white',\n background: buttonBg,\n cursor: 'pointer',\n }}\n >\n {'Connect Wallet'}\n </button>\n )}\n <div\n className=\"__ref-swap-widget-row-flex-center\"\n style={{\n justifyContent: 'center',\n }}\n >\n <a\n className=\"__ref-swap-widget-row-flex-center\"\n style={{\n color: secondary,\n justifyContent: 'center',\n paddingTop: '12px',\n fontSize: '14px',\n display: 'inline-flex',\n }}\n href=\"https://ref.finance\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <RefIcon\n style={{\n color: refIcon || 'black',\n }}\n />\n &nbsp; Powered by Ref.finance\n </a>\n </div>\n\n <Notification\n state={transactionState?.state}\n setState={transactionState?.setState}\n open={notOpen}\n setOpen={setNotOpen}\n tx={transactionState?.tx}\n detail={transactionState?.detail}\n />\n </form>\n )}\n\n {widgetRoute === 'token-selector-in' && (\n <TokenSelector\n balances={balances}\n tokens={tokens}\n width={width}\n onSelect={token => {\n handleSetTokenIn(token);\n setWidgetRoute('swap');\n }}\n onClose={() => setWidgetRoute('swap')}\n AccountId={AccountId}\n className={className}\n />\n )}\n\n {widgetRoute === 'token-selector-out' && (\n <TokenSelector\n tokens={tokens}\n balances={balances}\n width={width}\n onSelect={token => {\n handleSetTokenOut(token);\n setWidgetRoute('swap');\n }}\n onClose={() => setWidgetRoute('swap')}\n AccountId={AccountId}\n className={className}\n />\n )}\n </TokenPriceContextProvider>\n </ThemeContextProvider>\n );\n};\n"],"names":["ONE_YOCTO_NEAR","ENV","INDEXER_URL","getConfig","env","indexerUrl","process","NEAR_ENV","REACT_APP_REF_SDK_ENV","networkId","nodeUrl","walletUrl","WRAP_NEAR_CONTRACT_ID","REF_FI_CONTRACT_ID","REF_TOKEN_ID","explorerUrl","REF_DCL_SWAP_CONTRACT_ID","config","WNEAR_META_DATA","id","name","symbol","decimals","icon","REF_META_DATA","NEAR_META_DATA","TokenLinks","NEAR","wNEAR","REF","OCT","PARAS","SKYWARD","FLX","PULSE","DBIO","MYRIA","PXT","HAPI","OIN","ABR","1MIL","MARMAJ","marmaj","USN","1INCH","GRT","LINK","Cheddar","AURORA","$META","UMINT","UTO","DEIP","WOO","LINEAR","PEM","ATO","SEAT","FAR","BSTN","BRRR","XNL","KSW","STNEAR","NearX","SD","DISC","switchEnv","calc_d","amp","c_amounts","token_num","length","sum_amounts","_","sum","d_prev","d","i","d_prod","ann","Math","abs","calc_y","x_c_amount","current_c_amounts","index_x","index_y","s","c","b","y_prev","y","calc_swap","in_token_idx","in_c_amount","out_token_idx","old_c_amounts","trade_fee","dy","fee","amount","tradeFee","getSwappedAmount","tokenInId","tokenOutId","amountIn","stablePool","STABLE_LP_TOKEN_DECIMALS","total_fee","token_account_ids","findIndex","rates","map","r","toReadableNumber","toNonDivisibleNumber","scientificNotationToString","Big","times","toString","Number","DEFAULT_START_TOKEN_LIST_TESTNET","DEFAULT_START_TOKEN_LIST_MAINNET","defaultTheme","container","buttonBg","primary","secondary","borderRadius","fontFamily","hover","active","secondaryBg","borderColor","iconDefault","iconHover","defaultDarkModeTheme","refIcon","icons","4691937a7508860f876c9c0a2a617e7d9e945d4b.factory.bridge.near","wrap.near","wrap.testnet","6b175474e89094c44da98b954eedeac495271d0f.factory.bridge.near","berryclub.ek.near","dac17f958d2ee523a2206206994597c13d831ec7.factory.bridge.near","1f9840a85d5af5bf1d1762f925bdaddc4201f984.factory.bridge.near","514910771af9ca656af840dff83e8264ecf986ca.factory.bridge.near","a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.factory.bridge.near","2260fac5e5542a773aa44fbcfedf7c193bc2c599.factory.bridge.near","7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9.factory.bridge.near","a0b73e1ff0b80914ab6fe0444e65848c4c34450b.factory.bridge.near","50d1c9771902476076ecfc8b2a83ad6b9355a4c9.factory.bridge.near","4fabb145d64652a948d72533023f6e7a623c7c53.factory.bridge.near","6f259637dcd74c767781e37bc6133cd6a68aa161.factory.bridge.near","6b3595068778dd592e39a122f4f5a5cf09c90fe2.factory.bridge.near","c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f.factory.bridge.near","c944e90c64b2c07662a292be6244bdf05cda44a7.factory.bridge.near","9f8f72aa9304c8b593d555f12ef6589cc3a579a2.factory.bridge.near","0bc529c00c6401aef6d220be8c6ea1667f6ad93e.factory.bridge.near","c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2.factory.bridge.near","0316eb71485b0ab14103307bf65a021042c6d380.factory.bridge.near","111111111117dc0aa78b770fa6a738034120c302.factory.bridge.near","f5cfbc74057c610c8ef151a439252680ac68c6dc.factory.bridge.near","de30da39c46104798bb5aa3fe8b9e0e1f348163f.factory.bridge.near","a4ef4b0b23c1fc81d3f9ecf93510e64f58a4a016.factory.bridge.near","token.cheddar.near","farm.berryclub.ek.near","d9c2d319cd7e6177336b0a9c93c21cb48d84fb54.factory.bridge.near","getTokenPriceList","_context","fetch","method","headers","Content-type","then","res","json","list","getTokens","reload","storagedTokens","window","localStorage","getItem","_context2","JSON","parse","tokens","Object","values","reduce","acc","cur","keys","REPLACE_TOKENS","includes","metaIconDefaults","setItem","stringify","getTokensTiny","_context3","getWhiteListTokensIndexer","whiteListIds","_context4","checkIntegerSumOfAllocations","allocations","totalInput","alloSum","item","round","a","plus","offset","minus","currMax","currMaxInd","gt","newAllocations","j","push","RM","DP","NE","PE","_marked5","yenFromPy","bisqrt","value","BigInt","newtonIteration","n","x0","x1","getBetaForRoute","route","path","beta","reserves","p2","getEpsilonForRoute","p","gamma","div","epsilon","p1","gamma1","gamma2","getAlphaForRoute","inputToken","outputToken","key2","token2Id","val2","token2Supply","token1Id","token1Supply","alpha","key12","val12","key22","val22","middleToken","alpha1","alpha2","getAllocationForRoute","phi","toFixed","getNodeRoutesFromPathsAndPoolChains","paths","poolChains","multiplicity","mul","elem1","elem2","nodeRoutes","m","k","getPoolChainFromPaths","pools","threshold","pathInd","chain","pairs","pairInd","pair","tokenPools","getPoolsByToken1ANDToken2","newChains","newPath","legInd","culledPath","cullPoolsWithInsufficientLiquidity","getCulledPoolChains","getRoutesFromPoolChain","routes","pci","newRoutes","flatMap","e","flat","getOutputSingleHop","pool","num","denom","getOutputFromRoute","nodeRoute","allocation","eq","output","poolIndex","c1","a1","c2","b2","getOutputDoubleHop","getOptOutputVec","getOptimalAllocationForRoutes","allocationVec","getAllocationVectorForRoutes","alphaSum","radical","getAlphaSumFromRoutes","betaSum","getBetaSumFromRoutes","getPhiFromRoutes","every","lt","some","goodIndices","newNodeRoutes","goodIndex","allocationDict","allocationVecNew","zeroAllocation","reduceRoutes","sumAllocations","result","getBestOptInputAndOutput","rawDict","outputRaw","inputRaw","input","v","bv1","bv2","getBestOptimalAllocationsAndOutputs","_getBestOptimalAllocationsAndOutputs","maxPathLength","_context6","getPathsFromPools","outputs","inputOutput","getActionListFromRoutesAndAllocations","hops","hop","allRoutes","allNodeRoutes","totalInputAmount","allAllocations","middleTokenAllocation","getHopActionsFromRoutes","getSmartRouteSwapActions","_getSmartRouteSwapActions","allTokens","numberOfRoutesLimit","MAX_NUMBER_PARALLEL_POOLS","decimalsCulledPoolIds","_context9","filter","resDict","sortedIndexValues","argsort","topIndices","slice","reducedRoutes","reducedNodeRoutes","ind","currentBestOutput","bestAllocations","bestNodeRoutes","parallelNodeRoutes","parallelRoutes","bestRoutes","currentNodeRoute","bestRoutesAreParallel","filteredAllocationsAndOutputs","parallelOutputs","parallellAllocations","sortIndices","filteredParallelRoutes","filteredParallelNodeRoutes","parallelOutput","canHaveTwoRoutes","route1","route2","nodeRoute1","nodeRoute2","route1PoolIds","Set","route2PoolIds","sharePool","has","currentRoutes","currentNodeRoutes","filteredAllocations","totalOutput","allSortedIndices","sortedIndices","filteredRoutes","filteredNodeRoutes","index","sharedRoute","allFilteredRoutes","allFilteredNodeRoutes","firstRoutePoolIds","allFilteredRouteIds","secondRoute","stringAllo","actions","ftGetTokenMetadata","hopInputTokenMeta","hopOutputTokenDecimals","expectedHopOutput","decimalEstimate","pow","status","Promise","all","t","_context8","estimate","gamma_bps","partialAmountIn","supplies","token0_ref_price","token0_price","tokenIds","Dex","token","routeInputToken","routeOutputToken","overallPriceImpact","x","calculateSmartRouteV2PriceImpact","action","_calculateSmartRouteV2PriceImpact","deltaY","inputTokenMeta","deltaX","R","P","totalAllocations","weights","_context12","_context11","weight","routeMarketPrice","num1","denom1","num2","denom2","priceImpact","arr","decor","sort","token1","token2","cullZeroLiquidityPools","filteredPools","thresh","normLiq","liquidities","poolInd","amounts","poolBigAmounts","liquidity","getLiqudityOfPoolsFromList","maxLiq","arrayOfBigs","maxElem","val","bigMax","getNormalizedLiquiditiesFromList","addEdge","g","edge","src","dst","deleteEdge","gNew","e1","e2","deleteNode","node","nodeInd","nodeNow","shortestPath","ignore_nodes","ignore_edges","gTemp","edgeInd","solution","graph","solutions","dist","parent","nearest","Infinity","ndist","adj","concat","dijkstra","unshift","PoolMode","PathBuffer","this","sortedpaths","_proto","len","cost","arrayContains","pop","shift","splice","indexOf","arrayEquals","Array","isArray","obj","obj_json","itemInd","source","target","listA","listB","prev_path","root","root_length","sol","spur","_context5","getKShortestPaths","gen","next","_getPathsFromPools","getGraphFromPoolList","poolList","edgeList","addEdges","stableSmart","_stableSmart","_context15","getExpectedOutputFromActionsORIG","getSimplePoolEstimate","tokenIn","tokenOut","amount_with_fee","in_balance","out_balance","getStablePoolEstimate","getStablePoolDecimal","amount_swapped","amountOut","isNaN","toPrecision","dyOut","noFeeAmountOut","singlePoolSwap","simplePools","stablePools","NoPoolError","parsedAmountIn","estimatesSimplePool","isStablePool","stablePoolThisPair","sp","estimatesStablePool","find","maxSimplePoolEstimate","undefined","maxBy","maxStablePoolEstimate","getStablePoolsThisPair","getPoolsByTokens","getPoolEstimate","stablePoolDetail","getHybridStableSmart","_getHybridStableSmart","stablePoolsDetail","isStablePoolToken","stablePoolsDetailById","pools1","pools2","pools1Right","pools2Right","candidatePools","otherStables","stablePoolsThisPair","otherStable","tmpPools","tobeAddedPools","middleTokens","_loop2","p2s","_loop","ftGetTokensMetadata","cp","tokensMedata","BestPoolPair","poolPair","stablePoolDetailThisPair","spd","tmpPool1","tmpPool2","tokenMidId","tokenMidMeta","estimate1","SMART","estimate2","bestPool","STABLE","pool1","pool2","estimateSwap","options","SameInputTokenError","ONLY_ZEROS","test","ZeroInputError","enableSmartRouting","_ref10","singleRouteEstimate","PARALLEL","inputPools","poolFormatter","simplePoolSmartRoutingEstimate","simplePoolSmartRoutingActions","hybridSmartRoutingEstimate","hybridSmartRoutingRes","gte","_singleRouteEstimate","_singleRouteEstimate$","_singleRouteEstimate2","_singleRouteEstimate3","parsePool","shareSupply","shares_total_supply","tvl","pool_kind","shares","tokenId","poolId","minAmountOut","isInteger","ceil","convertToPercentDecimal","percent","math","percentOf","percentLess","notation","getGas","gas","BN","number","substring","padStart","replace","split","_number$split$","padEnd","strParam","sysbol","negative","match","_strParam$match","basis","_strParam$match2","wholeStr","fractionStr","ifFraction","formatWithCommas","pattern","precision","withCommas","atLeastOne","whole","_number$split2$","decimal","str","lastIndexOf","transformTransactions","transactions","AccountId","signerId","receiverId","functionCalls","fc","type","params","methodName","args","toNumber","deposit","utils","format","parseNearAmount","separateRoutes","curRoute","calculateExchangeRate","from","to","getAvgFee","estimates","forEach","getAccountName","account","network","niceAccountId","symbolsArr","multiply","factor1","factor2","toInternationalCurrencySystemLongString","labelValue","percentOfBigNumber","valueBig","percentBig","toRealSymbol","charAt","toUpperCase","calculateFeeCharge","total","calculateFeePercent","getExpectedOutputFromSwapTodos","calculateAmountReceived","big_in_balance","big_out_balance","constant_product","new_in_balance","new_out_balance","calculateMarketPrice","cur_in_balance","cur_out_balance","calculateSmartRoutingPriceImpact","tokenInAmount","swapTodos","tokenMid","stableOutPool2","isPool1StablePool","isPool2StablePool","marketPrice1","_swapTodos$0$pool$rat","_swapTodos$0$pool$rat2","marketPrice2","_swapTodos$1$pool$rat","_swapTodos$1$pool$rat2","generalMarketPrice","tokenMidReceived","formattedTokenMidReceived","stablePool2","stableOut","tokenOutReceived","newMarketPrice","PriceImpact","numerator","denominator","calcStableSwapPriceImpact","marketPrice","calculatePriceImpact","finalMarketPrice","separatedReceivedAmount","finalTokenOutReceived","calculateSmartRoutesV2PriceImpact","tokenInPara","_routes$0$0$tokens","rawRes","readablePartialAmountIn","_r$0$tokens","_r$0$tokens2","_r$0$tokens3","_r$0$pool$rates","_r$0$pool$rates2","_r$0$tokens4","_r$0$tokens5","pre","getPriceImpact","priceImpactValueSmartRouting","priceImpactValueSmartRoutingV2","_estimates$0$tokens","_estimates$0$pool$rat","_estimates$0$pool$rat2","error","subtraction","initialValue","toBeSubtract","getPoolAllocationPercents","partialAmounts","ps","fill","sortedAmount","sortBy","minIndexes","minIndex","finalPIndex","isMobile","screen","width","divide","getMax","String","getPointByPrice","pointDelta","price","decimalRate","noNeedSlot","point","log","point_int","point_int_slot","floor","feeToPointDelta","NoFeeToPool","priceToPoint","tokenA","tokenB","amountA","amountB","DCL_POOL_FEE_LIST","decimal_price_A_by_B","registerAccountOnToken","registration_only","account_id","getKeyStore","keyStores","InMemoryKeyStore","BrowserLocalStorageKeyStore","provider","providers","JsonRpcProvider","url","getMemorySigner","keyPath","credentials","fs","readFileSync","credentialAccountId","NoCredential","AccountIdMisMatch","myKeyStore","setKey","KeyPair","fromString","private_key","signer","InMemorySigner","validateAccessKey","transaction","accessKey","permission","FunctionCall","method_names","receiver_id","parseFloat","getSignedTransactionsByMemoryKey","transactionsRef","block","finality","signedTransactions","getPublicKey","publicKey","NoPuiblicKeyError","query","request_type","public_key","InValidAccessKeyError","tx","nearTransactions","createTransaction","PublicKey","nonce","functionCall","serialize","base_decode","header","hash","signTransaction","sendTransactionsByMemoryKey","results","sendTransaction","HAPI_ID","WOO_ID","near","Near","keyStore","refFiViewFunction","viewFunction","ftViewFunction","ftGetStorageBalance","NoAccountIdFound","ftGetBalance","getAccountNearBalance","getTotalPools","tag","TokenNotExistError","metadata","getGlobalWhitelist","ids","_context7","getUserRegisteredTokens","accountId","data","nearDepositTransaction","nearWithdrawTransaction","refDCLSwapViewFunction","_context10","nearConnection","DCLInValid","DCLSwapGetStorageBalance","getDCLPoolId","join","getDCLPool","pool_id","_pool_id$split","token_seq","formatError","msg","Error","unNamedError","NotLoginError","SwapRouteError","NoLocalSignerError","NoPoolOnThisPair","SlippageError","NoOrderFound","order_id","OrderNoRemainedAmount","instantSwap","slippageTolerance","referralId","_swapTodos","registerToken","actionsList","allSwapsTokens","swapTokens","token_in","token_out","amount_in","min_amount_out","force","referral_id","DEFAULT_PAGE_LIMIT","BLACK_TOKEN_LIST","getRatedPoolDetail","pool_info","getUnRatedPoolDetail","getStablePools","getPool","getPoolByIds","pool_ids","getRefPools","page","perPage","from_index","limit","rawPool","_p$tokenIds","fetchAllPools","min","pages","unRatedPools","ratedPools","ThemeContext","createContext","ThemeContextProvider","customTheme","children","useState","theme","setTheme","useEffect","React","Provider","TokenPriceContext","useTokenPriceList","tokenPriceList","setTokenPriceList","TokenPriceContextProvider","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","SmartRouteV2","tokensRaw","useContext","ParaTokenFrom","className","marginRight","Icon","alt","height","flexShrink","Hub","position","bottom","ArrowRight","_pools$","_pools$2","_pools$3","DetailView","rate","minReceived","storagedOpen","showDetail","setShowDetail","isRateReverse","setIsRateReverse","tokensPerRoute","swap","identicalRoutes","_estimates","hub","percents","useMemo","priceImpactDisplay","textColor","displayValue","tokenInInfo","displayRate","revertRate","revertDisplayRate","color","cursor","onClick","removeItem","FiChevronUp","FiChevronDown","RiExchangeFill","size","marginLeft","border","flexDirection","alignItems","justifyContent","RouterIcon","whiteSpace","minWidth","key","HalfAndMaxAmount","max","onChangeAmount","halfValue","hoverHalf","setHoverHalf","hoverMax","setHoverMax","background","onMouseEnter","onMouseLeave","half","TokenAmount","props","balance","reloading","onSelectToken","onForceUpdate","poolFetchingState","useRef","hoverSelect","setHoverSelect","handleChange","current","setCustomValidity","_ref$current","_ref$current2","curMax","RiRefreshLine","onWheel","blur","step","placeholder","onChange","disabled","onKeyDown","preventDefault","marginBottom","textAlign","fontSize","SlippageSelector","onChangeSlippageTolerance","showSlip","setShowSlip","invalid","setInValid","onclick","stopPropagation","paddingBottom","defaultValue","required","padding","IoWarning","StarToken","onDelete","hoverIcon","setHoverIcon","setHoverClose","top","right","boxShadow","IoCloseOutline","stroke","Token","isSticky","onClickPin","setHoverIndex","hoverIndex","displayBalance","hoverOutLink","setHoverOutLink","hoverPin","setHoverPin","HiOutlineExternalLink","marginTop","open","AiFillPushpin","AiOutlinePushpin","TokenListTable","balances","starList","setStarList","currentSort","setCurrentSort","newList","borderBottom","TiArrowSortedUp","TiArrowSortedDown","b1","_tokenPriceList$token","TokenSelector","onSelect","onClose","searchValue","setSearchValue","storagedStartList","DEFAULT_START_TOKEN_LIST","newStarList","starToken","FiChevronLeft","FaSearch","evt","_tokenPriceList$token2","searchValueLower","toLowerCase","_token$symbol","Slider","setHover","viewBox","xmlns","fillRule","clipRule","RefIcon","Loading","cx","cy","strokeWidth","strokeLinecap","Warning","y1","x2","y2","Success","left","gradientUnits","stopColor","Notification","state","detail","setOpen","setState","href","textDecoration","rel","fontWeight","AccountButton","onDisConnect","hoverAccount","setHoverAccount","DefaultTestnetTokenList","spec","reference","reference_hash","DefaultMainnetTokenList","DCLSwap","SwapByOutput","LimitOrderWithSwap","SwapByStopPoint","swapInfo","Swap","output_token","min_output_amount","client_id","output_amount","buy_token","new_point","quote","input_token","input_amount","list_user_assets","DCLSwapByInputOnBestPool","bestEstimate","bestFee","_bestEstimate$tag","_bestEstimate$tag$spl","_bestEstimate$tag2","_bestEstimate$tag2$sp","get_order","find_order","cancel_order","order","remain_amount","defaultTokenList","onSwap","connection","transactionState","onConnect","defaultTokenIn","defaultTokenOut","curTheme","darkMode","STORAGED_TOKEN_IN","STORAGED_TOKEN_OUT","isSignedIn","setTokenIn","handleSetTokenIn","handleSetTokenOut","setTokenOut","tokenInBalance","setTokenInBalance","tokenOutBalance","setTokenOutBalance","notOpen","setNotOpen","setTokens","setTokensLoading","widgetRoute","setWidgetRoute","setAmountIn","setSlippageTolerance","tokenLoading","setTokenLoading","whiteList","globalWhiteListTokens","parsedTokens","getTokensList","useTokensIndexer","fetchTokens","setBalances","validTokens","balancesMap","useTokenBalnces","refreshTrigger","setRreshTrigger","allPools","setAllPools","setPoolFetchingState","allStablePools","setAllStablePools","useRefPools","defaultIn","defaultOut","wrapedId","available","setEstimates","canSwap","setCanSwap","swapError","setSwapError","setAmountOut","isEstimating","setIsEstimating","forceEstimate","setForceEstimate","makeSwap","outEstimate","bigEstimate","estimateValidationPass","_swapTodos$","totalPartialAmountIn","estimateValidator","expectAmountOut","getEstimate","_params$tokenIn","_params$tokenOut","_params$tokenIn2","_params$tokenOut2","_params$options","useSwap","canSubmit","onSubmit","CgArrowsExchangeAltV","paddingTop","TiWarning","message","opacity","display","left_point","right_point","undecimal_price"],"mappings":"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"}
1
+ {"version":3,"file":"ref-sdk.cjs.production.min.js","sources":["../src/constant.ts","../src/stable-swap.ts","../src/swap-widget/constant.ts","../src/metaIcons.ts","../src/indexer.ts","../src/v1-swap/parallelSwapLogic.ts","../src/v1-swap/smartRoutingLogic.js","../src/v1-swap/swap.ts","../src/utils.ts","../src/near.ts","../src/ref.ts","../src/dcl-swap/dcl-pool.ts","../src/error.ts","../src/v1-swap/instantSwap.ts","../src/v1-swap/pool.ts","../src/swap-widget/state.tsx","../node_modules/style-inject/dist/style-inject.es.js","../src/swap-widget/components.tsx","../src/swap-widget/defaultTokenList.ts","../src/dcl-swap/swap.ts","../src/dcl-swap/limit-order.ts","../src/swap-widget/index.tsx"],"sourcesContent":["import { TokenMetadata } from './types';\n\nexport const FEE_DIVISOR = 10000;\n\nexport const STABLE_LP_TOKEN_DECIMALS = 18;\nexport const RATED_POOL_LP_TOKEN_DECIMALS = 24;\nexport const STORAGE_TO_REGISTER_WITH_MFT = '0.1';\nexport const ONE_YOCTO_NEAR = '0.000000000000000000000001';\nlet ENV: string | undefined = '';\nlet INDEXER_URL: string | undefined = '';\nexport function getConfig(\n env: string | undefined = ENV ||\n process.env.NEAR_ENV ||\n process.env.REACT_APP_REF_SDK_ENV,\n indexerUrl: string | undefined = INDEXER_URL\n) {\n ENV = env;\n INDEXER_URL = indexerUrl;\n switch (env) {\n case 'mainnet':\n return {\n networkId: 'mainnet',\n nodeUrl: 'https://rpc.mainnet.near.org',\n walletUrl: 'https://wallet.near.org',\n WRAP_NEAR_CONTRACT_ID: 'wrap.near',\n REF_FI_CONTRACT_ID: 'v2.ref-finance.near',\n REF_TOKEN_ID: 'token.v2.ref-finance.near',\n indexerUrl: indexerUrl || 'https://indexer.ref.finance',\n explorerUrl: 'https://testnet.nearblocks.io',\n REF_DCL_SWAP_CONTRACT_ID: 'dclv2.ref-labs.near',\n };\n case 'testnet':\n return {\n networkId: 'testnet',\n nodeUrl: 'https://rpc.testnet.near.org',\n walletUrl: 'https://wallet.testnet.near.org',\n indexerUrl: indexerUrl || 'https://testnet-indexer.ref-finance.com',\n WRAP_NEAR_CONTRACT_ID: 'wrap.testnet',\n REF_FI_CONTRACT_ID: 'ref-finance-101.testnet',\n REF_TOKEN_ID: 'ref.fakes.testnet',\n explorerUrl: 'https://testnet.nearblocks.io',\n REF_DCL_SWAP_CONTRACT_ID: 'dclv2.ref-dev.testnet',\n };\n case 'dev':\n return {\n networkId: 'testnet',\n nodeUrl: 'https://rpc.testnet.near.org',\n walletUrl: 'https://wallet.testnet.near.org',\n indexerUrl: indexerUrl || 'https://dev-indexer.ref-finance.com',\n WRAP_NEAR_CONTRACT_ID: 'wrap.testnet',\n REF_FI_CONTRACT_ID: 'exchange.ref-dev.testnet',\n REF_TOKEN_ID: 'ref.fakes.testnet',\n explorerUrl: 'https://testnet.nearblocks.io',\n REF_DCL_SWAP_CONTRACT_ID: 'refv2-dev.ref-dev.testnet',\n };\n default:\n return {\n networkId: 'mainnet',\n nodeUrl: 'https://rpc.mainnet.near.org',\n walletUrl: 'https://wallet.near.org',\n REF_FI_CONTRACT_ID: 'v2.ref-finance.near',\n WRAP_NEAR_CONTRACT_ID: 'wrap.near',\n REF_TOKEN_ID: 'token.v2.ref-finance.near',\n indexerUrl: indexerUrl || 'https://indexer.ref.finance',\n explorerUrl: 'https://nearblocks.io',\n REF_DCL_SWAP_CONTRACT_ID: 'dclv2.ref-labs.near',\n };\n }\n}\n\nexport let config = getConfig();\n\nexport let REF_FI_CONTRACT_ID = config.REF_FI_CONTRACT_ID;\n\nexport let WRAP_NEAR_CONTRACT_ID = config.WRAP_NEAR_CONTRACT_ID;\n\nexport let REF_TOKEN_ID = config.REF_TOKEN_ID;\n\nexport let WNEAR_META_DATA: TokenMetadata = {\n id: WRAP_NEAR_CONTRACT_ID,\n name: 'wNEAR',\n symbol: 'wNEAR',\n decimals: 24,\n icon: 'https://assets.ref.finance/images/w-NEAR-no-border.png',\n};\n\nexport let REF_META_DATA = {\n decimals: 18,\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='16 24 248 248' style='background: %23000'%3E%3Cpath d='M164,164v52h52Zm-45-45,20.4,20.4,20.6-20.6V81H119Zm0,18.39V216h41V137.19l-20.6,20.6ZM166.5,81H164v33.81l26.16-26.17A40.29,40.29,0,0,0,166.5,81ZM72,153.19V216h43V133.4l-11.6-11.61Zm0-18.38,31.4-31.4L115,115V81H72ZM207,121.5h0a40.29,40.29,0,0,0-7.64-23.66L164,133.19V162h2.5A40.5,40.5,0,0,0,207,121.5Z' fill='%23fff'/%3E%3Cpath d='M189 72l27 27V72h-27z' fill='%2300c08b'/%3E%3C/svg%3E%0A\",\n id: REF_TOKEN_ID,\n name: 'Ref Finance Token',\n symbol: 'REF',\n};\n\nexport const NEAR_META_DATA: TokenMetadata = {\n id: 'NEAR',\n name: 'NEAR',\n symbol: 'NEAR',\n decimals: 24,\n icon:\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2AAAANgCAIAAADF8JzzAAAACXBIWXMAABYlAAAWJQFJUiTwAAAgAElEQVR4nO3d7VXb2rqw4eQd57/cgZ0KLCqwVwWIChAVYCrAqQBTgUUFERVEVBBTwTYdmArWO/by3uzMfBA+bHlK87r+nTP2WBFSjO/o8SN//Pvvvz8AAMB//T9nAgCA7wlEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAAC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ICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAICAQAQAICAQAQAICEQAAAICEQCAgEAEACAgEAEACAhEAAACAhEAgIBABAAgIBABAAgIRAAAAgIRAID/+fDhw/8H0I0VimXUJpsAAAAASUVORK5CYII=',\n};\n\nexport const TokenLinks = {\n NEAR: 'https://awesomenear.com/near-protocol',\n wNEAR: 'https://awesomenear.com/near-protocol',\n REF: 'https://awesomenear.com/ref-finance',\n OCT: 'https://awesomenear.com/octopus-network',\n PARAS: 'https://awesomenear.com/paras',\n SKYWARD: 'https://awesomenear.com/skyward-finance',\n FLX: 'https://awesomenear.com/flux',\n PULSE: 'https://awesomenear.com/pulse',\n DBIO: 'https://awesomenear.com/debio-network',\n MYRIA: 'https://awesomenear.com/myriad-social',\n PXT: 'https://awesomenear.com/cryptoheroes',\n HAPI: 'https://awesomenear.com/hapi',\n OIN: 'https://awesomenear.com/oin-finance',\n ABR: 'https://awesomenear.com/allbridge',\n '1MIL': 'https://awesomenear.com/1millionnfts',\n MARMAJ: 'https://awesomenear.com/marmaj-foundation',\n marmaj: 'https://awesomenear.com/marmaj-foundation',\n USN: 'https://awesomenear.com/decentral-bank',\n '1INCH': 'https://awesomenear.com/1inch-network',\n GRT: 'https://awesomenear.com/the-graph',\n LINK: 'https://awesomenear.com/chainlink',\n Cheddar: 'https://awesomenear.com/cheddar-farm',\n AURORA: 'https://awesomenear.com/aurora-dev',\n $META: 'https://awesomenear.com/meta-pool',\n UMINT: 'https://awesomenear.com/youminter',\n UTO: 'https://awesomenear.com/secret-skellies-society',\n DEIP: 'https://awesomenear.com/deip',\n WOO: 'https://awesomenear.com/woo-dex',\n LINEAR: 'https://awesomenear.com/linear-protocol',\n PEM: 'https://awesomenear.com/pembrock-finance',\n ATO: 'https://awesomenear.com/atocha-protocol',\n SEAT: 'https://awesomenear.com/seatlab-nft',\n FAR: 'https://awesomenear.com/few-and-far',\n BSTN: 'https://awesomenear.com/bastion',\n BRRR: 'https://awesomenear.com/burrow',\n XNL: 'https://awesomenear.com/chronicle',\n KSW: 'https://awesomenear.com/killswitch-finance',\n STNEAR: 'https://awesomenear.com/meta-pool',\n NearX: 'https://awesomenear.com/stader',\n SD: 'https://awesomenear.com/stader',\n DISC: 'https://awesomenear.com/discovol',\n} as Record<string, string>;\n\nexport const CONSTANT_D = 1.0001;\n\nexport const POINTLEFTRANGE = -800000;\nexport const POINTRIGHTRANGE = 800000;\n\nexport const switchEnv = () => {\n config = getConfig();\n REF_FI_CONTRACT_ID = config.REF_FI_CONTRACT_ID;\n WRAP_NEAR_CONTRACT_ID = config.WRAP_NEAR_CONTRACT_ID;\n REF_TOKEN_ID = config.REF_TOKEN_ID;\n REF_META_DATA = {\n decimals: 18,\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='16 24 248 248' style='background: %23000'%3E%3Cpath d='M164,164v52h52Zm-45-45,20.4,20.4,20.6-20.6V81H119Zm0,18.39V216h41V137.19l-20.6,20.6ZM166.5,81H164v33.81l26.16-26.17A40.29,40.29,0,0,0,166.5,81ZM72,153.19V216h43V133.4l-11.6-11.61Zm0-18.38,31.4-31.4L115,115V81H72ZM207,121.5h0a40.29,40.29,0,0,0-7.64-23.66L164,133.19V162h2.5A40.5,40.5,0,0,0,207,121.5Z' fill='%23fff'/%3E%3Cpath d='M189 72l27 27V72h-27z' fill='%2300c08b'/%3E%3C/svg%3E%0A\",\n id: REF_TOKEN_ID,\n name: 'Ref Finance Token',\n symbol: 'REF',\n };\n WNEAR_META_DATA = {\n id: WRAP_NEAR_CONTRACT_ID,\n name: 'wNEAR',\n symbol: 'wNEAR',\n decimals: 24,\n icon: 'https://assets.ref.finance/images/w-NEAR-no-border.png',\n };\n return {\n config,\n REF_FI_CONTRACT_ID,\n WRAP_NEAR_CONTRACT_ID,\n REF_TOKEN_ID,\n REF_META_DATA,\n WNEAR_META_DATA,\n };\n};\n","import { StablePool } from './types';\nimport { FEE_DIVISOR } from './constant';\n\nimport {\n toReadableNumber,\n toNonDivisibleNumber,\n scientificNotationToString,\n} from './utils';\n\nimport Big from 'big.js';\n\nimport _ from 'lodash';\n\nconst tradeFee = (amount: number, trade_fee: number) => {\n return (amount * trade_fee) / FEE_DIVISOR;\n};\n\nexport const calc_d = (amp: number, c_amounts: number[]) => {\n const token_num = c_amounts.length;\n const sum_amounts = _.sum(c_amounts);\n let d_prev = 0;\n let d = sum_amounts;\n for (let i = 0; i < 256; i++) {\n let d_prod = d;\n for (let c_amount of c_amounts) {\n d_prod = (d_prod * d) / (c_amount * token_num);\n }\n d_prev = d;\n const ann = amp * token_num ** token_num;\n const numerator = d_prev * (d_prod * token_num + ann * sum_amounts);\n const denominator = d_prev * (ann - 1) + d_prod * (token_num + 1);\n d = numerator / denominator;\n if (Math.abs(d - d_prev) <= 1) break;\n }\n return d;\n};\n\nexport const calc_y = (\n amp: number,\n x_c_amount: number,\n current_c_amounts: number[],\n index_x: number,\n index_y: number\n) => {\n const token_num = current_c_amounts.length;\n const ann = amp * token_num ** token_num;\n const d = calc_d(amp, current_c_amounts);\n let s = x_c_amount;\n let c = (d * d) / x_c_amount;\n for (let i = 0; i < token_num; i++) {\n if (i !== index_x && i !== index_y) {\n s += current_c_amounts[i];\n c = (c * d) / current_c_amounts[i];\n }\n }\n c = (c * d) / (ann * token_num ** token_num);\n const b = d / ann + s;\n let y_prev = 0;\n let y = d;\n for (let i = 0; i < 256; i++) {\n y_prev = y;\n const y_numerator = y ** 2 + c;\n const y_denominator = 2 * y + b - d;\n y = y_numerator / y_denominator;\n if (Math.abs(y - y_prev) <= 1) break;\n }\n\n return y;\n};\n\nexport const calc_swap = (\n amp: number,\n in_token_idx: number,\n in_c_amount: number,\n out_token_idx: number,\n old_c_amounts: number[],\n trade_fee: number\n) => {\n const y = calc_y(\n amp,\n in_c_amount + old_c_amounts[in_token_idx],\n old_c_amounts,\n in_token_idx,\n out_token_idx\n );\n const dy = old_c_amounts[out_token_idx] - y;\n const fee = tradeFee(dy, trade_fee);\n const amount_swapped = dy - fee;\n return [amount_swapped, fee, dy];\n};\n\nexport const getSwappedAmount = (\n tokenInId: string,\n tokenOutId: string,\n amountIn: string,\n stablePool: StablePool,\n STABLE_LP_TOKEN_DECIMALS: number\n) => {\n const amp = stablePool.amp;\n const trade_fee = stablePool.total_fee;\n\n // depended on pools\n const in_token_idx = stablePool.token_account_ids.findIndex(\n id => id === tokenInId\n );\n const out_token_idx = stablePool.token_account_ids.findIndex(\n id => id === tokenOutId\n );\n\n const rates = stablePool.rates.map(r =>\n toReadableNumber(STABLE_LP_TOKEN_DECIMALS, r)\n );\n\n const base_old_c_amounts = stablePool.c_amounts.map(amount =>\n toReadableNumber(STABLE_LP_TOKEN_DECIMALS, amount)\n );\n\n const old_c_amounts = base_old_c_amounts\n .map((amount, i) =>\n toNonDivisibleNumber(\n STABLE_LP_TOKEN_DECIMALS,\n scientificNotationToString(\n new Big(amount || 0).times(new Big(rates[i])).toString()\n )\n )\n )\n .map(amount => Number(amount));\n\n const in_c_amount = Number(\n toNonDivisibleNumber(\n STABLE_LP_TOKEN_DECIMALS,\n scientificNotationToString(\n new Big(amountIn).times(new Big(rates[in_token_idx])).toString()\n )\n )\n );\n\n const [amount_swapped, fee, dy] = calc_swap(\n amp,\n in_token_idx,\n in_c_amount,\n out_token_idx,\n old_c_amounts,\n trade_fee\n );\n\n return [\n amount_swapped / Number(rates[out_token_idx]),\n fee,\n dy / Number(rates[out_token_idx]),\n ];\n};\n","import { getConfig } from '../constant';\nexport const REF_WIDGET_STAR_TOKEN_LIST_KEY =\n 'REF_WIDGET_STAR_TOKEN_LIST_VALUE';\n\nexport const REF_WIDGET_ALL_TOKENS_LIST_KEY =\n 'REF_WIDGET_ALL_TOKENS_LIST_VALUE';\nexport const REF_WIDGET_ALL_LIGHT_TOKENS_LIST_KEY =\n 'REF_WIDGET_ALL_LIGHT_TOKENS_LIST_VALUE';\n\nexport const REF_WIDGET_SWAP_IN_KEY = 'REF_WIDGET_SWAP_IN_VALUE';\n\nexport const REF_WIDGET_SWAP_OUT_KEY = 'REF_WIDGET_SWAP_OUT_VALUE';\n\nexport const REF_WIDGET_SWAP_DETAIL_KEY = 'REF_WIDGET_SWAP_DETAIL_VALUE';\n\nexport const DEFAULT_START_TOKEN_LIST_TESTNET = [\n 'wrap.testnet',\n 'usdtt.fakes.testnet',\n 'usdt.fakes.testnet',\n 'ref.fakes.testnet',\n 'usdn.testnet',\n 'eth.fakes.testnet',\n];\n\nexport const DEFAULT_START_TOKEN_LIST_MAINNET = [\n 'wrap.near',\n 'usdt.tether-token.near',\n 'dac17f958d2ee523a2206206994597c13d831ec7.factory.bridge.near',\n 'token.v2.ref-finance.near',\n 'usn',\n 'aurora',\n 'token.sweat',\n];\n\nexport interface Theme {\n container: string; // container background\n buttonBg: string; // button background\n primary: string; // primary theme color\n secondary: string; // secondary theme color\n borderRadius: string; // border radius\n fontFamily: string; // font family\n hover: string; // hovering color\n active: string; // active color\n secondaryBg: string; // secondary background color\n borderColor: string; // border color\n iconDefault: string; // default icon color\n iconHover: string; // icon hovering color\n refIcon?: string; // ref icon color\n}\n\nexport const defaultTheme: Theme = {\n container: '#FFFFFF',\n buttonBg: '#00C6A2',\n primary: '#000000',\n secondary: '#7E8A93',\n borderRadius: '4px',\n fontFamily: 'sans-serif',\n hover: 'rgba(126, 138, 147, 0.2)',\n active: 'rgba(126, 138, 147, 0.2)',\n secondaryBg: '#F7F7F7',\n borderColor: 'rgba(126, 138, 147, 0.2)',\n iconDefault: 'rgba(126, 138, 147, 1)',\n iconHover: 'rgba(62, 62, 62, 1)',\n};\n\nexport const defaultDarkModeTheme: Theme = {\n container: '#26343E',\n buttonBg: '#00C6A2',\n primary: '#FFFFFF',\n secondary: '#7E8A93',\n borderRadius: '4px',\n fontFamily: 'sans-serif',\n hover: 'rgba(126, 138, 147, 0.2)',\n active: 'rgba(126, 138, 147, 0.2)',\n secondaryBg: 'rgba(0, 0, 0, 0.2)',\n borderColor: 'rgba(126, 138, 147, 0.2)',\n iconDefault: 'rgba(126, 138, 147, 1)',\n iconHover: 'rgba(183, 201, 214, 1)',\n refIcon: 'white',\n};\n","const icons: { [tokenId: string]: string } = {\n '4691937a7508860f876c9c0a2a617e7d9e945d4b.factory.bridge.near':\n 'https://assets.ref.finance/images/woo-wtrue.png',\n 'wrap.near':\n 'data:image/png;base64,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',\n 'wrap.testnet':\n 'data:image/png;base64,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',\n '6b175474e89094c44da98b954eedeac495271d0f.factory.bridge.near':\n 'https://assets.ref.finance/images/4943.png',\n 'berryclub.ek.near': 'https://assets.ref.finance/images/banana.png',\n 'dac17f958d2ee523a2206206994597c13d831ec7.factory.bridge.near':\n 'https://assets.ref.finance/images/825.png',\n '1f9840a85d5af5bf1d1762f925bdaddc4201f984.factory.bridge.near':\n 'https://assets.ref.finance/images/7083.png',\n '514910771af9ca656af840dff83e8264ecf986ca.factory.bridge.near':\n 'https://assets.ref.finance/images/1975.png',\n 'a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.factory.bridge.near':\n 'https://assets.ref.finance/images/3408.png',\n '2260fac5e5542a773aa44fbcfedf7c193bc2c599.factory.bridge.near':\n 'https://assets.ref.finance/images/3717.png',\n '7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9.factory.bridge.near':\n 'https://assets.ref.finance/images/7278.png',\n 'a0b73e1ff0b80914ab6fe0444e65848c4c34450b.factory.bridge.near':\n 'https://assets.ref.finance/images/3635.png',\n '50d1c9771902476076ecfc8b2a83ad6b9355a4c9.factory.bridge.near':\n 'https://assets.ref.finance/images/4195.png',\n '4fabb145d64652a948d72533023f6e7a623c7c53.factory.bridge.near':\n 'https://assets.ref.finance/images/4687.png',\n '6f259637dcd74c767781e37bc6133cd6a68aa161.factory.bridge.near':\n 'https://assets.ref.finance/images/2502.png',\n '6b3595068778dd592e39a122f4f5a5cf09c90fe2.factory.bridge.near':\n 'https://assets.ref.finance/images/6758.png',\n 'c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f.factory.bridge.near':\n 'https://assets.ref.finance/images/2586.png',\n 'c944e90c64b2c07662a292be6244bdf05cda44a7.factory.bridge.near':\n 'https://assets.ref.finance/images/6719.png',\n '9f8f72aa9304c8b593d555f12ef6589cc3a579a2.factory.bridge.near':\n 'https://assets.ref.finance/images/1518.png',\n '0bc529c00c6401aef6d220be8c6ea1667f6ad93e.factory.bridge.near':\n 'https://assets.ref.finance/images/5864.png',\n 'c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2.factory.bridge.near':\n 'https://assets.ref.finance/images/2396.png',\n '0316eb71485b0ab14103307bf65a021042c6d380.factory.bridge.near':\n 'https://assets.ref.finance/images/6941.png',\n '111111111117dc0aa78b770fa6a738034120c302.factory.bridge.near':\n 'https://assets.ref.finance/images/8104.png',\n 'f5cfbc74057c610c8ef151a439252680ac68c6dc.factory.bridge.near':\n 'https://assets.ref.finance/images/55sGoBm.png',\n 'de30da39c46104798bb5aa3fe8b9e0e1f348163f.factory.bridge.near':\n 'https://assets.ref.finance/images/10052.png',\n 'a4ef4b0b23c1fc81d3f9ecf93510e64f58a4a016.factory.bridge.near':\n 'https://assets.ref.finance/images/4222.png',\n 'token.cheddar.near': 'https://assets.ref.finance/images/cheddar.png',\n 'farm.berryclub.ek.near': 'https://assets.ref.finance/images/cucumber.png',\n 'd9c2d319cd7e6177336b0a9c93c21cb48d84fb54.factory.bridge.near':\n 'https://assets.ref.finance/images/HAPI.png',\n};\n\nexport default icons;\n","import { config, WRAP_NEAR_CONTRACT_ID, NEAR_META_DATA } from './constant';\nimport {\n REF_WIDGET_ALL_TOKENS_LIST_KEY,\n REF_WIDGET_ALL_LIGHT_TOKENS_LIST_KEY,\n} from './swap-widget/constant';\nimport { REPLACE_TOKENS } from './ref';\nimport metaIconDefaults from './metaIcons';\n\nexport const getTokenPriceList = async (): Promise<any> => {\n return await fetch(config.indexerUrl + '/list-token-price', {\n method: 'GET',\n headers: { 'Content-type': 'application/json; charset=UTF-8' },\n })\n .then(res => res.json())\n .then(list => {\n return list;\n });\n};\n\nexport const getTokens = async (reload?: boolean) => {\n const storagedTokens =\n typeof window !== 'undefined' && !reload\n ? localStorage.getItem(REF_WIDGET_ALL_TOKENS_LIST_KEY)\n : null;\n\n return storagedTokens\n ? JSON.parse(storagedTokens)\n : await fetch(config.indexerUrl + '/list-token', {\n method: 'GET',\n headers: { 'Content-type': 'application/json; charset=UTF-8' },\n })\n .then(res => res.json())\n .then(tokens => {\n const newTokens = Object.values(tokens).reduce(\n (acc: any, cur: any, i) => {\n const id = Object.keys(tokens)[i];\n return {\n ...acc,\n [id]: {\n ...cur,\n id,\n icon:\n !cur.icon || REPLACE_TOKENS.includes(id)\n ? metaIconDefaults[id]\n : cur.icon,\n },\n };\n },\n {}\n );\n\n return newTokens;\n })\n .then(res => {\n typeof window !== 'undefined' &&\n !reload &&\n localStorage.setItem(\n REF_WIDGET_ALL_TOKENS_LIST_KEY,\n JSON.stringify(res)\n );\n return res;\n });\n};\nexport const getTokensTiny = async (reload?: boolean) => {\n const storagedTokens =\n typeof window !== 'undefined' && !reload\n ? localStorage.getItem(REF_WIDGET_ALL_LIGHT_TOKENS_LIST_KEY)\n : null;\n\n return storagedTokens\n ? JSON.parse(storagedTokens)\n : await fetch(config.indexerUrl + '/list-token-v2', {\n method: 'GET',\n headers: { 'Content-type': 'application/json; charset=UTF-8' },\n })\n .then(res => res.json())\n .then(tokens => {\n const newTokens = Object.values(tokens).reduce(\n (acc: any, cur: any, i) => {\n const id = Object.keys(tokens)[i];\n return {\n ...acc,\n [id]: {\n ...cur,\n id,\n },\n };\n },\n {}\n );\n\n return newTokens;\n })\n .then(res => {\n typeof window !== 'undefined' &&\n !reload &&\n localStorage.setItem(\n REF_WIDGET_ALL_LIGHT_TOKENS_LIST_KEY,\n JSON.stringify(res)\n );\n return res;\n });\n};\n\nexport const getWhiteListTokensIndexer = async (whiteListIds: string[]) => {\n return await fetch(config.indexerUrl + '/list-token', {\n method: 'GET',\n headers: { 'Content-type': 'application/json; charset=UTF-8' },\n })\n .then(res => res.json())\n .then(res => {\n return whiteListIds.reduce((acc, cur, i) => {\n if (\n !res[cur] ||\n !Object.values(res[cur]) ||\n Object.values(res[cur]).length === 0\n )\n return acc;\n\n return {\n ...acc,\n [cur]: { ...res[cur], id: cur },\n };\n }, {});\n })\n .then(res => {\n return Object.values(res);\n });\n};\n","//@ts-nocheck\nimport Big from 'big.js';\n\nimport { Pool } from '../types';\n\nBig.RM = 0;\nBig.DP = 40;\nBig.NE = -40;\nBig.PE = 40;\n\ninterface FormatedPool extends Pool {\n x?: string;\n y?: string;\n gamma_bps?: Big;\n}\n\n///////////////////////////////\n// Parallel Swap Logic Below //\n///////////////////////////////\n\n/** formatPoolNew\n * This function appends to the existing standard Pool struct and adds attributes that simplify the parallel swap algorithms.\n * Adds attributes \"x\" (for input token reserves in pool), \"y\" (for output token reserves in pool), and \"gamma_bps\" (for 1- fee in bps)\n * Our convention for our algorithm has been to use \"x\" as the input token and \"y\" as the output token.\n * @param pool AMM structure containing reserves of inputToken and outputToken\n * @param inputToken the name of the inputToken being traded in.\n * @param outputToken the name of the outputToken being traded out.\n * @returns newFormatPool\n */\nexport function formatPoolNew(\n pool: Pool,\n inputToken: string,\n outputToken: string\n) {\n let p: FormatedPool = pool;\n let x = p.supplies[inputToken];\n let y = p.supplies[outputToken];\n p['gamma_bps'] = new Big(10000).minus(p.fee);\n p['x'] = x;\n p['y'] = y;\n return p;\n}\n\n/** solveForMuFloat\n * This function takes the set of token pools, the total input of inputToken, and the names of inputToken and outputToken and\n * solves for the Lagrange Multiplier \"mu\". Note that mu must be allowed to be aritrary precision floating point number. Mu will\n * be used in subsequent function calls to determine the best allocations of intputToken to be made per pool.\n * For more detailed math on how this function was derived, please see the white paper:\n * https://github.com/giddyphysicist/ParallelSwapForRefFinance/blob/main/ParallelSwapWhitePaper.pdf\n * @param pools list of pools that contain inputToken and outputToken\n * @param totalDeltaX total allocation (among all pools) being input of inputToken\n * @param inputToken the name of the inputToken being traded in.\n * @param outputToken the name of the outputToken being traded out.\n * @returns mu the lagrange multiplier value calculated for a set of pools and inputToken amount.\n */\nexport function solveForMuFloat(\n pools: Pool[],\n totalDeltaX: string,\n inputToken: string,\n outputToken: string\n) {\n if (pools.length > 0) {\n let numerator = new Big(totalDeltaX);\n let denominator = new Big(0);\n\n for (var i = 0; i < pools.length; i++) {\n let p = formatPoolNew(pools[i], inputToken, outputToken);\n let numAdd = new Big(p.x).times(10000).div(p.gamma_bps);\n numerator = numerator.plus(numAdd);\n let denomAdd = new Big(p.x)\n .times(p.y)\n .div(p.gamma_bps)\n .sqrt()\n .times(100);\n denominator = denominator.plus(denomAdd);\n }\n\n const mu = new Big(numerator).div(denominator);\n return mu;\n } else {\n // console.log('ERROR - could not find pools that satisfy token pair');\n const mu = NaN;\n return mu;\n }\n}\n\n/** calculate_dx_float\n * Once mu has been calculated for a set of pools and total input amount, the next step is\n * determining the total allocation per pool. This function evaluates the amount of input Token to be\n * allocated to the given pool. Note, in our original algorithmic convention, the 'x' variable was for the input token,\n * and the 'y' variable was for the output token. Here, the value dx is the part of the full amount of input token X.\n * Again, the detailed formulae for these operations can be found in the white paper referenced above.\n * @param mu the lagrange multiplier value calculated for a set of pools and inputToken amount.\n * @param pool AMM structure containing reserves of inputToken and outputToken\n * @param inputToken the name of the inputToken being traded in.\n * @param outputToken the name of the outputToken being traded out.\n * @returns dxFloat the allocation amount determined for the given pool\n */\nexport function calculate_dx_float(\n mu: number | Big,\n pool: FormatedPool,\n inputToken: string,\n outputToken: string\n) {\n let p = formatPoolNew(pool, inputToken, outputToken);\n let radical = new Big(p.x).times(p.y).div(p.gamma_bps);\n let dxFloat = new Big(mu)\n .times(100)\n .times(radical.sqrt())\n .minus(new Big(p.x).times(10000).div(p.gamma_bps));\n return dxFloat;\n}\n\n/** calculate_dy_float\n * Once you have an allocation amount for a given pool, you can use the AMM constant-product formula to determine\n * the expected output amount of output Token.\n * Note, here, as earlier, our algorithmic convention uses \"y\" as the output token, and so \"dy\" is the fraction of\n * the total output of output Token, assuming there could be dy contributions from other parallel pools as well.\n * @param dx_float input allocation amount of inputToken for the given pool\n * @param pool a structure representing the reserves and fees for a given pool.\n * @param inputToken the name of the inputToken being traded in.\n * @param outputToken the name of the outputToken being traded out.\n * @returns dyFloat the expected trade out amount out of outputToken\n */\nexport function calculate_dy_float(\n dx_float: number,\n pool: FormatedPool,\n inputToken: string,\n outputToken: string\n) {\n if (dx_float <= 0) {\n return new Big(0);\n }\n let p = formatPoolNew(pool, inputToken, outputToken);\n let dx = new Big(dx_float);\n let denom = new Big(10000).times(p.x).plus(new Big(p.gamma_bps).times(dx));\n let numerator = new Big(p.y).times(dx).times(p.gamma_bps);\n let dyFloat = numerator.div(denom).round();\n return dyFloat;\n}\n\n/** calculateOptimalOutput\n * This is the main function, which calculates optimal values of inputToken to swap into each pool.\n * @param pools list of relevant AMM pools containing inputToken and outputToken\n * @param inputAmount the numeric total amount of inputToken to be traded into the group of swap pools.\n * @param inputToken the name of the inputToken being traded in.\n * @param outputToken the name of the outputToken being traded out.\n * @returns normalizedDxArray an array containing the amount allocations of inputToken per pool in the list of pools.\n */\nexport function calculateOptimalOutput(\n pools: Pool[],\n inputAmount: string,\n inputToken: string,\n outputToken: string\n) {\n let mu = solveForMuFloat(pools, inputAmount, inputToken, outputToken);\n let dxArray: Big[] = [];\n let negativeDxValsFlag = false;\n for (var i = 0; i < pools.length; i++) {\n let pool = formatPoolNew(pools[i], inputToken, outputToken);\n let dx = calculate_dx_float(mu, pool, inputToken, outputToken);\n if (dx.lt(0)) {\n negativeDxValsFlag = true;\n }\n let dxInt = new Big(dx).round();\n dxArray.push(dxInt);\n }\n if (negativeDxValsFlag) {\n dxArray = reducePools(pools, dxArray, inputAmount, inputToken, outputToken);\n }\n let dxArraySum = new Big(0);\n for (var i = 0; i < dxArray.length; i++) {\n dxArraySum = dxArraySum.plus(dxArray[i]);\n }\n let tempAllocationsArray = [];\n for (var i = 0; i < dxArray.length; i++) {\n let ndx = new Big(dxArray[i])\n .times(inputAmount)\n .div(dxArraySum)\n .round();\n tempAllocationsArray.push(ndx);\n }\n let allocationsArray = checkIntegerSumOfAllocations(\n tempAllocationsArray,\n inputAmount\n );\n let normalizedDxArray = [];\n for (var i = 0; i < allocationsArray.length; i++) {\n let ndx = allocationsArray[i];\n normalizedDxArray.push(BigInt(ndx));\n pools[i]['partialAmountIn'] = ndx.toString();\n }\n return normalizedDxArray;\n}\n\n/** reducePools\n * This function is used to implement part of the non-linear slack variables in the lagrange - multiplier\n * solution for parallel swap. Part of what comes out of the math is that sometimes, the optimal allocation for a pool\n * can be negative, which makes no physical sense. When this occurs, that particular pool needs to be flagged and the\n * lagrange constraint applied to force the allocation to be zero.\n * This function takes an already-solved set of pools, input allocation per pool, the total input amount, and the\n * inputToken name and outputToken name, and determines which, if any, allocations need to be set to zero.\n * However, when this occurs, and a pool is essentially ignored from the list, then the calculation for mu must be re-done.\n * So the calculateOptimalOutput function is then called on the reduced set of pools, and if no negative allocation values remain,\n * then the allocations on the reduced set is determined, and values of zero are put in for the 'failed' pools.\n * @param pools list of pools that contain inputToken and outputToken\n * @param dxArray list of input allocation per pool\n * @param inputAmount total amount of inputToken to be traded among the pools\n * @param inputToken the name of the inputToken\n * @param outputToken the name of the outputToken\n * @returns newFullDxVec the new full list of input allocations the same length as dxArray, containing zeros for failed pools.\n */\nexport function reducePools(\n pools: Pool[],\n dxArray: Big[],\n inputAmount: string,\n inputToken: string,\n outputToken: string\n) {\n let goodIndices = [];\n for (var i = 0; i < dxArray.length; i++) {\n let dx = dxArray[i];\n if (dx.gte(0)) {\n goodIndices.push(i);\n }\n }\n if (goodIndices.length < 1) {\n // console.log(\"ERROR OCCURRED -- ALL DX VALUES WERE NEGATIVE\")\n return dxArray;\n }\n let newPools = [];\n for (var j = 0; j < dxArray.length; j++) {\n if (goodIndices.includes(j)) {\n newPools.push(pools[j]);\n }\n }\n let newDxVec = calculateOptimalOutput(\n newPools,\n inputAmount,\n inputToken,\n outputToken\n );\n let goodInd2newdx = {};\n for (var k = 0; k < newDxVec.length; k++) {\n goodInd2newdx[goodIndices[k]] = newDxVec[k];\n }\n let newFullDxVec = [];\n for (var ii = 0; ii < pools.length; ii++) {\n if (goodIndices.includes(ii)) {\n newFullDxVec.push(goodInd2newdx[ii]);\n } else {\n newFullDxVec.push(0);\n }\n }\n return newFullDxVec;\n}\n\nexport function checkIntegerSumOfAllocations(\n allocations: Big[] | string[] | BigInt[],\n totalInput: Big | string | BigInt\n) {\n var totalInput = new Big(totalInput);\n var allocations:\n | Big[]\n | string[]\n | BigInt[] = allocations.map((item: Big | string | BigInt) =>\n new Big(item).round()\n );\n let alloSum = allocations\n .map(item => new Big(item))\n .reduce((a, b) => a.plus(b), new Big(0));\n let offset = totalInput.minus(alloSum);\n //get largest allocation.\n let currMax = new Big(0);\n let currMaxInd = 0;\n for (var i = 0; i < allocations.length; i++) {\n if (allocations[i].gt(currMax)) {\n currMaxInd = i;\n currMax = allocations[i];\n }\n }\n let newAllocations = [];\n for (var j = 0; j < allocations.length; j++) {\n if (j === currMaxInd) {\n newAllocations.push(allocations[j].plus(offset).toString());\n } else {\n newAllocations.push(allocations[j].toString());\n }\n }\n return newAllocations;\n}\n","/* eslint-disable no-undef */\n////////////////////////////////////////////////////////////////////////////\n// SMART ROUTE SWAP LOGIC\n////////////////////////////////////////////////////////////////////////////\nimport Big from 'big.js';\nimport { checkIntegerSumOfAllocations } from './parallelSwapLogic';\n\nimport { TokenMetadata } from '../types';\n\nimport { ftGetTokenMetadata } from '../ref';\n\nimport { percentLess, toNonDivisibleNumber } from '../utils';\nBig.RM = 0;\nBig.DP = 40;\nBig.NE = -40;\nBig.PE = 40;\n\nfunction bisqrt(value) {\n // For some ridiculous reason, the .sqrt() method for Big decimals is extremely slow (~10-20ms),\n // which isn't so bad until you need to use it a bunch of times.\n // Since we're dealing with super large numbers anyway, we can convert the Big decimal number into a BigInt,\n // then run this BigInt Newton iteration square root function instead, and then convert back into a\n // Big number. And it speeds up the operation by a crazy factor, ~10x faster.\n if (value < BigInt(0)) {\n throw 'square root of negative numbers is not supported';\n }\n\n if (value < BigInt(2)) {\n return value;\n }\n\n function newtonIteration(n, x0) {\n const x1 = (n / x0 + x0) >> BigInt(1);\n if (x0 === x1 || x0 === x1 - BigInt(1)) {\n return x0;\n }\n return newtonIteration(n, x1);\n }\n\n return newtonIteration(value, BigInt(1));\n}\n\nfunction getBetaForRoute(route, path) {\n if (!route.length) {\n route = [route];\n }\n if (route.length == 1) {\n let p = route[0];\n var beta = new Big(p.reserves[path[0]]);\n } else if (route.length == 2) {\n let p1 = route[0];\n let p2 = route[1];\n var beta = new Big(p1.reserves[path[0]]).times(\n new Big(p2.reserves[path[1]])\n );\n }\n return beta;\n}\n\nfunction getEpsilonForRoute(route, path) {\n if (!route.length) {\n route = [route];\n }\n if (route.length == 1) {\n // Single Hop case\n let p = route[0];\n let gamma = new Big(10000).minus(new Big(p.fee)).div(new Big(10000));\n var epsilon = Big(gamma);\n } else if (route.length == 2) {\n //Double Hop Case\n let p1 = route[0];\n let p2 = route[1];\n let gamma1 = new Big(10000).minus(new Big(p1.fee)).div(new Big(10000));\n let gamma2 = new Big(10000).minus(new Big(p2.fee)).div(Big(10000));\n var epsilon = new Big(p2.reserves[path[1]])\n .times(new Big(gamma1))\n .plus(new Big(p1.reserves[path[1]]).times(gamma1).times(gamma2));\n }\n return epsilon;\n}\n\nfunction getAlphaForRoute(route, path) {\n if (!route.length) {\n route = [route];\n }\n if (route.length == 1) {\n //console.log('single hop')\n let p = route[0];\n let inputToken = path[0];\n let outputToken = path[1];\n let gamma = new Big(10000).minus(new Big(p.fee)).div(new Big(10000));\n let key1 = p.token1Id;\n let key2 = p.token2Id;\n let val1 = p.token1Supply;\n let val2 = p.token2Supply;\n p['reserves'] = { [key1]: val1, [key2]: val2 };\n var alpha = new Big(p.reserves[inputToken]).times(\n new Big(p.reserves[outputToken]).times(new Big(gamma))\n );\n } else if (route.length == 2) {\n //console.log('double hop')\n let p1 = route[0];\n let p2 = route[1];\n let key11 = p1.token1Id;\n let key12 = p1.token2Id;\n let val11 = p1.token1Supply;\n let val12 = p1.token2Supply;\n p1['reserves'] = { [key11]: val11, [key12]: val12 };\n let key21 = p2.token1Id;\n let key22 = p2.token2Id;\n let val21 = p2.token1Supply;\n let val22 = p2.token2Supply;\n p2['reserves'] = { [key21]: val21, [key22]: val22 };\n let inputToken = path[0];\n let middleToken = path[1];\n let outputToken = path[2];\n let gamma1 = new Big(10000).minus(Big(p1.fee)).div(new Big(10000));\n let gamma2 = new Big(10000).minus(new Big(p2.fee)).div(new Big(10000));\n let alpha1 = new Big(p1.reserves[inputToken])\n .times(new Big(p1.reserves[middleToken]))\n .times(gamma1);\n let alpha2 = new Big(p2.reserves[middleToken])\n .times(new Big(p2.reserves[outputToken]))\n .times(gamma2);\n var alpha = alpha1.times(alpha2);\n }\n return alpha;\n}\n\nfunction getAlphaSumFromRoutes(routes, nodeRoutes) {\n let alphaSum = new Big(0);\n for (var i in routes) {\n let route = routes[i];\n let nodeRoute = nodeRoutes[i];\n let alpha = getAlphaForRoute(route, nodeRoute);\n // console.log('alpha is...');\n // console.log(alpha.toString());\n // below, we are replacing the built-in Big sqrt() method with a\n // newton-iteration BigInt sqrt function, to speed it up by 10x.\n let radical = new Big(bisqrt(BigInt(new Big(alpha).round().toFixed())));\n // let radical = new Big(alpha).sqrt();\n let epsilon = getEpsilonForRoute(route, nodeRoute);\n let denom = new Big(epsilon);\n alphaSum = alphaSum.plus(radical.div(denom));\n }\n return alphaSum;\n}\n\nfunction getBetaSumFromRoutes(routes, nodeRoutes) {\n let betaSum = new Big(0);\n for (var i in routes) {\n let route = routes[i];\n let nodeRoute = nodeRoutes[i];\n let num = new Big(getBetaForRoute(route, nodeRoute));\n let denom = new Big(getEpsilonForRoute(route, nodeRoute));\n betaSum = betaSum.plus(num.div(denom));\n }\n return betaSum;\n}\n\nfunction getPhiFromRoutes(routes, nodeRoutes, totalInput) {\n let alphaSum = getAlphaSumFromRoutes(routes, nodeRoutes);\n let betaSum = getBetaSumFromRoutes(routes, nodeRoutes);\n let phi = new Big(totalInput).plus(betaSum).div(alphaSum);\n return phi;\n}\n\nfunction getAllocationForRoute(phi, route, path) {\n let alpha = getAlphaForRoute(route, path);\n let beta = getBetaForRoute(route, path);\n let epsilon = getEpsilonForRoute(route, path);\n // below, we are replacing the built-in Big sqrt() method with a\n // newton-iteration BigInt sqrt function, to speed it up by 10x.\n let allocation = new Big(phi)\n .abs()\n .times(new Big(bisqrt(BigInt(new Big(alpha).round().toFixed()))))\n .minus(beta)\n .div(epsilon);\n return allocation;\n}\n\nfunction getAllocationVectorForRoutes(phi, routes, nodeRoutes) {\n let allocationVec = [];\n for (var i in routes) {\n allocationVec.push(getAllocationForRoute(phi, routes[i], nodeRoutes[i]));\n }\n return allocationVec;\n}\n\nfunction getOptimalAllocationForRoutes(routes, nodeRoutes, totalInput) {\n // console.log(\"CALLING GET OPTIMAL ALLOCATION FOR ROUTES:\")\n // console.log(routes)\n var totalInput = new Big(totalInput);\n let phi = getPhiFromRoutes(routes, nodeRoutes, totalInput);\n // console.log('PHI CALCULATED TO BE...')\n // console.log(phi.toString())\n let allocations = getAllocationVectorForRoutes(phi, routes, nodeRoutes);\n if (allocations.every(item => item.lt(new Big(0)))) {\n allocations = allocations.map(item => item.times(new Big(-1.0)));\n }\n if (allocations.some(item => item.lt(new Big(0)))) {\n allocations = reduceRoutes(routes, nodeRoutes, allocations, totalInput);\n }\n let sumAllocations = allocations.reduce((a, b) => a.plus(b), new Big(0));\n let normalizedAllocations = allocations.map(a =>\n a.div(sumAllocations).times(new Big(totalInput))\n );\n return normalizedAllocations;\n}\n\nfunction reduceRoutes(routes, nodeRoutes, allocationVec, totalInput) {\n // console.log(\"RUNNING REDUCE ROUTES\")\n var totalInput = new Big(totalInput);\n let goodIndices = [];\n for (var i in allocationVec) {\n let dx = allocationVec[i];\n // console.log('DX IS...')\n // console.log(dx.toString())\n if (dx.gt(new Big(0))) {\n goodIndices.push(i);\n }\n }\n // console.log('GOOD INDICES ARE...');\n // console.log(goodIndices);\n let newRoutes = [];\n let newNodeRoutes = [];\n for (var i in goodIndices) {\n let goodIndex = goodIndices[i];\n newRoutes.push(routes[goodIndex]);\n newNodeRoutes.push(nodeRoutes[goodIndex]);\n }\n allocationVec = getOptimalAllocationForRoutes(\n newRoutes,\n newNodeRoutes,\n totalInput\n );\n let allocationDict = {};\n for (var i in goodIndices) {\n allocationDict[goodIndices[i]] = allocationVec[i];\n }\n var allocationVecNew = [];\n for (var i in routes) {\n if (goodIndices.includes(i)) {\n allocationVecNew.push(allocationDict[i]);\n } else {\n let zeroAllocation = new Big(0);\n allocationVecNew.push(zeroAllocation);\n }\n }\n return allocationVecNew;\n}\n\nfunction getNodeRoutesFromPathsAndPoolChains(paths, poolChains) {\n let multiplicity = [];\n for (var i in poolChains) {\n let pc = poolChains[i];\n let mul = pc\n .map(item => item.length)\n .reduce((elem1, elem2) => elem1 * elem2, 1);\n multiplicity.push(mul);\n }\n let nodeRoutes = [];\n for (var j in paths) {\n let path = paths[j];\n let m = multiplicity[j];\n for (var k = 0; k < m; k++) {\n nodeRoutes.push(path);\n }\n }\n return nodeRoutes;\n}\n\nfunction getPoolChainFromPaths(paths, pools, threshold = 0.001) {\n let poolChains = [];\n for (var pathInd in paths) {\n let path = paths[pathInd];\n let chain = [];\n let pairs = [];\n for (var i = 0; i < path.length - 1; i++) {\n pairs.push([path[i], path[i + 1]]);\n }\n for (var pairInd in pairs) {\n let pair = pairs[pairInd];\n // console.log(pair);\n let tokenPools = getPoolsByToken1ANDToken2(pools, pair[0], pair[1]);\n chain.push(tokenPools);\n }\n poolChains.push(chain);\n }\n // return poolChains;\n let culledPoolChains = getCulledPoolChains(poolChains, threshold);\n\n return culledPoolChains;\n}\n\nfunction getCulledPoolChains(poolChains, threshold = 0.001) {\n let newChains = [];\n for (var pathInd in poolChains) {\n let path = poolChains[pathInd];\n let newPath = [];\n for (var legInd in path) {\n let leg = path[legInd];\n let culledPath = cullPoolsWithInsufficientLiquidity(leg, threshold);\n newPath.push(culledPath);\n }\n newChains.push(newPath);\n }\n return newChains;\n}\n\nfunction getRoutesFromPoolChain(poolChains) {\n let routes = [];\n for (var pci in poolChains) {\n let poolChain = poolChains[pci];\n //get cartesian product of each pool chain to get the list of routes.\n let newRoutes = cartesianProduct(poolChain);\n routes.push(...newRoutes);\n }\n for (var i in routes) {\n if (!routes[i].length) {\n routes[i] = [routes[i]];\n }\n }\n return routes;\n}\n\nfunction getOutputSingleHop(pool, inputToken, outputToken, totalInput) {\n var totalInput = new Big(totalInput);\n // check if pool is forward or backward for inputToken/outputToken cf. token1Id/token2Id\n if (inputToken === pool.token1Id && outputToken === pool.token2Id) {\n // forward Pool\n var reserves = {\n [inputToken]: new Big(pool.token1Supply),\n [outputToken]: new Big(pool.token2Supply),\n };\n } else if (inputToken === pool.token2Id && outputToken === pool.token1Id) {\n // reverse pool\n var reserves = {\n [outputToken]: new Big(pool.token1Supply),\n [inputToken]: new Big(pool.token2Supply),\n };\n } else {\n return new Big(0);\n }\n let gamma = new Big(10000).minus(new Big(pool.fee)).div(new Big(10000));\n // console.log(totalInput)\n // console.log(gamma)\n // console.log(reserves)\n let num = totalInput.times(gamma).times(reserves[outputToken]);\n let denom = reserves[inputToken].plus(gamma.times(totalInput));\n return num.div(denom);\n}\n\nfunction getOutputDoubleHop(\n pools,\n inputToken,\n middleToken,\n outputToken,\n totalInput\n) {\n var totalInput = new Big(totalInput);\n for (var poolIndex in pools) {\n let p = pools[poolIndex];\n p['gamma'] = new Big(10000).minus(new Big(p.fee)).div(new Big(10000));\n }\n let p1 = pools[0];\n let p2 = pools[1];\n\n if (inputToken === p1.token1Id && middleToken === p1.token2Id) {\n // forward Pool\n p1['reserves'] = {\n [inputToken]: new Big(p1.token1Supply),\n [middleToken]: new Big(p1.token2Supply),\n };\n } else if (middleToken === p1.token1Id && inputToken === p1.token2Id) {\n //reverse pool\n p1['reserves'] = {\n [middleToken]: new Big(p1.token1Supply),\n [inputToken]: new Big(p1.token2Supply),\n };\n }\n\n if (middleToken === p2.token1Id && outputToken === p2.token2Id) {\n // forward Pool\n p2['reserves'] = {\n [middleToken]: new Big(p2.token1Supply),\n [outputToken]: new Big(p2.token2Supply),\n };\n } else if (outputToken === p2.token1Id && middleToken === p2.token2Id) {\n //reverse pool\n p2['reserves'] = {\n [outputToken]: new Big(p2.token1Supply),\n [middleToken]: new Big(p2.token2Supply),\n };\n }\n\n let c1 = new Big(p1.reserves[middleToken]);\n let a1 = new Big(p1.reserves[inputToken]);\n let c2 = new Big(p2.reserves[middleToken]);\n let b2 = new Big(p2.reserves[outputToken]);\n let gamma1 = p1.gamma;\n let gamma2 = p2.gamma;\n let num = totalInput\n .times(c1)\n .times(b2)\n .times(gamma1)\n .times(gamma2);\n let denom = c2\n .times(a1)\n .plus(\n totalInput.times(c2.times(gamma1).plus(c1.times(gamma1).times(gamma2)))\n );\n // denom = c2*a1 + totalInput * (c2*gamma1 + c1*gamma1*gamma2)\n\n return num.div(denom);\n}\n\nfunction getOutputFromRoute(route, nodeRoute, allocation) {\n if (new Big(allocation).eq(new Big(0))) {\n return new Big(0);\n } else {\n var allocation = new Big(allocation);\n }\n if (!route.length) {\n route = [route];\n }\n if (route.length == 1) {\n // single hop\n let inputToken = nodeRoute[0];\n let outputToken = nodeRoute[1];\n let pool = route[0];\n var output = getOutputSingleHop(pool, inputToken, outputToken, allocation);\n } else if (route.length == 2) {\n // DOUBLE HOP\n let inputToken = nodeRoute[0];\n let middleToken = nodeRoute[1];\n let outputToken = nodeRoute[2];\n let pools = route;\n var output = getOutputDoubleHop(\n pools,\n inputToken,\n middleToken,\n outputToken,\n allocation\n );\n }\n return output;\n}\n\nfunction getOptOutputVec(routes, nodeRoutes, totalInput) {\n let allocations = getOptimalAllocationForRoutes(\n routes,\n nodeRoutes,\n totalInput\n );\n let result = [];\n for (var i in routes) {\n let route = routes[i];\n let nodeRoute = nodeRoutes[i];\n let allocation = allocations[i];\n let output = getOutputFromRoute(route, nodeRoute, allocation);\n result.push(output);\n }\n return {\n result: result,\n allocations: allocations,\n };\n //NOTE -- I made this return an object instead of the tuple returned in python. need to check the places it is called, and specify\n // result field instead of tuple 0 position, and allocations field instead of tuple 1 position.\n}\n\nfunction getBestOptInputAndOutputSlower(routes, nodeRoutes, totalInput) {\n let refDict = getOptOutputVecRefined(routes, nodeRoutes, totalInput);\n let outputRefined = refDict.result;\n let inputRefined = refDict.allocations;\n inputRefined = checkIntegerSumOfAllocations(inputRefined, totalInput);\n let rawDict = getOptOutputVec(routes, nodeRoutes, totalInput);\n let outputRaw = rawDict.result;\n let inputRaw = rawDict.allocations;\n inputRaw = checkIntegerSumOfAllocations(inputRaw, totalInput);\n let res1 = new Big(0);\n let res2 = new Big(0);\n\n for (var n in outputRefined) {\n res1 = res1.plus(outputRefined[n]);\n }\n for (var nn in outputRaw) {\n res2 = res2.plus(outputRaw[nn]);\n }\n // console.log('COMPARING SINGLE HOPS VS DOUBLE')\n // console.log(res1.toString())\n // console.log(res2.toString())\n if (res1.gt(res2)) {\n return { input: inputRefined, output: res1 };\n } else {\n return { input: inputRaw, output: res2 };\n }\n}\n\nfunction getBestOptInputAndOutput(routes, nodeRoutes, totalInput) {\n // let refDict = getOptOutputVecRefined(routes, nodeRoutes, totalInput);\n // let outputRefined = refDict.result;\n // let inputRefined = refDict.allocations;\n // inputRefined = checkIntegerSumOfAllocations(inputRefined, totalInput);\n let rawDict = getOptOutputVec(routes, nodeRoutes, totalInput);\n let outputRaw = rawDict.result;\n let inputRaw = rawDict.allocations;\n inputRaw = checkIntegerSumOfAllocations(inputRaw, totalInput);\n let res1 = new Big(0);\n let res2 = new Big(0);\n\n let res = outputRaw\n .map(v => new Big(v))\n .reduce((bv1, bv2) => bv1.plus(bv2), new Big(0));\n\n return {\n input: inputRaw,\n output: res,\n };\n}\n\nfunction getBestOptOutput(routes, nodeRoutes, totalInput) {\n let outputRefined = getOptOutputVecRefined(routes, nodeRoutes, totalInput)\n .result;\n let outputRaw = getOptOutputVec(routes, nodeRoutes, totalInput).result;\n let res1 = new Big(0);\n let res2 = new Big(0);\n\n for (var n in outputRefined) {\n res1 = res1.plus(outputRefined[n]);\n }\n for (var nn in outputRaw) {\n res2 = res2.plus(outputRaw[nn]);\n }\n if (res1.gt(res2)) {\n return res1;\n } else {\n return res2;\n }\n}\n\nfunction getBestOptInput(routes, nodeRoutes, totalInput) {\n let refDict = getOptOutputVecRefined(routes, nodeRoutes, totalInput);\n let outputRefined = refDict.result;\n let inputRefined = refDict.allocations;\n inputRefined = checkIntegerSumOfAllocations(inputRefined, totalInput);\n let rawDict = getOptOutputVec(routes, nodeRoutes, totalInput);\n let outputRaw = rawDict.result;\n let inputRaw = rawDict.allocations;\n inputRaw = checkIntegerSumOfAllocations(inputRaw, totalInput);\n let res1 = new Big(0);\n let res2 = new Big(0);\n\n for (var n in outputRefined) {\n res1 = res1.plus(outputRefined[n]);\n }\n for (var nn in outputRaw) {\n res2 = res2.plus(outputRaw[nn]);\n }\n // console.log('COMPARING SINGLE HOPS VS DOUBLE')\n // console.log(res1.toString())\n // console.log(res2.toString())\n if (res1.gt(res2)) {\n return inputRefined;\n } else {\n return inputRaw;\n }\n}\n\nfunction getOptOutputVecRefined(routes, nodeRoutes, totalInput) {\n // need to calculate full result.\n // if direct pools exist, need to calculate parallel result. if not, this portion is set to zero output.\n\n // need to compare between outputs of the two results above.\n\n let initLengthRoutes = routes.length;\n let directRouteInds = [];\n for (var routeInd in routes) {\n let route = routes[routeInd];\n if (!route.length) {\n route = [route];\n }\n if (route.length == 1) {\n directRouteInds.push(routeInd);\n }\n }\n // console.log('DIRECT ROUTE INDS ARE')\n // console.log(directRouteInds)\n // if (directRouteInds.length < 1) {\n var fullResultAllocations = getOptimalAllocationForRoutes(\n routes,\n nodeRoutes,\n totalInput\n );\n var fullResult = [];\n for (var i in routes) {\n let r = routes[i];\n let nr = nodeRoutes[i];\n let a = fullResultAllocations[i];\n let output = getOutputFromRoute(r, nr, a);\n fullResult.push(output);\n }\n var fullResultTotal = fullResult.reduce((a, b) => a.plus(b), new Big(0));\n\n // } else {\n if (directRouteInds.length > 0) {\n // console.log('DOING SINGLE HOP ONLY')\n let droutes = [];\n let dnodeRoutes = [];\n for (var dri in directRouteInds) {\n let ind = directRouteInds[dri];\n droutes.push(routes[ind]);\n dnodeRoutes.push(nodeRoutes[ind]);\n }\n let dallocations = getOptimalAllocationForRoutes(\n droutes,\n dnodeRoutes,\n totalInput\n );\n let dallocDict = {};\n for (var dd in dallocations) {\n dallocDict[directRouteInds[dd]] = dallocations[dd];\n }\n var pallocations = [];\n\n for (var ii = 0; ii < initLengthRoutes; ii++) {\n if (directRouteInds.includes(ii.toString())) {\n //console.log('ADDING ALLOCATION FOR SINGLE ROUTE')\n pallocations.push(dallocDict[ii]);\n } else {\n pallocations.push(new Big(0));\n }\n }\n var presult = [];\n for (var j in routes) {\n let route = routes[j];\n let nodeRoute = nodeRoutes[j];\n let allocation = pallocations[j];\n let output = getOutputFromRoute(route, nodeRoute, allocation);\n presult.push(output);\n }\n var presultTotal = presult.reduce((a, b) => a.plus(b), new Big(0));\n } else {\n var presultTotal = new Big(0);\n }\n if (presultTotal.gt(fullResultTotal)) {\n var result = presult;\n var allocations = pallocations;\n } else {\n var result = fullResult;\n var allocations = fullResultAllocations;\n }\n // NEED TO COMPARE BETWEEEN DIRECT AND MULTI HOP TO GET BEST OUTPUT\n return {\n result: result,\n allocations: allocations,\n };\n}\n\nasync function getBestOptimalAllocationsAndOutputs(\n pools,\n inputToken,\n outputToken,\n totalInput,\n maxPathLength = 3,\n threshold = 0.001\n) {\n var totalInput = new Big(totalInput);\n let paths = await getPathsFromPools(\n pools,\n inputToken,\n outputToken,\n maxPathLength\n );\n if (!paths.length) {\n return {\n allocations: [],\n outputs: new Big(0),\n routes: [],\n nodeRoutes: [],\n };\n }\n let poolChains = await getPoolChainFromPaths(paths, pools, threshold);\n\n let routes = await getRoutesFromPoolChain(poolChains);\n let nodeRoutes = await getNodeRoutesFromPathsAndPoolChains(paths, poolChains);\n // let allocations = await getBestOptInput(routes, nodeRoutes, totalInput);\n // // fix integer rounding for allocations:\n // allocations = checkIntegerSumOfAllocations(allocations, totalInput);\n // let outputs = getBestOptOutput(routes, nodeRoutes, totalInput);\n let inputOutput = await getBestOptInputAndOutput(\n routes,\n nodeRoutes,\n totalInput\n );\n let allocations = inputOutput.input;\n let outputs = inputOutput.output;\n\n return {\n allocations: allocations,\n outputs: outputs,\n routes: routes,\n nodeRoutes: nodeRoutes,\n };\n}\n\nfunction getHopsFromRoutes(routes, nodeRoutes, allocations) {\n let hops = [];\n for (var i in routes) {\n var route = routes[i];\n var nodeRoute = nodeRoutes[i];\n var allocation = allocations[i];\n if (!route.length) {\n route = [route];\n }\n if (!route[0]) {\n continue;\n }\n let hop = {\n pool: route[0],\n allocation: allocation,\n inputToken: nodeRoute[0],\n outputToken: nodeRoute[1],\n };\n hops.push(hop);\n }\n return hops;\n}\n\nfunction distillHopsByPool(hops) {\n // console.log('some HOPS =');\n // console.log(hops);\n let distilledHops = [];\n let poolIds = [];\n let poolId2allocation = {};\n for (var i in hops) {\n let hop = hops[i];\n if (hop.allocation === '0') {\n continue;\n }\n // console.log(`HOP ${i} IS...`);\n // console.log(hop);\n let poolId = hop.pool['id'];\n if (poolIds.includes(poolId)) {\n poolId2allocation[poolId] = new Big(poolId2allocation[poolId])\n .plus(new Big(hop.allocation))\n .toString();\n } else {\n poolId2allocation[poolId] = new Big(hop.allocation).toString();\n poolIds.push(poolId);\n }\n }\n // let poolsWithOrder = [...new Set(...hops.map((item) => item.pool))]\n let keys = Object.keys(poolId2allocation);\n for (var j in keys) {\n var poolId = keys[j];\n let hop = hops.filter(\n item => item.pool.id.toString() === poolId.toString()\n )[0];\n let distilledHop = {\n pool: hop.pool,\n allocation: poolId2allocation[poolId],\n inputToken: hop.inputToken,\n outputToken: hop.outputToken,\n };\n distilledHops.push(distilledHop);\n }\n return distilledHops;\n}\n\nfunction getDistilledHopActions(distilledHops, slippageTolerance) {\n let actions = [];\n for (var i in distilledHops) {\n let hop = distilledHops[i];\n let expectedAmountOut = getOutputSingleHop(\n hop.pool,\n hop.inputToken,\n hop.outputToken,\n hop.allocation\n );\n let minimumAmountOut = new Big(expectedAmountOut)\n .times(new Big(1).minus(new Big(slippageTolerance).div(100)))\n .round()\n .toString(); //Here, assume slippage tolerance is a percentage. So 1% would be 1.0\n let action = {\n pool_id: hop.pool.id,\n token_in: hop.inputToken,\n token_out: hop.outputToken,\n amount_in: hop.allocation,\n min_amount_out: minimumAmountOut,\n };\n actions.push(action);\n }\n return actions;\n}\nfunction getMiddleTokenTotalsFromFirstHopActions(firstHopActions) {\n let middleTokens = [...new Set(firstHopActions.map(item => item.token_out))];\n let middleTokenTotals = {};\n for (var i in middleTokens) {\n let middleToken = middleTokens[i];\n let mtActions = firstHopActions.filter(\n item => item.token_out === middleToken\n );\n let mtTotal = mtActions\n .map(item => new Big(item.min_amount_out))\n .reduce((a, b) => a.plus(b), new Big(0))\n .toString();\n middleTokenTotals[middleToken] = mtTotal;\n }\n return middleTokenTotals;\n}\nfunction getRoutesAndAllocationsForMiddleToken(\n routes,\n nodeRoutes,\n allocations,\n middleToken,\n middleTokenTotal\n) {\n // get routes that use middle token.\n // (input route alloction) /sum(input allocations of routes with middle token) * (total_middleToken)\n let mask = [];\n for (var i in nodeRoutes) {\n if (nodeRoutes[i][1] === middleToken) {\n mask.push(true);\n } else {\n mask.push(false);\n }\n }\n let froutes = [];\n let fallocations = [];\n let fnoderoutes = [];\n for (var i in routes) {\n if (mask[i]) {\n froutes.push(routes[i]);\n fallocations.push(allocations[i]);\n fnoderoutes.push(nodeRoutes[i]);\n }\n }\n let sumfallocations = fallocations.reduce(\n (a, b) => new Big(a).plus(new Big(b)),\n new Big(0)\n );\n let middleAllocations = fallocations.map(item =>\n new Big(item).div(sumfallocations).times(new Big(middleTokenTotal))\n );\n let secondHopRoutes = froutes.map(item => [item[1]]);\n let secondHopNodeRoutes = fnoderoutes.map(item => [item[1], item[2]]);\n middleAllocations = checkIntegerSumOfAllocations(\n middleAllocations,\n middleTokenTotal\n );\n return {\n routes: secondHopRoutes,\n nodeRoutes: secondHopNodeRoutes,\n allocations: middleAllocations,\n };\n}\n\nfunction getHopActionsFromRoutes(routes, nodeRoutes, allocations) {\n // console.log('INSIDE GET HOP ACTIONS FROM ROUTES');\n // console.log('ROUTES ARE...');\n // console.log(routes);\n // console.log('NODE ROUTES ARE...');\n // console.log(nodeRoutes);\n // console.log('ALLOCATIONS ARE...');\n // console.log(allocations);\n let totalInput = allocations\n .map(a => new Big(a))\n .reduce((a, b) => a.plus(b), new Big(0))\n .toString();\n let hops = [];\n for (var i in routes) {\n var route = routes[i];\n var nodeRoute = nodeRoutes[i];\n var allocation = allocations[i];\n if (new Big(allocation).eq(new Big(0))) {\n continue;\n }\n if (!route.length) {\n route = [route];\n }\n if (!route[0]) {\n continue;\n }\n for (var j in route) {\n let pool = route[j];\n // console.log('J IS...');\n // console.log(j);\n // console.log('NODE ROUTE IS...');\n // console.log(nodeRoute);\n if (j == 0) {\n //first hop.\n // console.log(nodeRoute[0]);\n // console.log(nodeRoute[1]);\n var hop = {\n pool: pool,\n allocation: allocation.toString(),\n inputToken: nodeRoute[0],\n outputToken: nodeRoute[1],\n nodeRoute: nodeRoute,\n route: route,\n allRoutes: routes,\n allNodeRoutes: nodeRoutes,\n totalInputAmount: totalInput,\n allAllocations: allocations,\n };\n // console.log('FIRST HOP IS...');\n // console.log(hop);\n hops.push(hop);\n if (nodeRoute.length > 2) {\n var middleTokenAllocation = getOutputSingleHop(\n pool,\n nodeRoute[0],\n nodeRoute[1],\n allocation\n );\n }\n } else {\n // second hop\n var hop = {\n pool: pool,\n allocation: middleTokenAllocation.toString(),\n inputToken: nodeRoute[1],\n outputToken: nodeRoute[2],\n nodeRoute: nodeRoute,\n route: route,\n allRoutes: routes,\n allNodeRoutes: nodeRoutes,\n totalInputAmount: totalInput,\n allAllocations: allocations,\n };\n // console.log('SECOND HOP IS...');\n // console.log(hop);\n hops.push(hop);\n }\n }\n }\n // console.log('HOP ACTIONS FOUND TO BE');\n // console.log(hops);\n return hops;\n}\n\n// TODO: Clean this function. I don't need all the \"actions\" just the hops.\n// TODO: re-order actions to ensure each route is complete with zero input for second hop before starting next route.\nfunction getActionListFromRoutesAndAllocations(\n routes,\n nodeRoutes,\n allocations\n) {\n // REPLACE THE CODE BELOW WITH THE FUNCTION HERE.\n return getHopActionsFromRoutes(routes, nodeRoutes, allocations);\n var actions = [];\n var all_hops = [];\n let firstHops = getHopsFromRoutes(routes, nodeRoutes, allocations);\n\n firstHops = firstHops.filter(hop => new Big(hop.allocation).gt(new Big(0)));\n all_hops.push(...firstHops);\n let distilledFirstHops = distillHopsByPool(firstHops);\n let firstHopActions = getDistilledHopActions(\n distilledFirstHops,\n slippageTolerance\n );\n actions.push(...firstHopActions);\n let middleTokenTotals = getMiddleTokenTotalsFromFirstHopActions(\n firstHopActions\n );\n // console.log('first hop actions are...');\n // console.log(firstHopActions);\n let middleTokens = Object.keys(middleTokenTotals);\n // console.log('middle token totals are...');\n // console.log(middleTokenTotals);\n // console.log('middle tokens are...');\n // console.log(middleTokens);\n for (var tokenIndex in middleTokens) {\n var secondHops = [];\n let middleToken = middleTokens[tokenIndex];\n // console.log('current middle token is ');\n // console.log(middleToken);\n let middleTokenTotal = middleTokenTotals[middleToken];\n // console.log('current middle token total is...');\n // console.log(middleTokenTotal);\n let middleTokenRoutesWithAllocations = getRoutesAndAllocationsForMiddleToken(\n routes,\n nodeRoutes,\n allocations,\n middleToken,\n middleTokenTotal\n );\n // console.log('current middle tokens routes with allocations are...');\n // console.log(middleTokenRoutesWithAllocations);\n let middleTokenRoutes = middleTokenRoutesWithAllocations.routes;\n let middleTokenAllocations = middleTokenRoutesWithAllocations.allocations;\n let middleTokenNodeRoutes = middleTokenRoutesWithAllocations.nodeRoutes;\n // console.log('middle token routes are...');\n // console.log(middleTokenRoutes);\n // console.log('middle token allocations are...');\n // console.log(middleTokenAllocations);\n // console.log('middle token node routes are...');\n // console.log(middleTokenNodeRoutes);\n secondHops.push(\n ...getHopsFromRoutes(\n middleTokenRoutes,\n middleTokenNodeRoutes,\n middleTokenAllocations\n )\n );\n // console.log('CURRENT SECOND HOPS', secondHops);\n // console.log(secondHops.length);\n // console.log(secondHops.map((hop) => hop.allocation));\n // console.log('filter out zero allocation 2nd hops:');\n secondHops = secondHops.filter(hop =>\n new Big(hop.allocation).gt(new Big(0))\n );\n // console.log(secondHops);\n all_hops.push(...secondHops);\n // console.log('second hops are currently...');\n // console.log(secondHops);\n let distilledSecondHopsForToken = distillHopsByPool(secondHops);\n // console.log('distilled second hops are...');\n let secondHopActionsForToken = getDistilledHopActions(\n distilledSecondHopsForToken,\n slippageTolerance\n );\n // console.log(secondHopActionsForToken);\n actions.push(...secondHopActionsForToken);\n }\n\n //TODO: NEED TO RUN INTEGER ROUNDING FUNCTION ON MIDDLE TOKEN ALLOCATIONS\n\n // TODO: check the node routes. for double-hop cases, find the hop action for each hop.\n // For now, we are assuming no parallel swaps if there is a double-hop.\n\n // Possible cases:\n // (1) 1 single-hop.\n // (2) Parallel single-hop ?\n // (3) 1 double-hop\n // (4) 2 double-hops\n\n // We only have to worry about re-ordering the actions for cases (3) and (4).\n\n let orderedHops = orderHops(all_hops, routes, nodeRoutes, allocations);\n\n // console.log('ALL HOPS', all_hops);\n return orderedHops;\n // return actions;\n}\n\nfunction orderHops(hops, routes, nodeRoutes, allocations) {\n // first get rid of zero allocation routes\n // console.log('NODE ROUTES ARE...');\n // console.log(nodeRoutes);\n let filteredRoutes = [];\n let filteredNodeRoutes = [];\n let filteredAllocations = [];\n for (var i in routes) {\n // remove zero-allocation routes.\n let allocation = new Big(allocations[i]);\n if (allocation.gt(new Big(0))) {\n filteredAllocations.push(allocation);\n filteredRoutes.push(routes[i]);\n filteredNodeRoutes.push(nodeRoutes[i]);\n }\n // console.log('FILTERED NODE ROUTES ARE...');\n // console.log(filteredNodeRoutes);\n }\n // next check node routes to see if it is case 1, 2, 3, or 4.\n // Possible cases:\n // (1) 1 single-hop.\n // (2) Parallel single-hop ?\n // (3) 1 double-hop\n // (4) 2 double-hops\n\n if (filteredNodeRoutes.length === 1) {\n // only one route.\n let currentNodeRoute = filteredNodeRoutes[0];\n if (currentNodeRoute.length === 2) {\n // case 1.\n return hops;\n } else {\n // case 3. assume there are only 3 nodes (double-hop)\n //make sure order of hops is such that input token precedes output token.\n //make sure the amount_in for second hop is zero (which will grab all of output of first hop to use.)\n let firstHop = hops.filter(\n hop => hop.inputToken === currentNodeRoute[0]\n )[0];\n let secondHop = hops.filter(\n hop => hop.inputToken === currentNodeRoute[1]\n )[0];\n // set second hop amount in to 0 so that it will use whatever was generated by hop 1.\n secondHop.pool.partialAmountIn = '0';\n\n let orderedHops = [firstHop, secondHop];\n return orderedHops;\n }\n } else if (filteredNodeRoutes.length === 2) {\n // two routes.\n let lengthNodeRoutes = filteredNodeRoutes.map(nr => nr.length);\n // sub cases:\n // [2,2] -- parallel swap. (direct) -- case 2\n // [2,3] -- direct swap in parallel with double hop.\n // [3,2] -- double hop in parallel with direct swap.\n // [3,3] -- double hop in parallel with double hop. -- case 4\n let orderedHops = [];\n if (arrayEquals(lengthNodeRoutes, [2, 2])) {\n return hops;\n } else if (arrayEquals(lengthNodeRoutes, [2, 3])) {\n directNodeRoute = filteredNodeRoutes[0];\n doubleNodeRoute = filteredNodeRoutes[1];\n let firstHop = hops.filter(\n hop =>\n hop.inputToken === directNodeRoute[0] &&\n hop.outputToken === directNodeRoute[1]\n )[0];\n let secondHop = hops.filter(\n hop => hop.inputToken === doubleNodeRoute[0]\n )[0];\n let thirdHop = hops.filter(\n hop => hop.outputToken === doubleNodeRoute[2]\n )[0];\n // set third hop amount in to 0 so that it will use whatever was generated by hop 2.\n thirdHop.pool.partialAmountIn = '0';\n orderedHops = [firstHop, secondHop, thirdHop];\n return orderedHops;\n } else if (arrayEquals(lengthNodeRoutes, [3, 2])) {\n directNodeRoute = filteredNodeRoutes[1];\n doubleNodeRoute = filteredNodeRoutes[0];\n let firstHop = hops.filter(\n hop =>\n hop.inputToken === directNodeRoute[0] &&\n hop.outputToken === directNodeRoute[1]\n )[0];\n let secondHop = hops.filter(\n hop => hop.inputToken === doubleNodeRoute[0]\n )[0];\n let thirdHop = hops.filter(\n hop => hop.outputToken === doubleNodeRoute[2]\n )[0];\n // set third hop amount in to 0 so that it will use whatever was generated by hop 2.\n thirdHop.pool.partialAmountIn = '0';\n orderedHops = [firstHop, secondHop, thirdHop];\n return orderedHops;\n } else if (arrayEquals(lengthNodeRoutes, [3, 3])) {\n orderedHops = [];\n\n for (var i in filteredNodeRoutes) {\n let doubleNodeRoute = filteredNodeRoutes[i];\n let doubleHopMiddleToken = doubleNodeRoute[1];\n let firstHop = hops.filter(\n hop =>\n hop.inputToken === doubleNodeRoute[0] &&\n hop.outputToken === doubleHopMiddleToken\n )[0];\n let secondHop = hops.filter(\n hop =>\n hop.inputToken === doubleHopMiddleToken &&\n hop.outputToken === doubleNodeRoute[2]\n )[0];\n // set second hop amount in to 0 so that it will use whatever was generated by hop 1.\n secondHop.pool.partialAmountIn = '0';\n orderedHops.push(firstHop);\n orderedHops.push(secondHop);\n }\n return orderedHops;\n } else {\n return hops;\n }\n for (var i in filteredNodeRoutes) {\n let currentNodeRoute = filteredNodeRoutes[i];\n if (currentNodeRoute.length === 2) {\n }\n }\n }\n\n return hops;\n}\n\n// function getActionListFromRoutesAndAllocationsORIG(\n// routes,\n// nodeRoutes,\n// allocations,\n// slippageTolerance\n// ) {\n// let actions = [];\n// for (var i in routes) {\n// let route = routes[i];\n// let nodeRoute = nodeRoutes[i];\n// let allocation = new Big(allocations[i]);\n// if (allocation.eq(new Big(0))) {\n// continue;\n// }\n// if (!route.length) {\n// route = [route];\n// }\n// if (route.length === 1) {\n// //single hop. only one action.\n// let pool = route[0];\n// let poolId = pool.id;\n// let inputToken = nodeRoute[0];\n// let outputToken = nodeRoute[1];\n// let expectedAmountOut = getOutputSingleHop(\n// pool,\n// inputToken,\n// outputToken,\n// allocation\n// );\n// let minimumAmountOut = expectedAmountOut\n// .times(new Big(1).minus(new Big(slippageTolerance).div(100)))\n// .round()\n// .toString(); //Here, assume slippage tolerance is a percentage. So 1% would be 1.0\n// let action = {\n// pool_id: poolId,\n// token_in: inputToken,\n// token_out: outputToken,\n// amount_in: allocation.round().toString(),\n// min_amount_out: minimumAmountOut.toString(),\n// };\n// actions.push(action);\n// } else if (route.length === 2) {\n// // double hop. two actions.\n// let pool1 = route[0];\n// let pool2 = route[1];\n// let pool1Id = pool1.id;\n// let pool2Id = pool2.id;\n// let inputToken = nodeRoute[0];\n// let middleToken = nodeRoute[1];\n// let outputToken = nodeRoute[2];\n// let expectedAmountOutFirstHop = getOutputSingleHop(\n// pool1,\n// inputToken,\n// middleToken,\n// allocation\n// );\n// let minimumAmountOutFirstHop = expectedAmountOutFirstHop\n// .times(new Big(1).minus(new Big(slippageTolerance).div(100)))\n// .round()\n// .toString(); //Here, assume slippage tolerance is a percentage. So 1% would be 1.0\n\n// let action1 = {\n// pool_id: pool1Id,\n// token_in: inputToken,\n// token_out: middleToken,\n// amount_in: allocation.round().toString(),\n// min_amount_out: minimumAmountOutFirstHop,\n// };\n// let expectedFinalAmountOut = getOutputSingleHop(\n// pool2,\n// middleToken,\n// outputToken,\n// minimumAmountOutFirstHop\n// );\n// let minimumAMountOutSecondHop = expectedFinalAmountOut\n// .times(new Big(1).minus(new Big(slippageTolerance).div(100)))\n// .round()\n// .toString();\n// let action2 = {\n// pool_id: pool2Id,\n// token_in: middleToken,\n// token_out: outputToken,\n// amount_in: minimumAmountOutFirstHop,\n// min_amount_out: minimumAMountOutSecondHop,\n// };\n// actions.push(action1);\n// actions.push(action2);\n// }\n// }\n// return actions;\n// }\n\nfunction* range(start, end) {\n for (; start <= end; ++start) {\n yield start;\n }\n}\n\nfunction last(arr) {\n return arr[arr.length - 1];\n}\n\nfunction* numericCombinations(n, r, loc = []) {\n var idx = loc.length;\n if (idx === r) {\n yield loc;\n return;\n }\n for (let next of range(idx ? last(loc) + 1 : 0, n - r + idx)) {\n yield* numericCombinations(n, r, loc.concat(next));\n }\n}\n\nfunction* combinations(arr, r) {\n for (let idxs of numericCombinations(arr.length, r)) {\n yield idxs.map(i => arr[i]);\n }\n}\n\n// #middleTokenTotals = getMiddleTokenTotals(routes,nodeRoutes,allocations)\n// #TODO: complete this function with middle token checks.\n\n// #consider all routes of length 2 with non-zero allocation. (double-hops)\n// # among these, check for parallel swaps. That is, check for common node routes\n// # for first hop. Then check for common node routes on second hop.\n// # when common node routes occur for the first hop:\n// # 1. Calculate the total expected output of intermediate token.\n// # 2.\n// # when common node routes occur for the second hop:\n// # 1. get a ratio of the input allocations of the full routes associated with\n// # these common node routes. allocate the total intermediate token output\n// # toward these 2nd hop routes in the same ratio as their route input allocations.\n\nexport async function getSmartRouteSwapActions(\n pools,\n inputToken,\n outputToken,\n totalInput,\n allTokens,\n maxPathLength = 3,\n threshold = 0.001,\n numberOfRoutesLimit = 2,\n MAX_NUMBER_PARALLEL_POOLS = 4,\n decimalsCulledPoolIds = []\n) {\n if (!totalInput) {\n return [];\n }\n var totalInput = new Big(totalInput);\n\n // remove pools that have an id from the decimalCulledPoolIds\n pools = pools.filter(p => !decimalsCulledPoolIds.includes(p.id));\n\n let resDict = await getBestOptimalAllocationsAndOutputs(\n pools,\n inputToken,\n outputToken,\n totalInput,\n maxPathLength,\n threshold\n );\n\n let allocations = resDict.allocations;\n\n // let outputs = resDict.outputs;\n let routes = resDict.routes;\n let nodeRoutes = resDict.nodeRoutes;\n\n let sortedIndexValues = argsort(allocations);\n let topIndices = sortedIndexValues.slice(0, 10);\n var reducedRoutes = [];\n var reducedNodeRoutes = [];\n for (var ind of topIndices) {\n reducedRoutes.push(routes[ind]);\n reducedNodeRoutes.push(nodeRoutes[ind]);\n }\n routes = reducedRoutes;\n nodeRoutes = reducedNodeRoutes;\n\n // TODO: compare pairs of routes to get the best allocation pair-wise.\n var currentBestOutput = new Big(0);\n var bestResDict = { routes: [] };\n var bestAllocations = resDict.allocations;\n var bestNodeRoutes = resDict.nodeRoutes;\n var bestRoutes = resDict.routes;\n // first check parallel swap with 4 actions. store result.\n var parallelNodeRoutes = [];\n var parallelRoutes = [];\n for (var n in bestRoutes) {\n let currentNodeRoute = bestNodeRoutes[n];\n if (currentNodeRoute.length == 2) {\n parallelNodeRoutes.push(currentNodeRoute);\n parallelRoutes.push(bestRoutes[n]);\n }\n }\n // console.log(`${parallelNodeRoutes.length} parallel routes found...`);\n var bestRoutesAreParallel = false;\n if (parallelNodeRoutes.length > 0) {\n // first calculate the expected result using only parallel routes.\n // let filteredAllocationsAndOutputs = getOptOutputVecRefined(parallelRoutes, parallelNodeRoutes, totalInput);\n let filteredAllocationsAndOutputs = getOptOutputVec(\n parallelRoutes,\n parallelNodeRoutes,\n totalInput\n );\n let parallellAllocations = filteredAllocationsAndOutputs.allocations;\n let parallelOutputs = filteredAllocationsAndOutputs.result;\n\n if (parallellAllocations.length > MAX_NUMBER_PARALLEL_POOLS) {\n // now sort by allocation value to the top 4 parallel swaps:\n let sortIndices = argsort(parallellAllocations);\n\n sortIndices = sortIndices.slice(0, MAX_NUMBER_PARALLEL_POOLS);\n var filteredParallelRoutes = [];\n var filteredParallelNodeRoutes = [];\n for (var i in sortIndices) {\n filteredParallelRoutes.push(parallelRoutes[sortIndices[i]]);\n filteredParallelNodeRoutes.push(parallelNodeRoutes[sortIndices[i]]);\n }\n filteredAllocationsAndOutputs = getOptOutputVec(\n filteredParallelRoutes,\n filteredParallelNodeRoutes,\n totalInput\n );\n parallellAllocations = filteredAllocationsAndOutputs.allocations;\n parallelOutputs = filteredAllocationsAndOutputs.result;\n }\n\n let parallelOutput = parallelOutputs.reduce(\n (a, b) => a.plus(b),\n new Big(0)\n );\n if (new Big(parallelOutput).gt(currentBestOutput)) {\n bestAllocations = parallellAllocations;\n currentBestOutput = parallelOutput;\n // console.log(\n // 'BEST OUTPUT FROM PARALLEL SWAPS IS NOW... ',\n // currentBestOutput.toString()\n // );\n bestRoutes = parallelRoutes;\n bestNodeRoutes = parallelNodeRoutes;\n bestRoutesAreParallel = true;\n }\n }\n var canHaveTwoRoutes = false;\n // initialize this variable to check if we can have two routes, or if all routes share a pool for an edge case.\n // console.log('THE NUMBER OF ROUTES IS...', routes.length);\n\n for (var i in routes) {\n for (var j in routes) {\n if (j > i) {\n var route1 = routes[i];\n var route2 = routes[j];\n var nodeRoute1 = nodeRoutes[i];\n var nodeRoute2 = nodeRoutes[j];\n // check if they share a pool.\n let route1PoolIds = new Set(route1.map(r => r.id));\n let route2PoolIds = new Set(route2.map(r => r.id));\n var sharePool = false;\n for (var route1PoolId of route1PoolIds) {\n if (route2PoolIds.has(route1PoolId)) {\n sharePool = true;\n }\n }\n if (sharePool) {\n // routes are not independent. skip this pair.\n // console.log('skipping this pair because pool was shared.');\n continue;\n } else {\n canHaveTwoRoutes = true;\n let currentRoutes = [route1, route2];\n let currentNodeRoutes = [nodeRoute1, nodeRoute2];\n\n let filteredAllocationsAndOutputs = getOptOutputVec(\n currentRoutes,\n currentNodeRoutes,\n totalInput\n );\n\n let filteredAllocations = filteredAllocationsAndOutputs.allocations;\n let filteredOutputs = filteredAllocationsAndOutputs.result;\n // console.log('FILTERED ALLOCATIONS:');\n // console.log(filteredAllocations.map((i) => i.toString()));\n // console.log(filteredOutputs);\n let totalOutput = filteredOutputs.reduce(\n (a, b) => a.plus(b),\n new Big(0)\n );\n if (new Big(totalOutput).gt(currentBestOutput)) {\n bestAllocations = filteredAllocations;\n currentBestOutput = totalOutput;\n // console.log('BEST OUTPUT IS NOW... ', currentBestOutput.toString());\n bestRoutes = currentRoutes;\n bestNodeRoutes = currentNodeRoutes;\n bestRoutesAreParallel = false;\n // bestResDict = currentResDict\n }\n\n // if (currentResDict.outputs.gt(currentBestOutput)) {\n // console.log('DIFF IS...', currentResDict.outputs.minus(currentBestOutput).toString());\n // bestResDict = currentResDict;\n // currentBestOutput = bestResDict.outputs;\n // console.log('BEST OUTPUT IS NOW... ', currentBestOutput.toString());\n // console.log(bestResDict.routes);\n // console.log(bestResDict.allocations.map((i) => i.toString()));\n // console.log(bestResDict.outputs.toString());\n }\n }\n }\n }\n\n if (!canHaveTwoRoutes) {\n // now we need to check through the routes in single manner to find the best one:\n for (var i in routes) {\n let currentRoutes = [routes[i]];\n let currentNodeRoutes = [nodeRoutes[i]];\n // let filteredAllocationsAndOutputs = getOptOutputVecRefined(currentRoutes, currentNodeRoutes, totalInput);\n let filteredAllocationsAndOutputs = getOptOutputVec(\n currentRoutes,\n currentNodeRoutes,\n totalInput\n );\n\n let filteredAllocations = filteredAllocationsAndOutputs.allocations;\n let filteredOutputs = filteredAllocationsAndOutputs.result;\n // console.log('FILTERED ALLOCATIONS:');\n // console.log(filteredAllocations.map((i) => i.toString()));\n // console.log(filteredOutputs);\n let totalOutput = filteredOutputs.reduce((a, b) => a.plus(b), new Big(0));\n if (new Big(totalOutput).gt(currentBestOutput)) {\n bestAllocations = filteredAllocations;\n currentBestOutput = totalOutput;\n // console.log('BEST OUTPUT IS NOW... ', currentBestOutput.toString());\n bestRoutes = currentRoutes;\n bestNodeRoutes = currentNodeRoutes;\n bestRoutesAreParallel = false;\n // bestResDict = currentResDict\n }\n }\n }\n\n // resDict = bestResDict;\n\n allocations = bestAllocations;\n\n // let outputs = resDict.outputs;\n routes = bestRoutes;\n nodeRoutes = bestNodeRoutes;\n\n if (routes.length < 1) {\n return [];\n }\n\n // check the top numberOfRoutesLimit\n // console.log('initial allocations are...');\n // console.log(allocations.map((a) => a.toString()));\n // console.log('fixed allocations are...');\n // console.log(allocations.map((a) => new Big(a).toFixed()));\n //SORT BY ALLOCATIONS\n let allSortedIndices = argsort(allocations.map(a => new Big(a)));\n if (bestRoutesAreParallel) {\n numberOfRoutesLimit = 4;\n }\n let sortedIndices = allSortedIndices.slice(0, numberOfRoutesLimit);\n\n // console.log('sorted Indices are');\n // console.log(sortedIndices);\n var filteredRoutes = [];\n var filteredNodeRoutes = [];\n for (var i in sortedIndices) {\n let index = sortedIndices[i];\n filteredRoutes.push(routes[index]);\n filteredNodeRoutes.push(nodeRoutes[index]);\n }\n\n // console.log('filteredRoutes are ...');\n // console.log(filteredRoutes);\n for (var i in filteredRoutes) {\n if (!filteredRoutes[i].length) {\n filteredRoutes[i] = [filteredRoutes[i]];\n }\n }\n // console.log('filtered Node routes are...');\n // console.log(filteredNodeRoutes);\n\n // THE BELOW CODE WILL ENSURE THAT ROUTES ARE INDEPENDENT (e.g. THE ROUTES WILL NOT SHARE A POOL)\n\n let route1PoolIds = filteredRoutes[0].map(pool => pool.id);\n // console.log('route 1 pool ids:');\n // console.log(route1PoolIds);\n if (filteredRoutes.length > 1) {\n let route2PoolIds = filteredRoutes[1].map(pool => pool.id);\n // console.log('route 2 pool ids:');\n // console.log(route2PoolIds);\n var sharedRoute = false;\n for (var i in route2PoolIds) {\n if (route1PoolIds.includes(route2PoolIds[i])) {\n // a pool was shared between routes. need to calculate a new second route.\n // console.log(\n // 'a pool was shared between routes. going to calculate a new second route'\n // );\n sharedRoute = true;\n break;\n }\n }\n }\n\n // NOTE -- this is a much simpler solution than that below. Instead of choosing the next best second route that doesn't share a\n // pool with the first route, we could just use the first route and allocate all inputs to it.\n // but, for larger transactions, it would be better to have option of two independent routes to spread out slippage.\n\n // if (sharedRoute) {\n // filteredRoutes = [filteredRoutes[0]];\n // filteredNodeRoutes = [filteredNodeRoutes[0]];\n // // TODO -- later can add in a second route that doesn't share a pool with first.\n // }\n\n // We're going to find the next-highest allocation route that doesn't share a pool with the first route.\n if (sharedRoute) {\n let allFilteredRoutes = [];\n let allFilteredNodeRoutes = [];\n for (var i in allSortedIndices) {\n allFilteredRoutes.push(routes[allSortedIndices[i]]);\n allFilteredNodeRoutes.push(nodeRoutes[allSortedIndices[i]]);\n }\n let firstRoute = allFilteredRoutes[0];\n // console.log('first route is...');\n // console.log(firstRoute);\n let firstRoutePoolIds = firstRoute.map(pool => pool.id);\n for (var i in allFilteredRoutes) {\n if (!allFilteredRoutes[i].length) {\n allFilteredRoutes[i] = [allFilteredRoutes[i]];\n }\n }\n // console.log('FIRST ROUTE POOL IDS ARE');\n // console.log(firstRoutePoolIds);\n let allFilteredRouteIds = allFilteredRoutes.map(route =>\n route.map(pool => pool.id)\n );\n // console.log('allFilteredRouteIds are ...');\n // console.log(allFilteredRouteIds);\n for (var i in allFilteredRouteIds) {\n // console.log('i is', i);\n // console.log('ALL FILTERED ROUTES [i] IS...');\n // console.log(allFilteredRouteIds[i]);\n for (var j in allFilteredRouteIds[i]) {\n // console.log('j is', j);\n // console.log('ALL FILTERED ROUTES [i][j] IS...');\n // console.log(allFilteredRouteIds[i][j]);\n if (firstRoutePoolIds.includes(allFilteredRouteIds[i][j])) {\n break;\n }\n\n var secondRoute = allFilteredRoutes[i];\n if (!secondRoute.length) {\n secondRoute = [secondRoute];\n }\n filteredRoutes = [allFilteredRoutes[0], secondRoute];\n filteredNodeRoutes = [\n allFilteredNodeRoutes[0],\n allFilteredNodeRoutes[i],\n ];\n break;\n }\n }\n // console.log('new filteredRoutes are ...');\n // console.log(filteredRoutes);\n // console.log('new filtered Node routes are...');\n // console.log(filteredNodeRoutes);\n }\n\n // let filteredAllocations_check = getBestOptInput(\n // filteredRoutes,\n // filteredNodeRoutes,\n // totalInput\n // );\n // let filteredAllocationsAndOutputs = getOptOutputVecRefined(filteredRoutes, filteredNodeRoutes, totalInput);\n let filteredAllocationsAndOutputs = getOptOutputVec(\n filteredRoutes,\n filteredNodeRoutes,\n totalInput\n );\n\n let filteredAllocations = filteredAllocationsAndOutputs.allocations;\n let filteredOutputs = filteredAllocationsAndOutputs.result;\n\n filteredAllocations = checkIntegerSumOfAllocations(\n filteredAllocations,\n totalInput\n ).map(stringAllo => new Big(stringAllo));\n\n let hops = getActionListFromRoutesAndAllocations(\n filteredRoutes,\n filteredNodeRoutes,\n filteredAllocations\n );\n\n var actions = [];\n // console.log('hops are...');\n // console.log(hops);\n\n for (var i in hops) {\n let hopInputTokenMeta = allTokens[hops[i].inputToken]\n ? allTokens[hops[i].inputToken]\n : await ftGetTokenMetadata(hops[i].inputToken, 'token input');\n\n let hopOutputTokenMeta = allTokens[hops[i].outputToken]\n ? allTokens[hops[i].outputToken]\n : await ftGetTokenMetadata(hops[i].outputToken, 'token sm');\n let hopOutputTokenDecimals = hopOutputTokenMeta.decimals;\n\n let expectedHopOutput = getOutputSingleHop(\n hops[i].pool,\n hops[i].inputToken,\n hops[i].outputToken,\n hops[i].allocation\n );\n let decimalEstimate = new Big(expectedHopOutput)\n .div(new Big(10).pow(hopOutputTokenDecimals))\n .toString();\n\n // Need to check if expected Hop Output is > 1. If not, then cull the corresponding pool and re-calculate.\n if (new Big(expectedHopOutput).lt(new Big(1))) {\n // purge the pool and recalculate.\n\n decimalsCulledPoolIds.push(hops[i].pool.id);\n return getSmartRouteSwapActions(\n pools,\n inputToken,\n outputToken,\n totalInput,\n allTokens,\n (maxPathLength = maxPathLength),\n (threshold = threshold),\n (numberOfRoutesLimit = numberOfRoutesLimit),\n (MAX_NUMBER_PARALLEL_POOLS = MAX_NUMBER_PARALLEL_POOLS),\n (decimalsCulledPoolIds = decimalsCulledPoolIds)\n );\n }\n\n if (\n hops[i].inputToken == inputToken &&\n hops[i].outputToken == outputToken\n ) {\n var status = 'parallel swap';\n } else {\n var status = 'stableSmart';\n }\n\n let tokens = await Promise.all(\n hops[i].nodeRoute.map(async t =>\n allTokens[t] ? allTokens[t] : await ftGetTokenMetadata(t, 'smart')\n )\n );\n\n actions[i] = {\n estimate: decimalEstimate,\n pool: {\n fee: hops[i].pool.fee,\n gamma_bps: new Big(10000).minus(new Big(hops[i].pool.fee)), //.div(new Big(10000)), //hops[i].pool.gamma, //new Big(10000).minus(new Big(hops[i].pool.fee)).div(new Big(10000));\n id: hops[i].pool.id,\n partialAmountIn: new Big(hops[i].allocation).round().toString(),\n supplies: {\n [hops[i].pool.token1Id]: hops[i].pool.token1Supply,\n [hops[i].pool.token2Id]: hops[i].pool.token2Supply,\n },\n token0_ref_price: hops[i].pool.token0_price,\n tokenIds: [hops[i].pool.token1Id, hops[i].pool.token2Id],\n Dex: hops[i].pool.Dex,\n },\n status: status,\n token: hopInputTokenMeta,\n outputToken: hops[i].outputToken,\n inputToken: hops[i].inputToken,\n nodeRoute: hops[i].nodeRoute,\n route: hops[i].route,\n allRoutes: hops[i].allRoutes,\n allNodeRoutes: hops[i].allNodeRoutes,\n totalInputAmount: hops[i].totalInputAmount,\n allAllocations: hops[i].allAllocations,\n tokens: tokens,\n routeInputToken: inputToken,\n routeOutputToken: outputToken,\n overallPriceImpact: '0',\n };\n // console.log('INPUT TOKEN IS...');\n // console.log(hops[i].inputToken);\n actions[i].pool.x = actions[i].pool.supplies[hops[i].inputToken];\n actions[i].pool.y = actions[i].pool.supplies[hops[i].outputToken];\n }\n // now set partial amount in for second hops equal to zero:\n // also, set the total price impact value.\n let overallPriceImpact = await calculateSmartRouteV2PriceImpact(\n actions,\n allTokens\n );\n for (var i in actions) {\n let action = actions[i];\n action.overallPriceImpact = overallPriceImpact;\n if (action.outputToken === outputToken && action.inputToken != inputToken) {\n // only want to set second hop partial amount in to zero\n action.pool.partialAmountIn = '0';\n }\n }\n\n return actions;\n}\n\nasync function calculateSmartRouteV2PriceImpact(actions, allTokens) {\n // the goal is to take a weighted average of the price impact per route, treating each one at a time.\n // for single hop (parallel swaps), the price impact is calculated as before.\n // for double-hop, the market price, P, is determined using reserves of tokens in each pool in the route.\n // in both cases, we compare the 'market price', P , determined solely by reserves in pools, and the actual\n // average price, R, expected to be paid in the transaction.\n // the price impact is then defined as (P-R)/R * 100 and is a percentage number, returned as a string.\n\n let deltaY = actions\n .filter(a => a.outputToken == a.routeOutputToken)\n .map(a => new Big(a.estimate))\n .reduce((a, b) => a.plus(b), new Big(0));\n // console.log('DELTA Y IS...');\n // console.log(deltaY.toString());\n\n let inputTokenMeta = actions[0].tokens[0];\n let deltaX = new Big(actions[0].totalInputAmount).div(\n new Big(10).pow(inputTokenMeta.decimals)\n );\n let R = deltaY.div(deltaX);\n var P = new Big(0);\n let routes = actions[0].allRoutes;\n let nodeRoutes = actions[0].allNodeRoutes;\n let allocations = actions[0].allAllocations.map(a => new Big(a));\n let totalAllocations = allocations\n .map(a => new Big(a))\n .reduce((a, b) => a.plus(b), new Big(0));\n\n let weights = allocations.map(a => a.div(totalAllocations));\n\n for (var i in routes) {\n let route = routes[i];\n let nodeRoute = nodeRoutes[i];\n let tokens = await Promise.all(\n nodeRoute.map(async t => {\n return allTokens[t]\n ? allTokens[t]\n : await ftGetTokenMetadata(t, 'sm routes');\n })\n );\n let weight = weights[i];\n if (route.length == 1) {\n let num = new Big(route[0].reserves[nodeRoute[0]]).div(\n new Big(10).pow(tokens[0].decimals)\n );\n let denom = new Big(route[0].reserves[nodeRoute[1]]).div(\n new Big(10).pow(tokens[1].decimals)\n );\n var routeMarketPrice = num.div(denom);\n } else {\n let num1 = new Big(route[0].reserves[nodeRoute[0]]).div(\n new Big(10).pow(tokens[0].decimals)\n );\n\n let denom1 = new Big(route[0].reserves[nodeRoute[1]]).div(\n new Big(10).pow(tokens[1].decimals)\n );\n\n let num2 = new Big(route[1].reserves[nodeRoute[1]]).div(\n new Big(10).pow(tokens[1].decimals)\n );\n\n let denom2 = new Big(route[1].reserves[nodeRoute[2]]).div(\n new Big(10).pow(tokens[2].decimals)\n );\n\n var routeMarketPrice = num1\n .div(denom1)\n .times(num2)\n .div(denom2);\n }\n P = P.plus(weight.times(new Big(1).div(routeMarketPrice)));\n }\n\n let priceImpact = P.minus(R)\n .div(R)\n .times(new Big(100))\n .toString();\n return priceImpact;\n}\n\nfunction decor(arr) {\n var res = [];\n for (var i in arr) {\n res.push([arr[i], i]);\n }\n return res;\n}\nfunction argsort(arr) {\n let undecor = a => a[1]; // leave only index\n let decorated = decor(arr);\n\n return decorated\n .sort((a, b) => new Big(b[0]).minus(new Big(a[0])))\n .map(undecor);\n}\n\nfunction getPoolsByToken1ORToken2(pools, token1, token2) {\n let filteredPools = pools.filter(\n item =>\n item.token1Id === token1 ||\n item.token2Id === token1 ||\n item.token1Id === token2 ||\n item.token2Id === token2\n );\n return filteredPools;\n}\n\nfunction getPoolsByToken1ANDToken2(\n pools,\n token1,\n token2,\n cullZeroLiquidityPools = true\n) {\n let filteredPools = pools.filter(\n item =>\n (item.token1Id === token1 && item.token2Id === token2) ||\n (item.token1Id === token2 && item.token2Id === token1)\n );\n if (cullZeroLiquidityPools) {\n filteredPools = filteredPools.filter(\n item => item.token1Supply != '0' && item.token2Supply != '0'\n );\n }\n return filteredPools;\n}\n\nfunction getLiqudityOfPoolsFromList(pools) {\n let liquidities = [];\n for (var poolInd in pools) {\n let pool = pools[poolInd];\n pool.amounts = [pool.token1Supply, pool.token2Supply];\n let poolBigAmounts = pool.amounts.map(item => new Big(item));\n let liquidity = poolBigAmounts[0].times(poolBigAmounts[1]);\n liquidities.push(liquidity);\n }\n return liquidities;\n}\n\nfunction getNormalizedLiquiditiesFromList(pools) {\n let liquidities = getLiqudityOfPoolsFromList(pools);\n let maxLiq = bigMax(liquidities);\n let normalizedLiquidities = liquidities.map(item => item.div(maxLiq));\n return normalizedLiquidities;\n}\n\nfunction bigMax(arrayOfBigs) {\n if (arrayOfBigs.length < 1) {\n return null;\n }\n let maxElem = arrayOfBigs[0];\n for (var ind in arrayOfBigs) {\n let val = arrayOfBigs[ind];\n if (val.gt(maxElem)) {\n maxElem = val;\n }\n }\n return maxElem;\n}\n\nfunction cullPoolsWithInsufficientLiquidity(pools, threshold = 0.0001) {\n var thresh = new Big(threshold);\n let normLiq = getNormalizedLiquiditiesFromList(pools);\n let filteredPools = [];\n for (var i = 0; i < normLiq.length; i++) {\n if (normLiq[i] > thresh) {\n filteredPools.push(pools[i]);\n }\n }\n return filteredPools;\n}\n\nfunction cartesianProduct(a) {\n let result = a.reduce((a, b) => a.flatMap(d => b.map(e => [d, e].flat())));\n return result;\n}\n\nfunction addEdge(g, edge) {\n let src = edge[0];\n let dst = edge[1];\n if (Object.keys(g).includes(src)) {\n if (!Object.keys(g[src]).includes(dst)) {\n g[src][dst] = 1;\n }\n } else {\n g[src] = {};\n g[src][dst] = 1;\n }\n if (Object.keys(g).includes(dst)) {\n if (!Object.keys(g[dst]).includes(src)) {\n g[dst][src] = 1;\n }\n } else {\n g[dst] = {};\n g[dst][src] = 1;\n }\n}\n\nfunction addEdges(g, edgeList) {\n for (var n in edgeList) {\n let edge = edgeList[n];\n addEdge(g, edge);\n }\n}\n\nfunction deleteEdge(g, edge) {\n let gNew = JSON.parse(JSON.stringify(g)); // using this to deep clone graph structure\n let e1 = edge[0];\n let e2 = edge[1];\n if (Object.keys(gNew).includes(e1)) {\n if (Object.keys(gNew[e1]).includes(e2)) {\n delete gNew[e1][e2];\n }\n }\n if (Object.keys(gNew).includes(e2)) {\n if (Object.keys(gNew[e2]).includes(e1)) {\n delete gNew[e2][e1];\n }\n }\n return gNew;\n}\n\nfunction deleteNode(g, node) {\n let gNew = JSON.parse(JSON.stringify(g)); // using this to deep clone graph structure\n if (Object.keys(gNew).includes(node)) {\n delete gNew[node];\n }\n let keys = Object.keys(gNew);\n for (var nodeInd in keys) {\n let nodeNow = keys[nodeInd];\n if (Object.keys(gNew[nodeNow]).includes(node)) {\n delete gNew[nodeNow][node];\n }\n }\n return gNew;\n}\n\nfunction dijkstra(graph, s) {\n var solutions = {};\n solutions[s] = {};\n solutions[s].path = [];\n solutions[s].dist = 0;\n\n while (true) {\n var parent = null;\n var nearest = null;\n var dist = Infinity;\n\n //for each existing solution\n for (var n in solutions) {\n if (!solutions[n]) {\n solutions[n] = {};\n }\n if (!solutions[n].path) continue;\n var ndist = solutions[n].dist;\n var adj = graph[n];\n //for each of its adjacent nodes...\n for (var a in adj) {\n //without a solution already...\n if (!solutions[a]) {\n solutions[a] = {};\n }\n if (solutions[a].path) continue;\n //choose nearest node with lowest *total* cost\n var d = adj[a] + ndist;\n if (d < dist) {\n //reference parent\n parent = solutions[n].path;\n nearest = a;\n dist = d;\n }\n }\n }\n\n //no more solutions\n if (dist === Infinity) {\n break;\n }\n\n //extend parent's solution path\n solutions[nearest].path = parent.concat(nearest);\n //extend parent's cost\n solutions[nearest].dist = dist;\n }\n\n return solutions;\n}\n\nfunction shortestPath(g, src, dst, ignore_nodes = [], ignore_edges = []) {\n let gTemp = JSON.parse(JSON.stringify(g)); // using this to deep clone graph structure. If we can use lodash, could use _.cloneDeep(obj)\n // remove nodes\n for (var nodeInd in ignore_nodes) {\n let nodeNow = ignore_nodes[nodeInd];\n gTemp = deleteNode(gTemp, nodeNow);\n }\n // remove edges\n for (var edgeInd in ignore_edges) {\n let edgeNow = ignore_edges[edgeInd];\n gTemp = deleteEdge(gTemp, edgeNow);\n }\n let solution = dijkstra(gTemp, src)[dst];\n solution.path.unshift(src); // original algorithm doesn't include source node in path\n return solution;\n}\n\nfunction* count(firstval = 0, step = 1) {\n let x = firstval;\n while (true) {\n yield x;\n x = x + 1;\n }\n}\n\nclass PathBuffer {\n constructor() {\n this.paths = [];\n this.sortedpaths = [];\n //this.counter = count();\n }\n len() {\n return this.sortedpaths.length;\n }\n\n push(cost, path) {\n if (path && !arrayContains(this.paths, path)) {\n this.sortedpaths.push([cost, path]);\n this.sortedpaths.sort(function(a, b) {\n return a[0] - b[0];\n });\n //heappush(this.sortedpaths, (cost, this.counter.next().value,path));\n this.paths.push(path);\n }\n }\n\n pop() {\n //let val = heappop(this.sortedpaths);\n let val = this.sortedpaths.shift();\n let cost = val[0];\n let path = val[1];\n this.paths.splice(this.paths.indexOf(path), 1);\n return path;\n }\n}\n\nfunction arrayEquals(a, b) {\n return (\n Array.isArray(a) &&\n Array.isArray(b) &&\n a.length === b.length &&\n a.every((val, index) => val === b[index])\n );\n}\n\nfunction arrayContains(arr, obj) {\n // checks to see if the input array contains a reference object, obj, using\n // JSON.stringify() .\n let obj_json = JSON.stringify(obj);\n for (var itemInd in arr) {\n if (JSON.stringify(arr[itemInd]) == obj_json) {\n return true;\n }\n }\n return false;\n}\n\nfunction* yenFromPy(g, source, target) {\n //adapted from the python implementation in networkx.algorithms.simple_paths.shortest_simple_paths()\n let listA = [];\n let listB = new PathBuffer();\n let prev_path = null;\n\n while (true) {\n if (!prev_path) {\n let sol = shortestPath(g, source, target);\n let length = sol.dist;\n let path = sol.path;\n listB.push(length, path);\n } else {\n let ignore_nodes = [];\n let ignore_edges = [];\n for (var i = 1; i < prev_path.length; i++) {\n let root = prev_path.slice(0, i);\n let root_length = root.length;\n for (var pathInd in listA) {\n let path = listA[pathInd];\n\n if (arrayEquals(path.slice(0, i), root)) {\n let edgeToIgnore = [path[i - 1], path[i]];\n ignore_edges.push(edgeToIgnore);\n }\n }\n try {\n let sol = shortestPath(\n g,\n root[root.length - 1],\n target,\n (ignore_nodes = ignore_nodes),\n (ignore_edges = ignore_edges)\n );\n let length = sol.dist;\n let spur = sol.path;\n let path = root.slice(0, root.length - 1).concat(spur);\n listB.push(root_length + length, path);\n } catch (e) {\n //console.log(`yenFromPy error was... ${e}`)\n //dont do anything.\n }\n ignore_nodes.push(root[root.length - 1]);\n }\n }\n if (listB.sortedpaths) {\n try {\n let path = listB.pop();\n yield path;\n listA.push(path);\n prev_path = path;\n } catch (e) {\n break;\n }\n } else {\n break;\n }\n }\n}\n\nfunction getKShortestPaths(g, source, target, k, maxPathLength = 3) {\n let paths = [];\n if (maxPathLength < 2) {\n var maxPathLength = 2;\n }\n let gen = yenFromPy(g, source, target);\n for (var n = 1; n <= k; n++) {\n try {\n let res = gen.next().value;\n if (res && !arrayContains(paths, res)) {\n if (res.length > maxPathLength) {\n // console.log(\n // `found all hops of length ${\n // maxPathLength - 1\n // } or less... breaking out of generator`\n // );\n break;\n }\n paths.push(res);\n }\n } catch (e) {\n break;\n }\n }\n return paths;\n}\n\nasync function getPathsFromPools(\n pools,\n inputToken,\n outputToken,\n maxPathLength = 3\n) {\n let graph = getGraphFromPoolList(pools);\n return getKShortestPaths(graph, inputToken, outputToken, 100, maxPathLength);\n}\n\nasync function getAllPathsBelowLengthN(g, source, target, N, limit = 100) {\n // use Yen's algorithm to find the paths of length N or below between source and target nodes in graph g.\n\n let paths = [];\n\n let gen = await yenFromPy(g, source, target);\n let currentPathLength = 0;\n let count = 1;\n while (currentPathLength <= N) {\n // console.log(`CURRENT PATH LENGTH IS ${currentPathLength}`)\n try {\n let res = await gen.next().value;\n // console.log(`RES IS ${res}`)\n if (res && !arrayContains(paths, res)) {\n if (res.length > currentPathLength) {\n currentPathLength = res.length;\n if (currentPathLength > N) {\n break;\n }\n }\n paths.push(res);\n }\n count = count + 1;\n if (count > limit) {\n break;\n }\n } catch (e) {\n // console.log(e)\n break;\n }\n }\n return paths;\n}\n\nfunction getGraphFromPoolList(poolList) {\n let pools = poolList.filter(\n item => item.token1Supply != '0' && item.token2Supply != '0'\n );\n let transitions = pools.map(item => [item.token1Id, item.token2Id]);\n let g = {};\n addEdges(g, transitions);\n return g;\n}\n\n////////////////////////////////////\n\n// MAIN FUNCTION\n\n////////////////////////////////////\n\n// TODO -- incorporate the following integrated function, which tries to\n// account for stablecoins within the context of smart routing.\n\n//TODO -- need the right API / hooks for GETSTABLESWAPACTION function and GETPARALLELSWAPACTIONS functions.\n\n//TODO -- transform the actions generated in this function into tranaction to execute.\n\n//TRYING: GETSTABLESWAPACTION <==> instantSwapGetTransactions\n\nexport async function stableSmart(\n pools,\n inputToken,\n outputToken,\n totalInput,\n allTokens\n) {\n let smartRouteActions = await getSmartRouteSwapActions(\n pools,\n inputToken,\n outputToken,\n totalInput,\n allTokens\n );\n return smartRouteActions;\n}\n\nexport function getExpectedOutputFromActionsORIG(actions, outputToken) {\n return actions\n .filter(item => item.outputToken === outputToken)\n .map(item => new Big(item.estimate))\n .reduce((a, b) => a.plus(b), new Big(0));\n}\n\nfunction getFeeForRoute(route) {\n if (!route.length) {\n route = [route];\n }\n if (route.length == 1) {\n // Single Hop case\n let p = route[0];\n return p.fee;\n } else if (route.length == 2) {\n //Double Hop Case\n let p1 = route[0];\n let p2 = route[1];\n let fee1 = p1.fee;\n let fee2 = p2.fee;\n return fee1 + fee2;\n }\n}\n\nexport function getAverageFeeForRoutes(routes, nodeRoutes, totalInput) {\n let normalizedAllocations = getOptimalAllocationForRoutes(\n routes,\n nodeRoutes,\n totalInput\n ).map(a => a.div(new Big(totalInput)));\n let averageFee = 0;\n for (var i in routes) {\n averageFee += normalizedAllocations[i] * getFeeForRoute(routes[i]);\n }\n return averageFee;\n}\n","import { TokenMetadata, Pool, StablePool, EstimateSwapView } from '../types';\nimport {\n toReadableNumber,\n toNonDivisibleNumber,\n scientificNotationToString,\n} from '../utils';\nimport Big from 'big.js';\nimport { SameInputTokenError, ZeroInputError, NoPoolError } from '../error';\nimport { ONLY_ZEROS, toPrecision } from '../utils';\nimport _ from 'lodash';\nimport { FEE_DIVISOR } from '../constant';\nimport { getSwappedAmount } from '../stable-swap';\nimport { ftGetTokenMetadata, ftGetTokensMetadata } from '../ref';\nimport { isStablePool } from '../utils';\nimport { getTokensTiny } from '../indexer';\nimport {\n getStablePoolDecimal,\n isStablePoolToken,\n poolFormatter,\n} from '../utils';\nimport {\n stableSmart,\n getExpectedOutputFromActionsORIG,\n //@ts-ignore\n} from './smartRoutingLogic.js';\n\nexport enum PoolMode {\n PARALLEL = 'parallel swap',\n SMART = 'smart routing',\n SMART_V2 = 'stableSmart',\n STABLE = 'stable swap',\n}\n\nexport interface SwapParams {\n tokenIn: TokenMetadata;\n tokenOut: TokenMetadata;\n amountIn: string;\n simplePools: Pool[];\n options?: SwapOptions;\n}\n\nexport interface SwapOptions {\n enableSmartRouting?: boolean;\n stablePools?: Pool[];\n stablePoolsDetail?: StablePool[];\n}\n\nexport const getSimplePoolEstimate = ({\n tokenIn,\n tokenOut,\n pool,\n amountIn,\n}: {\n tokenIn: TokenMetadata;\n tokenOut: TokenMetadata;\n pool: Pool;\n amountIn: string;\n}) => {\n const amount_with_fee = Number(amountIn) * (FEE_DIVISOR - pool.fee);\n const in_balance = toReadableNumber(\n tokenIn.decimals,\n pool.supplies[tokenIn.id]\n );\n const out_balance = toReadableNumber(\n tokenOut.decimals,\n pool.supplies[tokenOut.id]\n );\n const estimate = new Big(\n (\n (amount_with_fee * Number(out_balance)) /\n (FEE_DIVISOR * Number(in_balance) + amount_with_fee)\n ).toString()\n ).toFixed();\n\n return {\n estimate,\n pool,\n outputToken: tokenOut.id,\n inputToken: tokenIn.id,\n };\n};\n\nexport const getStablePoolEstimate = ({\n tokenIn,\n tokenOut,\n amountIn,\n stablePool,\n pool,\n}: {\n tokenIn: TokenMetadata;\n tokenOut: TokenMetadata;\n amountIn: string;\n stablePool: StablePool;\n pool?: Pool;\n}) => {\n const STABLE_LP_TOKEN_DECIMALS = getStablePoolDecimal(stablePool);\n\n const [amount_swapped, _, dy] = getSwappedAmount(\n tokenIn.id,\n tokenOut.id,\n amountIn,\n stablePool,\n STABLE_LP_TOKEN_DECIMALS\n );\n\n const amountOut =\n amount_swapped < 0 || isNaN(amount_swapped)\n ? '0'\n : toPrecision(scientificNotationToString(amount_swapped.toString()), 0);\n\n const dyOut =\n amount_swapped < 0 || isNaN(amount_swapped) || isNaN(dy)\n ? '0'\n : toPrecision(scientificNotationToString(dy.toString()), 0);\n\n const rates = stablePool.rates.reduce((acc, cur, i) => {\n return {\n ...acc,\n [stablePool.token_account_ids[i]]: cur,\n };\n }, {});\n\n return {\n estimate: toReadableNumber(STABLE_LP_TOKEN_DECIMALS, amountOut),\n noFeeAmountOut: toReadableNumber(STABLE_LP_TOKEN_DECIMALS, dyOut),\n pool: {\n ...stablePool,\n rates,\n },\n outputToken: tokenOut.id,\n inputToken: tokenIn.id,\n };\n};\n\n/**\n * @description Get the estimate of the amount of tokenOut that can be received\n *\n */\nexport const singlePoolSwap = ({\n tokenIn,\n tokenOut,\n simplePools,\n amountIn,\n stablePools,\n}: {\n tokenIn: TokenMetadata;\n tokenOut: TokenMetadata;\n simplePools: Pool[];\n amountIn: string;\n stablePools?: StablePool[];\n}) => {\n if (!simplePools || simplePools.length === 0) {\n throw NoPoolError;\n }\n\n const parsedAmountIn = toNonDivisibleNumber(tokenIn.decimals, amountIn);\n\n // const pools = simplePools.concat(stablePools);\n\n const simplePoolsThisPair = simplePools.filter(\n p =>\n p.tokenIds.includes(tokenIn.id) &&\n p.tokenIds.includes(tokenOut.id) &&\n (!stablePools || !isStablePool(stablePools, p.id))\n );\n\n const estimatesSimplePool = simplePoolsThisPair.map(pool =>\n getSimplePoolEstimate({\n tokenIn,\n tokenOut,\n pool,\n amountIn,\n })\n );\n\n const stablePoolThisPair = stablePools?.filter(\n sp =>\n sp.token_account_ids.includes(tokenIn.id) &&\n sp.token_account_ids.includes(tokenOut.id)\n );\n\n // different stable lp token decimal for different type of pools\n const estimatesStablePool = stablePoolThisPair?.map(stablePool => {\n return getStablePoolEstimate({\n tokenIn,\n tokenOut,\n amountIn,\n stablePool,\n pool: simplePools.find(p => p.id === stablePool.id) as Pool,\n });\n });\n\n const maxSimplePoolEstimate =\n estimatesSimplePool === undefined || estimatesSimplePool.length === 0\n ? undefined\n : estimatesSimplePool.length === 1\n ? estimatesSimplePool[0]\n : _.maxBy(estimatesSimplePool, estimate => Number(estimate.estimate));\n\n const maxStablePoolEstimate =\n estimatesStablePool === undefined || estimatesStablePool.length === 0\n ? undefined\n : estimatesStablePool.length === 1\n ? estimatesStablePool[0]\n : _.maxBy(estimatesStablePool, estimate => Number(estimate.estimate));\n\n if (!maxStablePoolEstimate && !maxSimplePoolEstimate) throw NoPoolError;\n\n maxSimplePoolEstimate &&\n (maxSimplePoolEstimate.pool.partialAmountIn = parsedAmountIn);\n\n maxStablePoolEstimate &&\n (maxStablePoolEstimate.pool.partialAmountIn = parsedAmountIn);\n\n if (!maxStablePoolEstimate) {\n maxSimplePoolEstimate &&\n (maxSimplePoolEstimate.pool.partialAmountIn = parsedAmountIn);\n\n return maxSimplePoolEstimate;\n } else if (!maxSimplePoolEstimate) {\n return maxStablePoolEstimate;\n } else {\n return Number(maxSimplePoolEstimate?.estimate) >\n Number(maxStablePoolEstimate?.estimate)\n ? maxSimplePoolEstimate\n : maxStablePoolEstimate;\n }\n};\n\nexport const getStablePoolsThisPair = ({\n tokenInId,\n tokenOutId,\n stablePools,\n}: {\n tokenInId: string;\n tokenOutId: string;\n stablePools: Pool[];\n}) => {\n return stablePools.filter(\n p =>\n p.tokenIds.includes(tokenInId) &&\n p.tokenIds.includes(tokenOutId) &&\n tokenInId !== tokenOutId\n );\n};\n\nexport const getPoolsByTokens = ({\n pools,\n tokenInId,\n tokenOutId,\n}: {\n pools: Pool[];\n tokenInId: string;\n tokenOutId: string;\n}) => {\n if (tokenInId === tokenOutId) return [];\n\n return pools.filter(\n p => p.tokenIds.includes(tokenInId) && p.tokenIds.includes(tokenOutId)\n );\n};\n\nexport const getPoolEstimate = async ({\n tokenIn,\n tokenOut,\n amountIn,\n stablePoolDetail,\n pool,\n}: {\n tokenIn: TokenMetadata;\n tokenOut: TokenMetadata;\n amountIn: string;\n pool: Pool;\n stablePoolDetail?: StablePool;\n}) => {\n if (!!stablePoolDetail) {\n return getStablePoolEstimate({\n tokenIn,\n tokenOut,\n stablePool: stablePoolDetail,\n amountIn,\n pool,\n });\n } else {\n return getSimplePoolEstimate({\n tokenIn,\n tokenOut,\n pool,\n amountIn,\n });\n }\n};\n\nexport async function getHybridStableSmart(\n tokenIn: TokenMetadata,\n tokenOut: TokenMetadata,\n amountIn: string,\n stablePools: Pool[],\n stablePoolsDetail: StablePool[],\n simplePools: Pool[],\n allTokens: Record<string, TokenMetadata>\n) {\n if (\n !isStablePoolToken(stablePoolsDetail, tokenIn.id) &&\n !isStablePoolToken(stablePoolsDetail, tokenOut.id)\n ) {\n return { actions: [], estimate: '0' };\n }\n\n const stablePoolsDetailById = stablePoolsDetail.reduce((acc, cur) => {\n return {\n ...acc,\n [cur.id]: cur,\n };\n }, {} as Record<string, StablePool>);\n\n const parsedAmountIn = toNonDivisibleNumber(tokenIn.decimals, amountIn);\n\n let pool1: Pool, pool2: Pool;\n\n let pools1: Pool[] = [];\n let pools2: Pool[] = [];\n\n let pools1Right: Pool[] = [];\n let pools2Right: Pool[] = [];\n\n let candidatePools: Pool[][] = [];\n\n /**\n * find possible routes for this pair\n *\n *\n */\n\n if (isStablePoolToken(stablePoolsDetail, tokenIn.id)) {\n // first hop will be through stable pool.\n pools1 = stablePools.filter(pool => pool.tokenIds.includes(tokenIn.id));\n\n const otherStables = pools1\n .map(pool => pool.tokenIds.filter(id => id !== tokenIn.id))\n .flat();\n\n for (var otherStable of otherStables) {\n let stablePoolsThisPair = getStablePoolsThisPair({\n tokenInId: otherStable,\n tokenOutId: tokenOut.id,\n stablePools,\n });\n\n let tmpPools = getPoolsByTokens({\n tokenInId: otherStable,\n tokenOutId: tokenOut.id,\n pools: simplePools,\n });\n const tobeAddedPools = tmpPools.concat(stablePoolsThisPair);\n pools2.push(\n ...tobeAddedPools.filter(p => {\n const supplies = Object.values(p.supplies);\n return new Big(supplies[0]).times(new Big(supplies[1])).gt(0);\n })\n );\n }\n }\n\n if (isStablePoolToken(stablePoolsDetail, tokenOut.id)) {\n // second hop will be through stable pool.\n pools2Right = stablePools.filter(pool =>\n pool.tokenIds.includes(tokenOut.id)\n );\n\n const otherStables = pools2Right\n .map(pool => pool.tokenIds.filter(id => id !== tokenOut.id))\n .flat();\n for (let otherStable of otherStables) {\n let stablePoolsThisPair = getStablePoolsThisPair({\n tokenInId: tokenIn.id,\n tokenOutId: otherStable,\n stablePools,\n });\n\n let tmpPools = getPoolsByTokens({\n tokenInId: tokenIn.id,\n tokenOutId: otherStable,\n pools: simplePools,\n });\n\n const tobeAddedPools = tmpPools.concat(stablePoolsThisPair);\n\n pools1Right.push(\n ...tobeAddedPools.filter(p => {\n const supplies = Object.values(p.supplies);\n return new Big(supplies[0]).times(new Big(supplies[1])).gt(0);\n })\n );\n }\n }\n\n // find candidate pools\n\n for (let p1 of pools1) {\n let middleTokens = p1.tokenIds.filter((id: string) => id !== tokenIn.id);\n for (let middleToken of middleTokens) {\n let p2s = pools2.filter(\n p =>\n p.tokenIds.includes(middleToken) &&\n p.tokenIds.includes(tokenOut.id) &&\n middleToken !== tokenOut.id\n );\n let p2 = _.maxBy(p2s, p =>\n Number(\n new Big(toReadableNumber(tokenOut.decimals, p.supplies[tokenOut.id]))\n )\n );\n\n if (middleToken === tokenOut.id) {\n p2 = p1;\n }\n\n if (p1 && p2) {\n if (p1.id === p2.id) candidatePools.push([p1]);\n else candidatePools.push([p1, p2]);\n }\n }\n }\n for (let p1 of pools1Right) {\n let middleTokens = p1.tokenIds.filter((id: string) => id !== tokenIn.id);\n for (let middleToken of middleTokens) {\n let p2s = pools2Right.filter(\n p =>\n p.tokenIds.includes(middleToken) &&\n p.tokenIds.includes(tokenOut.id) &&\n middleToken !== tokenOut.id\n );\n let p2 = _.maxBy(p2s, p =>\n Number(\n new Big(toReadableNumber(tokenOut.decimals, p.supplies[tokenOut.id]))\n )\n );\n\n if (middleToken === tokenOut.id) {\n p2 = p1;\n }\n\n if (p1 && p2) {\n if (p1.id === p2.id) candidatePools.push([p1]);\n else candidatePools.push([p1, p2]);\n }\n }\n }\n\n if (candidatePools.length > 0) {\n const tokensMedata = await ftGetTokensMetadata(\n candidatePools.map(cp => cp.map(p => p.tokenIds).flat()).flat(),\n allTokens\n );\n\n const BestPoolPair =\n candidatePools.length === 1\n ? candidatePools[0]\n : _.maxBy(candidatePools, poolPair => {\n // only one pool case, only for stable tokens\n if (poolPair.length === 1) {\n if (isStablePool(stablePoolsDetail, poolPair[0].id)) {\n const stablePoolThisPair = getStablePoolsThisPair({\n tokenInId: tokenIn.id,\n tokenOutId: tokenOut.id,\n stablePools,\n })[0];\n\n const stablePoolDetailThisPair = stablePoolsDetail.find(\n spd => spd.id === stablePoolThisPair.id\n );\n\n return Number(\n getStablePoolEstimate({\n tokenIn,\n tokenOut,\n stablePool: stablePoolDetailThisPair as StablePool,\n amountIn,\n pool: poolPair[0],\n }).estimate\n );\n } else {\n return Number(\n getSimplePoolEstimate({\n tokenIn,\n tokenOut,\n amountIn,\n pool: poolPair[0],\n }).estimate\n );\n }\n }\n\n const [tmpPool1, tmpPool2] = poolPair;\n const tokenMidId = poolPair[0].tokenIds.find((t: string) =>\n poolPair[1].tokenIds.includes(t)\n ) as string;\n\n const tokenMidMeta = tokensMedata[tokenMidId];\n\n const estimate1 = {\n ...(isStablePool(stablePoolsDetail, tmpPool1.id)\n ? getStablePoolEstimate({\n tokenIn,\n tokenOut: tokenMidMeta,\n amountIn,\n stablePool: stablePoolsDetailById[tmpPool1.id],\n pool: tmpPool1,\n })\n : getSimplePoolEstimate({\n tokenIn,\n tokenOut: tokenMidMeta,\n amountIn,\n pool: tmpPool1,\n })),\n status: PoolMode.SMART,\n };\n\n const estimate2 = {\n ...(isStablePool(stablePoolsDetail, tmpPool2.id)\n ? getStablePoolEstimate({\n tokenIn: tokenMidMeta,\n tokenOut,\n amountIn: estimate1.estimate,\n stablePool: stablePoolsDetailById[tmpPool2.id],\n pool: tmpPool2,\n })\n : getSimplePoolEstimate({\n tokenIn: tokenMidMeta,\n tokenOut,\n pool: tmpPool2,\n amountIn: estimate1.estimate,\n })),\n status: PoolMode.SMART,\n };\n\n return Number(estimate2.estimate);\n });\n\n // one pool case only get best price\n\n if (!BestPoolPair) return { actions: [], estimate: '0' };\n\n if (BestPoolPair.length === 1) {\n const bestPool = BestPoolPair[0];\n const estimate = await getPoolEstimate({\n tokenIn,\n tokenOut,\n amountIn,\n pool: bestPool,\n stablePoolDetail: stablePoolsDetailById[bestPool.id],\n });\n\n return {\n actions: [\n {\n ...estimate,\n status: PoolMode.STABLE,\n\n pool: { ...estimate.pool, partialAmountIn: parsedAmountIn },\n tokens: [tokenIn, tokenOut],\n inputToken: tokenIn.id,\n outputToken: tokenOut.id,\n totalInputAmount: toNonDivisibleNumber(tokenIn.decimals, amountIn),\n },\n ],\n estimate: estimate.estimate,\n };\n }\n\n // two pool case get best price\n [pool1, pool2] = BestPoolPair;\n\n const tokenMidId = BestPoolPair[0].tokenIds.find((t: string) =>\n BestPoolPair[1].tokenIds.includes(t)\n ) as string;\n\n const tokenMidMeta =\n allTokens[tokenMidId] ||\n (await ftGetTokenMetadata(tokenMidId, 'hybridSmartRoutingEstimate'));\n\n const estimate1 = {\n ...(isStablePool(stablePoolsDetail, pool1.id)\n ? getStablePoolEstimate({\n tokenIn,\n tokenOut: tokenMidMeta,\n amountIn,\n stablePool: stablePoolsDetailById[pool1.id],\n pool: pool1,\n })\n : getSimplePoolEstimate({\n tokenIn,\n tokenOut: tokenMidMeta,\n amountIn,\n pool: pool1,\n })),\n tokens: [tokenIn, tokenMidMeta, tokenOut],\n inputToken: tokenIn.id,\n outputToken: tokenMidMeta.id,\n status: PoolMode.SMART,\n };\n\n estimate1.pool = {\n ...estimate1.pool,\n partialAmountIn: parsedAmountIn,\n };\n\n const estimate2 = {\n ...(isStablePool(stablePoolsDetail, pool2.id)\n ? getStablePoolEstimate({\n tokenIn: tokenMidMeta,\n tokenOut,\n amountIn: estimate1.estimate,\n stablePool: stablePoolsDetailById[pool2.id],\n pool: pool2,\n })\n : getSimplePoolEstimate({\n tokenIn: tokenMidMeta,\n tokenOut,\n amountIn: estimate1.estimate,\n pool: pool2,\n })),\n\n tokens: [tokenIn, tokenMidMeta, tokenOut],\n inputToken: tokenMidMeta.id,\n outputToken: tokenOut.id,\n status: PoolMode.SMART,\n };\n\n return { actions: [estimate1, estimate2], estimate: estimate2.estimate };\n }\n\n return { actions: [], estimate: '0' };\n}\n\n// simple pools and stable pools for this pair\nexport const estimateSwap = async ({\n tokenIn,\n tokenOut,\n amountIn,\n simplePools,\n options,\n}: SwapParams) => {\n if (tokenIn.id === tokenOut.id) throw SameInputTokenError;\n\n if (ONLY_ZEROS.test(amountIn)) throw ZeroInputError;\n\n const { enableSmartRouting, stablePools, stablePoolsDetail } = options || {};\n\n const parsedAmountIn = toNonDivisibleNumber(tokenIn.decimals, amountIn);\n\n let singleRouteEstimate: EstimateSwapView[] = [];\n\n try {\n const estimate = singlePoolSwap({\n tokenIn,\n tokenOut,\n simplePools,\n amountIn,\n stablePools: stablePoolsDetail,\n });\n\n singleRouteEstimate = [\n {\n ...estimate,\n status: PoolMode.PARALLEL,\n pool: { ...estimate?.pool, partialAmountIn: parsedAmountIn },\n totalInputAmount: toNonDivisibleNumber(tokenIn.decimals, amountIn),\n tokens: [tokenIn, tokenOut],\n },\n ] as EstimateSwapView[];\n if (!enableSmartRouting) {\n return singleRouteEstimate;\n }\n } catch (error) {\n if (!enableSmartRouting) throw error;\n }\n\n const inputPools = simplePools.map(p => poolFormatter(p));\n\n const allTokens = (await getTokensTiny()) as Record<string, TokenMetadata>;\n\n const simplePoolSmartRoutingActions = await stableSmart(\n inputPools,\n tokenIn.id,\n tokenOut.id,\n parsedAmountIn,\n allTokens\n );\n\n const simplePoolSmartRoutingEstimate = getExpectedOutputFromActionsORIG(\n simplePoolSmartRoutingActions,\n tokenOut.id\n ).toString();\n\n const hybridSmartRoutingRes = await getHybridStableSmart(\n tokenIn,\n tokenOut,\n amountIn,\n stablePools || [],\n stablePoolsDetail || [],\n simplePools,\n allTokens\n );\n\n const hybridSmartRoutingEstimate = hybridSmartRoutingRes.estimate.toString();\n\n if (\n new Big(simplePoolSmartRoutingEstimate || '0').gte(\n hybridSmartRoutingEstimate || '0'\n )\n ) {\n if (!simplePoolSmartRoutingActions?.length) throw NoPoolError;\n\n if (\n typeof singleRouteEstimate !== 'undefined' &&\n singleRouteEstimate &&\n singleRouteEstimate?.[0]?.estimate &&\n new Big(singleRouteEstimate[0].estimate || '0').gt(\n simplePoolSmartRoutingEstimate || '0'\n )\n ) {\n return singleRouteEstimate;\n }\n return simplePoolSmartRoutingActions as EstimateSwapView[];\n } else {\n if (\n typeof singleRouteEstimate !== 'undefined' &&\n singleRouteEstimate &&\n singleRouteEstimate?.[0]?.estimate &&\n new Big(singleRouteEstimate[0].estimate || '0').gt(\n hybridSmartRoutingEstimate || '0'\n )\n ) {\n return singleRouteEstimate;\n }\n\n return hybridSmartRoutingRes.actions as EstimateSwapView[];\n }\n};\n","import {\n Pool,\n PoolRPCView,\n StablePool,\n SmartRoutingInputPool,\n Transaction,\n EstimateSwapView,\n} from './types';\nimport {\n FEE_DIVISOR,\n RATED_POOL_LP_TOKEN_DECIMALS,\n STABLE_LP_TOKEN_DECIMALS,\n} from './constant';\n\nimport {\n transactions,\n utils,\n transactions as nearTransactions,\n} from 'near-api-js';\n\nimport _, { sortBy } from 'lodash';\n\nimport BN from 'bn.js';\n\nimport * as math from 'mathjs';\nimport {\n REF_FI_CONTRACT_ID,\n WRAP_NEAR_CONTRACT_ID,\n STORAGE_TO_REGISTER_WITH_MFT,\n} from './constant';\nimport Big from 'big.js';\nimport { SignAndSendTransactionsParams } from '@near-wallet-selector/core/lib/wallet';\nimport { TokenMetadata } from './types';\nimport { PoolMode } from './v1-swap/swap';\nimport { getSwappedAmount } from './stable-swap';\nimport { NoFeeToPool } from './error';\nimport { CONSTANT_D, POINTLEFTRANGE, POINTRIGHTRANGE } from './constant';\nimport { DCL_POOL_FEE_LIST } from './dcl-swap/dcl-pool';\n\nexport const parsePool = (pool: PoolRPCView, id?: number): Pool => ({\n id: Number(typeof id === 'number' ? id : pool.id),\n tokenIds: pool.token_account_ids,\n supplies: pool.amounts.reduce(\n (acc: { [tokenId: string]: string }, amount: string, i: number) => {\n acc[pool.token_account_ids[i]] = amount;\n return acc;\n },\n {}\n ),\n fee: pool.total_fee,\n shareSupply: pool.shares_total_supply,\n tvl: pool.tvl,\n token0_ref_price: pool.token0_ref_price,\n pool_kind: pool.pool_kind,\n});\n\nexport const poolFormatter = (pool: Pool) => {\n return {\n id: pool.id,\n token1Id: pool.tokenIds[0],\n token2Id: pool.tokenIds[1],\n token1Supply: pool.supplies[pool.tokenIds[0]],\n token2Supply: pool.supplies[pool.tokenIds[1]],\n fee: pool.fee,\n shares: pool.shareSupply,\n token0_price: pool.token0_ref_price || '0',\n } as SmartRoutingInputPool;\n};\n\nexport const isStablePoolToken = (\n stablePools: StablePool[],\n tokenId: string | Number\n) => {\n return stablePools\n .map(p => p.token_account_ids)\n .flat()\n .includes(tokenId.toString());\n};\n\nexport const isStablePool = (\n stablePools: StablePool[],\n poolId: string | number\n) => {\n return stablePools.map(p => p.id.toString()).includes(poolId.toString());\n};\n\nexport const getStablePoolDecimal = (stablePool: StablePool) => {\n return stablePool.pool_kind === 'RATED_SWAP'\n ? RATED_POOL_LP_TOKEN_DECIMALS\n : STABLE_LP_TOKEN_DECIMALS;\n};\n\nexport const round = (decimals: number, minAmountOut: string) => {\n return Number.isInteger(Number(minAmountOut))\n ? minAmountOut\n : Math.ceil(\n Math.round(Number(minAmountOut) * Math.pow(10, decimals)) /\n Math.pow(10, decimals)\n ).toString();\n};\n\nexport const convertToPercentDecimal = (percent: number) => {\n return math.divide(percent, 100);\n};\n\nexport const percentOf = (percent: number, num: number | string) => {\n return math.evaluate(`${convertToPercentDecimal(percent)} * ${num}`);\n};\n\nexport const percentLess = (percent: number, num: number | string) => {\n return math.format(math.evaluate(`${num} - ${percentOf(percent, num)}`), {\n notation: 'fixed',\n });\n};\n\nexport const getGas = (gas: string | undefined) =>\n gas ? new BN(gas) : new BN('100000000000000');\n\nexport const getAmount = (amount: string) =>\n amount ? new BN(utils.format.parseNearAmount(amount) || '0') : new BN('0');\n\nexport const ONLY_ZEROS = /^0*\\.?0*$/;\n\nexport const toReadableNumber = (\n decimals: number,\n number: string = '0'\n): string => {\n if (!decimals) return number;\n\n const wholeStr = number.substring(0, number.length - decimals) || '0';\n const fractionStr = number\n .substring(number.length - decimals)\n .padStart(decimals, '0')\n .substring(0, decimals);\n\n return `${wholeStr}.${fractionStr}`.replace(/\\.?0+$/, '');\n};\n\nexport const toNonDivisibleNumber = (\n decimals: number,\n number: string\n): string => {\n if (decimals === null || decimals === undefined) return number;\n const [wholePart, fracPart = ''] = number.split('.');\n\n return `${wholePart}${fracPart.padEnd(decimals, '0').slice(0, decimals)}`\n .replace(/^0+/, '')\n .padStart(1, '0');\n};\n\nexport const scientificNotationToString = (strParam: string) => {\n let flag = /e/.test(strParam);\n if (!flag || !strParam) return strParam;\n\n let sysbol = true;\n if (/e-/.test(strParam)) {\n sysbol = false;\n }\n\n const negative = Number(strParam) < 0 ? '-' : '';\n\n let index = Number(strParam.match(/\\d+$/)?.[0]);\n\n let basis = strParam.match(/[\\d\\.]+/)?.[0];\n\n if (!index || !basis) return strParam;\n\n const ifFraction = basis.includes('.');\n\n let wholeStr;\n let fractionStr;\n\n if (ifFraction) {\n wholeStr = basis.split('.')[0];\n fractionStr = basis.split('.')[1];\n } else {\n wholeStr = basis;\n fractionStr = '';\n }\n\n if (sysbol) {\n if (!ifFraction) {\n return negative + wholeStr.padEnd(index + wholeStr.length, '0');\n } else {\n if (fractionStr.length <= index) {\n return negative + wholeStr + fractionStr.padEnd(index, '0');\n } else {\n return (\n negative +\n wholeStr +\n fractionStr.substring(0, index) +\n '.' +\n fractionStr.substring(index)\n );\n }\n }\n } else {\n if (!ifFraction)\n return (\n negative +\n wholeStr.padStart(index + wholeStr.length, '0').replace(/^0/, '0.')\n );\n else {\n return (\n negative +\n wholeStr.padStart(index + wholeStr.length, '0').replace(/^0/, '0.') +\n fractionStr\n );\n }\n }\n};\n\nexport const formatWithCommas = (value: string) => {\n const pattern = /(-?\\d+)(\\d{3})/;\n while (pattern.test(value)) {\n value = value.replace(pattern, '$1,$2');\n }\n return value;\n};\n\nexport const toPrecision = (\n number: string,\n precision: number,\n withCommas: boolean = false,\n atLeastOne: boolean = true\n): string => {\n const [whole, decimal = ''] = number.split('.');\n\n let str = `${withCommas ? formatWithCommas(whole) : whole}.${decimal.slice(\n 0,\n precision\n )}`.replace(/\\.$/, '');\n if (atLeastOne && Number(str) === 0 && str.length > 1) {\n var n = str.lastIndexOf('0');\n str = str.slice(0, n) + str.slice(n).replace('0', '1');\n }\n\n return str;\n};\n\nexport const transformTransactions = (\n transactions: Transaction[],\n AccountId: string\n) => {\n const parsedTransactions = transactions.map((t: Transaction) => {\n return {\n signerId: AccountId,\n receiverId: t.receiverId,\n actions: t.functionCalls.map(fc => {\n return {\n type: 'FunctionCall',\n params: {\n methodName: fc.methodName,\n args: fc.args || {},\n gas: getGas(fc.gas)\n .toNumber()\n .toFixed(),\n deposit: utils.format.parseNearAmount(fc.amount || '0')!,\n },\n };\n }),\n };\n });\n\n return parsedTransactions;\n};\n\nexport const WalletSelectorTransactions = (\n transactions: Transaction[],\n AccountId: string\n) => {\n const parsedTransactions = transactions.map((t: Transaction) => {\n return {\n signerId: AccountId,\n receiverId: t.receiverId,\n actions: t.functionCalls.map(fc => {\n return {\n type: 'FunctionCall',\n params: {\n methodName: fc.methodName,\n args: fc.args || {},\n gas: getGas(fc.gas)\n .toNumber()\n .toFixed(),\n deposit: utils.format.parseNearAmount(fc.amount || '0')!,\n },\n };\n }),\n };\n });\n\n return { transactions: parsedTransactions } as SignAndSendTransactionsParams;\n};\n\nexport const separateRoutes = (\n actions: EstimateSwapView[],\n outputToken: string\n) => {\n const res = [];\n let curRoute = [];\n\n for (let i in actions) {\n curRoute.push(actions[i]);\n if (actions[i].outputToken === outputToken) {\n res.push(curRoute);\n curRoute = [];\n }\n }\n\n return res;\n};\n\nexport const calculateExchangeRate = (\n from: string,\n to: string,\n precision?: number\n) => {\n return math\n .floor(math.evaluate(`${to} / ${from}`), precision || 4)\n .toString();\n};\n\nexport const getAvgFee = (\n estimates: EstimateSwapView[],\n outputToken: string,\n parsedAmountIn: string\n) => {\n if (!estimates || estimates.length === 0) {\n return 0;\n }\n\n const routes = separateRoutes(estimates, outputToken);\n\n let fee = new Big(0);\n\n routes.forEach(r => {\n const partialAmountIn = r[0].pool.partialAmountIn || '0';\n\n fee = fee.plus(\n r\n .reduce(\n (acc, cur) => acc.plus(cur.pool.fee || cur.pool.total_fee || 0),\n new Big(0)\n )\n .times(partialAmountIn)\n .div(ONLY_ZEROS.test(parsedAmountIn) ? '1' : parsedAmountIn)\n );\n });\n\n return fee.toNumber();\n};\n\nexport const getAccountName = (AccountId: string) => {\n if (!AccountId) return AccountId;\n\n const [account, network] = AccountId.split('.');\n const niceAccountId = `${account.slice(0, 10)}...${network || ''}`;\n\n return account.length > 10 ? niceAccountId : AccountId;\n};\n\nexport const symbolsArr = ['e', 'E', '+', '-'];\n\nexport const multiply = (factor1: string, factor2: string) => {\n return math.format(math.evaluate(`${factor1} * ${factor2}`), {\n notation: 'fixed',\n });\n};\n\nexport const toInternationalCurrencySystemLongString = (\n labelValue: string,\n percent?: number\n) => {\n return Math.abs(Number(labelValue)) >= 1.0e9\n ? (Math.abs(Number(labelValue)) / 1.0e9).toFixed(percent || 2) + 'B'\n : Math.abs(Number(labelValue)) >= 1.0e6\n ? (Math.abs(Number(labelValue)) / 1.0e6).toFixed(percent || 2) + 'M'\n : Math.abs(Number(labelValue)).toFixed(percent || 2);\n};\n\nexport const percentOfBigNumber = (\n percent: number,\n num: number | string,\n precision: number\n) => {\n const valueBig = math.bignumber(num);\n const percentBig = math.bignumber(percent).div(100);\n\n return toPrecision(\n scientificNotationToString(valueBig.mul(percentBig).toString()),\n precision\n );\n};\n\nexport const toRealSymbol = (symbol: string) => {\n if (!symbol) return '';\n const blackList = ['nUSDO'];\n\n if (symbol === 'nWETH' || symbol === 'WETH') return 'wETH';\n if (blackList.includes(symbol)) return symbol;\n return symbol.charAt(0) === 'n' &&\n symbol.charAt(1) === symbol.charAt(1).toUpperCase()\n ? symbol.substring(1)\n : symbol;\n};\n\nexport const calculateFeeCharge = (fee: number, total: string) => {\n return math.floor(math.evaluate(`(${fee} / ${FEE_DIVISOR}) * ${total}`), 3);\n};\n\nexport const calculateFeePercent = (fee: number) => {\n return math.divide(fee, 100);\n};\n\nexport function getExpectedOutputFromSwapTodos(\n estimates: EstimateSwapView[],\n outputToken: string\n) {\n if (!estimates || estimates.length === 0) return new Big(0);\n\n return estimates\n .filter(item => item.outputToken === outputToken)\n .map(item => new Big(item.estimate || 0))\n .reduce((a, b) => a.plus(b), new Big(0));\n}\n\nexport const calculateAmountReceived = (\n pool: Pool,\n amountIn: string,\n tokenIn: TokenMetadata,\n tokenOut: TokenMetadata\n) => {\n const partialAmountIn = toReadableNumber(tokenIn.decimals, amountIn);\n\n const in_balance = toReadableNumber(\n tokenIn.decimals,\n pool.supplies[tokenIn.id]\n );\n const out_balance = toReadableNumber(\n tokenOut.decimals,\n pool.supplies[tokenOut.id]\n );\n\n const big_in_balance = math.bignumber(in_balance);\n const big_out_balance = math.bignumber(out_balance);\n\n const constant_product = big_in_balance.mul(big_out_balance);\n\n const new_in_balance = big_in_balance.plus(math.bignumber(partialAmountIn));\n\n const new_out_balance = constant_product.div(new_in_balance);\n\n const tokenOutReceived = big_out_balance.minus(new_out_balance);\n\n return tokenOutReceived;\n};\n\nexport const calculateMarketPrice = (\n pool: Pool,\n tokenIn: TokenMetadata,\n tokenOut: TokenMetadata\n) => {\n const cur_in_balance = toReadableNumber(\n tokenIn.decimals,\n pool.supplies[tokenIn.id]\n );\n\n const cur_out_balance = toReadableNumber(\n tokenOut.decimals,\n pool.supplies[tokenOut.id]\n );\n\n return math.evaluate(`(${cur_in_balance} / ${cur_out_balance})`);\n};\n\nexport const calculateSmartRoutingPriceImpact = (\n tokenInAmount: string,\n swapTodos: EstimateSwapView[],\n tokenIn: TokenMetadata,\n tokenMid: TokenMetadata,\n tokenOut: TokenMetadata,\n stablePools: StablePool[]\n) => {\n const isPool1StablePool = isStablePool(stablePools, swapTodos[0].pool.id);\n const isPool2StablePool = isStablePool(stablePools, swapTodos[1].pool.id);\n\n const marketPrice1 = isPool1StablePool\n ? (\n Number(swapTodos[0].pool.rates?.[tokenMid.id]) /\n Number(swapTodos[0].pool.rates?.[tokenIn.id])\n ).toString()\n : calculateMarketPrice(swapTodos[0].pool, tokenIn, tokenMid);\n\n const marketPrice2 = isPool2StablePool\n ? (\n Number(swapTodos[1].pool.rates?.[tokenOut.id]) /\n Number(swapTodos[1].pool.rates?.[tokenMid.id])\n ).toString()\n : calculateMarketPrice(swapTodos[1].pool, tokenMid, tokenOut);\n\n const generalMarketPrice = math.evaluate(`${marketPrice1} * ${marketPrice2}`);\n\n const tokenMidReceived = isPool1StablePool\n ? swapTodos[0].noFeeAmountOut\n : calculateAmountReceived(\n swapTodos[0].pool,\n toNonDivisibleNumber(tokenIn.decimals, tokenInAmount),\n tokenIn,\n tokenMid\n );\n\n const formattedTokenMidReceived = scientificNotationToString(\n tokenMidReceived?.toString() || '0'\n );\n\n let stableOutPool2;\n if (isPool2StablePool) {\n const stablePool2 =\n stablePools.find(p => p.id === swapTodos[1].pool.id) || stablePools[0];\n\n const stableOut = getSwappedAmount(\n tokenMid.id,\n tokenOut.id,\n formattedTokenMidReceived,\n stablePool2,\n getStablePoolDecimal(stablePool2)\n );\n stableOutPool2 =\n stableOut[0] < 0\n ? '0'\n : toPrecision(scientificNotationToString(stableOut[2].toString()), 0);\n stableOutPool2 = toReadableNumber(\n getStablePoolDecimal(stablePool2),\n stableOutPool2\n );\n }\n\n const tokenOutReceived = isPool2StablePool\n ? stableOutPool2\n : calculateAmountReceived(\n swapTodos[1].pool,\n toNonDivisibleNumber(tokenMid.decimals, formattedTokenMidReceived),\n tokenMid,\n tokenOut\n );\n\n const newMarketPrice = math.evaluate(\n `${tokenInAmount} / ${tokenOutReceived}`\n );\n\n const PriceImpact = new Big(newMarketPrice)\n .minus(new Big(generalMarketPrice))\n .div(newMarketPrice)\n .times(100)\n .toString();\n\n return scientificNotationToString(PriceImpact);\n};\nexport const percent = (numerator: string, denominator: string) => {\n return math.evaluate(`(${numerator} / ${denominator}) * 100`);\n};\nexport const calcStableSwapPriceImpact = (\n from: string,\n to: string,\n marketPrice: string = '1'\n) => {\n const newMarketPrice = math.evaluate(`${from} / ${to}`);\n\n return math.format(\n percent(\n math.evaluate(`${newMarketPrice} - ${marketPrice}`),\n newMarketPrice\n ),\n {\n notation: 'fixed',\n }\n );\n};\n\nexport const calculatePriceImpact = (\n pools: Pool[],\n tokenIn: TokenMetadata,\n tokenOut: TokenMetadata,\n tokenInAmount: string\n) => {\n let in_balance: string = '0',\n out_balance: string = '0';\n\n pools.forEach((pool, i) => {\n const cur_in_balance = toReadableNumber(\n tokenIn.decimals,\n pool.supplies[tokenIn.id]\n );\n\n const cur_out_balance = toReadableNumber(\n tokenOut.decimals,\n pool.supplies[tokenOut.id]\n );\n\n in_balance = new Big(in_balance).plus(cur_in_balance).toString();\n out_balance = new Big(out_balance).plus(cur_out_balance).toString();\n });\n\n const finalMarketPrice = math.evaluate(`(${in_balance} / ${out_balance})`);\n\n const separatedReceivedAmount = pools.map(pool => {\n return calculateAmountReceived(\n pool,\n pool.partialAmountIn || '0',\n tokenIn,\n tokenOut\n );\n });\n\n const finalTokenOutReceived = math.sum(...separatedReceivedAmount);\n\n const newMarketPrice = math.evaluate(\n `${tokenInAmount} / ${finalTokenOutReceived}`\n );\n\n const PriceImpact = new Big(newMarketPrice)\n .minus(new Big(finalMarketPrice))\n .div(newMarketPrice)\n .times(100)\n .toString();\n\n return scientificNotationToString(PriceImpact);\n};\n\nexport function calculateSmartRoutesV2PriceImpact(\n actions: any,\n outputToken: string,\n tokenInPara: TokenMetadata,\n stablePools: StablePool[]\n) {\n const routes = separateRoutes(actions, outputToken);\n\n const tokenIn = routes[0][0].tokens?.[0] || tokenInPara;\n\n const totalInputAmount = routes[0][0].totalInputAmount;\n\n const priceImpactForRoutes = routes.map((r, i) => {\n const readablePartialAmountIn = toReadableNumber(\n tokenIn.decimals,\n r[0].pool.partialAmountIn\n );\n\n if (r.length > 1) {\n const tokenIn = r[0].tokens?.[0];\n const tokenMid = r[0].tokens?.[1];\n const tokenOut = r[0].tokens?.[2];\n\n return calculateSmartRoutingPriceImpact(\n readablePartialAmountIn,\n routes[i],\n tokenIn || tokenInPara,\n tokenMid || tokenInPara,\n tokenOut || tokenInPara,\n stablePools\n );\n } else {\n return isStablePool(stablePools, r[0].pool.id)\n ? calcStableSwapPriceImpact(\n readablePartialAmountIn,\n r[0].noFeeAmountOut || '0',\n (\n Number(r[0].pool.rates?.[outputToken]) /\n Number(r[0].pool.rates?.[tokenIn.id])\n ).toString()\n )\n : calculatePriceImpact(\n [r[0].pool],\n r[0].tokens?.[0] || tokenIn,\n r[0].tokens?.[1] || tokenIn,\n readablePartialAmountIn\n );\n }\n });\n\n const rawRes = priceImpactForRoutes.reduce(\n (pre, cur, i) => {\n return pre.plus(\n new Big(routes[i][0].pool.partialAmountIn || '0')\n .div(new Big(totalInputAmount || '1'))\n .mul(cur)\n );\n },\n\n new Big(0)\n );\n\n return scientificNotationToString(rawRes.toString());\n}\n\nexport const getPriceImpact = ({\n estimates,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut,\n stablePools,\n}: {\n estimates: EstimateSwapView[];\n tokenIn: TokenMetadata;\n tokenOut: TokenMetadata;\n amountIn: string;\n amountOut: string;\n stablePools: StablePool[];\n}) => {\n let PriceImpactValue: string = '0';\n let priceImpactValueSmartRouting: string = '0';\n let priceImpactValueSmartRoutingV2: string = '0';\n\n if (typeof estimates === 'undefined') return '0';\n\n try {\n if (estimates?.length === 2 && estimates[0].status === PoolMode.SMART) {\n priceImpactValueSmartRouting = calculateSmartRoutingPriceImpact(\n amountIn,\n estimates,\n tokenIn,\n estimates[0].tokens?.[1] || tokenIn,\n tokenOut,\n stablePools\n );\n } else if (\n estimates?.length === 1 &&\n estimates[0].status === PoolMode.STABLE\n ) {\n priceImpactValueSmartRouting = calcStableSwapPriceImpact(\n toReadableNumber(tokenIn.decimals, estimates[0].totalInputAmount),\n estimates[0].noFeeAmountOut || '0',\n (\n Number(estimates[0].pool.rates?.[tokenOut.id]) /\n Number(estimates[0].pool.rates?.[tokenIn.id])\n ).toString()\n );\n } else priceImpactValueSmartRouting = '0';\n } catch (error) {\n priceImpactValueSmartRouting = '0';\n }\n\n try {\n priceImpactValueSmartRoutingV2 = calculateSmartRoutesV2PriceImpact(\n estimates,\n tokenOut.id,\n tokenIn,\n stablePools\n );\n } catch (error) {\n priceImpactValueSmartRoutingV2 = '0';\n }\n\n try {\n if (\n estimates[0].status === PoolMode.SMART ||\n estimates[0].status === PoolMode.STABLE\n ) {\n PriceImpactValue = priceImpactValueSmartRouting;\n } else {\n PriceImpactValue = priceImpactValueSmartRoutingV2;\n }\n\n return PriceImpactValue;\n } catch (error) {\n return '0';\n }\n};\n\nexport const subtraction = (initialValue: string, toBeSubtract: string) => {\n return math.format(math.evaluate(`${initialValue} - ${toBeSubtract}`), {\n notation: 'fixed',\n });\n};\n\nexport function getPoolAllocationPercents(pools: Pool[]) {\n if (pools.length === 1) return ['100'];\n\n if (pools) {\n const partialAmounts = pools.map(pool => {\n return math.bignumber(pool.partialAmountIn);\n });\n\n const ps: string[] = new Array(partialAmounts.length).fill('0');\n\n const sum =\n partialAmounts.length === 1\n ? partialAmounts[0]\n : math.sum(...partialAmounts);\n\n const sortedAmount = sortBy(partialAmounts, p => Number(p));\n\n let minIndexes: number[] = [];\n\n for (let k = 0; k < sortedAmount.length - 1; k++) {\n let minIndex = -1;\n\n for (let j = 0; j < partialAmounts.length; j++) {\n if (partialAmounts[j].eq(sortedAmount[k]) && !minIndexes.includes(j)) {\n minIndex = j;\n minIndexes.push(j);\n break;\n }\n }\n const res = math\n .round(percent(partialAmounts[minIndex].toString(), sum))\n .toString();\n\n if (Number(res) === 0) {\n ps[minIndex] = '1';\n } else {\n ps[minIndex] = res;\n }\n }\n\n const finalPIndex = ps.indexOf('0');\n\n ps[finalPIndex] = subtraction(\n '100',\n ps.length === 1 ? Number(ps[0]) : math.sum(...ps.map(p => Number(p)))\n ).toString();\n\n return ps;\n } else {\n return [];\n }\n}\n\nexport const isMobile = (): boolean => {\n return window.screen.width <= 600;\n};\nexport function divide(numerator: string, denominator: string) {\n return math.format(math.evaluate(`${numerator} / ${denominator}`), {\n notation: 'fixed',\n });\n}\n\nexport const getMax = function(id: string, amount: string) {\n return id !== WRAP_NEAR_CONTRACT_ID\n ? amount\n : Number(amount) <= 0.5\n ? '0'\n : String(Number(amount) - 0.5);\n};\n\nexport function getPointByPrice(\n pointDelta: number,\n price: string,\n decimalRate: number,\n noNeedSlot?: boolean\n) {\n const point = Math.log(+price * decimalRate) / Math.log(CONSTANT_D);\n const point_int = Math.round(point);\n let point_int_slot = point_int;\n if (!noNeedSlot) {\n point_int_slot = Math.floor(point_int / pointDelta) * pointDelta;\n }\n if (point_int_slot < POINTLEFTRANGE) {\n return POINTLEFTRANGE;\n } else if (point_int_slot > POINTRIGHTRANGE) {\n return 800000;\n }\n return point_int_slot;\n}\nexport const feeToPointDelta = (fee: number) => {\n switch (fee) {\n case 100:\n return 1;\n case 400:\n return 8;\n case 2000:\n return 40;\n case 10000:\n return 200;\n default:\n throw NoFeeToPool(fee);\n }\n};\n\nexport const priceToPoint = ({\n tokenA,\n tokenB,\n amountA,\n amountB,\n fee,\n}: {\n tokenA: TokenMetadata;\n tokenB: TokenMetadata;\n amountA: string;\n amountB: string;\n fee: number;\n}) => {\n if (DCL_POOL_FEE_LIST.indexOf(fee) === -1) throw NoFeeToPool(fee);\n\n const decimal_price_A_by_B = new Big(amountB).div(amountA);\n const undecimal_price_A_by_B = decimal_price_A_by_B\n .times(new Big(10).pow(tokenB.decimals))\n .div(new Big(10).pow(tokenA.decimals));\n\n const pointDelta = feeToPointDelta(fee);\n\n const price = decimal_price_A_by_B;\n\n const decimalRate = new Big(10)\n .pow(tokenB.decimals)\n .div(new Big(10).pow(tokenA.decimals))\n .toNumber();\n\n return getPointByPrice(\n pointDelta,\n scientificNotationToString(price.toString()),\n decimalRate\n );\n};\n\nexport const pointToPrice = ({\n tokenA,\n tokenB,\n point,\n}: {\n tokenA: TokenMetadata;\n tokenB: TokenMetadata;\n point: number;\n}) => {\n const undecimal_price = Math.pow(CONSTANT_D, point);\n const decimal_price_A_by_B = new Big(undecimal_price)\n .times(new Big(10).pow(tokenA.decimals))\n .div(new Big(10).pow(tokenB.decimals));\n\n return scientificNotationToString(decimal_price_A_by_B.toString());\n};\n\nexport const registerAccountOnToken = (AccountId: string) => {\n return {\n methodName: 'storage_deposit',\n args: {\n registration_only: true,\n account_id: AccountId,\n },\n gas: '30000000000000',\n amount: STORAGE_TO_REGISTER_WITH_MFT,\n };\n};\n","import {\n keyStores,\n KeyPair,\n InMemorySigner,\n providers,\n transactions as nearTransactions,\n utils,\n} from 'near-api-js';\nimport BN from 'bn.js';\nimport { getConfig } from './constant';\nimport fs from 'fs';\nimport os from 'os';\nimport {\n NoPuiblicKeyError,\n InValidAccessKeyError,\n NoCredential,\n} from './error';\nimport { AccessKeyView } from 'near-api-js/lib/providers/provider';\nimport { TransformedTransaction } from './types';\nimport { Transaction } from './types';\nimport { transformTransactions } from './utils';\nimport { AccountIdMisMatch } from './error';\n\nexport const getKeyStore = () => {\n return typeof window === 'undefined'\n ? new keyStores.InMemoryKeyStore()\n : new keyStores.BrowserLocalStorageKeyStore();\n};\n\nexport const provider = new providers.JsonRpcProvider({\n url: getConfig().nodeUrl,\n});\n\nexport const getMemorySigner = async ({\n AccountId,\n keyPath,\n}: {\n AccountId: string;\n keyPath: string;\n}) => {\n try {\n // const homedir = os.homedir();\n const credentials = JSON.parse(fs.readFileSync(keyPath).toString());\n\n const credentialAccountId = credentials?.account_id;\n\n if (!credentialAccountId) throw NoCredential;\n\n if (credentialAccountId !== AccountId) throw AccountIdMisMatch;\n\n const myKeyStore = new keyStores.InMemoryKeyStore();\n myKeyStore.setKey(\n getConfig().networkId,\n AccountId,\n KeyPair.fromString(credentials.private_key)\n );\n\n const signer = new InMemorySigner(myKeyStore);\n\n return signer;\n } catch (error) {\n throw error;\n }\n};\n\nconst validateAccessKey = (\n transaction: TransformedTransaction,\n accessKey: AccessKeyView\n) => {\n if (accessKey.permission === 'FullAccess') {\n return accessKey;\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n const { receiver_id, method_names } = accessKey.permission.FunctionCall;\n\n if (transaction.receiverId !== receiver_id) {\n return null;\n }\n\n return transaction.actions.every(action => {\n if (action.type !== 'FunctionCall') {\n return false;\n }\n\n const { methodName, deposit } = action.params;\n\n if (method_names.length && method_names.includes(methodName)) {\n return false;\n }\n\n return parseFloat(deposit) <= 0;\n });\n};\n\nexport const getSignedTransactionsByMemoryKey = async ({\n transactionsRef,\n AccountId,\n keyPath,\n}: {\n transactionsRef: Transaction[];\n AccountId: string;\n keyPath: string;\n}) => {\n const transactions = transformTransactions(transactionsRef, AccountId);\n\n const block = await provider.block({ finality: 'final' });\n\n const signedTransactions: Array<nearTransactions.SignedTransaction> = [];\n const signer = await getMemorySigner({\n AccountId,\n keyPath,\n });\n\n for (let i = 0; i < transactions.length; i += 1) {\n const transaction = transactions[i];\n\n const publicKey = await signer.getPublicKey(\n AccountId,\n getConfig().networkId\n );\n if (!publicKey) {\n throw NoPuiblicKeyError;\n }\n\n const accessKey = await provider.query<AccessKeyView>({\n request_type: 'view_access_key',\n finality: 'final',\n account_id: AccountId,\n public_key: publicKey.toString(),\n });\n\n if (!validateAccessKey(transaction, accessKey)) {\n throw InValidAccessKeyError;\n }\n\n const tx = nearTransactions.createTransaction(\n AccountId,\n utils.PublicKey.from(publicKey.toString()),\n transactions[i].receiverId,\n accessKey.nonce + i + 1,\n transaction.actions.map(action => {\n const { methodName, args, gas, deposit } = action.params;\n return nearTransactions.functionCall(\n methodName,\n args,\n new BN(gas),\n new BN(deposit)\n );\n }),\n utils.serialize.base_decode(block.header.hash)\n );\n\n const [, signedTx] = await nearTransactions.signTransaction(\n tx,\n signer,\n transactions[i].signerId,\n getConfig().networkId\n );\n signedTransactions.push(signedTx);\n }\n\n return signedTransactions;\n};\n\nexport const sendTransactionsByMemoryKey = async ({\n signedTransactions,\n}: {\n signedTransactions: nearTransactions.SignedTransaction[];\n}) => {\n try {\n const results: Array<providers.FinalExecutionOutcome> = [];\n\n for (let i = 0; i < signedTransactions.length; i += 1) {\n results.push(await provider.sendTransaction(signedTransactions[i]));\n }\n\n return results;\n } catch (err) {\n throw err;\n }\n};\n","import {\n REF_FI_CONTRACT_ID,\n config,\n WRAP_NEAR_CONTRACT_ID,\n NEAR_META_DATA,\n getConfig,\n switchEnv,\n} from './constant';\nimport {\n keyStores,\n Near,\n providers,\n WalletConnection,\n utils,\n} from 'near-api-js';\nimport { NoAccountIdFound, TokenNotExistError, DCLInValid } from './error';\nimport { getKeyStore } from './near';\n\nimport {\n TokenMetadata,\n FTStorageBalance,\n RefFiViewFunctionOptions,\n} from './types';\nimport { AccountView } from 'near-api-js/lib/providers/provider';\nimport { Transaction } from './types';\nimport { ONE_YOCTO_NEAR, REF_TOKEN_ID, REF_META_DATA } from './constant';\n\nimport metaIconDefaults from './metaIcons';\n\nconst BANANA_ID = 'berryclub.ek.near';\nconst CHEDDAR_ID = 'token.cheddar.near';\nconst CUCUMBER_ID = 'farm.berryclub.ek.near';\nconst HAPI_ID = 'd9c2d319cd7e6177336b0a9c93c21cb48d84fb54.factory.bridge.near';\nconst WOO_ID = '4691937a7508860f876c9c0a2a617e7d9e945d4b.factory.bridge.near';\n\nexport const REPLACE_TOKENS = [\n BANANA_ID,\n CHEDDAR_ID,\n CUCUMBER_ID,\n HAPI_ID,\n WOO_ID,\n];\n\nlet near = new Near({\n keyStore: getKeyStore(),\n headers: {},\n ...getConfig(),\n});\nexport const init_env = (env: string, indexerUrl?: string) => {\n near = new Near({\n keyStore: getKeyStore(),\n headers: {},\n ...getConfig(env, indexerUrl),\n });\n return switchEnv();\n};\n\nexport const refFiViewFunction = async ({\n methodName,\n args,\n}: RefFiViewFunctionOptions) => {\n const nearConnection = await near.account(REF_FI_CONTRACT_ID);\n\n return nearConnection.viewFunction(REF_FI_CONTRACT_ID, methodName, args);\n};\n\nexport const ftViewFunction = async (\n tokenId: string,\n { methodName, args }: RefFiViewFunctionOptions\n) => {\n const nearConnection = await near.account(REF_FI_CONTRACT_ID);\n\n return nearConnection.viewFunction(tokenId, methodName, args);\n};\n\nexport const ftGetStorageBalance = (\n tokenId: string,\n AccountId: string\n): Promise<FTStorageBalance | null> => {\n if (!AccountId) throw NoAccountIdFound;\n\n return ftViewFunction(tokenId, {\n methodName: 'storage_balance_of',\n args: { account_id: AccountId },\n });\n};\n\nexport const ftGetBalance = async (tokenId: string, AccountId: string) => {\n if (!AccountId) return '0';\n\n if (tokenId === 'NEAR') {\n return getAccountNearBalance(AccountId).catch(() => '0');\n }\n\n return ftViewFunction(tokenId, {\n methodName: 'ft_balance_of',\n args: {\n account_id: AccountId,\n },\n })\n .then(res => {\n return res;\n })\n .catch(() => '0');\n};\n\nexport const getTotalPools = async () => {\n return refFiViewFunction({\n methodName: 'get_number_of_pools',\n });\n};\n\nexport const ftGetTokenMetadata = async (\n id: string,\n tag?: string\n): Promise<TokenMetadata> => {\n if (id === REF_TOKEN_ID) return REF_META_DATA;\n\n const metadata = await ftViewFunction(id, {\n methodName: 'ft_metadata',\n }).catch(() => {\n throw TokenNotExistError(id);\n });\n\n if (\n !metadata.icon ||\n id === BANANA_ID ||\n id === CHEDDAR_ID ||\n id === CUCUMBER_ID ||\n id === HAPI_ID ||\n id === WOO_ID ||\n id === WRAP_NEAR_CONTRACT_ID\n ) {\n return {\n ...metadata,\n icon: metaIconDefaults[id],\n id,\n };\n }\n\n return { ...metadata, id };\n};\n\nexport const ftGetTokensMetadata = async (\n tokenIds?: string[],\n allTokens?: Record<string, TokenMetadata>\n) => {\n const ids = tokenIds || (await getGlobalWhitelist());\n\n const tokensMetadata = await Promise.all(\n ids.map(\n (id: string) =>\n allTokens?.[id] || ftGetTokenMetadata(id).catch(() => null)\n )\n );\n\n return tokensMetadata.reduce((pre, cur, i) => {\n return {\n ...pre,\n [ids[i]]: cur,\n };\n }, {}) as Record<string, TokenMetadata>;\n};\n\nexport const getGlobalWhitelist = async (): Promise<string[]> => {\n const globalWhitelist = await refFiViewFunction({\n methodName: 'get_whitelisted_tokens',\n });\n return Array.from(new Set(globalWhitelist));\n};\n\nexport const getUserRegisteredTokens = async (\n AccountId?: string\n): Promise<string[]> => {\n if (!AccountId) return [];\n\n return refFiViewFunction({\n methodName: 'get_user_whitelisted_tokens',\n args: { account_id: AccountId },\n });\n};\n\nexport const getAccountNearBalance = async (accountId: string) => {\n const provider = new providers.JsonRpcProvider({\n url: getConfig().nodeUrl,\n });\n\n return provider\n .query<AccountView>({\n request_type: 'view_account',\n finality: 'final',\n account_id: accountId,\n })\n .then(data => data.amount);\n};\n\nexport const nearDepositTransaction = (amount: string) => {\n const transaction: Transaction = {\n receiverId: WRAP_NEAR_CONTRACT_ID,\n functionCalls: [\n {\n methodName: 'near_deposit',\n args: {},\n gas: '50000000000000',\n amount,\n },\n ],\n };\n\n return transaction;\n};\n\nexport const nearWithdrawTransaction = (amount: string) => {\n const transaction: Transaction = {\n receiverId: WRAP_NEAR_CONTRACT_ID,\n functionCalls: [\n {\n methodName: 'near_withdraw',\n args: { amount: utils.format.parseNearAmount(amount) },\n amount: ONE_YOCTO_NEAR,\n },\n ],\n };\n return transaction;\n};\n\nexport const refDCLSwapViewFunction = async ({\n methodName,\n args,\n}: RefFiViewFunctionOptions) => {\n const nearConnection = await near.account(REF_FI_CONTRACT_ID);\n\n if (!config.REF_DCL_SWAP_CONTRACT_ID) throw DCLInValid;\n\n return nearConnection.viewFunction(\n config.REF_DCL_SWAP_CONTRACT_ID,\n methodName,\n args\n );\n};\n\nexport const DCLSwapGetStorageBalance = (\n tokenId: string,\n AccountId: string\n) => {\n return refDCLSwapViewFunction({\n methodName: 'storage_balance_of',\n args: { account_id: AccountId },\n });\n};\n","import { TokenMetadata, Transaction } from '../types';\nimport {\n priceToPoint,\n toNonDivisibleNumber,\n toPrecision,\n registerAccountOnToken,\n} from '../utils';\nimport { ONE_YOCTO_NEAR, WRAP_NEAR_CONTRACT_ID, config } from '../constant';\nimport {\n nearDepositTransaction,\n ftGetStorageBalance,\n refDCLSwapViewFunction,\n} from '../ref';\nimport { NoFeeToPool } from '../error';\n\nexport const DCL_POOL_FEE_LIST = [100, 400, 2000, 10000];\n\ninterface PoolInfo {\n pool_id?: string;\n token_x?: string;\n token_y?: string;\n fee: number;\n point_delta?: number;\n current_point?: number;\n state?: string;\n liquidity?: string;\n liquidity_x?: string;\n max_liquidity_per_point?: string;\n percent?: string;\n total_x?: string;\n total_y?: string;\n tvl?: number;\n token_x_metadata?: TokenMetadata;\n token_y_metadata?: TokenMetadata;\n}\n\nexport const getDCLPoolId = (tokenA: string, tokenB: string, fee: number) => {\n if (DCL_POOL_FEE_LIST.indexOf(fee) === -1) throw NoFeeToPool(fee);\n\n const tokenSeq = [tokenA, tokenB].sort().join('|');\n\n return `${tokenSeq}|${fee}`;\n};\nexport const listDCLPools = () => {\n return refDCLSwapViewFunction({\n methodName: 'list_pools',\n });\n};\n\nexport const getDCLPool = async (pool_id: string) => {\n const [token_x, token_y, fee] = pool_id.split('|');\n\n const token_seq = [token_x, token_y].sort().join('|');\n\n const new_pool_id = `${token_seq}|${fee}`;\n\n return refDCLSwapViewFunction({\n methodName: 'get_pool',\n args: {\n pool_id: new_pool_id,\n },\n }) as Promise<PoolInfo>;\n};\n","import { config, getConfig } from './constant';\nimport { DCL_POOL_FEE_LIST } from './dcl-swap/dcl-pool';\n\nexport const formatError = (msg: string) => {\n return new Error(msg);\n};\n\nexport const unNamedError = formatError('Something wrong happened');\n\nexport const SameInputTokenError = formatError(\n 'Input token should be different with output token'\n);\n\nexport const ZeroInputError = formatError(\n 'Input amount should be greater than 0'\n);\n\nexport const NoPoolError = formatError('No pool found for the input tokens');\n\nexport const NotLoginError = formatError('Please login in first');\n\nexport const SwapRouteError = formatError(\n \"Something wrong happened, we don't get correct routes corrreponding to current input\"\n);\n\nexport const TokenNotExistError = (id: string) =>\n formatError(`${id} doesn't exist in ${getConfig().networkId}`);\n\nexport const NoPuiblicKeyError = formatError('No public key found');\n\nexport const NoLocalSignerError = formatError('No local signer found');\n\nexport const InValidAccessKeyError = formatError('Invalid access key');\n\nexport const AccountIdMisMatch = formatError(\n \"Your input account id doesn't match the account id in the credential\"\n);\n\nexport const NoCredential = formatError('No Credential to such path');\n\nexport const NoAccountIdFound = formatError('No account id found');\n\nexport const NoFeeToPool = (fee: number) =>\n formatError(\n `InValid fee ${fee} to DCL pool, the valid fee should be one of ${DCL_POOL_FEE_LIST}`\n );\n\nexport const DCLInValid = formatError(\n `DCL contract currently in Valid on ${config.networkId}`\n);\n\nexport const NoPoolOnThisPair = (tokenA: string, tokenB: string) =>\n formatError(`No pools on pair ${tokenA} <> ${tokenB}`);\n\nexport const SlippageError = formatError(\n 'slippage tolerance should be in range (0, 100)'\n);\n\nexport const NoOrderFound = (order_id?: string) =>\n formatError(`No order ${order_id || ''} found`);\n\nexport const OrderNoRemainedAmount = formatError(\n 'No remained amount on this order'\n);\n","import { TokenMetadata, EstimateSwapView, Transaction } from '../types';\nimport { ftGetStorageBalance } from '../ref';\nimport {\n STORAGE_TO_REGISTER_WITH_MFT,\n REF_FI_CONTRACT_ID,\n ONE_YOCTO_NEAR,\n} from '../constant';\nimport { round, percentLess } from '../utils';\nimport { toNonDivisibleNumber } from '../utils';\nimport { config } from '../constant';\nimport { SwapRouteError } from '../error';\n\nexport const instantSwap = async ({\n tokenIn,\n tokenOut,\n amountIn,\n slippageTolerance,\n swapTodos,\n AccountId,\n referralId,\n}: {\n tokenIn: TokenMetadata;\n tokenOut: TokenMetadata;\n amountIn: string;\n slippageTolerance: number;\n swapTodos: EstimateSwapView[];\n AccountId: string;\n referralId?: string;\n}) => {\n const transactions: Transaction[] = [];\n\n if (swapTodos?.[swapTodos?.length - 1]?.outputToken !== tokenOut.id)\n throw SwapRouteError;\n\n const registerToken = async (token: TokenMetadata) => {\n const tokenRegistered = await ftGetStorageBalance(\n token.id,\n AccountId\n ).catch(() => {\n throw new Error(`${token.id} doesn't exist.`);\n });\n\n if (tokenRegistered === null) {\n transactions.push({\n receiverId: token.id,\n functionCalls: [\n {\n methodName: 'storage_deposit',\n args: {\n registration_only: true,\n account_id: AccountId,\n },\n gas: '30000000000000',\n amount: STORAGE_TO_REGISTER_WITH_MFT,\n },\n ],\n });\n }\n };\n\n if (tokenIn.id === config.WRAP_NEAR_CONTRACT_ID) {\n const registered = await ftGetStorageBalance(\n config.WRAP_NEAR_CONTRACT_ID,\n AccountId\n );\n if (registered === null) {\n await registerToken(tokenIn);\n }\n }\n\n await registerToken(tokenOut);\n let actionsList: any = [];\n let allSwapsTokens = swapTodos.map(s => [s.inputToken, s.outputToken]); // to get the hop tokens\n for (let i in allSwapsTokens) {\n let swapTokens = allSwapsTokens[i];\n if (swapTokens[0] === tokenIn.id && swapTokens[1] === tokenOut.id) {\n // parallel, direct hop route.\n actionsList.push({\n pool_id: swapTodos[i].pool.id,\n token_in: tokenIn.id,\n token_out: tokenOut.id,\n amount_in: swapTodos[i].pool.partialAmountIn,\n min_amount_out: round(\n tokenOut.decimals,\n toNonDivisibleNumber(\n tokenOut.decimals,\n percentLess(slippageTolerance, swapTodos[i].estimate)\n )\n ),\n });\n } else if (swapTokens[0] === tokenIn.id) {\n // first hop in double hop route\n //TODO -- put in a check to make sure this first hop matches with the next (i+1) hop as a second hop.\n actionsList.push({\n pool_id: swapTodos[i].pool.id,\n token_in: swapTokens[0],\n token_out: swapTokens[1],\n amount_in: swapTodos[i].pool.partialAmountIn,\n min_amount_out: '0',\n });\n } else {\n // second hop in double hop route.\n //TODO -- put in a check to make sure this second hop matches with the previous (i-1) hop as a first hop.\n actionsList.push({\n pool_id: swapTodos[i].pool.id,\n token_in: swapTokens[0],\n token_out: swapTokens[1],\n min_amount_out: round(\n tokenOut.decimals,\n toNonDivisibleNumber(\n tokenOut.decimals,\n percentLess(slippageTolerance, swapTodos[i].estimate)\n )\n ),\n });\n }\n }\n\n transactions.push({\n receiverId: tokenIn.id,\n functionCalls: [\n {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: REF_FI_CONTRACT_ID,\n amount: toNonDivisibleNumber(tokenIn.decimals, amountIn),\n msg: !!referralId\n ? JSON.stringify({\n force: 0,\n actions: actionsList,\n referral_id: referralId,\n })\n : JSON.stringify({\n force: 0,\n actions: actionsList,\n }),\n },\n gas: '180000000000000',\n amount: ONE_YOCTO_NEAR,\n },\n ],\n });\n\n return transactions;\n};\n","import { getTotalPools, refFiViewFunction } from '../ref';\nimport { Pool, PoolRPCView } from '../types';\nimport { parsePool, toNonDivisibleNumber } from '../utils';\nimport { STABLE_LP_TOKEN_DECIMALS, config } from '../constant';\n\nlet DEFAULT_PAGE_LIMIT = 100;\nconst BLACK_TOKEN_LIST = ['meta-token.near'];\n\nexport const getRatedPoolDetail = async ({ id }: { id: string | number }) => {\n return refFiViewFunction({\n methodName: 'get_rated_pool',\n args: { pool_id: Number(id) },\n }).then(pool_info => ({\n ...pool_info,\n id: Number(id),\n pool_kind: 'RATED_SWAP',\n }));\n};\n\nexport const getUnRatedPoolDetail = async ({ id }: { id: string | number }) => {\n return refFiViewFunction({\n methodName: 'get_stable_pool',\n args: { pool_id: Number(id) },\n }).then(pool_info => ({\n ...pool_info,\n id: Number(id),\n pool_kind: 'STABLE_SWAP',\n rates: pool_info.c_amounts.map((_: any) =>\n toNonDivisibleNumber(STABLE_LP_TOKEN_DECIMALS, '1')\n ),\n }));\n};\n\nexport const getStablePools = async (stablePools: Pool[]) => {\n return Promise.all(\n stablePools.map(pool =>\n pool.pool_kind === 'RATED_SWAP'\n ? getRatedPoolDetail({ id: pool.id })\n : getUnRatedPoolDetail({ id: pool.id })\n )\n );\n};\n\nexport const getPool = async (id: number): Promise<Pool> => {\n return await refFiViewFunction({\n methodName: 'get_pool',\n args: { pool_id: id },\n }).then((pool: PoolRPCView) => parsePool(pool, id));\n};\n\nexport const getPoolByIds = async (ids: number[]): Promise<Pool[]> => {\n return await refFiViewFunction({\n methodName: 'get_pool_by_ids',\n args: { pool_ids: ids },\n }).then((pools: PoolRPCView[]) => pools.map((p, i) => parsePool(p, ids[i])));\n};\n\nexport const getRefPools = async (\n page: number = 1,\n perPage: number = DEFAULT_PAGE_LIMIT\n): Promise<Pool[]> => {\n const index = (page - 1) * perPage;\n const poolData: PoolRPCView[] = await refFiViewFunction({\n methodName: 'get_pools',\n args: { from_index: index, limit: perPage },\n });\n return poolData\n .map((rawPool, i) => parsePool(rawPool, i + index))\n .filter(\n p => !p.tokenIds?.find(tokenId => BLACK_TOKEN_LIST.includes(tokenId))\n );\n};\n\nexport const fetchAllPools = async (perPage?: number) => {\n try {\n const pools = await fetch(`${config.indexerUrl}/fetchAllPools`).then(res =>\n res.json()\n );\n return pools;\n } catch (error) {}\n if (perPage) {\n DEFAULT_PAGE_LIMIT = Math.min(perPage, 500);\n }\n const totalPools = await getTotalPools();\n const pages = Math.ceil(totalPools / DEFAULT_PAGE_LIMIT);\n const pools = (\n await Promise.all(\n [...Array(pages)].fill(0).map((_, i) => getRefPools(i + 1))\n )\n ).flat() as Pool[];\n return {\n simplePools: pools.filter(\n p => p.pool_kind && p.pool_kind === 'SIMPLE_POOL'\n ),\n unRatedPools: pools.filter(\n p => p.pool_kind && p.pool_kind === 'STABLE_SWAP'\n ),\n ratedPools: pools.filter(p => p.pool_kind && p.pool_kind === 'RATED_SWAP'),\n };\n};\n","import React, {\n useEffect,\n useState,\n useContext,\n createContext,\n ReactNode,\n} from 'react';\nimport {\n ftGetBalance,\n ftGetTokenMetadata,\n getGlobalWhitelist,\n nearDepositTransaction,\n nearWithdrawTransaction,\n REPLACE_TOKENS,\n} from '../ref';\nimport {\n EstimateSwapView,\n Pool,\n StablePool,\n TokenMetadata,\n Transaction,\n} from '../types';\nimport { fetchAllPools, getStablePools } from '../v1-swap/pool';\nimport { estimateSwap, SwapOptions, SwapParams } from '../v1-swap/swap';\nimport { SwapOutParams } from './types';\nimport {\n percentLess,\n separateRoutes,\n toNonDivisibleNumber,\n calculateExchangeRate,\n getAvgFee,\n} from '../utils';\nimport Big from 'big.js';\nimport { instantSwap } from '../v1-swap/instantSwap';\n\nimport { getExpectedOutputFromActionsORIG } from '../v1-swap/smartRoutingLogic.js';\nimport { Theme } from './constant';\nimport { defaultTheme } from './constant';\nimport {\n getTokenPriceList,\n getTokens,\n getWhiteListTokensIndexer,\n} from '../indexer';\nimport {\n toReadableNumber,\n ONLY_ZEROS,\n getExpectedOutputFromSwapTodos,\n} from '../utils';\nimport { getUserRegisteredTokens } from '../ref';\nimport { WRAP_NEAR_CONTRACT_ID, NEAR_META_DATA } from '../constant';\nimport { scientificNotationToString } from '../utils';\nimport metaIconDefaults from '../metaIcons';\n\nexport const ThemeContext = createContext<Theme>(defaultTheme);\n\nexport const ThemeContextProvider: React.FC<{\n customTheme: Theme | undefined;\n}> = ({ customTheme, children }) => {\n const [theme, setTheme] = useState<Theme>(customTheme || defaultTheme);\n\n useEffect(() => {\n if (!customTheme) return;\n setTheme(customTheme);\n }, [customTheme]);\n\n return (\n <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>\n );\n};\n\nexport const estimateValidator = (\n swapTodos: EstimateSwapView[],\n tokenIn: TokenMetadata,\n parsedAmountIn: string,\n tokenOut: TokenMetadata\n) => {\n const tokenInId = swapTodos[0]?.inputToken;\n const tokenOutId = swapTodos[swapTodos.length - 1]?.outputToken;\n\n const totalPartialAmountIn =\n swapTodos.length === 0\n ? new Big(swapTodos[0].pool.partialAmountIn || 0)\n : swapTodos.reduce(\n (acc, cur, i) => acc.plus(cur.pool.partialAmountIn || 0),\n new Big(0)\n );\n\n if (\n tokenInId !== tokenIn.id ||\n tokenOutId !== tokenOut.id ||\n !totalPartialAmountIn.eq(parsedAmountIn || '0')\n ) {\n return false;\n }\n return true;\n};\n\nexport const useAllTokens = ({ reload }: { reload?: boolean }) => {\n const [tokens, setTokens] = useState<Record<string, TokenMetadata>>();\n const [tokensLoading, setTokensLoading] = useState<boolean>(true);\n\n useEffect(() => {\n const fetchTokens = async () => {\n const tokens = await getTokens(reload);\n setTokens(tokens);\n setTokensLoading(false);\n };\n fetchTokens();\n }, [reload]);\n\n return { tokens, tokensLoading };\n};\n\nexport const useTokensIndexer = ({\n defaultTokenList,\n AccountId,\n}: {\n defaultTokenList?: TokenMetadata[];\n AccountId?: string;\n}) => {\n const [tokens, setTokens] = useState<TokenMetadata[]>([]);\n\n const [tokenLoading, setTokenLoading] = useState<boolean>(false);\n\n useEffect(() => {\n setTokenLoading(true);\n\n const getTokensList = async () => {\n const whiteList = await getGlobalWhitelist();\n const globalWhiteListTokens = (\n await getWhiteListTokensIndexer(whiteList)\n ).filter(token => !!token) as TokenMetadata[];\n\n const parsedTokens = globalWhiteListTokens.map(t => {\n return t.id === WRAP_NEAR_CONTRACT_ID\n ? {\n ...NEAR_META_DATA,\n id: t.id,\n }\n : t;\n });\n\n if (!defaultTokenList || defaultTokenList.length === 0) {\n setTokens(parsedTokens);\n setTokenLoading(false);\n } else {\n const newList = defaultTokenList\n .map(t => {\n return t.id === WRAP_NEAR_CONTRACT_ID\n ? {\n ...NEAR_META_DATA,\n id: t.id,\n }\n : t;\n })\n .filter(t => {\n return parsedTokens.findIndex(p => p.id === t.id) !== -1;\n });\n setTokens(\n newList.map(t =>\n !t.icon || REPLACE_TOKENS.includes(t.id)\n ? {\n ...t,\n icon: metaIconDefaults[t.id],\n }\n : t\n )\n );\n setTokenLoading(false);\n }\n };\n\n getTokensList();\n }, [AccountId, defaultTokenList]);\n\n return { tokens, tokenLoading };\n};\n\nexport const useRefPools = (refreshTrigger: boolean) => {\n const [allPools, setAllPools] = useState<{\n simplePools: Pool[];\n ratedPools: Pool[];\n unRatedPools: Pool[];\n }>({\n simplePools: [],\n ratedPools: [],\n unRatedPools: [],\n });\n\n const [poolFetchingState, setPoolFetchingState] = useState<'loading' | 'end'>(\n 'loading'\n );\n\n const [allStablePools, setAllStablePools] = useState<StablePool[]>([]);\n\n useEffect(() => {\n setPoolFetchingState('loading');\n\n fetchAllPools()\n .then(allPools => {\n setAllPools(allPools);\n\n return allPools;\n })\n .then(allPools => {\n const pools: Pool[] = allPools.unRatedPools.concat(allPools.ratedPools);\n\n return getStablePools(pools).then(setAllStablePools);\n })\n .finally(() => {\n setPoolFetchingState('end');\n });\n }, [refreshTrigger]);\n\n return {\n allPools,\n allStablePools,\n poolFetchingState,\n };\n};\n\nexport const useSwap = (\n params: {\n tokenIn?: TokenMetadata;\n tokenOut?: TokenMetadata;\n amountIn: string;\n simplePools: Pool[];\n options?: SwapOptions;\n } & {\n slippageTolerance: number;\n refreshTrigger: boolean;\n onSwap: (transactionsRef: Transaction[]) => void;\n AccountId?: string;\n poolFetchingState?: 'loading' | 'end';\n referralId?: string;\n }\n): SwapOutParams => {\n const {\n slippageTolerance,\n refreshTrigger,\n onSwap,\n AccountId,\n poolFetchingState,\n referralId,\n ...swapParams\n } = params;\n\n const { tokenIn, tokenOut, amountIn } = params;\n\n const [estimates, setEstimates] = useState<EstimateSwapView[]>([]);\n\n const [canSwap, setCanSwap] = useState(false);\n\n const [swapError, setSwapError] = useState<Error | null>(null);\n\n const [amountOut, setAmountOut] = useState<string>('');\n\n const [isEstimating, setIsEstimating] = useState<boolean>(false);\n\n const [forceEstimate, setForceEstimate] = useState<boolean>(false);\n\n const minAmountOut = amountOut\n ? percentLess(slippageTolerance, amountOut)\n : '';\n\n const fee =\n !params.tokenOut || !params.tokenIn\n ? 0\n : getAvgFee(\n estimates,\n params.tokenOut.id,\n toNonDivisibleNumber(params.tokenIn.decimals, params.amountIn)\n );\n\n const rate = calculateExchangeRate(\n ONLY_ZEROS.test(params.amountIn) ? '1' : params.amountIn,\n amountOut || '1'\n );\n\n const makeSwap = async () => {\n if (!params.tokenIn || !params.tokenOut) return;\n\n const transactionsRef = await instantSwap({\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n swapTodos: estimates,\n slippageTolerance,\n AccountId: AccountId || '',\n referralId,\n });\n if (tokenIn && tokenIn.id === WRAP_NEAR_CONTRACT_ID) {\n transactionsRef.splice(-1, 0, nearDepositTransaction(amountIn));\n }\n if (tokenOut && tokenOut.id === WRAP_NEAR_CONTRACT_ID) {\n let outEstimate = new Big(0);\n const routes = separateRoutes(estimates, tokenOut.id);\n\n const bigEstimate = routes.reduce((acc, cur) => {\n const curEstimate = cur[cur.length - 1].estimate;\n return acc.plus(curEstimate);\n }, outEstimate);\n\n const minAmountOut = percentLess(\n slippageTolerance,\n\n scientificNotationToString(bigEstimate.toString())\n );\n\n transactionsRef.push(nearWithdrawTransaction(minAmountOut));\n }\n\n onSwap(transactionsRef);\n };\n\n const getEstimate = () => {\n if (\n !params.tokenIn ||\n !params.tokenOut ||\n poolFetchingState === 'loading'\n ) {\n setCanSwap(false);\n return;\n }\n setCanSwap(false);\n\n if (\n ONLY_ZEROS.test(params.amountIn) ||\n !params.tokenOut ||\n !params.tokenIn\n ) {\n setAmountOut('');\n setEstimates([]);\n return;\n }\n\n setSwapError(null);\n setIsEstimating(true);\n estimateSwap({\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n amountIn: params.amountIn,\n simplePools: params.simplePools,\n options: params.options,\n })\n .then(estimates => {\n if (\n ONLY_ZEROS.test(params.amountIn) ||\n !params.tokenOut ||\n !params.tokenIn\n ) {\n setAmountOut('');\n return;\n }\n setSwapError(null);\n\n const expectAmountOut = getExpectedOutputFromSwapTodos(\n estimates,\n params.tokenOut.id\n ).toString();\n\n setAmountOut(expectAmountOut);\n\n setEstimates(estimates);\n setCanSwap(true);\n })\n .catch(e => {\n setSwapError(e);\n setCanSwap(false);\n setAmountOut('');\n })\n .finally(() => {\n setIsEstimating(false);\n setForceEstimate(false);\n });\n };\n\n useEffect(() => {\n const estimateValidationPass =\n estimates.length > 0 &&\n params.tokenIn &&\n params.tokenOut &&\n estimateValidator(\n estimates,\n params.tokenIn,\n toNonDivisibleNumber(params.tokenIn.decimals, params.amountIn),\n params.tokenOut\n );\n\n if (isEstimating && estimates && !forceEstimate) return;\n if ((estimateValidationPass || swapError) && !forceEstimate) return;\n getEstimate();\n }, [\n params.amountIn,\n params.tokenIn?.id,\n params.tokenOut?.id,\n refreshTrigger,\n poolFetchingState,\n isEstimating,\n forceEstimate,\n ]);\n\n useEffect(() => {\n // setEstimating(false);\n\n setForceEstimate(true);\n }, [\n params.tokenIn?.id,\n params.tokenOut?.id,\n params.options?.enableSmartRouting,\n ]);\n\n return {\n amountOut,\n minAmountOut,\n fee,\n rate,\n estimates,\n makeSwap,\n canSwap,\n swapError,\n setAmountOut,\n isEstimating,\n };\n};\n\nexport const TokenPriceContext = createContext<Record<string, any> | null>(\n null\n);\n\nexport const useTokenPriceList = () => {\n const [tokenPriceList, setTokenPriceList] = useState<Record<string, any>>({});\n\n useEffect(() => {\n getTokenPriceList().then(setTokenPriceList);\n }, []);\n\n return tokenPriceList;\n};\n\nexport const TokenPriceContextProvider: React.FC = ({ children }) => {\n const tokenPriceList = useTokenPriceList();\n\n return (\n <TokenPriceContext.Provider value={tokenPriceList}>\n {children}\n </TokenPriceContext.Provider>\n );\n};\n\nexport const useTokenBalnces = (tokens: TokenMetadata[], AccountId: string) => {\n const [balances, setBalances] = useState<Record<string, string>>({});\n\n useEffect(() => {\n const validTokens = tokens.filter(t => !!t?.id);\n\n const ids = validTokens.map(token => token.id);\n\n Promise.all(\n ids.map(id =>\n ftGetBalance(id === WRAP_NEAR_CONTRACT_ID ? 'NEAR' : id, AccountId)\n )\n ).then(balances => {\n const balancesMap = validTokens.reduce((acc, token, index) => {\n return {\n ...acc,\n [token.id]: toReadableNumber(token.decimals, balances[index]),\n };\n }, {});\n\n setBalances(balancesMap);\n });\n }, [tokens.map(t => t?.id).join('-')]);\n\n return balances;\n};\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import React, { useState, useEffect, useContext, useRef, useMemo } from 'react';\nimport { TokenMetadata, EstimateSwapView, Pool } from '../types';\nimport {\n ThemeContext,\n useTokenPriceList,\n TokenPriceContext,\n useTokenBalnces,\n} from './state';\n\nimport { FiChevronDown } from '@react-icons/all-files/fi/FiChevronDown';\n\nimport { FiChevronLeft } from '@react-icons/all-files/fi/FiChevronLeft';\n\nimport { FiChevronUp } from '@react-icons/all-files/fi/FiChevronUp';\n\nimport { FaSearch } from '@react-icons/all-files/fa/FaSearch';\n\nimport { RiRefreshLine } from '@react-icons/all-files/ri/RiRefreshLine';\n\nimport { TiArrowSortedUp } from '@react-icons/all-files/ti/TiArrowSortedUp';\n\nimport { TiArrowSortedDown } from '@react-icons/all-files/ti/TiArrowSortedDown';\n\nimport { HiOutlineExternalLink } from '@react-icons/all-files/hi/HiOutlineExternalLink';\n\nimport { AiFillPushpin } from '@react-icons/all-files/ai/AiFillPushpin';\n\nimport { AiOutlinePushpin } from '@react-icons/all-files/ai/AiOutlinePushpin';\n\nimport { RiExchangeFill } from '@react-icons/all-files/ri/RiExchangeFill';\n\nimport { IoWarning } from '@react-icons/all-files/io5/IoWarning';\n\nimport { IoCloseOutline } from '@react-icons/all-files/io5/IoCloseOutline';\n\nimport { AiOutlineClose } from '@react-icons/all-files/ai/AiOutlineClose';\n\nimport './style.css';\nimport {\n getAccountName,\n symbolsArr,\n multiply,\n percentOfBigNumber,\n ONLY_ZEROS,\n toRealSymbol,\n toPrecision,\n toInternationalCurrencySystemLongString,\n calculateFeeCharge,\n calculateFeePercent,\n} from '../utils';\nimport { REF_WIDGET_STAR_TOKEN_LIST_KEY } from './constant';\nimport Big from 'big.js';\nimport {\n config,\n FEE_DIVISOR,\n getConfig,\n NEAR_META_DATA,\n TokenLinks,\n WRAP_NEAR_CONTRACT_ID,\n} from '../constant';\nimport {\n scientificNotationToString,\n percent,\n getPoolAllocationPercents,\n} from '../utils';\nimport {\n REF_WIDGET_SWAP_DETAIL_KEY,\n DEFAULT_START_TOKEN_LIST_TESTNET,\n DEFAULT_START_TOKEN_LIST_MAINNET,\n} from './constant';\nimport { PoolMode } from '../v1-swap/swap';\nimport { isMobile, separateRoutes, divide, getMax } from '../utils';\n\ninterface TokenAmountProps {\n balance?: string;\n reloading?: JSX.Element;\n token?: TokenMetadata;\n onSelectToken: () => void;\n amount: string;\n onChangeAmount?: (amount: string) => void;\n price?: string;\n onForceUpdate?: () => void;\n poolFetchingState?: 'loading' | 'end';\n}\n\nexport const getPriceImpact = (\n value: string,\n tokenIn: TokenMetadata,\n tokenInAmount: string\n) => {\n const textColor =\n Number(value) <= 1\n ? 'text-greenLight'\n : 1 < Number(value) && Number(value) <= 2\n ? 'text-warn'\n : 'text-error';\n\n const displayValue = scientificNotationToString(\n multiply(tokenInAmount || '0', divide(value, '100'))\n );\n\n const tokenInInfo =\n Number(displayValue) <= 0\n ? ` / 0 ${toRealSymbol(tokenIn.symbol)}`\n : ` / -${toInternationalCurrencySystemLongString(\n displayValue,\n 3\n )} ${toRealSymbol(tokenIn.symbol)}`;\n\n if (Number(value) < 0.01)\n return (\n <span className=\"text-greenLight\">\n {`< -0.01%`}\n {tokenInInfo}\n </span>\n );\n\n if (Number(value) > 1000)\n return (\n <span className=\"text-error\">\n {`< -1000%`}\n {tokenInInfo}\n </span>\n );\n\n return (\n <span className={`${textColor} font-sans`}>\n {`≈ -${toPrecision(value, 2)}%`}\n {tokenInInfo}\n </span>\n );\n};\n\nexport const SmartRouteV2 = ({\n tokens: tokensRaw,\n p,\n pools,\n}: {\n tokens: TokenMetadata[];\n p: string;\n pools: Pool[];\n}) => {\n const theme = useContext(ThemeContext);\n\n const tokens = tokensRaw.map(t =>\n t.id === WRAP_NEAR_CONTRACT_ID\n ? { ...NEAR_META_DATA, id: WRAP_NEAR_CONTRACT_ID }\n : t\n );\n\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n iconDefault,\n iconHover,\n } = theme;\n\n const ParaTokenFrom = ({\n tokenIn,\n p,\n }: {\n tokenIn: TokenMetadata;\n p: string;\n }) => {\n return (\n <div\n className=\"__ref-swap-widget-row-flex-center \"\n style={{\n width: '60px',\n }}\n >\n <span\n style={{\n marginRight: '4px',\n }}\n >\n {p}%\n </span>\n <span className=\"\">\n <Icon token={tokenIn} />\n </span>\n </div>\n );\n };\n const Icon = ({ token }: { token: TokenMetadata }) => {\n if (token.icon) {\n return (\n <img\n src={token.icon}\n alt=\"\"\n style={{\n borderRadius: '100%',\n height: '16px',\n width: '16px',\n flexShrink: 0,\n }}\n />\n );\n } else {\n return (\n <div\n style={{\n borderRadius: '100%',\n height: '16px',\n width: '16px',\n }}\n />\n );\n }\n };\n const Hub = ({ token, poolId }: { token: TokenMetadata; poolId: number }) => {\n return (\n <div\n className={`__ref-swap-widget-row-flex-center`}\n style={{\n width: '62px',\n height: '22px',\n }}\n >\n <div\n className={`w-full flex items-center justify-start pl-2 `}\n style={{\n marginRight: '4px',\n }}\n >\n <span className=\"text-gray-400\">{`#${poolId}`}</span>\n </div>\n <Icon token={token} />\n </div>\n );\n };\n\n if (tokens.length === 3) {\n return (\n <div className=\"__ref-swap-widget-row-flex-center __ref-swap-widget-swap_route_row\">\n {/* <Hub token={tokens[0]} /> */}\n\n <ParaTokenFrom tokenIn={tokens[0]} p={p} />\n <div\n className=\"\"\n style={{\n position: 'relative',\n bottom: '1px',\n }}\n >\n <ArrowRight />\n </div>\n\n <Hub token={tokens[1]} poolId={pools?.[0]?.id} />\n <div\n className=\"px-3\"\n style={{\n position: 'relative',\n bottom: '1px',\n }}\n >\n <ArrowRight />\n </div>\n\n <Hub token={tokens[2]} poolId={pools?.[1]?.id} />\n </div>\n );\n } else if (tokens.length === 2) {\n return (\n <div className=\"__ref-swap-widget-row-flex-center __ref-swap-widget-swap_route_row\">\n <ParaTokenFrom tokenIn={tokens[0]} p={p} />\n <div className=\"px-3\">\n <ArrowRight />\n </div>\n <Hub token={tokens[1]} poolId={pools?.[0]?.id} />\n </div>\n );\n } else {\n return null;\n }\n};\n\nexport const DetailView = ({\n tokenIn,\n tokenOut,\n rate,\n fee,\n minReceived,\n amountIn,\n amountOut,\n priceImpact,\n estimates,\n}: {\n tokenIn: TokenMetadata | undefined;\n tokenOut: TokenMetadata | undefined;\n rate: string;\n fee: number;\n minReceived: string;\n amountIn: string;\n amountOut: string;\n priceImpact: string;\n estimates: EstimateSwapView[];\n}) => {\n const theme = useContext(ThemeContext);\n\n const storagedOpen = !!localStorage.getItem(REF_WIDGET_SWAP_DETAIL_KEY);\n\n const [showDetail, setShowDetail] = useState(storagedOpen || false);\n const [isRateReverse, setIsRateReverse] = useState(false);\n\n const tokensPerRoute = estimates\n .filter(swap => swap.inputToken === tokenIn?.id)\n .map(swap => swap.tokens);\n\n const identicalRoutes = separateRoutes(\n estimates,\n estimates[estimates.length - 1]?.outputToken || ''\n );\n\n const pools = identicalRoutes.map(r => r[0]).map(hub => hub.pool);\n const percents = useMemo(() => {\n if (!pools || pools.length === 0) return [];\n return getPoolAllocationPercents(pools);\n }, [pools]);\n\n const priceImpactDisplay = useMemo(() => {\n if (!priceImpact || !tokenIn || !amountIn) return null;\n return getPriceImpact(priceImpact, tokenIn, amountIn);\n }, [priceImpact, tokenIn, amountIn]);\n if (!tokenIn || !tokenOut) return null;\n\n const displayRate = `1 ${toRealSymbol(tokenIn.symbol)} ≈ ${\n Number(rate) < 0.01 ? '< 0.01' : toPrecision(rate, 2)\n } ${toRealSymbol(tokenOut.symbol)}`;\n\n const revertRate = new Big(1).div(ONLY_ZEROS.test(rate) ? '1' : rate || '1');\n\n const revertDisplayRate = `1 ${toRealSymbol(tokenOut.symbol)} ≈ ${\n Number(revertRate) < 0.01 ? '< 0.01' : toPrecision(revertRate.toString(), 2)\n } ${toRealSymbol(tokenIn.symbol)}`;\n\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n iconDefault,\n iconHover,\n } = theme;\n\n return (\n <div\n className=\"__ref-widget-swap-detail-view __ref-swap-widget-col-flex-start\"\n style={{\n color: secondary,\n }}\n >\n <div className=\"__ref-swap-widget-row-flex-center __ref-swap-widget-swap-detail-view-item\">\n <div\n style={{\n color: primary,\n cursor: 'pointer',\n }}\n className=\"__ref-swap-widget-row-flex-center\"\n onClick={() => {\n if (showDetail) localStorage.removeItem(REF_WIDGET_SWAP_DETAIL_KEY);\n else {\n localStorage.setItem(REF_WIDGET_SWAP_DETAIL_KEY, '1');\n }\n setShowDetail(!showDetail);\n }}\n >\n <div>Detail</div>\n <div\n style={{\n position: 'relative',\n }}\n >\n {!showDetail ? <FiChevronDown /> : <FiChevronUp />}\n </div>\n </div>\n\n {amountIn && amountOut && (\n <div className=\"__ref-swap-widget-row-flex-center\">\n <div>{isRateReverse ? revertDisplayRate : displayRate}</div>\n\n <RiExchangeFill\n onClick={() => {\n setIsRateReverse(!isRateReverse);\n }}\n size={16}\n style={{\n marginLeft: '4px',\n cursor: 'pointer',\n }}\n fill={iconDefault}\n />\n </div>\n )}\n </div>\n {!showDetail ? null : (\n <>\n <div className=\"__ref-swap-widget-row-flex-center __ref-swap-widget-swap-detail-view-item\">\n <div>Minimum received</div>\n <div>{toPrecision(minReceived || '0', 8)}</div>\n </div>\n\n <div className=\"__ref-swap-widget-row-flex-center __ref-swap-widget-swap-detail-view-item\">\n <div>Fee</div>\n\n <div>\n {!amountIn\n ? '0'\n : `${calculateFeeCharge(fee, amountIn)} ${toRealSymbol(\n tokenIn.symbol\n )}(${toPrecision(calculateFeePercent(fee).toString(), 2)}%)`}\n </div>\n </div>\n </>\n )}\n\n {!showDetail ? null : (\n <>\n <div className=\"__ref-swap-widget-row-flex-center __ref-swap-widget-swap-detail-view-item\">\n <div>Price impact</div>\n\n <div>{priceImpactDisplay}</div>\n </div>\n </>\n )}\n\n {estimates && estimates.length > 1 && showDetail && (\n <div\n className=\"__ref-swap-widget-swap_routes __ref-swap-widget-row-flex-center\"\n style={{\n border: `1px solid ${borderColor}`,\n flexDirection: isMobile() ? 'column' : 'row',\n position: 'relative',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n }}\n >\n <div className=\"__ref-swap-widget-row-flex-center\">\n <RouterIcon />\n <span\n className=\"__ref-swap-widget-valueStyle\"\n style={{\n marginLeft: '4px',\n whiteSpace: 'nowrap',\n }}\n >\n {'Auto Router'}\n </span>\n </div>\n\n <div\n className=\"\"\n style={{\n width: isMobile() ? '100%' : 'auto',\n minWidth: !isMobile() ? '70%' : '',\n }}\n >\n {tokensPerRoute.every(r => !!r) &&\n tokensPerRoute.map((tokens, index) => {\n if (!tokens) return null;\n return (\n <SmartRouteV2\n key={index + '-swap-route'}\n tokens={tokens}\n p={percents[index]}\n pools={identicalRoutes[index].map(hub => hub.pool)}\n />\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport const HalfAndMaxAmount = ({\n max,\n onChangeAmount,\n token,\n amount,\n}: {\n max: string;\n token: TokenMetadata;\n onChangeAmount: (amount: string) => void;\n amount: string;\n}) => {\n const halfValue = percentOfBigNumber(50, max, token.decimals);\n\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n } = theme;\n\n const [hoverHalf, setHoverHalf] = useState<boolean>(false);\n const [hoverMax, setHoverMax] = useState<boolean>(false);\n\n return (\n <div className=\"__ref-swap-widget-token-amount_quick_selector __ref-swap-widget-row-flex-center\">\n <span\n className=\"__ref-swap-widget-token-amount_quick_selector_item \"\n style={{\n color: secondary,\n borderRadius,\n border: `1px solid ${borderColor}`,\n marginRight: '4px',\n\n background:\n amount === halfValue && !ONLY_ZEROS.test(halfValue)\n ? active\n : hoverHalf\n ? hover\n : 'transparent',\n }}\n onMouseEnter={() => setHoverHalf(true)}\n onMouseLeave={() => setHoverHalf(false)}\n onClick={() => {\n const half = percentOfBigNumber(50, max, token.decimals);\n\n onChangeAmount(half);\n }}\n >\n Half\n </span>\n\n <span\n className=\"__ref-swap-widget-token-amount_quick_selector_item\"\n onClick={() => {\n onChangeAmount(max);\n }}\n onMouseEnter={() => setHoverMax(true)}\n onMouseLeave={() => setHoverMax(false)}\n style={{\n color: secondary,\n borderRadius,\n border: `1px solid ${borderColor}`,\n background:\n amount === max && !ONLY_ZEROS.test(max)\n ? active\n : hoverMax\n ? hover\n : 'transparent',\n }}\n >\n Max\n </span>\n </div>\n );\n};\n\nexport const TokenAmount = (props: TokenAmountProps) => {\n const {\n balance,\n reloading,\n token,\n onSelectToken,\n amount,\n onChangeAmount,\n price,\n onForceUpdate,\n poolFetchingState,\n } = props;\n\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n } = theme;\n\n const ref = useRef<HTMLInputElement>(null);\n\n const [hoverSelect, setHoverSelect] = useState<boolean>(false);\n\n const handleChange = (amount: string) => {\n if (onChangeAmount) {\n onChangeAmount(amount);\n }\n if (ref.current) {\n ref.current.value = amount;\n }\n };\n\n useEffect(() => {\n if (\n ref.current &&\n onChangeAmount &&\n token &&\n balance &&\n token.id === WRAP_NEAR_CONTRACT_ID &&\n Number(balance) - Number(ref.current.value) < 0.5\n ) {\n ref.current.setCustomValidity(\n 'Must have 0.5N or more left in wallet for gas fee.'\n );\n } else {\n ref.current?.setCustomValidity('');\n }\n }, [ref, balance, ref.current, ref.current?.value, token, amount]);\n\n const curMax = token ? getMax(token.id, balance || '0') : '0';\n\n return (\n <>\n <div\n className=\"__ref-swap-widger-token-amount \"\n style={{\n background: secondaryBg,\n flexDirection: isMobile() ? 'column' : 'row',\n }}\n >\n <div\n className=\"__ref-swap-widget-row-flex-center\"\n style={{\n width: isMobile() ? 'auto' : '40%',\n }}\n >\n <div\n className=\"__ref-swap-widget-row-flex-center __ref-swap-widget-token-amount_token-select-button\"\n style={{\n color: primary,\n background: hoverSelect ? hover : 'transparent',\n border: `1px solide ${hoverSelect ? borderColor : 'transparent'}`,\n }}\n onClick={onSelectToken}\n onMouseEnter={() => setHoverSelect(true)}\n onMouseLeave={() => setHoverSelect(false)}\n >\n {!token ? (\n <>\n <span\n style={{\n whiteSpace: 'nowrap',\n height: '26px',\n }}\n className=\"__ref-swap-widget-row-flex-center\"\n >\n Select Token\n </span>\n </>\n ) : (\n <>\n <img\n src={token?.icon}\n alt=\"\"\n className=\"__ref-swap-widget_token_icon\"\n style={{\n height: '26px',\n width: '26px',\n marginRight: '8px',\n }}\n />\n <span>{toRealSymbol(token?.symbol)}</span>\n </>\n )}\n <FiChevronDown\n style={{\n marginLeft: '4px',\n flexShrink: 0,\n }}\n />\n </div>\n\n {onForceUpdate && (\n <RiRefreshLine\n className={`${\n poolFetchingState === 'loading'\n ? '__ref-swap-widget-loading '\n : ''\n }`}\n style={{\n cursor: 'pointer',\n color: secondary,\n }}\n size={18}\n onClick={() => {\n onForceUpdate();\n }}\n />\n )}\n </div>\n\n <div\n className=\" __ref-swap-widget-token-amount_input\"\n style={{\n width: isMobile() ? '100%' : '60%',\n }}\n >\n <input\n ref={ref}\n max={!!onChangeAmount ? curMax : undefined}\n min=\"0\"\n onWheel={() => {\n if (ref.current) {\n ref.current.blur();\n }\n }}\n className=\"__ref-swap-widget-input-class\"\n step=\"any\"\n value={amount}\n type=\"number\"\n placeholder={!onChangeAmount ? '-' : '0.0'}\n onChange={({ target }) => {\n target.setCustomValidity('');\n handleChange(target.value);\n }}\n disabled={!onChangeAmount}\n onKeyDown={e => symbolsArr.includes(e.key) && e.preventDefault()}\n style={{\n color: primary,\n marginBottom: '8px',\n width: '100%',\n textAlign: 'right',\n fontSize: '20px',\n }}\n />\n\n <div\n style={{\n fontSize: '12px',\n color: secondary,\n textAlign: 'right',\n }}\n >\n {!price\n ? '$-'\n : '~$' +\n toInternationalCurrencySystemLongString(\n multiply(price, amount || '0'),\n 2\n )}\n </div>\n </div>\n </div>\n\n {!balance || !token || !onChangeAmount ? null : (\n <div\n className=\"__ref-swap-widger-token-amount_balance __ref-swap-widget-row-flex-center\"\n style={{\n fontSize: '12px',\n color: secondary,\n }}\n >\n <span>\n Balance:&nbsp;\n {toPrecision(balance, 2)}\n </span>\n {token && (\n <HalfAndMaxAmount\n token={token}\n max={getMax(token.id, balance)}\n onChangeAmount={handleChange}\n amount={amount}\n />\n )}\n </div>\n )}\n </>\n );\n};\n\nexport const SlippageSelector = ({\n slippageTolerance,\n onChangeSlippageTolerance,\n showSlip,\n setShowSlip,\n}: {\n slippageTolerance: number;\n onChangeSlippageTolerance: (slippageTolerance: number) => void;\n showSlip: boolean;\n setShowSlip: (showSlip: boolean) => void;\n}) => {\n const [invalid, setInValid] = useState<boolean>(false);\n\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n } = theme;\n\n const ref = useRef<HTMLInputElement>(null);\n\n const handleChange = (amount: string) => {\n onChangeSlippageTolerance(Number(amount));\n\n if (Number(amount) > 0 && Number(amount) < 100) {\n setInValid(false);\n } else {\n setInValid(true);\n }\n\n if (ref.current) {\n ref.current.value = amount;\n }\n };\n\n useEffect(() => {\n if (!showSlip) return;\n\n document.onclick = () => setShowSlip(false);\n\n return () => {\n document.onclick = null;\n };\n }, [showSlip, setShowSlip]);\n\n if (!showSlip) return null;\n\n return (\n <div\n className=\"__ref-swap-widget_slippage_selector __ref-swap-widget-col-flex-start\"\n onClick={e => e.stopPropagation()}\n style={{\n background: container,\n border: `1px solid ${borderColor}`,\n }}\n >\n <span\n style={{\n color: primary,\n paddingBottom: '14px',\n }}\n >\n Slippage tolerance\n </span>\n\n <div\n className={`__ref-swap-widget-row-flex-center\n `}\n >\n <div\n className={`__ref-swap-widget-row-flex-center\n __ref-swap-widget_slippage_selector_input_container`}\n style={{\n border: `1px solid ${invalid ? '#FF7575' : borderColor}`,\n borderRadius,\n }}\n >\n <input\n ref={ref}\n max={99.99999}\n min={0.000001}\n defaultValue={slippageTolerance ? slippageTolerance : 0.5}\n onWheel={() => {\n if (ref.current) {\n ref.current.blur();\n }\n }}\n value={slippageTolerance}\n step=\"any\"\n type=\"number\"\n required={true}\n placeholder=\"\"\n onChange={({ target }) => handleChange(target.value)}\n onKeyDown={e => symbolsArr.includes(e.key) && e.preventDefault()}\n style={{\n width: '100%',\n color: invalid ? '#FF7575' : primary,\n }}\n className=\"__ref-swap-widget-input-class\"\n />\n <span className=\"ml-2\">%</span>\n </div>\n\n <button\n className={`__ref-swap-widget_slippage_selector_button __ref-swap-widget-button ${\n isMobile()\n ? '__ref-swap-widget-opacity-active'\n : '__ref-swap-widget-opacity-hover'\n }`}\n style={{\n color: primary,\n background: buttonBg,\n borderRadius,\n }}\n onClick={e => {\n e.stopPropagation();\n e.preventDefault();\n onChangeSlippageTolerance(0.5);\n setInValid(false);\n }}\n >\n Auto\n </button>\n </div>\n {invalid && (\n <div\n className=\" text-xs py-3 __ref-swap-widget-row-flex-center\"\n style={{\n color: '#FF7575',\n fontSize: '12px',\n padding: '10px 0px',\n alignItems: 'start',\n }}\n >\n <IoWarning\n className=\"\"\n style={{\n marginRight: '4px',\n }}\n size={20}\n />\n <div>{'The slippage tolerance is invalid.'}</div>\n </div>\n )}\n </div>\n );\n};\n\nconst StarToken = ({\n price,\n token,\n onDelete,\n onClick,\n}: {\n token: TokenMetadata;\n price: string;\n onDelete: (token: TokenMetadata) => void;\n onClick: (token: TokenMetadata) => void;\n}) => {\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n iconDefault,\n iconHover,\n } = theme;\n\n const [hoverIcon, setHoverIcon] = useState(false);\n\n const [hoverClose, setHoverClose] = useState(false);\n\n return (\n <div\n className=\"__ref-swap-widget_star_token __ref-swap-widget-row-flex-center\"\n onMouseEnter={() => setHoverIcon(true)}\n onMouseLeave={() => setHoverIcon(false)}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n onClick(token);\n }}\n style={{\n background: hoverIcon ? hover : 'transparent',\n border: `1px solid ${borderColor}`,\n }}\n >\n {hoverIcon && (\n <div\n style={{\n position: 'absolute',\n top: '-4px',\n right: '-4px',\n boxShadow: '0px 0px 2px rgba(0, 0, 0, 0.25)',\n border: `1px solid ${borderColor}`,\n borderRadius: '100%',\n width: '16px',\n height: '16px',\n background: '#E3E3E3',\n }}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n onDelete(token);\n }}\n onMouseEnter={() => setHoverClose(true)}\n onMouseLeave={() => setHoverClose(false)}\n >\n <IoCloseOutline stroke={hoverClose ? 'black' : '#7e8a93'} />\n </div>\n )}\n\n <img\n src={token.icon}\n alt=\"\"\n className=\"__ref-swap-widget_token_icon\"\n style={{\n height: '26px',\n width: '26px',\n marginRight: '2px',\n }}\n />\n\n <div className=\"__ref-swap-widget-col-flex-start\">\n <span\n style={{\n fontSize: '14px',\n color: primary,\n }}\n >\n {toRealSymbol(token.symbol)}\n </span>\n\n <span\n style={{\n fontSize: '10px',\n color: secondary,\n }}\n >\n {!price\n ? '$-'\n : '$' + toInternationalCurrencySystemLongString(price, 2)}\n </span>\n </div>\n </div>\n );\n};\n\ninterface TokenProps {\n token: TokenMetadata;\n onClick: (token: TokenMetadata) => void;\n onClickPin: (token: TokenMetadata) => void;\n balance: string;\n price?: string;\n isSticky?: boolean;\n index: number;\n setHoverIndex: (index: number) => void;\n hoverIndex: number;\n}\n\nconst Token = ({\n token,\n onClick,\n price,\n balance,\n isSticky,\n onClickPin,\n index,\n setHoverIndex,\n hoverIndex,\n}: TokenProps) => {\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n iconDefault,\n iconHover,\n } = theme;\n\n const displayBalance =\n 0 < Number(balance) && Number(balance) < 0.001\n ? '< 0.001'\n : toPrecision(String(balance), 3);\n\n const [hoverOutLink, setHoverOutLink] = useState(false);\n\n const [hoverPin, setHoverPin] = useState(false);\n\n return (\n <div\n className=\"__ref-swap-widget_token-selector-token-list-item __ref-swap-widget-row-flex-center\"\n style={{\n background: hoverIndex === index ? hover : 'transparent',\n }}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n onClick(token);\n }}\n onMouseEnter={() => setHoverIndex(index)}\n onMouseLeave={() => setHoverIndex(-1)}\n >\n <div\n className=\"__ref-swap-widget-row-flex-center\"\n style={{\n justifyContent: 'space-between',\n }}\n >\n <img\n src={token.icon}\n alt=\"\"\n className=\"__ref-swap-widget_token_icon\"\n style={{\n height: '36px',\n width: '36px',\n marginRight: '10px',\n }}\n />\n\n <div className=\"__ref-swap-widget-col-flex-start\">\n <span\n style={{\n fontSize: '14px',\n color: primary,\n }}\n className=\"__ref-swap-widget-row-flex-center\"\n >\n {toRealSymbol(token.symbol)}\n\n {TokenLinks[token.symbol] && (\n <HiOutlineExternalLink\n onMouseEnter={() => setHoverOutLink(true)}\n onMouseLeave={() => setHoverOutLink(false)}\n style={{\n marginLeft: '4px',\n marginTop: '2px',\n }}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n window.open(TokenLinks[token.symbol], '_blank');\n }}\n stroke={hoverOutLink ? iconHover : iconDefault}\n />\n )}\n </span>\n\n <span\n style={{\n fontSize: '10px',\n color: secondary,\n marginTop: '2px',\n }}\n >\n {!price\n ? '$-'\n : '$' + toInternationalCurrencySystemLongString(price, 2)}\n </span>\n </div>\n </div>\n\n <div\n className=\"__ref-swap-widget-row-flex-center\"\n style={{\n color: primary,\n }}\n >\n {displayBalance}\n\n {isSticky ? (\n <AiFillPushpin\n onMouseEnter={() => setHoverPin(true)}\n onMouseLeave={() => setHoverPin(false)}\n fill={hoverPin && hoverIndex === index ? iconHover : iconDefault}\n style={{\n marginLeft: '10px',\n cursor: 'pointer',\n }}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n onClickPin(token);\n }}\n />\n ) : (\n <AiOutlinePushpin\n style={{\n marginLeft: '10px',\n cursor: 'pointer',\n }}\n onMouseEnter={() => setHoverPin(true)}\n onMouseLeave={() => setHoverPin(false)}\n fill={hoverPin && hoverIndex === index ? iconHover : iconDefault}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n onClickPin(token);\n }}\n />\n )}\n </div>\n </div>\n );\n};\n\ninterface TokenListProps {\n tokens: TokenMetadata[];\n onClick: (token: TokenMetadata) => void;\n balances: { [tokenId: string]: string };\n tokenPriceList: Record<string, any> | null;\n starList: string[];\n setStarList: (starList: string[]) => void;\n onDelete: (token: TokenMetadata) => void;\n}\n\nexport const TokenListTable = ({\n tokens,\n onClick,\n balances,\n tokenPriceList,\n starList,\n setStarList,\n onDelete,\n}: TokenListProps) => {\n const [currentSort, setCurrentSort] = useState('down');\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n iconDefault,\n iconHover,\n } = theme;\n\n const onClickPin = (token: TokenMetadata) => {\n if (starList.includes(token.id)) {\n onDelete(token);\n } else {\n const newList = [...starList, token.id];\n setStarList(newList);\n }\n };\n\n const [hoverIndex, setHoverIndex] = useState(-1);\n\n const tokenSorting = (a: TokenMetadata, b: TokenMetadata) => {\n const b1 = balances[a.id];\n const b2 = balances[b.id];\n\n if (currentSort === 'up') {\n return Number(b1) - Number(b2);\n } else return Number(b2) - Number(b1);\n };\n\n return !tokens || tokens.length === 0 ? null : (\n <div className=\"__ref-swap-widget_token_list_table\">\n <div\n className=\"__ref-swap-widget_token_list_table_header\"\n style={{\n color: secondary,\n borderBottom: `1px solid ${borderColor}`,\n }}\n >\n <span className=\"\">Asset</span>\n\n <span\n onClick={() => {\n setCurrentSort(currentSort === 'up' ? 'down' : 'up');\n }}\n style={{\n cursor: 'pointer',\n }}\n className=\"__ref-swap-widget-row-flex-center\"\n >\n <span className=\"ml-1\">Balance</span>\n {currentSort === 'up' ? <TiArrowSortedUp /> : <TiArrowSortedDown />}\n </span>\n </div>\n\n <div className=\"__ref-swap-widget_token_list_table_content\">\n {tokens.sort(tokenSorting).map((token, index) => (\n <Token\n key={token.id + '-select-token-list-item-' + index}\n onClick={onClick}\n index={index}\n token={token}\n price={tokenPriceList?.[token.id]?.price}\n balance={balances?.[token.id] || '0'}\n onClickPin={onClickPin}\n isSticky={starList.includes(token.id)}\n setHoverIndex={setHoverIndex}\n hoverIndex={hoverIndex}\n />\n ))}\n </div>\n </div>\n );\n};\n\nexport const TokenSelector = ({\n onSelect,\n width,\n tokens,\n onClose,\n AccountId,\n balances,\n className,\n}: {\n onSelect: (token: TokenMetadata) => void;\n width: string;\n tokens: TokenMetadata[];\n onClose: () => void;\n AccountId: string;\n balances: { [tokenId: string]: string };\n className?: string;\n}) => {\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n iconDefault,\n iconHover,\n } = theme;\n\n const [searchValue, setSearchValue] = useState<string>('');\n\n const tokenPriceList = useContext(TokenPriceContext);\n\n const handleSearch = (value: string) => {\n setSearchValue(value);\n };\n\n const storagedStartList = localStorage.getItem(REF_WIDGET_STAR_TOKEN_LIST_KEY)\n ? JSON.parse(localStorage.getItem(REF_WIDGET_STAR_TOKEN_LIST_KEY) || '[]')\n : null;\n\n const DEFAULT_START_TOKEN_LIST =\n getConfig().networkId === 'testnet'\n ? DEFAULT_START_TOKEN_LIST_TESTNET\n : DEFAULT_START_TOKEN_LIST_MAINNET;\n\n const [starList, setStarList] = useState<string[]>(\n storagedStartList || DEFAULT_START_TOKEN_LIST\n );\n\n const onDelete = (token: TokenMetadata) => {\n const newStarList = starList.filter(starToken => starToken !== token.id);\n\n setStarList(newStarList);\n\n localStorage.setItem(\n REF_WIDGET_STAR_TOKEN_LIST_KEY,\n JSON.stringify(newStarList)\n );\n };\n\n const tableListFilter = (token: TokenMetadata) => {\n if (!searchValue) return true;\n\n const searchValueLower = searchValue.toLowerCase();\n\n return token.symbol?.toLowerCase().includes(searchValueLower) || false;\n };\n\n return (\n <div\n className={`__ref-swap_widget-token_selector __ref-swap-widget-container ${className}`}\n style={{\n position: 'relative',\n width,\n background: container,\n }}\n >\n <FiChevronLeft\n onClick={onClose}\n style={{\n color: primary,\n position: 'absolute',\n cursor: 'pointer',\n }}\n />\n <div\n className=\"__ref-swap-widget-header-title __ref-swap-widget-row-flex-center\"\n style={{\n color: primary,\n justifyContent: 'center',\n paddingBottom: '24px',\n }}\n >\n Select a token\n </div>\n\n <div\n className=\"__ref-swap-widget-select-token_input __ref-swap-widget-row-flex-center\"\n style={{\n border: `1px solid ${buttonBg}`,\n background: secondaryBg,\n }}\n >\n <FaSearch\n fill={iconDefault}\n style={{\n marginRight: '8px',\n }}\n />\n\n <input\n className=\"__ref-swap-widget-input-class\"\n placeholder=\"Search token...\"\n onChange={evt => handleSearch(evt.target.value)}\n style={{\n fontSize: '14px',\n color: primary,\n }}\n />\n </div>\n\n <div className=\"__ref-swap-widget_token-selector-star-tokens __ref-swap-widget-row-flex-center\">\n {starList.map(id => {\n if (!tokens || tokens.length === 0) return null;\n\n const token = tokens.find(token => token.id === id);\n\n return !token ? null : (\n <StarToken\n key={token.id + '-star-token'}\n token={token}\n price={tokenPriceList?.[token.id]?.price}\n onDelete={onDelete}\n onClick={onSelect}\n />\n );\n })}\n </div>\n\n <TokenListTable\n tokens={tokens.filter(tableListFilter)}\n tokenPriceList={tokenPriceList}\n onClick={onSelect}\n balances={balances}\n starList={starList}\n setStarList={starList => {\n setStarList(starList);\n localStorage.setItem(\n REF_WIDGET_STAR_TOKEN_LIST_KEY,\n JSON.stringify(starList)\n );\n }}\n onDelete={onDelete}\n />\n </div>\n );\n};\n\nexport const Slider = ({\n showSlip,\n setShowSlip,\n}: {\n showSlip: boolean;\n setShowSlip: (show: boolean) => void;\n}) => {\n const [hover, setHover] = useState(false);\n\n return (\n <svg\n width=\"17\"\n height=\"17\"\n viewBox=\"0 0 17 17\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onMouseEnter={() => setHover(true)}\n onMouseLeave={() => setHover(false)}\n onClick={() => setShowSlip(true)}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12.6957 13.0652C12.6957 14.1338 11.8294 15 10.7609 15C9.69235 15 8.82611 14.1338 8.82611 13.0652C8.82612 11.9967 9.69235 11.1304 10.7609 11.1304C11.8294 11.1304 12.6957 11.9967 12.6957 13.0652ZM14.5749 12.0941C14.6145 12.0894 14.6548 12.0869 14.6957 12.0869L15.9565 12.0869C16.5088 12.0869 16.9565 12.5346 16.9565 13.0869C16.9565 13.6392 16.5088 14.0869 15.9565 14.0869L14.6957 14.0869C14.651 14.0869 14.6071 14.084 14.564 14.0783C14.1171 15.7605 12.5837 17 10.7609 17C8.93806 17 7.40472 15.7605 6.95777 14.0783C6.91471 14.084 6.87078 14.0869 6.82617 14.0869L1.00009 14.0869C0.447802 14.0869 8.61245e-05 13.6392 8.61728e-05 13.0869C8.62211e-05 12.5346 0.447802 12.0869 1.00009 12.0869L6.82617 12.0869C6.86702 12.0869 6.90729 12.0894 6.94686 12.0941C7.37926 10.3906 8.92291 9.13044 10.7609 9.13044C12.5989 9.13044 14.1425 10.3906 14.5749 12.0941ZM4.26086 3.93478C4.26086 2.86623 5.1271 2 6.19565 2C7.2642 2 8.13043 2.86623 8.13043 3.93478C8.13043 5.00333 7.2642 5.86957 6.19565 5.86957C5.1271 5.86956 4.26086 5.00333 4.26086 3.93478ZM6.19565 9.66601e-07C4.3728 8.07243e-07 2.83946 1.23952 2.39252 2.92168C2.34944 2.91601 2.3055 2.91309 2.26087 2.91309L0.999999 2.91309C0.447715 2.91309 -7.14972e-07 3.3608 -7.63254e-07 3.91309C-8.11537e-07 4.46537 0.447715 4.91309 0.999999 4.91309L2.26087 4.91309C2.30173 4.91309 2.34202 4.91063 2.3816 4.90587C2.81401 6.60936 4.35766 7.86956 6.19565 7.86957C8.03363 7.86957 9.57728 6.60936 10.0097 4.90588C10.0493 4.91064 10.0895 4.91309 10.1304 4.91309L15.9565 4.91309C16.5087 4.91309 16.9565 4.46537 16.9565 3.91309C16.9565 3.3608 16.5087 2.91309 15.9565 2.91309L10.1304 2.91309C10.0858 2.91309 10.0418 2.91601 9.99877 2.92167C9.55182 1.23952 8.01849 1.12596e-06 6.19565 9.66601e-07Z\"\n fill={hover || showSlip ? '#00C6A2' : '#7E8A93'}\n />\n </svg>\n );\n};\n\nexport const RefIcon = (props: any) => {\n return (\n <svg\n {...props}\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M6.36365 10H10L6.36365 6.36363V10Z\" fill=\"currentColor\" />\n <path\n d=\"M10 4.05312e-06L7.87879 3.86767e-06L10 2.12122L10 4.05312e-06Z\"\n fill=\"#00C6A2\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.51531 6.36364C6.46444 6.36364 6.41387 6.36232 6.36365 6.35971V4.08371L8.83901 1.78516C9.18802 2.26148 9.3941 2.8491 9.3941 3.48485C9.3941 5.07476 8.10522 6.36364 6.51531 6.36364ZM8.19255 1.14486L6.36365 2.84313V0.60999C6.41387 0.607383 6.46444 0.606064 6.51531 0.606064C7.14111 0.606064 7.72027 0.805743 8.19255 1.14486Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.06046 0.606064H3.33319V3.29661L4.55696 4.52039L6.06046 3.12428V0.606064ZM6.06046 4.36486L4.5336 5.78267L3.33319 4.58226V10H6.06046V4.36486Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M3.0303 0.606064H0V4.50881L2.27284 2.23598L3.0303 2.99344V0.606064ZM3.0303 4.27909L2.27284 3.52162L0 5.79446V10H3.0303V4.27909Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n\nexport const Loading = () => {\n return (\n <svg\n width=\"38\"\n height=\"38\"\n viewBox=\"0 0 38 38\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"__ref-swap-widget-loading\"\n >\n <circle\n cx=\"19\"\n cy=\"19\"\n r=\"16\"\n stroke=\"#EEEEEE\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M19 35C27.8366 35 35 27.8366 35 19C35 10.1634 27.8366 3 19 3C10.1634 3 3 10.1634 3 19\"\n stroke=\"#00C6A2\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n};\n\nexport const Warning = () => {\n return (\n <svg\n width=\"49\"\n height=\"49\"\n viewBox=\"0 0 49 49\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21.0359 5.99999C22.5755 3.33333 26.4245 3.33333 27.9641 6L42.2535 30.75C43.7931 33.4167 41.8686 36.75 38.7894 36.75H10.2106C7.13137 36.75 5.20688 33.4167 6.74648 30.75L21.0359 5.99999Z\"\n stroke=\"#FF689E\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n <line\n x1=\"24\"\n y1=\"14\"\n x2=\"24\"\n y2=\"24\"\n stroke=\"#FF689E\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n <circle cx=\"24\" cy=\"30\" r=\"2\" fill=\"#FF689E\" />\n </svg>\n );\n};\n\nexport const Success = () => {\n return (\n <div\n style={{\n position: 'relative',\n height: '32px',\n width: '32px',\n }}\n >\n <svg\n width=\"38\"\n height=\"38\"\n viewBox=\"0 0 38 38\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n >\n <circle\n cx=\"19\"\n cy=\"19\"\n r=\"16\"\n stroke=\"#EEEEEE\"\n strokeWidth=\"6\"\n strokeLinecap=\"round\"\n />\n </svg>\n\n <svg\n width=\"30\"\n height=\"23\"\n viewBox=\"0 0 30 23\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{\n position: 'absolute',\n top: 4,\n left: 4,\n }}\n >\n <path\n d=\"M2 11.2727L10.4898 20L28 2\"\n stroke=\"#00C6A2\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n />\n </svg>\n </div>\n );\n};\n\nexport const RouterIcon = () => {\n return (\n <svg\n width=\"16\"\n height=\"12\"\n viewBox=\"0 0 16 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"mr-2\"\n >\n <path\n d=\"M13.4862 6.25488C12.2813 6.25488 11.2485 7.10159 11.019 8.28698H6.02703L4.7647 7.21448C4.93684 6.8758 5.05159 6.48067 5.10897 6.0291C5.10897 5.52107 4.93684 4.9566 4.59257 4.56147L6.02703 3.1503H11.0763C11.478 4.44858 12.8551 5.23884 14.1748 4.84371C15.4945 4.44858 16.2978 3.09385 15.8961 1.79557C15.4945 0.497295 14.1174 -0.292963 12.7977 0.102166C11.937 0.327954 11.3059 1.00532 11.0763 1.79557H5.51062L3.50237 3.77122C3.21548 3.65832 2.92859 3.60188 2.58432 3.60188C1.20723 3.54543 0.0596573 4.61792 0.00227872 5.97265C-0.0550999 7.32738 0.977715 8.45632 2.3548 8.51276H2.58432C3.04334 8.51276 3.44499 8.39987 3.84664 8.17408L5.568 9.6417H11.1911C11.7075 10.8835 13.142 11.5045 14.4043 11.0529C15.6666 10.5449 16.2978 9.13368 15.8388 7.89185C15.4371 6.8758 14.5191 6.25488 13.4862 6.25488V6.25488ZM13.4862 1.344C14.1174 1.344 14.6338 1.85202 14.6338 2.47294C14.6338 3.09385 14.1174 3.60188 13.4862 3.60188C12.8551 3.60188 12.3387 3.09385 12.3387 2.47294C12.3387 1.85202 12.8551 1.344 13.4862 1.344ZM2.58432 7.15804C1.95315 7.15804 1.43674 6.65001 1.43674 6.0291C1.43674 5.40818 1.95315 4.90016 2.58432 4.90016C3.21548 4.90016 3.73189 5.40818 3.73189 6.0291C3.73189 6.65001 3.21548 7.15804 2.58432 7.15804ZM13.4862 9.86749C12.8551 9.86749 12.3387 9.35947 12.3387 8.73855C12.3387 8.11763 12.8551 7.60961 13.4862 7.60961C14.1174 7.60961 14.6338 8.11763 14.6338 8.73855C14.6338 9.35947 14.1174 9.86749 13.4862 9.86749Z\"\n fill=\"url(#paint0_linear_12461_2312)\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_12461_2312\"\n x1=\"8\"\n y1=\"0\"\n x2=\"8\"\n y2=\"11.2\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#00C6A2\" />\n <stop offset=\"1\" stopColor=\"#8C78FF\" />\n </linearGradient>\n </defs>\n </svg>\n );\n};\n\nexport const Notification = ({\n state,\n tx,\n detail,\n open,\n setOpen,\n setState,\n}: {\n state?: 'success' | 'fail' | null;\n setState?: (state: 'success' | 'fail' | null) => void;\n tx?: string;\n detail?: string;\n\n open: boolean;\n setOpen: (open: boolean) => void;\n}) => {\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n } = theme;\n\n if (!open) return null;\n\n return (\n <div\n className=\"__ref-swap-widget-notification\"\n style={{\n color: primary,\n background: container,\n }}\n >\n <div className=\"__ref-swap-widget-notification__icon\">\n {state === null && <Loading />}\n {state === 'fail' && <Warning />}\n {state === 'success' && <Success />}\n </div>\n\n <div\n style={{\n fontSize: '16px',\n marginTop: '10px',\n marginBottom: '6px',\n }}\n >\n {state === 'success' && <p>Success!</p>}\n {state === 'fail' && <p>Swap Failed!</p>}\n </div>\n <div\n className=\"__ref-swap-widget-notification__text\"\n style={{\n color: primary,\n }}\n >\n {(state === null || state === undefined) && (\n <p>Waiting for confirmation</p>\n )}\n {state === 'fail' && !!tx && (\n <a\n className=\"text-primary font-semibold\"\n href={`${config.explorerUrl}/txns/${tx}`}\n target=\"_blank\"\n style={{\n textDecoration: 'underline',\n fontSize: '14px',\n color: primary,\n }}\n rel=\"noreferrer\"\n >\n Click to view.\n </a>\n )}\n\n {state === 'success' && detail}\n </div>\n {state !== null && (\n <button\n className=\"__ref-swap-widget-notification__button __ref-swap-widget-button\"\n style={{\n background: buttonBg,\n fontWeight: 700,\n color: 'white',\n }}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n setOpen(false);\n setState && setState(null);\n }}\n >\n Close\n </button>\n )}\n </div>\n );\n};\n\nexport const ArrowRight = () => {\n return (\n <div className=\"mx-1\">\n <svg\n width=\"12\"\n height=\"5\"\n viewBox=\"0 0 12 5\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.864 4.4C9.024 4.05867 9.17867 3.76 9.328 3.504C9.488 3.248 9.64267 3.03467 9.792 2.864H0.464V2.192H9.792C9.64267 2.01067 9.488 1.792 9.328 1.536C9.17867 1.28 9.024 0.986666 8.864 0.656H9.424C10.096 1.43467 10.8 2.01067 11.536 2.384V2.672C10.8 3.03467 10.096 3.61067 9.424 4.4H8.864Z\"\n fill=\"#7E8A93\"\n />\n </svg>\n </div>\n );\n};\n\nexport const AccountButton = ({\n AccountId,\n onDisConnect,\n}: {\n AccountId: string;\n onDisConnect: () => void;\n}) => {\n const [hoverAccount, setHoverAccount] = useState<boolean>(false);\n\n const theme = useContext(ThemeContext);\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n iconDefault,\n iconHover,\n borderColor,\n } = theme;\n\n return !AccountId ? null : (\n <div\n className=\"__ref-swap-widget-header-button-account __ref-swap-widget-row-flex-center\"\n style={{\n color: primary,\n background: secondaryBg,\n border: `1px solid ${borderColor}`,\n cursor: 'pointer',\n }}\n onClick={e => {\n e.preventDefault();\n e.stopPropagation();\n hoverAccount && onDisConnect();\n }}\n onMouseEnter={() => setHoverAccount(true)}\n onMouseLeave={() => setHoverAccount(false)}\n >\n {hoverAccount ? 'Disconnect' : getAccountName(AccountId)}\n </div>\n );\n};\n","import { getConfig } from '../constant';\n\nexport const DefaultTestnetTokenList = [\n {\n spec: 'ft-1.0.0',\n name: 'Wrapped NEAR fungible token',\n symbol: 'wNEAR',\n icon: null,\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'wrap.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Banana',\n symbol: 'BANANA',\n icon:\n 'https://assets.onlinelabels.com/images/clip-art/pitr/pitr_Bananas_icon.png',\n reference: null,\n reference_hash: null,\n decimals: 6,\n id: 'banana.ft-fin.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'NEAR Wrapped USDC',\n symbol: 'nUSDC',\n icon: 'https://s2.coinmarketcap.com/static/img/coins/64x64/3408.png',\n reference: null,\n reference_hash: null,\n decimals: 2,\n id: 'nusdc.ft-fin.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'NEAR Wrapped Tether',\n symbol: 'nUSDT',\n icon: 'https://s2.coinmarketcap.com/static/img/coins/64x64/825.png',\n reference: null,\n reference_hash: null,\n decimals: 6,\n id: 'nusdt.ft-fin.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Ref Finance Token',\n symbol: 'RFT',\n icon: '',\n reference: null,\n reference_hash: null,\n decimals: 8,\n id: 'rft.tokenfactory.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'USD Coin',\n symbol: 'USDC',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none'%3E%3Ccircle cx='16' cy='16' r='16' fill='%232775C9'/%3E%3Cpath d='M15.75 27.5C9.26 27.5 4 22.24 4 15.75S9.26 4 15.75 4 27.5 9.26 27.5 15.75A11.75 11.75 0 0115.75 27.5zm-.7-16.11a2.58 2.58 0 00-2.45 2.47c0 1.21.74 2 2.31 2.33l1.1.26c1.07.25 1.51.61 1.51 1.22s-.77 1.21-1.77 1.21a1.9 1.9 0 01-1.8-.91.68.68 0 00-.61-.39h-.59a.35.35 0 00-.28.41 2.73 2.73 0 002.61 2.08v.84a.705.705 0 001.41 0v-.85a2.62 2.62 0 002.59-2.58c0-1.27-.73-2-2.46-2.37l-1-.22c-1-.25-1.47-.58-1.47-1.14 0-.56.6-1.18 1.6-1.18a1.64 1.64 0 011.59.81.8.8 0 00.72.46h.47a.42.42 0 00.31-.5 2.65 2.65 0 00-2.38-2v-.69a.705.705 0 00-1.41 0v.74zm-8.11 4.36a8.79 8.79 0 006 8.33h.14a.45.45 0 00.45-.45v-.21a.94.94 0 00-.58-.87 7.36 7.36 0 010-13.65.93.93 0 00.58-.86v-.23a.42.42 0 00-.56-.4 8.79 8.79 0 00-6.03 8.34zm17.62 0a8.79 8.79 0 00-6-8.32h-.15a.47.47 0 00-.47.47v.15a1 1 0 00.61.9 7.36 7.36 0 010 13.64 1 1 0 00-.6.89v.17a.47.47 0 00.62.44 8.79 8.79 0 005.99-8.34z' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 6,\n id: 'usdc.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Tether USD',\n symbol: 'USDT.e',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Ccircle cx='16' cy='16' r='16' fill='%2326A17B'/%3E%3Cpath fill='%23FFF' d='M17.922 17.383v-.002c-.11.008-.677.042-1.942.042-1.01 0-1.721-.03-1.971-.042v.003c-3.888-.171-6.79-.848-6.79-1.658 0-.809 2.902-1.486 6.79-1.66v2.644c.254.018.982.061 1.988.061 1.207 0 1.812-.05 1.925-.06v-2.643c3.88.173 6.775.85 6.775 1.658 0 .81-2.895 1.485-6.775 1.657m0-3.59v-2.366h5.414V7.819H8.595v3.608h5.414v2.365c-4.4.202-7.709 1.074-7.709 2.118 0 1.044 3.309 1.915 7.709 2.118v7.582h3.913v-7.584c4.393-.202 7.694-1.073 7.694-2.116 0-1.043-3.301-1.914-7.694-2.117'/%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 6,\n id: 'usdt.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Dai Stablecoin',\n symbol: 'DAI',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Ccircle fill='%23F4B731' fill-rule='nonzero' cx='16' cy='16' r='16'/%3E%3Cpath d='M9.277 8h6.552c3.985 0 7.006 2.116 8.13 5.194H26v1.861h-1.611c.031.294.047.594.047.898v.046c0 .342-.02.68-.06 1.01H26v1.86h-2.08C22.767 21.905 19.77 24 15.83 24H9.277v-5.131H7v-1.86h2.277v-1.954H7v-1.86h2.277V8zm1.831 10.869v3.462h4.72c2.914 0 5.078-1.387 6.085-3.462H11.108zm11.366-1.86H11.108v-1.954h11.37c.041.307.063.622.063.944v.045c0 .329-.023.65-.067.964zM15.83 9.665c2.926 0 5.097 1.424 6.098 3.528h-10.82V9.666h4.72z' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'dai.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Wrapped Ether',\n symbol: 'WETH',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='256' height='256'%3E%3Cdefs%3E%3Ctext id='A' x='50' y='180' font-size='180'%3E🍌%3C/text%3E%3C/defs%3E%3Cuse xlink:href='%23A'/%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'weth.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'HAPI',\n symbol: 'HAPI',\n icon:\n \"data:image/svg+xml,%3Csvg version='1.1' id='Layer_2' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='600px' height='600px' viewBox='0 0 600 600' enable-background='new 0 0 600 600' xml:space='preserve'%3E %3Cg%3E %3Cg%3E %3Cpath fill='%23141414' d='M263.7,122.8c-3.6,0.3-7.1,0.9-10.7,1.8c-24.5,6-40.3,18.1-50.4,31c24.5-4.7,49.9,1.3,67.3,7.4 c0.5,0.2,1,0.4,1.6,0.6c-2.7-4.2-5.2-9-7.2-14.4C261.2,141.1,261.6,131.6,263.7,122.8z'/%3E %3Cpath fill='%23141414' d='M201.2,197.7c-9.8-1.1-19.1-2.1-24.6-2.1c-0.7,0-1.4,0-2,0.1c-38.1,2.6-67.2,37.3-69.1,82.4 c-1.4,32.2,13.5,53.1,23.3,63.4c-1.5-12.5-0.1-25,4.3-37.3c11.7-32.6,34.3-42.1,60.6-53.1c10.8-4.5,22.5-9.5,34.3-16.6l50.1-39.6 c-10.1,2.2-24.4,4.5-42.9,5.3C227.1,200.6,213.9,199.1,201.2,197.7z'/%3E %3Cpath fill='%23141414' d='M319.1,176.5c-0.5,1.1,0.9,2.1,1.8,1.2c5.3-5.4,16.3-14.3,30.8-14.2c15.6,0.1,35.5,10.2,40.5,22.1 c4,9.8-6.6,16.5-6.6,16.5l0,0c-2.5-2.7-8-6.3-18.2-6.6c-15-0.5-25.3,12.1-24.1,12.9c7.5,4.7,17.3,3.7,23.1,3.5 c5.8-0.2,15.1-2.5,17.8-3.5c4.7-1.8,11.7-7.8,14.9-16.1c2.5-6.5,8.4-28.7-25.2-34.4C352.7,154.3,327,159.6,319.1,176.5z'/%3E %3Cpath fill='%23141414' d='M473.1,225.1c-0.5-0.6-1.1-1.3-1.7-2l-0.3-0.3c-3.9-4.4-7.6-8.3-9.4-10.1c1.2-4.2,4-16.2,1-26.1 c-2.3-7.7-6.8-15.5-9.2-19.4l-0.8-1.2h0c-0.4-0.6-0.8-1.2-1.1-1.7c-0.3-0.4-0.5-0.7-0.6-1l-0.2-0.7c-2.5-7-8.6-22.3-16.4-28.1 l59.4-91.7c2.3-3.5-2.1-7.5-5.4-5l-86.8,66.5c-8.7-12.3-21.1-21.8-21.8-22.4c-0.8-0.6-2-0.7-2.9-0.2c-0.9,0.5-1.4,1.6-1.3,2.6 c0,0.1,0.6,5.9-2.9,17.6c7.5,2.7,13.9,6,19.3,9.7l-4.5,3.5c-8.8-5.7-20-10.5-34.3-12.6c-17.7-2.6-31.9,1-42.1,10.7c0,0,0,0,0,0 c5.9,3.8,13.1,8.7,17,12.4c0.8,0.7,1.5,1.5,2.2,2.3c-3.1,0.9-6.2,1.9-9.3,2.9c-0.3-0.2-0.5-0.5-0.8-0.7c-1.9-1.7-4.4-3.4-7-5.3 c-5.4-3.8-11.7-8.3-15.8-14c-2.2-3.1-3.8-6.5-4.3-10.4c-0.3-2.4-1-4-2.2-4.9c0,0,0,0,0,0c0,0,0,0,0,0c-0.6-0.5-2.8-2-5.8,0.3 c-2,1.6-4.4,5.3-6.5,10.3c-5.2,12.3-8.7,32.1-1.8,46.1c1.2,2.3,2.4,4.5,3.7,6.6c-0.4,1-0.7,2.1-0.9,3.1c-0.6,3.4-0.9,7.8-1.2,12.7 c-19.8-8.3-50.5-17.5-78.5-10.7c-23.9,5.8-39.4,17.5-49.6,30c7.4-3.1,15.2-5,23.5-5.6c5.6-0.4,16.4,0.8,27.9,2.1 c11.8,1.3,25.3,2.8,32.9,2.4c19.2-0.8,33.7-3.3,43.5-5.6c0,5.4,0.1,11.1,0.4,16.9c0.7,16.8,2.5,34.3,5,46.5 c3.6,17.9,16.5,55.2,31.4,64.6c5.5,3.5,13.5,8.2,22.9,13.4c-2.5,6.4-5.1,15.1-5.1,23.5c0,15.2,5.2,26.6,11,37 c4.6,8.2,9.6,15.7,12.8,24c2.5,6.5-2.7,27.7-5.6,38.9c-1.2,4.5-1.9,7.3-1.7,7c3.7-5.1,7.5-10.8,11.3-16.8 c15.3-24.2,19.4-47,19.5-48l0.2-1.4l-1.1-1c-0.2-0.2-17.2-15.7-18.3-33.3c-0.4-6.9,1-11.5,4.3-13.8c0.5-0.3,1-0.6,1.6-0.9 c7.5,3.7,15,7.3,22.2,10.5c2.8,3.5,9,9.4,11.8,12c3.4,3.2,6.9,7.8,12.2,7.8c5.3,0,15.9,0,21.3,0s13.1,0,17.3-2.1 c4.2-2.1,10.9-5.6,11-12.6c0-1.5,0.4-3.9,0.9-6.8c3.7-4.9,4.1-10.6,4.8-19.2c0.5-5.7,1.7-15.5,3-25.9c2-15.7,4.1-32,3.9-37.9 c-0.2-8.2-1.1-14.3-1.4-16.2C475.3,249.4,479.5,232.4,473.1,225.1z M318,310.6c-13.3-8.4-25.6-44.6-29-61.2 c-4.8-23.9-6.9-68.5-3.9-86.8c2.7-16.7,49-34.5,81.7-35.6c1.9-0.1,3.8-0.1,5.6-0.1c1,0,2,0,3,0c-0.1,4.9,1.3,15.6,13.8,25.5 c13.9,11,30.4,5,30.4,5l12.1-18.7c4.5,3.5,9.4,12.7,13,22.1c-0.9-0.4-1.9-0.7-3.1-0.9c-8.1-1.3-31.6-0.9-24,31.3 c1,4,5.2,9.4,17.2,22.3c2.8,3,5.1,5.3,7,7.2c5.6,5.6,7.4,7.4,7.5,11.8c0,0.3-0.2,1.6-0.4,3c-0.8-0.6-1.9-1.1-3.4-1 c-3.6-0.2-33.7,5.6-42.4,15.1c-1.7,1.9-4.5,2.6-6.7,1.4c-0.1-0.1-0.2-0.1-0.3-0.2c-1.4-0.8-2.3-1.9-2.8-3.5 c-1.3-5.1,2.9-13.2,4.6-16c0.6-1,0.3-2.3-0.6-2.9c-1-0.6-2.3-0.3-2.9,0.6c-0.1,0.2-0.9,1.5-1.9,3.5c-3.3,6.6-8.2,12.2-14.3,16.3 c-9.8,6.6-24,15.2-35.5,18.2c-18,4.7-24.9-8.2-25.2-8.8c-0.5-1-1.8-1.4-2.8-0.9c-1,0.5-1.5,1.8-0.9,2.8 c0.1,0.1,6.3,12.1,21.5,12.1c0.6,0,1.4-0.1,2.2-0.2c4.3-0.5,8.6,0.5,12.3,2.7c3.5,2.1,8,4.7,12.5,7c12.6,6.3,14.7,6.2,19.5,5.4 c1.1-0.2,49.8-2.4,80.1-8.2l3.6,0.2c2.4,0.1,4.3,2.3,4,4.7l0,0.1c-0.2,1.4-1,2.6-2.2,3.3c-2.7,1.5-6.5,3.5-9.9,4.9 c-1.6,0.6-3.3,1.2-5.1,1.6c-5.5,1.3-11.1,1.6-11.1,1.6s-5.4,1.2-13.5,2.1c-3.4,0.4-7.2,0.7-11.3,0.9c-14,0.7-13,1.6-24.8,1 c-2.9-0.1-5.7-0.3-8.3-0.6c-2.5-0.3-3.2,3.4-0.7,4c6.1,1.5,13.3,2.6,21.3,2.5c1,0,1.9,0,2.9,0c12.8-0.1,24.4,7.5,29.4,19.3 c2.1,5,4.1,12,5.4,18.5c1.8,8.4-5.3,16.1-13.8,15.3c-12.5-1.3-26.6-4.8-34.6-8.3C365.3,338.1,332.4,319.8,318,310.6z M448.7,169.2 l1.2,1.9c2.4,4,5.9,10.5,7.9,16.9c3.1,10.4-1.4,24.4-1.4,24.5l-0.5,1.5l1.1,1.1c0,0.1,5,5.2,10.3,11.1l0.1,0.2 c0.6,0.7,1.2,1.3,1.8,2c3.7,4.3,1.9,17-0.1,23.9l-0.2,0.6l0.1,0.6c0,0,0.3,1.5,0.6,3.9c-2.7,0.3-4.7,2.7-4.4,5.5l0.8,7.5l-8.6,0.1 l-13.5-15.3c-1-1.2-1-3,0.2-4c0,0,0,0,0,0c7.1-6.4,8.1-9.5,8.3-10.7c0.9-5.4,1.2-7.4,1.2-8.1c0-6.1-2.9-9-8.7-14.8 c-1.9-1.9-4.2-4.2-6.9-7.1c-0.6-0.6-1.1-1.2-1.7-1.8c2.1,0.6,4.9,1.2,8.5,1.5c8.4,0.7,10.9-1.4,10.9-1.4s1.5-2.7-1.1-6.6 c-2.6-3.9-6.2-6.7-13.2-6.9c-5-0.2-9.5,3.7-11.7,6c-0.9-1-2.9-4.7-3.8-10.9c-1.5-9.7,2.1-14.2,4.7-16.4c4.6-3.9,10.9-7.7,14.4-7.5 c0.9,0.1,1.9,0.2,2.7,0.4C447.8,167.7,448.2,168.4,448.7,169.2z M463.4,332.9c-0.7,8.2-1.1,12.8-3.8,16.5c-2.3,3.1-7.3,0.8-6.6-3 c0.4-2.1,0.7-4.3,0.8-6.4c0.3-10.7-4.9-20.9-6.7-27.7c0,0,0-0.1,0-0.1c-0.9-3.8,1.2-7.7,4.8-9.3c1.6-0.7,3.4-1.6,5.3-2.6 c4.6-2.3,9.9,1.3,9.2,6.4l0,0.1C465.2,317.2,463.9,327.1,463.4,332.9z M385.1,249.4c1.8-1.3,4.4-0.8,5.6,1.2 c0.8,1.4,1.9,2.9,3.4,4.1c4.5,3.7,9.8,3.5,13.2,3.5c3.3,0,5.4-0.6,6-0.8c0,0,0,0,0,0c2.4-0.5,4.3,2,3.1,4.2 c-2.6,4.8-6.1,11.1-6.5,11.4c-0.7,0.5-22.8,5.1-25.6,5.4s-11.6,1.2-18.2-3c-2.8-1.7-5.5-3.7-7.7-5.3c-1.7-1.2-1.4-3.8,0.4-4.7 C368.8,260.4,378.7,253.9,385.1,249.4z M436.8,263.8l8.3,9.1c1.5,1.7,0.5,4.4-1.7,4.7c-5,0.6-10,1.2-14.9,1.7 c-2.3,0.2-3.9-2.3-2.7-4.3c1.9-3,4.3-7,6.5-10.8C433.2,262.6,435.5,262.4,436.8,263.8z M396.4,117.1l83.5-69.1l-76.9,76.9 c-2.5,2.4-6.6,1.6-8.1-1.5h0C393.9,121.2,394.5,118.5,396.4,117.1z'/%3E %3Cpath fill='%23141414' d='M196.6,258.1c-25.6,10.7-45.8,19.2-56.4,48.7c-15.1,42,9.4,88.5,62.5,120.1c-17.4-68,3.5-93.1,22.1-115.3 c6.4-7.7,12.5-15,16.9-23.7c12.9-25.8,12.3-50.5,11.1-62C233.7,242.5,214.1,250.8,196.6,258.1z'/%3E %3C/g%3E %3Cg%3E %3Cpath d='M201.6,477.1h-9.1l-2.8,17.1h-14.3l2.8-17.1h-9.1l-2.8,17.1h-9.3l-1.5,9.1h9.3l-2.3,14h-9.4l-1.5,9.1h9.4l-2.8,17.1h9.1 l2.8-17.1h14.3l-2.8,17.1h9.1l2.8-17.1h9.3l1.5-9.1h-9.3l2.3-14h9.4l1.5-9.1h-9.4L201.6,477.1z M186,517.4h-14.3l2.3-14h14.3 L186,517.4z'/%3E %3Cpolygon points='260.8,505.3 230,505.3 230,477.1 218,477.1 218,543.6 230,543.6 230,515.4 260.8,515.4 260.8,543.6 272.9,543.6 272.9,477.1 260.8,477.1 '/%3E %3Cpath d='M307.1,477.1l-23.4,66.4h12.8l5.5-16.4h25l5.5,16.4h12.8l-23.4-66.4H307.1z M305.3,517.5l9-26.8h0.5l9,26.8H305.3z'/%3E %3Cpath d='M394,480c-3.5-1.9-7.8-2.9-12.9-2.9h-24.9v66.4h12v-22.4H381c5.1,0,9.4-0.9,12.9-2.8s6.2-4.5,7.9-7.8 c1.8-3.3,2.7-7.1,2.7-11.3c0-4.2-0.9-8-2.7-11.3C400.1,484.5,397.4,481.9,394,480z M390.9,505.4c-0.9,1.8-2.3,3.2-4.2,4.3 c-1.9,1-4.3,1.6-7.3,1.6h-11.1v-24h11c3,0,5.5,0.5,7.4,1.5c1.9,1,3.3,2.4,4.2,4.2c0.9,1.8,1.4,3.9,1.4,6.2 S391.8,503.6,390.9,505.4z'/%3E %3Crect x='417.1' y='477.1' width='12' height='66.4'/%3E %3C/g%3E %3C/g%3E %3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'hapi.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'PARAS',\n symbol: 'PARAS',\n icon:\n 'data:image/png;base64,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',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'paras.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Ref Finance Token',\n symbol: 'REF',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='16 24 248 248' style='background: %23000'%3E%3Cpath d='M164,164v52h52Zm-45-45,20.4,20.4,20.6-20.6V81H119Zm0,18.39V216h41V137.19l-20.6,20.6ZM166.5,81H164v33.81l26.16-26.17A40.29,40.29,0,0,0,166.5,81ZM72,153.19V216h43V133.4l-11.6-11.61Zm0-18.38,31.4-31.4L115,115V81H72ZM207,121.5h0a40.29,40.29,0,0,0-7.64-23.66L164,133.19V162h2.5A40.5,40.5,0,0,0,207,121.5Z' fill='%23fff'/%3E%3Cpath d='M189 72l27 27V72h-27z' fill='%2300c08b'/%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'ref.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Pulse',\n symbol: 'PULSE',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmlld0JveD0iMCAwIDIwMCAyMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjEwMCIgY3k9IjEwMCIgcj0iMTAwIiBmaWxsPSIjMEYyQUMzIi8+CjxwYXRoIGQ9Ik0xMDMuNTc0IDg0LjU3M0MxMDIuMDUyIDg2LjU4MDggMTAwLjg1MyA4OS4xNDAyIDk5LjY5NzIgOTEuNjU1OUM5OC41NDA5IDk0LjE3MTYgOTcuMzkyIDk2LjY1OTYgOTYuMjE0OSA5OC40MjU1Qzk1LjAzNzggMTAwLjE5MSA5My45Mjg0IDEwMS4wNTggOTIuNzMyNiAxMDEuMDU4QzkxLjI3MDMgMTAxLjA1OCA5MC40NDI1IDEwMC42NDMgODkuNzEwMiA5OS44NjcyQzg4Ljk3NzYgOTkuMDkxNiA4OC40MDY1IDk3LjkwNSA4Ny44NzAzIDk2LjY3MDRDODcuMzMzOSA5NS40MzU4IDg2Ljg0NzcgOTQuMTM1MSA4Ni4wMzA1IDkzLjAzNDlDODUuMjEzMyA5MS45MzQ3IDgzLjkxMDQgOTEuMDI5MSA4Mi4yMTk4IDkxLjAyOTFDODEuMjYzMyA5MS4wMjkxIDgwLjQyMzcgOTEuNDQ1MSA3OS43ODg2IDkyLjAzMkM3OS4xNTM0IDkyLjYxODkgNzguNjkwMSA5My4zOTAxIDc4LjI3NzQgOTQuMjI1OUM3Ny40NTIxIDk1Ljg5NjggNzYuODM1NCA5Ny45NjgyIDc2LjA0MzUgOTkuOTkyN0M3NS4yNTE2IDEwMi4wMTcgNzQuMjc3MSAxMDMuOTk1IDcyLjk1NTUgMTA1LjM4M0M3MS42MzM2IDEwNi43NzIgNjkuOTk5MiAxMDcuNjQgNjcuNTAxOCAxMDcuNjRIMzguMDY2MkMzNy42ODcxIDEwNy42MzUgMzcuMzM0NSAxMDcuODI1IDM3LjE0MzMgMTA4LjEzN0MzNi45NTIyIDEwOC40NDkgMzYuOTUyMiAxMDguODM2IDM3LjE0MzMgMTA5LjE0OEMzNy4zMzQ1IDEwOS40NjEgMzcuNjg3MSAxMDkuNjUxIDM4LjA2NjIgMTA5LjY0Nkg2Ny41MDE4QzcwLjU0NzkgMTA5LjY0NiA3Mi44OTg1IDEwOC40MTYgNzQuNTMyMyAxMDYuN0M3Ni4xNjYyIDEwNC45ODQgNzcuMTg3NSAxMDIuNzk3IDc4LjAxNDYgMTAwLjY4MkM3OC44NDE3IDk4LjU2NzUgNzkuNDc1IDk2LjQ3NDEgODAuMTgyOCA5NS4wNDA3QzgwLjUzNyA5NC4zMjQgODAuODg5MyA5My43OTE5IDgxLjIzNDEgOTMuNDczOEM4MS41Nzg5IDkzLjE1NTIgODEuODI2NiA5My4wMzQ5IDgyLjIxOTggOTMuMDM0OUM4My4yMjc5IDkzLjAzNDkgODMuNzQyNyA5My40NDUzIDg0LjMyMjIgOTQuMjI1OUM4NC45MDE4IDk1LjAwNiA4NS40MTIgOTYuMjEyNyA4NS45NjQ5IDk3LjQ4NTRDODYuNTE3NyA5OC43NTc3IDg3LjA4OTYgMTAwLjA3OCA4OC4xMzMxIDEwMS4xODRDODkuMTc2NiAxMDIuMjg5IDkwLjczNzUgMTAzLjA2NCA5Mi43MzI2IDEwMy4wNjRDOTQuOTkzOCAxMDMuMDY0IDk2LjY1OTEgMTAxLjQ4NiA5Ny45ODg4IDk5LjQ5MTJDOTkuMzE4NSA5Ny40OTYyIDEwMC40NTQgOTQuOTY5NSAxMDEuNjAzIDkyLjQ3MDlDMTAyLjc1MSA4OS45NzE4IDEwMy45NTMgODcuNTE2OSAxMDUuMjgyIDg1Ljc2MzhDMTA2LjYxMSA4NC4wMTA3IDEwNy45MjUgODMuMDA1OCAxMDkuNTUzIDgzLjAwNThDMTEwLjI5NSA4My4wMDU4IDExMC45NDYgODMuMjcyOCAxMTEuNjU2IDgzLjg4MzRDMTEyLjM2NSA4NC40OTM5IDExMy4wNjggODUuNDUxNyAxMTMuNzU4IDg2LjY0MTRDMTE1LjEzOCA4OS4wMjA3IDExNi40NDcgOTIuMzI4OCAxMTcuODMyIDk1LjY2NzVDMTE5LjIxNiA5OS4wMDYyIDEyMC43MTcgMTAyLjM3NiAxMjIuNjk0IDEwNS4wMDdDMTI0LjY3MSAxMDcuNjM4IDEyNy4yMzQgMTA5LjU4MyAxMzAuNTc4IDEwOS41ODNIMTYwLjkzNEMxNjEuMzEzIDEwOS41ODggMTYxLjY2NiAxMDkuMzk4IDE2MS44NTcgMTA5LjA4NkMxNjIuMDQ4IDEwOC43NzMgMTYyLjA0OCAxMDguMzg3IDE2MS44NTcgMTA4LjA3NEMxNjEuNjY2IDEwNy43NjIgMTYxLjMxMyAxMDcuNTcyIDE2MC45MzQgMTA3LjU3N0gxMzAuNTc4QzEyOC4wNjcgMTA3LjU3NyAxMjYuMTcgMTA2LjIzMiAxMjQuNDAyIDEwMy44NzlDMTIyLjYzNCAxMDEuNTI2IDEyMS4xMDggOTguMjgzNyAxMTkuNzM3IDk0Ljk3ODFDMTE4LjM2NiA5MS42NzIxIDExNy4xMDggODguMzA1MiAxMTUuNTk4IDg1LjcwMTJDMTE0Ljg0MyA4NC4zOTkxIDExNC4wOCA4My4yODQ2IDExMy4xMDEgODIuNDQxOEMxMTIuMTIyIDgxLjU5ODcgMTEwLjg4MyA4MSAxMDkuNTUzIDgxQzEwNy4wMzYgODEgMTA1LjA5NiA4Mi41NjUzIDEwMy41NzQgODQuNTczWiIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSI1Ii8+Cjwvc3ZnPgo=',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'pulse.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Ether',\n symbol: 'ETH',\n icon:\n 'data:image/png;base64,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',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'eth.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Aurora',\n symbol: 'AURORA',\n icon:\n \"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 288 288' style='enable-background:new 0 0 288 288;' xml:space='preserve'%3E %3Cstyle type='text/css'%3E .st0%7Bfill:%2370D44B;%7D .st1%7Bfill:%23FFFFFF;%7D %3C/style%3E %3Cpath class='st0' d='M144,0L144,0c79.5,0,144,64.5,144,144v0c0,79.5-64.5,144-144,144h0C64.5,288,0,223.5,0,144v0 C0,64.5,64.5,0,144,0z'/%3E %3Cpath class='st1' d='M144,58.8c7.6,0,14.5,4.3,17.9,11.1l56.2,112.5c4.9,9.9,0.9,21.9-9,26.8c-2.8,1.4-5.8,2.1-8.9,2.1H87.8 c-11,0-20-9-20-20c0-3.1,0.7-6.2,2.1-8.9l56.2-112.5C129.5,63,136.4,58.7,144,58.8 M144,45c-12.8,0-24.5,7.2-30.2,18.7L57.6,176.2 c-8.3,16.7-1.6,36.9,15.1,45.3c4.7,2.3,9.9,3.6,15.1,3.6h112.5c18.6,0,33.8-15.1,33.8-33.7c0-5.2-1.2-10.4-3.6-15.1L174.2,63.7 C168.5,52.2,156.8,45,144,45z'/%3E %3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'aurora.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Skyward Finance Token',\n symbol: 'SKYWARD',\n icon:\n 'data:image/png;base64,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',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'skyward.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Staked NEAR',\n symbol: 'STNEAR',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 67.79 67.79' version='1.1'%3E%3Cpath style='fill:%23fff' d='M33.934.311a33.9 33.9 0 1 0 33.89 33.9 33.9 33.9 0 0 0-33.89-33.9z' id='path505'%3E%3C/path%3E%3Cpath style='fill:%23ffbd00;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1' d='m11.803 27.8 12.387.359 2.361 5.959 7.616 3.31 8.523-3.322 2.348-5.87 12.269.03L54.822 54.2 31.837 58.86 12.89 52.648z' id='path1051'%3E%3C/path%3E%3Cpath style='fill:%23a0a0ff;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1' d='m34.657 12.575-10.43 9.633 1.096 10.01 8.844 5.21 9.785-5.287 1.086-11.33z' id='path1815'%3E%3C/path%3E%3Cpath id='path928' style='fill:%23666;fill-opacity:1' d='M33.928 4.282a29.93 29.93 0 0 1 4.682.367 29.93 29.93 0 0 1 25.244 29.572 29.93 29.93 0 0 1-29.92 29.92 29.93 29.93 0 0 1-.006-59.86zm.729 8.293c-2.03 5.668-8.815 9.76-8.815 14.521 0 4.76 3.912 8.62 8.737 8.62 4.824 0 8.736-3.86 8.736-8.62s-6.707-8.697-8.658-14.521zM37.84 22.67a2.524 2.446 0 0 1 .246.012 2.524 2.446 0 0 1 .246.035 2.524 2.446 0 0 1 .24.059 2.524 2.446 0 0 1 .233.08 2.524 2.446 0 0 1 .225.104 2.524 2.446 0 0 1 .213.123 2.524 2.446 0 0 1 .197.142 2.524 2.446 0 0 1 .183.162 2.524 2.446 0 0 1 .168.178 2.524 2.446 0 0 1 .147.191 2.524 2.446 0 0 1 .127.207 2.524 2.446 0 0 1 .105.217 2.524 2.446 0 0 1 .084.227 2.524 2.446 0 0 1 .06.232 2.524 2.446 0 0 1 .038.237 2.524 2.446 0 0 1 .012.24 2.524 2.446 0 0 1-.086.633 2.524 2.446 0 0 1-.252.59 2.524 2.446 0 0 1-.403.507 2.524 2.446 0 0 1-.521.389 2.524 2.446 0 0 1-.61.244 2.524 2.446 0 0 1-.652.084 2.524 2.446 0 0 1-.654-.084 2.524 2.446 0 0 1-.607-.244 2.524 2.446 0 0 1-.524-.389 2.524 2.446 0 0 1-.4-.508 2.524 2.446 0 0 1-.252-.59 2.524 2.446 0 0 1-.086-.632 2.524 2.446 0 0 1 .086-.633 2.524 2.446 0 0 1 .252-.59 2.524 2.446 0 0 1 .4-.506A2.524 2.446 0 0 1 36.58 23a2.524 2.446 0 0 1 .607-.247 2.524 2.446 0 0 1 .654-.082zM24.19 28.16a16.579 2.485 0 0 0-6.502 1.965 16.579 2.485 0 0 0 7.635 2.093 10.483 10.6 0 0 1-1.133-4.058zm20.848.078a10.483 10.6 0 0 1-1.086 3.904 16.579 2.485 0 0 0 6.894-2.017 16.579 2.485 0 0 0-5.808-1.887zm6.925 3.21c-.455 1.177-4.097 2.154-9.273 2.659a10.483 10.6 0 0 1-8.072 3.861 10.483 10.6 0 0 1-8.067-3.85c-5.276-.506-8.978-1.498-9.398-2.64h-.049v5.17h.049a.69.69 0 0 0-.049.24c0 1.8 7.81 3.25 17.43 3.25 9.62 0 17.43-1.45 17.43-3.25a.69.69 0 0 0 0-.24zm.032 7.323c-.67 1.73-8.22 3.03-17.43 3.03-9.23 0-16.771-1.34-17.381-3h-.049v5.17h.049a.69.69 0 0 0-.049.24c0 1.8 7.81 3.25 17.43 3.25 9.62 0 17.43-1.45 17.43-3.25a.69.69 0 0 0 0-.24zm0 7.21c-.67 1.69-8.22 3.03-17.43 3.03-9.23 0-16.771-1.34-17.381-3h-.049v5.17h.049a.69.69 0 0 0-.049.24c0 1.8 7.81 3.25 17.43 3.25 9.62 0 17.43-1.45 17.43-3.25a.69.69 0 0 0 0-.24z'%3E%3C/path%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'stnear.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Octopus Network Token',\n symbol: 'OCT',\n icon:\n \"data:image/svg+xml,%3Csvg version='1.1' id='O' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 113.39 113.39' style='enable-background:new 0 0 113.39 113.39;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23014299;%7D .st1%7Bfill:%23FFFFFF;%7D %3C/style%3E%3Ccircle class='st0' cx='56.69' cy='56.69' r='56.69'/%3E%3Cg%3E%3Cpath class='st1' d='M44.25,59.41c-1.43,0-2.59,1.16-2.59,2.59v20.28c0,1.43,1.16,2.59,2.59,2.59c1.43,0,2.59-1.16,2.59-2.59V62 C46.84,60.57,45.68,59.41,44.25,59.41z'/%3E%3Cpath class='st1' d='M56.69,59.41c-1.45,0-2.62,1.17-2.62,2.62v26.47c0,1.45,1.17,2.62,2.62,2.62s2.62-1.17,2.62-2.62V62.02 C59.31,60.58,58.14,59.41,56.69,59.41z'/%3E%3Cpath class='st1' d='M79.26,78.87c-0.33,0.15-0.64,0.28-0.95,0.38c0,0-0.01,0-0.01,0c-0.59,0.19-1.13,0.29-1.63,0.31h-0.06 c-1,0.03-1.84-0.27-2.59-0.75c-0.49-0.32-0.91-0.73-1.25-1.23c-0.3-0.43-0.53-0.93-0.71-1.51c0-0.01-0.01-0.02-0.01-0.03 c-0.22-0.74-0.34-1.61-0.34-2.59V62.02c0-1.45-1.17-2.62-2.62-2.62c-1.45,0-2.62,1.17-2.62,2.62v11.43c0,4.5,1.64,8.03,4.63,9.96 c1.5,0.97,3.21,1.45,5.04,1.45c1.68,0,3.45-0.41,5.25-1.22c1.32-0.59,1.9-2.14,1.31-3.46C82.13,78.86,80.57,78.27,79.26,78.87z'/%3E%3Cpath class='st1' d='M68.33,45.9c0-2.15-1.75-3.9-3.9-3.9c-2.15,0-3.9,1.75-3.9,3.9s1.75,3.9,3.9,3.9 C66.58,49.8,68.33,48.05,68.33,45.9z'/%3E%3Cpath class='st1' d='M48.96,41.99c-2.15,0-3.9,1.75-3.9,3.9s1.75,3.9,3.9,3.9s3.9-1.75,3.9-3.9S51.11,41.99,48.96,41.99z'/%3E%3Cpath class='st1' d='M56.69,22.28c-15.17,0-27.52,12.34-27.52,27.52v15.09c0,1.46,1.18,2.64,2.64,2.64s2.64-1.18,2.64-2.64V49.8 c0-12.26,9.98-22.24,22.24-22.24c12.26,0,22.24,9.98,22.24,22.24v15.09c0,1.46,1.18,2.64,2.64,2.64s2.64-1.18,2.64-2.64V49.8 C84.21,34.62,71.87,22.28,56.69,22.28z'/%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'oct.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Debio',\n symbol: 'DBIO',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIxOTAgOTcgNDIwIDQyMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgODAwIDgwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVmcz48c3R5bGU+LnN0MHtmaWxsOiMzNjM2MzZ9LnN0M3tmaWxsOiNmZjU2ZTB9PC9zdHlsZT48L2RlZnM+PGNpcmNsZSBjbGFzcz0ic3QzIiBjeD0iNDAwIiBjeT0iMzA3LjM5IiByPSIyMDguNTgiLz48cGF0aCBkPSJNNDczLjk5IDIxMS4zczIuMzQgNTYuMjUtNzcuMzQgOTguNDMtNzAuMzEgOTMuNzQtNzAuMzEgOTMuNzQiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiNlNmU2ZTY7c3Ryb2tlLXdpZHRoOjM3LjQ5NzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNMzI2LjAxIDIxMS4zcy0yLjM0IDU2LjI1IDc3LjM0IDk4LjQzIDcwLjMxIDkzLjc0IDcwLjMxIDkzLjc0IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS13aWR0aDozNy40OTc1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwIi8+PGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iNDAwIiBjeT0iMjE2LjQyIiByPSIyMC40OSIvPjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjQwMCIgY3k9IjM5OC4zNiIgcj0iMjAuNDkiLz48dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzYuMzQyIDY1OC4wNzUpIiBjbGFzcz0ic3QzIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlO2ZvbnQtc2l6ZToxMTIuNDkyNXB4O2ZvbnQtZmFtaWx5OidBcnRlZ3JhU2Fucy1TZW1pQm9sZCciPkRlQmlvPC90ZXh0Pjwvc3ZnPg==',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'dbio.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Game GEM!!',\n symbol: 'gGEM',\n icon: null,\n reference: null,\n reference_hash: null,\n decimals: 4,\n id: 'gem.thegame.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Game Gold!!',\n symbol: 'gGOLD',\n icon: null,\n reference: null,\n reference_hash: null,\n decimals: 2,\n id: 'gold.thegame.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Game Elixir!!',\n symbol: 'gELXR',\n icon: null,\n reference: null,\n reference_hash: null,\n decimals: 2,\n id: 'elixir.thegame.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'USN',\n symbol: 'USN',\n icon:\n \"data:image/svg+xml;charset=UTF-8,%3Csvg width='38' height='38' viewBox='0 0 38 38' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='38' height='38' rx='19' fill='black'/%3E%3Cpath d='M14.8388 10.6601C14.4203 10.1008 13.6748 9.86519 12.9933 10.0768C12.3119 10.2885 11.85 10.8991 11.85 11.5883V14.7648H8V17.9412H11.85V20.0589H8V23.2353H11.85V28H15.15V16.5108L23.1612 27.2165C23.5797 27.7758 24.3252 28.0114 25.0067 27.7997C25.6881 27.5881 26.15 26.9775 26.15 26.2882V23.2353H30V20.0589H26.15V17.9412H30V14.7648H26.15V10.0001H22.85V21.3658L14.8388 10.6601Z' fill='white'/%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'usdn.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Learn NEAR Club',\n symbol: 'LNC',\n icon:\n 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAQwAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAAHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAAAChnVFJDAAABoAAAAChiVFJDAAABoAAAACh3dHB0AAAByAAAABRjcHJ0AAAB3AAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAFgAAAAcAHMAUgBHAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z3BhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLW1sdWMAAAAAAAAAAQAAAAxlblVTAAAAIAAAABwARwBvAG8AZwBsAGUAIABJAG4AYwAuACAAMgAwADEANv/bAEMAAwICAgICAwICAgMDAwMEBgQEBAQECAYGBQYJCAoKCQgJCQoMDwwKCw4LCQkNEQ0ODxAQERAKDBITEhATDxAQEP/bAEMBAwMDBAMECAQECBALCQsQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEP/AABEIACAAIAMBIgACEQEDEQH/xAAZAAADAAMAAAAAAAAAAAAAAAAABgcDBAj/xAAjEAACAgICAgMAAwAAAAAAAAABAgMEBQYAEQcSEyExFCJB/8QAGAEAAgMAAAAAAAAAAAAAAAAAAQMABwj/xAAlEQACAQMDBAIDAAAAAAAAAAABEQMAAgQxQWESIZHwUXGBwfH/2gAMAwEAAhEDEQA/AOqOHNHN5vF67jnyuZtCtVSSKJpCjN00kixoOlBP27qPz/fv64qZDzBq+L8h2/Gt2rk0yVXFJlROK3tVlVhMwhEoPSzeteZgr+vsqMVJ9W6zZHBLKCbLSV38J+GKva+aONC8p/v+U88ORWv5t3fyTFTbwTpWPvxpjMfl8lc2O49SvCLldbENGMwLJ72vidWf7CxB4ifcSDqmaPseS2rXIMtmdYva9kRJLWuY632TDPE5jf436HyxFlJjlAAdCrADvrjZ8OXHt6pEOGGPhjUP3alxZUc9ys78oo/R0rD5E1O3u+oXdboZaPGWrD15oLctU2EikhnjlUtGHQuCYwCPZf394jZDwNc2pdht75uMF3LZ2ji4I72LxQpGhZoT25YLMKySzdN1aVSpJBCOD2shVa7w5IcyaC3ojKDegex1T2HbTtRkxYpruq8MpannbTc1EcB4D3jx3UxaeLPK1fFSpgcfhsxBkcH/AC6V+epWirR5CKFZ42gn+OPpv7uHCQq31GDymeP9XymnarTwed27JbPk0LzXcrfIElmeRy8jKgJEUfsxCRKSqIFUdgd8YuHDPmzZIUpB5QB4ZAZ9+BQhxIoC4wR+SvDXvNf/2Q==',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'lnc.factory.tokenhub.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Wrapped BTC',\n symbol: 'WBTC',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none'%3E%3Ccircle fill='%23201A2D' cx='16' cy='16' r='16'/%3E%3Cg fill='%23FFF'%3E%3Cpath d='M22.818 9.586l-.6.6a8.494 8.494 0 010 11.464l.6.6a9.352 9.352 0 000-12.678v.014zM10.2 9.638a8.494 8.494 0 0111.464 0l.6-.6a9.352 9.352 0 00-12.678 0l.614.6zm-.562 12.018a8.494 8.494 0 010-11.458l-.6-.6a9.352 9.352 0 000 12.678l.6-.62zm12.018.554a8.494 8.494 0 01-11.464 0l-.6.6a9.352 9.352 0 0012.678 0l-.614-.6zm-1.942-8.286c-.12-1.252-1.2-1.672-2.566-1.8V10.4h-1.056v1.692h-.844V10.4H14.2v1.736h-2.142v1.13s.78-.014.768 0a.546.546 0 01.6.464v4.752a.37.37 0 01-.128.258.366.366 0 01-.272.092c.014.012-.768 0-.768 0l-.2 1.262h2.122v1.764h1.056V20.12h.844v1.73h1.058v-1.744c1.784-.108 3.028-.548 3.184-2.218.126-1.344-.506-1.944-1.516-2.186.614-.302.994-.862.908-1.778zm-1.48 3.756c0 1.312-2.248 1.162-2.964 1.162v-2.328c.716.002 2.964-.204 2.964 1.166zm-.49-3.28c0 1.2-1.876 1.054-2.472 1.054v-2.116c.596 0 2.472-.188 2.472 1.062z'/%3E%3Cpath d='M15.924 26.852C9.89 26.851 5 21.959 5 15.925 5 9.892 9.892 5 15.925 5c6.034 0 10.926 4.89 10.927 10.924a10.926 10.926 0 01-10.928 10.928zm0-21c-5.559.004-10.062 4.513-10.06 10.072.002 5.559 4.51 10.064 10.068 10.064 5.559 0 10.066-4.505 10.068-10.064A10.068 10.068 0 0015.924 5.852z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 8,\n id: 'wbtc.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Huobi BTC',\n symbol: 'HBTC',\n icon: null,\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'hbtc.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Celo Dollar',\n symbol: 'cUSD',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHdpZHRoPSIxMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTEwMCA1MGMwLTI3LjYxNDItMjIuMzg1OC01MC01MC01MHMtNTAgMjIuMzg1OC01MCA1MCAyMi4zODU4IDUwIDUwIDUwIDUwLTIyLjM4NTggNTAtNTB6IiBmaWxsPSIjNDVjZDg1Ii8+PGcgZmlsbD0iI2ZmZiI+PHBhdGggZD0ibTY5Ljg4MDUgNjIuNjQzOGMtMS41NjcxIDMuMzkzMS0zLjkzNzUgNi4zNTMyLTYuOTA2MSA4LjYyNDEtMi45Njg1IDIuMjcwOC02LjQ0NTggMy43ODQxLTEwLjEzMDcgNC40MDg3LTMuNjg1LjYyNDYtNy40NjY3LjM0MTctMTEuMDE3Ny0uODI0MS0zLjU1MTEtMS4xNjU4LTYuNzY0Ni0zLjE3OTQtOS4zNjIzLTUuODY2Ni0yLjU5NzgtMi42ODcxLTQuNTAxNS01Ljk2NjktNS41NDY1LTkuNTU1NC0xLjA0NDktMy41ODg1LTEuMTk5Ni03LjM3NzUtLjQ1MDctMTEuMDM5My43NDg5LTMuNjYxNyAyLjM3ODktNy4wODU3IDQuNzQ4OS05Ljk3NTggMi4zNzAxLTIuODkgNS40MDg3LTUuMTU4OSA4Ljg1MjktNi42MTAzbDIuMjY2OCA1LjM3OTJjLTIuNTcgMS4wODMxLTQuODM3NSAyLjc3NjEtNi42MDYgNC45MzI3LTEuNzY4NSAyLjE1NjUtMi45ODQ4IDQuNzExNS0zLjU0MzYgNy40NDM5LS41NTg5IDIuNzMyNC0uNDQzNSA1LjU1OTguMzM2MyA4LjIzNzYuNzc5OCAyLjY3NzcgMi4yMDAzIDUuMTI1MSA0LjEzODggNy4xMzAyIDEuOTM4NCAyLjAwNTIgNC4zMzYzIDMuNTA3OCA2Ljk4NjEgNC4zNzc3czUuNDcxNyAxLjA4MSA4LjIyMTUuNjE0OWMyLjc0OTctLjQ2NjEgNS4zNDQ0LTEuNTk1MyA3LjU1OTUtMy4yODk4IDIuMjE1Mi0xLjY5NDUgMy45ODQtMy45MDMzIDUuMTUzNC02LjQzNTNsNS45MTg5LjMwNDJ6Ii8+PHBhdGggZD0ibTU2LjEwNjEgMjQuNXYtNGg0LjUwMDV2NGMyIDAgNS4xNjY3LjY2NjcgNi41IDF2NC41Yy0xOS0zLTE1LjUwMTEgMy44NDYyLTggNSA2LjcyMTcgMS4wMzM5IDExIDIgMTEuNSA5IC40IDUuNi01LjgzMzMgNy42NjY3LTkgOHYzLjVoLTV2LTMuNWMtMi40IDAtNi42NjY3LTEuNjY2Ny04LjUtMi41di01LjVjNC41IDIuNSAxNyA0LjUgMTcgMHMtMTYuNTAxMS0zLTE4LjAwMDUtMTFjLTEuMDAyMy01LjM0NzUgNS4zMzMzLTcuODMzMyA5LTguNXoiLz48L2c+PC9zdmc+',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'cusd.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'LiNEAR',\n symbol: 'LINEAR',\n icon:\n \"data:image/svg+xml,%3Csvg width='40' height='40' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M30.74 28.78c.21-.36.32-.78.32-1.21v-6.33c0-.24-.06-.46-.17-.66-.12-.21-.28-.38-.48-.49l-16.86-9.77c-.35-.2-.73-.31-1.13-.32-.64 0-1.24.26-1.69.72-.45.45-.7 1.07-.71 1.71v6.39c0 .24.06.47.18.67.11.21.28.37.48.48l16.82 9.71c.36.22.77.32 1.19.32.41 0 .82-.12 1.19-.33.36-.21.66-.52.86-.89zm.32-16.27c0-.42-.1-.84-.29-1.21-.2-.38-.49-.7-.85-.93-.36-.22-.78-.34-1.21-.34-.42 0-.84.12-1.21.34l-4.97 2.81c-.04.02-.08.07-.1.12-.03.04-.04.1-.04.14 0 .06.01.11.04.16.02.04.06.08.1.1l8.05 4.62c.05.02.1.04.15.04.05 0 .1-.02.15-.05.04-.02.08-.06.11-.11.02-.04.04-.1.03-.15l.04-5.54zM10.05 27.5c-.01.43.08.86.28 1.23.2.38.49.7.85.93.36.22.78.34 1.2.34.42 0 .83-.12 1.2-.34l4.92-2.85c.04-.02.08-.06.1-.11.03-.04.05-.1.05-.15 0-.05-.02-.11-.05-.15-.02-.05-.06-.09-.1-.12l-8.05-4.6c-.05-.03-.09-.04-.15-.04-.05 0-.1.01-.15.04-.05.02-.08.07-.11.12-.02.04-.04.09-.04.14l.05 5.56z' fill='url(%23paint0_linear_186_370)'/%3E%3Cdefs%3E%3ClinearGradient id='paint0_linear_186_370' x1='11.135' y1='11.152' x2='30.145' y2='30.457' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%231BB3CC'/%3E%3Cstop offset='1' stop-color='%23824ACC'/%3E%3C/linearGradient%3E%3C/defs%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'linear-protocol.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Staked NEAR',\n symbol: 'STNEAR',\n icon:\n \"data:image/svg+xml,%3Csvg width='96' height='96' viewBox='0 0 96 96' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='96' height='96' rx='48' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M48.0006 20L41.2575 26.7431L48.0006 33.4862L54.7437 26.7431L48.0006 20ZM37.281 30.7188L30.7144 37.2853L47.9998 54.5707L65.2851 37.2853L58.7186 30.7188L47.9998 41.4376L37.281 30.7188ZM26.7384 41.261L19.9953 48.0041L47.9995 76.0083L76.0037 48.0041L69.2606 41.2611L47.9995 62.5221L26.7384 41.261Z' fill='%23231B51'/%3E%3C/svg%3E\",\n reference: 'https://metapool.app',\n reference_hash: null,\n decimals: 24,\n id: 'meta-v2.pool.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'NearX',\n symbol: 'NearX',\n icon:\n \"data:image/svg+xml,%0A%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M24 12C24 18.6274 18.6274 24 12 24C5.37258 24 0 18.6274 0 12C0 5.37258 5.37258 0 12 0C18.6274 0 24 5.37258 24 12ZM17.1421 21.3848L21.3848 17.1421L19.3669 15.1243C18.5576 17.0303 17.0303 18.5576 15.1243 19.3669L17.1421 21.3848ZM9.43294 19.5793C7.45322 18.909 5.82115 17.4848 4.87848 15.6484L3.24264 17.2843L7.48528 21.5269L9.43294 19.5793ZM4.63306 8.8757C5.44239 6.96975 6.96975 5.44239 8.8757 4.63306L7.24264 3L3 7.24264L4.63306 8.8757ZM15.6484 4.87848L17.3848 3.14214L21.6274 7.38478L19.5793 9.43294C18.909 7.45322 17.4848 5.82115 15.6484 4.87848Z' fill='black'/%3E%3Cpath d='M8.00119 11.9921C8.00119 11.0268 8.00119 10.0615 8.00119 9.09612C8.00119 8.50505 8.16497 8.1743 8.56285 8.05781C8.97778 7.93628 9.40619 7.97917 9.79565 8.45228C11.3533 10.3447 12.9343 12.218 14.5092 14.0959C14.5692 14.1676 14.6117 14.3122 14.734 14.2626C14.8496 14.2157 14.7858 14.0805 14.786 13.9878C14.7904 12.6326 14.7898 11.2774 14.7868 9.92226C14.7868 9.83668 14.838 9.7162 14.7271 9.67372C14.6401 9.64029 14.5824 9.74185 14.522 9.79358C14.0492 10.1981 13.5804 10.6073 13.1088 11.0133C13.0208 11.089 12.9332 11.2118 12.8002 11.1012C12.6657 10.9894 12.7696 10.8872 12.8364 10.7881C13.3547 10.0186 13.8728 9.24898 14.3909 8.47919C14.6656 8.07085 15.0079 7.92282 15.4056 8.04141C15.786 8.15475 15.9986 8.48592 15.9992 8.97668C16.0007 10.0905 15.9996 11.2045 15.9996 12.3183C15.9996 13.2094 16.0003 14.1005 15.9994 14.9916C15.999 15.4826 15.8137 15.798 15.4512 15.9324C15.0256 16.0901 14.5767 15.9683 14.2734 15.6058C12.6823 13.705 11.0924 11.8029 9.50198 9.90144C9.46029 9.85161 9.42303 9.7961 9.37377 9.75489C9.28998 9.68487 9.21967 9.68108 9.21314 9.81797C9.20999 9.88273 9.21188 9.94791 9.21188 10.0129C9.21188 11.3496 9.21062 12.6862 9.2142 14.0227C9.21441 14.1186 9.15609 14.2557 9.26114 14.3038C9.38093 14.3587 9.45061 14.2178 9.52998 14.1503C9.98259 13.7651 10.4291 13.3728 10.8805 12.9859C10.9729 12.9066 11.0626 12.7651 11.208 12.8973C11.3402 13.0176 11.2213 13.1196 11.159 13.2127C10.6323 13.9989 10.1032 14.7837 9.57145 15.5663C9.32788 15.9248 8.9881 16.056 8.61085 15.9488C8.23739 15.8428 8.00498 15.5246 8.00287 15.0827C7.99761 14.0523 8.00119 13.022 8.00119 11.9917V11.9921Z' fill='white'/%3E%3C/svg%3E\",\n reference: 'https://near.staderlabs.com',\n reference_hash: null,\n decimals: 24,\n id: 'v2-nearx.staderlabs.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'refLove Finance Token',\n symbol: 'refLove',\n icon:\n 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIxLjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAyODggMzI0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyODggMzI0OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzAwQzA4Qjt9Cjwvc3R5bGU+CjxnPgoJPHBhdGggZD0iTTE3My40LDE5MS40VjI2OEgyNTBMMTczLjQsMTkxLjR6IE0xMDcuMiwxMjUuMmwzMCwzMGwzMC4zLTMwLjNWNjkuMmgtNjAuNFYxMjUuMnogTTEwNy4yLDE1Mi4zVjI2OGg2MC40VjE1MmwtMzAuMywzMC4zCgkJTDEwNy4yLDE1Mi4zeiBNMTc3LjEsNjkuMmgtMy43VjExOUwyMTIsODAuNUMyMDEuOCw3My4yLDE4OS42LDY5LjIsMTc3LjEsNjkuMnogTTM4LDE3NS41VjI2OGg2My4zVjE0Ni40bC0xNy4xLTE3LjFMMzgsMTc1LjV6CgkJIE0zOCwxNDguNWw0Ni4yLTQ2LjJsMTcuMSwxNy4xVjY5LjJIMzhWMTQ4LjV6IE0yMzYuOCwxMjguOUwyMzYuOCwxMjguOWMwLTEyLjUtMy45LTI0LjctMTEuMi0zNC44bC01Mi4xLDUydjQyLjRoMy43CgkJQzIxMC4xLDE4OC41LDIzNi44LDE2MS44LDIzNi44LDEyOC45eiIvPgoJPHBvbHlnb24gY2xhc3M9InN0MCIgcG9pbnRzPSIyMTAuMiw1NiAyNTAsOTUuOCAyNTAsNTYgCSIvPgo8L2c+Cjwvc3ZnPgo=',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'v010.refve.testnet',\n },\n {\n decimals: 18,\n icon:\n 'data:image/png;base64,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',\n name: 'Ether',\n reference: null,\n reference_hash: null,\n spec: 'ft-1.0.0',\n symbol: 'ETH',\n id: 'aurora',\n },\n {\n spec: 'ft-1.0.0',\n name: 'USDT',\n symbol: 'USDT',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 288 288'%3E%3Cg id='l' data-name='l'%3E%3Cpath d='M187.58,79.81l-30.1,44.69a3.2,3.2,0,0,0,4.75,4.2L191.86,103a1.2,1.2,0,0,1,2,.91v80.46a1.2,1.2,0,0,1-2.12.77L102.18,77.93A15.35,15.35,0,0,0,90.47,72.5H87.34A15.34,15.34,0,0,0,72,87.84V201.16A15.34,15.34,0,0,0,87.34,216.5h0a15.35,15.35,0,0,0,13.08-7.31l30.1-44.69a3.2,3.2,0,0,0-4.75-4.2L96.14,186a1.2,1.2,0,0,1-2-.91V104.61a1.2,1.2,0,0,1,2.12-.77l89.55,107.23a15.35,15.35,0,0,0,11.71,5.43h3.13A15.34,15.34,0,0,0,216,201.16V87.84A15.34,15.34,0,0,0,200.66,72.5h0A15.35,15.35,0,0,0,187.58,79.81Z'/%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'usdt.itachicara.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'USDC',\n symbol: 'USDC',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 288 288'%3E%3Cg id='l' data-name='l'%3E%3Cpath d='M187.58,79.81l-30.1,44.69a3.2,3.2,0,0,0,4.75,4.2L191.86,103a1.2,1.2,0,0,1,2,.91v80.46a1.2,1.2,0,0,1-2.12.77L102.18,77.93A15.35,15.35,0,0,0,90.47,72.5H87.34A15.34,15.34,0,0,0,72,87.84V201.16A15.34,15.34,0,0,0,87.34,216.5h0a15.35,15.35,0,0,0,13.08-7.31l30.1-44.69a3.2,3.2,0,0,0-4.75-4.2L96.14,186a1.2,1.2,0,0,1-2-.91V104.61a1.2,1.2,0,0,1,2.12-.77l89.55,107.23a15.35,15.35,0,0,0,11.71,5.43h3.13A15.34,15.34,0,0,0,216,201.16V87.84A15.34,15.34,0,0,0,200.66,72.5h0A15.35,15.35,0,0,0,187.58,79.81Z'/%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'usdc.itachicara.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Staked CORN',\n symbol: 'xCORN',\n icon:\n \"data:image/svg+xml,%3Csvg width='300' height='300' viewBox='0 0 300 300' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M150.43 32L99.7144 61.4389L150.43 90.8705L201.145 61.4389L150.43 32Z' fill='%235C65A5'/%3E%3Cpath d='M201.146 61.4388L150.431 90.8703L201.146 120.309L251.854 90.8703L201.146 61.4388Z' fill='%233B4274'/%3E%3Cpath d='M99.7152 61.4388L49 90.8703L99.7152 120.309L150.43 90.8703L99.7152 61.4388Z' fill='%233B4274'/%3E%3Cpath d='M150.43 90.8707L99.7144 120.31L150.43 149.749L201.145 120.31L150.43 90.8707Z' fill='%235C65A5'/%3E%3Cpath d='M99.7152 120.31L49 90.8707V149.749L99.7152 179.187V120.31Z' fill='%235C65A5'/%3E%3Cpath d='M150.43 149.748L99.7144 120.309V179.187L150.43 208.626V149.748Z' fill='%233B4274'/%3E%3Cpath d='M99.7152 179.187L49 149.748V208.626L99.7152 238.058V179.187Z' fill='%233B4274'/%3E%3Cpath d='M150.43 208.626L99.7144 179.187V238.057L150.43 267.496V208.626Z' fill='%235C65A5'/%3E%3Cpath d='M150.431 267.496L201.146 238.057L150.431 208.626V267.496Z' fill='%233B4274'/%3E%3Cpath d='M224.085 213.702L209.447 198.197L194.809 213.702H167.656L195.643 182.183L167.656 150.665H194.809L209.447 166.933L224.085 150.665H251.086L223.175 182.183L251.086 213.702H224.085Z' fill='%233B4274'/%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'xcorn.corndao.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Tether USD',\n symbol: 'USDt',\n icon:\n \"data:image/svg+xml,%3Csvg width='111' height='90' viewBox='0 0 111 90' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M24.4825 0.862305H88.0496C89.5663 0.862305 90.9675 1.64827 91.7239 2.92338L110.244 34.1419C111.204 35.7609 110.919 37.8043 109.549 39.1171L58.5729 87.9703C56.9216 89.5528 54.2652 89.5528 52.6139 87.9703L1.70699 39.1831C0.305262 37.8398 0.0427812 35.7367 1.07354 34.1077L20.8696 2.82322C21.6406 1.60483 23.0087 0.862305 24.4825 0.862305ZM79.8419 14.8003V23.5597H61.7343V29.6329C74.4518 30.2819 83.9934 32.9475 84.0642 36.1425L84.0638 42.803C83.993 45.998 74.4518 48.6635 61.7343 49.3125V64.2168H49.7105V49.3125C36.9929 48.6635 27.4513 45.998 27.3805 42.803L27.381 36.1425C27.4517 32.9475 36.9929 30.2819 49.7105 29.6329V23.5597H31.6028V14.8003H79.8419ZM55.7224 44.7367C69.2943 44.7367 80.6382 42.4827 83.4143 39.4727C81.0601 36.9202 72.5448 34.9114 61.7343 34.3597V40.7183C59.7966 40.8172 57.7852 40.8693 55.7224 40.8693C53.6595 40.8693 51.6481 40.8172 49.7105 40.7183V34.3597C38.8999 34.9114 30.3846 36.9202 28.0304 39.4727C30.8066 42.4827 42.1504 44.7367 55.7224 44.7367Z' fill='%23009393'/%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 6,\n id: 'usdtt.fakes.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Staked CORN',\n symbol: 'xCORN',\n icon:\n \"data:image/svg+xml,%3Csvg width='300' height='300' viewBox='0 0 300 300' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M150.43 32L99.7144 61.4389L150.43 90.8705L201.145 61.4389L150.43 32Z' fill='%235C65A5'/%3E%3Cpath d='M201.146 61.4388L150.431 90.8703L201.146 120.309L251.854 90.8703L201.146 61.4388Z' fill='%233B4274'/%3E%3Cpath d='M99.7152 61.4388L49 90.8703L99.7152 120.309L150.43 90.8703L99.7152 61.4388Z' fill='%233B4274'/%3E%3Cpath d='M150.43 90.8707L99.7144 120.31L150.43 149.749L201.145 120.31L150.43 90.8707Z' fill='%235C65A5'/%3E%3Cpath d='M99.7152 120.31L49 90.8707V149.749L99.7152 179.187V120.31Z' fill='%235C65A5'/%3E%3Cpath d='M150.43 149.748L99.7144 120.309V179.187L150.43 208.626V149.748Z' fill='%233B4274'/%3E%3Cpath d='M99.7152 179.187L49 149.748V208.626L99.7152 238.058V179.187Z' fill='%233B4274'/%3E%3Cpath d='M150.43 208.626L99.7144 179.187V238.057L150.43 267.496V208.626Z' fill='%235C65A5'/%3E%3Cpath d='M150.431 267.496L201.146 238.057L150.431 208.626V267.496Z' fill='%233B4274'/%3E%3Cpath d='M224.085 213.702L209.447 198.197L194.809 213.702H167.656L195.643 182.183L167.656 150.665H194.809L209.447 166.933L224.085 150.665H251.086L223.175 182.183L251.086 213.702H224.085Z' fill='%233B4274'/%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'xcorn.v1.corndao.testnet',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Tiptoken',\n symbol: 'TT',\n icon: null,\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'tiptoken.testnet',\n },\n];\n\nexport const DefaultMainnetTokenList = [\n {\n spec: 'ft-1.0.0',\n name: 'Wrapped NEAR fungible token',\n symbol: 'wNEAR',\n icon: null,\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'wrap.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'USD Coin',\n symbol: 'USDC',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none'%3E%3Ccircle cx='16' cy='16' r='16' fill='%232775C9'/%3E%3Cpath d='M15.75 27.5C9.26 27.5 4 22.24 4 15.75S9.26 4 15.75 4 27.5 9.26 27.5 15.75A11.75 11.75 0 0115.75 27.5zm-.7-16.11a2.58 2.58 0 00-2.45 2.47c0 1.21.74 2 2.31 2.33l1.1.26c1.07.25 1.51.61 1.51 1.22s-.77 1.21-1.77 1.21a1.9 1.9 0 01-1.8-.91.68.68 0 00-.61-.39h-.59a.35.35 0 00-.28.41 2.73 2.73 0 002.61 2.08v.84a.705.705 0 001.41 0v-.85a2.62 2.62 0 002.59-2.58c0-1.27-.73-2-2.46-2.37l-1-.22c-1-.25-1.47-.58-1.47-1.14 0-.56.6-1.18 1.6-1.18a1.64 1.64 0 011.59.81.8.8 0 00.72.46h.47a.42.42 0 00.31-.5 2.65 2.65 0 00-2.38-2v-.69a.705.705 0 00-1.41 0v.74zm-8.11 4.36a8.79 8.79 0 006 8.33h.14a.45.45 0 00.45-.45v-.21a.94.94 0 00-.58-.87 7.36 7.36 0 010-13.65.93.93 0 00.58-.86v-.23a.42.42 0 00-.56-.4 8.79 8.79 0 00-6.03 8.34zm17.62 0a8.79 8.79 0 00-6-8.32h-.15a.47.47 0 00-.47.47v.15a1 1 0 00.61.9 7.36 7.36 0 010 13.64 1 1 0 00-.6.89v.17a.47.47 0 00.62.44 8.79 8.79 0 005.99-8.34z' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 6,\n id: 'a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Tether USD',\n symbol: 'USDT.e',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Ccircle cx='16' cy='16' r='16' fill='%2326A17B'/%3E%3Cpath fill='%23FFF' d='M17.922 17.383v-.002c-.11.008-.677.042-1.942.042-1.01 0-1.721-.03-1.971-.042v.003c-3.888-.171-6.79-.848-6.79-1.658 0-.809 2.902-1.486 6.79-1.66v2.644c.254.018.982.061 1.988.061 1.207 0 1.812-.05 1.925-.06v-2.643c3.88.173 6.775.85 6.775 1.658 0 .81-2.895 1.485-6.775 1.657m0-3.59v-2.366h5.414V7.819H8.595v3.608h5.414v2.365c-4.4.202-7.709 1.074-7.709 2.118 0 1.044 3.309 1.915 7.709 2.118v7.582h3.913v-7.584c4.393-.202 7.694-1.073 7.694-2.116 0-1.043-3.301-1.914-7.694-2.117'/%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 6,\n id: 'dac17f958d2ee523a2206206994597c13d831ec7.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Dai Stablecoin',\n symbol: 'DAI',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Ccircle fill='%23F4B731' fill-rule='nonzero' cx='16' cy='16' r='16'/%3E%3Cpath d='M9.277 8h6.552c3.985 0 7.006 2.116 8.13 5.194H26v1.861h-1.611c.031.294.047.594.047.898v.046c0 .342-.02.68-.06 1.01H26v1.86h-2.08C22.767 21.905 19.77 24 15.83 24H9.277v-5.131H7v-1.86h2.277v-1.954H7v-1.86h2.277V8zm1.831 10.869v3.462h4.72c2.914 0 5.078-1.387 6.085-3.462H11.108zm11.366-1.86H11.108v-1.954h11.37c.041.307.063.622.063.944v.045c0 .329-.023.65-.067.964zM15.83 9.665c2.926 0 5.097 1.424 6.098 3.528h-10.82V9.666h4.72z' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '6b175474e89094c44da98b954eedeac495271d0f.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Wrapped Ether',\n symbol: 'WETH',\n icon: null,\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: 'c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: '1INCH Token',\n symbol: '1INCH',\n icon: null,\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '111111111117dc0aa78b770fa6a738034120c302.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Graph Token',\n symbol: 'GRT',\n icon: null,\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: 'c944e90c64b2c07662a292be6244bdf05cda44a7.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Skyward Finance Token',\n symbol: 'SKYWARD',\n icon:\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMAAAADACAMAAABlApw1AAAB+1BMVEUAAABWWLVmXbOiaJ9pXrJbWrVvX7NhXLRxYbNXWbWcaKffeILLb41lXbSCZbCkZ6N+ZbJcWrVgXLXTcYjlf33jfH7heYDieoCJZq5+ZLHAaJRoXrTgeIHFaZCZZ6iYZ6jcdYPmgX2oZ6GxZ5u7aJbRbImyaJzie3/Qa4n///94Y7ODZrGZaKnrjHpqX7XohX1kXbW1aJvFaZHacIWeaKfBaZTieoDgdoJ9ZbNzYrSTaKxvYLS9aJbQbIquaJ+jaKTTbYleW7XmgX3piHuyaJ25aJnJapDNa42paKCmaKLdc4PwnXXtk3iJZ6/skXlYWbWOZ63ypnPkfn7Lao6JZq/xonTXb4fzrHHulXfvmXf1snBhXLXvmneQZ632uW/75+b69fjXdY2HcLj67/GahML+9O385tXpi4T2296AabXvnn3chJn1t4TjmqrafJL3wo68rNaSe72bcLDxqIffjqH0tZfp3+73wp/ohoHy7PWtir73ybfuqKb1s3mnk8n62cGmfrbmpbTsn5zqlpTg1enxxcnyqHz00NSync3yuLOicKzpj4v4v3m4k8H5y5mgd7TtmofUxuDrtsLeeInljpjwqZPLudn0r3zEo8rCh7D61KzjgIbTjauRcbTjho7WrcnSeZitd63KfaLXnLi1gbG5cKHEcpuvbqPjxNjN3AFJAAAAKXRSTlMA71IjE7A5ZcbT8kw6oXlU8ol5YezgsHOi4ansne3iyorQrIt01eTFwdYInfkAABWHSURBVHja7JY9b9pQFIax8QceXMms+QUJVZUxgYkfgNKBLYqEIpZuNoMlM1gMHqxKCLGgLPmvPb4GH/vcD9vBBIa+pKaly/Oc99xLev9DY1i67bmOo1XjOK5n65bRu+UYumc62osqmmN6+k1aWLbpEFiVhd3v3VBg8if4qeAljnMrTRi2qZ3Ys8AbvpekBCaaaV/dQc/op/Vh/ODBO+i968XytGnLCCQ0z+pdJbY5/UpETVyhBmPo8Giv01eaplU4dueIanwNqY95fIQfPvAf6KKqQhv2vi0n/By8acQSV1Cw7xg7R97eAnv4xkXSHQn8L/aHvCQSEEkPzoVvpL4rpYcHEJfCPsieTarAFtxLfrcNRei/EFwVoUTZ4FSDdrE9sgaEvX1oHdkVxW+SeZnf9IaE/YyoemC5wH3UH5SWRpwJn+xDHh+rQAdiYHZ9EnSkr+cWmfAeRIE4aHqn/J54cSZtI5PAGtDB6w7fYOtTg/4sC29Rr9DtGll3BL6Wu16E3EyiFjr7VrMr+HXsD8e3B4WE2qG8R3oXt6eaHsnFQRW1BDpgDZ3cpy5PT7gRVRGqISyC/3Y7/yibCno1cL0HpyBapBe3C36eXjTzJ3jBE36Kh9pB3ALdI/MM/gHiE3gCfoIv5w9JVUhaA38UzLP46ezJ4BG8wv4OCYJgWQT+AR+BhdwBW+jKYMDhC+ZOM8rggTyO09QvJU3jGDxA4qlW4REVzjEwK7vD7zvPPgJ6Bp/6hySMFot7zCIKk72fxsuAFCFxqCp85SS7Ewk/HfyoCNDn8NG9JItw78fHHjBqBWbgtf/+QnoKT+if2AuS4fuHEOcuTrSHHmoVqIHdkl9Hfjy2yI6jZ88jfuonKnrsIfGVCvQoMAO9Fb+F9MK1H5Gw6SN+fUI/DsBApUBL6LfgN+6K1cfhIzyP/xkgflOFdHlUQAtiACkZaG0u0Amhf6jsfJEZ+5m/fy7TQ3TfMot9vAQDdQt4oba5TD3cngo+23mkZ4/5fJaNP2yDjnsEJTxBKiWgAS1h2PQA4/hlw5/Ba84yY/w4/rYlsDWCkBbEBlazA4DjR34cfr41R3rgz9YHt79tEjAYjSQt0JPQ8BgMKD6kPPv5iT7Lb+DfI3/7hIUBpPgdV1ZCk2PwA/kF1w7CH/l3yH+uAbbwTPYIDexa/j69ecqrg/TADgH+WLk/UZ56g0Ihj7SEV6N2geTjR3rAZxnv1lL+KDmk23WebXrYh1LRZJkJ0BYkF+qgboHI9OnwEf7t7W28Wn9E4qnut+vNZrdb5dntNpv11k8kBocgw6ctSNZIvUQGjr+yPWT2jH48Xm3SUDjSj/UG2H/mGbOAxWYtOS9RMBuxiBS4LVIKuIhPxl+hz5myBRJNH/D/MnqGj39ZrUAhETXwyQRkLZAOXAW/JcLH3SnTswL+MV4+r01FQRSGtNoqWH+sLIKuRTfWFCW06kKTtlAQKu7EhGwCISIlFFJcJGAJBEJpK9JgtEmapv0znUxect6dmXtfj7pT+L6ZM/dZo0D5I8InXgQirPC9pm/g7/an2Qpg4NYIBoHP2TL4MX2bnoAO20fG+OutVjqdfp4m3rShcLhPtZP8H3lKs5mZO4DBLS//QsT/zB0/ugN6Cl1wXvG364QvQiIxld1626nR0Zh/GwZQ8BqkfAL3MH5j+hkHnxeg+fvgVxYwwC3vfa/vZrbJAAp8Cs6DKh+jR94n1GmPOXxMsqUvoHbab711IixgMDM+3M18pEwVcAmhU17wLECNX3Ufj0q6pZ+g30Pw+zzYfdqin/vEn8l8gQF6FDKwV7Ck5q/wp6FCpPvtPfmaDPubm2836Q/9CllMDY4m/HEFGKBGxC8NFswF6PHb5WGI1lCecK1N/FYMiVZ9//Tnaf2Qv3NKIXTK/hUs4UcWjF9Pf4YwlA26Gl5uuLE1Jv+81Tps8fcCCvYSbIOUtQC0B+VX0+cQRr99Jb5g7f6GN0IC92Ao4BJe+w30tyCFb1fED3wxfWZQJ7DXudx4I2OsAwpxBxiYNdIG6nO86MzfGj/oKZv905pqEMB9JoaDayCW4G/RDcE/J8YfxCeGDXXDp30mfR+LkFBlwifOXEJ4B3OuwMPobwt+0Mfxif9yeOYK5DsX732Ri1AKUYQBTtkyeCBOWNcH/Ap/YyzgLqAYCbxwYliEFFCj5B08ck8Y80/CZ4A3lx0hUOtcOOimhnawFZIN5BkvYv4mP4bP+G+0wB4EzJgK2IJtQPG36E5cgPn1/DU+01sCpc7FByteCygYS0CN9P/tIgGnQwvM7xu/wieGC7UBCAQ9DAVswV8jyyAFgYeB+qD7wDcEit2LNSPSAQqcmIKnRuoOUCJ0aP4e+HV9NP4Yo3OWFwKjNX+EhNwClqAN/GeADqU8/GiPwIcAcj5YW11bFZEScJAKqNH1DW7OGqT5MX6Fz/kwOBcCZ4MRwH0atgJ6JGrkN2CB2bdsGfyoP+FLfuB/IIGaK9DsxgRWvBZYAxRgoGoUNFiM+Oc0f2j8TLA2Oi+JKz4frK5YgYNUwC3YNdItYgEYzEcnkMCv8Qlj1L2SP9B0Ryu+GHuAgnsJMEhuUSo6AfCj/jY+8zPCaHD2VK0gl82uZGfRFmEFGIR3AIE70QmAP17/2dvJi3bxCWRwXhQGpW6PDIyYDm6RZI2e2wb8ScbXYHIE8+A362PhU0bd0lNZIjLYiSWb3YEDFOAAAz4zGOgd0EuvS/SIBe5uW/yiPgKfBY6lQPGYDKaBipSAARR0jZ5rA10i/hIsSX5z/C4+YWTRIcMAcTRkk2wDtQP8iCNWsMQ3nMCv8CcQ2R7eIRgcVMq93Po6/5YW8T3AgCIPQbfId8h8xU++fMH9evkFPpHkeAUypUa1V1iPJReZSAX/EtAi2wACfMXzhE8R/Fx/4Ct+yk6ve0DEukaV6rdC4d27uAQcdqBgL8HewUfbYJkEbqoCYf5q/KCn5HqVrwBHvpJCmRTGWYeHswe1hMAOYKBLNEePkJg/+J3rlfg5Sq/ayD+1FRrVMq9hEhhQ4vccNlCPqf4apOgREvy6P3L8jE9ZJ4MmqMU1Nyoxh3X6DQtsYbIE1Ei3KOEMFlgg3B97/ExTKKNEeg1wUHtghRVrCdgBDFSJ8JYu0SsKfmf+sj4an8ZaKDdgoJIvHUcOn5UCliAN8JrikDPj4IdkGNynVzRj8r/X9ZH4FNMg2QEKWAIM0KLkEtGH4LHqj54/2s/dZ3zO58/fqjCwU4QDFPQSQjuAgVzBIgTwAVDzx/gFPqUAg2QHrWAY8Ar0DrACGLDA7RA/C8jxA//lON/KlRJYvQ5NPK1QsAxYwfOYqhItuwLh+aP8RM/4nJOTcqWZTxLA0woF1MjcgV0iLXB9foyf6KfZ2to6+Reqkf7CsQJqhFPWBnaJYMACToF8/DkK8OP8bPCrclAEZ7BKjQoUUCMYiKcovIJ7UwHmxwME/tD4tyb4ryh/SKEJhfDLygoJBjiD0OeMBawC4X7Bj/Fj9hF/pPDjugrNRjUyoMBgFQbJJYJAiJ8i5g980HP+N2+ur03GYBQPVhRscULtqmPqdF4/iHjbvqhI590hXnA6EauI3ajVfpijg20UK6sURYpaChP8W03S5j3N8yR52+nUs6kIiueXc54kfVsnfvz4+WFlLTwLuHMjhOt9E/AIOAAGwNkftN+yPzE5oSVTqDWwI4U0jxCQARnkYAQAsAOAf7L+rD5Ye0im8OnDytd8XyG8e20TnAkSYI4NgJIG0P6xA3H/WH7X6vfovlRu7tOHGqoUmoQ3r/0ZnOYENAIDwAvkW3/u3zJvlFvSDB9jGeZ9BBgDX4kMgDoHiH+ygUr/WH+6/Lb3nPw2WkIO8QSYZAxyaI5xp9MA+gi4RAsUXH+H/RzVqX4Y8oSAlwjHGT/NAIAA6AZE1v9WyD68KymE+C59jPYiCUAI/FMAAHWdxosADAD8Y/3jV/8Uk2Hwn3Br797OgABbkTXHOI/JWaAADvgC4P4B0GOfeucMc5JhpeGJ4eV7WSIQDBKBItgjxCEJ4NiBsIHCP1l/h/0p+W1kMcgYGvOeMXj7AhlcCxBgI8Lrgp1CjN9kRwB2UO4f9rl7l8AgEfLuEgHAImBbKdtJNcBhOQHOCXb517KWn5g/eXJKfnV+JgxLskiua8bLN2/PzsSWiEyBAdguxBCZAHYCzLgCkO5hPzLPBQRdpFrjpXMnmlEEbC+VjY6LYIsQKRYAKRDml/WH2/dCmB6t5J0RGILYCAhAQghxExNA/fMCwT78U/N31BdH8BOsvf424ypRfIf2CqkDLAB9BMC/tz/c/h1bFoKfIP8uigA7EYnAvZPuUQCHAEACwACw9Yd9Yn5afk+r764IgiLgcyA7JAkQAZ8CHgEAxlWDSAC0QFh/l3+4t2UwCEGt4egQiYBMgQ9gpwIY8gbA/Cu5/Peafxz9AANC0NvpCj3S5t99O+ua49gObRNKl3AIswBQIL7+3P5jWwaChCBL9JzvQ2fJYYAI0CEKsEtoHcUI8wDgn68/7Bvzs73qUiAFTeCMQAOEI8BRAIADQusQaVAoAPjH8k8rGfdPIxkInQMIJAKfgq+vz1oRAOBC6CjYI7SGrvBDmAcQWH/tXpu/3SMDYVIAwpLsEJ9ivhGRMeYA24RWwjXCOgC+A9n+o/Yw96DQCKiRBvhEz4KP37+RCAIdOhftQ1tFdwgAEAoA/rH8UXlgnyF0Q8Aon2JDMN8FUATYSdlpbO9Ddw+Irsb5CGMC6A5E11/Zx+o/7FHEYHoUlWiutsYAbiGC64gg2KGdBmCIjnA4AO6fmGcMJIQAwEx8hwCAT08fNQB8D8UE8AJJ+5Z/g3Dv3j0guAjmassOACVrJ2UAN6wE9otII2gQrnGhALj/yDoEBD0JepQDAIiAdci9ke4BwJCvQWH/6A/cEwEBBCEA3iH/YTwkILoHXQ4DwD+WH/4fyS9KoEc5KtFca80BcCvUIQ6wQ/RohOxBrEE8ALL+xjxECGQEUQbNlY8MYDLQIVzoAKAaBKUAgAbFB0D9K9vRFxiQQfdEa9JzYO3n5KSzQ+xCh6Nsm+jVvjgAHoDe/3uHt+MeUr+JQsAYKAD6muYrAHxnGQXYLyyNyz/ZX4MwwdJ/sVhfWKjX693qQyDQsgimm63ODEMrGuAWAOKHYKcNkAAAOwQmGIApkLS/WKlUSm2UX+nJEwsBGTztlMiMAFT70QFAh2IBtgpbI2iQC4AFoP1L+8uvTpxYLrVhPhIjMBEUW7RB+e8SwESAITgTmOJDgigVBOAN6vhfLuh/X2YA948IQkTQnePZ5mKVPtoCADrkOspwmdgmqPYBwDoFaIOM/2JxQS2/VqFSWlX+mXozMCUqtrp/DWr8nJhEh9wAp3EhlQAHBFNaAWCG2Qho/wAoLrQqWMhCubQK288sAoUAAJlbo0Df7qv9UACT/CgjF1IADAmufdiEEIAH4HGnPlBVEhj3z5QMBS1RcQEFwjFGAMwUn/FN8X7h0GGdAEbAv4lq/3YPXhkCbV59GwQ7AvUXn5/gDZIAbIoD2xACIBEAwD3DJoBm5B8EXxSBtA2ZDBABBdfKf/ihAHxnMQdAADQC1yaEBmEPKi7ABubgS/kzzOsQKEBd+2cBfDIA2IaCAAiARtA3QAv9hwrr5c+fAwT1ut63WAC1uQkpbEOOBBQBABAAUdp3l5b+CQAbRF2j9S8WggVQV6d2VfafB5DTAIiA76N2AgiA6ggAAufw9PTswqL7TceCRvjMCdrtkjy1XX9p/sNcjiYQPskOCK9S9CpHAHAK4DAiIWgEzYDNdHW1VCpXlgtYfujlyqel+/djAK5aAAnh1wg/x8zzFAB0tlGUiCFIBgmhtfq5JM2XK+tV2Le09mEpZwAm+0pgXIT0gAG4LxKSAHPMGaoSQqpcVj+vS/fIixcoJ/33D7BDBJUOVwg3ORB4IF4VCoVqtVoo5GHesQN9WsqxBGZwl+AAQyKs430BgGCDgv9TuYEqdEjEKAEA7y6kAfSt5tXv+W8056R/CdD/LiRilcY26pkB83Ie5+pv+JcA8TOAcwAFCpSIVMgLIK8Gi5X8xv23lH/ToP4qhAKFZN1GnduoBtAEpcpGB2Fe+/ckcNENcFT0pSS5SgAAr+hnZxWAIlhc30gIL9ek/6kpKwF6neYVSon+NOZ8PUBe0isARdAuVQaf5cJKs3nyZBiA30YPi3513AcwZQHc1k+02u1ypTAQQn5ZLv9JDYBNKB4AAxCvi+GjGEOgCB61S2WWQth+807Hvw9A+ycAR8UASvgOgik6BPqZnEZYL/RVnkarWZyW/p0A5J0+6wF7QgyipHsbIhGA4JG6cH6p5mMWv7rYWijOTt+xASZcAPQdgpQYTFnvq3o8GTVTIAkUgmZYxzjQG96ycl+cNe/2ydUY4BgYEoNqDADuJ3MkAsOgbqDVqrzCveqQyF/lra6yuCifAheLTzv+EQAAgs/XD4vBNUqnmHcIBApB68mqplD6UlEqlxdLpVK7Xn/4EA/YQyMwg8dC0QyPi41oGADBCECAB7yrXbWl6tI8nk6jQXQE+Fs0ZgRGxMY0LDvkB5AEiIC8P0Dfaer69wTgvosCAP4HJ9AA2EjpA3abgCFIKPhHgYIjTGf4PPxvhMDfIVMitAgI1D7e5ZtmAbhfjgEA/jekUXSIR8AIdJHwxf2jQP4GkSej4+L3NOaLAGOA94mVaYi/y+oNgAOYETgsfldZAEg536kHgqaAsPzcPwII3eTS4veVlC3Ch204Qe9HVbh77j82AOxB+1LiTyiVsT9vFvdpm45xuLc+68ECYCMMgCMJ8Yc07Pu8EPYiMDjtx/vn94gR8ec0Zi7VIDAI5ANn1L2uD/FvCgQA+Mcmelj8SSV341bNMkCPiLD8xH98AKj/H6sRxoATzCIF4p7Yp/4xAUoIYET8eWX5cYZR7jBIv2TtlX34JwWa8AWwLy02Q4lhRGDPgc2gfnTMm9V3+ycTgENsJCE2SendhEAJBAbCeHd/dtr49wWA5d8MjboI2MfX4R324Z8MAAlgTGyuUsfMGND/P2BkPu8N97AP/2QHMgEcT4lNVzqjMgABjQHeyf9+QH/g3y7QkaT4K8pmSAhgoDoZifrnA3DEX/7NRAABpyDujf9c7/obANj/O0ofBAEguNAe2HcM8PGk+OtKDiuCeIQpx/KTARhNiX+iVDYDAiAQ83z5taL+HMkmxN8XYtjdYYCMc5iHfeY/8/cXnzOMIgemU8S+1Z/MaFL8H0pmDxqnynTXu3QfsH8s+7+47yiRHD2o2wTBPdqjlTk2lkyI/1Gp7OhwxmEeq58ZHs3++9bHZZHOjg0fO3gws9soc/DgseGxbHoT1v0X6Almagg4b48AAAAASUVORK5CYII=',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'token.skyward.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Banana',\n symbol: 'BANANA',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='256' height='256'%3E%3Cdefs%3E%3Ctext id='A' x='50' y='180' font-size='180'%3E🍌%3C/text%3E%3C/defs%3E%3Cuse xlink:href='%23A'/%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'berryclub.ek.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Cucumber',\n symbol: 'CUCUMBER',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='256' height='256'%3E%3Cdefs%3E%3Ctext id='A' x='50' y='180' font-size='180'%3E🥒%3C/text%3E%3C/defs%3E%3Cuse xlink:href='%23A'/%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'farm.berryclub.ek.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'HuobiToken',\n symbol: 'HT',\n icon: null,\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '6f259637dcd74c767781e37bc6133cd6a68aa161.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Gitcoin',\n symbol: 'GTC',\n icon: null,\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: 'de30da39c46104798bb5aa3fe8b9e0e1f348163f.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Uniswap',\n symbol: 'UNI',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Ccircle fill='%23FF007A' fill-rule='nonzero' cx='16' cy='16' r='16'/%3E%3Cg fill='%23FFF'%3E%3Cpath d='M12.261 5.767c-.285-.044-.297-.05-.163-.07.257-.04.865.015 1.284.114.977.233 1.866.828 2.816 1.885l.252.28.36-.057c1.52-.245 3.067-.05 4.36.547.356.164.917.491.987.576.023.026.064.199.091.383.096.637.048 1.125-.146 1.49-.106.198-.112.26-.041.43a.416.416 0 00.372.236c.322 0 .668-.52.828-1.243l.064-.287.126.143c.692.784 1.235 1.853 1.328 2.613l.025.199-.117-.18c-.2-.31-.4-.522-.658-.693-.464-.307-.955-.411-2.255-.48-1.174-.062-1.839-.162-2.497-.377-1.121-.365-1.686-.852-3.018-2.599-.591-.776-.957-1.205-1.32-1.55-.827-.786-1.639-1.198-2.678-1.36z' fill-rule='nonzero'/%3E%3Cpath d='M22.422 7.5c.03-.52.1-.863.242-1.176.056-.124.109-.226.117-.226a.773.773 0 01-.055.204c-.103.304-.12.72-.049 1.203.09.614.142.702.79 1.365.305.311.659.703.787.872l.233.306-.233-.219c-.285-.267-.941-.79-1.086-.864-.097-.05-.112-.049-.172.01-.055.056-.067.138-.074.529-.012.608-.095 1-.296 1.39-.108.21-.125.166-.027-.073.073-.178.08-.256.08-.845 0-1.184-.141-1.468-.966-1.956a9.046 9.046 0 00-.764-.396 2.916 2.916 0 01-.374-.182c.023-.023.827.211 1.15.336.482.185.561.209.62.186.039-.015.058-.129.077-.464zm-9.607 2.025c-.579-.797-.937-2.02-.86-2.934l.024-.283.132.024c.248.045.675.204.875.326.548.333.786.772 1.027 1.898.071.33.164.703.207.83.068.203.328.678.54.987.152.222.05.327-.286.297-.514-.047-1.21-.527-1.659-1.145zm8.905 5.935c-2.707-1.09-3.66-2.036-3.66-3.632 0-.235.008-.427.017-.427.01 0 .115.077.233.172.549.44 1.164.628 2.865.876 1.001.147 1.565.265 2.085.437 1.652.548 2.674 1.66 2.918 3.174.07.44.029 1.265-.086 1.7-.09.344-.367.963-.44.987-.02.006-.04-.071-.046-.178-.028-.568-.315-1.122-.798-1.537-.549-.471-1.286-.847-3.089-1.572zm-1.9.452a4.808 4.808 0 00-.131-.572l-.07-.206.129.144c.177.2.318.454.436.794.091.259.101.336.1.757 0 .414-.011.5-.095.734a2.32 2.32 0 01-.571.908c-.495.504-1.13.782-2.048.898-.16.02-.624.054-1.033.075-1.03.054-1.707.164-2.316.378a.488.488 0 01-.174.042c-.024-.025.39-.272.733-.437.483-.233.963-.36 2.04-.539.532-.089 1.082-.196 1.221-.239 1.318-.404 1.995-1.446 1.778-2.737z' fill-rule='nonzero'/%3E%3Cpath d='M21.06 18.116c-.36-.773-.442-1.52-.245-2.216.021-.074.055-.135.075-.135a.73.73 0 01.189.102c.166.112.498.3 1.383.782 1.105.603 1.735 1.07 2.164 1.602.375.467.607.999.719 1.647.063.367.026 1.25-.068 1.62-.297 1.166-.988 2.082-1.972 2.616a2.53 2.53 0 01-.288.143c-.014 0 .038-.133.117-.297.33-.692.369-1.366.118-2.116-.153-.459-.466-1.02-1.097-1.966-.734-1.1-.914-1.394-1.095-1.782zm-10.167 4.171c1.005-.848 2.254-1.45 3.393-1.635.49-.08 1.308-.048 1.762.068.728.186 1.38.604 1.719 1.101.33.486.473.91.62 1.852.06.372.123.745.142.83.11.488.327.879.595 1.075.425.311 1.158.33 1.878.05a.981.981 0 01.236-.074c.026.026-.336.269-.592.397a2.014 2.014 0 01-.983.238c-.66 0-1.208-.335-1.665-1.02-.09-.135-.292-.538-.45-.897-.482-1.1-.72-1.436-1.28-1.803-.489-.32-1.118-.377-1.591-.145-.622.305-.795 1.1-.35 1.603.177.2.507.373.777.406a.83.83 0 00.939-.83c0-.332-.128-.52-.448-.665-.437-.197-.907.033-.905.444.001.175.077.285.253.365.113.05.115.055.023.036-.401-.084-.495-.567-.172-.888.387-.386 1.188-.216 1.463.31.116.221.129.662.028.928-.225.595-.883.907-1.55.737-.454-.116-.639-.241-1.186-.805-.951-.98-1.32-1.17-2.692-1.384l-.263-.041.3-.253z' fill-rule='nonzero'/%3E%3Cpath d='M6.196 3.35l.096.117c3.708 4.54 5.624 6.896 5.746 7.064.2.278.125.527-.219.723-.191.109-.585.219-.781.219-.223 0-.474-.107-.657-.28-.129-.123-.65-.901-1.853-2.768a188.53 188.53 0 00-1.712-2.633c-.049-.046-.048-.045 1.618 2.936 1.046 1.872 1.4 2.533 1.4 2.622 0 .18-.05.274-.272.522-.37.413-.535.877-.655 1.837-.134 1.077-.51 1.837-1.554 3.138-.61.762-.71.902-.865 1.209-.194.386-.247.603-.269 1.091-.023.516.022.85.18 1.343.138.432.282.718.65 1.288.318.493.501.859.501 1.002 0 .114.022.114.515.003 1.179-.266 2.136-.735 2.675-1.309.333-.355.411-.551.414-1.038.001-.318-.01-.385-.096-.568-.14-.298-.395-.546-.957-.93-.737-.504-1.051-.91-1.138-1.467-.072-.457.011-.78.419-1.634.421-.884.526-1.26.597-2.151.045-.576.108-.803.274-.985.172-.19.328-.255.755-.313.696-.095 1.139-.275 1.503-.61.316-.292.448-.573.468-.995l.016-.32-.177-.206c-.254-.296-2.355-2.614-6.304-6.956l-.106-.115-.212.165zM7.91 19.732a.566.566 0 00-.174-.746c-.228-.152-.583-.08-.583.118 0 .06.033.104.108.143.127.065.136.139.037.288-.101.152-.093.286.023.377.186.146.45.065.59-.18zm5.524-7.176c-.327.1-.644.447-.743.81-.06.221-.026.61.064.73.145.194.286.245.666.242.744-.005 1.39-.324 1.466-.723.062-.327-.223-.78-.614-.98-.202-.102-.631-.143-.839-.079zm.87.68c.115-.163.064-.34-.13-.458-.372-.227-.934-.04-.934.312 0 .174.293.365.561.365.18 0 .424-.107.503-.219z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '1f9840a85d5af5bf1d1762f925bdaddc4201f984.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Wrapped BTC',\n symbol: 'WBTC',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none'%3E%3Ccircle fill='%23201A2D' cx='16' cy='16' r='16'/%3E%3Cg fill='%23FFF'%3E%3Cpath d='M22.818 9.586l-.6.6a8.494 8.494 0 010 11.464l.6.6a9.352 9.352 0 000-12.678v.014zM10.2 9.638a8.494 8.494 0 0111.464 0l.6-.6a9.352 9.352 0 00-12.678 0l.614.6zm-.562 12.018a8.494 8.494 0 010-11.458l-.6-.6a9.352 9.352 0 000 12.678l.6-.62zm12.018.554a8.494 8.494 0 01-11.464 0l-.6.6a9.352 9.352 0 0012.678 0l-.614-.6zm-1.942-8.286c-.12-1.252-1.2-1.672-2.566-1.8V10.4h-1.056v1.692h-.844V10.4H14.2v1.736h-2.142v1.13s.78-.014.768 0a.546.546 0 01.6.464v4.752a.37.37 0 01-.128.258.366.366 0 01-.272.092c.014.012-.768 0-.768 0l-.2 1.262h2.122v1.764h1.056V20.12h.844v1.73h1.058v-1.744c1.784-.108 3.028-.548 3.184-2.218.126-1.344-.506-1.944-1.516-2.186.614-.302.994-.862.908-1.778zm-1.48 3.756c0 1.312-2.248 1.162-2.964 1.162v-2.328c.716.002 2.964-.204 2.964 1.166zm-.49-3.28c0 1.2-1.876 1.054-2.472 1.054v-2.116c.596 0 2.472-.188 2.472 1.062z'/%3E%3Cpath d='M15.924 26.852C9.89 26.851 5 21.959 5 15.925 5 9.892 9.892 5 15.925 5c6.034 0 10.926 4.89 10.927 10.924a10.926 10.926 0 01-10.928 10.928zm0-21c-5.559.004-10.062 4.513-10.06 10.072.002 5.559 4.51 10.064 10.068 10.064 5.559 0 10.066-4.505 10.068-10.064A10.068 10.068 0 0015.924 5.852z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 8,\n id: '2260fac5e5542a773aa44fbcfedf7c193bc2c599.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'ChainLink Token',\n symbol: 'LINK',\n icon:\n \"data:image/svg+xml,%3Csvg width='32' height='32' viewBox='0 0 32 32' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none'%3E%3Ccircle fill='%232A5ADA' cx='16' cy='16' r='16'/%3E%3Cpath d='M16 6l-1.799 1.055L9.3 9.945 7.5 11v10l1.799 1.055 4.947 2.89L16.045 26l1.799-1.055 4.857-2.89L24.5 21V11l-1.799-1.055-4.902-2.89L16 6zm-4.902 12.89v-5.78L16 10.22l4.902 2.89v5.78L16 21.78l-4.902-2.89z' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '514910771af9ca656af840dff83e8264ecf986ca.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Octopus Network Token',\n symbol: 'OCT',\n icon:\n \"data:image/svg+xml,%3Csvg version='1.1' id='O' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 113.39 113.39' style='enable-background:new 0 0 113.39 113.39;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23014299;%7D .st1%7Bfill:%23FFFFFF;%7D %3C/style%3E%3Ccircle class='st0' cx='56.69' cy='56.69' r='56.69'/%3E%3Cg%3E%3Cpath class='st1' d='M44.25,59.41c-1.43,0-2.59,1.16-2.59,2.59v20.28c0,1.43,1.16,2.59,2.59,2.59c1.43,0,2.59-1.16,2.59-2.59V62 C46.84,60.57,45.68,59.41,44.25,59.41z'/%3E%3Cpath class='st1' d='M56.69,59.41c-1.45,0-2.62,1.17-2.62,2.62v26.47c0,1.45,1.17,2.62,2.62,2.62s2.62-1.17,2.62-2.62V62.02 C59.31,60.58,58.14,59.41,56.69,59.41z'/%3E%3Cpath class='st1' d='M79.26,78.87c-0.33,0.15-0.64,0.28-0.95,0.38c0,0-0.01,0-0.01,0c-0.59,0.19-1.13,0.29-1.63,0.31h-0.06 c-1,0.03-1.84-0.27-2.59-0.75c-0.49-0.32-0.91-0.73-1.25-1.23c-0.3-0.43-0.53-0.93-0.71-1.51c0-0.01-0.01-0.02-0.01-0.03 c-0.22-0.74-0.34-1.61-0.34-2.59V62.02c0-1.45-1.17-2.62-2.62-2.62c-1.45,0-2.62,1.17-2.62,2.62v11.43c0,4.5,1.64,8.03,4.63,9.96 c1.5,0.97,3.21,1.45,5.04,1.45c1.68,0,3.45-0.41,5.25-1.22c1.32-0.59,1.9-2.14,1.31-3.46C82.13,78.86,80.57,78.27,79.26,78.87z'/%3E%3Cpath class='st1' d='M68.33,45.9c0-2.15-1.75-3.9-3.9-3.9c-2.15,0-3.9,1.75-3.9,3.9s1.75,3.9,3.9,3.9 C66.58,49.8,68.33,48.05,68.33,45.9z'/%3E%3Cpath class='st1' d='M48.96,41.99c-2.15,0-3.9,1.75-3.9,3.9s1.75,3.9,3.9,3.9s3.9-1.75,3.9-3.9S51.11,41.99,48.96,41.99z'/%3E%3Cpath class='st1' d='M56.69,22.28c-15.17,0-27.52,12.34-27.52,27.52v15.09c0,1.46,1.18,2.64,2.64,2.64s2.64-1.18,2.64-2.64V49.8 c0-12.26,9.98-22.24,22.24-22.24c12.26,0,22.24,9.98,22.24,22.24v15.09c0,1.46,1.18,2.64,2.64,2.64s2.64-1.18,2.64-2.64V49.8 C84.21,34.62,71.87,22.28,56.69,22.28z'/%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: 'f5cfbc74057c610c8ef151a439252680ac68c6dc.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Ref Finance Token',\n symbol: 'REF',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='16 24 248 248' style='background: %23000'%3E%3Cpath d='M164,164v52h52Zm-45-45,20.4,20.4,20.6-20.6V81H119Zm0,18.39V216h41V137.19l-20.6,20.6ZM166.5,81H164v33.81l26.16-26.17A40.29,40.29,0,0,0,166.5,81ZM72,153.19V216h43V133.4l-11.6-11.61Zm0-18.38,31.4-31.4L115,115V81H72ZM207,121.5h0a40.29,40.29,0,0,0-7.64-23.66L164,133.19V162h2.5A40.5,40.5,0,0,0,207,121.5Z' fill='%23fff'/%3E%3Cpath d='M189 72l27 27V72h-27z' fill='%2300c08b'/%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'token.v2.ref-finance.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'HAPI',\n symbol: 'HAPI',\n icon:\n \"data:image/svg+xml,%3Csvg version='1.1' id='Layer_2' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' width='600px' height='600px' viewBox='0 0 600 600' enable-background='new 0 0 600 600' xml:space='preserve'%3E %3Cg%3E %3Cg%3E %3Cpath fill='%23141414' d='M263.7,122.8c-3.6,0.3-7.1,0.9-10.7,1.8c-24.5,6-40.3,18.1-50.4,31c24.5-4.7,49.9,1.3,67.3,7.4 c0.5,0.2,1,0.4,1.6,0.6c-2.7-4.2-5.2-9-7.2-14.4C261.2,141.1,261.6,131.6,263.7,122.8z'/%3E %3Cpath fill='%23141414' d='M201.2,197.7c-9.8-1.1-19.1-2.1-24.6-2.1c-0.7,0-1.4,0-2,0.1c-38.1,2.6-67.2,37.3-69.1,82.4 c-1.4,32.2,13.5,53.1,23.3,63.4c-1.5-12.5-0.1-25,4.3-37.3c11.7-32.6,34.3-42.1,60.6-53.1c10.8-4.5,22.5-9.5,34.3-16.6l50.1-39.6 c-10.1,2.2-24.4,4.5-42.9,5.3C227.1,200.6,213.9,199.1,201.2,197.7z'/%3E %3Cpath fill='%23141414' d='M319.1,176.5c-0.5,1.1,0.9,2.1,1.8,1.2c5.3-5.4,16.3-14.3,30.8-14.2c15.6,0.1,35.5,10.2,40.5,22.1 c4,9.8-6.6,16.5-6.6,16.5l0,0c-2.5-2.7-8-6.3-18.2-6.6c-15-0.5-25.3,12.1-24.1,12.9c7.5,4.7,17.3,3.7,23.1,3.5 c5.8-0.2,15.1-2.5,17.8-3.5c4.7-1.8,11.7-7.8,14.9-16.1c2.5-6.5,8.4-28.7-25.2-34.4C352.7,154.3,327,159.6,319.1,176.5z'/%3E %3Cpath fill='%23141414' d='M473.1,225.1c-0.5-0.6-1.1-1.3-1.7-2l-0.3-0.3c-3.9-4.4-7.6-8.3-9.4-10.1c1.2-4.2,4-16.2,1-26.1 c-2.3-7.7-6.8-15.5-9.2-19.4l-0.8-1.2h0c-0.4-0.6-0.8-1.2-1.1-1.7c-0.3-0.4-0.5-0.7-0.6-1l-0.2-0.7c-2.5-7-8.6-22.3-16.4-28.1 l59.4-91.7c2.3-3.5-2.1-7.5-5.4-5l-86.8,66.5c-8.7-12.3-21.1-21.8-21.8-22.4c-0.8-0.6-2-0.7-2.9-0.2c-0.9,0.5-1.4,1.6-1.3,2.6 c0,0.1,0.6,5.9-2.9,17.6c7.5,2.7,13.9,6,19.3,9.7l-4.5,3.5c-8.8-5.7-20-10.5-34.3-12.6c-17.7-2.6-31.9,1-42.1,10.7c0,0,0,0,0,0 c5.9,3.8,13.1,8.7,17,12.4c0.8,0.7,1.5,1.5,2.2,2.3c-3.1,0.9-6.2,1.9-9.3,2.9c-0.3-0.2-0.5-0.5-0.8-0.7c-1.9-1.7-4.4-3.4-7-5.3 c-5.4-3.8-11.7-8.3-15.8-14c-2.2-3.1-3.8-6.5-4.3-10.4c-0.3-2.4-1-4-2.2-4.9c0,0,0,0,0,0c0,0,0,0,0,0c-0.6-0.5-2.8-2-5.8,0.3 c-2,1.6-4.4,5.3-6.5,10.3c-5.2,12.3-8.7,32.1-1.8,46.1c1.2,2.3,2.4,4.5,3.7,6.6c-0.4,1-0.7,2.1-0.9,3.1c-0.6,3.4-0.9,7.8-1.2,12.7 c-19.8-8.3-50.5-17.5-78.5-10.7c-23.9,5.8-39.4,17.5-49.6,30c7.4-3.1,15.2-5,23.5-5.6c5.6-0.4,16.4,0.8,27.9,2.1 c11.8,1.3,25.3,2.8,32.9,2.4c19.2-0.8,33.7-3.3,43.5-5.6c0,5.4,0.1,11.1,0.4,16.9c0.7,16.8,2.5,34.3,5,46.5 c3.6,17.9,16.5,55.2,31.4,64.6c5.5,3.5,13.5,8.2,22.9,13.4c-2.5,6.4-5.1,15.1-5.1,23.5c0,15.2,5.2,26.6,11,37 c4.6,8.2,9.6,15.7,12.8,24c2.5,6.5-2.7,27.7-5.6,38.9c-1.2,4.5-1.9,7.3-1.7,7c3.7-5.1,7.5-10.8,11.3-16.8 c15.3-24.2,19.4-47,19.5-48l0.2-1.4l-1.1-1c-0.2-0.2-17.2-15.7-18.3-33.3c-0.4-6.9,1-11.5,4.3-13.8c0.5-0.3,1-0.6,1.6-0.9 c7.5,3.7,15,7.3,22.2,10.5c2.8,3.5,9,9.4,11.8,12c3.4,3.2,6.9,7.8,12.2,7.8c5.3,0,15.9,0,21.3,0s13.1,0,17.3-2.1 c4.2-2.1,10.9-5.6,11-12.6c0-1.5,0.4-3.9,0.9-6.8c3.7-4.9,4.1-10.6,4.8-19.2c0.5-5.7,1.7-15.5,3-25.9c2-15.7,4.1-32,3.9-37.9 c-0.2-8.2-1.1-14.3-1.4-16.2C475.3,249.4,479.5,232.4,473.1,225.1z M318,310.6c-13.3-8.4-25.6-44.6-29-61.2 c-4.8-23.9-6.9-68.5-3.9-86.8c2.7-16.7,49-34.5,81.7-35.6c1.9-0.1,3.8-0.1,5.6-0.1c1,0,2,0,3,0c-0.1,4.9,1.3,15.6,13.8,25.5 c13.9,11,30.4,5,30.4,5l12.1-18.7c4.5,3.5,9.4,12.7,13,22.1c-0.9-0.4-1.9-0.7-3.1-0.9c-8.1-1.3-31.6-0.9-24,31.3 c1,4,5.2,9.4,17.2,22.3c2.8,3,5.1,5.3,7,7.2c5.6,5.6,7.4,7.4,7.5,11.8c0,0.3-0.2,1.6-0.4,3c-0.8-0.6-1.9-1.1-3.4-1 c-3.6-0.2-33.7,5.6-42.4,15.1c-1.7,1.9-4.5,2.6-6.7,1.4c-0.1-0.1-0.2-0.1-0.3-0.2c-1.4-0.8-2.3-1.9-2.8-3.5 c-1.3-5.1,2.9-13.2,4.6-16c0.6-1,0.3-2.3-0.6-2.9c-1-0.6-2.3-0.3-2.9,0.6c-0.1,0.2-0.9,1.5-1.9,3.5c-3.3,6.6-8.2,12.2-14.3,16.3 c-9.8,6.6-24,15.2-35.5,18.2c-18,4.7-24.9-8.2-25.2-8.8c-0.5-1-1.8-1.4-2.8-0.9c-1,0.5-1.5,1.8-0.9,2.8 c0.1,0.1,6.3,12.1,21.5,12.1c0.6,0,1.4-0.1,2.2-0.2c4.3-0.5,8.6,0.5,12.3,2.7c3.5,2.1,8,4.7,12.5,7c12.6,6.3,14.7,6.2,19.5,5.4 c1.1-0.2,49.8-2.4,80.1-8.2l3.6,0.2c2.4,0.1,4.3,2.3,4,4.7l0,0.1c-0.2,1.4-1,2.6-2.2,3.3c-2.7,1.5-6.5,3.5-9.9,4.9 c-1.6,0.6-3.3,1.2-5.1,1.6c-5.5,1.3-11.1,1.6-11.1,1.6s-5.4,1.2-13.5,2.1c-3.4,0.4-7.2,0.7-11.3,0.9c-14,0.7-13,1.6-24.8,1 c-2.9-0.1-5.7-0.3-8.3-0.6c-2.5-0.3-3.2,3.4-0.7,4c6.1,1.5,13.3,2.6,21.3,2.5c1,0,1.9,0,2.9,0c12.8-0.1,24.4,7.5,29.4,19.3 c2.1,5,4.1,12,5.4,18.5c1.8,8.4-5.3,16.1-13.8,15.3c-12.5-1.3-26.6-4.8-34.6-8.3C365.3,338.1,332.4,319.8,318,310.6z M448.7,169.2 l1.2,1.9c2.4,4,5.9,10.5,7.9,16.9c3.1,10.4-1.4,24.4-1.4,24.5l-0.5,1.5l1.1,1.1c0,0.1,5,5.2,10.3,11.1l0.1,0.2 c0.6,0.7,1.2,1.3,1.8,2c3.7,4.3,1.9,17-0.1,23.9l-0.2,0.6l0.1,0.6c0,0,0.3,1.5,0.6,3.9c-2.7,0.3-4.7,2.7-4.4,5.5l0.8,7.5l-8.6,0.1 l-13.5-15.3c-1-1.2-1-3,0.2-4c0,0,0,0,0,0c7.1-6.4,8.1-9.5,8.3-10.7c0.9-5.4,1.2-7.4,1.2-8.1c0-6.1-2.9-9-8.7-14.8 c-1.9-1.9-4.2-4.2-6.9-7.1c-0.6-0.6-1.1-1.2-1.7-1.8c2.1,0.6,4.9,1.2,8.5,1.5c8.4,0.7,10.9-1.4,10.9-1.4s1.5-2.7-1.1-6.6 c-2.6-3.9-6.2-6.7-13.2-6.9c-5-0.2-9.5,3.7-11.7,6c-0.9-1-2.9-4.7-3.8-10.9c-1.5-9.7,2.1-14.2,4.7-16.4c4.6-3.9,10.9-7.7,14.4-7.5 c0.9,0.1,1.9,0.2,2.7,0.4C447.8,167.7,448.2,168.4,448.7,169.2z M463.4,332.9c-0.7,8.2-1.1,12.8-3.8,16.5c-2.3,3.1-7.3,0.8-6.6-3 c0.4-2.1,0.7-4.3,0.8-6.4c0.3-10.7-4.9-20.9-6.7-27.7c0,0,0-0.1,0-0.1c-0.9-3.8,1.2-7.7,4.8-9.3c1.6-0.7,3.4-1.6,5.3-2.6 c4.6-2.3,9.9,1.3,9.2,6.4l0,0.1C465.2,317.2,463.9,327.1,463.4,332.9z M385.1,249.4c1.8-1.3,4.4-0.8,5.6,1.2 c0.8,1.4,1.9,2.9,3.4,4.1c4.5,3.7,9.8,3.5,13.2,3.5c3.3,0,5.4-0.6,6-0.8c0,0,0,0,0,0c2.4-0.5,4.3,2,3.1,4.2 c-2.6,4.8-6.1,11.1-6.5,11.4c-0.7,0.5-22.8,5.1-25.6,5.4s-11.6,1.2-18.2-3c-2.8-1.7-5.5-3.7-7.7-5.3c-1.7-1.2-1.4-3.8,0.4-4.7 C368.8,260.4,378.7,253.9,385.1,249.4z M436.8,263.8l8.3,9.1c1.5,1.7,0.5,4.4-1.7,4.7c-5,0.6-10,1.2-14.9,1.7 c-2.3,0.2-3.9-2.3-2.7-4.3c1.9-3,4.3-7,6.5-10.8C433.2,262.6,435.5,262.4,436.8,263.8z M396.4,117.1l83.5-69.1l-76.9,76.9 c-2.5,2.4-6.6,1.6-8.1-1.5h0C393.9,121.2,394.5,118.5,396.4,117.1z'/%3E %3Cpath fill='%23141414' d='M196.6,258.1c-25.6,10.7-45.8,19.2-56.4,48.7c-15.1,42,9.4,88.5,62.5,120.1c-17.4-68,3.5-93.1,22.1-115.3 c6.4-7.7,12.5-15,16.9-23.7c12.9-25.8,12.3-50.5,11.1-62C233.7,242.5,214.1,250.8,196.6,258.1z'/%3E %3C/g%3E %3Cg%3E %3Cpath d='M201.6,477.1h-9.1l-2.8,17.1h-14.3l2.8-17.1h-9.1l-2.8,17.1h-9.3l-1.5,9.1h9.3l-2.3,14h-9.4l-1.5,9.1h9.4l-2.8,17.1h9.1 l2.8-17.1h14.3l-2.8,17.1h9.1l2.8-17.1h9.3l1.5-9.1h-9.3l2.3-14h9.4l1.5-9.1h-9.4L201.6,477.1z M186,517.4h-14.3l2.3-14h14.3 L186,517.4z'/%3E %3Cpolygon points='260.8,505.3 230,505.3 230,477.1 218,477.1 218,543.6 230,543.6 230,515.4 260.8,515.4 260.8,543.6 272.9,543.6 272.9,477.1 260.8,477.1 '/%3E %3Cpath d='M307.1,477.1l-23.4,66.4h12.8l5.5-16.4h25l5.5,16.4h12.8l-23.4-66.4H307.1z M305.3,517.5l9-26.8h0.5l9,26.8H305.3z'/%3E %3Cpath d='M394,480c-3.5-1.9-7.8-2.9-12.9-2.9h-24.9v66.4h12v-22.4H381c5.1,0,9.4-0.9,12.9-2.8s6.2-4.5,7.9-7.8 c1.8-3.3,2.7-7.1,2.7-11.3c0-4.2-0.9-8-2.7-11.3C400.1,484.5,397.4,481.9,394,480z M390.9,505.4c-0.9,1.8-2.3,3.2-4.2,4.3 c-1.9,1-4.3,1.6-7.3,1.6h-11.1v-24h11c3,0,5.5,0.5,7.4,1.5c1.9,1,3.3,2.4,4.2,4.2c0.9,1.8,1.4,3.9,1.4,6.2 S391.8,503.6,390.9,505.4z'/%3E %3Crect x='417.1' y='477.1' width='12' height='66.4'/%3E %3C/g%3E %3C/g%3E %3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: 'd9c2d319cd7e6177336b0a9c93c21cb48d84fb54.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'PARAS',\n symbol: 'PARAS',\n icon:\n 'data:image/png;base64,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',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'token.paras.near',\n },\n {\n spec: 'ft-1.0.0',\n name: '1MILNFT',\n symbol: '1MIL',\n icon:\n \"data:image/svg+xml,%3Csvg version='1.1' id='O' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 146 146' xml:space='preserve'%3E %3Cpath style='fill:%23ff00c6; stroke:none;' d='M0 0L0 31L31 31L31 0L0 0z'/%3E %3Cpath style='fill:%23df01ae; stroke:none;' d='M31 0L31 31L32 31L31 0z'/%3E %3Cpath style='fill:%23000000; stroke:none;' d='M32 0L32 32L0 32L0 38L32 38L32 70L0 70L0 76L32 76L32 109L0 109L0 114L32 114L32 146L38 146L38 114L70 114L70 146L76 146L76 114C82.7843 114 102.446 110.653 107.397 115.603C112.241 120.448 109 139.378 109 146L114 146L114 114L146 114L146 109C139.378 109 120.448 112.241 115.603 107.397C110.653 102.446 114 82.7843 114 76L146 76L146 70L114 70L114 38L146 38L146 32C139.378 32 120.448 35.2414 115.603 30.3966C110.759 25.5518 114 6.6225 114 0L109 0L109 32L76 32L76 0L71 0L71 32L38 32L38 0L32 0z'/%3E %3Cpath style='fill:%23459f00; stroke:none;' d='M38 0L38 32L70 32L70 31L39 31L38 0z'/%3E %3Cpath style='fill:%236fff00; stroke:none;' d='M39 0L39 31L70 31L70 0L39 0z'/%3E %3Cpath style='fill:%230d2000; stroke:none;' d='M70 0L70 32L71 32L70 0z'/%3E %3Cpath style='fill:%233f0180; stroke:none;' d='M76 0L76 32L108 32L108 31L77 31L76 0z'/%3E %3Cpath style='fill:%237f00ff; stroke:none;' d='M77 0L77 31L108 31L108 0L77 0z'/%3E %3Cpath style='fill:%232f0060; stroke:none;' d='M108 0L108 32L109 32L108 0z'/%3E %3Cpath style='fill:%231d4101; stroke:none;' d='M114 0L114 31L115 31L114 0z'/%3E %3Cpath style='fill:%236fff00; stroke:none;' d='M115 0L115 31L146 31L146 0L115 0z'/%3E %3Cpath style='fill:%239f017c; stroke:none;' d='M0 31L0 32L32 32L0 31z'/%3E %3Cpath style='fill:%23459f00; stroke:none;' d='M115 31L115 32L146 32L115 31z'/%3E %3Cpath style='fill:%2300f0ff; stroke:none;' d='M0 38L0 69L31 69L31 38L0 38z'/%3E %3Cpath style='fill:%2300d2df; stroke:none;' d='M31 38L31 69L0 69L0 70L32 70L31 38z'/%3E %3Cpath style='fill:%23be0094; stroke:none;' d='M38 38L38 70L39 70L38 38z'/%3E %3Cpath style='fill:%23ff00c6; stroke:none;' d='M39 38L39 69L70 69L70 38L39 38z'/%3E %3Cpath style='fill:%23200018; stroke:none;' d='M70 38L70 70L71 70L70 38z'/%3E %3Cpath style='fill:%23007880; stroke:none;' d='M76 38L76 70L77 70L76 38z'/%3E %3Cpath style='fill:%2300f0ff; stroke:none;' d='M77 38L77 69L108 69L108 38L77 38z'/%3E %3Cpath style='fill:%23015a60; stroke:none;' d='M108 38L108 70L109 70L108 38z'/%3E %3Cpath style='fill:%23400032; stroke:none;' d='M114 38L114 70L115 70L114 38z'/%3E %3Cpath style='fill:%23de00ad; stroke:none;' d='M115 38L115 39L146 39L115 38z'/%3E %3Cpath style='fill:%23ff00c6; stroke:none;' d='M115 39L115 70L146 70L146 39L115 39z'/%3E %3Cpath style='fill:%23df01ae; stroke:none;' d='M39 69L39 70L70 70L39 69z'/%3E %3Cpath style='fill:%2300d2df; stroke:none;' d='M77 69L77 70L108 70L77 69z'/%3E %3Cpath style='fill:%2354bf00; stroke:none;' d='M0 76L0 77L32 77L0 76z'/%3E %3Cpath style='fill:%235f00be; stroke:none;' d='M38 76L38 108L39 108L39 77L70 77L38 76z'/%3E %3Cpath style='fill:%230f001f; stroke:none;' d='M70 76L70 108L71 108L70 76z'/%3E %3Cpath style='fill:%23388000; stroke:none;' d='M76 76L76 108L77 108L76 76z'/%3E %3Cpath style='fill:%2354bf00; stroke:none;' d='M77 76L77 77L108 77L77 76z'/%3E %3Cpath style='fill:%232a6000; stroke:none;' d='M108 76L108 108L109 108L108 76z'/%3E %3Cpath style='fill:%23003d40; stroke:none;' d='M114 76L114 108L115 108L114 76z'/%3E %3Cpath style='fill:%2300b4bf; stroke:none;' d='M115 76L115 77L146 77L115 76z'/%3E %3Cpath style='fill:%236fff00; stroke:none;' d='M0 77L0 108L32 108L32 77L0 77z'/%3E %3Cpath style='fill:%237f00ff; stroke:none;' d='M39 77L39 108L70 108L70 77L39 77z'/%3E %3Cpath style='fill:%236fff00; stroke:none;' d='M77 77L77 108L108 108L108 77L77 77z'/%3E %3Cpath style='fill:%2300f0ff; stroke:none;' d='M115 77L115 108L146 108L146 77L115 77z'/%3E %3Cpath style='fill:%230f2000; stroke:none;' d='M0 108L0 109L32 109L0 108M76 108L76 109L108 109L76 108z'/%3E %3Cpath style='fill:%23001e20; stroke:none;' d='M115 108L115 109L146 109L115 108z'/%3E %3Cpath style='fill:%23810064; stroke:none;' d='M0 114L0 115L32 115L0 114z'/%3E %3Cpath style='fill:%23398000; stroke:none;' d='M38 114L38 115L70 115L38 114z'/%3E %3Cpath style='fill:%23800063; stroke:none;' d='M76 114L76 146L77 146L77 115L108 115L76 114z'/%3E %3Cpath style='fill:%23200041; stroke:none;' d='M114 114L114 146L115 146L114 114z'/%3E %3Cpath style='fill:%23410080; stroke:none;' d='M115 114L115 115L146 115L115 114z'/%3E %3Cpath style='fill:%23ff00c6; stroke:none;' d='M0 115L0 146L31 146L31 115L0 115z'/%3E %3Cpath style='fill:%23df01ae; stroke:none;' d='M31 115L31 146L32 146L31 115z'/%3E %3Cpath style='fill:%2354bf00; stroke:none;' d='M38 115L38 146L39 146L38 115z'/%3E %3Cpath style='fill:%236fff00; stroke:none;' d='M39 115L39 146L70 146L70 115L39 115z'/%3E %3Cpath style='fill:%23ff00c6; stroke:none;' d='M77 115L77 146L108 146L108 115L77 115z'/%3E %3Cpath style='fill:%2360004a; stroke:none;' d='M108 115L108 146L109 146L108 115z'/%3E %3Cpath style='fill:%237f00ff; stroke:none;' d='M115 115L115 146L146 146L146 115L115 115z'/%3E %3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: 'a4ef4b0b23c1fc81d3f9ecf93510e64f58a4a016.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'marma j token',\n symbol: 'marmaj',\n icon:\n 'data:image/jpeg;base64,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',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'marmaj.tkn.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Staked NEAR',\n symbol: 'STNEAR',\n icon:\n \"data:image/svg+xml,%3csvg width='96' height='96' viewBox='0 0 96 96' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='96' height='96' rx='48' fill='white'/%3e%3cpath fill-rule='evenodd' clip-rule='evenodd' d='M48.0006 20L41.2575 26.7431L48.0006 33.4862L54.7437 26.7431L48.0006 20ZM37.281 30.7188L30.7144 37.2853L47.9998 54.5707L65.2851 37.2853L58.7186 30.7188L47.9998 41.4376L37.281 30.7188ZM26.7384 41.261L19.9953 48.0041L47.9995 76.0083L76.0037 48.0041L69.2606 41.2611L47.9995 62.5221L26.7384 41.261Z' fill='%23231B51'/%3e%3c/svg%3e\",\n reference: 'https://metapool.app',\n reference_hash: null,\n decimals: 24,\n id: 'meta-pool.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Cheddar',\n symbol: 'Cheddar',\n icon:\n 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI1LjMuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCA2NCA2NCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNjQgNjQ7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbDp1cmwoI1hNTElEXzE2Xyk7fQoJLnN0MXtmaWxsOiNGRkU5NTk7fQoJLnN0MntvcGFjaXR5OjAuMjt9Cgkuc3Qze2ZpbGw6IzQyNDI0Mjt9Cgkuc3Q0e29wYWNpdHk6MC45O2ZpbGw6dXJsKCNYTUxJRF8xN18pO2VuYWJsZS1iYWNrZ3JvdW5kOm5ldyAgICA7fQoJLnN0NXtmaWxsOnVybCgjU1ZHSURfMV8pO30KCS5zdDZ7ZmlsbDp1cmwoI1hNTElEXzE4Xyk7fQoJLnN0N3tvcGFjaXR5OjAuOTtmaWxsOnVybCgjWE1MSURfMTlfKTtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDh7ZmlsbDp1cmwoI1hNTElEXzIwXyk7fQoJLnN0OXtvcGFjaXR5OjAuOTtmaWxsOnVybCgjWE1MSURfMjFfKTtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDEwe2ZpbGw6dXJsKCNTVkdJRF8yXyk7fQoJLnN0MTF7b3BhY2l0eTowLjk7ZmlsbDp1cmwoI1hNTElEXzIyXyk7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cgkuc3QxMntmaWxsOnVybCgjWE1MSURfMjNfKTt9Cgkuc3QxM3tvcGFjaXR5OjAuOTtmaWxsOnVybCgjWE1MSURfMjRfKTtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDE0e2ZpbGw6dXJsKCNTVkdJRF8zXyk7fQoJLnN0MTV7ZmlsbDp1cmwoI1hNTElEXzI2Xyk7fQoJLnN0MTZ7b3BhY2l0eTowLjk7ZmlsbDp1cmwoI1hNTElEXzI3Xyk7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cgkuc3QxN3tmaWxsOnVybCgjWE1MSURfMzFfKTt9Cgkuc3QxOHtvcGFjaXR5OjAuOTtmaWxsOnVybCgjWE1MSURfMzNfKTtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDE5e2ZpbGw6dXJsKCNTVkdJRF80Xyk7fQoJLnN0MjB7b3BhY2l0eTowLjk7ZmlsbDp1cmwoI1hNTElEXzM0Xyk7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cgkuc3QyMXtmaWxsOnVybCgjWE1MSURfMzZfKTt9Cgkuc3QyMntvcGFjaXR5OjAuOTtmaWxsOnVybCgjWE1MSURfMzdfKTtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDIze2ZpbGw6dXJsKCNTVkdJRF81Xyk7fQoJLnN0MjR7ZmlsbDp1cmwoI1hNTElEXzM4Xyk7fQoJLnN0MjV7b3BhY2l0eTowLjk7ZmlsbDp1cmwoI1hNTElEXzM5Xyk7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cgkuc3QyNntmaWxsOnVybCgjWE1MSURfNDBfKTt9Cgkuc3QyN3tvcGFjaXR5OjAuOTtmaWxsOnVybCgjWE1MSURfNDFfKTtlbmFibGUtYmFja2dyb3VuZDpuZXcgICAgO30KCS5zdDI4e2ZpbGw6dXJsKCNTVkdJRF82Xyk7fQoJLnN0Mjl7b3BhY2l0eTowLjk7ZmlsbDp1cmwoI1hNTElEXzQyXyk7ZW5hYmxlLWJhY2tncm91bmQ6bmV3ICAgIDt9Cjwvc3R5bGU+CjxnIGlkPSJMYXllcl8xXzFfIj4KCQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iWE1MSURfMTZfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ii0xODIxLjEzNTMiIHkxPSI5ODMuMTc0MyIgeDI9Ii0xODIxLjEzNTMiIHkyPSI5OTguMDU0MyIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMSAwIDAgMSAtMTc5MC4yNzUzIC05NDYpIj4KCQk8c3RvcCAgb2Zmc2V0PSIxLjk3MDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNGN0JDMDAiLz4KCQk8c3RvcCAgb2Zmc2V0PSIxIiBzdHlsZT0ic3RvcC1jb2xvcjojRkNENzNFIi8+Cgk8L2xpbmVhckdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzY4XyIgY2xhc3M9InN0MCIgZD0iTTUyLjMsNDAuMnYxNC4xbC00MC4yLTYuMWMtMS41LTAuMy0yLjYtMS4zLTIuNi0yLjNjMC4xLTMuOC0wLjEtNy41LDAtMTEuMQoJCWMwLTAuNywwLjEtMS41LDEuMi0xLjdjMC43LTAuMSwxLjYsMC4yLDIuMywwLjNsNC45LDAuOGMwLDAuMSwwLDAuMywwLDAuNGMwLDEuNiwxLjcsMyw0LDMuMWMyLDAuMSwzLjYtMC44LDMuOS0yLjJMNDAuNiwzOAoJCWMtMC4xLDAuMi0wLjIsMC40LTAuMiwwLjVjMCwwLjcsMC45LDEuMywxLjksMS40YzEuMSwwLjEsMS45LTAuNCwxLjktMS4yYzAtMC4xLDAtMC4xLDAtMC4yQzQ0LjEsMzguNiw1Mi4zLDQwLjIsNTIuMyw0MC4yeiIvPgoJPHBhdGggY2xhc3M9InN0MSIgZD0iTTkuNSwzNC44YzAuMy0xLjItMC40LTIuNiwzLjUtMS41bDQuOSwwLjhjMC40LTEsMi0xLjYsMy44LTEuNGMyLjIsMC4xLDQsMS4zLDQsMi41YzAsMC4xLDAsMC4yLDAsMC4zCgkJTDQwLjUsMzhsMCwwYzAuMy0wLjMsMS0wLjQsMS43LTAuNGMxLDAuMSwxLjksMC41LDEuOSwxLjFsOC4yLDEuNkwzMC44LDI3LjVjLTItMS4yLTQuNS0xLjctNi43LTEuM2MtMi4yLDAuMy01LDAuOC03LjEsMS42CgkJYy0yLjUsMC45LTQuOCwyLjQtNi4yLDMuNmMtMC4xLDAuMS0wLjYsMC41LTAuOSwxLjFDOS41LDMzLDkuNSwzMy44LDkuNSwzNC44eiIvPgoJPGcgY2xhc3M9InN0MiI+CgkJPHBhdGggY2xhc3M9InN0MyIgZD0iTTI1LjQsMjdjMS42LDAsMy4zLDAuNCw0LjcsMS4zbDIxLDEyLjV2MTIuNmwtMzguOC01LjljLTAuOS0wLjItMS43LTAuOC0xLjYtMS40YzAtMi4yLDAtNC4zLDAtNi41CgkJCWMwLTEuNSwwLTMuMSwwLTQuN2MwLTAuMSwwLTAuMiwwLTAuNGwwLDBjMC0wLjUsMC4xLTEuMiwwLjMtMS42YzAuMi0wLjQsMC41LTAuNywwLjYtMC44YzEuNC0xLjEsMy42LTIuNSw1LjgtMy40CgkJCWMxLjYtMC42LDQtMS4xLDYuOC0xLjVDMjQuNiwyNywyNC45LDI3LDI1LjQsMjcgTTI1LjQsMjYuMWMtMC40LDAtMC45LDAtMS4zLDAuMWMtMi4yLDAuMy01LDAuOC03LjEsMS42CgkJCWMtMi41LDAuOS00LjgsMi40LTYuMiwzLjZjLTAuMSwwLjEtMC42LDAuNS0wLjksMS4xYy0wLjMsMC41LTAuMywxLjItMC40LDEuOWMwLDAuMiwwLDAuMywwLDAuNGMwLDMuNywwLjEsNy41LDAuMSwxMS4xCgkJCWMwLDEuMSwxLjEsMi4xLDIuNiwyLjNsNDAuMiw2LjFWNDAuMkwzMC44LDI3LjVDMjkuMiwyNi42LDI3LjMsMjYuMSwyNS40LDI2LjFMMjUuNCwyNi4xeiIvPgoJPC9nPgoJCgkJPHJhZGlhbEdyYWRpZW50IGlkPSJYTUxJRF8xN18iIGN4PSItMzA0NS4xOTg3IiBjeT0iMjA0Ny40NDY5IiByPSI2Ljg2ODciIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDI1OCAwIDAgMC4zMjI1IC0xMjc5Ljk4MTMgLTYxNy4xODk5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguMTMwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0RFN0YxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzM4OSIgc3R5bGU9InN0b3AtY29sb3I6I0RBN0QxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNTk5MyIgc3R5bGU9InN0b3AtY29sb3I6I0NFNzYwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuODYwMiIgc3R5bGU9InN0b3AtY29sb3I6I0JBNkMwNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQUQ2NTAwIi8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzM1XyIgY2xhc3M9InN0NCIgZD0iTTE4LjQsNDMuOGMwLDEuMi0xLjMsMi4xLTMsMmMtMS42LTAuMS0zLTEuMi0zLTIuM3MxLjMtMi4xLDMtMkMxNyw0MS41LDE4LjQsNDIuNiwxOC40LDQzLjh6IgoJCS8+CgkKCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzFfIiBjeD0iLTMwNjQuNDI3NSIgY3k9IjIwMTUuOTU3IiByPSIxNC4xMzIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQyNTggMCAwIDAuMzIyNSAtMTI3OS45ODEzIC02MTcuMTg5OSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4LjEzMDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNERTdGMTQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjMzODkiIHN0eWxlPSJzdG9wLWNvbG9yOiNEQTdEMTIiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjU5OTMiIHN0eWxlPSJzdG9wLWNvbG9yOiNDRTc2MEQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjg2MDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQTZDMDUiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4NyIgc3R5bGU9InN0b3AtY29sb3I6I0FENjUwMCIvPgoJPC9yYWRpYWxHcmFkaWVudD4KCTxwYXRoIGNsYXNzPSJzdDUiIGQ9Ik0xNy44LDM0LjRjMCwxLjYsMS43LDMsNCwzLjFjMiwwLjEsMy42LTAuOCwzLjktMi4yaC0wLjFsLTAuMy0wLjFsMC40LDAuMWMwLTAuMSwwLTAuMiwwLTAuMwoJCWMwLTEuMy0xLjgtMi40LTQtMi41Yy0xLjgtMC4xLTMuNCwwLjUtMy44LDEuNEMxNy44LDM0LjIsMTcuOCwzNC40LDE3LjgsMzQuNHoiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMThfIiBjeD0iLTEzMjguMjIwMiIgY3k9IjM0ODEuNzQ3MSIgcj0iNy4xMDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMzA3OCAwLjIyMjggMC4yNDA5IDAuMTkwOSAtMTIyMS41MjUxIC0zNDAuNzk4NCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4Ljc1MDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNEOTk5MTQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjQwOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiNENTk2MTIiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjczNSIgc3R5bGU9InN0b3AtY29sb3I6I0M5OEQwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQkE4MjA3Ii8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzMyXyIgY2xhc3M9InN0NiIgZD0iTTI2LjgsMjkuNGMwLDAuNS0wLjksMS0yLDAuOXMtMi0wLjYtMi0xLjJzMC45LTEsMi0wLjlDMjYsMjguMiwyNi44LDI4LjgsMjYuOCwyOS40eiIvPgoJCgkJPHJhZGlhbEdyYWRpZW50IGlkPSJYTUxJRF8xOV8iIGN4PSItMzA3OS41NTMiIGN5PSIyMDQ0LjQxMSIgcj0iMTUuNjcyNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC40MjU4IDAgMCAwLjMyMjUgLTEyNzkuOTgxMyAtNjE3LjE4OTkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJPHN0b3AgIG9mZnNldD0iOC4xMzAwMDBlLTAyIiBzdHlsZT0ic3RvcC1jb2xvcjojREU3RjE0Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC4zMzg5IiBzdHlsZT0ic3RvcC1jb2xvcjojREE3RDEyIi8+CgkJPHN0b3AgIG9mZnNldD0iMC41OTkzIiBzdHlsZT0ic3RvcC1jb2xvcjojQ0U3NjBEIi8+CgkJPHN0b3AgIG9mZnNldD0iMC44NjAyIiBzdHlsZT0ic3RvcC1jb2xvcjojQkE2QzA1Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC45ODciIHN0eWxlPSJzdG9wLWNvbG9yOiNBRDY1MDAiLz4KCTwvcmFkaWFsR3JhZGllbnQ+Cgk8cGF0aCBpZD0iWE1MSURfMzBfIiBjbGFzcz0ic3Q3IiBkPSJNMzUuMSw0My40YzAsMi4xLTIuMiwzLjUtNSwzLjNzLTUtMi01LTRjMC0yLjEsMi4yLTMuNSw1LTMuM0MzMi44LDM5LjYsMzUuMSw0MS40LDM1LjEsNDMuNHoiCgkJLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMjBfIiBjeD0iLTMwNzYuMzYxNiIgY3k9IjIwMTEuMTY0OCIgcj0iMTAuOTExOCIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC40MjU4IDAgMCAwLjMyMjUgLTEyNzkuOTgxMyAtNjE3LjE4OTkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJPHN0b3AgIG9mZnNldD0iOC43NTAwMDBlLTAyIiBzdHlsZT0ic3RvcC1jb2xvcjojRDk5OTE0Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC40MDk4IiBzdHlsZT0ic3RvcC1jb2xvcjojRDU5NjEyIi8+CgkJPHN0b3AgIG9mZnNldD0iMC43MzUiIHN0eWxlPSJzdG9wLWNvbG9yOiNDOThEMEQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4NyIgc3R5bGU9InN0b3AtY29sb3I6I0JBODIwNyIvPgoJPC9yYWRpYWxHcmFkaWVudD4KCTxwYXRoIGlkPSJYTUxJRF8yOV8iIGNsYXNzPSJzdDgiIGQ9Ik0zNS44LDMzLjFjMCwwLjgtMS4zLDEuMy0yLjksMS4yYy0xLjYtMC4yLTIuOS0wLjgtMi45LTEuNmMwLTAuOCwxLjMtMS4zLDIuOS0xLjIKCQlDMzQuNiwzMS43LDM1LjgsMzIuMywzNS44LDMzLjF6Ii8+CgkKCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlhNTElEXzIxXyIgY3g9Ii0zMTAyLjMwMzUiIGN5PSIyMDU5Ljc2NjgiIHI9IjUuOTI4NSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC40MjU4IDAgMCAwLjMyMjUgLTEyNzkuOTgxMyAtNjE3LjE4OTkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJPHN0b3AgIG9mZnNldD0iOC4xMzAwMDBlLTAyIiBzdHlsZT0ic3RvcC1jb2xvcjojREU3RjE0Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC4zMzg5IiBzdHlsZT0ic3RvcC1jb2xvcjojREE3RDEyIi8+CgkJPHN0b3AgIG9mZnNldD0iMC41OTkzIiBzdHlsZT0ic3RvcC1jb2xvcjojQ0U3NjBEIi8+CgkJPHN0b3AgIG9mZnNldD0iMC44NjAyIiBzdHlsZT0ic3RvcC1jb2xvcjojQkE2QzA1Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC45ODciIHN0eWxlPSJzdG9wLWNvbG9yOiNBRDY1MDAiLz4KCTwvcmFkaWFsR3JhZGllbnQ+Cgk8cGF0aCBpZD0iWE1MSURfMjhfIiBjbGFzcz0ic3Q5IiBkPSJNNDIuMyw0Ny43YzAsMS0xLjIsMS44LTIuNiwxLjdjLTEuNC0wLjEtMi42LTEtMi42LTIuMWMwLTEuMSwxLjItMS44LDIuNi0xLjcKCQlDNDEuMSw0NS45LDQyLjMsNDYuOCw0Mi4zLDQ3Ljd6Ii8+CgkKCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzJfIiBjeD0iLTMxMDYuODA4OCIgY3k9IjIwMzAuMDM0MyIgcj0iOC44NDA4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjQyNTggMCAwIDAuMzIyNSAtMTI3OS45ODEzIC02MTcuMTg5OSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4LjYwMDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNDNzczMTUiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjM3NzQiIHN0eWxlPSJzdG9wLWNvbG9yOiNDMzcxMTMiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjY3MTgiIHN0eWxlPSJzdG9wLWNvbG9yOiNCNzZDMEYiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjk2NjkiIHN0eWxlPSJzdG9wLWNvbG9yOiNBMzY0MDciLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4NyIgc3R5bGU9InN0b3AtY29sb3I6I0ExNjMwNiIvPgoJPC9yYWRpYWxHcmFkaWVudD4KCTxwYXRoIGNsYXNzPSJzdDEwIiBkPSJNNDAuMiwzOC41YzAsMC43LDAuOSwxLjMsMS45LDEuNGMxLjEsMC4xLDEuOS0wLjQsMS45LTEuMmMwLTAuMSwwLTAuMSwwLTAuMmwwLDBjMC0wLjUtMC45LTEtMS45LTEuMQoJCWMtMC43LTAuMS0xLjQsMC4xLTEuNywwLjRsMCwwQzQwLjMsMzguMSw0MC4yLDM4LjMsNDAuMiwzOC41eiIvPgoJCgkJPHJhZGlhbEdyYWRpZW50IGlkPSJYTUxJRF8yMl8iIGN4PSItMzExOS4yMjA1IiBjeT0iMjA0OC44OTk5IiByPSI0LjM5ODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuNDI1OCAwIDAgMC4zMjI1IC0xMjc5Ljk4MTMgLTYxNy4xODk5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguMTMwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0RFN0YxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzM4OSIgc3R5bGU9InN0b3AtY29sb3I6I0RBN0QxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNTk5MyIgc3R5bGU9InN0b3AtY29sb3I6I0NFNzYwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuODYwMiIgc3R5bGU9InN0b3AtY29sb3I6I0JBNkMwNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQUQ2NTAwIi8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzI1XyIgY2xhc3M9InN0MTEiIGQ9Ik00OC43LDQ0YzAsMC41LTAuNiwxLTEuMywwLjljLTAuNy0wLjEtMS4zLTAuNS0xLjMtMS4xYzAtMC41LDAuNi0xLDEuMy0wLjkKCQlDNDgsNDMsNDguNyw0My40LDQ4LjcsNDR6Ii8+CjwvZz4KPGcgaWQ9IkxheWVyXzFfMl8iPgoJCgkJPGxpbmVhckdyYWRpZW50IGlkPSJYTUxJRF8yM18iIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4MT0iLTIxMjYuNTcyIiB5MT0iMTAyNi43NzYxIiB4Mj0iLTIxMjYuNTcyIiB5Mj0iMTAzOS45Mzc5IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjc2NTIgLTEuNjc0MTIzZS0wMiAtMS44Nzk5NDdlLTAyIDAuODU5MyAtMTU3Ni4yMTU3IC04OTMuNDA4NSkiPgoJCTxzdG9wICBvZmZzZXQ9IjEuOTcwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0Y3QkMwMCIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGQ0Q3M0UiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBpZD0iWE1MSURfN18iIGNsYXNzPSJzdDEyIiBkPSJNNDcsMjdsLTAuNCwxMC45bC0yOC41LTUuMWMtMS4xLTAuMi0xLjgtMS0xLjgtMS44YzAuMi0yLjksMC4xLTUuOCwwLjMtOC42CgkJYzAtMC41LDAuMS0xLjIsMC45LTEuM2MwLjUtMC4xLDEuMiwwLjIsMS43LDAuM2wzLjQsMC43YzAsMC4xLDAsMC4yLDAsMC4zYzAsMS4yLDEuMiwyLjMsMi43LDIuNGMxLjQsMC4xLDIuNi0wLjYsMi44LTEuNgoJCWwxMC41LDIuMmMtMC4xLDAuMS0wLjIsMC4zLTAuMiwwLjRjMCwwLjUsMC41LDEuMSwxLjMsMS4yYzAuNywwLjEsMS4zLTAuNCwxLjMtMC45YzAtMC4xLDAtMC4xLDAtMC4yQzQxLjEsMjUuNiw0NywyNyw0NywyN3oiLz4KCTxwYXRoIGNsYXNzPSJzdDEiIGQ9Ik0xNi41LDIyLjRjMC4yLTAuOS0wLjItMiwyLjUtMS4ybDMuNCwwLjdjMC4zLTAuNywxLjQtMS4yLDIuOC0xLjFjMS41LDAuMSwyLjgsMS4xLDIuOCwyYzAsMC4xLDAsMC4yLDAsMC4yCgkJbDEwLjUsMi4ybDAsMGMwLjItMC4zLDAuNy0wLjQsMS4zLTAuNGMwLjcsMC4xLDEuMywwLjQsMS4zLDAuOGw1LjgsMS4zTDMyLDE3Yy0xLjMtMC45LTMuMS0xLjMtNC44LTEuMWMtMS42LDAuMi0zLjYsMC41LTUuMSwxLjIKCQljLTEuOCwwLjYtMy40LDEuOC00LjUsMi43Yy0wLjEsMC4xLTAuNCwwLjQtMC42LDAuOEMxNi42LDIxLjEsMTYuNiwyMS43LDE2LjUsMjIuNHoiLz4KCTxnIGNsYXNzPSJzdDIiPgoJCTxwYXRoIGNsYXNzPSJzdDMiIGQ9Ik0yOC4xLDE2LjVjMS4yLDAsMi4zLDAuNCwzLjMsMWwxNC43LDkuOEw0NS45LDM3bC0yNy42LTQuOWMtMC42LTAuMS0xLjItMC42LTEuMi0xLjIKCQkJYzAuMS0xLjYsMC4xLTMuMywwLjItNC45YzAtMS4yLDAuMS0yLjQsMC4xLTMuNmMwLTAuMSwwLTAuMiwwLTAuM2wwLDBjMC0wLjQsMC4xLTAuOSwwLjItMS4zYzAuMS0wLjMsMC40LTAuNSwwLjQtMC42CgkJCWMxLTAuOCwyLjYtMS45LDQuMy0yLjVjMS4yLTAuNCwyLjktMC44LDQuOS0xLjFDMjcuNSwxNi41LDI3LjgsMTYuNSwyOC4xLDE2LjUgTTI4LjEsMTUuOGMtMC40LDAtMC42LDAtMSwwLjEKCQkJYy0xLjYsMC4yLTMuNiwwLjUtNS4xLDEuMmMtMS44LDAuNi0zLjQsMS44LTQuNSwyLjdjLTAuMSwwLjEtMC40LDAuNC0wLjYsMC44Yy0wLjIsMC40LTAuMywwLjktMC4zLDEuNGMwLDAuMSwwLDAuMiwwLDAuMwoJCQljLTAuMSwyLjktMC4xLDUuOC0wLjMsOC42YzAsMC44LDAuNywxLjYsMS44LDEuOGwyOC41LDUuMUw0NywyN0wzMS45LDE3QzMwLjgsMTYuMywyOS40LDE1LjgsMjguMSwxNS44TDI4LjEsMTUuOHoiLz4KCTwvZz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMjRfIiBjeD0iLTM5OTEuOTUyOSIgY3k9IjI0MDEuOTY1MSIgcj0iNi44Njg3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjMwMzcgLTQuMzQ2MjA4ZS0wMyAtNy41ODc3MjFlLTAzIDAuMjQ4NCAtMTE3Mi42NTQ4IC01ODUuMTI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguMTMwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0RFN0YxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzM4OSIgc3R5bGU9InN0b3AtY29sb3I6I0RBN0QxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNTk5MyIgc3R5bGU9InN0b3AtY29sb3I6I0NFNzYwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuODYwMiIgc3R5bGU9InN0b3AtY29sb3I6I0JBNkMwNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQUQ2NTAwIi8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzZfIiBjbGFzcz0ic3QxMyIgZD0iTTIyLjcsMjkuNGMwLDAuOS0xLDEuNi0yLjIsMS40Yy0xLjItMC4yLTIuMS0wLjktMi4xLTEuOWMwLTEsMS0xLjYsMi4yLTEuNAoJCVMyMi43LDI4LjUsMjIuNywyOS40eiIvPgoJCgkJPHJhZGlhbEdyYWRpZW50IGlkPSJTVkdJRF8zXyIgY3g9Ii00MDExLjE4MTYiIGN5PSIyMzcwLjQ3NTMiIHI9IjE0LjEzMjEiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMzAzNyAtNC4zNDYyMDhlLTAzIC03LjU4NzcyMWUtMDMgMC4yNDg0IC0xMTcyLjY1NDggLTU4NS4xMjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJPHN0b3AgIG9mZnNldD0iOC4xMzAwMDBlLTAyIiBzdHlsZT0ic3RvcC1jb2xvcjojREU3RjE0Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC4zMzg5IiBzdHlsZT0ic3RvcC1jb2xvcjojREE3RDEyIi8+CgkJPHN0b3AgIG9mZnNldD0iMC41OTkzIiBzdHlsZT0ic3RvcC1jb2xvcjojQ0U3NjBEIi8+CgkJPHN0b3AgIG9mZnNldD0iMC44NjAyIiBzdHlsZT0ic3RvcC1jb2xvcjojQkE2QzA1Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC45ODciIHN0eWxlPSJzdG9wLWNvbG9yOiNBRDY1MDAiLz4KCTwvcmFkaWFsR3JhZGllbnQ+Cgk8cGF0aCBjbGFzcz0ic3QxNCIgZD0iTTIyLjQsMjIuMmMwLDEuMiwxLjIsMi4zLDIuNywyLjRjMS40LDAuMSwyLjYtMC42LDIuOC0xLjZoLTAuMWgtMC4ybDAuMywwLjFjMC0wLjEsMC0wLjIsMC0wLjIKCQljMC0xLTEuMy0xLjktMi44LTJjLTEuMy0wLjEtMi40LDAuNC0yLjgsMS4xQzIyLjUsMjIsMjIuNCwyMi4xLDIyLjQsMjIuMnoiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMjZfIiBjeD0iLTE3NjcuOTQ2NSIgY3k9IjQ1OTMuOTUyMSIgcj0iNy4xMDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMjI0OCAwLjE2ODUgMC4xNjczIDAuMTQ5NSAtMTEzNy40NjU2IC0zNzEuNjE3OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4Ljc1MDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNEOTk5MTQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjQwOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiNENTk2MTIiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjczNSIgc3R5bGU9InN0b3AtY29sb3I6I0M5OEQwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQkE4MjA3Ii8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzVfIiBjbGFzcz0ic3QxNSIgZD0iTTI5LjEsMTguNGMwLDAuNC0wLjYsMC43LTEuNCwwLjdjLTAuNy0wLjEtMS4zLTAuNC0xLjMtMC45YzAtMC40LDAuNi0wLjcsMS40LTAuNwoJCUMyOC40LDE3LjYsMjkuMSwxNy45LDI5LjEsMTguNHoiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMjdfIiBjeD0iLTQwMjYuMzA3MSIgY3k9IjIzOTguOTI5MiIgcj0iMTUuNjcyNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4zMDM3IC00LjM0NjIwOGUtMDMgLTcuNTg3NzIxZS0wMyAwLjI0ODQgLTExNzIuNjU0OCAtNTg1LjEyOSkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4LjEzMDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNERTdGMTQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjMzODkiIHN0eWxlPSJzdG9wLWNvbG9yOiNEQTdEMTIiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjU5OTMiIHN0eWxlPSJzdG9wLWNvbG9yOiNDRTc2MEQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjg2MDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQTZDMDUiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4NyIgc3R5bGU9InN0b3AtY29sb3I6I0FENjUwMCIvPgoJPC9yYWRpYWxHcmFkaWVudD4KCTxwYXRoIGlkPSJYTUxJRF80XyIgY2xhc3M9InN0MTYiIGQ9Ik0zNC42LDI5LjNjLTAuMSwxLjUtMS43LDIuNy0zLjcsMi41Yy0yLTAuMi0zLjYtMS42LTMuNS0zLjFjMC4xLTEuNSwxLjctMi43LDMuNy0yLjUKCQlDMzMsMjYuMywzNC42LDI3LjcsMzQuNiwyOS4zeiIvPgoJCgkJPHJhZGlhbEdyYWRpZW50IGlkPSJYTUxJRF8zMV8iIGN4PSItNDAyMy4xMTU3IiBjeT0iMjM2NS42ODMxIiByPSIxMC45MTE4IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjMwMzcgLTQuMzQ2MjA4ZS0wMyAtNy41ODc3MjFlLTAzIDAuMjQ4NCAtMTE3Mi42NTQ4IC01ODUuMTI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguNzUwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0Q5OTkxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNDA5OCIgc3R5bGU9InN0b3AtY29sb3I6I0Q1OTYxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNzM1IiBzdHlsZT0ic3RvcC1jb2xvcjojQzk4RDBEIi8+CgkJPHN0b3AgIG9mZnNldD0iMC45ODciIHN0eWxlPSJzdG9wLWNvbG9yOiNCQTgyMDciLz4KCTwvcmFkaWFsR3JhZGllbnQ+Cgk8cGF0aCBpZD0iWE1MSURfM18iIGNsYXNzPSJzdDE3IiBkPSJNMzUuNCwyMS4zYzAsMC42LTEsMS0yLjEsMC45Yy0xLjEtMC4xLTIuMS0wLjYtMi4xLTEuM3MxLTEsMi4xLTAuOQoJCUMzNC41LDIwLjIsMzUuNCwyMC43LDM1LjQsMjEuM3oiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMzNfIiBjeD0iLTQwNDkuMDU3OSIgY3k9IjI0MTQuMjg1MiIgcj0iNS45Mjg1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjMwMzcgLTQuMzQ2MjA4ZS0wMyAtNy41ODc3MjFlLTAzIDAuMjQ4NCAtMTE3Mi42NTQ4IC01ODUuMTI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguMTMwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0RFN0YxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzM4OSIgc3R5bGU9InN0b3AtY29sb3I6I0RBN0QxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNTk5MyIgc3R5bGU9InN0b3AtY29sb3I6I0NFNzYwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuODYwMiIgc3R5bGU9InN0b3AtY29sb3I6I0JBNkMwNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQUQ2NTAwIi8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzJfIiBjbGFzcz0ic3QxOCIgZD0iTTM5LjYsMzIuN2MwLDAuOC0wLjksMS4zLTEuOSwxLjNjLTEtMC4xLTEuOC0wLjgtMS44LTEuNnMwLjktMS4zLDEuOS0xLjMKCQlDMzguOSwzMS4yLDM5LjcsMzEuOSwzOS42LDMyLjd6Ii8+CgkKCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlNWR0lEXzRfIiBjeD0iLTQwNTMuNTYzIiBjeT0iMjM4NC41NTI1IiByPSI4Ljg0MDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMzAzNyAtNC4zNDYyMDhlLTAzIC03LjU4NzcyMWUtMDMgMC4yNDg0IC0xMTcyLjY1NDggLTU4NS4xMjkpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJPHN0b3AgIG9mZnNldD0iOC42MDAwMDBlLTAyIiBzdHlsZT0ic3RvcC1jb2xvcjojQzc3MzE1Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC4zNzc0IiBzdHlsZT0ic3RvcC1jb2xvcjojQzM3MTEzIi8+CgkJPHN0b3AgIG9mZnNldD0iMC42NzE4IiBzdHlsZT0ic3RvcC1jb2xvcjojQjc2QzBGIi8+CgkJPHN0b3AgIG9mZnNldD0iMC45NjY5IiBzdHlsZT0ic3RvcC1jb2xvcjojQTM2NDA3Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC45ODciIHN0eWxlPSJzdG9wLWNvbG9yOiNBMTYzMDYiLz4KCTwvcmFkaWFsR3JhZGllbnQ+Cgk8cGF0aCBjbGFzcz0ic3QxOSIgZD0iTTM4LjQsMjUuNmMwLDAuNSwwLjUsMS4xLDEuMywxLjJjMC43LDAuMSwxLjMtMC40LDEuMy0wLjljMC0wLjEsMC0wLjEsMC0wLjJsMCwwYzAtMC40LTAuNi0wLjgtMS4zLTAuOAoJCWMtMC41LTAuMS0xLDAuMS0xLjMsMC40bDAsMEMzOC40LDI1LjMsMzguNCwyNS41LDM4LjQsMjUuNnoiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMzRfIiBjeD0iLTQwNjUuOTc0NiIgY3k9IjI0MDMuNDE4MiIgcj0iNC4zOTg1IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjMwMzcgLTQuMzQ2MjA4ZS0wMyAtNy41ODc3MjFlLTAzIDAuMjQ4NCAtMTE3Mi42NTQ4IC01ODUuMTI5KSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguMTMwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0RFN0YxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzM4OSIgc3R5bGU9InN0b3AtY29sb3I6I0RBN0QxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNTk5MyIgc3R5bGU9InN0b3AtY29sb3I6I0NFNzYwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuODYwMiIgc3R5bGU9InN0b3AtY29sb3I6I0JBNkMwNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQUQ2NTAwIi8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzFfIiBjbGFzcz0ic3QyMCIgZD0iTTQ0LjMsMjkuOWMwLDAuNC0wLjQsMC43LTEsMC43cy0xLTAuNC0xLTAuOWMwLTAuNCwwLjQtMC43LDEtMC43CgkJQzQzLjgsMjkuMSw0NC4zLDI5LjQsNDQuMywyOS45eiIvPgo8L2c+CjxnIGlkPSJMYXllcl8xXzNfIj4KCQoJCTxsaW5lYXJHcmFkaWVudCBpZD0iWE1MSURfMzZfIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9Ii0yNDIyLjUxNzMiIHkxPSIxMDA1LjY1NDYiIHgyPSItMjQyMi41MTczIiB5Mj0iMTAxNC43NjQzIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjYyODcgLTMuOTI5MDMwZS0wMiAtNS4wNDc5OThlLTAyIDAuODA3NyAtMTQ0MC42ODE1IC04OTIuMDUxMykiPgoJCTxzdG9wICBvZmZzZXQ9IjEuOTcwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0Y3QkMwMCIvPgoJCTxzdG9wICBvZmZzZXQ9IjEiIHN0eWxlPSJzdG9wLWNvbG9yOiNGQ0Q3M0UiLz4KCTwvbGluZWFyR3JhZGllbnQ+Cgk8cGF0aCBpZD0iWE1MSURfMTRfIiBjbGFzcz0ic3QyMSIgZD0iTTQwLjYsMTcuMmwtMC42LDcuMmwtMTYuNy0zLjhjLTAuNi0wLjItMS4xLTAuNy0xLTEuM2MwLjItMS45LDAuMy0zLjksMC40LTUuOAoJCWMwLTAuNCwwLjEtMC44LDAuNS0wLjljMC40LTAuMSwwLjcsMC4xLDEsMC4ybDIsMC41YzAsMC4xLDAsMC4yLDAsMC4yYy0wLjEsMC44LDAuNiwxLjUsMS41LDEuNmMwLjgsMC4xLDEuNS0wLjQsMS43LTEuMWw2LjIsMS41CgkJYy0wLjEsMC4xLTAuMSwwLjItMC4xLDAuM2MwLDAuNCwwLjMsMC43LDAuNywwLjhzMC44LTAuMiwwLjktMC41di0wLjFDMzcuMiwxNi4yLDQwLjYsMTcuMiw0MC42LDE3LjJ6Ii8+Cgk8cGF0aCBjbGFzcz0ic3QxIiBkPSJNMjIuOCwxMy43YzAuMi0wLjUsMC0xLjMsMS41LTAuN2wyLDAuNWMwLjItMC40LDAuOS0wLjgsMS43LTAuN2MwLjksMC4xLDEuNiwwLjcsMS41LDEuM2MwLDAuMSwwLDAuMSwwLDAuMgoJCWw2LjIsMS41bDAsMGMwLjItMC4yLDAuNC0wLjMsMC43LTAuMmMwLjQsMC4xLDAuNywwLjMsMC43LDAuNWwzLjQsMUwzMiwxMC4zYy0wLjgtMC42LTEuOC0wLjktMi44LTAuOGMtMSwwLjItMi4yLDAuNC0zLjEsMC43CgkJYy0xLjEsMC40LTIuMSwxLjItMi44LDEuN2MwLDAtMC4zLDAuMy0wLjQsMC41QzIyLjksMTIuOCwyMi44LDEzLjIsMjIuOCwxMy43eiIvPgoJPGcgY2xhc3M9InN0MiI+CgkJPHBhdGggY2xhc3M9InN0MyIgZD0iTTI5LjgsOS45YzAuNywwLDEuMywwLjMsMS45LDAuN2w4LjQsNi43bC0wLjUsNi41bC0xNi4xLTMuN2MtMC40LTAuMS0wLjYtMC40LTAuNi0wLjgKCQkJYzAuMS0xLjEsMC4yLTIuMiwwLjMtMy4zYzAuMS0wLjgsMC4xLTEuNiwwLjItMi40YzAtMC4xLDAtMC4xLDAtMC4ybDAsMGMwLTAuMywwLjEtMC42LDAuMi0wLjhjMC4xLTAuMiwwLjMtMC40LDAuMy0wLjQKCQkJYzAuNi0wLjUsMS42LTEuMywyLjYtMS42YzAuNy0wLjMsMS43LTAuNSwzLTAuNkMyOS40LDkuOSwyOS42LDkuOSwyOS44LDkuOSBNMjkuOSw5LjVjLTAuMiwwLTAuNCwwLTAuNiwwYy0xLDAuMi0yLjIsMC40LTMuMSwwLjcKCQkJYy0xLjEsMC40LTIuMSwxLjItMi44LDEuN2MwLDAtMC4zLDAuMy0wLjQsMC41Yy0wLjEsMC4zLTAuMiwwLjUtMC4yLDFjMCwwLjEsMCwwLjIsMCwwLjJjLTAuMiwxLjktMC4zLDMuOS0wLjQsNS44CgkJCWMtMC4xLDAuNSwwLjQsMS4xLDEsMS4zbDE2LjYsMy45bDAuNi03LjNMMzIsMTAuM0MzMS40LDkuOCwzMC42LDkuNiwyOS45LDkuNUwyOS45LDkuNXoiLz4KCTwvZz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMzdfIiBjeD0iLTYzMDAuMDcxMyIgY3k9IjMxODQuNDk5MyIgcj0iNi44Njg3IiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjE3OTYgLTYuODIyNTU0ZS0wMyAtMS4zOTA2NjJlLTAyIDAuMTY1NiAtMTA2MS43Nzg2IC01NTIuMjIzMykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4LjEzMDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNERTdGMTQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjMzODkiIHN0eWxlPSJzdG9wLWNvbG9yOiNEQTdEMTIiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjU5OTMiIHN0eWxlPSJzdG9wLWNvbG9yOiNDRTc2MEQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjg2MDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQTZDMDUiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4NyIgc3R5bGU9InN0b3AtY29sb3I6I0FENjUwMCIvPgoJPC9yYWRpYWxHcmFkaWVudD4KCTxwYXRoIGlkPSJYTUxJRF8xM18iIGNsYXNzPSJzdDIyIiBkPSJNMjYuMSwxOC41Yy0wLjEsMC42LTAuNiwxLjEtMS4zLDFjLTAuNy0wLjEtMS4yLTAuNi0xLjItMS4zYzAuMS0wLjYsMC42LTEuMSwxLjMtMQoJCUMyNS43LDE3LjMsMjYuMiwxNy45LDI2LjEsMTguNXoiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iU1ZHSURfNV8iIGN4PSItNjMxOS4zMDAzIiBjeT0iMzE1My4wMDk1IiByPSIxNC4xMzIxIiBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KC0wLjE3OTYgLTYuODIyNTU0ZS0wMyAtMS4zOTA2NjJlLTAyIDAuMTY1NiAtMTA2MS43Nzg2IC01NTIuMjIzMykiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4LjEzMDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNERTdGMTQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjMzODkiIHN0eWxlPSJzdG9wLWNvbG9yOiNEQTdEMTIiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjU5OTMiIHN0eWxlPSJzdG9wLWNvbG9yOiNDRTc2MEQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjg2MDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNCQTZDMDUiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjk4NyIgc3R5bGU9InN0b3AtY29sb3I6I0FENjUwMCIvPgoJPC9yYWRpYWxHcmFkaWVudD4KCTxwYXRoIGNsYXNzPSJzdDIzIiBkPSJNMjYuMywxMy43Yy0wLjEsMC44LDAuNiwxLjUsMS41LDEuNmMwLjgsMC4xLDEuNS0wLjQsMS43LTEuMWgtMC4xaC0wLjFoMC4yYzAtMC4xLDAtMC4xLDAtMC4yCgkJYzAuMS0wLjYtMC42LTEuMy0xLjUtMS4zYy0wLjgtMC4xLTEuNCwwLjItMS43LDAuN0MyNi4zLDEzLjUsMjYuMywxMy42LDI2LjMsMTMuN3oiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMzhfIiBjeD0iLTI4OTUuMTQ2NyIgY3k9IjcyMzAuOTM4NSIgcj0iNy4xMDIiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTM5NSAwLjEwOTUgOS4zMzg2MjdlLTAyIDAuMTAxOSAtMTA0OS4wOTQyIC00MDkuMzQ3OCkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KCQk8c3RvcCAgb2Zmc2V0PSI4Ljc1MDAwMGUtMDIiIHN0eWxlPSJzdG9wLWNvbG9yOiNEOTk5MTQiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjQwOTgiIHN0eWxlPSJzdG9wLWNvbG9yOiNENTk2MTIiLz4KCQk8c3RvcCAgb2Zmc2V0PSIwLjczNSIgc3R5bGU9InN0b3AtY29sb3I6I0M5OEQwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQkE4MjA3Ii8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzEyXyIgY2xhc3M9InN0MjQiIGQ9Ik0zMC4zLDExLjJjMCwwLjMtMC40LDAuNC0wLjksMC40cy0wLjgtMC40LTAuOC0wLjZzMC40LTAuNCwwLjktMC40CgkJQzMwLDEwLjYsMzAuMywxMC45LDMwLjMsMTEuMnoiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iWE1MSURfMzlfIiBjeD0iLTYzMzQuNDI1OCIgY3k9IjMxODEuNDYzNCIgcj0iMTUuNjcyNSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgtMC4xNzk2IC02LjgyMjU1NGUtMDMgLTEuMzkwNjYyZS0wMiAwLjE2NTYgLTEwNjEuNzc4NiAtNTUyLjIyMzMpIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CgkJPHN0b3AgIG9mZnNldD0iOC4xMzAwMDBlLTAyIiBzdHlsZT0ic3RvcC1jb2xvcjojREU3RjE0Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC4zMzg5IiBzdHlsZT0ic3RvcC1jb2xvcjojREE3RDEyIi8+CgkJPHN0b3AgIG9mZnNldD0iMC41OTkzIiBzdHlsZT0ic3RvcC1jb2xvcjojQ0U3NjBEIi8+CgkJPHN0b3AgIG9mZnNldD0iMC44NjAyIiBzdHlsZT0ic3RvcC1jb2xvcjojQkE2QzA1Ii8+CgkJPHN0b3AgIG9mZnNldD0iMC45ODciIHN0eWxlPSJzdG9wLWNvbG9yOiNBRDY1MDAiLz4KCTwvcmFkaWFsR3JhZGllbnQ+Cgk8cGF0aCBpZD0iWE1MSURfMTFfIiBjbGFzcz0ic3QyNSIgZD0iTTMzLjIsMTguNWMtMC4xLDEuMS0xLjEsMS44LTIuMiwxLjZzLTIuMS0xLjEtMi0yLjJjMC4xLTEuMSwxLjEtMS44LDIuMi0xLjYKCQlDMzIuNCwxNi42LDMzLjMsMTcuNSwzMy4yLDE4LjV6Ii8+CgkKCQk8cmFkaWFsR3JhZGllbnQgaWQ9IlhNTElEXzQwXyIgY3g9Ii02MzMxLjIzNDQiIGN5PSIzMTQ4LjIxNzMiIHI9IjEwLjkxMTgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTc5NiAtNi44MjI1NTRlLTAzIC0xLjM5MDY2MmUtMDIgMC4xNjU2IC0xMDYxLjc3ODYgLTU1Mi4yMjMzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguNzUwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0Q5OTkxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNDA5OCIgc3R5bGU9InN0b3AtY29sb3I6I0Q1OTYxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNzM1IiBzdHlsZT0ic3RvcC1jb2xvcjojQzk4RDBEIi8+CgkJPHN0b3AgIG9mZnNldD0iMC45ODciIHN0eWxlPSJzdG9wLWNvbG9yOiNCQTgyMDciLz4KCTwvcmFkaWFsR3JhZGllbnQ+Cgk8cGF0aCBpZD0iWE1MSURfMTBfIiBjbGFzcz0ic3QyNiIgZD0iTTMzLjksMTMuMmMwLDAuNC0wLjYsMC42LTEuMywwLjVjLTAuNi0wLjEtMS4yLTAuNC0xLjItMC45YzAtMC40LDAuNi0wLjYsMS4zLTAuNQoJCVMzMy45LDEyLjksMzMuOSwxMy4yeiIvPgoJCgkJPHJhZGlhbEdyYWRpZW50IGlkPSJYTUxJRF80MV8iIGN4PSItNjM1Ny4xNzYzIiBjeT0iMzE5Ni44MTkzIiByPSI1LjkyODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTc5NiAtNi44MjI1NTRlLTAzIC0xLjM5MDY2MmUtMDIgMC4xNjU2IC0xMDYxLjc3ODYgLTU1Mi4yMjMzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguMTMwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0RFN0YxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzM4OSIgc3R5bGU9InN0b3AtY29sb3I6I0RBN0QxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNTk5MyIgc3R5bGU9InN0b3AtY29sb3I6I0NFNzYwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuODYwMiIgc3R5bGU9InN0b3AtY29sb3I6I0JBNkMwNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQUQ2NTAwIi8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzlfIiBjbGFzcz0ic3QyNyIgZD0iTTM2LDIwLjljMCwwLjUtMC41LDAuOS0xLjIsMC44Yy0wLjYtMC4xLTEuMS0wLjUtMS0xLjFjMC0wLjUsMC41LTAuOSwxLjItMC44CgkJQzM1LjYsMTkuOSwzNi4xLDIwLjMsMzYsMjAuOXoiLz4KCQoJCTxyYWRpYWxHcmFkaWVudCBpZD0iU1ZHSURfNl8iIGN4PSItNjM2MS42ODE2IiBjeT0iMzE2Ny4wODY3IiByPSI4Ljg0MDgiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTc5NiAtNi44MjI1NTRlLTAzIC0xLjM5MDY2MmUtMDIgMC4xNjU2IC0xMDYxLjc3ODYgLTU1Mi4yMjMzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguNjAwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0M3NzMxNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzc3NCIgc3R5bGU9InN0b3AtY29sb3I6I0MzNzExMyIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNjcxOCIgc3R5bGU9InN0b3AtY29sb3I6I0I3NkMwRiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTY2OSIgc3R5bGU9InN0b3AtY29sb3I6I0EzNjQwNyIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQTE2MzA2Ii8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggY2xhc3M9InN0MjgiIGQ9Ik0zNS41LDE2LjFjMCwwLjQsMC4zLDAuNywwLjcsMC44YzAuNCwwLjEsMC44LTAuMiwwLjktMC41di0wLjFsMCwwYzAtMC4zLTAuNC0wLjUtMC43LTAuNQoJCWMtMC40LDAtMC42LDAtMC43LDAuMmwwLDBDMzUuNiwxNS45LDM1LjUsMTYsMzUuNSwxNi4xeiIvPgoJCgkJPHJhZGlhbEdyYWRpZW50IGlkPSJYTUxJRF80Ml8iIGN4PSItNjM3NC4wOTMzIiBjeT0iMzE4NS45NTI0IiByPSI0LjM5ODUiIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoLTAuMTc5NiAtNi44MjI1NTRlLTAzIC0xLjM5MDY2MmUtMDIgMC4xNjU2IC0xMDYxLjc3ODYgLTU1Mi4yMjMzKSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgoJCTxzdG9wICBvZmZzZXQ9IjguMTMwMDAwZS0wMiIgc3R5bGU9InN0b3AtY29sb3I6I0RFN0YxNCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuMzM4OSIgc3R5bGU9InN0b3AtY29sb3I6I0RBN0QxMiIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuNTk5MyIgc3R5bGU9InN0b3AtY29sb3I6I0NFNzYwRCIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuODYwMiIgc3R5bGU9InN0b3AtY29sb3I6I0JBNkMwNSIvPgoJCTxzdG9wICBvZmZzZXQ9IjAuOTg3IiBzdHlsZT0ic3RvcC1jb2xvcjojQUQ2NTAwIi8+Cgk8L3JhZGlhbEdyYWRpZW50PgoJPHBhdGggaWQ9IlhNTElEXzhfIiBjbGFzcz0ic3QyOSIgZD0iTTM4LjksMTkuMWMwLDAuMy0wLjMsMC40LTAuNiwwLjRjLTAuNCwwLTAuNS0wLjMtMC41LTAuNnMwLjMtMC40LDAuNi0wLjQKCQlDMzguNywxOC41LDM4LjksMTguOCwzOC45LDE5LjF6Ii8+CjwvZz4KPC9zdmc+Cg==',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'token.cheddar.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Pulse',\n symbol: 'PULSE',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGNpcmNsZSBjeD0iMTYiIGN5PSIxNiIgcj0iMTYiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNi41NTAzNSAxOS4xMjM5TDkuMTcxNjYgMTQuOTQ5MkM5LjMyNzMxIDE0LjcwMTMgOS41OTk0OCAxNC41NTA4IDkuODkyMiAxNC41NTA4SDE4LjQxNEMxOS41NDEyIDE0LjU1MDggMjAuNTYxNCAxMy44ODM2IDIxLjAxMzMgMTIuODUwOUMyMS4zNjQ3IDEyLjA0NzYgMjAuNzc2MSAxMS4xNDc3IDE5Ljg5OTMgMTEuMTQ3N0gxMS45NzQyTDExLjU0ODggMTEuMjU0TDEzLjY0NjEgNy40NDA3OEMxMy43OTU2IDcuMTY4OTEgMTQuMDgxMyA3IDE0LjM5MTUgN0gyMi4wNzU0QzI1LjA1NDMgNyAyNy4xMTA3IDkuOTgyNzkgMjYuMDUxMyAxMi43NjdMMjUuODYzMSAxMy4yNjEzQzI0LjU0NDQgMTYuNzI2OSAyMS4yMjE4IDE5LjAxNzYgMTcuNTEzOCAxOS4wMTc2SDYuOTc1NzVMNi41NTAzNSAxOS4xMjM5Wk04LjM2ODg0IDE5Ljk3NDdDNy4wNTA0MiAxOS45NzQ3IDUuODM2NTUgMjAuNjkyNSA1LjIwMTE4IDIxLjg0NzdDNC42MTIyMyAyMi45MTg1IDUuMzg2OTQgMjQuMjI4NyA2LjYwOTAzIDI0LjIyODdIMTAuODA0NEwxMy40NjMxIDE5Ljg2ODRMMTMuMTQ0MSAxOS45NzQ3SDguMzY4ODRaIiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfMjBfMykiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yMF8zIiB4MT0iMTguMDI2NiIgeTE9IjUuNTI5MjYiIHgyPSIyLjI2ODYxIiB5Mj0iMzAuMTExNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjREQ1OUZGIi8+CjxzdG9wIG9mZnNldD0iMC40NzM5NTgiIHN0b3AtY29sb3I9IiM1MDY5RkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDAyNUZGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==',\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '52a047ee205701895ee06a375492490ec9c597ce.factory.bridge.near',\n },\n {\n decimals: 18,\n icon:\n 'data:image/png;base64,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',\n name: 'Ether',\n reference: null,\n reference_hash: null,\n spec: 'ft-1.0.0',\n symbol: 'ETH',\n id: 'aurora',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Pixeltoken',\n symbol: 'PXT',\n icon:\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAANdJREFUWIXll70RwjAMhWUuNGwARVgEmuyQJRgo7AA7uGESGioaGlpTcK+w7nR+gcIyfJ1zys/7dHKSsO53SSqyqHlzEZFu7gm364Wq22z3VF07BpB8CANXn971JRP+Dejk8fSgLoz6kgm/Btjk58MqW4/TM6svmfBrQIOkSAiO92W2Hmc+gF8D6BV6h17qhOxUWPg18C16OizaN2AlxXTEFEWkxZ2QRe8DoJQctG8AIDH4vS8iFjY5aM8Au8Ox+DdgvRUBO+8W/g0AbUIf/5TqBsLf/x2/ADJHSOenTxC2AAAAAElFTkSuQmCC',\n reference: '',\n reference_hash: '',\n decimals: 6,\n id: 'pixeltoken.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Debio',\n symbol: 'DBIO',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIxOTAgOTcgNDIwIDQyMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgODAwIDgwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZGVmcz48c3R5bGU+LnN0MHtmaWxsOiMzNjM2MzZ9LnN0M3tmaWxsOiNmZjU2ZTB9PC9zdHlsZT48L2RlZnM+PGNpcmNsZSBjbGFzcz0ic3QzIiBjeD0iNDAwIiBjeT0iMzA3LjM5IiByPSIyMDguNTgiLz48cGF0aCBkPSJNNDczLjk5IDIxMS4zczIuMzQgNTYuMjUtNzcuMzQgOTguNDMtNzAuMzEgOTMuNzQtNzAuMzEgOTMuNzQiIHN0eWxlPSJmaWxsOm5vbmU7c3Ryb2tlOiNlNmU2ZTY7c3Ryb2tlLXdpZHRoOjM3LjQ5NzU7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MTAiLz48cGF0aCBkPSJNMzI2LjAxIDIxMS4zcy0yLjM0IDU2LjI1IDc3LjM0IDk4LjQzIDcwLjMxIDkzLjc0IDcwLjMxIDkzLjc0IiBzdHlsZT0iZmlsbDpub25lO3N0cm9rZTojZmZmO3N0cm9rZS13aWR0aDozNy40OTc1O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1taXRlcmxpbWl0OjEwIi8+PGNpcmNsZSBjbGFzcz0ic3QwIiBjeD0iNDAwIiBjeT0iMjE2LjQyIiByPSIyMC40OSIvPjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjQwMCIgY3k9IjM5OC4zNiIgcj0iMjAuNDkiLz48dGV4dCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMzYuMzQyIDY1OC4wNzUpIiBjbGFzcz0ic3QzIiBzdHlsZT0id2hpdGUtc3BhY2U6cHJlO2ZvbnQtc2l6ZToxMTIuNDkyNXB4O2ZvbnQtZmFtaWx5OidBcnRlZ3JhU2Fucy1TZW1pQm9sZCciPkRlQmlvPC90ZXh0Pjwvc3ZnPg==',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'dbio.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Aurora',\n symbol: 'AURORA',\n icon:\n \"data:image/svg+xml,%3Csvg version='1.1' id='Layer_1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' viewBox='0 0 288 288' style='enable-background:new 0 0 288 288;' xml:space='preserve'%3E %3Cstyle type='text/css'%3E .st0%7Bfill:%2370D44B;%7D .st1%7Bfill:%23FFFFFF;%7D %3C/style%3E %3Cpath class='st0' d='M144,0L144,0c79.5,0,144,64.5,144,144v0c0,79.5-64.5,144-144,144h0C64.5,288,0,223.5,0,144v0 C0,64.5,64.5,0,144,0z'/%3E %3Cpath class='st1' d='M144,58.8c7.6,0,14.5,4.3,17.9,11.1l56.2,112.5c4.9,9.9,0.9,21.9-9,26.8c-2.8,1.4-5.8,2.1-8.9,2.1H87.8 c-11,0-20-9-20-20c0-3.1,0.7-6.2,2.1-8.9l56.2-112.5C129.5,63,136.4,58.7,144,58.8 M144,45c-12.8,0-24.5,7.2-30.2,18.7L57.6,176.2 c-8.3,16.7-1.6,36.9,15.1,45.3c4.7,2.3,9.9,3.6,15.1,3.6h112.5c18.6,0,33.8-15.1,33.8-33.7c0-5.2-1.2-10.4-3.6-15.1L174.2,63.7 C168.5,52.2,156.8,45,144,45z'/%3E %3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: 'aaaaaa20d9e0e2461697782ef11675f668207961.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Meta Token',\n symbol: '$META',\n icon:\n \"data:image/svg+xml,%3csvg width='96' height='96' viewBox='0 0 96 96' fill='none' xmlns='http://www.w3.org/2000/svg'%3e%3crect width='96' height='96' rx='48' fill='white'/%3e%3cpath d='M29.2241 28.7456C28.396 27.9423 27.0094 28.5289 27.0091 29.6825L27 66.6773C26.9997 67.8501 28.4257 68.4286 29.2426 67.5872L48.6529 47.5943L29.2241 28.7456Z' fill='%23231B51'/%3e%3cpath d='M66.7759 28.7456C67.604 27.9423 68.9906 28.5289 68.9909 29.6825L69 66.6773C69.0003 67.8501 67.5743 68.4286 66.7574 67.5872L47.3471 47.5943L66.7759 28.7456Z' fill='%23231B51'/%3e%3c/svg%3e\",\n reference: 'https://metapool.app',\n reference_hash: null,\n decimals: 24,\n id: 'meta-token.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Potato 🥔',\n symbol: 'POTATO',\n icon:\n 'data:image/jpeg;base64,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',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'v1.dacha-finance.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Flux Token',\n symbol: 'FLX',\n icon:\n \"data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='140px' height='140px' viewBox='0 0 140 140' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3EFlux Logo New%3C/title%3E%3Cdefs%3E%3CradialGradient cx='50%25' cy='0%25' fx='50%25' fy='0%25' r='248.533062%25' gradientTransform='translate(0.500000,0.000000),scale(1.000000,0.393939),rotate(90.000000),translate(-0.500000,-0.000000)' id='radialGradient-1'%3E%3Cstop stop-color='%23FE84FC' offset='0%25'%3E%3C/stop%3E%3Cstop stop-color='%232ED1FF' offset='100%25'%3E%3C/stop%3E%3C/radialGradient%3E%3C/defs%3E%3Cg id='logos' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cg id='Group' transform='translate(-143.000000, -251.000000)'%3E%3Cg id='Group-2' transform='translate(0.000000, 251.000000)'%3E%3Cg id='Flux-Logo' transform='translate(143.000000, 0.000000)'%3E%3Cg id='Flux-Logo-New' transform='translate(70.000000, 70.000000) rotate(90.000000) translate(-70.000000, -70.000000) '%3E%3Ccircle id='Oval' fill='%23FFFFFF' cx='70' cy='70' r='70'%3E%3C/circle%3E%3Crect id='Rectangle' fill='%230F0E25' transform='translate(70.000000, 83.000000) rotate(90.000000) translate(-70.000000, -83.000000) ' x='57' y='50' width='26' height='66' rx='13'%3E%3C/rect%3E%3Cpath d='M50,30 C57.1797017,30 63,35.8202983 63,43 L63,96 L63,96 L50,96 C42.8202983,96 37,90.1797017 37,83 L37,43 C37,35.8202983 42.8202983,30 50,30 Z' id='Rectangle' fill='%230F0E25'%3E%3C/path%3E%3Cpath d='M63,44 L76,44 C83.1797017,44 89,49.8202983 89,57 L89,97 C89,104.179702 83.1797017,110 76,110 C68.8202983,110 63,104.179702 63,97 L63,44 L63,44 Z' id='Rectangle' fill='url(%23radialGradient-1)'%3E%3C/path%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '3ea8ea4237344c9931214796d9417af1a1180770.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'nUSDO',\n symbol: 'nUSDO',\n icon:\n 'data:image/png;base64,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',\n reference: '',\n reference_hash: '',\n decimals: 8,\n id: 'v3.oin_finance.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'oinfinance',\n symbol: 'OIN',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 974.66 974.66'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bisolation:isolate;%7D.cls-2%7Bfill:%235a8dff;%7D.cls-3%7Bfill:%23fff;%7D.cls-4,.cls-5%7Bfill:%231b57f6;%7D.cls-5%7Bmix-blend-mode:multiply;%7D%3C/style%3E%3C/defs%3E%3Cg class='cls-1'%3E%3Cg id='图层_1' data-name='图层 1'%3E%3Ccircle class='cls-2' cx='487.33' cy='484.76' r='473.82'/%3E%3Ccircle class='cls-3' cx='487.33' cy='484.76' r='358.99'/%3E%3Cpath class='cls-4' d='M487.33,98.08c-213.55,0-386.67,173.12-386.67,386.68S273.78,871.43,487.33,871.43,874,698.31,874,484.76,700.88,98.08,487.33,98.08ZM368.59,297.83a9,9,0,0,1,12.71-.14,287,287,0,0,0,137.53,75,110.56,110.56,0,0,1,51.78,28.2,9,9,0,0,1-12.49,12.93,92.54,92.54,0,0,0-43.3-23.61,304.9,304.9,0,0,1-146.09-79.66A9,9,0,0,1,368.59,297.83Zm216.7,197.36a9,9,0,0,1,17.93,1.3c-1.86,25.6-15.92,49.6-38.58,65.86-18.31,13.13-40.08,19.87-63.28,19.87a130.41,130.41,0,0,1-32.7-4.3,9,9,0,0,1,4.52-17.4c29.91,7.76,58.67,3.23,81-12.78C572.48,534.61,583.82,515.45,585.29,495.19Zm-9.7-47.57a15.39,15.39,0,1,1,12.8,17.6A15.39,15.39,0,0,1,575.59,447.62Zm-244-118.07a9,9,0,0,1,12.71,0,335.48,335.48,0,0,0,163.36,90.53c30.07,6.9,50.7,33.19,48,61.16-1.64,17.07-9.08,30.42-21.52,38.59-8.23,5.41-18.1,8.14-28.9,8.14a76.36,76.36,0,0,1-23.39-3.91,9,9,0,1,1,5.52-17.1c14.54,4.69,27.64,3.93,36.9-2.15,7.73-5.08,12.39-13.82,13.49-25.29,2-20.88-15.76-37.71-34.1-41.92a353.42,353.42,0,0,1-172.1-95.35A9,9,0,0,1,331.59,329.55Zm-30,41.34a9,9,0,0,1,12.71-.23c36.29,35,81.18,62.68,133.43,82.22a9,9,0,0,1-3.15,17.41,8.89,8.89,0,0,1-3.14-.58c-54.58-20.41-101.55-49.38-139.62-86.11A9,9,0,0,1,301.56,370.89ZM452.39,512.8a15.39,15.39,0,1,1-12.8-17.6A15.38,15.38,0,0,1,452.39,512.8ZM278.9,429.48a9,9,0,0,1,12.54-2.07c38.33,27.47,67.76,43.32,105.66,61.43a9,9,0,1,1-7.75,16.21c-38.8-18.53-69-34.79-108.38-63A9,9,0,0,1,278.9,429.48Zm-4.46,60.34A9,9,0,0,1,287,487.67c45.31,32,91.6,55,137.57,68.37a9,9,0,0,1-2.5,17.62,8.76,8.76,0,0,1-2.51-.36c-47.9-13.9-96-37.78-142.94-70.95A9,9,0,0,1,274.44,489.82Zm18.28,73.95a9,9,0,0,1,12.38-2.89c44.19,27.46,93.91,45,123.06,51.75,27.43,6.32,56.78,9,65.69,9,77.91,0,141.29-63.38,141.29-141.29,0-65.78-46.6-123.81-110.81-138L516,340.57l0-.24a257.48,257.48,0,0,1-100.58-53,9,9,0,1,1,11.69-13.66A239.17,239.17,0,0,0,528.3,324.87l8.22,1.9,0,.16c68.06,19,116.62,82.18,116.62,153.46,0,87.82-71.45,159.27-159.27,159.27-9.61,0-40.9-2.87-69.72-9.51-30.5-7-82.46-25.38-128.52-54A9,9,0,0,1,292.72,563.77ZM493.85,688.36l-9-.07c-5.35-.12-10.74-.42-16.1-.9a302.94,302.94,0,0,1-109.22-31.85,9,9,0,1,1,8.2-16,284.85,284.85,0,0,0,102.64,29.94,225.63,225.63,0,0,0,23.34.87l7.29-.11c101.46-3.78,182.84-87.49,182.84-189.86,0-89.16-63.2-167.31-150.26-185.83l-.12,0-.11,0a206.73,206.73,0,0,1-49.14-18.68A9,9,0,0,1,492.69,260,188.85,188.85,0,0,0,537.56,277h0c95.18,20.37,164.23,105.85,164.23,203.35C701.82,595.07,608.53,688.36,493.85,688.36Z'/%3E%3Cpath class='cls-5' d='M144.68,484.76c0-206.19,161.39-374.67,364.73-386-7.27-.41-14.58-.64-21.94-.64-213.56,0-386.68,173.12-386.68,386.68S273.91,871.43,487.47,871.43c7.36,0,14.67-.23,21.94-.64C306.07,859.42,144.68,690.94,144.68,484.76Z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 8,\n id: '9aeb50f542050172359a0e1a25a9933bc8c01259.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Myria',\n symbol: 'MYRIA',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgNjAwIj48ZGVmcz48Y2xpcFBhdGggaWQ9ImNsaXAtcGF0aCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtLjEzKSI+PHBhdGggc3R5bGU9ImZpbGw6bm9uZSIgZD0iTTAgMGg2MDB2NjAwSDB6Ii8+PC9jbGlwUGF0aD48c3R5bGU+LmNscy00e2ZpbGw6I2ZmZn08L3N0eWxlPjwvZGVmcz48ZyBzdHlsZT0iY2xpcC1wYXRoOnVybCgjY2xpcC1wYXRoKSI+PHBhdGggZD0iTTYwMCAzMDAuMTNjMCAxNjUuNjktMTM0LjMxIDMwMC0zMDAgMzAwUzAgNDY1LjgxIDAgMzAwLjEzIDEzNC4zMS4xMyAzMDAgLjEzczMwMCAxMzQuMzEgMzAwIDMwMCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtLjEzKSIgc3R5bGU9ImZpbGw6Izg2MmFlOSIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTQ3MS4xMSA0MjEuMjFhMTcuNzUgMTcuNzUgMCAwIDAgMi4wNy04IDcuMjQgNy4yNCAwIDAgMCAwLTEuMVYyNjMuNDdhOTUuMzYgOTUuMzYgMCAwIDAtMTQyLjYxLTgxLjcybC0xLjQ5Ljg1LTEyNi42NCA3My4xMi0xLjExLjY1YTE4LjE4IDE4LjE4IDAgMCAwLTUuNzcgNS43NWMtLjE1LjIxLS4yNi40MS0uMzkuNjNhMTguMzMgMTguMzMgMCAwIDAgNi43MSAyNWwyNDMuODQgMTQwLjgzYTE4LjMzIDE4LjMzIDAgMCAwIDI1LTYuNzFjLjEzLS4yMi4yNC0uNDIuMzUtLjY1TTIxMi41NCAyNzEuOTNsMTQuNzQtOC41MyA2Mi44NC0zNi4yNiA0OS4zOC0yOC41MSAxLjYtLjkxYTc2LjM0IDc2LjM0IDAgMCAxIDExMyA2NS4yNnYxNDguNDNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIC0uMTMpIi8+PHBhdGggY2xhc3M9ImNscy00IiBkPSJNMTI4Ljg5IDQyMS4yMWExNy43NyAxNy43NyAwIDAgMS0yLjA4LTggNy41IDcuNSAwIDAgMSAwLTEuMVYyNjMuNDdhOTUuMzYgOTUuMzYgMCAwIDEgMTQyLjYxLTgxLjcybDEuNDkuODUgMTI2LjY1IDczLjExIDEuMTEuNjVhMTguMTcgMTguMTcgMCAwIDEgNS43NyA1Ljc1Yy4xNS4yMS4yNi40MS4zOS42M2ExOC4zMyAxOC4zMyAwIDAgMS02LjcxIDI1TDE1NC4yOCA0MjguNThhMTguMzMgMTguMzMgMCAwIDEtMjUtNi43MWMtLjEzLS4yMi0uMjQtLjQyLS4zNS0uNjVtMjU4LjUzLTE0OS4yOS0xNC43NC04LjUzLTYyLjgzLTM2LjI2LTQ5LjM5LTI4LjUyLTEuNi0uOTFhNzYuMzQgNzYuMzQgMCAwIDAtMTEzIDY1LjI2djE0OC40NFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLS4xMykiLz48L2c+PC9zdmc+',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'myriadcore.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'xRef Finance Token',\n symbol: 'xREF',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNjIiIHZpZXdCb3g9IjAgMCA1NiA2MiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTEuODU2OTMgMTcuODg1NkMxLjg1NjkzIDE2LjAyNzggMi44ODY5MiAxNC4zMjMyIDQuNTMxNTEgMTMuNDU5MkwyNS45MjE2IDIuMjIxNzJDMjcuMzc3NSAxLjQ1NjgzIDI5LjExNjUgMS40NTY4MyAzMC41NzI0IDIuMjIxNzJMNTEuOTYyNCAxMy40NTkyQzUzLjYwNyAxNC4zMjMyIDU0LjYzNyAxNi4wMjc4IDU0LjYzNyAxNy44ODU2VjQ1LjYzMDRDNTQuNjM3IDQ3LjYwMjEgNTMuNDc4MiA0OS4zODk4IDUxLjY3ODMgNTAuMTk0N0wzMC4yODgyIDU5Ljc2MDZDMjguOTg5NCA2MC4zNDE0IDI3LjUwNDYgNjAuMzQxNSAyNi4yMDU3IDU5Ljc2MDZMNC44MTU3IDUwLjE5NDdDMy4wMTU3NCA0OS4zODk4IDEuODU2OTMgNDcuNjAyMSAxLjg1NjkzIDQ1LjYzMDRMMS44NTY5MyAxNy44ODU2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzEyNDYxXzIwNzUpIiBzdHJva2U9IiMwMEM2QTIiIHN0cm9rZS13aWR0aD0iMiIvPgo8cGF0aCBkPSJNMTMuNjk3OCAyMC4zMzJMMjguMjQ3MSAxNEwyOC4yMjAyIDMwLjU0MTdMMjAuMjgwMyAyMy43MTE2TDEyLjMxMzUgMzAuOTI5NVYyMi4zNjU0QzEyLjMxNTIgMjEuNDkyMiAxMi44NTM4IDIwLjY5OTMgMTMuNjk3OCAyMC4zMzJaIiBmaWxsPSIjMDBDNkEyIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8cGF0aCBkPSJNMTQuMTAyMyA0Mi43NjQ1TDI4LjI0NzEgNDYuODYyNkwyOC4yMjAyIDM0LjU5NDRMMjAuMjc5NCAyNy45NDE0TDEyLjMxMzUgMzQuOTcyMlY0MC41Mjc0QzEyLjMxMzUgNDEuNTUxNSAxMy4wMzY3IDQyLjQ1NTkgMTQuMTAyMyA0Mi43NjQ1WiIgZmlsbD0iIzAwQzZBMiIgZmlsbC1vcGFjaXR5PSIwLjUiLz4KPHBhdGggZD0iTTQzLjY0NDUgNDIuNzYzM0wyOC4yNzQ0IDQ2Ljg2MzJMMjguMjQ2OCAzNC41MTU3TDQzLjIyMSAyMi40NjQ4QzQzLjIyMSAyMi40NjQ4IDQ1Ljc5MyAyNC4zOTk2IDQ1LjAzNzMgMjcuODE5NkM0My43MDQ4IDMzLjg1MTEgMzUuMTc5NiAzNS45ODY5IDM1LjE3OTYgMzUuOTg2OUw0My45MDk2IDQxLjE1NjFDNDQuNjE1NSA0MS41NzggNDQuNDU1NCA0Mi41NDcgNDMuNjQ0NSA0Mi43NjMzWiIgZmlsbD0iIzQ1RkZERSIvPgo8cGF0aCBkPSJNMzguNTkwMyAxOC45NzkzTDI4LjI3MzQgMTRMMjguMjQ2OCAzMC40MzE1TDQwLjY5NSAyMC4zNTA5QzQwLjY5NSAyMC4zNTA5IDQwLjQyNzEgMjAuMDU5NyAzOS42OTAxIDE5LjU4MDVDMzkuNDI4OSAxOS40MTE0IDM4LjU5MDMgMTguOTc5MyAzOC41OTAzIDE4Ljk3OTNaIiBmaWxsPSIjNDVGRkRFIi8+CjxwYXRoIGQ9Ik00MC41NTEgMTYuMDEwMUw0Ni42NjAyIDE4LjI4MDVDNDYuOTY3NSAxOC4zOTQzIDQ3LjE2OCAxOC42NjU2IDQ3LjE2OCAxOC45NjVWMjMuMTIwN0M0Ny4xNjggMjMuNDM4OCA0Ni43MjYgMjMuNTgyMiA0Ni41MDQyIDIzLjMzNDNMNDAuMjU1MyAxNi4zNjg3QzQwLjA4OTMgMTYuMTgzMSA0MC4zMDYyIDE1LjkxODEgNDAuNTUxIDE2LjAxMDFaIiBmaWxsPSIjNDVGRkRFIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXJfMTI0NjFfMjA3NSIgeDE9IjI4LjI0NyIgeTE9IjEiIHgyPSIyOC4yNDciIHkyPSI2MC42NzM1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMwMTEzMjAiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDAxMzIwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'xtoken.ref-finance.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Solana',\n symbol: 'SOL',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHdpZHRoPSIxMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiIHgxPSI1MCIgeDI9IjUwIiB5MT0iMjciIHkyPSI3NCI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjMTRlNmFkIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjYTk2NGRlIi8+PC9saW5lYXJHcmFkaWVudD48Y2xpcFBhdGggaWQ9ImIiPjxwYXRoIGQ9Im0wIDBoMTAwdjEwMGgtMTAweiIvPjwvY2xpcFBhdGg+PGcgY2xpcC1wYXRoPSJ1cmwoI2IpIj48cGF0aCBkPSJtNTAgMGM5Ljg4OTEgMCAxOS41NTYxIDIuOTMyNDUgMjcuNzc4NSA4LjQyNjUyIDguMjIyNSA1LjQ5NDA4IDE0LjYzMTEgMTMuMzAyOTggMTguNDE1NSAyMi40MzkyOHM0Ljc3NSAxOS4xODk3IDIuODQ1MyAyOC44ODg3Yy0xLjkyOTMgOS42OTkxLTYuNjkxMyAxOC42MDgyLTEzLjY4NCAyNS42MDA4LTYuOTkyNiA2Ljk5MjctMTUuOTAxNyAxMS43NTQ3LTI1LjYwMDggMTMuNjg0LTkuNjk5IDEuOTI5Ny0xOS43NTI0LjkzOTEtMjguODg4Ny0yLjg0NTNzLTE2Ljk0NTItMTAuMTkzLTIyLjQzOTI4LTE4LjQxNTVjLTUuNDk0MDctOC4yMjI0LTguNDI2NTItMTcuODg5NC04LjQyNjUyLTI3Ljc3ODUgMC0xMy4yNjA4IDUuMjY3ODQtMjUuOTc4NSAxNC42NDQ3LTM1LjM1NTMgOS4zNzY4LTkuMzc2ODYgMjIuMDk0NS0xNC42NDQ3IDM1LjM1NTMtMTQuNjQ0N3oiIGZpbGw9IiMwMDAiLz48ZyBmaWxsPSJ1cmwoI2EpIiBmaWxsLW9wYWNpdHk9Ii45MiI+PHBhdGggZD0ibTMwLjM4MDYgNjIuNzg4OWMuMzEzMS0uMzIzNC44MzQ5LS41MzkgMS4zNTY3LS41MzloNDYuMjMwN2MuODM0OSAwIDEuMjUyMyAxLjA3NzkuNjI2MiAxLjcyNDdsLTkuMTgzNiA5LjQ4NjRjLS4zMTMuMzIzNC0uODM0OC41MzktMS4zNTY2LjUzOWgtNDYuMTI2NGMtLjgzNDggMC0xLjI1MjItMS4wNzgtLjYyNjEtMS43MjQ4eiIvPjxwYXRoIGQ9Im0zMC4zODA2IDI3LjUzOWMuMzEzMS0uMzIzNC44MzQ5LS41MzkgMS4zNTY3LS41MzloNDYuMjMwN2MuODM0OSAwIDEuMjUyMyAxLjA3OC42MjYxIDEuNzI0OGwtOS4xODM1IDkuNDg2M2MtLjMxMzEuMzIzNC0uODM0OC41MzktMS4zNTY2LjUzOWgtNDYuMTI2NGMtLjgzNDkgMC0xLjI1MjMtMS4wNzgtLjYyNjEtMS43MjQ4eiIvPjxwYXRoIGQ9Im02OS41MTUgNDUuMDAxOGMtLjMxMzEtLjMyMzQtLjgzNDktLjUzOS0xLjM1NjctLjUzOWgtNDYuMjMwN2MtLjgzNDggMC0xLjI1MjIgMS4wNzgtLjYyNjEgMS43MjQ4bDkuMTgzNSA5LjQ4NjRjLjMxMzEuMzIzMy44MzQ5LjUzODkgMS4zNTY3LjUzODloNDYuMjMwNmMuODM0OSAwIDEuMjUyNC0xLjA3OC42MjYyLTEuNzI0OHoiLz48L2c+PC9nPjwvc3ZnPg==',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'sol.token.a11bd.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'TerraUSD',\n symbol: 'UST',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHdpZHRoPSIxMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTgxLjA5NiAxMy43MjItLjAxLS4wMS4wMTQtLjAwOGE0NC4xNzQgNDQuMTc0IDAgMCAwIC0yOC43NjUtMTAuNTc0IDQ0LjE2NyA0NC4xNjcgMCAwIDAgLTE4LjAxIDMuODI1Yy0zLjcwNSAxLjU2NS02LjcxNSAzLjYzNS05LjE5NSA2Ljg4NS0xMi43NCAxNi44MyAyOS45NiAyOS4wNiA1Mi43OSAyOS4xMDQgMTAuNDkyIDcuNTI4IDEzLjQ0Ni0yMS4yMzYgMy4xNzctMjkuMjIyeiIgZmlsbD0iIzBkM2NhNCIvPjxwYXRoIGQ9Im0zNi44OTMgMTQuMDYzYy01Ljg2MyA4LjgxNi0yNS40MDMgMTUuMDI3LTI4LjYxNSAxNC4wNTdsLS4wMTktLjA0Yy4xMzItLjI2OC4yNjgtLjUzMi40LS43OTVhNDYuNjcyIDQ2LjY3MiAwIDAgMSA4LjQ4LTExLjU4IDQ3LjIxIDQ3LjIxIDAgMCAxIDkuMTg1LTcuMTUxYzIuNzM3LTEuNTg0IDUuNTM2LTEuNjg4IDYuNDU4LTEuNzIgOC43MDguMTc3IDQuMTYgNy4xNiA0LjExIDcuMjI5em0tNC44MDYgNjIuMzAzYy40MTggMi43NzItLjAwOSAxMy43MTMtLjU4IDE0LjYzNC0uNDg2LjAzMi0xLjUwMy4wOTUtNC40NDgtMS41NTdhNDYuODI3IDQ2LjgyNyAwIDAgMSAtOS45Mi03LjU3MyA0Ni45NTIgNDYuOTUyIDAgMCAxIC04LjQ4LTExLjU4IDQ2LjUyNCA0Ni41MjQgMCAwIDEgLTUuMjIzLTIxLjVjMC0yLjU4MS4yMDgtNS4xMTguNjEyLTcuNTg3YTQ2LjUxMSA0Ni41MTEgMCAwIDEgMi4yNjUtOC41OThjMy4zNzYgNC40ODMgNy4yNzggOC41NDQgMTAuNTk1IDEzLjA3MyAzLjE1OSA0LjMxNSA3LjUwNiAxMS4zNDQgOC4zODYgMTIuODUgNS41IDkuMzE2IDYuMzc2IDE1LjA3NCA2Ljc5MyAxNy44Mzh6bS0zLjMxMi0zOC44NTdjLTIuMDA2LTE1LjMxIDI5LjA1NS0yNS45NzkgNDIuNzA1LTI2LjM4MiAxLjYzOC4wMTggNi42MTYuMDc3IDkuNTI1IDIuNDM2IDUzLjQ5NSA1MC45MzctNDYuOTU3IDY0LjI0LTUyLjIzIDIzLjk0N3oiIGZpbGw9IiM1NDk0ZjgiLz48cGF0aCBkPSJtMjAuNDU3IDkyLjM1YzAgMS44MjUgMS4yNyAzLjMwNCAyLjg0NSAzLjMxMyAzNy40OTYuMjU5IDczLjY5NC0xLjQ2IDczLjY5NC03LjA4MyAwLTE3LjAwNy03Ni41MzkgMy43Ny03Ni41MzkgMy43N3oiIGZpbGw9IiM3NjAxMDEiLz48cGF0aCBkPSJtMjMuMzIgNDQuMTg3YTIuODYzIDIuODYzIDAgMCAwIC0yLjg2MyAyLjg2M3Y0NS4zYzAgMS41NzQgMS4yNyAyLjg1IDIuODQ1IDIuODU4IDM3LjQ5Ni0uMjc2IDczLjc0LTEyLjY4NyA3My42OTQtNi42M3YtNTEuMDI0Yy4wNDUtNi4wNTMtMzYuMTg5IDYuMzUzLTczLjY3NiA2LjYzNHoiIGZpbGw9IiNkZTMwMzAiLz48cGF0aCBkPSJtODQgODBjOC44LTEuNiAxMi4zMzMtLjMzMyAxMyAuNXYzLjVjLTEuNi0xLjYtOS4zMzMtLjY2Ny0xMyAwLTIwLjUgNC41LTQ3LjgzMyA2LjMzMy02My41IDcuNXYtNGMxMS41IDAgNTIuNS01LjUgNjMuNS03LjV6bTAtOC4yMzJjOC44LTEuNiAxMi4zMzMtLjMzMyAxMyAuNXYzLjVjLTEuNi0xLjYtOS4zMzMtLjY2Ny0xMyAwLTIwLjUgNC41LTQ3LjgzMyA2LjMzMy02My41IDcuNXYtNGMxNC41IDEgNTIuNS01LjUgNjMuNS03LjV6bTAtOC4yMzJjOC44LTEuNiAxMi4zMzMtLjMzNCAxMyAuNXYzLjVjLTEuNi0xLjYtOS4zMzMtLjY2OC0xMyAwLTIwLjUgNC41LTQ3LjgzMyA2LjMzMi02My41IDcuNXYtNGMxNC41IDEgNTIuNS01LjUgNjMuNS03LjV6bTAtOC4yMzNjOC44LTEuNiAxMi4zMzMtLjMzMyAxMyAuNXYzLjVjLTEuNi0xLjYtOS4zMzMtLjY2Ny0xMyAwLTIwLjUgNC41LTQ3LjgzMyA2LjMzMy02My41IDcuNXYtNGMxNC41IDEgNTIuNS01LjUgNjMuNS03LjV6bTAtOC4yMzNjOC44LTEuNiAxMi4zMzMtLjMzMyAxMyAuNXYzLjVjLTEuNi0xLjYtOS4zMzMtLjY2Ni0xMyAwLTIwLjUgNC41LTQ3LjgzMyA2LjMzNC02My41IDcuNXYtNGMxNC41IDEgNTIuNS01LjUgNjMuNS03LjV6bTAtOC4yMzJjOC44LTEuNiAxMi4zMzMtLjMzMyAxMyAuNXYzLjVjLTEuNi0xLjYtOS4zMzMtLjY2Ny0xMyAwLTIwLjUgNC41LTQ3LjgzMyA2LjMzMy02My41IDcuNXYtNGMxNC41IDEgNTIuNS01LjUgNjMuNS03LjV6IiBmaWxsPSIjZmZmIi8+PHBhdGggZD0ibTI4LjU5MyA3MS41NGEyMDQuMTEyIDIwNC4xMTIgMCAwIDAgNy4wNjYtLjM3NiAyNTEuNzQ1IDI1MS43NDUgMCAwIDAgNi43MDYtLjU3MmMxLjEzLS4xMDkgMi4yNy0uMjIyIDMuNDQ1LS4zNSAxLjE3LS4xMjYgMi4zNjgtLjI1OCAzLjYxMi0uNDEyIDEuMjQzLS4xNSAyLjUzNi0uMzEzIDMuODg5LS40OSAxLjM1Mi0uMTczIDIuNzYzLS4zNzIgNC4yMzgtLjU5di0yNy41M2MtMTAuNTMyIDEuNTU2LTIyLjMxNyAyLjg3Mi0zNC4yMjkgMi45NThhMi44NjMgMi44NjMgMCAwIDAgLTIuODYzIDIuODY0djI0LjY1M2MxLjQ4NCAwIDIuODk1LS4wMTggNC4yNDctLjA1IDEuMzUzLS4wMTggMi42NDYtLjA2IDMuODktLjEwNXoiIGZpbGw9IiMxYTNhYjkiLz48cGF0aCBkPSJtMjMuMDUzIDQ2LjQ4IDEuMjIxIDEuODYzLTIuMjIzLjEyNiAxLjAwMi0xLjk4OHptNS4xMzUtLjI5IDEuMjIgMS44NjItMi4yMjIuMTI2em01LjEzNS0uMjkyIDEuMjIgMS44NjItMi4yMjMuMTI2em01LjEzNS0uMjkxIDEuMjIgMS44NjItMi4yMjMuMTI2em01LjEzNC0uMjkyIDEuMjIxIDEuODYyLTIuMjIzLjEyNnptNS4xMzUtLjI5MSAxLjIyMSAxLjg2Mi0yLjIyMy4xMjZ6bTUuMTMzLS4yOTIgMS4yMiAxLjg2Mi0yLjIyMi4xMjZ6bS0yOC4wNDcgNS4wMjYgMS4yMiAxLjg2Mi0yLjIyMi4xMjd6bTUuMTM1LS4yOTEgMS4yMiAxLjg2My0yLjIyMy4xMjZ6bTUuMTM1LS4yOTIgMS4yMiAxLjg2My0yLjIyMy4xMjZ6bTUuMTM0LS4yOTEgMS4yMjEgMS44NjItMi4yMjMuMTI3em01LjEzNS0uMjkyIDEuMjIxIDEuODYzLTIuMjIzLjEyNnptNS4xMzUtLjI5MSAxLjIyIDEuODYyLTIuMjIzLjEyN3ptLTI4LjA0NyA1LjAyNiAxLjIyIDEuODYyLTIuMjIzLjEyNnptNS4xMzUtLjI5MiAxLjIyIDEuODYzLTIuMjIzLjEyNnptNS4xMzUtLjI5MiAxLjIyIDEuODYzLTIuMjIzLjEyNiAxLjAwMi0xLjk4OXptNS4xMzQtLjI5IDEuMjIxIDEuODYyLTIuMjIzLjEyNiAxLjAwMi0xLjk4OXptNS4xMzUtLjI5MyAxLjIyIDEuODYzLTIuMjIyLjEyNnptNS4xMzUtLjI5IDEuMjIgMS44NjItMi4yMjMuMTI2em01LjEzMi0uMjkyIDEuMjIxIDEuODYyLTIuMjIzLjEyNiAxLjAwMi0xLjk4OXptLTI4LjA0MiA1LjAyNiAxLjIyIDEuODYyLTIuMjIzLjEyNyAxLjAwMy0xLjk5em01LjEzNC0uMjkxIDEuMjIxIDEuODYyLTIuMjIzLjEyNnptNS4xMzUtLjI5MyAxLjIyMSAxLjg2My0yLjIyMy4xMjd6bTUuMTM1LS4yOSAxLjIyIDEuODYyLTIuMjIzLjEyNnptNS4xMzUtLjI5MiAxLjIyIDEuODYyLTIuMjIzLjEyNnptNS4xMzQtLjI5MSAxLjIyMSAxLjg2Mi0yLjIyMy4xMjZ6bS0yOC4wNDggNS4wMjYgMS4yMiAxLjg2My0yLjIyMy4xMjZ6bTUuMTM0LS4yOTEgMS4yMjEgMS44NjMtMi4yMjMuMTI2em01LjEzNS0uMjkyIDEuMjIxIDEuODYzLTIuMjIzLjEyNnptNS4xMzUtLjI5IDEuMjIgMS44NjItMi4yMjMuMTI2IDEuMDAzLTEuOTg5em01LjEzNS0uMjkzIDEuMjIgMS44NjMtMi4yMjMuMTI2em01LjEzNC0uMjkxIDEuMjIxIDEuODYyLTIuMjIzLjEyN3ptNS4xMzMtLjI5MiAxLjIyMSAxLjg2My0yLjIyMy4xMjZ6bS0zMC42NTUgOS4wNDEgMS4yMjIgMS44NjMtMi4yMjMuMTI2IDEuMDAyLTEuOTg5em01LjEzNi0uMjkxIDEuMjIgMS44NjMtMi4yMjMuMTI2em01LjEzNC0uMjkyIDEuMjIxIDEuODYzLTIuMjIzLjEyNnptNS4xMzUtLjI5MSAxLjIyMSAxLjg2My0yLjIyMy4xMjZ6bTUuMTM1LS4yOTEgMS4yMjEgMS44NjItMi4yMjMuMTI2IDEuMDAyLTEuOTg5em01LjEzNS0uMjkyIDEuMjIgMS44NjMtMi4yMjMuMTI2em01LjEzMy0uMjkyIDEuMjIgMS44NjMtMi4yMjMuMTI2em0tMjguMTk2LTIuMjY2IDEuMjIxIDEuODYzLTIuMjIzLjEyNiAxLjAwMi0xLjk4OHptNS4xMzUtLjI5IDEuMjIxIDEuODYyLTIuMjIzLjEyNnptNS4xMzUtLjI5MiAxLjIyIDEuODYyLTIuMjIzLjEyNnptNS4xMzQtLjI5MSAxLjIyMSAxLjg2Mi0yLjIyMy4xMjZ6bTUuMTM1LS4yOTIgMS4yMjEgMS44NjItMi4yMjMuMTI2em01LjEzNS0uMjkyIDEuMjIxIDEuODYzLTIuMjIzLjEyNnoiIGZpbGw9IiNmZmYiLz48L3N2Zz4=',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'ust.token.a11bd.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Celo',\n symbol: 'CELO',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHdpZHRoPSIxMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxjbGlwUGF0aCBpZD0iYSI+PHBhdGggZD0ibTAgMGgxMDB2MTAwaC0xMDB6Ii8+PC9jbGlwUGF0aD48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxwYXRoIGQ9Im01MCAwYzkuODg5MSAwIDE5LjU1NjEgMi45MzI0NSAyNy43Nzg1IDguNDI2NTIgOC4yMjI1IDUuNDk0MDggMTQuNjMxMSAxMy4zMDI5OCAxOC40MTU1IDIyLjQzOTI4czQuNzc1IDE5LjE4OTcgMi44NDUzIDI4Ljg4ODdjLTEuOTI5MyA5LjY5OTEtNi42OTEzIDE4LjYwODItMTMuNjg0IDI1LjYwMDgtNi45OTI2IDYuOTkyNy0xNS45MDE3IDExLjc1NDctMjUuNjAwOCAxMy42ODQtOS42OTkgMS45Mjk3LTE5Ljc1MjQuOTM5MS0yOC44ODg3LTIuODQ1M3MtMTYuOTQ1Mi0xMC4xOTMtMjIuNDM5MjgtMTguNDE1NWMtNS40OTQwNy04LjIyMjQtOC40MjY1Mi0xNy44ODk0LTguNDI2NTItMjcuNzc4NSAwLTEzLjI2MDggNS4yNjc4NC0yNS45Nzg1IDE0LjY0NDctMzUuMzU1MyA5LjM3NjgtOS4zNzY4NiAyMi4wOTQ1LTE0LjY0NDcgMzUuMzU1My0xNC42NDQ3eiIgZmlsbD0iI2ZiY2M1YyIvPjxnIGZpbGw9IiNmZmYiPjxwYXRoIGQ9Im00My41NDIxIDczLjcyNDljMy40MDg1LjAwODMgNi43NDI5LS45OTQ4IDkuNTgxMS0yLjg4MjUgMi44MzgxLTEuODg3NiA1LjA1MjQtNC41NzQ4IDYuMzYyNi03LjcyMTVzMS42NTczLTYuNjExNC45OTc1LTkuOTU1NWMtLjY1OTktMy4zNDQtMi4yOTcxLTYuNDE3Mi00LjcwNDMtOC44MzAzLTIuNDA3My0yLjQxMzItNS40NzY0LTQuMDU3OS04LjgxODktNC43MjU5LTMuMzQyNC0uNjY4MS02LjgwNzktLjMyOTQtOS45NTc4Ljk3My0zLjE0OTkgMS4zMDI1LTUuODQyNSAzLjUxMDItNy43MzcxIDYuMzQzOC0xLjg5NDYgMi44MzM1LTIuOTA1OSA2LjE2NTQtMi45MDU5IDkuNTc0IDAgNC41NjEgMS44MDkgOC45MzU5IDUuMDMwMiAxMi4xNjQ5IDMuMjIxMiAzLjIyOTEgNy41OTE2IDUuMDQ4OCAxMi4xNTI2IDUuMDZ6bTAgNi4yNzUxYy00LjY0OTYuMDA4My05LjE5NzMtMS4zNjI5LTEzLjA2NzMtMy45NC0zLjg3MDEtMi41NzcyLTYuODg4Ny02LjI0NDQtOC42NzM4LTEwLjUzNzgtMS43ODUyLTQuMjkzMy0yLjI1NjYtOS4wMTk3LTEuMzU0Ni0xMy41ODFzMy4xMzY5LTguNzUyNSA2LjQyMTctMTIuMDQzM2MzLjI4NDgtMy4yOTA3IDcuNDcyMS01LjUzMzEgMTIuMDMxOC02LjQ0MzMgNC41NTk3LS45MTAxIDkuMjg2OS0uNDQ3MiAxMy41ODM0IDEuMzMwMnM3Ljk2OTIgNC43ODk0IDEwLjU1MzMgOC42NTQ5YzIuNTg0IDMuODY1NSAzLjk2MzQgOC40MTA2IDMuOTYzNCAxMy4wNjAzLjAwNTUgMy4wODQtLjU5NzIgNi4xMzg5LTEuNzczNiA4Ljk4OTgtMS4xNzYzIDIuODUwOS0yLjkwMzQgNS40NDE5LTUuMDgyMiA3LjYyNDZzLTQuNzY2NiAzLjkxNDQtNy42MTU0IDUuMDk1OS01LjkwMjYgMS43ODk3LTguOTg2NyAxLjc4OTd6Ii8+PHBhdGggZD0ibTU2LjUgNjAuNzI0OWMzLjQwODYuMDA4MyA2Ljc0MjktLjk5NDggOS41ODExLTIuODgyNHM1LjA1MjUtNC41NzQ5IDYuMzYyNi03LjcyMTZjMS4zMTAyLTMuMTQ2NyAxLjY1NzMtNi42MTEzLjk5NzUtOS45NTU0LS42NTk5LTMuMzQ0MS0yLjI5NzEtNi40MTcyLTQuNzA0My04LjgzMDQtMi40MDczLTIuNDEzMS01LjQ3NjQtNC4wNTc4LTguODE4OC00LjcyNTktMy4zNDI1LS42NjgtNi44MDgtLjMyOTQtOS45NTc5Ljk3MzEtMy4xNDk5IDEuMzAyNC01Ljg0MjUgMy41MTAyLTcuNzM3MSA2LjM0MzdzLTIuOTA1OSA2LjE2NTQtMi45MDU5IDkuNTc0YzAgNC41NjEgMS44MDkgOC45MzU5IDUuMDMwMiAxMi4xNjVzNy41OTE2IDUuMDQ4OCAxMi4xNTI2IDUuMDU5OXptMCA2LjI3NTFjLTQuNjQ3OSAwLTkuMTkxMy0xLjM3ODItMTMuMDU1OS0zLjk2MDUtMy44NjQ1LTIuNTgyMi02Ljg3NjYtNi4yNTI0LTguNjU1My0xMC41NDY0LTEuNzc4Ni00LjI5NDEtMi4yNDQtOS4wMTkyLTEuMzM3Mi0xMy41Nzc3LjkwNjctNC41NTg2IDMuMTQ0OS04Ljc0NTkgNi40MzE0LTEyLjAzMjRzNy40NzM4LTUuNTI0NyAxMi4wMzI0LTYuNDMxNGM0LjU1ODUtLjkwNjggOS4yODM2LS40NDE0IDEzLjU3NzcgMS4zMzcyIDQuMjk0IDEuNzc4NyA3Ljk2NDIgNC43OTA4IDEwLjU0NjQgOC42NTUzIDIuNTgyMiAzLjg2NDYgMy45NjA1IDguNDA4IDMuOTYwNSAxMy4wNTU5LS4wMTExIDYuMjI5Mi0yLjQ5MDYgMTIuMi02Ljg5NTMgMTYuNjA0N3MtMTAuMzc1NSA2Ljg4NDItMTYuNjA0NyA2Ljg5NTN6Ii8+PHBhdGggZD0ibTU3LjY4ODkgNjcuODU3MWMxLjYyMzQtMS45NzM4IDIuNzg2LTQuMjg0OCAzLjQwMzQtNi43NjQ3IDIuNDczNy0uNjM0MSA0Ljc4MTItMS43OTUgNi43NjQ3LTMuNDAzNC0uMDk4MyAyLjg5MDUtLjcyNDkgNS43Mzg2LTEuODQ4NyA4LjQwMzQtMi42NDQxIDEuMDg1MS01LjQ2MjUgMS42ODMtOC4zMTk0IDEuNzY0N3ptLTE3LjQzNy0yNy42MDVjLTIuNDM1NC42MzQ2LTQuNzAxNiAxLjc5NjQtNi42Mzg2IDMuNDAzMy4wNzI1LTIuODkzNi43MDAxLTUuNzQ2NCAxLjg0ODctOC40MDMzIDIuNjU4NS0xLjE0MzcgNS41MTA0LTEuNzcxMSA4LjQwMzQtMS44NDg4LTEuNjIzNCAxLjk3MzgtMi43ODYgNC4yODQ4LTMuNDAzNCA2Ljc2NDd6Ii8+PC9nPjwvZz48L3N2Zz4=',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'celo.token.a11bd.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Celo Dollar',\n symbol: 'cUSD',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHdpZHRoPSIxMDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTEwMCA1MGMwLTI3LjYxNDItMjIuMzg1OC01MC01MC01MHMtNTAgMjIuMzg1OC01MCA1MCAyMi4zODU4IDUwIDUwIDUwIDUwLTIyLjM4NTggNTAtNTB6IiBmaWxsPSIjNDVjZDg1Ii8+PGcgZmlsbD0iI2ZmZiI+PHBhdGggZD0ibTY5Ljg4MDUgNjIuNjQzOGMtMS41NjcxIDMuMzkzMS0zLjkzNzUgNi4zNTMyLTYuOTA2MSA4LjYyNDEtMi45Njg1IDIuMjcwOC02LjQ0NTggMy43ODQxLTEwLjEzMDcgNC40MDg3LTMuNjg1LjYyNDYtNy40NjY3LjM0MTctMTEuMDE3Ny0uODI0MS0zLjU1MTEtMS4xNjU4LTYuNzY0Ni0zLjE3OTQtOS4zNjIzLTUuODY2Ni0yLjU5NzgtMi42ODcxLTQuNTAxNS01Ljk2NjktNS41NDY1LTkuNTU1NC0xLjA0NDktMy41ODg1LTEuMTk5Ni03LjM3NzUtLjQ1MDctMTEuMDM5My43NDg5LTMuNjYxNyAyLjM3ODktNy4wODU3IDQuNzQ4OS05Ljk3NTggMi4zNzAxLTIuODkgNS40MDg3LTUuMTU4OSA4Ljg1MjktNi42MTAzbDIuMjY2OCA1LjM3OTJjLTIuNTcgMS4wODMxLTQuODM3NSAyLjc3NjEtNi42MDYgNC45MzI3LTEuNzY4NSAyLjE1NjUtMi45ODQ4IDQuNzExNS0zLjU0MzYgNy40NDM5LS41NTg5IDIuNzMyNC0uNDQzNSA1LjU1OTguMzM2MyA4LjIzNzYuNzc5OCAyLjY3NzcgMi4yMDAzIDUuMTI1MSA0LjEzODggNy4xMzAyIDEuOTM4NCAyLjAwNTIgNC4zMzYzIDMuNTA3OCA2Ljk4NjEgNC4zNzc3czUuNDcxNyAxLjA4MSA4LjIyMTUuNjE0OWMyLjc0OTctLjQ2NjEgNS4zNDQ0LTEuNTk1MyA3LjU1OTUtMy4yODk4IDIuMjE1Mi0xLjY5NDUgMy45ODQtMy45MDMzIDUuMTUzNC02LjQzNTNsNS45MTg5LjMwNDJ6Ii8+PHBhdGggZD0ibTU2LjEwNjEgMjQuNXYtNGg0LjUwMDV2NGMyIDAgNS4xNjY3LjY2NjcgNi41IDF2NC41Yy0xOS0zLTE1LjUwMTEgMy44NDYyLTggNSA2LjcyMTcgMS4wMzM5IDExIDIgMTEuNSA5IC40IDUuNi01LjgzMzMgNy42NjY3LTkgOHYzLjVoLTV2LTMuNWMtMi40IDAtNi42NjY3LTEuNjY2Ny04LjUtMi41di01LjVjNC41IDIuNSAxNyA0LjUgMTcgMHMtMTYuNTAxMS0zLTE4LjAwMDUtMTFjLTEuMDAyMy01LjM0NzUgNS4zMzMzLTcuODMzMyA5LTguNXoiLz48L2c+PC9zdmc+',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'cusd.token.a11bd.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'ABR',\n symbol: 'ABR',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjEyMSIgdmlld0JveD0iMCAwIDEyMSAxMjEiIHdpZHRoPSIxMjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj48Y2lyY2xlIGN4PSI2MC41IiBjeT0iNjAuNSIgZmlsbD0iIzBlMGIwZiIgZmlsbC1ydWxlPSJub256ZXJvIiByPSI2MC41Ii8+PGNpcmNsZSBjeD0iNjAuNSIgY3k9IjYwLjUiIHI9IjYwIiBzdHJva2U9IiMyZDJjMmUiIHN0cm9rZS1vcGFjaXR5PSIuODEiLz48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iPjxwYXRoIGQ9Im04MS4xNjg3IDUyLjIxNDctMTEuNjUzLTExLjY1MjloLTE3LjY1NTlsLTUuNjQ5MyA1LjY0OTl2LTIwLjEyNzdoLTYuMDAzN3YzNS42NjQ4IDcuNzY4NmwxMS42NTMgMTEuNjUyOWgxNy42NTU5bDUuNjUwMi01LjY0OTl2MjAuMTI3N2g2LjM1NjN2LTMzLjU0NjJ6bS0xNC40NzgxIDIyLjk1MjZoLTExLjY1MjJsLTguNDc1My04LjQ3NDh2LTQuOTQzNy02LjcwOTJsOC40NzUzLTguNDc0OGgxMS42NTIybDguNDc1MyA4LjQ3NDh2Ny40MTU1IDQuMjM3NHoiIGZpbGw9IiNmZmYiLz48cGF0aCBkPSJtMzEuNzMzNCA3Mi42OTUydi0zMi4xMzM3aC02LjAwMjh2MzQuOTU4NmwyMC40ODEgMjAuNDgwOGgyMC40ODAxdi02LjAwM2gtMTcuNjU1OXoiIGZpbGw9IiM2ZGQiLz48cGF0aCBkPSJtNTUuMDM4OCAyNS43MzA1djYuMDAzaDE3LjY1NTlsMTcuMzAyNCAxNy4zMDI3djMyLjEzMzdoNi4wMDI4di0zNC45NTg2bC0yMC40ODEtMjAuNDgwOHoiIGZpbGw9IiM2ZGQiLz48L2c+PC9nPjwvc3ZnPg==',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'abr.a11bd.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Utopia',\n symbol: 'UTO',\n icon:\n \"data:image/svg+xml,%3Csvg id='Layer_1' data-name='Layer 1' xmlns='http://www.w3.org/2000/svg' viewBox='-40 -40 600 600'%3E%3Cdefs%3E%3Cstyle%3E .cls-1%7Bfill:%239f9f9f%7D.cls-2%7Bfill:%23fefefe%7D.cls-4%7Bfill:%23030303%7D %3C/style%3E%3C/defs%3E%3Cpath d='M371.65 15v23.92l-.47.71C368.82 41.48 366 41 363.36 41q-36.94.09-73.88 0h-176c-3.06 0-6.31.67-9.1-1.37l-.47-.71V15ZM55.21 355.33H31.66a2.81 2.81 0 0 1-.26-.3.82.82 0 0 1-.13-.37v-24H6.67V136.41h24.6l.69.44c2 2.64 1.38 5.75 1.39 8.67q.07 73.11 0 146.2c0 12.44.26 12.68 12.64 12.76 3 0 6-.29 8.85 1a3 3 0 0 1 1.23 1.1 12.38 12.38 0 0 1 1.18 6.17q.1 18 0 36.05c0 2.09.17 4.28-1.36 6.06ZM420.4 452.82v23.51c-3.87.66-178.64.93-195 .29v-23.8l.47-.71c2.79-2 6-1.37 9.1-1.37q75.33-.09 150.68 0c9.25 0 18.49-.06 27.74 0 2.25 0 4.6-.25 6.54 1.37ZM176.66 428H128v-23.83H79.16v-24.9l.39-.66c1.9-1.69 4.27-1.4 6.51-1.42 10.55-.08 21.09 0 31.63-.05 6.6-.05 7.89-1.5 8.12-8.1.16-4.52-.77-9.14 1.06-13.53a2.94 2.94 0 0 1 1.1-1.14 58.19 58.19 0 0 1 24.44-.12 3 3 0 0 1 1.2 1.07c1.29 2.36 1.19 4.95 1.2 7.5v30.75c.05 6.74 1.61 8.24 8.36 8.37 3.7.08 7.41-.1 11.1.23 2.23.2 3.9 1.14 4.1 3.54a107.23 107.23 0 0 1-.06 20 3.93 3.93 0 0 1-1 1.85c-.2.17-.43.31-.65.44Z'/%3E%3Cpath d='M225.4 452.82h-48.74V428c1.46-1.94 3.61-2 5.74-2.06 6.36-.1 12.72-.14 19.08.09 6.33-.23 12.67-.21 19-.07 1.93 0 4-.19 5.56 1.42 2.71 7.57 1.34 15.33 1 23-.04 1.09-.97 1.72-1.64 2.44ZM31.27 136.41V87.67h23.94l.7.45c1.36 1.51 1.34 3.39 1.35 5.22q.18 18.9 0 37.8a11.41 11.41 0 0 1-1 5 3.12 3.12 0 0 1-1.12 1.24c-7.1 2.15-14.32 1.17-21.51.74-1.03-.12-1.63-1.04-2.36-1.71Z'/%3E%3Cpath d='M55.21 87.67v-24.8h23.95l.69.44a3.53 3.53 0 0 1 1 1.84c.36 7.46 1.36 14.94-.69 22.33A3 3 0 0 1 79 88.65c-7.08 2-14.25 1.13-21.4.67-1.07-.06-1.67-.99-2.39-1.65ZM469.14 404.07V428h-24.8l-.71-.47a5.34 5.34 0 0 1-1.24-3.54q-.37-8.07 0-16.15a7 7 0 0 1 1.61-4.3 8.54 8.54 0 0 1 5.24-1.52c5-.13 10-.14 15 0 1.86.09 3.65.41 4.9 2.05Z'/%3E%3Cpath d='M79.16 62.87V38.92H104c.79.8 1.71 1.56 1.76 2.78.29 7 1.2 14-.69 20.86a3 3 0 0 1-1.13 1.23C96.52 66 89 64.92 81.56 64.53c-1.07-.06-1.68-1-2.4-1.66ZM444.34 428v24.8H420.4c-.67-.72-1.62-1.34-1.66-2.38-.33-7.7-1.67-15.44 1-23 1.15-1.33 2.78-1.33 4.32-1.4 5.11-.22 10.23-.18 15.35 0 1.9.03 3.68.36 4.93 1.98ZM79.16 379.27H55.21v-23.94c.52-.48.95-1.21 1.63-1.34a70.78 70.78 0 0 1 21.55-.16c1.55.19 2.36 1.57 2.5 3.09a109.82 109.82 0 0 1 0 19.53 4.76 4.76 0 0 1-1.73 2.82ZM444.34 111.61h24.8v73.54c-1.36 1.8-3.33 2-5.35 2-5 .13-9.94.18-14.9 0-5.5-.2-6.49-1.05-6.55-6.57-.18-14.62-.28-29.24.06-43.86-.24-6.35-.22-12.7-.12-19.06 0-2-.09-4 1.36-5.63ZM395.59 62.87h24.81v24.8c-.15.23-.3.46-.44.69a3.62 3.62 0 0 1-1.84 1c-7.43.4-14.88 1.3-22.25-.61a3 3 0 0 1-1.2-1.1c-1.72-8.12-2.21-16.24.23-24.32Z'/%3E%3Cpath d='M420.4 87.67h23.94v23.94c-.79.79-1.55 1.71-2.77 1.76-7 .29-14 1.2-20.87-.69a3.11 3.11 0 0 1-1.23-1.13c-2.14-7.1-1.16-14.3-.74-21.49.07-1.06 1-1.67 1.67-2.39ZM371.65 38.92h23.94v23.95c-.79.79-1.55 1.7-2.77 1.75-7 .3-14 1.2-20.87-.68a3.18 3.18 0 0 1-1.23-1.13c-2.13-7.1-1.16-14.31-.73-21.49.06-1.07 1.01-1.67 1.66-2.4Z'/%3E%3Cpath class='cls-1' d='M371.65 38.92v23.95c-.9 1.57-2.44 1.81-4 2-1.85.17-3.7.15-5.55.15q-124.27 0-248.55-.06c-3.25 0-6.93 1.15-9.57-2.05V38.92Z'/%3E%3Cpath class='cls-2' d='M104 62.87h267.65c1.92 1.47 2 3.6 2.07 5.74.1 3.68-.12 7.36.14 11 .28 4.05 1.77 5.54 5.81 5.83 3.53.25 7.07 0 10.6.14 2 .07 4 .3 5.32 2.07 1.93 1.47 2 3.6 2.08 5.74.11 3.53-.09 7.07.15 10.6.23 3.35 2 5.16 5.38 5.38 3.82.24 7.64 0 11.45.15 2.15.06 4.28.15 5.75 2.07 1.92 1.47 2 3.6 2.07 5.75.1 3.67-.12 7.35.13 11 .28 4 1.78 5.54 5.82 5.83 3.53.25 7.07 0 10.6.14 2 .06 4 .29 5.32 2.06v48.74h24.8v72.69c-1.25 1.62-3 2-4.92 2-3 .11-6 .06-9 .08-7.41.08-8.77 1.36-8.79 8.67-.05 14.34 0 28.68 0 43 0 3.27-.09 6.54 0 9.8.21 5.2 1.79 6.74 7.07 6.93 3.4.12 6.81 0 10.22.09 2 .06 4 .29 5.35 2.06v24.8c-1.45 1.93-3.59 2-5.71 2.05-6.32.1-12.64.16-19-.11-8 .24-16 .29-24 0-6.61.26-13.22.21-19.84.11a11 11 0 0 1-4.52-.85 3.53 3.53 0 0 1-1.28-.81c-1.44-2.28-1.36-4.85-1.38-7.4 0-3.11.09-6.23-.06-9.34-.22-4.62-1.65-6.06-6.2-6.29a67.32 67.32 0 0 0-7.65 0c-4.07.28-5.5 1.71-5.74 5.85-.22 3.68 0 7.37-.11 11.05-.06 2.4-.11 4.83-1.82 6.81-4.08 1.73-8.36.85-12.56 1s-8.19.09-12.28-.15c-6.36.26-12.72.22-19.08.12a11 11 0 0 1-4.54-.85 3.47 3.47 0 0 1-1.28-.82c-1.36-2.15-1.35-4.57-1.37-7 0-3.26.09-6.53-.07-9.79-.22-4.59-1.67-6-6.26-6.25-2.4-.12-4.82-.09-7.23 0-5.4.14-6.83 1.53-7 6.83-.11 3.54 0 7.09-.08 10.63-.07 2.27-.19 4.55-1.89 6.36-2.12 1.1-4.43.92-6.69.92q-29.41.09-58.84 0c-2.41 0-4.85.08-7.08-1.09-2.15-1.51-2.23-3.84-2.31-6.12-.14-3.56 0-7.12-.09-10.68-.17-5.33-1.6-6.72-7-6.86-2.13-.06-4.27-.09-6.41 0-4.58.25-6 1.68-6.19 6.35-.18 5.55.05 11.11-.27 16.67.34 6.24.22 12.48.14 18.72a11 11 0 0 1-1 4.55 2.94 2.94 0 0 1-1 1.19c-7.82 2.28-15.77 1.2-23.67.74-2.42-.14-2.95-2.34-3.11-4.45-.3-4 0-8-.22-11.93-.23-5.19-1.87-6.82-7-7-3.12-.14-6.25 0-9.38-.11-2-.07-4-.27-5.36-2.05-1.78-1.35-2-3.28-2.07-5.32-.09-3.82.1-7.65-.12-11.46-.24-4.14-1.67-5.57-5.75-5.83a69.87 69.87 0 0 0-8.92 0c-4.09.26-5.51 1.69-5.75 5.83-.23 3.81 0 7.64-.12 11.46 0 2-.29 4-2.07 5.32-.52.48-1 1.22-1.62 1.35a70.79 70.79 0 0 1-21.6.17c-2.15-.26-2.53-2.44-2.67-4.35-.32-4.26 0-8.53-.23-12.78-.22-5.2-1.85-6.83-7-7-4.26-.17-8.52 0-12.78-.2-3.1-.17-4.62-1.69-4.78-4.79-.22-4 0-8-.21-11.93-.23-5.18-1.86-6.8-7-7-3.12-.14-6.25 0-9.38-.11-2-.07-4-.28-5.36-2.05a5.39 5.39 0 0 1-2-4.1c-.09-1.71-.14-3.41-.14-5.12V145.58c0-3.16-.87-6.66 2.07-9.22 1.37-1.78 3.35-2 5.37-2 3.14-.11 6.27 0 9.4-.11 5.22-.22 6.91-1.8 7-7 .18-10.54 0-21.07.1-31.61 0-2.78-.52-5.79 2.08-7.93 1.47-1.93 3.6-2 5.74-2.08 3.68-.1 7.36.13 11-.13 4-.29 5.54-1.78 5.82-5.83.26-3.66 0-7.34.14-11 .15-2.2.21-4.33 2.21-5.8ZM469.14 404.07h-24.8l-.71-.47a5.84 5.84 0 0 1-1.28-3.92c-.19-5.76-.23-11.51 0-17.26.07-1.4.18-2.84 1.39-3.84 7.57-2.59 15.3-1.31 23-1 1 0 1.66 1 2.37 1.65Z'/%3E%3Cpath class='cls-1' d='M469.14 379.27h-24.8c-1.66-.8-1.87-2.36-1.95-3.92-.26-5.33-.25-10.66 0-16a5.23 5.23 0 0 1 1.95-4h24.8Z'/%3E%3Cpath d='M469.14 330.53h-24.36c-.65-3.68-.88-58.4-.29-72.69h24.65Z'/%3E%3Cpath class='cls-1' d='M55.21 136.41v170.18H31.72a2.76 2.76 0 0 1-.3-.29.64.64 0 0 1-.15-.36V136.41Z'/%3E%3Cpath d='M55.21 306.59H78.7a1.67 1.67 0 0 1 .31.28.73.73 0 0 1 .14.36v23.15h24.21a4.48 4.48 0 0 1 .45.45.8.8 0 0 1 .14.36v24.14h24v23.94H79.16v-23.94H55.21Z' fill='%23a1a1a1'/%3E%3Cpath class='cls-1' d='M420.4 428v24.8h-195V428c.7-1.53 2.11-1.78 3.55-1.94a48.57 48.57 0 0 1 5.12-.17h177.66c2.95.11 6.36-.98 8.67 2.11ZM152.71 355.33h23.49a1.72 1.72 0 0 1 .31.29.7.7 0 0 1 .14.36v23.29h24.8c2 1.24 2 3.31 2 5.26q.24 19.08 0 38.16c0 2-.25 4-2 5.33h-24.8v-23.5a1.7 1.7 0 0 0-.3-.3.62.62 0 0 0-.36-.14h-23.28Z'/%3E%3Cpath class='cls-1' d='M127.91 355.33V331a1.64 1.64 0 0 1 .29-.3.62.62 0 0 1 .36-.14h24.15v24.8Z'/%3E%3Cpath class='cls-2' d='M201.46 428v-48.73c1.48-1.95 3.64-2 5.79-2 6-.09 11.95-.17 17.92.12 7-.27 14-.31 20.93-.08 5.06.17 5.88 1.07 6.13 6.13.21 4-.06 8 .17 12 .27 4.69 1.92 6.25 6.65 6.56 11.72.77 13-.4 13-12.27 0-12.46 0-12.47 12.37-12.48h30.76c2.41 0 4.86-.13 7.15.88a3.53 3.53 0 0 1 1.27.77c2.32 4.12 1.32 8.63 1.39 13 .15 9.66.55 10.16 10.16 10.16h.85c7.68 0 8.7-1 8.75-8.55v-8.54a11.49 11.49 0 0 1 1.24-5.78 3 3 0 0 1 1.23-1 13.24 13.24 0 0 1 5.42-.92c14.31 0 28.63-.21 42.94.11 6.25-.24 12.51-.16 18.76-.12a14.32 14.32 0 0 1 6.23 1.14c1.93 1.13 1.76 3.1 1.84 4.9.2 4 0 7.93.14 11.88.2 5 1.73 6.58 6.68 6.8 3.26.15 6.51 0 9.77.1 2 .07 4 .29 5.33 2.06V428H201.46Z'/%3E%3Cpath class='cls-1' d='M79.16 87.67v48.74H55.21V87.67ZM104 62.87v24.8H79.16v-24.8ZM444.34 136.41H420.4v-24.8h23.94ZM395.59 87.67h-23.94v-24.8h23.94ZM420.4 111.61h-24.81V87.67h24.81Z'/%3E%3Cpath d='M322.9 379.27h-48.27a2.07 2.07 0 0 0-.31.27.68.68 0 0 0-.16.36v24h-23.67c.06.06-.06 0-.14-.14a.7.7 0 0 1-.14-.36v-24.15H225.4c-.46-.52-1.24-.92-1.33-1.59-.92-7.32-1.93-14.66.63-21.89l.7-.46h72.7c4-3.06 20.75-3.06 24.8 0 3.1 4.03 3.1 20.08 0 23.96ZM274.15 257.84H225.4V209.1c1.37-1.8 3.35-2 5.37-2q19-.19 38 0c2 0 4 .24 5.37 2 1.8 1.36 2 3.34 2 5.37q.19 19 0 38c.03 2.03-.14 4.01-1.99 5.37ZM395.59 257.84h-48.74V209.1c1.36-1.8 3.34-2 5.36-2q19-.19 38 0c2 0 4 .24 5.37 2 1.81 1.36 2 3.34 2 5.37q.21 19 0 38c.03 2.03-.18 4.01-1.99 5.37Z'/%3E%3Cpath class='cls-1' d='M395.59 257.84V209.1H420c.64 3.58.85 35.66.29 48.74Z'/%3E%3Cpath d='M444.34 404.07H420.4v-24.8c-3-4-3-19.92 0-23.94h23.94v48.74ZM395.59 379.27h-48.74c-.36-.45 0 .24-.35-.23-2.73-3.92-2.49-20 .35-23.71h24.8c4-3 19.93-3 23.94 0 3.04 4.02 3.04 19.93 0 23.94Z'/%3E%3Cpath class='cls-1' d='M274.15 209.1H225.4v-23.5c3.58-.64 35.65-.85 48.75-.3ZM395.59 209.1h-48.74v-23.5c3.58-.64 35.65-.85 48.74-.3ZM274.15 257.84V209.1h23.5c.64 3.58.85 35.65.3 48.74ZM322.9 355.33h-24.8V331a1.64 1.64 0 0 1 .29-.3.62.62 0 0 1 .36-.14h24.15ZM395.59 355.33h-23.94V331a1.64 1.64 0 0 1 .29-.3.62.62 0 0 1 .36-.14h23.29Z'/%3E%3Cpath d='M201.46 355.33V331a1.64 1.64 0 0 1 .29-.3.62.62 0 0 1 .36-.14h23.29v24.8c-4.01 3-19.93 3-23.94-.03Z'/%3E%3Cpath class='cls-1' d='M127.78 136.53v23.73h-23.64v-23.73ZM346.85 355.33v23.94c-4 3-19.93 3-24 0v-23.94ZM152.83 111.49V87.76h23.64v23.73Z'/%3E%3Cpath d='M322.9 379.27h24v24.35a2.07 2.07 0 0 1-.29.3.67.67 0 0 1-.37.15H322.9Z'/%3E%3Cpath class='cls-1' d='M127.79 136.27V111.7h24.91v24.57ZM201.45 379.25v-23.91h23.94v23.91ZM395.57 379.25v-23.91h24.86v23.91Z'/%3E%3Cpath class='cls-4' d='M469.17 404.08v-73.61h23.92v73.61ZM469.17 257.76v-72.61h23.92v72.61Z'/%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 8,\n id: 'utopia.secretskelliessociety.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'DEIP Token',\n symbol: 'DEIP',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDUiIGhlaWdodD0iNDUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3QgeD0iLjg5MiIgeT0iLjkxIiB3aWR0aD0iNDMuMTYxIiBoZWlnaHQ9IjQzLjE2MSIgcng9IjIxLjU4MSIgZmlsbD0iI0Y4RkVGQSIvPjxwYXRoIGQ9Ik05LjcgMTAuNmgxNC41MzRjNi41NjcgMCAxMS44OTIgNS4zMjMgMTEuODkyIDExLjg5IDAgNi41NjgtNS4zMjQgMTEuODkyLTExLjg5MiAxMS44OTJIOS43VjEwLjZaIiBmaWxsPSJ1cmwoI2EpIi8+PGNpcmNsZSBjeD0iMjIuNDczIiBjeT0iMjIuNDkxIiByPSI0Ljg0NSIgZmlsbD0iIzAwMCIvPjxkZWZzPjxyYWRpYWxHcmFkaWVudCBpZD0iYSIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCguMjE2IDExLjY5NTUgLTExLjkyNjc3IC4yMjAyOCAyMi42OTcgMjIuNjg3KSI+PHN0b3Agb2Zmc2V0PSIuMzU5IiBzdG9wLWNvbG9yPSIjRTlGRjAwIi8+PHN0b3Agb2Zmc2V0PSIuNzYiIHN0b3AtY29sb3I9IiMyNjM4MDAiLz48c3RvcCBvZmZzZXQ9IjEiLz48L3JhZGlhbEdyYWRpZW50PjwvZGVmcz48L3N2Zz4=',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'deip-token.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Wootrade Network',\n symbol: 'WOO',\n icon:\n \"data:image/svg+xml,%3Csvg width='125' height='83' viewBox='0 0 125 83' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M102.422 0H122.958L113.203 30.9433H92.9243L102.422 0ZM75.982 29.4048L86.0788 53.3388L89.8436 41.0299H109.951L98.5713 78.0422C97.6301 80.9485 94.9776 82.9145 91.8972 82.9145H80.4314C77.6078 82.9145 75.0408 81.2049 73.9285 78.5551L61.2648 47.8682L48.8578 78.5551C47.831 81.2904 45.2641 83 42.3549 83H30.718C27.6376 83 24.9851 80.9485 24.0439 78.0422L0 5.85842e-05H20.1934L36.2797 53.3388L46.8898 29.3193C49.2857 23.3358 55.0185 19.4038 61.4359 19.4038C67.8533 19.4038 73.6718 23.3358 75.982 29.4048Z' fill='%2320252F'/%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '4691937a7508860f876c9c0a2a617e7d9e945d4b.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'LiNEAR',\n symbol: 'LINEAR',\n icon:\n \"data:image/svg+xml,%3Csvg width='40' height='40' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M30.74 28.78c.21-.36.32-.78.32-1.21v-6.33c0-.24-.06-.46-.17-.66-.12-.21-.28-.38-.48-.49l-16.86-9.77c-.35-.2-.73-.31-1.13-.32-.64 0-1.24.26-1.69.72-.45.45-.7 1.07-.71 1.71v6.39c0 .24.06.47.18.67.11.21.28.37.48.48l16.82 9.71c.36.22.77.32 1.19.32.41 0 .82-.12 1.19-.33.36-.21.66-.52.86-.89zm.32-16.27c0-.42-.1-.84-.29-1.21-.2-.38-.49-.7-.85-.93-.36-.22-.78-.34-1.21-.34-.42 0-.84.12-1.21.34l-4.97 2.81c-.04.02-.08.07-.1.12-.03.04-.04.1-.04.14 0 .06.01.11.04.16.02.04.06.08.1.1l8.05 4.62c.05.02.1.04.15.04.05 0 .1-.02.15-.05.04-.02.08-.06.11-.11.02-.04.04-.1.03-.15l.04-5.54zM10.05 27.5c-.01.43.08.86.28 1.23.2.38.49.7.85.93.36.22.78.34 1.2.34.42 0 .83-.12 1.2-.34l4.92-2.85c.04-.02.08-.06.1-.11.03-.04.05-.1.05-.15 0-.05-.02-.11-.05-.15-.02-.05-.06-.09-.1-.12l-8.05-4.6c-.05-.03-.09-.04-.15-.04-.05 0-.1.01-.15.04-.05.02-.08.07-.11.12-.02.04-.04.09-.04.14l.05 5.56z' fill='url(%23paint0_linear_186_370)'/%3E%3Cdefs%3E%3ClinearGradient id='paint0_linear_186_370' x1='11.135' y1='11.152' x2='30.145' y2='30.457' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%231BB3CC'/%3E%3Cstop offset='1' stop-color='%23824ACC'/%3E%3C/linearGradient%3E%3C/defs%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'linear-protocol.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'USN',\n symbol: 'USN',\n icon:\n \"data:image/svg+xml;charset=UTF-8,%3Csvg width='38' height='38' viewBox='0 0 38 38' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='38' height='38' rx='19' fill='black'/%3E%3Cpath d='M14.8388 10.6601C14.4203 10.1008 13.6748 9.86519 12.9933 10.0768C12.3119 10.2885 11.85 10.8991 11.85 11.5883V14.7648H8V17.9412H11.85V20.0589H8V23.2353H11.85V28H15.15V16.5108L23.1612 27.2165C23.5797 27.7758 24.3252 28.0114 25.0067 27.7997C25.6881 27.5881 26.15 26.9775 26.15 26.2882V23.2353H30V20.0589H26.15V17.9412H30V14.7648H26.15V10.0001H22.85V21.3658L14.8388 10.6601Z' fill='white'/%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'usn',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Huobi BTC',\n symbol: 'HBTC',\n icon:\n \"data:image/svg+xml,%3C%3Fxml version='1.0' standalone='no'%3F%3E%3C!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN' 'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'%3E%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' id='body_1' width='32' height='32'%3E%3Cg transform='matrix(1.3333334 0 0 1.3333334 0 0)'%3E%3Cimage x='0' y='0' xlink:href='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAA/tJREFUWIXtln9oVWUYxz/vOc67iWtNS9IkjcSui8RUsv40TbLfVoZE5R+li1JJioqYFlKI/bBQo+417A+pTSgkiH5p0ETIBIvaaosiRcRqYVM3t3Oe97zv0x+eO27jXt1kWoFfOJzDeX59npf3fc6B8/o/atNXOmKocgVnEmSt3vOvAaxr1stEdN5QAQwbbIAV7kO0dqgABrUCDR9rpVhdJqIO4KUdmjmnAEnCMon0Uom18/ltekXVSNafM4CVH+h4SVglkUdEDwELgoBHNu7RG846wIomb2xCXoQLpMdhRX8GrnWWwMDWV5v9mLMK0JuYx8QyX3ocNlZEtAWY3HPcE51w47z4rU9t1zM60qc9BYu36ExreQWArgTjNB5WEbaqMjE+AVZcZAzhyMBPA74ZUoBFeT/aJrwPZJAE0+sA9o2p9aPiKCYMg2dC53NrFlUdHWzhAQEk1mzGMAFVzFEBpxjDrrg3qg3CYOr6+pqDUT477tlc9iHgOqAW6AT2YGisXNp++HQAppzhttf9LcaYjwDoEUy3ABAYbtz+QvXOOHdVqLjVwNNAqXkQA+sM4ZpM/Q+uXJ2yG8cmZpVYEFFspyCxYkW7vHO7JV8XKK4RWN2v+ALgMNCUvl+tuEbJ15WtU9Iwe63WiWWWWLBdFht5rCgS66YP114YefVPAgsLrMBc4DmD+Q5oAT4vSrcw9R84gLXMEQtiQdLuJVa1lrfi3JQaoKHIvQK4tbK+fU2mvm1/EAY3pxDfFvk0pHEDAxDLlWIViRy2O0FEEdG25jdrDip6O1BdKk+Uy272zjdhOATcVWSvTuMGCJBQJYkpLo6I/pSap5cI2Zne64C7USabwPwB+CKfUnFlV6BDrCLdCTbWwtVd6KafuzXGfBnlspOAN4wJLq+sb9+lXh/tl79/XHkAm+hesWB7fd8KxHHfP0BHkWsvsCWztK0LuBd4V9X/GOWzNZycB8XqoIRKDqLEmU+d0yNBwmgTa+H1tAnzOg1cv7vItRl4OX1uArqA2iAIurzzyj+1mxIquQL7N5pem/CimLB4D4y3ksw0ATuAA6nrTcAvcX7KJOABjNlmCPLe6QxOzoiCDpjA7BgwAEDizIZ4+PBPxFI4hljxT2SWtFtgOVDo8IiqzgXGovq44n8D3QtMTO0KLM8sabOl6pQdxQCjFmuV6+h+jz9P3NmXTJl/bN8ln0W57ArgtaImfgdC4OKiFB5YWVnfvqFcjVMCAIy43xtz8NiDelwacH6SwhFVZketY1uiXHZOCnF1idCWtPgXp8p/WoCCLrrDmuO//jWdxF+jQEXIOz2tY52+PdXEzs4AnUXf19B8nQkr9pmHv++/Ec/rv6e/AQ/TFRmUSxQZAAAAAElFTkSuQmCC' width='24' height='24'/%3E%3C/g%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '0316eb71485b0ab14103307bf65a021042c6d380.factory.bridge.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'PembRock',\n symbol: 'PEM',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyMDAgMjAwIj48cGF0aCBmaWxsPSIjMUUxRTFGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMTMuMiAxNzAuNDJhODMuNTEgODMuNTEgMCAwIDAgNzAuNy04Mi42IDgzLjUgODMuNSAwIDAgMC01Ljc4LTMwLjYxbDEzLjY4LTIzLjg3aC0yOC4wOGE4My4xIDgzLjEgMCAwIDAtNjMuMi0yOS4wNiA4My4xIDgzLjEgMCAwIDAtNjMuMiAyOS4wNkg4LjU4TDIyLjcgNTcuNzhhODMuNSA4My41IDAgMCAwLTUuNTUgMzAuMDUgODMuNTEgODMuNTEgMCAwIDAgNzAuNiA4Mi41N2wxMi43NyAyMi4xMSAxMi42Ny0yMi4xWiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PHBhdGggZmlsbD0iI0VBRUNFRiIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMTAwLjUzIDcuOTJBNzguNjYgNzguNjYgMCAwIDAgNDAuNjEgMzUuNmwtMS4xOCAxLjE3SDE2LjY1TDI4LjIzIDU3LjFsLS42OCAxLjc3Yy0zLjQgOC44Ny02LjA3IDE4LjEtNi4wNyAyOC4yIDAgMzkuNzcgMjkuMDMgNzMuMTQgNjYuOTQgNzlsMS44Ni4zIDEwLjM0IDE3Ljc5IDEwLjA2LTE3Ljc4IDEuODctLjNjMzcuOTUtNS44MSA2Ny4wMy0zOC44IDY3LjAzLTc4LjYxIDAtMTAuMy0yLjI0LTIwLjEzLTUuNzgtMjkuMTVsLS42OS0xLjc4IDExLjE4LTE5Ljc3aC0yMi42NWwtMS4xOC0xLjE3YTc4LjY2IDc4LjY2IDAgMCAwLTU5LjkzLTI3LjY3Wk0zNS44NCAyOS4wNEE4Ni40OCA4Ni40OCAwIDAgMSAxMDAuNTQgMGE4Ni40OCA4Ni40OCAwIDAgMSA2NC42OCAyOS4wNGgzMi42N0wxODEuODEgNTcuMmMzLjQ2IDkuNDMgNS42NSAxOS42MyA1LjY1IDMwLjI2IDAgNDMuMTItMzEuMDIgNzguOTUtNzEuODMgODYuMTRMMTAwLjY1IDIwMGwtMTUuMy0yNi40MmMtNDAuNzctNy4yMy03MS43NC00My40NC03MS43NC04Ni41MyAwLTEwLjQgMi42Mi0xOS45OSA1LjkzLTI5LjI1TDMgMjkuMDRoMzIuODRaIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBmaWxsPSIjRjY4MjFGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0zMS44NSA0NS40MSA2OC43NSAxMjAuNDIgOC4wNi0xNC4xMi0yNy40Ny00OC4xM2gyNC4zTDcyLjMzIDQ1LjRIMzEuODVabTQ5LjE5IDAgNDQuMTUgNzcuMzIgNy42Ny0xMy40NC0yOC4xOC00OS4zNGg4LjM3bDIzLjk5IDQyLjAyTDE0NSA4OGwtMTYuMDItMjguMDVoMTYuNDJsLTQuNDMgNy43NiA3LjgxIDEzLjcgMjAuNTctMzZIODEuMDRaTTU2LjMgNTkuOTVsMTYuNjIgMjkuMTFoOC42N0w2NC45NyA1OS45NUg1Ni4zWk00NC4yIDg0LjZhNTYuNjUgNTYuNjUgMCAwIDAgMzEuMDUgNTQuMTJsNi4zMiAxMS4wMWE2NC40NSA2NC40NSAwIDAgMS00NS4yOS02MS43YzAtNC45Ny41Ni05LjggMS42LTE0LjQ0bDYuMzMgMTEuMDJabTc5LjY1LTQ3LjlhNTUuNDYgNTUuNDYgMCAwIDAtMjMuNjYtNS4yNyA1NS40NSA1NS40NSAwIDAgMC0yMy42NSA1LjI2SDYxLjVhNjMuMjYgNjMuMjYgMCAwIDEgMzguNy0xMy4xNmMxNC41NCAwIDI3Ljk1IDQuOSAzOC43IDEzLjE2aC0xNS4wNVoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGZpbGw9IiNGNjgyMUYiIGQ9Ik00NC4xIDg4LjAyYzAtMS4xNC4wNC0yLjI4LjEtMy40MWwtNi4zLTExLjAyYTY1LjI2IDY1LjI2IDAgMCAwLTEuNiAxNC40MyA2NC40NSA2NC40NSAwIDAgMCA0NS4yOCA2MS43MWwtNi4zMS0xMWE1Ni42NSA1Ni42NSAwIDAgMS0zMS4xNS01MC43Wm0xMTMuMTIgMGMwLTEuMTQtLjItMi4yOC0uMjctMy40MWw2LjI1LTExLjAyYTY1LjMxIDY1LjMxIDAgMCAxIDEuODQgMTQuNDMgNjQuNDUgNjQuNDUgMCAwIDEtNDUuMjkgNjEuNzFsNi4zMS0xMWE1Ni42NSA1Ni42NSAwIDAgMCAzMS4xNi01MC43WiIvPjwvc3ZnPg==',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'token.pembrock.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Atocha Coin',\n symbol: 'ATO',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMzYuODggMTM2Ljg4Ij48Y2lyY2xlIGN4PSI2OC40NCIgY3k9IjY4LjQ0IiByPSI2OC40NCIgc3R5bGU9ImZpbGw6Z29sZCIgZGF0YS1uYW1lPSJMYXllciAyIi8+PGcgZGF0YS1uYW1lPSJMYXllciAxIj48cGF0aCBkPSJNNzEuNjUgNzkuNXYyNC40MWMwIDEuMjcuMjQgMS40OSAxLjQ3IDEuMTcgMS4wOC0uMjkgMi4xMy0uNjggMy4xOC0xYTExLjU4IDExLjU4IDAgMCAwIDEuNS0uNTljMS40MS0uNzIgMi44NC0xLjQgNC4xOC0yLjIyYTI1LjU5IDI1LjU5IDAgMCAwIDUuNTktNC42NGMxLjM2LTEuNTIgMi41NC0zLjIgMy43OC00LjgyLjMzLS40My4xOS0uNzItLjM1LS43MS0uODYgMC0xLjcyLjEzLTIuNTguMjItLjQ5IDAtMSAuMTMtMS40Ny4xOWEuMzkuMzkgMCAwIDEtLjQ4LS4zN2wtLjMzLTJhMS41NSAxLjU1IDAgMCAwLS4wNy0uNDIgNS43OCA1Ljc4IDAgMCAxLS4zMy0yLjEzYy0uMDktMS0uMjUtMS45NC0uMzQtMi45Mi0uMDctLjc4LjA1LS44NC44My0uOTQgMS41OS0uMTkgMy4xOC0uNDQgNC43Ny0uNjVsMi43OS0uMzcgMS4xNC0uMTUgNC44Ny0uNzRjLjI3IDAgLjU0LS4wNS44LS4wOWwyLjE4LS4zNWEyLjc1IDIuNzUgMCAwIDEgLjU1LS4wOC40Ny40NyAwIDAgMSAuMzUuMTcgOS44NSA5Ljg1IDAgMCAxIC40NCAxLjFjLjI0LjY5LjQ2IDEuMzkuNjkgMi4wOGEyLjY5IDIuNjkgMCAwIDEgLjA5LjI4Yy4xNy44My4zMyAxLjY2LjUxIDIuNDkuMjYgMS4xNC41NCAyLjI3LjgxIDMuNC4zMSAxLjMxLjYgMi42My45MyAzLjkzLjE5Ljc1LjQ1IDEuNDkuNjUgMi4yNHMuNDUgMS44MS42NiAyLjcxYS40LjQgMCAwIDEtLjE0LjM0IDMuMzkgMy4zOSAwIDAgMS0uODEuMzVjLTEuMzYuMzYtMi43Mi42OS00LjA5IDFsLTIuNTEuNjVjLS42My4xNy0uNzcuMDgtLjkyLS41NHEtLjM5LTEuNTktLjgyLTMuMTdjMC0uMTQtLjIxLS4zNC0uMzItLjM0YS45MS45MSAwIDAgMC0uNTkuMjRjLS4yOS4zMy0uNDguNzQtLjc1IDEuMDgtLjkzIDEuMTgtMS45IDIuMzMtMi44MyAzLjUxYTMwIDMwIDAgMCAxLTQuNiA0LjMgMzkuNCAzOS40IDAgMCAxLTMuNzQgMi41OCAyNi41OSAyNi41OSAwIDAgMS0yLjcxIDEuNTljLTEuMDguNTMtMi4yIDEtMy4zMiAxLjQycy0yIC43OC0zLjA3IDEuMTFjLS43MS4yMy0xLjQ1LjM3LTIuMTcuNTUtLjIuMDUtLjQuMTQtLjYuMjFhNC41MSA0LjUxIDAgMCAxLS40NC4xNmMtLjYxLjE1LTEuMjMuMy0xLjg1LjQzYS42Mi42MiAwIDAgMC0uNTMuN2MwIC43OCAwIDEuNTctLjA2IDIuMzRhNS4yOCA1LjI4IDAgMCAxLS44IDIuNDkgMy44OCAzLjg4IDAgMCAxLTEuNTIgMS4zMiAxMi41NyAxMi41NyAwIDAgMS0xLjU0LjcxIDEuMjQgMS4yNCAwIDAgMS0uNzguMDcgNS44NiA1Ljg2IDAgMCAxLTMuNzMtMi45MiA4IDggMCAwIDEtLjQtMi42MiAxMCAxMCAwIDAgMSAwLTEuMjguNjcuNjcgMCAwIDAtLjYxLS43NGMtLjc1LS4xNC0xLjUtLjI2LTIuMjQtLjQ0cy0xLjU3LS40NC0yLjM1LS42OGMtLjUtLjE1LTEtLjI4LTEuNS0uNDctMS42My0uNjEtMy4yOC0xLjE5LTQuODktMS44NmExNS4xMiAxNS4xMiAwIDAgMS0yLjI3LTEuMjljLTEuMzgtLjg5LTIuNzgtMS43Ny00LjEtMi43Ni0xLS43Ni0xLjkyLTEuNjgtMi44OC0yLjUyYTM2LjMzIDM2LjMzIDAgMCAxLTQuODEtNS42OGMtLjU4LS43Ny0xLjEtMS41OC0xLjY4LTIuMzVhLjgxLjgxIDAgMCAwLS42LS4yOWMtLjE2IDAtLjM3LjI1LS40My40My0uMzEgMS0uNTcgMi4wNy0uODYgMy4xMXEtLjE5LjctLjQgMS4zOWMtLjExLjM1LS4zOS4zNC0uNjYuMjgtLjU4LS4xMy0xLjE2LS4yOC0xLjczLS40My0xLjYyLS40Mi0zLjI0LS44NC00Ljg2LTEuMjhhNi41NSA2LjU1IDAgMCAxLTEtLjQuMzQuMzQgMCAwIDEtLjEyLS4zYy4yMS0xIC40MS0xLjkzLjY2LTIuODkuMzMtMS4yNC43Mi0yLjQ3IDEtMy43Mi4zOC0xLjQ4LjcyLTMgMS4wOC00LjQ3LjIyLS44OS40Ni0xLjc4LjY4LTIuNjguMTgtLjcyLjM0LTEuNDUuNTItMi4xN3MuMzItMS4yMy41Mi0xLjgzLjM4LS41NS44OC0uNDJhNi43NCA2Ljc0IDAgMCAwIC45Mi4xNWMxLjIuMTUgMi4zOS4yOCAzLjU5LjQ0bDUuNi43NSA0LjYxLjU3Yy44NS4xMSAxLjY5LjI1IDIuNTMuMzYuMyAwIC40Ny4xOS40NC41MXYuNDNjLS4xMyAxLjI0LS4yMiAyLjQ5LS40IDMuNzJzLS40NSAyLjM4LS42NiAzLjU4Yy0uMDYuMzQtLjIzLjQ3LS41NS40MmwtMi4xNC0uMzVhMi4yIDIuMiAwIDAgMC0uNDcgMGMtLjQgMC0uNTcuMjItLjQyLjU5YTcuOTIgNy45MiAwIDAgMCAuNzEgMS4zNCAyNC45NCAyNC45NCAwIDAgMCAzLjUyIDQuMjFjLjkxLjg4IDEuODIgMS43NiAyLjc4IDIuNTdhMTkgMTkgMCAwIDAgNC4yOSAyLjY5YzEuMTEuNTEgMi4yMiAxIDMuMzcgMS40N3MyLjM4LjggMy41OCAxLjE4YTIgMiAwIDAgMCAuNTEuMDUuNDcuNDcgMCAwIDAgLjUyLS40IDIuOTEgMi45MSAwIDAgMCAuMDctLjU1Yy4wNy0zLjYuMTgtNy4xOS4yLTEwLjc5LjA1LTguMzIuMDYtMTYuNjQuMDgtMjVWNTQuODVjMC0uOS0uMi0xLjA5LTEuMS0xLjA5aC0xNmExMy41MSAxMy41MSAwIDAgMS0yLjc4LS4zOSAxLjMxIDEuMzEgMCAwIDEtLjczLS43IDMuNDUgMy40NSAwIDAgMS0uMzMtMS4zNXYtNC4zMWEzLjQ1IDMuNDUgMCAwIDEgLjMxLTEuMSAxIDEgMCAwIDEgLjk1LS42M2MxLjMtLjExIDIuNi0uMjQgMy45MS0uMjYgMy42MyAwIDcuMjUgMCAxMC44OC0uMDVoMy44M2MuNjYgMCAxLS4yNyAxLS45M1YzMi41NmExLjQzIDEuNDMgMCAwIDAtLjc1LTEuMzQgMTAuNDkgMTAuNDkgMCAwIDEtMy41NS0zLjU2IDcuNTcgNy41NyAwIDAgMS0xLjI5LTMuN2MtLjA2LTEuMTkgMC0yLjM5IDAtMy41OEE4LjM1IDguMzUgMCAwIDEgNTguNDEgMTdhOS41IDkuNSAwIDAgMSA0LTMuNzYgNi41MyA2LjUzIDAgMCAxIDIuNjgtMWMuNzMtLjA4IDEuNDQtLjMgMi4xNy0uMzRhNi4xNiA2LjE2IDAgMCAxIDEuNDIuMjJjLjEzIDAgLjI1LjA4LjM3LjA5YTEwLjM1IDEwLjM1IDAgMCAxIDUgMi4zNSA3LjYyIDcuNjIgMCAwIDEgMi4xOCAyLjhjLjQ2LjkzLjggMS45MyAxLjE3IDIuOWEyLjEyIDIuMTIgMCAwIDEgLjEuNjd2MS40NWE4LjEyIDguMTIgMCAwIDEtLjcxIDMuNTUgMTIuMzEgMTIuMzEgMCAwIDEtMi4xNyAzLjYzIDUuOCA1LjggMCAwIDEtMS45MyAxLjU3IDEuNjggMS42OCAwIDAgMC0xLjA2IDEuNzR2MTEuMjZjMCAuNjIuMjkuODYuOTIuODhIODUuNjljMS43NiAwIDMuNTIuMTQgNS4yOC4xNmExLjgyIDEuODIgMCAwIDEgMS42OCAxLjg1djQuNjFhMi4zMyAyLjMzIDAgMCAxLS41NyAxLjQ0IDEuMzUgMS4zNSAwIDAgMS0uNy40MSAyMC4wNyAyMC4wNyAwIDAgMS01LjE4LjM0SDcyLjY3Yy0uOTEgMC0xLjA3LjE2LTEuMDcgMS4wNnEuMDUgMTIuMzQuMDUgMjQuNjJabS00LjQ5LTUxLjU1YTUuNzQgNS43NCAwIDAgMCA1LjcxLTUuNjQgNS44MiA1LjgyIDAgMCAwLTYuMDgtNS42M2MtMi41Mi4wNS01LjExIDIuODMtNS4wNyA1LjcxYTUuNiA1LjYgMCAwIDAgNS40NCA1LjU2WiIvPjxwYXRoIGQ9Ik04MC45NCA3Ny41YTIwIDIwIDAgMCAxLTIuNjktLjM3IDcuMzMgNy4zMyAwIDAgMS00LjM0LTMgNy43IDcuNyAwIDAgMS0xLTYuMjQgNy43OCA3Ljc4IDAgMCAxIDMuNzYtNSAxMC4yNSAxMC4yNSAwIDAgMSA2LjM4LTEuNTEgOC4xIDguMSAwIDAgMSA2LjE3IDMuNEE3LjY1IDcuNjUgMCAwIDEgOTAuNTcgNzFhNi40NiA2LjQ2IDAgMCAxLTIuMTQgMy40NiAxMi4yNyAxMi4yNyAwIDAgMS0zLjQ2IDIuMjEgMTAuNjQgMTAuNjQgMCAwIDEtNC4wMy44M1ptMy01LjY2YTYuNjkgNi42OSAwIDAgMCAwLS44NSAyMi41IDIyLjUgMCAwIDAtMS4xNy00Ljc3IDEuODMgMS44MyAwIDAgMC0xLjQ4LTEuMzFjLTEuMjYtLjEzLTEuOTIgMS0xLjggMi4xOWEyMy43MiAyMy43MiAwIDAgMCAuNjQgMy40IDEzLjA3IDEzLjA3IDAgMCAwIC44NiAyLjM5IDEuNDggMS40OCAwIDAgMCAyLjMzLjU2IDEuODEgMS44MSAwIDAgMCAuNjEtMS42M1pNNDMuOTQgNzMuMzFhMy44NyAzLjg3IDAgMCAxIDItMy42QTguOTEgOC45MSAwIDAgMSA1MSA2OC4zOWE1LjU5IDUuNTkgMCAwIDAgLjYgMCAxIDEgMCAwIDAgMS0xIDEwIDEwIDAgMCAwLS4yNy0yLjU2IDEuMzMgMS4zMyAwIDAgMC0yLjM0LS41NGMtLjU3LjU1LTEgMS4yMS0xLjU3IDEuNzlhMi41NiAyLjU2IDAgMCAxLTIuMjIuOTQgMS40NyAxLjQ3IDAgMCAxLTEuMjEtMiAzLjkzIDMuOTMgMCAwIDEgMi0yLjA5IDEzLjI2IDEzLjI2IDAgMCAxIDIuNTctMS4wOCAxMC4zMSAxMC4zMSAwIDAgMSA1LjEzLS4yNyA3LjM1IDcuMzUgMCAwIDEgMi45MyAxLjM2QTMuMzggMy4zOCAwIDAgMSA1OSA2NS4zOWMuMDcgMS4yNy4wOCAyLjU0LjE1IDMuODEuMDYgMSAuMTYgMiAuMjYgM2ExLjIzIDEuMjMgMCAwIDAgLjg4IDEuMDVjLjY3LjI3Ljc0LjQ2LjU3IDEuMTRhMy44IDMuOCAwIDAgMS0yIDIuMzUgNC4zOCA0LjM4IDAgMCAxLTMuNjguNDUgMy4zIDMuMyAwIDAgMS0xLjE1LS42OWMtLjc0LS42OC0uODItLjc1LTEuNjItLjE5YTYuMjEgNi4yMSAwIDAgMS00LjY5IDEgNC4yMSA0LjIxIDAgMCAxLTMuMS0xLjgxIDMuMSAzLjEgMCAwIDEtLjY4LTIuMTlabTcuNy0yLjkxYTIgMiAwIDAgMC0xLjE3IDMuNDMgMS4yMiAxLjIyIDAgMCAwIDEuNzQtLjI0IDIuOSAyLjkgMCAwIDAgLjI2LTIuNjIuNzYuNzYgMCAwIDAtLjgyLS41N1oiLz48L2c+PC9zdmc+',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'atocha-token.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'SeatlabNFT',\n symbol: 'SEAT',\n icon:\n \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' x='0px' y='0px' width='32px' height='32px' viewBox='0 0 32 32' style='enable-background:new 0 0 32 32;' xml:space='preserve'%3E%3Cstyle type='text/css'%3E .st0%7Bfill:%23050035;%7D .st1%7Bfill:url(%23SVGID_1_);%7D%0A%3C/style%3E%3Cg id='Layer_1'%3E%3Ccircle class='st0' cx='16' cy='16' r='16'/%3E%3C/g%3E%3Cg id='Isolation_Mode'%3E%3ClinearGradient id='SVGID_1_' gradientUnits='userSpaceOnUse' x1='6.2375' y1='16' x2='25.7625' y2='16'%3E%3Cstop offset='0' style='stop-color:%2300C2FF'/%3E%3Cstop offset='1' style='stop-color:%230067FF'/%3E%3C/linearGradient%3E%3Cpath class='st1' d='M14,6.1c-0.3,0-0.5,0.1-0.8,0.2L8.1,9.4L7.8,9.6L7.2,10c-0.5,0.3-0.9,0.6-0.9,1.7v4.1c0,0.9,0.3,1.6,0.9,1.9 l6.2,3.8c1,0.6,2.3-0.1,2.3-1.3v-2.9c0-0.7-0.4-1.4-1-1.8l-2.9-1.8l3-1.9c0.5-0.3,0.8-0.9,0.8-1.5V7.6C15.6,6.7,14.8,6.1,14,6.1z M14.7,10.4c0,0.3-0.2,0.6-0.4,0.8l-3.4,2.1l-1.8-1.1c-0.5-0.3-0.8-0.5-1.1-0.8c-0.3-0.3-0.2-0.8,0.2-1c0,0,0,0,0,0L13.7,7 C13.8,7,13.9,6.9,14,6.9c0.3,0,0.7,0.3,0.7,0.7V10.4z M24.9,14.3l-6.2-3.8c-1-0.6-2.3,0.1-2.3,1.3v2.9c0,0.7,0.4,1.4,1,1.8l2.9,1.8 l-3,1.9c-0.5,0.3-0.8,0.9-0.8,1.5v2.8c0,0.9,0.8,1.6,1.6,1.6c0.3,0,0.5-0.1,0.8-0.2l5.1-3.1l0.4-0.2l0.6-0.4 c0.5-0.3,0.9-0.6,0.9-1.7v-4.1C25.8,15.3,25.4,14.6,24.9,14.3z M23.8,21.6C23.8,21.6,23.8,21.6,23.8,21.6L18.3,25 c-0.1,0.1-0.2,0.1-0.4,0.1c-0.3,0-0.7-0.3-0.7-0.7v-2.8c0-0.3,0.2-0.6,0.4-0.8l3.4-2.1l1.8,1.1c0.5,0.3,0.8,0.5,1.1,0.8 C24.3,20.9,24.2,21.4,23.8,21.6z'/%3E%3C/g%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 5,\n id: 'token.stlb.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Burrow Token',\n symbol: 'BRRR',\n icon:\n 'data:image/png;base64,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',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'token.burrow.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'FUSOTAO',\n symbol: 'TAO',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQiIGhlaWdodD0iNjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0ibTU1LjQxIDI5LjYzNS03LjI5NiA2LjE0N2ExLjY1OSAxLjY1OSAwIDAgMS0uNjc1IDIuMzlsMS44NDggOS41NDZjLjgwNS0uMjA4IDEuNTM2LS43MDIgMi4wODktMS41MzlhMTIuODE2IDEyLjgxNiAwIDAgMCAxLjk4Mi01LjI4OWMuMTctMS4yNTEuNTY0LTIuNDczIDEuMTU2LTMuNTg2YTEyLjgzMyAxMi44MzMgMCAwIDAgMS40ODItNS40NjljLjAzNS0uODYzLS4xODYtMS42LS41ODctMi4yeiIgZmlsbD0idXJsKCNhKSIvPjxwYXRoIGQ9Ik00NS4zNDIgMzUuOTA2YTEuNjM3IDEuNjM3IDAgMCAxIDIuMTgzLS42M2w3LjM3OC02LjE5M2MtMS4yODMtMS4xOTMtMy40NTktMS41NDctNS40NDUtLjkwM2wtMTIuNzQyIDQuMTM1Yy0uMzEuMS0uNTUzLjI5Ny0uNzE2LjU0Mmw5LjM0MiAzLjA0OXoiIGZpbGw9InVybCgjYikiLz48cGF0aCBkPSJNNDMuODkyIDQ1LjM3YzEuMTQ5IDEuNTkyIDIuOTQ3IDIuNTcyIDQuNTk5IDIuNTI0bC0xLjg0NC05LjQ4N2ExLjY0NCAxLjY0NCAwIDAgMS0xLjUzOC0xLjY4bC05LjM2NC0zLjA1NWMuMDA0LjI2OC4wODcuNTQuMjYuNzhsNy44ODcgMTAuOTE5eiIgZmlsbD0idXJsKCNjKSIvPjxwYXRoIGQ9Im00MS40MSA1My4yMjMtOC4wNTYtNS4wOTJhMS42MzEgMS42MzEgMCAwIDEtMi40NjQuMDkxbC04LjQzOCA0LjcyMWMuNDQ0LjcwOCAxLjEzNiAxLjI1NiAyLjA5NyAxLjUyNyAxLjc5NC41MDYgMy43NC42MDMgNS42MDUuMjY1YTEwLjUzNiAxMC41MzYgMCAwIDEgMy43NDIgMGMxLjg3LjMzOSAzLjgyMS4yNCA1LjYxOS0uMjcuODI2LS4yMzMgMS40NTMtLjY3MyAxLjg5NS0xLjI0MnoiIGZpbGw9InVybCgjZCkiLz48cGF0aCBkPSJNMzIuMzg5IDQ1LjQzOGExLjY0NiAxLjY0NiAwIDAgMSAxLjI3IDEuODlsOC4xNDUgNS4xMzRjLjczNC0xLjU5NC4zOTctMy43ODItLjgyNy01LjQ4TDMzLjEyMyAzNi4wOWExLjM1NCAxLjM1NCAwIDAgMC0uNzM0LS41MTZ2OS44NjR6IiBmaWxsPSJ1cmwoI2UpIi8+PHBhdGggZD0iTTIyLjk3IDQ3LjAxN2MtMS4xNTEgMS41ODgtMS41MjQgMy42MDgtLjk2OSA1LjE3bDguNDItNC42OTJhMS42NDggMS42NDggMCAwIDEgMS4xMTctMS45ODd2LTkuODg0Yy0uMjUzLjA4Ny0uNDg1LjI1LS42NTkuNDlsLTcuOTA4IDEwLjkwM3oiIGZpbGw9InVybCgjZikiLz48cGF0aCBkPSJtMTUuODg2IDM1Ljc4Mi03LjI5NS02LjE0N2MtLjQwMS42LS42MjIgMS4zMzctLjU4NyAyLjJhMTIuODMgMTIuODMgMCAwIDAgMS40ODIgNS40NjkgMTAuNzUxIDEwLjc1MSAwIDAgMSAxLjE1NiAzLjU4NmMuMjU4IDEuODkyLjk1IDMuNzI3IDEuOTgyIDUuMjkuNTUzLjgzNiAxLjI4NCAxLjMzIDIuMDg5IDEuNTM4bDEuODQ4LTkuNTQ2YTEuNjU5IDEuNjU5IDAgMCAxLS42NzUtMi4zOXoiIGZpbGw9InVybCgjZykiLz48cGF0aCBkPSJNMTUuNTY4IDQ3Ljg1NmMxLjY0OS4wNDggMy40NDUtLjkzMiA0LjU5Mi0yLjUyMWw3Ljg3NS0xMC45MDhhMS4zNiAxLjM2IDAgMCAwIC4yNi0uNzhsLTkuMzUgMy4wNTJhMS42NDcgMS42NDcgMCAwIDEtMS41MzYgMS42NzlsLTEuODQgOS40Nzh6IiBmaWxsPSJ1cmwoI2gpIi8+PHBhdGggZD0iTTE2Ljc0NSAzNS4xOTNhMS42NCAxLjY0IDAgMCAxIDEuOTI3Ljc0bDkuMzU2LTMuMDUyYTEuMzU3IDEuMzU3IDAgMCAwLS43MTctLjU0M2wtMTIuNzYxLTQuMTRjLTEuOTktLjY0NC00LjE2OC0uMjktNS40NTMuOTA1bDcuMzkgNi4yYy4wOC0uMDQ0LjE2Ny0uMDguMjU4LS4xMXoiIGZpbGw9InVybCgjaSkiLz48cGF0aCBkPSJtNDAuNTcxIDE4LjA5LTMuNTQ2LTguODkyYy42ODktLjE5OCAxLjQ1My0uMTgyIDIuMjU4LjExOGExMi42NSAxMi42NSAwIDAgMSA0LjcwMyAzLjExIDEwLjYxNCAxMC42MTQgMCAwIDAgMy4wMjcgMi4yMTYgMTIuNjc2IDEyLjY3NiAwIDAgMSA0LjM4IDMuNTM1Yy42MTkuNzg4Ljg2IDEuNjQxLjgwNiAyLjQ3N2wtOS41OC0xLjE3OWExLjY0OSAxLjY0OSAwIDAgMC0uNjYyLTEuMTI2IDEuNjI2IDEuNjI2IDAgMCAwLTEuMzg2LS4yNnoiIGZpbGw9InVybCgjaikiLz48cGF0aCBkPSJNMzkuNzY0IDE4Ljc5Yy0uNDYzLjY0LS40IDEuNS4xMDQgMi4wNjZsLTUuNzczIDcuOThhMS4zNjMgMS4zNjMgMCAwIDEtLjI5Mi0uODVsLjAyMS0xMy40NDljLjAwNC0yLjA5NiAxLjAxMi00LjA2NCAyLjUzOC00LjkybDMuNTg1IDguOTZhMS42NiAxLjY2IDAgMCAwLS4xODMuMjEzeiIgZmlsbD0idXJsKCNrKSIvPjxwYXRoIGQ9Ik01Mi4xNiAyMS41NDhjLS40NjUgMS41OTEtMS45NSAzLjAwNi0zLjgxMiAzLjYxbC0xMi43ODIgNC4xNTVhMS4zNTIgMS4zNTIgMCAwIDEtLjgyLjAwOGw1Ljc4OC03Ljk5NmExLjY0IDEuNjQgMCAwIDAgMi4wNjctLjk0OWw5LjU1OSAxLjE3MnoiIGZpbGw9InVybCgjbCkiLz48cGF0aCBkPSJtMjcuNDYgOS4xOTgtMy41NDcgOC44OTJhMS42MjYgMS42MjYgMCAwIDAtMS4zODYuMjYgMS42NSAxLjY1IDAgMCAwLS42NjIgMS4xMjVsLTkuNTggMS4xNzljLS4wNTMtLjgzNi4xODctMS42OS44MDYtMi40NzdhMTIuNjc3IDEyLjY3NyAwIDAgMSA0LjM4LTMuNTM0IDEwLjYxNiAxMC42MTYgMCAwIDAgMy4wMjctMi4yMTcgMTIuNjUgMTIuNjUgMCAwIDEgNC43MDMtMy4xMWMuODA1LS4zIDEuNTY5LS4zMTYgMi4yNTgtLjExOHoiIGZpbGw9InVybCgjbSkiLz48cGF0aCBkPSJNMTYuMTk1IDI1LjE0M2MtMS44Ni0uNjA1LTMuMzQyLTIuMDE3LTMuODA2LTMuNjA3bDkuNTQ0LTEuMTdhMS42MzYgMS42MzYgMCAwIDAgMi4wNjQuOTQ4bDUuNzggNy45ODdhMS4zNDkgMS4zNDkgMCAwIDEtLjgxOS0uMDA4bC0xMi43NjMtNC4xNXoiIGZpbGw9InVybCgjbikiLz48cGF0aCBkPSJNMjQuNjM5IDIwLjg2N2ExLjY1NCAxLjY1NCAwIDAgMC0uMDc5LTIuMjgxbDMuNTktOC45N2MxLjUzLjg1NyAyLjUzOSAyLjgyOCAyLjU0MiA0LjkyNmwuMDIxIDEzLjQ2MmMuMDAxLjMyNy0uMTEuNjItLjI5Mi44NTJsLTUuNzgyLTcuOTg5eiIgZmlsbD0idXJsKCNvKSIvPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iaCIgeDE9IjgiIHkxPSI0My40NjciIHgyPSIxNi4zOTkiIHkyPSIzNy45MzgiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjOUEwQTBFIi8+PHN0b3Agb2Zmc2V0PSIuODY5IiBzdG9wLWNvbG9yPSIjREExODFGIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSI0NS45MjYiIHkxPSIzNi4wNTMiIHgyPSI1MS4wNjgiIHkyPSI0My41NjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBvZmZzZXQ9Ii40NjQiIHN0b3AtY29sb3I9IiNFQTMwMkEiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNDNTE1MUIiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYyIgeDE9IjQ1LjkyNiIgeTE9IjM2LjA1MyIgeDI9IjUxLjA2OCIgeTI9IjQzLjU2MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iLjQ2NCIgc3RvcC1jb2xvcj0iI0VBMzAyQSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0M1MTUxQiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJkIiB4MT0iMzEuOTAxIiB5MT0iNTQuOTMzIiB4Mj0iMzEuOTAxIiB5Mj0iNDcuNDIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzlFMEIwRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0RBMTgxRiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJlIiB4MT0iMzEuOTAxIiB5MT0iNTQuOTMzIiB4Mj0iMzEuOTAxIiB5Mj0iNDcuNDIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzlFMEIwRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0RBMTgxRiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJmIiB4MT0iMzEuOTAxIiB5MT0iNTQuOTMzIiB4Mj0iMzEuOTAxIiB5Mj0iNDcuNDIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzlFMEIwRiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0RBMTgxRiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJnIiB4MT0iOCIgeTE9IjQzLjQ2NyIgeDI9IjE2LjM5OSIgeTI9IjM3LjkzOCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM5QTBBMEUiLz48c3RvcCBvZmZzZXQ9Ii44NjkiIHN0b3AtY29sb3I9IiNEQTE4MUYiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjQ1LjkyNiIgeTE9IjM2LjA1MyIgeDI9IjUxLjA2OCIgeTI9IjQzLjU2MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIG9mZnNldD0iLjQ2NCIgc3RvcC1jb2xvcj0iI0VBMzAyQSIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0M1MTUxQiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iOCIgeTE9IjQzLjQ2NyIgeDI9IjE2LjM5OSIgeTI9IjM3LjkzOCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiM5QTBBMEUiLz48c3RvcCBvZmZzZXQ9Ii44NjkiIHN0b3AtY29sb3I9IiNEQTE4MUYiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iaiIgeDE9IjQyLjk2MyIgeTE9IjEyLjIzIiB4Mj0iMzMuODY1IiB5Mj0iMjcuMDUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjRjlCMTk4Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjRUUxQzI1Ii8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9ImsiIHgxPSI0Mi45NjMiIHkxPSIxMi4yMyIgeDI9IjMzLjg2NSIgeTI9IjI3LjA1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iI0Y5QjE5OCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI0VFMUMyNSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJsIiB4MT0iNDIuOTYzIiB5MT0iMTIuMjMiIHgyPSIzMy44NjUiIHkyPSIyNy4wNSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNGOUIxOTgiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFRTFDMjUiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0ibSIgeDE9IjE4Ljc2NSIgeTE9IjEzLjQxNiIgeDI9IjI5LjU0NSIgeTI9IjMyLjU4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNFRTI3MjkiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFRTFDMjUiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0ibiIgeDE9IjE4Ljc2NSIgeTE9IjEzLjQxNiIgeDI9IjI5LjU0NSIgeTI9IjMyLjU4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNFRTI3MjkiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFRTFDMjUiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0ibyIgeDE9IjE4Ljc2NSIgeTE9IjEzLjQxNiIgeDI9IjI5LjU0NSIgeTI9IjMyLjU4NSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPjxzdG9wIHN0b3AtY29sb3I9IiNFRTI3MjkiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNFRTFDMjUiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48L3N2Zz4=',\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'fusotao-token.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'NearX',\n symbol: 'NearX',\n icon:\n \"data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M24 12C24 18.6274 18.6274 24 12 24C5.37258 24 0 18.6274 0 12C0 5.37258 5.37258 0 12 0C18.6274 0 24 5.37258 24 12ZM17.1421 21.3847L21.3848 17.1421L19.3669 15.1243C18.5576 17.0302 17.0303 18.5576 15.1243 19.3669L17.1421 21.3847ZM9.4329 19.5792C7.45318 18.9089 5.82112 17.4847 4.87847 15.6484L3.24263 17.2842L7.48527 21.5269L9.4329 19.5792ZM4.63307 8.87568C5.4424 6.96973 6.96977 5.44237 8.87573 4.63305L7.24263 2.99995L2.99999 7.24259L4.63307 8.87568ZM15.6484 4.87847L17.3848 3.14209L21.6274 7.38473L19.5792 9.4329C18.9089 7.45318 17.4847 5.82112 15.6484 4.87847Z' fill='%232FA8AF'/%3E%3Cpath d='M8.00119 11.9921C8.00119 11.0268 8.00119 10.0615 8.00119 9.09612C8.00119 8.50505 8.16497 8.1743 8.56285 8.05781C8.97778 7.93628 9.40619 7.97917 9.79565 8.45228C11.3533 10.3447 12.9343 12.218 14.5092 14.0959C14.5692 14.1676 14.6117 14.3122 14.734 14.2626C14.8496 14.2157 14.7858 14.0805 14.786 13.9878C14.7904 12.6326 14.7898 11.2774 14.7868 9.92226C14.7868 9.83668 14.838 9.7162 14.7271 9.67372C14.6401 9.64029 14.5824 9.74185 14.522 9.79358C14.0492 10.1981 13.5804 10.6073 13.1088 11.0133C13.0208 11.089 12.9332 11.2118 12.8002 11.1012C12.6657 10.9894 12.7696 10.8872 12.8364 10.7881C13.3547 10.0186 13.8728 9.24898 14.3909 8.47919C14.6656 8.07085 15.0079 7.92282 15.4056 8.04141C15.786 8.15475 15.9986 8.48592 15.9992 8.97668C16.0007 10.0905 15.9996 11.2045 15.9996 12.3183C15.9996 13.2094 16.0003 14.1005 15.9994 14.9916C15.999 15.4826 15.8137 15.798 15.4512 15.9324C15.0256 16.0901 14.5767 15.9683 14.2734 15.6058C12.6823 13.705 11.0924 11.8029 9.50198 9.90144C9.46029 9.85161 9.42303 9.7961 9.37377 9.75489C9.28998 9.68487 9.21967 9.68108 9.21314 9.81797C9.20999 9.88273 9.21188 9.94791 9.21188 10.0129C9.21188 11.3496 9.21062 12.6862 9.2142 14.0227C9.21441 14.1186 9.15609 14.2557 9.26114 14.3038C9.38093 14.3587 9.45061 14.2178 9.52998 14.1503C9.98259 13.7651 10.4291 13.3728 10.8805 12.9859C10.9729 12.9066 11.0626 12.7651 11.208 12.8973C11.3402 13.0176 11.2213 13.1196 11.159 13.2127C10.6323 13.9989 10.1032 14.7837 9.57145 15.5663C9.32788 15.9248 8.9881 16.056 8.61085 15.9488C8.23739 15.8428 8.00498 15.5246 8.00287 15.0827C7.99761 14.0523 8.00119 13.022 8.00119 11.9917V11.9921Z' fill='white'/%3E%3C/svg%3E%0A\",\n reference: 'https://near.staderlabs.com',\n reference_hash: null,\n decimals: 24,\n id: 'v2-nearx.stader-labs.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'DISCOVOL TOKEN',\n symbol: 'DISC',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSLlm77lsYJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4PSIwIiB5PSIwIiB2aWV3Qm94PSIwIDAgMTQxLjcgMTQxLjciIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDE0MS43IDE0MS43IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c3R5bGU+LnN0MHtmaWxsOiNmOTcxMTZ9PC9zdHlsZT48cGF0aCBjbGFzcz0ic3QwIiBkPSJNNDYuMSAxOC43djEwNS42czIxLjMtNS41IDMzLjEtMjljMCAwIDEyLjctMjIuMi0uOS00OS43IDAgMC0xMC4xLTIwLjktMzIuMi0yNi45eiIvPjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik0xMDUuNyA5LjRjMzEuMSAxOC4zIDM0LjUgNDguNCAzNC41IDQ4LjQgNi40IDM3LjktMTcgNjAuMy0xNyA2MC4zLTMxLjQgMzQuNS03My40IDIwLjMtNzMuNCAyMC4zIDMwLjYtOS4zIDQxLjktMzUuMSA0MS45LTM1LjEgMTYuNi0zNS41IDAtNjMuMiAwLTYzLjJDNzcgOS43IDQ3LjMgMy45IDQ3LjMgMy45YzMyLjQtMTEuMyA1OC40IDUuNSA1OC40IDUuNXptNyAxMS41UzExMS4xIDM4IDk0LjcgMzhjMCAwIDE2IDIuOCAxNy41IDE4LjggMCAwIDEuNC0xNy41IDE4LjItMTguMy0uMSAwLTE4LjUtMS41LTE3LjctMTcuNnpNMjUuNiAxNS45aDUuOXYxMTAuOEgyN1M4IDExMiAyLjIgODkuMmMwIDAtNy43LTI2LjIgNS01MC40LjEuMSA5LjUtMTcgMTguNC0yMi45eiIvPjwvc3ZnPg==',\n reference: null,\n reference_hash: null,\n decimals: 14,\n id: 'discovol-token.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Stader',\n symbol: 'SD',\n icon:\n \"data:image/svg+xml,%3Csvg width='256' height='256' viewBox='0 0 256 256' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M128 256C198.692 256 256 198.692 256 128C256 57.3075 198.692 0 128 0C57.3075 0 0 57.3075 0 128C0 198.692 57.3075 256 128 256Z' fill='%236259D4'/%3E%3Cpath d='M126.852 191.869L126.822 181.088L153.98 165.105L153.886 133.025L163.667 127.882L164.056 170.723L126.852 191.869Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M153.98 165.105L126.822 181.088L126.852 191.869L164.056 170.723L163.667 127.882L153.886 133.025L153.98 165.105ZM154.207 133.218L154.3 165.104C154.301 165.218 154.241 165.323 154.143 165.381L127.143 181.271L127.171 191.32L163.735 170.538L163.352 128.41L154.207 133.218Z' fill='%236259D4'/%3E%3Cpath d='M134.785 112.611L145.906 106.314L173.184 123.396L173.334 175.037L164.063 170.734L163.673 127.894L134.785 112.611Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M163.673 127.894L164.063 170.734L173.334 175.037L173.184 123.396L145.906 106.314L134.785 112.611L163.673 127.894ZM135.451 112.601L163.823 127.611C163.927 127.666 163.992 127.773 163.993 127.891L164.381 170.529L173.013 174.535L172.865 123.574L145.898 106.687L135.451 112.601Z' fill='%236259D4'/%3E%3Cpath d='M126.443 53.3335L173.06 79.8728L173.094 90.9255L126.49 64.9081L126.443 53.3335Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M126.443 53.3335L126.49 64.9081L173.094 90.9255L173.06 79.8728L126.443 53.3335ZM126.766 53.8852L126.81 64.7198L172.773 90.3795L172.741 80.0592L126.766 53.8852Z' fill='%236259D4'/%3E%3Cpath d='M80.1584 134.322L80 80.4074L126.432 53.3335L126.48 64.9081L88.7187 86.0335L88.5731 128.106L80.1584 134.322Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M88.7187 86.0335L126.48 64.9081L126.432 53.3335L80 80.4074L80.1584 134.322L88.5731 128.106L88.7187 86.0335ZM88.2536 127.944L88.3987 86.0324C88.3991 85.9169 88.4617 85.8106 88.5624 85.7542L126.159 64.7209L126.115 53.8892L80.3205 80.5909L80.4766 133.689L88.2536 127.944Z' fill='%236259D4'/%3E%3Cpath d='M107.511 149.374L80.1562 134.324L88.5709 128.108L135.44 154.885L107.58 170.601L98.2445 175.794L126.85 191.879L164.054 170.733L173.325 175.035L126.619 202.66L80.2804 176.371L117.215 154.711L107.511 149.374Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M107.58 170.601L135.44 154.885L88.5709 128.108L80.1562 134.324L117.215 154.711L80.2804 176.371L126.619 202.66L173.325 175.035L164.054 170.733L126.85 191.879L98.2445 175.794L107.58 170.601ZM164.069 171.092L127.008 192.157C126.91 192.213 126.791 192.213 126.693 192.158L98.0877 176.073C97.9866 176.016 97.9242 175.909 97.9245 175.794C97.9248 175.678 97.9877 175.571 98.0889 175.515L107.423 170.322L134.792 154.884L88.5932 128.49L80.7483 134.285L107.666 149.093L117.369 154.431C117.47 154.486 117.533 154.592 117.535 154.707C117.536 154.822 117.476 154.929 117.377 154.987L80.9208 176.367L126.615 202.29L172.639 175.069L164.069 171.092Z' fill='%236259D4'/%3E%3Cpath d='M88.7207 86.0458L126.482 64.9204L173.085 90.9378L145.902 106.323L134.781 112.619L163.669 127.902L153.888 133.044L116.808 112.11L153.764 90.4499L144.947 85.4178L126.512 74.8955L99.0623 90.6069L88.7207 86.0458Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M173.085 90.9378L126.482 64.9204L88.7207 86.0458L99.0623 90.6069L126.512 74.8955L153.764 90.4499L116.808 112.11L153.888 133.044L163.669 127.902L134.781 112.619L173.085 90.9378ZM162.983 127.901L134.631 112.902C134.528 112.847 134.462 112.741 134.461 112.624C134.459 112.507 134.521 112.398 134.623 112.341L145.744 106.044L172.432 90.9397L126.482 65.287L89.4368 86.0119L99.0436 90.2489L126.353 74.6177C126.451 74.5614 126.572 74.5614 126.67 74.6175L153.923 90.172C154.022 90.2286 154.083 90.3338 154.084 90.4481C154.085 90.5623 154.024 90.6682 153.926 90.726L117.45 112.105L153.894 132.68L162.983 127.901Z' fill='%236259D4'/%3E%3Cpath d='M98.252 175.789L107.587 170.596L126.827 181.093L126.857 191.874L98.252 175.789Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M98.252 175.789L126.857 191.874L126.827 181.093L107.587 170.596L98.252 175.789ZM98.9075 175.791L126.536 191.326L126.508 181.283L107.589 170.962L98.9075 175.791Z' fill='%236259D4'/%3E%3Cpath d='M80.2804 176.368L80.2461 164.785L107.511 149.371L117.215 154.708L80.2804 176.368Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M80.2804 176.368L117.215 154.708L107.511 149.371L80.2461 164.785L80.2804 176.368ZM80.5987 175.81L116.567 154.717L107.513 149.737L80.5666 164.971L80.5987 175.81Z' fill='%236259D4'/%3E%3Cpath d='M116.809 112.109L116.92 101.073L144.947 85.417L153.764 90.4491L116.809 112.109Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M116.809 112.109L153.764 90.4491L144.947 85.417L116.92 101.073L116.809 112.109ZM117.134 111.547L153.125 90.4528L144.946 85.7845L117.238 101.262L117.134 111.547Z' fill='%236259D4'/%3E%3Cpath d='M88.5723 128.087L88.7179 86.0142L99.0595 90.5753L99.1537 123.589L135.407 143.582L135.442 154.864L88.5723 128.087Z' fill='white'/%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M99.1537 123.589L99.0595 90.5753L88.7179 86.0142L88.5723 128.087L135.442 154.864L135.407 143.582L99.1537 123.589ZM135.088 143.771L98.9992 123.869C98.8974 123.813 98.8341 123.706 98.8337 123.59L98.7401 90.7841L89.0362 86.5043L88.8929 127.901L135.12 154.311L135.088 143.771Z' fill='%236259D4'/%3E%3C/svg%3E\",\n reference: '',\n reference_hash: '',\n decimals: 18,\n id: '30d20208d987713f46dfd34ef128bb16c404d10f.factory.bridge.near',\n },\n {\n spec: 'ft-1.0',\n name: 'SWEAT',\n symbol: 'SWEAT',\n icon:\n \"data:image/svg+xml,%3Csvg viewBox='0 0 100 100' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='100' height='100' rx='50' fill='%23FF0D75'/%3E%3Cg clip-path='url(%23clip0_283_2788)'%3E%3Cpath d='M39.4653 77.5455L19.0089 40.02L35.5411 22.2805L55.9975 59.806L39.4653 77.5455Z' stroke='white' stroke-width='10'/%3E%3Cpath d='M66.0253 77.8531L45.569 40.3276L62.1012 22.5882L82.5576 60.1136L66.0253 77.8531Z' stroke='white' stroke-width='10'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='clip0_283_2788'%3E%3Crect width='100' height='56' fill='white' transform='translate(0 22)'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 18,\n id: 'token.sweat',\n },\n {\n spec: 'ft-1.0.0',\n name: 'APYSwap',\n symbol: 'APYS',\n icon:\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgdmlld0JveD0iLTEwIC0xMCAxMjAgMTIwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMTQ2OF81MTk1KSI+CjxwYXRoIGQ9Ik0zOC40MzUzIDEyLjY4NUw3NC41ODY5IDc3Ljg2NzdMOTguOTk5OSA3OC41NjYzTDYyLjY3NDkgMTMuMzc4N0wzOC40MzUzIDEyLjY4NVoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl8xNDY4XzUxOTUpIi8+CjxwYXRoIGQ9Ik0xMi43NjcyIDU1LjQwNzFMODYuOTM2NiA1Ni42MzI2TDk4Ljk5ODIgNzcuODM0OEwwLjAxMTcwNDYgNzYuMTk5MkwxMi43NjcyIDU1LjQwNzFaIiBmaWxsPSJ1cmwoI3BhaW50MV9saW5lYXJfMTQ2OF81MTk1KSIvPgo8cGF0aCBkPSJNNjIuMjQxMSAxMy4wOTRMMjMuODY5OCA3Ny4wODU2TC0wLjUxMDgwNSA3Ni45MTIyTDM3Ljg2NzMgMTIuOTIwN0w2Mi4yNDExIDEzLjA5NFoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8xNDY4XzUxOTUpIi8+CjwvZz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8xNDY4XzUxOTUiIHgxPSI1NS45Njc3IiB5MT0iMjMuODc4MSIgeDI9Ijg1LjQ4MjUiIHkyPSI3Ny4wMTI2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMwOEFFRUEiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMkFGNTk4Ii8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQxX2xpbmVhcl8xNDY4XzUxOTUiIHgxPSIyOS40ODcxIiB5MT0iNjcuODQzIiB4Mj0iNjguOTYzNiIgeTI9IjY4LjgwMzIiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzA4QUVFQSIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyQUY1OTgiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyXzE0NjhfNTE5NSIgeDE9IjUxLjk4MzUiIHkxPSIzLjEzMzQ1IiB4Mj0iMzEuMjQxOCIgeTI9IjM2LjE3MzUiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzA4QUVFQSIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyQUY1OTgiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xNDY4XzUxOTUiPgo8cmVjdCB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4=',\n reference: null,\n reference_hash: null,\n decimals: 24,\n id: 'apys.token.a11bd.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'Tether USD',\n symbol: 'USDt',\n icon:\n \"data:image/svg+xml,%3Csvg width='111' height='90' viewBox='0 0 111 90' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M24.4825 0.862305H88.0496C89.5663 0.862305 90.9675 1.64827 91.7239 2.92338L110.244 34.1419C111.204 35.7609 110.919 37.8043 109.549 39.1171L58.5729 87.9703C56.9216 89.5528 54.2652 89.5528 52.6139 87.9703L1.70699 39.1831C0.305262 37.8398 0.0427812 35.7367 1.07354 34.1077L20.8696 2.82322C21.6406 1.60483 23.0087 0.862305 24.4825 0.862305ZM79.8419 14.8003V23.5597H61.7343V29.6329C74.4518 30.2819 83.9934 32.9475 84.0642 36.1425L84.0638 42.803C83.993 45.998 74.4518 48.6635 61.7343 49.3125V64.2168H49.7105V49.3125C36.9929 48.6635 27.4513 45.998 27.3805 42.803L27.381 36.1425C27.4517 32.9475 36.9929 30.2819 49.7105 29.6329V23.5597H31.6028V14.8003H79.8419ZM55.7224 44.7367C69.2943 44.7367 80.6382 42.4827 83.4143 39.4727C81.0601 36.9202 72.5448 34.9114 61.7343 34.3597V40.7183C59.7966 40.8172 57.7852 40.8693 55.7224 40.8693C53.6595 40.8693 51.6481 40.8172 49.7105 40.7183V34.3597C38.8999 34.9114 30.3846 36.9202 28.0304 39.4727C30.8066 42.4827 42.1504 44.7367 55.7224 44.7367Z' fill='%23009393'/%3E%3C/svg%3E\",\n reference: null,\n reference_hash: null,\n decimals: 6,\n id: 'usdt.tether-token.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'NEAT',\n symbol: 'NEAT',\n icon:\n \"data:image/svg+xml,%3Csvg width='40' height='40' viewBox='0 0 40 40' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Crect width='40' height='40' rx='4.8' fill='%23202020'/%3E%3Crect width='40' height='40' rx='4.8' fill='url(%23paint0_linear_1_5571)'/%3E%3Crect x='10.4' y='12.6001' width='4.8' height='4.8' fill='white'/%3E%3Crect x='15.2' y='12.6001' width='4.8' height='4.8' fill='white'/%3E%3Crect x='24.8' y='12.6001' width='4.8' height='4.8' fill='white'/%3E%3Crect x='10.4' y='17.4001' width='4.8' height='4.8' fill='white'/%3E%3Crect x='24.8' y='17.4001' width='4.8' height='4.8' fill='white'/%3E%3Crect x='10.4' y='22.2002' width='4.8' height='4.8' fill='white'/%3E%3Crect x='24.8' y='22.2002' width='4.8' height='4.8' fill='white'/%3E%3Crect x='20' y='22.2002' width='4.8' height='4.8' fill='white'/%3E%3Crect x='17.6' y='17.4001' width='4.8' height='4.8' fill='white'/%3E%3Cdefs%3E%3ClinearGradient id='paint0_linear_1_5571' x1='20' y1='0' x2='20' y2='40' gradientUnits='userSpaceOnUse'%3E%3Cstop stop-color='%23262626'/%3E%3Cstop offset='1' stop-color='%23121212'/%3E%3C/linearGradient%3E%3C/defs%3E%3C/svg%3E%0A\",\n reference: null,\n reference_hash: null,\n decimals: 8,\n id: 'neat.nrc-20.near',\n },\n {\n spec: 'ft-1.0.0',\n name: 'USMeme',\n symbol: 'USM',\n icon:\n 'https://storage.herewallet.app/upload/13151331-8f9c-4851-8038-36794688c693.jpg',\n reference: null,\n reference_hash: null,\n decimals: 8,\n id: 'usmeme.tg',\n },\n];\n\nexport function getDefaultTokenList() {\n const env = getConfig().networkId;\n\n switch (env) {\n case 'mainnet':\n return DefaultMainnetTokenList;\n case 'testnet':\n return DefaultTestnetTokenList;\n default:\n return DefaultMainnetTokenList;\n }\n}\n","import { TokenMetadata, Transaction } from '../types';\n\nimport {\n priceToPoint,\n toNonDivisibleNumber,\n toPrecision,\n registerAccountOnToken,\n} from '../utils';\nimport { ONE_YOCTO_NEAR, WRAP_NEAR_CONTRACT_ID, config } from '../constant';\nimport { DCLSwapGetStorageBalance } from '../ref';\nimport { DCL_POOL_FEE_LIST, getDCLPoolId } from './dcl-pool';\nimport {\n nearDepositTransaction,\n ftGetStorageBalance,\n refDCLSwapViewFunction,\n} from '../ref';\nimport _ from 'lodash';\nimport { toReadableNumber, percentLess } from '../utils';\nimport { NoPoolOnThisPair, SlippageError } from '../error';\n\ninterface SwapInfo {\n tokenA: TokenMetadata;\n tokenB: TokenMetadata;\n amountA: string;\n}\n\ninterface DCLSwapProps {\n swapInfo: SwapInfo;\n Swap?: {\n pool_ids: string[];\n min_output_amount: string;\n };\n SwapByOutput?: {\n pool_ids: string[];\n output_amount: string;\n };\n LimitOrderWithSwap?: {\n pool_id: string;\n output_amount: string;\n };\n SwapByStopPoint?: {\n pool_id: string;\n stop_point: number;\n skip_unwrap_near: boolean;\n };\n AccountId: string;\n}\nexport const DCL_POOL_SPLITER = '|';\n\nexport const DCLSwap = async ({\n Swap,\n SwapByOutput,\n LimitOrderWithSwap,\n SwapByStopPoint,\n AccountId,\n swapInfo,\n}: DCLSwapProps) => {\n const transactions: Transaction[] = [];\n\n const { tokenA, tokenB, amountA } = swapInfo;\n\n if (Swap) {\n const pool_ids = Swap.pool_ids;\n\n const tokenRegistered = await ftGetStorageBalance(\n tokenB.id,\n AccountId\n ).catch(() => {\n throw new Error(`${tokenB.id} doesn't exist.`);\n });\n\n if (tokenRegistered === null) {\n transactions.push({\n receiverId: tokenB.id,\n functionCalls: [registerAccountOnToken(AccountId)],\n });\n }\n\n const output_token = tokenB.id;\n const min_output_amount = toPrecision(Swap.min_output_amount, 0);\n\n const msg = JSON.stringify({\n Swap: {\n pool_ids,\n output_token,\n min_output_amount,\n client_id: '',\n },\n });\n\n transactions.push({\n receiverId: tokenA.id,\n functionCalls: [\n {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: config.REF_DCL_SWAP_CONTRACT_ID,\n amount: toNonDivisibleNumber(tokenA.decimals, amountA),\n msg,\n },\n gas: '180000000000000',\n amount: ONE_YOCTO_NEAR,\n },\n ],\n });\n } else if (SwapByOutput) {\n const pool_ids = SwapByOutput.pool_ids;\n const output_token = tokenB.id;\n const output_amount = toNonDivisibleNumber(\n tokenB.decimals,\n SwapByOutput.output_amount\n );\n const msg = JSON.stringify({\n SwapByOutput: {\n pool_ids,\n output_token,\n output_amount,\n client_id: '',\n },\n });\n const tokenRegistered = await ftGetStorageBalance(\n tokenB.id,\n AccountId\n ).catch(() => {\n throw new Error(`${tokenB.id} doesn't exist.`);\n });\n\n if (tokenRegistered === null) {\n transactions.push({\n receiverId: tokenB.id,\n functionCalls: [registerAccountOnToken(AccountId)],\n });\n }\n\n transactions.push({\n receiverId: tokenA.id,\n functionCalls: [\n {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: config.REF_DCL_SWAP_CONTRACT_ID,\n amount: toNonDivisibleNumber(tokenA.decimals, amountA),\n msg,\n },\n gas: '180000000000000',\n amount: ONE_YOCTO_NEAR,\n },\n ],\n });\n } else if (LimitOrderWithSwap) {\n const pool_id = LimitOrderWithSwap.pool_id;\n\n const fee = Number(pool_id.split(DCL_POOL_SPLITER)[2]);\n\n const buy_token = tokenB.id;\n const point = priceToPoint({\n amountA,\n amountB: LimitOrderWithSwap.output_amount,\n tokenA,\n tokenB,\n fee,\n });\n\n const tokenRegistered = await ftGetStorageBalance(\n tokenB.id,\n AccountId\n ).catch(() => {\n throw new Error(`${tokenB.id} doesn't exist.`);\n });\n\n if (tokenRegistered === null) {\n transactions.push({\n receiverId: tokenB.id,\n functionCalls: [registerAccountOnToken(AccountId)],\n });\n }\n\n const DCLRegistered = await DCLSwapGetStorageBalance(\n tokenB.id,\n AccountId\n ).catch(() => {\n throw new Error(`${tokenB.id} doesn't exist.`);\n });\n\n if (DCLRegistered === null) {\n transactions.push({\n receiverId: config.REF_DCL_SWAP_CONTRACT_ID,\n functionCalls: [\n {\n methodName: 'storage_deposit',\n args: {\n registration_only: true,\n account_id: AccountId,\n },\n gas: '30000000000000',\n amount: '0.5',\n },\n ],\n });\n }\n\n const new_point =\n pool_id.split(DCL_POOL_SPLITER)[0] === tokenA.id ? point : -point;\n\n const msg = JSON.stringify({\n LimitOrderWithSwap: {\n pool_id,\n buy_token,\n point: new_point,\n client_id: '',\n },\n });\n\n transactions.push({\n receiverId: tokenA.id,\n functionCalls: [\n {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: config.REF_DCL_SWAP_CONTRACT_ID,\n amount: toNonDivisibleNumber(tokenA.decimals, amountA),\n msg,\n },\n gas: '180000000000000',\n amount: ONE_YOCTO_NEAR,\n },\n ],\n });\n } else if (SwapByStopPoint) {\n const tokenRegistered = await ftGetStorageBalance(\n tokenB.id,\n AccountId\n ).catch(() => {\n throw new Error(`${tokenB.id} doesn't exist.`);\n });\n\n if (tokenRegistered === null) {\n transactions.push({\n receiverId: tokenB.id,\n functionCalls: [registerAccountOnToken(AccountId)],\n });\n }\n const msg = JSON.stringify({\n SwapByStopPoint: SwapByStopPoint,\n });\n transactions.push({\n receiverId: tokenA.id,\n functionCalls: [\n {\n methodName: 'ft_transfer_call',\n args: {\n receiver_id: config.REF_DCL_SWAP_CONTRACT_ID,\n amount: toNonDivisibleNumber(tokenA.decimals, amountA),\n msg,\n },\n gas: '180000000000000',\n amount: ONE_YOCTO_NEAR,\n },\n ],\n });\n }\n\n if (tokenA.id === WRAP_NEAR_CONTRACT_ID) {\n const registered = await ftGetStorageBalance(\n WRAP_NEAR_CONTRACT_ID,\n AccountId\n );\n if (registered === null) {\n transactions.unshift({\n receiverId: WRAP_NEAR_CONTRACT_ID,\n functionCalls: [registerAccountOnToken(AccountId)],\n });\n }\n }\n\n return transactions;\n};\n\nexport const quote = async ({\n pool_ids,\n input_amount,\n input_token,\n output_token,\n tag,\n}: {\n pool_ids: string[];\n input_token: TokenMetadata;\n output_token: TokenMetadata;\n input_amount: string;\n tag?: string;\n}) => {\n return refDCLSwapViewFunction({\n methodName: 'quote',\n args: {\n pool_ids,\n input_token: input_token.id,\n output_token: output_token.id,\n input_amount: toNonDivisibleNumber(input_token.decimals, input_amount),\n tag,\n },\n });\n};\n\nexport const list_user_assets = async (AccountId: string) => {\n if (!AccountId) return;\n\n return refDCLSwapViewFunction({\n methodName: 'list_user_assets',\n args: {\n account_id: AccountId,\n },\n });\n};\n\nexport const DCLSwapByInputOnBestPool = async ({\n tokenA,\n tokenB,\n amountA,\n slippageTolerance,\n AccountId,\n}: {\n tokenA: TokenMetadata;\n tokenB: TokenMetadata;\n amountA: string;\n slippageTolerance: number;\n AccountId: string;\n}) => {\n if (slippageTolerance <= 0 || slippageTolerance >= 100) {\n throw SlippageError;\n }\n\n const estimates = await Promise.all(\n DCL_POOL_FEE_LIST.map(async fee => {\n const pool_id = getDCLPoolId(tokenA.id, tokenB.id, fee);\n return quote({\n pool_ids: [pool_id],\n input_token: tokenA,\n output_token: tokenB,\n input_amount: amountA,\n tag: `${tokenA.id}-${fee}-${amountA}`,\n }).catch(e => null);\n })\n );\n\n if (!estimates || estimates.every(e => e === null)) {\n throw NoPoolOnThisPair(tokenA.id, tokenB.id);\n }\n\n const bestEstimate =\n estimates && estimates?.some(e => !!e)\n ? _.maxBy(estimates, e => Number(!e || !e.tag ? -1 : e.amount))\n : null;\n\n const bestFee =\n bestEstimate &&\n bestEstimate.tag &&\n bestEstimate?.tag?.split('-')?.[1] &&\n Number(bestEstimate?.tag?.split('-')?.[1]);\n\n return DCLSwap({\n swapInfo: {\n tokenA,\n tokenB,\n amountA,\n },\n Swap: {\n pool_ids: [getDCLPoolId(tokenA.id, tokenB.id, bestFee)],\n min_output_amount: percentLess(slippageTolerance, bestEstimate.amount),\n },\n AccountId,\n });\n};\n\nexport const quote_by_output = ({\n pool_ids,\n output_amount,\n input_token,\n output_token,\n}: {\n pool_ids: string[];\n input_token: TokenMetadata;\n output_token: TokenMetadata;\n output_amount: string;\n}) => {\n return refDCLSwapViewFunction({\n methodName: 'quote_by_output',\n args: {\n pool_ids,\n input_token: input_token.id,\n output_token: output_token.id,\n output_amount: toNonDivisibleNumber(output_token.decimals, output_amount),\n },\n });\n};\n","import { TokenMetadata, Transaction } from '../types';\nimport { NoOrderFound, OrderNoRemainedAmount } from '../error';\nimport {\n priceToPoint,\n toNonDivisibleNumber,\n toPrecision,\n registerAccountOnToken,\n} from '../utils';\nimport {\n ONE_YOCTO_NEAR,\n WRAP_NEAR_CONTRACT_ID,\n config,\n POINTLEFTRANGE,\n POINTRIGHTRANGE,\n} from '../constant';\nimport {\n nearDepositTransaction,\n ftGetStorageBalance,\n refDCLSwapViewFunction,\n} from '../ref';\n\nexport interface UserOrderInfo {\n order_id: string;\n owner_id: string;\n pool_id: string;\n point: number;\n sell_token: string;\n created_at: string;\n original_amount: string;\n remain_amount: string; // 0 means history order: ;\n cancel_amount: string;\n // amount through ft_transfer_call\n\n original_deposit_amount: string;\n // earn token amount through swap before actual place order\n\n swap_earn_amount: string;\n buy_token: string;\n unclaimed_amount: string; // claim will push it to inner account\n bought_amount: string; // accumalated amount into inner account\n}\n\nexport const list_history_orders = (AccountId: string) => {\n return refDCLSwapViewFunction({\n methodName: 'list_history_orders',\n args: {\n account_id: AccountId,\n },\n });\n};\n\nexport const list_active_orders = (AccountId: string) => {\n return refDCLSwapViewFunction({\n methodName: 'list_active_orders',\n args: {\n account_id: AccountId,\n },\n });\n};\n\nexport const get_order = async (order_id: string) => {\n return refDCLSwapViewFunction({\n methodName: 'get_order',\n args: {\n order_id,\n },\n }).catch(() => {\n throw NoOrderFound(order_id);\n });\n};\n\nexport const find_order = async ({\n pool_id,\n point,\n AccountId,\n}: {\n pool_id: string;\n point: number;\n AccountId: string;\n}) => {\n return refDCLSwapViewFunction({\n methodName: 'find_order',\n args: {\n account_id: AccountId,\n pool_id,\n point,\n },\n }).catch(() => {\n throw NoOrderFound();\n }) as Promise<UserOrderInfo>;\n};\nexport const cancel_order = async (order_id: string) => {\n const order = await get_order(order_id);\n\n if (!order.remain_amount) throw OrderNoRemainedAmount;\n\n const transactions: Transaction[] = [\n {\n receiverId: config.REF_DCL_SWAP_CONTRACT_ID,\n functionCalls: [\n {\n methodName: 'cancel_order',\n args: {\n order_id,\n amount: order.remain_amount,\n },\n gas: '180000000000000',\n },\n ],\n },\n ];\n\n return transactions;\n};\n\nexport const claim_order = (order_id: string) => {\n const transactions: Transaction[] = [\n {\n receiverId: config.REF_DCL_SWAP_CONTRACT_ID,\n functionCalls: [\n {\n methodName: 'cancel_order',\n args: {\n order_id,\n amount: '0',\n },\n gas: '180000000000000',\n },\n ],\n },\n ];\n\n return transactions;\n};\n\nexport const get_pointorder_range = ({\n pool_id,\n left_point,\n right_point,\n}: {\n pool_id: string;\n left_point?: number;\n right_point?: number;\n}) => {\n return refDCLSwapViewFunction({\n methodName: 'get_pointorder_range',\n args: {\n pool_id,\n left_point: left_point || POINTLEFTRANGE,\n right_point: right_point || POINTRIGHTRANGE,\n },\n });\n};\n","import React, { useEffect, useMemo, useState } from 'react';\n\nimport { SwapWidgetProps } from './types';\nimport { TokenMetadata } from '../types';\nimport {\n useRefPools,\n useSwap,\n ThemeContextProvider,\n TokenPriceContextProvider,\n useAllTokens,\n} from './state';\nimport { ftGetBalance, ftGetTokenMetadata } from '../ref';\nimport {\n getAccountName,\n toReadableNumber,\n toPrecision,\n getPriceImpact,\n isMobile,\n} from '../utils';\nimport {\n Slider,\n SlippageSelector,\n TokenSelector,\n TokenAmount,\n DetailView,\n Notification,\n} from './components';\nimport { FiChevronDown } from '@react-icons/all-files/fi/FiChevronDown';\n\nimport { TiWarning } from '@react-icons/all-files/ti/TiWarning';\n\nimport './style.css';\nimport { useTokenPriceList, useTokenBalnces, useTokensIndexer } from './state';\n\nimport { CgArrowsExchangeAltV } from '@react-icons/all-files/cg/CgArrowsExchangeAltV';\nimport { RefIcon, AccountButton } from './components';\nimport Big from 'big.js';\nimport { ONLY_ZEROS } from '../utils';\nimport {\n defaultTheme,\n defaultDarkModeTheme,\n REF_WIDGET_SWAP_IN_KEY,\n REF_WIDGET_SWAP_OUT_KEY,\n} from './constant';\nimport {\n WRAP_NEAR_CONTRACT_ID,\n NEAR_META_DATA,\n REF_TOKEN_ID,\n REF_META_DATA,\n} from '../constant';\n\nexport const SwapWidget = (props: SwapWidgetProps) => {\n const {\n theme,\n defaultTokenList,\n onSwap,\n connection,\n width,\n height,\n enableSmartRouting,\n className,\n transactionState,\n onConnect,\n defaultTokenIn,\n defaultTokenOut,\n onDisConnect,\n darkMode,\n referralId,\n } = props;\n\n const curTheme = theme || (darkMode ? defaultDarkModeTheme : defaultTheme);\n\n const STORAGED_TOKEN_IN = localStorage.getItem(REF_WIDGET_SWAP_IN_KEY);\n\n const STORAGED_TOKEN_OUT = localStorage.getItem(REF_WIDGET_SWAP_OUT_KEY);\n\n const {\n container,\n buttonBg,\n primary,\n secondary,\n borderRadius,\n fontFamily,\n hover,\n active,\n secondaryBg,\n borderColor,\n iconDefault,\n iconHover,\n refIcon,\n } = curTheme;\n\n const { AccountId, isSignedIn: isSignedInProp } = connection;\n\n const isSignedIn = !!AccountId && isSignedInProp;\n\n const [tokenIn, setTokenIn] = useState<TokenMetadata>();\n\n const handleSetTokenIn = (token: TokenMetadata) => {\n setTokenIn(token);\n localStorage.setItem(REF_WIDGET_SWAP_IN_KEY, token.id);\n };\n\n const handleSetTokenOut = (token: TokenMetadata) => {\n setTokenOut(token);\n localStorage.setItem(REF_WIDGET_SWAP_OUT_KEY, token.id);\n };\n\n const [tokenOut, setTokenOut] = useState<TokenMetadata>();\n const [tokenInBalance, setTokenInBalance] = useState<string>('');\n\n const [tokenOutBalance, setTokenOutBalance] = useState<string>('');\n\n const [notOpen, setNotOpen] = useState<boolean>(false);\n\n useEffect(() => {\n if (!transactionState) return;\n\n if (transactionState && transactionState.state !== null) {\n setNotOpen(true);\n }\n transactionState?.setState(transactionState?.state || null);\n }, [transactionState]);\n\n const [widgetRoute, setWidgetRoute] = useState<\n 'swap' | 'token-selector-in' | 'token-selector-out'\n >('swap');\n\n const [amountIn, setAmountIn] = useState<string>('1');\n\n const [showSlip, setShowSlip] = useState<boolean>(false);\n\n const [slippageTolerance, setSlippageTolerance] = useState<number>(0.5);\n\n const { tokens, tokenLoading } = useTokensIndexer({\n defaultTokenList,\n AccountId,\n });\n\n // cache list tokens\n useAllTokens({ reload: true });\n\n const balances = useTokenBalnces(tokens, AccountId);\n\n const [refreshTrigger, setRreshTrigger] = useState<boolean>(false);\n\n const tokenPriceList = useTokenPriceList();\n\n const { allPools, allStablePools, poolFetchingState } = useRefPools(\n refreshTrigger\n );\n\n useEffect(() => {\n const defaultIn =\n STORAGED_TOKEN_IN || defaultTokenIn || WRAP_NEAR_CONTRACT_ID;\n\n const defaultOut = STORAGED_TOKEN_OUT || defaultTokenOut || REF_TOKEN_ID;\n\n if (\n tokens.length > 0 &&\n defaultIn &&\n tokens.findIndex(t => t.id === defaultIn) !== -1\n ) {\n if (defaultIn === WRAP_NEAR_CONTRACT_ID || defaultIn === 'NEAR') {\n handleSetTokenIn({\n ...NEAR_META_DATA,\n id: WRAP_NEAR_CONTRACT_ID,\n });\n } else {\n ftGetTokenMetadata(defaultIn).then(handleSetTokenIn);\n }\n } else if (\n tokens.length > 0 &&\n defaultIn &&\n tokens.findIndex(t => t.id === defaultIn) === -1\n ) {\n handleSetTokenIn({\n ...NEAR_META_DATA,\n id: WRAP_NEAR_CONTRACT_ID,\n });\n }\n if (\n tokens.length > 0 &&\n defaultOut &&\n tokens.findIndex(t => t.id === defaultOut) !== -1\n ) {\n if (defaultOut === WRAP_NEAR_CONTRACT_ID || defaultOut === 'NEAR') {\n handleSetTokenOut({\n ...NEAR_META_DATA,\n id: WRAP_NEAR_CONTRACT_ID,\n });\n } else {\n ftGetTokenMetadata(defaultOut).then(handleSetTokenOut);\n }\n } else if (\n tokens.length > 0 &&\n defaultOut &&\n tokens.findIndex(t => t.id === defaultOut) === -1\n ) {\n handleSetTokenOut(REF_META_DATA);\n }\n }, [tokens, tokenLoading]);\n\n useEffect(() => {\n if (!tokenIn) return;\n\n const wrapedId = tokenIn.id === WRAP_NEAR_CONTRACT_ID ? 'NEAR' : tokenIn.id;\n\n if (balances[wrapedId]) {\n setTokenInBalance(balances[wrapedId]);\n return;\n }\n\n ftGetBalance(wrapedId, AccountId).then(available => {\n setTokenInBalance(toReadableNumber(tokenIn.decimals, available));\n });\n }, [tokenIn, AccountId, balances]);\n\n useEffect(() => {\n if (!tokenOut) return;\n\n const wrapedId =\n tokenOut.id === WRAP_NEAR_CONTRACT_ID ? 'NEAR' : tokenOut.id;\n\n if (balances[wrapedId]) {\n setTokenOutBalance(balances[wrapedId]);\n return;\n }\n ftGetBalance(wrapedId, AccountId).then(available => {\n setTokenOutBalance(toReadableNumber(tokenOut.decimals, available));\n });\n }, [tokenOut, AccountId, balances]);\n\n const {\n amountOut,\n minAmountOut,\n rate,\n fee,\n estimates,\n canSwap,\n swapError,\n makeSwap,\n setAmountOut,\n } = useSwap({\n tokenIn: tokenIn,\n tokenOut: tokenOut,\n amountIn,\n simplePools: allPools.simplePools.filter(p => Number(p.shareSupply) > 0),\n options: {\n enableSmartRouting,\n stablePools: allPools.ratedPools\n .concat(allPools.unRatedPools)\n .filter(p => Number(p.shareSupply) > 0),\n stablePoolsDetail: allStablePools.filter(\n p => Number(p.shares_total_supply) > 0\n ),\n },\n slippageTolerance,\n onSwap,\n AccountId,\n refreshTrigger,\n poolFetchingState,\n referralId,\n });\n\n const priceImpact = useMemo(() => {\n if (!tokenIn || !tokenOut) return '0';\n\n return getPriceImpact({\n estimates,\n tokenIn,\n tokenOut,\n amountIn,\n amountOut,\n stablePools: allStablePools,\n });\n }, [estimates, tokenIn, tokenOut, amountIn, amountOut, allStablePools]);\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n setNotOpen(true);\n makeSwap();\n };\n\n const canSubmit =\n tokenIn &&\n tokenOut &&\n canSwap &&\n !swapError &&\n isSignedIn &&\n new Big(tokenInBalance || '0').gte(amountIn || '0') &&\n slippageTolerance > 0 &&\n slippageTolerance < 100 &&\n !ONLY_ZEROS.test(tokenInBalance);\n\n return (\n <ThemeContextProvider customTheme={curTheme}>\n <TokenPriceContextProvider>\n {widgetRoute === 'swap' && (\n <form\n className={`__ref-swap-widget-container ${className}`}\n onSubmit={handleSubmit}\n style={{\n background: container,\n fontFamily,\n width,\n height,\n }}\n >\n <div className=\"__ref-swap-widget-header __ref-swap-widget-row-flex-center\">\n <div\n style={{\n color: primary,\n }}\n className=\"__ref-swap-widget-header-title\"\n >\n Swap\n </div>\n\n <div\n className=\"__ref-swap-widget-header-button __ref-swap-widget-row-flex-center\"\n style={{\n position: 'relative',\n }}\n >\n <AccountButton\n onDisConnect={onDisConnect}\n AccountId={AccountId}\n />\n\n <Slider showSlip={showSlip} setShowSlip={setShowSlip} />\n\n <SlippageSelector\n slippageTolerance={slippageTolerance}\n onChangeSlippageTolerance={setSlippageTolerance}\n showSlip={showSlip}\n setShowSlip={setShowSlip}\n />\n </div>\n </div>\n\n <TokenAmount\n amount={amountIn}\n balance={tokenInBalance}\n token={tokenIn}\n price={!tokenIn ? null : tokenPriceList?.[tokenIn.id]?.price}\n onChangeAmount={setAmountIn}\n onSelectToken={() => {\n setWidgetRoute('token-selector-in');\n }}\n />\n\n <div\n className={`__ref-swap-widget-exchange-button __ref-swap-widget-row-flex-center `}\n style={{\n color: iconDefault,\n }}\n >\n <CgArrowsExchangeAltV\n style={{\n cursor: 'pointer',\n }}\n className={`__ref-swap-widget-exchange-button-icon ${\n isMobile()\n ? '__ref-swap-widget-active'\n : '__ref-swap-widget-hover'\n }`}\n size={30}\n onClick={() => {\n tokenOut && handleSetTokenIn(tokenOut);\n tokenIn && handleSetTokenOut(tokenIn);\n setAmountIn('1');\n setAmountOut('');\n }}\n />\n </div>\n\n <TokenAmount\n amount={toPrecision(amountOut, 8)}\n balance={tokenOutBalance}\n token={tokenOut}\n price={!tokenOut ? null : tokenPriceList?.[tokenOut.id]?.price}\n onSelectToken={() => {\n setWidgetRoute('token-selector-out');\n }}\n onForceUpdate={() => {\n setRreshTrigger(!refreshTrigger);\n }}\n poolFetchingState={poolFetchingState}\n />\n {!swapError && amountIn && amountOut && (\n <DetailView\n fee={fee}\n rate={rate}\n amountIn={amountIn}\n minReceived={minAmountOut}\n tokenIn={tokenIn}\n tokenOut={tokenOut}\n amountOut={amountOut}\n priceImpact={priceImpact}\n estimates={estimates}\n />\n )}\n\n {swapError && (\n <div\n className=\"__ref-swap-widget-row-flex-center\"\n style={{\n color: '#DE9450',\n fontSize: '14px',\n\n paddingTop: '16px',\n }}\n >\n <TiWarning fill=\"#DE9450\" size={20} />\n &nbsp;\n {swapError.message}\n </div>\n )}\n {isSignedIn ? (\n <button\n type=\"submit\"\n className=\"__ref-swap-widget-submit-button __ref-swap-widget-button\"\n style={{\n color: 'white',\n background: buttonBg,\n opacity: !canSubmit ? 0.5 : 1,\n cursor: !canSubmit ? 'not-allowed' : 'pointer',\n }}\n disabled={!canSubmit}\n >\n {'Swap'}\n </button>\n ) : (\n <button\n type=\"button\"\n className=\"__ref-swap-widget-submit-button __ref-swap-widget-button\"\n onClick={onConnect}\n style={{\n color: 'white',\n background: buttonBg,\n cursor: 'pointer',\n }}\n >\n {'Connect Wallet'}\n </button>\n )}\n <div\n className=\"__ref-swap-widget-row-flex-center\"\n style={{\n justifyContent: 'center',\n }}\n >\n <a\n className=\"__ref-swap-widget-row-flex-center\"\n style={{\n color: secondary,\n justifyContent: 'center',\n paddingTop: '12px',\n fontSize: '14px',\n display: 'inline-flex',\n }}\n href=\"https://ref.finance\"\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n <RefIcon\n style={{\n color: refIcon || 'black',\n }}\n />\n &nbsp; Powered by Ref.finance\n </a>\n </div>\n\n <Notification\n state={transactionState?.state}\n setState={transactionState?.setState}\n open={notOpen}\n setOpen={setNotOpen}\n tx={transactionState?.tx}\n detail={transactionState?.detail}\n />\n </form>\n )}\n\n {widgetRoute === 'token-selector-in' && (\n <TokenSelector\n balances={balances}\n tokens={tokens}\n width={width}\n onSelect={token => {\n handleSetTokenIn(token);\n setWidgetRoute('swap');\n }}\n onClose={() => setWidgetRoute('swap')}\n AccountId={AccountId}\n className={className}\n />\n )}\n\n {widgetRoute === 'token-selector-out' && (\n <TokenSelector\n tokens={tokens}\n balances={balances}\n width={width}\n onSelect={token => {\n handleSetTokenOut(token);\n setWidgetRoute('swap');\n }}\n onClose={() => setWidgetRoute('swap')}\n AccountId={AccountId}\n className={className}\n />\n )}\n </TokenPriceContextProvider>\n </ThemeContextProvider>\n );\n};\n"],"names":["ONE_YOCTO_NEAR","ENV","INDEXER_URL","getConfig","env","indexerUrl","process","NEAR_ENV","REACT_APP_REF_SDK_ENV","networkId","nodeUrl","walletUrl","WRAP_NEAR_CONTRACT_ID","REF_FI_CONTRACT_ID","REF_TOKEN_ID","explorerUrl","REF_DCL_SWAP_CONTRACT_ID","config","WNEAR_META_DATA","id","name","symbol","decimals","icon","REF_META_DATA","NEAR_META_DATA","TokenLinks","NEAR","wNEAR","REF","OCT","PARAS","SKYWARD","FLX","PULSE","DBIO","MYRIA","PXT","HAPI","OIN","ABR","1MIL","MARMAJ","marmaj","USN","1INCH","GRT","LINK","Cheddar","AURORA","$META","UMINT","UTO","DEIP","WOO","LINEAR","PEM","ATO","SEAT","FAR","BSTN","BRRR","XNL","KSW","STNEAR","NearX","SD","DISC","switchEnv","calc_d","amp","c_amounts","token_num","length","sum_amounts","_","sum","d_prev","d","i","d_prod","ann","Math","abs","calc_y","x_c_amount","current_c_amounts","index_x","index_y","s","c","b","y_prev","y","calc_swap","in_token_idx","in_c_amount","out_token_idx","old_c_amounts","trade_fee","dy","fee","amount","tradeFee","getSwappedAmount","tokenInId","tokenOutId","amountIn","stablePool","STABLE_LP_TOKEN_DECIMALS","total_fee","token_account_ids","findIndex","rates","map","r","toReadableNumber","toNonDivisibleNumber","scientificNotationToString","Big","times","toString","Number","DEFAULT_START_TOKEN_LIST_TESTNET","DEFAULT_START_TOKEN_LIST_MAINNET","defaultTheme","container","buttonBg","primary","secondary","borderRadius","fontFamily","hover","active","secondaryBg","borderColor","iconDefault","iconHover","defaultDarkModeTheme","refIcon","icons","4691937a7508860f876c9c0a2a617e7d9e945d4b.factory.bridge.near","wrap.near","wrap.testnet","6b175474e89094c44da98b954eedeac495271d0f.factory.bridge.near","berryclub.ek.near","dac17f958d2ee523a2206206994597c13d831ec7.factory.bridge.near","1f9840a85d5af5bf1d1762f925bdaddc4201f984.factory.bridge.near","514910771af9ca656af840dff83e8264ecf986ca.factory.bridge.near","a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.factory.bridge.near","2260fac5e5542a773aa44fbcfedf7c193bc2c599.factory.bridge.near","7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9.factory.bridge.near","a0b73e1ff0b80914ab6fe0444e65848c4c34450b.factory.bridge.near","50d1c9771902476076ecfc8b2a83ad6b9355a4c9.factory.bridge.near","4fabb145d64652a948d72533023f6e7a623c7c53.factory.bridge.near","6f259637dcd74c767781e37bc6133cd6a68aa161.factory.bridge.near","6b3595068778dd592e39a122f4f5a5cf09c90fe2.factory.bridge.near","c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f.factory.bridge.near","c944e90c64b2c07662a292be6244bdf05cda44a7.factory.bridge.near","9f8f72aa9304c8b593d555f12ef6589cc3a579a2.factory.bridge.near","0bc529c00c6401aef6d220be8c6ea1667f6ad93e.factory.bridge.near","c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2.factory.bridge.near","0316eb71485b0ab14103307bf65a021042c6d380.factory.bridge.near","111111111117dc0aa78b770fa6a738034120c302.factory.bridge.near","f5cfbc74057c610c8ef151a439252680ac68c6dc.factory.bridge.near","de30da39c46104798bb5aa3fe8b9e0e1f348163f.factory.bridge.near","a4ef4b0b23c1fc81d3f9ecf93510e64f58a4a016.factory.bridge.near","token.cheddar.near","farm.berryclub.ek.near","d9c2d319cd7e6177336b0a9c93c21cb48d84fb54.factory.bridge.near","getTokenPriceList","_context","fetch","method","headers","Content-type","then","res","json","list","getTokens","reload","storagedTokens","window","localStorage","getItem","_context2","JSON","parse","tokens","Object","values","reduce","acc","cur","keys","REPLACE_TOKENS","includes","metaIconDefaults","setItem","stringify","getTokensTiny","_context3","getWhiteListTokensIndexer","whiteListIds","_context4","checkIntegerSumOfAllocations","allocations","totalInput","alloSum","item","round","a","plus","offset","minus","currMax","currMaxInd","gt","newAllocations","j","push","RM","DP","NE","PE","_marked5","yenFromPy","bisqrt","value","BigInt","newtonIteration","n","x0","x1","getBetaForRoute","route","path","beta","reserves","p2","getEpsilonForRoute","p","gamma","div","epsilon","p1","gamma1","gamma2","getAlphaForRoute","inputToken","outputToken","key2","token2Id","val2","token2Supply","token1Id","token1Supply","alpha","key12","val12","key22","val22","middleToken","alpha1","alpha2","getAllocationForRoute","phi","toFixed","getNodeRoutesFromPathsAndPoolChains","paths","poolChains","multiplicity","mul","elem1","elem2","nodeRoutes","m","k","getPoolChainFromPaths","pools","threshold","pathInd","chain","pairs","pairInd","pair","tokenPools","getPoolsByToken1ANDToken2","newChains","newPath","legInd","culledPath","cullPoolsWithInsufficientLiquidity","getCulledPoolChains","getRoutesFromPoolChain","routes","pci","newRoutes","flatMap","e","flat","getOutputSingleHop","pool","num","denom","getOutputFromRoute","nodeRoute","allocation","eq","output","poolIndex","c1","a1","c2","b2","getOutputDoubleHop","getOptOutputVec","getOptimalAllocationForRoutes","allocationVec","getAllocationVectorForRoutes","alphaSum","radical","getAlphaSumFromRoutes","betaSum","getBetaSumFromRoutes","getPhiFromRoutes","every","lt","some","goodIndices","newNodeRoutes","goodIndex","allocationDict","allocationVecNew","zeroAllocation","reduceRoutes","sumAllocations","result","getBestOptInputAndOutput","rawDict","outputRaw","inputRaw","input","v","bv1","bv2","getBestOptimalAllocationsAndOutputs","_getBestOptimalAllocationsAndOutputs","maxPathLength","_context6","getPathsFromPools","outputs","inputOutput","getActionListFromRoutesAndAllocations","hops","hop","allRoutes","allNodeRoutes","totalInputAmount","allAllocations","middleTokenAllocation","getHopActionsFromRoutes","getSmartRouteSwapActions","_getSmartRouteSwapActions","allTokens","numberOfRoutesLimit","MAX_NUMBER_PARALLEL_POOLS","decimalsCulledPoolIds","_context9","filter","resDict","sortedIndexValues","argsort","topIndices","slice","reducedRoutes","reducedNodeRoutes","ind","currentBestOutput","bestAllocations","bestNodeRoutes","parallelNodeRoutes","parallelRoutes","bestRoutes","currentNodeRoute","bestRoutesAreParallel","filteredAllocationsAndOutputs","parallelOutputs","parallellAllocations","sortIndices","filteredParallelRoutes","filteredParallelNodeRoutes","parallelOutput","canHaveTwoRoutes","route1","route2","nodeRoute1","nodeRoute2","route1PoolIds","Set","route2PoolIds","sharePool","has","currentRoutes","currentNodeRoutes","filteredAllocations","totalOutput","allSortedIndices","sortedIndices","filteredRoutes","filteredNodeRoutes","index","sharedRoute","allFilteredRoutes","allFilteredNodeRoutes","firstRoutePoolIds","allFilteredRouteIds","secondRoute","stringAllo","actions","ftGetTokenMetadata","hopInputTokenMeta","hopOutputTokenDecimals","expectedHopOutput","decimalEstimate","pow","status","Promise","all","t","_context8","estimate","gamma_bps","partialAmountIn","supplies","token0_ref_price","token0_price","tokenIds","Dex","token","routeInputToken","routeOutputToken","overallPriceImpact","x","calculateSmartRouteV2PriceImpact","action","_calculateSmartRouteV2PriceImpact","deltaY","inputTokenMeta","deltaX","R","P","totalAllocations","weights","_context12","_context11","weight","routeMarketPrice","num1","denom1","num2","denom2","priceImpact","arr","decor","sort","token1","token2","cullZeroLiquidityPools","filteredPools","thresh","normLiq","liquidities","poolInd","amounts","poolBigAmounts","liquidity","getLiqudityOfPoolsFromList","maxLiq","arrayOfBigs","maxElem","val","bigMax","getNormalizedLiquiditiesFromList","addEdge","g","edge","src","dst","deleteEdge","gNew","e1","e2","deleteNode","node","nodeInd","nodeNow","shortestPath","ignore_nodes","ignore_edges","gTemp","edgeInd","solution","graph","solutions","dist","parent","nearest","Infinity","ndist","adj","concat","dijkstra","unshift","PoolMode","PathBuffer","this","sortedpaths","_proto","len","cost","arrayContains","pop","shift","splice","indexOf","arrayEquals","Array","isArray","obj","obj_json","itemInd","source","target","listA","listB","prev_path","root","root_length","sol","spur","_context5","getKShortestPaths","gen","next","_getPathsFromPools","getGraphFromPoolList","poolList","edgeList","addEdges","stableSmart","_stableSmart","_context15","getExpectedOutputFromActionsORIG","getSimplePoolEstimate","tokenIn","tokenOut","amount_with_fee","in_balance","out_balance","getStablePoolEstimate","getStablePoolDecimal","amount_swapped","amountOut","isNaN","toPrecision","dyOut","noFeeAmountOut","singlePoolSwap","simplePools","stablePools","NoPoolError","parsedAmountIn","estimatesSimplePool","isStablePool","stablePoolThisPair","sp","estimatesStablePool","find","maxSimplePoolEstimate","undefined","maxBy","maxStablePoolEstimate","getStablePoolsThisPair","getPoolsByTokens","getPoolEstimate","stablePoolDetail","getHybridStableSmart","_getHybridStableSmart","stablePoolsDetail","isStablePoolToken","stablePoolsDetailById","pools1","pools2","pools1Right","pools2Right","candidatePools","otherStables","stablePoolsThisPair","otherStable","tmpPools","tobeAddedPools","middleTokens","_loop2","p2s","_loop","ftGetTokensMetadata","cp","tokensMedata","BestPoolPair","poolPair","stablePoolDetailThisPair","spd","tmpPool1","tmpPool2","tokenMidId","tokenMidMeta","estimate1","SMART","estimate2","bestPool","STABLE","pool1","pool2","estimateSwap","options","SameInputTokenError","ONLY_ZEROS","test","ZeroInputError","enableSmartRouting","_ref10","singleRouteEstimate","PARALLEL","inputPools","poolFormatter","simplePoolSmartRoutingEstimate","simplePoolSmartRoutingActions","hybridSmartRoutingEstimate","hybridSmartRoutingRes","gte","_singleRouteEstimate","_singleRouteEstimate$","_singleRouteEstimate2","_singleRouteEstimate3","parsePool","shareSupply","shares_total_supply","tvl","pool_kind","shares","tokenId","poolId","minAmountOut","isInteger","ceil","convertToPercentDecimal","percent","math","percentOf","percentLess","notation","getGas","gas","BN","number","substring","padStart","replace","split","_number$split$","padEnd","strParam","sysbol","negative","match","_strParam$match","basis","_strParam$match2","wholeStr","fractionStr","ifFraction","formatWithCommas","pattern","precision","withCommas","atLeastOne","whole","_number$split2$","decimal","str","lastIndexOf","transformTransactions","transactions","AccountId","signerId","receiverId","functionCalls","fc","type","params","methodName","args","toNumber","deposit","utils","format","parseNearAmount","separateRoutes","curRoute","calculateExchangeRate","from","to","getAvgFee","estimates","forEach","getAccountName","account","network","niceAccountId","symbolsArr","multiply","factor1","factor2","toInternationalCurrencySystemLongString","labelValue","percentOfBigNumber","valueBig","percentBig","toRealSymbol","charAt","toUpperCase","calculateFeeCharge","total","calculateFeePercent","getExpectedOutputFromSwapTodos","calculateAmountReceived","big_in_balance","big_out_balance","constant_product","new_in_balance","new_out_balance","calculateMarketPrice","cur_in_balance","cur_out_balance","calculateSmartRoutingPriceImpact","tokenInAmount","swapTodos","tokenMid","stableOutPool2","isPool1StablePool","isPool2StablePool","marketPrice1","_swapTodos$0$pool$rat","_swapTodos$0$pool$rat2","marketPrice2","_swapTodos$1$pool$rat","_swapTodos$1$pool$rat2","generalMarketPrice","tokenMidReceived","formattedTokenMidReceived","stablePool2","stableOut","tokenOutReceived","newMarketPrice","PriceImpact","numerator","denominator","calcStableSwapPriceImpact","marketPrice","calculatePriceImpact","finalMarketPrice","separatedReceivedAmount","finalTokenOutReceived","calculateSmartRoutesV2PriceImpact","tokenInPara","_routes$0$0$tokens","rawRes","readablePartialAmountIn","_r$0$tokens","_r$0$tokens2","_r$0$tokens3","_r$0$pool$rates","_r$0$pool$rates2","_r$0$tokens4","_r$0$tokens5","pre","getPriceImpact","priceImpactValueSmartRouting","priceImpactValueSmartRoutingV2","_estimates$0$tokens","_estimates$0$pool$rat","_estimates$0$pool$rat2","error","subtraction","initialValue","toBeSubtract","getPoolAllocationPercents","partialAmounts","ps","fill","sortedAmount","sortBy","minIndexes","minIndex","finalPIndex","isMobile","screen","width","divide","getMax","String","getPointByPrice","pointDelta","price","decimalRate","noNeedSlot","point","log","point_int","point_int_slot","floor","feeToPointDelta","NoFeeToPool","priceToPoint","tokenA","tokenB","amountA","amountB","DCL_POOL_FEE_LIST","decimal_price_A_by_B","registerAccountOnToken","registration_only","account_id","getKeyStore","keyStores","InMemoryKeyStore","BrowserLocalStorageKeyStore","provider","providers","JsonRpcProvider","url","getMemorySigner","keyPath","credentials","fs","readFileSync","credentialAccountId","NoCredential","AccountIdMisMatch","myKeyStore","setKey","KeyPair","fromString","private_key","signer","InMemorySigner","validateAccessKey","transaction","accessKey","permission","FunctionCall","method_names","receiver_id","parseFloat","getSignedTransactionsByMemoryKey","transactionsRef","block","finality","signedTransactions","getPublicKey","publicKey","NoPuiblicKeyError","query","request_type","public_key","InValidAccessKeyError","tx","nearTransactions","createTransaction","PublicKey","nonce","functionCall","serialize","base_decode","header","hash","signTransaction","sendTransactionsByMemoryKey","results","sendTransaction","HAPI_ID","WOO_ID","near","Near","keyStore","refFiViewFunction","viewFunction","ftViewFunction","ftGetStorageBalance","NoAccountIdFound","ftGetBalance","getAccountNearBalance","getTotalPools","tag","TokenNotExistError","metadata","getGlobalWhitelist","ids","_context7","getUserRegisteredTokens","accountId","data","nearDepositTransaction","nearWithdrawTransaction","refDCLSwapViewFunction","_context10","nearConnection","DCLInValid","DCLSwapGetStorageBalance","getDCLPoolId","join","getDCLPool","pool_id","_pool_id$split","token_seq","formatError","msg","Error","unNamedError","NotLoginError","SwapRouteError","NoLocalSignerError","NoPoolOnThisPair","SlippageError","NoOrderFound","order_id","OrderNoRemainedAmount","instantSwap","slippageTolerance","referralId","_swapTodos","registerToken","actionsList","allSwapsTokens","swapTokens","token_in","token_out","amount_in","min_amount_out","force","referral_id","DEFAULT_PAGE_LIMIT","BLACK_TOKEN_LIST","getRatedPoolDetail","pool_info","getUnRatedPoolDetail","getStablePools","getPool","getPoolByIds","pool_ids","getRefPools","page","perPage","from_index","limit","rawPool","_p$tokenIds","fetchAllPools","min","pages","unRatedPools","ratedPools","ThemeContext","createContext","ThemeContextProvider","customTheme","children","useState","theme","setTheme","useEffect","React","Provider","TokenPriceContext","useTokenPriceList","tokenPriceList","setTokenPriceList","TokenPriceContextProvider","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","SmartRouteV2","tokensRaw","useContext","ParaTokenFrom","className","marginRight","Icon","alt","height","flexShrink","Hub","position","bottom","ArrowRight","_pools$","_pools$2","_pools$3","DetailView","rate","minReceived","storagedOpen","showDetail","setShowDetail","isRateReverse","setIsRateReverse","tokensPerRoute","swap","identicalRoutes","_estimates","hub","percents","useMemo","priceImpactDisplay","textColor","displayValue","tokenInInfo","displayRate","revertRate","revertDisplayRate","color","cursor","onClick","removeItem","FiChevronUp","FiChevronDown","RiExchangeFill","size","marginLeft","border","flexDirection","alignItems","justifyContent","RouterIcon","whiteSpace","minWidth","key","HalfAndMaxAmount","max","onChangeAmount","halfValue","hoverHalf","setHoverHalf","hoverMax","setHoverMax","background","onMouseEnter","onMouseLeave","half","TokenAmount","props","balance","reloading","onSelectToken","onForceUpdate","poolFetchingState","useRef","hoverSelect","setHoverSelect","handleChange","current","setCustomValidity","_ref$current","_ref$current2","curMax","RiRefreshLine","onWheel","blur","step","placeholder","onChange","disabled","onKeyDown","preventDefault","marginBottom","textAlign","fontSize","SlippageSelector","onChangeSlippageTolerance","showSlip","setShowSlip","invalid","setInValid","onclick","stopPropagation","paddingBottom","defaultValue","required","padding","IoWarning","StarToken","onDelete","hoverIcon","setHoverIcon","setHoverClose","top","right","boxShadow","IoCloseOutline","stroke","Token","isSticky","onClickPin","setHoverIndex","hoverIndex","displayBalance","hoverOutLink","setHoverOutLink","hoverPin","setHoverPin","HiOutlineExternalLink","marginTop","open","AiFillPushpin","AiOutlinePushpin","TokenListTable","balances","starList","setStarList","currentSort","setCurrentSort","newList","borderBottom","TiArrowSortedUp","TiArrowSortedDown","b1","_tokenPriceList$token","TokenSelector","onSelect","onClose","searchValue","setSearchValue","storagedStartList","DEFAULT_START_TOKEN_LIST","newStarList","starToken","FiChevronLeft","FaSearch","evt","_tokenPriceList$token2","searchValueLower","toLowerCase","_token$symbol","Slider","setHover","viewBox","xmlns","fillRule","clipRule","RefIcon","Loading","cx","cy","strokeWidth","strokeLinecap","Warning","y1","x2","y2","Success","left","gradientUnits","stopColor","Notification","state","detail","setOpen","setState","href","textDecoration","rel","fontWeight","AccountButton","onDisConnect","hoverAccount","setHoverAccount","DefaultTestnetTokenList","spec","reference","reference_hash","DefaultMainnetTokenList","DCLSwap","SwapByOutput","LimitOrderWithSwap","SwapByStopPoint","swapInfo","Swap","output_token","min_output_amount","client_id","output_amount","buy_token","new_point","quote","input_token","input_amount","list_user_assets","DCLSwapByInputOnBestPool","bestEstimate","bestFee","_bestEstimate$tag","_bestEstimate$tag$spl","_bestEstimate$tag2","_bestEstimate$tag2$sp","get_order","find_order","cancel_order","order","remain_amount","defaultTokenList","onSwap","connection","transactionState","onConnect","defaultTokenIn","defaultTokenOut","curTheme","darkMode","STORAGED_TOKEN_IN","STORAGED_TOKEN_OUT","isSignedIn","setTokenIn","handleSetTokenIn","handleSetTokenOut","setTokenOut","tokenInBalance","setTokenInBalance","tokenOutBalance","setTokenOutBalance","notOpen","setNotOpen","setTokens","setTokensLoading","widgetRoute","setWidgetRoute","setAmountIn","setSlippageTolerance","tokenLoading","setTokenLoading","whiteList","globalWhiteListTokens","parsedTokens","getTokensList","useTokensIndexer","fetchTokens","setBalances","validTokens","balancesMap","useTokenBalnces","refreshTrigger","setRreshTrigger","allPools","setAllPools","setPoolFetchingState","allStablePools","setAllStablePools","useRefPools","defaultIn","defaultOut","wrapedId","available","setEstimates","canSwap","setCanSwap","swapError","setSwapError","setAmountOut","isEstimating","setIsEstimating","forceEstimate","setForceEstimate","makeSwap","outEstimate","bigEstimate","estimateValidationPass","_swapTodos$","totalPartialAmountIn","estimateValidator","expectAmountOut","getEstimate","_params$tokenIn","_params$tokenOut","_params$tokenIn2","_params$tokenOut2","_params$options","useSwap","canSubmit","onSubmit","CgArrowsExchangeAltV","paddingTop","TiWarning","message","opacity","display","left_point","right_point","undecimal_price"],"mappings":"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"}