@degengineering/web3pgp-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +151 -0
- package/dist/commands/blockchain/addSubkey.d.ts +9 -0
- package/dist/commands/blockchain/addSubkey.d.ts.map +1 -0
- package/dist/commands/blockchain/addSubkey.js +49 -0
- package/dist/commands/blockchain/addSubkey.js.map +1 -0
- package/dist/commands/blockchain/certify.d.ts +13 -0
- package/dist/commands/blockchain/certify.d.ts.map +1 -0
- package/dist/commands/blockchain/certify.js +75 -0
- package/dist/commands/blockchain/certify.js.map +1 -0
- package/dist/commands/blockchain/challenge.d.ts +13 -0
- package/dist/commands/blockchain/challenge.d.ts.map +1 -0
- package/dist/commands/blockchain/challenge.js +58 -0
- package/dist/commands/blockchain/challenge.js.map +1 -0
- package/dist/commands/blockchain/generateKey.d.ts +7 -0
- package/dist/commands/blockchain/generateKey.d.ts.map +1 -0
- package/dist/commands/blockchain/generateKey.js +36 -0
- package/dist/commands/blockchain/generateKey.js.map +1 -0
- package/dist/commands/blockchain/getPublicKey.d.ts +9 -0
- package/dist/commands/blockchain/getPublicKey.d.ts.map +1 -0
- package/dist/commands/blockchain/getPublicKey.js +37 -0
- package/dist/commands/blockchain/getPublicKey.js.map +1 -0
- package/dist/commands/blockchain/index.d.ts +12 -0
- package/dist/commands/blockchain/index.d.ts.map +1 -0
- package/dist/commands/blockchain/index.js +33 -0
- package/dist/commands/blockchain/index.js.map +1 -0
- package/dist/commands/blockchain/keccak256.d.ts +7 -0
- package/dist/commands/blockchain/keccak256.d.ts.map +1 -0
- package/dist/commands/blockchain/keccak256.js +38 -0
- package/dist/commands/blockchain/keccak256.js.map +1 -0
- package/dist/commands/blockchain/listen.d.ts +9 -0
- package/dist/commands/blockchain/listen.d.ts.map +1 -0
- package/dist/commands/blockchain/listen.js +30 -0
- package/dist/commands/blockchain/listen.js.map +1 -0
- package/dist/commands/blockchain/prove.d.ts +13 -0
- package/dist/commands/blockchain/prove.d.ts.map +1 -0
- package/dist/commands/blockchain/prove.js +123 -0
- package/dist/commands/blockchain/prove.js.map +1 -0
- package/dist/commands/blockchain/register.d.ts +13 -0
- package/dist/commands/blockchain/register.d.ts.map +1 -0
- package/dist/commands/blockchain/register.js +65 -0
- package/dist/commands/blockchain/register.js.map +1 -0
- package/dist/commands/blockchain/revoke-certification.d.ts +13 -0
- package/dist/commands/blockchain/revoke-certification.d.ts.map +1 -0
- package/dist/commands/blockchain/revoke-certification.js +75 -0
- package/dist/commands/blockchain/revoke-certification.js.map +1 -0
- package/dist/commands/blockchain/revoke.d.ts +19 -0
- package/dist/commands/blockchain/revoke.d.ts.map +1 -0
- package/dist/commands/blockchain/revoke.js +118 -0
- package/dist/commands/blockchain/revoke.js.map +1 -0
- package/dist/commands/blockchain/sync.d.ts +20 -0
- package/dist/commands/blockchain/sync.d.ts.map +1 -0
- package/dist/commands/blockchain/sync.js +246 -0
- package/dist/commands/blockchain/sync.js.map +1 -0
- package/dist/commands/blockchain/update.d.ts +13 -0
- package/dist/commands/blockchain/update.d.ts.map +1 -0
- package/dist/commands/blockchain/update.js +60 -0
- package/dist/commands/blockchain/update.js.map +1 -0
- package/dist/commands/configuration/display.d.ts +10 -0
- package/dist/commands/configuration/display.d.ts.map +1 -0
- package/dist/commands/configuration/display.js +58 -0
- package/dist/commands/configuration/display.js.map +1 -0
- package/dist/commands/configuration/generate.d.ts +14 -0
- package/dist/commands/configuration/generate.d.ts.map +1 -0
- package/dist/commands/configuration/generate.js +222 -0
- package/dist/commands/configuration/generate.js.map +1 -0
- package/dist/commands/configuration/index.d.ts +6 -0
- package/dist/commands/configuration/index.d.ts.map +1 -0
- package/dist/commands/configuration/index.js +21 -0
- package/dist/commands/configuration/index.js.map +1 -0
- package/dist/commands/configuration/validate.d.ts +10 -0
- package/dist/commands/configuration/validate.d.ts.map +1 -0
- package/dist/commands/configuration/validate.js +45 -0
- package/dist/commands/configuration/validate.js.map +1 -0
- package/dist/commands/factory.d.ts +33 -0
- package/dist/commands/factory.d.ts.map +1 -0
- package/dist/commands/factory.js +48 -0
- package/dist/commands/factory.js.map +1 -0
- package/dist/config/defaults.d.ts +8 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +11 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/loader.d.ts +12 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +205 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/testnet.d.ts +6 -0
- package/dist/config/testnet.d.ts.map +1 -0
- package/dist/config/testnet.js +26 -0
- package/dist/config/testnet.js.map +1 -0
- package/dist/config/transport.d.ts +17 -0
- package/dist/config/transport.d.ts.map +1 -0
- package/dist/config/transport.js +46 -0
- package/dist/config/transport.js.map +1 -0
- package/dist/config/types.d.ts +92 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +12 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validator.d.ts +14 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +156 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +28 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/services/web3pgpServiceFactory.d.ts +14 -0
- package/dist/services/web3pgpServiceFactory.d.ts.map +1 -0
- package/dist/services/web3pgpServiceFactory.js +228 -0
- package/dist/services/web3pgpServiceFactory.js.map +1 -0
- package/dist/setup.d.ts +14 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +46 -0
- package/dist/setup.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/clients.d.ts +49373 -0
- package/dist/utils/clients.d.ts.map +1 -0
- package/dist/utils/clients.js +129 -0
- package/dist/utils/clients.js.map +1 -0
- package/dist/utils/input.d.ts +24 -0
- package/dist/utils/input.d.ts.map +1 -0
- package/dist/utils/input.js +138 -0
- package/dist/utils/input.js.map +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +35 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createSyncCommand = createSyncCommand;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const dexes_1 = require("@degengineering/dexes");
|
|
6
|
+
const factory_1 = require("../factory");
|
|
7
|
+
/**
|
|
8
|
+
* Creates a command for listening to Web3PGP blockchain events and relay valid OpenPGP messages.
|
|
9
|
+
*
|
|
10
|
+
* This command synchronizes key-related events (registrations, subkey additions, revocations)
|
|
11
|
+
* from the blockchain and outputs valid OpenPGP messages in armored format to stdout.
|
|
12
|
+
*
|
|
13
|
+
* The listener supports graceful shutdown via SIGINT (Ctrl+C) and SIGTERM signals.
|
|
14
|
+
*
|
|
15
|
+
* @param deps Command dependencies (logger, service)
|
|
16
|
+
* @returns Configured Commander command
|
|
17
|
+
*/
|
|
18
|
+
function createSyncCommand(deps) {
|
|
19
|
+
const { logger, service } = deps;
|
|
20
|
+
const cmdLogger = logger.child({ command: 'sync' });
|
|
21
|
+
return new commander_1.Command('sync')
|
|
22
|
+
.description('Listen for Web3PGP events related to public keys (registrations, added subkeys, revocations) and output valid OpenPGP messages in armored format to stdout')
|
|
23
|
+
.option('--from <block>', 'Optional starting block - starts from latest block if not specified')
|
|
24
|
+
.option('--to <block>', 'Optional ending block - listens indefinitely if not specified')
|
|
25
|
+
.option('--interval <seconds>', 'Polling interval in seconds when listening for new events (default: 15)', '15')
|
|
26
|
+
.option('--max-range <blocks>', 'Maximum number of blocks to process in one batch when syncing historical events (default: 10000)', '10000')
|
|
27
|
+
.action(async (options) => {
|
|
28
|
+
// Track whether a graceful shutdown has been requested
|
|
29
|
+
let shouldExit = false;
|
|
30
|
+
/**
|
|
31
|
+
* Signal handler for graceful shutdown.
|
|
32
|
+
* Allows the current event processing batch to complete before exiting.
|
|
33
|
+
*/
|
|
34
|
+
const handleShutdown = (signal) => {
|
|
35
|
+
if (shouldExit) {
|
|
36
|
+
// Force exit if already shutting down
|
|
37
|
+
cmdLogger.warn(`Received ${signal} again - forcing exit`);
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
cmdLogger.info(`Received ${signal} - initiating graceful shutdown`);
|
|
41
|
+
shouldExit = true;
|
|
42
|
+
};
|
|
43
|
+
// Register signal handlers
|
|
44
|
+
process.on('SIGINT', () => handleShutdown('SIGINT'));
|
|
45
|
+
process.on('SIGTERM', () => handleShutdown('SIGTERM'));
|
|
46
|
+
try {
|
|
47
|
+
// Validate inputs - From
|
|
48
|
+
let fromBlock;
|
|
49
|
+
let toBlock;
|
|
50
|
+
if (options.from) {
|
|
51
|
+
fromBlock = BigInt(options.from);
|
|
52
|
+
cmdLogger.debug({ fromBlock }, `Starting synchronization from block ${fromBlock}`);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
fromBlock = await service.getBlockNumber();
|
|
56
|
+
cmdLogger.debug({ fromBlock }, `Starting synchronization from latest block ${fromBlock}`);
|
|
57
|
+
}
|
|
58
|
+
// Validate inputs - To
|
|
59
|
+
if (options.to) {
|
|
60
|
+
toBlock = BigInt(options.to);
|
|
61
|
+
if (toBlock < fromBlock) {
|
|
62
|
+
throw new Error(`Ending block (${toBlock}) cannot be less than starting block (${fromBlock})`);
|
|
63
|
+
}
|
|
64
|
+
cmdLogger.debug({ toBlock }, `Ending synchronization at block ${toBlock}`);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
cmdLogger.debug('Listening indefinitely for new events');
|
|
68
|
+
}
|
|
69
|
+
// Validate inputs - Interval
|
|
70
|
+
const intervalSeconds = options.interval ? parseInt(options.interval, 10) : 15;
|
|
71
|
+
if (isNaN(intervalSeconds) || intervalSeconds <= 0) {
|
|
72
|
+
throw new Error('Polling interval (--interval) must be a positive integer representing seconds');
|
|
73
|
+
}
|
|
74
|
+
cmdLogger.debug({ intervalSeconds }, `Using polling interval of ${intervalSeconds} seconds`);
|
|
75
|
+
// Validate inputs - Max Range
|
|
76
|
+
const maxRange = options['max-range'] ? BigInt(options['max-range']) : 10000n;
|
|
77
|
+
if (maxRange <= 0n) {
|
|
78
|
+
throw new Error('Maximum range (--max-range) must be a positive integer representing number of blocks');
|
|
79
|
+
}
|
|
80
|
+
cmdLogger.debug({ maxRange }, `Using maximum block range of ${maxRange} for event syncing`);
|
|
81
|
+
// Event listening loop
|
|
82
|
+
while (!shouldExit && (toBlock === undefined || fromBlock <= toBlock)) {
|
|
83
|
+
// Get latest block number and determine the next target given the range to process
|
|
84
|
+
let target = await service.getBlockNumber();
|
|
85
|
+
if (toBlock !== undefined) {
|
|
86
|
+
// Ensure we do not exceed the specified toBlock
|
|
87
|
+
target = target > toBlock ? toBlock : target;
|
|
88
|
+
}
|
|
89
|
+
target = fromBlock + maxRange - 1n < target ? fromBlock + maxRange - 1n : target;
|
|
90
|
+
if (target < fromBlock) {
|
|
91
|
+
// No new blocks to process - wait before next check
|
|
92
|
+
cmdLogger.info('No new blocks to process - waiting before next check');
|
|
93
|
+
await sleep(intervalSeconds * 1000);
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
// Fetch the events
|
|
97
|
+
cmdLogger.info({ fromBlock, toBlock: target }, `Fetching events from blockchain from block ${fromBlock} to ${target}`);
|
|
98
|
+
const logs = await service.searchKeyEvents(undefined, fromBlock, target);
|
|
99
|
+
// Process and output events
|
|
100
|
+
await processKeyEvents(logs, service, cmdLogger);
|
|
101
|
+
// Update fromBlock for next iteration
|
|
102
|
+
fromBlock = target + 1n;
|
|
103
|
+
// Check for shutdown signal before waiting
|
|
104
|
+
if (shouldExit || (toBlock !== undefined && fromBlock > toBlock)) {
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Exit gracefully
|
|
109
|
+
cmdLogger.info('Event synchronization completed - exiting gracefully');
|
|
110
|
+
process.exit(0);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
114
|
+
cmdLogger.error({ error: msg }, 'Failed to synchronize with blockchain events');
|
|
115
|
+
(0, factory_1.exitWithError)(msg);
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
// Clean up signal handlers
|
|
119
|
+
process.removeAllListeners('SIGINT');
|
|
120
|
+
process.removeAllListeners('SIGTERM');
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Process key events and output armored OpenPGP messages to stdout.
|
|
126
|
+
*
|
|
127
|
+
* @param logs Array of key-related event logs
|
|
128
|
+
* @param service Web3PGP service for extracting key data
|
|
129
|
+
* @param logger Logger instance
|
|
130
|
+
* @throws Will not throw; validation errors are logged and skipped
|
|
131
|
+
*/
|
|
132
|
+
async function processKeyEvents(logs, service, logger) {
|
|
133
|
+
for (const log of logs) {
|
|
134
|
+
try {
|
|
135
|
+
switch (log.type) {
|
|
136
|
+
case dexes_1.Web3PGPEvents.KeyRegistered: {
|
|
137
|
+
logger.info({
|
|
138
|
+
block: log.blockNumber,
|
|
139
|
+
tx: log.transactionHash,
|
|
140
|
+
primaryKeyFingerprint: log.primaryKeyFingerprint,
|
|
141
|
+
}, 'Processing KeyRegistered event');
|
|
142
|
+
const pk = await service.extractFromKeyRegisteredLog(log);
|
|
143
|
+
console.log(await pk.armor());
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
case dexes_1.Web3PGPEvents.SubkeyAdded: {
|
|
147
|
+
logger.info({
|
|
148
|
+
block: log.blockNumber,
|
|
149
|
+
tx: log.transactionHash,
|
|
150
|
+
primaryKeyFingerprint: log.primaryKeyFingerprint,
|
|
151
|
+
subkeyFingerprint: log.subkeyFingerprint,
|
|
152
|
+
}, 'Processing SubkeyAdded event');
|
|
153
|
+
const subPk = await service.extractFromSubkeyAddedLog(log);
|
|
154
|
+
console.log(await subPk.armor());
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
case dexes_1.Web3PGPEvents.KeyRevoked: {
|
|
158
|
+
logger.info({
|
|
159
|
+
block: log.blockNumber,
|
|
160
|
+
tx: log.transactionHash,
|
|
161
|
+
fingerprint: log.fingerprint,
|
|
162
|
+
}, 'Processing KeyRevoked event');
|
|
163
|
+
const [revoked, cert] = await service.extractFromKeyRevokedLog(log);
|
|
164
|
+
if (revoked) {
|
|
165
|
+
console.log(await revoked.armor());
|
|
166
|
+
}
|
|
167
|
+
else if (cert) {
|
|
168
|
+
console.log(cert);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
logger.warn({ log }, 'No revocation information found in KeyRevoked event - skipping');
|
|
172
|
+
}
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
case dexes_1.Web3PGPEvents.KeyUpdated: {
|
|
176
|
+
logger.info({
|
|
177
|
+
block: log.blockNumber,
|
|
178
|
+
tx: log.transactionHash,
|
|
179
|
+
fingerprint: log.fingerprint,
|
|
180
|
+
}, 'Processing KeyUpdated event');
|
|
181
|
+
const updatedPk = await service.extractFromKeyUpdatedLog(log);
|
|
182
|
+
console.log(await updatedPk.armor());
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
case dexes_1.Web3PGPEvents.KeyCertified: {
|
|
186
|
+
logger.info({
|
|
187
|
+
block: log.blockNumber,
|
|
188
|
+
tx: log.transactionHash,
|
|
189
|
+
issuerFingerprint: log.issuerFingerprint,
|
|
190
|
+
subjectFingerprint: log.fingerprint,
|
|
191
|
+
}, 'Processing KeyCertified event');
|
|
192
|
+
const certifiedPk = await service.extractFromKeyCertifiedLog(log);
|
|
193
|
+
console.log(await certifiedPk.armor());
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
case dexes_1.Web3PGPEvents.KeyCertificationRevoked: {
|
|
197
|
+
logger.info({
|
|
198
|
+
block: log.blockNumber,
|
|
199
|
+
tx: log.transactionHash,
|
|
200
|
+
issuerFingerprint: log.issuerFingerprint,
|
|
201
|
+
subjectFingerprint: log.fingerprint,
|
|
202
|
+
}, 'Processing KeyCertificationRevoked event');
|
|
203
|
+
const decertifiedPk = await service.extractFromKeyCertificationRevokedLog(log);
|
|
204
|
+
console.log(await decertifiedPk.armor());
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
case dexes_1.Web3PGPEvents.OwnershipChallenged:
|
|
208
|
+
logger.info({
|
|
209
|
+
block: log.blockNumber,
|
|
210
|
+
tx: log.transactionHash,
|
|
211
|
+
fingerprint: log.fingerprint,
|
|
212
|
+
}, 'Received OwnershipChallenged event - no OpenPGP message to output');
|
|
213
|
+
break;
|
|
214
|
+
case dexes_1.Web3PGPEvents.OwnershipProved:
|
|
215
|
+
logger.info({
|
|
216
|
+
block: log.blockNumber,
|
|
217
|
+
tx: log.transactionHash,
|
|
218
|
+
fingerprint: log.fingerprint,
|
|
219
|
+
}, 'Received OwnershipProved event - no OpenPGP message to output');
|
|
220
|
+
break;
|
|
221
|
+
default:
|
|
222
|
+
logger.warn({ log }, 'Unknown event type - skipping');
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
if (error instanceof dexes_1.Web3PGPServiceValidationError) {
|
|
227
|
+
// Warn if validation error - skip the log
|
|
228
|
+
logger.warn({ log, error: error.message }, 'The key event is not valid - skipping');
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
// Critical error - rethrow to stop processing
|
|
232
|
+
throw error;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Sleep utility function.
|
|
239
|
+
*
|
|
240
|
+
* @param ms Milliseconds to sleep
|
|
241
|
+
* @returns Promise that resolves after the specified duration
|
|
242
|
+
*/
|
|
243
|
+
function sleep(ms) {
|
|
244
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/commands/blockchain/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { Logger } from 'pino';
|
|
3
|
+
import { IWeb3PGPService } from '@degengineering/dexes';
|
|
4
|
+
export interface UpdateDeps {
|
|
5
|
+
logger: Logger;
|
|
6
|
+
service: IWeb3PGPService;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Update a public key on the blockchain
|
|
10
|
+
* Usage: web3pgp update --key <path> | read from stdin
|
|
11
|
+
*/
|
|
12
|
+
export declare function createUpdateCommand(deps: UpdateDeps): Command;
|
|
13
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/blockchain/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAKxD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CA0D7D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createUpdateCommand = createUpdateCommand;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const factory_1 = require("../factory");
|
|
6
|
+
const input_1 = require("../../utils/input");
|
|
7
|
+
/**
|
|
8
|
+
* Update a public key on the blockchain
|
|
9
|
+
* Usage: web3pgp update --key <path> | read from stdin
|
|
10
|
+
*/
|
|
11
|
+
function createUpdateCommand(deps) {
|
|
12
|
+
const { logger, service } = deps;
|
|
13
|
+
const cmdLogger = logger.child({ command: 'update' });
|
|
14
|
+
return new commander_1.Command('update')
|
|
15
|
+
.description('Update a public key on the blockchain')
|
|
16
|
+
.option('--key <path>', 'Path to PGP public key file (armored or binary)')
|
|
17
|
+
.action(async (options) => {
|
|
18
|
+
try {
|
|
19
|
+
let keyData;
|
|
20
|
+
// Determine source and read input
|
|
21
|
+
if (options.key) {
|
|
22
|
+
cmdLogger.info({ path: options.key }, 'Reading PGP key from file');
|
|
23
|
+
keyData = (0, input_1.readInputFromFile)(options.key);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
cmdLogger.info('Reading PGP key from stdin');
|
|
27
|
+
keyData = await (0, input_1.readInputFromStdin)();
|
|
28
|
+
}
|
|
29
|
+
cmdLogger.debug({ dataLength: keyData.length }, 'Key data received');
|
|
30
|
+
// Parse key - tries armor format first, then binary
|
|
31
|
+
cmdLogger.info('Parsing and validating PGP key');
|
|
32
|
+
const publicKey = (await (0, input_1.readKeyData)(keyData));
|
|
33
|
+
cmdLogger.debug({ fingerprint: publicKey.getFingerprint() }, 'Key parsed successfully');
|
|
34
|
+
const result = await service.update(publicKey);
|
|
35
|
+
cmdLogger.info({
|
|
36
|
+
fingerprint: publicKey.getFingerprint(),
|
|
37
|
+
transactionHash: result.transactionHash,
|
|
38
|
+
blockNumber: result.blockNumber,
|
|
39
|
+
}, 'Key update successful');
|
|
40
|
+
// Output result as JSON
|
|
41
|
+
(0, factory_1.outputJson)({
|
|
42
|
+
success: true,
|
|
43
|
+
message: 'Public key updated successfully',
|
|
44
|
+
fingerprint: publicKey.getFingerprint(),
|
|
45
|
+
users: publicKey.users.map((user) => user.userID?.toString() || ''),
|
|
46
|
+
transaction: {
|
|
47
|
+
hash: result.transactionHash,
|
|
48
|
+
blockNumber: result.blockNumber.toString(),
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
process.exit(0);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
55
|
+
cmdLogger.error({ error: msg }, 'Failed to update key');
|
|
56
|
+
(0, factory_1.exitWithError)(msg);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/blockchain/update.ts"],"names":[],"mappings":";;AAgBA,kDA0DC;AA1ED,yCAAoC;AAIpC,wCAAuD;AACvD,6CAAuF;AAOvF;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,IAAgB;IAClD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEtD,OAAO,IAAI,mBAAO,CAAC,QAAQ,CAAC;SACzB,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,cAAc,EAAE,iDAAiD,CAAC;SACzE,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;QAC1C,IAAI,CAAC;YACH,IAAI,OAAwB,CAAC;YAE7B,kCAAkC;YAClC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,2BAA2B,CAAC,CAAC;gBACnE,OAAO,GAAG,IAAA,yBAAiB,EAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBAC7C,OAAO,GAAG,MAAM,IAAA,0BAAkB,GAAE,CAAC;YACvC,CAAC;YAED,SAAS,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC;YAErE,oDAAoD;YACpD,SAAS,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YACjD,MAAM,SAAS,GAAG,CAAC,MAAM,IAAA,mBAAW,EAAC,OAAO,CAAC,CAAsB,CAAC;YAEpE,SAAS,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,cAAc,EAAE,EAAE,EAAE,yBAAyB,CAAC,CAAC;YAExF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAE/C,SAAS,CAAC,IAAI,CACZ;gBACE,WAAW,EAAE,SAAS,CAAC,cAAc,EAAE;gBACvC,eAAe,EAAE,MAAM,CAAC,eAAe;gBACvC,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC,EACD,uBAAuB,CACxB,CAAC;YAEF,wBAAwB;YACxB,IAAA,oBAAU,EAAC;gBACT,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,iCAAiC;gBAC1C,WAAW,EAAE,SAAS,CAAC,cAAc,EAAE;gBACvC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;gBACnE,WAAW,EAAE;oBACX,IAAI,EAAE,MAAM,CAAC,eAAe;oBAC5B,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE;iBAC3C;aACF,CAAC,CAAC;YAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,sBAAsB,CAAC,CAAC;YACxD,IAAA,uBAAa,EAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { Logger } from 'pino';
|
|
3
|
+
export interface ConfigDisplayCommandDeps {
|
|
4
|
+
logger: Logger;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Create the 'configuration display' command
|
|
8
|
+
*/
|
|
9
|
+
export declare function createConfigDisplayCommand(deps: ConfigDisplayCommandDeps): Command;
|
|
10
|
+
//# sourceMappingURL=display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../../src/commands/configuration/display.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAuB9B,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAqClF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createConfigDisplayCommand = createConfigDisplayCommand;
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const yaml_1 = require("yaml");
|
|
6
|
+
const loader_1 = require("../../config/loader");
|
|
7
|
+
/**
|
|
8
|
+
* Mask sensitive values in configuration
|
|
9
|
+
*/
|
|
10
|
+
function maskSensitiveData(config) {
|
|
11
|
+
const masked = JSON.parse(JSON.stringify(config));
|
|
12
|
+
// Mask private key: show only first 4 and last 4 chars
|
|
13
|
+
if (masked.ethereum.wallet?.privateKey) {
|
|
14
|
+
const key = masked.ethereum.wallet.privateKey;
|
|
15
|
+
if (key.length > 8) {
|
|
16
|
+
const start = key.substring(0, 4);
|
|
17
|
+
const end = key.substring(key.length - 4);
|
|
18
|
+
masked.ethereum.wallet.privateKey = `${start}...${end}`;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return masked;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create the 'configuration display' command
|
|
25
|
+
*/
|
|
26
|
+
function createConfigDisplayCommand(deps) {
|
|
27
|
+
const { logger } = deps;
|
|
28
|
+
const cmdLogger = logger.child({ command: 'display' });
|
|
29
|
+
return new commander_1.Command('display')
|
|
30
|
+
.description('Display the current configuration (merged from all sources)')
|
|
31
|
+
.option('--show-secrets', 'Show full private key (not masked)')
|
|
32
|
+
.option('--config <path>', 'Custom config file path')
|
|
33
|
+
.action(async (options) => {
|
|
34
|
+
try {
|
|
35
|
+
cmdLogger.info('Loading configuration');
|
|
36
|
+
const config = (0, loader_1.loadConfig)({
|
|
37
|
+
configPath: options.config,
|
|
38
|
+
});
|
|
39
|
+
cmdLogger.info({ chain: config.ethereum.chain }, 'Configuration loaded');
|
|
40
|
+
// Mask sensitive data unless explicitly requested
|
|
41
|
+
const displayConfig = options['show-secrets'] ? config : maskSensitiveData(config);
|
|
42
|
+
// Convert to YAML for display
|
|
43
|
+
const yaml = (0, yaml_1.stringify)(displayConfig, {
|
|
44
|
+
indent: 2,
|
|
45
|
+
lineWidth: 0,
|
|
46
|
+
});
|
|
47
|
+
console.log('# Current Configuration (merged from defaults/file/env/flags)\n');
|
|
48
|
+
console.log(yaml);
|
|
49
|
+
process.exit(0);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
53
|
+
cmdLogger.error({ error: msg }, 'Failed to display config');
|
|
54
|
+
process.exit(2);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../../src/commands/configuration/display.ts"],"names":[],"mappings":";;AAgCA,gEAqCC;AArED,yCAAoC;AACpC,+BAAkD;AAElD,gDAAiD;AAGjD;;GAEG;AACH,SAAS,iBAAiB,CAAC,MAAoB;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAiB,CAAC;IAElE,uDAAuD;IACvD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC;QAC9C,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,KAAK,MAAM,GAAG,EAAmB,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAMD;;GAEG;AACH,SAAgB,0BAA0B,CAAC,IAA8B;IACvE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAEvD,OAAO,IAAI,mBAAO,CAAC,SAAS,CAAC;SAC1B,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,gBAAgB,EAAE,oCAAoC,CAAC;SAC9D,MAAM,CAAC,iBAAiB,EAAE,yBAAyB,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,OAAsD,EAAE,EAAE;QACvE,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAExC,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC;gBACxB,UAAU,EAAE,OAAO,CAAC,MAAM;aAC3B,CAAC,CAAC;YAEH,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,sBAAsB,CAAC,CAAC;YAEzE,kDAAkD;YAClD,MAAM,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAEnF,8BAA8B;YAC9B,MAAM,IAAI,GAAG,IAAA,gBAAa,EAAC,aAAa,EAAE;gBACxC,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAElB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,0BAA0B,CAAC,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { Logger } from 'pino';
|
|
3
|
+
/**
|
|
4
|
+
* Generate a template configuration file for test environment
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateConfigTemplate(environment?: 'test' | 'prod'): string;
|
|
7
|
+
export interface ConfigGenerateCommandDeps {
|
|
8
|
+
logger: Logger;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Create the 'configuration generate' command
|
|
12
|
+
*/
|
|
13
|
+
export declare function createConfigGenerateCommand(deps: ConfigGenerateCommandDeps): Command;
|
|
14
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/commands/configuration/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,GAAE,MAAM,GAAG,MAAe,GAAG,MAAM,CA4KpF;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAgCpF"}
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.generateConfigTemplate = generateConfigTemplate;
|
|
7
|
+
exports.createConfigGenerateCommand = createConfigGenerateCommand;
|
|
8
|
+
const fs_1 = __importDefault(require("fs"));
|
|
9
|
+
const commander_1 = require("commander");
|
|
10
|
+
/**
|
|
11
|
+
* Generate a template configuration file for test environment
|
|
12
|
+
*/
|
|
13
|
+
function generateConfigTemplate(environment = 'test') {
|
|
14
|
+
if (environment === 'test') {
|
|
15
|
+
return `# Web3PGP CLI Configuration - TEST Environment
|
|
16
|
+
# Location: ~/.web3pgp/config.yaml
|
|
17
|
+
#
|
|
18
|
+
# This file configures the Web3PGP CLI for the TEST environment.
|
|
19
|
+
# You can override any value using:
|
|
20
|
+
# - Environment variables (DEXES_* prefix)
|
|
21
|
+
# - Command-line flags
|
|
22
|
+
#
|
|
23
|
+
# Environment variables take precedence over this file.
|
|
24
|
+
# CLI flags take precedence over environment variables.
|
|
25
|
+
|
|
26
|
+
ethereum:
|
|
27
|
+
# Blockchain network configuration
|
|
28
|
+
# Using Sepolia testnet
|
|
29
|
+
chain: sepolia # or use numeric ID: 11155111
|
|
30
|
+
|
|
31
|
+
# RPC endpoint configuration
|
|
32
|
+
# Multiple endpoints with fallback support and per-endpoint batching configuration
|
|
33
|
+
rpc:
|
|
34
|
+
# Array of RPC endpoints with priority-based failover
|
|
35
|
+
# Lower priority number = higher priority (1 is highest)
|
|
36
|
+
endpoints:
|
|
37
|
+
# Primary RPC endpoint - PublicNode
|
|
38
|
+
- url: https://ethereum-sepolia-rpc.publicnode.com
|
|
39
|
+
priority: 1
|
|
40
|
+
batching:
|
|
41
|
+
size: 20 # Maximum requests per batch
|
|
42
|
+
waitMs: 100 # Maximum wait time before sending batch in milliseconds
|
|
43
|
+
|
|
44
|
+
# Backup 1 - Tenderly
|
|
45
|
+
- url: https://sepolia.gateway.tenderly.co
|
|
46
|
+
priority: 2
|
|
47
|
+
batching:
|
|
48
|
+
size: 20
|
|
49
|
+
waitMs: 100
|
|
50
|
+
|
|
51
|
+
# Backup 2 - dRPC
|
|
52
|
+
- url: https://sepolia.drpc.org
|
|
53
|
+
priority: 3
|
|
54
|
+
batching:
|
|
55
|
+
size: 20
|
|
56
|
+
waitMs: 100
|
|
57
|
+
|
|
58
|
+
# Backup 3 - 1RPC
|
|
59
|
+
- url: https://1rpc.io/sepolia
|
|
60
|
+
priority: 4
|
|
61
|
+
batching:
|
|
62
|
+
size: 20
|
|
63
|
+
waitMs: 100
|
|
64
|
+
|
|
65
|
+
# Shared retry configuration (applied to all endpoints)
|
|
66
|
+
retry:
|
|
67
|
+
count: 3 # Number of retry attempts
|
|
68
|
+
delayMs: 200 # Delay between retries in milliseconds
|
|
69
|
+
|
|
70
|
+
# Maximum block range for eth_getLogs queries
|
|
71
|
+
# Use this value when querying logs to avoid exceeding provider limits
|
|
72
|
+
maxBlockRange: 10000
|
|
73
|
+
|
|
74
|
+
# wallet: (OPTIONAL - required only for signing transactions)
|
|
75
|
+
# # Wallet configuration (currently only 'private-key' is supported)
|
|
76
|
+
# type: private-key
|
|
77
|
+
#
|
|
78
|
+
# # Private key for signing transactions
|
|
79
|
+
# # WARNING: Store this securely! Better to use the DEXES_WALLET_PRIVATE_KEY env var.
|
|
80
|
+
# # Support for \${VAR_NAME} syntax: privateKey: "\${DEXES_WALLET_PRIVATE_KEY}"
|
|
81
|
+
# # privateKey: "<YOUR_PRIVATE_KEY>"
|
|
82
|
+
|
|
83
|
+
web3pgp:
|
|
84
|
+
# Web3PGP smart contract address (test deployment on Sepolia)
|
|
85
|
+
contract: "0x82733B49e65A2FE6B611e5CE454AC21237071638"
|
|
86
|
+
|
|
87
|
+
monitoring:
|
|
88
|
+
logging:
|
|
89
|
+
# Log level: debug, info, warn, error
|
|
90
|
+
level: info
|
|
91
|
+
|
|
92
|
+
# ============================================================================
|
|
93
|
+
# ENVIRONMENT VARIABLES
|
|
94
|
+
# ============================================================================
|
|
95
|
+
# You can override any configuration value using environment variables:
|
|
96
|
+
#
|
|
97
|
+
# DEXES_CHAIN=sepolia
|
|
98
|
+
# DEXES_RPC_ENDPOINTS='[{"url":"...","priority":1,"batching":{"size":100,"waitMs":50}}]'
|
|
99
|
+
# DEXES_WALLET_PRIVATE_KEY=<YOUR_PRIVATE_KEY>
|
|
100
|
+
# DEXES_WEB3PGP_CONTRACT=<CONTRACT_ADDRESS>
|
|
101
|
+
# DEXES_LOG_LEVEL=debug
|
|
102
|
+
`;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
return `# Web3PGP CLI Configuration - PRODUCTION Environment
|
|
106
|
+
# Location: ~/.web3pgp/config.yaml
|
|
107
|
+
#
|
|
108
|
+
# This file configures the Web3PGP CLI for the PRODUCTION environment.
|
|
109
|
+
# You can override any value using:
|
|
110
|
+
# - Environment variables (DEXES_* prefix)
|
|
111
|
+
# - Command-line flags
|
|
112
|
+
#
|
|
113
|
+
# Environment variables take precedence over this file.
|
|
114
|
+
# CLI flags take precedence over environment variables.
|
|
115
|
+
|
|
116
|
+
ethereum:
|
|
117
|
+
# Blockchain network configuration
|
|
118
|
+
# Using Scroll mainnet
|
|
119
|
+
chain: 534352
|
|
120
|
+
|
|
121
|
+
# RPC endpoint configuration
|
|
122
|
+
rpc:
|
|
123
|
+
endpoints:
|
|
124
|
+
# Primary RPC endpoint - Scroll official
|
|
125
|
+
- url: https://rpc.scroll.io
|
|
126
|
+
priority: 1
|
|
127
|
+
batching:
|
|
128
|
+
size: 20
|
|
129
|
+
waitMs: 150
|
|
130
|
+
# Secondary RPC endpoint - 1RPC
|
|
131
|
+
- url: https://1rpc.io/scroll
|
|
132
|
+
priority: 2
|
|
133
|
+
batching:
|
|
134
|
+
size: 20
|
|
135
|
+
waitMs: 150
|
|
136
|
+
# Tertiary RPC endpoint - PublicNode
|
|
137
|
+
- url: https://scroll-rpc.publicnode.com
|
|
138
|
+
priority: 3
|
|
139
|
+
batching:
|
|
140
|
+
size: 20
|
|
141
|
+
waitMs: 150
|
|
142
|
+
# Quaternary RPC endpoint - DRPC
|
|
143
|
+
- url: https://scroll.drpc.org
|
|
144
|
+
priority: 4
|
|
145
|
+
batching:
|
|
146
|
+
size: 20
|
|
147
|
+
waitMs: 150
|
|
148
|
+
|
|
149
|
+
retry:
|
|
150
|
+
count: 3
|
|
151
|
+
delayMs: 500
|
|
152
|
+
|
|
153
|
+
maxBlockRange: 10000
|
|
154
|
+
|
|
155
|
+
# wallet: (OPTIONAL - required only for signing transactions)
|
|
156
|
+
# # Wallet configuration (currently only 'private-key' is supported)
|
|
157
|
+
# type: private-key
|
|
158
|
+
#
|
|
159
|
+
# # Private key for signing transactions
|
|
160
|
+
# # WARNING: Store this securely! Better to use the DEXES_WALLET_PRIVATE_KEY env var.
|
|
161
|
+
# # Support for \${VAR_NAME} syntax: privateKey: "\${DEXES_WALLET_PRIVATE_KEY}"
|
|
162
|
+
# # privateKey: "<YOUR_PRIVATE_KEY>"
|
|
163
|
+
|
|
164
|
+
web3pgp:
|
|
165
|
+
# Web3PGP smart contract address (production deployment on Scroll)
|
|
166
|
+
contract: "0xDa63568866C8eB53627a5CCF27DaB76061538dB1"
|
|
167
|
+
|
|
168
|
+
monitoring:
|
|
169
|
+
logging:
|
|
170
|
+
# Log level: debug, info, warn, error
|
|
171
|
+
level: info
|
|
172
|
+
|
|
173
|
+
# ============================================================================
|
|
174
|
+
# ENVIRONMENT VARIABLES
|
|
175
|
+
# ============================================================================
|
|
176
|
+
# You can override any configuration value using environment variables:
|
|
177
|
+
#
|
|
178
|
+
# DEXES_CHAIN=534352
|
|
179
|
+
# DEXES_RPC_URL=https://rpc.scroll.io # Single RPC endpoint override
|
|
180
|
+
# DEXES_RPC_ENDPOINTS='[{"url":"https://rpc.scroll.io","priority":1,"batching":{"size":20,"waitMs":150}}]'
|
|
181
|
+
# DEXES_WALLET_PRIVATE_KEY=<YOUR_PRIVATE_KEY>
|
|
182
|
+
# DEXES_WEB3PGP_CONTRACT=0xDa63568866C8eB53627a5CCF27DaB76061538dB1
|
|
183
|
+
# DEXES_LOG_LEVEL=info
|
|
184
|
+
`;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Create the 'configuration generate' command
|
|
189
|
+
*/
|
|
190
|
+
function createConfigGenerateCommand(deps) {
|
|
191
|
+
const { logger } = deps;
|
|
192
|
+
const cmdLogger = logger.child({ command: 'generate' });
|
|
193
|
+
return new commander_1.Command('generate')
|
|
194
|
+
.description('Generate a template configuration file')
|
|
195
|
+
.argument('[environment]', 'Environment: test or prod (default: test)', 'test')
|
|
196
|
+
.option('-o, --output <path>', 'Output file path (default: stdout)')
|
|
197
|
+
.action(async (environment, options) => {
|
|
198
|
+
try {
|
|
199
|
+
// Validate environment argument
|
|
200
|
+
if (!['test', 'prod'].includes(environment)) {
|
|
201
|
+
throw new Error(`Invalid environment: ${environment}. Must be 'test' or 'prod'.`);
|
|
202
|
+
}
|
|
203
|
+
cmdLogger.info({ environment }, 'Generating config template');
|
|
204
|
+
const template = generateConfigTemplate(environment);
|
|
205
|
+
if (options.output) {
|
|
206
|
+
fs_1.default.writeFileSync(options.output, template);
|
|
207
|
+
cmdLogger.info({ path: options.output, environment }, 'Config template written');
|
|
208
|
+
console.log(`Configuration template written to ${options.output} (${environment} environment)`);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
console.log(template);
|
|
212
|
+
}
|
|
213
|
+
process.exit(0);
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
217
|
+
cmdLogger.error({ error: msg }, 'Failed to generate config');
|
|
218
|
+
process.exit(2);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=generate.js.map
|