pay-lobster 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +401 -0
- package/README.md.bak +401 -0
- package/dist/agent.d.ts +132 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +224 -0
- package/dist/agent.js.map +1 -0
- package/dist/analytics.d.ts +120 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +345 -0
- package/dist/analytics.js.map +1 -0
- package/dist/approvals.d.ts +168 -0
- package/dist/approvals.d.ts.map +1 -0
- package/dist/approvals.js +406 -0
- package/dist/approvals.js.map +1 -0
- package/dist/circle-client.d.ts +152 -0
- package/dist/circle-client.d.ts.map +1 -0
- package/dist/circle-client.js +266 -0
- package/dist/circle-client.js.map +1 -0
- package/dist/commission.d.ts +191 -0
- package/dist/commission.d.ts.map +1 -0
- package/dist/commission.js +475 -0
- package/dist/commission.js.map +1 -0
- package/dist/condition-builder.d.ts +98 -0
- package/dist/condition-builder.d.ts.map +1 -0
- package/dist/condition-builder.js +193 -0
- package/dist/condition-builder.js.map +1 -0
- package/dist/contacts.d.ts +179 -0
- package/dist/contacts.d.ts.map +1 -0
- package/dist/contacts.js +445 -0
- package/dist/contacts.js.map +1 -0
- package/dist/easy.d.ts +22 -0
- package/dist/easy.d.ts.map +1 -0
- package/dist/easy.js +40 -0
- package/dist/easy.js.map +1 -0
- package/dist/erc8004/constants.d.ts +152 -0
- package/dist/erc8004/constants.d.ts.map +1 -0
- package/dist/erc8004/constants.js +114 -0
- package/dist/erc8004/constants.js.map +1 -0
- package/dist/erc8004/discovery.d.ts +84 -0
- package/dist/erc8004/discovery.d.ts.map +1 -0
- package/dist/erc8004/discovery.js +217 -0
- package/dist/erc8004/discovery.js.map +1 -0
- package/dist/erc8004/identity.d.ts +91 -0
- package/dist/erc8004/identity.d.ts.map +1 -0
- package/dist/erc8004/identity.js +250 -0
- package/dist/erc8004/identity.js.map +1 -0
- package/dist/erc8004/index.d.ts +147 -0
- package/dist/erc8004/index.d.ts.map +1 -0
- package/dist/erc8004/index.js +225 -0
- package/dist/erc8004/index.js.map +1 -0
- package/dist/erc8004/reputation.d.ts +133 -0
- package/dist/erc8004/reputation.d.ts.map +1 -0
- package/dist/erc8004/reputation.js +277 -0
- package/dist/erc8004/reputation.js.map +1 -0
- package/dist/escrow-templates.d.ts +38 -0
- package/dist/escrow-templates.d.ts.map +1 -0
- package/dist/escrow-templates.js +419 -0
- package/dist/escrow-templates.js.map +1 -0
- package/dist/escrow.d.ts +320 -0
- package/dist/escrow.d.ts.map +1 -0
- package/dist/escrow.js +854 -0
- package/dist/escrow.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/invoices.d.ts +212 -0
- package/dist/invoices.d.ts.map +1 -0
- package/dist/invoices.js +393 -0
- package/dist/invoices.js.map +1 -0
- package/dist/notifications.d.ts +141 -0
- package/dist/notifications.d.ts.map +1 -0
- package/dist/notifications.js +350 -0
- package/dist/notifications.js.map +1 -0
- package/dist/tips.d.ts +171 -0
- package/dist/tips.d.ts.map +1 -0
- package/dist/tips.js +390 -0
- package/dist/tips.js.map +1 -0
- package/dist/types.d.ts +100 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/x402-client.d.ts +127 -0
- package/dist/x402-client.d.ts.map +1 -0
- package/dist/x402-client.js +350 -0
- package/dist/x402-client.js.map +1 -0
- package/dist/x402-server.d.ts +133 -0
- package/dist/x402-server.d.ts.map +1 -0
- package/dist/x402-server.js +330 -0
- package/dist/x402-server.js.map +1 -0
- package/lib/agent.ts +273 -0
- package/lib/analytics.ts +474 -0
- package/lib/analytics.ts.bak +474 -0
- package/lib/approvals.ts +585 -0
- package/lib/approvals.ts.bak +585 -0
- package/lib/circle-client.ts +376 -0
- package/lib/circle-client.ts.bak +376 -0
- package/lib/commission.ts +680 -0
- package/lib/commission.ts.bak +680 -0
- package/lib/condition-builder.ts +223 -0
- package/lib/condition-builder.ts.bak +223 -0
- package/lib/contacts.ts +615 -0
- package/lib/contacts.ts.bak +615 -0
- package/lib/easy.ts +46 -0
- package/lib/easy.ts.bak +352 -0
- package/lib/erc8004/constants.ts +175 -0
- package/lib/erc8004/discovery.ts +299 -0
- package/lib/erc8004/identity.ts +327 -0
- package/lib/erc8004/index.ts +285 -0
- package/lib/erc8004/reputation.ts +368 -0
- package/lib/escrow-templates.ts +462 -0
- package/lib/escrow.ts +1216 -0
- package/lib/index.ts +13 -0
- package/lib/invoices.ts +588 -0
- package/lib/notifications.ts +484 -0
- package/lib/tips.ts +570 -0
- package/lib/types.ts +108 -0
- package/lib/x402-client.ts +471 -0
- package/lib/x402-server.ts +462 -0
- package/package.json +58 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Transaction Approval System
|
|
4
|
+
*
|
|
5
|
+
* Multi-step approval workflow for large or sensitive transactions.
|
|
6
|
+
* Integrates with Clawdbot for conversational approvals.
|
|
7
|
+
*/
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ApprovalManager = void 0;
|
|
13
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
14
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
15
|
+
const path_1 = __importDefault(require("path"));
|
|
16
|
+
const DATA_DIR = process.env.USDC_DATA_DIR || './data';
|
|
17
|
+
/**
|
|
18
|
+
* Approval Manager
|
|
19
|
+
*/
|
|
20
|
+
class ApprovalManager {
|
|
21
|
+
constructor(dataDir = DATA_DIR) {
|
|
22
|
+
this.policiesPath = path_1.default.join(dataDir, 'approval-policies.json');
|
|
23
|
+
this.pendingPath = path_1.default.join(dataDir, 'pending-transactions.json');
|
|
24
|
+
this.spendingPath = path_1.default.join(dataDir, 'daily-spending.json');
|
|
25
|
+
}
|
|
26
|
+
async loadPolicies() {
|
|
27
|
+
try {
|
|
28
|
+
const data = await promises_1.default.readFile(this.policiesPath, 'utf-8');
|
|
29
|
+
return JSON.parse(data);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async savePolicies(policies) {
|
|
36
|
+
await promises_1.default.mkdir(path_1.default.dirname(this.policiesPath), { recursive: true });
|
|
37
|
+
await promises_1.default.writeFile(this.policiesPath, JSON.stringify(policies, null, 2));
|
|
38
|
+
}
|
|
39
|
+
async loadPending() {
|
|
40
|
+
try {
|
|
41
|
+
const data = await promises_1.default.readFile(this.pendingPath, 'utf-8');
|
|
42
|
+
return JSON.parse(data);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async savePending(pending) {
|
|
49
|
+
await promises_1.default.mkdir(path_1.default.dirname(this.pendingPath), { recursive: true });
|
|
50
|
+
await promises_1.default.writeFile(this.pendingPath, JSON.stringify(pending, null, 2));
|
|
51
|
+
}
|
|
52
|
+
async loadSpending() {
|
|
53
|
+
try {
|
|
54
|
+
const data = await promises_1.default.readFile(this.spendingPath, 'utf-8');
|
|
55
|
+
return JSON.parse(data);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async saveSpending(spending) {
|
|
62
|
+
await promises_1.default.mkdir(path_1.default.dirname(this.spendingPath), { recursive: true });
|
|
63
|
+
await promises_1.default.writeFile(this.spendingPath, JSON.stringify(spending, null, 2));
|
|
64
|
+
}
|
|
65
|
+
// ============ Policy Management ============
|
|
66
|
+
/**
|
|
67
|
+
* Create approval policy
|
|
68
|
+
*/
|
|
69
|
+
async createPolicy(params) {
|
|
70
|
+
const policies = await this.loadPolicies();
|
|
71
|
+
const policy = {
|
|
72
|
+
id: crypto_1.default.randomUUID(),
|
|
73
|
+
name: params.name,
|
|
74
|
+
enabled: true,
|
|
75
|
+
conditions: params.conditions,
|
|
76
|
+
approvers: params.approvers,
|
|
77
|
+
requiredApprovals: params.requiredApprovals || 1,
|
|
78
|
+
timeout: params.timeout || 86400, // 24 hours default
|
|
79
|
+
timeoutAction: params.timeoutAction || 'cancel',
|
|
80
|
+
createdAt: new Date().toISOString(),
|
|
81
|
+
updatedAt: new Date().toISOString(),
|
|
82
|
+
};
|
|
83
|
+
policies.push(policy);
|
|
84
|
+
await this.savePolicies(policies);
|
|
85
|
+
return policy;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get active policies for a transaction
|
|
89
|
+
*/
|
|
90
|
+
async getMatchingPolicies(tx) {
|
|
91
|
+
const policies = await this.loadPolicies();
|
|
92
|
+
const spending = await this.getDailySpending(tx.walletId);
|
|
93
|
+
const matchingPolicies = [];
|
|
94
|
+
for (const policy of policies) {
|
|
95
|
+
if (!policy.enabled)
|
|
96
|
+
continue;
|
|
97
|
+
const { conditions } = policy;
|
|
98
|
+
let matches = false;
|
|
99
|
+
// Check amount threshold
|
|
100
|
+
if (conditions.minAmount && parseFloat(tx.amount) >= parseFloat(conditions.minAmount)) {
|
|
101
|
+
matches = true;
|
|
102
|
+
}
|
|
103
|
+
// Check daily limit
|
|
104
|
+
if (conditions.maxDailyLimit) {
|
|
105
|
+
const todayTotal = parseFloat(spending?.total || '0') + parseFloat(tx.amount);
|
|
106
|
+
if (todayTotal > parseFloat(conditions.maxDailyLimit)) {
|
|
107
|
+
matches = true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Check specific addresses
|
|
111
|
+
if (conditions.addresses && conditions.addresses.length > 0) {
|
|
112
|
+
if (conditions.addresses.some(a => a.toLowerCase() === tx.toAddress.toLowerCase())) {
|
|
113
|
+
matches = true;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Check chains
|
|
117
|
+
if (conditions.chains && conditions.chains.length > 0) {
|
|
118
|
+
if (conditions.chains.includes(tx.chain)) {
|
|
119
|
+
matches = true;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Always require approval
|
|
123
|
+
if (conditions.always) {
|
|
124
|
+
matches = true;
|
|
125
|
+
}
|
|
126
|
+
if (matches) {
|
|
127
|
+
matchingPolicies.push(policy);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return matchingPolicies;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* List all policies
|
|
134
|
+
*/
|
|
135
|
+
async listPolicies() {
|
|
136
|
+
return this.loadPolicies();
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Toggle policy enabled state
|
|
140
|
+
*/
|
|
141
|
+
async togglePolicy(id, enabled) {
|
|
142
|
+
const policies = await this.loadPolicies();
|
|
143
|
+
const policy = policies.find(p => p.id === id);
|
|
144
|
+
if (policy) {
|
|
145
|
+
policy.enabled = enabled;
|
|
146
|
+
policy.updatedAt = new Date().toISOString();
|
|
147
|
+
await this.savePolicies(policies);
|
|
148
|
+
}
|
|
149
|
+
return policy || null;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Delete policy
|
|
153
|
+
*/
|
|
154
|
+
async deletePolicy(id) {
|
|
155
|
+
const policies = await this.loadPolicies();
|
|
156
|
+
const index = policies.findIndex(p => p.id === id);
|
|
157
|
+
if (index >= 0) {
|
|
158
|
+
policies.splice(index, 1);
|
|
159
|
+
await this.savePolicies(policies);
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
// ============ Pending Transactions ============
|
|
165
|
+
/**
|
|
166
|
+
* Submit transaction for approval
|
|
167
|
+
*/
|
|
168
|
+
async submitForApproval(tx) {
|
|
169
|
+
// Check if approval is required
|
|
170
|
+
const policies = await this.getMatchingPolicies({
|
|
171
|
+
amount: tx.amount,
|
|
172
|
+
toAddress: tx.toAddress,
|
|
173
|
+
chain: tx.chain,
|
|
174
|
+
walletId: tx.fromWalletId,
|
|
175
|
+
});
|
|
176
|
+
// No policies match - auto-approve
|
|
177
|
+
if (policies.length === 0) {
|
|
178
|
+
return { approved: true };
|
|
179
|
+
}
|
|
180
|
+
// Use the strictest policy (most approvals required)
|
|
181
|
+
const policy = policies.reduce((strictest, p) => p.requiredApprovals > strictest.requiredApprovals ? p : strictest);
|
|
182
|
+
const pending = await this.loadPending();
|
|
183
|
+
const transaction = {
|
|
184
|
+
id: crypto_1.default.randomUUID(),
|
|
185
|
+
policyId: policy.id,
|
|
186
|
+
type: tx.type,
|
|
187
|
+
fromWalletId: tx.fromWalletId,
|
|
188
|
+
toAddress: tx.toAddress,
|
|
189
|
+
toName: tx.toName,
|
|
190
|
+
amount: tx.amount,
|
|
191
|
+
chain: tx.chain,
|
|
192
|
+
targetChain: tx.targetChain,
|
|
193
|
+
memo: tx.memo,
|
|
194
|
+
status: 'pending',
|
|
195
|
+
approvals: [],
|
|
196
|
+
requestedBy: tx.requestedBy,
|
|
197
|
+
createdAt: new Date().toISOString(),
|
|
198
|
+
expiresAt: new Date(Date.now() + policy.timeout * 1000).toISOString(),
|
|
199
|
+
};
|
|
200
|
+
pending.push(transaction);
|
|
201
|
+
await this.savePending(pending);
|
|
202
|
+
return transaction;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Approve or reject a pending transaction
|
|
206
|
+
*/
|
|
207
|
+
async decide(txId, approverId, decision, note) {
|
|
208
|
+
const pending = await this.loadPending();
|
|
209
|
+
const tx = pending.find(t => t.id === txId);
|
|
210
|
+
if (!tx || tx.status !== 'pending') {
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
// Check if already decided by this approver
|
|
214
|
+
if (tx.approvals.some(a => a.approverId === approverId)) {
|
|
215
|
+
throw new Error('Already submitted decision');
|
|
216
|
+
}
|
|
217
|
+
// Check if approver is authorized
|
|
218
|
+
const policies = await this.loadPolicies();
|
|
219
|
+
const policy = policies.find(p => p.id === tx.policyId);
|
|
220
|
+
if (!policy || !policy.approvers.includes(approverId)) {
|
|
221
|
+
throw new Error('Not authorized to approve this transaction');
|
|
222
|
+
}
|
|
223
|
+
// Record decision
|
|
224
|
+
tx.approvals.push({
|
|
225
|
+
approverId,
|
|
226
|
+
decision,
|
|
227
|
+
timestamp: new Date().toISOString(),
|
|
228
|
+
note,
|
|
229
|
+
});
|
|
230
|
+
// Check if rejected
|
|
231
|
+
if (decision === 'reject') {
|
|
232
|
+
tx.status = 'rejected';
|
|
233
|
+
tx.rejectionReason = note || 'Rejected by approver';
|
|
234
|
+
}
|
|
235
|
+
// Check if enough approvals
|
|
236
|
+
else {
|
|
237
|
+
const approvalCount = tx.approvals.filter(a => a.decision === 'approve').length;
|
|
238
|
+
if (approvalCount >= policy.requiredApprovals) {
|
|
239
|
+
tx.status = 'approved';
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
await this.savePending(pending);
|
|
243
|
+
return tx;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Mark transaction as executed
|
|
247
|
+
*/
|
|
248
|
+
async markExecuted(txId, txHash) {
|
|
249
|
+
const pending = await this.loadPending();
|
|
250
|
+
const tx = pending.find(t => t.id === txId);
|
|
251
|
+
if (tx && tx.status === 'approved') {
|
|
252
|
+
tx.status = 'executed';
|
|
253
|
+
tx.txHash = txHash;
|
|
254
|
+
tx.executedAt = new Date().toISOString();
|
|
255
|
+
// Record spending
|
|
256
|
+
await this.recordSpending(tx.fromWalletId, tx.amount, txHash);
|
|
257
|
+
await this.savePending(pending);
|
|
258
|
+
}
|
|
259
|
+
return tx || null;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Cancel a pending transaction
|
|
263
|
+
*/
|
|
264
|
+
async cancel(txId, requesterId) {
|
|
265
|
+
const pending = await this.loadPending();
|
|
266
|
+
const tx = pending.find(t => t.id === txId);
|
|
267
|
+
if (tx && tx.status === 'pending' && tx.requestedBy === requesterId) {
|
|
268
|
+
tx.status = 'cancelled';
|
|
269
|
+
await this.savePending(pending);
|
|
270
|
+
}
|
|
271
|
+
return tx || null;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Get pending transactions
|
|
275
|
+
*/
|
|
276
|
+
async getPending(options) {
|
|
277
|
+
let pending = await this.loadPending();
|
|
278
|
+
if (options?.status) {
|
|
279
|
+
pending = pending.filter(t => t.status === options.status);
|
|
280
|
+
}
|
|
281
|
+
if (options?.approverId) {
|
|
282
|
+
const policies = await this.loadPolicies();
|
|
283
|
+
const approverPolicies = policies.filter(p => p.approvers.includes(options.approverId)).map(p => p.id);
|
|
284
|
+
pending = pending.filter(t => approverPolicies.includes(t.policyId));
|
|
285
|
+
}
|
|
286
|
+
return pending.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Check and expire old transactions
|
|
290
|
+
*/
|
|
291
|
+
async processExpired() {
|
|
292
|
+
const pending = await this.loadPending();
|
|
293
|
+
const policies = await this.loadPolicies();
|
|
294
|
+
const now = new Date();
|
|
295
|
+
const expired = [];
|
|
296
|
+
for (const tx of pending) {
|
|
297
|
+
if (tx.status !== 'pending')
|
|
298
|
+
continue;
|
|
299
|
+
if (new Date(tx.expiresAt) > now)
|
|
300
|
+
continue;
|
|
301
|
+
const policy = policies.find(p => p.id === tx.policyId);
|
|
302
|
+
if (policy?.timeoutAction === 'auto-approve') {
|
|
303
|
+
tx.status = 'approved';
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
tx.status = 'expired';
|
|
307
|
+
}
|
|
308
|
+
expired.push(tx);
|
|
309
|
+
}
|
|
310
|
+
if (expired.length > 0) {
|
|
311
|
+
await this.savePending(pending);
|
|
312
|
+
}
|
|
313
|
+
return expired;
|
|
314
|
+
}
|
|
315
|
+
// ============ Daily Spending Tracking ============
|
|
316
|
+
/**
|
|
317
|
+
* Get daily spending for a wallet
|
|
318
|
+
*/
|
|
319
|
+
async getDailySpending(walletId) {
|
|
320
|
+
const spending = await this.loadSpending();
|
|
321
|
+
const today = new Date().toISOString().split('T')[0];
|
|
322
|
+
return spending.find(s => s.date === today && s.walletId === walletId) || null;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Record spending
|
|
326
|
+
*/
|
|
327
|
+
async recordSpending(walletId, amount, txHash) {
|
|
328
|
+
const spending = await this.loadSpending();
|
|
329
|
+
const today = new Date().toISOString().split('T')[0];
|
|
330
|
+
let todaySpending = spending.find(s => s.date === today && s.walletId === walletId);
|
|
331
|
+
if (!todaySpending) {
|
|
332
|
+
todaySpending = {
|
|
333
|
+
date: today,
|
|
334
|
+
walletId,
|
|
335
|
+
total: '0',
|
|
336
|
+
transactions: [],
|
|
337
|
+
};
|
|
338
|
+
spending.push(todaySpending);
|
|
339
|
+
}
|
|
340
|
+
todaySpending.total = (parseFloat(todaySpending.total) + parseFloat(amount)).toString();
|
|
341
|
+
todaySpending.transactions.push({
|
|
342
|
+
amount,
|
|
343
|
+
txHash,
|
|
344
|
+
timestamp: new Date().toISOString(),
|
|
345
|
+
});
|
|
346
|
+
// Keep only last 30 days
|
|
347
|
+
const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
|
|
348
|
+
const filtered = spending.filter(s => s.date >= thirtyDaysAgo);
|
|
349
|
+
await this.saveSpending(filtered);
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Get spending history
|
|
353
|
+
*/
|
|
354
|
+
async getSpendingHistory(walletId, days = 30) {
|
|
355
|
+
const spending = await this.loadSpending();
|
|
356
|
+
const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
|
|
357
|
+
return spending
|
|
358
|
+
.filter(s => s.walletId === walletId && s.date >= cutoff)
|
|
359
|
+
.sort((a, b) => b.date.localeCompare(a.date));
|
|
360
|
+
}
|
|
361
|
+
// ============ Helpers ============
|
|
362
|
+
/**
|
|
363
|
+
* Format pending transaction for display
|
|
364
|
+
*/
|
|
365
|
+
formatPendingTx(tx) {
|
|
366
|
+
const typeEmoji = tx.type === 'send' ? '📤' : tx.type === 'bridge' ? '🌉' : '🔄';
|
|
367
|
+
const statusEmoji = {
|
|
368
|
+
pending: '⏳',
|
|
369
|
+
approved: '✅',
|
|
370
|
+
rejected: '❌',
|
|
371
|
+
cancelled: '🚫',
|
|
372
|
+
expired: '⌛',
|
|
373
|
+
executed: '✓',
|
|
374
|
+
}[tx.status];
|
|
375
|
+
let text = `${typeEmoji} **${tx.amount} USDC** → ${tx.toName || this.shortAddress(tx.toAddress)}\n`;
|
|
376
|
+
text += `Status: ${statusEmoji} ${tx.status.toUpperCase()}\n`;
|
|
377
|
+
text += `Chain: ${tx.chain}${tx.targetChain ? ` → ${tx.targetChain}` : ''}\n`;
|
|
378
|
+
if (tx.approvals.length > 0) {
|
|
379
|
+
text += `Approvals: ${tx.approvals.filter(a => a.decision === 'approve').length}/${tx.approvals.length}\n`;
|
|
380
|
+
}
|
|
381
|
+
text += `Expires: ${new Date(tx.expiresAt).toLocaleString()}\n`;
|
|
382
|
+
if (tx.memo) {
|
|
383
|
+
text += `Memo: ${tx.memo}\n`;
|
|
384
|
+
}
|
|
385
|
+
return text;
|
|
386
|
+
}
|
|
387
|
+
shortAddress(address) {
|
|
388
|
+
return `${address.slice(0, 6)}...${address.slice(-4)}`;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Create default approval policy for new users
|
|
392
|
+
*/
|
|
393
|
+
async createDefaultPolicy(approverIds) {
|
|
394
|
+
return this.createPolicy({
|
|
395
|
+
name: 'Large Transactions (>500 USDC)',
|
|
396
|
+
conditions: { minAmount: '500' },
|
|
397
|
+
approvers: approverIds,
|
|
398
|
+
requiredApprovals: 1,
|
|
399
|
+
timeout: 86400, // 24 hours
|
|
400
|
+
timeoutAction: 'cancel',
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
exports.ApprovalManager = ApprovalManager;
|
|
405
|
+
exports.default = ApprovalManager;
|
|
406
|
+
//# sourceMappingURL=approvals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvals.js","sourceRoot":"","sources":["../lib/approvals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circle Programmable Wallets Client
|
|
3
|
+
*
|
|
4
|
+
* Wrapper around Circle's Developer-Controlled Wallets API
|
|
5
|
+
* for USDC operations on testnet.
|
|
6
|
+
*/
|
|
7
|
+
export interface CircleConfig {
|
|
8
|
+
apiKey: string;
|
|
9
|
+
entitySecret: string;
|
|
10
|
+
baseUrl?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface Wallet {
|
|
13
|
+
id: string;
|
|
14
|
+
address: string;
|
|
15
|
+
blockchain: string;
|
|
16
|
+
state: string;
|
|
17
|
+
walletSetId: string;
|
|
18
|
+
createDate: string;
|
|
19
|
+
}
|
|
20
|
+
export interface WalletSet {
|
|
21
|
+
id: string;
|
|
22
|
+
name: string;
|
|
23
|
+
custodyType: string;
|
|
24
|
+
createDate: string;
|
|
25
|
+
}
|
|
26
|
+
export interface Balance {
|
|
27
|
+
token: {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
symbol: string;
|
|
31
|
+
decimals: number;
|
|
32
|
+
blockchain: string;
|
|
33
|
+
};
|
|
34
|
+
amount: string;
|
|
35
|
+
}
|
|
36
|
+
export interface Transaction {
|
|
37
|
+
id: string;
|
|
38
|
+
state: string;
|
|
39
|
+
txHash?: string;
|
|
40
|
+
amounts: string[];
|
|
41
|
+
sourceAddress: string;
|
|
42
|
+
destinationAddress: string;
|
|
43
|
+
blockchain: string;
|
|
44
|
+
createDate: string;
|
|
45
|
+
}
|
|
46
|
+
export interface SendOptions {
|
|
47
|
+
fromWalletId: string;
|
|
48
|
+
toAddress: string;
|
|
49
|
+
amount: string;
|
|
50
|
+
tokenId?: string;
|
|
51
|
+
feeLevel?: 'LOW' | 'MEDIUM' | 'HIGH';
|
|
52
|
+
}
|
|
53
|
+
export interface BridgeOptions {
|
|
54
|
+
fromWalletId: string;
|
|
55
|
+
toAddress: string;
|
|
56
|
+
fromChain: string;
|
|
57
|
+
toChain: string;
|
|
58
|
+
amount: string;
|
|
59
|
+
}
|
|
60
|
+
export declare const USDC_TOKENS: Record<string, string>;
|
|
61
|
+
export declare const CHAIN_NAMES: Record<string, string>;
|
|
62
|
+
/**
|
|
63
|
+
* Circle Programmable Wallets Client
|
|
64
|
+
*/
|
|
65
|
+
export declare class CircleClient {
|
|
66
|
+
private apiKey;
|
|
67
|
+
private entitySecret;
|
|
68
|
+
private baseUrl;
|
|
69
|
+
constructor(config: CircleConfig);
|
|
70
|
+
/**
|
|
71
|
+
* Generate entity secret ciphertext for API calls
|
|
72
|
+
*/
|
|
73
|
+
private generateEntitySecretCiphertext;
|
|
74
|
+
/**
|
|
75
|
+
* Make authenticated API request
|
|
76
|
+
*/
|
|
77
|
+
private request;
|
|
78
|
+
/**
|
|
79
|
+
* Create a new wallet set
|
|
80
|
+
*/
|
|
81
|
+
createWalletSet(name: string): Promise<WalletSet>;
|
|
82
|
+
/**
|
|
83
|
+
* List all wallet sets
|
|
84
|
+
*/
|
|
85
|
+
listWalletSets(): Promise<WalletSet[]>;
|
|
86
|
+
/**
|
|
87
|
+
* Create wallets in a wallet set
|
|
88
|
+
*/
|
|
89
|
+
createWallets(walletSetId: string, blockchains: string[], count?: number): Promise<Wallet[]>;
|
|
90
|
+
/**
|
|
91
|
+
* Get wallet by ID
|
|
92
|
+
*/
|
|
93
|
+
getWallet(walletId: string): Promise<Wallet>;
|
|
94
|
+
/**
|
|
95
|
+
* List all wallets
|
|
96
|
+
*/
|
|
97
|
+
listWallets(): Promise<Wallet[]>;
|
|
98
|
+
/**
|
|
99
|
+
* Get token balances for a wallet
|
|
100
|
+
*/
|
|
101
|
+
getBalances(walletId: string): Promise<Balance[]>;
|
|
102
|
+
/**
|
|
103
|
+
* Get USDC balance across all wallets
|
|
104
|
+
*/
|
|
105
|
+
getAllUSDCBalances(): Promise<{
|
|
106
|
+
wallet: Wallet;
|
|
107
|
+
balance: string;
|
|
108
|
+
chain: string;
|
|
109
|
+
}[]>;
|
|
110
|
+
/**
|
|
111
|
+
* Send USDC to an address
|
|
112
|
+
*/
|
|
113
|
+
sendUSDC(options: SendOptions): Promise<Transaction>;
|
|
114
|
+
/**
|
|
115
|
+
* Get transaction by ID
|
|
116
|
+
*/
|
|
117
|
+
getTransaction(transactionId: string): Promise<Transaction>;
|
|
118
|
+
/**
|
|
119
|
+
* List recent transactions
|
|
120
|
+
*/
|
|
121
|
+
listTransactions(walletId?: string): Promise<Transaction[]>;
|
|
122
|
+
/**
|
|
123
|
+
* Bridge USDC across chains via CCTP
|
|
124
|
+
*/
|
|
125
|
+
bridgeUSDC(options: BridgeOptions): Promise<Transaction>;
|
|
126
|
+
/**
|
|
127
|
+
* Get CCTP TokenMessenger contract address for chain
|
|
128
|
+
*/
|
|
129
|
+
private getCCTPContractAddress;
|
|
130
|
+
/**
|
|
131
|
+
* Get CCTP domain ID for chain
|
|
132
|
+
*/
|
|
133
|
+
private getChainDomain;
|
|
134
|
+
/**
|
|
135
|
+
* Convert address to bytes32 format
|
|
136
|
+
*/
|
|
137
|
+
private addressToBytes32;
|
|
138
|
+
/**
|
|
139
|
+
* Format USDC amount for display
|
|
140
|
+
*/
|
|
141
|
+
static formatUSDC(amount: string): string;
|
|
142
|
+
/**
|
|
143
|
+
* Parse human-readable amount to wei
|
|
144
|
+
*/
|
|
145
|
+
static parseAmount(amount: string): string;
|
|
146
|
+
/**
|
|
147
|
+
* Validate Ethereum address
|
|
148
|
+
*/
|
|
149
|
+
static isValidAddress(address: string): boolean;
|
|
150
|
+
}
|
|
151
|
+
export default CircleClient;
|
|
152
|
+
//# sourceMappingURL=circle-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circle-client.d.ts","sourceRoot":"","sources":["../lib/circle-client.ts"],"names":[],"mappings":"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"}
|