@agenticprimitives/payments 0.0.0-alpha.3 → 0.0.0-alpha.4
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/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/rails/x402/executor.d.ts +93 -0
- package/dist/rails/x402/executor.d.ts.map +1 -0
- package/dist/rails/x402/executor.js +200 -0
- package/dist/rails/x402/executor.js.map +1 -0
- package/dist/rails/x402/index.d.ts +11 -0
- package/dist/rails/x402/index.d.ts.map +1 -0
- package/dist/rails/x402/index.js +8 -0
- package/dist/rails/x402/index.js.map +1 -0
- package/dist/rails/x402/nonce-store.d.ts +30 -0
- package/dist/rails/x402/nonce-store.d.ts.map +1 -0
- package/dist/rails/x402/nonce-store.js +35 -0
- package/dist/rails/x402/nonce-store.js.map +1 -0
- package/dist/rails/x402/quote.d.ts +41 -0
- package/dist/rails/x402/quote.d.ts.map +1 -0
- package/dist/rails/x402/quote.js +84 -0
- package/dist/rails/x402/quote.js.map +1 -0
- package/dist/rails/x402/resource.d.ts +42 -0
- package/dist/rails/x402/resource.d.ts.map +1 -0
- package/dist/rails/x402/resource.js +71 -0
- package/dist/rails/x402/resource.js.map +1 -0
- package/dist/rails/x402/wire.d.ts +81 -0
- package/dist/rails/x402/wire.d.ts.map +1 -0
- package/dist/rails/x402/wire.js +125 -0
- package/dist/rails/x402/wire.js.map +1 -0
- package/package.json +5 -5
package/dist/index.d.ts
CHANGED
|
@@ -109,4 +109,5 @@ export interface PaymentRailExecutor {
|
|
|
109
109
|
}
|
|
110
110
|
export declare function registerRail(executor: PaymentRailExecutor): void;
|
|
111
111
|
export declare function getRail(rail: PaymentRail): PaymentRailExecutor | undefined;
|
|
112
|
+
export * as x402 from './rails/x402/index.js';
|
|
112
113
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -37,4 +37,6 @@ export function registerRail(executor) {
|
|
|
37
37
|
export function getRail(rail) {
|
|
38
38
|
return _rails.get(rail);
|
|
39
39
|
}
|
|
40
|
+
// Spec 272 — the x402 rail (staged executor + v2 wire + nonce store + resource binding).
|
|
41
|
+
export * as x402 from './rails/x402/index.js';
|
|
40
42
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,MAAM,CAAC,MAAM,YAAY,GAAG,6BAA6B,CAAC;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,iBAA0B,CAAC;AACzD,MAAM,CAAC,MAAM,QAAQ,GAAG,uBAAuB,CAAC;AAqEhD,sEAAsE;AACtE,MAAM,UAAU,yBAAyB,CAAC,EAAkB;IAC1D,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,mBAAmB,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,QAAQ,CAAC;IACjG,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,mIAAmI,CACpI,CAAC;IACJ,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,6BAA6B,CAAC,OAAuB;IACnE,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAKhC;IACC,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IACpF,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/D,OAAO,GAAY,CAAC;AACtB,CAAC;AASD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoC,CAAC;AAC3D,MAAM,UAAU,YAAY,CAAC,QAA6B;IACxD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC;AACD,MAAM,UAAU,OAAO,CAAC,IAAiB;IACvC,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAGrD,MAAM,CAAC,MAAM,YAAY,GAAG,6BAA6B,CAAC;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,iBAA0B,CAAC;AACzD,MAAM,CAAC,MAAM,QAAQ,GAAG,uBAAuB,CAAC;AAqEhD,sEAAsE;AACtE,MAAM,UAAU,yBAAyB,CAAC,EAAkB;IAC1D,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,mBAAmB,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,QAAQ,CAAC;IACjG,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,mIAAmI,CACpI,CAAC;IACJ,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,6BAA6B,CAAC,OAAuB;IACnE,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAKhC;IACC,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IACpF,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/D,OAAO,GAAY,CAAC;AACtB,CAAC;AASD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoC,CAAC;AAC3D,MAAM,UAAU,YAAY,CAAC,QAA6B;IACxD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC;AACD,MAAM,UAAU,OAAO,CAAC,IAAiB;IACvC,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,yFAAyF;AACzF,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { type Address, type Hex } from 'viem';
|
|
2
|
+
import type { Delegation } from '@agenticprimitives/delegation';
|
|
3
|
+
import { type PaymentMandate } from '../../index.js';
|
|
4
|
+
import type { Hex32 } from './resource.js';
|
|
5
|
+
import type { PaymentQuote } from './quote.js';
|
|
6
|
+
import type { NonceReservationStore } from './nonce-store.js';
|
|
7
|
+
/** x402-specific bits the mandate carries (PaymentMandate.railConfig). Binds the mandate to its quote. */
|
|
8
|
+
export interface X402RailConfig {
|
|
9
|
+
quoteId: Hex32;
|
|
10
|
+
resourceHash: Hex32;
|
|
11
|
+
}
|
|
12
|
+
/** PAY-RAIL-4 — the rail-scoped replay nullifier. */
|
|
13
|
+
export declare function computeNullifier(args: {
|
|
14
|
+
rail: string;
|
|
15
|
+
chainId: number;
|
|
16
|
+
payer: Address;
|
|
17
|
+
payee: Address;
|
|
18
|
+
asset: Address;
|
|
19
|
+
mandateId: Hex32;
|
|
20
|
+
nonce: bigint;
|
|
21
|
+
resourceHash: Hex32;
|
|
22
|
+
}): Hex32;
|
|
23
|
+
/**
|
|
24
|
+
* PAY-RAIL-1 — synchronous mandate verification against its persisted quote. Returns the first failure
|
|
25
|
+
* reason (or null). The async checks (revocation, nonce-unused) run in the rail's settle() flow.
|
|
26
|
+
*/
|
|
27
|
+
export declare function verifyMandate(mandate: PaymentMandate, quote: PaymentQuote, opts: {
|
|
28
|
+
now: number;
|
|
29
|
+
}): {
|
|
30
|
+
valid: true;
|
|
31
|
+
} | {
|
|
32
|
+
valid: false;
|
|
33
|
+
reason: string;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* PAY-RAIL-2 — build the redemption plan: DelegationManager.redeemDelegation(paymentDelegation,
|
|
37
|
+
* USDC.transfer(treasury, amount)) with the PaymentEnforcer caveat's `args` filled with the mandate's
|
|
38
|
+
* (mandateId, nonce, resourceHash) at REDEMPTION time. The caller submits `{to, value, data}` from the
|
|
39
|
+
* service relayer as a sponsored UserOp.
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildRedemptionCalldata(args: {
|
|
42
|
+
mandate: PaymentMandate;
|
|
43
|
+
delegation: Delegation;
|
|
44
|
+
delegationManager: Address;
|
|
45
|
+
paymentEnforcer: Address;
|
|
46
|
+
asset: Address;
|
|
47
|
+
resourceHash: Hex32;
|
|
48
|
+
}): {
|
|
49
|
+
to: Address;
|
|
50
|
+
value: bigint;
|
|
51
|
+
data: Hex;
|
|
52
|
+
};
|
|
53
|
+
export interface X402RailDeps {
|
|
54
|
+
chainId: number;
|
|
55
|
+
delegationManager: Address;
|
|
56
|
+
paymentEnforcer: Address;
|
|
57
|
+
asset: Address;
|
|
58
|
+
nonceStore: NonceReservationStore;
|
|
59
|
+
/** Off-chain revocation read (the app wires `delegation.isRevoked`). Checked BEFORE settling; the DM
|
|
60
|
+
* also enforces revocation on-chain (PAY-DEL-3). */
|
|
61
|
+
isRevoked: (delegationHash: Hex32) => Promise<boolean>;
|
|
62
|
+
/** Submit the redemption (a sponsored UserOp from the service relayer, X402-D4). Injected by the app /
|
|
63
|
+
* agent-account layer; returns the settlement tx hash. */
|
|
64
|
+
submitRedemption: (plan: {
|
|
65
|
+
to: Address;
|
|
66
|
+
value: bigint;
|
|
67
|
+
data: Hex;
|
|
68
|
+
}) => Promise<{
|
|
69
|
+
settlementHash: Hex32;
|
|
70
|
+
}>;
|
|
71
|
+
now?: () => number;
|
|
72
|
+
}
|
|
73
|
+
export type SettleResult = {
|
|
74
|
+
ok: true;
|
|
75
|
+
settlementHash: Hex32;
|
|
76
|
+
mandateId: Hex32;
|
|
77
|
+
idempotent: boolean;
|
|
78
|
+
} | {
|
|
79
|
+
ok: false;
|
|
80
|
+
reason: string;
|
|
81
|
+
};
|
|
82
|
+
/** The staged x402 rail. `settle` runs verify → revoke → reserve(nullifier) → prepare → submit →
|
|
83
|
+
* receipt; a safe retry of an already-settled request returns the original receipt (idempotent). */
|
|
84
|
+
export declare function createX402Rail(deps: X402RailDeps): {
|
|
85
|
+
rail: "x402";
|
|
86
|
+
verifyMandate: typeof verifyMandate;
|
|
87
|
+
settle: (input: {
|
|
88
|
+
mandate: PaymentMandate;
|
|
89
|
+
delegation: Delegation;
|
|
90
|
+
quote: PaymentQuote;
|
|
91
|
+
}) => Promise<SettleResult>;
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/rails/x402/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
// Spec 272 PAY-RAIL-1..6 — the staged x402 rail executor (verify → revoke-check → reserve → prepare →
|
|
2
|
+
// submit → receipt). Delegation-native settlement (X402-D2): the redemption is
|
|
3
|
+
// DelegationManager.redeemDelegation(paymentDelegation, USDC.transfer(treasury, amount)) gated by the
|
|
4
|
+
// on-chain PaymentEnforcer. This package owns the LOGIC; on-chain submission (a sponsored UserOp,
|
|
5
|
+
// X402-D4) + the revocation read are INJECTED (payments is type-only on delegation, forbids agent-account).
|
|
6
|
+
import { encodeAbiParameters, encodeFunctionData, keccak256, toHex } from 'viem';
|
|
7
|
+
import { assertContextBindingValid, assertClosedMandateInvariants } from '../../index.js';
|
|
8
|
+
import { fromCaip2 } from './quote.js';
|
|
9
|
+
const TRANSFER_ABI = [
|
|
10
|
+
{
|
|
11
|
+
type: 'function',
|
|
12
|
+
name: 'transfer',
|
|
13
|
+
stateMutability: 'nonpayable',
|
|
14
|
+
inputs: [
|
|
15
|
+
{ name: 'to', type: 'address' },
|
|
16
|
+
{ name: 'amount', type: 'uint256' },
|
|
17
|
+
],
|
|
18
|
+
outputs: [{ type: 'bool' }],
|
|
19
|
+
},
|
|
20
|
+
];
|
|
21
|
+
const DELEGATION_TUPLE = {
|
|
22
|
+
name: 'delegations',
|
|
23
|
+
type: 'tuple[]',
|
|
24
|
+
components: [
|
|
25
|
+
{ name: 'delegator', type: 'address' },
|
|
26
|
+
{ name: 'delegate', type: 'address' },
|
|
27
|
+
{ name: 'authority', type: 'bytes32' },
|
|
28
|
+
{
|
|
29
|
+
name: 'caveats',
|
|
30
|
+
type: 'tuple[]',
|
|
31
|
+
components: [
|
|
32
|
+
{ name: 'enforcer', type: 'address' },
|
|
33
|
+
{ name: 'terms', type: 'bytes' },
|
|
34
|
+
{ name: 'args', type: 'bytes' },
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
{ name: 'salt', type: 'uint256' },
|
|
38
|
+
{ name: 'signature', type: 'bytes' },
|
|
39
|
+
],
|
|
40
|
+
};
|
|
41
|
+
const REDEEM_ABI = [
|
|
42
|
+
{
|
|
43
|
+
type: 'function',
|
|
44
|
+
name: 'redeemDelegation',
|
|
45
|
+
stateMutability: 'nonpayable',
|
|
46
|
+
inputs: [
|
|
47
|
+
DELEGATION_TUPLE,
|
|
48
|
+
{ name: 'target', type: 'address' },
|
|
49
|
+
{ name: 'value', type: 'uint256' },
|
|
50
|
+
{ name: 'data', type: 'bytes' },
|
|
51
|
+
],
|
|
52
|
+
outputs: [],
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
/** PAY-RAIL-4 — the rail-scoped replay nullifier. */
|
|
56
|
+
export function computeNullifier(args) {
|
|
57
|
+
return keccak256(encodeAbiParameters([
|
|
58
|
+
{ type: 'string' },
|
|
59
|
+
{ type: 'uint256' },
|
|
60
|
+
{ type: 'address' },
|
|
61
|
+
{ type: 'address' },
|
|
62
|
+
{ type: 'address' },
|
|
63
|
+
{ type: 'bytes32' },
|
|
64
|
+
{ type: 'uint256' },
|
|
65
|
+
{ type: 'bytes32' },
|
|
66
|
+
], [args.rail, BigInt(args.chainId), args.payer, args.payee, args.asset, args.mandateId, args.nonce, args.resourceHash]));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* PAY-RAIL-1 — synchronous mandate verification against its persisted quote. Returns the first failure
|
|
70
|
+
* reason (or null). The async checks (revocation, nonce-unused) run in the rail's settle() flow.
|
|
71
|
+
*/
|
|
72
|
+
export function verifyMandate(mandate, quote, opts) {
|
|
73
|
+
try {
|
|
74
|
+
assertContextBindingValid(mandate.contextBinding);
|
|
75
|
+
assertClosedMandateInvariants(mandate);
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
return { valid: false, reason: e instanceof Error ? e.message : 'invariant' };
|
|
79
|
+
}
|
|
80
|
+
if (mandate.mode !== 'closed')
|
|
81
|
+
return { valid: false, reason: 'final charge requires a closed mandate' };
|
|
82
|
+
if (mandate.maxRedemptions !== 1)
|
|
83
|
+
return { valid: false, reason: 'closed mandate must be one-shot' };
|
|
84
|
+
if (mandate.rail !== 'x402')
|
|
85
|
+
return { valid: false, reason: `wrong rail ${mandate.rail}` };
|
|
86
|
+
const rc = mandate.railConfig;
|
|
87
|
+
if (!rc?.quoteId || rc.quoteId !== quote.quoteId)
|
|
88
|
+
return { valid: false, reason: 'quote mismatch (quoteId)' };
|
|
89
|
+
if (rc.resourceHash !== quote.resourceHash)
|
|
90
|
+
return { valid: false, reason: 'quote mismatch (resourceHash)' };
|
|
91
|
+
if (mandate.payee.toLowerCase() !== quote.payTo.toLowerCase())
|
|
92
|
+
return { valid: false, reason: 'payee != treasury' };
|
|
93
|
+
if (mandate.amountPolicy.kind !== 'exact')
|
|
94
|
+
return { valid: false, reason: 'flat per-call requires exact amountPolicy' };
|
|
95
|
+
if (mandate.amountPolicy.amount !== quote.amount)
|
|
96
|
+
return { valid: false, reason: 'amount mismatch' };
|
|
97
|
+
if (mandate.amountPolicy.asset.id.toLowerCase() !== quote.asset.toLowerCase())
|
|
98
|
+
return { valid: false, reason: 'asset mismatch' };
|
|
99
|
+
if (mandate.amountPolicy.chain !== fromCaip2(quote.network))
|
|
100
|
+
return { valid: false, reason: 'chain mismatch' };
|
|
101
|
+
if (mandate.nonce !== quote.nonce)
|
|
102
|
+
return { valid: false, reason: 'nonce mismatch' };
|
|
103
|
+
if (mandate.expiresAt <= opts.now)
|
|
104
|
+
return { valid: false, reason: 'mandate expired' };
|
|
105
|
+
if (mandate.validFrom > opts.now)
|
|
106
|
+
return { valid: false, reason: 'mandate not yet valid' };
|
|
107
|
+
return { valid: true };
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* PAY-RAIL-2 — build the redemption plan: DelegationManager.redeemDelegation(paymentDelegation,
|
|
111
|
+
* USDC.transfer(treasury, amount)) with the PaymentEnforcer caveat's `args` filled with the mandate's
|
|
112
|
+
* (mandateId, nonce, resourceHash) at REDEMPTION time. The caller submits `{to, value, data}` from the
|
|
113
|
+
* service relayer as a sponsored UserOp.
|
|
114
|
+
*/
|
|
115
|
+
export function buildRedemptionCalldata(args) {
|
|
116
|
+
const amount = args.mandate.amountPolicy.amount;
|
|
117
|
+
const transferData = encodeFunctionData({
|
|
118
|
+
abi: TRANSFER_ABI,
|
|
119
|
+
functionName: 'transfer',
|
|
120
|
+
args: [args.mandate.payee, amount],
|
|
121
|
+
});
|
|
122
|
+
// Fill the PaymentEnforcer caveat's redeem-time args = abi.encode(mandateId, nonce, resourceHash).
|
|
123
|
+
const enforcerArgs = encodeAbiParameters([{ type: 'bytes32' }, { type: 'bytes32' }, { type: 'bytes32' }], [args.mandate.mandateId, toHex(args.mandate.nonce, { size: 32 }), args.resourceHash]);
|
|
124
|
+
const pe = args.paymentEnforcer.toLowerCase();
|
|
125
|
+
const caveats = args.delegation.caveats.map((c) => c.enforcer.toLowerCase() === pe
|
|
126
|
+
? { enforcer: c.enforcer, terms: c.terms, args: enforcerArgs }
|
|
127
|
+
: { enforcer: c.enforcer, terms: c.terms, args: c.args ?? '0x' });
|
|
128
|
+
const data = encodeFunctionData({
|
|
129
|
+
abi: REDEEM_ABI,
|
|
130
|
+
functionName: 'redeemDelegation',
|
|
131
|
+
args: [
|
|
132
|
+
[
|
|
133
|
+
{
|
|
134
|
+
delegator: args.delegation.delegator,
|
|
135
|
+
delegate: args.delegation.delegate,
|
|
136
|
+
authority: args.delegation.authority,
|
|
137
|
+
caveats,
|
|
138
|
+
salt: args.delegation.salt,
|
|
139
|
+
signature: args.delegation.signature,
|
|
140
|
+
},
|
|
141
|
+
],
|
|
142
|
+
args.asset,
|
|
143
|
+
0n,
|
|
144
|
+
transferData,
|
|
145
|
+
],
|
|
146
|
+
});
|
|
147
|
+
return { to: args.delegationManager, value: 0n, data };
|
|
148
|
+
}
|
|
149
|
+
/** The staged x402 rail. `settle` runs verify → revoke → reserve(nullifier) → prepare → submit →
|
|
150
|
+
* receipt; a safe retry of an already-settled request returns the original receipt (idempotent). */
|
|
151
|
+
export function createX402Rail(deps) {
|
|
152
|
+
const now = deps.now ?? (() => Math.floor(Date.now() / 1000));
|
|
153
|
+
async function settle(input) {
|
|
154
|
+
const { mandate, delegation, quote } = input;
|
|
155
|
+
const v = verifyMandate(mandate, quote, { now: now() });
|
|
156
|
+
if (!v.valid)
|
|
157
|
+
return { ok: false, reason: v.reason };
|
|
158
|
+
const delegationHash = mandate.delegationRef;
|
|
159
|
+
if (delegationHash && (await deps.isRevoked(delegationHash)))
|
|
160
|
+
return { ok: false, reason: 'payment delegation revoked' };
|
|
161
|
+
const nullifier = computeNullifier({
|
|
162
|
+
rail: 'x402',
|
|
163
|
+
chainId: deps.chainId,
|
|
164
|
+
payer: mandate.payer,
|
|
165
|
+
payee: mandate.payee,
|
|
166
|
+
asset: deps.asset,
|
|
167
|
+
mandateId: mandate.mandateId,
|
|
168
|
+
nonce: mandate.nonce,
|
|
169
|
+
resourceHash: quote.resourceHash,
|
|
170
|
+
});
|
|
171
|
+
const reserved = await deps.nonceStore.reserve(nullifier);
|
|
172
|
+
if (!reserved.ok) {
|
|
173
|
+
if (reserved.state === 'settled' && reserved.receipt) {
|
|
174
|
+
return { ok: true, settlementHash: reserved.receipt.settlementHash, mandateId: reserved.receipt.mandateId, idempotent: true };
|
|
175
|
+
}
|
|
176
|
+
return { ok: false, reason: `duplicate settlement (${reserved.state})` };
|
|
177
|
+
}
|
|
178
|
+
const plan = buildRedemptionCalldata({
|
|
179
|
+
mandate,
|
|
180
|
+
delegation,
|
|
181
|
+
delegationManager: deps.delegationManager,
|
|
182
|
+
paymentEnforcer: deps.paymentEnforcer,
|
|
183
|
+
asset: deps.asset,
|
|
184
|
+
resourceHash: quote.resourceHash,
|
|
185
|
+
});
|
|
186
|
+
await deps.nonceStore.markSettling(nullifier);
|
|
187
|
+
try {
|
|
188
|
+
const { settlementHash } = await deps.submitRedemption(plan);
|
|
189
|
+
const receipt = { settlementHash, mandateId: mandate.mandateId };
|
|
190
|
+
await deps.nonceStore.markSettled(nullifier, receipt);
|
|
191
|
+
return { ok: true, settlementHash, mandateId: mandate.mandateId, idempotent: false };
|
|
192
|
+
}
|
|
193
|
+
catch (e) {
|
|
194
|
+
await deps.nonceStore.markFailed(nullifier, true);
|
|
195
|
+
return { ok: false, reason: e instanceof Error ? e.message : 'settlement failed' };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return { rail: 'x402', verifyMandate, settle };
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/rails/x402/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type { PaymentResource, Hex32 } from './resource.js';
|
|
2
|
+
export { ZERO_HASH, canonicalizePaymentResource, hashRequestBody, redactPaymentMetadata } from './resource.js';
|
|
3
|
+
export type { PaymentQuote } from './quote.js';
|
|
4
|
+
export { computeQuoteId, buildPaymentQuote, quoteMismatch, toCaip2, fromCaip2 } from './quote.js';
|
|
5
|
+
export type { PaymentRequirements, PaymentRequiredBody, SettlementResponse, PaymentSignaturePayload } from './wire.js';
|
|
6
|
+
export { X402_VERSION, HEADER_PAYMENT_REQUIRED, HEADER_PAYMENT_SIGNATURE, HEADER_PAYMENT_RESPONSE, ASSET_TRANSFER_METHOD, buildPaymentRequired, parsePaymentRequired, buildPaymentSignature, parsePaymentSignature, buildPaymentResponse, parsePaymentResponse, serializeMandate, deserializeMandate, } from './wire.js';
|
|
7
|
+
export type { NonceReservationStore, NonceState, SettledReceipt, ReserveResult } from './nonce-store.js';
|
|
8
|
+
export { createMemoryNonceStore } from './nonce-store.js';
|
|
9
|
+
export type { X402RailConfig, X402RailDeps, SettleResult } from './executor.js';
|
|
10
|
+
export { computeNullifier, verifyMandate, buildRedemptionCalldata, createX402Rail } from './executor.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/rails/x402/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,2BAA2B,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAE/G,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAElG,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACvH,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAEnB,YAAY,EAAE,qBAAqB,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACzG,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// @agenticprimitives/payments — x402 rail (spec 272). HTTP-native pay-per-use over the spec-243
|
|
2
|
+
// PaymentMandate. Consumed as `import { x402 } from '@agenticprimitives/payments'`.
|
|
3
|
+
export { ZERO_HASH, canonicalizePaymentResource, hashRequestBody, redactPaymentMetadata } from './resource.js';
|
|
4
|
+
export { computeQuoteId, buildPaymentQuote, quoteMismatch, toCaip2, fromCaip2 } from './quote.js';
|
|
5
|
+
export { X402_VERSION, HEADER_PAYMENT_REQUIRED, HEADER_PAYMENT_SIGNATURE, HEADER_PAYMENT_RESPONSE, ASSET_TRANSFER_METHOD, buildPaymentRequired, parsePaymentRequired, buildPaymentSignature, parsePaymentSignature, buildPaymentResponse, parsePaymentResponse, serializeMandate, deserializeMandate, } from './wire.js';
|
|
6
|
+
export { createMemoryNonceStore } from './nonce-store.js';
|
|
7
|
+
export { computeNullifier, verifyMandate, buildRedemptionCalldata, createX402Rail } from './executor.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/rails/x402/index.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,oFAAoF;AAGpF,OAAO,EAAE,SAAS,EAAE,2BAA2B,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAG/G,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGlG,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Hex32 } from './resource.js';
|
|
2
|
+
export type NonceState = 'unseen' | 'reserved' | 'settling' | 'settled' | 'failed_retryable' | 'failed_terminal';
|
|
3
|
+
export interface SettledReceipt {
|
|
4
|
+
settlementHash: Hex32;
|
|
5
|
+
mandateId: Hex32;
|
|
6
|
+
}
|
|
7
|
+
export type ReserveResult = {
|
|
8
|
+
ok: true;
|
|
9
|
+
} | {
|
|
10
|
+
ok: false;
|
|
11
|
+
state: Exclude<NonceState, 'unseen'>;
|
|
12
|
+
receipt?: SettledReceipt;
|
|
13
|
+
};
|
|
14
|
+
export interface NonceReservationStore {
|
|
15
|
+
/** Atomically claim the nullifier. `unseen`/`failed_retryable` → reserved (ok). `settled` → not-ok
|
|
16
|
+
* WITH the original receipt (safe-retry returns it). `reserved`/`settling`/`failed_terminal` →
|
|
17
|
+
* not-ok (concurrent duplicate / permanently failed). */
|
|
18
|
+
reserve(nullifier: Hex32): Promise<ReserveResult>;
|
|
19
|
+
markSettling(nullifier: Hex32): Promise<void>;
|
|
20
|
+
markSettled(nullifier: Hex32, receipt: SettledReceipt): Promise<void>;
|
|
21
|
+
markFailed(nullifier: Hex32, retryable: boolean): Promise<void>;
|
|
22
|
+
get(nullifier: Hex32): Promise<{
|
|
23
|
+
state: NonceState;
|
|
24
|
+
receipt?: SettledReceipt;
|
|
25
|
+
} | undefined>;
|
|
26
|
+
}
|
|
27
|
+
/** In-memory store (single-worker / tests). A durable adapter (KV / D1) implements the same interface;
|
|
28
|
+
* the reserve() must be ATOMIC there (compare-and-set) to actually block concurrent duplicates. */
|
|
29
|
+
export declare function createMemoryNonceStore(): NonceReservationStore;
|
|
30
|
+
//# sourceMappingURL=nonce-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nonce-store.d.ts","sourceRoot":"","sources":["../../../src/rails/x402/nonce-store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;AAEjH,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,KAAK,CAAC;IACtB,SAAS,EAAE,KAAK,CAAC;CAClB;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,cAAc,CAAA;CAAE,CAAC;AAElF,MAAM,WAAW,qBAAqB;IACpC;;8DAE0D;IAC1D,OAAO,CAAC,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAClD,YAAY,CAAC,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,UAAU,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,GAAG,CAAC,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,OAAO,CAAC,EAAE,cAAc,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;CAC7F;AAOD;oGACoG;AACpG,wBAAgB,sBAAsB,IAAI,qBAAqB,CA0B9D"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Spec 272 PAY-RAIL-4/5 — the off-chain nullifier reservation store. A redeemed mandate/nonce cannot
|
|
2
|
+
// settle twice (the on-chain nonce is the durable guard; this blocks concurrent duplicates + caches the
|
|
3
|
+
// original receipt for safe retries). State machine: unseen → reserved → settling → settled |
|
|
4
|
+
// failed_retryable | failed_terminal.
|
|
5
|
+
/** In-memory store (single-worker / tests). A durable adapter (KV / D1) implements the same interface;
|
|
6
|
+
* the reserve() must be ATOMIC there (compare-and-set) to actually block concurrent duplicates. */
|
|
7
|
+
export function createMemoryNonceStore() {
|
|
8
|
+
const rows = new Map();
|
|
9
|
+
return {
|
|
10
|
+
async reserve(nullifier) {
|
|
11
|
+
const row = rows.get(nullifier);
|
|
12
|
+
if (!row || row.state === 'unseen' || row.state === 'failed_retryable') {
|
|
13
|
+
rows.set(nullifier, { state: 'reserved' });
|
|
14
|
+
return { ok: true };
|
|
15
|
+
}
|
|
16
|
+
if (row.state === 'settled')
|
|
17
|
+
return { ok: false, state: 'settled', receipt: row.receipt };
|
|
18
|
+
return { ok: false, state: row.state };
|
|
19
|
+
},
|
|
20
|
+
async markSettling(nullifier) {
|
|
21
|
+
const row = rows.get(nullifier) ?? { state: 'unseen' };
|
|
22
|
+
rows.set(nullifier, { ...row, state: 'settling' });
|
|
23
|
+
},
|
|
24
|
+
async markSettled(nullifier, receipt) {
|
|
25
|
+
rows.set(nullifier, { state: 'settled', receipt });
|
|
26
|
+
},
|
|
27
|
+
async markFailed(nullifier, retryable) {
|
|
28
|
+
rows.set(nullifier, { state: retryable ? 'failed_retryable' : 'failed_terminal' });
|
|
29
|
+
},
|
|
30
|
+
async get(nullifier) {
|
|
31
|
+
return rows.get(nullifier);
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=nonce-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nonce-store.js","sourceRoot":"","sources":["../../../src/rails/x402/nonce-store.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,wGAAwG;AACxG,8FAA8F;AAC9F,sCAAsC;AA+BtC;oGACoG;AACpG,MAAM,UAAU,sBAAsB;IACpC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAe,CAAC;IACpC,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,SAAS;YACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,KAAK,kBAAkB,EAAE,CAAC;gBACvE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC3C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;YACtB,CAAC;YACD,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;YAC1F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QACzC,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,SAAS;YAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YACvD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO;YAClC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS;YACnC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,SAAS;YACjB,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type Address } from 'viem';
|
|
2
|
+
import type { Hex32, PaymentResource } from './resource.js';
|
|
3
|
+
/** A priced, bound, expiring offer for one access. `quoteId` is derived from the binding so two quotes
|
|
4
|
+
* for the same request+price are identical and a tampered field changes the id (tamper-evident). */
|
|
5
|
+
export interface PaymentQuote {
|
|
6
|
+
quoteId: Hex32;
|
|
7
|
+
scheme: 'exact';
|
|
8
|
+
network: string;
|
|
9
|
+
asset: Address;
|
|
10
|
+
payTo: Address;
|
|
11
|
+
amount: bigint;
|
|
12
|
+
resource: PaymentResource;
|
|
13
|
+
resourceHash: Hex32;
|
|
14
|
+
nonce: bigint;
|
|
15
|
+
expiresAt: number;
|
|
16
|
+
maxTimeoutSeconds: number;
|
|
17
|
+
}
|
|
18
|
+
/** Deterministic quote id over the binding + price + payee + nonce + expiry. Same inputs → same id;
|
|
19
|
+
* any change (amount, payee, resource field, nonce, expiry) → different id (X402-D9 quote immutability). */
|
|
20
|
+
export declare function computeQuoteId(args: {
|
|
21
|
+
resourceHash: Hex32;
|
|
22
|
+
asset: Address;
|
|
23
|
+
payTo: Address;
|
|
24
|
+
amount: bigint;
|
|
25
|
+
network: string;
|
|
26
|
+
nonce: bigint;
|
|
27
|
+
expiresAt: number;
|
|
28
|
+
}): Hex32;
|
|
29
|
+
/** Build a fully-formed, self-consistent PaymentQuote from a resource + price. */
|
|
30
|
+
export declare function buildPaymentQuote(args: {
|
|
31
|
+
resource: PaymentResource;
|
|
32
|
+
network: string;
|
|
33
|
+
maxTimeoutSeconds?: number;
|
|
34
|
+
}): PaymentQuote;
|
|
35
|
+
/** X402-D9 quote immutability: a re-presented quote MUST match the persisted one on every field that
|
|
36
|
+
* prices or binds the charge. Returns the first mismatch (for telemetry) or null when identical. */
|
|
37
|
+
export declare function quoteMismatch(persisted: PaymentQuote, presented: PaymentQuote): string | null;
|
|
38
|
+
/** CAIP-2 helpers (X402-D6 — wire uses `eip155:<id>`, never a bare chain number). */
|
|
39
|
+
export declare function toCaip2(chainId: number): string;
|
|
40
|
+
export declare function fromCaip2(network: string): number;
|
|
41
|
+
//# sourceMappingURL=quote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote.d.ts","sourceRoot":"","sources":["../../../src/rails/x402/quote.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkC,KAAK,OAAO,EAAE,MAAM,MAAM,CAAC;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAG5D;qGACqG;AACrG,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,eAAe,CAAC;IAC1B,YAAY,EAAE,KAAK,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;6GAC6G;AAC7G,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,YAAY,EAAE,KAAK,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,KAAK,CAuBR;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,YAAY,CAyBf;AAED;qGACqG;AACrG,wBAAgB,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAU7F;AAED,qFAAqF;AACrF,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/C;AACD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAIjD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// Spec 272 X402-D9.2 — the immutable PaymentQuote. The 402 carries it; the service persists
|
|
2
|
+
// (taskId → quoteId → resourceHash → amount → payee) and a retry MUST match it. No silent re-pricing.
|
|
3
|
+
import { encodeAbiParameters, keccak256 } from 'viem';
|
|
4
|
+
import { canonicalizePaymentResource } from './resource.js';
|
|
5
|
+
/** Deterministic quote id over the binding + price + payee + nonce + expiry. Same inputs → same id;
|
|
6
|
+
* any change (amount, payee, resource field, nonce, expiry) → different id (X402-D9 quote immutability). */
|
|
7
|
+
export function computeQuoteId(args) {
|
|
8
|
+
return keccak256(encodeAbiParameters([
|
|
9
|
+
{ type: 'bytes32' },
|
|
10
|
+
{ type: 'address' },
|
|
11
|
+
{ type: 'address' },
|
|
12
|
+
{ type: 'uint256' },
|
|
13
|
+
{ type: 'string' },
|
|
14
|
+
{ type: 'uint256' },
|
|
15
|
+
{ type: 'uint256' },
|
|
16
|
+
], [
|
|
17
|
+
args.resourceHash,
|
|
18
|
+
args.asset,
|
|
19
|
+
args.payTo,
|
|
20
|
+
args.amount,
|
|
21
|
+
args.network,
|
|
22
|
+
args.nonce,
|
|
23
|
+
BigInt(args.expiresAt),
|
|
24
|
+
]));
|
|
25
|
+
}
|
|
26
|
+
/** Build a fully-formed, self-consistent PaymentQuote from a resource + price. */
|
|
27
|
+
export function buildPaymentQuote(args) {
|
|
28
|
+
const { resource } = args;
|
|
29
|
+
const resourceHash = canonicalizePaymentResource(resource);
|
|
30
|
+
const quoteId = computeQuoteId({
|
|
31
|
+
resourceHash,
|
|
32
|
+
asset: resource.asset,
|
|
33
|
+
payTo: resource.treasury,
|
|
34
|
+
amount: resource.amount,
|
|
35
|
+
network: args.network,
|
|
36
|
+
nonce: resource.nonce,
|
|
37
|
+
expiresAt: resource.expiresAt,
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
quoteId,
|
|
41
|
+
scheme: 'exact',
|
|
42
|
+
network: args.network,
|
|
43
|
+
asset: resource.asset,
|
|
44
|
+
payTo: resource.treasury,
|
|
45
|
+
amount: resource.amount,
|
|
46
|
+
resource,
|
|
47
|
+
resourceHash,
|
|
48
|
+
nonce: resource.nonce,
|
|
49
|
+
expiresAt: resource.expiresAt,
|
|
50
|
+
maxTimeoutSeconds: args.maxTimeoutSeconds ?? 300,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** X402-D9 quote immutability: a re-presented quote MUST match the persisted one on every field that
|
|
54
|
+
* prices or binds the charge. Returns the first mismatch (for telemetry) or null when identical. */
|
|
55
|
+
export function quoteMismatch(persisted, presented) {
|
|
56
|
+
if (persisted.quoteId !== presented.quoteId)
|
|
57
|
+
return 'quoteId';
|
|
58
|
+
if (persisted.resourceHash !== presented.resourceHash)
|
|
59
|
+
return 'resourceHash';
|
|
60
|
+
if (persisted.amount !== presented.amount)
|
|
61
|
+
return 'amount';
|
|
62
|
+
if (persisted.payTo.toLowerCase() !== presented.payTo.toLowerCase())
|
|
63
|
+
return 'payTo';
|
|
64
|
+
if (persisted.asset.toLowerCase() !== presented.asset.toLowerCase())
|
|
65
|
+
return 'asset';
|
|
66
|
+
if (persisted.network !== presented.network)
|
|
67
|
+
return 'network';
|
|
68
|
+
if (persisted.nonce !== presented.nonce)
|
|
69
|
+
return 'nonce';
|
|
70
|
+
if (persisted.expiresAt !== presented.expiresAt)
|
|
71
|
+
return 'expiresAt';
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
/** CAIP-2 helpers (X402-D6 — wire uses `eip155:<id>`, never a bare chain number). */
|
|
75
|
+
export function toCaip2(chainId) {
|
|
76
|
+
return `eip155:${chainId}`;
|
|
77
|
+
}
|
|
78
|
+
export function fromCaip2(network) {
|
|
79
|
+
const m = /^eip155:(\d+)$/.exec(network);
|
|
80
|
+
if (!m)
|
|
81
|
+
throw new Error(`[x402] unsupported network "${network}" (expected eip155:<chainId>)`);
|
|
82
|
+
return Number(m[1]);
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=quote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote.js","sourceRoot":"","sources":["../../../src/rails/x402/quote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type Address } from 'viem';
|
|
2
|
+
export type Hex32 = `0x${string}`;
|
|
3
|
+
export declare const ZERO_HASH: Hex32;
|
|
4
|
+
/** The full set of fields a payment is bound to. Hashing ALL of them (not just amount) closes
|
|
5
|
+
* substitution/replay: a mandate signed for one (method,url,body,skill,treasury,asset,amount,chain,
|
|
6
|
+
* expiry,nonce) cannot be replayed against a different request. */
|
|
7
|
+
export interface PaymentResource {
|
|
8
|
+
protocol: 'http' | 'a2a';
|
|
9
|
+
method: string;
|
|
10
|
+
url: string;
|
|
11
|
+
bodyHash: Hex32;
|
|
12
|
+
serviceAgent: Address;
|
|
13
|
+
treasury: Address;
|
|
14
|
+
skillId: string;
|
|
15
|
+
taskId: Hex32;
|
|
16
|
+
asset: Address;
|
|
17
|
+
amount: bigint;
|
|
18
|
+
chainId: number;
|
|
19
|
+
expiresAt: number;
|
|
20
|
+
nonce: bigint;
|
|
21
|
+
}
|
|
22
|
+
/** keccak256 over an ABI-encoded canonical tuple of every binding field. Deterministic across HTTP +
|
|
23
|
+
* A2A. NOTE: `quoteId` is NOT an input here (it's derived FROM this hash — see quote.ts) to avoid a
|
|
24
|
+
* circular dependency. */
|
|
25
|
+
export declare function canonicalizePaymentResource(r: PaymentResource): Hex32;
|
|
26
|
+
/** keccak256 of a request body (or ZERO_HASH for empty). The ONLY way bodies enter a binding. */
|
|
27
|
+
export declare function hashRequestBody(body: Uint8Array | string | undefined): Hex32;
|
|
28
|
+
/**
|
|
29
|
+
* PAY-WIRE-6 — strip everything that must never leave the trust boundary in payment metadata (402
|
|
30
|
+
* bodies, receipts, on-chain events, accepts[] extras): licensed text, user queries, PII, full
|
|
31
|
+
* sensitive URLs. Returns a safe projection: the path WITHOUT query string + a hash of the full URL.
|
|
32
|
+
* A platform-level guarantee, not per-app discipline.
|
|
33
|
+
*/
|
|
34
|
+
export declare function redactPaymentMetadata(input: {
|
|
35
|
+
url?: string;
|
|
36
|
+
description?: string;
|
|
37
|
+
}): {
|
|
38
|
+
safeRoute: string;
|
|
39
|
+
urlHash: Hex32;
|
|
40
|
+
description?: string;
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../../src/rails/x402/resource.ts"],"names":[],"mappings":"AAIA,OAAO,EAAkC,KAAK,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpE,MAAM,MAAM,KAAK,GAAG,KAAK,MAAM,EAAE,CAAC;AAClC,eAAO,MAAM,SAAS,EAAE,KAA4E,CAAC;AAErG;;oEAEoE;AACpE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,KAAK,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;2BAE2B;AAC3B,wBAAgB,2BAA2B,CAAC,CAAC,EAAE,eAAe,GAAG,KAAK,CAmCrE;AAED,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAI5E;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAgB9D"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Spec 272 PAY-WIRE-5/6 — the resource binding (the security-critical object: bind the payment to the
|
|
2
|
+
// EXACT request, not just the amount) + metadata redaction. ONE shared canonicalizer for HTTP + A2A so
|
|
3
|
+
// workers never hand-roll URL/body hashing.
|
|
4
|
+
import { encodeAbiParameters, keccak256 } from 'viem';
|
|
5
|
+
export const ZERO_HASH = '0x0000000000000000000000000000000000000000000000000000000000000000';
|
|
6
|
+
/** keccak256 over an ABI-encoded canonical tuple of every binding field. Deterministic across HTTP +
|
|
7
|
+
* A2A. NOTE: `quoteId` is NOT an input here (it's derived FROM this hash — see quote.ts) to avoid a
|
|
8
|
+
* circular dependency. */
|
|
9
|
+
export function canonicalizePaymentResource(r) {
|
|
10
|
+
return keccak256(encodeAbiParameters([
|
|
11
|
+
{ type: 'string' }, // protocol
|
|
12
|
+
{ type: 'string' }, // method
|
|
13
|
+
{ type: 'string' }, // url
|
|
14
|
+
{ type: 'bytes32' }, // bodyHash
|
|
15
|
+
{ type: 'address' }, // serviceAgent
|
|
16
|
+
{ type: 'address' }, // treasury
|
|
17
|
+
{ type: 'string' }, // skillId
|
|
18
|
+
{ type: 'bytes32' }, // taskId
|
|
19
|
+
{ type: 'address' }, // asset
|
|
20
|
+
{ type: 'uint256' }, // amount
|
|
21
|
+
{ type: 'uint256' }, // chainId
|
|
22
|
+
{ type: 'uint256' }, // expiresAt
|
|
23
|
+
{ type: 'uint256' }, // nonce
|
|
24
|
+
], [
|
|
25
|
+
r.protocol,
|
|
26
|
+
r.method,
|
|
27
|
+
r.url,
|
|
28
|
+
r.bodyHash,
|
|
29
|
+
r.serviceAgent,
|
|
30
|
+
r.treasury,
|
|
31
|
+
r.skillId,
|
|
32
|
+
r.taskId,
|
|
33
|
+
r.asset,
|
|
34
|
+
r.amount,
|
|
35
|
+
BigInt(r.chainId),
|
|
36
|
+
BigInt(r.expiresAt),
|
|
37
|
+
r.nonce,
|
|
38
|
+
]));
|
|
39
|
+
}
|
|
40
|
+
/** keccak256 of a request body (or ZERO_HASH for empty). The ONLY way bodies enter a binding. */
|
|
41
|
+
export function hashRequestBody(body) {
|
|
42
|
+
if (body === undefined || body.length === 0)
|
|
43
|
+
return ZERO_HASH;
|
|
44
|
+
const bytes = typeof body === 'string' ? new TextEncoder().encode(body) : body;
|
|
45
|
+
return keccak256(bytes);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* PAY-WIRE-6 — strip everything that must never leave the trust boundary in payment metadata (402
|
|
49
|
+
* bodies, receipts, on-chain events, accepts[] extras): licensed text, user queries, PII, full
|
|
50
|
+
* sensitive URLs. Returns a safe projection: the path WITHOUT query string + a hash of the full URL.
|
|
51
|
+
* A platform-level guarantee, not per-app discipline.
|
|
52
|
+
*/
|
|
53
|
+
export function redactPaymentMetadata(input) {
|
|
54
|
+
let safeRoute = '';
|
|
55
|
+
let urlHash = ZERO_HASH;
|
|
56
|
+
if (input.url) {
|
|
57
|
+
urlHash = keccak256(new TextEncoder().encode(input.url));
|
|
58
|
+
try {
|
|
59
|
+
const u = new URL(input.url);
|
|
60
|
+
safeRoute = `${u.origin}${u.pathname}`; // drop query + fragment (may carry the user's query/content)
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
safeRoute = '';
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// A description is allowed ONLY if it's a generic label; callers must not pass licensed text. We pass
|
|
67
|
+
// it through verbatim but truncate to discourage smuggling licensed content into "description".
|
|
68
|
+
const description = input.description ? input.description.slice(0, 80) : undefined;
|
|
69
|
+
return { safeRoute, urlHash, description };
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=resource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../src/rails/x402/resource.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { Address } from 'viem';
|
|
2
|
+
import type { PaymentMandate } from '../../index.js';
|
|
3
|
+
import type { Hex32 } from './resource.js';
|
|
4
|
+
import type { PaymentQuote } from './quote.js';
|
|
5
|
+
export declare const X402_VERSION: 2;
|
|
6
|
+
export declare const HEADER_PAYMENT_REQUIRED = "PAYMENT-REQUIRED";
|
|
7
|
+
export declare const HEADER_PAYMENT_SIGNATURE = "PAYMENT-SIGNATURE";
|
|
8
|
+
export declare const HEADER_PAYMENT_RESPONSE = "PAYMENT-RESPONSE";
|
|
9
|
+
export declare const ASSET_TRANSFER_METHOD: "erc7710-delegation";
|
|
10
|
+
/** One x402 `accepts[]` entry — our delegation-native variant of `scheme: 'exact'`. */
|
|
11
|
+
export interface PaymentRequirements {
|
|
12
|
+
scheme: 'exact';
|
|
13
|
+
network: string;
|
|
14
|
+
amount: string;
|
|
15
|
+
asset: Address;
|
|
16
|
+
payTo: Address;
|
|
17
|
+
maxTimeoutSeconds: number;
|
|
18
|
+
resource: {
|
|
19
|
+
route: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
mimeType?: string;
|
|
22
|
+
};
|
|
23
|
+
extra: {
|
|
24
|
+
assetTransferMethod: typeof ASSET_TRANSFER_METHOD;
|
|
25
|
+
quoteId: Hex32;
|
|
26
|
+
mandateTemplate: {
|
|
27
|
+
resourceHash: Hex32;
|
|
28
|
+
nonce: string;
|
|
29
|
+
expiresAt: number;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export interface PaymentRequiredBody {
|
|
34
|
+
x402Version: typeof X402_VERSION;
|
|
35
|
+
error?: string;
|
|
36
|
+
accepts: PaymentRequirements[];
|
|
37
|
+
}
|
|
38
|
+
export interface SettlementResponse {
|
|
39
|
+
success: boolean;
|
|
40
|
+
settlementHash?: Hex32;
|
|
41
|
+
mandateId?: Hex32;
|
|
42
|
+
network: string;
|
|
43
|
+
payer?: Address;
|
|
44
|
+
error?: string;
|
|
45
|
+
}
|
|
46
|
+
export declare function serializeMandate(m: PaymentMandate): Record<string, unknown>;
|
|
47
|
+
export declare function deserializeMandate(raw: unknown): PaymentMandate;
|
|
48
|
+
export declare function buildPaymentRequired(quote: PaymentQuote, opts?: {
|
|
49
|
+
error?: string;
|
|
50
|
+
description?: string;
|
|
51
|
+
mimeType?: string;
|
|
52
|
+
}): {
|
|
53
|
+
status: 402;
|
|
54
|
+
headers: Record<string, string>;
|
|
55
|
+
body: PaymentRequiredBody;
|
|
56
|
+
};
|
|
57
|
+
/** Client-side: decode a PAYMENT-REQUIRED header back to the body (for tests + the reader's agent). */
|
|
58
|
+
export declare function parsePaymentRequired(headerValue: string): PaymentRequiredBody;
|
|
59
|
+
export interface PaymentSignaturePayload {
|
|
60
|
+
x402Version: typeof X402_VERSION;
|
|
61
|
+
accepted: PaymentRequirements;
|
|
62
|
+
payload: {
|
|
63
|
+
mandate: PaymentMandate;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Build the PAYMENT-SIGNATURE header (client side). */
|
|
67
|
+
export declare function buildPaymentSignature(accepted: PaymentRequirements, mandate: PaymentMandate): Record<string, string>;
|
|
68
|
+
/**
|
|
69
|
+
* Server side: decode + validate the PAYMENT-SIGNATURE header. Fail-closed (returns null) on a missing
|
|
70
|
+
* header, an unknown x402Version, a non-'exact' scheme, or an unsupported assetTransferMethod. NO v1
|
|
71
|
+
* `X-PAYMENT` fallback (ADR-0013).
|
|
72
|
+
*/
|
|
73
|
+
export declare function parsePaymentSignature(headers: {
|
|
74
|
+
get?(name: string): string | null;
|
|
75
|
+
} | Record<string, string | undefined>): {
|
|
76
|
+
accepted: PaymentRequirements;
|
|
77
|
+
mandate: PaymentMandate;
|
|
78
|
+
} | null;
|
|
79
|
+
export declare function buildPaymentResponse(r: SettlementResponse): Record<string, string>;
|
|
80
|
+
export declare function parsePaymentResponse(headerValue: string): SettlementResponse;
|
|
81
|
+
//# sourceMappingURL=wire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../../src/rails/x402/wire.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// Spec 272 PAY-WIRE-1/2/3 — x402 v2 HTTP wire. Headers: PAYMENT-REQUIRED (402) / PAYMENT-SIGNATURE
|
|
2
|
+
// (client→server) / PAYMENT-RESPONSE (server→client), all base64 JSON, CAIP-2 networks, `accepts[]`
|
|
3
|
+
// shape. The v1 `X-PAYMENT` names are dead — we never parse them (ADR-0013: one wire, fail-closed).
|
|
4
|
+
export const X402_VERSION = 2;
|
|
5
|
+
export const HEADER_PAYMENT_REQUIRED = 'PAYMENT-REQUIRED';
|
|
6
|
+
export const HEADER_PAYMENT_SIGNATURE = 'PAYMENT-SIGNATURE';
|
|
7
|
+
export const HEADER_PAYMENT_RESPONSE = 'PAYMENT-RESPONSE';
|
|
8
|
+
export const ASSET_TRANSFER_METHOD = 'erc7710-delegation'; // Wave 1; 'eip3009' is the Wave-5 sibling
|
|
9
|
+
// ── base64 JSON codec (bigint-safe) ──
|
|
10
|
+
function b64encode(obj) {
|
|
11
|
+
const json = JSON.stringify(obj, (_k, v) => (typeof v === 'bigint' ? v.toString() : v));
|
|
12
|
+
return typeof btoa === 'function' ? btoa(json) : Buffer.from(json, 'utf8').toString('base64');
|
|
13
|
+
}
|
|
14
|
+
function b64decode(b64) {
|
|
15
|
+
const json = typeof atob === 'function' ? atob(b64) : Buffer.from(b64, 'base64').toString('utf8');
|
|
16
|
+
return JSON.parse(json);
|
|
17
|
+
}
|
|
18
|
+
// ── PaymentMandate wire (de)serialize — the bigint fields become decimal strings on the wire ──
|
|
19
|
+
export function serializeMandate(m) {
|
|
20
|
+
return JSON.parse(JSON.stringify(m, (_k, v) => (typeof v === 'bigint' ? v.toString() : v)));
|
|
21
|
+
}
|
|
22
|
+
export function deserializeMandate(raw) {
|
|
23
|
+
const o = raw;
|
|
24
|
+
const ap = o.amountPolicy;
|
|
25
|
+
const cb = o.contextBinding;
|
|
26
|
+
const mc = o.mandateConstraints;
|
|
27
|
+
const big = (v) => BigInt(v);
|
|
28
|
+
return {
|
|
29
|
+
...o,
|
|
30
|
+
nonce: big(o.nonce),
|
|
31
|
+
amountPolicy: {
|
|
32
|
+
...ap,
|
|
33
|
+
...(ap.amount !== undefined ? { amount: big(ap.amount) } : {}),
|
|
34
|
+
...(ap.minAmount !== undefined ? { minAmount: big(ap.minAmount) } : {}),
|
|
35
|
+
...(ap.maxAmount !== undefined ? { maxAmount: big(ap.maxAmount) } : {}),
|
|
36
|
+
},
|
|
37
|
+
contextBinding: { ...cb, nonce: big(cb.nonce) },
|
|
38
|
+
...(mc && mc.maxAggregateAmount !== undefined
|
|
39
|
+
? { mandateConstraints: { ...mc, maxAggregateAmount: big(mc.maxAggregateAmount) } }
|
|
40
|
+
: {}),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// ── PAY-WIRE-1: build the 402 ──
|
|
44
|
+
export function buildPaymentRequired(quote, opts) {
|
|
45
|
+
const requirements = {
|
|
46
|
+
scheme: 'exact',
|
|
47
|
+
network: quote.network,
|
|
48
|
+
amount: quote.amount.toString(),
|
|
49
|
+
asset: quote.asset,
|
|
50
|
+
payTo: quote.payTo,
|
|
51
|
+
maxTimeoutSeconds: quote.maxTimeoutSeconds,
|
|
52
|
+
// safe route only (no query string) — PAY-WIRE-6
|
|
53
|
+
resource: { route: safeRoute(quote.resource.url), description: opts?.description, mimeType: opts?.mimeType },
|
|
54
|
+
extra: {
|
|
55
|
+
assetTransferMethod: ASSET_TRANSFER_METHOD,
|
|
56
|
+
quoteId: quote.quoteId,
|
|
57
|
+
mandateTemplate: { resourceHash: quote.resourceHash, nonce: quote.nonce.toString(), expiresAt: quote.expiresAt },
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
const body = { x402Version: X402_VERSION, error: opts?.error, accepts: [requirements] };
|
|
61
|
+
return { status: 402, headers: { [HEADER_PAYMENT_REQUIRED]: b64encode(body) }, body };
|
|
62
|
+
}
|
|
63
|
+
/** Client-side: decode a PAYMENT-REQUIRED header back to the body (for tests + the reader's agent). */
|
|
64
|
+
export function parsePaymentRequired(headerValue) {
|
|
65
|
+
const body = b64decode(headerValue);
|
|
66
|
+
if (body.x402Version !== X402_VERSION)
|
|
67
|
+
throw new Error(`[x402] unsupported x402Version ${body.x402Version}`);
|
|
68
|
+
return body;
|
|
69
|
+
}
|
|
70
|
+
/** Build the PAYMENT-SIGNATURE header (client side). */
|
|
71
|
+
export function buildPaymentSignature(accepted, mandate) {
|
|
72
|
+
const body = { x402Version: X402_VERSION, accepted, payload: { mandate: serializeMandate(mandate) } };
|
|
73
|
+
return { [HEADER_PAYMENT_SIGNATURE]: b64encode(body) };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Server side: decode + validate the PAYMENT-SIGNATURE header. Fail-closed (returns null) on a missing
|
|
77
|
+
* header, an unknown x402Version, a non-'exact' scheme, or an unsupported assetTransferMethod. NO v1
|
|
78
|
+
* `X-PAYMENT` fallback (ADR-0013).
|
|
79
|
+
*/
|
|
80
|
+
export function parsePaymentSignature(headers) {
|
|
81
|
+
const raw = headerValue(headers, HEADER_PAYMENT_SIGNATURE);
|
|
82
|
+
if (!raw)
|
|
83
|
+
return null;
|
|
84
|
+
let body;
|
|
85
|
+
try {
|
|
86
|
+
body = b64decode(raw);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
if (body.x402Version !== X402_VERSION)
|
|
92
|
+
return null;
|
|
93
|
+
if (body.accepted?.scheme !== 'exact')
|
|
94
|
+
return null;
|
|
95
|
+
if (body.accepted?.extra?.assetTransferMethod !== ASSET_TRANSFER_METHOD)
|
|
96
|
+
return null;
|
|
97
|
+
if (!body.payload?.mandate)
|
|
98
|
+
return null;
|
|
99
|
+
return { accepted: body.accepted, mandate: deserializeMandate(body.payload.mandate) };
|
|
100
|
+
}
|
|
101
|
+
// ── PAY-WIRE-3: build the settlement response (a projection of the durable receipt) ──
|
|
102
|
+
export function buildPaymentResponse(r) {
|
|
103
|
+
return { [HEADER_PAYMENT_RESPONSE]: b64encode(r) };
|
|
104
|
+
}
|
|
105
|
+
export function parsePaymentResponse(headerValue) {
|
|
106
|
+
return b64decode(headerValue);
|
|
107
|
+
}
|
|
108
|
+
// ── helpers ──
|
|
109
|
+
function headerValue(headers, name) {
|
|
110
|
+
if (typeof headers.get === 'function') {
|
|
111
|
+
return headers.get(name) ?? undefined;
|
|
112
|
+
}
|
|
113
|
+
const rec = headers;
|
|
114
|
+
return rec[name] ?? rec[name.toLowerCase()];
|
|
115
|
+
}
|
|
116
|
+
function safeRoute(url) {
|
|
117
|
+
try {
|
|
118
|
+
const u = new URL(url);
|
|
119
|
+
return `${u.origin}${u.pathname}`;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return '';
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../src/rails/x402/wire.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agenticprimitives/payments",
|
|
3
|
-
"version": "0.0.0-alpha.
|
|
3
|
+
"version": "0.0.0-alpha.4",
|
|
4
4
|
"description": "PaymentMandate + ContextBinding + MandateConstraints + open/closed mode discrimination. Three W1 rails (x402, wallet, sponsored-userop). PaymentReceipt asserted into AttestationRegistry per ADR-0023.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
],
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"@noble/hashes": "^2.2.0",
|
|
47
|
-
"@agenticprimitives/attestations": "0.0.0-alpha.
|
|
48
|
-
"@agenticprimitives/
|
|
49
|
-
"@agenticprimitives/
|
|
50
|
-
"@agenticprimitives/
|
|
47
|
+
"@agenticprimitives/attestations": "0.0.0-alpha.4",
|
|
48
|
+
"@agenticprimitives/types": "1.0.0-alpha.8",
|
|
49
|
+
"@agenticprimitives/delegation": "1.0.0-alpha.8",
|
|
50
|
+
"@agenticprimitives/verifiable-credentials": "0.0.0-alpha.4"
|
|
51
51
|
},
|
|
52
52
|
"scripts": {
|
|
53
53
|
"build": "tsc -p tsconfig.build.json",
|