@broxus/js-core
Version:
MobX-based JavaScript Core library
224 lines (223 loc) • 10.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.TvmTokenWalletUtils = 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/tvm-token-wallet/contracts");
const utils_1 = require("../../utils");
const get_scan_link_1 = require("../../utils/get-scan-link");
class TvmTokenWalletUtils {
/**
* Transfer - makes the transaction via token wallet contract to send message
* @param {ProviderRpcClient} provider
* @param {Address | string} tokenWalletAddress
* @param {TvmTokenWalletTransferAbiParams} 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.tokenWalletContract)(provider, tokenWalletAddress)
.methods.transfer(_params)
.sendDelayed(_args);
}
catch (e) {
if (!(0, utils_1.isUnsupportedAbiVersionError)(e)) {
throw e;
}
return (0, contracts_1.tokenWalletV23Contract)(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 {TvmTokenWalletTransferToWalletAbiParams} 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.tokenWalletContract)(provider, tokenWalletAddress)
.methods.transferToWallet(_params)
.sendDelayed(_args);
}
catch (e) {
if (!(0, utils_1.isUnsupportedAbiVersionError)(e)) {
throw e;
}
return (0, contracts_1.tokenWalletV23Contract)(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 {TvmTokenWalletBurnAbiParams} 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.tokenWalletContract)(provider, tokenWalletAddress)
.methods.burn(_params)
.sendDelayed(_args);
}
catch (e) {
if (!(0, utils_1.isUnsupportedAbiVersionError)(e)) {
throw e;
}
return (0, contracts_1.tokenWalletV23Contract)(provider, tokenWalletAddress)
.methods.burn(_params)
.sendDelayed(_args);
}
}
/**
* Destroy wallet
* @param {ProviderRpcClient} provider
* @param {Address | string} tokenWalletAddress
* @param {TvmTokenWalletDestroyAbiParams} 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.tokenWalletContract)(provider, tokenWalletAddress)
.methods.destroy(_params)
.sendDelayed(_args);
}
catch (e) {
if (!(0, utils_1.isUnsupportedAbiVersionError)(e)) {
throw e;
}
return (0, contracts_1.tokenWalletV23Contract)(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 {TvmTokenOwnerAbiParams | TvmTokenWalletAddressAbiParams} 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.tokenWalletContract)(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 TvmTokenWalletUtils.root(connection, tokenWalletAddress, state))?.toString();
const walletOwnerAddress = 'ownerAddress' in params
? params.ownerAddress.toString()
: (await TvmTokenWalletUtils.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)(`%cTvmTokenWalletUtils%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.tokenWalletContract)(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.tokenWalletContract)(connection, tokenWalletAddress)
.methods.root({ answerId: 0 })
.call({ cachedState: state, responsible: true });
return result.value0;
}
catch {
return undefined;
}
}
}
exports.TvmTokenWalletUtils = TvmTokenWalletUtils;