UNPKG

@broxus/js-core

Version:

MobX-based JavaScript Core library

228 lines (227 loc) 11.5 kB
import { debug, formattedTokenAmount, groupCollapsed, groupEnd, sliceAddress } from '@broxus/js-utils'; import { getScanLink, inheritTextStyle, successLabelStyle, successTextStyle } from '../../console'; import { DEFAULT_NATIVE_CURRENCY_DECIMALS } from '../../constants'; import { tokenRootContract } from '../../models/tvm-token/contracts'; import { getFullContractState, resolveTvmAddress, toInt } from '../../utils'; export class TvmTokenUtils { static async deployWallet(provider, tokenAddress, params, args) { return tokenRootContract(provider, tokenAddress) .methods.deployWallet({ answerId: 0, deployWalletValue: params.deployWalletValue ?? toInt(1, DEFAULT_NATIVE_CURRENCY_DECIMALS), walletOwner: resolveTvmAddress(params.walletOwner), }) .sendDelayed({ amount: toInt(1, DEFAULT_NATIVE_CURRENCY_DECIMALS), bounce: true, from: resolveTvmAddress(params.walletOwner), ...args, }); } static async burn(provider, tokenAddress, params, args) { return tokenRootContract(provider, tokenAddress) .methods.burnTokens({ amount: params.amount, callbackTo: resolveTvmAddress(params.callbackTo), payload: params.payload, remainingGasTo: resolveTvmAddress(params.remainingGasTo), walletOwner: resolveTvmAddress(params.walletOwner), }) .sendDelayed({ amount: toInt(0.5, DEFAULT_NATIVE_CURRENCY_DECIMALS), bounce: true, from: resolveTvmAddress(params.remainingGasTo), ...args, }); } static async mint(provider, tokenAddress, params, args) { return tokenRootContract(provider, tokenAddress) .methods.mint({ amount: params.amount, deployWalletValue: params.deployWalletValue ?? toInt(1, DEFAULT_NATIVE_CURRENCY_DECIMALS), notify: params.notify ?? false, payload: params.payload ?? '', recipient: resolveTvmAddress(params.recipient), remainingGasTo: resolveTvmAddress(params.remainingGasTo), }) .sendDelayed({ amount: toInt(0.6, DEFAULT_NATIVE_CURRENCY_DECIMALS), bounce: true, from: resolveTvmAddress(params.remainingGasTo), ...args, }); } static async transferOwnership(provider, tokenAddress, params, args) { return tokenRootContract(provider, tokenAddress) .methods.transferOwnership({ callbacks: params.callbacks ?? [], newOwner: resolveTvmAddress(params.newOwner), remainingGasTo: resolveTvmAddress(params.remainingGasTo), }) .sendDelayed({ amount: toInt(5, DEFAULT_NATIVE_CURRENCY_DECIMALS), bounce: true, from: resolveTvmAddress(params.remainingGasTo), ...args, }); } static async disableBurnByRoot(provider, tokenAddress, args) { return tokenRootContract(provider, tokenAddress) .methods.disableBurnByRoot({ answerId: 0 }) .sendDelayed({ amount: toInt(0.1, DEFAULT_NATIVE_CURRENCY_DECIMALS), bounce: true, ...args, }); } static async disableMint(provider, tokenAddress, args) { return tokenRootContract(provider, tokenAddress) .methods.disableMint({ answerId: 0 }) .sendDelayed({ amount: toInt(0.1, DEFAULT_NATIVE_CURRENCY_DECIMALS), bounce: true, ...args, }); } static async setBurnPaused(provider, tokenAddress, params, args) { return tokenRootContract(provider, tokenAddress) .methods.setBurnPaused({ answerId: 0, paused: params.paused }) .sendDelayed({ amount: toInt(0.1, DEFAULT_NATIVE_CURRENCY_DECIMALS), bounce: true, ...args, }); } static async getDetails(connection, tokenAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, tokenAddress); if (!state?.isDeployed) { return undefined; } return Promise.all([ TvmTokenUtils.getDecimals(connection, tokenAddress, state), TvmTokenUtils.getName(connection, tokenAddress, state), TvmTokenUtils.getSymbol(connection, tokenAddress, state), TvmTokenUtils.rootOwnerAddress(connection, tokenAddress, state), TvmTokenUtils.totalSupply(connection, tokenAddress, state), ]).then(async ([decimals, name, symbol, rootOwnerAddress, totalSupply]) => { if (process.env.NODE_ENV !== 'production') { const providerState = await connection.getProviderState(); const args = [ `%cTvmTokenUtils%c Request token %c${symbol}%c [%c${sliceAddress(tokenAddress.toString())}%c] details${cachedState ? ' [from cache]' : ''}`, successLabelStyle, inheritTextStyle, successTextStyle, inheritTextStyle, successTextStyle, inheritTextStyle, ]; groupCollapsed(...args); debug(`Token root address: %c${sliceAddress(tokenAddress.toString())}%c ${getScanLink(tokenAddress.toString(), providerState.networkId.toString())}`, successTextStyle, inheritTextStyle); debug(`Token symbol: %c${symbol}`, successTextStyle); debug(`Token name: %c${name}`, successTextStyle); debug(`Token decimals: %c${decimals}`, successTextStyle); debug(`Token total supply: %c${formattedTokenAmount(totalSupply, decimals, { preserve: true, roundOn: false, })}`, successTextStyle); debug(`Token root owner address: %c${sliceAddress(rootOwnerAddress.toString())}%c ${getScanLink(rootOwnerAddress.toString(), providerState.networkId.toString())}`, successTextStyle, inheritTextStyle); groupEnd(); } return { address: resolveTvmAddress(tokenAddress), contractState: state, decimals, name, rootOwnerAddress, symbol, totalSupply, }; }); } static async getDecimals(connection, tokenAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, tokenAddress); const result = await tokenRootContract(connection, tokenAddress) .methods.decimals({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return parseInt(result.value0, 10); } static async getSymbol(connection, tokenAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, tokenAddress); const result = await tokenRootContract(connection, tokenAddress) .methods.symbol({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } static async getName(connection, tokenAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, tokenAddress); const result = await tokenRootContract(connection, tokenAddress) .methods.name({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } static async rootOwnerAddress(connection, tokenAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, tokenAddress); const result = await tokenRootContract(connection, tokenAddress) .methods.rootOwner({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } static async totalSupply(connection, tokenAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, tokenAddress); const result = await tokenRootContract(connection, tokenAddress) .methods.totalSupply({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } static async burnPaused(connection, tokenAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, tokenAddress); const result = await tokenRootContract(connection, tokenAddress) .methods.burnPaused({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } static async burnByRootDisabled(connection, tokenAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, tokenAddress); const result = await tokenRootContract(connection, tokenAddress) .methods.burnByRootDisabled({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } static async mintDisabled(connection, tokenAddress, cachedState) { const state = cachedState ?? await getFullContractState(connection, tokenAddress); const result = await tokenRootContract(connection, tokenAddress) .methods.mintDisabled({ answerId: 0 }) .call({ cachedState: state, responsible: true }); return result.value0; } /** * Returns expected token wallet address * @param {ProviderRpcClient} connection * @param {TvmTokenOwnerAbiParams} params * @param {FullContractState} [cachedState] * @returns Promise<Address> */ static async walletOf(connection, params, cachedState) { const state = cachedState ?? await getFullContractState(connection, params.tokenAddress); const result = await tokenRootContract(connection, params.tokenAddress) .methods.walletOf({ answerId: 0, walletOwner: resolveTvmAddress(params.ownerAddress), }) .call({ cachedState: state, responsible: true }); if (process.env.NODE_ENV !== 'production') { const providerState = await connection.getProviderState(); const symbol = cachedState ? await TvmTokenUtils.getSymbol(connection, params.tokenAddress, cachedState) : undefined; groupCollapsed(`%cTvmTokenUtils%c Request wallet address in token %c${symbol ?? sliceAddress(params.tokenAddress.toString())}%c${cachedState ? ' [from cache]' : ''}`, successLabelStyle, inheritTextStyle, successTextStyle, inheritTextStyle); debug(`Token root address: %c${sliceAddress(params.tokenAddress.toString())}%c ${getScanLink(params.tokenAddress.toString(), providerState.networkId.toString())}`, successTextStyle, inheritTextStyle); debug(`Owner address: %c${sliceAddress(params.ownerAddress.toString())}%c ${getScanLink(params.ownerAddress.toString(), providerState.networkId.toString())}`, successTextStyle, inheritTextStyle); debug(`Wallet address: %c${sliceAddress(result.value0.toString())}%c ${getScanLink(result.value0.toString(), providerState.networkId.toString())}`, successTextStyle, inheritTextStyle); groupEnd(); } return result.value0; } }