@rubicon-caliga/agent-sdk 0.1.1 → 0.1.3
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 +42 -25
- package/dist/agent-client.d.ts +20 -5
- package/dist/agent-client.d.ts.map +1 -1
- package/dist/agent-client.js +82 -4
- package/dist/agent-client.js.map +1 -1
- package/dist/agent-client.test.d.ts +2 -0
- package/dist/agent-client.test.d.ts.map +1 -0
- package/dist/agent-client.test.js +191 -0
- package/dist/agent-client.test.js.map +1 -0
- package/dist/circle-agent-wallet.d.ts +6 -6
- package/dist/circle-agent-wallet.d.ts.map +1 -1
- package/dist/circle-agent-wallet.js +8 -8
- package/dist/circle-agent-wallet.js.map +1 -1
- package/dist/circle-cli-gateway-payment.d.ts +51 -4
- package/dist/circle-cli-gateway-payment.d.ts.map +1 -1
- package/dist/circle-cli-gateway-payment.js +85 -14
- package/dist/circle-cli-gateway-payment.js.map +1 -1
- package/dist/circle-cli-gateway-payment.test.js +110 -1
- package/dist/circle-cli-gateway-payment.test.js.map +1 -1
- package/dist/payment-engine.d.ts +17 -5
- package/dist/payment-engine.d.ts.map +1 -1
- package/dist/payment-engine.js +30 -2
- package/dist/payment-engine.js.map +1 -1
- package/package.json +2 -2
- package/src/agent-client.test.ts +205 -0
- package/src/agent-client.ts +93 -4
- package/src/circle-agent-wallet.ts +10 -12
- package/src/circle-cli-gateway-payment.test.ts +129 -0
- package/src/circle-cli-gateway-payment.ts +114 -15
- package/src/payment-engine.ts +39 -5
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { x402Client } from "@x402/core/client";
|
|
2
2
|
import { registerBatchScheme } from "@circle-fin/x402-batching/client";
|
|
3
3
|
import { ExactEvmScheme } from "@x402/evm/exact/client";
|
|
4
|
-
import
|
|
4
|
+
import * as CircleWallets from "@circle-fin/developer-controlled-wallets";
|
|
5
5
|
/**
|
|
6
6
|
* viem-shaped signer (`{ address, signTypedData }`) that delegates EIP-712
|
|
7
7
|
* signing to a Circle Agent Wallet over the API instead of holding a raw
|
|
@@ -46,7 +46,7 @@ class CircleAgentWalletSigner {
|
|
|
46
46
|
const res = await this.client.signTypedData({
|
|
47
47
|
walletId: this.walletId,
|
|
48
48
|
data: serializeTypedData(toEip712Payload(typed)),
|
|
49
|
-
memo: "Rubicon
|
|
49
|
+
memo: "Rubicon reading authorization",
|
|
50
50
|
});
|
|
51
51
|
const signature = res.data?.signature;
|
|
52
52
|
if (!signature) {
|
|
@@ -56,17 +56,17 @@ class CircleAgentWalletSigner {
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
59
|
-
* Circle Agent Wallet engine. Signs
|
|
60
|
-
* custodial Circle Agent Wallet
|
|
61
|
-
*
|
|
62
|
-
*
|
|
59
|
+
* Circle Agent Wallet engine. Signs gateway authorization terms with a
|
|
60
|
+
* custodial Circle Agent Wallet so the buyer agent never handles a local
|
|
61
|
+
* signing key. Current gateways may still call the legacy one-word method as a
|
|
62
|
+
* chunk-compatibility path.
|
|
63
63
|
*/
|
|
64
64
|
export class CircleAgentWalletEngine {
|
|
65
65
|
x402 = new x402Client();
|
|
66
66
|
signer;
|
|
67
67
|
constructor(options) {
|
|
68
68
|
const client = options.client ??
|
|
69
|
-
initiateDeveloperControlledWalletsClient({
|
|
69
|
+
CircleWallets.initiateDeveloperControlledWalletsClient({
|
|
70
70
|
apiKey: options.apiKey,
|
|
71
71
|
entitySecret: options.entitySecret,
|
|
72
72
|
...(options.baseUrl ? { baseUrl: options.baseUrl } : {}),
|
|
@@ -81,7 +81,7 @@ export class CircleAgentWalletEngine {
|
|
|
81
81
|
}
|
|
82
82
|
async createWordPayment(session) {
|
|
83
83
|
if (!session.paymentRequired) {
|
|
84
|
-
throw new Error("Session did not include
|
|
84
|
+
throw new Error("Session did not include a legacy x402 payment requirement");
|
|
85
85
|
}
|
|
86
86
|
// Resolve the wallet address up front so the synchronous `address` read
|
|
87
87
|
// inside createPaymentPayload sees a real value.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circle-agent-wallet.js","sourceRoot":"","sources":["../src/circle-agent-wallet.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,
|
|
1
|
+
{"version":3,"file":"circle-agent-wallet.js","sourceRoot":"","sources":["../src/circle-agent-wallet.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,24 @@ export interface CircleCliGatewayPaymentEngineOptions {
|
|
|
5
5
|
/**
|
|
6
6
|
* Agent Wallet address controlled by Circle CLI. When omitted, the engine
|
|
7
7
|
* resolves the sole agent wallet returned by `circle wallet list`.
|
|
8
|
+
*
|
|
9
|
+
* @deprecated Use `agentWalletAddress`. This alias is kept for existing SDK
|
|
10
|
+
* callers and is treated as the Circle CLI signing wallet, not the x402
|
|
11
|
+
* authorization `from` address.
|
|
8
12
|
*/
|
|
9
13
|
walletAddress?: `0x${string}`;
|
|
14
|
+
/**
|
|
15
|
+
* Agent Wallet address controlled by Circle CLI. This is passed to
|
|
16
|
+
* `circle wallet sign typed-data --address`.
|
|
17
|
+
*/
|
|
18
|
+
agentWalletAddress?: `0x${string}`;
|
|
19
|
+
/**
|
|
20
|
+
* Gateway backing EOA used as the x402 authorization `from` address. When
|
|
21
|
+
* omitted, the engine resolves it from `circle gateway balance`.
|
|
22
|
+
*/
|
|
23
|
+
buyerWalletAddress?: `0x${string}`;
|
|
24
|
+
/** Alias for `buyerWalletAddress`. */
|
|
25
|
+
backingEOA?: `0x${string}`;
|
|
10
26
|
/** Circle CLI chain name. Rubicon real reads settle on Arc Testnet by default. */
|
|
11
27
|
chain?: string;
|
|
12
28
|
/** Circle CLI binary name or path. */
|
|
@@ -14,18 +30,49 @@ export interface CircleCliGatewayPaymentEngineOptions {
|
|
|
14
30
|
/** Command runner injection point for tests or hosted agent sandboxes. */
|
|
15
31
|
runner?: CircleCliRunner;
|
|
16
32
|
}
|
|
33
|
+
interface TypedDataRequest {
|
|
34
|
+
domain: Record<string, unknown>;
|
|
35
|
+
types: Record<string, unknown>;
|
|
36
|
+
primaryType: string;
|
|
37
|
+
message: Record<string, unknown>;
|
|
38
|
+
}
|
|
17
39
|
/**
|
|
18
|
-
* Circle CLI / Agent Wallet payment engine. It
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
40
|
+
* Circle CLI / Agent Wallet payment engine. It delegates EIP-712 signing to
|
|
41
|
+
* `circle wallet sign typed-data`, so agents never need raw private keys or
|
|
42
|
+
* hand-built Circle / Arc payloads. Current gateways may call the legacy
|
|
43
|
+
* one-word method as a chunk-compatibility path.
|
|
22
44
|
*/
|
|
23
45
|
export declare class CircleCliGatewayPaymentEngine implements AgentPaymentEngine {
|
|
24
46
|
private readonly x402;
|
|
25
47
|
private readonly signer;
|
|
26
48
|
constructor(options?: CircleCliGatewayPaymentEngineOptions);
|
|
27
49
|
createWordPayment(session: StartSessionResponse): Promise<StreamPaymentRequest>;
|
|
50
|
+
createChunkPayment(session: StartSessionResponse, input: {
|
|
51
|
+
nextSequence: number;
|
|
52
|
+
maxWords: number;
|
|
53
|
+
}): Promise<StreamPaymentRequest>;
|
|
54
|
+
}
|
|
55
|
+
export declare class CircleCliGatewaySigner {
|
|
56
|
+
private readonly options;
|
|
57
|
+
agentWalletAddress: `0x${string}`;
|
|
58
|
+
address: `0x${string}`;
|
|
59
|
+
private resolved;
|
|
60
|
+
private resolving?;
|
|
61
|
+
constructor(options: {
|
|
62
|
+
agentWalletAddress?: `0x${string}`;
|
|
63
|
+
buyerWalletAddress?: `0x${string}`;
|
|
64
|
+
chain: string;
|
|
65
|
+
command: string;
|
|
66
|
+
runner: CircleCliRunner;
|
|
67
|
+
});
|
|
68
|
+
ensureAddress(): Promise<void>;
|
|
69
|
+
signTypedData(typed: TypedDataRequest): Promise<`0x${string}`>;
|
|
70
|
+
private resolveAddress;
|
|
71
|
+
private resolveAgentWalletAddress;
|
|
72
|
+
private resolveBackingEOA;
|
|
28
73
|
}
|
|
29
74
|
export declare function parseCircleCliSignature(output: string): `0x${string}`;
|
|
30
75
|
export declare function parseCircleCliWalletAddress(output: string): `0x${string}`;
|
|
76
|
+
export declare function parseCircleGatewayBackingEOA(output: string): `0x${string}`;
|
|
77
|
+
export {};
|
|
31
78
|
//# sourceMappingURL=circle-cli-gateway-payment.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circle-cli-gateway-payment.d.ts","sourceRoot":"","sources":["../src/circle-cli-gateway-payment.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAIvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAK9D,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEnF,MAAM,WAAW,oCAAoC;IACnD
|
|
1
|
+
{"version":3,"file":"circle-cli-gateway-payment.d.ts","sourceRoot":"","sources":["../src/circle-cli-gateway-payment.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAIvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAK9D,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEnF,MAAM,WAAW,oCAAoC;IACnD;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC9B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IACnC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IACnC,sCAAsC;IACtC,UAAU,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3B,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED;;;;;GAKG;AACH,qBAAa,6BAA8B,YAAW,kBAAkB;IACtE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;gBAEpC,OAAO,GAAE,oCAAyC;IAcxD,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAU/E,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAkB1I;AAED,qBAAa,sBAAsB;IAO/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,kBAAkB,EAAE,KAAK,MAAM,EAAE,CAAgD;IACjF,OAAO,EAAE,KAAK,MAAM,EAAE,CAAgD;IACtE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAC,CAAgB;gBAGf,OAAO,EAAE;QACxB,kBAAkB,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;QACnC,kBAAkB,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;QACnC,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,eAAe,CAAC;KACzB;IAaG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,aAAa,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC;YAgBtD,cAAc;YASd,yBAAyB;YAczB,iBAAiB;CAahC;AAgBD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAiBrE;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAezE;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAO1E"}
|
|
@@ -6,17 +6,18 @@ import { ExactEvmScheme } from "@x402/evm/exact/client";
|
|
|
6
6
|
import { serializeTypedData, toEip712Payload } from "./circle-agent-wallet.js";
|
|
7
7
|
const execFileAsync = promisify(execFile);
|
|
8
8
|
/**
|
|
9
|
-
* Circle CLI / Agent Wallet payment engine. It
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
9
|
+
* Circle CLI / Agent Wallet payment engine. It delegates EIP-712 signing to
|
|
10
|
+
* `circle wallet sign typed-data`, so agents never need raw private keys or
|
|
11
|
+
* hand-built Circle / Arc payloads. Current gateways may call the legacy
|
|
12
|
+
* one-word method as a chunk-compatibility path.
|
|
13
13
|
*/
|
|
14
14
|
export class CircleCliGatewayPaymentEngine {
|
|
15
15
|
x402 = new x402Client();
|
|
16
16
|
signer;
|
|
17
17
|
constructor(options = {}) {
|
|
18
18
|
this.signer = new CircleCliGatewaySigner({
|
|
19
|
-
|
|
19
|
+
agentWalletAddress: options.agentWalletAddress ?? options.walletAddress,
|
|
20
|
+
buyerWalletAddress: options.buyerWalletAddress ?? options.backingEOA,
|
|
20
21
|
chain: options.chain ?? "ARC-TESTNET",
|
|
21
22
|
command: options.command ?? "circle",
|
|
22
23
|
runner: options.runner ?? runCircleCli,
|
|
@@ -28,23 +29,45 @@ export class CircleCliGatewayPaymentEngine {
|
|
|
28
29
|
}
|
|
29
30
|
async createWordPayment(session) {
|
|
30
31
|
if (!session.paymentRequired) {
|
|
31
|
-
throw new Error("Session did not include
|
|
32
|
+
throw new Error("Session did not include a legacy x402 payment requirement");
|
|
32
33
|
}
|
|
33
34
|
await this.signer.ensureAddress();
|
|
34
35
|
return {
|
|
35
36
|
paymentPayload: await this.x402.createPaymentPayload(session.paymentRequired),
|
|
36
37
|
};
|
|
37
38
|
}
|
|
39
|
+
async createChunkPayment(session, input) {
|
|
40
|
+
if (!session.paymentRequired) {
|
|
41
|
+
throw new Error("Session did not include an x402 payment requirement");
|
|
42
|
+
}
|
|
43
|
+
await this.signer.ensureAddress();
|
|
44
|
+
const amountAtomic = BigInt(session.wordPaymentAtomic) * BigInt(input.maxWords);
|
|
45
|
+
return {
|
|
46
|
+
paymentPayload: await this.x402.createPaymentPayload(withChunkRequirement(session.paymentRequired, {
|
|
47
|
+
amountAtomic: `${amountAtomic}`,
|
|
48
|
+
maxWords: input.maxWords,
|
|
49
|
+
nextSequence: input.nextSequence,
|
|
50
|
+
sessionId: session.sessionId,
|
|
51
|
+
})),
|
|
52
|
+
maxWords: input.maxWords,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
38
55
|
}
|
|
39
|
-
class CircleCliGatewaySigner {
|
|
56
|
+
export class CircleCliGatewaySigner {
|
|
40
57
|
options;
|
|
58
|
+
agentWalletAddress = "0x0000000000000000000000000000000000000000";
|
|
41
59
|
address = "0x0000000000000000000000000000000000000000";
|
|
42
60
|
resolved = false;
|
|
43
61
|
resolving;
|
|
44
62
|
constructor(options) {
|
|
45
63
|
this.options = options;
|
|
46
|
-
if (options.
|
|
47
|
-
this.
|
|
64
|
+
if (options.agentWalletAddress) {
|
|
65
|
+
this.agentWalletAddress = options.agentWalletAddress;
|
|
66
|
+
}
|
|
67
|
+
if (options.buyerWalletAddress) {
|
|
68
|
+
this.address = options.buyerWalletAddress;
|
|
69
|
+
}
|
|
70
|
+
if (options.agentWalletAddress && options.buyerWalletAddress) {
|
|
48
71
|
this.resolved = true;
|
|
49
72
|
}
|
|
50
73
|
}
|
|
@@ -64,7 +87,7 @@ class CircleCliGatewaySigner {
|
|
|
64
87
|
"typed-data",
|
|
65
88
|
serializeTypedData(toEip712Payload(typed)),
|
|
66
89
|
"--address",
|
|
67
|
-
this.
|
|
90
|
+
this.agentWalletAddress,
|
|
68
91
|
"--chain",
|
|
69
92
|
this.options.chain,
|
|
70
93
|
"--quiet",
|
|
@@ -72,6 +95,13 @@ class CircleCliGatewaySigner {
|
|
|
72
95
|
return parseCircleCliSignature(signature);
|
|
73
96
|
}
|
|
74
97
|
async resolveAddress() {
|
|
98
|
+
const agentWalletAddress = this.options.agentWalletAddress ?? (await this.resolveAgentWalletAddress());
|
|
99
|
+
this.agentWalletAddress = agentWalletAddress;
|
|
100
|
+
this.address =
|
|
101
|
+
this.options.buyerWalletAddress ?? (await this.resolveBackingEOA(agentWalletAddress));
|
|
102
|
+
this.resolved = true;
|
|
103
|
+
}
|
|
104
|
+
async resolveAgentWalletAddress() {
|
|
75
105
|
const output = await this.options.runner(this.options.command, [
|
|
76
106
|
"wallet",
|
|
77
107
|
"list",
|
|
@@ -82,9 +112,20 @@ class CircleCliGatewaySigner {
|
|
|
82
112
|
"--output",
|
|
83
113
|
"json",
|
|
84
114
|
]);
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
115
|
+
return parseCircleCliWalletAddress(output);
|
|
116
|
+
}
|
|
117
|
+
async resolveBackingEOA(agentWalletAddress) {
|
|
118
|
+
const output = await this.options.runner(this.options.command, [
|
|
119
|
+
"gateway",
|
|
120
|
+
"balance",
|
|
121
|
+
"--address",
|
|
122
|
+
agentWalletAddress,
|
|
123
|
+
"--chain",
|
|
124
|
+
this.options.chain,
|
|
125
|
+
"--output",
|
|
126
|
+
"json",
|
|
127
|
+
]);
|
|
128
|
+
return parseCircleGatewayBackingEOA(output);
|
|
88
129
|
}
|
|
89
130
|
}
|
|
90
131
|
async function runCircleCli(command, args) {
|
|
@@ -130,7 +171,15 @@ export function parseCircleCliWalletAddress(output) {
|
|
|
130
171
|
if (unique.length === 0) {
|
|
131
172
|
throw new Error("Circle CLI did not return an Agent Wallet address");
|
|
132
173
|
}
|
|
133
|
-
throw new Error("Multiple Circle Agent Wallets found; pass
|
|
174
|
+
throw new Error("Multiple Circle Agent Wallets found; pass agentWalletAddress explicitly");
|
|
175
|
+
}
|
|
176
|
+
export function parseCircleGatewayBackingEOA(output) {
|
|
177
|
+
const parsed = parseJson(output);
|
|
178
|
+
const backingEOA = findString(parsed, ["data.backingEOA", "backingEOA"]);
|
|
179
|
+
if (backingEOA && isAddress(backingEOA)) {
|
|
180
|
+
return backingEOA;
|
|
181
|
+
}
|
|
182
|
+
throw new Error("Circle Gateway balance did not return a backingEOA address");
|
|
134
183
|
}
|
|
135
184
|
function collectWalletCandidates(value) {
|
|
136
185
|
if (Array.isArray(value)) {
|
|
@@ -165,6 +214,28 @@ function findString(value, keys) {
|
|
|
165
214
|
}
|
|
166
215
|
return undefined;
|
|
167
216
|
}
|
|
217
|
+
function withChunkRequirement(paymentRequired, chunk) {
|
|
218
|
+
const source = paymentRequired;
|
|
219
|
+
if (!Array.isArray(source.accepts)) {
|
|
220
|
+
return paymentRequired;
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
...paymentRequired,
|
|
224
|
+
accepts: source.accepts.map((accept) => ({
|
|
225
|
+
...accept,
|
|
226
|
+
amount: chunk.amountAtomic,
|
|
227
|
+
extra: {
|
|
228
|
+
...(accept.extra ?? {}),
|
|
229
|
+
amountAtomic: chunk.amountAtomic,
|
|
230
|
+
maxWords: chunk.maxWords,
|
|
231
|
+
sequence: chunk.nextSequence,
|
|
232
|
+
authorizationMode: "chunk",
|
|
233
|
+
nonce: `${chunk.sessionId}:${chunk.nextSequence}:${chunk.maxWords}`,
|
|
234
|
+
idempotencyKey: `${chunk.sessionId}:${chunk.nextSequence}:${chunk.maxWords}`,
|
|
235
|
+
},
|
|
236
|
+
})),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
168
239
|
function parseJson(value) {
|
|
169
240
|
try {
|
|
170
241
|
return JSON.parse(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circle-cli-gateway-payment.js","sourceRoot":"","sources":["../src/circle-cli-gateway-payment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE/E,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"circle-cli-gateway-payment.js","sourceRoot":"","sources":["../src/circle-cli-gateway-payment.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { test } from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import { parseCircleCliSignature, parseCircleCliWalletAddress, } from "./circle-cli-gateway-payment.js";
|
|
3
|
+
import { CircleCliGatewaySigner, parseCircleGatewayBackingEOA, parseCircleCliSignature, parseCircleCliWalletAddress, } from "./circle-cli-gateway-payment.js";
|
|
4
4
|
test("parses quiet Circle CLI signatures", () => {
|
|
5
5
|
assert.equal(parseCircleCliSignature("0xabc123\n"), "0xabc123");
|
|
6
6
|
});
|
|
@@ -21,6 +21,115 @@ test("parses a sole wallet address from Circle CLI list output", () => {
|
|
|
21
21
|
},
|
|
22
22
|
})), "0x1111111111111111111111111111111111111111");
|
|
23
23
|
});
|
|
24
|
+
test("parses backing EOA from Circle Gateway balance output", () => {
|
|
25
|
+
assert.equal(parseCircleGatewayBackingEOA(JSON.stringify({
|
|
26
|
+
data: {
|
|
27
|
+
backingEOA: "0x2222222222222222222222222222222222222222",
|
|
28
|
+
},
|
|
29
|
+
})), "0x2222222222222222222222222222222222222222");
|
|
30
|
+
});
|
|
31
|
+
test("separates Circle CLI Agent Wallet address from x402 backing EOA", async () => {
|
|
32
|
+
const calls = [];
|
|
33
|
+
const signer = new CircleCliGatewaySigner({
|
|
34
|
+
agentWalletAddress: "0x1111111111111111111111111111111111111111",
|
|
35
|
+
chain: "ARC-TESTNET",
|
|
36
|
+
command: "circle",
|
|
37
|
+
runner: async (_command, args) => {
|
|
38
|
+
calls.push(args);
|
|
39
|
+
assert.deepEqual(args, [
|
|
40
|
+
"gateway",
|
|
41
|
+
"balance",
|
|
42
|
+
"--address",
|
|
43
|
+
"0x1111111111111111111111111111111111111111",
|
|
44
|
+
"--chain",
|
|
45
|
+
"ARC-TESTNET",
|
|
46
|
+
"--output",
|
|
47
|
+
"json",
|
|
48
|
+
]);
|
|
49
|
+
return JSON.stringify({
|
|
50
|
+
data: {
|
|
51
|
+
backingEOA: "0x2222222222222222222222222222222222222222",
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
await signer.ensureAddress();
|
|
57
|
+
assert.equal(signer.agentWalletAddress, "0x1111111111111111111111111111111111111111");
|
|
58
|
+
assert.equal(signer.address, "0x2222222222222222222222222222222222222222");
|
|
59
|
+
assert.equal(calls.length, 1);
|
|
60
|
+
});
|
|
61
|
+
test("discovers sole Agent Wallet and then its Gateway backing EOA", async () => {
|
|
62
|
+
const calls = [];
|
|
63
|
+
const signer = new CircleCliGatewaySigner({
|
|
64
|
+
chain: "ARC-TESTNET",
|
|
65
|
+
command: "circle",
|
|
66
|
+
runner: async (_command, args) => {
|
|
67
|
+
calls.push(args);
|
|
68
|
+
if (args[0] === "wallet") {
|
|
69
|
+
return JSON.stringify({
|
|
70
|
+
data: {
|
|
71
|
+
wallets: [{ address: "0x1111111111111111111111111111111111111111" }],
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return JSON.stringify({
|
|
76
|
+
data: {
|
|
77
|
+
backingEOA: "0x2222222222222222222222222222222222222222",
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
await signer.ensureAddress();
|
|
83
|
+
assert.equal(signer.agentWalletAddress, "0x1111111111111111111111111111111111111111");
|
|
84
|
+
assert.equal(signer.address, "0x2222222222222222222222222222222222222222");
|
|
85
|
+
assert.deepEqual(calls, [
|
|
86
|
+
["wallet", "list", "--chain", "ARC-TESTNET", "--type", "agent", "--output", "json"],
|
|
87
|
+
[
|
|
88
|
+
"gateway",
|
|
89
|
+
"balance",
|
|
90
|
+
"--address",
|
|
91
|
+
"0x1111111111111111111111111111111111111111",
|
|
92
|
+
"--chain",
|
|
93
|
+
"ARC-TESTNET",
|
|
94
|
+
"--output",
|
|
95
|
+
"json",
|
|
96
|
+
],
|
|
97
|
+
]);
|
|
98
|
+
});
|
|
99
|
+
test("typed data message.from uses backing EOA while CLI signs with Agent Wallet", async () => {
|
|
100
|
+
let signedPayload;
|
|
101
|
+
const signer = new CircleCliGatewaySigner({
|
|
102
|
+
agentWalletAddress: "0x1111111111111111111111111111111111111111",
|
|
103
|
+
buyerWalletAddress: "0x2222222222222222222222222222222222222222",
|
|
104
|
+
chain: "ARC-TESTNET",
|
|
105
|
+
command: "circle",
|
|
106
|
+
runner: async (_command, args) => {
|
|
107
|
+
const addressFlag = args.indexOf("--address");
|
|
108
|
+
assert.equal(args[addressFlag + 1], "0x1111111111111111111111111111111111111111");
|
|
109
|
+
signedPayload = JSON.parse(args[3] ?? "{}");
|
|
110
|
+
return "0xabc123";
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
await signer.ensureAddress();
|
|
114
|
+
assert.equal(signer.address, "0x2222222222222222222222222222222222222222");
|
|
115
|
+
await signer.signTypedData({
|
|
116
|
+
domain: { name: "USD Coin", version: "2", chainId: 5042002 },
|
|
117
|
+
types: {
|
|
118
|
+
TransferWithAuthorization: [
|
|
119
|
+
{ name: "from", type: "address" },
|
|
120
|
+
{ name: "to", type: "address" },
|
|
121
|
+
{ name: "value", type: "uint256" },
|
|
122
|
+
],
|
|
123
|
+
},
|
|
124
|
+
primaryType: "TransferWithAuthorization",
|
|
125
|
+
message: {
|
|
126
|
+
from: signer.address,
|
|
127
|
+
to: "0x3333333333333333333333333333333333333333",
|
|
128
|
+
value: 1n,
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
assert.equal((signedPayload?.message).from, "0x2222222222222222222222222222222222222222");
|
|
132
|
+
});
|
|
24
133
|
test("requires explicit wallet address when multiple Agent Wallets are present", () => {
|
|
25
134
|
assert.throws(() => parseCircleCliWalletAddress(JSON.stringify({
|
|
26
135
|
data: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circle-cli-gateway-payment.test.js","sourceRoot":"","sources":["../src/circle-cli-gateway-payment.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EACL,uBAAuB,EACvB,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AAEzC,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAC9C,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;IAC7C,MAAM,CAAC,KAAK,CACV,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,EAC5E,UAAU,CACX,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACnD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,QAAQ,CAAC,EAAE,wCAAwC,CAAC,CAAC;AACnG,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACpE,MAAM,CAAC,KAAK,CACV,2BAA2B,CACzB,IAAI,CAAC,SAAS,CAAC;QACb,IAAI,EAAE;YACJ,OAAO,EAAE;gBACP;oBACE,OAAO,EAAE,4CAA4C;iBACtD;aACF;SACF;KACF,CAAC,CACH,EACD,4CAA4C,CAC7C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0EAA0E,EAAE,GAAG,EAAE;IACpF,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CACH,2BAA2B,CACzB,IAAI,CAAC,SAAS,CAAC;QACb,IAAI,EAAE;YACJ,EAAE,OAAO,EAAE,4CAA4C,EAAE;YACzD,EAAE,OAAO,EAAE,4CAA4C,EAAE;SAC1D;KACF,CAAC,CACH,EACH,qCAAqC,CACtC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"circle-cli-gateway-payment.test.js","sourceRoot":"","sources":["../src/circle-cli-gateway-payment.test.ts"],"names":[],"mappings":"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"}
|
package/dist/payment-engine.d.ts
CHANGED
|
@@ -1,18 +1,30 @@
|
|
|
1
|
-
import type { StartSessionResponse, StreamPaymentRequest } from "@rubicon-caliga/core";
|
|
1
|
+
import type { StartSessionResponse, StreamAuthorizationRequest, StreamPaymentRequest } from "@rubicon-caliga/core";
|
|
2
2
|
/**
|
|
3
|
-
* Produces
|
|
4
|
-
*
|
|
3
|
+
* Produces Circle / Arc authorization payloads for Rubicon reads. Preferred
|
|
4
|
+
* engines authorize a whole session once; fallback engines authorize chunks.
|
|
5
|
+
* Legacy one-word payloads remain supported for older gateways and tests.
|
|
5
6
|
*/
|
|
6
7
|
export interface AgentPaymentEngine {
|
|
8
|
+
createSessionAuthorization?(session: StartSessionResponse): Promise<StreamAuthorizationRequest>;
|
|
9
|
+
createChunkPayment?(session: StartSessionResponse, input: {
|
|
10
|
+
nextSequence: number;
|
|
11
|
+
maxWords: number;
|
|
12
|
+
}): Promise<StreamPaymentRequest>;
|
|
13
|
+
/** @deprecated Compatibility path for one-word x402 gateways. */
|
|
7
14
|
createWordPayment(session: StartSessionResponse): Promise<StreamPaymentRequest>;
|
|
8
15
|
}
|
|
9
16
|
/**
|
|
10
|
-
* Development engine. Declares the
|
|
11
|
-
* for use against a dev-mode gateway. NOT for production.
|
|
17
|
+
* Development engine. Declares the authorized amount without settling real
|
|
18
|
+
* funds, for use against a dev-mode gateway. NOT for production.
|
|
12
19
|
*/
|
|
13
20
|
export declare class StaticPaymentEngine implements AgentPaymentEngine {
|
|
14
21
|
private readonly network;
|
|
15
22
|
constructor(network?: string);
|
|
23
|
+
createSessionAuthorization(session: StartSessionResponse): Promise<StreamAuthorizationRequest>;
|
|
24
|
+
createChunkPayment(session: StartSessionResponse, input: {
|
|
25
|
+
nextSequence: number;
|
|
26
|
+
maxWords: number;
|
|
27
|
+
}): Promise<StreamPaymentRequest>;
|
|
16
28
|
createWordPayment(session: StartSessionResponse): Promise<StreamPaymentRequest>;
|
|
17
29
|
}
|
|
18
30
|
//# sourceMappingURL=payment-engine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-engine.d.ts","sourceRoot":"","sources":["../src/payment-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"payment-engine.d.ts","sourceRoot":"","sources":["../src/payment-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEnH;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,0BAA0B,CAAC,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAChG,kBAAkB,CAAC,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrI,iEAAiE;IACjE,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACjF;AAED;;;GAGG;AACH,qBAAa,mBAAoB,YAAW,kBAAkB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,SAAmB;IAEjD,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAa9F,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAiBnI,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAWtF"}
|
package/dist/payment-engine.js
CHANGED
|
@@ -1,12 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Development engine. Declares the
|
|
3
|
-
* for use against a dev-mode gateway. NOT for production.
|
|
2
|
+
* Development engine. Declares the authorized amount without settling real
|
|
3
|
+
* funds, for use against a dev-mode gateway. NOT for production.
|
|
4
4
|
*/
|
|
5
5
|
export class StaticPaymentEngine {
|
|
6
6
|
network;
|
|
7
7
|
constructor(network = "eip155:5042002") {
|
|
8
8
|
this.network = network;
|
|
9
9
|
}
|
|
10
|
+
async createSessionAuthorization(session) {
|
|
11
|
+
return {
|
|
12
|
+
authorizationPayload: {
|
|
13
|
+
scheme: "development-static",
|
|
14
|
+
network: this.network,
|
|
15
|
+
sessionId: session.sessionId,
|
|
16
|
+
amountAtomic: session.authorizationRequired?.maxAuthorizedAtomic ?? session.maxArticlePriceAtomic,
|
|
17
|
+
meteringUnit: "word",
|
|
18
|
+
authorizationMode: "session",
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async createChunkPayment(session, input) {
|
|
23
|
+
const amountAtomic = BigInt(session.wordPaymentAtomic) * BigInt(input.maxWords);
|
|
24
|
+
return {
|
|
25
|
+
paymentPayload: {
|
|
26
|
+
scheme: "development-static",
|
|
27
|
+
network: this.network,
|
|
28
|
+
sessionId: session.sessionId,
|
|
29
|
+
amountAtomic: `${amountAtomic}`,
|
|
30
|
+
meteringUnit: "word",
|
|
31
|
+
authorizationMode: "chunk",
|
|
32
|
+
maxWords: input.maxWords,
|
|
33
|
+
nextSequence: input.nextSequence,
|
|
34
|
+
},
|
|
35
|
+
maxWords: input.maxWords,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
10
38
|
async createWordPayment(session) {
|
|
11
39
|
return {
|
|
12
40
|
paymentPayload: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-engine.js","sourceRoot":"","sources":["../src/payment-engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"payment-engine.js","sourceRoot":"","sources":["../src/payment-engine.ts"],"names":[],"mappings":"AAcA;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,UAAU,gBAAgB;QAA1B,YAAO,GAAP,OAAO,CAAmB;IAAG,CAAC;IAE3D,KAAK,CAAC,0BAA0B,CAAC,OAA6B;QAC5D,OAAO;YACL,oBAAoB,EAAE;gBACpB,MAAM,EAAE,oBAAoB;gBAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,YAAY,EAAE,OAAO,CAAC,qBAAqB,EAAE,mBAAmB,IAAI,OAAO,CAAC,qBAAqB;gBACjG,YAAY,EAAE,MAAM;gBACpB,iBAAiB,EAAE,SAAS;aAC7B;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAA6B,EAAE,KAAiD;QACvG,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAChF,OAAO;YACL,cAAc,EAAE;gBACd,MAAM,EAAE,oBAAoB;gBAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,YAAY,EAAE,GAAG,YAAY,EAAE;gBAC/B,YAAY,EAAE,MAAM;gBACpB,iBAAiB,EAAE,OAAO;gBAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,YAAY,EAAE,KAAK,CAAC,YAAY;aACjC;YACD,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAA6B;QACnD,OAAO;YACL,cAAc,EAAE;gBACd,MAAM,EAAE,oBAAoB;gBAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,YAAY,EAAE,OAAO,CAAC,iBAAiB;gBACvC,YAAY,EAAE,MAAM;aACrB;SACF,CAAC;IACJ,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rubicon-caliga/agent-sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Client SDK for autonomous agents consuming per-word article streams via Rubicon x402.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"@x402/evm": "^2.15.0",
|
|
32
32
|
"eventsource": "^4.0.0",
|
|
33
33
|
"viem": "^2.52.2",
|
|
34
|
-
"@rubicon-caliga/core": "0.1.
|
|
34
|
+
"@rubicon-caliga/core": "0.1.1"
|
|
35
35
|
},
|
|
36
36
|
"scripts": {
|
|
37
37
|
"build": "tsc -p tsconfig.json",
|