UNPKG

@broxus/js-core

Version:

MobX-based JavaScript Core library

280 lines (279 loc) 14.2 kB
import { ZeroAddress } from '../../constants'; import { dexPairContract } 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 result = await dexPairContract(connection, pairAddress) .methods.buildCrossPairExchangePayload({ 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), })), }) .call({ cachedState }); return result.value0; } static async buildCrossPairExchangePayloadV2(connection, pairAddress, params, cachedState) { const result = await dexPairContract(connection, pairAddress) .methods.buildCrossPairExchangePayloadV2({ _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, }) .call({ cachedState }); return result.value0; } static async buildExchangePayload(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const result = await dexPairContract(connection, pairAddress) .methods.buildExchangePayload({ deploy_wallet_grams: params.deployWalletGrams || 0, expected_amount: params.expectedAmount, id: params.callId ?? getRandomInt(), }) .call({ cachedState: state }); return result.value0; } static async buildExchangePayloadV2(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const result = await dexPairContract(connection, pairAddress) .methods.buildExchangePayloadV2({ _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, }) .call({ cachedState: state }); return result.value0; } static async buildDepositLiquidityPayload(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const result = await dexPairContract(connection, pairAddress) .methods.buildDepositLiquidityPayload({ deploy_wallet_grams: params.deployWalletGrams ?? 0, id: params.callId ?? getRandomInt(), }) .call({ cachedState: state }); return result.value0; } static async buildDepositLiquidityPayloadV2(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const result = await dexPairContract(connection, pairAddress) .methods.buildDepositLiquidityPayloadV2({ _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, }) .call({ cachedState: state }); return result.value0; } static async buildWithdrawLiquidityPayload(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const result = await dexPairContract(connection, pairAddress) .methods.buildWithdrawLiquidityPayload({ deploy_wallet_grams: params.deployWalletGrams || 0, id: params.callId ?? getRandomInt(), }) .call({ cachedState: state }); return result.value0; } static async buildWithdrawLiquidityPayloadV2(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const result = await dexPairContract(connection, pairAddress) .methods.buildWithdrawLiquidityPayloadV2({ _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, }) .call({ cachedState: state }); return result.value0; } static async expectedDepositLiquidity(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const result = await dexPairContract(connection, pairAddress) .methods.expectedDepositLiquidity({ answerId: 0, auto_change: params.autoChange, left_amount: params.leftAmount, referrer: resolveTvmAddress(params.referrer ?? ZeroAddress), right_amount: params.rightAmount, }) .call({ cachedState: state, responsible: true }); return result.value0; } static async expectedExchange(connection, pairAddress, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, pairAddress); const result = await dexPairContract(connection, pairAddress) .methods.expectedExchange({ amount: params.amount, answerId: 0, spent_token_root: resolveTvmAddress(params.spentTokenAddress), }) .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 result = await dexPairContract(connection, pairAddress) .methods.expectedSpendAmount({ answerId: 0, receive_amount: params.receiveAmount, receive_token_root: resolveTvmAddress(params.receiveTokenAddress), }) .call({ cachedState: state, responsible: true }); return { expectedAmount: result.expected_amount, expectedFee: result.expected_fee, }; } }