UNPKG

@xspswap/smart-order-router

Version:
125 lines 15.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.WNATIVE_ON = exports.USDC_ON = exports.DAI_ON = exports.TokenProvider = exports.EEG_XDC = exports.PWM3_XDC = exports.TIVO_XDC = exports.GLL_XDC = exports.ROXN_XDC = exports.AVR_XDC = exports.CHUPAV2_XDC = exports.CGO_XDC = exports.LBT_XDC = exports.BBB_XDC = exports.GAMA_XDC = exports.psXDC_XDC = exports.DOPU_XDC = exports.WXDC_XDC = exports.FXD_XDC = exports.USDC_XDC = exports.USDT_XDC = exports.PLI_XDC = exports.SRX_XDC = exports.XSP_XDC = exports.WBTC_XDC_APOTHEM = exports.DAI_XDC_APOTHEM = exports.USDC_XDC_APOTHEM = exports.USDT_XDC_APOTHEM = void 0; const sdk_core_1 = require("@x-swap-protocol/sdk-core"); const lodash_1 = __importDefault(require("lodash")); const IERC20Metadata__factory_1 = require("../types/v3/factories/IERC20Metadata__factory"); const util_1 = require("../util"); // Some well known tokens on each chain for seeding cache / testing. exports.USDT_XDC_APOTHEM = new sdk_core_1.Token(util_1.ChainId.XDC_APOTHEM, '0xac4cdD44931d4A0Ff6B1Ea9206e02FeaC8EB9a50', 6, 'USDT', 'Tether Token'); exports.USDC_XDC_APOTHEM = new sdk_core_1.Token(util_1.ChainId.XDC_APOTHEM, '0xDF5038D080Ca5bd21c6c90F0b004306a26Af4bA8', 18, 'USDC', 'USDC'); exports.DAI_XDC_APOTHEM = new sdk_core_1.Token(util_1.ChainId.XDC_APOTHEM, '0xE46554Ad93a7046C85f2dA0C20EbD68e41f11b36', 18, 'DAI', 'DAI Stablecoin on XDC testnet'); exports.WBTC_XDC_APOTHEM = new sdk_core_1.Token(util_1.ChainId.XDC_APOTHEM, '0x885c04a08FbE1C6059f407E36c35B165704D1A03', 8, 'WBTC', 'Wrapped BTC'); exports.XSP_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0x36726235dAdbdb4658D33E62a249dCA7c4B2bC68', 18, 'XSP', 'XSwap Protocol'); exports.SRX_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0x5D5f074837f5d4618B3916ba74De1Bf9662a3fEd', 18, 'SRX', 'StoreX'); exports.PLI_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0xff7412ea7c8445c46a8254dfb557ac1e48094391', 18, 'PLI', 'Plugin'); exports.USDT_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0xd4b5f10d61916bd6e0860144a91ac658de8a1437', 6, 'xUSDT', 'USDT@xinfin'); exports.USDC_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0xfA2958CB79b0491CC627c1557F441eF849Ca8eb1', 6, 'USDC', 'USDC'); exports.FXD_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0x49d3f7543335cf38Fa10889CCFF10207e22110B5', 18, 'FXD', 'Fathom USD'); exports.WXDC_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0x951857744785e80e2de051c32ee7b25f9c458c42', 18, 'WXDC', 'Wrapped XDC'); exports.DOPU_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0x3fB46c4Db76d8E9f69F3F8388f43a7CA7E140807', 18, 'DOPU', 'Dog with a Purpose'); exports.psXDC_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0x9B8e12b0BAC165B86967E771d98B520Ec3F665A6', 18, 'psXDC', 'PrimeStakedXDC'); exports.GAMA_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0x3a170C7C987F55C84f28733Bfa27962D8CdD5D3B', 18, 'GAMA', 'Gama Token'); exports.BBB_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0xFa4dDcFa8E3d0475f544d0de469277CF6e0A6Fd1', 18, 'BBB', 'Beny Bad Boy'); exports.LBT_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0x05940B2dF33D6371201e7Ae099CeD4C363855dFE', 18, 'LBT', 'Law Block'); exports.CGO_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0x8f9920283470F52128bF11B0c14E798bE704fD15', 18, 'CGO', 'Comtech Gold'); // Chupa v2 exports.CHUPAV2_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0xCF071288cC70D737105c97485F9820668EAcCa51', 18, 'CHUPAV2', 'ChupaCabraV2'); exports.AVR_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0x92bb5d72bd65E8BAD36405D7C3D1497015A41160', 18, 'AVR', 'Avatar'); exports.ROXN_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0x2d1C02Cf9e7a1659b82185feF243078BfD237B23', 18, 'ROXN', 'Roxonn Token'); exports.GLL_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0xc6126EBFa8B5fFD41561C086979c97416969CeBF', 18, 'GLL', 'Growlimitless'); exports.TIVO_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0x765087A2360F4D1F516De6552970256F9DB64827', 18, 'Tivo', 'Tivo Token'); exports.PWM3_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0xB2b2aaB80f9fcD8f2bcA8A404Cbbf72A618897c0', 18, 'PWM3', 'Diamondium Private Currency'); exports.EEG_XDC = new sdk_core_1.Token(util_1.ChainId.XDC, '0xAec5Eaf63402BF842D8642d917685e5ad3BA14bb', 18, 'EEG', 'EquitEdge ERC20 Token'); class TokenProvider { constructor(chainId, multicall2Provider) { this.chainId = chainId; this.multicall2Provider = multicall2Provider; } async getTokens(_addresses, providerConfig) { const addressToToken = {}; const symbolToToken = {}; const addresses = (0, lodash_1.default)(_addresses) .map((address) => address.toLowerCase()) .uniq() .value(); if (addresses.length > 0) { const [symbolsResult, decimalsResult] = await Promise.all([ this.multicall2Provider.callSameFunctionOnMultipleContracts({ addresses, contractInterface: IERC20Metadata__factory_1.IERC20Metadata__factory.createInterface(), functionName: 'symbol', providerConfig, }), this.multicall2Provider.callSameFunctionOnMultipleContracts({ addresses, contractInterface: IERC20Metadata__factory_1.IERC20Metadata__factory.createInterface(), functionName: 'decimals', providerConfig, }), ]); const { results: symbols } = symbolsResult; const { results: decimals } = decimalsResult; for (let i = 0; i < addresses.length; i++) { const address = addresses[i]; const symbolResult = symbols[i]; const decimalResult = decimals[i]; if (!(symbolResult === null || symbolResult === void 0 ? void 0 : symbolResult.success) || !(decimalResult === null || decimalResult === void 0 ? void 0 : decimalResult.success)) { util_1.log.info({ symbolResult, decimalResult, }, `Dropping token with address ${address} as symbol or decimal are invalid`); continue; } const symbol = symbolResult.result[0]; const decimal = decimalResult.result[0]; addressToToken[address.toLowerCase()] = new sdk_core_1.Token(this.chainId, address, decimal, symbol); symbolToToken[symbol.toLowerCase()] = addressToToken[address.toLowerCase()]; } util_1.log.info(`Got token symbol and decimals for ${Object.values(addressToToken).length} out of ${addresses.length} tokens on-chain ${providerConfig ? `as of: ${providerConfig === null || providerConfig === void 0 ? void 0 : providerConfig.blockNumber}` : ''}`); } return { getTokenByAddress: (address) => { return addressToToken[address.toLowerCase()]; }, getTokenBySymbol: (symbol) => { return symbolToToken[symbol.toLowerCase()]; }, getAllTokens: () => { return Object.values(addressToToken); }, }; } } exports.TokenProvider = TokenProvider; const DAI_ON = (chainId) => { switch (chainId) { // case ChainId.XDC: // return USDT_BSC; case util_1.ChainId.XDC_APOTHEM: return exports.DAI_XDC_APOTHEM; default: throw new Error(`Chain id: ${chainId} not supported`); } }; exports.DAI_ON = DAI_ON; const USDC_ON = (chainId) => { switch (chainId) { case util_1.ChainId.XDC: return exports.USDC_XDC; case util_1.ChainId.XDC_APOTHEM: return exports.USDC_XDC_APOTHEM; default: throw new Error(`Chain id: ${chainId} not supported`); } }; exports.USDC_ON = USDC_ON; const WNATIVE_ON = (chainId) => { return util_1.WRAPPED_NATIVE_CURRENCY[chainId]; }; exports.WNATIVE_ON = WNATIVE_ON; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3Rva2VuLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHdEQUFrRDtBQUNsRCxvREFBdUI7QUFFdkIsMkZBQXdGO0FBQ3hGLGtDQUFnRTtBQStCaEUsb0VBQW9FO0FBQ3ZELFFBQUEsZ0JBQWdCLEdBQUcsSUFBSSxnQkFBSyxDQUN2QyxjQUFPLENBQUMsV0FBVyxFQUNuQiw0Q0FBNEMsRUFDNUMsQ0FBQyxFQUNELE1BQU0sRUFDTixjQUFjLENBQ2YsQ0FBQztBQUVXLFFBQUEsZ0JBQWdCLEdBQUcsSUFBSSxnQkFBSyxDQUN2QyxjQUFPLENBQUMsV0FBVyxFQUNuQiw0Q0FBNEMsRUFDNUMsRUFBRSxFQUNGLE1BQU0sRUFDTixNQUFNLENBQ1AsQ0FBQztBQUVXLFFBQUEsZUFBZSxHQUFHLElBQUksZ0JBQUssQ0FDdEMsY0FBTyxDQUFDLFdBQVcsRUFDbkIsNENBQTRDLEVBQzVDLEVBQUUsRUFDRixLQUFLLEVBQ0wsK0JBQStCLENBQ2hDLENBQUM7QUFFVyxRQUFBLGdCQUFnQixHQUFHLElBQUksZ0JBQUssQ0FDdkMsY0FBTyxDQUFDLFdBQVcsRUFDbkIsNENBQTRDLEVBQzVDLENBQUMsRUFDRCxNQUFNLEVBQ04sYUFBYSxDQUNkLENBQUM7QUFFVyxRQUFBLE9BQU8sR0FBRyxJQUFJLGdCQUFLLENBQzlCLGNBQU8sQ0FBQyxHQUFHLEVBQ1gsNENBQTRDLEVBQzVDLEVBQUUsRUFDRixLQUFLLEVBQ0wsZ0JBQWdCLENBQ2pCLENBQUM7QUFFVyxRQUFBLE9BQU8sR0FBRyxJQUFJLGdCQUFLLENBQzlCLGNBQU8sQ0FBQyxHQUFHLEVBQ1gsNENBQTRDLEVBQzVDLEVBQUUsRUFDRixLQUFLLEVBQ0wsUUFBUSxDQUNULENBQUM7QUFDVyxRQUFBLE9BQU8sR0FBRyxJQUFJLGdCQUFLLENBQzlCLGNBQU8sQ0FBQyxH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