UNPKG

@broxus/js-bridge-essentials

Version:

Bridge JavaScript Essentials library

113 lines (112 loc) 5.87 kB
import { getFullContractState, resolveTvmAddress } from '@broxus/js-core'; import { debug } from '@broxus/js-utils'; import { JettonAlienEvm } from '../../models/jetton-alien-evm'; import { tonAlienProxyContract, tonMergePoolContract, tonMergeRouterContract, } from '../../models/ton-alien-proxy/contracts'; import { resolveTonAddress } from '../../utils'; export class TonAlienProxyUtils { static async getConfiguration(connection, proxyAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, proxyAddress); return tonAlienProxyContract(connection, proxyAddress) .methods.getConfiguration({ answerId: 0 }) .call({ cachedState: state, responsible: true }); } static async getTonEvmConfiguration(connection, proxyAddress, cachedState) { const result = await TonAlienProxyUtils.getConfiguration(connection, proxyAddress, cachedState); return result.value0.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 {Omit<DecodedAbiFunctionInputs<typeof TonAlienProxyAbi, 'deriveEVMAlienTokenRoot'>, 'answerId'>} params * @param {FullContractState} [cachedState] - optional. Full contract state of the alien proxy contract */ static async deriveEvmAlienTokenRoot(connection, proxyAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, proxyAddress); const result = await tonAlienProxyContract(connection, proxyAddress) .methods.deriveEVMAlienTokenRoot({ answerId: 0, ...params }) .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 getFullContractState(connection, proxyAddress); const result = await tonAlienProxyContract(connection, proxyAddress) .methods.deriveMergeRouter({ answerId: 0, token: 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 getFullContractState(connection, mergeRouterAddress); const result = await tonMergeRouterContract(connection, mergeRouterAddress) .methods.getPool({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } static async getMergePoolTokens(connection, mergePoolAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, mergePoolAddress); const result = await tonMergePoolContract(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 getFullContractState(connection, proxyAddress); const tonTokenAddress = resolveTvmAddress(tokenAddress); const mergeRouterAddress = await TonAlienProxyUtils.deriveMergeRouter(connection, proxyAddress, tokenAddress, state); const mergePoolAddress = await TonAlienProxyUtils.getMergePoolAddress(connection, mergeRouterAddress); const mergedTokens = await TonAlienProxyUtils.getMergePoolTokens(connection, mergePoolAddress); const aliens = await Promise.all(mergedTokens.tokens.map(async ([address, settings]) => { if (!settings.enabled) { return { isMerged: false }; } try { const meta = await JettonAlienEvm.Utils.getOffchainMeta(resolveTonAddress(address.toString())); return { canonicalAddress: mergedTokens.canon, evmTokenAddress: meta.evmTokenAddress, isMerged: meta.baseChainId === chainId, tonTokenAddress, }; } catch (e) { return { isMerged: false }; } })); const merged = aliens.find(e => e.isMerged); return merged ? { canonicalAddress: merged.canonicalAddress, evmTokenAddress: merged.evmTokenAddress, isMerged: true, mergePoolAddress, mergeRouterAddress, tonTokenAddress, } : undefined; } catch (e) { debug('JettonAlienProxy.getEvmTokenMergeDetails failed with an error', e); return undefined; } } }