diff --git a/programs/accounting-consensus.ts b/programs/accounting-consensus.ts index 701c372..0977c5c 100644 --- a/programs/accounting-consensus.ts +++ b/programs/accounting-consensus.ts @@ -4,6 +4,7 @@ import { addAccessControlSubCommands, addConsensusCommands, addLogsCommands, add const oracle = program .command('accounting-consensus') + .aliases(['ao-consensus']) .description('interact with hash consensus contract for accounting oracle'); addAccessControlSubCommands(oracle, consensusForAccountingContract); addParsingCommands(oracle, consensusForAccountingContract); diff --git a/programs/accounting-oracle.ts b/programs/accounting-oracle.ts index 196d29c..f9f88c6 100644 --- a/programs/accounting-oracle.ts +++ b/programs/accounting-oracle.ts @@ -9,7 +9,10 @@ import { } from './common'; import { logger } from '@utils'; -const oracle = program.command('accounting-oracle').description('interact with accounting oracle contract'); +const oracle = program + .command('accounting-oracle') + .aliases(['ao']) + .description('interact with accounting oracle contract'); addAccessControlSubCommands(oracle, accountingOracleContract); addBaseOracleCommands(oracle, accountingOracleContract); addOssifiableProxyCommands(oracle, accountingOracleContract); diff --git a/programs/common/consensus.ts b/programs/common/consensus.ts index ba67838..8a42f59 100644 --- a/programs/common/consensus.ts +++ b/programs/common/consensus.ts @@ -1,6 +1,8 @@ import { authorizedCall, getLatestBlock, getProvider, logger } from '@utils'; +import chalk from 'chalk'; import { Command } from 'commander'; import { Contract, EventLog, formatEther } from 'ethers'; +import prompts from 'prompts'; export const addConsensusCommands = (command: Command, contract: Contract) => { command @@ -60,6 +62,20 @@ export const addConsensusCommands = (command: Command, contract: Contract) => { .option('-q, --quorum ', 'quorum') .action(async (options) => { const { address, quorum } = options; + const { confirm } = await prompts({ + type: 'confirm', + name: 'confirm', + message: chalk.red( + 'This change will affect the operation of Ejector. Are all operators ready for this change?', + ), + initial: false, + }); + + if (!confirm) { + logger.error('Aborted'); + return; + } + await authorizedCall(contract, 'addMember', [address, quorum]); }); @@ -70,6 +86,20 @@ export const addConsensusCommands = (command: Command, contract: Contract) => { .option('-q, --quorum ', 'quorum') .action(async (options) => { const { address, quorum } = options; + const { confirm } = await prompts({ + type: 'confirm', + name: 'confirm', + message: chalk.red( + 'This change will affect the operation of Ejector. Are all operators ready for this change?', + ), + initial: false, + }); + + if (!confirm) { + logger.error('Aborted'); + return; + } + await authorizedCall(contract, 'removeMember', [address, quorum]); }); diff --git a/programs/common/curated-module.ts b/programs/common/curated-module.ts index afbb493..65dc183 100644 --- a/programs/common/curated-module.ts +++ b/programs/common/curated-module.ts @@ -10,7 +10,34 @@ export const addCuratedModuleSubCommands = (command: Command, contract: Contract .description('returns operators count') .action(async () => { const total = await contract.getNodeOperatorsCount(); - logger.log('Total', total); + logger.log('Total', Number(total)); + }); + + command + .command('operator-list') + .description('returns list of operators') + .action(async () => { + const total = await contract.getNodeOperatorsCount(); + const operatorIds = new Array(Number(total)).fill(0).map((_, index) => index); + + const result = await Promise.all( + operatorIds.map(async (operatorId) => { + const operator = await contract.getNodeOperator(operatorId, true); + const parsed = operator.toObject(); + + return { + active: parsed.active, + name: parsed.name, + rewardAddress: parsed.rewardAddress, + vetted: parsed.totalVettedValidators, + exited: parsed.totalExitedValidators, + deposited: parsed.totalDepositedValidators, + total: parsed.totalAddedValidators, + }; + }), + ); + + logger.table(result); }); command @@ -211,9 +238,10 @@ export const addCuratedModuleSubCommands = (command: Command, contract: Contract ); const filteredResult = result.filter((v) => v); + const sortedResult = filteredResult.sort((a, b) => Number(a?.operatorId) - Number(b?.operatorId)); - if (filteredResult.length) { - logger.table(filteredResult); + if (sortedResult.length) { + logger.table(sortedResult); } else { logger.log('No manager addresses'); } diff --git a/programs/exit-bus-consensus.ts b/programs/exit-bus-consensus.ts index 38b2d8e..3e9bcd0 100644 --- a/programs/exit-bus-consensus.ts +++ b/programs/exit-bus-consensus.ts @@ -4,6 +4,7 @@ import { addAccessControlSubCommands, addConsensusCommands, addLogsCommands, add const oracle = program .command('exit-bus-consensus') + .aliases(['vebo-consensus']) .description('interact with hash consensus contract for validator exit bus oracle'); addAccessControlSubCommands(oracle, consensusForExitBusContract); addParsingCommands(oracle, consensusForExitBusContract); diff --git a/programs/exit-bus-oracle.ts b/programs/exit-bus-oracle.ts index 96639d9..ebd9416 100644 --- a/programs/exit-bus-oracle.ts +++ b/programs/exit-bus-oracle.ts @@ -32,7 +32,10 @@ export type LidoValidator = { signingKey: KAPIKey; }; -const oracle = program.command('exit-bus-oracle').description('interact with validator exit bus oracle contract'); +const oracle = program + .command('exit-bus-oracle') + .aliases(['vebo']) + .description('interact with validator exit bus oracle contract'); addAccessControlSubCommands(oracle, exitBusOracleContract); addBaseOracleCommands(oracle, exitBusOracleContract); addOssifiableProxyCommands(oracle, exitBusOracleContract); diff --git a/programs/lido.ts b/programs/lido.ts index b3d5bc0..69a5297 100644 --- a/programs/lido.ts +++ b/programs/lido.ts @@ -6,7 +6,7 @@ import { resumeLidoAndSetStakingLimit, votingForward } from '@scripts'; import { addAragonAppSubCommands, addLogsCommands, addParsingCommands } from './common'; import { addERC20Commands } from './common/erc20'; -const lido = program.command('lido').description('interact with lido contract'); +const lido = program.command('lido').aliases(['steth']).description('interact with lido contract'); addAragonAppSubCommands(lido, lidoContract); addParsingCommands(lido, lidoContract); addLogsCommands(lido, lidoContract); diff --git a/programs/nor.ts b/programs/nor.ts index 24db3dd..e7abc2e 100644 --- a/programs/nor.ts +++ b/programs/nor.ts @@ -2,7 +2,10 @@ import { program } from '@command'; import { norContract } from '@contracts'; import { addAragonAppSubCommands, addCuratedModuleSubCommands, addLogsCommands, addParsingCommands } from './common'; -const nor = program.command('nor').description('interact with node operator registry contract'); +const nor = program + .command('nor') + .aliases(['curated', 'curated-module']) + .description('interact with node operator registry contract'); addAragonAppSubCommands(nor, norContract); addParsingCommands(nor, norContract); addLogsCommands(nor, norContract); diff --git a/programs/sandbox.ts b/programs/sandbox.ts index 72bf241..6de88a1 100644 --- a/programs/sandbox.ts +++ b/programs/sandbox.ts @@ -2,7 +2,10 @@ import { program } from '@command'; import { sandboxContract } from '@contracts'; import { addAragonAppSubCommands, addCuratedModuleSubCommands, addLogsCommands, addParsingCommands } from './common'; -const sandbox = program.command('sandbox').description('interact with simple dvt module contract'); +const sandbox = program + .command('sandbox') + .aliases(['sandbox-module']) + .description('interact with simple dvt module contract'); addAragonAppSubCommands(sandbox, sandboxContract); addParsingCommands(sandbox, sandboxContract); addLogsCommands(sandbox, sandboxContract); diff --git a/programs/simple-dvt.ts b/programs/simple-dvt.ts index 1d8938e..09e9c6a 100644 --- a/programs/simple-dvt.ts +++ b/programs/simple-dvt.ts @@ -5,7 +5,10 @@ import { provider } from '@providers'; import { Contract } from 'ethers'; import { logger } from '@utils'; -const simpleDVT = program.command('simple-dvt').description('interact with simple dvt module contract'); +const simpleDVT = program + .command('simple-dvt') + .aliases(['sdvt', 'sdvt-module']) + .description('interact with simple dvt module contract'); addAragonAppSubCommands(simpleDVT, simpleDVTContract); addParsingCommands(simpleDVT, simpleDVTContract); addLogsCommands(simpleDVT, simpleDVTContract); diff --git a/programs/staking-router.ts b/programs/staking-router.ts index fae246f..48af8be 100644 --- a/programs/staking-router.ts +++ b/programs/staking-router.ts @@ -5,7 +5,10 @@ import { Result, parseEther } from 'ethers'; import { addAccessControlSubCommands, addLogsCommands, addOssifiableProxyCommands, addParsingCommands } from './common'; import { getNodeOperators, getStakingModules } from './staking-module'; -const router = program.command('staking-router').description('interact with staking router contract'); +const router = program + .command('staking-router') + .aliases(['sr', 'router']) + .description('interact with staking router contract'); addAccessControlSubCommands(router, stakingRouterContract); addOssifiableProxyCommands(router, stakingRouterContract); addParsingCommands(router, stakingRouterContract); @@ -91,6 +94,22 @@ router logger.log('Module paused', isPaused); }); +router + .command('pause-module') + .description('pause deposits for staking module') + .argument('', 'module id') + .action(async (moduleId) => { + await authorizedCall(stakingRouterContract, 'pauseStakingModule', [moduleId]); + }); + +router + .command('resume-module') + .description('resume deposits for staking module') + .argument('', 'module id') + .action(async (moduleId) => { + await authorizedCall(stakingRouterContract, 'resumeStakingModule', [moduleId]); + }); + router .command('last-deposit-block') .description('returns last deposit block for module') diff --git a/programs/withdrawal-request.ts b/programs/withdrawal-request.ts index 1c7b009..fcea830 100644 --- a/programs/withdrawal-request.ts +++ b/programs/withdrawal-request.ts @@ -11,7 +11,10 @@ import { } from './common'; import { contractCallTxWithConfirm, logger } from '@utils'; -const withdrawal = program.command('withdrawal-request').description('interact with withdrawal request contract'); +const withdrawal = program + .command('withdrawal-request') + .aliases(['wq', 'withdrawal-queue']) + .description('interact with withdrawal request contract'); addAccessControlSubCommands(withdrawal, withdrawalRequestContract); addOssifiableProxyCommands(withdrawal, withdrawalRequestContract); addParsingCommands(withdrawal, withdrawalRequestContract);