@shroud-fi/x402 0.1.1 → 0.1.2
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 +28 -3
- package/dist/cjs/facilitator.d.ts +39 -0
- package/dist/cjs/facilitator.d.ts.map +1 -1
- package/dist/cjs/facilitator.js +59 -3
- package/dist/cjs/facilitator.js.map +1 -1
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +8 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/protocol.d.ts +10 -0
- package/dist/cjs/protocol.d.ts.map +1 -1
- package/dist/cjs/protocol.js +17 -0
- package/dist/cjs/protocol.js.map +1 -1
- package/dist/cjs/server.d.ts.map +1 -1
- package/dist/cjs/server.js +7 -7
- package/dist/cjs/server.js.map +1 -1
- package/dist/esm/facilitator.d.ts +39 -0
- package/dist/esm/facilitator.d.ts.map +1 -1
- package/dist/esm/facilitator.js +59 -4
- package/dist/esm/facilitator.js.map +1 -1
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/protocol.d.ts +10 -0
- package/dist/esm/protocol.d.ts.map +1 -1
- package/dist/esm/protocol.js +16 -0
- package/dist/esm/protocol.js.map +1 -1
- package/dist/esm/server.d.ts.map +1 -1
- package/dist/esm/server.js +8 -8
- package/dist/esm/server.js.map +1 -1
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -11,9 +11,19 @@ npm i @shroud-fi/x402 viem
|
|
|
11
11
|
|
|
12
12
|
## What it does
|
|
13
13
|
|
|
14
|
-
`@shroud-fi/x402` wraps the HTTP 402 protocol with ShroudFi's stealth-address layer. Any endpoint can issue a 402 challenge, and any agent can pay it — but the
|
|
14
|
+
`@shroud-fi/x402` wraps the HTTP 402 protocol with ShroudFi's stealth-address layer. Any endpoint can issue a 402 challenge, and any agent can pay it — but the EIP-3009 settlement lands at a **fresh, one-time stealth address** derived from the seller's meta-address.
|
|
15
15
|
|
|
16
|
-
Call the same `/pay/signal` URL ten times — get ten unlinkable
|
|
16
|
+
Call the same `/pay/signal` URL ten times — get ten unlinkable destinations. The customer graph never forms on-chain.
|
|
17
|
+
|
|
18
|
+
## Supported assets
|
|
19
|
+
|
|
20
|
+
| Asset | Chain | Decimals | Why |
|
|
21
|
+
|---|---|---|---|
|
|
22
|
+
| **USDC** | Base mainnet | 6 | Circle-issued, EIP-3009 native |
|
|
23
|
+
| **EURC** | Base mainnet | 6 | Circle-issued (EUR), EIP-3009 native |
|
|
24
|
+
| USDC | Base Sepolia | 6 | testnet |
|
|
25
|
+
|
|
26
|
+
USDT and DAI are deliberately **not supported** at the x402 layer — they don't implement EIP-3009 `transferWithAuthorization`. Adding them would require a separate settlement primitive (USDT: plain approve+transferFrom; DAI: DAI-style permit). Tracked for a later release.
|
|
17
27
|
|
|
18
28
|
## Why it matters
|
|
19
29
|
|
|
@@ -64,10 +74,25 @@ if (!verified.ok) return reply.code(402).send({ error: verified.reason });
|
|
|
64
74
|
|
|
65
75
|
Full API reference: [shroudfi.live/sdk#x402](https://shroudfi.live/sdk#x402)
|
|
66
76
|
|
|
77
|
+
## Facilitators
|
|
78
|
+
|
|
79
|
+
Settlement can run through an external x402 facilitator (which broadcasts the EIP-3009 tx and pays gas) or via your own settler EOA (`skipFacilitator: true`).
|
|
80
|
+
|
|
81
|
+
**PayAI facilitator is supported out of the box** (v0.1.2). The SDK speaks x402 v2 / CAIP-2 internally and translates to the facilitator's v1 / legacy-network wire format at the boundary via `toFacilitatorRequest`. Proven end-to-end on Base mainnet — a 0.01 USDC agent-to-agent payment settled to a one-time stealth address ([tx `0x57d84d53…`](https://base.blockscout.com/tx/0x57d84d53212fdaddd5c178fa722943c559b0628070e1705267d31d72723158ec)). PayAI pays the gas; the buyer needs only USDC, no ETH.
|
|
82
|
+
|
|
83
|
+
```ts
|
|
84
|
+
const x402 = createX402Server({
|
|
85
|
+
transport, recipientMetaAddress, asset: USDC, chainId: 8453,
|
|
86
|
+
defaultPriceAtomic: 10_000n,
|
|
87
|
+
// facilitator defaults to PayAI free tier; omit to use it.
|
|
88
|
+
});
|
|
89
|
+
const v = await x402.verify({ signedPayload, challenge }); // verifies + settles via PayAI
|
|
90
|
+
```
|
|
91
|
+
|
|
67
92
|
## Standards used
|
|
68
93
|
|
|
69
94
|
- **HTTP 402 Payment Required** + **`x402` extension** ([x402.org](https://x402.org/))
|
|
70
|
-
- **EIP-3009** `transferWithAuthorization` for USDC settlement
|
|
95
|
+
- **EIP-3009** `transferWithAuthorization` for USDC + EURC settlement
|
|
71
96
|
- **EIP-5564 / 6538** for stealth-address derivation
|
|
72
97
|
|
|
73
98
|
## License
|
|
@@ -30,6 +30,45 @@ export interface FacilitatorSettleResult {
|
|
|
30
30
|
}
|
|
31
31
|
/** Resolve the facilitator config, defaulting to PayAI free tier. */
|
|
32
32
|
export declare function resolveFacilitator(config: X402FacilitatorConfig | undefined): X402FacilitatorConfig;
|
|
33
|
+
/**
|
|
34
|
+
* Translate our internal x402 v2 / CAIP-2 verify+settle body into the v1 /
|
|
35
|
+
* legacy-network shape that PayAI (and the wider facilitator ecosystem)
|
|
36
|
+
* accepts on the wire. Proven end-to-end on Base mainnet (tx 0x57d84d53…)
|
|
37
|
+
* before this shipped.
|
|
38
|
+
*
|
|
39
|
+
* Transformations:
|
|
40
|
+
* - x402Version 2 → 1 (top-level and on the payload)
|
|
41
|
+
* - network CAIP-2 (`eip155:8453`) → legacy name (`base`) on both the
|
|
42
|
+
* payload and the requirements
|
|
43
|
+
* - requirements.extra trimmed to `{ name, version }` — the facilitator
|
|
44
|
+
* does not consume our `shroudfiAnnouncement` extension and some reject
|
|
45
|
+
* unknown extra keys
|
|
46
|
+
* - requirements gains `mimeType: ''` (present in the canonical v1 shape)
|
|
47
|
+
*
|
|
48
|
+
* Pure — never mutates its inputs. Throws X402FacilitatorError('network') for
|
|
49
|
+
* a chain with no mapped facilitator network name.
|
|
50
|
+
*/
|
|
51
|
+
export declare function toFacilitatorRequest(args: {
|
|
52
|
+
readonly chainId: number;
|
|
53
|
+
readonly paymentRequirements: Record<string, unknown> & {
|
|
54
|
+
readonly extra?: Record<string, unknown>;
|
|
55
|
+
};
|
|
56
|
+
readonly paymentPayload: Record<string, unknown>;
|
|
57
|
+
}): {
|
|
58
|
+
x402Version: 1;
|
|
59
|
+
paymentPayload: Record<string, unknown> & {
|
|
60
|
+
x402Version: 1;
|
|
61
|
+
network: string;
|
|
62
|
+
};
|
|
63
|
+
paymentRequirements: Record<string, unknown> & {
|
|
64
|
+
network: string;
|
|
65
|
+
mimeType: string;
|
|
66
|
+
extra: {
|
|
67
|
+
name: string;
|
|
68
|
+
version: string;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
};
|
|
33
72
|
/**
|
|
34
73
|
* Build standard headers for a facilitator request. When an Ed25519 auth
|
|
35
74
|
* token is configured, attach `Authorization: Bearer <token>`. Otherwise
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facilitator.d.ts","sourceRoot":"","sources":["../../src/facilitator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"facilitator.d.ts","sourceRoot":"","sources":["../../src/facilitator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAC;AAGvB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qEAAqE;AACrE,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,qBAAqB,GAAG,SAAS,GACxC,qBAAqB,CAKvB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QACtD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC1C,CAAC;IACF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClD,GAAG;IACF,WAAW,EAAE,CAAC,CAAC;IACf,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,WAAW,EAAE,CAAC,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9E,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAC7C,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1C,CAAC;CACH,CAgCA;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,qBAAqB,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASxB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,OAAO,EACb,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,uBAAuB,CAAC,CAsBlC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,OAAO,EACb,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,uBAAuB,CAAC,CAoClC"}
|
package/dist/cjs/facilitator.js
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
19
|
exports.resolveFacilitator = resolveFacilitator;
|
|
20
|
+
exports.toFacilitatorRequest = toFacilitatorRequest;
|
|
20
21
|
exports.buildFacilitatorHeaders = buildFacilitatorHeaders;
|
|
21
22
|
exports.facilitatorVerify = facilitatorVerify;
|
|
22
23
|
exports.facilitatorSettle = facilitatorSettle;
|
|
@@ -29,6 +30,49 @@ function resolveFacilitator(config) {
|
|
|
29
30
|
}
|
|
30
31
|
return config;
|
|
31
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Translate our internal x402 v2 / CAIP-2 verify+settle body into the v1 /
|
|
35
|
+
* legacy-network shape that PayAI (and the wider facilitator ecosystem)
|
|
36
|
+
* accepts on the wire. Proven end-to-end on Base mainnet (tx 0x57d84d53…)
|
|
37
|
+
* before this shipped.
|
|
38
|
+
*
|
|
39
|
+
* Transformations:
|
|
40
|
+
* - x402Version 2 → 1 (top-level and on the payload)
|
|
41
|
+
* - network CAIP-2 (`eip155:8453`) → legacy name (`base`) on both the
|
|
42
|
+
* payload and the requirements
|
|
43
|
+
* - requirements.extra trimmed to `{ name, version }` — the facilitator
|
|
44
|
+
* does not consume our `shroudfiAnnouncement` extension and some reject
|
|
45
|
+
* unknown extra keys
|
|
46
|
+
* - requirements gains `mimeType: ''` (present in the canonical v1 shape)
|
|
47
|
+
*
|
|
48
|
+
* Pure — never mutates its inputs. Throws X402FacilitatorError('network') for
|
|
49
|
+
* a chain with no mapped facilitator network name.
|
|
50
|
+
*/
|
|
51
|
+
function toFacilitatorRequest(args) {
|
|
52
|
+
const network = (0, protocol_js_1.facilitatorNetworkName)(args.chainId);
|
|
53
|
+
if (network === undefined) {
|
|
54
|
+
throw new errors_js_1.X402FacilitatorError('network');
|
|
55
|
+
}
|
|
56
|
+
const srcExtra = (args.paymentRequirements.extra ?? {});
|
|
57
|
+
const extra = {
|
|
58
|
+
name: String(srcExtra.name ?? ''),
|
|
59
|
+
version: String(srcExtra.version ?? ''),
|
|
60
|
+
};
|
|
61
|
+
const paymentRequirements = {
|
|
62
|
+
...args.paymentRequirements,
|
|
63
|
+
network,
|
|
64
|
+
mimeType: typeof args.paymentRequirements.mimeType === 'string'
|
|
65
|
+
? args.paymentRequirements.mimeType
|
|
66
|
+
: '',
|
|
67
|
+
extra,
|
|
68
|
+
};
|
|
69
|
+
const paymentPayload = {
|
|
70
|
+
...args.paymentPayload,
|
|
71
|
+
x402Version: 1,
|
|
72
|
+
network,
|
|
73
|
+
};
|
|
74
|
+
return { x402Version: 1, paymentPayload, paymentRequirements };
|
|
75
|
+
}
|
|
32
76
|
/**
|
|
33
77
|
* Build standard headers for a facilitator request. When an Ed25519 auth
|
|
34
78
|
* token is configured, attach `Authorization: Bearer <token>`. Otherwise
|
|
@@ -94,13 +138,25 @@ async function facilitatorSettle(config, body, fetchImpl = fetch) {
|
|
|
94
138
|
if (!res.ok) {
|
|
95
139
|
throw new errors_js_1.X402FacilitatorError('settle');
|
|
96
140
|
}
|
|
97
|
-
let
|
|
141
|
+
let raw;
|
|
98
142
|
try {
|
|
99
|
-
|
|
143
|
+
raw = (await res.json());
|
|
100
144
|
}
|
|
101
145
|
catch {
|
|
102
146
|
throw new errors_js_1.X402FacilitatorError('settle');
|
|
103
147
|
}
|
|
104
|
-
|
|
148
|
+
// Normalize the tx-hash field. The x402 facilitator spec drifted: PayAI
|
|
149
|
+
// returns `transaction`, some return `transactionHash`, our own type uses
|
|
150
|
+
// `txHash`. Accept all three so callers get a populated txHash on success.
|
|
151
|
+
const txHash = (raw.txHash ?? raw.transaction ?? raw.transactionHash);
|
|
152
|
+
return {
|
|
153
|
+
success: raw.success === true,
|
|
154
|
+
...(txHash !== undefined ? { txHash } : {}),
|
|
155
|
+
...(typeof raw.errorReason === 'string'
|
|
156
|
+
? { errorReason: raw.errorReason }
|
|
157
|
+
: {}),
|
|
158
|
+
...(typeof raw.payer === 'string' ? { payer: raw.payer } : {}),
|
|
159
|
+
...(typeof raw.network === 'string' ? { network: raw.network } : {}),
|
|
160
|
+
};
|
|
105
161
|
}
|
|
106
162
|
//# sourceMappingURL=facilitator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facilitator.js","sourceRoot":"","sources":["../../src/facilitator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;
|
|
1
|
+
{"version":3,"file":"facilitator.js","sourceRoot":"","sources":["../../src/facilitator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;AAyBH,gDAOC;AAoBD,oDA8CC;AAOD,0DAWC;AAOD,8CA0BC;AAMD,8CAwCC;AAhMD,+CAIuB;AACvB,2CAAmD;AAgBnD,qEAAqE;AACrE,SAAgB,kBAAkB,CAChC,MAAyC;IAEzC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,GAAG,EAAE,mCAAqB,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,oBAAoB,CAAC,IAMpC;IASC,MAAM,OAAO,GAAG,IAAA,oCAAsB,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,gCAAoB,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,IAAI,EAAE,CAGrD,CAAC;IACF,MAAM,KAAK,GAAG;QACZ,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;QACjC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;KACxC,CAAC;IAEF,MAAM,mBAAmB,GAAG;QAC1B,GAAG,IAAI,CAAC,mBAAmB;QAC3B,OAAO;QACP,QAAQ,EACN,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,KAAK,QAAQ;YACnD,CAAC,CAAE,IAAI,CAAC,mBAAmB,CAAC,QAAmB;YAC/C,CAAC,CAAC,EAAE;QACR,KAAK;KACN,CAAC;IAEF,MAAM,cAAc,GAAG;QACrB,GAAG,IAAI,CAAC,cAAc;QACtB,WAAW,EAAE,CAAU;QACvB,OAAO;KACR,CAAC;IAEF,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,SAAgB,uBAAuB,CACrC,MAA6B;IAE7B,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,MAAM,EAAE,kBAAkB;KAC3B,CAAC;IACF,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,CAAC,gBAAgB,EAAE,CAAC;IACjE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,iBAAiB,CACrC,MAA6B,EAC7B,IAAa,EACb,YAA0B,KAAK;IAE/B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC;IACvD,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;YACzB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,uBAAuB,CAAC,MAAM,CAAC;YACxC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,gCAAoB,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,gCAAoB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,gCAAoB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,iBAAiB,CACrC,MAA6B,EAC7B,IAAa,EACb,YAA0B,KAAK;IAE/B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC;IACvD,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;YACzB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,uBAAuB,CAAC,MAAM,CAAC;YACxC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,gCAAoB,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,gCAAoB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,GAA4B,CAAC;IACjC,IAAI,CAAC;QACH,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,gCAAoB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IACD,wEAAwE;IACxE,0EAA0E;IAC1E,2EAA2E;IAC3E,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,eAAe,CAEvD,CAAC;IACd,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,IAAI;QAC7B,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ;YACrC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE;YAClC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,GAAG,CAAC,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrE,CAAC;AACJ,CAAC"}
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -2,7 +2,9 @@ export { createX402Server } from './server.js';
|
|
|
2
2
|
export type { X402Server, X402ServerConfig, X402Challenge, X402PaymentRequirements, X402PaymentVerification, } from './server.js';
|
|
3
3
|
export { createX402Client } from './client.js';
|
|
4
4
|
export type { X402Client, X402ClientConfig, X402PaymentResult, } from './client.js';
|
|
5
|
-
export { X402_PAYMENT_REQUIRED_HEADER, X402_PAYMENT_SIGNATURE_HEADER, X402_PAYMENT_RESPONSE_HEADER, X402_SCHEME_EXACT, PAYAI_FACILITATOR_URL, COINBASE_FACILITATOR_URL, } from './protocol.js';
|
|
5
|
+
export { X402_PAYMENT_REQUIRED_HEADER, X402_PAYMENT_SIGNATURE_HEADER, X402_PAYMENT_RESPONSE_HEADER, X402_SCHEME_EXACT, PAYAI_FACILITATOR_URL, COINBASE_FACILITATOR_URL, facilitatorNetworkName, } from './protocol.js';
|
|
6
|
+
export { resolveFacilitator, toFacilitatorRequest, facilitatorVerify, facilitatorSettle, } from './facilitator.js';
|
|
7
|
+
export type { FacilitatorVerifyResult, FacilitatorSettleResult, } from './facilitator.js';
|
|
6
8
|
export type { X402PaymentPayload, X402SchemeId, X402FacilitatorConfig, } from './protocol.js';
|
|
7
9
|
export { X402Error, X402InvalidChallengeError, X402SignatureVerificationError, X402FacilitatorError, X402AssetNotSupportedError, X402AmountMismatchError, } from './errors.js';
|
|
8
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,4BAA4B,EAC5B,6BAA6B,EAC7B,4BAA4B,EAC5B,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,4BAA4B,EAC5B,6BAA6B,EAC7B,4BAA4B,EAC5B,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,GACtB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,SAAS,EACT,yBAAyB,EACzB,8BAA8B,EAC9B,oBAAoB,EACpB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,aAAa,CAAC"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// HTTP 402 + stealth-address payment routing for AI agents on Base.
|
|
4
4
|
// See packages/x402/README and docs/research/competitive/x402-spec-and-ecosystem.md.
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.X402AmountMismatchError = exports.X402AssetNotSupportedError = exports.X402FacilitatorError = exports.X402SignatureVerificationError = exports.X402InvalidChallengeError = exports.X402Error = exports.COINBASE_FACILITATOR_URL = exports.PAYAI_FACILITATOR_URL = exports.X402_SCHEME_EXACT = exports.X402_PAYMENT_RESPONSE_HEADER = exports.X402_PAYMENT_SIGNATURE_HEADER = exports.X402_PAYMENT_REQUIRED_HEADER = exports.createX402Client = exports.createX402Server = void 0;
|
|
6
|
+
exports.X402AmountMismatchError = exports.X402AssetNotSupportedError = exports.X402FacilitatorError = exports.X402SignatureVerificationError = exports.X402InvalidChallengeError = exports.X402Error = exports.facilitatorSettle = exports.facilitatorVerify = exports.toFacilitatorRequest = exports.resolveFacilitator = exports.facilitatorNetworkName = exports.COINBASE_FACILITATOR_URL = exports.PAYAI_FACILITATOR_URL = exports.X402_SCHEME_EXACT = exports.X402_PAYMENT_RESPONSE_HEADER = exports.X402_PAYMENT_SIGNATURE_HEADER = exports.X402_PAYMENT_REQUIRED_HEADER = exports.createX402Client = exports.createX402Server = void 0;
|
|
7
7
|
// Server side
|
|
8
8
|
var server_js_1 = require("./server.js");
|
|
9
9
|
Object.defineProperty(exports, "createX402Server", { enumerable: true, get: function () { return server_js_1.createX402Server; } });
|
|
@@ -18,6 +18,13 @@ Object.defineProperty(exports, "X402_PAYMENT_RESPONSE_HEADER", { enumerable: tru
|
|
|
18
18
|
Object.defineProperty(exports, "X402_SCHEME_EXACT", { enumerable: true, get: function () { return protocol_js_1.X402_SCHEME_EXACT; } });
|
|
19
19
|
Object.defineProperty(exports, "PAYAI_FACILITATOR_URL", { enumerable: true, get: function () { return protocol_js_1.PAYAI_FACILITATOR_URL; } });
|
|
20
20
|
Object.defineProperty(exports, "COINBASE_FACILITATOR_URL", { enumerable: true, get: function () { return protocol_js_1.COINBASE_FACILITATOR_URL; } });
|
|
21
|
+
Object.defineProperty(exports, "facilitatorNetworkName", { enumerable: true, get: function () { return protocol_js_1.facilitatorNetworkName; } });
|
|
22
|
+
// Facilitator client + adapter (v0.1.2)
|
|
23
|
+
var facilitator_js_1 = require("./facilitator.js");
|
|
24
|
+
Object.defineProperty(exports, "resolveFacilitator", { enumerable: true, get: function () { return facilitator_js_1.resolveFacilitator; } });
|
|
25
|
+
Object.defineProperty(exports, "toFacilitatorRequest", { enumerable: true, get: function () { return facilitator_js_1.toFacilitatorRequest; } });
|
|
26
|
+
Object.defineProperty(exports, "facilitatorVerify", { enumerable: true, get: function () { return facilitator_js_1.facilitatorVerify; } });
|
|
27
|
+
Object.defineProperty(exports, "facilitatorSettle", { enumerable: true, get: function () { return facilitator_js_1.facilitatorSettle; } });
|
|
21
28
|
// Errors
|
|
22
29
|
var errors_js_1 = require("./errors.js");
|
|
23
30
|
Object.defineProperty(exports, "X402Error", { enumerable: true, get: function () { return errors_js_1.X402Error; } });
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,mCAAmC;AACnC,oEAAoE;AACpE,qFAAqF;;;AAErF,cAAc;AACd,yCAA+C;AAAtC,6GAAA,gBAAgB,OAAA;AASzB,cAAc;AACd,yCAA+C;AAAtC,6GAAA,gBAAgB,OAAA;AAOzB,6BAA6B;AAC7B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,mCAAmC;AACnC,oEAAoE;AACpE,qFAAqF;;;AAErF,cAAc;AACd,yCAA+C;AAAtC,6GAAA,gBAAgB,OAAA;AASzB,cAAc;AACd,yCAA+C;AAAtC,6GAAA,gBAAgB,OAAA;AAOzB,6BAA6B;AAC7B,6CAQuB;AAPrB,2HAAA,4BAA4B,OAAA;AAC5B,4HAAA,6BAA6B,OAAA;AAC7B,2HAAA,4BAA4B,OAAA;AAC5B,gHAAA,iBAAiB,OAAA;AACjB,oHAAA,qBAAqB,OAAA;AACrB,uHAAA,wBAAwB,OAAA;AACxB,qHAAA,sBAAsB,OAAA;AAGxB,wCAAwC;AACxC,mDAK0B;AAJxB,oHAAA,kBAAkB,OAAA;AAClB,sHAAA,oBAAoB,OAAA;AACpB,mHAAA,iBAAiB,OAAA;AACjB,mHAAA,iBAAiB,OAAA;AAYnB,SAAS;AACT,yCAOqB;AANnB,sGAAA,SAAS,OAAA;AACT,sHAAA,yBAAyB,OAAA;AACzB,2HAAA,8BAA8B,OAAA;AAC9B,iHAAA,oBAAoB,OAAA;AACpB,uHAAA,0BAA0B,OAAA;AAC1B,oHAAA,uBAAuB,OAAA"}
|
package/dist/cjs/protocol.d.ts
CHANGED
|
@@ -32,6 +32,16 @@ export declare const PAYAI_FACILITATOR_URL: "https://facilitator.payai.network";
|
|
|
32
32
|
* URL verified against research doc §3 (cdp.coinbase.com/platform/v2/x402).
|
|
33
33
|
*/
|
|
34
34
|
export declare const COINBASE_FACILITATOR_URL: "https://api.cdp.coinbase.com/platform/v2/x402";
|
|
35
|
+
/**
|
|
36
|
+
* Map an EVM chain id to the x402 v1 legacy network name that facilitators
|
|
37
|
+
* (PayAI, Coinbase CDP, etc.) expect on the wire. The facilitator ecosystem
|
|
38
|
+
* standardized on these short names, NOT CAIP-2 (`eip155:8453`). Our SDK uses
|
|
39
|
+
* CAIP-2 internally and translates only at the facilitator boundary.
|
|
40
|
+
*
|
|
41
|
+
* Verified against PayAI `/supported` (2026-06-04) — Base mainnet = "base",
|
|
42
|
+
* Base Sepolia = "base-sepolia". Returns undefined for chains we don't map.
|
|
43
|
+
*/
|
|
44
|
+
export declare function facilitatorNetworkName(chainId: number): string | undefined;
|
|
35
45
|
/**
|
|
36
46
|
* The `accepts[N]` entry from a v2 `PaymentRequired` object — the exact shape
|
|
37
47
|
* a client receives over the wire.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAIzC,2EAA2E;AAC3E,eAAO,MAAM,4BAA4B,EAAG,oBAA6B,CAAC;AAE1E;;;;;;;GAOG;AACH,eAAO,MAAM,6BAA6B,EAAG,WAAoB,CAAC;AAElE,8EAA8E;AAC9E,eAAO,MAAM,4BAA4B,EAAG,oBAA6B,CAAC;AAI1E,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,EAAG,OAAgB,CAAC;AAElD,MAAM,MAAM,YAAY,GAAG,OAAO,iBAAiB,CAAC;AAIpD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAChC,mCAA4C,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EACnC,+CAAwD,CAAC;
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAIzC,2EAA2E;AAC3E,eAAO,MAAM,4BAA4B,EAAG,oBAA6B,CAAC;AAE1E;;;;;;;GAOG;AACH,eAAO,MAAM,6BAA6B,EAAG,WAAoB,CAAC;AAElE,8EAA8E;AAC9E,eAAO,MAAM,4BAA4B,EAAG,oBAA6B,CAAC;AAI1E,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,EAAG,OAAgB,CAAC;AAElD,MAAM,MAAM,YAAY,GAAG,OAAO,iBAAiB,CAAC;AAIpD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAChC,mCAA4C,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EACnC,+CAAwD,CAAC;AAE3D;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM1E;AAID;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,iDAAiD;IACjD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,+CAA+C;IAC/C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2CAA2C;IAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB;;;;WAIG;QACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE;YAC9B,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC;YAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;SAC1B,CAAC;KACH,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC;QACxB,QAAQ,CAAC,aAAa,EAAE;YACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;YACvB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;YACrB,yBAAyB;YACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;YACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;YAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;YAC7B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;SACrB,CAAC;KACH,CAAC;CACH;AAED;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC"}
|
package/dist/cjs/protocol.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.COINBASE_FACILITATOR_URL = exports.PAYAI_FACILITATOR_URL = exports.X402_SCHEME_EXACT = exports.X402_PAYMENT_RESPONSE_HEADER = exports.X402_PAYMENT_SIGNATURE_HEADER = exports.X402_PAYMENT_REQUIRED_HEADER = void 0;
|
|
11
|
+
exports.facilitatorNetworkName = facilitatorNetworkName;
|
|
11
12
|
// ─── HTTP header names ───────────────────────────────────────────────────────
|
|
12
13
|
/** Server → client: 402 challenge envelope (raw JSON, no base64 in v2). */
|
|
13
14
|
exports.X402_PAYMENT_REQUIRED_HEADER = 'X-PAYMENT-REQUIRED';
|
|
@@ -36,4 +37,20 @@ exports.PAYAI_FACILITATOR_URL = 'https://facilitator.payai.network';
|
|
|
36
37
|
* URL verified against research doc §3 (cdp.coinbase.com/platform/v2/x402).
|
|
37
38
|
*/
|
|
38
39
|
exports.COINBASE_FACILITATOR_URL = 'https://api.cdp.coinbase.com/platform/v2/x402';
|
|
40
|
+
/**
|
|
41
|
+
* Map an EVM chain id to the x402 v1 legacy network name that facilitators
|
|
42
|
+
* (PayAI, Coinbase CDP, etc.) expect on the wire. The facilitator ecosystem
|
|
43
|
+
* standardized on these short names, NOT CAIP-2 (`eip155:8453`). Our SDK uses
|
|
44
|
+
* CAIP-2 internally and translates only at the facilitator boundary.
|
|
45
|
+
*
|
|
46
|
+
* Verified against PayAI `/supported` (2026-06-04) — Base mainnet = "base",
|
|
47
|
+
* Base Sepolia = "base-sepolia". Returns undefined for chains we don't map.
|
|
48
|
+
*/
|
|
49
|
+
function facilitatorNetworkName(chainId) {
|
|
50
|
+
const NAMES = {
|
|
51
|
+
8453: 'base',
|
|
52
|
+
84532: 'base-sepolia',
|
|
53
|
+
};
|
|
54
|
+
return NAMES[chainId];
|
|
55
|
+
}
|
|
39
56
|
//# sourceMappingURL=protocol.js.map
|
package/dist/cjs/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/protocol.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAsDH,wDAMC;AAxDD,gFAAgF;AAEhF,2EAA2E;AAC9D,QAAA,4BAA4B,GAAG,oBAA6B,CAAC;AAE1E;;;;;;;GAOG;AACU,QAAA,6BAA6B,GAAG,WAAoB,CAAC;AAElE,8EAA8E;AACjE,QAAA,4BAA4B,GAAG,oBAA6B,CAAC;AAE1E,gFAAgF;AAEhF,kFAAkF;AACrE,QAAA,iBAAiB,GAAG,OAAgB,CAAC;AAIlD,gFAAgF;AAEhF;;;GAGG;AACU,QAAA,qBAAqB,GAChC,mCAA4C,CAAC;AAE/C;;;GAGG;AACU,QAAA,wBAAwB,GACnC,+CAAwD,CAAC;AAE3D;;;;;;;;GAQG;AACH,SAAgB,sBAAsB,CAAC,OAAe;IACpD,MAAM,KAAK,GAAqC;QAC9C,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,cAAc;KACtB,CAAC;IACF,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC"}
|
package/dist/cjs/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAGL,KAAK,kBAAkB,EAExB,MAAM,eAAe,CAAC;AAMvB,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAGL,KAAK,kBAAkB,EAExB,MAAM,eAAe,CAAC;AAMvB,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAoCpB,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,IAAI,EAAE;QACX,aAAa,EAAE,MAAM,GAAG,kBAAkB,CAAC;QAC3C,SAAS,EAAE,aAAa,CAAC;QACzB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CA8MrE;AAED,8DAA8D;AAC9D,YAAY,EACV,aAAa,EACb,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/cjs/server.js
CHANGED
|
@@ -206,19 +206,19 @@ function createX402Server(config) {
|
|
|
206
206
|
// signed payload. The recipient's main wallet is never in this body
|
|
207
207
|
// because `accepted.payTo` is the freshly derived stealth address.
|
|
208
208
|
try {
|
|
209
|
-
|
|
210
|
-
|
|
209
|
+
// Translate our v2/CAIP-2 body into the v1/legacy-network shape the
|
|
210
|
+
// facilitator expects. Proven against PayAI on Base mainnet
|
|
211
|
+
// (tx 0x57d84d53…). Same body drives both /verify and /settle.
|
|
212
|
+
const facilitatorBody = (0, facilitator_js_1.toFacilitatorRequest)({
|
|
213
|
+
chainId: config.chainId,
|
|
211
214
|
paymentRequirements: accepted,
|
|
212
215
|
paymentPayload: payload,
|
|
213
216
|
});
|
|
217
|
+
const verifyResult = await (0, facilitator_js_1.facilitatorVerify)(facilitator, facilitatorBody);
|
|
214
218
|
if (!verifyResult.isValid) {
|
|
215
219
|
return { valid: false, error: 'facilitator_rejected' };
|
|
216
220
|
}
|
|
217
|
-
const settle = await (0, facilitator_js_1.facilitatorSettle)(facilitator,
|
|
218
|
-
x402Version: constants_js_1.X402_VERSION,
|
|
219
|
-
paymentRequirements: accepted,
|
|
220
|
-
paymentPayload: payload,
|
|
221
|
-
});
|
|
221
|
+
const settle = await (0, facilitator_js_1.facilitatorSettle)(facilitator, facilitatorBody);
|
|
222
222
|
if (!settle.success || settle.txHash === undefined) {
|
|
223
223
|
return { valid: false, error: 'facilitator_settle_failed' };
|
|
224
224
|
}
|
package/dist/cjs/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAwFH,4CA8MC;AApSD,0CAAoD;AACpD,kDAA4D;AAC5D,oDAAuD;AACvD,+CAKuB;AACvB,iDAAwE;AACxE,2CAGqB;AAMrB,qDAK0B;AAC1B,6CAGsB;AAEtB;;GAEG;AACH,SAAS,KAAK,CAAC,OAAe;IAC5B,OAAO,UAAU,OAAO,EAAE,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,CAAU;IAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,qCAAyB,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;IACD,MAAM,IAAI,qCAAyB,EAAE,CAAC;AACxC,CAAC;AA+BD;;GAEG;AACH,SAAgB,gBAAgB,CAAC,MAAwB;IACvD,4EAA4E;IAC5E,6EAA6E;IAC7E,2EAA2E;IAC3E,8DAA8D;IAC9D,MAAM,KAAK,GAAG,IAAA,2BAAe,EAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,sCAA0B,EAAE,CAAC;IACzC,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;IAEjC,0EAA0E;IAC1E,kEAAkE;IAClE,6BAA6B;IAC7B,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,IAAA,wBAAiB,EAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,qCAAyB,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,mCAAkB,EAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAE3D,OAAO;QACL,KAAK,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE;YACpD,MAAM,KAAK,GAAG,WAAW,IAAI,MAAM,CAAC,kBAAkB,CAAC;YAEvD,wEAAwE;YACxE,6DAA6D;YAC7D,MAAM,QAAQ,GAAG,IAAA,gCAAqB,EAAC,OAAO,CAAC,CAAC;YAEhD,MAAM,YAAY,GAA4B;gBAC5C,MAAM,EAAE,+BAAiB;gBACzB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC9B,iBAAiB,EAAE,KAAK,CAAC,QAAQ,EAAE;gBACnC,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,KAAK,EAAE,QAAQ,CAAC,cAAc;gBAC9B,iBAAiB,EAAE,uCAAwB;gBAC3C,QAAQ;gBACR,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW,CAAC,IAAI;oBACtB,OAAO,EAAE,WAAW,CAAC,OAAO;oBAC5B,oBAAoB,EAAE;wBACpB,eAAe,EAAE,QAAQ,CAAC,eAAe;wBACzC,OAAO,EAAE,QAAQ,CAAC,OAAO;qBAC1B;iBACF;aACF,CAAC;YAEF,MAAM,IAAI,GAAG;gBACX,WAAW,EAAE,2BAAY;gBACzB,KAAK,EAAE,kBAAkB;gBACzB,OAAO,EAAE,CAAC,YAAY,CAAU;aACxB,CAAC;YAEX,OAAO;gBACL,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE;oBACP,CAAC,0CAA4B,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBACpD,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI;gBACJ,YAAY,EAAE;oBACZ,eAAe,EAAE,QAAQ,CAAC,eAAe;oBACzC,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,cAAc,EAAE,QAAQ,CAAC,cAAc;iBACxC;aACF,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,eAAe,EAAE;YACxD,8BAA8B;YAC9B,IAAI,OAA2B,CAAC;YAChC,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;gBACtC,IAAI,CAAC;oBACH,6CAA6C;oBAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAC/D,OAAO,CACR,CAAC;oBACF,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAuB,CAAC;gBAC1D,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;gBACtD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,aAAa,CAAC;YAC1B,CAAC;YAED,0EAA0E;YAC1E,IACE,OAAO,CAAC,WAAW,KAAK,CAAC;gBACzB,OAAO,CAAC,MAAM,KAAK,+BAAiB;gBACpC,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EACzC,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;YACpD,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC;YAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;YACvC,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC5C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;YACtD,CAAC;YAED,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;YACxD,CAAC;YAED,wEAAwE;YACxE,4BAA4B;YAC5B,IAAI,KAAa,CAAC;YAClB,IAAI,UAAkB,CAAC;YACvB,IAAI,WAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7B,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACvC,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;YACtD,CAAC;YAED,IACE,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,EACtD,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,CAAC;YACvD,CAAC;YACD,IAAI,cAAsB,CAAC;YAC3B,IAAI,CAAC;gBACH,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACxD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;YACxD,CAAC;YACD,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;gBAC7B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;YACpD,CAAC;YAED,kBAAkB;YAClB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;YACtD,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;gBAC3B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAC5C,CAAC;YACD,IAAI,UAAU,GAAG,OAAO,EAAE,CAAC;gBACzB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;YAClD,CAAC;YAED,yBAAyB;YACzB,MAAM,SAAS,GAAmC;gBAChD,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,KAAK;gBACL,UAAU;gBACV,WAAW;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC;YACF,MAAM,SAAS,GAAG,MAAM,IAAA,qDAAwC,EAAC;gBAC/D,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,iBAAiB,EAAE,MAAM,CAAC,KAAK;gBAC/B,aAAa,EAAE,SAAS;gBACxB,SAAS,EAAE,GAAG;aACf,CAAC,CAAC;YACH,IACE,SAAS,KAAK,IAAI;gBAClB,SAAS,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EACnD,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;YACtD,CAAC;YAED,sEAAsE;YACtE,+DAA+D;YAC/D,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;gBAC7B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACzB,CAAC;YAED,+DAA+D;YAC/D,qEAAqE;YACrE,oEAAoE;YACpE,mEAAmE;YACnE,IAAI,CAAC;gBACH,oEAAoE;gBACpE,4DAA4D;gBAC5D,+DAA+D;gBAC/D,MAAM,eAAe,GAAG,IAAA,qCAAoB,EAAC;oBAC3C,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,mBAAmB,EAAE,QAA8C;oBACnE,cAAc,EAAE,OAA6C;iBAC9D,CAAC,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,IAAA,kCAAiB,EAC1C,WAAW,EACX,eAAe,CAChB,CAAC;gBACF,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;oBAC1B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC;gBACzD,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,IAAA,kCAAiB,EAAC,WAAW,EAAE,eAAe,CAAC,CAAC;gBACrE,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACnD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAC;gBAC9D,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,oEAAoE;gBACpE,qEAAqE;gBACrE,oEAAoE;gBACpE,eAAe;gBACf,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC;YAC5D,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -30,6 +30,45 @@ export interface FacilitatorSettleResult {
|
|
|
30
30
|
}
|
|
31
31
|
/** Resolve the facilitator config, defaulting to PayAI free tier. */
|
|
32
32
|
export declare function resolveFacilitator(config: X402FacilitatorConfig | undefined): X402FacilitatorConfig;
|
|
33
|
+
/**
|
|
34
|
+
* Translate our internal x402 v2 / CAIP-2 verify+settle body into the v1 /
|
|
35
|
+
* legacy-network shape that PayAI (and the wider facilitator ecosystem)
|
|
36
|
+
* accepts on the wire. Proven end-to-end on Base mainnet (tx 0x57d84d53…)
|
|
37
|
+
* before this shipped.
|
|
38
|
+
*
|
|
39
|
+
* Transformations:
|
|
40
|
+
* - x402Version 2 → 1 (top-level and on the payload)
|
|
41
|
+
* - network CAIP-2 (`eip155:8453`) → legacy name (`base`) on both the
|
|
42
|
+
* payload and the requirements
|
|
43
|
+
* - requirements.extra trimmed to `{ name, version }` — the facilitator
|
|
44
|
+
* does not consume our `shroudfiAnnouncement` extension and some reject
|
|
45
|
+
* unknown extra keys
|
|
46
|
+
* - requirements gains `mimeType: ''` (present in the canonical v1 shape)
|
|
47
|
+
*
|
|
48
|
+
* Pure — never mutates its inputs. Throws X402FacilitatorError('network') for
|
|
49
|
+
* a chain with no mapped facilitator network name.
|
|
50
|
+
*/
|
|
51
|
+
export declare function toFacilitatorRequest(args: {
|
|
52
|
+
readonly chainId: number;
|
|
53
|
+
readonly paymentRequirements: Record<string, unknown> & {
|
|
54
|
+
readonly extra?: Record<string, unknown>;
|
|
55
|
+
};
|
|
56
|
+
readonly paymentPayload: Record<string, unknown>;
|
|
57
|
+
}): {
|
|
58
|
+
x402Version: 1;
|
|
59
|
+
paymentPayload: Record<string, unknown> & {
|
|
60
|
+
x402Version: 1;
|
|
61
|
+
network: string;
|
|
62
|
+
};
|
|
63
|
+
paymentRequirements: Record<string, unknown> & {
|
|
64
|
+
network: string;
|
|
65
|
+
mimeType: string;
|
|
66
|
+
extra: {
|
|
67
|
+
name: string;
|
|
68
|
+
version: string;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
};
|
|
33
72
|
/**
|
|
34
73
|
* Build standard headers for a facilitator request. When an Ed25519 auth
|
|
35
74
|
* token is configured, attach `Authorization: Bearer <token>`. Otherwise
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facilitator.d.ts","sourceRoot":"","sources":["../../src/facilitator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,
|
|
1
|
+
{"version":3,"file":"facilitator.d.ts","sourceRoot":"","sources":["../../src/facilitator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAGL,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAC;AAGvB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,qEAAqE;AACrE,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,qBAAqB,GAAG,SAAS,GACxC,qBAAqB,CAKvB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QACtD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC1C,CAAC;IACF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClD,GAAG;IACF,WAAW,EAAE,CAAC,CAAC;IACf,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,WAAW,EAAE,CAAC,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9E,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAC7C,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1C,CAAC;CACH,CAgCA;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,qBAAqB,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASxB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,OAAO,EACb,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,uBAAuB,CAAC,CAsBlC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,OAAO,EACb,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,uBAAuB,CAAC,CAoClC"}
|
package/dist/esm/facilitator.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* full token; tests verify the header is set but redaction is the
|
|
15
15
|
* operator's responsibility upstream.
|
|
16
16
|
*/
|
|
17
|
-
import { PAYAI_FACILITATOR_URL } from './protocol.js';
|
|
17
|
+
import { PAYAI_FACILITATOR_URL, facilitatorNetworkName, } from './protocol.js';
|
|
18
18
|
import { X402FacilitatorError } from './errors.js';
|
|
19
19
|
/** Resolve the facilitator config, defaulting to PayAI free tier. */
|
|
20
20
|
export function resolveFacilitator(config) {
|
|
@@ -23,6 +23,49 @@ export function resolveFacilitator(config) {
|
|
|
23
23
|
}
|
|
24
24
|
return config;
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Translate our internal x402 v2 / CAIP-2 verify+settle body into the v1 /
|
|
28
|
+
* legacy-network shape that PayAI (and the wider facilitator ecosystem)
|
|
29
|
+
* accepts on the wire. Proven end-to-end on Base mainnet (tx 0x57d84d53…)
|
|
30
|
+
* before this shipped.
|
|
31
|
+
*
|
|
32
|
+
* Transformations:
|
|
33
|
+
* - x402Version 2 → 1 (top-level and on the payload)
|
|
34
|
+
* - network CAIP-2 (`eip155:8453`) → legacy name (`base`) on both the
|
|
35
|
+
* payload and the requirements
|
|
36
|
+
* - requirements.extra trimmed to `{ name, version }` — the facilitator
|
|
37
|
+
* does not consume our `shroudfiAnnouncement` extension and some reject
|
|
38
|
+
* unknown extra keys
|
|
39
|
+
* - requirements gains `mimeType: ''` (present in the canonical v1 shape)
|
|
40
|
+
*
|
|
41
|
+
* Pure — never mutates its inputs. Throws X402FacilitatorError('network') for
|
|
42
|
+
* a chain with no mapped facilitator network name.
|
|
43
|
+
*/
|
|
44
|
+
export function toFacilitatorRequest(args) {
|
|
45
|
+
const network = facilitatorNetworkName(args.chainId);
|
|
46
|
+
if (network === undefined) {
|
|
47
|
+
throw new X402FacilitatorError('network');
|
|
48
|
+
}
|
|
49
|
+
const srcExtra = (args.paymentRequirements.extra ?? {});
|
|
50
|
+
const extra = {
|
|
51
|
+
name: String(srcExtra.name ?? ''),
|
|
52
|
+
version: String(srcExtra.version ?? ''),
|
|
53
|
+
};
|
|
54
|
+
const paymentRequirements = {
|
|
55
|
+
...args.paymentRequirements,
|
|
56
|
+
network,
|
|
57
|
+
mimeType: typeof args.paymentRequirements.mimeType === 'string'
|
|
58
|
+
? args.paymentRequirements.mimeType
|
|
59
|
+
: '',
|
|
60
|
+
extra,
|
|
61
|
+
};
|
|
62
|
+
const paymentPayload = {
|
|
63
|
+
...args.paymentPayload,
|
|
64
|
+
x402Version: 1,
|
|
65
|
+
network,
|
|
66
|
+
};
|
|
67
|
+
return { x402Version: 1, paymentPayload, paymentRequirements };
|
|
68
|
+
}
|
|
26
69
|
/**
|
|
27
70
|
* Build standard headers for a facilitator request. When an Ed25519 auth
|
|
28
71
|
* token is configured, attach `Authorization: Bearer <token>`. Otherwise
|
|
@@ -88,13 +131,25 @@ export async function facilitatorSettle(config, body, fetchImpl = fetch) {
|
|
|
88
131
|
if (!res.ok) {
|
|
89
132
|
throw new X402FacilitatorError('settle');
|
|
90
133
|
}
|
|
91
|
-
let
|
|
134
|
+
let raw;
|
|
92
135
|
try {
|
|
93
|
-
|
|
136
|
+
raw = (await res.json());
|
|
94
137
|
}
|
|
95
138
|
catch {
|
|
96
139
|
throw new X402FacilitatorError('settle');
|
|
97
140
|
}
|
|
98
|
-
|
|
141
|
+
// Normalize the tx-hash field. The x402 facilitator spec drifted: PayAI
|
|
142
|
+
// returns `transaction`, some return `transactionHash`, our own type uses
|
|
143
|
+
// `txHash`. Accept all three so callers get a populated txHash on success.
|
|
144
|
+
const txHash = (raw.txHash ?? raw.transaction ?? raw.transactionHash);
|
|
145
|
+
return {
|
|
146
|
+
success: raw.success === true,
|
|
147
|
+
...(txHash !== undefined ? { txHash } : {}),
|
|
148
|
+
...(typeof raw.errorReason === 'string'
|
|
149
|
+
? { errorReason: raw.errorReason }
|
|
150
|
+
: {}),
|
|
151
|
+
...(typeof raw.payer === 'string' ? { payer: raw.payer } : {}),
|
|
152
|
+
...(typeof raw.network === 'string' ? { network: raw.network } : {}),
|
|
153
|
+
};
|
|
99
154
|
}
|
|
100
155
|
//# sourceMappingURL=facilitator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"facilitator.js","sourceRoot":"","sources":["../../src/facilitator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"facilitator.js","sourceRoot":"","sources":["../../src/facilitator.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -2,7 +2,9 @@ export { createX402Server } from './server.js';
|
|
|
2
2
|
export type { X402Server, X402ServerConfig, X402Challenge, X402PaymentRequirements, X402PaymentVerification, } from './server.js';
|
|
3
3
|
export { createX402Client } from './client.js';
|
|
4
4
|
export type { X402Client, X402ClientConfig, X402PaymentResult, } from './client.js';
|
|
5
|
-
export { X402_PAYMENT_REQUIRED_HEADER, X402_PAYMENT_SIGNATURE_HEADER, X402_PAYMENT_RESPONSE_HEADER, X402_SCHEME_EXACT, PAYAI_FACILITATOR_URL, COINBASE_FACILITATOR_URL, } from './protocol.js';
|
|
5
|
+
export { X402_PAYMENT_REQUIRED_HEADER, X402_PAYMENT_SIGNATURE_HEADER, X402_PAYMENT_RESPONSE_HEADER, X402_SCHEME_EXACT, PAYAI_FACILITATOR_URL, COINBASE_FACILITATOR_URL, facilitatorNetworkName, } from './protocol.js';
|
|
6
|
+
export { resolveFacilitator, toFacilitatorRequest, facilitatorVerify, facilitatorSettle, } from './facilitator.js';
|
|
7
|
+
export type { FacilitatorVerifyResult, FacilitatorSettleResult, } from './facilitator.js';
|
|
6
8
|
export type { X402PaymentPayload, X402SchemeId, X402FacilitatorConfig, } from './protocol.js';
|
|
7
9
|
export { X402Error, X402InvalidChallengeError, X402SignatureVerificationError, X402FacilitatorError, X402AssetNotSupportedError, X402AmountMismatchError, } from './errors.js';
|
|
8
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,4BAA4B,EAC5B,6BAA6B,EAC7B,4BAA4B,EAC5B,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EACV,UAAU,EACV,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,4BAA4B,EAC5B,6BAA6B,EAC7B,4BAA4B,EAC5B,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,qBAAqB,GACtB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,SAAS,EACT,yBAAyB,EACzB,8BAA8B,EAC9B,oBAAoB,EACpB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,aAAa,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -6,7 +6,9 @@ export { createX402Server } from './server.js';
|
|
|
6
6
|
// Client side
|
|
7
7
|
export { createX402Client } from './client.js';
|
|
8
8
|
// Protocol constants + types
|
|
9
|
-
export { X402_PAYMENT_REQUIRED_HEADER, X402_PAYMENT_SIGNATURE_HEADER, X402_PAYMENT_RESPONSE_HEADER, X402_SCHEME_EXACT, PAYAI_FACILITATOR_URL, COINBASE_FACILITATOR_URL, } from './protocol.js';
|
|
9
|
+
export { X402_PAYMENT_REQUIRED_HEADER, X402_PAYMENT_SIGNATURE_HEADER, X402_PAYMENT_RESPONSE_HEADER, X402_SCHEME_EXACT, PAYAI_FACILITATOR_URL, COINBASE_FACILITATOR_URL, facilitatorNetworkName, } from './protocol.js';
|
|
10
|
+
// Facilitator client + adapter (v0.1.2)
|
|
11
|
+
export { resolveFacilitator, toFacilitatorRequest, facilitatorVerify, facilitatorSettle, } from './facilitator.js';
|
|
10
12
|
// Errors
|
|
11
13
|
export { X402Error, X402InvalidChallengeError, X402SignatureVerificationError, X402FacilitatorError, X402AssetNotSupportedError, X402AmountMismatchError, } from './errors.js';
|
|
12
14
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,oEAAoE;AACpE,qFAAqF;AAErF,cAAc;AACd,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAS/C,cAAc;AACd,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAO/C,6BAA6B;AAC7B,OAAO,EACL,4BAA4B,EAC5B,6BAA6B,EAC7B,4BAA4B,EAC5B,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,oEAAoE;AACpE,qFAAqF;AAErF,cAAc;AACd,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAS/C,cAAc;AACd,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAO/C,6BAA6B;AAC7B,OAAO,EACL,4BAA4B,EAC5B,6BAA6B,EAC7B,4BAA4B,EAC5B,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,eAAe,CAAC;AAEvB,wCAAwC;AACxC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAW1B,SAAS;AACT,OAAO,EACL,SAAS,EACT,yBAAyB,EACzB,8BAA8B,EAC9B,oBAAoB,EACpB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,aAAa,CAAC"}
|
package/dist/esm/protocol.d.ts
CHANGED
|
@@ -32,6 +32,16 @@ export declare const PAYAI_FACILITATOR_URL: "https://facilitator.payai.network";
|
|
|
32
32
|
* URL verified against research doc §3 (cdp.coinbase.com/platform/v2/x402).
|
|
33
33
|
*/
|
|
34
34
|
export declare const COINBASE_FACILITATOR_URL: "https://api.cdp.coinbase.com/platform/v2/x402";
|
|
35
|
+
/**
|
|
36
|
+
* Map an EVM chain id to the x402 v1 legacy network name that facilitators
|
|
37
|
+
* (PayAI, Coinbase CDP, etc.) expect on the wire. The facilitator ecosystem
|
|
38
|
+
* standardized on these short names, NOT CAIP-2 (`eip155:8453`). Our SDK uses
|
|
39
|
+
* CAIP-2 internally and translates only at the facilitator boundary.
|
|
40
|
+
*
|
|
41
|
+
* Verified against PayAI `/supported` (2026-06-04) — Base mainnet = "base",
|
|
42
|
+
* Base Sepolia = "base-sepolia". Returns undefined for chains we don't map.
|
|
43
|
+
*/
|
|
44
|
+
export declare function facilitatorNetworkName(chainId: number): string | undefined;
|
|
35
45
|
/**
|
|
36
46
|
* The `accepts[N]` entry from a v2 `PaymentRequired` object — the exact shape
|
|
37
47
|
* a client receives over the wire.
|