UNPKG

@broxus/js-core

Version:

MobX-based JavaScript Core library

384 lines (383 loc) 18.5 kB
import { ZeroAddress } from '../../constants'; import { dexPairContract, dexPairV22Contract } from '../../models/dex-pair/contracts'; import { TvmToken } from '../../models/tvm-token'; import { getFullContractState, getRandomInt, resolveTvmAddress } from '../../utils'; export class DexPairUtils { static async getDetails(connection, pairAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const [balances, roots, wallets, type, isActive] = await Promise.all([ DexPairUtils.getBalances(connection, pairAddress, state), DexPairUtils.getTokenRoots(connection, pairAddress, state), DexPairUtils.getTokenWallets(connection, pairAddress, state), DexPairUtils.getPoolType(connection, pairAddress, state), DexPairUtils.isActive(connection, pairAddress, state), ]); const [lpToken, leftToken, rightToken, lpWallet, leftWallet, rightWallet] = await Promise.all([ TvmToken.create(connection, roots.lp, { sync: true }), TvmToken.create(connection, roots.left, { sync: true }), TvmToken.create(connection, roots.right, { sync: true }), TvmToken.Wallet.create(connection, { address: wallets.lp }, { sync: true }), TvmToken.Wallet.create(connection, { address: wallets.left }, { sync: true }), TvmToken.Wallet.create(connection, { address: wallets.right }, { sync: true }), ]); if (!lpToken || !leftToken || !rightToken) { throw new Error('DexPair tokens not provided'); } return { address: resolveTvmAddress(pairAddress), balances, contractState: state, isActive, lpToken, lpWallet, tokens: [leftToken, rightToken], type, wallets: [leftWallet, rightWallet], }; } static async getBalances(connection, pairAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const [roots, balances] = await Promise.all([ DexPairUtils.getTokenRoots(connection, pairAddress, state), dexPairContract(connection, pairAddress) .methods.getBalances({ answerId: 0 }) .call({ cachedState: state, responsible: true }) .then(result => result.value0), ]); return new Map([ [roots.left.toString(), balances.left_balance], [roots.lp.toString(), balances.lp_supply], [roots.right.toString(), balances.right_balance], ]); } static async getFeeParams(connection, pairAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const { value0 } = await dexPairContract(connection, pairAddress) .methods.getFeeParams({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return { beneficiaryAddress: value0.beneficiary, beneficiaryNumerator: Number(value0.beneficiary_numerator), denominator: Number(value0.denominator), numerator: Number(value0.pool_numerator), threshold: value0.threshold, }; } static async isActive(connection, pairAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const result = await dexPairContract(connection, pairAddress) .methods.isActive({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } static async getTokenRoots(connection, pairAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); return dexPairContract(connection, pairAddress) .methods.getTokenRoots({ answerId: 0 }) .call({ cachedState: state, responsible: true }); } static async getTokenWallets(connection, pairAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); return dexPairContract(connection, pairAddress) .methods.getTokenWallets({ answerId: 0 }) .call({ cachedState: state, responsible: true }); } static async getPoolType(connection, pairAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const result = await dexPairContract(connection, pairAddress) .methods.getPoolType({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } static async getRoot(connection, pairAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const result = await dexPairContract(connection, pairAddress) .methods.getRoot({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.dex_root; } static async getVault(connection, pairAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const result = await dexPairContract(connection, pairAddress) .methods.getVault({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } static async getWeverVaultTokenRoot(connection, pairAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const result = await dexPairContract(connection, pairAddress) .methods.getWeverVaultTokenRoot({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } static async getAccumulatedFees(connection, pairAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const result = await dexPairContract(connection, pairAddress) .methods.getAccumulatedFees({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.accumulatedFees; } static async buildCrossPairExchangePayload(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const _params = { deploy_wallet_grams: params.deployWalletGrams || 0, expected_amount: params.expectedAmount, id: params.callId ?? getRandomInt(), steps: params.steps.map(step => ({ amount: step.amount, root: resolveTvmAddress(step.root), })), }; try { const result = await dexPairContract(connection, pairAddress) .methods.buildCrossPairExchangePayload(_params) .call({ cachedState: state }); return result.value0; } catch { const result = await dexPairV22Contract(connection, pairAddress) .methods.buildCrossPairExchangePayload(_params) .call({ cachedState: state }); return result.value0; } } static async buildCrossPairExchangePayloadV2(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const _params = { _cancelPayload: params.cancelPayload ?? null, _deployWalletGrams: params.deployWalletGrams || 0, _expectedAmount: params.expectedAmount, _id: params.callId ?? getRandomInt(), _nextStepIndices: params.nextStepIndices, _outcoming: resolveTvmAddress(params.outcoming), _recipient: resolveTvmAddress(params.recipient), _referrer: resolveTvmAddress(params.referrer ?? ZeroAddress), _steps: params.steps.map(step => ({ amount: step.amount, nextStepIndices: step.nextStepIndices, numerator: step.numerator, outcoming: resolveTvmAddress(step.outcoming), roots: step.roots.map(resolveTvmAddress), })), _successPayload: params.successPayload ?? null, _toNative: params.toNative ?? null, }; try { const result = await dexPairContract(connection, pairAddress) .methods.buildCrossPairExchangePayloadV2(_params) .call({ cachedState: state }); return result.value0; } catch { const result = await dexPairV22Contract(connection, pairAddress) .methods.buildCrossPairExchangePayloadV2(_params) .call({ cachedState: state }); return result.value0; } } static async buildExchangePayload(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const _params = { deploy_wallet_grams: params.deployWalletGrams || 0, expected_amount: params.expectedAmount, id: params.callId ?? getRandomInt(), }; try { const result = await dexPairContract(connection, pairAddress) .methods.buildExchangePayload(_params) .call({ cachedState: state }); return result.value0; } catch { const result = await dexPairV22Contract(connection, pairAddress) .methods.buildExchangePayload(_params) .call({ cachedState: state }); return result.value0; } } static async buildExchangePayloadV2(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const _params = { _cancelPayload: params.cancelPayload ?? null, _deployWalletGrams: params.deployWalletGrams || 0, _expectedAmount: params.expectedAmount, _id: params.callId ?? getRandomInt(), _recipient: resolveTvmAddress(params.recipient), _referrer: resolveTvmAddress(params.referrer ?? ZeroAddress), _successPayload: params.successPayload ?? null, _toNative: params.toNative ?? null, }; try { const result = await dexPairContract(connection, pairAddress) .methods.buildExchangePayloadV2(_params) .call({ cachedState: state }); return result.value0; } catch { const result = await dexPairV22Contract(connection, pairAddress) .methods.buildExchangePayloadV2(_params) .call({ cachedState: state }); return result.value0; } } static async buildDepositLiquidityPayload(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const _params = { deploy_wallet_grams: params.deployWalletGrams ?? 0, id: params.callId ?? getRandomInt(), }; try { const result = await dexPairContract(connection, pairAddress) .methods.buildDepositLiquidityPayload(_params) .call({ cachedState: state }); return result.value0; } catch { const result = await dexPairV22Contract(connection, pairAddress) .methods.buildDepositLiquidityPayload(_params) .call({ cachedState: state }); return result.value0; } } static async buildDepositLiquidityPayloadV2(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const _params = { _cancelPayload: params.cancelPayload ?? null, _deployWalletGrams: params.deployWalletGrams || 0, _expectedAmount: params.expectedAmount, _id: params.callId ?? getRandomInt(), _recipient: resolveTvmAddress(params.recipient), _referrer: resolveTvmAddress(params.referrer ?? ZeroAddress), _successPayload: params.successPayload ?? null, _toNative: params.toNative ?? null, }; try { const result = await dexPairContract(connection, pairAddress) .methods.buildDepositLiquidityPayloadV2(_params) .call({ cachedState: state }); return result.value0; } catch { const result = await dexPairV22Contract(connection, pairAddress) .methods.buildDepositLiquidityPayloadV2(_params) .call({ cachedState: state }); return result.value0; } } static async buildWithdrawLiquidityPayload(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const _params = { deploy_wallet_grams: params.deployWalletGrams || 0, id: params.callId ?? getRandomInt(), }; try { const result = await dexPairContract(connection, pairAddress) .methods.buildWithdrawLiquidityPayload(_params) .call({ cachedState: state }); return result.value0; } catch { const result = await dexPairV22Contract(connection, pairAddress) .methods.buildWithdrawLiquidityPayload(_params) .call({ cachedState: state }); return result.value0; } } static async buildWithdrawLiquidityPayloadV2(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const _params = { _cancelPayload: params.cancelPayload ?? null, _deployWalletGrams: params.deployWalletGrams || 0, _expectedLeftAmount: params.expectedLeftAmount, _expectedRightAmount: params.expectedRightAmount, _id: params.callId ?? getRandomInt(), _recipient: resolveTvmAddress(params.recipient), _referrer: resolveTvmAddress(params.referrer ?? ZeroAddress), _successPayload: params.successPayload ?? null, _toNative: params.toNative ?? null, }; try { const result = await dexPairContract(connection, pairAddress) .methods.buildWithdrawLiquidityPayloadV2(_params) .call({ cachedState: state }); return result.value0; } catch { const result = await dexPairV22Contract(connection, pairAddress) .methods.buildWithdrawLiquidityPayloadV2(_params) .call({ cachedState: state }); return result.value0; } } static async expectedDepositLiquidity(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const _params = { answerId: 0, auto_change: params.autoChange, left_amount: params.leftAmount, referrer: resolveTvmAddress(params.referrer ?? ZeroAddress), right_amount: params.rightAmount, }; try { const result = await dexPairContract(connection, pairAddress) .methods.expectedDepositLiquidity(_params) .call({ cachedState: state, responsible: true }); return result.value0; } catch { const result = await dexPairV22Contract(connection, pairAddress) .methods.expectedDepositLiquidity(_params) .call({ cachedState: state, responsible: true }); return result.value0; } } static async expectedExchange(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const _params = { amount: params.amount, answerId: 0, spent_token_root: resolveTvmAddress(params.spentTokenAddress), }; try { const result = await dexPairContract(connection, pairAddress) .methods.expectedExchange(_params) .call({ cachedState: state, responsible: true }); return { expectedAmount: result.expected_amount, expectedFee: result.expected_fee }; } catch { const result = await dexPairV22Contract(connection, pairAddress) .methods.expectedExchange(_params) .call({ cachedState: state, responsible: true }); return { expectedAmount: result.expected_amount, expectedFee: result.expected_fee }; } } static async expectedSpendAmount(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const _params = { answerId: 0, receive_amount: params.receiveAmount, receive_token_root: resolveTvmAddress(params.receiveTokenAddress), }; try { const result = await dexPairContract(connection, pairAddress) .methods.expectedSpendAmount(_params) .call({ cachedState: state, responsible: true }); return { expectedAmount: result.expected_amount, expectedFee: result.expected_fee }; } catch { const result = await dexPairV22Contract(connection, pairAddress) .methods.expectedSpendAmount(_params) .call({ cachedState: state, responsible: true }); return { expectedAmount: result.expected_amount, expectedFee: result.expected_fee }; } } static decodeEvent(connection, pairAddress, args) { return dexPairContract(connection, pairAddress).decodeEvent(args); } static decodeTransaction(connection, pairAddress, args) { return dexPairContract(connection, pairAddress).decodeTransaction(args); } static decodeTransactionEvents(connection, pairAddress, transaction) { return dexPairContract(connection, pairAddress).decodeTransactionEvents({ transaction }); } }