@iexec/iapp
Version:
A CLI to guide you through the process of building an iExec iApp
88 lines (77 loc) • 2.5 kB
text/typescript
import { warnBox } from './box.js';
import { emphasis, command, promptHelper } from './color.js';
import type { Spinner } from './spinner.js';
import { BN, IExec, utils } from 'iexec';
export async function ensureBalances({
spinner,
iexec,
warnOnlyRlc = false,
nRlcMin,
weiMin,
}: {
spinner: Spinner;
iexec: IExec;
warnOnlyRlc?: boolean;
nRlcMin?: BN;
weiMin?: BN;
}): Promise<{
wei: BN;
nRLC: BN;
stake: BN;
}> {
const chainId = await iexec.config.resolveChainId();
const address = await iexec.wallet.getAddress();
const [{ nRLC, wei }, { stake }] = await Promise.all([
iexec.wallet.checkBalances(address),
iexec.account.checkBalance(address),
// TODO check voucher?
]);
const totalRlc = stake.add(nRLC);
const missingNative =
(chainId !== 134 && wei.isZero()) || (!!weiMin && wei.lt(weiMin));
const missingRlc =
(chainId !== 134 && totalRlc.isZero()) ||
(!!nRlcMin && totalRlc.lt(nRlcMin));
const shouldThrow = missingNative || (missingRlc && !warnOnlyRlc);
// always show missing balance warnings
if (missingNative || missingRlc) {
const helpers = [];
if (missingNative) {
const msg =
' - Native asset balance needed for transaction fees is ' +
(wei.isZero() ? 'empty' : 'insufficient');
const requirement = weiMin
? ` (requires ${utils.formatEth(weiMin as BN)} ether)`
: '';
helpers.push(`${msg}${requirement}`);
}
if (missingRlc) {
const msg =
' - RLC token balance needed for iapp runs is ' +
(totalRlc.isZero() ? 'empty' : 'insufficient') +
(warnOnlyRlc ? promptHelper(' (warning only)') : '');
const requirement = nRlcMin
? ` (requires ${utils.formatRLC(nRlcMin as BN)} RLC)`
: '';
helpers.push(`${msg}${requirement}`);
}
spinner.log(
warnBox(`Operations on this chain require ${chainId !== 134 ? 'native assets for transaction fees and ' : ''}RLC for iApp runs!
Your wallet balance is insufficient:
${helpers.join('\n')}
You can either:
- Fund your wallet ${emphasis(address)}
- Import another wallet (run ${command('iapp wallet import')})
- Select an imported wallet (run ${command('iapp wallet select')})
- Use another chain (change default chain ${command('iapp chain select <name>')} or use option ${command('--chain <name>')})`)
);
}
if (shouldThrow) {
throw Error(`Balance is insufficient`);
}
return {
wei,
nRLC,
stake,
};
}