@agirails/sdk 2.5.2 → 2.5.4

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 (172) hide show
  1. package/dist/ACTPClient.d.ts +18 -0
  2. package/dist/ACTPClient.d.ts.map +1 -1
  3. package/dist/ACTPClient.js +67 -22
  4. package/dist/ACTPClient.js.map +1 -1
  5. package/dist/adapters/BasicAdapter.d.ts +12 -0
  6. package/dist/adapters/BasicAdapter.d.ts.map +1 -1
  7. package/dist/adapters/BasicAdapter.js +30 -4
  8. package/dist/adapters/BasicAdapter.js.map +1 -1
  9. package/dist/adapters/StandardAdapter.d.ts +20 -3
  10. package/dist/adapters/StandardAdapter.d.ts.map +1 -1
  11. package/dist/adapters/StandardAdapter.js +45 -11
  12. package/dist/adapters/StandardAdapter.js.map +1 -1
  13. package/dist/cli/commands/publish.js +16 -4
  14. package/dist/cli/commands/publish.js.map +1 -1
  15. package/dist/cli/commands/register.js +16 -4
  16. package/dist/cli/commands/register.js.map +1 -1
  17. package/dist/cli/commands/tx.js +31 -3
  18. package/dist/cli/commands/tx.js.map +1 -1
  19. package/dist/cli/utils/client.d.ts.map +1 -1
  20. package/dist/cli/utils/client.js +1 -0
  21. package/dist/cli/utils/client.js.map +1 -1
  22. package/dist/config/networks.d.ts +2 -2
  23. package/dist/config/networks.d.ts.map +1 -1
  24. package/dist/config/networks.js +27 -22
  25. package/dist/config/networks.js.map +1 -1
  26. package/dist/level0/request.d.ts.map +1 -1
  27. package/dist/level0/request.js +2 -1
  28. package/dist/level0/request.js.map +1 -1
  29. package/dist/runtime/BlockchainRuntime.d.ts.map +1 -1
  30. package/dist/runtime/BlockchainRuntime.js +11 -5
  31. package/dist/runtime/BlockchainRuntime.js.map +1 -1
  32. package/dist/runtime/MockStateManager.d.ts.map +1 -1
  33. package/dist/runtime/MockStateManager.js +2 -1
  34. package/dist/runtime/MockStateManager.js.map +1 -1
  35. package/dist/utils/IPFSClient.d.ts +3 -1
  36. package/dist/utils/IPFSClient.d.ts.map +1 -1
  37. package/dist/utils/IPFSClient.js +27 -7
  38. package/dist/utils/IPFSClient.js.map +1 -1
  39. package/dist/wallet/AutoWalletProvider.d.ts.map +1 -1
  40. package/dist/wallet/AutoWalletProvider.js +52 -18
  41. package/dist/wallet/AutoWalletProvider.js.map +1 -1
  42. package/dist/wallet/SmartWalletRouter.d.ts +116 -0
  43. package/dist/wallet/SmartWalletRouter.d.ts.map +1 -0
  44. package/dist/wallet/SmartWalletRouter.js +212 -0
  45. package/dist/wallet/SmartWalletRouter.js.map +1 -0
  46. package/dist/wallet/aa/DualNonceManager.d.ts +19 -0
  47. package/dist/wallet/aa/DualNonceManager.d.ts.map +1 -1
  48. package/dist/wallet/aa/DualNonceManager.js +100 -5
  49. package/dist/wallet/aa/DualNonceManager.js.map +1 -1
  50. package/package.json +3 -6
  51. package/src/ACTPClient.ts +0 -1579
  52. package/src/abi/ACTPKernel.json +0 -1356
  53. package/src/abi/AgentRegistry.json +0 -915
  54. package/src/abi/ERC20.json +0 -40
  55. package/src/abi/EscrowVault.json +0 -134
  56. package/src/abi/IdentityRegistry.json +0 -316
  57. package/src/adapters/AdapterRegistry.ts +0 -173
  58. package/src/adapters/AdapterRouter.ts +0 -416
  59. package/src/adapters/BaseAdapter.ts +0 -498
  60. package/src/adapters/BasicAdapter.ts +0 -514
  61. package/src/adapters/IAdapter.ts +0 -292
  62. package/src/adapters/StandardAdapter.ts +0 -555
  63. package/src/adapters/X402Adapter.ts +0 -731
  64. package/src/adapters/index.ts +0 -60
  65. package/src/builders/DeliveryProofBuilder.ts +0 -327
  66. package/src/builders/QuoteBuilder.ts +0 -483
  67. package/src/builders/index.ts +0 -17
  68. package/src/cli/commands/balance.ts +0 -110
  69. package/src/cli/commands/batch.ts +0 -487
  70. package/src/cli/commands/config.ts +0 -231
  71. package/src/cli/commands/deploy-check.ts +0 -364
  72. package/src/cli/commands/deploy-env.ts +0 -120
  73. package/src/cli/commands/diff.ts +0 -141
  74. package/src/cli/commands/init.ts +0 -469
  75. package/src/cli/commands/mint.ts +0 -116
  76. package/src/cli/commands/pay.ts +0 -113
  77. package/src/cli/commands/publish.ts +0 -475
  78. package/src/cli/commands/pull.ts +0 -124
  79. package/src/cli/commands/register.ts +0 -247
  80. package/src/cli/commands/simulate.ts +0 -345
  81. package/src/cli/commands/time.ts +0 -302
  82. package/src/cli/commands/tx.ts +0 -448
  83. package/src/cli/commands/watch.ts +0 -211
  84. package/src/cli/index.ts +0 -134
  85. package/src/cli/utils/client.ts +0 -251
  86. package/src/cli/utils/config.ts +0 -389
  87. package/src/cli/utils/output.ts +0 -465
  88. package/src/cli/utils/wallet.ts +0 -109
  89. package/src/config/agirailsmd.ts +0 -262
  90. package/src/config/networks.ts +0 -275
  91. package/src/config/pendingPublish.ts +0 -237
  92. package/src/config/publishPipeline.ts +0 -359
  93. package/src/config/syncOperations.ts +0 -279
  94. package/src/erc8004/ERC8004Bridge.ts +0 -462
  95. package/src/erc8004/ReputationReporter.ts +0 -468
  96. package/src/erc8004/index.ts +0 -61
  97. package/src/errors/index.ts +0 -427
  98. package/src/index.ts +0 -364
  99. package/src/level0/Provider.ts +0 -117
  100. package/src/level0/ServiceDirectory.ts +0 -131
  101. package/src/level0/index.ts +0 -10
  102. package/src/level0/provide.ts +0 -132
  103. package/src/level0/request.ts +0 -432
  104. package/src/level1/Agent.ts +0 -1426
  105. package/src/level1/index.ts +0 -10
  106. package/src/level1/pricing/PriceCalculator.ts +0 -255
  107. package/src/level1/pricing/PricingStrategy.ts +0 -198
  108. package/src/level1/types/Job.ts +0 -179
  109. package/src/level1/types/Options.ts +0 -291
  110. package/src/level1/types/index.ts +0 -8
  111. package/src/protocol/ACTPKernel.ts +0 -808
  112. package/src/protocol/AgentRegistry.ts +0 -559
  113. package/src/protocol/DIDManager.ts +0 -629
  114. package/src/protocol/DIDResolver.ts +0 -554
  115. package/src/protocol/EASHelper.ts +0 -378
  116. package/src/protocol/EscrowVault.ts +0 -255
  117. package/src/protocol/EventMonitor.ts +0 -204
  118. package/src/protocol/MessageSigner.ts +0 -510
  119. package/src/protocol/ProofGenerator.ts +0 -339
  120. package/src/protocol/QuoteBuilder.ts +0 -15
  121. package/src/registry/AgentRegistryClient.ts +0 -202
  122. package/src/runtime/BlockchainRuntime.ts +0 -1015
  123. package/src/runtime/IACTPRuntime.ts +0 -306
  124. package/src/runtime/MockRuntime.ts +0 -1298
  125. package/src/runtime/MockStateManager.ts +0 -576
  126. package/src/runtime/index.ts +0 -25
  127. package/src/runtime/types/MockState.ts +0 -237
  128. package/src/storage/ArchiveBundleBuilder.ts +0 -561
  129. package/src/storage/ArweaveClient.ts +0 -946
  130. package/src/storage/FilebaseClient.ts +0 -790
  131. package/src/storage/index.ts +0 -96
  132. package/src/storage/types.ts +0 -348
  133. package/src/types/adapter.ts +0 -310
  134. package/src/types/agent.ts +0 -79
  135. package/src/types/did.ts +0 -223
  136. package/src/types/eip712.ts +0 -175
  137. package/src/types/erc8004.ts +0 -293
  138. package/src/types/escrow.ts +0 -27
  139. package/src/types/index.ts +0 -17
  140. package/src/types/message.ts +0 -145
  141. package/src/types/state.ts +0 -87
  142. package/src/types/transaction.ts +0 -69
  143. package/src/types/x402.ts +0 -251
  144. package/src/utils/ErrorRecoveryGuide.ts +0 -676
  145. package/src/utils/Helpers.ts +0 -688
  146. package/src/utils/IPFSClient.ts +0 -368
  147. package/src/utils/Logger.ts +0 -484
  148. package/src/utils/NonceManager.ts +0 -591
  149. package/src/utils/RateLimiter.ts +0 -534
  150. package/src/utils/ReceivedNonceTracker.ts +0 -567
  151. package/src/utils/SDKLifecycle.ts +0 -416
  152. package/src/utils/SecureNonce.ts +0 -78
  153. package/src/utils/Semaphore.ts +0 -276
  154. package/src/utils/UsedAttestationTracker.ts +0 -385
  155. package/src/utils/canonicalJson.ts +0 -38
  156. package/src/utils/circuitBreaker.ts +0 -324
  157. package/src/utils/computeTypeHash.ts +0 -48
  158. package/src/utils/fsSafe.ts +0 -80
  159. package/src/utils/index.ts +0 -80
  160. package/src/utils/retry.ts +0 -364
  161. package/src/utils/security.ts +0 -418
  162. package/src/utils/validation.ts +0 -540
  163. package/src/wallet/AutoWalletProvider.ts +0 -299
  164. package/src/wallet/EOAWalletProvider.ts +0 -69
  165. package/src/wallet/IWalletProvider.ts +0 -135
  166. package/src/wallet/aa/BundlerClient.ts +0 -274
  167. package/src/wallet/aa/DualNonceManager.ts +0 -173
  168. package/src/wallet/aa/PaymasterClient.ts +0 -174
  169. package/src/wallet/aa/TransactionBatcher.ts +0 -353
  170. package/src/wallet/aa/UserOpBuilder.ts +0 -246
  171. package/src/wallet/aa/constants.ts +0 -60
  172. package/src/wallet/keystore.ts +0 -240
@@ -1,416 +0,0 @@
1
- /**
2
- * SDKLifecycle - Proper cleanup and resource management
3
- *
4
- * SECURITY FIX (M-8): Ensures proper cleanup on SDK shutdown:
5
- * - Connection cleanup
6
- * - Pending request handling
7
- * - Memory release
8
- * - Graceful shutdown
9
- *
10
- * @module utils/SDKLifecycle
11
- */
12
-
13
- import { sdkLogger, Logger } from './Logger';
14
-
15
- /**
16
- * Disposable resource interface
17
- */
18
- export interface Disposable {
19
- /** Cleanup method */
20
- dispose(): Promise<void> | void;
21
- }
22
-
23
- /**
24
- * Shutdown handler function
25
- */
26
- export type ShutdownHandler = () => Promise<void> | void;
27
-
28
- /**
29
- * Lifecycle event types
30
- */
31
- export type LifecycleEvent =
32
- | 'initializing'
33
- | 'ready'
34
- | 'shutting-down'
35
- | 'shutdown'
36
- | 'error';
37
-
38
- /**
39
- * Lifecycle event listener
40
- */
41
- export type LifecycleListener = (event: LifecycleEvent, data?: unknown) => void;
42
-
43
- /**
44
- * SDK Lifecycle Manager
45
- *
46
- * Manages SDK initialization, shutdown, and resource cleanup.
47
- *
48
- * @example
49
- * ```typescript
50
- * const lifecycle = new SDKLifecycle();
51
- *
52
- * // Register cleanup handlers
53
- * lifecycle.onShutdown(async () => {
54
- * await closeConnections();
55
- * });
56
- *
57
- * // Register disposable resources
58
- * lifecycle.registerDisposable(myResource);
59
- *
60
- * // Later, initiate shutdown
61
- * await lifecycle.shutdown();
62
- * ```
63
- */
64
- export class SDKLifecycle {
65
- private state: LifecycleEvent = 'initializing';
66
- private shutdownHandlers: ShutdownHandler[] = [];
67
- private disposables: Disposable[] = [];
68
- private listeners: LifecycleListener[] = [];
69
- private shutdownPromise: Promise<void> | null = null;
70
- private readonly logger: Logger;
71
- private isShuttingDown = false;
72
-
73
- // SECURITY FIX (NEW-HIGH-2): Store handler references for cleanup
74
- private processHandlers: {
75
- sigint?: () => void;
76
- sigterm?: () => void;
77
- uncaughtException?: (error: Error) => void;
78
- unhandledRejection?: (reason: unknown) => void;
79
- } = {};
80
- private processHandlersRegistered = false;
81
-
82
- constructor(logger?: Logger) {
83
- this.logger = logger ?? sdkLogger.child('Lifecycle');
84
-
85
- // Register process shutdown handlers
86
- this.registerProcessHandlers();
87
- }
88
-
89
- /**
90
- * Get current lifecycle state
91
- */
92
- getState(): LifecycleEvent {
93
- return this.state;
94
- }
95
-
96
- /**
97
- * Check if SDK is ready for operations
98
- */
99
- isReady(): boolean {
100
- return this.state === 'ready';
101
- }
102
-
103
- /**
104
- * Mark SDK as ready
105
- */
106
- markReady(): void {
107
- this.state = 'ready';
108
- this.emit('ready');
109
- this.logger.info('SDK ready');
110
- }
111
-
112
- /**
113
- * Register a shutdown handler
114
- *
115
- * @param handler - Function to call during shutdown
116
- * @returns Unregister function
117
- */
118
- onShutdown(handler: ShutdownHandler): () => void {
119
- this.shutdownHandlers.push(handler);
120
-
121
- return () => {
122
- const index = this.shutdownHandlers.indexOf(handler);
123
- if (index > -1) {
124
- this.shutdownHandlers.splice(index, 1);
125
- }
126
- };
127
- }
128
-
129
- /**
130
- * Register a disposable resource
131
- *
132
- * @param disposable - Resource with dispose() method
133
- * @returns Unregister function
134
- */
135
- registerDisposable(disposable: Disposable): () => void {
136
- this.disposables.push(disposable);
137
-
138
- return () => {
139
- const index = this.disposables.indexOf(disposable);
140
- if (index > -1) {
141
- this.disposables.splice(index, 1);
142
- }
143
- };
144
- }
145
-
146
- /**
147
- * Add lifecycle event listener
148
- *
149
- * @param listener - Event listener function
150
- * @returns Unregister function
151
- */
152
- addListener(listener: LifecycleListener): () => void {
153
- this.listeners.push(listener);
154
-
155
- return () => {
156
- const index = this.listeners.indexOf(listener);
157
- if (index > -1) {
158
- this.listeners.splice(index, 1);
159
- }
160
- };
161
- }
162
-
163
- /**
164
- * Emit lifecycle event
165
- */
166
- private emit(event: LifecycleEvent, data?: unknown): void {
167
- for (const listener of this.listeners) {
168
- try {
169
- listener(event, data);
170
- } catch (error) {
171
- this.logger.error('Lifecycle listener error', { event }, error as Error);
172
- }
173
- }
174
- }
175
-
176
- /**
177
- * Initiate graceful shutdown
178
- *
179
- * @param timeout - Maximum time to wait for cleanup (ms)
180
- * @returns Promise that resolves when shutdown is complete
181
- */
182
- async shutdown(timeout = 30000): Promise<void> {
183
- // Prevent multiple shutdown calls
184
- if (this.shutdownPromise) {
185
- return this.shutdownPromise;
186
- }
187
-
188
- if (this.isShuttingDown) {
189
- return;
190
- }
191
-
192
- this.isShuttingDown = true;
193
- this.state = 'shutting-down';
194
- this.emit('shutting-down');
195
- this.logger.info('SDK shutting down...');
196
-
197
- this.shutdownPromise = this.executeShutdown(timeout);
198
- return this.shutdownPromise;
199
- }
200
-
201
- /**
202
- * Execute shutdown sequence
203
- */
204
- private async executeShutdown(timeout: number): Promise<void> {
205
- const startTime = Date.now();
206
- const errors: Error[] = [];
207
-
208
- // Create timeout promise
209
- const timeoutPromise = new Promise<void>((_, reject) => {
210
- setTimeout(() => {
211
- reject(new Error(`Shutdown timed out after ${timeout}ms`));
212
- }, timeout);
213
- });
214
-
215
- try {
216
- // Run shutdown handlers first (in reverse order - LIFO)
217
- const handlersPromise = (async () => {
218
- for (let i = this.shutdownHandlers.length - 1; i >= 0; i--) {
219
- try {
220
- const elapsed = Date.now() - startTime;
221
- if (elapsed >= timeout) {
222
- this.logger.warn('Shutdown timeout reached, skipping remaining handlers');
223
- break;
224
- }
225
-
226
- const handler = this.shutdownHandlers[i];
227
- await handler();
228
- } catch (error) {
229
- this.logger.error('Shutdown handler error', {}, error as Error);
230
- errors.push(error as Error);
231
- }
232
- }
233
-
234
- // Dispose resources (in reverse order)
235
- for (let i = this.disposables.length - 1; i >= 0; i--) {
236
- try {
237
- const elapsed = Date.now() - startTime;
238
- if (elapsed >= timeout) {
239
- this.logger.warn('Shutdown timeout reached, skipping remaining disposables');
240
- break;
241
- }
242
-
243
- const disposable = this.disposables[i];
244
- await disposable.dispose();
245
- } catch (error) {
246
- this.logger.error('Disposable cleanup error', {}, error as Error);
247
- errors.push(error as Error);
248
- }
249
- }
250
- })();
251
-
252
- // Race against timeout
253
- await Promise.race([handlersPromise, timeoutPromise]);
254
-
255
- } catch (error) {
256
- if ((error as Error).message.includes('timed out')) {
257
- this.logger.warn('Shutdown timed out, forcing cleanup');
258
- } else {
259
- errors.push(error as Error);
260
- }
261
- }
262
-
263
- // SECURITY FIX (NEW-HIGH-2): Remove process handlers to prevent memory leaks
264
- this.unregisterProcessHandlers();
265
-
266
- // Clear registrations
267
- this.shutdownHandlers = [];
268
- this.disposables = [];
269
-
270
- this.state = 'shutdown';
271
- this.emit('shutdown');
272
- this.logger.info('SDK shutdown complete', { errors: errors.length });
273
-
274
- if (errors.length > 0) {
275
- this.logger.error('Shutdown completed with errors', {
276
- errorCount: errors.length,
277
- errors: errors.map((e) => e.message),
278
- });
279
- }
280
- }
281
-
282
- /**
283
- * Register process-level shutdown handlers
284
- *
285
- * SECURITY FIX (NEW-HIGH-2): Store handler references for cleanup
286
- * to prevent memory leaks when multiple SDKLifecycle instances are created.
287
- */
288
- private registerProcessHandlers(): void {
289
- // Only register in Node.js environment
290
- if (typeof process === 'undefined') {
291
- return;
292
- }
293
-
294
- // SECURITY FIX (NEW-HIGH-2): Prevent duplicate registrations
295
- if (this.processHandlersRegistered) {
296
- return;
297
- }
298
-
299
- // SECURITY FIX (NEW-HIGH-2): Create named handlers we can remove later
300
- this.processHandlers.sigint = () => {
301
- this.logger.info('Received SIGINT, initiating shutdown');
302
- this.shutdown().then(() => {
303
- process.exit(0);
304
- }).catch((error) => {
305
- this.logger.error('Shutdown error', {}, error);
306
- process.exit(1);
307
- });
308
- };
309
-
310
- this.processHandlers.sigterm = () => {
311
- this.logger.info('Received SIGTERM, initiating shutdown');
312
- this.shutdown().then(() => {
313
- process.exit(0);
314
- }).catch((error) => {
315
- this.logger.error('Shutdown error', {}, error);
316
- process.exit(1);
317
- });
318
- };
319
-
320
- this.processHandlers.uncaughtException = (error: Error) => {
321
- this.logger.error('Uncaught exception', {}, error);
322
- this.emit('error', error);
323
- this.shutdown().finally(() => {
324
- process.exit(1);
325
- });
326
- };
327
-
328
- this.processHandlers.unhandledRejection = (reason: unknown) => {
329
- const error = reason instanceof Error ? reason : new Error(String(reason));
330
- this.logger.error('Unhandled rejection', {}, error);
331
- this.emit('error', error);
332
- };
333
-
334
- // Handle termination signals
335
- process.on('SIGINT', this.processHandlers.sigint);
336
- process.on('SIGTERM', this.processHandlers.sigterm);
337
-
338
- // Handle uncaught errors
339
- process.on('uncaughtException', this.processHandlers.uncaughtException);
340
- process.on('unhandledRejection', this.processHandlers.unhandledRejection);
341
-
342
- this.processHandlersRegistered = true;
343
- }
344
-
345
- /**
346
- * Unregister process-level shutdown handlers
347
- *
348
- * SECURITY FIX (NEW-HIGH-2): Remove handlers to prevent memory leaks
349
- */
350
- private unregisterProcessHandlers(): void {
351
- if (typeof process === 'undefined' || !this.processHandlersRegistered) {
352
- return;
353
- }
354
-
355
- if (this.processHandlers.sigint) {
356
- process.removeListener('SIGINT', this.processHandlers.sigint);
357
- }
358
- if (this.processHandlers.sigterm) {
359
- process.removeListener('SIGTERM', this.processHandlers.sigterm);
360
- }
361
- if (this.processHandlers.uncaughtException) {
362
- process.removeListener('uncaughtException', this.processHandlers.uncaughtException);
363
- }
364
- if (this.processHandlers.unhandledRejection) {
365
- process.removeListener('unhandledRejection', this.processHandlers.unhandledRejection);
366
- }
367
-
368
- this.processHandlers = {};
369
- this.processHandlersRegistered = false;
370
- }
371
-
372
- /**
373
- * Create a disposable wrapper for any cleanup function
374
- */
375
- static createDisposable(cleanup: () => Promise<void> | void): Disposable {
376
- return {
377
- dispose: cleanup,
378
- };
379
- }
380
- }
381
-
382
- /**
383
- * Global SDK lifecycle manager instance
384
- */
385
- export const sdkLifecycle = new SDKLifecycle();
386
-
387
- /**
388
- * Convenience function to run cleanup on shutdown
389
- *
390
- * @example
391
- * ```typescript
392
- * const cleanup = onShutdown(async () => {
393
- * await closeDatabase();
394
- * });
395
- *
396
- * // Later, to remove the handler:
397
- * cleanup();
398
- * ```
399
- */
400
- export function onShutdown(handler: ShutdownHandler): () => void {
401
- return sdkLifecycle.onShutdown(handler);
402
- }
403
-
404
- /**
405
- * Convenience function to register disposable
406
- */
407
- export function registerDisposable(disposable: Disposable): () => void {
408
- return sdkLifecycle.registerDisposable(disposable);
409
- }
410
-
411
- /**
412
- * Convenience function to shutdown SDK
413
- */
414
- export function shutdownSDK(timeout?: number): Promise<void> {
415
- return sdkLifecycle.shutdown(timeout);
416
- }
@@ -1,78 +0,0 @@
1
- /**
2
- * SecureNonce - Cryptographically secure nonce generation
3
- *
4
- * SECURITY FIX (NEW-H-3): Provides secure random nonce generation
5
- * to prevent weak randomness vulnerabilities in EIP-712 message signing.
6
- *
7
- * Reference: V7 Re-Audit NEW-H-3 (Weak Random Nonce Generation)
8
- *
9
- * @module utils/SecureNonce
10
- */
11
-
12
- import { ethers } from 'ethers';
13
-
14
- /**
15
- * Generate a cryptographically secure random nonce (bytes32)
16
- *
17
- * Uses ethers.js randomBytes() which:
18
- * - Uses Node.js crypto.randomBytes() (CSPRNG)
19
- * - Uses Web Crypto API in browsers (window.crypto.getRandomValues)
20
- * - Guaranteed to be cryptographically secure
21
- *
22
- * @returns 32-byte hex string (0x...)
23
- *
24
- * @example
25
- * ```typescript
26
- * import { generateSecureNonce } from '@agirails/sdk';
27
- *
28
- * const nonce = generateSecureNonce();
29
- * console.log(nonce); // 0x1234...abcd (64 hex chars)
30
- * ```
31
- */
32
- export function generateSecureNonce(): string {
33
- return ethers.hexlify(ethers.randomBytes(32));
34
- }
35
-
36
- /**
37
- * Validate nonce format (must be bytes32)
38
- *
39
- * @param nonce - Nonce to validate
40
- * @returns true if valid bytes32 format
41
- *
42
- * @example
43
- * ```typescript
44
- * isValidNonce('0x' + '00'.repeat(32)); // true
45
- * isValidNonce('0x1234'); // false (too short)
46
- * isValidNonce('not-hex'); // false (invalid format)
47
- * ```
48
- */
49
- export function isValidNonce(nonce: string): boolean {
50
- return /^0x[a-fA-F0-9]{64}$/.test(nonce);
51
- }
52
-
53
- /**
54
- * Generate an array of secure nonces
55
- *
56
- * @param count - Number of nonces to generate
57
- * @returns Array of bytes32 hex strings
58
- *
59
- * @example
60
- * ```typescript
61
- * const nonces = generateSecureNonces(10);
62
- * console.log(nonces.length); // 10
63
- * ```
64
- */
65
- export function generateSecureNonces(count: number): string[] {
66
- if (count <= 0) {
67
- throw new Error('Count must be positive');
68
- }
69
- if (count > 10000) {
70
- throw new Error('Count exceeds maximum allowed (10000)');
71
- }
72
-
73
- const nonces: string[] = [];
74
- for (let i = 0; i < count; i++) {
75
- nonces.push(generateSecureNonce());
76
- }
77
- return nonces;
78
- }