@broxus/js-bridge-essentials
Version:
Bridge JavaScript Essentials library
94 lines (93 loc) • 4.34 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TonTokenUtils = void 0;
const js_core_1 = require("@broxus/js-core");
const js_utils_1 = require("@broxus/js-utils");
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const abi_1 = require("../../models/ton-token/abi");
const types_1 = require("../../types");
const utils_1 = require("../../utils");
const endpoints = {
[types_1.TonChains.Mainnet]: 'https://ton-tokens-meta.chainconnect.com',
[types_1.TonChains.Testnet]: 'https://ton-testnet-tokens-meta.chainconnect.com',
};
class TonTokenUtils {
static async getOffchainDetails(address, chainId) {
const endpoint = new js_core_1.Endpoint('token/:address', chainId != null ? endpoints[chainId] : endpoints[types_1.TonChains.Mainnet] ?? endpoints[types_1.TonChains.Mainnet]);
const details = await endpoint.fetch({ address: (0, utils_1.resolveTonAddress)(address).toRawString() });
if (!details.symbol) {
throw new Error('Details does not contains symbol');
}
if (!details.decimals) {
throw new Error('Details does not contains decimals');
}
if (!details.name) {
throw new Error('Details does not contains name');
}
return {
address: (0, utils_1.resolveTonAddress)(address),
decimals: Number(details.decimals),
logoURI: details.imageUrl ?? undefined,
name: details.name,
symbol: details.symbol,
};
}
static async getOffchainMeta(address, chainId) {
const endpoint = new js_core_1.Endpoint('token/:address', chainId != null ? endpoints[chainId] : endpoints[types_1.TonChains.Mainnet] ?? endpoints[types_1.TonChains.Mainnet]);
const details = await endpoint.fetch({
address: (0, utils_1.resolveTonAddress)(address).toRawString(),
});
if (!details.meta) {
throw new Error('Details does not contains meta');
}
if (!details.meta.decimals) {
throw new Error('Meta does not contains decimals');
}
return {
baseChainId: details.meta.chainId,
baseToken: details.meta.baseToken,
decimals: details.meta.decimals,
evmTokenAddress: `0x${(0, bignumber_js_1.default)(details.meta.baseToken).toString(16).padStart(40, '0')}`,
name: details.meta.name,
symbol: details.meta.symbol,
};
}
static async walletOf(connection, params, cachedState) {
const tokenRawAddress = (0, utils_1.resolveTonAddress)(params.tokenAddress).toRawString();
const ownerRawAddress = (0, utils_1.resolveTonAddress)(params.ownerAddress).toRawString();
try {
// @ts-ignore
const result = await connection.runGetter({
address: (0, js_core_1.resolveTvmAddress)(tokenRawAddress),
cachedState,
inputData: {
walletOwner: (0, js_core_1.resolveTvmAddress)(ownerRawAddress),
},
inputStructure: [
{ name: 'walletOwner', type: 'address' },
],
method: 'get_wallet_address',
outputStructure: [
{ name: 'value0', type: 'address' },
],
});
if (!result.output?.value0) {
(0, js_utils_1.throwException)('Wallet not found');
}
return (0, utils_1.resolveTonAddress)(result.output.value0.toString());
}
catch (e) {
(0, js_utils_1.debug)('runGetter call failed with an error. Fallback to contract getter call');
const contract = new connection.Contract(abi_1.TonTokenRootAbi, (0, js_core_1.resolveTvmAddress)(tokenRawAddress));
// @ts-ignore
const result = await contract.getters.get_wallet_address({
walletOwner: (0, js_core_1.resolveTvmAddress)(ownerRawAddress),
}).run({ cachedState });
return (0, utils_1.resolveTonAddress)(result.value0.toString());
}
}
}
exports.TonTokenUtils = TonTokenUtils;