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