UNPKG

@broxus/js-core

Version:

MobX-based JavaScript Core library

258 lines (257 loc) 12.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.VaultTokenWalletUtils = void 0; const js_utils_1 = require("@broxus/js-utils"); const console_1 = require("../../console"); const constants_1 = require("../../constants"); const tvm_token_1 = require("../../models/tvm-token"); const contracts_1 = require("../../models/vault-token-wallet/contracts"); const utils_1 = require("../../utils"); const get_scan_link_1 = require("../../utils/get-scan-link"); class VaultTokenWalletUtils { /** * Accept native - makes the transaction via token wallet contract to send message * @param {ProviderRpcClient} provider * @param {Address | string} tokenWalletAddress * @param {VaultTokenWalletAcceptNativeAbiParams} params * @param {Partial<SendInternalParams>} [args] */ static async acceptNative(provider, tokenWalletAddress, params, args) { const _params = { amount: params.amount, deployWalletValue: params.deployWalletValue || 0, payload: params.payload || '', remainingGasTo: (0, utils_1.resolveTvmAddress)(params.remainingGasTo), }; const _args = { amount: (0, utils_1.toInt)(0.5, constants_1.DEFAULT_NATIVE_CURRENCY_DECIMALS), bounce: true, from: (0, utils_1.resolveTvmAddress)(params.remainingGasTo), ...args, }; try { return await (0, contracts_1.vaultTokenWalletContract)(provider, tokenWalletAddress) .methods.acceptNative(_params) .sendDelayed(_args); } catch (e) { if (!(0, utils_1.isUnsupportedAbiVersionError)(e)) { throw e; } return (0, contracts_1.vaultTokenWalletV22Contract)(provider, tokenWalletAddress) .methods.acceptNative(_params) .sendDelayed(_args); } } /** * Transfer - makes the transaction via token wallet contract to send message * @param {ProviderRpcClient} provider * @param {Address | string} tokenWalletAddress * @param {VaultTokenWalletTransferAbiParams} params * @param {Partial<SendInternalParams>} [args] */ static async transfer(provider, tokenWalletAddress, params, args) { const _params = { amount: params.amount, deployWalletValue: params.deployWalletValue || 0, notify: params.notify ?? true, payload: params.payload || '', recipient: (0, utils_1.resolveTvmAddress)(params.recipient), remainingGasTo: (0, utils_1.resolveTvmAddress)(params.remainingGasTo), }; const _args = { amount: (0, utils_1.toInt)(0.5, constants_1.DEFAULT_NATIVE_CURRENCY_DECIMALS), bounce: true, from: (0, utils_1.resolveTvmAddress)(params.remainingGasTo), ...args, }; try { return await (0, contracts_1.vaultTokenWalletContract)(provider, tokenWalletAddress) .methods.transfer(_params) .sendDelayed(_args); } catch (e) { if (!(0, utils_1.isUnsupportedAbiVersionError)(e)) { throw e; } return (0, contracts_1.vaultTokenWalletV22Contract)(provider, tokenWalletAddress) .methods.transfer(_params) .sendDelayed(_args); } } /** * Transfer to wallet - makes the transaction via token wallet contract to send message to a * token wallet * @param {ProviderRpcClient} provider * @param {Address | string} tokenWalletAddress * @param {VaultTokenWalletTransferToWalletAbiParams} params * @param {Partial<SendInternalParams>} [args] */ static async transferToWallet(provider, tokenWalletAddress, params, args) { const _params = { amount: params.amount, notify: params.notify ?? true, payload: params.payload || '', recipientTokenWallet: (0, utils_1.resolveTvmAddress)(params.recipientTokenWallet), remainingGasTo: (0, utils_1.resolveTvmAddress)(params.remainingGasTo), }; const _args = { amount: (0, utils_1.toInt)(0.5, constants_1.DEFAULT_NATIVE_CURRENCY_DECIMALS), bounce: true, from: (0, utils_1.resolveTvmAddress)(params.remainingGasTo), ...args, }; try { return await (0, contracts_1.vaultTokenWalletContract)(provider, tokenWalletAddress) .methods.transferToWallet(_params) .sendDelayed(_args); } catch (e) { if (!(0, utils_1.isUnsupportedAbiVersionError)(e)) { throw e; } return (0, contracts_1.vaultTokenWalletV22Contract)(provider, tokenWalletAddress) .methods.transferToWallet(_params) .sendDelayed(_args); } } /** * Burns assets in favor of the address specified in callbackTo * @param {ProviderRpcClient} provider * @param {Address | string} tokenWalletAddress * @param {VaultTokenWalletBurnAbiParams} params * @param {Partial<SendInternalParams>} [args] */ static async burn(provider, tokenWalletAddress, params, args) { const _params = { amount: params.amount, callbackTo: (0, utils_1.resolveTvmAddress)(params.callbackTo), payload: params.payload || '', remainingGasTo: (0, utils_1.resolveTvmAddress)(params.remainingGasTo), }; const _args = { amount: (0, utils_1.toInt)(0.2, constants_1.DEFAULT_NATIVE_CURRENCY_DECIMALS), bounce: true, from: (0, utils_1.resolveTvmAddress)(params.remainingGasTo), ...args, }; try { return await (0, contracts_1.vaultTokenWalletContract)(provider, tokenWalletAddress) .methods.burn(_params) .sendDelayed(_args); } catch (e) { if (!(0, utils_1.isUnsupportedAbiVersionError)(e)) { throw e; } return (0, contracts_1.vaultTokenWalletV22Contract)(provider, tokenWalletAddress) .methods.burn(_params) .sendDelayed(_args); } } /** * Destroy wallet * @param {ProviderRpcClient} provider * @param {Address | string} tokenWalletAddress * @param {VaultTokenWalletDestroyAbiParams} params * @param {Partial<SendInternalParams>} [args] */ static async destroy(provider, tokenWalletAddress, params, args) { const _params = { remainingGasTo: (0, utils_1.resolveTvmAddress)(params.remainingGasTo) }; const _args = { amount: (0, utils_1.toInt)(0.01, constants_1.DEFAULT_NATIVE_CURRENCY_DECIMALS), bounce: true, from: (0, utils_1.resolveTvmAddress)(params.remainingGasTo), ...args, }; try { return await (0, contracts_1.vaultTokenWalletContract)(provider, tokenWalletAddress) .methods.destroy(_params) .sendDelayed(_args); } catch (e) { if (!(0, utils_1.isUnsupportedAbiVersionError)(e)) { throw e; } return (0, contracts_1.vaultTokenWalletV22Contract)(provider, tokenWalletAddress) .methods.destroy(_params) .sendDelayed(_args); } } /** * Returns token wallet balance in this token by the given token root address * and owner wallet address or owner token wallet address. * @param {VaultTokenOwnerAbiParams | VaultTokenWalletAddressAbiParams} params * @param {FullContractState} [cachedState] * @param {ProviderRpcClient} [connection] */ static async balance(connection, params, cachedState) { let tokenWalletAddress; if ('walletAddress' in params) { tokenWalletAddress = params.walletAddress; } else if ('tokenAddress' in params && 'ownerAddress' in params) { tokenWalletAddress = await tvm_token_1.TvmToken.Utils.walletOf(connection, params); } if (tokenWalletAddress == null) { throw new Error('Token Wallet not specified'); } const state = cachedState ?? (await (0, utils_1.getFullContractState)(connection, tokenWalletAddress)); return (0, contracts_1.vaultTokenWalletContract)(connection, tokenWalletAddress) .methods.balance({ answerId: 0 }) .call({ cachedState: state, responsible: true }) .then(async (result) => { if (process.env.NODE_ENV !== 'production') { const tokenRootAddress = 'tokenAddress' in params ? params.tokenAddress.toString() : (await VaultTokenWalletUtils.root(connection, tokenWalletAddress, state))?.toString(); const walletOwnerAddress = 'ownerAddress' in params ? params.ownerAddress.toString() : (await VaultTokenWalletUtils.owner(connection, tokenWalletAddress, state))?.toString(); const providerState = await connection.getProviderState(); const tokenLink = tokenRootAddress ? (0, get_scan_link_1.getScanLink)(tokenRootAddress, providerState.networkId.toString()) : undefined; const ownerLink = walletOwnerAddress ? (0, get_scan_link_1.getScanLink)(walletOwnerAddress, providerState.networkId.toString()) : undefined; const walletLink = tokenWalletAddress ? (0, get_scan_link_1.getScanLink)(tokenWalletAddress.toString(), providerState.networkId.toString()) : undefined; (0, js_utils_1.groupCollapsed)(`%cVaultTokenWalletUtils%c Request token wallet [%c${(0, js_utils_1.sliceString)(tokenWalletAddress.toString())}%c] balance${cachedState ? ' [from cache]' : ''}`, console_1.successLabelStyle, console_1.inheritTextStyle, console_1.successTextStyle, console_1.inheritTextStyle); (0, js_utils_1.debug)(`Token address: %c${(0, js_utils_1.sliceString)(tokenRootAddress)}%c ${tokenLink}`, console_1.successTextStyle, console_1.inheritTextStyle); (0, js_utils_1.debug)(`Owner address: %c${(0, js_utils_1.sliceString)(walletOwnerAddress)}%c ${ownerLink}`, console_1.successTextStyle, console_1.inheritTextStyle); (0, js_utils_1.debug)(`Wallet address: %c${(0, js_utils_1.sliceString)(tokenWalletAddress.toString())}%c ${walletLink}`, console_1.successTextStyle, console_1.inheritTextStyle); (0, js_utils_1.debug)(`Balance: %c${result.value0}`, console_1.successTextStyle); (0, js_utils_1.groupEnd)(); } return result.value0; }) .catch(() => undefined); } static async owner(connection, tokenWalletAddress, cachedState) { try { const state = cachedState ?? await (0, utils_1.getFullContractState)(connection, tokenWalletAddress); const result = await (0, contracts_1.vaultTokenWalletContract)(connection, tokenWalletAddress) .methods.owner({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } catch { return undefined; } } static async root(connection, tokenWalletAddress, cachedState) { try { const state = cachedState ?? await (0, utils_1.getFullContractState)(connection, tokenWalletAddress); const result = await (0, contracts_1.vaultTokenWalletContract)(connection, tokenWalletAddress) .methods.root({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } catch { return undefined; } } } exports.VaultTokenWalletUtils = VaultTokenWalletUtils;