@edge-protocol/sdk 0.4.6 → 0.5.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/DOCS.md +777 -0
- package/dist/core/EdgePass.d.ts +89 -0
- package/dist/core/EdgePass.d.ts.map +1 -1
- package/dist/core/EdgePass.js +104 -2
- package/dist/core/EdgePass.js.map +1 -1
- package/dist/test.js +100 -0
- package/dist/test.js.map +1 -1
- package/package.json +1 -1
package/DOCS.md
ADDED
|
@@ -0,0 +1,777 @@
|
|
|
1
|
+
# @edge-protocol/sdk — Full Developer Reference
|
|
2
|
+
|
|
3
|
+
> Programmable trust infrastructure for autonomous AI agents on Sui.
|
|
4
|
+
> Give agents your rules, not your keys.
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
pnpm add @edge-protocol/sdk
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Table of Contents
|
|
13
|
+
|
|
14
|
+
- [Core Concepts](#core-concepts)
|
|
15
|
+
- [Installation](#installation)
|
|
16
|
+
- [EdgePass API](#edgepass-api)
|
|
17
|
+
- [Templates](#templates)
|
|
18
|
+
- [PolicyEngine](#policyengine)
|
|
19
|
+
- [Types](#types)
|
|
20
|
+
- [Constants](#constants)
|
|
21
|
+
- [Integration Examples](#integration-examples)
|
|
22
|
+
- [Error Handling](#error-handling)
|
|
23
|
+
- [Architecture](#architecture)
|
|
24
|
+
- [Move Contract](#move-contract)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Core Concepts
|
|
29
|
+
|
|
30
|
+
### The Problem
|
|
31
|
+
|
|
32
|
+
Every developer building an autonomous agent faces the same unsolved problem:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
Option A: Give the agent full wallet access → catastrophic risk
|
|
36
|
+
Option B: Human approves every transaction → defeats the purpose
|
|
37
|
+
Option C: Build custom policy logic → 6-8 weeks of work
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**EdgePass is Option D** — a programmable trust boundary enforced on-chain.
|
|
41
|
+
|
|
42
|
+
### EdgePass
|
|
43
|
+
|
|
44
|
+
An EdgePass is a Sui Move object that encodes a complete trust policy. It lives in the user's wallet — not in a contract. An agent executes against it without ever taking ownership.
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
budget: $300 · auto-approve: <$50 · escalate: >$100 · merchants: [...] · expiry: 48h
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Transaction Outcomes
|
|
51
|
+
|
|
52
|
+
Every `sdk.execute()` returns one of three outcomes:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
✅ approved — executed on-chain, digest available
|
|
56
|
+
⚠️ escalated — exceeds threshold, needs user approval
|
|
57
|
+
🚫 blocked — policy rejected, reason provided
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### MIST
|
|
61
|
+
|
|
62
|
+
All amounts are in MIST — Sui's base unit.
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
1 SUI = 1_000_000_000 MIST
|
|
66
|
+
|
|
67
|
+
import { MIST_PER_SUI } from '@edge-protocol/sdk';
|
|
68
|
+
|
|
69
|
+
const budget = 300n * MIST_PER_SUI; // 300 SUI
|
|
70
|
+
const amount = 18_500_000_000n; // 18.5 SUI
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Installation
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npm install @edge-protocol/sdk
|
|
79
|
+
# or
|
|
80
|
+
pnpm add @edge-protocol/sdk
|
|
81
|
+
# or
|
|
82
|
+
yarn add @edge-protocol/sdk
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Requirements
|
|
86
|
+
|
|
87
|
+
- Node.js 18+
|
|
88
|
+
- TypeScript 5.0+ (recommended)
|
|
89
|
+
- A Sui network (testnet or mainnet)
|
|
90
|
+
- An Enoki API key for gas sponsorship
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## EdgePass API
|
|
95
|
+
|
|
96
|
+
### `new EdgePass(config)`
|
|
97
|
+
|
|
98
|
+
Initialize the SDK client.
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
import { EdgePass } from '@edge-protocol/sdk';
|
|
102
|
+
|
|
103
|
+
const sdk = new EdgePass({
|
|
104
|
+
network: 'mainnet', // 'mainnet' | 'testnet' | 'devnet'
|
|
105
|
+
enokiApiKey: 'YOUR_KEY',
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
### `sdk.create(config, signer)` → `Promise<EdgePassObject>`
|
|
112
|
+
|
|
113
|
+
Mint a new EdgePass as a Move object on Sui.
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
import { EdgePass, MIST_PER_SUI } from '@edge-protocol/sdk';
|
|
117
|
+
|
|
118
|
+
const pass = await sdk.create({
|
|
119
|
+
budget: 300n * MIST_PER_SUI, // total spend limit
|
|
120
|
+
autoThreshold: 50n * MIST_PER_SUI, // auto-approve below this
|
|
121
|
+
escalateThreshold: 100n * MIST_PER_SUI, // escalate above this
|
|
122
|
+
maxPerTransaction: 200n * MIST_PER_SUI, // optional hard cap per tx
|
|
123
|
+
approvedMerchants: ['Shuttle Express', 'Hydra Bar'],
|
|
124
|
+
expiryMs: 48 * 60 * 60 * 1000, // 48 hours
|
|
125
|
+
owner: userAddress,
|
|
126
|
+
}, signer);
|
|
127
|
+
|
|
128
|
+
console.log(pass.id); // Sui object ID — verifiable on Suiscan
|
|
129
|
+
console.log(pass.expiresAt); // Unix timestamp
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Parameters:**
|
|
133
|
+
|
|
134
|
+
| Field | Type | Required | Description |
|
|
135
|
+
|-------|------|----------|-------------|
|
|
136
|
+
| `budget` | `bigint` | ✅ | Total spend limit in MIST |
|
|
137
|
+
| `autoThreshold` | `bigint` | ✅ | Auto-approve below this amount |
|
|
138
|
+
| `escalateThreshold` | `bigint` | ✅ | Escalate above this amount |
|
|
139
|
+
| `maxPerTransaction` | `bigint` | ❌ | Hard cap per single transaction |
|
|
140
|
+
| `approvedMerchants` | `string[]` | ✅ | Allowlist of merchant identifiers |
|
|
141
|
+
| `expiryMs` | `number` | ✅ | Duration until expiry in milliseconds |
|
|
142
|
+
| `owner` | `string` | ✅ | Sui address of the pass owner |
|
|
143
|
+
|
|
144
|
+
**Constraint:** `autoThreshold < escalateThreshold < budget`
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
### `EdgePass.fromTemplate(template, overrides)` → `EdgePassConfig`
|
|
149
|
+
|
|
150
|
+
Create a config from a pre-built template. Override any field.
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
// Use a template as-is
|
|
154
|
+
const config = EdgePass.fromTemplate('festival', { owner: userAddress });
|
|
155
|
+
|
|
156
|
+
// Override specific fields
|
|
157
|
+
const config = EdgePass.fromTemplate('defi', {
|
|
158
|
+
budget: 25_000n * MIST_PER_SUI,
|
|
159
|
+
approvedMerchants: ['DeepBook', 'Cetus', 'Turbos'],
|
|
160
|
+
owner: userAddress,
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
const pass = await sdk.create(config, signer);
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
### `sdk.execute(pass, request, signer)` → `Promise<TransactionOutcome>`
|
|
169
|
+
|
|
170
|
+
Execute a transaction against an EdgePass. Policy is validated before touching the chain — blocked and escalated transactions never reach Sui.
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
const outcome = await sdk.execute(pass, {
|
|
174
|
+
merchant: 'Shuttle Express',
|
|
175
|
+
amount: 18_500_000_000n, // 18.5 SUI in MIST
|
|
176
|
+
}, signer);
|
|
177
|
+
|
|
178
|
+
switch (outcome.status) {
|
|
179
|
+
case 'approved':
|
|
180
|
+
console.log('tx digest:', outcome.digest);
|
|
181
|
+
// audit receipt written to Walrus automatically
|
|
182
|
+
break;
|
|
183
|
+
|
|
184
|
+
case 'escalated':
|
|
185
|
+
// notify user — outcome.reason explains why
|
|
186
|
+
await sendPushNotification(outcome.reason);
|
|
187
|
+
// re-execute after user approves
|
|
188
|
+
break;
|
|
189
|
+
|
|
190
|
+
case 'blocked':
|
|
191
|
+
// policy rejected — outcome.reason explains why
|
|
192
|
+
console.log('blocked:', outcome.reason);
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
### `sdk.validate(pass, request)` → `PolicyValidation`
|
|
200
|
+
|
|
201
|
+
Preview the outcome without executing. Zero network calls. Sub-millisecond. Use for UI previews before execution.
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
const preview = sdk.validate(pass, {
|
|
205
|
+
merchant: 'Shuttle Express',
|
|
206
|
+
amount: 18_500_000_000n,
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// { allowed: true, requiresEscalation: false, reason: 'Auto-approved' }
|
|
210
|
+
// { allowed: true, requiresEscalation: true, reason: 'Amount exceeds escalation threshold...' }
|
|
211
|
+
// { allowed: false, requiresEscalation: false, reason: 'Merchant "X" is not approved' }
|
|
212
|
+
|
|
213
|
+
if (!preview.allowed) {
|
|
214
|
+
showBlockedUI(preview.reason);
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
if (preview.requiresEscalation) {
|
|
219
|
+
showEscalationUI(preview.reason);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Safe to execute
|
|
224
|
+
const outcome = await sdk.execute(pass, request, signer);
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
### `sdk.revoke(pass, signer)` → `Promise<{ digest: string }>`
|
|
230
|
+
|
|
231
|
+
Revoke an EdgePass on-chain. All future `execute()` calls return `blocked` immediately.
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
const { digest } = await sdk.revoke(pass, signer);
|
|
235
|
+
console.log('revoked:', digest);
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
### `sdk.fetch(objectId)` → `Promise<EdgePassObject | null>`
|
|
241
|
+
|
|
242
|
+
Fetch a live EdgePass from the Sui network.
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
const pass = await sdk.fetch('0x4e2f...8b91');
|
|
246
|
+
|
|
247
|
+
if (!pass) {
|
|
248
|
+
console.log('EdgePass not found');
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const remaining = sdk.remainingBudget(pass);
|
|
253
|
+
console.log('remaining:', remaining);
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
### `sdk.remainingBudget(pass)` → `bigint`
|
|
259
|
+
|
|
260
|
+
Returns remaining budget in MIST.
|
|
261
|
+
|
|
262
|
+
```typescript
|
|
263
|
+
const remaining = sdk.remainingBudget(pass);
|
|
264
|
+
const remainingSUI = Number(remaining) / Number(MIST_PER_SUI);
|
|
265
|
+
console.log(`$${remainingSUI.toFixed(2)} remaining`);
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
### `sdk.isValid(pass)` → `boolean`
|
|
271
|
+
|
|
272
|
+
Returns `true` if the pass is active and not expired.
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
if (!sdk.isValid(pass)) {
|
|
276
|
+
// create a new pass
|
|
277
|
+
pass = await sdk.create(config, signer);
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## Templates
|
|
284
|
+
|
|
285
|
+
Pre-configured trust boundaries for common use cases. Every template is a starting point — override any field.
|
|
286
|
+
|
|
287
|
+
```typescript
|
|
288
|
+
import { EdgePass, EDGE_TEMPLATES } from '@edge-protocol/sdk';
|
|
289
|
+
|
|
290
|
+
// Available templates
|
|
291
|
+
EdgePass.fromTemplate('festival', { owner }) // $300 / 48h
|
|
292
|
+
EdgePass.fromTemplate('gaming', { owner }) // $50 / 4h session
|
|
293
|
+
EdgePass.fromTemplate('subscription', { owner }) // $200 / 30 days
|
|
294
|
+
EdgePass.fromTemplate('defi', { owner }) // $10k / 7 days
|
|
295
|
+
EdgePass.fromTemplate('enterprise', { owner }) // $50k / 30 days
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Template defaults
|
|
299
|
+
|
|
300
|
+
| Template | Budget | Auto ≤ | Escalate ≥ | Max/tx | Expiry |
|
|
301
|
+
|----------|--------|--------|------------|--------|--------|
|
|
302
|
+
| `festival` | 300 SUI | 50 SUI | 100 SUI | 200 SUI | 48h |
|
|
303
|
+
| `gaming` | 50 SUI | 2 SUI | 10 SUI | 10 SUI | 4h |
|
|
304
|
+
| `subscription` | 200 SUI | 20 SUI | 50 SUI | 50 SUI | 30d |
|
|
305
|
+
| `defi` | 10,000 SUI | 500 SUI | 1,000 SUI | 2,000 SUI | 7d |
|
|
306
|
+
| `enterprise` | 50,000 SUI | 1,000 SUI | 5,000 SUI | 10,000 SUI | 30d |
|
|
307
|
+
|
|
308
|
+
### Accessing raw template values
|
|
309
|
+
|
|
310
|
+
```typescript
|
|
311
|
+
import { EDGE_TEMPLATES } from '@edge-protocol/sdk';
|
|
312
|
+
|
|
313
|
+
console.log(EDGE_TEMPLATES.festival.budget); // 300_000_000_000n
|
|
314
|
+
console.log(EDGE_TEMPLATES.defi.escalateThreshold); // 1_000_000_000_000n
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## PolicyEngine
|
|
320
|
+
|
|
321
|
+
Access the policy engine directly for custom validation flows.
|
|
322
|
+
|
|
323
|
+
```typescript
|
|
324
|
+
import { PolicyEngine } from '@edge-protocol/sdk';
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### `PolicyEngine.validate(pass, request)` → `PolicyValidation`
|
|
328
|
+
|
|
329
|
+
Validates a transaction request. Same logic used internally by `sdk.execute()`.
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
const validation = PolicyEngine.validate(pass, {
|
|
333
|
+
merchant: 'Shuttle Express',
|
|
334
|
+
amount: 18_500_000_000n,
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
// validation.allowed → boolean
|
|
338
|
+
// validation.requiresEscalation → boolean
|
|
339
|
+
// validation.reason → string
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
**Validation rules (in order):**
|
|
343
|
+
|
|
344
|
+
1. Pass must be active
|
|
345
|
+
2. Pass must not be expired
|
|
346
|
+
3. Merchant must be in `approvedMerchants`
|
|
347
|
+
4. Amount must not exceed remaining budget
|
|
348
|
+
5. Amount must not exceed `maxPerTransaction` (if set)
|
|
349
|
+
6. If amount > `escalateThreshold` → escalate
|
|
350
|
+
7. If amount ≤ `autoThreshold` → auto-approve
|
|
351
|
+
|
|
352
|
+
### `PolicyEngine.isValid(pass)` → `boolean`
|
|
353
|
+
|
|
354
|
+
```typescript
|
|
355
|
+
const valid = PolicyEngine.isValid(pass);
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
### `PolicyEngine.remainingBudget(pass)` → `bigint`
|
|
359
|
+
|
|
360
|
+
```typescript
|
|
361
|
+
const remaining = PolicyEngine.remainingBudget(pass);
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
## Types
|
|
367
|
+
|
|
368
|
+
```typescript
|
|
369
|
+
import type {
|
|
370
|
+
EdgePassConfig,
|
|
371
|
+
EdgePassObject,
|
|
372
|
+
TransactionRequest,
|
|
373
|
+
TransactionOutcome,
|
|
374
|
+
PolicyValidation,
|
|
375
|
+
Network,
|
|
376
|
+
EdgeSDKConfig,
|
|
377
|
+
EdgePassTemplate,
|
|
378
|
+
} from '@edge-protocol/sdk';
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### `EdgePassConfig`
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
interface EdgePassConfig {
|
|
385
|
+
budget: bigint; // total spend limit in MIST
|
|
386
|
+
autoThreshold: bigint; // auto-approve below this
|
|
387
|
+
escalateThreshold: bigint; // escalate above this
|
|
388
|
+
maxPerTransaction?: bigint; // optional hard cap per tx
|
|
389
|
+
approvedMerchants: string[]; // merchant allowlist
|
|
390
|
+
expiryMs: number; // duration in milliseconds
|
|
391
|
+
owner: string; // Sui address
|
|
392
|
+
}
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### `EdgePassObject`
|
|
396
|
+
|
|
397
|
+
```typescript
|
|
398
|
+
interface EdgePassObject {
|
|
399
|
+
id: string; // Sui object ID
|
|
400
|
+
config: EdgePassConfig;
|
|
401
|
+
spent: bigint; // total spent so far in MIST
|
|
402
|
+
active: boolean;
|
|
403
|
+
createdAt: number; // Unix timestamp
|
|
404
|
+
expiresAt: number; // Unix timestamp
|
|
405
|
+
}
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### `TransactionRequest`
|
|
409
|
+
|
|
410
|
+
```typescript
|
|
411
|
+
interface TransactionRequest {
|
|
412
|
+
merchant: string; // merchant identifier
|
|
413
|
+
amount: bigint; // amount in MIST
|
|
414
|
+
metadata?: Record<string, string>; // optional metadata
|
|
415
|
+
}
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
### `TransactionOutcome`
|
|
419
|
+
|
|
420
|
+
```typescript
|
|
421
|
+
type TransactionOutcome =
|
|
422
|
+
| { status: 'approved'; digest: string; objectId?: string; auto: true }
|
|
423
|
+
| { status: 'escalated'; reason: string; auto: false }
|
|
424
|
+
| { status: 'blocked'; reason: string; auto: false };
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
### `PolicyValidation`
|
|
428
|
+
|
|
429
|
+
```typescript
|
|
430
|
+
interface PolicyValidation {
|
|
431
|
+
allowed: boolean;
|
|
432
|
+
requiresEscalation: boolean;
|
|
433
|
+
reason: string;
|
|
434
|
+
}
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### `Network`
|
|
438
|
+
|
|
439
|
+
```typescript
|
|
440
|
+
type Network = 'mainnet' | 'testnet' | 'devnet';
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### `EdgePassTemplate`
|
|
444
|
+
|
|
445
|
+
```typescript
|
|
446
|
+
type EdgePassTemplate = 'festival' | 'gaming' | 'subscription' | 'defi' | 'enterprise';
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
---
|
|
450
|
+
|
|
451
|
+
## Constants
|
|
452
|
+
|
|
453
|
+
```typescript
|
|
454
|
+
import {
|
|
455
|
+
MIST_PER_SUI, // 1_000_000_000n
|
|
456
|
+
NETWORK_URLS, // { mainnet, testnet, devnet }
|
|
457
|
+
EDGE_PACKAGE_ID, // { mainnet, testnet, devnet }
|
|
458
|
+
EDGE_TEMPLATES, // all 5 templates
|
|
459
|
+
DEFAULT_GAS_BUDGET // 10_000_000n
|
|
460
|
+
} from '@edge-protocol/sdk';
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
---
|
|
464
|
+
|
|
465
|
+
## Integration Examples
|
|
466
|
+
|
|
467
|
+
### AI Agent with EdgePass
|
|
468
|
+
|
|
469
|
+
A Claude LLM making autonomous festival purchases within an EdgePass.
|
|
470
|
+
|
|
471
|
+
```typescript
|
|
472
|
+
import { EdgePass, MIST_PER_SUI } from '@edge-protocol/sdk';
|
|
473
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
474
|
+
|
|
475
|
+
const sdk = new EdgePass({ network: 'mainnet', enokiApiKey: KEY });
|
|
476
|
+
const claude = new Anthropic();
|
|
477
|
+
|
|
478
|
+
// 1. User creates EdgePass once
|
|
479
|
+
const pass = await sdk.create(
|
|
480
|
+
EdgePass.fromTemplate('festival', {
|
|
481
|
+
approvedMerchants: ['Shuttle Express', 'Hydra Bar', 'Stage Access VIP'],
|
|
482
|
+
owner: userAddress,
|
|
483
|
+
}),
|
|
484
|
+
signer
|
|
485
|
+
);
|
|
486
|
+
|
|
487
|
+
// 2. Agent loop — runs autonomously
|
|
488
|
+
async function agentLoop(scenario: string) {
|
|
489
|
+
const response = await claude.messages.create({
|
|
490
|
+
model: 'claude-sonnet-4-6',
|
|
491
|
+
max_tokens: 500,
|
|
492
|
+
messages: [{
|
|
493
|
+
role: 'user',
|
|
494
|
+
content: `Festival scenario: "${scenario}".
|
|
495
|
+
Decide what to purchase. Return JSON:
|
|
496
|
+
{ merchant: string, amount: number }`
|
|
497
|
+
}]
|
|
498
|
+
});
|
|
499
|
+
|
|
500
|
+
const { merchant, amount } = JSON.parse(response.content[0].text);
|
|
501
|
+
|
|
502
|
+
const outcome = await sdk.execute(pass, {
|
|
503
|
+
merchant,
|
|
504
|
+
amount: BigInt(Math.floor(amount * 1e9)),
|
|
505
|
+
}, signer);
|
|
506
|
+
|
|
507
|
+
if (outcome.status === 'escalated') {
|
|
508
|
+
await notifyUser(`Approve $${amount} at ${merchant}?`);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
return outcome;
|
|
512
|
+
}
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
---
|
|
516
|
+
|
|
517
|
+
### DeFi Trading Agent
|
|
518
|
+
|
|
519
|
+
```typescript
|
|
520
|
+
const pass = await sdk.create(
|
|
521
|
+
EdgePass.fromTemplate('defi', {
|
|
522
|
+
approvedMerchants: ['DeepBook', 'Cetus', 'Turbos'],
|
|
523
|
+
budget: 5_000n * MIST_PER_SUI,
|
|
524
|
+
owner: userAddress,
|
|
525
|
+
}),
|
|
526
|
+
signer
|
|
527
|
+
);
|
|
528
|
+
|
|
529
|
+
async function executeTrade(dex: string, amount: bigint) {
|
|
530
|
+
// validate before network call
|
|
531
|
+
const preview = sdk.validate(pass, { merchant: dex, amount });
|
|
532
|
+
|
|
533
|
+
if (!preview.allowed) {
|
|
534
|
+
logger.warn(`Trade blocked: ${preview.reason}`);
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
if (preview.requiresEscalation) {
|
|
539
|
+
await riskTeam.requestApproval({ dex, amount, reason: preview.reason });
|
|
540
|
+
return;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
const outcome = await sdk.execute(pass, { merchant: dex, amount }, signer);
|
|
544
|
+
// audit log written to Walrus automatically
|
|
545
|
+
logger.info(`Trade executed: ${outcome.digest}`);
|
|
546
|
+
}
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
---
|
|
550
|
+
|
|
551
|
+
### Enterprise Payroll Agent
|
|
552
|
+
|
|
553
|
+
```typescript
|
|
554
|
+
const pass = await sdk.create(
|
|
555
|
+
EdgePass.fromTemplate('enterprise', {
|
|
556
|
+
approvedMerchants: ['vendor-a.sui', 'vendor-b.sui'],
|
|
557
|
+
budget: 100_000n * MIST_PER_SUI,
|
|
558
|
+
escalateThreshold: 10_000n * MIST_PER_SUI,
|
|
559
|
+
owner: cfoAddress,
|
|
560
|
+
}),
|
|
561
|
+
signer
|
|
562
|
+
);
|
|
563
|
+
|
|
564
|
+
for (const payment of scheduledPayments) {
|
|
565
|
+
const outcome = await sdk.execute(pass, {
|
|
566
|
+
merchant: payment.vendor,
|
|
567
|
+
amount: payment.amount,
|
|
568
|
+
}, signer);
|
|
569
|
+
|
|
570
|
+
if (outcome.status === 'escalated') {
|
|
571
|
+
await cfo.requestApproval(payment); // new vendor or large amount
|
|
572
|
+
}
|
|
573
|
+
// every payment logged to Walrus for compliance audit
|
|
574
|
+
}
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
---
|
|
578
|
+
|
|
579
|
+
### Subscription Manager
|
|
580
|
+
|
|
581
|
+
```typescript
|
|
582
|
+
const pass = await sdk.create(
|
|
583
|
+
EdgePass.fromTemplate('subscription', {
|
|
584
|
+
approvedMerchants: ['netflix.sui', 'spotify.sui', 'github.sui'],
|
|
585
|
+
owner: userAddress,
|
|
586
|
+
}),
|
|
587
|
+
signer
|
|
588
|
+
);
|
|
589
|
+
|
|
590
|
+
// Runs monthly — agent handles all renewals
|
|
591
|
+
async function processRenewals(subscriptions: Subscription[]) {
|
|
592
|
+
for (const sub of subscriptions) {
|
|
593
|
+
if (!sdk.isValid(pass)) {
|
|
594
|
+
pass = await sdk.create(
|
|
595
|
+
EdgePass.fromTemplate('subscription', { owner: userAddress }),
|
|
596
|
+
signer
|
|
597
|
+
);
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
await sdk.execute(pass, {
|
|
601
|
+
merchant: sub.merchant,
|
|
602
|
+
amount: sub.amount,
|
|
603
|
+
}, signer);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
---
|
|
609
|
+
|
|
610
|
+
## Error Handling
|
|
611
|
+
|
|
612
|
+
```typescript
|
|
613
|
+
try {
|
|
614
|
+
const outcome = await sdk.execute(pass, request, signer);
|
|
615
|
+
|
|
616
|
+
switch (outcome.status) {
|
|
617
|
+
case 'approved':
|
|
618
|
+
// success — outcome.digest is the Sui tx hash
|
|
619
|
+
break;
|
|
620
|
+
case 'escalated':
|
|
621
|
+
// needs human review — outcome.reason explains why
|
|
622
|
+
break;
|
|
623
|
+
case 'blocked':
|
|
624
|
+
// policy rejected — outcome.reason explains why
|
|
625
|
+
break;
|
|
626
|
+
}
|
|
627
|
+
} catch (error) {
|
|
628
|
+
// network error, signing failure, expired credentials, etc.
|
|
629
|
+
console.error('SDK error:', error);
|
|
630
|
+
}
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
### Common reasons
|
|
634
|
+
|
|
635
|
+
| Reason | Cause |
|
|
636
|
+
|--------|-------|
|
|
637
|
+
| `EdgePass is inactive` | Pass was revoked |
|
|
638
|
+
| `EdgePass has expired` | `expiresAt` timestamp passed |
|
|
639
|
+
| `Merchant "X" is not approved` | Merchant not in allowlist |
|
|
640
|
+
| `Insufficient budget` | Remaining budget < amount |
|
|
641
|
+
| `Amount exceeds per-transaction limit` | Amount > `maxPerTransaction` |
|
|
642
|
+
| `Amount exceeds escalation threshold` | Amount > `escalateThreshold` (not blocked — escalated) |
|
|
643
|
+
|
|
644
|
+
---
|
|
645
|
+
|
|
646
|
+
## Architecture
|
|
647
|
+
|
|
648
|
+
```
|
|
649
|
+
User creates EdgePass (once)
|
|
650
|
+
│
|
|
651
|
+
▼
|
|
652
|
+
Agent calls sdk.execute() — many times, autonomously
|
|
653
|
+
│
|
|
654
|
+
├─▶ PolicyEngine.validate()
|
|
655
|
+
│ Pure TypeScript · no network · <1ms
|
|
656
|
+
│ 7 rules checked in order
|
|
657
|
+
│ blocked/escalated never touch Sui
|
|
658
|
+
│
|
|
659
|
+
├─▶ ExecutionEngine.buildPTB()
|
|
660
|
+
│ Programmable Transaction Block
|
|
661
|
+
│ validate → execute → update spent → emit event
|
|
662
|
+
│ atomic — any failure reverts everything
|
|
663
|
+
│
|
|
664
|
+
└─▶ Walrus audit receipt
|
|
665
|
+
immutable · decentralized · permanent
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
### Why PTBs matter
|
|
669
|
+
|
|
670
|
+
PTBs (Programmable Transaction Blocks) are Sui's killer feature. The policy check and the spend update happen in one atomic block. If any step fails, everything reverts. No partial state. No race conditions. This is what makes EdgePass trustworthy at the protocol level — not just application code.
|
|
671
|
+
|
|
672
|
+
### Why the object model matters
|
|
673
|
+
|
|
674
|
+
The EdgePass is a first-class owned object in the user's wallet. An agent can be passed the object to execute against — but the Sui protocol guarantees it can never take ownership. No contract upgrade, no admin key, no reentrancy attack can change that.
|
|
675
|
+
|
|
676
|
+
---
|
|
677
|
+
|
|
678
|
+
## Move Contract
|
|
679
|
+
|
|
680
|
+
```
|
|
681
|
+
Package: 0x9f4065009494aa5acd92a5c72a6c22ce80939b2bddae3b34345459bc98d2501d
|
|
682
|
+
Network: Sui Testnet (Mainnet coming)
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
[View on Sui Explorer →](https://suiscan.xyz/testnet/object/0x9f4065009494aa5acd92a5c72a6c22ce80939b2bddae3b34345459bc98d2501d)
|
|
686
|
+
|
|
687
|
+
### Contract functions
|
|
688
|
+
|
|
689
|
+
```move
|
|
690
|
+
// Create a new EdgePass
|
|
691
|
+
public entry fun create_pass(
|
|
692
|
+
budget: u64,
|
|
693
|
+
auto_threshold: u64,
|
|
694
|
+
escalate_threshold: u64,
|
|
695
|
+
expiry_ms: u64,
|
|
696
|
+
approved_merchants: vector<String>,
|
|
697
|
+
clock: &Clock,
|
|
698
|
+
ctx: &mut TxContext,
|
|
699
|
+
)
|
|
700
|
+
|
|
701
|
+
// Execute a transaction against an EdgePass
|
|
702
|
+
public entry fun execute_transaction(
|
|
703
|
+
pass: &mut EdgePass,
|
|
704
|
+
amount: u64,
|
|
705
|
+
merchant: String,
|
|
706
|
+
clock: &Clock,
|
|
707
|
+
ctx: &mut TxContext,
|
|
708
|
+
)
|
|
709
|
+
|
|
710
|
+
// Revoke an EdgePass
|
|
711
|
+
public entry fun revoke_pass(
|
|
712
|
+
pass: &mut EdgePass,
|
|
713
|
+
ctx: &mut TxContext,
|
|
714
|
+
)
|
|
715
|
+
```
|
|
716
|
+
|
|
717
|
+
---
|
|
718
|
+
|
|
719
|
+
## Testing
|
|
720
|
+
|
|
721
|
+
```bash
|
|
722
|
+
cd packages/sdk && pnpm test
|
|
723
|
+
```
|
|
724
|
+
|
|
725
|
+
```
|
|
726
|
+
📋 PolicyEngine.validate()
|
|
727
|
+
✓ auto-approves under $50
|
|
728
|
+
✓ auto-approves at exactly $50
|
|
729
|
+
✓ escalates above $100
|
|
730
|
+
✓ escalates at exactly $101
|
|
731
|
+
✓ blocks unlisted merchant
|
|
732
|
+
✓ blocks when budget exceeded
|
|
733
|
+
✓ blocks when expired
|
|
734
|
+
✓ blocks when inactive
|
|
735
|
+
✓ blocks when maxPerTransaction exceeded
|
|
736
|
+
✓ allows when maxPerTransaction is undefined
|
|
737
|
+
|
|
738
|
+
📋 PolicyEngine helpers
|
|
739
|
+
✓ isValid returns true for active pass
|
|
740
|
+
✓ isValid returns false for expired pass
|
|
741
|
+
✓ isValid returns false for inactive pass
|
|
742
|
+
✓ remainingBudget calculates correctly
|
|
743
|
+
✓ remainingBudget returns full budget when nothing spent
|
|
744
|
+
|
|
745
|
+
📋 EdgePass.fromTemplate()
|
|
746
|
+
✓ festival template has correct defaults
|
|
747
|
+
✓ gaming template has correct expiry
|
|
748
|
+
✓ defi template has correct budget
|
|
749
|
+
✓ enterprise template has correct budget
|
|
750
|
+
✓ fromTemplate allows budget override
|
|
751
|
+
✓ fromTemplate allows merchant override
|
|
752
|
+
✓ fromTemplate preserves owner
|
|
753
|
+
|
|
754
|
+
📋 Constants
|
|
755
|
+
✓ MIST_PER_SUI is 1_000_000_000
|
|
756
|
+
✓ all 5 templates exist
|
|
757
|
+
✓ all templates have required fields
|
|
758
|
+
✓ all templates have autoThreshold < escalateThreshold
|
|
759
|
+
✓ all templates have escalateThreshold < budget
|
|
760
|
+
|
|
761
|
+
27 passed · 0 failed ✅
|
|
762
|
+
```
|
|
763
|
+
|
|
764
|
+
---
|
|
765
|
+
|
|
766
|
+
## Links
|
|
767
|
+
|
|
768
|
+
- **npm:** [npmjs.com/package/@edge-protocol/sdk](https://npmjs.com/package/@edge-protocol/sdk)
|
|
769
|
+
- **GitHub:** [github.com/fluturecode/edge](https://github.com/fluturecode/edge)
|
|
770
|
+
- **Live Demo:** [edge-web-cyan.vercel.app](https://edge-web-cyan.vercel.app)
|
|
771
|
+
- **Sui Explorer:** [Contract on Testnet](https://suiscan.xyz/testnet/object/0x9f4065009494aa5acd92a5c72a6c22ce80939b2bddae3b34345459bc98d2501d)
|
|
772
|
+
|
|
773
|
+
---
|
|
774
|
+
|
|
775
|
+
*The best infrastructure is invisible.*
|
|
776
|
+
|
|
777
|
+
Built for [Sui Overflow 2026](https://overflow.sui.io) · MIT License
|
package/dist/core/EdgePass.d.ts
CHANGED
|
@@ -1,27 +1,109 @@
|
|
|
1
1
|
import { Transaction } from "@mysten/sui/transactions";
|
|
2
2
|
import { EdgePassConfig, EdgePassObject, TransactionRequest, TransactionOutcome, EdgeSDKConfig } from "../utils/types";
|
|
3
3
|
import { EdgePassTemplate } from "../utils/constants";
|
|
4
|
+
export type EdgePassEventType = 'approved' | 'escalated' | 'blocked';
|
|
5
|
+
export type EdgePassEventPayload = {
|
|
6
|
+
type: 'approved';
|
|
7
|
+
outcome: TransactionOutcome & {
|
|
8
|
+
status: 'approved';
|
|
9
|
+
};
|
|
10
|
+
pass: EdgePassObject;
|
|
11
|
+
request: TransactionRequest;
|
|
12
|
+
} | {
|
|
13
|
+
type: 'escalated';
|
|
14
|
+
outcome: TransactionOutcome & {
|
|
15
|
+
status: 'escalated';
|
|
16
|
+
};
|
|
17
|
+
pass: EdgePassObject;
|
|
18
|
+
request: TransactionRequest;
|
|
19
|
+
} | {
|
|
20
|
+
type: 'blocked';
|
|
21
|
+
outcome: TransactionOutcome & {
|
|
22
|
+
status: 'blocked';
|
|
23
|
+
};
|
|
24
|
+
pass: EdgePassObject;
|
|
25
|
+
request: TransactionRequest;
|
|
26
|
+
};
|
|
27
|
+
type EventListener<T extends EdgePassEventType> = (payload: Extract<EdgePassEventPayload, {
|
|
28
|
+
type: T;
|
|
29
|
+
}>) => void | Promise<void>;
|
|
4
30
|
export declare class EdgePass {
|
|
5
31
|
private client;
|
|
6
32
|
private engine;
|
|
7
33
|
private config;
|
|
34
|
+
private listeners;
|
|
8
35
|
constructor(config: EdgeSDKConfig);
|
|
36
|
+
/**
|
|
37
|
+
* Subscribe to transaction outcomes.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* sdk.on('approved', ({ outcome, pass }) => {
|
|
41
|
+
* console.log('executed:', outcome.digest);
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* sdk.on('escalated', ({ outcome, request }) => {
|
|
45
|
+
* notifyUser(`Approve $${request.amount} at ${request.merchant}?`);
|
|
46
|
+
* });
|
|
47
|
+
*
|
|
48
|
+
* sdk.on('blocked', ({ outcome }) => {
|
|
49
|
+
* logger.warn('blocked:', outcome.reason);
|
|
50
|
+
* });
|
|
51
|
+
*/
|
|
52
|
+
on<T extends EdgePassEventType>(event: T, listener: EventListener<T>): this;
|
|
53
|
+
/**
|
|
54
|
+
* Unsubscribe a specific listener.
|
|
55
|
+
*/
|
|
56
|
+
off<T extends EdgePassEventType>(event: T, listener: EventListener<T>): this;
|
|
57
|
+
/**
|
|
58
|
+
* Remove all listeners for an event (or all events if none specified).
|
|
59
|
+
*/
|
|
60
|
+
removeAllListeners(event?: EdgePassEventType): this;
|
|
61
|
+
private emit;
|
|
62
|
+
/**
|
|
63
|
+
* Creates an EdgePassConfig from a template with optional overrides.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* const config = EdgePass.fromTemplate('festival', {
|
|
67
|
+
* approvedMerchants: ['Shuttle Express', 'Hydra Bar'],
|
|
68
|
+
* owner: userAddress,
|
|
69
|
+
* });
|
|
70
|
+
*/
|
|
9
71
|
static fromTemplate(template: EdgePassTemplate, overrides: Partial<EdgePassConfig> & {
|
|
10
72
|
owner: string;
|
|
11
73
|
}): EdgePassConfig;
|
|
74
|
+
/**
|
|
75
|
+
* Mint a new EdgePass on Sui.
|
|
76
|
+
*/
|
|
12
77
|
create(passConfig: EdgePassConfig, signer: {
|
|
13
78
|
signAndExecute: (tx: Transaction, kindBytes: string) => Promise<{
|
|
14
79
|
digest: string;
|
|
15
80
|
objectId?: string | null;
|
|
16
81
|
}>;
|
|
17
82
|
}): Promise<EdgePassObject>;
|
|
83
|
+
/**
|
|
84
|
+
* Execute a transaction against an EdgePass.
|
|
85
|
+
* Fires 'approved', 'escalated', or 'blocked' events automatically.
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* sdk.on('approved', ({ outcome }) => console.log('tx:', outcome.digest));
|
|
89
|
+
* const outcome = await sdk.execute(pass, { merchant, amount }, signer);
|
|
90
|
+
*/
|
|
18
91
|
execute(pass: EdgePassObject, request: TransactionRequest, signer: {
|
|
19
92
|
signAndExecute: (tx: Transaction) => Promise<{
|
|
20
93
|
digest: string;
|
|
21
94
|
}>;
|
|
22
95
|
}): Promise<TransactionOutcome>;
|
|
96
|
+
/**
|
|
97
|
+
* Preview outcome without executing. Zero network calls.
|
|
98
|
+
*/
|
|
23
99
|
validate(pass: EdgePassObject, request: TransactionRequest): import("../utils/types").PolicyValidation;
|
|
100
|
+
/**
|
|
101
|
+
* Fetch a live EdgePass from Sui.
|
|
102
|
+
*/
|
|
24
103
|
fetch(objectId: string): Promise<EdgePassObject | null>;
|
|
104
|
+
/**
|
|
105
|
+
* Revoke an EdgePass on-chain.
|
|
106
|
+
*/
|
|
25
107
|
revoke(pass: EdgePassObject, signer: {
|
|
26
108
|
signAndExecute: (tx: Transaction) => Promise<{
|
|
27
109
|
digest: string;
|
|
@@ -29,7 +111,14 @@ export declare class EdgePass {
|
|
|
29
111
|
}): Promise<{
|
|
30
112
|
digest: string;
|
|
31
113
|
}>;
|
|
114
|
+
/**
|
|
115
|
+
* Returns remaining budget in MIST.
|
|
116
|
+
*/
|
|
32
117
|
remainingBudget(pass: EdgePassObject): bigint;
|
|
118
|
+
/**
|
|
119
|
+
* Returns true if the pass is active and not expired.
|
|
120
|
+
*/
|
|
33
121
|
isValid(pass: EdgePassObject): boolean;
|
|
34
122
|
}
|
|
123
|
+
export {};
|
|
35
124
|
//# sourceMappingURL=EdgePass.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EdgePass.d.ts","sourceRoot":"","sources":["../../src/core/EdgePass.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EACL,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACd,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAKL,gBAAgB,EACjB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"EdgePass.d.ts","sourceRoot":"","sources":["../../src/core/EdgePass.ts"],"names":[],"mappings":"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"}
|
package/dist/core/EdgePass.js
CHANGED
|
@@ -9,12 +9,80 @@ const ExecutionEngine_1 = require("./ExecutionEngine");
|
|
|
9
9
|
const constants_1 = require("../utils/constants");
|
|
10
10
|
// Sui Clock object ID — shared object, always the same address
|
|
11
11
|
const SUI_CLOCK_OBJECT_ID = '0x0000000000000000000000000000000000000000000000000000000000000006';
|
|
12
|
+
// ── EdgePass class ────────────────────────────────────────────────────────────
|
|
12
13
|
class EdgePass {
|
|
13
14
|
constructor(config) {
|
|
15
|
+
this.listeners = new Map();
|
|
14
16
|
this.config = config;
|
|
15
17
|
this.client = new client_1.SuiClient({ url: constants_1.NETWORK_URLS[config.network] });
|
|
16
18
|
this.engine = new ExecutionEngine_1.ExecutionEngine(config.network);
|
|
17
19
|
}
|
|
20
|
+
// ── Event system ────────────────────────────────────────────────────────────
|
|
21
|
+
/**
|
|
22
|
+
* Subscribe to transaction outcomes.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* sdk.on('approved', ({ outcome, pass }) => {
|
|
26
|
+
* console.log('executed:', outcome.digest);
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* sdk.on('escalated', ({ outcome, request }) => {
|
|
30
|
+
* notifyUser(`Approve $${request.amount} at ${request.merchant}?`);
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* sdk.on('blocked', ({ outcome }) => {
|
|
34
|
+
* logger.warn('blocked:', outcome.reason);
|
|
35
|
+
* });
|
|
36
|
+
*/
|
|
37
|
+
on(event, listener) {
|
|
38
|
+
if (!this.listeners.has(event)) {
|
|
39
|
+
this.listeners.set(event, new Set());
|
|
40
|
+
}
|
|
41
|
+
this.listeners.get(event).add(listener);
|
|
42
|
+
return this; // chainable
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Unsubscribe a specific listener.
|
|
46
|
+
*/
|
|
47
|
+
off(event, listener) {
|
|
48
|
+
this.listeners.get(event)?.delete(listener);
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Remove all listeners for an event (or all events if none specified).
|
|
53
|
+
*/
|
|
54
|
+
removeAllListeners(event) {
|
|
55
|
+
if (event) {
|
|
56
|
+
this.listeners.delete(event);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
this.listeners.clear();
|
|
60
|
+
}
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
emit(payload) {
|
|
64
|
+
const listeners = this.listeners.get(payload.type);
|
|
65
|
+
if (!listeners)
|
|
66
|
+
return;
|
|
67
|
+
for (const listener of listeners) {
|
|
68
|
+
try {
|
|
69
|
+
listener(payload);
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
console.error(`EdgePass event listener error (${payload.type}):`, e);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ── Static helpers ──────────────────────────────────────────────────────────
|
|
77
|
+
/**
|
|
78
|
+
* Creates an EdgePassConfig from a template with optional overrides.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* const config = EdgePass.fromTemplate('festival', {
|
|
82
|
+
* approvedMerchants: ['Shuttle Express', 'Hydra Bar'],
|
|
83
|
+
* owner: userAddress,
|
|
84
|
+
* });
|
|
85
|
+
*/
|
|
18
86
|
static fromTemplate(template, overrides) {
|
|
19
87
|
const base = constants_1.EDGE_TEMPLATES[template];
|
|
20
88
|
return {
|
|
@@ -23,6 +91,10 @@ class EdgePass {
|
|
|
23
91
|
approvedMerchants: overrides.approvedMerchants ?? base.approvedMerchants,
|
|
24
92
|
};
|
|
25
93
|
}
|
|
94
|
+
// ── Core API ────────────────────────────────────────────────────────────────
|
|
95
|
+
/**
|
|
96
|
+
* Mint a new EdgePass on Sui.
|
|
97
|
+
*/
|
|
26
98
|
async create(passConfig, signer) {
|
|
27
99
|
const tx = new transactions_1.Transaction();
|
|
28
100
|
tx.setGasBudget(constants_1.DEFAULT_GAS_BUDGET);
|
|
@@ -42,7 +114,6 @@ class EdgePass {
|
|
|
42
114
|
}),
|
|
43
115
|
],
|
|
44
116
|
});
|
|
45
|
-
// All arguments statically known — no RPC needed, instant build
|
|
46
117
|
const kindBytes = (0, utils_1.toBase64)(await tx.build({ onlyTransactionKind: true }));
|
|
47
118
|
const result = await signer.signAndExecute(tx, kindBytes);
|
|
48
119
|
const now = Date.now();
|
|
@@ -55,15 +126,40 @@ class EdgePass {
|
|
|
55
126
|
expiresAt: now + passConfig.expiryMs,
|
|
56
127
|
};
|
|
57
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Execute a transaction against an EdgePass.
|
|
131
|
+
* Fires 'approved', 'escalated', or 'blocked' events automatically.
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* sdk.on('approved', ({ outcome }) => console.log('tx:', outcome.digest));
|
|
135
|
+
* const outcome = await sdk.execute(pass, { merchant, amount }, signer);
|
|
136
|
+
*/
|
|
58
137
|
async execute(pass, request, signer) {
|
|
59
|
-
|
|
138
|
+
const outcome = await this.engine.execute(pass, request, signer);
|
|
139
|
+
// Fire event listeners
|
|
140
|
+
this.emit({
|
|
141
|
+
type: outcome.status,
|
|
142
|
+
outcome: outcome,
|
|
143
|
+
pass,
|
|
144
|
+
request,
|
|
145
|
+
});
|
|
146
|
+
return outcome;
|
|
60
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* Preview outcome without executing. Zero network calls.
|
|
150
|
+
*/
|
|
61
151
|
validate(pass, request) {
|
|
62
152
|
return PolicyEngine_1.PolicyEngine.validate(pass, request);
|
|
63
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* Fetch a live EdgePass from Sui.
|
|
156
|
+
*/
|
|
64
157
|
async fetch(objectId) {
|
|
65
158
|
return this.engine.fetchPass(objectId);
|
|
66
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* Revoke an EdgePass on-chain.
|
|
162
|
+
*/
|
|
67
163
|
async revoke(pass, signer) {
|
|
68
164
|
const tx = new transactions_1.Transaction();
|
|
69
165
|
tx.setGasBudget(constants_1.DEFAULT_GAS_BUDGET);
|
|
@@ -74,9 +170,15 @@ class EdgePass {
|
|
|
74
170
|
});
|
|
75
171
|
return signer.signAndExecute(tx);
|
|
76
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Returns remaining budget in MIST.
|
|
175
|
+
*/
|
|
77
176
|
remainingBudget(pass) {
|
|
78
177
|
return PolicyEngine_1.PolicyEngine.remainingBudget(pass);
|
|
79
178
|
}
|
|
179
|
+
/**
|
|
180
|
+
* Returns true if the pass is active and not expired.
|
|
181
|
+
*/
|
|
80
182
|
isValid(pass) {
|
|
81
183
|
return PolicyEngine_1.PolicyEngine.isValid(pass);
|
|
82
184
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EdgePass.js","sourceRoot":"","sources":["../../src/core/EdgePass.ts"],"names":[],"mappings":";;;AAAA,+CAA+C;AAC/C,2DAAuD;AACvD,6CAA6C;AAQ7C,iDAA8C;AAC9C,uDAAoD;AACpD,kDAM4B;AAE5B,+DAA+D;AAC/D,MAAM,mBAAmB,GAAG,oEAAoE,CAAC;
|
|
1
|
+
{"version":3,"file":"EdgePass.js","sourceRoot":"","sources":["../../src/core/EdgePass.ts"],"names":[],"mappings":"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"}
|
package/dist/test.js
CHANGED
|
@@ -200,4 +200,104 @@ if (failed > 0) {
|
|
|
200
200
|
else {
|
|
201
201
|
console.log(`\n ✅ All ${passed} tests passing`);
|
|
202
202
|
}
|
|
203
|
+
// ── Events system ─────────────────────────────────────────────────────────────
|
|
204
|
+
console.log('\n📋 Events system');
|
|
205
|
+
test('on() returns sdk instance for chaining', () => {
|
|
206
|
+
const sdk = new EdgePass_1.EdgePass({ network: 'testnet', enokiApiKey: 'test' });
|
|
207
|
+
const result = sdk.on('approved', () => { });
|
|
208
|
+
assert(result === sdk, 'should be chainable');
|
|
209
|
+
});
|
|
210
|
+
test('fires approved event on auto-approve', async () => {
|
|
211
|
+
const sdk = new EdgePass_1.EdgePass({ network: 'testnet', enokiApiKey: 'test' });
|
|
212
|
+
let fired = false;
|
|
213
|
+
sdk.on('approved', ({ outcome, request }) => {
|
|
214
|
+
fired = true;
|
|
215
|
+
assertEqual(outcome.status, 'approved', 'event status');
|
|
216
|
+
assertEqual(request.merchant, 'Shuttle Express', 'event merchant');
|
|
217
|
+
});
|
|
218
|
+
const mockSigner = {
|
|
219
|
+
signAndExecute: async () => ({ digest: '0xmock', objectId: null }),
|
|
220
|
+
};
|
|
221
|
+
await sdk.execute(mockPass, {
|
|
222
|
+
merchant: 'Shuttle Express',
|
|
223
|
+
amount: BigInt(18) * constants_1.MIST_PER_SUI,
|
|
224
|
+
}, mockSigner);
|
|
225
|
+
assert(fired, 'approved event should have fired');
|
|
226
|
+
});
|
|
227
|
+
test('fires blocked event on policy rejection', async () => {
|
|
228
|
+
const sdk = new EdgePass_1.EdgePass({ network: 'testnet', enokiApiKey: 'test' });
|
|
229
|
+
let fired = false;
|
|
230
|
+
sdk.on('blocked', ({ outcome }) => {
|
|
231
|
+
fired = true;
|
|
232
|
+
assertEqual(outcome.status, 'blocked', 'event status');
|
|
233
|
+
});
|
|
234
|
+
const mockSigner = {
|
|
235
|
+
signAndExecute: async () => ({ digest: '0xmock', objectId: null }),
|
|
236
|
+
};
|
|
237
|
+
await sdk.execute(mockPass, {
|
|
238
|
+
merchant: 'ShadyTokens.xyz',
|
|
239
|
+
amount: BigInt(1) * constants_1.MIST_PER_SUI,
|
|
240
|
+
}, mockSigner);
|
|
241
|
+
assert(fired, 'blocked event should have fired');
|
|
242
|
+
});
|
|
243
|
+
test('fires escalated event above threshold', async () => {
|
|
244
|
+
const sdk = new EdgePass_1.EdgePass({ network: 'testnet', enokiApiKey: 'test' });
|
|
245
|
+
let fired = false;
|
|
246
|
+
sdk.on('escalated', ({ outcome }) => {
|
|
247
|
+
fired = true;
|
|
248
|
+
assertEqual(outcome.status, 'escalated', 'event status');
|
|
249
|
+
});
|
|
250
|
+
const mockSigner = {
|
|
251
|
+
signAndExecute: async () => ({ digest: '0xmock', objectId: null }),
|
|
252
|
+
};
|
|
253
|
+
await sdk.execute(mockPass, {
|
|
254
|
+
merchant: 'Shuttle Express',
|
|
255
|
+
amount: BigInt(149) * constants_1.MIST_PER_SUI,
|
|
256
|
+
}, mockSigner);
|
|
257
|
+
assert(fired, 'escalated event should have fired');
|
|
258
|
+
});
|
|
259
|
+
test('off() removes listener', async () => {
|
|
260
|
+
const sdk = new EdgePass_1.EdgePass({ network: 'testnet', enokiApiKey: 'test' });
|
|
261
|
+
let count = 0;
|
|
262
|
+
const listener = () => { count++; };
|
|
263
|
+
sdk.on('blocked', listener);
|
|
264
|
+
sdk.off('blocked', listener);
|
|
265
|
+
const mockSigner = {
|
|
266
|
+
signAndExecute: async () => ({ digest: '0xmock', objectId: null }),
|
|
267
|
+
};
|
|
268
|
+
await sdk.execute(mockPass, {
|
|
269
|
+
merchant: 'ShadyTokens.xyz',
|
|
270
|
+
amount: BigInt(1) * constants_1.MIST_PER_SUI,
|
|
271
|
+
}, mockSigner);
|
|
272
|
+
assertEqual(count, 0, 'listener should not fire after off()');
|
|
273
|
+
});
|
|
274
|
+
test('removeAllListeners() clears all events', async () => {
|
|
275
|
+
const sdk = new EdgePass_1.EdgePass({ network: 'testnet', enokiApiKey: 'test' });
|
|
276
|
+
let count = 0;
|
|
277
|
+
sdk.on('approved', () => { count++; });
|
|
278
|
+
sdk.on('blocked', () => { count++; });
|
|
279
|
+
sdk.removeAllListeners();
|
|
280
|
+
const mockSigner = {
|
|
281
|
+
signAndExecute: async () => ({ digest: '0xmock', objectId: null }),
|
|
282
|
+
};
|
|
283
|
+
await sdk.execute(mockPass, {
|
|
284
|
+
merchant: 'ShadyTokens.xyz',
|
|
285
|
+
amount: BigInt(1) * constants_1.MIST_PER_SUI,
|
|
286
|
+
}, mockSigner);
|
|
287
|
+
assertEqual(count, 0, 'no listeners should fire after removeAllListeners()');
|
|
288
|
+
});
|
|
289
|
+
test('multiple listeners fire for same event', async () => {
|
|
290
|
+
const sdk = new EdgePass_1.EdgePass({ network: 'testnet', enokiApiKey: 'test' });
|
|
291
|
+
let count = 0;
|
|
292
|
+
sdk.on('blocked', () => { count++; });
|
|
293
|
+
sdk.on('blocked', () => { count++; });
|
|
294
|
+
const mockSigner = {
|
|
295
|
+
signAndExecute: async () => ({ digest: '0xmock', objectId: null }),
|
|
296
|
+
};
|
|
297
|
+
await sdk.execute(mockPass, {
|
|
298
|
+
merchant: 'ShadyTokens.xyz',
|
|
299
|
+
amount: BigInt(1) * constants_1.MIST_PER_SUI,
|
|
300
|
+
}, mockSigner);
|
|
301
|
+
assertEqual(count, 2, 'both listeners should fire');
|
|
302
|
+
});
|
|
203
303
|
//# sourceMappingURL=test.js.map
|
package/dist/test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED