@bankofai/x402-evm 1.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +172 -0
- package/dist/cjs/auth-capture/client/index.d.ts +44 -0
- package/dist/cjs/auth-capture/client/index.js +298 -0
- package/dist/cjs/auth-capture/client/index.js.map +1 -0
- package/dist/cjs/batch-settlement/client/file-storage.d.ts +47 -0
- package/dist/cjs/batch-settlement/client/file-storage.js +116 -0
- package/dist/cjs/batch-settlement/client/file-storage.js.map +1 -0
- package/dist/cjs/batch-settlement/client/index.d.ts +111 -0
- package/dist/cjs/batch-settlement/client/index.js +1565 -0
- package/dist/cjs/batch-settlement/client/index.js.map +1 -0
- package/dist/cjs/batch-settlement/facilitator/index.d.ts +72 -0
- package/dist/cjs/batch-settlement/facilitator/index.js +2102 -0
- package/dist/cjs/batch-settlement/facilitator/index.js.map +1 -0
- package/dist/cjs/batch-settlement/server/file-storage.d.ts +53 -0
- package/dist/cjs/batch-settlement/server/file-storage.js +181 -0
- package/dist/cjs/batch-settlement/server/file-storage.js.map +1 -0
- package/dist/cjs/batch-settlement/server/index.d.ts +491 -0
- package/dist/cjs/batch-settlement/server/index.js +1978 -0
- package/dist/cjs/batch-settlement/server/index.js.map +1 -0
- package/dist/cjs/batch-settlement/server/redis-storage.d.ts +87 -0
- package/dist/cjs/batch-settlement/server/redis-storage.js +181 -0
- package/dist/cjs/batch-settlement/server/redis-storage.js.map +1 -0
- package/dist/cjs/client/agent-wallet.d.ts +69 -0
- package/dist/cjs/client/agent-wallet.js +84 -0
- package/dist/cjs/client/agent-wallet.js.map +1 -0
- package/dist/cjs/exact/client/index.d.ts +63 -0
- package/dist/cjs/exact/client/index.js +739 -0
- package/dist/cjs/exact/client/index.js.map +1 -0
- package/dist/cjs/exact/facilitator/index.d.ts +141 -0
- package/dist/cjs/exact/facilitator/index.js +1989 -0
- package/dist/cjs/exact/facilitator/index.js.map +1 -0
- package/dist/cjs/exact/server/index.d.ts +118 -0
- package/dist/cjs/exact/server/index.js +326 -0
- package/dist/cjs/exact/server/index.js.map +1 -0
- package/dist/cjs/exact/v1/client/index.d.ts +38 -0
- package/dist/cjs/exact/v1/client/index.js +193 -0
- package/dist/cjs/exact/v1/client/index.js.map +1 -0
- package/dist/cjs/exact/v1/facilitator/index.d.ts +84 -0
- package/dist/cjs/exact/v1/facilitator/index.js +739 -0
- package/dist/cjs/exact/v1/facilitator/index.js.map +1 -0
- package/dist/cjs/facilitator/agent-wallet.d.ts +109 -0
- package/dist/cjs/facilitator/agent-wallet.js +105 -0
- package/dist/cjs/facilitator/agent-wallet.js.map +1 -0
- package/dist/cjs/index.d.ts +338 -0
- package/dist/cjs/index.js +2860 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/permit2-DK5A8alk.d.ts +729 -0
- package/dist/cjs/permit2-DhJRUcgY.d.ts +729 -0
- package/dist/cjs/rpc-DULZzRne.d.ts +13 -0
- package/dist/cjs/scheme-7ehldYoO.d.ts +307 -0
- package/dist/cjs/scheme-BjBJzHF7.d.ts +307 -0
- package/dist/cjs/scheme-DWgpkDgz.d.ts +47 -0
- package/dist/cjs/signer-BFelv8DL.d.ts +170 -0
- package/dist/cjs/storage-6W5MO46W.d.ts +50 -0
- package/dist/cjs/storage-CHNote8s.d.ts +81 -0
- package/dist/cjs/storage-DjCv5IPh.d.ts +81 -0
- package/dist/cjs/types-CKd3Xoi1.d.ts +180 -0
- package/dist/cjs/types-DIt9uAUy.d.ts +180 -0
- package/dist/cjs/upto/client/index.d.ts +34 -0
- package/dist/cjs/upto/client/index.js +509 -0
- package/dist/cjs/upto/client/index.js.map +1 -0
- package/dist/cjs/upto/facilitator/index.d.ts +54 -0
- package/dist/cjs/upto/facilitator/index.js +1313 -0
- package/dist/cjs/upto/facilitator/index.js.map +1 -0
- package/dist/cjs/upto/server/index.d.ts +69 -0
- package/dist/cjs/upto/server/index.js +296 -0
- package/dist/cjs/upto/server/index.js.map +1 -0
- package/dist/cjs/v1/index.d.ts +40 -0
- package/dist/cjs/v1/index.js +199 -0
- package/dist/cjs/v1/index.js.map +1 -0
- package/dist/esm/auth-capture/client/index.d.mts +44 -0
- package/dist/esm/auth-capture/client/index.mjs +8 -0
- package/dist/esm/auth-capture/client/index.mjs.map +1 -0
- package/dist/esm/batch-settlement/client/file-storage.d.mts +47 -0
- package/dist/esm/batch-settlement/client/file-storage.mjs +63 -0
- package/dist/esm/batch-settlement/client/file-storage.mjs.map +1 -0
- package/dist/esm/batch-settlement/client/index.d.mts +111 -0
- package/dist/esm/batch-settlement/client/index.mjs +58 -0
- package/dist/esm/batch-settlement/client/index.mjs.map +1 -0
- package/dist/esm/batch-settlement/facilitator/index.d.mts +72 -0
- package/dist/esm/batch-settlement/facilitator/index.mjs +1252 -0
- package/dist/esm/batch-settlement/facilitator/index.mjs.map +1 -0
- package/dist/esm/batch-settlement/server/file-storage.d.mts +53 -0
- package/dist/esm/batch-settlement/server/file-storage.mjs +128 -0
- package/dist/esm/batch-settlement/server/file-storage.mjs.map +1 -0
- package/dist/esm/batch-settlement/server/index.d.mts +491 -0
- package/dist/esm/batch-settlement/server/index.mjs +1640 -0
- package/dist/esm/batch-settlement/server/index.mjs.map +1 -0
- package/dist/esm/batch-settlement/server/redis-storage.d.mts +87 -0
- package/dist/esm/batch-settlement/server/redis-storage.mjs +156 -0
- package/dist/esm/batch-settlement/server/redis-storage.mjs.map +1 -0
- package/dist/esm/chunk-2EUQTNJO.mjs +38 -0
- package/dist/esm/chunk-2EUQTNJO.mjs.map +1 -0
- package/dist/esm/chunk-3WZF6722.mjs +36 -0
- package/dist/esm/chunk-3WZF6722.mjs.map +1 -0
- package/dist/esm/chunk-E4Z7PNXC.mjs +275 -0
- package/dist/esm/chunk-E4Z7PNXC.mjs.map +1 -0
- package/dist/esm/chunk-GQVMVP4N.mjs +911 -0
- package/dist/esm/chunk-GQVMVP4N.mjs.map +1 -0
- package/dist/esm/chunk-H2EYJIZL.mjs +489 -0
- package/dist/esm/chunk-H2EYJIZL.mjs.map +1 -0
- package/dist/esm/chunk-H3KPLYGI.mjs +152 -0
- package/dist/esm/chunk-H3KPLYGI.mjs.map +1 -0
- package/dist/esm/chunk-HYABYUBD.mjs +432 -0
- package/dist/esm/chunk-HYABYUBD.mjs.map +1 -0
- package/dist/esm/chunk-I2DVUHM5.mjs +123 -0
- package/dist/esm/chunk-I2DVUHM5.mjs.map +1 -0
- package/dist/esm/chunk-JK7SLLF7.mjs +34 -0
- package/dist/esm/chunk-JK7SLLF7.mjs.map +1 -0
- package/dist/esm/chunk-JNT7C46S.mjs +352 -0
- package/dist/esm/chunk-JNT7C46S.mjs.map +1 -0
- package/dist/esm/chunk-MACPBXCT.mjs +415 -0
- package/dist/esm/chunk-MACPBXCT.mjs.map +1 -0
- package/dist/esm/chunk-P3QOX3QZ.mjs +113 -0
- package/dist/esm/chunk-P3QOX3QZ.mjs.map +1 -0
- package/dist/esm/chunk-QVATVA3J.mjs +47 -0
- package/dist/esm/chunk-QVATVA3J.mjs.map +1 -0
- package/dist/esm/chunk-SHJFA25H.mjs +159 -0
- package/dist/esm/chunk-SHJFA25H.mjs.map +1 -0
- package/dist/esm/chunk-TW7Z65AO.mjs +34 -0
- package/dist/esm/chunk-TW7Z65AO.mjs.map +1 -0
- package/dist/esm/chunk-U4HCGTLU.mjs +35 -0
- package/dist/esm/chunk-U4HCGTLU.mjs.map +1 -0
- package/dist/esm/chunk-VS3RYAYE.mjs +80 -0
- package/dist/esm/chunk-VS3RYAYE.mjs.map +1 -0
- package/dist/esm/chunk-W6ON4LG2.mjs +39 -0
- package/dist/esm/chunk-W6ON4LG2.mjs.map +1 -0
- package/dist/esm/chunk-XG2JLZVJ.mjs +627 -0
- package/dist/esm/chunk-XG2JLZVJ.mjs.map +1 -0
- package/dist/esm/chunk-ZCJRY5LQ.mjs +162 -0
- package/dist/esm/chunk-ZCJRY5LQ.mjs.map +1 -0
- package/dist/esm/client/agent-wallet.d.mts +69 -0
- package/dist/esm/client/agent-wallet.mjs +36 -0
- package/dist/esm/client/agent-wallet.mjs.map +1 -0
- package/dist/esm/exact/client/index.d.mts +63 -0
- package/dist/esm/exact/client/index.mjs +25 -0
- package/dist/esm/exact/client/index.mjs.map +1 -0
- package/dist/esm/exact/facilitator/index.d.mts +141 -0
- package/dist/esm/exact/facilitator/index.mjs +694 -0
- package/dist/esm/exact/facilitator/index.mjs.map +1 -0
- package/dist/esm/exact/server/index.d.mts +118 -0
- package/dist/esm/exact/server/index.mjs +153 -0
- package/dist/esm/exact/server/index.mjs.map +1 -0
- package/dist/esm/exact/v1/client/index.d.mts +38 -0
- package/dist/esm/exact/v1/client/index.mjs +12 -0
- package/dist/esm/exact/v1/client/index.mjs.map +1 -0
- package/dist/esm/exact/v1/facilitator/index.d.mts +84 -0
- package/dist/esm/exact/v1/facilitator/index.mjs +12 -0
- package/dist/esm/exact/v1/facilitator/index.mjs.map +1 -0
- package/dist/esm/facilitator/agent-wallet.d.mts +109 -0
- package/dist/esm/facilitator/agent-wallet.mjs +74 -0
- package/dist/esm/facilitator/agent-wallet.mjs.map +1 -0
- package/dist/esm/index.d.mts +338 -0
- package/dist/esm/index.mjs +144 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/permit2-DhJRUcgY.d.mts +729 -0
- package/dist/esm/rpc-DULZzRne.d.mts +13 -0
- package/dist/esm/scheme-CkNhpXrG.d.mts +307 -0
- package/dist/esm/scheme-D8ZbykGV.d.mts +47 -0
- package/dist/esm/signer-BFelv8DL.d.mts +170 -0
- package/dist/esm/storage-6W5MO46W.d.mts +50 -0
- package/dist/esm/storage-BEzTEiUr.d.mts +81 -0
- package/dist/esm/types-DIt9uAUy.d.mts +180 -0
- package/dist/esm/upto/client/index.d.mts +34 -0
- package/dist/esm/upto/client/index.mjs +22 -0
- package/dist/esm/upto/client/index.mjs.map +1 -0
- package/dist/esm/upto/facilitator/index.d.mts +54 -0
- package/dist/esm/upto/facilitator/index.mjs +507 -0
- package/dist/esm/upto/facilitator/index.mjs.map +1 -0
- package/dist/esm/upto/server/index.d.mts +69 -0
- package/dist/esm/upto/server/index.mjs +124 -0
- package/dist/esm/upto/server/index.mjs.map +1 -0
- package/dist/esm/v1/index.d.mts +40 -0
- package/dist/esm/v1/index.mjs +18 -0
- package/dist/esm/v1/index.mjs.map +1 -0
- package/package.json +250 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/exact/server/index.ts
|
|
21
|
+
var server_exports = {};
|
|
22
|
+
__export(server_exports, {
|
|
23
|
+
ExactEvmScheme: () => ExactEvmScheme,
|
|
24
|
+
registerExactEvmScheme: () => registerExactEvmScheme
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(server_exports);
|
|
27
|
+
|
|
28
|
+
// src/exact/server/scheme.ts
|
|
29
|
+
var import_utils = require("@bankofai/x402-core/utils");
|
|
30
|
+
|
|
31
|
+
// src/shared/defaultAssets.ts
|
|
32
|
+
var DEFAULT_STABLECOINS = {
|
|
33
|
+
"eip155:8453": {
|
|
34
|
+
address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
35
|
+
name: "USD Coin",
|
|
36
|
+
version: "2",
|
|
37
|
+
decimals: 6
|
|
38
|
+
},
|
|
39
|
+
// Base mainnet USDC
|
|
40
|
+
"eip155:84532": {
|
|
41
|
+
address: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
|
|
42
|
+
name: "USDC",
|
|
43
|
+
version: "2",
|
|
44
|
+
decimals: 6
|
|
45
|
+
},
|
|
46
|
+
// Base Sepolia USDC
|
|
47
|
+
"eip155:4326": {
|
|
48
|
+
address: "0xFAfDdbb3FC7688494971a79cc65DCa3EF82079E7",
|
|
49
|
+
name: "MegaUSD",
|
|
50
|
+
version: "1",
|
|
51
|
+
decimals: 18,
|
|
52
|
+
assetTransferMethod: "permit2",
|
|
53
|
+
supportsEip2612: true
|
|
54
|
+
},
|
|
55
|
+
// MegaETH mainnet MegaUSD (no EIP-3009, supports EIP-2612)
|
|
56
|
+
"eip155:143": {
|
|
57
|
+
address: "0x754704Bc059F8C67012fEd69BC8A327a5aafb603",
|
|
58
|
+
name: "USD Coin",
|
|
59
|
+
version: "2",
|
|
60
|
+
decimals: 6
|
|
61
|
+
},
|
|
62
|
+
// Monad mainnet USDC
|
|
63
|
+
"eip155:988": {
|
|
64
|
+
address: "0x779Ded0c9e1022225f8E0630b35a9b54bE713736",
|
|
65
|
+
name: "USDT0",
|
|
66
|
+
version: "1",
|
|
67
|
+
decimals: 6
|
|
68
|
+
},
|
|
69
|
+
// Stable mainnet USDT0
|
|
70
|
+
"eip155:2201": {
|
|
71
|
+
address: "0x78Cf24370174180738C5B8E352B6D14c83a6c9A9",
|
|
72
|
+
name: "USDT0",
|
|
73
|
+
version: "1",
|
|
74
|
+
decimals: 6
|
|
75
|
+
},
|
|
76
|
+
// Stable testnet USDT0
|
|
77
|
+
"eip155:137": {
|
|
78
|
+
address: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
|
|
79
|
+
name: "USD Coin",
|
|
80
|
+
version: "2",
|
|
81
|
+
decimals: 6
|
|
82
|
+
},
|
|
83
|
+
// Polygon mainnet USDC
|
|
84
|
+
"eip155:42161": {
|
|
85
|
+
address: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
|
|
86
|
+
name: "USD Coin",
|
|
87
|
+
version: "2",
|
|
88
|
+
decimals: 6
|
|
89
|
+
},
|
|
90
|
+
// Arbitrum One USDC
|
|
91
|
+
"eip155:421614": {
|
|
92
|
+
address: "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d",
|
|
93
|
+
name: "USD Coin",
|
|
94
|
+
version: "2",
|
|
95
|
+
decimals: 6
|
|
96
|
+
},
|
|
97
|
+
// Arbitrum Sepolia USDC
|
|
98
|
+
"eip155:31612": {
|
|
99
|
+
address: "0xdD468A1DDc392dcdbEf6db6e34E89AA338F9F186",
|
|
100
|
+
name: "Mezo USD",
|
|
101
|
+
version: "1",
|
|
102
|
+
decimals: 18,
|
|
103
|
+
assetTransferMethod: "permit2",
|
|
104
|
+
supportsEip2612: true
|
|
105
|
+
},
|
|
106
|
+
// Mezo mainnet mUSD (no EIP-3009, supports EIP-2612)
|
|
107
|
+
"eip155:31611": {
|
|
108
|
+
address: "0x118917a40FAF1CD7a13dB0Ef56C86De7973Ac503",
|
|
109
|
+
name: "Mezo USD",
|
|
110
|
+
version: "1",
|
|
111
|
+
decimals: 18,
|
|
112
|
+
assetTransferMethod: "permit2",
|
|
113
|
+
supportsEip2612: true
|
|
114
|
+
},
|
|
115
|
+
// Mezo Testnet mUSD (no EIP-3009, supports EIP-2612)
|
|
116
|
+
"eip155:723487": {
|
|
117
|
+
address: "0x33ad9e4BD16B69B5BFdED37D8B5D9fF9aba014Fb",
|
|
118
|
+
name: "Stable Coin",
|
|
119
|
+
version: "1",
|
|
120
|
+
decimals: 6,
|
|
121
|
+
assetTransferMethod: "permit2",
|
|
122
|
+
supportsEip2612: true
|
|
123
|
+
},
|
|
124
|
+
// Radius Network SBC (no EIP-3009, supports EIP-2612)
|
|
125
|
+
"eip155:72344": {
|
|
126
|
+
address: "0x33ad9e4BD16B69B5BFdED37D8B5D9fF9aba014Fb",
|
|
127
|
+
name: "Stable Coin",
|
|
128
|
+
version: "1",
|
|
129
|
+
decimals: 6,
|
|
130
|
+
assetTransferMethod: "permit2",
|
|
131
|
+
supportsEip2612: true
|
|
132
|
+
},
|
|
133
|
+
// Radius Testnet SBC (no EIP-3009, supports EIP-2612)
|
|
134
|
+
"eip155:36900": {
|
|
135
|
+
address: "0x9cb8142aEBBcdc60AF7c97Af897A67A8f3CA71C2",
|
|
136
|
+
name: "USDC.e",
|
|
137
|
+
version: "2",
|
|
138
|
+
decimals: 6
|
|
139
|
+
},
|
|
140
|
+
// ADI Chain USDC.e (EIP-3009 supported)
|
|
141
|
+
"eip155:190415": {
|
|
142
|
+
address: "0x401eCb1D350407f13ba348573E5630B83638E30D",
|
|
143
|
+
name: "Bridged USDC",
|
|
144
|
+
version: "2",
|
|
145
|
+
decimals: 6
|
|
146
|
+
},
|
|
147
|
+
// HPP mainnet USDC.e
|
|
148
|
+
"eip155:181228": {
|
|
149
|
+
address: "0x401eCb1D350407f13ba348573E5630B83638E30D",
|
|
150
|
+
name: "Bridged USDC",
|
|
151
|
+
version: "2",
|
|
152
|
+
decimals: 6
|
|
153
|
+
},
|
|
154
|
+
// HPP Sepolia USDC.e
|
|
155
|
+
"eip155:50": {
|
|
156
|
+
address: "0xfA2958CB79b0491CC627c1557F441eF849Ca8eb1",
|
|
157
|
+
name: "USDC",
|
|
158
|
+
version: "2",
|
|
159
|
+
decimals: 6
|
|
160
|
+
},
|
|
161
|
+
// XDC Network mainnet USDC (Bridged USDC Standard, EIP-3009 supported)
|
|
162
|
+
"eip155:51": {
|
|
163
|
+
address: "0xb5AB69F7bBada22B28e79C8FFAECe55eF1c771D4",
|
|
164
|
+
name: "USDC",
|
|
165
|
+
version: "2",
|
|
166
|
+
decimals: 6
|
|
167
|
+
}
|
|
168
|
+
// XDC Apothem testnet USDC (Bridged USDC Standard, EIP-3009 supported)
|
|
169
|
+
};
|
|
170
|
+
function getDefaultAsset(network) {
|
|
171
|
+
const info = DEFAULT_STABLECOINS[network];
|
|
172
|
+
if (!info) {
|
|
173
|
+
throw new Error(`No default asset configured for network ${network}`);
|
|
174
|
+
}
|
|
175
|
+
return info;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// src/exact/server/scheme.ts
|
|
179
|
+
var ExactEvmScheme = class {
|
|
180
|
+
constructor() {
|
|
181
|
+
this.scheme = "exact";
|
|
182
|
+
this.moneyParsers = [];
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Register a custom money parser in the parser chain.
|
|
186
|
+
* Multiple parsers can be registered - they will be tried in registration order.
|
|
187
|
+
* Each parser receives a decimal amount (e.g., 1.50 for $1.50).
|
|
188
|
+
* If a parser returns null, the next parser in the chain will be tried.
|
|
189
|
+
* The default parser is always the final fallback.
|
|
190
|
+
*
|
|
191
|
+
* @param parser - Custom function to convert amount to AssetAmount (or null to skip)
|
|
192
|
+
* @returns The server instance for chaining
|
|
193
|
+
*
|
|
194
|
+
* @example
|
|
195
|
+
* evmServer.registerMoneyParser(async (amount, network) => {
|
|
196
|
+
* // Custom conversion logic
|
|
197
|
+
* if (amount > 100) {
|
|
198
|
+
* // Use different token for large amounts
|
|
199
|
+
* return { amount: (amount * 1e18).toString(), asset: "0xCustomToken" };
|
|
200
|
+
* }
|
|
201
|
+
* return null; // Use next parser
|
|
202
|
+
* });
|
|
203
|
+
*/
|
|
204
|
+
registerMoneyParser(parser) {
|
|
205
|
+
this.moneyParsers.push(parser);
|
|
206
|
+
return this;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Returns the decimal precision of the default stablecoin for the given network.
|
|
210
|
+
* Implements the optional AssetDecimalsProvider interface used by resolveSettlementOverrideAmount.
|
|
211
|
+
*
|
|
212
|
+
* @param _asset - The asset symbol (unused; defaults to the network's default stablecoin)
|
|
213
|
+
* @param network - The network to look up the default asset for
|
|
214
|
+
* @returns The number of decimal places for the asset
|
|
215
|
+
*/
|
|
216
|
+
getAssetDecimals(_asset, network) {
|
|
217
|
+
try {
|
|
218
|
+
return getDefaultAsset(network).decimals;
|
|
219
|
+
} catch {
|
|
220
|
+
return 6;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Parses a price into an asset amount.
|
|
225
|
+
* If price is already an AssetAmount, returns it directly.
|
|
226
|
+
* If price is Money (string | number), parses to decimal and tries custom parsers.
|
|
227
|
+
* Falls back to default conversion if all custom parsers return null.
|
|
228
|
+
*
|
|
229
|
+
* @param price - The price to parse
|
|
230
|
+
* @param network - The network to use
|
|
231
|
+
* @returns Promise that resolves to the parsed asset amount
|
|
232
|
+
*/
|
|
233
|
+
async parsePrice(price, network) {
|
|
234
|
+
if (typeof price === "object" && price !== null && "amount" in price) {
|
|
235
|
+
if (!price.asset) {
|
|
236
|
+
throw new Error(`Asset address must be specified for AssetAmount on network ${network}`);
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
amount: price.amount,
|
|
240
|
+
asset: price.asset,
|
|
241
|
+
extra: price.extra || {}
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
const amount = this.parseMoneyToDecimal(price);
|
|
245
|
+
for (const parser of this.moneyParsers) {
|
|
246
|
+
const result = await parser(amount, network);
|
|
247
|
+
if (result !== null) {
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return this.defaultMoneyConversion(amount, network);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Build payment requirements for this scheme/network combination
|
|
255
|
+
*
|
|
256
|
+
* @param paymentRequirements - The base payment requirements
|
|
257
|
+
* @param supportedKind - The supported kind from facilitator (unused)
|
|
258
|
+
* @param supportedKind.x402Version - The x402 version
|
|
259
|
+
* @param supportedKind.scheme - The logical payment scheme
|
|
260
|
+
* @param supportedKind.network - The network identifier in CAIP-2 format
|
|
261
|
+
* @param supportedKind.extra - Optional extra metadata regarding scheme/network implementation details
|
|
262
|
+
* @param extensionKeys - Extension keys supported by the facilitator (unused)
|
|
263
|
+
* @returns Payment requirements ready to be sent to clients
|
|
264
|
+
*/
|
|
265
|
+
enhancePaymentRequirements(paymentRequirements, supportedKind, extensionKeys) {
|
|
266
|
+
void supportedKind;
|
|
267
|
+
void extensionKeys;
|
|
268
|
+
return Promise.resolve(paymentRequirements);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Parse Money (string | number) to a decimal number.
|
|
272
|
+
* Handles formats like "$1.50", "1.50", 1.50, etc.
|
|
273
|
+
*
|
|
274
|
+
* @param money - The money value to parse
|
|
275
|
+
* @returns Decimal number
|
|
276
|
+
*/
|
|
277
|
+
parseMoneyToDecimal(money) {
|
|
278
|
+
if (typeof money === "number") {
|
|
279
|
+
return money;
|
|
280
|
+
}
|
|
281
|
+
return (0, import_utils.parseMoneyString)(money);
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Converts a numeric dollar amount to an AssetAmount using the default token for the network.
|
|
285
|
+
*
|
|
286
|
+
* @param amount - The dollar amount as a number
|
|
287
|
+
* @param network - The target network
|
|
288
|
+
* @returns The converted asset amount with token metadata
|
|
289
|
+
*/
|
|
290
|
+
defaultMoneyConversion(amount, network) {
|
|
291
|
+
const assetInfo = getDefaultAsset(network);
|
|
292
|
+
const tokenAmount = (0, import_utils.convertToTokenAmount)((0, import_utils.numberToDecimalString)(amount), assetInfo.decimals);
|
|
293
|
+
const includeEip712Domain = !assetInfo.assetTransferMethod || assetInfo.supportsEip2612;
|
|
294
|
+
return {
|
|
295
|
+
amount: tokenAmount,
|
|
296
|
+
asset: assetInfo.address,
|
|
297
|
+
extra: {
|
|
298
|
+
...includeEip712Domain && {
|
|
299
|
+
name: assetInfo.name,
|
|
300
|
+
version: assetInfo.version
|
|
301
|
+
},
|
|
302
|
+
...assetInfo.assetTransferMethod && {
|
|
303
|
+
assetTransferMethod: assetInfo.assetTransferMethod
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
// src/exact/server/register.ts
|
|
311
|
+
function registerExactEvmScheme(server, config = {}) {
|
|
312
|
+
if (config.networks && config.networks.length > 0) {
|
|
313
|
+
config.networks.forEach((network) => {
|
|
314
|
+
server.register(network, new ExactEvmScheme());
|
|
315
|
+
});
|
|
316
|
+
} else {
|
|
317
|
+
server.register("eip155:*", new ExactEvmScheme());
|
|
318
|
+
}
|
|
319
|
+
return server;
|
|
320
|
+
}
|
|
321
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
322
|
+
0 && (module.exports = {
|
|
323
|
+
ExactEvmScheme,
|
|
324
|
+
registerExactEvmScheme
|
|
325
|
+
});
|
|
326
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/exact/server/index.ts","../../../../src/exact/server/scheme.ts","../../../../src/shared/defaultAssets.ts","../../../../src/exact/server/register.ts"],"sourcesContent":["export { ExactEvmScheme } from \"./scheme\";\nexport { registerExactEvmScheme } from \"./register\";\nexport type { EvmResourceServerConfig } from \"./register\";\n","import {\n AssetAmount,\n Network,\n PaymentRequirements,\n Price,\n SchemeNetworkServer,\n MoneyParser,\n} from \"@bankofai/x402-core/types\";\nimport { convertToTokenAmount, numberToDecimalString, parseMoneyString } from \"@bankofai/x402-core/utils\";\nimport { getDefaultAsset, type ExactDefaultAssetInfo } from \"../../shared/defaultAssets\";\n\n/**\n * EVM server implementation for the Exact payment scheme.\n */\nexport class ExactEvmScheme implements SchemeNetworkServer {\n readonly scheme = \"exact\";\n private moneyParsers: MoneyParser[] = [];\n\n /**\n * Register a custom money parser in the parser chain.\n * Multiple parsers can be registered - they will be tried in registration order.\n * Each parser receives a decimal amount (e.g., 1.50 for $1.50).\n * If a parser returns null, the next parser in the chain will be tried.\n * The default parser is always the final fallback.\n *\n * @param parser - Custom function to convert amount to AssetAmount (or null to skip)\n * @returns The server instance for chaining\n *\n * @example\n * evmServer.registerMoneyParser(async (amount, network) => {\n * // Custom conversion logic\n * if (amount > 100) {\n * // Use different token for large amounts\n * return { amount: (amount * 1e18).toString(), asset: \"0xCustomToken\" };\n * }\n * return null; // Use next parser\n * });\n */\n registerMoneyParser(parser: MoneyParser): ExactEvmScheme {\n this.moneyParsers.push(parser);\n return this;\n }\n\n /**\n * Returns the decimal precision of the default stablecoin for the given network.\n * Implements the optional AssetDecimalsProvider interface used by resolveSettlementOverrideAmount.\n *\n * @param _asset - The asset symbol (unused; defaults to the network's default stablecoin)\n * @param network - The network to look up the default asset for\n * @returns The number of decimal places for the asset\n */\n getAssetDecimals(_asset: string, network: Network): number {\n try {\n return getDefaultAsset(network).decimals;\n } catch {\n return 6;\n }\n }\n\n /**\n * Parses a price into an asset amount.\n * If price is already an AssetAmount, returns it directly.\n * If price is Money (string | number), parses to decimal and tries custom parsers.\n * Falls back to default conversion if all custom parsers return null.\n *\n * @param price - The price to parse\n * @param network - The network to use\n * @returns Promise that resolves to the parsed asset amount\n */\n async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n // If already an AssetAmount, return it directly\n if (typeof price === \"object\" && price !== null && \"amount\" in price) {\n if (!price.asset) {\n throw new Error(`Asset address must be specified for AssetAmount on network ${network}`);\n }\n return {\n amount: price.amount,\n asset: price.asset,\n extra: price.extra || {},\n };\n }\n\n // Parse Money to decimal number\n const amount = this.parseMoneyToDecimal(price);\n\n // Try each custom money parser in order\n for (const parser of this.moneyParsers) {\n const result = await parser(amount, network);\n if (result !== null) {\n return result;\n }\n }\n\n // All custom parsers returned null, use default conversion\n return this.defaultMoneyConversion(amount, network);\n }\n\n /**\n * Build payment requirements for this scheme/network combination\n *\n * @param paymentRequirements - The base payment requirements\n * @param supportedKind - The supported kind from facilitator (unused)\n * @param supportedKind.x402Version - The x402 version\n * @param supportedKind.scheme - The logical payment scheme\n * @param supportedKind.network - The network identifier in CAIP-2 format\n * @param supportedKind.extra - Optional extra metadata regarding scheme/network implementation details\n * @param extensionKeys - Extension keys supported by the facilitator (unused)\n * @returns Payment requirements ready to be sent to clients\n */\n enhancePaymentRequirements(\n paymentRequirements: PaymentRequirements,\n supportedKind: {\n x402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n },\n extensionKeys: string[],\n ): Promise<PaymentRequirements> {\n // Mark unused parameters to satisfy linter\n void supportedKind;\n void extensionKeys;\n return Promise.resolve(paymentRequirements);\n }\n\n /**\n * Parse Money (string | number) to a decimal number.\n * Handles formats like \"$1.50\", \"1.50\", 1.50, etc.\n *\n * @param money - The money value to parse\n * @returns Decimal number\n */\n private parseMoneyToDecimal(money: string | number): number {\n if (typeof money === \"number\") {\n return money;\n }\n\n return parseMoneyString(money);\n }\n\n /**\n * Converts a numeric dollar amount to an AssetAmount using the default token for the network.\n *\n * @param amount - The dollar amount as a number\n * @param network - The target network\n * @returns The converted asset amount with token metadata\n */\n private defaultMoneyConversion(amount: number, network: Network): AssetAmount {\n const assetInfo: ExactDefaultAssetInfo = getDefaultAsset(network);\n const tokenAmount = convertToTokenAmount(numberToDecimalString(amount), assetInfo.decimals);\n\n // EIP-3009 tokens always need name/version for their transferWithAuthorization domain.\n // Permit2 tokens only need them if the token supports EIP-2612 (for gasless permit signing).\n // Omitting name/version for permit2 tokens signals the client to skip EIP-2612 and use\n // ERC-20 approval gas sponsoring instead.\n const includeEip712Domain = !assetInfo.assetTransferMethod || assetInfo.supportsEip2612;\n\n return {\n amount: tokenAmount,\n asset: assetInfo.address,\n extra: {\n ...(includeEip712Domain && {\n name: assetInfo.name,\n version: assetInfo.version,\n }),\n ...(assetInfo.assetTransferMethod && {\n assetTransferMethod: assetInfo.assetTransferMethod,\n }),\n },\n };\n }\n}\n","import type { Network } from \"@bankofai/x402-core/types\";\n\n/**\n * Base stablecoin asset configuration shared across all EVM payment schemes.\n * Contains the core fields needed to identify and convert tokens.\n */\nexport type DefaultAssetInfo = {\n /** Token contract address */\n address: string;\n /** EIP-712 domain name (must match the token's domain separator) */\n name: string;\n /** EIP-712 domain version (must match the token's domain separator) */\n version: string;\n /** Token decimal places (typically 6 for USDC) */\n decimals: number;\n};\n\n/**\n * Extended asset configuration for the exact scheme.\n * Includes transfer method hints that control client-side behaviour.\n */\nexport type ExactDefaultAssetInfo = DefaultAssetInfo & {\n /**\n * Transfer method override: `\"permit2\"` for tokens that don't support EIP-3009.\n * Omit for EIP-3009 tokens (default behaviour).\n */\n assetTransferMethod?: string;\n /**\n * Set to `true` for permit2 tokens that implement EIP-2612 `permit()`.\n * Controls whether name/version are included in `extra` so the client can\n * sign a gasless EIP-2612 permit for Permit2 approval.\n */\n supportsEip2612?: boolean;\n};\n\n/**\n * Default stablecoins indexed by CAIP-2 network identifier.\n *\n * Each network has the right to determine its own default stablecoin that can\n * be expressed as a USD string by calling servers. See DEFAULT_ASSET.md in\n * exact/server/ for how to add new chains.\n */\nexport const DEFAULT_STABLECOINS: Record<string, ExactDefaultAssetInfo> = {\n \"eip155:8453\": {\n address: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n name: \"USD Coin\",\n version: \"2\",\n decimals: 6,\n }, // Base mainnet USDC\n \"eip155:84532\": {\n address: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n name: \"USDC\",\n version: \"2\",\n decimals: 6,\n }, // Base Sepolia USDC\n \"eip155:4326\": {\n address: \"0xFAfDdbb3FC7688494971a79cc65DCa3EF82079E7\",\n name: \"MegaUSD\",\n version: \"1\",\n decimals: 18,\n assetTransferMethod: \"permit2\",\n supportsEip2612: true,\n }, // MegaETH mainnet MegaUSD (no EIP-3009, supports EIP-2612)\n \"eip155:143\": {\n address: \"0x754704Bc059F8C67012fEd69BC8A327a5aafb603\",\n name: \"USD Coin\",\n version: \"2\",\n decimals: 6,\n }, // Monad mainnet USDC\n \"eip155:988\": {\n address: \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\",\n name: \"USDT0\",\n version: \"1\",\n decimals: 6,\n }, // Stable mainnet USDT0\n \"eip155:2201\": {\n address: \"0x78Cf24370174180738C5B8E352B6D14c83a6c9A9\",\n name: \"USDT0\",\n version: \"1\",\n decimals: 6,\n }, // Stable testnet USDT0\n \"eip155:137\": {\n address: \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n name: \"USD Coin\",\n version: \"2\",\n decimals: 6,\n }, // Polygon mainnet USDC\n \"eip155:42161\": {\n address: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n name: \"USD Coin\",\n version: \"2\",\n decimals: 6,\n }, // Arbitrum One USDC\n \"eip155:421614\": {\n address: \"0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d\",\n name: \"USD Coin\",\n version: \"2\",\n decimals: 6,\n }, // Arbitrum Sepolia USDC\n \"eip155:31612\": {\n address: \"0xdD468A1DDc392dcdbEf6db6e34E89AA338F9F186\",\n name: \"Mezo USD\",\n version: \"1\",\n decimals: 18,\n assetTransferMethod: \"permit2\",\n supportsEip2612: true,\n }, // Mezo mainnet mUSD (no EIP-3009, supports EIP-2612)\n \"eip155:31611\": {\n address: \"0x118917a40FAF1CD7a13dB0Ef56C86De7973Ac503\",\n name: \"Mezo USD\",\n version: \"1\",\n decimals: 18,\n assetTransferMethod: \"permit2\",\n supportsEip2612: true,\n }, // Mezo Testnet mUSD (no EIP-3009, supports EIP-2612)\n \"eip155:723487\": {\n address: \"0x33ad9e4BD16B69B5BFdED37D8B5D9fF9aba014Fb\",\n name: \"Stable Coin\",\n version: \"1\",\n decimals: 6,\n assetTransferMethod: \"permit2\",\n supportsEip2612: true,\n }, // Radius Network SBC (no EIP-3009, supports EIP-2612)\n \"eip155:72344\": {\n address: \"0x33ad9e4BD16B69B5BFdED37D8B5D9fF9aba014Fb\",\n name: \"Stable Coin\",\n version: \"1\",\n decimals: 6,\n assetTransferMethod: \"permit2\",\n supportsEip2612: true,\n }, // Radius Testnet SBC (no EIP-3009, supports EIP-2612)\n \"eip155:36900\": {\n address: \"0x9cb8142aEBBcdc60AF7c97Af897A67A8f3CA71C2\",\n name: \"USDC.e\",\n version: \"2\",\n decimals: 6,\n }, // ADI Chain USDC.e (EIP-3009 supported)\n \"eip155:190415\": {\n address: \"0x401eCb1D350407f13ba348573E5630B83638E30D\",\n name: \"Bridged USDC\",\n version: \"2\",\n decimals: 6,\n }, // HPP mainnet USDC.e\n \"eip155:181228\": {\n address: \"0x401eCb1D350407f13ba348573E5630B83638E30D\",\n name: \"Bridged USDC\",\n version: \"2\",\n decimals: 6,\n }, // HPP Sepolia USDC.e\n \"eip155:50\": {\n address: \"0xfA2958CB79b0491CC627c1557F441eF849Ca8eb1\",\n name: \"USDC\",\n version: \"2\",\n decimals: 6,\n }, // XDC Network mainnet USDC (Bridged USDC Standard, EIP-3009 supported)\n \"eip155:51\": {\n address: \"0xb5AB69F7bBada22B28e79C8FFAECe55eF1c771D4\",\n name: \"USDC\",\n version: \"2\",\n decimals: 6,\n }, // XDC Apothem testnet USDC (Bridged USDC Standard, EIP-3009 supported)\n};\n\n/**\n * Look up the default stablecoin for a network.\n *\n * @param network - CAIP-2 network identifier (e.g. \"eip155:8453\")\n * @returns The default asset info\n * @throws If no default asset is configured for the network\n */\nexport function getDefaultAsset(network: Network): ExactDefaultAssetInfo {\n const info = DEFAULT_STABLECOINS[network];\n if (!info) {\n throw new Error(`No default asset configured for network ${network}`);\n }\n return info;\n}\n","import { x402ResourceServer } from \"@bankofai/x402-core/server\";\nimport { Network } from \"@bankofai/x402-core/types\";\nimport { ExactEvmScheme } from \"./scheme\";\n\n/**\n * Configuration options for registering EVM schemes to an x402ResourceServer\n */\nexport interface EvmResourceServerConfig {\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (eip155:*)\n */\n networks?: Network[];\n}\n\n/**\n * Registers EVM exact payment schemes to an x402ResourceServer instance.\n *\n * This function registers:\n * - V2: eip155:* wildcard scheme with ExactEvmScheme (or specific networks if provided)\n *\n * @param server - The x402ResourceServer instance to register schemes to\n * @param config - Configuration for EVM resource server registration\n * @returns The server instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactEvmScheme } from \"@bankofai/x402-evm/exact/server/register\";\n * import { x402ResourceServer } from \"@bankofai/x402-core/server\";\n *\n * const server = new x402ResourceServer(facilitatorClient);\n * registerExactEvmScheme(server, {});\n * ```\n */\nexport function registerExactEvmScheme(\n server: x402ResourceServer,\n config: EvmResourceServerConfig = {},\n): x402ResourceServer {\n // Register V2 scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach(network => {\n server.register(network, new ExactEvmScheme());\n });\n } else {\n // Register wildcard for all EVM chains\n server.register(\"eip155:*\", new ExactEvmScheme());\n }\n\n return server;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { SchemeNetworkClient, PaymentRequirements, PaymentPayload, Network } from '@bankofai/x402-core/types';
|
|
2
|
+
import { C as ClientEvmSigner } from '../../../signer-BFelv8DL.js';
|
|
3
|
+
import 'viem';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* EVM client implementation for the Exact payment scheme (V1).
|
|
7
|
+
*/
|
|
8
|
+
declare class ExactEvmSchemeV1 implements SchemeNetworkClient {
|
|
9
|
+
private readonly signer;
|
|
10
|
+
readonly scheme = "exact";
|
|
11
|
+
/**
|
|
12
|
+
* Creates a new ExactEvmClientV1 instance.
|
|
13
|
+
*
|
|
14
|
+
* @param signer - The EVM signer for client operations
|
|
15
|
+
*/
|
|
16
|
+
constructor(signer: ClientEvmSigner);
|
|
17
|
+
/**
|
|
18
|
+
* Creates a payment payload for the Exact scheme (V1).
|
|
19
|
+
*
|
|
20
|
+
* @param x402Version - The x402 protocol version
|
|
21
|
+
* @param paymentRequirements - The payment requirements
|
|
22
|
+
* @returns Promise resolving to a payment payload
|
|
23
|
+
*/
|
|
24
|
+
createPaymentPayload(x402Version: number, paymentRequirements: PaymentRequirements): Promise<Pick<PaymentPayload, "x402Version" | "payload"> & {
|
|
25
|
+
scheme: string;
|
|
26
|
+
network: Network;
|
|
27
|
+
}>;
|
|
28
|
+
/**
|
|
29
|
+
* Sign the EIP-3009 authorization using EIP-712
|
|
30
|
+
*
|
|
31
|
+
* @param authorization - The authorization to sign
|
|
32
|
+
* @param requirements - The payment requirements
|
|
33
|
+
* @returns Promise resolving to the signature
|
|
34
|
+
*/
|
|
35
|
+
private signAuthorization;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export { ExactEvmSchemeV1 };
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/exact/v1/client/index.ts
|
|
21
|
+
var client_exports = {};
|
|
22
|
+
__export(client_exports, {
|
|
23
|
+
ExactEvmSchemeV1: () => ExactEvmSchemeV1
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(client_exports);
|
|
26
|
+
|
|
27
|
+
// src/exact/v1/client/scheme.ts
|
|
28
|
+
var import_viem9 = require("viem");
|
|
29
|
+
|
|
30
|
+
// src/constants.ts
|
|
31
|
+
var authorizationTypes = {
|
|
32
|
+
TransferWithAuthorization: [
|
|
33
|
+
{ name: "from", type: "address" },
|
|
34
|
+
{ name: "to", type: "address" },
|
|
35
|
+
{ name: "value", type: "uint256" },
|
|
36
|
+
{ name: "validAfter", type: "uint256" },
|
|
37
|
+
{ name: "validBefore", type: "uint256" },
|
|
38
|
+
{ name: "nonce", type: "bytes32" }
|
|
39
|
+
]
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// src/utils.ts
|
|
43
|
+
var import_viem = require("viem");
|
|
44
|
+
function getCrypto() {
|
|
45
|
+
const cryptoObj = globalThis.crypto;
|
|
46
|
+
if (!cryptoObj) {
|
|
47
|
+
throw new Error("Crypto API not available");
|
|
48
|
+
}
|
|
49
|
+
return cryptoObj;
|
|
50
|
+
}
|
|
51
|
+
function createNonce() {
|
|
52
|
+
return (0, import_viem.toHex)(getCrypto().getRandomValues(new Uint8Array(32)));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// src/shared/extensions/gasSponsoring.ts
|
|
56
|
+
var import_viem5 = require("viem");
|
|
57
|
+
|
|
58
|
+
// src/exact/client/eip2612.ts
|
|
59
|
+
var import_viem2 = require("viem");
|
|
60
|
+
|
|
61
|
+
// src/exact/client/erc20approval.ts
|
|
62
|
+
var import_viem3 = require("viem");
|
|
63
|
+
|
|
64
|
+
// src/shared/rpc.ts
|
|
65
|
+
var import_viem4 = require("viem");
|
|
66
|
+
|
|
67
|
+
// src/exact/v1/facilitator/scheme.ts
|
|
68
|
+
var import_viem8 = require("viem");
|
|
69
|
+
|
|
70
|
+
// src/exact/facilitator/eip3009-utils.ts
|
|
71
|
+
var import_viem7 = require("viem");
|
|
72
|
+
|
|
73
|
+
// src/multicall.ts
|
|
74
|
+
var import_viem6 = require("viem");
|
|
75
|
+
|
|
76
|
+
// src/v1/index.ts
|
|
77
|
+
var EVM_NETWORK_CHAIN_ID_MAP = {
|
|
78
|
+
ethereum: 1,
|
|
79
|
+
sepolia: 11155111,
|
|
80
|
+
abstract: 2741,
|
|
81
|
+
"abstract-testnet": 11124,
|
|
82
|
+
"base-sepolia": 84532,
|
|
83
|
+
base: 8453,
|
|
84
|
+
"avalanche-fuji": 43113,
|
|
85
|
+
avalanche: 43114,
|
|
86
|
+
iotex: 4689,
|
|
87
|
+
sei: 1329,
|
|
88
|
+
"sei-testnet": 1328,
|
|
89
|
+
polygon: 137,
|
|
90
|
+
"polygon-amoy": 80002,
|
|
91
|
+
peaq: 3338,
|
|
92
|
+
story: 1514,
|
|
93
|
+
educhain: 41923,
|
|
94
|
+
"skale-base-sepolia": 324705682,
|
|
95
|
+
megaeth: 4326,
|
|
96
|
+
monad: 143,
|
|
97
|
+
stable: 988,
|
|
98
|
+
"stable-testnet": 2201
|
|
99
|
+
};
|
|
100
|
+
var NETWORKS = Object.keys(EVM_NETWORK_CHAIN_ID_MAP);
|
|
101
|
+
function getEvmChainIdV1(network) {
|
|
102
|
+
const chainId = EVM_NETWORK_CHAIN_ID_MAP[network];
|
|
103
|
+
if (!chainId) {
|
|
104
|
+
throw new Error(`Unsupported v1 network: ${network}`);
|
|
105
|
+
}
|
|
106
|
+
return chainId;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// src/exact/v1/client/scheme.ts
|
|
110
|
+
var ExactEvmSchemeV1 = class {
|
|
111
|
+
/**
|
|
112
|
+
* Creates a new ExactEvmClientV1 instance.
|
|
113
|
+
*
|
|
114
|
+
* @param signer - The EVM signer for client operations
|
|
115
|
+
*/
|
|
116
|
+
constructor(signer) {
|
|
117
|
+
this.signer = signer;
|
|
118
|
+
this.scheme = "exact";
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Creates a payment payload for the Exact scheme (V1).
|
|
122
|
+
*
|
|
123
|
+
* @param x402Version - The x402 protocol version
|
|
124
|
+
* @param paymentRequirements - The payment requirements
|
|
125
|
+
* @returns Promise resolving to a payment payload
|
|
126
|
+
*/
|
|
127
|
+
async createPaymentPayload(x402Version, paymentRequirements) {
|
|
128
|
+
const selectedV1 = paymentRequirements;
|
|
129
|
+
const nonce = createNonce();
|
|
130
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
131
|
+
const authorization = {
|
|
132
|
+
from: this.signer.address,
|
|
133
|
+
to: (0, import_viem9.getAddress)(selectedV1.payTo),
|
|
134
|
+
value: selectedV1.maxAmountRequired,
|
|
135
|
+
validAfter: (now - 600).toString(),
|
|
136
|
+
// 10 minutes before
|
|
137
|
+
validBefore: (now + selectedV1.maxTimeoutSeconds).toString(),
|
|
138
|
+
nonce
|
|
139
|
+
};
|
|
140
|
+
const signature = await this.signAuthorization(authorization, selectedV1);
|
|
141
|
+
const payload = {
|
|
142
|
+
authorization,
|
|
143
|
+
signature
|
|
144
|
+
};
|
|
145
|
+
return {
|
|
146
|
+
x402Version,
|
|
147
|
+
scheme: selectedV1.scheme,
|
|
148
|
+
network: selectedV1.network,
|
|
149
|
+
payload
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Sign the EIP-3009 authorization using EIP-712
|
|
154
|
+
*
|
|
155
|
+
* @param authorization - The authorization to sign
|
|
156
|
+
* @param requirements - The payment requirements
|
|
157
|
+
* @returns Promise resolving to the signature
|
|
158
|
+
*/
|
|
159
|
+
async signAuthorization(authorization, requirements) {
|
|
160
|
+
const chainId = getEvmChainIdV1(requirements.network);
|
|
161
|
+
if (!requirements.extra?.name || !requirements.extra?.version) {
|
|
162
|
+
throw new Error(
|
|
163
|
+
`EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
const { name, version } = requirements.extra;
|
|
167
|
+
const domain = {
|
|
168
|
+
name,
|
|
169
|
+
version,
|
|
170
|
+
chainId,
|
|
171
|
+
verifyingContract: (0, import_viem9.getAddress)(requirements.asset)
|
|
172
|
+
};
|
|
173
|
+
const message = {
|
|
174
|
+
from: (0, import_viem9.getAddress)(authorization.from),
|
|
175
|
+
to: (0, import_viem9.getAddress)(authorization.to),
|
|
176
|
+
value: BigInt(authorization.value),
|
|
177
|
+
validAfter: BigInt(authorization.validAfter),
|
|
178
|
+
validBefore: BigInt(authorization.validBefore),
|
|
179
|
+
nonce: authorization.nonce
|
|
180
|
+
};
|
|
181
|
+
return await this.signer.signTypedData({
|
|
182
|
+
domain,
|
|
183
|
+
types: authorizationTypes,
|
|
184
|
+
primaryType: "TransferWithAuthorization",
|
|
185
|
+
message
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
190
|
+
0 && (module.exports = {
|
|
191
|
+
ExactEvmSchemeV1
|
|
192
|
+
});
|
|
193
|
+
//# sourceMappingURL=index.js.map
|