@rebelfi/agent-sdk 1.0.1
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 +337 -0
- package/dist/amount-utils.d.ts +9 -0
- package/dist/amount-utils.js +80 -0
- package/dist/amount-utils.js.map +1 -0
- package/dist/cjs/amount-utils.js +87 -0
- package/dist/cjs/amount-utils.js.map +1 -0
- package/dist/cjs/cli.js +189 -0
- package/dist/cjs/cli.js.map +1 -0
- package/dist/cjs/client.js +49 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/commands/account.js +250 -0
- package/dist/cjs/commands/account.js.map +1 -0
- package/dist/cjs/commands/auth.js +78 -0
- package/dist/cjs/commands/auth.js.map +1 -0
- package/dist/cjs/commands/balance.js +15 -0
- package/dist/cjs/commands/balance.js.map +1 -0
- package/dist/cjs/commands/cancel.js +34 -0
- package/dist/cjs/commands/cancel.js.map +1 -0
- package/dist/cjs/commands/chat.js +15 -0
- package/dist/cjs/commands/chat.js.map +1 -0
- package/dist/cjs/commands/claim.js +34 -0
- package/dist/cjs/commands/claim.js.map +1 -0
- package/dist/cjs/commands/config.js +29 -0
- package/dist/cjs/commands/config.js.map +1 -0
- package/dist/cjs/commands/contacts.js +29 -0
- package/dist/cjs/commands/contacts.js.map +1 -0
- package/dist/cjs/commands/init.js +43 -0
- package/dist/cjs/commands/init.js.map +1 -0
- package/dist/cjs/commands/orders.js +167 -0
- package/dist/cjs/commands/orders.js.map +1 -0
- package/dist/cjs/commands/pay.js +41 -0
- package/dist/cjs/commands/pay.js.map +1 -0
- package/dist/cjs/commands/payments.js +27 -0
- package/dist/cjs/commands/payments.js.map +1 -0
- package/dist/cjs/commands/wallet.js +69 -0
- package/dist/cjs/commands/wallet.js.map +1 -0
- package/dist/cjs/config.js +91 -0
- package/dist/cjs/config.js.map +1 -0
- package/dist/cjs/contacts.js +87 -0
- package/dist/cjs/contacts.js.map +1 -0
- package/dist/cjs/errors.js +93 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +64 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/intent/chains.js +29 -0
- package/dist/cjs/intent/chains.js.map +1 -0
- package/dist/cjs/intent/constraints.js +46 -0
- package/dist/cjs/intent/constraints.js.map +1 -0
- package/dist/cjs/intent/helpers.js +34 -0
- package/dist/cjs/intent/helpers.js.map +1 -0
- package/dist/cjs/intent/index.js +99 -0
- package/dist/cjs/intent/index.js.map +1 -0
- package/dist/cjs/intent/matcher.js +119 -0
- package/dist/cjs/intent/matcher.js.map +1 -0
- package/dist/cjs/intent/program-registry.js +68 -0
- package/dist/cjs/intent/program-registry.js.map +1 -0
- package/dist/cjs/intent/token-registry.js +99 -0
- package/dist/cjs/intent/token-registry.js.map +1 -0
- package/dist/cjs/intent/types.js +3 -0
- package/dist/cjs/intent/types.js.map +1 -0
- package/dist/cjs/orders/evaluate.js +168 -0
- package/dist/cjs/orders/evaluate.js.map +1 -0
- package/dist/cjs/orders/index.js +14 -0
- package/dist/cjs/orders/index.js.map +1 -0
- package/dist/cjs/orders/store.js +47 -0
- package/dist/cjs/orders/store.js.map +1 -0
- package/dist/cjs/orders/sugar.js +35 -0
- package/dist/cjs/orders/sugar.js.map +1 -0
- package/dist/cjs/orders/types.js +3 -0
- package/dist/cjs/orders/types.js.map +1 -0
- package/dist/cjs/output.js +47 -0
- package/dist/cjs/output.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/transfers.js +15 -0
- package/dist/cjs/transfers.js.map +1 -0
- package/dist/cjs/validate.js +77 -0
- package/dist/cjs/validate.js.map +1 -0
- package/dist/cjs/verify/decoders/ata.js +19 -0
- package/dist/cjs/verify/decoders/ata.js.map +1 -0
- package/dist/cjs/verify/decoders/compute-budget.js +32 -0
- package/dist/cjs/verify/decoders/compute-budget.js.map +1 -0
- package/dist/cjs/verify/decoders/handshake.js +180 -0
- package/dist/cjs/verify/decoders/handshake.js.map +1 -0
- package/dist/cjs/verify/decoders/jupiter.js +39 -0
- package/dist/cjs/verify/decoders/jupiter.js.map +1 -0
- package/dist/cjs/verify/decoders/memo.js +12 -0
- package/dist/cjs/verify/decoders/memo.js.map +1 -0
- package/dist/cjs/verify/decoders/silkysig.js +162 -0
- package/dist/cjs/verify/decoders/silkysig.js.map +1 -0
- package/dist/cjs/verify/decoders/spl-token.js +125 -0
- package/dist/cjs/verify/decoders/spl-token.js.map +1 -0
- package/dist/cjs/verify/decoders/system.js +87 -0
- package/dist/cjs/verify/decoders/system.js.map +1 -0
- package/dist/cjs/verify/flags.js +87 -0
- package/dist/cjs/verify/flags.js.map +1 -0
- package/dist/cjs/verify/index.js +384 -0
- package/dist/cjs/verify/index.js.map +1 -0
- package/dist/cjs/verify/registry.js +24 -0
- package/dist/cjs/verify/registry.js.map +1 -0
- package/dist/cjs/verify/rpc.js +52 -0
- package/dist/cjs/verify/rpc.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +224 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +7 -0
- package/dist/client.js +43 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/account.d.ts +21 -0
- package/dist/commands/account.js +239 -0
- package/dist/commands/account.js.map +1 -0
- package/dist/commands/auth.d.ts +5 -0
- package/dist/commands/auth.js +70 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/balance.d.ts +3 -0
- package/dist/commands/balance.js +12 -0
- package/dist/commands/balance.js.map +1 -0
- package/dist/commands/cancel.d.ts +3 -0
- package/dist/commands/cancel.js +28 -0
- package/dist/commands/cancel.js.map +1 -0
- package/dist/commands/chat.d.ts +1 -0
- package/dist/commands/chat.js +12 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/claim.d.ts +3 -0
- package/dist/commands/claim.js +28 -0
- package/dist/commands/claim.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.js +24 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/contacts.d.ts +4 -0
- package/dist/commands/contacts.js +23 -0
- package/dist/commands/contacts.js.map +1 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +37 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/orders.d.ts +19 -0
- package/dist/commands/orders.js +157 -0
- package/dist/commands/orders.js.map +1 -0
- package/dist/commands/pay.d.ts +4 -0
- package/dist/commands/pay.js +35 -0
- package/dist/commands/pay.js.map +1 -0
- package/dist/commands/payments.d.ts +4 -0
- package/dist/commands/payments.js +23 -0
- package/dist/commands/payments.js.map +1 -0
- package/dist/commands/wallet.d.ts +7 -0
- package/dist/commands/wallet.js +61 -0
- package/dist/commands/wallet.js.map +1 -0
- package/dist/config.d.ts +40 -0
- package/dist/config.js +74 -0
- package/dist/config.js.map +1 -0
- package/dist/contacts.d.ts +15 -0
- package/dist/contacts.js +74 -0
- package/dist/contacts.js.map +1 -0
- package/dist/errors.d.ts +14 -0
- package/dist/errors.js +87 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/intent/chains.d.ts +7 -0
- package/dist/intent/chains.js +24 -0
- package/dist/intent/chains.js.map +1 -0
- package/dist/intent/constraints.d.ts +8 -0
- package/dist/intent/constraints.js +43 -0
- package/dist/intent/constraints.js.map +1 -0
- package/dist/intent/helpers.d.ts +6 -0
- package/dist/intent/helpers.js +27 -0
- package/dist/intent/helpers.js.map +1 -0
- package/dist/intent/index.d.ts +11 -0
- package/dist/intent/index.js +87 -0
- package/dist/intent/index.js.map +1 -0
- package/dist/intent/matcher.d.ts +8 -0
- package/dist/intent/matcher.js +116 -0
- package/dist/intent/matcher.js.map +1 -0
- package/dist/intent/program-registry.d.ts +13 -0
- package/dist/intent/program-registry.js +65 -0
- package/dist/intent/program-registry.js.map +1 -0
- package/dist/intent/token-registry.d.ts +17 -0
- package/dist/intent/token-registry.js +96 -0
- package/dist/intent/token-registry.js.map +1 -0
- package/dist/intent/types.d.ts +89 -0
- package/dist/intent/types.js +2 -0
- package/dist/intent/types.js.map +1 -0
- package/dist/orders/evaluate.d.ts +28 -0
- package/dist/orders/evaluate.js +165 -0
- package/dist/orders/evaluate.js.map +1 -0
- package/dist/orders/index.d.ts +7 -0
- package/dist/orders/index.js +4 -0
- package/dist/orders/index.js.map +1 -0
- package/dist/orders/store.d.ts +9 -0
- package/dist/orders/store.js +37 -0
- package/dist/orders/store.js.map +1 -0
- package/dist/orders/sugar.d.ts +13 -0
- package/dist/orders/sugar.js +32 -0
- package/dist/orders/sugar.js.map +1 -0
- package/dist/orders/types.d.ts +37 -0
- package/dist/orders/types.js +2 -0
- package/dist/orders/types.js.map +1 -0
- package/dist/output.d.ts +4 -0
- package/dist/output.js +42 -0
- package/dist/output.js.map +1 -0
- package/dist/transfers.d.ts +32 -0
- package/dist/transfers.js +12 -0
- package/dist/transfers.js.map +1 -0
- package/dist/validate.d.ts +8 -0
- package/dist/validate.js +69 -0
- package/dist/validate.js.map +1 -0
- package/dist/verify/decoders/ata.d.ts +5 -0
- package/dist/verify/decoders/ata.js +16 -0
- package/dist/verify/decoders/ata.js.map +1 -0
- package/dist/verify/decoders/compute-budget.d.ts +5 -0
- package/dist/verify/decoders/compute-budget.js +29 -0
- package/dist/verify/decoders/compute-budget.js.map +1 -0
- package/dist/verify/decoders/handshake.d.ts +5 -0
- package/dist/verify/decoders/handshake.js +177 -0
- package/dist/verify/decoders/handshake.js.map +1 -0
- package/dist/verify/decoders/jupiter.d.ts +5 -0
- package/dist/verify/decoders/jupiter.js +36 -0
- package/dist/verify/decoders/jupiter.js.map +1 -0
- package/dist/verify/decoders/memo.d.ts +5 -0
- package/dist/verify/decoders/memo.js +9 -0
- package/dist/verify/decoders/memo.js.map +1 -0
- package/dist/verify/decoders/silkysig.d.ts +5 -0
- package/dist/verify/decoders/silkysig.js +159 -0
- package/dist/verify/decoders/silkysig.js.map +1 -0
- package/dist/verify/decoders/spl-token.d.ts +5 -0
- package/dist/verify/decoders/spl-token.js +122 -0
- package/dist/verify/decoders/spl-token.js.map +1 -0
- package/dist/verify/decoders/system.d.ts +5 -0
- package/dist/verify/decoders/system.js +84 -0
- package/dist/verify/decoders/system.js.map +1 -0
- package/dist/verify/flags.d.ts +3 -0
- package/dist/verify/flags.js +83 -0
- package/dist/verify/flags.js.map +1 -0
- package/dist/verify/index.d.ts +75 -0
- package/dist/verify/index.js +380 -0
- package/dist/verify/index.js.map +1 -0
- package/dist/verify/registry.d.ts +13 -0
- package/dist/verify/registry.js +21 -0
- package/dist/verify/registry.js.map +1 -0
- package/dist/verify/rpc.d.ts +14 -0
- package/dist/verify/rpc.js +48 -0
- package/dist/verify/rpc.js.map +1 -0
- package/package.json +85 -0
package/README.md
ADDED
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
<h1 align="center">@rebelfi/agent-sdk</h1>
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<strong>Give your AI agent a bank account on Solana. One command.</strong>
|
|
5
|
+
</p>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="https://www.npmjs.com/package/@rebelfi/agent-sdk"><img src="https://img.shields.io/npm/v/@rebelfi/agent-sdk" alt="npm version" /></a>
|
|
9
|
+
<a href="https://www.npmjs.com/package/@rebelfi/agent-sdk"><img src="https://img.shields.io/npm/dm/@rebelfi/agent-sdk" alt="npm downloads" /></a>
|
|
10
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT" /></a>
|
|
11
|
+
<a href="https://github.com/silkysquad/silk/stargazers"><img src="https://img.shields.io/github/stars/silkysquad/silk?style=social" alt="GitHub stars" /></a>
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
TypeScript SDK and CLI for AI agent payments on Solana. Policy-controlled accounts with on-chain spending limits, time-locked escrow transfers, transaction verification, and conditional payment flows — for Claude, GPT, LangChain, and any autonomous agent.
|
|
17
|
+
|
|
18
|
+
## Why This Exists
|
|
19
|
+
|
|
20
|
+
Giving an agent a wallet keypair is like handing an employee an envelope of cash. It works, technically. But one hallucination, one prompt injection, one compromised dependency — and the entire balance is gone in a single transaction.
|
|
21
|
+
|
|
22
|
+
Current mitigations are all inadequate:
|
|
23
|
+
|
|
24
|
+
| Approach | Problem |
|
|
25
|
+
|----------|---------|
|
|
26
|
+
| Human-in-the-loop | Defeats the purpose of automation |
|
|
27
|
+
| Rate limits in agent code | Not enforceable — the agent can be modified or bypassed |
|
|
28
|
+
| Custodial APIs | You're trusting a third party with your funds |
|
|
29
|
+
|
|
30
|
+
**The insight:** agent financial safety is an infrastructure problem, not an AI alignment problem.
|
|
31
|
+
|
|
32
|
+
RebelFi replaces wallets with **policy-controlled accounts** — on-chain Solana programs that enforce spending rules at the protocol level. The chain itself rejects transactions that exceed limits. Not the agent's code. Not an API layer. Not a human reviewer.
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
Agent: "Send $10,000 to some address"
|
|
36
|
+
Chain: Transaction rejected. Operator limit: $100/tx.
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Prompt injection can't drain funds beyond policy limits. Hallucinating agents can't make catastrophic financial decisions. Compromised agent keys are damage-limited by policy. Humans set policies once, then trust the chain — not the agent.
|
|
40
|
+
|
|
41
|
+
## Quick Start
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npm install @rebelfi/agent-sdk
|
|
45
|
+
|
|
46
|
+
# Initialize — creates a wallet and agent ID
|
|
47
|
+
rebel init
|
|
48
|
+
|
|
49
|
+
# Switch to devnet for testing
|
|
50
|
+
rebel config set-cluster devnet
|
|
51
|
+
|
|
52
|
+
# Fund your wallet (devnet only)
|
|
53
|
+
rebel wallet fund --sol --usdc
|
|
54
|
+
|
|
55
|
+
# Send your first payment
|
|
56
|
+
rebel pay <recipient> 10 --memo "first payment"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
That's it. Wallet created, funded, payment sent — under 2 minutes.
|
|
60
|
+
|
|
61
|
+
## Features
|
|
62
|
+
|
|
63
|
+
### Policy-Controlled Accounts
|
|
64
|
+
|
|
65
|
+
Managed token accounts with operator delegation and per-transaction spending limits. Account owners (humans) set policies; agents operate within them.
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Discover your on-chain account
|
|
69
|
+
rebel account sync
|
|
70
|
+
|
|
71
|
+
# Check balance and policy info
|
|
72
|
+
rebel account status
|
|
73
|
+
# → Balance: 500.00 USDC | Policy: max $100.00/tx
|
|
74
|
+
|
|
75
|
+
# Send within limits — works
|
|
76
|
+
rebel account send <recipient> 50
|
|
77
|
+
|
|
78
|
+
# Exceed limits — rejected on-chain
|
|
79
|
+
rebel account send <recipient> 200
|
|
80
|
+
# → REJECTED: amount $200.00 exceeds per-transaction limit of $100.00
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Escrow Payments
|
|
84
|
+
|
|
85
|
+
Time-locked USDC transfers via the Handshake protocol. Sender deposits to escrow, recipient claims. Sender can cancel before claim.
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
rebel pay <recipient> 25 --memo "Invoice #42"
|
|
89
|
+
rebel claim <transferPda>
|
|
90
|
+
rebel cancel <transferPda>
|
|
91
|
+
rebel payments list
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Transaction Verification
|
|
95
|
+
|
|
96
|
+
Decode and analyze any Solana transaction before signing. Supports System, SPL Token, ATA, Compute Budget, Memo, Handshake, RebelSig, and Jupiter programs.
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
import { analyzeTransaction, verifyIntent } from '@rebelfi/agent-sdk';
|
|
100
|
+
|
|
101
|
+
// Human-readable breakdown of any transaction
|
|
102
|
+
const analysis = await analyzeTransaction(txBase64);
|
|
103
|
+
console.log(analysis.summary);
|
|
104
|
+
// → "Handshake transfer of 100 USDC from Alice to Bob"
|
|
105
|
+
|
|
106
|
+
// Verify a transaction matches your intent
|
|
107
|
+
const result = await verifyIntent(txBase64, {
|
|
108
|
+
type: 'transfer_from_account',
|
|
109
|
+
owner: 'owner...',
|
|
110
|
+
recipient: 'recipient...',
|
|
111
|
+
amount: '50',
|
|
112
|
+
token: 'USDC',
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
if (!result.verified) {
|
|
116
|
+
console.error('Mismatch:', result.discrepancies);
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Risk flags are surfaced automatically:
|
|
121
|
+
|
|
122
|
+
| Severity | Example |
|
|
123
|
+
|----------|---------|
|
|
124
|
+
| `error` | Unknown program in transaction |
|
|
125
|
+
| `warning` | Fee payer differs from signer |
|
|
126
|
+
| `info` | Priority fee set |
|
|
127
|
+
|
|
128
|
+
### Cross-Chain Intent Framework
|
|
129
|
+
|
|
130
|
+
Type-safe intent definitions with constraint support. Currently implements Solana, extensible to EVM chains.
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
import type { SingleIntent } from '@rebelfi/agent-sdk';
|
|
134
|
+
|
|
135
|
+
const swap: SingleIntent = {
|
|
136
|
+
chain: 'solana',
|
|
137
|
+
signer: 'agent...',
|
|
138
|
+
action: 'swap',
|
|
139
|
+
tokenIn: { tokenSymbol: 'USDC' },
|
|
140
|
+
tokenOut: { tokenSymbol: 'SOL' },
|
|
141
|
+
amountIn: { lte: '500' }, // constrained amounts
|
|
142
|
+
slippage: 0.5,
|
|
143
|
+
};
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Supported actions: `transfer`, `swap`, `stake`, `lend`, `borrow`, `approve`, `withdraw`, `custom`.
|
|
147
|
+
|
|
148
|
+
### Conditional Flows
|
|
149
|
+
|
|
150
|
+
Multi-step workflows with conditions, intents, and compute steps. Built-in templates for common patterns.
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Limit order: buy SOL when price drops below $120
|
|
154
|
+
rebel flows create limit-order \
|
|
155
|
+
--sell "500 USDC" --buy SOL --price 120 \
|
|
156
|
+
--slippage 0.5 --expires 7d
|
|
157
|
+
|
|
158
|
+
rebel flows list
|
|
159
|
+
rebel flows evaluate # run heartbeat
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Conditions: `price_below`, `price_above`, `time_reached`, `balance_above`.
|
|
163
|
+
|
|
164
|
+
### Contacts
|
|
165
|
+
|
|
166
|
+
Local address book for named recipients.
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
rebel contacts add alice <address>
|
|
170
|
+
rebel pay alice 10 # resolves by name
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## How It Works
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
Your Agent (Claude, GPT, LangChain, CrewAI, custom)
|
|
177
|
+
│
|
|
178
|
+
▼
|
|
179
|
+
rebel CLI / @rebelfi/agent-sdk library
|
|
180
|
+
│
|
|
181
|
+
├── Local wallet management (keys never leave your machine)
|
|
182
|
+
├── Transaction verification (decode before signing)
|
|
183
|
+
├── Intent matching and risk flagging
|
|
184
|
+
│
|
|
185
|
+
▼
|
|
186
|
+
RebelFi API (transaction builder)
|
|
187
|
+
│
|
|
188
|
+
▼
|
|
189
|
+
Solana
|
|
190
|
+
├── Handshake — time-locked escrow transfers
|
|
191
|
+
└── RebelSig — policy-controlled accounts with operator delegation
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Private keys never leave the agent's machine. The API builds unsigned transactions; the SDK signs locally and submits.
|
|
195
|
+
|
|
196
|
+
## Comparison
|
|
197
|
+
|
|
198
|
+
| | rebel | Raw @solana/web3.js | Centralized Payment APIs |
|
|
199
|
+
|---|---|---|---|
|
|
200
|
+
| Spending limits | On-chain enforced per-tx | None | API-level (bypassable) |
|
|
201
|
+
| Prompt injection safe | Chain rejects over-limit txs | Full key access, no limits | Trust the provider |
|
|
202
|
+
| Escrow payments | Built-in (Handshake) | Build from scratch | Varies |
|
|
203
|
+
| Self-custody | Yes, local keys | Yes | No |
|
|
204
|
+
| Tx verification | Built-in decoder + risk flags | Manual parsing | N/A |
|
|
205
|
+
| Time to first payment | 2 minutes | Hours | Minutes |
|
|
206
|
+
| Open source | MIT | Yes | Usually no |
|
|
207
|
+
|
|
208
|
+
## Use With AI Agents
|
|
209
|
+
|
|
210
|
+
The SDK is designed for AI agent frameworks. Here's a typical integration pattern:
|
|
211
|
+
|
|
212
|
+
```typescript
|
|
213
|
+
import {
|
|
214
|
+
loadConfig,
|
|
215
|
+
getApiUrl,
|
|
216
|
+
getApiKey,
|
|
217
|
+
createHttpClient,
|
|
218
|
+
verifyIntent,
|
|
219
|
+
} from '@rebelfi/agent-sdk';
|
|
220
|
+
|
|
221
|
+
// In your Claude/GPT/LangChain tool handler
|
|
222
|
+
async function handlePayment(recipient: string, amount: number, memo: string) {
|
|
223
|
+
const config = loadConfig();
|
|
224
|
+
const client = createHttpClient({
|
|
225
|
+
baseUrl: getApiUrl(config),
|
|
226
|
+
apiKey: getApiKey(config),
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
// Build, verify, sign, submit
|
|
230
|
+
// Policy-controlled — agent can't exceed human-set limits
|
|
231
|
+
const res = await client.post('/api/transfer/create', {
|
|
232
|
+
recipient,
|
|
233
|
+
amount,
|
|
234
|
+
memo,
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
// Verify the transaction matches your intent before signing
|
|
238
|
+
const check = await verifyIntent(res.data.transaction, {
|
|
239
|
+
type: 'create_transfer',
|
|
240
|
+
sender: config.wallets[0].address,
|
|
241
|
+
recipient,
|
|
242
|
+
amount: String(amount),
|
|
243
|
+
token: 'USDC',
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
if (!check.verified) throw new Error('Transaction mismatch');
|
|
247
|
+
return res.data;
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
Works with **Claude** (tool use / MCP), **GPT** (function calling), **LangChain**, **CrewAI**, **AutoGPT**, and any framework that supports tool/function definitions.
|
|
252
|
+
|
|
253
|
+
### MCP Integration
|
|
254
|
+
|
|
255
|
+
The SDK can be exposed as an [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server, giving Claude, Cursor, and other AI coding tools direct access to payments, account management, and transaction verification as tools. Build your own MCP wrapper or check the docs for the reference implementation.
|
|
256
|
+
|
|
257
|
+
## CLI Reference
|
|
258
|
+
|
|
259
|
+
| Command | Description |
|
|
260
|
+
|---------|-------------|
|
|
261
|
+
| `rebel init` | Create wallet + agent ID |
|
|
262
|
+
| `rebel auth register\|status\|revoke` | API key management |
|
|
263
|
+
| `rebel wallet create\|list\|fund` | Wallet operations |
|
|
264
|
+
| `rebel balance` | Check balances |
|
|
265
|
+
| `rebel pay <to> <amount>` | Send USDC payment |
|
|
266
|
+
| `rebel claim <pda>` | Claim a received payment |
|
|
267
|
+
| `rebel cancel <pda>` | Cancel a sent payment |
|
|
268
|
+
| `rebel payments list\|get` | Payment history |
|
|
269
|
+
| `rebel account sync\|status\|events\|deposit\|withdraw\|send` | RebelSig account |
|
|
270
|
+
| `rebel contacts add\|remove\|list\|get` | Address book |
|
|
271
|
+
| `rebel flows create\|list\|get\|cancel\|evaluate` | Conditional flows |
|
|
272
|
+
| `rebel config set-cluster\|get-cluster\|reset-cluster` | Configuration |
|
|
273
|
+
| `rebel chat <message>` | Support chat |
|
|
274
|
+
|
|
275
|
+
All commands support `--human` for human-readable output (default is JSON).
|
|
276
|
+
|
|
277
|
+
## Library API
|
|
278
|
+
|
|
279
|
+
```typescript
|
|
280
|
+
import {
|
|
281
|
+
// Config & client
|
|
282
|
+
loadConfig, saveConfig, getWallet, getApiUrl, getApiKey,
|
|
283
|
+
createHttpClient,
|
|
284
|
+
|
|
285
|
+
// Contacts
|
|
286
|
+
loadContacts, addContact, resolveRecipient,
|
|
287
|
+
|
|
288
|
+
// Transaction verification (V1 — Solana)
|
|
289
|
+
analyzeTransaction, verifyIntent,
|
|
290
|
+
|
|
291
|
+
// Intent framework (V2 — cross-chain)
|
|
292
|
+
verifyIntent as verifyIntentV2,
|
|
293
|
+
evaluateConstraint,
|
|
294
|
+
|
|
295
|
+
// Flows
|
|
296
|
+
loadFlows, addFlow, executeHeartbeat, createLimitOrder,
|
|
297
|
+
|
|
298
|
+
// Errors
|
|
299
|
+
SdkError, toSdkError,
|
|
300
|
+
} from '@rebelfi/agent-sdk';
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## Environment Variables
|
|
304
|
+
|
|
305
|
+
| Variable | Description |
|
|
306
|
+
|----------|-------------|
|
|
307
|
+
| `REBEL_API_URL` | Override the API endpoint |
|
|
308
|
+
| `REBEL_API_KEY` | Provide API key without local config |
|
|
309
|
+
|
|
310
|
+
## Development
|
|
311
|
+
|
|
312
|
+
```bash
|
|
313
|
+
bun run build # Dual ESM + CJS build
|
|
314
|
+
bun run dev # TypeScript watch mode
|
|
315
|
+
bun run test # Vitest (single run)
|
|
316
|
+
bun run test:watch # Vitest watch mode
|
|
317
|
+
bun run clean # Remove dist/
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
## Links
|
|
321
|
+
|
|
322
|
+
- [Documentation](https://docs.silkyway.ai)
|
|
323
|
+
- [GitHub Issues](https://github.com/silkysquad/silk/issues)
|
|
324
|
+
- [npm](https://www.npmjs.com/package/@rebelfi/agent-sdk)
|
|
325
|
+
- [Twitter](https://x.com/silkyway)
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
<p align="center">
|
|
330
|
+
If you find this useful, please consider giving it a star — it helps others discover the project.
|
|
331
|
+
<br /><br />
|
|
332
|
+
<a href="https://github.com/silkysquad/silk">Star on GitHub</a>
|
|
333
|
+
</p>
|
|
334
|
+
|
|
335
|
+
## License
|
|
336
|
+
|
|
337
|
+
MIT
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface DecimalValue {
|
|
2
|
+
int: bigint;
|
|
3
|
+
scale: number;
|
|
4
|
+
}
|
|
5
|
+
export declare function parseDecimal(value: string | number): DecimalValue | null;
|
|
6
|
+
export declare function compareDecimals(a: DecimalValue, b: DecimalValue): number;
|
|
7
|
+
export declare function formatUnits(amount: bigint, decimals: number): string;
|
|
8
|
+
export declare function withinRelativeTolerance(expected: DecimalValue, actual: DecimalValue, tolerance: DecimalValue): boolean;
|
|
9
|
+
export declare function extractAmountFromHuman(amountHuman: string | undefined): string | null;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
const DECIMAL_RE = /^-?\d+(?:\.\d+)?$/;
|
|
2
|
+
export function parseDecimal(value) {
|
|
3
|
+
const input = String(value).trim();
|
|
4
|
+
if (!DECIMAL_RE.test(input)) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
const negative = input.startsWith('-');
|
|
8
|
+
const unsigned = negative ? input.slice(1) : input;
|
|
9
|
+
const [wholeRaw, fractionRaw = ''] = unsigned.split('.');
|
|
10
|
+
const whole = stripLeadingZeros(wholeRaw);
|
|
11
|
+
const fraction = stripTrailingZeros(fractionRaw);
|
|
12
|
+
const digits = `${whole}${fraction}`;
|
|
13
|
+
const int = BigInt(digits === '' ? '0' : digits) * (negative ? -1n : 1n);
|
|
14
|
+
return { int, scale: fraction.length };
|
|
15
|
+
}
|
|
16
|
+
export function compareDecimals(a, b) {
|
|
17
|
+
const scale = Math.max(a.scale, b.scale);
|
|
18
|
+
const aInt = scaleDecimal(a, scale);
|
|
19
|
+
const bInt = scaleDecimal(b, scale);
|
|
20
|
+
if (aInt === bInt)
|
|
21
|
+
return 0;
|
|
22
|
+
return aInt > bInt ? 1 : -1;
|
|
23
|
+
}
|
|
24
|
+
export function formatUnits(amount, decimals) {
|
|
25
|
+
if (decimals <= 0) {
|
|
26
|
+
return amount.toString();
|
|
27
|
+
}
|
|
28
|
+
const negative = amount < 0n;
|
|
29
|
+
const absAmount = negative ? -amount : amount;
|
|
30
|
+
const base = 10n ** BigInt(decimals);
|
|
31
|
+
const whole = absAmount / base;
|
|
32
|
+
const fraction = absAmount % base;
|
|
33
|
+
if (fraction === 0n) {
|
|
34
|
+
return `${negative ? '-' : ''}${whole.toString()}`;
|
|
35
|
+
}
|
|
36
|
+
const fractionStr = fraction.toString().padStart(decimals, '0').replace(/0+$/, '');
|
|
37
|
+
return `${negative ? '-' : ''}${whole.toString()}.${fractionStr}`;
|
|
38
|
+
}
|
|
39
|
+
export function withinRelativeTolerance(expected, actual, tolerance) {
|
|
40
|
+
if (tolerance.int < 0n)
|
|
41
|
+
return false;
|
|
42
|
+
const valueScale = Math.max(expected.scale, actual.scale);
|
|
43
|
+
const expectedInt = scaleDecimal(expected, valueScale);
|
|
44
|
+
const actualInt = scaleDecimal(actual, valueScale);
|
|
45
|
+
if (expectedInt === 0n) {
|
|
46
|
+
return actualInt === 0n;
|
|
47
|
+
}
|
|
48
|
+
const diff = abs(actualInt - expectedInt);
|
|
49
|
+
const tolDen = 10n ** BigInt(tolerance.scale);
|
|
50
|
+
const lhs = diff * tolDen;
|
|
51
|
+
const rhs = abs(expectedInt) * tolerance.int;
|
|
52
|
+
return lhs <= rhs;
|
|
53
|
+
}
|
|
54
|
+
export function extractAmountFromHuman(amountHuman) {
|
|
55
|
+
if (!amountHuman)
|
|
56
|
+
return null;
|
|
57
|
+
const [amount] = amountHuman.trim().split(/\s+/);
|
|
58
|
+
if (!amount || !DECIMAL_RE.test(amount)) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return amount;
|
|
62
|
+
}
|
|
63
|
+
function scaleDecimal(value, targetScale) {
|
|
64
|
+
if (targetScale < value.scale) {
|
|
65
|
+
throw new Error('targetScale must be >= current scale');
|
|
66
|
+
}
|
|
67
|
+
const multiplier = 10n ** BigInt(targetScale - value.scale);
|
|
68
|
+
return value.int * multiplier;
|
|
69
|
+
}
|
|
70
|
+
function stripLeadingZeros(value) {
|
|
71
|
+
const stripped = value.replace(/^0+/, '');
|
|
72
|
+
return stripped === '' ? '0' : stripped;
|
|
73
|
+
}
|
|
74
|
+
function stripTrailingZeros(value) {
|
|
75
|
+
return value.replace(/0+$/, '');
|
|
76
|
+
}
|
|
77
|
+
function abs(value) {
|
|
78
|
+
return value < 0n ? -value : value;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=amount-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amount-utils.js","sourceRoot":"","sources":["../src/amount-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseDecimal = parseDecimal;
|
|
4
|
+
exports.compareDecimals = compareDecimals;
|
|
5
|
+
exports.formatUnits = formatUnits;
|
|
6
|
+
exports.withinRelativeTolerance = withinRelativeTolerance;
|
|
7
|
+
exports.extractAmountFromHuman = extractAmountFromHuman;
|
|
8
|
+
const DECIMAL_RE = /^-?\d+(?:\.\d+)?$/;
|
|
9
|
+
function parseDecimal(value) {
|
|
10
|
+
const input = String(value).trim();
|
|
11
|
+
if (!DECIMAL_RE.test(input)) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const negative = input.startsWith('-');
|
|
15
|
+
const unsigned = negative ? input.slice(1) : input;
|
|
16
|
+
const [wholeRaw, fractionRaw = ''] = unsigned.split('.');
|
|
17
|
+
const whole = stripLeadingZeros(wholeRaw);
|
|
18
|
+
const fraction = stripTrailingZeros(fractionRaw);
|
|
19
|
+
const digits = `${whole}${fraction}`;
|
|
20
|
+
const int = BigInt(digits === '' ? '0' : digits) * (negative ? -1n : 1n);
|
|
21
|
+
return { int, scale: fraction.length };
|
|
22
|
+
}
|
|
23
|
+
function compareDecimals(a, b) {
|
|
24
|
+
const scale = Math.max(a.scale, b.scale);
|
|
25
|
+
const aInt = scaleDecimal(a, scale);
|
|
26
|
+
const bInt = scaleDecimal(b, scale);
|
|
27
|
+
if (aInt === bInt)
|
|
28
|
+
return 0;
|
|
29
|
+
return aInt > bInt ? 1 : -1;
|
|
30
|
+
}
|
|
31
|
+
function formatUnits(amount, decimals) {
|
|
32
|
+
if (decimals <= 0) {
|
|
33
|
+
return amount.toString();
|
|
34
|
+
}
|
|
35
|
+
const negative = amount < 0n;
|
|
36
|
+
const absAmount = negative ? -amount : amount;
|
|
37
|
+
const base = 10n ** BigInt(decimals);
|
|
38
|
+
const whole = absAmount / base;
|
|
39
|
+
const fraction = absAmount % base;
|
|
40
|
+
if (fraction === 0n) {
|
|
41
|
+
return `${negative ? '-' : ''}${whole.toString()}`;
|
|
42
|
+
}
|
|
43
|
+
const fractionStr = fraction.toString().padStart(decimals, '0').replace(/0+$/, '');
|
|
44
|
+
return `${negative ? '-' : ''}${whole.toString()}.${fractionStr}`;
|
|
45
|
+
}
|
|
46
|
+
function withinRelativeTolerance(expected, actual, tolerance) {
|
|
47
|
+
if (tolerance.int < 0n)
|
|
48
|
+
return false;
|
|
49
|
+
const valueScale = Math.max(expected.scale, actual.scale);
|
|
50
|
+
const expectedInt = scaleDecimal(expected, valueScale);
|
|
51
|
+
const actualInt = scaleDecimal(actual, valueScale);
|
|
52
|
+
if (expectedInt === 0n) {
|
|
53
|
+
return actualInt === 0n;
|
|
54
|
+
}
|
|
55
|
+
const diff = abs(actualInt - expectedInt);
|
|
56
|
+
const tolDen = 10n ** BigInt(tolerance.scale);
|
|
57
|
+
const lhs = diff * tolDen;
|
|
58
|
+
const rhs = abs(expectedInt) * tolerance.int;
|
|
59
|
+
return lhs <= rhs;
|
|
60
|
+
}
|
|
61
|
+
function extractAmountFromHuman(amountHuman) {
|
|
62
|
+
if (!amountHuman)
|
|
63
|
+
return null;
|
|
64
|
+
const [amount] = amountHuman.trim().split(/\s+/);
|
|
65
|
+
if (!amount || !DECIMAL_RE.test(amount)) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return amount;
|
|
69
|
+
}
|
|
70
|
+
function scaleDecimal(value, targetScale) {
|
|
71
|
+
if (targetScale < value.scale) {
|
|
72
|
+
throw new Error('targetScale must be >= current scale');
|
|
73
|
+
}
|
|
74
|
+
const multiplier = 10n ** BigInt(targetScale - value.scale);
|
|
75
|
+
return value.int * multiplier;
|
|
76
|
+
}
|
|
77
|
+
function stripLeadingZeros(value) {
|
|
78
|
+
const stripped = value.replace(/^0+/, '');
|
|
79
|
+
return stripped === '' ? '0' : stripped;
|
|
80
|
+
}
|
|
81
|
+
function stripTrailingZeros(value) {
|
|
82
|
+
return value.replace(/0+$/, '');
|
|
83
|
+
}
|
|
84
|
+
function abs(value) {
|
|
85
|
+
return value < 0n ? -value : value;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=amount-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amount-utils.js","sourceRoot":"","sources":["../../src/amount-utils.ts"],"names":[],"mappings":"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"}
|