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.
- package/README.md +405 -0
- package/dist/api/index.d.mts +321 -0
- package/dist/api/index.d.ts +321 -0
- package/dist/api/index.js +312 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/index.mjs +306 -0
- package/dist/api/index.mjs.map +1 -0
- package/dist/automation/index.d.mts +140 -0
- package/dist/automation/index.d.ts +140 -0
- package/dist/automation/index.js +331 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/automation/index.mjs +326 -0
- package/dist/automation/index.mjs.map +1 -0
- package/dist/campaigns/index.d.mts +286 -0
- package/dist/campaigns/index.d.ts +286 -0
- package/dist/campaigns/index.js +652 -0
- package/dist/campaigns/index.js.map +1 -0
- package/dist/campaigns/index.mjs +645 -0
- package/dist/campaigns/index.mjs.map +1 -0
- package/dist/claims/index.d.mts +190 -0
- package/dist/claims/index.d.ts +190 -0
- package/dist/claims/index.js +414 -0
- package/dist/claims/index.js.map +1 -0
- package/dist/claims/index.mjs +409 -0
- package/dist/claims/index.mjs.map +1 -0
- package/dist/index-BTG0TRJt.d.mts +555 -0
- package/dist/index-BTG0TRJt.d.ts +555 -0
- package/dist/index.d.mts +170 -0
- package/dist/index.d.ts +170 -0
- package/dist/index.js +2926 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2888 -0
- package/dist/index.mjs.map +1 -0
- package/dist/marketplace/index.d.mts +225 -0
- package/dist/marketplace/index.d.ts +225 -0
- package/dist/marketplace/index.js +529 -0
- package/dist/marketplace/index.js.map +1 -0
- package/dist/marketplace/index.mjs +524 -0
- package/dist/marketplace/index.mjs.map +1 -0
- package/dist/react/index.d.mts +185 -0
- package/dist/react/index.d.ts +185 -0
- package/dist/react/index.js +340 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/index.mjs +333 -0
- package/dist/react/index.mjs.map +1 -0
- package/dist/staking/index.d.mts +158 -0
- package/dist/staking/index.d.ts +158 -0
- package/dist/staking/index.js +359 -0
- package/dist/staking/index.js.map +1 -0
- package/dist/staking/index.mjs +354 -0
- package/dist/staking/index.mjs.map +1 -0
- package/package.json +106 -0
- package/src/api/index.ts +577 -0
- package/src/automation/index.ts +436 -0
- package/src/campaigns/index.ts +835 -0
- package/src/claims/index.ts +530 -0
- package/src/client.ts +518 -0
- package/src/index.ts +101 -0
- package/src/marketplace/index.ts +730 -0
- package/src/react/index.ts +498 -0
- package/src/staking/index.ts +449 -0
- 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"]}
|