@broxus/js-core
Version:
MobX-based JavaScript Core library
228 lines (227 loc) • 11.5 kB
JavaScript
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;
}
}