@broxus/js-core
Version:
MobX-based JavaScript Core library
280 lines (279 loc) • 14.2 kB
JavaScript
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,
};
}
}