@broxus/js-core
Version:
MobX-based JavaScript Core library
300 lines (299 loc) • 15.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DexAccountUtils = void 0;
const js_utils_1 = require("@broxus/js-utils");
const console_1 = require("../../console");
const constants_1 = require("../../constants");
const contracts_1 = require("../../models/dex-account/contracts");
const utils_1 = require("../../utils");
const get_scan_link_1 = require("../../utils/get-scan-link");
class DexAccountUtils {
/**
* Sends a delayed message to add a pair to the Account
* @param {ProviderRpcClient} provider
* @param {Address | string} dexAccountAddress
* @param {DexAccountAddPairAbiParams} params
* @param {Pick<SendInternalParams, 'from'> & Omit<Partial<SendInternalParams>, 'from'>} args
* @returns {Promise<DelayedMessageExecution>}
*/
static async addPair(provider, dexAccountAddress, params, args) {
return (0, contracts_1.dexAccountContract)(provider, dexAccountAddress)
.methods.addPair({
left_root: (0, utils_1.resolveTvmAddress)(params.leftRootAddress),
right_root: (0, utils_1.resolveTvmAddress)(params.rightRootAddress),
})
.sendDelayed({
amount: (0, utils_1.toInt)(3, constants_1.DEFAULT_NATIVE_CURRENCY_DECIMALS),
bounce: false,
...args,
});
}
/**
* Sends a delayed message to add a pool to the Account
* @param {ProviderRpcClient} provider
* @param {Address | string} dexAccountAddress
* @param {DexAccountAddPoolAbiParams} params
* @param {Pick<SendInternalParams, 'from'> & Omit<Partial<SendInternalParams>, 'from'>} args
* @returns {Promise<DelayedMessageExecution>}
*/
static async addPool(provider, dexAccountAddress, params, args) {
return (0, contracts_1.dexAccountContract)(provider, dexAccountAddress)
.methods.addPool({
_roots: params.roots.map(utils_1.resolveTvmAddress),
})
.sendDelayed({
amount: (0, utils_1.toInt)(3, constants_1.DEFAULT_NATIVE_CURRENCY_DECIMALS),
bounce: false,
...args,
});
}
/**
* Sends a delayed message to deposit liquidity into a pair via the Account
* @param {ProviderRpcClient} provider
* @param {Address | string} dexAccountAddress
* @param {DexAccountDepositLiquidityAbiParams} params
* @param {Partial<SendInternalParams>} [args]
* @returns {Promise<DelayedMessageExecution>}
*/
static async depositLiquidity(provider, dexAccountAddress, params, args) {
return (0, contracts_1.dexAccountContract)(provider, dexAccountAddress)
.methods.depositLiquidity({
auto_change: params.autoChange,
call_id: params.callId ?? (0, utils_1.getRandomInt)(),
expected_lp_root: (0, utils_1.resolveTvmAddress)(params.expectedLpAddress),
left_amount: params.leftAmount,
left_root: (0, utils_1.resolveTvmAddress)(params.leftRootAddress),
right_amount: params.rightAmount,
right_root: (0, utils_1.resolveTvmAddress)(params.rightRootAddress),
send_gas_to: (0, utils_1.resolveTvmAddress)(params.sendGasTo),
})
.sendDelayed({
amount: (0, utils_1.toInt)(2.6, constants_1.DEFAULT_NATIVE_CURRENCY_DECIMALS),
bounce: false,
from: (0, utils_1.resolveTvmAddress)(params.sendGasTo),
...args,
});
}
/**
* Sends a delayed message to deposit liquidity into a stable pool via the Account
* @param {ProviderRpcClient} provider
* @param {Address | string} dexAccountAddress
* @param {DexAccountDepositLiquidityAbiParams} params
* @param {Partial<SendInternalParams>} [args]
* @returns {Promise<DelayedMessageExecution>}
*/
static async depositLiquidityV2(provider, dexAccountAddress, params, args) {
return (0, contracts_1.dexAccountContract)(provider, dexAccountAddress)
.methods.depositLiquidityV2({
_autoChange: true,
_callId: params.callId ?? (0, utils_1.getRandomInt)(),
_expected: {
...params.expected,
root: (0, utils_1.resolveTvmAddress)(params.expected.root),
},
_operations: params.operations.map(operation => ({
...operation,
root: (0, utils_1.resolveTvmAddress)(operation.root),
})),
_referrer: (0, utils_1.resolveTvmAddress)(params.referrer),
_remainingGasTo: (0, utils_1.resolveTvmAddress)(params.remainingGasTo),
})
.sendDelayed({
amount: (0, utils_1.toInt)(2.6, constants_1.DEFAULT_NATIVE_CURRENCY_DECIMALS),
bounce: false,
from: (0, utils_1.resolveTvmAddress)(params.remainingGasTo),
...args,
});
}
/**
* Sends a delayed message to withdraw token from the Account
* @param {ProviderRpcClient} provider
* @param {Address | string} dexAccountAddress
* @param {DexAccountWithdrawAbiParams} params
* @param {Partial<SendInternalParams>} [args]
* @returns {Promise<DelayedMessageExecution>}
*/
static async withdraw(provider, dexAccountAddress, params, args) {
return (0, contracts_1.dexAccountContract)(provider, dexAccountAddress)
.methods.withdraw({
amount: params.amount,
call_id: params.callId ?? (0, utils_1.getRandomInt)(),
deploy_wallet_grams: params.deployWalletGrams ?? (0, utils_1.toInt)(0.1, constants_1.DEFAULT_NATIVE_CURRENCY_DECIMALS),
recipient_address: (0, utils_1.resolveTvmAddress)(params.recipientAddress),
send_gas_to: (0, utils_1.resolveTvmAddress)(params.sendGasTo),
token_root: (0, utils_1.resolveTvmAddress)(params.tokenAddress),
})
.sendDelayed({
amount: (0, utils_1.toInt)(2.1, constants_1.DEFAULT_NATIVE_CURRENCY_DECIMALS),
bounce: false,
from: (0, utils_1.resolveTvmAddress)(params.sendGasTo),
...args,
});
}
/**
* Sends a delayed message to withdraw liquidity (LP tokens) from the Account
* @param {ProviderRpcClient} provider
* @param {Address | string} dexAccountAddress
* @param {DexAccountWithdrawLiquidityAbiParams} params
* @param {Partial<SendInternalParams>} [args]
* @returns {Promise<DelayedMessageExecution>}
* @deprecated
*/
static async withdrawLiquidity(provider, dexAccountAddress, params, args) {
return (0, contracts_1.dexAccountContract)(provider, dexAccountAddress)
.methods.withdrawLiquidity({
call_id: params.callId ?? (0, utils_1.getRandomInt)(),
left_root: (0, utils_1.resolveTvmAddress)(params.leftRootAddress),
lp_amount: params.amount,
lp_root: (0, utils_1.resolveTvmAddress)(params.lpRootAddress),
right_root: (0, utils_1.resolveTvmAddress)(params.rightRootAddress),
send_gas_to: (0, utils_1.resolveTvmAddress)(params.sendGasTo),
})
.sendDelayed({
amount: (0, utils_1.toInt)(2.7, constants_1.DEFAULT_NATIVE_CURRENCY_DECIMALS),
bounce: false,
from: (0, utils_1.resolveTvmAddress)(params.sendGasTo),
...args,
});
}
/**
* Returns DEX Account owner address
* @param {ProviderRpcClient} connection
* @param {Address | string} dexAccountAddress
* @param {FullContractState} cachedState
* @returns {Promise<Address>}
*/
static async getOwner(connection, dexAccountAddress, cachedState) {
const state = cachedState ?? await (0, utils_1.getFullContractState)(connection, dexAccountAddress);
const result = await (0, contracts_1.dexAccountContract)(connection, dexAccountAddress)
.methods.getOwner({ answerId: 0 })
.call({ cachedState: state, responsible: true });
return result.value0;
}
/**
* Returns token balance by the given DEX Account and token address addresses
* @param {ProviderRpcClient} connection
* @param {Address | string} dexAccountAddress
* @param {Address | string} tokenAddress
* @param {FullContractState | undefined} [cachedState]
* @returns {Promise<string | undefined>}
*/
static async getBalance(connection, dexAccountAddress, tokenAddress, cachedState) {
const state = cachedState ?? await (0, utils_1.getFullContractState)(connection, dexAccountAddress);
const result = await (0, contracts_1.dexAccountContract)(connection, dexAccountAddress)
.methods.getWalletData({
answerId: 0,
token_root: (0, utils_1.resolveTvmAddress)(tokenAddress),
})
.call({ cachedState: state, responsible: true });
return result.balance;
}
/**
* Returns map of a user tokens balances in a DEX account
* @param {ProviderRpcClient} connection
* @param {Address | string} dexAccountAddress
* @param {FullContractState} [cachedState]
* @returns {Promise<Map<string, string>>}
*/
static async getBalances(connection, dexAccountAddress, cachedState) {
const state = cachedState ?? await (0, utils_1.getFullContractState)(connection, dexAccountAddress);
const balances = await (0, contracts_1.dexAccountContract)(connection, dexAccountAddress)
.methods.getBalances({})
.call({ cachedState: state })
.then(result => result.value0.reduce((acc, [address, balance]) => acc.set(address.toString().toLowerCase(), balance.toString()), new Map()));
if (process.env.NODE_ENV !== 'production') {
const entries = Array.from(balances.entries());
if (entries.length > 0) {
const providerState = await connection.getProviderState();
(0, js_utils_1.groupCollapsed)(`%c${this.prototype.constructor.name}%c Balances has been synced for the account [%c${(0, js_utils_1.sliceString)(dexAccountAddress.toString())}%c]`, console_1.successLabelStyle, console_1.inheritTextStyle, console_1.successTextStyle, console_1.inheritTextStyle);
entries.forEach(([token, balance], idx) => {
if (idx > 0) {
(0, js_utils_1.debug)('============');
}
const link = (0, get_scan_link_1.getScanLink)(token, providerState.networkId.toString());
(0, js_utils_1.debug)(`Token address: %c${(0, js_utils_1.sliceString)(token)}%c ${link}`, console_1.successTextStyle, console_1.inheritTextStyle);
(0, js_utils_1.debug)(`Balance: %c${balance}`, console_1.successTextStyle);
});
(0, js_utils_1.groupEnd)();
}
else {
(0, js_utils_1.debug)(`%c${this.prototype.constructor.name}%c Wallets not found for checks the balances`, console_1.warningLabelStyle, console_1.inheritTextStyle);
}
}
return balances;
}
/**
*
* @param {ProviderRpcClient} connection
* @param {Address | string} dexAccountAddress
* @param {FullContractState} [cachedState]
* @returns Promise<string>
*/
static async getVersion(connection, dexAccountAddress, cachedState) {
const state = cachedState ?? await (0, utils_1.getFullContractState)(connection, dexAccountAddress);
const result = await (0, contracts_1.dexAccountContract)(connection, dexAccountAddress)
.methods.getVersion({ answerId: 0 })
.call({ cachedState: state, responsible: true });
return result.value0;
}
/**
* Returns token wallet by the given DEX Account and token address addresses
* @param {ProviderRpcClient} connection
* @param {Address | string} dexAccountAddress
* @param {Address | string} tokenAddress
* @param {FullContractState | undefined} [cachedState]
* @returns Promise<Address>
*/
static async getWallet(connection, dexAccountAddress, tokenAddress, cachedState) {
const state = cachedState ?? await (0, utils_1.getFullContractState)(connection, dexAccountAddress);
const result = await (0, contracts_1.dexAccountContract)(connection, dexAccountAddress)
.methods.getWalletData({
answerId: 0,
token_root: (0, utils_1.resolveTvmAddress)(tokenAddress),
})
.call({ cachedState: state, responsible: true });
return result.wallet;
}
/**
*
* @param {ProviderRpcClient} connection
* @param {Address | string} dexAccountAddress
* @param {FullContractState} [cachedState]
* @returns {Promise<Map<string, Address>>}
*/
static async getWallets(connection, dexAccountAddress, cachedState) {
const state = cachedState ?? await (0, utils_1.getFullContractState)(connection, dexAccountAddress);
const wallets = await (0, contracts_1.dexAccountContract)(connection, dexAccountAddress)
.methods.getWallets({})
.call({ cachedState: state })
.then(result => result.value0.reduce((acc, [tokenAddress, walletAddress]) => acc.set(tokenAddress.toString().toLowerCase(), walletAddress), new Map()));
if (process.env.NODE_ENV !== 'production') {
const entries = Array.from(wallets.entries());
if (entries.length > 0) {
(0, js_utils_1.groupCollapsed)(`%c${this.prototype.constructor.name}%c Wallets has been synced for the account [%c${(0, js_utils_1.sliceString)(dexAccountAddress.toString())}%c]`, console_1.successLabelStyle, console_1.inheritTextStyle, console_1.successTextStyle, console_1.inheritTextStyle);
entries.forEach(([token, wallet], idx) => {
if (idx > 0) {
(0, js_utils_1.debug)('============');
}
(0, js_utils_1.debug)(`Token address: %c${(0, js_utils_1.sliceString)(token)}%c ${(0, get_scan_link_1.getScanLink)(token)}`, console_1.successTextStyle, console_1.inheritTextStyle);
(0, js_utils_1.debug)(`Wallet address: %c${(0, js_utils_1.sliceString)(wallet.toString())}%c ${(0, get_scan_link_1.getScanLink)(wallet.toString())}`, console_1.successTextStyle, console_1.inheritTextStyle);
});
(0, js_utils_1.groupEnd)();
}
else {
(0, js_utils_1.debug)(`%c${this.prototype.constructor.name}%c Wallets not found`, console_1.warningLabelStyle, console_1.inheritTextStyle);
}
}
return wallets;
}
static decodeEvent(connection, dexAccountAddress, args) {
return (0, contracts_1.dexAccountContract)(connection, dexAccountAddress).decodeEvent(args);
}
static decodeTransaction(connection, dexAccountAddress, args) {
return (0, contracts_1.dexAccountContract)(connection, dexAccountAddress).decodeTransaction(args);
}
static decodeTransactionEvents(connection, dexAccountAddress, transaction) {
return (0, contracts_1.dexAccountContract)(connection, dexAccountAddress).decodeTransactionEvents({ transaction });
}
}
exports.DexAccountUtils = DexAccountUtils;