pepay-streams-sdk 0.1.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 (62) hide show
  1. package/README.md +405 -0
  2. package/dist/api/index.d.mts +321 -0
  3. package/dist/api/index.d.ts +321 -0
  4. package/dist/api/index.js +312 -0
  5. package/dist/api/index.js.map +1 -0
  6. package/dist/api/index.mjs +306 -0
  7. package/dist/api/index.mjs.map +1 -0
  8. package/dist/automation/index.d.mts +140 -0
  9. package/dist/automation/index.d.ts +140 -0
  10. package/dist/automation/index.js +331 -0
  11. package/dist/automation/index.js.map +1 -0
  12. package/dist/automation/index.mjs +326 -0
  13. package/dist/automation/index.mjs.map +1 -0
  14. package/dist/campaigns/index.d.mts +286 -0
  15. package/dist/campaigns/index.d.ts +286 -0
  16. package/dist/campaigns/index.js +652 -0
  17. package/dist/campaigns/index.js.map +1 -0
  18. package/dist/campaigns/index.mjs +645 -0
  19. package/dist/campaigns/index.mjs.map +1 -0
  20. package/dist/claims/index.d.mts +190 -0
  21. package/dist/claims/index.d.ts +190 -0
  22. package/dist/claims/index.js +414 -0
  23. package/dist/claims/index.js.map +1 -0
  24. package/dist/claims/index.mjs +409 -0
  25. package/dist/claims/index.mjs.map +1 -0
  26. package/dist/index-BTG0TRJt.d.mts +555 -0
  27. package/dist/index-BTG0TRJt.d.ts +555 -0
  28. package/dist/index.d.mts +170 -0
  29. package/dist/index.d.ts +170 -0
  30. package/dist/index.js +2926 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/index.mjs +2888 -0
  33. package/dist/index.mjs.map +1 -0
  34. package/dist/marketplace/index.d.mts +225 -0
  35. package/dist/marketplace/index.d.ts +225 -0
  36. package/dist/marketplace/index.js +529 -0
  37. package/dist/marketplace/index.js.map +1 -0
  38. package/dist/marketplace/index.mjs +524 -0
  39. package/dist/marketplace/index.mjs.map +1 -0
  40. package/dist/react/index.d.mts +185 -0
  41. package/dist/react/index.d.ts +185 -0
  42. package/dist/react/index.js +340 -0
  43. package/dist/react/index.js.map +1 -0
  44. package/dist/react/index.mjs +333 -0
  45. package/dist/react/index.mjs.map +1 -0
  46. package/dist/staking/index.d.mts +158 -0
  47. package/dist/staking/index.d.ts +158 -0
  48. package/dist/staking/index.js +359 -0
  49. package/dist/staking/index.js.map +1 -0
  50. package/dist/staking/index.mjs +354 -0
  51. package/dist/staking/index.mjs.map +1 -0
  52. package/package.json +106 -0
  53. package/src/api/index.ts +577 -0
  54. package/src/automation/index.ts +436 -0
  55. package/src/campaigns/index.ts +835 -0
  56. package/src/claims/index.ts +530 -0
  57. package/src/client.ts +518 -0
  58. package/src/index.ts +101 -0
  59. package/src/marketplace/index.ts +730 -0
  60. package/src/react/index.ts +498 -0
  61. package/src/staking/index.ts +449 -0
  62. package/src/types/index.ts +631 -0
@@ -0,0 +1,331 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var diamond = require('@pepay-streams/abi/diamond');
6
+
7
+ // src/automation/index.ts
8
+ var AutomationModule = class {
9
+ constructor(publicClient, walletClient, diamondAddress) {
10
+ this.publicClient = publicClient;
11
+ this.walletClient = walletClient;
12
+ this.diamondAddress = diamondAddress;
13
+ }
14
+ // ============================================================================
15
+ // Auto-Withdraw (for Vesting campaigns)
16
+ // ============================================================================
17
+ /**
18
+ * Enable auto-withdraw for a vesting campaign
19
+ *
20
+ * Keepers will automatically claim vested tokens on behalf of recipients.
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const result = await sdk.automation.enableAutoWithdraw({
25
+ * campaignId: 1n,
26
+ * frequency: 7 * 24 * 60 * 60, // Weekly
27
+ * tipAmount: parseEther('0.1'), // 0.1 ETH for keeper
28
+ * });
29
+ * ```
30
+ */
31
+ async enableAutoWithdraw(params) {
32
+ const wallet = this.requireWallet();
33
+ const hash = await wallet.writeContract({
34
+ chain: wallet.chain,
35
+ account: wallet.account,
36
+ address: this.diamondAddress,
37
+ abi: diamond.DIAMOND_ABI,
38
+ functionName: "enableAutoWithdraw",
39
+ args: [params.campaignId, BigInt(params.frequency)],
40
+ value: params.tipAmount ?? 0n
41
+ });
42
+ return this.createTransactionResult(hash);
43
+ }
44
+ /**
45
+ * Disable auto-withdraw for a campaign
46
+ *
47
+ * Returns remaining tip balance to caller.
48
+ */
49
+ async disableAutoWithdraw(campaignId) {
50
+ const wallet = this.requireWallet();
51
+ const hash = await wallet.writeContract({
52
+ chain: wallet.chain,
53
+ account: wallet.account,
54
+ address: this.diamondAddress,
55
+ abi: diamond.DIAMOND_ABI,
56
+ functionName: "disableAutoWithdraw",
57
+ args: [campaignId]
58
+ });
59
+ return this.createTransactionResult(hash);
60
+ }
61
+ // ============================================================================
62
+ // Auto-Release (for Lock campaigns)
63
+ // ============================================================================
64
+ /**
65
+ * Enable auto-release for a lock campaign
66
+ *
67
+ * Keepers will automatically release tokens when unlock time passes.
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * const result = await sdk.automation.enableAutoRelease({
72
+ * campaignId: 5n,
73
+ * frequency: 3600, // Check every hour
74
+ * tipAmount: parseEther('0.05'), // 0.05 ETH for keeper
75
+ * });
76
+ * ```
77
+ */
78
+ async enableAutoRelease(params) {
79
+ const wallet = this.requireWallet();
80
+ const frequency = params.frequency ?? 3600;
81
+ const hash = await wallet.writeContract({
82
+ chain: wallet.chain,
83
+ account: wallet.account,
84
+ address: this.diamondAddress,
85
+ abi: diamond.DIAMOND_ABI,
86
+ functionName: "enableAutoReleaseLock",
87
+ args: [params.campaignId, BigInt(frequency)],
88
+ value: params.tipAmount ?? 0n
89
+ });
90
+ return this.createTransactionResult(hash);
91
+ }
92
+ /**
93
+ * Disable auto-release for a lock campaign
94
+ */
95
+ async disableAutoRelease(campaignId) {
96
+ const wallet = this.requireWallet();
97
+ const hash = await wallet.writeContract({
98
+ chain: wallet.chain,
99
+ account: wallet.account,
100
+ address: this.diamondAddress,
101
+ abi: diamond.DIAMOND_ABI,
102
+ functionName: "disableAutoReleaseLock",
103
+ args: [campaignId]
104
+ });
105
+ return this.createTransactionResult(hash);
106
+ }
107
+ // ============================================================================
108
+ // Automation Status Queries
109
+ // ============================================================================
110
+ /**
111
+ * Get auto-withdraw status for a campaign
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * const status = await sdk.automation.getAutoWithdrawStatus(campaignId);
116
+ * console.log('Enabled:', status.enabled);
117
+ * console.log('Next run:', new Date(status.nextRun * 1000));
118
+ * console.log('Tip balance:', formatEther(status.tipBalance));
119
+ * ```
120
+ */
121
+ async getAutoWithdrawStatus(campaignId) {
122
+ const [config, pendingCount, cursor] = await Promise.all([
123
+ this.publicClient.readContract({
124
+ address: this.diamondAddress,
125
+ abi: diamond.DIAMOND_ABI,
126
+ functionName: "automationConfig",
127
+ args: [campaignId]
128
+ }),
129
+ this.publicClient.readContract({
130
+ address: this.diamondAddress,
131
+ abi: diamond.DIAMOND_ABI,
132
+ functionName: "recipientsPending",
133
+ args: [campaignId]
134
+ }),
135
+ this.publicClient.readContract({
136
+ address: this.diamondAddress,
137
+ abi: diamond.DIAMOND_ABI,
138
+ functionName: "regCursor",
139
+ args: [campaignId]
140
+ })
141
+ ]);
142
+ const [enabled, frequency, lastRun] = config;
143
+ const nextRun = Number(lastRun) + Number(frequency);
144
+ return {
145
+ enabled,
146
+ lastRun: Number(lastRun),
147
+ nextRun,
148
+ frequency: Number(frequency),
149
+ tipBalance: 0n,
150
+ // Tip balance is managed internally
151
+ recipientsProcessed: Number(cursor),
152
+ totalRecipients: Number(pendingCount) + Number(cursor)
153
+ };
154
+ }
155
+ /**
156
+ * Get auto-release status for a lock campaign
157
+ */
158
+ async getAutoReleaseStatus(campaignId) {
159
+ const config = await this.publicClient.readContract({
160
+ address: this.diamondAddress,
161
+ abi: diamond.DIAMOND_ABI,
162
+ functionName: "automationLockConfig",
163
+ args: [campaignId]
164
+ });
165
+ const [enabled, frequency, lastRun] = config;
166
+ const nextRun = Number(lastRun) + Number(frequency);
167
+ return {
168
+ enabled,
169
+ frequency: Number(frequency),
170
+ lastRun: Number(lastRun),
171
+ nextRun
172
+ };
173
+ }
174
+ /**
175
+ * Preview automation for specific recipients
176
+ */
177
+ async previewAutomation(campaignId, recipients) {
178
+ const result = await this.publicClient.readContract({
179
+ address: this.diamondAddress,
180
+ abi: diamond.DIAMOND_ABI,
181
+ functionName: "automationPreviewFor",
182
+ args: [campaignId, recipients]
183
+ });
184
+ return {
185
+ pendingCount: result[0],
186
+ nextFeeWei: result[1],
187
+ escrowWei: result[2]
188
+ };
189
+ }
190
+ /**
191
+ * Get automation run statistics
192
+ */
193
+ async getAutomationStats(campaignId, lockMode = false) {
194
+ const result = await this.publicClient.readContract({
195
+ address: this.diamondAddress,
196
+ abi: diamond.DIAMOND_ABI,
197
+ functionName: "automationRunStats",
198
+ args: [campaignId, lockMode]
199
+ });
200
+ return {
201
+ runsObserved: Number(result.runsObserved),
202
+ avgRecipientsPerRun: Number(result.avgRecipientsPerRun),
203
+ lastRecipientsProcessed: Number(result.lastRecipientsProcessed),
204
+ maxRecipientsPerRun: Number(result.maxRecipientsPerRun)
205
+ };
206
+ }
207
+ /**
208
+ * Check if auto-withdraw is currently runnable
209
+ *
210
+ * Returns true if cooldown has passed and there are pending recipients.
211
+ */
212
+ async isAutoWithdrawRunnable(campaignId) {
213
+ const status = await this.getAutoWithdrawStatus(campaignId);
214
+ const now = Math.floor(Date.now() / 1e3);
215
+ return status.enabled && now >= status.nextRun && status.recipientsProcessed < status.totalRecipients;
216
+ }
217
+ /**
218
+ * Check if auto-release is currently runnable
219
+ */
220
+ async isAutoReleaseRunnable(campaignId) {
221
+ const status = await this.getAutoReleaseStatus(campaignId);
222
+ const now = Math.floor(Date.now() / 1e3);
223
+ return status.enabled && now >= status.nextRun;
224
+ }
225
+ // ============================================================================
226
+ // Keeper Functions (for automation operators)
227
+ // ============================================================================
228
+ /**
229
+ * Execute auto-withdraw for specific recipients (keeper only)
230
+ *
231
+ * @example
232
+ * ```typescript
233
+ * // Get recipients from registry or external source
234
+ * const recipients = ['0x...', '0x...', '0x...'];
235
+ * await sdk.automation.executeAutoWithdraw(campaignId, recipients);
236
+ * ```
237
+ */
238
+ async executeAutoWithdraw(campaignId, recipients) {
239
+ const wallet = this.requireWallet();
240
+ const hash = await wallet.writeContract({
241
+ chain: wallet.chain,
242
+ account: wallet.account,
243
+ address: this.diamondAddress,
244
+ abi: diamond.DIAMOND_ABI,
245
+ functionName: "autoWithdraw",
246
+ args: [campaignId, recipients]
247
+ });
248
+ return this.createTransactionResult(hash);
249
+ }
250
+ /**
251
+ * Execute auto-withdraw using registry cursor (keeper only)
252
+ *
253
+ * Processes up to batchSize recipients from the registry.
254
+ */
255
+ async executeAutoWithdrawNext(campaignId, batchSize = 50) {
256
+ const wallet = this.requireWallet();
257
+ const hash = await wallet.writeContract({
258
+ chain: wallet.chain,
259
+ account: wallet.account,
260
+ address: this.diamondAddress,
261
+ abi: diamond.DIAMOND_ABI,
262
+ functionName: "autoWithdrawNext",
263
+ args: [campaignId, BigInt(batchSize)]
264
+ });
265
+ return this.createTransactionResult(hash);
266
+ }
267
+ /**
268
+ * Execute auto-release for specific recipients (keeper only)
269
+ */
270
+ async executeAutoRelease(campaignId, recipients) {
271
+ const wallet = this.requireWallet();
272
+ const hash = await wallet.writeContract({
273
+ chain: wallet.chain,
274
+ account: wallet.account,
275
+ address: this.diamondAddress,
276
+ abi: diamond.DIAMOND_ABI,
277
+ functionName: "autoReleaseLock",
278
+ args: [campaignId, recipients]
279
+ });
280
+ return this.createTransactionResult(hash);
281
+ }
282
+ /**
283
+ * Execute auto-release using registry cursor (keeper only)
284
+ */
285
+ async executeAutoReleaseNext(campaignId, batchSize = 50) {
286
+ const wallet = this.requireWallet();
287
+ const hash = await wallet.writeContract({
288
+ chain: wallet.chain,
289
+ account: wallet.account,
290
+ address: this.diamondAddress,
291
+ abi: diamond.DIAMOND_ABI,
292
+ functionName: "autoReleaseLockNext",
293
+ args: [campaignId, BigInt(batchSize)]
294
+ });
295
+ return this.createTransactionResult(hash);
296
+ }
297
+ // ============================================================================
298
+ // Helpers
299
+ // ============================================================================
300
+ requireWallet() {
301
+ if (!this.walletClient) {
302
+ throw new Error(
303
+ "Wallet client required for write operations. Initialize SDK with a signer."
304
+ );
305
+ }
306
+ return this.walletClient;
307
+ }
308
+ createTransactionResult(hash) {
309
+ return {
310
+ hash,
311
+ wait: async () => {
312
+ const receipt = await this.publicClient.waitForTransactionReceipt({
313
+ hash
314
+ });
315
+ return {
316
+ blockNumber: receipt.blockNumber,
317
+ transactionHash: receipt.transactionHash,
318
+ gasUsed: receipt.gasUsed,
319
+ status: receipt.status,
320
+ logs: receipt.logs
321
+ };
322
+ }
323
+ };
324
+ }
325
+ };
326
+ var automation_default = AutomationModule;
327
+
328
+ exports.AutomationModule = AutomationModule;
329
+ exports.default = automation_default;
330
+ //# sourceMappingURL=index.js.map
331
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/automation/index.ts"],"names":["DIAMOND_ABI"],"mappings":"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","file":"index.js","sourcesContent":["/**\r\n * Automation Module\r\n *\r\n * Provides methods for keeper automation:\r\n * - Enable/disable auto-withdraw for vesting campaigns\r\n * - Enable/disable auto-release for locks\r\n * - Query automation status\r\n */\r\nimport {\r\n type PublicClient,\r\n type WalletClient,\r\n type Address,\r\n type Hash,\r\n} from 'viem';\r\nimport { DIAMOND_ABI } from '@pepay-streams/abi/diamond';\r\nimport type {\r\n EnableAutoWithdrawParams,\r\n EnableAutoReleaseParams,\r\n AutomationStatus,\r\n TransactionResult,\r\n} from '../types';\r\n\r\n/**\r\n * Automation module for keeper-powered operations\r\n */\r\nexport class AutomationModule {\r\n constructor(\r\n private readonly publicClient: PublicClient,\r\n private readonly walletClient: WalletClient | undefined,\r\n private readonly diamondAddress: Address\r\n ) {}\r\n\r\n // ============================================================================\r\n // Auto-Withdraw (for Vesting campaigns)\r\n // ============================================================================\r\n\r\n /**\r\n * Enable auto-withdraw for a vesting campaign\r\n *\r\n * Keepers will automatically claim vested tokens on behalf of recipients.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.automation.enableAutoWithdraw({\r\n * campaignId: 1n,\r\n * frequency: 7 * 24 * 60 * 60, // Weekly\r\n * tipAmount: parseEther('0.1'), // 0.1 ETH for keeper\r\n * });\r\n * ```\r\n */\r\n async enableAutoWithdraw(\r\n params: EnableAutoWithdrawParams\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'enableAutoWithdraw',\r\n args: [params.campaignId, BigInt(params.frequency)],\r\n value: params.tipAmount ?? 0n,\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Disable auto-withdraw for a campaign\r\n *\r\n * Returns remaining tip balance to caller.\r\n */\r\n async disableAutoWithdraw(campaignId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'disableAutoWithdraw',\r\n args: [campaignId],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Auto-Release (for Lock campaigns)\r\n // ============================================================================\r\n\r\n /**\r\n * Enable auto-release for a lock campaign\r\n *\r\n * Keepers will automatically release tokens when unlock time passes.\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await sdk.automation.enableAutoRelease({\r\n * campaignId: 5n,\r\n * frequency: 3600, // Check every hour\r\n * tipAmount: parseEther('0.05'), // 0.05 ETH for keeper\r\n * });\r\n * ```\r\n */\r\n async enableAutoRelease(\r\n params: EnableAutoReleaseParams & { frequency?: number }\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n // Default frequency of 1 hour if not specified\r\n const frequency = params.frequency ?? 3600;\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'enableAutoReleaseLock',\r\n args: [params.campaignId, BigInt(frequency)],\r\n value: params.tipAmount ?? 0n,\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Disable auto-release for a lock campaign\r\n */\r\n async disableAutoRelease(campaignId: bigint): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'disableAutoReleaseLock',\r\n args: [campaignId],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Automation Status Queries\r\n // ============================================================================\r\n\r\n /**\r\n * Get auto-withdraw status for a campaign\r\n *\r\n * @example\r\n * ```typescript\r\n * const status = await sdk.automation.getAutoWithdrawStatus(campaignId);\r\n * console.log('Enabled:', status.enabled);\r\n * console.log('Next run:', new Date(status.nextRun * 1000));\r\n * console.log('Tip balance:', formatEther(status.tipBalance));\r\n * ```\r\n */\r\n async getAutoWithdrawStatus(campaignId: bigint): Promise<AutomationStatus> {\r\n const [config, pendingCount, cursor] = await Promise.all([\r\n this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'automationConfig',\r\n args: [campaignId],\r\n }) as Promise<[boolean, bigint, bigint]>,\r\n this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'recipientsPending',\r\n args: [campaignId],\r\n }) as Promise<bigint>,\r\n this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'regCursor',\r\n args: [campaignId],\r\n }) as Promise<bigint>,\r\n ]);\r\n\r\n const [enabled, frequency, lastRun] = config;\r\n const nextRun = Number(lastRun) + Number(frequency);\r\n\r\n return {\r\n enabled,\r\n lastRun: Number(lastRun),\r\n nextRun,\r\n frequency: Number(frequency),\r\n tipBalance: 0n, // Tip balance is managed internally\r\n recipientsProcessed: Number(cursor),\r\n totalRecipients: Number(pendingCount) + Number(cursor),\r\n };\r\n }\r\n\r\n /**\r\n * Get auto-release status for a lock campaign\r\n */\r\n async getAutoReleaseStatus(campaignId: bigint): Promise<{\r\n enabled: boolean;\r\n frequency: number;\r\n lastRun: number;\r\n nextRun: number;\r\n }> {\r\n const config = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'automationLockConfig',\r\n args: [campaignId],\r\n }) as [boolean, bigint, bigint];\r\n\r\n const [enabled, frequency, lastRun] = config;\r\n const nextRun = Number(lastRun) + Number(frequency);\r\n\r\n return {\r\n enabled,\r\n frequency: Number(frequency),\r\n lastRun: Number(lastRun),\r\n nextRun,\r\n };\r\n }\r\n\r\n /**\r\n * Preview automation for specific recipients\r\n */\r\n async previewAutomation(\r\n campaignId: bigint,\r\n recipients: Address[]\r\n ): Promise<{\r\n pendingCount: bigint;\r\n nextFeeWei: bigint;\r\n escrowWei: bigint;\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'automationPreviewFor',\r\n args: [campaignId, recipients],\r\n }) as [bigint, bigint, bigint];\r\n\r\n return {\r\n pendingCount: result[0],\r\n nextFeeWei: result[1],\r\n escrowWei: result[2],\r\n };\r\n }\r\n\r\n /**\r\n * Get automation run statistics\r\n */\r\n async getAutomationStats(\r\n campaignId: bigint,\r\n lockMode = false\r\n ): Promise<{\r\n runsObserved: number;\r\n avgRecipientsPerRun: number;\r\n lastRecipientsProcessed: number;\r\n maxRecipientsPerRun: number;\r\n }> {\r\n const result = await this.publicClient.readContract({\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'automationRunStats',\r\n args: [campaignId, lockMode],\r\n }) as {\r\n runsObserved: bigint;\r\n avgRecipientsPerRun: bigint;\r\n lastRecipientsProcessed: bigint;\r\n maxRecipientsPerRun: bigint;\r\n };\r\n\r\n return {\r\n runsObserved: Number(result.runsObserved),\r\n avgRecipientsPerRun: Number(result.avgRecipientsPerRun),\r\n lastRecipientsProcessed: Number(result.lastRecipientsProcessed),\r\n maxRecipientsPerRun: Number(result.maxRecipientsPerRun),\r\n };\r\n }\r\n\r\n /**\r\n * Check if auto-withdraw is currently runnable\r\n *\r\n * Returns true if cooldown has passed and there are pending recipients.\r\n */\r\n async isAutoWithdrawRunnable(campaignId: bigint): Promise<boolean> {\r\n const status = await this.getAutoWithdrawStatus(campaignId);\r\n const now = Math.floor(Date.now() / 1000);\r\n\r\n return (\r\n status.enabled &&\r\n now >= status.nextRun &&\r\n status.recipientsProcessed < status.totalRecipients\r\n );\r\n }\r\n\r\n /**\r\n * Check if auto-release is currently runnable\r\n */\r\n async isAutoReleaseRunnable(campaignId: bigint): Promise<boolean> {\r\n const status = await this.getAutoReleaseStatus(campaignId);\r\n const now = Math.floor(Date.now() / 1000);\r\n\r\n return status.enabled && now >= status.nextRun;\r\n }\r\n\r\n // ============================================================================\r\n // Keeper Functions (for automation operators)\r\n // ============================================================================\r\n\r\n /**\r\n * Execute auto-withdraw for specific recipients (keeper only)\r\n *\r\n * @example\r\n * ```typescript\r\n * // Get recipients from registry or external source\r\n * const recipients = ['0x...', '0x...', '0x...'];\r\n * await sdk.automation.executeAutoWithdraw(campaignId, recipients);\r\n * ```\r\n */\r\n async executeAutoWithdraw(\r\n campaignId: bigint,\r\n recipients: Address[]\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'autoWithdraw',\r\n args: [campaignId, recipients],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Execute auto-withdraw using registry cursor (keeper only)\r\n *\r\n * Processes up to batchSize recipients from the registry.\r\n */\r\n async executeAutoWithdrawNext(\r\n campaignId: bigint,\r\n batchSize = 50\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'autoWithdrawNext',\r\n args: [campaignId, BigInt(batchSize)],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Execute auto-release for specific recipients (keeper only)\r\n */\r\n async executeAutoRelease(\r\n campaignId: bigint,\r\n recipients: Address[]\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'autoReleaseLock',\r\n args: [campaignId, recipients],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n /**\r\n * Execute auto-release using registry cursor (keeper only)\r\n */\r\n async executeAutoReleaseNext(\r\n campaignId: bigint,\r\n batchSize = 50\r\n ): Promise<TransactionResult> {\r\n const wallet = this.requireWallet();\r\n\r\n const hash = await wallet.writeContract({\r\n chain: wallet.chain,\r\n account: wallet.account!,\r\n address: this.diamondAddress,\r\n abi: DIAMOND_ABI,\r\n functionName: 'autoReleaseLockNext',\r\n args: [campaignId, BigInt(batchSize)],\r\n });\r\n\r\n return this.createTransactionResult(hash);\r\n }\r\n\r\n // ============================================================================\r\n // Helpers\r\n // ============================================================================\r\n\r\n private requireWallet(): WalletClient {\r\n if (!this.walletClient) {\r\n throw new Error(\r\n 'Wallet client required for write operations. Initialize SDK with a signer.'\r\n );\r\n }\r\n return this.walletClient;\r\n }\r\n\r\n private createTransactionResult(hash: Hash): TransactionResult {\r\n return {\r\n hash,\r\n wait: async () => {\r\n const receipt = await this.publicClient.waitForTransactionReceipt({\r\n hash,\r\n });\r\n return {\r\n blockNumber: receipt.blockNumber,\r\n transactionHash: receipt.transactionHash,\r\n gasUsed: receipt.gasUsed,\r\n status: receipt.status,\r\n logs: receipt.logs,\r\n };\r\n },\r\n };\r\n }\r\n}\r\n\r\nexport default AutomationModule;\r\n"]}