@syncswap/sdk
Version:
SyncSwap TypeScript SDK for building DeFi applications
75 lines • 2.85 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = fetchToken;
const token_1 = require("./token");
const contractRegistry_1 = __importDefault(require("../contracts/contractRegistry"));
const tokenRegistry_1 = require("./tokenRegistry");
// Token metadata are relatively immutable so it's safe to keep a static cache.
const cacheMap = new Map();
async function fetchToken(provider, address) {
address = address.toLowerCase(); // fix case
if (address === token_1.Token.ETHER.address) {
return token_1.Token.ETHER;
}
const known = tokenRegistry_1.TokenRegistry.getTokenByAddress(address);
if (known) {
return known;
}
const cached = cacheMap.get(address);
if (cached) {
return cached;
}
try {
const tokenHelper = contractRegistry_1.default.getContractByName("token_helper");
const { decimals, symbol, name, isPermit } = await retry(async () => await tokenHelper.tokenMetadata(address));
//console.log('fetchToken', decimals, symbol, name, address);
// invalid tokens (contract that is not a token?)
if (decimals === 0 && symbol == "" && name == "") {
return null;
}
const token = new token_1.Token(address, decimals, symbol == "" ? address.substring(0, 6) : symbol, name == "" ? address.substring(0, 8) : name, isPermit);
cacheMap.set(address, token);
return token;
}
catch (error) {
console.error("fetchToken: error on fetch token", address, error);
return null;
}
}
async function retry(doFunc, retry = 5) {
return new Promise(async (resolve, reject) => {
for (let i = 0; i < retry; i++) {
try {
// use promise.race to kill first promise when execute over 10 seconds
const res = await Promise.any([
doFunc(),
new Promise((resolve) => {
setTimeout(() => resolve(false), 10000);
}),
]);
if (res === false) {
throw new Error("RPC Error: JsonRpcEngine: Response timeout");
}
return resolve(res);
}
catch (error) {
if (i === retry - 1) {
console.error("retry: request failed after retry", doFunc, error);
return reject(error);
}
else {
await sleep(100);
}
}
}
});
}
async function sleep(timeout) {
await setTimeout(() => {
// do nothing
}, timeout);
}
//# sourceMappingURL=fetchToken.js.map