UNPKG

@broxus/js-core

Version:

MobX-based JavaScript Core library

300 lines (299 loc) 15.4 kB
"use strict"; 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;