UNPKG

@broxus/js-bridge-essentials

Version:

Bridge JavaScript Essentials library

291 lines (290 loc) 15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AlienProxyV10Utils = void 0; const js_core_1 = require("@broxus/js-core"); const models_1 = require("../../models"); const contracts_1 = require("../../models/alien-proxy/contracts"); class AlienProxyV10Utils { static async deployTokenFee(provider, proxyAddress, params, args) { return (0, contracts_1.alienProxyV10Contract)(provider, proxyAddress) .methods.deployTokenFee({ _remainingGasTo: (0, js_core_1.resolveTvmAddress)(params.remainingGasTo), _token: (0, js_core_1.resolveTvmAddress)(params.tokenAddress), }) .sendDelayed({ amount: (0, js_core_1.toInt)(6.6, js_core_1.DEFAULT_NATIVE_CURRENCY_DECIMALS), bounce: true, from: (0, js_core_1.resolveTvmAddress)(params.remainingGasTo), ...args, }); } static async getExpectedTokenFeeAddress(connection, proxyAddress, tokenAddress, cachedState) { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, proxyAddress); const result = await (0, contracts_1.alienProxyV10Contract)(connection, proxyAddress) .methods.getExpectedTokenFeeAddress({ _token: (0, js_core_1.resolveTvmAddress)(tokenAddress), answerId: 0, }) .call({ cachedState: state, responsible: true }); return result.value0; } static async getDailyLimits(connection, proxyAddress, tokenAddress, cachedState) { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, proxyAddress); return (0, contracts_1.alienProxyV10Contract)(connection, proxyAddress) .methods.getDailyLimits({ _token: (0, js_core_1.resolveTvmAddress)(tokenAddress), answerId: 0, }) .call({ cachedState: state, responsible: true }); } static async getTvmDefaultFee(connection, proxyAddress, cachedState) { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, proxyAddress); return (0, contracts_1.alienProxyV10Contract)(connection, proxyAddress) .methods.getTvmDefaultFee({ answerId: 0 }) .call({ cachedState: state, responsible: true }); } static async getTvmFees(connection, proxyAddress, cachedState) { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, proxyAddress); const result = await (0, contracts_1.alienProxyV10Contract)(connection, proxyAddress) .methods.getTvmFees({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return new Map(result.value0.flat(0).map(([addr, value]) => [addr.toString(), value])); } static async getTvmTokenFee(connection, proxyAddress, tokenAddress, cachedState) { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, proxyAddress); return (0, contracts_1.alienProxyV10Contract)(connection, proxyAddress) .methods.getTvmTokenFee({ _token: (0, js_core_1.resolveTvmAddress)(tokenAddress), answerId: 0, }) .call({ cachedState: state, responsible: true }); } static async getConfiguration(connection, proxyAddress, cachedState) { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, proxyAddress); return (0, contracts_1.alienProxyV10Contract)(connection, proxyAddress) .methods.getConfiguration({ answerId: 0 }) .call({ cachedState: state, responsible: true }); } static async getTvmEvmConfiguration(connection, proxyAddress, cachedState) { const result = await AlienProxyV10Utils.getConfiguration(connection, proxyAddress, cachedState); return result.value0.everscaleConfiguration; } static async getSolTvmConfiguration(connection, proxyAddress, cachedState) { const result = await AlienProxyV10Utils.getConfiguration(connection, proxyAddress, cachedState); return result.value1.solanaConfiguration; } static async getTvmSolConfiguration(connection, proxyAddress, cachedState) { const result = await AlienProxyV10Utils.getConfiguration(connection, proxyAddress, cachedState); return result.value1.everscaleConfiguration; } /** * Derive EVM alien token address in TVM by the given proxy address and EVM token params * @param {ProviderRpcClient} connection * @param {Address | string} proxyAddress * @param {DeriveEvmAlienTokenRootV10AbiParams} params * @param {FullContractState} [cachedState] - optional. Full contract state of the alien proxy contract */ static async deriveEvmAlienTokenRoot(connection, proxyAddress, params, cachedState) { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, proxyAddress); const result = await (0, contracts_1.alienProxyV10Contract)(connection, proxyAddress) .methods.deriveEVMAlienTokenRoot({ answerId: 0, chainId: params.chainId, decimals: params.decimals, name: params.name, symbol: params.symbol, token: params.token, }) .call({ cachedState: state, responsible: true }); return result.value0; } /** * Derive TVM alien token address in TVM by the given proxy address and EVM token params * @param {ProviderRpcClient} connection * @param {Address | string} proxyAddress * @param {DeriveTvmAlienTokenRootV10AbiParams} params * @param {FullContractState} [cachedState] - optional. Full contract state of the alien proxy contract */ static async deriveTvmAlienTokenRoot(connection, proxyAddress, params, cachedState) { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, proxyAddress); const result = await (0, contracts_1.alienProxyV10Contract)(connection, proxyAddress) .methods.deriveTVMAlienTokenRoot({ answerId: 0, chainId: params.chainId, decimals: params.decimals, name: params.name, native_proxy_wallet: params.native_proxy_wallet, symbol: params.symbol, token: params.token, }) .call({ cachedState: state, responsible: true }); return result.value0; } /** * Derive Solana alien token address in TVM by the given proxy address and Solana token params * @param {ProviderRpcClient} connection * @param {Address | string} proxyAddress * @param {DeriveSolanaAlienTokenRootV10AbiParams} params * @param {FullContractState} [cachedState] - optional. Full contract state of the alien proxy contract */ static async deriveSolanaAlienTokenRoot(connection, proxyAddress, params, cachedState) { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, proxyAddress); const result = await (0, contracts_1.alienProxyV10Contract)(connection, proxyAddress) .methods.deriveSolanaAlienTokenRoot({ answerId: 0, decimals: params.decimals, name: params.name, symbol: params.symbol, token: params.token, }) .call({ cachedState: state, responsible: true }); return result.value0; } /** * Get derive merge router address by the given TVM-like token and proxy addresses * @param {ProviderRpcClient} connection * @param {Address | string} proxyAddress * @param {Address | string} tokenAddress * @param {FullContractState} [cachedState] - optional. Full contract state of the alien proxy contract */ static async deriveMergeRouter(connection, proxyAddress, tokenAddress, cachedState) { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, proxyAddress); const result = await (0, contracts_1.alienProxyV10Contract)(connection, proxyAddress) .methods.deriveMergeRouter({ answerId: 0, token: (0, js_core_1.resolveTvmAddress)(tokenAddress), }) .call({ cachedState: state, responsible: true }); return result.router; } /** * Get merge pool address by the given merge router address * @param {ProviderRpcClient} connection * @param {Address | string} mergeRouterAddress * @param {FullContractState} [cachedState] - optional. Full contract state of the merge router contract */ static async getMergePoolAddress(connection, mergeRouterAddress, cachedState) { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, mergeRouterAddress); const result = await (0, contracts_1.mergeRouterContract)(connection, mergeRouterAddress) .methods.getPool({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } static async getMergePoolTokens(connection, mergePoolAddress, cachedState) { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, mergePoolAddress); const result = await (0, contracts_1.mergePoolV7Contract)(connection, mergePoolAddress) .methods.getTokens({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return { canon: result._canon, tokens: result._tokens.map(([addr, settings]) => [addr, settings]), }; } static async getEvmTokenMergeDetails(connection, proxyAddress, tokenAddress, chainId, cachedState) { try { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, proxyAddress); const mergeRouterAddress = await AlienProxyV10Utils.deriveMergeRouter(connection, proxyAddress, tokenAddress, state); const mergePoolAddress = await AlienProxyV10Utils.getMergePoolAddress(connection, mergeRouterAddress); const mergedTokens = await AlienProxyV10Utils.getMergePoolTokens(connection, mergePoolAddress); const enabled = mergedTokens.tokens.filter(([, settings]) => settings.enabled); const promises = enabled.map(async ([address]) => { try { const meta = await models_1.TokenRootAlienEvm.Utils.meta(connection, address); return { baseChainId: meta.baseChainId, evmTokenAddress: meta.evmTokenAddress, isMerged: meta.baseChainId.toString() === chainId, }; } catch (e) { return { isMerged: false }; } }); const results = await Promise.all(promises); const merged = results.find(e => e.isMerged); if (!merged?.baseChainId) { return undefined; } return { baseChainId: merged.baseChainId, canonicalAddress: mergedTokens.canon, evmTokenAddress: merged.evmTokenAddress, mergePoolAddress, mergeRouterAddress, tvmTokenAddress: (0, js_core_1.resolveTvmAddress)(tokenAddress), }; } catch (e) { return undefined; } } static async getTvmTokenMergeDetails(connection, proxyAddress, tokenAddress, cachedState) { try { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, proxyAddress); const mergeRouterAddress = await AlienProxyV10Utils.deriveMergeRouter(connection, proxyAddress, tokenAddress, state); const mergePoolAddress = await AlienProxyV10Utils.getMergePoolAddress(connection, mergeRouterAddress); const mergedTokens = await AlienProxyV10Utils.getMergePoolTokens(connection, mergePoolAddress); const merged = mergedTokens.tokens.find(([address, settings]) => (0, js_core_1.areAddressesEqual)(address, tokenAddress) && settings.enabled); if (!merged) { return undefined; } return merged ? { canonicalAddress: mergedTokens.canon, mergePoolAddress, mergeRouterAddress, tvmTokenAddress: (0, js_core_1.resolveTvmAddress)(tokenAddress), } : undefined; } catch (e) { return undefined; } } static async getSolTokenMergeDetails(connection, proxyAddress, tokenAddress, cachedState) { try { const state = cachedState ?? await (0, js_core_1.getFullContractState)(connection, proxyAddress); const mergeRouterAddress = await AlienProxyV10Utils.deriveMergeRouter(connection, proxyAddress, tokenAddress, state); const mergePoolAddress = await AlienProxyV10Utils.getMergePoolAddress(connection, mergeRouterAddress); const mergedTokens = await AlienProxyV10Utils.getMergePoolTokens(connection, mergePoolAddress); const enabled = mergedTokens.tokens.filter(([, settings]) => settings.enabled); const promises = enabled.map(async ([address]) => { try { const meta = await models_1.TokenRootAlienSolana.Utils.meta(connection, address); return { isMerged: true, solTokenAddress: meta.solTokenAddress, }; } catch (e) { return { isMerged: false }; } }); const results = await Promise.all(promises); const merged = results.find(e => e.isMerged); if (!merged) { return undefined; } return { canonicalAddress: mergedTokens.canon, mergePoolAddress, mergeRouterAddress, solTokenAddress: merged.solTokenAddress, tvmTokenAddress: (0, js_core_1.resolveTvmAddress)(tokenAddress), }; } catch (e) { return undefined; } } static decodeEvent(connection, proxyAddress, args) { return (0, contracts_1.alienProxyV10Contract)(connection, proxyAddress).decodeEvent(args); } static decodeTransaction(connection, proxyAddress, args) { return (0, contracts_1.alienProxyV10Contract)(connection, proxyAddress).decodeTransaction(args); } static decodeTransactionEvents(connection, proxyAddress, transaction) { return (0, contracts_1.alienProxyV10Contract)(connection, proxyAddress).decodeTransactionEvents({ transaction }); } } exports.AlienProxyV10Utils = AlienProxyV10Utils;