fsl-js-sdk
Version:
sdk for web
805 lines (804 loc) • 35.7 kB
JavaScript
"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;