@bankofai/x402-evm 2.6.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.
Files changed (65) hide show
  1. package/README.md +184 -0
  2. package/dist/cjs/exact/client/index.d.ts +53 -0
  3. package/dist/cjs/exact/client/index.js +661 -0
  4. package/dist/cjs/exact/client/index.js.map +1 -0
  5. package/dist/cjs/exact/facilitator/index.d.ts +121 -0
  6. package/dist/cjs/exact/facilitator/index.js +1458 -0
  7. package/dist/cjs/exact/facilitator/index.js.map +1 -0
  8. package/dist/cjs/exact/server/index.d.ts +125 -0
  9. package/dist/cjs/exact/server/index.js +229 -0
  10. package/dist/cjs/exact/server/index.js.map +1 -0
  11. package/dist/cjs/exact/v1/client/index.d.ts +37 -0
  12. package/dist/cjs/exact/v1/client/index.js +175 -0
  13. package/dist/cjs/exact/v1/client/index.js.map +1 -0
  14. package/dist/cjs/exact/v1/facilitator/index.d.ts +62 -0
  15. package/dist/cjs/exact/v1/facilitator/index.js +436 -0
  16. package/dist/cjs/exact/v1/facilitator/index.js.map +1 -0
  17. package/dist/cjs/exact_permit/client/index.d.ts +57 -0
  18. package/dist/cjs/exact_permit/client/index.js +223 -0
  19. package/dist/cjs/exact_permit/client/index.js.map +1 -0
  20. package/dist/cjs/exact_permit/facilitator/index.d.ts +82 -0
  21. package/dist/cjs/exact_permit/facilitator/index.js +437 -0
  22. package/dist/cjs/exact_permit/facilitator/index.js.map +1 -0
  23. package/dist/cjs/exact_permit/server/index.d.ts +71 -0
  24. package/dist/cjs/exact_permit/server/index.js +186 -0
  25. package/dist/cjs/exact_permit/server/index.js.map +1 -0
  26. package/dist/cjs/index.d.ts +76 -0
  27. package/dist/cjs/index.js +779 -0
  28. package/dist/cjs/index.js.map +1 -0
  29. package/dist/cjs/permit2-CpuKY2-F.d.ts +509 -0
  30. package/dist/cjs/permit2-D65OQ5yU.d.ts +517 -0
  31. package/dist/cjs/permit2-DvsTlAyj.d.ts +531 -0
  32. package/dist/cjs/signer-DC81R8wQ.d.ts +161 -0
  33. package/dist/cjs/v1/index.d.ts +39 -0
  34. package/dist/cjs/v1/index.js +181 -0
  35. package/dist/cjs/v1/index.js.map +1 -0
  36. package/dist/esm/chunk-4JGB4GDD.mjs +425 -0
  37. package/dist/esm/chunk-4JGB4GDD.mjs.map +1 -0
  38. package/dist/esm/chunk-TKN5V2BV.mjs +13 -0
  39. package/dist/esm/chunk-TKN5V2BV.mjs.map +1 -0
  40. package/dist/esm/chunk-UDKSVWSE.mjs +716 -0
  41. package/dist/esm/chunk-UDKSVWSE.mjs.map +1 -0
  42. package/dist/esm/exact/client/index.d.mts +53 -0
  43. package/dist/esm/exact/client/index.mjs +17 -0
  44. package/dist/esm/exact/client/index.mjs.map +1 -0
  45. package/dist/esm/exact/facilitator/index.d.mts +121 -0
  46. package/dist/esm/exact/facilitator/index.mjs +876 -0
  47. package/dist/esm/exact/facilitator/index.mjs.map +1 -0
  48. package/dist/esm/exact/server/index.d.mts +125 -0
  49. package/dist/esm/exact/server/index.mjs +201 -0
  50. package/dist/esm/exact/server/index.mjs.map +1 -0
  51. package/dist/esm/exact/v1/client/index.d.mts +37 -0
  52. package/dist/esm/exact/v1/client/index.mjs +7 -0
  53. package/dist/esm/exact/v1/client/index.mjs.map +1 -0
  54. package/dist/esm/exact/v1/facilitator/index.d.mts +62 -0
  55. package/dist/esm/exact/v1/facilitator/index.mjs +7 -0
  56. package/dist/esm/exact/v1/facilitator/index.mjs.map +1 -0
  57. package/dist/esm/index.d.mts +76 -0
  58. package/dist/esm/index.mjs +71 -0
  59. package/dist/esm/index.mjs.map +1 -0
  60. package/dist/esm/permit2-D7ni3g6s.d.mts +509 -0
  61. package/dist/esm/signer-DC81R8wQ.d.mts +161 -0
  62. package/dist/esm/v1/index.d.mts +39 -0
  63. package/dist/esm/v1/index.mjs +13 -0
  64. package/dist/esm/v1/index.mjs.map +1 -0
  65. package/package.json +128 -0
@@ -0,0 +1,186 @@
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_permit/server/index.ts
21
+ var server_exports = {};
22
+ __export(server_exports, {
23
+ ExactPermitEvmScheme: () => ExactPermitEvmScheme,
24
+ registerExactPermitEvmScheme: () => registerExactPermitEvmScheme
25
+ });
26
+ module.exports = __toCommonJS(server_exports);
27
+
28
+ // src/constants.ts
29
+ var PAYMENT_PERMIT_ADDRESSES = {
30
+ "eip155:56": "0x402085c248EeA27D92E8b30b2C58ed07f9E30001",
31
+ // BSC Mainnet
32
+ "eip155:97": "0x402085c248EeA27D92E8b30b2C58ed07f9E30002",
33
+ // BSC Testnet
34
+ "eip155:8453": "0x402085c248EeA27D92E8b30b2C58ed07f9E30003",
35
+ // Base
36
+ "eip155:84532": "0x402085c248EeA27D92E8b30b2C58ed07f9E30004"
37
+ // Base Sepolia
38
+ };
39
+
40
+ // src/exact_permit/server/scheme.ts
41
+ var ExactPermitEvmScheme = class {
42
+ constructor() {
43
+ this.scheme = "exact_permit";
44
+ this.moneyParsers = [];
45
+ }
46
+ /**
47
+ * Register a custom money parser in the parser chain.
48
+ *
49
+ * @param parser - Custom function to convert amount to AssetAmount (or null to skip)
50
+ * @returns The server instance for chaining
51
+ */
52
+ registerMoneyParser(parser) {
53
+ this.moneyParsers.push(parser);
54
+ return this;
55
+ }
56
+ /**
57
+ * Parses a price into an asset amount for EVM.
58
+ *
59
+ * @param price - The price to parse
60
+ * @param network - The EVM network to use
61
+ * @returns Promise resolving to the parsed asset amount
62
+ */
63
+ async parsePrice(price, network) {
64
+ if (typeof price === "object" && price !== null && "amount" in price) {
65
+ if (!price.asset) {
66
+ throw new Error(`Asset address must be specified for AssetAmount on network ${network}`);
67
+ }
68
+ return {
69
+ amount: price.amount,
70
+ asset: price.asset,
71
+ extra: price.extra || {}
72
+ };
73
+ }
74
+ const amount = this.parseMoneyToDecimal(price);
75
+ for (const parser of this.moneyParsers) {
76
+ const result = await parser(amount, network);
77
+ if (result !== null) {
78
+ return result;
79
+ }
80
+ }
81
+ return this.defaultMoneyConversion(amount, network);
82
+ }
83
+ /**
84
+ * Enhance payment requirements for EVM exact_permit scheme.
85
+ * Adds PaymentPermit contract address context.
86
+ *
87
+ * @param paymentRequirements - The base payment requirements
88
+ * @param supportedKind - The supported kind from facilitator
89
+ * @param supportedKind.x402Version - The x402 version
90
+ * @param supportedKind.scheme - The payment scheme
91
+ * @param supportedKind.network - The network identifier
92
+ * @param supportedKind.extra - Optional extra metadata
93
+ * @param extensionKeys - Extension keys supported by the facilitator
94
+ * @returns Enhanced payment requirements with permit context
95
+ */
96
+ enhancePaymentRequirements(paymentRequirements, supportedKind, extensionKeys) {
97
+ void extensionKeys;
98
+ const permitAddress = PAYMENT_PERMIT_ADDRESSES[paymentRequirements.network];
99
+ const enhanced = {
100
+ ...paymentRequirements,
101
+ extra: {
102
+ ...paymentRequirements.extra,
103
+ paymentPermitAddress: permitAddress,
104
+ ...supportedKind.extra || {}
105
+ }
106
+ };
107
+ return Promise.resolve(enhanced);
108
+ }
109
+ parseMoneyToDecimal(money) {
110
+ if (typeof money === "number") {
111
+ return money;
112
+ }
113
+ const cleanMoney = money.replace(/^\$/, "").trim();
114
+ const amount = parseFloat(cleanMoney);
115
+ if (isNaN(amount)) {
116
+ throw new Error(`Invalid money format: ${money}`);
117
+ }
118
+ return amount;
119
+ }
120
+ defaultMoneyConversion(amount, network) {
121
+ const assetInfo = this.getDefaultAsset(network);
122
+ const tokenAmount = this.convertToTokenAmount(amount.toString(), assetInfo.decimals);
123
+ return {
124
+ amount: tokenAmount,
125
+ asset: assetInfo.address,
126
+ extra: {}
127
+ };
128
+ }
129
+ convertToTokenAmount(decimalAmount, decimals) {
130
+ const amount = parseFloat(decimalAmount);
131
+ if (isNaN(amount)) {
132
+ throw new Error(`Invalid amount: ${decimalAmount}`);
133
+ }
134
+ const [intPart, decPart = ""] = String(amount).split(".");
135
+ const paddedDec = decPart.padEnd(decimals, "0").slice(0, decimals);
136
+ const tokenAmount = (intPart + paddedDec).replace(/^0+/, "") || "0";
137
+ return tokenAmount;
138
+ }
139
+ getDefaultAsset(network) {
140
+ const stablecoins = {
141
+ "eip155:56": {
142
+ address: "0x55d398326f99059fF775485246999027B3197955",
143
+ // USDT on BSC Mainnet
144
+ decimals: 18
145
+ },
146
+ "eip155:97": {
147
+ address: "0x337610d27c682E347C9cD60BD4b3b107C9d34dDd",
148
+ // USDT on BSC Testnet
149
+ decimals: 18
150
+ },
151
+ "eip155:8453": {
152
+ address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
153
+ // USDC on Base
154
+ decimals: 6
155
+ },
156
+ "eip155:84532": {
157
+ address: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
158
+ // USDC on Base Sepolia
159
+ decimals: 6
160
+ }
161
+ };
162
+ const assetInfo = stablecoins[network];
163
+ if (!assetInfo) {
164
+ throw new Error(`No default asset configured for EVM network ${network}`);
165
+ }
166
+ return assetInfo;
167
+ }
168
+ };
169
+
170
+ // src/exact_permit/server/register.ts
171
+ function registerExactPermitEvmScheme(server, config = {}) {
172
+ if (config.networks && config.networks.length > 0) {
173
+ config.networks.forEach((network) => {
174
+ server.register(network, new ExactPermitEvmScheme());
175
+ });
176
+ } else {
177
+ server.register("eip155:*", new ExactPermitEvmScheme());
178
+ }
179
+ return server;
180
+ }
181
+ // Annotate the CommonJS export names for ESM import in node:
182
+ 0 && (module.exports = {
183
+ ExactPermitEvmScheme,
184
+ registerExactPermitEvmScheme
185
+ });
186
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/exact_permit/server/index.ts","../../../../src/constants.ts","../../../../src/exact_permit/server/scheme.ts","../../../../src/exact_permit/server/register.ts"],"sourcesContent":["export { ExactPermitEvmScheme } from \"./scheme\";\nexport { registerExactPermitEvmScheme } from \"./register\";\nexport type { EvmPermitResourceServerConfig } from \"./register\";\n","// EIP-3009 TransferWithAuthorization types for EIP-712 signing\nexport const authorizationTypes = {\n TransferWithAuthorization: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" },\n ],\n} as const;\n\n/**\n * Permit2 EIP-712 types for signing PermitWitnessTransferFrom.\n * Must match the exact format expected by the Permit2 contract.\n * Note: Types must be in ALPHABETICAL order after the primary type (TokenPermissions < Witness).\n */\nexport const permit2WitnessTypes = {\n PermitWitnessTransferFrom: [\n { name: \"permitted\", type: \"TokenPermissions\" },\n { name: \"spender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"witness\", type: \"Witness\" },\n ],\n TokenPermissions: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n Witness: [\n { name: \"to\", type: \"address\" },\n { name: \"validAfter\", type: \"uint256\" },\n ],\n} as const;\n\n// EIP3009 ABI for transferWithAuthorization function\nexport const eip3009ABI = [\n {\n inputs: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" },\n { name: \"v\", type: \"uint8\" },\n { name: \"r\", type: \"bytes32\" },\n { name: \"s\", type: \"bytes32\" },\n ],\n name: \"transferWithAuthorization\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n name: \"transferWithAuthorization\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"account\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n inputs: [],\n name: \"version\",\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n/**\n * EIP-2612 Permit EIP-712 types for signing token.permit().\n */\nexport const eip2612PermitTypes = {\n Permit: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n} as const;\n\n/**\n * EIP-2612 nonces ABI for querying current nonce.\n */\nexport const eip2612NoncesAbi = [\n {\n type: \"function\",\n name: \"nonces\",\n inputs: [{ name: \"owner\", type: \"address\" }],\n outputs: [{ type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\n/** ERC-20 approve(address,uint256) ABI for encoding/decoding approval calldata. */\nexport const erc20ApproveAbi = [\n {\n type: \"function\",\n name: \"approve\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n outputs: [{ type: \"bool\" }],\n stateMutability: \"nonpayable\",\n },\n] as const;\n\n/** ERC-20 allowance(address,address) ABI for checking spender approval. */\nexport const erc20AllowanceAbi = [\n {\n type: \"function\",\n name: \"allowance\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\n/** Gas limit for a standard ERC-20 approve() transaction. */\nexport const ERC20_APPROVE_GAS_LIMIT = 70_000n;\n\n/** Fallback max fee per gas (1 gwei) when fee estimation fails. */\nexport const DEFAULT_MAX_FEE_PER_GAS = 1_000_000_000n;\n\n/** Fallback max priority fee per gas (0.1 gwei) when fee estimation fails. */\nexport const DEFAULT_MAX_PRIORITY_FEE_PER_GAS = 100_000_000n;\n\n/**\n * Canonical Permit2 contract address.\n * Same address on all EVM chains via CREATE2 deployment.\n *\n * @see https://github.com/Uniswap/permit2\n */\nexport const PERMIT2_ADDRESS = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\" as const;\n\n/**\n * x402ExactPermit2Proxy contract address.\n * Vanity address: 0x4020...0001 for easy recognition.\n * This address is deterministic based on:\n * - Arachnid's deterministic deployer (0x4e59b44847b379578588920cA78FbF26c0B4956C)\n * - Vanity-mined salt for prefix 0x4020 and suffix 0001\n * - Contract bytecode + constructor args (PERMIT2_ADDRESS)\n */\nexport const x402ExactPermit2ProxyAddress = \"0x402085c248EeA27D92E8b30b2C58ed07f9E20001\" as const;\n\n/**\n * x402UptoPermit2Proxy contract address.\n * Vanity address: 0x4020...0002 for easy recognition.\n * This address is deterministic based on:\n * - Arachnid's deterministic deployer (0x4e59b44847b379578588920cA78FbF26c0B4956C)\n * - Vanity-mined salt for prefix 0x4020 and suffix 0002\n * - Contract bytecode + constructor args (PERMIT2_ADDRESS)\n */\nexport const x402UptoPermit2ProxyAddress = \"0x402039b3d6E6BEC5A02c2C9fd937ac17A6940002\" as const;\n\n/**\n * Shared ABI components for the Permit2 witness tuple.\n * Used in both x402ExactPermit2ProxyABI and x402UptoPermit2ProxyABI to keep them in sync.\n * The upto contract's witness struct is identical to exact (both remove 'extra' post-audit).\n */\nconst permit2WitnessABIComponents = [\n { name: \"to\", type: \"address\", internalType: \"address\" },\n { name: \"validAfter\", type: \"uint256\", internalType: \"uint256\" },\n] as const;\n\n/**\n * x402UptoPermit2Proxy ABI - settle function for upto payment scheme (variable amounts).\n * Updated post-audit: 'extra' removed from witness struct, 'initialize()' removed (now\n * a constructor arg), and error names aligned with x402ExactPermit2Proxy.\n */\nexport const x402UptoPermit2ProxyABI = [\n {\n type: \"function\",\n name: \"PERMIT2\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\", internalType: \"contract ISignatureTransfer\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"WITNESS_TYPEHASH\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bytes32\", internalType: \"bytes32\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"WITNESS_TYPE_STRING\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\", internalType: \"string\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"settle\",\n inputs: [\n {\n name: \"permit\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.PermitTransferFrom\",\n components: [\n {\n name: \"permitted\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.TokenPermissions\",\n components: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"nonce\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"owner\", type: \"address\", internalType: \"address\" },\n {\n name: \"witness\",\n type: \"tuple\",\n internalType: \"struct x402UptoPermit2Proxy.Witness\",\n components: permit2WitnessABIComponents,\n },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"settleWithPermit\",\n inputs: [\n {\n name: \"permit2612\",\n type: \"tuple\",\n internalType: \"struct x402UptoPermit2Proxy.EIP2612Permit\",\n components: [\n { name: \"value\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"r\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"s\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"v\", type: \"uint8\", internalType: \"uint8\" },\n ],\n },\n {\n name: \"permit\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.PermitTransferFrom\",\n components: [\n {\n name: \"permitted\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.TokenPermissions\",\n components: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"nonce\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"owner\", type: \"address\", internalType: \"address\" },\n {\n name: \"witness\",\n type: \"tuple\",\n internalType: \"struct x402UptoPermit2Proxy.Witness\",\n components: permit2WitnessABIComponents,\n },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n { type: \"event\", name: \"Settled\", inputs: [], anonymous: false },\n { type: \"event\", name: \"SettledWithPermit\", inputs: [], anonymous: false },\n { type: \"error\", name: \"InvalidAmount\", inputs: [] },\n { type: \"error\", name: \"InvalidDestination\", inputs: [] },\n { type: \"error\", name: \"InvalidOwner\", inputs: [] },\n { type: \"error\", name: \"InvalidPermit2Address\", inputs: [] },\n { type: \"error\", name: \"PaymentTooEarly\", inputs: [] },\n { type: \"error\", name: \"Permit2612AmountMismatch\", inputs: [] },\n { type: \"error\", name: \"ReentrancyGuardReentrantCall\", inputs: [] },\n] as const;\n\n/**\n * x402ExactPermit2Proxy ABI - settle function for exact payment scheme.\n */\nexport const x402ExactPermit2ProxyABI = [\n {\n type: \"function\",\n name: \"PERMIT2\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\", internalType: \"contract ISignatureTransfer\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"WITNESS_TYPEHASH\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bytes32\", internalType: \"bytes32\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"WITNESS_TYPE_STRING\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\", internalType: \"string\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"settle\",\n inputs: [\n {\n name: \"permit\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.PermitTransferFrom\",\n components: [\n {\n name: \"permitted\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.TokenPermissions\",\n components: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"nonce\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"owner\", type: \"address\", internalType: \"address\" },\n {\n name: \"witness\",\n type: \"tuple\",\n internalType: \"struct x402ExactPermit2Proxy.Witness\",\n components: permit2WitnessABIComponents,\n },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"settleWithPermit\",\n inputs: [\n {\n name: \"permit2612\",\n type: \"tuple\",\n internalType: \"struct x402ExactPermit2Proxy.EIP2612Permit\",\n components: [\n { name: \"value\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"r\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"s\", type: \"bytes32\", internalType: \"bytes32\" },\n { name: \"v\", type: \"uint8\", internalType: \"uint8\" },\n ],\n },\n {\n name: \"permit\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.PermitTransferFrom\",\n components: [\n {\n name: \"permitted\",\n type: \"tuple\",\n internalType: \"struct ISignatureTransfer.TokenPermissions\",\n components: [\n { name: \"token\", type: \"address\", internalType: \"address\" },\n { name: \"amount\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"nonce\", type: \"uint256\", internalType: \"uint256\" },\n { name: \"deadline\", type: \"uint256\", internalType: \"uint256\" },\n ],\n },\n { name: \"owner\", type: \"address\", internalType: \"address\" },\n {\n name: \"witness\",\n type: \"tuple\",\n internalType: \"struct x402ExactPermit2Proxy.Witness\",\n components: permit2WitnessABIComponents,\n },\n { name: \"signature\", type: \"bytes\", internalType: \"bytes\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n { type: \"event\", name: \"Settled\", inputs: [], anonymous: false },\n { type: \"event\", name: \"SettledWithPermit\", inputs: [], anonymous: false },\n { type: \"error\", name: \"InvalidAmount\", inputs: [] },\n { type: \"error\", name: \"InvalidDestination\", inputs: [] },\n { type: \"error\", name: \"InvalidOwner\", inputs: [] },\n { type: \"error\", name: \"InvalidPermit2Address\", inputs: [] },\n { type: \"error\", name: \"PaymentTooEarly\", inputs: [] },\n { type: \"error\", name: \"Permit2612AmountMismatch\", inputs: [] },\n { type: \"error\", name: \"ReentrancyGuardReentrantCall\", inputs: [] },\n] as const;\n\n// --- PaymentPermit (exact_permit) constants ---\n\n/**\n * EIP-712 type definitions for PaymentPermit on EVM.\n * Used by the exact_permit scheme for structured permit signing.\n */\nexport const paymentPermitTypes = {\n PaymentPermitDetails: [\n { name: \"meta\", type: \"PermitMeta\" },\n { name: \"buyer\", type: \"address\" },\n { name: \"caller\", type: \"address\" },\n { name: \"payment\", type: \"Payment\" },\n { name: \"fee\", type: \"Fee\" },\n ],\n PermitMeta: [\n { name: \"kind\", type: \"uint8\" },\n { name: \"paymentId\", type: \"bytes16\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n ],\n Payment: [\n { name: \"payToken\", type: \"address\" },\n { name: \"payAmount\", type: \"uint256\" },\n { name: \"payTo\", type: \"address\" },\n ],\n Fee: [\n { name: \"feeTo\", type: \"address\" },\n { name: \"feeAmount\", type: \"uint256\" },\n ],\n} as const;\n\n/**\n * ABI for PaymentPermit contract on EVM.\n */\nexport const paymentPermitABI = [\n {\n type: \"function\",\n name: \"permitTransferFrom\",\n inputs: [\n {\n name: \"permit\",\n type: \"tuple\",\n components: [\n {\n name: \"meta\",\n type: \"tuple\",\n components: [\n { name: \"kind\", type: \"uint8\" },\n { name: \"paymentId\", type: \"bytes16\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n ],\n },\n { name: \"buyer\", type: \"address\" },\n { name: \"caller\", type: \"address\" },\n {\n name: \"payment\",\n type: \"tuple\",\n components: [\n { name: \"payToken\", type: \"address\" },\n { name: \"payAmount\", type: \"uint256\" },\n { name: \"payTo\", type: \"address\" },\n ],\n },\n {\n name: \"fee\",\n type: \"tuple\",\n components: [\n { name: \"feeTo\", type: \"address\" },\n { name: \"feeAmount\", type: \"uint256\" },\n ],\n },\n ],\n },\n { name: \"owner\", type: \"address\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"balanceOf\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n\n/**\n * PaymentPermit contract addresses per EVM network.\n */\nexport const PAYMENT_PERMIT_ADDRESSES: Record<string, `0x${string}`> = {\n \"eip155:56\": \"0x402085c248EeA27D92E8b30b2C58ed07f9E30001\", // BSC Mainnet\n \"eip155:97\": \"0x402085c248EeA27D92E8b30b2C58ed07f9E30002\", // BSC Testnet\n \"eip155:8453\": \"0x402085c248EeA27D92E8b30b2C58ed07f9E30003\", // Base\n \"eip155:84532\": \"0x402085c248EeA27D92E8b30b2C58ed07f9E30004\", // Base Sepolia\n};\n\n/**\n * PaymentPermit kind constants.\n */\nexport const PERMIT_KIND = {\n PAYMENT_ONLY: 0,\n} as const;\n\n/**\n * Zero address constant.\n */\nexport const ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\" as `0x${string}`;\n","import {\n AssetAmount,\n Network,\n PaymentRequirements,\n Price,\n SchemeNetworkServer,\n MoneyParser,\n} from \"@bankofai/x402-core/types\";\nimport { PAYMENT_PERMIT_ADDRESSES } from \"../../constants\";\n\n/**\n * EVM server implementation for the exact_permit payment scheme.\n * Handles price parsing and payment requirements with PaymentPermit context.\n * Supports BSC and other EVM networks.\n */\nexport class ExactPermitEvmScheme implements SchemeNetworkServer {\n readonly scheme = \"exact_permit\";\n private moneyParsers: MoneyParser[] = [];\n\n /**\n * Register a custom money parser in the parser chain.\n *\n * @param parser - Custom function to convert amount to AssetAmount (or null to skip)\n * @returns The server instance for chaining\n */\n registerMoneyParser(parser: MoneyParser): ExactPermitEvmScheme {\n this.moneyParsers.push(parser);\n return this;\n }\n\n /**\n * Parses a price into an asset amount for EVM.\n *\n * @param price - The price to parse\n * @param network - The EVM network to use\n * @returns Promise resolving to the parsed asset amount\n */\n async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\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 const amount = this.parseMoneyToDecimal(price);\n\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 return this.defaultMoneyConversion(amount, network);\n }\n\n /**\n * Enhance payment requirements for EVM exact_permit scheme.\n * Adds PaymentPermit contract address context.\n *\n * @param paymentRequirements - The base payment requirements\n * @param supportedKind - The supported kind from facilitator\n * @param supportedKind.x402Version - The x402 version\n * @param supportedKind.scheme - The payment scheme\n * @param supportedKind.network - The network identifier\n * @param supportedKind.extra - Optional extra metadata\n * @param extensionKeys - Extension keys supported by the facilitator\n * @returns Enhanced payment requirements with permit context\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 void extensionKeys;\n\n const permitAddress = PAYMENT_PERMIT_ADDRESSES[paymentRequirements.network];\n const enhanced: PaymentRequirements = {\n ...paymentRequirements,\n extra: {\n ...paymentRequirements.extra,\n paymentPermitAddress: permitAddress,\n ...(supportedKind.extra || {}),\n },\n };\n\n return Promise.resolve(enhanced);\n }\n\n private parseMoneyToDecimal(money: string | number): number {\n if (typeof money === \"number\") {\n return money;\n }\n const cleanMoney = money.replace(/^\\$/, \"\").trim();\n const amount = parseFloat(cleanMoney);\n if (isNaN(amount)) {\n throw new Error(`Invalid money format: ${money}`);\n }\n return amount;\n }\n\n private defaultMoneyConversion(amount: number, network: Network): AssetAmount {\n const assetInfo = this.getDefaultAsset(network);\n const tokenAmount = this.convertToTokenAmount(amount.toString(), assetInfo.decimals);\n\n return {\n amount: tokenAmount,\n asset: assetInfo.address,\n extra: {},\n };\n }\n\n private convertToTokenAmount(decimalAmount: string, decimals: number): string {\n const amount = parseFloat(decimalAmount);\n if (isNaN(amount)) {\n throw new Error(`Invalid amount: ${decimalAmount}`);\n }\n const [intPart, decPart = \"\"] = String(amount).split(\".\");\n const paddedDec = decPart.padEnd(decimals, \"0\").slice(0, decimals);\n const tokenAmount = (intPart + paddedDec).replace(/^0+/, \"\") || \"0\";\n return tokenAmount;\n }\n\n private getDefaultAsset(network: Network): {\n address: `0x${string}`;\n decimals: number;\n } {\n // BSC + Base stablecoin configuration\n const stablecoins: Record<string, { address: `0x${string}`; decimals: number }> = {\n \"eip155:56\": {\n address: \"0x55d398326f99059fF775485246999027B3197955\", // USDT on BSC Mainnet\n decimals: 18,\n },\n \"eip155:97\": {\n address: \"0x337610d27c682E347C9cD60BD4b3b107C9d34dDd\", // USDT on BSC Testnet\n decimals: 18,\n },\n \"eip155:8453\": {\n address: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\", // USDC on Base\n decimals: 6,\n },\n \"eip155:84532\": {\n address: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\", // USDC on Base Sepolia\n decimals: 6,\n },\n };\n\n const assetInfo = stablecoins[network];\n if (!assetInfo) {\n throw new Error(`No default asset configured for EVM network ${network}`);\n }\n\n return assetInfo;\n }\n}\n","import { x402ResourceServer } from \"@bankofai/x402-core/server\";\nimport { Network } from \"@bankofai/x402-core/types\";\nimport { ExactPermitEvmScheme } from \"./scheme\";\n\n/**\n * Configuration options for registering EVM exact_permit schemes to an x402ResourceServer.\n */\nexport interface EvmPermitResourceServerConfig {\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_permit payment schemes to an x402ResourceServer instance.\n *\n * @param server - The x402ResourceServer instance to register schemes to\n * @param config - Configuration for EVM permit resource server registration\n * @returns The server instance for chaining\n */\nexport function registerExactPermitEvmScheme(\n server: x402ResourceServer,\n config: EvmPermitResourceServerConfig = {},\n): x402ResourceServer {\n if (config.networks && config.networks.length > 0) {\n config.networks.forEach(network => {\n server.register(network, new ExactPermitEvmScheme());\n });\n } else {\n server.register(\"eip155:*\", new ExactPermitEvmScheme());\n }\n\n return server;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,76 @@
1
+ export { E as ExactEvmScheme, P as PERMIT2_ADDRESS, a as Permit2AllowanceParams, b as authorizationTypes, c as createPermit2ApprovalTx, e as eip3009ABI, d as erc20AllowanceAbi, g as getPermit2AllowanceReadParams, p as permit2WitnessTypes, x as x402ExactPermit2ProxyABI, f as x402ExactPermit2ProxyAddress, h as x402UptoPermit2ProxyAddress } from './permit2-CpuKY2-F.js';
2
+ export { C as ClientEvmSigner, F as FacilitatorEvmSigner, t as toClientEvmSigner, a as toFacilitatorEvmSigner } from './signer-DC81R8wQ.js';
3
+ import '@bankofai/x402-core/types';
4
+
5
+ /**
6
+ * Asset transfer methods for the exact EVM scheme.
7
+ * - eip3009: Uses transferWithAuthorization (USDC, etc.) - recommended for compatible tokens
8
+ * - permit2: Uses Permit2 + x402Permit2Proxy - universal fallback for any ERC-20
9
+ */
10
+ type AssetTransferMethod = "eip3009" | "permit2";
11
+ /**
12
+ * EIP-3009 payload for tokens with native transferWithAuthorization support.
13
+ */
14
+ type ExactEIP3009Payload = {
15
+ signature?: `0x${string}`;
16
+ authorization: {
17
+ from: `0x${string}`;
18
+ to: `0x${string}`;
19
+ value: string;
20
+ validAfter: string;
21
+ validBefore: string;
22
+ nonce: `0x${string}`;
23
+ };
24
+ };
25
+ /**
26
+ * Permit2 witness data structure.
27
+ * Matches the Witness struct in x402Permit2Proxy contract.
28
+ * Note: Upper time bound is enforced by Permit2's `deadline` field, not a witness field.
29
+ */
30
+ type Permit2Witness = {
31
+ to: `0x${string}`;
32
+ validAfter: string;
33
+ };
34
+ /**
35
+ * Permit2 authorization parameters.
36
+ * Used to reconstruct the signed message for verification.
37
+ */
38
+ type Permit2Authorization = {
39
+ permitted: {
40
+ token: `0x${string}`;
41
+ amount: string;
42
+ };
43
+ spender: `0x${string}`;
44
+ nonce: string;
45
+ deadline: string;
46
+ witness: Permit2Witness;
47
+ };
48
+ /**
49
+ * Permit2 payload for tokens using the Permit2 + x402Permit2Proxy flow.
50
+ */
51
+ type ExactPermit2Payload = {
52
+ signature: `0x${string}`;
53
+ permit2Authorization: Permit2Authorization & {
54
+ from: `0x${string}`;
55
+ };
56
+ };
57
+ type ExactEvmPayloadV1 = ExactEIP3009Payload;
58
+ type ExactEvmPayloadV2 = ExactEIP3009Payload | ExactPermit2Payload;
59
+ /**
60
+ * Type guard to check if a payload is a Permit2 payload.
61
+ * Permit2 payloads have a `permit2Authorization` field.
62
+ *
63
+ * @param payload - The payload to check.
64
+ * @returns True if the payload is a Permit2 payload, false otherwise.
65
+ */
66
+ declare function isPermit2Payload(payload: ExactEvmPayloadV2): payload is ExactPermit2Payload;
67
+ /**
68
+ * Type guard to check if a payload is an EIP-3009 payload.
69
+ * EIP-3009 payloads have an `authorization` field.
70
+ *
71
+ * @param payload - The payload to check.
72
+ * @returns True if the payload is an EIP-3009 payload, false otherwise.
73
+ */
74
+ declare function isEIP3009Payload(payload: ExactEvmPayloadV2): payload is ExactEIP3009Payload;
75
+
76
+ export { type AssetTransferMethod, type ExactEIP3009Payload, type ExactEvmPayloadV1, type ExactEvmPayloadV2, type ExactPermit2Payload, type Permit2Authorization, type Permit2Witness, isEIP3009Payload, isPermit2Payload };