@perkos/middleware-x402 1.0.0 → 1.2.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/dist/index.d.mts +19 -4
- package/dist/index.d.ts +19 -4
- package/dist/index.js +37 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +35 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -68,11 +68,11 @@ interface X402PaymentResult {
|
|
|
68
68
|
/**
|
|
69
69
|
* Supported network names
|
|
70
70
|
*/
|
|
71
|
-
type NetworkName = "base" | "base-sepolia" | "avalanche" | "avalanche-fuji" | "celo" | "celo-sepolia";
|
|
71
|
+
type NetworkName = "base" | "base-sepolia" | "avalanche" | "avalanche-fuji" | "celo" | "celo-sepolia" | "ethereum";
|
|
72
72
|
/**
|
|
73
73
|
* CAIP-2 network identifier
|
|
74
74
|
*/
|
|
75
|
-
type CAIP2Network = "eip155:8453" | "eip155:84532" | "eip155:43114" | "eip155:43113" | "eip155:42220" | "eip155:11142220";
|
|
75
|
+
type CAIP2Network = "eip155:1" | "eip155:8453" | "eip155:84532" | "eip155:43114" | "eip155:43113" | "eip155:42220" | "eip155:11142220";
|
|
76
76
|
/**
|
|
77
77
|
* Token information for EIP-712 domain
|
|
78
78
|
*/
|
|
@@ -137,6 +137,20 @@ declare const DEFAULT_RPC_URLS: Record<NetworkName, string>;
|
|
|
137
137
|
* Valid network names
|
|
138
138
|
*/
|
|
139
139
|
declare const VALID_NETWORKS: NetworkName[];
|
|
140
|
+
/**
|
|
141
|
+
* EIP-712 Domain Versions by Network
|
|
142
|
+
* Different USDC deployments use different domain versions:
|
|
143
|
+
* - FiatTokenV2_2 (newer): version "2" (Ethereum, Base, Avalanche)
|
|
144
|
+
* - FiatTokenV2_1 (older): version "2"
|
|
145
|
+
* - Some chains may use version "1"
|
|
146
|
+
*
|
|
147
|
+
* Note: Celo native USDC uses version "2"
|
|
148
|
+
*/
|
|
149
|
+
declare const DOMAIN_VERSIONS: Record<string, string>;
|
|
150
|
+
/**
|
|
151
|
+
* Get EIP-712 domain version for a network
|
|
152
|
+
*/
|
|
153
|
+
declare function getDomainVersion(network: string): string;
|
|
140
154
|
/**
|
|
141
155
|
* EIP-712 TransferWithAuthorization types
|
|
142
156
|
*/
|
|
@@ -205,8 +219,9 @@ declare function formatUSDCToPrice(amount: bigint): string;
|
|
|
205
219
|
declare function generateNonce(): `0x${string}`;
|
|
206
220
|
/**
|
|
207
221
|
* Create EIP-712 domain for token transferWithAuthorization
|
|
222
|
+
* Uses network-specific version (some chains use "1", others use "2")
|
|
208
223
|
*/
|
|
209
|
-
declare function createEIP712Domain(network: string, tokenAddress?: Address, tokenName?: string): {
|
|
224
|
+
declare function createEIP712Domain(network: string, tokenAddress?: Address, tokenName?: string, version?: string): {
|
|
210
225
|
name: string;
|
|
211
226
|
version: string;
|
|
212
227
|
chainId: number;
|
|
@@ -317,4 +332,4 @@ declare function createX402Middleware(options: NextX402Options): {
|
|
|
317
332
|
options: NextX402Options;
|
|
318
333
|
};
|
|
319
334
|
|
|
320
|
-
export { type CAIP2Network, CAIP2_TO_NETWORK, CHAIN_IDS, DEFAULT_RPC_URLS, type MiddlewareContext, NETWORK_TO_CAIP2, type NetworkName, type NextX402Options, type PaymentConfig, type PaymentEnvelope, type PaymentRequirements, type PaymentRoutes, type PaymentVerificationResult, type SettlementResult, TRANSFER_WITH_AUTHORIZATION_TYPES, type TokenInfo, USDC_ADDRESSES, VALID_NETWORKS, type X402MiddlewareOptions, type X402PaymentResult, create402Response, createEIP712Domain, createX402Middleware, extractPaymentEnvelope, formatPaymentSignature, formatUSDCToPrice, generateNonce, getChainId, getRpcUrl, getUSDCAddress, getValidAfter, getValidBefore, isValidNetwork, parsePaymentSignature, parsePriceToUSDC, settlePayment, toCAIP2Network, toLegacyNetwork, verifyPayment, verifyX402Payment$1 as verifyX402Payment, verifyX402Payment as verifyX402PaymentNext };
|
|
335
|
+
export { type CAIP2Network, CAIP2_TO_NETWORK, CHAIN_IDS, DEFAULT_RPC_URLS, DOMAIN_VERSIONS, type MiddlewareContext, NETWORK_TO_CAIP2, type NetworkName, type NextX402Options, type PaymentConfig, type PaymentEnvelope, type PaymentRequirements, type PaymentRoutes, type PaymentVerificationResult, type SettlementResult, TRANSFER_WITH_AUTHORIZATION_TYPES, type TokenInfo, USDC_ADDRESSES, VALID_NETWORKS, type X402MiddlewareOptions, type X402PaymentResult, create402Response, createEIP712Domain, createX402Middleware, extractPaymentEnvelope, formatPaymentSignature, formatUSDCToPrice, generateNonce, getChainId, getDomainVersion, getRpcUrl, getUSDCAddress, getValidAfter, getValidBefore, isValidNetwork, parsePaymentSignature, parsePriceToUSDC, settlePayment, toCAIP2Network, toLegacyNetwork, verifyPayment, verifyX402Payment$1 as verifyX402Payment, verifyX402Payment as verifyX402PaymentNext };
|
package/dist/index.d.ts
CHANGED
|
@@ -68,11 +68,11 @@ interface X402PaymentResult {
|
|
|
68
68
|
/**
|
|
69
69
|
* Supported network names
|
|
70
70
|
*/
|
|
71
|
-
type NetworkName = "base" | "base-sepolia" | "avalanche" | "avalanche-fuji" | "celo" | "celo-sepolia";
|
|
71
|
+
type NetworkName = "base" | "base-sepolia" | "avalanche" | "avalanche-fuji" | "celo" | "celo-sepolia" | "ethereum";
|
|
72
72
|
/**
|
|
73
73
|
* CAIP-2 network identifier
|
|
74
74
|
*/
|
|
75
|
-
type CAIP2Network = "eip155:8453" | "eip155:84532" | "eip155:43114" | "eip155:43113" | "eip155:42220" | "eip155:11142220";
|
|
75
|
+
type CAIP2Network = "eip155:1" | "eip155:8453" | "eip155:84532" | "eip155:43114" | "eip155:43113" | "eip155:42220" | "eip155:11142220";
|
|
76
76
|
/**
|
|
77
77
|
* Token information for EIP-712 domain
|
|
78
78
|
*/
|
|
@@ -137,6 +137,20 @@ declare const DEFAULT_RPC_URLS: Record<NetworkName, string>;
|
|
|
137
137
|
* Valid network names
|
|
138
138
|
*/
|
|
139
139
|
declare const VALID_NETWORKS: NetworkName[];
|
|
140
|
+
/**
|
|
141
|
+
* EIP-712 Domain Versions by Network
|
|
142
|
+
* Different USDC deployments use different domain versions:
|
|
143
|
+
* - FiatTokenV2_2 (newer): version "2" (Ethereum, Base, Avalanche)
|
|
144
|
+
* - FiatTokenV2_1 (older): version "2"
|
|
145
|
+
* - Some chains may use version "1"
|
|
146
|
+
*
|
|
147
|
+
* Note: Celo native USDC uses version "2"
|
|
148
|
+
*/
|
|
149
|
+
declare const DOMAIN_VERSIONS: Record<string, string>;
|
|
150
|
+
/**
|
|
151
|
+
* Get EIP-712 domain version for a network
|
|
152
|
+
*/
|
|
153
|
+
declare function getDomainVersion(network: string): string;
|
|
140
154
|
/**
|
|
141
155
|
* EIP-712 TransferWithAuthorization types
|
|
142
156
|
*/
|
|
@@ -205,8 +219,9 @@ declare function formatUSDCToPrice(amount: bigint): string;
|
|
|
205
219
|
declare function generateNonce(): `0x${string}`;
|
|
206
220
|
/**
|
|
207
221
|
* Create EIP-712 domain for token transferWithAuthorization
|
|
222
|
+
* Uses network-specific version (some chains use "1", others use "2")
|
|
208
223
|
*/
|
|
209
|
-
declare function createEIP712Domain(network: string, tokenAddress?: Address, tokenName?: string): {
|
|
224
|
+
declare function createEIP712Domain(network: string, tokenAddress?: Address, tokenName?: string, version?: string): {
|
|
210
225
|
name: string;
|
|
211
226
|
version: string;
|
|
212
227
|
chainId: number;
|
|
@@ -317,4 +332,4 @@ declare function createX402Middleware(options: NextX402Options): {
|
|
|
317
332
|
options: NextX402Options;
|
|
318
333
|
};
|
|
319
334
|
|
|
320
|
-
export { type CAIP2Network, CAIP2_TO_NETWORK, CHAIN_IDS, DEFAULT_RPC_URLS, type MiddlewareContext, NETWORK_TO_CAIP2, type NetworkName, type NextX402Options, type PaymentConfig, type PaymentEnvelope, type PaymentRequirements, type PaymentRoutes, type PaymentVerificationResult, type SettlementResult, TRANSFER_WITH_AUTHORIZATION_TYPES, type TokenInfo, USDC_ADDRESSES, VALID_NETWORKS, type X402MiddlewareOptions, type X402PaymentResult, create402Response, createEIP712Domain, createX402Middleware, extractPaymentEnvelope, formatPaymentSignature, formatUSDCToPrice, generateNonce, getChainId, getRpcUrl, getUSDCAddress, getValidAfter, getValidBefore, isValidNetwork, parsePaymentSignature, parsePriceToUSDC, settlePayment, toCAIP2Network, toLegacyNetwork, verifyPayment, verifyX402Payment$1 as verifyX402Payment, verifyX402Payment as verifyX402PaymentNext };
|
|
335
|
+
export { type CAIP2Network, CAIP2_TO_NETWORK, CHAIN_IDS, DEFAULT_RPC_URLS, DOMAIN_VERSIONS, type MiddlewareContext, NETWORK_TO_CAIP2, type NetworkName, type NextX402Options, type PaymentConfig, type PaymentEnvelope, type PaymentRequirements, type PaymentRoutes, type PaymentVerificationResult, type SettlementResult, TRANSFER_WITH_AUTHORIZATION_TYPES, type TokenInfo, USDC_ADDRESSES, VALID_NETWORKS, type X402MiddlewareOptions, type X402PaymentResult, create402Response, createEIP712Domain, createX402Middleware, extractPaymentEnvelope, formatPaymentSignature, formatUSDCToPrice, generateNonce, getChainId, getDomainVersion, getRpcUrl, getUSDCAddress, getValidAfter, getValidBefore, isValidNetwork, parsePaymentSignature, parsePriceToUSDC, settlePayment, toCAIP2Network, toLegacyNetwork, verifyPayment, verifyX402Payment$1 as verifyX402Payment, verifyX402Payment as verifyX402PaymentNext };
|
package/dist/index.js
CHANGED
|
@@ -23,6 +23,7 @@ __export(index_exports, {
|
|
|
23
23
|
CAIP2_TO_NETWORK: () => CAIP2_TO_NETWORK,
|
|
24
24
|
CHAIN_IDS: () => CHAIN_IDS,
|
|
25
25
|
DEFAULT_RPC_URLS: () => DEFAULT_RPC_URLS,
|
|
26
|
+
DOMAIN_VERSIONS: () => DOMAIN_VERSIONS,
|
|
26
27
|
NETWORK_TO_CAIP2: () => NETWORK_TO_CAIP2,
|
|
27
28
|
TRANSFER_WITH_AUTHORIZATION_TYPES: () => TRANSFER_WITH_AUTHORIZATION_TYPES,
|
|
28
29
|
USDC_ADDRESSES: () => USDC_ADDRESSES,
|
|
@@ -35,6 +36,7 @@ __export(index_exports, {
|
|
|
35
36
|
formatUSDCToPrice: () => formatUSDCToPrice,
|
|
36
37
|
generateNonce: () => generateNonce,
|
|
37
38
|
getChainId: () => getChainId,
|
|
39
|
+
getDomainVersion: () => getDomainVersion,
|
|
38
40
|
getRpcUrl: () => getRpcUrl,
|
|
39
41
|
getUSDCAddress: () => getUSDCAddress,
|
|
40
42
|
getValidAfter: () => getValidAfter,
|
|
@@ -53,6 +55,7 @@ module.exports = __toCommonJS(index_exports);
|
|
|
53
55
|
|
|
54
56
|
// src/constants.ts
|
|
55
57
|
var USDC_ADDRESSES = {
|
|
58
|
+
ethereum: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
56
59
|
avalanche: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",
|
|
57
60
|
"avalanche-fuji": "0x5425890298aed601595a70AB815c96711a31Bc65",
|
|
58
61
|
base: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
@@ -61,6 +64,7 @@ var USDC_ADDRESSES = {
|
|
|
61
64
|
"celo-sepolia": "0x2F25deB3848C207fc8E0c34035B3Ba7fC157602B"
|
|
62
65
|
};
|
|
63
66
|
var CHAIN_IDS = {
|
|
67
|
+
ethereum: 1,
|
|
64
68
|
avalanche: 43114,
|
|
65
69
|
"avalanche-fuji": 43113,
|
|
66
70
|
base: 8453,
|
|
@@ -68,6 +72,7 @@ var CHAIN_IDS = {
|
|
|
68
72
|
celo: 42220,
|
|
69
73
|
"celo-sepolia": 11142220,
|
|
70
74
|
// CAIP-2 format support
|
|
75
|
+
"eip155:1": 1,
|
|
71
76
|
"eip155:43114": 43114,
|
|
72
77
|
"eip155:43113": 43113,
|
|
73
78
|
"eip155:8453": 8453,
|
|
@@ -76,6 +81,7 @@ var CHAIN_IDS = {
|
|
|
76
81
|
"eip155:11142220": 11142220
|
|
77
82
|
};
|
|
78
83
|
var NETWORK_TO_CAIP2 = {
|
|
84
|
+
ethereum: "eip155:1",
|
|
79
85
|
avalanche: "eip155:43114",
|
|
80
86
|
"avalanche-fuji": "eip155:43113",
|
|
81
87
|
base: "eip155:8453",
|
|
@@ -84,6 +90,7 @@ var NETWORK_TO_CAIP2 = {
|
|
|
84
90
|
"celo-sepolia": "eip155:11142220"
|
|
85
91
|
};
|
|
86
92
|
var CAIP2_TO_NETWORK = {
|
|
93
|
+
"eip155:1": "ethereum",
|
|
87
94
|
"eip155:43114": "avalanche",
|
|
88
95
|
"eip155:43113": "avalanche-fuji",
|
|
89
96
|
"eip155:8453": "base",
|
|
@@ -92,6 +99,7 @@ var CAIP2_TO_NETWORK = {
|
|
|
92
99
|
"eip155:11142220": "celo-sepolia"
|
|
93
100
|
};
|
|
94
101
|
var DEFAULT_RPC_URLS = {
|
|
102
|
+
ethereum: "https://eth.llamarpc.com",
|
|
95
103
|
avalanche: "https://api.avax.network/ext/bc/C/rpc",
|
|
96
104
|
"avalanche-fuji": "https://api.avax-test.network/ext/bc/C/rpc",
|
|
97
105
|
base: "https://mainnet.base.org",
|
|
@@ -100,6 +108,7 @@ var DEFAULT_RPC_URLS = {
|
|
|
100
108
|
"celo-sepolia": "https://forno.celo-sepolia.celo-testnet.org"
|
|
101
109
|
};
|
|
102
110
|
var VALID_NETWORKS = [
|
|
111
|
+
"ethereum",
|
|
103
112
|
"base",
|
|
104
113
|
"base-sepolia",
|
|
105
114
|
"avalanche",
|
|
@@ -107,6 +116,29 @@ var VALID_NETWORKS = [
|
|
|
107
116
|
"celo",
|
|
108
117
|
"celo-sepolia"
|
|
109
118
|
];
|
|
119
|
+
var DOMAIN_VERSIONS = {
|
|
120
|
+
ethereum: "2",
|
|
121
|
+
avalanche: "2",
|
|
122
|
+
"avalanche-fuji": "2",
|
|
123
|
+
base: "2",
|
|
124
|
+
"base-sepolia": "2",
|
|
125
|
+
celo: "1",
|
|
126
|
+
// Celo native USDC uses version "1"
|
|
127
|
+
"celo-sepolia": "1",
|
|
128
|
+
// CAIP-2 format support
|
|
129
|
+
"eip155:1": "2",
|
|
130
|
+
"eip155:43114": "2",
|
|
131
|
+
"eip155:43113": "2",
|
|
132
|
+
"eip155:8453": "2",
|
|
133
|
+
"eip155:84532": "2",
|
|
134
|
+
"eip155:42220": "1",
|
|
135
|
+
// Celo
|
|
136
|
+
"eip155:11142220": "1"
|
|
137
|
+
// Celo Sepolia
|
|
138
|
+
};
|
|
139
|
+
function getDomainVersion(network) {
|
|
140
|
+
return DOMAIN_VERSIONS[network] || "2";
|
|
141
|
+
}
|
|
110
142
|
var TRANSFER_WITH_AUTHORIZATION_TYPES = {
|
|
111
143
|
TransferWithAuthorization: [
|
|
112
144
|
{ name: "from", type: "address" },
|
|
@@ -163,12 +195,13 @@ function generateNonce() {
|
|
|
163
195
|
crypto.getRandomValues(randomBytes);
|
|
164
196
|
return `0x${Array.from(randomBytes).map((b) => b.toString(16).padStart(2, "0")).join("")}`;
|
|
165
197
|
}
|
|
166
|
-
function createEIP712Domain(network, tokenAddress, tokenName) {
|
|
198
|
+
function createEIP712Domain(network, tokenAddress, tokenName, version) {
|
|
167
199
|
const address = tokenAddress || getUSDCAddress(network);
|
|
168
200
|
const name = tokenName || "USD Coin";
|
|
201
|
+
const domainVersion = version || getDomainVersion(network);
|
|
169
202
|
return {
|
|
170
203
|
name,
|
|
171
|
-
version:
|
|
204
|
+
version: domainVersion,
|
|
172
205
|
chainId: getChainId(network),
|
|
173
206
|
verifyingContract: address
|
|
174
207
|
};
|
|
@@ -487,6 +520,7 @@ function createX402Middleware(options) {
|
|
|
487
520
|
CAIP2_TO_NETWORK,
|
|
488
521
|
CHAIN_IDS,
|
|
489
522
|
DEFAULT_RPC_URLS,
|
|
523
|
+
DOMAIN_VERSIONS,
|
|
490
524
|
NETWORK_TO_CAIP2,
|
|
491
525
|
TRANSFER_WITH_AUTHORIZATION_TYPES,
|
|
492
526
|
USDC_ADDRESSES,
|
|
@@ -499,6 +533,7 @@ function createX402Middleware(options) {
|
|
|
499
533
|
formatUSDCToPrice,
|
|
500
534
|
generateNonce,
|
|
501
535
|
getChainId,
|
|
536
|
+
getDomainVersion,
|
|
502
537
|
getRpcUrl,
|
|
503
538
|
getUSDCAddress,
|
|
504
539
|
getValidAfter,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/utils.ts","../src/middleware.ts","../src/next.ts"],"sourcesContent":["/**\n * @perkos/x402-core\n * x402 v2 payment protocol middleware and utilities for vendor services\n */\n\n// Types\nexport type {\n PaymentEnvelope,\n PaymentRequirements,\n PaymentConfig,\n PaymentVerificationResult,\n X402PaymentResult,\n NetworkName,\n CAIP2Network,\n TokenInfo,\n SettlementResult,\n PaymentRoutes,\n X402MiddlewareOptions,\n} from \"./types\";\n\n// Constants\nexport {\n USDC_ADDRESSES,\n CHAIN_IDS,\n NETWORK_TO_CAIP2,\n CAIP2_TO_NETWORK,\n DEFAULT_RPC_URLS,\n VALID_NETWORKS,\n TRANSFER_WITH_AUTHORIZATION_TYPES,\n} from \"./constants\";\n\n// Utilities\nexport {\n getUSDCAddress,\n getChainId,\n getRpcUrl,\n toCAIP2Network,\n toLegacyNetwork,\n parsePriceToUSDC,\n formatUSDCToPrice,\n generateNonce,\n createEIP712Domain,\n formatPaymentSignature,\n parsePaymentSignature,\n isValidNetwork,\n getValidBefore,\n getValidAfter,\n} from \"./utils\";\n\n// Middleware\nexport {\n extractPaymentEnvelope,\n verifyPayment,\n settlePayment,\n create402Response,\n verifyX402Payment,\n type MiddlewareContext,\n} from \"./middleware\";\n\n// Next.js integration\nexport {\n verifyX402Payment as verifyX402PaymentNext,\n createX402Middleware,\n type NextX402Options,\n} from \"./next\";\n","/**\n * x402 Core Constants\n * Network configurations, addresses, and mappings\n */\n\nimport type { Address } from \"viem\";\nimport type { NetworkName, CAIP2Network } from \"./types\";\n\n/**\n * USDC Contract Addresses by Network\n */\nexport const USDC_ADDRESSES: Record<NetworkName, Address> = {\n avalanche: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n \"avalanche-fuji\": \"0x5425890298aed601595a70AB815c96711a31Bc65\",\n base: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n \"base-sepolia\": \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n celo: \"0xcebA9300f2b948710d2653dD7B07f33A8B32118C\",\n \"celo-sepolia\": \"0x2F25deB3848C207fc8E0c34035B3Ba7fC157602B\",\n};\n\n/**\n * Chain IDs by Network\n */\nexport const CHAIN_IDS: Record<string, number> = {\n avalanche: 43114,\n \"avalanche-fuji\": 43113,\n base: 8453,\n \"base-sepolia\": 84532,\n celo: 42220,\n \"celo-sepolia\": 11142220,\n // CAIP-2 format support\n \"eip155:43114\": 43114,\n \"eip155:43113\": 43113,\n \"eip155:8453\": 8453,\n \"eip155:84532\": 84532,\n \"eip155:42220\": 42220,\n \"eip155:11142220\": 11142220,\n};\n\n/**\n * Network to CAIP-2 mapping\n */\nexport const NETWORK_TO_CAIP2: Record<NetworkName, CAIP2Network> = {\n avalanche: \"eip155:43114\",\n \"avalanche-fuji\": \"eip155:43113\",\n base: \"eip155:8453\",\n \"base-sepolia\": \"eip155:84532\",\n celo: \"eip155:42220\",\n \"celo-sepolia\": \"eip155:11142220\",\n};\n\n/**\n * CAIP-2 to Network mapping\n */\nexport const CAIP2_TO_NETWORK: Record<string, NetworkName> = {\n \"eip155:43114\": \"avalanche\",\n \"eip155:43113\": \"avalanche-fuji\",\n \"eip155:8453\": \"base\",\n \"eip155:84532\": \"base-sepolia\",\n \"eip155:42220\": \"celo\",\n \"eip155:11142220\": \"celo-sepolia\",\n};\n\n/**\n * Default RPC URLs by Network\n */\nexport const DEFAULT_RPC_URLS: Record<NetworkName, string> = {\n avalanche: \"https://api.avax.network/ext/bc/C/rpc\",\n \"avalanche-fuji\": \"https://api.avax-test.network/ext/bc/C/rpc\",\n base: \"https://mainnet.base.org\",\n \"base-sepolia\": \"https://sepolia.base.org\",\n celo: \"https://forno.celo.org\",\n \"celo-sepolia\": \"https://forno.celo-sepolia.celo-testnet.org\",\n};\n\n/**\n * Valid network names\n */\nexport const VALID_NETWORKS: NetworkName[] = [\n \"base\",\n \"base-sepolia\",\n \"avalanche\",\n \"avalanche-fuji\",\n \"celo\",\n \"celo-sepolia\",\n];\n\n/**\n * EIP-712 TransferWithAuthorization types\n */\nexport const TRANSFER_WITH_AUTHORIZATION_TYPES = {\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 * x402 Core Utilities\n * Helper functions for x402 payment processing\n */\n\nimport { parseUnits } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { NetworkName, PaymentEnvelope } from \"./types\";\nimport {\n USDC_ADDRESSES,\n CHAIN_IDS,\n NETWORK_TO_CAIP2,\n CAIP2_TO_NETWORK,\n DEFAULT_RPC_URLS,\n} from \"./constants\";\n\n/**\n * Get USDC address for a network\n */\nexport function getUSDCAddress(network: string): Address {\n const legacyNetwork = toLegacyNetwork(network);\n return USDC_ADDRESSES[legacyNetwork as NetworkName] || USDC_ADDRESSES.avalanche;\n}\n\n/**\n * Get chain ID for a network\n */\nexport function getChainId(network: string): number {\n return CHAIN_IDS[network] || CHAIN_IDS.avalanche;\n}\n\n/**\n * Get RPC URL for a network (with environment variable override support)\n */\nexport function getRpcUrl(network: string, envOverrides?: Record<string, string | undefined>): string {\n const legacyNetwork = toLegacyNetwork(network);\n\n // Check for environment variable overrides\n if (envOverrides) {\n const envKey = `${legacyNetwork.toUpperCase().replace(/-/g, \"_\")}_RPC_URL`;\n if (envOverrides[envKey]) {\n return envOverrides[envKey]!;\n }\n }\n\n return DEFAULT_RPC_URLS[legacyNetwork as NetworkName] || DEFAULT_RPC_URLS.avalanche;\n}\n\n/**\n * Convert network name to CAIP-2 format for x402 V2\n * e.g., \"base-sepolia\" → \"eip155:84532\"\n */\nexport function toCAIP2Network(network: string): string {\n if (network.includes(\":\")) {\n return network;\n }\n return NETWORK_TO_CAIP2[network as NetworkName] || network;\n}\n\n/**\n * Convert CAIP-2 network format to legacy format\n * e.g., \"eip155:43114\" → \"avalanche\"\n */\nexport function toLegacyNetwork(network: string): string {\n if (!network.includes(\":\")) {\n return network;\n }\n return CAIP2_TO_NETWORK[network] || \"avalanche\";\n}\n\n/**\n * Parse USD price string to USDC amount (6 decimals)\n * e.g., \"$0.05\" → 50000n\n */\nexport function parsePriceToUSDC(price: string): bigint {\n const numericPrice = price.replace(\"$\", \"\").trim();\n const amount = parseFloat(numericPrice);\n return parseUnits(amount.toString(), 6);\n}\n\n/**\n * Format USDC amount to USD string\n * e.g., 50000n → \"$0.05\"\n */\nexport function formatUSDCToPrice(amount: bigint): string {\n const value = Number(amount) / 1_000_000;\n return `$${value.toFixed(2)}`;\n}\n\n/**\n * Generate random nonce for payment (32 bytes)\n */\nexport function generateNonce(): `0x${string}` {\n const randomBytes = new Uint8Array(32);\n crypto.getRandomValues(randomBytes);\n return `0x${Array.from(randomBytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")}` as `0x${string}`;\n}\n\n/**\n * Create EIP-712 domain for token transferWithAuthorization\n */\nexport function createEIP712Domain(\n network: string,\n tokenAddress?: Address,\n tokenName?: string\n) {\n const address = tokenAddress || getUSDCAddress(network);\n const name = tokenName || \"USD Coin\";\n\n return {\n name,\n version: \"2\",\n chainId: getChainId(network),\n verifyingContract: address,\n };\n}\n\n/**\n * Format payment payload for x402 v2 PAYMENT-SIGNATURE header\n * Per spec: https://www.x402.org/writing/x402-v2-launch\n */\nexport function formatPaymentSignature(\n envelope: PaymentEnvelope,\n network: string,\n encodeBase64: boolean = true\n): string {\n const paymentPayload = {\n x402Version: 2,\n scheme: \"exact\",\n network: toCAIP2Network(network),\n payload: envelope,\n };\n\n const jsonString = JSON.stringify(paymentPayload);\n\n if (encodeBase64) {\n return Buffer.from(jsonString).toString(\"base64\");\n }\n return jsonString;\n}\n\n/**\n * Parse payment signature from header\n */\nexport function parsePaymentSignature(header: string): PaymentEnvelope | null {\n try {\n let parsed: any;\n\n // Try base64 first (V2 standard)\n try {\n const decoded = Buffer.from(header, \"base64\").toString(\"utf-8\");\n parsed = JSON.parse(decoded);\n } catch {\n // Fallback to direct JSON\n parsed = JSON.parse(header);\n }\n\n // x402 v2 format: extract envelope from payload\n if (parsed.x402Version === 2 && parsed.payload) {\n return parsed.payload as PaymentEnvelope;\n }\n\n // V1 format or direct envelope\n return parsed as PaymentEnvelope;\n } catch {\n return null;\n }\n}\n\n/**\n * Validate network name\n */\nexport function isValidNetwork(network: string): network is NetworkName {\n return network in NETWORK_TO_CAIP2;\n}\n\n/**\n * Get valid before timestamp (default: 30 minutes from now)\n */\nexport function getValidBefore(minutes: number = 30): string {\n return String(Math.floor(Date.now() / 1000) + minutes * 60);\n}\n\n/**\n * Get valid after timestamp (default: now)\n */\nexport function getValidAfter(): string {\n return String(Math.floor(Date.now() / 1000));\n}\n","/**\n * x402 Payment Middleware\n * Payment verification and settlement for API routes\n */\n\nimport type {\n PaymentEnvelope,\n PaymentVerificationResult,\n X402PaymentResult,\n PaymentConfig,\n PaymentRoutes,\n TokenInfo,\n SettlementResult,\n} from \"./types\";\nimport {\n toCAIP2Network,\n toLegacyNetwork,\n parsePriceToUSDC,\n getUSDCAddress,\n parsePaymentSignature,\n} from \"./utils\";\n\nexport interface MiddlewareContext {\n config: PaymentConfig;\n routes: PaymentRoutes;\n tokenDetector?: (address: string, network: string) => Promise<TokenInfo | null>;\n createResponse?: (body: any, options: { status: number; headers?: Record<string, string> }) => any;\n getHeader?: (request: any, name: string) => string | null;\n}\n\n/**\n * Extract payment envelope from request headers\n */\nexport function extractPaymentEnvelope(\n request: any,\n getHeader?: (req: any, name: string) => string | null\n): PaymentEnvelope | null {\n const headerGetter = getHeader || ((req, name) => {\n // Support Next.js, Express, and standard Request objects\n if (req.headers?.get) return req.headers.get(name);\n if (req.headers?.[name]) return req.headers[name];\n if (req.header) return req.header(name);\n return null;\n });\n\n // Try V2 header first (PAYMENT-SIGNATURE)\n let paymentHeader = headerGetter(request, \"payment-signature\");\n\n // Fallback to deprecated X-Payment for backward compatibility\n if (!paymentHeader) {\n paymentHeader = headerGetter(request, \"x-payment\");\n }\n\n if (!paymentHeader) {\n return null;\n }\n\n return parsePaymentSignature(paymentHeader);\n}\n\n/**\n * Verify payment with facilitator\n */\nexport async function verifyPayment(\n envelope: PaymentEnvelope,\n route: string,\n ctx: MiddlewareContext\n): Promise<PaymentVerificationResult> {\n const routePrice = ctx.routes[route];\n if (routePrice === undefined) {\n return {\n isValid: false,\n invalidReason: `Route ${route} not configured for payment`,\n };\n }\n\n // Verify network matches\n const envelopeNetwork = toLegacyNetwork(envelope.network);\n const expectedNetwork = ctx.config.network;\n\n if (envelopeNetwork !== expectedNetwork) {\n return {\n isValid: false,\n invalidReason: `Network mismatch. Expected ${expectedNetwork}, got ${envelopeNetwork}`,\n };\n }\n\n // Verify recipient address\n if (envelope.authorization.to.toLowerCase() !== ctx.config.payTo.toLowerCase()) {\n return {\n isValid: false,\n invalidReason: `Recipient mismatch. Expected ${ctx.config.payTo}, got ${envelope.authorization.to}`,\n };\n }\n\n // Build verification request\n const priceString = `$${routePrice}`;\n const priceAmount = parsePriceToUSDC(priceString);\n const usdcAddress = getUSDCAddress(ctx.config.network);\n\n // Detect token info for EIP-712 domain\n let tokenName = \"USD Coin\";\n if (ctx.tokenDetector) {\n try {\n const tokenInfo = await ctx.tokenDetector(usdcAddress, ctx.config.network);\n if (tokenInfo?.name) {\n tokenName = tokenInfo.name;\n }\n } catch {\n // Use default token name\n }\n }\n\n // Call facilitator verify endpoint\n const verifyUrl = `${ctx.config.facilitatorUrl}/api/v2/x402/verify`;\n\n try {\n const response = await fetch(verifyUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n x402Version: 2,\n paymentRequirements: {\n scheme: \"exact\",\n network: toCAIP2Network(ctx.config.network),\n maxAmountRequired: priceAmount.toString(),\n resource: route,\n description: `Payment for ${route}`,\n mimeType: \"application/json\",\n payTo: ctx.config.payTo,\n maxTimeoutSeconds: 30,\n asset: usdcAddress,\n extra: { name: tokenName, version: \"2\" },\n },\n paymentPayload: {\n x402Version: 2,\n network: toCAIP2Network(envelope.network),\n scheme: \"exact\",\n payload: envelope,\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as { invalidReason?: string };\n return {\n isValid: false,\n invalidReason: errorData.invalidReason || `Verification failed: ${response.statusText}`,\n };\n }\n\n const result = await response.json() as { isValid?: boolean; payer?: string; invalidReason?: string };\n return {\n isValid: result.isValid || false,\n payer: result.payer,\n invalidReason: result.invalidReason,\n };\n } catch (error) {\n return {\n isValid: false,\n invalidReason: `Facilitator unavailable at ${ctx.config.facilitatorUrl}`,\n };\n }\n}\n\n/**\n * Settle payment with facilitator\n */\nexport async function settlePayment(\n envelope: PaymentEnvelope,\n ctx: MiddlewareContext\n): Promise<SettlementResult> {\n const settleUrl = `${ctx.config.facilitatorUrl}/api/v2/x402/settle`;\n const usdcAddress = getUSDCAddress(envelope.network);\n\n // Detect token info\n let tokenName = \"USD Coin\";\n if (ctx.tokenDetector) {\n try {\n const tokenInfo = await ctx.tokenDetector(usdcAddress, envelope.network);\n if (tokenInfo?.name) {\n tokenName = tokenInfo.name;\n }\n } catch {\n // Use default\n }\n }\n\n try {\n const response = await fetch(settleUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n x402Version: 2,\n paymentPayload: {\n x402Version: 2,\n network: toCAIP2Network(envelope.network),\n scheme: \"exact\",\n payload: envelope,\n },\n paymentRequirements: {\n scheme: \"exact\",\n network: toCAIP2Network(envelope.network),\n maxAmountRequired: envelope.authorization.value,\n resource: \"\",\n description: \"Payment settlement\",\n mimeType: \"application/json\",\n payTo: envelope.authorization.to,\n maxTimeoutSeconds: 30,\n asset: usdcAddress,\n extra: { name: tokenName, version: \"2\" },\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as { errorReason?: string; error?: string };\n return {\n success: false,\n error: errorData.errorReason || errorData.error || `Settlement failed: ${response.statusText}`,\n };\n }\n\n const result = await response.json() as {\n success?: boolean;\n errorReason?: string;\n error?: string;\n transaction?: string | { hash?: string; transactionHash?: string };\n receipt?: { settlement?: { transaction?: string } };\n transactionHash?: string;\n hash?: string;\n };\n\n if (!result.success) {\n return {\n success: false,\n error: result.errorReason || result.error || \"Settlement failed\",\n };\n }\n\n // Extract transaction hash from various response formats\n const transactionHash =\n (typeof result.transaction === \"string\" ? result.transaction : undefined) ||\n (typeof result.transaction === \"object\" ? result.transaction?.hash : undefined) ||\n (typeof result.transaction === \"object\" ? result.transaction?.transactionHash : undefined) ||\n result.receipt?.settlement?.transaction ||\n result.transactionHash ||\n result.hash ||\n undefined;\n\n return { success: true, transactionHash };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Settlement failed\",\n };\n }\n}\n\n/**\n * Create 402 Payment Required response\n */\nexport function create402Response(\n route: string,\n ctx: MiddlewareContext\n): { body: any; status: number; headers: Record<string, string> } {\n const routePath = route.includes(\" \") ? route.split(\" \")[1] : route;\n const routePrice = ctx.routes[routePath];\n\n if (routePrice === undefined) {\n return {\n body: { error: \"Route not configured for payment\" },\n status: 500,\n headers: {},\n };\n }\n\n const priceAmount = parsePriceToUSDC(`$${routePrice}`);\n const usdcAddress = getUSDCAddress(ctx.config.network);\n\n const paymentRequirements = {\n scheme: \"exact\",\n network: toCAIP2Network(ctx.config.network),\n maxAmountRequired: priceAmount.toString(),\n resource: routePath,\n description: `Payment required for ${routePath}`,\n mimeType: \"application/json\",\n payTo: ctx.config.payTo,\n maxTimeoutSeconds: 30,\n asset: usdcAddress,\n extra: { name: \"USD Coin\", version: \"2\" },\n };\n\n const paymentRequiredHeader = Buffer.from(\n JSON.stringify({ x402Version: 2, accepts: [paymentRequirements] })\n ).toString(\"base64\");\n\n return {\n body: {\n error: \"Payment Required\",\n message: \"Please include PAYMENT-SIGNATURE header with signed payment envelope.\",\n },\n status: 402,\n headers: { \"PAYMENT-REQUIRED\": paymentRequiredHeader },\n };\n}\n\n/**\n * Main middleware function to verify x402 payment\n */\nexport async function verifyX402Payment(\n request: any,\n route: string,\n ctx: MiddlewareContext\n): Promise<X402PaymentResult> {\n const routePath = route.includes(\" \") ? route.split(\" \")[1] : route;\n const routePrice = ctx.routes[routePath];\n\n if (routePrice === undefined) {\n // Route not configured for payment, allow through\n return { isValid: true };\n }\n\n // Extract payment envelope\n const envelope = extractPaymentEnvelope(request, ctx.getHeader);\n if (!envelope) {\n const { body, status, headers } = create402Response(route, ctx);\n const response = ctx.createResponse\n ? ctx.createResponse(body, { status, headers })\n : { body, status, headers };\n return { isValid: false, response };\n }\n\n // Verify payment\n const verification = await verifyPayment(envelope, routePath, ctx);\n if (!verification.isValid) {\n const response = ctx.createResponse\n ? ctx.createResponse(\n { error: \"Payment verification failed\", reason: verification.invalidReason },\n { status: 402 }\n )\n : { error: \"Payment verification failed\", reason: verification.invalidReason, status: 402 };\n return { isValid: false, response };\n }\n\n // Settle payment\n const settlement = await settlePayment(envelope, ctx);\n if (!settlement.success) {\n let errorMessage = settlement.error || \"Payment settlement failed\";\n\n // Provide helpful error messages\n if (errorMessage.includes(\"sponsor wallet\") || errorMessage.includes(\"No sponsor\")) {\n errorMessage = \"Payment settlement failed: No sponsor wallet configured.\";\n } else if (errorMessage.includes(\"authorization is used or canceled\")) {\n errorMessage = \"Payment authorization failed. Please try signing a new payment.\";\n }\n\n const response = ctx.createResponse\n ? ctx.createResponse(\n { error: \"Payment settlement failed\", reason: errorMessage, details: settlement.error },\n { status: 402 }\n )\n : { error: \"Payment settlement failed\", reason: errorMessage, status: 402 };\n return { isValid: false, response };\n }\n\n // Success - return payment response header\n const paymentResponse = {\n success: true,\n transactionHash: settlement.transactionHash,\n network: envelope.network,\n };\n const paymentResponseHeader = Buffer.from(JSON.stringify(paymentResponse)).toString(\"base64\");\n\n return {\n isValid: true,\n payer: verification.payer,\n envelope,\n paymentResponseHeader,\n };\n}\n","/**\n * x402 Next.js Integration\n * Helper functions for Next.js API routes\n */\n\nimport type { PaymentConfig, PaymentRoutes, TokenInfo, X402PaymentResult } from \"./types\";\nimport { verifyX402Payment as baseVerifyX402Payment, type MiddlewareContext } from \"./middleware\";\n\n/**\n * Next.js specific middleware context\n */\nexport interface NextX402Options {\n config: PaymentConfig;\n routes: PaymentRoutes;\n tokenDetector?: (address: string, network: string) => Promise<TokenInfo | null>;\n}\n\n/**\n * Create Next.js response helper\n */\nfunction createNextResponse(body: any, options: { status: number; headers?: Record<string, string> }) {\n // Dynamic import to avoid bundling issues\n const { NextResponse } = require(\"next/server\");\n return NextResponse.json(body, { status: options.status, headers: options.headers });\n}\n\n/**\n * Get header from Next.js request\n */\nfunction getNextHeader(request: any, name: string): string | null {\n return request.headers?.get?.(name) || null;\n}\n\n/**\n * Verify x402 payment in Next.js API route\n *\n * @example\n * ```typescript\n * import { verifyX402Payment } from \"@perkos/x402-core/next\";\n *\n * export async function POST(request: NextRequest) {\n * const result = await verifyX402Payment(request, \"/api/ai/translate\", {\n * config: x402Config,\n * routes: paymentRoutes,\n * });\n *\n * if (!result.isValid) {\n * return result.response;\n * }\n *\n * // Process request...\n * }\n * ```\n */\nexport async function verifyX402Payment(\n request: any,\n route: string,\n options: NextX402Options\n): Promise<X402PaymentResult> {\n const ctx: MiddlewareContext = {\n config: options.config,\n routes: options.routes,\n tokenDetector: options.tokenDetector,\n createResponse: createNextResponse,\n getHeader: getNextHeader,\n };\n\n return baseVerifyX402Payment(request, route, ctx);\n}\n\n/**\n * Create a configured middleware instance for Next.js\n */\nexport function createX402Middleware(options: NextX402Options) {\n return {\n verify: (request: any, route: string) => verifyX402Payment(request, route, options),\n options,\n };\n}\n"],"mappings":"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","names":["verifyX402Payment","verifyX402Payment"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/utils.ts","../src/middleware.ts","../src/next.ts"],"sourcesContent":["/**\n * @perkos/x402-core\n * x402 v2 payment protocol middleware and utilities for vendor services\n */\n\n// Types\nexport type {\n PaymentEnvelope,\n PaymentRequirements,\n PaymentConfig,\n PaymentVerificationResult,\n X402PaymentResult,\n NetworkName,\n CAIP2Network,\n TokenInfo,\n SettlementResult,\n PaymentRoutes,\n X402MiddlewareOptions,\n} from \"./types\";\n\n// Constants\nexport {\n USDC_ADDRESSES,\n CHAIN_IDS,\n NETWORK_TO_CAIP2,\n CAIP2_TO_NETWORK,\n DEFAULT_RPC_URLS,\n VALID_NETWORKS,\n TRANSFER_WITH_AUTHORIZATION_TYPES,\n DOMAIN_VERSIONS,\n getDomainVersion,\n} from \"./constants\";\n\n// Utilities\nexport {\n getUSDCAddress,\n getChainId,\n getRpcUrl,\n toCAIP2Network,\n toLegacyNetwork,\n parsePriceToUSDC,\n formatUSDCToPrice,\n generateNonce,\n createEIP712Domain,\n formatPaymentSignature,\n parsePaymentSignature,\n isValidNetwork,\n getValidBefore,\n getValidAfter,\n} from \"./utils\";\n\n// Middleware\nexport {\n extractPaymentEnvelope,\n verifyPayment,\n settlePayment,\n create402Response,\n verifyX402Payment,\n type MiddlewareContext,\n} from \"./middleware\";\n\n// Next.js integration\nexport {\n verifyX402Payment as verifyX402PaymentNext,\n createX402Middleware,\n type NextX402Options,\n} from \"./next\";\n","/**\n * x402 Core Constants\n * Network configurations, addresses, and mappings\n */\n\nimport type { Address } from \"viem\";\nimport type { NetworkName, CAIP2Network } from \"./types\";\n\n/**\n * USDC Contract Addresses by Network\n */\nexport const USDC_ADDRESSES: Record<NetworkName, Address> = {\n ethereum: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n avalanche: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n \"avalanche-fuji\": \"0x5425890298aed601595a70AB815c96711a31Bc65\",\n base: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n \"base-sepolia\": \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n celo: \"0xcebA9300f2b948710d2653dD7B07f33A8B32118C\",\n \"celo-sepolia\": \"0x2F25deB3848C207fc8E0c34035B3Ba7fC157602B\",\n};\n\n/**\n * Chain IDs by Network\n */\nexport const CHAIN_IDS: Record<string, number> = {\n ethereum: 1,\n avalanche: 43114,\n \"avalanche-fuji\": 43113,\n base: 8453,\n \"base-sepolia\": 84532,\n celo: 42220,\n \"celo-sepolia\": 11142220,\n // CAIP-2 format support\n \"eip155:1\": 1,\n \"eip155:43114\": 43114,\n \"eip155:43113\": 43113,\n \"eip155:8453\": 8453,\n \"eip155:84532\": 84532,\n \"eip155:42220\": 42220,\n \"eip155:11142220\": 11142220,\n};\n\n/**\n * Network to CAIP-2 mapping\n */\nexport const NETWORK_TO_CAIP2: Record<NetworkName, CAIP2Network> = {\n ethereum: \"eip155:1\",\n avalanche: \"eip155:43114\",\n \"avalanche-fuji\": \"eip155:43113\",\n base: \"eip155:8453\",\n \"base-sepolia\": \"eip155:84532\",\n celo: \"eip155:42220\",\n \"celo-sepolia\": \"eip155:11142220\",\n};\n\n/**\n * CAIP-2 to Network mapping\n */\nexport const CAIP2_TO_NETWORK: Record<string, NetworkName> = {\n \"eip155:1\": \"ethereum\",\n \"eip155:43114\": \"avalanche\",\n \"eip155:43113\": \"avalanche-fuji\",\n \"eip155:8453\": \"base\",\n \"eip155:84532\": \"base-sepolia\",\n \"eip155:42220\": \"celo\",\n \"eip155:11142220\": \"celo-sepolia\",\n};\n\n/**\n * Default RPC URLs by Network\n */\nexport const DEFAULT_RPC_URLS: Record<NetworkName, string> = {\n ethereum: \"https://eth.llamarpc.com\",\n avalanche: \"https://api.avax.network/ext/bc/C/rpc\",\n \"avalanche-fuji\": \"https://api.avax-test.network/ext/bc/C/rpc\",\n base: \"https://mainnet.base.org\",\n \"base-sepolia\": \"https://sepolia.base.org\",\n celo: \"https://forno.celo.org\",\n \"celo-sepolia\": \"https://forno.celo-sepolia.celo-testnet.org\",\n};\n\n/**\n * Valid network names\n */\nexport const VALID_NETWORKS: NetworkName[] = [\n \"ethereum\",\n \"base\",\n \"base-sepolia\",\n \"avalanche\",\n \"avalanche-fuji\",\n \"celo\",\n \"celo-sepolia\",\n];\n\n/**\n * EIP-712 Domain Versions by Network\n * Different USDC deployments use different domain versions:\n * - FiatTokenV2_2 (newer): version \"2\" (Ethereum, Base, Avalanche)\n * - FiatTokenV2_1 (older): version \"2\"\n * - Some chains may use version \"1\"\n *\n * Note: Celo native USDC uses version \"2\"\n */\nexport const DOMAIN_VERSIONS: Record<string, string> = {\n ethereum: \"2\",\n avalanche: \"2\",\n \"avalanche-fuji\": \"2\",\n base: \"2\",\n \"base-sepolia\": \"2\",\n celo: \"1\", // Celo native USDC uses version \"1\"\n \"celo-sepolia\": \"1\",\n // CAIP-2 format support\n \"eip155:1\": \"2\",\n \"eip155:43114\": \"2\",\n \"eip155:43113\": \"2\",\n \"eip155:8453\": \"2\",\n \"eip155:84532\": \"2\",\n \"eip155:42220\": \"1\", // Celo\n \"eip155:11142220\": \"1\", // Celo Sepolia\n};\n\n/**\n * Get EIP-712 domain version for a network\n */\nexport function getDomainVersion(network: string): string {\n return DOMAIN_VERSIONS[network] || \"2\";\n}\n\n/**\n * EIP-712 TransferWithAuthorization types\n */\nexport const TRANSFER_WITH_AUTHORIZATION_TYPES = {\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 * x402 Core Utilities\n * Helper functions for x402 payment processing\n */\n\nimport { parseUnits } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { NetworkName, PaymentEnvelope } from \"./types\";\nimport {\n USDC_ADDRESSES,\n CHAIN_IDS,\n NETWORK_TO_CAIP2,\n CAIP2_TO_NETWORK,\n DEFAULT_RPC_URLS,\n getDomainVersion,\n} from \"./constants\";\n\n/**\n * Get USDC address for a network\n */\nexport function getUSDCAddress(network: string): Address {\n const legacyNetwork = toLegacyNetwork(network);\n return USDC_ADDRESSES[legacyNetwork as NetworkName] || USDC_ADDRESSES.avalanche;\n}\n\n/**\n * Get chain ID for a network\n */\nexport function getChainId(network: string): number {\n return CHAIN_IDS[network] || CHAIN_IDS.avalanche;\n}\n\n/**\n * Get RPC URL for a network (with environment variable override support)\n */\nexport function getRpcUrl(network: string, envOverrides?: Record<string, string | undefined>): string {\n const legacyNetwork = toLegacyNetwork(network);\n\n // Check for environment variable overrides\n if (envOverrides) {\n const envKey = `${legacyNetwork.toUpperCase().replace(/-/g, \"_\")}_RPC_URL`;\n if (envOverrides[envKey]) {\n return envOverrides[envKey]!;\n }\n }\n\n return DEFAULT_RPC_URLS[legacyNetwork as NetworkName] || DEFAULT_RPC_URLS.avalanche;\n}\n\n/**\n * Convert network name to CAIP-2 format for x402 V2\n * e.g., \"base-sepolia\" → \"eip155:84532\"\n */\nexport function toCAIP2Network(network: string): string {\n if (network.includes(\":\")) {\n return network;\n }\n return NETWORK_TO_CAIP2[network as NetworkName] || network;\n}\n\n/**\n * Convert CAIP-2 network format to legacy format\n * e.g., \"eip155:43114\" → \"avalanche\"\n */\nexport function toLegacyNetwork(network: string): string {\n if (!network.includes(\":\")) {\n return network;\n }\n return CAIP2_TO_NETWORK[network] || \"avalanche\";\n}\n\n/**\n * Parse USD price string to USDC amount (6 decimals)\n * e.g., \"$0.05\" → 50000n\n */\nexport function parsePriceToUSDC(price: string): bigint {\n const numericPrice = price.replace(\"$\", \"\").trim();\n const amount = parseFloat(numericPrice);\n return parseUnits(amount.toString(), 6);\n}\n\n/**\n * Format USDC amount to USD string\n * e.g., 50000n → \"$0.05\"\n */\nexport function formatUSDCToPrice(amount: bigint): string {\n const value = Number(amount) / 1_000_000;\n return `$${value.toFixed(2)}`;\n}\n\n/**\n * Generate random nonce for payment (32 bytes)\n */\nexport function generateNonce(): `0x${string}` {\n const randomBytes = new Uint8Array(32);\n crypto.getRandomValues(randomBytes);\n return `0x${Array.from(randomBytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")}` as `0x${string}`;\n}\n\n/**\n * Create EIP-712 domain for token transferWithAuthorization\n * Uses network-specific version (some chains use \"1\", others use \"2\")\n */\nexport function createEIP712Domain(\n network: string,\n tokenAddress?: Address,\n tokenName?: string,\n version?: string\n) {\n const address = tokenAddress || getUSDCAddress(network);\n const name = tokenName || \"USD Coin\";\n const domainVersion = version || getDomainVersion(network);\n\n return {\n name,\n version: domainVersion,\n chainId: getChainId(network),\n verifyingContract: address,\n };\n}\n\n/**\n * Format payment payload for x402 v2 PAYMENT-SIGNATURE header\n * Per spec: https://www.x402.org/writing/x402-v2-launch\n */\nexport function formatPaymentSignature(\n envelope: PaymentEnvelope,\n network: string,\n encodeBase64: boolean = true\n): string {\n const paymentPayload = {\n x402Version: 2,\n scheme: \"exact\",\n network: toCAIP2Network(network),\n payload: envelope,\n };\n\n const jsonString = JSON.stringify(paymentPayload);\n\n if (encodeBase64) {\n return Buffer.from(jsonString).toString(\"base64\");\n }\n return jsonString;\n}\n\n/**\n * Parse payment signature from header\n */\nexport function parsePaymentSignature(header: string): PaymentEnvelope | null {\n try {\n let parsed: any;\n\n // Try base64 first (V2 standard)\n try {\n const decoded = Buffer.from(header, \"base64\").toString(\"utf-8\");\n parsed = JSON.parse(decoded);\n } catch {\n // Fallback to direct JSON\n parsed = JSON.parse(header);\n }\n\n // x402 v2 format: extract envelope from payload\n if (parsed.x402Version === 2 && parsed.payload) {\n return parsed.payload as PaymentEnvelope;\n }\n\n // V1 format or direct envelope\n return parsed as PaymentEnvelope;\n } catch {\n return null;\n }\n}\n\n/**\n * Validate network name\n */\nexport function isValidNetwork(network: string): network is NetworkName {\n return network in NETWORK_TO_CAIP2;\n}\n\n/**\n * Get valid before timestamp (default: 30 minutes from now)\n */\nexport function getValidBefore(minutes: number = 30): string {\n return String(Math.floor(Date.now() / 1000) + minutes * 60);\n}\n\n/**\n * Get valid after timestamp (default: now)\n */\nexport function getValidAfter(): string {\n return String(Math.floor(Date.now() / 1000));\n}\n","/**\n * x402 Payment Middleware\n * Payment verification and settlement for API routes\n */\n\nimport type {\n PaymentEnvelope,\n PaymentVerificationResult,\n X402PaymentResult,\n PaymentConfig,\n PaymentRoutes,\n TokenInfo,\n SettlementResult,\n} from \"./types\";\nimport {\n toCAIP2Network,\n toLegacyNetwork,\n parsePriceToUSDC,\n getUSDCAddress,\n parsePaymentSignature,\n} from \"./utils\";\n\nexport interface MiddlewareContext {\n config: PaymentConfig;\n routes: PaymentRoutes;\n tokenDetector?: (address: string, network: string) => Promise<TokenInfo | null>;\n createResponse?: (body: any, options: { status: number; headers?: Record<string, string> }) => any;\n getHeader?: (request: any, name: string) => string | null;\n}\n\n/**\n * Extract payment envelope from request headers\n */\nexport function extractPaymentEnvelope(\n request: any,\n getHeader?: (req: any, name: string) => string | null\n): PaymentEnvelope | null {\n const headerGetter = getHeader || ((req, name) => {\n // Support Next.js, Express, and standard Request objects\n if (req.headers?.get) return req.headers.get(name);\n if (req.headers?.[name]) return req.headers[name];\n if (req.header) return req.header(name);\n return null;\n });\n\n // Try V2 header first (PAYMENT-SIGNATURE)\n let paymentHeader = headerGetter(request, \"payment-signature\");\n\n // Fallback to deprecated X-Payment for backward compatibility\n if (!paymentHeader) {\n paymentHeader = headerGetter(request, \"x-payment\");\n }\n\n if (!paymentHeader) {\n return null;\n }\n\n return parsePaymentSignature(paymentHeader);\n}\n\n/**\n * Verify payment with facilitator\n */\nexport async function verifyPayment(\n envelope: PaymentEnvelope,\n route: string,\n ctx: MiddlewareContext\n): Promise<PaymentVerificationResult> {\n const routePrice = ctx.routes[route];\n if (routePrice === undefined) {\n return {\n isValid: false,\n invalidReason: `Route ${route} not configured for payment`,\n };\n }\n\n // Verify network matches\n const envelopeNetwork = toLegacyNetwork(envelope.network);\n const expectedNetwork = ctx.config.network;\n\n if (envelopeNetwork !== expectedNetwork) {\n return {\n isValid: false,\n invalidReason: `Network mismatch. Expected ${expectedNetwork}, got ${envelopeNetwork}`,\n };\n }\n\n // Verify recipient address\n if (envelope.authorization.to.toLowerCase() !== ctx.config.payTo.toLowerCase()) {\n return {\n isValid: false,\n invalidReason: `Recipient mismatch. Expected ${ctx.config.payTo}, got ${envelope.authorization.to}`,\n };\n }\n\n // Build verification request\n const priceString = `$${routePrice}`;\n const priceAmount = parsePriceToUSDC(priceString);\n const usdcAddress = getUSDCAddress(ctx.config.network);\n\n // Detect token info for EIP-712 domain\n let tokenName = \"USD Coin\";\n if (ctx.tokenDetector) {\n try {\n const tokenInfo = await ctx.tokenDetector(usdcAddress, ctx.config.network);\n if (tokenInfo?.name) {\n tokenName = tokenInfo.name;\n }\n } catch {\n // Use default token name\n }\n }\n\n // Call facilitator verify endpoint\n const verifyUrl = `${ctx.config.facilitatorUrl}/api/v2/x402/verify`;\n\n try {\n const response = await fetch(verifyUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n x402Version: 2,\n paymentRequirements: {\n scheme: \"exact\",\n network: toCAIP2Network(ctx.config.network),\n maxAmountRequired: priceAmount.toString(),\n resource: route,\n description: `Payment for ${route}`,\n mimeType: \"application/json\",\n payTo: ctx.config.payTo,\n maxTimeoutSeconds: 30,\n asset: usdcAddress,\n extra: { name: tokenName, version: \"2\" },\n },\n paymentPayload: {\n x402Version: 2,\n network: toCAIP2Network(envelope.network),\n scheme: \"exact\",\n payload: envelope,\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as { invalidReason?: string };\n return {\n isValid: false,\n invalidReason: errorData.invalidReason || `Verification failed: ${response.statusText}`,\n };\n }\n\n const result = await response.json() as { isValid?: boolean; payer?: string; invalidReason?: string };\n return {\n isValid: result.isValid || false,\n payer: result.payer,\n invalidReason: result.invalidReason,\n };\n } catch (error) {\n return {\n isValid: false,\n invalidReason: `Facilitator unavailable at ${ctx.config.facilitatorUrl}`,\n };\n }\n}\n\n/**\n * Settle payment with facilitator\n */\nexport async function settlePayment(\n envelope: PaymentEnvelope,\n ctx: MiddlewareContext\n): Promise<SettlementResult> {\n const settleUrl = `${ctx.config.facilitatorUrl}/api/v2/x402/settle`;\n const usdcAddress = getUSDCAddress(envelope.network);\n\n // Detect token info\n let tokenName = \"USD Coin\";\n if (ctx.tokenDetector) {\n try {\n const tokenInfo = await ctx.tokenDetector(usdcAddress, envelope.network);\n if (tokenInfo?.name) {\n tokenName = tokenInfo.name;\n }\n } catch {\n // Use default\n }\n }\n\n try {\n const response = await fetch(settleUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n x402Version: 2,\n paymentPayload: {\n x402Version: 2,\n network: toCAIP2Network(envelope.network),\n scheme: \"exact\",\n payload: envelope,\n },\n paymentRequirements: {\n scheme: \"exact\",\n network: toCAIP2Network(envelope.network),\n maxAmountRequired: envelope.authorization.value,\n resource: \"\",\n description: \"Payment settlement\",\n mimeType: \"application/json\",\n payTo: envelope.authorization.to,\n maxTimeoutSeconds: 30,\n asset: usdcAddress,\n extra: { name: tokenName, version: \"2\" },\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as { errorReason?: string; error?: string };\n return {\n success: false,\n error: errorData.errorReason || errorData.error || `Settlement failed: ${response.statusText}`,\n };\n }\n\n const result = await response.json() as {\n success?: boolean;\n errorReason?: string;\n error?: string;\n transaction?: string | { hash?: string; transactionHash?: string };\n receipt?: { settlement?: { transaction?: string } };\n transactionHash?: string;\n hash?: string;\n };\n\n if (!result.success) {\n return {\n success: false,\n error: result.errorReason || result.error || \"Settlement failed\",\n };\n }\n\n // Extract transaction hash from various response formats\n const transactionHash =\n (typeof result.transaction === \"string\" ? result.transaction : undefined) ||\n (typeof result.transaction === \"object\" ? result.transaction?.hash : undefined) ||\n (typeof result.transaction === \"object\" ? result.transaction?.transactionHash : undefined) ||\n result.receipt?.settlement?.transaction ||\n result.transactionHash ||\n result.hash ||\n undefined;\n\n return { success: true, transactionHash };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Settlement failed\",\n };\n }\n}\n\n/**\n * Create 402 Payment Required response\n */\nexport function create402Response(\n route: string,\n ctx: MiddlewareContext\n): { body: any; status: number; headers: Record<string, string> } {\n const routePath = route.includes(\" \") ? route.split(\" \")[1] : route;\n const routePrice = ctx.routes[routePath];\n\n if (routePrice === undefined) {\n return {\n body: { error: \"Route not configured for payment\" },\n status: 500,\n headers: {},\n };\n }\n\n const priceAmount = parsePriceToUSDC(`$${routePrice}`);\n const usdcAddress = getUSDCAddress(ctx.config.network);\n\n const paymentRequirements = {\n scheme: \"exact\",\n network: toCAIP2Network(ctx.config.network),\n maxAmountRequired: priceAmount.toString(),\n resource: routePath,\n description: `Payment required for ${routePath}`,\n mimeType: \"application/json\",\n payTo: ctx.config.payTo,\n maxTimeoutSeconds: 30,\n asset: usdcAddress,\n extra: { name: \"USD Coin\", version: \"2\" },\n };\n\n const paymentRequiredHeader = Buffer.from(\n JSON.stringify({ x402Version: 2, accepts: [paymentRequirements] })\n ).toString(\"base64\");\n\n return {\n body: {\n error: \"Payment Required\",\n message: \"Please include PAYMENT-SIGNATURE header with signed payment envelope.\",\n },\n status: 402,\n headers: { \"PAYMENT-REQUIRED\": paymentRequiredHeader },\n };\n}\n\n/**\n * Main middleware function to verify x402 payment\n */\nexport async function verifyX402Payment(\n request: any,\n route: string,\n ctx: MiddlewareContext\n): Promise<X402PaymentResult> {\n const routePath = route.includes(\" \") ? route.split(\" \")[1] : route;\n const routePrice = ctx.routes[routePath];\n\n if (routePrice === undefined) {\n // Route not configured for payment, allow through\n return { isValid: true };\n }\n\n // Extract payment envelope\n const envelope = extractPaymentEnvelope(request, ctx.getHeader);\n if (!envelope) {\n const { body, status, headers } = create402Response(route, ctx);\n const response = ctx.createResponse\n ? ctx.createResponse(body, { status, headers })\n : { body, status, headers };\n return { isValid: false, response };\n }\n\n // Verify payment\n const verification = await verifyPayment(envelope, routePath, ctx);\n if (!verification.isValid) {\n const response = ctx.createResponse\n ? ctx.createResponse(\n { error: \"Payment verification failed\", reason: verification.invalidReason },\n { status: 402 }\n )\n : { error: \"Payment verification failed\", reason: verification.invalidReason, status: 402 };\n return { isValid: false, response };\n }\n\n // Settle payment\n const settlement = await settlePayment(envelope, ctx);\n if (!settlement.success) {\n let errorMessage = settlement.error || \"Payment settlement failed\";\n\n // Provide helpful error messages\n if (errorMessage.includes(\"sponsor wallet\") || errorMessage.includes(\"No sponsor\")) {\n errorMessage = \"Payment settlement failed: No sponsor wallet configured.\";\n } else if (errorMessage.includes(\"authorization is used or canceled\")) {\n errorMessage = \"Payment authorization failed. Please try signing a new payment.\";\n }\n\n const response = ctx.createResponse\n ? ctx.createResponse(\n { error: \"Payment settlement failed\", reason: errorMessage, details: settlement.error },\n { status: 402 }\n )\n : { error: \"Payment settlement failed\", reason: errorMessage, status: 402 };\n return { isValid: false, response };\n }\n\n // Success - return payment response header\n const paymentResponse = {\n success: true,\n transactionHash: settlement.transactionHash,\n network: envelope.network,\n };\n const paymentResponseHeader = Buffer.from(JSON.stringify(paymentResponse)).toString(\"base64\");\n\n return {\n isValid: true,\n payer: verification.payer,\n envelope,\n paymentResponseHeader,\n };\n}\n","/**\n * x402 Next.js Integration\n * Helper functions for Next.js API routes\n */\n\nimport type { PaymentConfig, PaymentRoutes, TokenInfo, X402PaymentResult } from \"./types\";\nimport { verifyX402Payment as baseVerifyX402Payment, type MiddlewareContext } from \"./middleware\";\n\n/**\n * Next.js specific middleware context\n */\nexport interface NextX402Options {\n config: PaymentConfig;\n routes: PaymentRoutes;\n tokenDetector?: (address: string, network: string) => Promise<TokenInfo | null>;\n}\n\n/**\n * Create Next.js response helper\n */\nfunction createNextResponse(body: any, options: { status: number; headers?: Record<string, string> }) {\n // Dynamic import to avoid bundling issues\n const { NextResponse } = require(\"next/server\");\n return NextResponse.json(body, { status: options.status, headers: options.headers });\n}\n\n/**\n * Get header from Next.js request\n */\nfunction getNextHeader(request: any, name: string): string | null {\n return request.headers?.get?.(name) || null;\n}\n\n/**\n * Verify x402 payment in Next.js API route\n *\n * @example\n * ```typescript\n * import { verifyX402Payment } from \"@perkos/x402-core/next\";\n *\n * export async function POST(request: NextRequest) {\n * const result = await verifyX402Payment(request, \"/api/ai/translate\", {\n * config: x402Config,\n * routes: paymentRoutes,\n * });\n *\n * if (!result.isValid) {\n * return result.response;\n * }\n *\n * // Process request...\n * }\n * ```\n */\nexport async function verifyX402Payment(\n request: any,\n route: string,\n options: NextX402Options\n): Promise<X402PaymentResult> {\n const ctx: MiddlewareContext = {\n config: options.config,\n routes: options.routes,\n tokenDetector: options.tokenDetector,\n createResponse: createNextResponse,\n getHeader: getNextHeader,\n };\n\n return baseVerifyX402Payment(request, route, ctx);\n}\n\n/**\n * Create a configured middleware instance for Next.js\n */\nexport function createX402Middleware(options: NextX402Options) {\n return {\n verify: (request: any, route: string) => verifyX402Payment(request, route, options),\n options,\n };\n}\n"],"mappings":"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","names":["verifyX402Payment","verifyX402Payment"]}
|
package/dist/index.mjs
CHANGED
|
@@ -7,6 +7,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
7
7
|
|
|
8
8
|
// src/constants.ts
|
|
9
9
|
var USDC_ADDRESSES = {
|
|
10
|
+
ethereum: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
10
11
|
avalanche: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",
|
|
11
12
|
"avalanche-fuji": "0x5425890298aed601595a70AB815c96711a31Bc65",
|
|
12
13
|
base: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
@@ -15,6 +16,7 @@ var USDC_ADDRESSES = {
|
|
|
15
16
|
"celo-sepolia": "0x2F25deB3848C207fc8E0c34035B3Ba7fC157602B"
|
|
16
17
|
};
|
|
17
18
|
var CHAIN_IDS = {
|
|
19
|
+
ethereum: 1,
|
|
18
20
|
avalanche: 43114,
|
|
19
21
|
"avalanche-fuji": 43113,
|
|
20
22
|
base: 8453,
|
|
@@ -22,6 +24,7 @@ var CHAIN_IDS = {
|
|
|
22
24
|
celo: 42220,
|
|
23
25
|
"celo-sepolia": 11142220,
|
|
24
26
|
// CAIP-2 format support
|
|
27
|
+
"eip155:1": 1,
|
|
25
28
|
"eip155:43114": 43114,
|
|
26
29
|
"eip155:43113": 43113,
|
|
27
30
|
"eip155:8453": 8453,
|
|
@@ -30,6 +33,7 @@ var CHAIN_IDS = {
|
|
|
30
33
|
"eip155:11142220": 11142220
|
|
31
34
|
};
|
|
32
35
|
var NETWORK_TO_CAIP2 = {
|
|
36
|
+
ethereum: "eip155:1",
|
|
33
37
|
avalanche: "eip155:43114",
|
|
34
38
|
"avalanche-fuji": "eip155:43113",
|
|
35
39
|
base: "eip155:8453",
|
|
@@ -38,6 +42,7 @@ var NETWORK_TO_CAIP2 = {
|
|
|
38
42
|
"celo-sepolia": "eip155:11142220"
|
|
39
43
|
};
|
|
40
44
|
var CAIP2_TO_NETWORK = {
|
|
45
|
+
"eip155:1": "ethereum",
|
|
41
46
|
"eip155:43114": "avalanche",
|
|
42
47
|
"eip155:43113": "avalanche-fuji",
|
|
43
48
|
"eip155:8453": "base",
|
|
@@ -46,6 +51,7 @@ var CAIP2_TO_NETWORK = {
|
|
|
46
51
|
"eip155:11142220": "celo-sepolia"
|
|
47
52
|
};
|
|
48
53
|
var DEFAULT_RPC_URLS = {
|
|
54
|
+
ethereum: "https://eth.llamarpc.com",
|
|
49
55
|
avalanche: "https://api.avax.network/ext/bc/C/rpc",
|
|
50
56
|
"avalanche-fuji": "https://api.avax-test.network/ext/bc/C/rpc",
|
|
51
57
|
base: "https://mainnet.base.org",
|
|
@@ -54,6 +60,7 @@ var DEFAULT_RPC_URLS = {
|
|
|
54
60
|
"celo-sepolia": "https://forno.celo-sepolia.celo-testnet.org"
|
|
55
61
|
};
|
|
56
62
|
var VALID_NETWORKS = [
|
|
63
|
+
"ethereum",
|
|
57
64
|
"base",
|
|
58
65
|
"base-sepolia",
|
|
59
66
|
"avalanche",
|
|
@@ -61,6 +68,29 @@ var VALID_NETWORKS = [
|
|
|
61
68
|
"celo",
|
|
62
69
|
"celo-sepolia"
|
|
63
70
|
];
|
|
71
|
+
var DOMAIN_VERSIONS = {
|
|
72
|
+
ethereum: "2",
|
|
73
|
+
avalanche: "2",
|
|
74
|
+
"avalanche-fuji": "2",
|
|
75
|
+
base: "2",
|
|
76
|
+
"base-sepolia": "2",
|
|
77
|
+
celo: "1",
|
|
78
|
+
// Celo native USDC uses version "1"
|
|
79
|
+
"celo-sepolia": "1",
|
|
80
|
+
// CAIP-2 format support
|
|
81
|
+
"eip155:1": "2",
|
|
82
|
+
"eip155:43114": "2",
|
|
83
|
+
"eip155:43113": "2",
|
|
84
|
+
"eip155:8453": "2",
|
|
85
|
+
"eip155:84532": "2",
|
|
86
|
+
"eip155:42220": "1",
|
|
87
|
+
// Celo
|
|
88
|
+
"eip155:11142220": "1"
|
|
89
|
+
// Celo Sepolia
|
|
90
|
+
};
|
|
91
|
+
function getDomainVersion(network) {
|
|
92
|
+
return DOMAIN_VERSIONS[network] || "2";
|
|
93
|
+
}
|
|
64
94
|
var TRANSFER_WITH_AUTHORIZATION_TYPES = {
|
|
65
95
|
TransferWithAuthorization: [
|
|
66
96
|
{ name: "from", type: "address" },
|
|
@@ -117,12 +147,13 @@ function generateNonce() {
|
|
|
117
147
|
crypto.getRandomValues(randomBytes);
|
|
118
148
|
return `0x${Array.from(randomBytes).map((b) => b.toString(16).padStart(2, "0")).join("")}`;
|
|
119
149
|
}
|
|
120
|
-
function createEIP712Domain(network, tokenAddress, tokenName) {
|
|
150
|
+
function createEIP712Domain(network, tokenAddress, tokenName, version) {
|
|
121
151
|
const address = tokenAddress || getUSDCAddress(network);
|
|
122
152
|
const name = tokenName || "USD Coin";
|
|
153
|
+
const domainVersion = version || getDomainVersion(network);
|
|
123
154
|
return {
|
|
124
155
|
name,
|
|
125
|
-
version:
|
|
156
|
+
version: domainVersion,
|
|
126
157
|
chainId: getChainId(network),
|
|
127
158
|
verifyingContract: address
|
|
128
159
|
};
|
|
@@ -440,6 +471,7 @@ export {
|
|
|
440
471
|
CAIP2_TO_NETWORK,
|
|
441
472
|
CHAIN_IDS,
|
|
442
473
|
DEFAULT_RPC_URLS,
|
|
474
|
+
DOMAIN_VERSIONS,
|
|
443
475
|
NETWORK_TO_CAIP2,
|
|
444
476
|
TRANSFER_WITH_AUTHORIZATION_TYPES,
|
|
445
477
|
USDC_ADDRESSES,
|
|
@@ -452,6 +484,7 @@ export {
|
|
|
452
484
|
formatUSDCToPrice,
|
|
453
485
|
generateNonce,
|
|
454
486
|
getChainId,
|
|
487
|
+
getDomainVersion,
|
|
455
488
|
getRpcUrl,
|
|
456
489
|
getUSDCAddress,
|
|
457
490
|
getValidAfter,
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/middleware.ts","../src/next.ts"],"sourcesContent":["/**\n * x402 Core Constants\n * Network configurations, addresses, and mappings\n */\n\nimport type { Address } from \"viem\";\nimport type { NetworkName, CAIP2Network } from \"./types\";\n\n/**\n * USDC Contract Addresses by Network\n */\nexport const USDC_ADDRESSES: Record<NetworkName, Address> = {\n avalanche: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n \"avalanche-fuji\": \"0x5425890298aed601595a70AB815c96711a31Bc65\",\n base: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n \"base-sepolia\": \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n celo: \"0xcebA9300f2b948710d2653dD7B07f33A8B32118C\",\n \"celo-sepolia\": \"0x2F25deB3848C207fc8E0c34035B3Ba7fC157602B\",\n};\n\n/**\n * Chain IDs by Network\n */\nexport const CHAIN_IDS: Record<string, number> = {\n avalanche: 43114,\n \"avalanche-fuji\": 43113,\n base: 8453,\n \"base-sepolia\": 84532,\n celo: 42220,\n \"celo-sepolia\": 11142220,\n // CAIP-2 format support\n \"eip155:43114\": 43114,\n \"eip155:43113\": 43113,\n \"eip155:8453\": 8453,\n \"eip155:84532\": 84532,\n \"eip155:42220\": 42220,\n \"eip155:11142220\": 11142220,\n};\n\n/**\n * Network to CAIP-2 mapping\n */\nexport const NETWORK_TO_CAIP2: Record<NetworkName, CAIP2Network> = {\n avalanche: \"eip155:43114\",\n \"avalanche-fuji\": \"eip155:43113\",\n base: \"eip155:8453\",\n \"base-sepolia\": \"eip155:84532\",\n celo: \"eip155:42220\",\n \"celo-sepolia\": \"eip155:11142220\",\n};\n\n/**\n * CAIP-2 to Network mapping\n */\nexport const CAIP2_TO_NETWORK: Record<string, NetworkName> = {\n \"eip155:43114\": \"avalanche\",\n \"eip155:43113\": \"avalanche-fuji\",\n \"eip155:8453\": \"base\",\n \"eip155:84532\": \"base-sepolia\",\n \"eip155:42220\": \"celo\",\n \"eip155:11142220\": \"celo-sepolia\",\n};\n\n/**\n * Default RPC URLs by Network\n */\nexport const DEFAULT_RPC_URLS: Record<NetworkName, string> = {\n avalanche: \"https://api.avax.network/ext/bc/C/rpc\",\n \"avalanche-fuji\": \"https://api.avax-test.network/ext/bc/C/rpc\",\n base: \"https://mainnet.base.org\",\n \"base-sepolia\": \"https://sepolia.base.org\",\n celo: \"https://forno.celo.org\",\n \"celo-sepolia\": \"https://forno.celo-sepolia.celo-testnet.org\",\n};\n\n/**\n * Valid network names\n */\nexport const VALID_NETWORKS: NetworkName[] = [\n \"base\",\n \"base-sepolia\",\n \"avalanche\",\n \"avalanche-fuji\",\n \"celo\",\n \"celo-sepolia\",\n];\n\n/**\n * EIP-712 TransferWithAuthorization types\n */\nexport const TRANSFER_WITH_AUTHORIZATION_TYPES = {\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 * x402 Core Utilities\n * Helper functions for x402 payment processing\n */\n\nimport { parseUnits } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { NetworkName, PaymentEnvelope } from \"./types\";\nimport {\n USDC_ADDRESSES,\n CHAIN_IDS,\n NETWORK_TO_CAIP2,\n CAIP2_TO_NETWORK,\n DEFAULT_RPC_URLS,\n} from \"./constants\";\n\n/**\n * Get USDC address for a network\n */\nexport function getUSDCAddress(network: string): Address {\n const legacyNetwork = toLegacyNetwork(network);\n return USDC_ADDRESSES[legacyNetwork as NetworkName] || USDC_ADDRESSES.avalanche;\n}\n\n/**\n * Get chain ID for a network\n */\nexport function getChainId(network: string): number {\n return CHAIN_IDS[network] || CHAIN_IDS.avalanche;\n}\n\n/**\n * Get RPC URL for a network (with environment variable override support)\n */\nexport function getRpcUrl(network: string, envOverrides?: Record<string, string | undefined>): string {\n const legacyNetwork = toLegacyNetwork(network);\n\n // Check for environment variable overrides\n if (envOverrides) {\n const envKey = `${legacyNetwork.toUpperCase().replace(/-/g, \"_\")}_RPC_URL`;\n if (envOverrides[envKey]) {\n return envOverrides[envKey]!;\n }\n }\n\n return DEFAULT_RPC_URLS[legacyNetwork as NetworkName] || DEFAULT_RPC_URLS.avalanche;\n}\n\n/**\n * Convert network name to CAIP-2 format for x402 V2\n * e.g., \"base-sepolia\" → \"eip155:84532\"\n */\nexport function toCAIP2Network(network: string): string {\n if (network.includes(\":\")) {\n return network;\n }\n return NETWORK_TO_CAIP2[network as NetworkName] || network;\n}\n\n/**\n * Convert CAIP-2 network format to legacy format\n * e.g., \"eip155:43114\" → \"avalanche\"\n */\nexport function toLegacyNetwork(network: string): string {\n if (!network.includes(\":\")) {\n return network;\n }\n return CAIP2_TO_NETWORK[network] || \"avalanche\";\n}\n\n/**\n * Parse USD price string to USDC amount (6 decimals)\n * e.g., \"$0.05\" → 50000n\n */\nexport function parsePriceToUSDC(price: string): bigint {\n const numericPrice = price.replace(\"$\", \"\").trim();\n const amount = parseFloat(numericPrice);\n return parseUnits(amount.toString(), 6);\n}\n\n/**\n * Format USDC amount to USD string\n * e.g., 50000n → \"$0.05\"\n */\nexport function formatUSDCToPrice(amount: bigint): string {\n const value = Number(amount) / 1_000_000;\n return `$${value.toFixed(2)}`;\n}\n\n/**\n * Generate random nonce for payment (32 bytes)\n */\nexport function generateNonce(): `0x${string}` {\n const randomBytes = new Uint8Array(32);\n crypto.getRandomValues(randomBytes);\n return `0x${Array.from(randomBytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")}` as `0x${string}`;\n}\n\n/**\n * Create EIP-712 domain for token transferWithAuthorization\n */\nexport function createEIP712Domain(\n network: string,\n tokenAddress?: Address,\n tokenName?: string\n) {\n const address = tokenAddress || getUSDCAddress(network);\n const name = tokenName || \"USD Coin\";\n\n return {\n name,\n version: \"2\",\n chainId: getChainId(network),\n verifyingContract: address,\n };\n}\n\n/**\n * Format payment payload for x402 v2 PAYMENT-SIGNATURE header\n * Per spec: https://www.x402.org/writing/x402-v2-launch\n */\nexport function formatPaymentSignature(\n envelope: PaymentEnvelope,\n network: string,\n encodeBase64: boolean = true\n): string {\n const paymentPayload = {\n x402Version: 2,\n scheme: \"exact\",\n network: toCAIP2Network(network),\n payload: envelope,\n };\n\n const jsonString = JSON.stringify(paymentPayload);\n\n if (encodeBase64) {\n return Buffer.from(jsonString).toString(\"base64\");\n }\n return jsonString;\n}\n\n/**\n * Parse payment signature from header\n */\nexport function parsePaymentSignature(header: string): PaymentEnvelope | null {\n try {\n let parsed: any;\n\n // Try base64 first (V2 standard)\n try {\n const decoded = Buffer.from(header, \"base64\").toString(\"utf-8\");\n parsed = JSON.parse(decoded);\n } catch {\n // Fallback to direct JSON\n parsed = JSON.parse(header);\n }\n\n // x402 v2 format: extract envelope from payload\n if (parsed.x402Version === 2 && parsed.payload) {\n return parsed.payload as PaymentEnvelope;\n }\n\n // V1 format or direct envelope\n return parsed as PaymentEnvelope;\n } catch {\n return null;\n }\n}\n\n/**\n * Validate network name\n */\nexport function isValidNetwork(network: string): network is NetworkName {\n return network in NETWORK_TO_CAIP2;\n}\n\n/**\n * Get valid before timestamp (default: 30 minutes from now)\n */\nexport function getValidBefore(minutes: number = 30): string {\n return String(Math.floor(Date.now() / 1000) + minutes * 60);\n}\n\n/**\n * Get valid after timestamp (default: now)\n */\nexport function getValidAfter(): string {\n return String(Math.floor(Date.now() / 1000));\n}\n","/**\n * x402 Payment Middleware\n * Payment verification and settlement for API routes\n */\n\nimport type {\n PaymentEnvelope,\n PaymentVerificationResult,\n X402PaymentResult,\n PaymentConfig,\n PaymentRoutes,\n TokenInfo,\n SettlementResult,\n} from \"./types\";\nimport {\n toCAIP2Network,\n toLegacyNetwork,\n parsePriceToUSDC,\n getUSDCAddress,\n parsePaymentSignature,\n} from \"./utils\";\n\nexport interface MiddlewareContext {\n config: PaymentConfig;\n routes: PaymentRoutes;\n tokenDetector?: (address: string, network: string) => Promise<TokenInfo | null>;\n createResponse?: (body: any, options: { status: number; headers?: Record<string, string> }) => any;\n getHeader?: (request: any, name: string) => string | null;\n}\n\n/**\n * Extract payment envelope from request headers\n */\nexport function extractPaymentEnvelope(\n request: any,\n getHeader?: (req: any, name: string) => string | null\n): PaymentEnvelope | null {\n const headerGetter = getHeader || ((req, name) => {\n // Support Next.js, Express, and standard Request objects\n if (req.headers?.get) return req.headers.get(name);\n if (req.headers?.[name]) return req.headers[name];\n if (req.header) return req.header(name);\n return null;\n });\n\n // Try V2 header first (PAYMENT-SIGNATURE)\n let paymentHeader = headerGetter(request, \"payment-signature\");\n\n // Fallback to deprecated X-Payment for backward compatibility\n if (!paymentHeader) {\n paymentHeader = headerGetter(request, \"x-payment\");\n }\n\n if (!paymentHeader) {\n return null;\n }\n\n return parsePaymentSignature(paymentHeader);\n}\n\n/**\n * Verify payment with facilitator\n */\nexport async function verifyPayment(\n envelope: PaymentEnvelope,\n route: string,\n ctx: MiddlewareContext\n): Promise<PaymentVerificationResult> {\n const routePrice = ctx.routes[route];\n if (routePrice === undefined) {\n return {\n isValid: false,\n invalidReason: `Route ${route} not configured for payment`,\n };\n }\n\n // Verify network matches\n const envelopeNetwork = toLegacyNetwork(envelope.network);\n const expectedNetwork = ctx.config.network;\n\n if (envelopeNetwork !== expectedNetwork) {\n return {\n isValid: false,\n invalidReason: `Network mismatch. Expected ${expectedNetwork}, got ${envelopeNetwork}`,\n };\n }\n\n // Verify recipient address\n if (envelope.authorization.to.toLowerCase() !== ctx.config.payTo.toLowerCase()) {\n return {\n isValid: false,\n invalidReason: `Recipient mismatch. Expected ${ctx.config.payTo}, got ${envelope.authorization.to}`,\n };\n }\n\n // Build verification request\n const priceString = `$${routePrice}`;\n const priceAmount = parsePriceToUSDC(priceString);\n const usdcAddress = getUSDCAddress(ctx.config.network);\n\n // Detect token info for EIP-712 domain\n let tokenName = \"USD Coin\";\n if (ctx.tokenDetector) {\n try {\n const tokenInfo = await ctx.tokenDetector(usdcAddress, ctx.config.network);\n if (tokenInfo?.name) {\n tokenName = tokenInfo.name;\n }\n } catch {\n // Use default token name\n }\n }\n\n // Call facilitator verify endpoint\n const verifyUrl = `${ctx.config.facilitatorUrl}/api/v2/x402/verify`;\n\n try {\n const response = await fetch(verifyUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n x402Version: 2,\n paymentRequirements: {\n scheme: \"exact\",\n network: toCAIP2Network(ctx.config.network),\n maxAmountRequired: priceAmount.toString(),\n resource: route,\n description: `Payment for ${route}`,\n mimeType: \"application/json\",\n payTo: ctx.config.payTo,\n maxTimeoutSeconds: 30,\n asset: usdcAddress,\n extra: { name: tokenName, version: \"2\" },\n },\n paymentPayload: {\n x402Version: 2,\n network: toCAIP2Network(envelope.network),\n scheme: \"exact\",\n payload: envelope,\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as { invalidReason?: string };\n return {\n isValid: false,\n invalidReason: errorData.invalidReason || `Verification failed: ${response.statusText}`,\n };\n }\n\n const result = await response.json() as { isValid?: boolean; payer?: string; invalidReason?: string };\n return {\n isValid: result.isValid || false,\n payer: result.payer,\n invalidReason: result.invalidReason,\n };\n } catch (error) {\n return {\n isValid: false,\n invalidReason: `Facilitator unavailable at ${ctx.config.facilitatorUrl}`,\n };\n }\n}\n\n/**\n * Settle payment with facilitator\n */\nexport async function settlePayment(\n envelope: PaymentEnvelope,\n ctx: MiddlewareContext\n): Promise<SettlementResult> {\n const settleUrl = `${ctx.config.facilitatorUrl}/api/v2/x402/settle`;\n const usdcAddress = getUSDCAddress(envelope.network);\n\n // Detect token info\n let tokenName = \"USD Coin\";\n if (ctx.tokenDetector) {\n try {\n const tokenInfo = await ctx.tokenDetector(usdcAddress, envelope.network);\n if (tokenInfo?.name) {\n tokenName = tokenInfo.name;\n }\n } catch {\n // Use default\n }\n }\n\n try {\n const response = await fetch(settleUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n x402Version: 2,\n paymentPayload: {\n x402Version: 2,\n network: toCAIP2Network(envelope.network),\n scheme: \"exact\",\n payload: envelope,\n },\n paymentRequirements: {\n scheme: \"exact\",\n network: toCAIP2Network(envelope.network),\n maxAmountRequired: envelope.authorization.value,\n resource: \"\",\n description: \"Payment settlement\",\n mimeType: \"application/json\",\n payTo: envelope.authorization.to,\n maxTimeoutSeconds: 30,\n asset: usdcAddress,\n extra: { name: tokenName, version: \"2\" },\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as { errorReason?: string; error?: string };\n return {\n success: false,\n error: errorData.errorReason || errorData.error || `Settlement failed: ${response.statusText}`,\n };\n }\n\n const result = await response.json() as {\n success?: boolean;\n errorReason?: string;\n error?: string;\n transaction?: string | { hash?: string; transactionHash?: string };\n receipt?: { settlement?: { transaction?: string } };\n transactionHash?: string;\n hash?: string;\n };\n\n if (!result.success) {\n return {\n success: false,\n error: result.errorReason || result.error || \"Settlement failed\",\n };\n }\n\n // Extract transaction hash from various response formats\n const transactionHash =\n (typeof result.transaction === \"string\" ? result.transaction : undefined) ||\n (typeof result.transaction === \"object\" ? result.transaction?.hash : undefined) ||\n (typeof result.transaction === \"object\" ? result.transaction?.transactionHash : undefined) ||\n result.receipt?.settlement?.transaction ||\n result.transactionHash ||\n result.hash ||\n undefined;\n\n return { success: true, transactionHash };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Settlement failed\",\n };\n }\n}\n\n/**\n * Create 402 Payment Required response\n */\nexport function create402Response(\n route: string,\n ctx: MiddlewareContext\n): { body: any; status: number; headers: Record<string, string> } {\n const routePath = route.includes(\" \") ? route.split(\" \")[1] : route;\n const routePrice = ctx.routes[routePath];\n\n if (routePrice === undefined) {\n return {\n body: { error: \"Route not configured for payment\" },\n status: 500,\n headers: {},\n };\n }\n\n const priceAmount = parsePriceToUSDC(`$${routePrice}`);\n const usdcAddress = getUSDCAddress(ctx.config.network);\n\n const paymentRequirements = {\n scheme: \"exact\",\n network: toCAIP2Network(ctx.config.network),\n maxAmountRequired: priceAmount.toString(),\n resource: routePath,\n description: `Payment required for ${routePath}`,\n mimeType: \"application/json\",\n payTo: ctx.config.payTo,\n maxTimeoutSeconds: 30,\n asset: usdcAddress,\n extra: { name: \"USD Coin\", version: \"2\" },\n };\n\n const paymentRequiredHeader = Buffer.from(\n JSON.stringify({ x402Version: 2, accepts: [paymentRequirements] })\n ).toString(\"base64\");\n\n return {\n body: {\n error: \"Payment Required\",\n message: \"Please include PAYMENT-SIGNATURE header with signed payment envelope.\",\n },\n status: 402,\n headers: { \"PAYMENT-REQUIRED\": paymentRequiredHeader },\n };\n}\n\n/**\n * Main middleware function to verify x402 payment\n */\nexport async function verifyX402Payment(\n request: any,\n route: string,\n ctx: MiddlewareContext\n): Promise<X402PaymentResult> {\n const routePath = route.includes(\" \") ? route.split(\" \")[1] : route;\n const routePrice = ctx.routes[routePath];\n\n if (routePrice === undefined) {\n // Route not configured for payment, allow through\n return { isValid: true };\n }\n\n // Extract payment envelope\n const envelope = extractPaymentEnvelope(request, ctx.getHeader);\n if (!envelope) {\n const { body, status, headers } = create402Response(route, ctx);\n const response = ctx.createResponse\n ? ctx.createResponse(body, { status, headers })\n : { body, status, headers };\n return { isValid: false, response };\n }\n\n // Verify payment\n const verification = await verifyPayment(envelope, routePath, ctx);\n if (!verification.isValid) {\n const response = ctx.createResponse\n ? ctx.createResponse(\n { error: \"Payment verification failed\", reason: verification.invalidReason },\n { status: 402 }\n )\n : { error: \"Payment verification failed\", reason: verification.invalidReason, status: 402 };\n return { isValid: false, response };\n }\n\n // Settle payment\n const settlement = await settlePayment(envelope, ctx);\n if (!settlement.success) {\n let errorMessage = settlement.error || \"Payment settlement failed\";\n\n // Provide helpful error messages\n if (errorMessage.includes(\"sponsor wallet\") || errorMessage.includes(\"No sponsor\")) {\n errorMessage = \"Payment settlement failed: No sponsor wallet configured.\";\n } else if (errorMessage.includes(\"authorization is used or canceled\")) {\n errorMessage = \"Payment authorization failed. Please try signing a new payment.\";\n }\n\n const response = ctx.createResponse\n ? ctx.createResponse(\n { error: \"Payment settlement failed\", reason: errorMessage, details: settlement.error },\n { status: 402 }\n )\n : { error: \"Payment settlement failed\", reason: errorMessage, status: 402 };\n return { isValid: false, response };\n }\n\n // Success - return payment response header\n const paymentResponse = {\n success: true,\n transactionHash: settlement.transactionHash,\n network: envelope.network,\n };\n const paymentResponseHeader = Buffer.from(JSON.stringify(paymentResponse)).toString(\"base64\");\n\n return {\n isValid: true,\n payer: verification.payer,\n envelope,\n paymentResponseHeader,\n };\n}\n","/**\n * x402 Next.js Integration\n * Helper functions for Next.js API routes\n */\n\nimport type { PaymentConfig, PaymentRoutes, TokenInfo, X402PaymentResult } from \"./types\";\nimport { verifyX402Payment as baseVerifyX402Payment, type MiddlewareContext } from \"./middleware\";\n\n/**\n * Next.js specific middleware context\n */\nexport interface NextX402Options {\n config: PaymentConfig;\n routes: PaymentRoutes;\n tokenDetector?: (address: string, network: string) => Promise<TokenInfo | null>;\n}\n\n/**\n * Create Next.js response helper\n */\nfunction createNextResponse(body: any, options: { status: number; headers?: Record<string, string> }) {\n // Dynamic import to avoid bundling issues\n const { NextResponse } = require(\"next/server\");\n return NextResponse.json(body, { status: options.status, headers: options.headers });\n}\n\n/**\n * Get header from Next.js request\n */\nfunction getNextHeader(request: any, name: string): string | null {\n return request.headers?.get?.(name) || null;\n}\n\n/**\n * Verify x402 payment in Next.js API route\n *\n * @example\n * ```typescript\n * import { verifyX402Payment } from \"@perkos/x402-core/next\";\n *\n * export async function POST(request: NextRequest) {\n * const result = await verifyX402Payment(request, \"/api/ai/translate\", {\n * config: x402Config,\n * routes: paymentRoutes,\n * });\n *\n * if (!result.isValid) {\n * return result.response;\n * }\n *\n * // Process request...\n * }\n * ```\n */\nexport async function verifyX402Payment(\n request: any,\n route: string,\n options: NextX402Options\n): Promise<X402PaymentResult> {\n const ctx: MiddlewareContext = {\n config: options.config,\n routes: options.routes,\n tokenDetector: options.tokenDetector,\n createResponse: createNextResponse,\n getHeader: getNextHeader,\n };\n\n return baseVerifyX402Payment(request, route, ctx);\n}\n\n/**\n * Create a configured middleware instance for Next.js\n */\nexport function createX402Middleware(options: NextX402Options) {\n return {\n verify: (request: any, route: string) => verifyX402Payment(request, route, options),\n options,\n };\n}\n"],"mappings":"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","names":["verifyX402Payment"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/middleware.ts","../src/next.ts"],"sourcesContent":["/**\n * x402 Core Constants\n * Network configurations, addresses, and mappings\n */\n\nimport type { Address } from \"viem\";\nimport type { NetworkName, CAIP2Network } from \"./types\";\n\n/**\n * USDC Contract Addresses by Network\n */\nexport const USDC_ADDRESSES: Record<NetworkName, Address> = {\n ethereum: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n avalanche: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n \"avalanche-fuji\": \"0x5425890298aed601595a70AB815c96711a31Bc65\",\n base: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n \"base-sepolia\": \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n celo: \"0xcebA9300f2b948710d2653dD7B07f33A8B32118C\",\n \"celo-sepolia\": \"0x2F25deB3848C207fc8E0c34035B3Ba7fC157602B\",\n};\n\n/**\n * Chain IDs by Network\n */\nexport const CHAIN_IDS: Record<string, number> = {\n ethereum: 1,\n avalanche: 43114,\n \"avalanche-fuji\": 43113,\n base: 8453,\n \"base-sepolia\": 84532,\n celo: 42220,\n \"celo-sepolia\": 11142220,\n // CAIP-2 format support\n \"eip155:1\": 1,\n \"eip155:43114\": 43114,\n \"eip155:43113\": 43113,\n \"eip155:8453\": 8453,\n \"eip155:84532\": 84532,\n \"eip155:42220\": 42220,\n \"eip155:11142220\": 11142220,\n};\n\n/**\n * Network to CAIP-2 mapping\n */\nexport const NETWORK_TO_CAIP2: Record<NetworkName, CAIP2Network> = {\n ethereum: \"eip155:1\",\n avalanche: \"eip155:43114\",\n \"avalanche-fuji\": \"eip155:43113\",\n base: \"eip155:8453\",\n \"base-sepolia\": \"eip155:84532\",\n celo: \"eip155:42220\",\n \"celo-sepolia\": \"eip155:11142220\",\n};\n\n/**\n * CAIP-2 to Network mapping\n */\nexport const CAIP2_TO_NETWORK: Record<string, NetworkName> = {\n \"eip155:1\": \"ethereum\",\n \"eip155:43114\": \"avalanche\",\n \"eip155:43113\": \"avalanche-fuji\",\n \"eip155:8453\": \"base\",\n \"eip155:84532\": \"base-sepolia\",\n \"eip155:42220\": \"celo\",\n \"eip155:11142220\": \"celo-sepolia\",\n};\n\n/**\n * Default RPC URLs by Network\n */\nexport const DEFAULT_RPC_URLS: Record<NetworkName, string> = {\n ethereum: \"https://eth.llamarpc.com\",\n avalanche: \"https://api.avax.network/ext/bc/C/rpc\",\n \"avalanche-fuji\": \"https://api.avax-test.network/ext/bc/C/rpc\",\n base: \"https://mainnet.base.org\",\n \"base-sepolia\": \"https://sepolia.base.org\",\n celo: \"https://forno.celo.org\",\n \"celo-sepolia\": \"https://forno.celo-sepolia.celo-testnet.org\",\n};\n\n/**\n * Valid network names\n */\nexport const VALID_NETWORKS: NetworkName[] = [\n \"ethereum\",\n \"base\",\n \"base-sepolia\",\n \"avalanche\",\n \"avalanche-fuji\",\n \"celo\",\n \"celo-sepolia\",\n];\n\n/**\n * EIP-712 Domain Versions by Network\n * Different USDC deployments use different domain versions:\n * - FiatTokenV2_2 (newer): version \"2\" (Ethereum, Base, Avalanche)\n * - FiatTokenV2_1 (older): version \"2\"\n * - Some chains may use version \"1\"\n *\n * Note: Celo native USDC uses version \"2\"\n */\nexport const DOMAIN_VERSIONS: Record<string, string> = {\n ethereum: \"2\",\n avalanche: \"2\",\n \"avalanche-fuji\": \"2\",\n base: \"2\",\n \"base-sepolia\": \"2\",\n celo: \"1\", // Celo native USDC uses version \"1\"\n \"celo-sepolia\": \"1\",\n // CAIP-2 format support\n \"eip155:1\": \"2\",\n \"eip155:43114\": \"2\",\n \"eip155:43113\": \"2\",\n \"eip155:8453\": \"2\",\n \"eip155:84532\": \"2\",\n \"eip155:42220\": \"1\", // Celo\n \"eip155:11142220\": \"1\", // Celo Sepolia\n};\n\n/**\n * Get EIP-712 domain version for a network\n */\nexport function getDomainVersion(network: string): string {\n return DOMAIN_VERSIONS[network] || \"2\";\n}\n\n/**\n * EIP-712 TransferWithAuthorization types\n */\nexport const TRANSFER_WITH_AUTHORIZATION_TYPES = {\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 * x402 Core Utilities\n * Helper functions for x402 payment processing\n */\n\nimport { parseUnits } from \"viem\";\nimport type { Address } from \"viem\";\nimport type { NetworkName, PaymentEnvelope } from \"./types\";\nimport {\n USDC_ADDRESSES,\n CHAIN_IDS,\n NETWORK_TO_CAIP2,\n CAIP2_TO_NETWORK,\n DEFAULT_RPC_URLS,\n getDomainVersion,\n} from \"./constants\";\n\n/**\n * Get USDC address for a network\n */\nexport function getUSDCAddress(network: string): Address {\n const legacyNetwork = toLegacyNetwork(network);\n return USDC_ADDRESSES[legacyNetwork as NetworkName] || USDC_ADDRESSES.avalanche;\n}\n\n/**\n * Get chain ID for a network\n */\nexport function getChainId(network: string): number {\n return CHAIN_IDS[network] || CHAIN_IDS.avalanche;\n}\n\n/**\n * Get RPC URL for a network (with environment variable override support)\n */\nexport function getRpcUrl(network: string, envOverrides?: Record<string, string | undefined>): string {\n const legacyNetwork = toLegacyNetwork(network);\n\n // Check for environment variable overrides\n if (envOverrides) {\n const envKey = `${legacyNetwork.toUpperCase().replace(/-/g, \"_\")}_RPC_URL`;\n if (envOverrides[envKey]) {\n return envOverrides[envKey]!;\n }\n }\n\n return DEFAULT_RPC_URLS[legacyNetwork as NetworkName] || DEFAULT_RPC_URLS.avalanche;\n}\n\n/**\n * Convert network name to CAIP-2 format for x402 V2\n * e.g., \"base-sepolia\" → \"eip155:84532\"\n */\nexport function toCAIP2Network(network: string): string {\n if (network.includes(\":\")) {\n return network;\n }\n return NETWORK_TO_CAIP2[network as NetworkName] || network;\n}\n\n/**\n * Convert CAIP-2 network format to legacy format\n * e.g., \"eip155:43114\" → \"avalanche\"\n */\nexport function toLegacyNetwork(network: string): string {\n if (!network.includes(\":\")) {\n return network;\n }\n return CAIP2_TO_NETWORK[network] || \"avalanche\";\n}\n\n/**\n * Parse USD price string to USDC amount (6 decimals)\n * e.g., \"$0.05\" → 50000n\n */\nexport function parsePriceToUSDC(price: string): bigint {\n const numericPrice = price.replace(\"$\", \"\").trim();\n const amount = parseFloat(numericPrice);\n return parseUnits(amount.toString(), 6);\n}\n\n/**\n * Format USDC amount to USD string\n * e.g., 50000n → \"$0.05\"\n */\nexport function formatUSDCToPrice(amount: bigint): string {\n const value = Number(amount) / 1_000_000;\n return `$${value.toFixed(2)}`;\n}\n\n/**\n * Generate random nonce for payment (32 bytes)\n */\nexport function generateNonce(): `0x${string}` {\n const randomBytes = new Uint8Array(32);\n crypto.getRandomValues(randomBytes);\n return `0x${Array.from(randomBytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\")}` as `0x${string}`;\n}\n\n/**\n * Create EIP-712 domain for token transferWithAuthorization\n * Uses network-specific version (some chains use \"1\", others use \"2\")\n */\nexport function createEIP712Domain(\n network: string,\n tokenAddress?: Address,\n tokenName?: string,\n version?: string\n) {\n const address = tokenAddress || getUSDCAddress(network);\n const name = tokenName || \"USD Coin\";\n const domainVersion = version || getDomainVersion(network);\n\n return {\n name,\n version: domainVersion,\n chainId: getChainId(network),\n verifyingContract: address,\n };\n}\n\n/**\n * Format payment payload for x402 v2 PAYMENT-SIGNATURE header\n * Per spec: https://www.x402.org/writing/x402-v2-launch\n */\nexport function formatPaymentSignature(\n envelope: PaymentEnvelope,\n network: string,\n encodeBase64: boolean = true\n): string {\n const paymentPayload = {\n x402Version: 2,\n scheme: \"exact\",\n network: toCAIP2Network(network),\n payload: envelope,\n };\n\n const jsonString = JSON.stringify(paymentPayload);\n\n if (encodeBase64) {\n return Buffer.from(jsonString).toString(\"base64\");\n }\n return jsonString;\n}\n\n/**\n * Parse payment signature from header\n */\nexport function parsePaymentSignature(header: string): PaymentEnvelope | null {\n try {\n let parsed: any;\n\n // Try base64 first (V2 standard)\n try {\n const decoded = Buffer.from(header, \"base64\").toString(\"utf-8\");\n parsed = JSON.parse(decoded);\n } catch {\n // Fallback to direct JSON\n parsed = JSON.parse(header);\n }\n\n // x402 v2 format: extract envelope from payload\n if (parsed.x402Version === 2 && parsed.payload) {\n return parsed.payload as PaymentEnvelope;\n }\n\n // V1 format or direct envelope\n return parsed as PaymentEnvelope;\n } catch {\n return null;\n }\n}\n\n/**\n * Validate network name\n */\nexport function isValidNetwork(network: string): network is NetworkName {\n return network in NETWORK_TO_CAIP2;\n}\n\n/**\n * Get valid before timestamp (default: 30 minutes from now)\n */\nexport function getValidBefore(minutes: number = 30): string {\n return String(Math.floor(Date.now() / 1000) + minutes * 60);\n}\n\n/**\n * Get valid after timestamp (default: now)\n */\nexport function getValidAfter(): string {\n return String(Math.floor(Date.now() / 1000));\n}\n","/**\n * x402 Payment Middleware\n * Payment verification and settlement for API routes\n */\n\nimport type {\n PaymentEnvelope,\n PaymentVerificationResult,\n X402PaymentResult,\n PaymentConfig,\n PaymentRoutes,\n TokenInfo,\n SettlementResult,\n} from \"./types\";\nimport {\n toCAIP2Network,\n toLegacyNetwork,\n parsePriceToUSDC,\n getUSDCAddress,\n parsePaymentSignature,\n} from \"./utils\";\n\nexport interface MiddlewareContext {\n config: PaymentConfig;\n routes: PaymentRoutes;\n tokenDetector?: (address: string, network: string) => Promise<TokenInfo | null>;\n createResponse?: (body: any, options: { status: number; headers?: Record<string, string> }) => any;\n getHeader?: (request: any, name: string) => string | null;\n}\n\n/**\n * Extract payment envelope from request headers\n */\nexport function extractPaymentEnvelope(\n request: any,\n getHeader?: (req: any, name: string) => string | null\n): PaymentEnvelope | null {\n const headerGetter = getHeader || ((req, name) => {\n // Support Next.js, Express, and standard Request objects\n if (req.headers?.get) return req.headers.get(name);\n if (req.headers?.[name]) return req.headers[name];\n if (req.header) return req.header(name);\n return null;\n });\n\n // Try V2 header first (PAYMENT-SIGNATURE)\n let paymentHeader = headerGetter(request, \"payment-signature\");\n\n // Fallback to deprecated X-Payment for backward compatibility\n if (!paymentHeader) {\n paymentHeader = headerGetter(request, \"x-payment\");\n }\n\n if (!paymentHeader) {\n return null;\n }\n\n return parsePaymentSignature(paymentHeader);\n}\n\n/**\n * Verify payment with facilitator\n */\nexport async function verifyPayment(\n envelope: PaymentEnvelope,\n route: string,\n ctx: MiddlewareContext\n): Promise<PaymentVerificationResult> {\n const routePrice = ctx.routes[route];\n if (routePrice === undefined) {\n return {\n isValid: false,\n invalidReason: `Route ${route} not configured for payment`,\n };\n }\n\n // Verify network matches\n const envelopeNetwork = toLegacyNetwork(envelope.network);\n const expectedNetwork = ctx.config.network;\n\n if (envelopeNetwork !== expectedNetwork) {\n return {\n isValid: false,\n invalidReason: `Network mismatch. Expected ${expectedNetwork}, got ${envelopeNetwork}`,\n };\n }\n\n // Verify recipient address\n if (envelope.authorization.to.toLowerCase() !== ctx.config.payTo.toLowerCase()) {\n return {\n isValid: false,\n invalidReason: `Recipient mismatch. Expected ${ctx.config.payTo}, got ${envelope.authorization.to}`,\n };\n }\n\n // Build verification request\n const priceString = `$${routePrice}`;\n const priceAmount = parsePriceToUSDC(priceString);\n const usdcAddress = getUSDCAddress(ctx.config.network);\n\n // Detect token info for EIP-712 domain\n let tokenName = \"USD Coin\";\n if (ctx.tokenDetector) {\n try {\n const tokenInfo = await ctx.tokenDetector(usdcAddress, ctx.config.network);\n if (tokenInfo?.name) {\n tokenName = tokenInfo.name;\n }\n } catch {\n // Use default token name\n }\n }\n\n // Call facilitator verify endpoint\n const verifyUrl = `${ctx.config.facilitatorUrl}/api/v2/x402/verify`;\n\n try {\n const response = await fetch(verifyUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n x402Version: 2,\n paymentRequirements: {\n scheme: \"exact\",\n network: toCAIP2Network(ctx.config.network),\n maxAmountRequired: priceAmount.toString(),\n resource: route,\n description: `Payment for ${route}`,\n mimeType: \"application/json\",\n payTo: ctx.config.payTo,\n maxTimeoutSeconds: 30,\n asset: usdcAddress,\n extra: { name: tokenName, version: \"2\" },\n },\n paymentPayload: {\n x402Version: 2,\n network: toCAIP2Network(envelope.network),\n scheme: \"exact\",\n payload: envelope,\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as { invalidReason?: string };\n return {\n isValid: false,\n invalidReason: errorData.invalidReason || `Verification failed: ${response.statusText}`,\n };\n }\n\n const result = await response.json() as { isValid?: boolean; payer?: string; invalidReason?: string };\n return {\n isValid: result.isValid || false,\n payer: result.payer,\n invalidReason: result.invalidReason,\n };\n } catch (error) {\n return {\n isValid: false,\n invalidReason: `Facilitator unavailable at ${ctx.config.facilitatorUrl}`,\n };\n }\n}\n\n/**\n * Settle payment with facilitator\n */\nexport async function settlePayment(\n envelope: PaymentEnvelope,\n ctx: MiddlewareContext\n): Promise<SettlementResult> {\n const settleUrl = `${ctx.config.facilitatorUrl}/api/v2/x402/settle`;\n const usdcAddress = getUSDCAddress(envelope.network);\n\n // Detect token info\n let tokenName = \"USD Coin\";\n if (ctx.tokenDetector) {\n try {\n const tokenInfo = await ctx.tokenDetector(usdcAddress, envelope.network);\n if (tokenInfo?.name) {\n tokenName = tokenInfo.name;\n }\n } catch {\n // Use default\n }\n }\n\n try {\n const response = await fetch(settleUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n x402Version: 2,\n paymentPayload: {\n x402Version: 2,\n network: toCAIP2Network(envelope.network),\n scheme: \"exact\",\n payload: envelope,\n },\n paymentRequirements: {\n scheme: \"exact\",\n network: toCAIP2Network(envelope.network),\n maxAmountRequired: envelope.authorization.value,\n resource: \"\",\n description: \"Payment settlement\",\n mimeType: \"application/json\",\n payTo: envelope.authorization.to,\n maxTimeoutSeconds: 30,\n asset: usdcAddress,\n extra: { name: tokenName, version: \"2\" },\n },\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({})) as { errorReason?: string; error?: string };\n return {\n success: false,\n error: errorData.errorReason || errorData.error || `Settlement failed: ${response.statusText}`,\n };\n }\n\n const result = await response.json() as {\n success?: boolean;\n errorReason?: string;\n error?: string;\n transaction?: string | { hash?: string; transactionHash?: string };\n receipt?: { settlement?: { transaction?: string } };\n transactionHash?: string;\n hash?: string;\n };\n\n if (!result.success) {\n return {\n success: false,\n error: result.errorReason || result.error || \"Settlement failed\",\n };\n }\n\n // Extract transaction hash from various response formats\n const transactionHash =\n (typeof result.transaction === \"string\" ? result.transaction : undefined) ||\n (typeof result.transaction === \"object\" ? result.transaction?.hash : undefined) ||\n (typeof result.transaction === \"object\" ? result.transaction?.transactionHash : undefined) ||\n result.receipt?.settlement?.transaction ||\n result.transactionHash ||\n result.hash ||\n undefined;\n\n return { success: true, transactionHash };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Settlement failed\",\n };\n }\n}\n\n/**\n * Create 402 Payment Required response\n */\nexport function create402Response(\n route: string,\n ctx: MiddlewareContext\n): { body: any; status: number; headers: Record<string, string> } {\n const routePath = route.includes(\" \") ? route.split(\" \")[1] : route;\n const routePrice = ctx.routes[routePath];\n\n if (routePrice === undefined) {\n return {\n body: { error: \"Route not configured for payment\" },\n status: 500,\n headers: {},\n };\n }\n\n const priceAmount = parsePriceToUSDC(`$${routePrice}`);\n const usdcAddress = getUSDCAddress(ctx.config.network);\n\n const paymentRequirements = {\n scheme: \"exact\",\n network: toCAIP2Network(ctx.config.network),\n maxAmountRequired: priceAmount.toString(),\n resource: routePath,\n description: `Payment required for ${routePath}`,\n mimeType: \"application/json\",\n payTo: ctx.config.payTo,\n maxTimeoutSeconds: 30,\n asset: usdcAddress,\n extra: { name: \"USD Coin\", version: \"2\" },\n };\n\n const paymentRequiredHeader = Buffer.from(\n JSON.stringify({ x402Version: 2, accepts: [paymentRequirements] })\n ).toString(\"base64\");\n\n return {\n body: {\n error: \"Payment Required\",\n message: \"Please include PAYMENT-SIGNATURE header with signed payment envelope.\",\n },\n status: 402,\n headers: { \"PAYMENT-REQUIRED\": paymentRequiredHeader },\n };\n}\n\n/**\n * Main middleware function to verify x402 payment\n */\nexport async function verifyX402Payment(\n request: any,\n route: string,\n ctx: MiddlewareContext\n): Promise<X402PaymentResult> {\n const routePath = route.includes(\" \") ? route.split(\" \")[1] : route;\n const routePrice = ctx.routes[routePath];\n\n if (routePrice === undefined) {\n // Route not configured for payment, allow through\n return { isValid: true };\n }\n\n // Extract payment envelope\n const envelope = extractPaymentEnvelope(request, ctx.getHeader);\n if (!envelope) {\n const { body, status, headers } = create402Response(route, ctx);\n const response = ctx.createResponse\n ? ctx.createResponse(body, { status, headers })\n : { body, status, headers };\n return { isValid: false, response };\n }\n\n // Verify payment\n const verification = await verifyPayment(envelope, routePath, ctx);\n if (!verification.isValid) {\n const response = ctx.createResponse\n ? ctx.createResponse(\n { error: \"Payment verification failed\", reason: verification.invalidReason },\n { status: 402 }\n )\n : { error: \"Payment verification failed\", reason: verification.invalidReason, status: 402 };\n return { isValid: false, response };\n }\n\n // Settle payment\n const settlement = await settlePayment(envelope, ctx);\n if (!settlement.success) {\n let errorMessage = settlement.error || \"Payment settlement failed\";\n\n // Provide helpful error messages\n if (errorMessage.includes(\"sponsor wallet\") || errorMessage.includes(\"No sponsor\")) {\n errorMessage = \"Payment settlement failed: No sponsor wallet configured.\";\n } else if (errorMessage.includes(\"authorization is used or canceled\")) {\n errorMessage = \"Payment authorization failed. Please try signing a new payment.\";\n }\n\n const response = ctx.createResponse\n ? ctx.createResponse(\n { error: \"Payment settlement failed\", reason: errorMessage, details: settlement.error },\n { status: 402 }\n )\n : { error: \"Payment settlement failed\", reason: errorMessage, status: 402 };\n return { isValid: false, response };\n }\n\n // Success - return payment response header\n const paymentResponse = {\n success: true,\n transactionHash: settlement.transactionHash,\n network: envelope.network,\n };\n const paymentResponseHeader = Buffer.from(JSON.stringify(paymentResponse)).toString(\"base64\");\n\n return {\n isValid: true,\n payer: verification.payer,\n envelope,\n paymentResponseHeader,\n };\n}\n","/**\n * x402 Next.js Integration\n * Helper functions for Next.js API routes\n */\n\nimport type { PaymentConfig, PaymentRoutes, TokenInfo, X402PaymentResult } from \"./types\";\nimport { verifyX402Payment as baseVerifyX402Payment, type MiddlewareContext } from \"./middleware\";\n\n/**\n * Next.js specific middleware context\n */\nexport interface NextX402Options {\n config: PaymentConfig;\n routes: PaymentRoutes;\n tokenDetector?: (address: string, network: string) => Promise<TokenInfo | null>;\n}\n\n/**\n * Create Next.js response helper\n */\nfunction createNextResponse(body: any, options: { status: number; headers?: Record<string, string> }) {\n // Dynamic import to avoid bundling issues\n const { NextResponse } = require(\"next/server\");\n return NextResponse.json(body, { status: options.status, headers: options.headers });\n}\n\n/**\n * Get header from Next.js request\n */\nfunction getNextHeader(request: any, name: string): string | null {\n return request.headers?.get?.(name) || null;\n}\n\n/**\n * Verify x402 payment in Next.js API route\n *\n * @example\n * ```typescript\n * import { verifyX402Payment } from \"@perkos/x402-core/next\";\n *\n * export async function POST(request: NextRequest) {\n * const result = await verifyX402Payment(request, \"/api/ai/translate\", {\n * config: x402Config,\n * routes: paymentRoutes,\n * });\n *\n * if (!result.isValid) {\n * return result.response;\n * }\n *\n * // Process request...\n * }\n * ```\n */\nexport async function verifyX402Payment(\n request: any,\n route: string,\n options: NextX402Options\n): Promise<X402PaymentResult> {\n const ctx: MiddlewareContext = {\n config: options.config,\n routes: options.routes,\n tokenDetector: options.tokenDetector,\n createResponse: createNextResponse,\n getHeader: getNextHeader,\n };\n\n return baseVerifyX402Payment(request, route, ctx);\n}\n\n/**\n * Create a configured middleware instance for Next.js\n */\nexport function createX402Middleware(options: NextX402Options) {\n return {\n verify: (request: any, route: string) => verifyX402Payment(request, route, options),\n options,\n };\n}\n"],"mappings":"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","names":["verifyX402Payment"]}
|