Skip to content

Commit 3868d58

Browse files
feat(orc-458): refactor dublicated code
1 parent 655b060 commit 3868d58

File tree

4 files changed

+139
-222
lines changed

4 files changed

+139
-222
lines changed
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import { Command } from 'commander';
2+
import { Contract } from 'ethers';
3+
import { logger } from '@utils';
4+
5+
interface DeadlineCommandConfig {
6+
/** Module name for logs and descriptions (e.g., "NOR", "sDVT") */
7+
moduleName: string;
8+
/** Command name for usage examples (e.g., "nor", "sdvt") */
9+
commandName: string;
10+
}
11+
12+
export const addDeadlineCommands = (command: Command, contract: Contract, config: DeadlineCommandConfig) => {
13+
command
14+
.command('set-deadline')
15+
.description(
16+
`Set exit deadline threshold for validators in ${config.moduleName} module. Note: validators exited before now will no longer be able to report as late again`,
17+
)
18+
.option('--threshold <seconds>', 'Exit deadline threshold in seconds (e.g., 345600 for 4 days)')
19+
.option('--reporting-window <seconds>', 'Late reporting window in seconds (e.g., 86400 for 1 day)', '86400')
20+
.action(async (options) => {
21+
const { threshold, reportingWindow } = options;
22+
23+
if (!threshold) {
24+
logger.error('--threshold parameter is required');
25+
logger.log('');
26+
logger.log('Example usage:');
27+
logger.log(` lido-cli ${config.commandName} set-deadline --threshold 345600 # 4 days`);
28+
logger.log(
29+
` lido-cli ${config.commandName} set-deadline --threshold 345600 --reporting-window 86400 # 4 days threshold, 1 day window`,
30+
);
31+
return;
32+
}
33+
34+
const thresholdSeconds = parseInt(threshold, 10);
35+
const reportingWindowSeconds = parseInt(reportingWindow, 10);
36+
37+
if (isNaN(thresholdSeconds)) {
38+
logger.error('Threshold must be a valid number (seconds)');
39+
return;
40+
}
41+
42+
if (isNaN(reportingWindowSeconds)) {
43+
logger.error('Reporting window must be a valid number (seconds)');
44+
return;
45+
}
46+
47+
if (thresholdSeconds < 0) {
48+
logger.error('Threshold must be a positive number');
49+
return;
50+
}
51+
52+
if (reportingWindowSeconds < 0) {
53+
logger.error('Reporting window must be a positive number');
54+
return;
55+
}
56+
57+
try {
58+
logger.log(`Setting exit deadline threshold in ${config.moduleName} contract...`);
59+
logger.log('Contract address:', contract.target);
60+
logger.log('New threshold:', thresholdSeconds, 'seconds');
61+
logger.log('Reporting window:', reportingWindowSeconds, 'seconds');
62+
63+
const txResult = await contract.setExitDeadlineThreshold(thresholdSeconds, reportingWindowSeconds);
64+
65+
logger.log('Transaction hash:', txResult.hash);
66+
logger.log('Waiting for transaction confirmation...');
67+
68+
const receipt = await txResult.wait();
69+
70+
if (receipt.status === 1) {
71+
logger.log('Exit deadline threshold updated successfully!');
72+
logger.log('Transaction confirmed in block:', receipt.blockNumber);
73+
} else {
74+
logger.error('Transaction failed');
75+
}
76+
} catch (error) {
77+
logger.error('Failed to set exit deadline threshold:', error);
78+
}
79+
});
80+
81+
command
82+
.command('get-deadline')
83+
.description(`Get current exit deadline threshold for a Node Operator in ${config.moduleName} module`)
84+
.option('--node-operator-id <id>', 'Node Operator ID to query')
85+
.action(async (options) => {
86+
const { nodeOperatorId } = options;
87+
88+
if (!nodeOperatorId) {
89+
logger.error('--node-operator-id parameter is required');
90+
logger.log('');
91+
logger.log('Example usage:');
92+
logger.log(` lido-cli ${config.commandName} get-deadline --node-operator-id 15`);
93+
return;
94+
}
95+
96+
const operatorId = parseInt(nodeOperatorId, 10);
97+
98+
if (isNaN(operatorId)) {
99+
logger.error('Node Operator ID must be a valid number');
100+
return;
101+
}
102+
103+
if (operatorId < 0) {
104+
logger.error('Node Operator ID must be a non-negative number');
105+
return;
106+
}
107+
108+
try {
109+
logger.log(`Retrieving exit deadline threshold from ${config.moduleName} contract...`);
110+
logger.log('Contract address:', contract.target);
111+
logger.log('Node Operator ID:', operatorId);
112+
113+
const threshold = await contract.exitDeadlineThreshold(operatorId);
114+
115+
logger.log('');
116+
logger.log(`threshold: ${threshold}`);
117+
} catch (error) {
118+
logger.error('Failed to retrieve exit deadline threshold:', error);
119+
}
120+
});
121+
};

programs/common/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export * from './aragon-app';
33
export * from './base-oracle';
44
export * from './consensus';
55
export * from './curated-module';
6+
export * from './deadline-commands';
67
export * from './logs';
78
export * from './parsing';
89
export * from './pause-until';

programs/nor.ts

Lines changed: 8 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import { program } from '@command';
22
import { norContract } from '@contracts';
3-
import { logger } from '@utils';
4-
import { addAragonAppSubCommands, addCuratedModuleSubCommands, addLogsCommands, addParsingCommands } from './common';
3+
import {
4+
addAragonAppSubCommands,
5+
addCuratedModuleSubCommands,
6+
addDeadlineCommands,
7+
addLogsCommands,
8+
addParsingCommands,
9+
} from './common';
510

611
const nor = program
712
.command('nor')
@@ -11,112 +16,4 @@ addAragonAppSubCommands(nor, norContract);
1116
addParsingCommands(nor, norContract);
1217
addLogsCommands(nor, norContract);
1318
addCuratedModuleSubCommands(nor, norContract);
14-
15-
nor
16-
.command('set-deadline')
17-
.description(
18-
'Set exit deadline threshold for validators in NOR module. Note: validators exited before now will no longer be able to report as late again',
19-
)
20-
.option('--threshold <seconds>', 'Exit deadline threshold in seconds (e.g., 345600 for 4 days)')
21-
.option('--reporting-window <seconds>', 'Late reporting window in seconds (e.g., 86400 for 1 day)', '86400')
22-
.action(async (options) => {
23-
const { threshold, reportingWindow } = options;
24-
25-
if (!threshold) {
26-
logger.error('--threshold parameter is required');
27-
logger.log('');
28-
logger.log('Example usage:');
29-
logger.log(' lido-cli nor set-deadline --threshold 345600 # 4 days');
30-
logger.log(
31-
' lido-cli nor set-deadline --threshold 345600 --reporting-window 86400 # 4 days threshold, 1 day window',
32-
);
33-
return;
34-
}
35-
36-
const thresholdSeconds = parseInt(threshold, 10);
37-
const reportingWindowSeconds = parseInt(reportingWindow, 10);
38-
39-
if (isNaN(thresholdSeconds)) {
40-
logger.error('Threshold must be a valid number (seconds)');
41-
return;
42-
}
43-
44-
if (isNaN(reportingWindowSeconds)) {
45-
logger.error('Reporting window must be a valid number (seconds)');
46-
return;
47-
}
48-
49-
if (thresholdSeconds < 0) {
50-
logger.error('Threshold must be a positive number');
51-
return;
52-
}
53-
54-
if (reportingWindowSeconds < 0) {
55-
logger.error('Reporting window must be a positive number');
56-
return;
57-
}
58-
59-
try {
60-
logger.log('Setting exit deadline threshold in NOR contract...');
61-
logger.log('Contract address:', norContract.target);
62-
logger.log('New threshold:', thresholdSeconds, 'seconds');
63-
logger.log('Reporting window:', reportingWindowSeconds, 'seconds');
64-
65-
const txResult = await norContract.setExitDeadlineThreshold(thresholdSeconds, reportingWindowSeconds);
66-
67-
logger.log('Transaction hash:', txResult.hash);
68-
logger.log('Waiting for transaction confirmation...');
69-
70-
const receipt = await txResult.wait();
71-
72-
if (receipt.status === 1) {
73-
logger.log('Exit deadline threshold updated successfully!');
74-
logger.log('Transaction confirmed in block:', receipt.blockNumber);
75-
} else {
76-
logger.error('Transaction failed');
77-
}
78-
} catch (error) {
79-
logger.error('Failed to set exit deadline threshold:', error);
80-
}
81-
});
82-
83-
nor
84-
.command('get-deadline')
85-
.description('Get current exit deadline threshold for a Node Operator in NOR module')
86-
.option('--node-operator-id <id>', 'Node Operator ID to query')
87-
.action(async (options) => {
88-
const { nodeOperatorId } = options;
89-
90-
if (!nodeOperatorId) {
91-
logger.error('--node-operator-id parameter is required');
92-
logger.log('');
93-
logger.log('Example usage:');
94-
logger.log(' lido-cli nor get-deadline --node-operator-id 15');
95-
return;
96-
}
97-
98-
const operatorId = parseInt(nodeOperatorId, 10);
99-
100-
if (isNaN(operatorId)) {
101-
logger.error('Node Operator ID must be a valid number');
102-
return;
103-
}
104-
105-
if (operatorId < 0) {
106-
logger.error('Node Operator ID must be a non-negative number');
107-
return;
108-
}
109-
110-
try {
111-
logger.log('Retrieving exit deadline threshold from NOR contract...');
112-
logger.log('Contract address:', norContract.target);
113-
logger.log('Node Operator ID:', operatorId);
114-
115-
const threshold = await norContract.exitDeadlineThreshold(operatorId);
116-
117-
logger.log('');
118-
logger.log(`threshold: ${threshold}`);
119-
} catch (error) {
120-
logger.error('Failed to retrieve exit deadline threshold:', error);
121-
}
122-
});
19+
addDeadlineCommands(nor, norContract, { moduleName: 'NOR', commandName: 'nor' });

programs/simple-dvt.ts

Lines changed: 9 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import { program } from '@command';
22
import { simpleDVTContract } from '@contracts';
3-
import { addAragonAppSubCommands, addCuratedModuleSubCommands, addLogsCommands, addParsingCommands } from './common';
4-
import { getLatestBlockRange, logger } from '@utils';
3+
import {
4+
addAragonAppSubCommands,
5+
addCuratedModuleSubCommands,
6+
addDeadlineCommands,
7+
addLogsCommands,
8+
addParsingCommands,
9+
} from './common';
10+
import { getLatestBlockRange } from '@utils';
511
import { check0xSplit, checkGnosisSafe, checkSignatures, checkWrapperContract } from './staking-module';
612

713
const simpleDVT = program
@@ -12,6 +18,7 @@ addAragonAppSubCommands(simpleDVT, simpleDVTContract);
1218
addParsingCommands(simpleDVT, simpleDVTContract);
1319
addLogsCommands(simpleDVT, simpleDVTContract);
1420
addCuratedModuleSubCommands(simpleDVT, simpleDVTContract);
21+
addDeadlineCommands(simpleDVT, simpleDVTContract, { moduleName: 'sDVT', commandName: 'sdvt' });
1522

1623
simpleDVT
1724
.command('check-reward-address')
@@ -56,112 +63,3 @@ simpleDVT
5663

5764
await checkSignatures(clusterName, gnosisOwners);
5865
});
59-
60-
simpleDVT
61-
.command('set-deadline')
62-
.description(
63-
'Set exit deadline threshold for validators in sDVT module. Note: validators exited before now will no longer be able to report as late again',
64-
)
65-
.option('--threshold <seconds>', 'Exit deadline threshold in seconds (e.g., 345600 for 4 days)')
66-
.option('--reporting-window <seconds>', 'Late reporting window in seconds (e.g., 86400 for 1 day)', '86400')
67-
.action(async (options) => {
68-
const { threshold, reportingWindow } = options;
69-
70-
if (!threshold) {
71-
logger.error('--threshold parameter is required');
72-
logger.log('');
73-
logger.log('Example usage:');
74-
logger.log(' lido-cli sdvt set-deadline --threshold 345600 # 4 days');
75-
logger.log(
76-
' lido-cli sdvt set-deadline --threshold 345600 --reporting-window 86400 # 4 days threshold, 1 day window',
77-
);
78-
return;
79-
}
80-
81-
const thresholdSeconds = parseInt(threshold, 10);
82-
const reportingWindowSeconds = parseInt(reportingWindow, 10);
83-
84-
if (isNaN(thresholdSeconds)) {
85-
logger.error('Threshold must be a valid number (seconds)');
86-
return;
87-
}
88-
89-
if (isNaN(reportingWindowSeconds)) {
90-
logger.error('Reporting window must be a valid number (seconds)');
91-
return;
92-
}
93-
94-
if (thresholdSeconds < 0) {
95-
logger.error('Threshold must be a positive number');
96-
return;
97-
}
98-
99-
if (reportingWindowSeconds < 0) {
100-
logger.error('Reporting window must be a positive number');
101-
return;
102-
}
103-
104-
try {
105-
logger.log('Setting exit deadline threshold in sDVT contract...');
106-
logger.log('Contract address:', simpleDVTContract.target);
107-
logger.log('New threshold:', thresholdSeconds, 'seconds');
108-
logger.log('Reporting window:', reportingWindowSeconds, 'seconds');
109-
110-
const txResult = await simpleDVTContract.setExitDeadlineThreshold(thresholdSeconds, reportingWindowSeconds);
111-
112-
logger.log('Transaction hash:', txResult.hash);
113-
logger.log('Waiting for transaction confirmation...');
114-
115-
const receipt = await txResult.wait();
116-
117-
if (receipt.status === 1) {
118-
logger.log('Exit deadline threshold updated successfully!');
119-
logger.log('Transaction confirmed in block:', receipt.blockNumber);
120-
} else {
121-
logger.error('Transaction failed');
122-
}
123-
} catch (error) {
124-
logger.error('Failed to set exit deadline threshold:', error);
125-
}
126-
});
127-
128-
simpleDVT
129-
.command('get-deadline')
130-
.description('Get current exit deadline threshold for a Node Operator in sDVT module')
131-
.option('--node-operator-id <id>', 'Node Operator ID to query')
132-
.action(async (options) => {
133-
const { nodeOperatorId } = options;
134-
135-
if (!nodeOperatorId) {
136-
logger.error('--node-operator-id parameter is required');
137-
logger.log('');
138-
logger.log('Example usage:');
139-
logger.log(' lido-cli sdvt get-deadline --node-operator-id 15');
140-
return;
141-
}
142-
143-
const operatorId = parseInt(nodeOperatorId, 10);
144-
145-
if (isNaN(operatorId)) {
146-
logger.error('Node Operator ID must be a valid number');
147-
return;
148-
}
149-
150-
if (operatorId < 0) {
151-
logger.error('Node Operator ID must be a non-negative number');
152-
return;
153-
}
154-
155-
try {
156-
logger.log('Retrieving exit deadline threshold from sDVT contract...');
157-
logger.log('Contract address:', simpleDVTContract.target);
158-
logger.log('Node Operator ID:', operatorId);
159-
160-
const threshold = await simpleDVTContract.exitDeadlineThreshold(operatorId);
161-
162-
logger.log('');
163-
logger.log(`threshold: ${threshold}`);
164-
} catch (error) {
165-
logger.error('Failed to retrieve exit deadline threshold:', error);
166-
}
167-
});

0 commit comments

Comments
 (0)