@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.
Files changed (135) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +151 -0
  3. package/dist/commands/blockchain/addSubkey.d.ts +9 -0
  4. package/dist/commands/blockchain/addSubkey.d.ts.map +1 -0
  5. package/dist/commands/blockchain/addSubkey.js +49 -0
  6. package/dist/commands/blockchain/addSubkey.js.map +1 -0
  7. package/dist/commands/blockchain/certify.d.ts +13 -0
  8. package/dist/commands/blockchain/certify.d.ts.map +1 -0
  9. package/dist/commands/blockchain/certify.js +75 -0
  10. package/dist/commands/blockchain/certify.js.map +1 -0
  11. package/dist/commands/blockchain/challenge.d.ts +13 -0
  12. package/dist/commands/blockchain/challenge.d.ts.map +1 -0
  13. package/dist/commands/blockchain/challenge.js +58 -0
  14. package/dist/commands/blockchain/challenge.js.map +1 -0
  15. package/dist/commands/blockchain/generateKey.d.ts +7 -0
  16. package/dist/commands/blockchain/generateKey.d.ts.map +1 -0
  17. package/dist/commands/blockchain/generateKey.js +36 -0
  18. package/dist/commands/blockchain/generateKey.js.map +1 -0
  19. package/dist/commands/blockchain/getPublicKey.d.ts +9 -0
  20. package/dist/commands/blockchain/getPublicKey.d.ts.map +1 -0
  21. package/dist/commands/blockchain/getPublicKey.js +37 -0
  22. package/dist/commands/blockchain/getPublicKey.js.map +1 -0
  23. package/dist/commands/blockchain/index.d.ts +12 -0
  24. package/dist/commands/blockchain/index.d.ts.map +1 -0
  25. package/dist/commands/blockchain/index.js +33 -0
  26. package/dist/commands/blockchain/index.js.map +1 -0
  27. package/dist/commands/blockchain/keccak256.d.ts +7 -0
  28. package/dist/commands/blockchain/keccak256.d.ts.map +1 -0
  29. package/dist/commands/blockchain/keccak256.js +38 -0
  30. package/dist/commands/blockchain/keccak256.js.map +1 -0
  31. package/dist/commands/blockchain/listen.d.ts +9 -0
  32. package/dist/commands/blockchain/listen.d.ts.map +1 -0
  33. package/dist/commands/blockchain/listen.js +30 -0
  34. package/dist/commands/blockchain/listen.js.map +1 -0
  35. package/dist/commands/blockchain/prove.d.ts +13 -0
  36. package/dist/commands/blockchain/prove.d.ts.map +1 -0
  37. package/dist/commands/blockchain/prove.js +123 -0
  38. package/dist/commands/blockchain/prove.js.map +1 -0
  39. package/dist/commands/blockchain/register.d.ts +13 -0
  40. package/dist/commands/blockchain/register.d.ts.map +1 -0
  41. package/dist/commands/blockchain/register.js +65 -0
  42. package/dist/commands/blockchain/register.js.map +1 -0
  43. package/dist/commands/blockchain/revoke-certification.d.ts +13 -0
  44. package/dist/commands/blockchain/revoke-certification.d.ts.map +1 -0
  45. package/dist/commands/blockchain/revoke-certification.js +75 -0
  46. package/dist/commands/blockchain/revoke-certification.js.map +1 -0
  47. package/dist/commands/blockchain/revoke.d.ts +19 -0
  48. package/dist/commands/blockchain/revoke.d.ts.map +1 -0
  49. package/dist/commands/blockchain/revoke.js +118 -0
  50. package/dist/commands/blockchain/revoke.js.map +1 -0
  51. package/dist/commands/blockchain/sync.d.ts +20 -0
  52. package/dist/commands/blockchain/sync.d.ts.map +1 -0
  53. package/dist/commands/blockchain/sync.js +246 -0
  54. package/dist/commands/blockchain/sync.js.map +1 -0
  55. package/dist/commands/blockchain/update.d.ts +13 -0
  56. package/dist/commands/blockchain/update.d.ts.map +1 -0
  57. package/dist/commands/blockchain/update.js +60 -0
  58. package/dist/commands/blockchain/update.js.map +1 -0
  59. package/dist/commands/configuration/display.d.ts +10 -0
  60. package/dist/commands/configuration/display.d.ts.map +1 -0
  61. package/dist/commands/configuration/display.js +58 -0
  62. package/dist/commands/configuration/display.js.map +1 -0
  63. package/dist/commands/configuration/generate.d.ts +14 -0
  64. package/dist/commands/configuration/generate.d.ts.map +1 -0
  65. package/dist/commands/configuration/generate.js +222 -0
  66. package/dist/commands/configuration/generate.js.map +1 -0
  67. package/dist/commands/configuration/index.d.ts +6 -0
  68. package/dist/commands/configuration/index.d.ts.map +1 -0
  69. package/dist/commands/configuration/index.js +21 -0
  70. package/dist/commands/configuration/index.js.map +1 -0
  71. package/dist/commands/configuration/validate.d.ts +10 -0
  72. package/dist/commands/configuration/validate.d.ts.map +1 -0
  73. package/dist/commands/configuration/validate.js +45 -0
  74. package/dist/commands/configuration/validate.js.map +1 -0
  75. package/dist/commands/factory.d.ts +33 -0
  76. package/dist/commands/factory.d.ts.map +1 -0
  77. package/dist/commands/factory.js +48 -0
  78. package/dist/commands/factory.js.map +1 -0
  79. package/dist/config/defaults.d.ts +8 -0
  80. package/dist/config/defaults.d.ts.map +1 -0
  81. package/dist/config/defaults.js +11 -0
  82. package/dist/config/defaults.js.map +1 -0
  83. package/dist/config/loader.d.ts +12 -0
  84. package/dist/config/loader.d.ts.map +1 -0
  85. package/dist/config/loader.js +205 -0
  86. package/dist/config/loader.js.map +1 -0
  87. package/dist/config/testnet.d.ts +6 -0
  88. package/dist/config/testnet.d.ts.map +1 -0
  89. package/dist/config/testnet.js +26 -0
  90. package/dist/config/testnet.js.map +1 -0
  91. package/dist/config/transport.d.ts +17 -0
  92. package/dist/config/transport.d.ts.map +1 -0
  93. package/dist/config/transport.js +46 -0
  94. package/dist/config/transport.js.map +1 -0
  95. package/dist/config/types.d.ts +92 -0
  96. package/dist/config/types.d.ts.map +1 -0
  97. package/dist/config/types.js +12 -0
  98. package/dist/config/types.js.map +1 -0
  99. package/dist/config/validator.d.ts +14 -0
  100. package/dist/config/validator.d.ts.map +1 -0
  101. package/dist/config/validator.js +156 -0
  102. package/dist/config/validator.js.map +1 -0
  103. package/dist/errors.d.ts +13 -0
  104. package/dist/errors.d.ts.map +1 -0
  105. package/dist/errors.js +28 -0
  106. package/dist/errors.js.map +1 -0
  107. package/dist/index.d.ts +2 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +61 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/services/web3pgpServiceFactory.d.ts +14 -0
  112. package/dist/services/web3pgpServiceFactory.d.ts.map +1 -0
  113. package/dist/services/web3pgpServiceFactory.js +228 -0
  114. package/dist/services/web3pgpServiceFactory.js.map +1 -0
  115. package/dist/setup.d.ts +14 -0
  116. package/dist/setup.d.ts.map +1 -0
  117. package/dist/setup.js +46 -0
  118. package/dist/setup.js.map +1 -0
  119. package/dist/types.d.ts +5 -0
  120. package/dist/types.d.ts.map +1 -0
  121. package/dist/types.js +3 -0
  122. package/dist/types.js.map +1 -0
  123. package/dist/utils/clients.d.ts +49373 -0
  124. package/dist/utils/clients.d.ts.map +1 -0
  125. package/dist/utils/clients.js +129 -0
  126. package/dist/utils/clients.js.map +1 -0
  127. package/dist/utils/input.d.ts +24 -0
  128. package/dist/utils/input.d.ts.map +1 -0
  129. package/dist/utils/input.js +138 -0
  130. package/dist/utils/input.js.map +1 -0
  131. package/dist/utils/logger.d.ts +12 -0
  132. package/dist/utils/logger.d.ts.map +1 -0
  133. package/dist/utils/logger.js +35 -0
  134. package/dist/utils/logger.js.map +1 -0
  135. 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