UNPKG

fsl-js-sdk

Version:
805 lines (804 loc) 35.7 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.DEVICE_TYPE = exports.terminalType = exports.addNotifyFunction = exports.toast = exports.loadScript = exports.getUserAgent = exports.detectAssetChange = exports.getAdapter = exports.getTokenName = exports.getBytes = exports.getSolanaTokenImpact = exports.calculatePriceImpact = exports.getUniswapPoolAmount = exports.getSwapPoolAmount = exports.getUnitPrice = exports.getPairAddress = exports.convertObjToAst = exports.getTokenContracts = exports.getAmountOut = exports.getAmountIn = exports.formatSolTokensNumIn = exports.numberFixed = exports.formatSolTokensNumOut = exports.formatMnemonic = void 0; var index_1 = require("../constants/index"); var bignumber_js_1 = __importDefault(require("bignumber.js")); var ethers_1 = require("ethers"); var utils_1 = require("ethers/lib/utils"); var web3_js_1 = require("@solana/web3.js"); var sdk_1 = require("../sdk"); var spl_token_1 = require("@solana/spl-token"); var token_1 = require("../constants/token"); var DEVICE_TYPE; (function (DEVICE_TYPE) { DEVICE_TYPE["IOS"] = "ios"; DEVICE_TYPE["ANDROID"] = "android"; DEVICE_TYPE["PC"] = "PC"; })(DEVICE_TYPE || (DEVICE_TYPE = {})); exports.DEVICE_TYPE = DEVICE_TYPE; var getUserAgent = function () { var ua = navigator.userAgent.toLowerCase(); var isIos = /(ios|ipad|iphone)/.test(ua) || (ua.indexOf('macintosh') > -1 && 'ontouchend' in document); var isAndroid = /android/.test(ua); if (isIos) { return DEVICE_TYPE.IOS; } if (isAndroid) { return DEVICE_TYPE.ANDROID; } return DEVICE_TYPE.PC; }; exports.getUserAgent = getUserAgent; var terminalType = getUserAgent(); exports.terminalType = terminalType; var loadScript = function (url, params) { var script = document.createElement('script'); script.type = 'text/javascript'; return new Promise(function (resolve) { if (script.readyState) { // IE script.onreadystatechange = function () { if (script.readyState === 'loaded' || script.readyState === 'complete') { script.onreadystatechange = null; resolve(true); } }; } else { // Others script.onload = function () { resolve(true); }; } script.onerror = function () { resolve(false); }; var scriptsProperties = new Set([ 'type', 'src', 'htmlFor', 'event', 'charset', 'async', 'defer', 'crossOrigin', 'text', 'onerror', ]); if (typeof params === 'object' && Object.keys(params).length) { for (var key in params) { if (scriptsProperties.has(key)) { script[key] = params[key]; } } } document.getElementsByTagName('head')[0].appendChild(script); script.src = url; }); }; exports.loadScript = loadScript; var toast = function (msg) { try { if (terminalType === DEVICE_TYPE.ANDROID) { if (typeof msg === 'string') { window.TOASTER.Toaster(msg); } else { window.TOASTER.Toaster(JSON.stringify(msg)); } } else { window.webkit.messageHandlers.Toaster.postMessage(msg); } } catch (e) { } }; exports.toast = toast; var addNotifyFunction = function (target, name, descriptor) { var fn = target[name]; descriptor.value = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var arg; var params; if (args.length > 1) { params = args; } else { arg = args[0]; try { params = JSON.parse(arg); } catch (err) { params = arg; } } var promiseFnOrRes; try { promiseFnOrRes = Array.isArray(params) ? fn.apply(this, params) : fn.call(this, params); } catch (err) { toast(JSON.stringify({ msg: err.message || err.msg, method: fn.name, params: params, })); return err; } if (promiseFnOrRes && promiseFnOrRes.then) { return promiseFnOrRes .then(function (res) { toast(JSON.stringify({ data: res, method: fn.name, params: params })); return res; }) .catch(function (err) { toast(JSON.stringify({ code: err === null || err === void 0 ? void 0 : err.code, msg: err.message || err.msg, method: fn.name, params: params, })); return Promise.reject(err); }); } else { toast(JSON.stringify({ data: promiseFnOrRes, method: fn.name, params: params })); return promiseFnOrRes; } }; return descriptor; }; exports.addNotifyFunction = addNotifyFunction; var formatMnemonic = function (input) { var words = input .trim() .split(' ') .filter(function (word) { return !!word; }); return words.join(' '); }; exports.formatMnemonic = formatMnemonic; var formatSolTokensNumOut = function (num, tokenName) { switch (tokenName) { case index_1.TOKEN_NAME.GMT: case index_1.TOKEN_NAME.GST: case index_1.TOKEN_NAME.SOL: return new bignumber_js_1.default(num).div(Math.pow(10, 9)).valueOf(); case index_1.TOKEN_NAME.BAT: return new bignumber_js_1.default(num).div(Math.pow(10, 8)).valueOf(); default: return new bignumber_js_1.default(num).div(Math.pow(10, 6)).valueOf(); } }; exports.formatSolTokensNumOut = formatSolTokensNumOut; var numberFixed = function (num, pos) { if (pos === void 0) { pos = 4; } if (!num) return 0; var base = Math.pow(10, pos); var basePow = Math.floor(+(0, bignumber_js_1.default)(Number(num)).multipliedBy(base).valueOf()); return +(0, bignumber_js_1.default)(basePow).div(base).valueOf(); }; exports.numberFixed = numberFixed; var formatSolTokensNumIn = function (num, tokenName) { switch (tokenName) { case index_1.TOKEN_NAME.GMT: case index_1.TOKEN_NAME.GST: case index_1.TOKEN_NAME.SOL: return BigInt((0, utils_1.parseUnits)(num + '', 9).toString()); case index_1.TOKEN_NAME.BAT: return BigInt(new bignumber_js_1.default(num).multipliedBy(Math.pow(10, 8)).valueOf()); default: return BigInt((0, utils_1.parseUnits)(num + '', 6).toString()); } }; exports.formatSolTokensNumIn = formatSolTokensNumIn; var getAmountIn = function (amount, tokenName, chain) { if (chain === index_1.Chains.binance && tokenName === index_1.TOKEN_NAME.USDC) { return ethers_1.ethers.utils.parseEther(amount); } var decimal = (0, token_1.getTokenDecimals)(tokenName, chain); if (decimal === 18) { return ethers_1.ethers.utils.parseEther(amount); } else if (decimal) { return ethers_1.ethers.utils.parseUnits(amount, decimal); } return ethers_1.ethers.utils.parseUnits(amount, 8); }; exports.getAmountIn = getAmountIn; var getAmountOut = function (amount, tokenName, chain) { if (chain === index_1.Chains.binance && tokenName === index_1.TOKEN_NAME.USDC) { return new bignumber_js_1.default(amount.toString()) .div(Math.pow(10, 18) + '') .valueOf(); } var decimal = (0, token_1.getTokenDecimals)(tokenName, chain); if (decimal) { return new bignumber_js_1.default(amount.toString()) .div(Math.pow(10, decimal)) .valueOf(); } return new bignumber_js_1.default(amount.toString()).div(Math.pow(10, 8)).valueOf(); }; exports.getAmountOut = getAmountOut; var getTokenContracts = function (chain, tokenName) { switch (chain) { case index_1.Chains.ethereum: if (tokenName === index_1.TOKEN_NAME.GMT) { return index_1.EthereumToken.GMT; } else if (tokenName === index_1.TOKEN_NAME.USDC) { return index_1.EthereumToken.USDC; } else { return index_1.EthereumToken.GST; } case index_1.Chains.polygon: if (tokenName === index_1.TOKEN_NAME.GMT) { return index_1.PolygonToken.GMT; } else if (tokenName === index_1.TOKEN_NAME.USDT) { return index_1.PolygonToken.USDT; } else if (tokenName === index_1.TOKEN_NAME.GGT) { return index_1.PolygonToken.GGT; } else if (tokenName === index_1.TOKEN_NAME.SUT) { return index_1.PolygonToken.SUT; } else if (tokenName === index_1.TOKEN_NAME.GST) { return index_1.PolygonToken.GST; } return ''; case index_1.Chains.binance: if (tokenName === index_1.TOKEN_NAME.GMT) { return index_1.BNBChainToken.GMT; } else if (tokenName === index_1.TOKEN_NAME.USDC) { return index_1.BNBChainToken.USDC; } else if (tokenName === index_1.TOKEN_NAME.GST) { return index_1.BNBChainToken.GST; } return ''; default: return ''; } }; exports.getTokenContracts = getTokenContracts; var convertObjToAst = function (obj) { var handleObj = {}; for (var key in obj) { if (obj[key] instanceof Uint8Array) { handleObj[key] = JSON.stringify(obj[key]); } } return handleObj; }; exports.convertObjToAst = convertObjToAst; function getPairAddress(tokenA, tokenB, chain, provider, isUniswap) { return __awaiter(this, void 0, void 0, function () { var factoryAddress, factoryContract, pairAddress, _a; return __generator(this, function (_b) { switch (_b.label) { case 0: factoryAddress = isUniswap ? index_1.EvmUniswapFactoryAddress[chain] : index_1.EvmSwapFactoryAddress[chain]; factoryContract = new ethers_1.ethers.Contract(factoryAddress, isUniswap ? index_1.EvmUniswapFactoryAbi : index_1.EvmFactoryPairAbi, provider); if (!isUniswap) return [3 /*break*/, 2]; return [4 /*yield*/, factoryContract.getPool(tokenA, tokenB, 500)]; case 1: _a = _b.sent(); return [3 /*break*/, 4]; case 2: return [4 /*yield*/, factoryContract.getPair(tokenA, tokenB)]; case 3: _a = _b.sent(); _b.label = 4; case 4: pairAddress = _a; return [2 /*return*/, pairAddress]; } }); }); } exports.getPairAddress = getPairAddress; var getUnitPrice = function (fromPrice, toPrice) { var times = new bignumber_js_1.default(1).div(fromPrice); var unitPrice = new bignumber_js_1.default(toPrice).multipliedBy(times).valueOf(); return unitPrice; }; exports.getUnitPrice = getUnitPrice; function getSwapAmount(x, y, dx) { var child = y.multipliedBy(dx); var base = x.plus(dx); return child.div(base); } function getSwapPoolAmount(chain, fromTokenAddress, toTokenAddress) { return __awaiter(this, void 0, void 0, function () { var rpc, provider, pairAddress, pairContract, _a, reserves, token0, reserveIn, reserveOut; return __generator(this, function (_b) { switch (_b.label) { case 0: rpc = index_1.CHAIN_LIST[chain].rpc; provider = new ethers_1.ethers.providers.JsonRpcProvider(rpc); return [4 /*yield*/, getPairAddress(fromTokenAddress, toTokenAddress, chain, provider)]; case 1: pairAddress = _b.sent(); pairContract = new ethers_1.ethers.Contract(pairAddress, index_1.EvmFactoryPairAbi, provider); return [4 /*yield*/, Promise.all([ pairContract.getReserves(), pairContract.token0(), ])]; case 2: _a = _b.sent(), reserves = _a[0], token0 = _a[1]; if (fromTokenAddress.toLowerCase() === token0.toLowerCase()) { reserveIn = reserves.reserve0; reserveOut = reserves.reserve1; } else { reserveIn = reserves.reserve1; reserveOut = reserves.reserve0; } return [2 /*return*/, { x: new bignumber_js_1.default(reserveIn.toString()), y: new bignumber_js_1.default(reserveOut.toString()), }]; } }); }); } exports.getSwapPoolAmount = getSwapPoolAmount; function getUniswapPoolAmount(chain, fromTokenAddress, toTokenAddress) { return __awaiter(this, void 0, void 0, function () { var rpc, provider, poolAddress, tokenAContract, tokenBContract, tokenANum, tokenBNum; return __generator(this, function (_a) { switch (_a.label) { case 0: rpc = index_1.CHAIN_LIST[chain].rpc; provider = new ethers_1.ethers.providers.JsonRpcProvider(rpc); poolAddress = '0xDe92E7fBe021344BA02D9225792d219d3A2dDd58'; tokenAContract = new ethers_1.ethers.Contract(fromTokenAddress, index_1.EvmErc20TokenAbi, provider); tokenBContract = new ethers_1.ethers.Contract(toTokenAddress, index_1.EvmErc20TokenAbi, provider); return [4 /*yield*/, tokenAContract.balanceOf(poolAddress)]; case 1: tokenANum = _a.sent(); return [4 /*yield*/, tokenBContract.balanceOf(poolAddress)]; case 2: tokenBNum = _a.sent(); return [2 /*return*/, { x: new bignumber_js_1.default(tokenANum.toString()), y: new bignumber_js_1.default(tokenBNum.toString()), }]; } }); }); } exports.getUniswapPoolAmount = getUniswapPoolAmount; var getTradePairs = function (addressPaths) { var pos = 0; var res = []; while (pos < addressPaths.length - 1) { res.push([addressPaths[pos], addressPaths[pos + 1]]); pos++; } return res; }; var cacheTime = 30 * 1000; var cachePoolMap = {}; var calculatePriceImpact = function (chain, fromTokenName, toTokenName, amount, isUniswap) { return __awaiter(void 0, void 0, void 0, function () { var chainMap, map, paths, pairs, xProduct, yProduct, bigAmount, amountIn, pairsFn, dPools, _i, dPools_1, pool, x, y, child, base, percent, impact; return __generator(this, function (_a) { switch (_a.label) { case 0: chainMap = index_1.TOKEN_SWAP_PATH[chain]; map = chainMap[fromTokenName]; paths = map[toTokenName]; pairs = getTradePairs(paths); xProduct = new bignumber_js_1.default(1); yProduct = new bignumber_js_1.default(1); bigAmount = (0, exports.getAmountIn)((0, exports.numberFixed)(amount, 6) + '', fromTokenName, chain); amountIn = new bignumber_js_1.default(bigAmount.toString()).multipliedBy(0.99); pairsFn = pairs.map(function (_a) { var from = _a[0], to = _a[1]; return function () { return __awaiter(void 0, void 0, void 0, function () { var _a, x_1, y_1, _b, x, y, _c; return __generator(this, function (_d) { switch (_d.label) { case 0: if (cachePoolMap[from] && cachePoolMap[from][to] && Date.now() - cachePoolMap[from][to].date <= cacheTime) { _a = cachePoolMap[from][to], x_1 = _a.x, y_1 = _a.y; return [2 /*return*/, { x: x_1, y: y_1 }]; } if (!isUniswap) return [3 /*break*/, 2]; return [4 /*yield*/, getUniswapPoolAmount(chain, from, to)]; case 1: _c = _d.sent(); return [3 /*break*/, 4]; case 2: return [4 /*yield*/, getSwapPoolAmount(chain, from, to)]; case 3: _c = _d.sent(); _d.label = 4; case 4: _b = _c, x = _b.x, y = _b.y; if (!cachePoolMap[from]) cachePoolMap[from] = {}; cachePoolMap[from][to] = { x: x, y: y, date: Date.now(), }; return [2 /*return*/, { x: x, y: y }]; } }); }); }; }); return [4 /*yield*/, Promise.all(pairsFn.map(function (fn) { return fn(); }))]; case 1: dPools = _a.sent(); for (_i = 0, dPools_1 = dPools; _i < dPools_1.length; _i++) { pool = dPools_1[_i]; x = pool.x, y = pool.y; xProduct = xProduct.multipliedBy(x); yProduct = yProduct.multipliedBy(y); amountIn = getSwapAmount(x, y, amountIn); } child = amountIn.multipliedBy(xProduct); base = new bignumber_js_1.default(bigAmount.toString()) .multipliedBy(0.99) .multipliedBy(yProduct); percent = new bignumber_js_1.default(1) .minus(child.div(base)) .multipliedBy(100) .valueOf(); impact = (0, exports.numberFixed)(percent, 2); return [2 /*return*/, impact]; } }); }); }; exports.calculatePriceImpact = calculatePriceImpact; var solCachePoolMap = {}; var getSolPoolBalances = function (dooarPool, connection, from) { return __awaiter(void 0, void 0, void 0, function () { var tokenA, tokenB, tokenAPublicKey, tokenBPublicKey, tokenAAddress, tokenBAddress, _a, x, y, accountA, accountB; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, dooarPool.getTokenA()]; case 1: tokenA = _b.sent(); return [4 /*yield*/, dooarPool.getTokenB()]; case 2: tokenB = _b.sent(); if (from === tokenA.tag) { tokenAPublicKey = tokenA.addr; tokenBPublicKey = tokenB.addr; } else { tokenAPublicKey = tokenB.addr; tokenBPublicKey = tokenA.addr; } tokenAAddress = tokenAPublicKey.toString(); tokenBAddress = tokenBPublicKey.toString(); if (solCachePoolMap[tokenAAddress] && solCachePoolMap[tokenAAddress][tokenBAddress] && Date.now() - solCachePoolMap[tokenAAddress][tokenBAddress].date <= cacheTime) { _a = solCachePoolMap[tokenAAddress][tokenBAddress], x = _a.x, y = _a.y; return [2 /*return*/, { x: x, y: y }]; } return [4 /*yield*/, (0, spl_token_1.getAccount)(connection, tokenAPublicKey)]; case 3: accountA = _b.sent(); return [4 /*yield*/, (0, spl_token_1.getAccount)(connection, tokenBPublicKey)]; case 4: accountB = _b.sent(); if (!cachePoolMap[tokenAAddress]) solCachePoolMap[tokenAAddress] = {}; solCachePoolMap[tokenAAddress][tokenBAddress] = { x: accountA.amount, y: accountB.amount, date: Date.now(), }; return [2 /*return*/, { x: accountA.amount, y: accountB.amount, }]; } }); }); }; var magnification = BigInt(1000000); var getSolSwapAmount = function (x, y, dx) { var child = y * dx; var base = x + dx; return child / base; }; var getSolanaTokenImpact = function (fromTokenName, toTokenName, amount) { return __awaiter(void 0, void 0, void 0, function () { var swapMap, pairs, rpc, connection, orca, solPool, gmtPool, gstPool, pairsFn, xProduct, yProduct, amountIn, bigAmount, dPools, i, _a, x, y, child, base, percent, impact; return __generator(this, function (_b) { switch (_b.label) { case 0: swapMap = index_1.SOL_SWAP_PAIRS[fromTokenName]; pairs = swapMap[toTokenName]; rpc = index_1.CHAIN_LIST[index_1.Chains.solana].rpc; connection = new web3_js_1.Connection(rpc, 'confirmed'); orca = (0, sdk_1.getDooar)(connection); return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.SOL_USDC)]; case 1: solPool = _b.sent(); return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GMT_USDC)]; case 2: gmtPool = _b.sent(); return [4 /*yield*/, orca.getPool(sdk_1.DooarPoolConfig.GST_USDC)]; case 3: gstPool = _b.sent(); pairsFn = pairs.map(function (_a) { var from = _a[0], to = _a[1]; return function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) { if ([from, to].includes(index_1.TOKEN_NAME.SOL)) { return [2 /*return*/, getSolPoolBalances(solPool, connection, from)]; } if ([from, to].includes(index_1.TOKEN_NAME.GMT)) { return [2 /*return*/, getSolPoolBalances(gmtPool, connection, from)]; } return [2 /*return*/, getSolPoolBalances(gstPool, connection, from)]; }); }); }; }); xProduct = BigInt(1); yProduct = BigInt(1); amountIn = (0, exports.formatSolTokensNumIn)((0, exports.numberFixed)(+amount * 0.99, 6), fromTokenName); bigAmount = amountIn; return [4 /*yield*/, Promise.all(pairsFn.map(function (fn) { return fn(); }))]; case 4: dPools = _b.sent(); for (i = 0; i < dPools.length; i++) { _a = dPools[i], x = _a.x, y = _a.y; xProduct = xProduct * x; yProduct = yProduct * y; if (i === 1) { amountIn = getSolSwapAmount(x * magnification, y * magnification, amountIn); } else { amountIn = getSolSwapAmount(x, y * magnification, amountIn); } } child = amountIn * xProduct; base = bigAmount * yProduct; percent = magnification - child / base; impact = (0, exports.numberFixed)(Number(percent) / 10000, 2); if (((fromTokenName === index_1.TOKEN_NAME.GMT && toTokenName === index_1.TOKEN_NAME.GST) || (fromTokenName === index_1.TOKEN_NAME.GST && toTokenName === index_1.TOKEN_NAME.GMT)) && impact < 99.5) { return [2 /*return*/, (0, exports.numberFixed)(impact + 0.49, 2)]; } return [2 /*return*/, impact]; } }); }); }; exports.getSolanaTokenImpact = getSolanaTokenImpact; function getBytes(value, copy) { if (value instanceof Uint8Array) { if (copy) { return new Uint8Array(value); } return value; } if (typeof value === 'string' && value.match(/^0x([0-9a-f][0-9a-f])*$/i)) { var result = new Uint8Array((value.length - 2) / 2); var offset = 2; for (var i = 0; i < result.length; i++) { result[i] = parseInt(value.substring(offset, offset + 2), 16); offset += 2; } return result; } return value; } exports.getBytes = getBytes; var getTokenName = function (address) { switch (address) { case index_1.EthereumToken.WETH: return index_1.TOKEN_NAME.ETH; case index_1.EthereumToken.GMT: case index_1.PolygonToken.GMT: case index_1.SolanaToken.GMT: case index_1.BNBChainToken.GMT: return index_1.TOKEN_NAME.GMT; case index_1.EthereumToken.USDC: case index_1.BNBChainToken.USDC: case index_1.SolanaToken.USDC: return index_1.TOKEN_NAME.USDC; case index_1.BNBChainToken.GGUSD: case index_1.PolygonToken.GGUSD: return index_1.TOKEN_NAME.GGUSD; case index_1.EthereumToken.GST: case index_1.BNBChainToken.GST: case index_1.SolanaToken.GST: return index_1.TOKEN_NAME.GST; case index_1.BNBChainToken.WBNB: return index_1.TOKEN_NAME.BNB; case index_1.PolygonToken.GGT: return index_1.TOKEN_NAME.GGT; case index_1.PolygonToken.SUT: return index_1.TOKEN_NAME.SUT; case index_1.PolygonToken.USDT: return index_1.TOKEN_NAME.USDT; case index_1.PolygonToken.WMATIC: return index_1.TOKEN_NAME.POL; case index_1.EthereumERC20Token.SAND: case index_1.PolygonERC20Token.SAND: return index_1.TOKEN_NAME.SAND; case index_1.SolanaToken.BAT: case index_1.EthereumERC20Token.BAT: return index_1.TOKEN_NAME.BAT; case index_1.SolanaToken.SOL: return index_1.TOKEN_NAME.SOL; default: return 'UNKNOWN'; } }; exports.getTokenName = getTokenName; var getAdapter = function (address) { var addr = address.toLowerCase(); switch (addr) { case '0xB7f473915070F76D8365F59977C278033F1e3be5'.toLowerCase(): case '0xD7E20b2c2dDDF480567F5Ce890efFd5c5ABAE0e0'.toLowerCase(): case '0xaaF8f8A418e09aac17e1A1c5b997B29Ee2B035EF'.toLowerCase(): return 'DOOAR'; case '0x78Aaa3775999503E439112dC8801FB4A839934Ef'.toLowerCase(): return 'Quickswap'; case '0x8f516a5bE143438B229C89aa58ceC4CD915DbE59'.toLowerCase(): case '0xe85dCc0e6cb03F1Ab5b5960E381c883Cd546e9aC'.toLowerCase(): case '0xC3D747d3793649eD3137B9f910Dbad6C256f9900'.toLowerCase(): return 'UNIV4'; case '0xC7dc9Fd444d338d0ceF2fE9efb00c7ff13F78Df9'.toLowerCase(): return 'GGUSD'; case '0x738f530Dc2868f586ff09619F782dae3eF0E8bc8'.toLowerCase(): case '0x940FFA3627FACD1B68bE77Cad68d4E677Cc5623E'.toLowerCase(): return 'UNIV3'; default: return ''; } }; exports.getAdapter = getAdapter; var detectAbi = [ 'function transfer(address to, uint256 amount)', 'function transferFrom(address from, address to, uint256 tokenId)', 'function approve(address from, uint256 amount)', ]; var detectAssetChange = function (contractAddress, address, calldata, chain) { return __awaiter(void 0, void 0, void 0, function () { var rpc, iface, decoded, provider, tokenContract, _a, tokenTicker, decimal, name, args; return __generator(this, function (_b) { switch (_b.label) { case 0: rpc = index_1.CHAIN_LIST[chain].rpc; iface = new ethers_1.ethers.utils.Interface(detectAbi); decoded = iface.parseTransaction({ data: calldata }); provider = new ethers_1.ethers.providers.JsonRpcProvider(rpc); tokenContract = new ethers_1.ethers.Contract(contractAddress, [ { inputs: [], name: 'symbol', outputs: [{ internalType: 'string', name: '', type: 'string' }], stateMutability: 'view', type: 'function', }, { inputs: [], name: 'decimals', outputs: [ { internalType: 'uint8', name: '', type: 'uint8', }, ], stateMutability: 'view', type: 'function', }, ], provider); return [4 /*yield*/, Promise.all([ tokenContract.symbol().catch(function () { return ''; }), tokenContract.decimals().catch(function () { return void 0; }), ])]; case 1: _a = _b.sent(), tokenTicker = _a[0], decimal = _a[1]; name = decoded.name; args = decoded.args; switch (name) { case 'transfer': return [2 /*return*/, { assetType: decimal ? 'ERC20' : '', symbol: tokenTicker, name: tokenTicker, changeType: 'TRANSFER', from: address, to: args[0], amount: decimal ? new bignumber_js_1.default(args[1].toString()) .div(Math.pow(10, decimal)) .valueOf() : args[2].toString(), }]; case 'transferFrom': return [2 /*return*/, { assetType: decimal ? 'ERC20' : '', symbol: tokenTicker, name: tokenTicker, from: args[0], changeType: 'TRANSFER', to: args[1], amount: decimal ? new bignumber_js_1.default(args[2].toString()) .div(Math.pow(10, decimal)) .valueOf() : args[2].toString(), }]; case 'approve': return [2 /*return*/, { assetType: decimal ? 'ERC20' : '', symbol: tokenTicker, name: tokenTicker, changeType: 'APPROVE', from: address, to: args[0], amount: args[1].toString(), // 授权额度 }]; default: return [2 /*return*/, null]; // 不支持的函数 } return [2 /*return*/]; } }); }); }; exports.detectAssetChange = detectAssetChange;