aptos-x402 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +716 -0
  3. package/dist/aptos-utils.d.ts +46 -0
  4. package/dist/aptos-utils.d.ts.map +1 -0
  5. package/dist/aptos-utils.js +144 -0
  6. package/dist/aptos-utils.js.map +1 -0
  7. package/dist/facilitator-client.d.ts +89 -0
  8. package/dist/facilitator-client.d.ts.map +1 -0
  9. package/dist/facilitator-client.js +140 -0
  10. package/dist/facilitator-client.js.map +1 -0
  11. package/dist/index.d.ts +58 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +62 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/server/index.d.ts +8 -0
  16. package/dist/server/index.d.ts.map +1 -0
  17. package/dist/server/index.js +8 -0
  18. package/dist/server/index.js.map +1 -0
  19. package/dist/server/next.d.ts +44 -0
  20. package/dist/server/next.d.ts.map +1 -0
  21. package/dist/server/next.js +210 -0
  22. package/dist/server/next.js.map +1 -0
  23. package/dist/types/config.d.ts +43 -0
  24. package/dist/types/config.d.ts.map +1 -0
  25. package/dist/types/config.js +6 -0
  26. package/dist/types/config.js.map +1 -0
  27. package/dist/types/index.d.ts +9 -0
  28. package/dist/types/index.d.ts.map +1 -0
  29. package/dist/types/index.js +7 -0
  30. package/dist/types/index.js.map +1 -0
  31. package/dist/types/protocol.d.ts +119 -0
  32. package/dist/types/protocol.d.ts.map +1 -0
  33. package/dist/types/protocol.js +12 -0
  34. package/dist/types/protocol.js.map +1 -0
  35. package/dist/utils.d.ts +3 -0
  36. package/dist/utils.d.ts.map +1 -0
  37. package/dist/utils.js +6 -0
  38. package/dist/utils.js.map +1 -0
  39. package/dist/x402-axios.d.ts +117 -0
  40. package/dist/x402-axios.d.ts.map +1 -0
  41. package/dist/x402-axios.js +310 -0
  42. package/dist/x402-axios.js.map +1 -0
  43. package/dist/x402-client.d.ts +56 -0
  44. package/dist/x402-client.d.ts.map +1 -0
  45. package/dist/x402-client.js +209 -0
  46. package/dist/x402-client.js.map +1 -0
  47. package/dist/x402-fetch.d.ts +59 -0
  48. package/dist/x402-fetch.d.ts.map +1 -0
  49. package/dist/x402-fetch.js +167 -0
  50. package/dist/x402-fetch.js.map +1 -0
  51. package/dist/x402-middleware.d.ts +9 -0
  52. package/dist/x402-middleware.d.ts.map +1 -0
  53. package/dist/x402-middleware.js +177 -0
  54. package/dist/x402-middleware.js.map +1 -0
  55. package/dist/x402-protocol-types.d.ts +115 -0
  56. package/dist/x402-protocol-types.d.ts.map +1 -0
  57. package/dist/x402-protocol-types.js +12 -0
  58. package/dist/x402-protocol-types.js.map +1 -0
  59. package/dist/x402-request.d.ts +57 -0
  60. package/dist/x402-request.d.ts.map +1 -0
  61. package/dist/x402-request.js +167 -0
  62. package/dist/x402-request.js.map +1 -0
  63. package/dist/x402-types.d.ts +18 -0
  64. package/dist/x402-types.d.ts.map +1 -0
  65. package/dist/x402-types.js +6 -0
  66. package/dist/x402-types.js.map +1 -0
  67. package/package.json +99 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-fetch.d.ts","sourceRoot":"","sources":["../lib/x402-fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAUH,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC3C,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,gDAAgD;IAChD,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,KAAK,CAuJrE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBzC"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * x402 Fetch Wrapper for Aptos
3
+ *
4
+ * Drop-in replacement for fetch() that automatically handles x402 payments
5
+ *
6
+ * Usage:
7
+ * ```typescript
8
+ * import { createX402Fetch } from '@adipundir/aptos-x402';
9
+ *
10
+ * const fetch402 = createX402Fetch({
11
+ * privateKey: process.env.PRIVATE_KEY!,
12
+ * network: 'testnet'
13
+ * });
14
+ *
15
+ * // Use it like regular fetch - payment is automatic!
16
+ * const response = await fetch402('https://api.example.com/premium-data');
17
+ * const data = await response.json();
18
+ * ```
19
+ */
20
+ import { Account, Aptos, AptosConfig, Network, Ed25519PrivateKey, } from "@aptos-labs/ts-sdk";
21
+ /**
22
+ * Create an x402-enabled fetch function
23
+ */
24
+ export function createX402Fetch(config) {
25
+ // Map string network names to SDK Network enum
26
+ const networkMap = {
27
+ 'testnet': Network.TESTNET,
28
+ 'mainnet': Network.MAINNET,
29
+ 'devnet': Network.DEVNET,
30
+ };
31
+ const network = networkMap[config.network || 'testnet'];
32
+ const aptosConfig = config.nodeUrl
33
+ ? new AptosConfig({ network, fullnode: config.nodeUrl })
34
+ : new AptosConfig({ network });
35
+ const aptos = new Aptos(aptosConfig);
36
+ // Create account from private key
37
+ const privateKey = new Ed25519PrivateKey(config.privateKey);
38
+ const account = Account.fromPrivateKey({ privateKey });
39
+ const log = (...args) => {
40
+ if (config.debug) {
41
+ console.log('[x402-fetch]', ...args);
42
+ }
43
+ };
44
+ /**
45
+ * x402-enabled fetch function
46
+ * Drop-in replacement for native fetch that handles payments automatically
47
+ */
48
+ async function fetch402(input, init) {
49
+ const url = input.toString();
50
+ log(`Making request to: ${url}`);
51
+ // Step 1: Make initial request
52
+ const initialResponse = await fetch(input, init);
53
+ // If not 402, return immediately (no payment required)
54
+ if (initialResponse.status !== 402) {
55
+ log(`Status ${initialResponse.status} - no payment required`);
56
+ return initialResponse;
57
+ }
58
+ log(`Received 402 Payment Required`);
59
+ // Step 2: Parse payment requirements from 402 response
60
+ const paymentResponse = await initialResponse.json();
61
+ // Extract payment requirements (supports both formats)
62
+ const paymentReqs = paymentResponse.accepts?.[0] || paymentResponse;
63
+ const recipient = paymentReqs.payTo || paymentReqs.paymentAddress;
64
+ const amount = paymentReqs.maxAmountRequired || paymentReqs.price;
65
+ const networkId = paymentReqs.network || `aptos-${config.network || 'testnet'}`;
66
+ if (!recipient || !amount) {
67
+ throw new Error('Invalid 402 response: missing payment requirements');
68
+ }
69
+ log(`Payment required: ${amount} Octas to ${recipient}`);
70
+ // Step 3: Build payment transaction
71
+ log(`Building transaction...`);
72
+ const transaction = await aptos.transaction.build.simple({
73
+ sender: account.accountAddress,
74
+ data: {
75
+ function: "0x1::aptos_account::transfer",
76
+ functionArguments: [recipient, amount],
77
+ },
78
+ });
79
+ // Step 4: Sign transaction
80
+ log(`Signing transaction...`);
81
+ const senderAuthenticator = aptos.transaction.sign({
82
+ signer: account,
83
+ transaction
84
+ });
85
+ // Step 5: Serialize transaction and signature separately (per Aptos x402 spec)
86
+ const transactionBytes = transaction.bcsToBytes();
87
+ const signatureBytes = senderAuthenticator.bcsToBytes();
88
+ const transactionBase64 = Buffer.from(transactionBytes).toString('base64');
89
+ const signatureBase64 = Buffer.from(signatureBytes).toString('base64');
90
+ // Step 6: Create x402 PaymentPayload
91
+ const paymentPayload = {
92
+ x402Version: 1,
93
+ scheme: "exact",
94
+ network: networkId,
95
+ payload: {
96
+ transaction: transactionBase64,
97
+ signature: signatureBase64,
98
+ },
99
+ };
100
+ // Step 7: Encode as base64 for X-PAYMENT header
101
+ const paymentHeader = Buffer.from(JSON.stringify(paymentPayload)).toString('base64');
102
+ log(`Payment header created (${paymentHeader.length} chars)`);
103
+ // Step 8: Retry request with X-PAYMENT header
104
+ log(`Retrying with payment...`);
105
+ const paidResponse = await fetch(input, {
106
+ ...init,
107
+ headers: {
108
+ ...init?.headers,
109
+ 'X-PAYMENT': paymentHeader,
110
+ },
111
+ });
112
+ // Step 9: Extract payment info from X-Payment-Response header
113
+ let paymentInfo;
114
+ const paymentResponseHeader = paidResponse.headers.get('x-payment-response');
115
+ if (paymentResponseHeader) {
116
+ try {
117
+ const decoded = JSON.parse(Buffer.from(paymentResponseHeader, 'base64').toString('utf-8'));
118
+ const settlement = decoded.settlement;
119
+ if (settlement && settlement.txHash) {
120
+ paymentInfo = {
121
+ transactionHash: settlement.txHash,
122
+ amountOctas: amount,
123
+ amountAPT: parseInt(amount) / 100000000,
124
+ recipient: recipient,
125
+ network: settlement.networkId || networkId,
126
+ settled: settlement.success === true,
127
+ };
128
+ log(`Payment settled: ${paymentInfo.transactionHash}`);
129
+ }
130
+ }
131
+ catch (error) {
132
+ log('Failed to parse payment response header:', error);
133
+ }
134
+ }
135
+ // Attach payment info to response
136
+ const enhancedResponse = paidResponse;
137
+ enhancedResponse.paymentInfo = paymentInfo;
138
+ log(`Request completed with status ${paidResponse.status}`);
139
+ return enhancedResponse;
140
+ }
141
+ return fetch402;
142
+ }
143
+ /**
144
+ * Get account balance helper
145
+ */
146
+ export async function getAccountBalance(config) {
147
+ const networkMap = {
148
+ 'testnet': Network.TESTNET,
149
+ 'mainnet': Network.MAINNET,
150
+ 'devnet': Network.DEVNET,
151
+ };
152
+ const network = networkMap[config.network || 'testnet'];
153
+ const aptosConfig = config.nodeUrl
154
+ ? new AptosConfig({ network, fullnode: config.nodeUrl })
155
+ : new AptosConfig({ network });
156
+ const aptos = new Aptos(aptosConfig);
157
+ const privateKey = new Ed25519PrivateKey(config.privateKey);
158
+ const account = Account.fromPrivateKey({ privateKey });
159
+ const octas = await aptos.getAccountAPTAmount({
160
+ accountAddress: account.accountAddress,
161
+ });
162
+ return {
163
+ octas,
164
+ apt: octas / 100000000,
165
+ };
166
+ }
167
+ //# sourceMappingURL=x402-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-fetch.js","sourceRoot":"","sources":["../lib/x402-fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EACL,OAAO,EACP,KAAK,EACL,WAAW,EACX,OAAO,EACP,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAiC5B;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,+CAA+C;IAC/C,MAAM,UAAU,GAA4B;QAC1C,SAAS,EAAE,OAAO,CAAC,OAAO;QAC1B,SAAS,EAAE,OAAO,CAAC,OAAO;QAC1B,QAAQ,EAAE,OAAO,CAAC,MAAM;KACzB,CAAC;IAEF,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO;QAChC,CAAC,CAAC,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACxD,CAAC,CAAC,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAEjC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;IAErC,kCAAkC;IAClC,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAEvD,MAAM,GAAG,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE;QAC7B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC;IAEF;;;OAGG;IACH,KAAK,UAAU,QAAQ,CACrB,KAA6B,EAC7B,IAAkB;QAElB,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAE7B,GAAG,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;QAEjC,+BAA+B;QAC/B,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAEjD,uDAAuD;QACvD,IAAI,eAAe,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACnC,GAAG,CAAC,UAAU,eAAe,CAAC,MAAM,wBAAwB,CAAC,CAAC;YAC9D,OAAO,eAA+B,CAAC;QACzC,CAAC;QAED,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAErC,uDAAuD;QACvD,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,IAAI,EAAS,CAAC;QAE5D,uDAAuD;QACvD,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC;QACpE,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,cAAc,CAAC;QAClE,MAAM,MAAM,GAAG,WAAW,CAAC,iBAAiB,IAAI,WAAW,CAAC,KAAK,CAAC;QAClE,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,IAAI,SAAS,MAAM,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC;QAEhF,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QAED,GAAG,CAAC,qBAAqB,MAAM,aAAa,SAAS,EAAE,CAAC,CAAC;QAEzD,oCAAoC;QACpC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAC/B,MAAM,WAAW,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;YACvD,MAAM,EAAE,OAAO,CAAC,cAAc;YAC9B,IAAI,EAAE;gBACJ,QAAQ,EAAE,8BAA8B;gBACxC,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;aACvC;SACF,CAAC,CAAC;QAEH,2BAA2B;QAC3B,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAC9B,MAAM,mBAAmB,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;YACjD,MAAM,EAAE,OAAO;YACf,WAAW;SACZ,CAAC,CAAC;QAEH,+EAA+E;QAC/E,MAAM,gBAAgB,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC;QAClD,MAAM,cAAc,GAAG,mBAAmB,CAAC,UAAU,EAAE,CAAC;QAExD,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3E,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAEvE,qCAAqC;QACrC,MAAM,cAAc,GAAG;YACrB,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE;gBACP,WAAW,EAAE,iBAAiB;gBAC9B,SAAS,EAAE,eAAe;aAC3B;SACF,CAAC;QAEF,gDAAgD;QAChD,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAErF,GAAG,CAAC,2BAA2B,aAAa,CAAC,MAAM,SAAS,CAAC,CAAC;QAE9D,8CAA8C;QAC9C,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAChC,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE;YACtC,GAAG,IAAI;YACP,OAAO,EAAE;gBACP,GAAG,IAAI,EAAE,OAAO;gBAChB,WAAW,EAAE,aAAa;aAC3B;SACF,CAAC,CAAC;QAEH,8DAA8D;QAC9D,IAAI,WAAwC,CAAC;QAC7C,MAAM,qBAAqB,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAE7E,IAAI,qBAAqB,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CACxB,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC/D,CAAC;gBAEF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;gBACtC,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;oBACpC,WAAW,GAAG;wBACZ,eAAe,EAAE,UAAU,CAAC,MAAM;wBAClC,WAAW,EAAE,MAAM;wBACnB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS;wBACvC,SAAS,EAAE,SAAS;wBACpB,OAAO,EAAE,UAAU,CAAC,SAAS,IAAI,SAAS;wBAC1C,OAAO,EAAE,UAAU,CAAC,OAAO,KAAK,IAAI;qBACrC,CAAC;oBAEF,GAAG,CAAC,oBAAoB,WAAW,CAAC,eAAe,EAAE,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,kCAAkC;QAClC,MAAM,gBAAgB,GAAG,YAA4B,CAAC;QACtD,gBAAgB,CAAC,WAAW,GAAG,WAAW,CAAC;QAE3C,GAAG,CAAC,iCAAiC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAE5D,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAuB;IAEvB,MAAM,UAAU,GAA4B;QAC1C,SAAS,EAAE,OAAO,CAAC,OAAO;QAC1B,SAAS,EAAE,OAAO,CAAC,OAAO;QAC1B,QAAQ,EAAE,OAAO,CAAC,MAAM;KACzB,CAAC;IAEF,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO;QAChC,CAAC,CAAC,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACxD,CAAC,CAAC,IAAI,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAEjC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IAEvD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,mBAAmB,CAAC;QAC5C,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK;QACL,GAAG,EAAE,KAAK,GAAG,SAAS;KACvB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * x402 Payment Middleware for Aptos
3
+ * Following official Coinbase x402 protocol specification
4
+ * https://github.com/coinbase/x402
5
+ */
6
+ import { NextRequest } from "next/server";
7
+ import type { RouteConfig, FacilitatorConfig } from "./x402-types";
8
+ export declare function paymentMiddleware(recipientAddress: string, routes: Record<string, RouteConfig>, facilitatorConfig: FacilitatorConfig): (request: NextRequest) => Promise<import("undici-types").Response>;
9
+ //# sourceMappingURL=x402-middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-middleware.d.ts","sourceRoot":"","sources":["../lib/x402-middleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAYnE,wBAAgB,iBAAiB,CAC/B,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACnC,iBAAiB,EAAE,iBAAiB,IAEH,SAAS,WAAW,8CA2NtD"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * x402 Payment Middleware for Aptos
3
+ * Following official Coinbase x402 protocol specification
4
+ * https://github.com/coinbase/x402
5
+ */
6
+ import { NextResponse } from "next/server";
7
+ import { X402_VERSION, APTOS_SCHEME, APTOS_TESTNET, APTOS_MAINNET } from "./x402-protocol-types";
8
+ export function paymentMiddleware(recipientAddress, routes, facilitatorConfig) {
9
+ return async function middleware(request) {
10
+ const pathname = request.nextUrl.pathname;
11
+ console.log(`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
12
+ console.log(`[x402 Middleware] Request to: ${pathname}`);
13
+ console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`);
14
+ // Check if this route is protected
15
+ const routeConfig = routes[pathname];
16
+ if (!routeConfig) {
17
+ console.log(`[x402 Middleware] Route not protected, passing through`);
18
+ return NextResponse.next();
19
+ }
20
+ console.log(`[x402 Middleware] ✅ Route is protected`);
21
+ const paymentHeader = request.headers.get("X-PAYMENT");
22
+ // Map network names to full Aptos network identifiers
23
+ const routeNetwork = routeConfig.network;
24
+ const network = routeNetwork === "mainnet"
25
+ ? APTOS_MAINNET
26
+ : routeNetwork === "testnet"
27
+ ? APTOS_TESTNET
28
+ : routeNetwork.startsWith("aptos-")
29
+ ? routeNetwork // Already has aptos- prefix
30
+ : `aptos-${routeNetwork}`;
31
+ const facilitatorUrl = facilitatorConfig.url;
32
+ console.log(`[x402 Middleware] Configuration:`, {
33
+ recipient: recipientAddress,
34
+ price: routeConfig.price,
35
+ network,
36
+ facilitator: facilitatorUrl,
37
+ hasPayment: !!paymentHeader,
38
+ });
39
+ // Validate configuration
40
+ if (!recipientAddress) {
41
+ console.error(`[x402 Middleware] ❌ No recipient address configured`);
42
+ return NextResponse.json({ error: "Server configuration error: Payment recipient not configured" }, { status: 500 });
43
+ }
44
+ // Build payment requirements per x402 spec
45
+ const paymentRequirements = {
46
+ scheme: APTOS_SCHEME,
47
+ network: network,
48
+ maxAmountRequired: routeConfig.price,
49
+ resource: request.url,
50
+ description: routeConfig.config?.description,
51
+ mimeType: routeConfig.config?.mimeType,
52
+ outputSchema: routeConfig.config?.outputSchema,
53
+ payTo: recipientAddress,
54
+ maxTimeoutSeconds: routeConfig.config?.maxTimeoutSeconds,
55
+ extra: null,
56
+ };
57
+ // If no payment provided, return 402 with payment requirements per x402 spec
58
+ if (!paymentHeader) {
59
+ console.log(`[x402 Middleware] 💳 No payment header found, returning 402`);
60
+ const response402 = {
61
+ x402Version: X402_VERSION,
62
+ accepts: [paymentRequirements],
63
+ };
64
+ console.log(`[x402 Middleware] 402 Response (x402 spec):`, response402);
65
+ return NextResponse.json(response402, { status: 402 });
66
+ }
67
+ console.log(`[x402 Middleware] 💰 Payment header found (${paymentHeader.length} chars)`);
68
+ console.log(`[x402 Middleware] Payment preview: ${paymentHeader.substring(0, 50)}...`);
69
+ try {
70
+ // Parse the X-PAYMENT header (base64 encoded PaymentPayload)
71
+ const paymentPayloadJson = Buffer.from(paymentHeader, 'base64').toString('utf-8');
72
+ const paymentPayload = JSON.parse(paymentPayloadJson);
73
+ console.log(`[x402 Middleware] Parsed payment payload:`, {
74
+ x402Version: paymentPayload.x402Version,
75
+ scheme: paymentPayload.scheme,
76
+ network: paymentPayload.network,
77
+ });
78
+ // Validate payment payload format
79
+ if (paymentPayload.x402Version !== X402_VERSION) {
80
+ console.error(`[x402 Middleware] ❌ Unsupported x402 version: ${paymentPayload.x402Version}`);
81
+ return NextResponse.json({ error: `Unsupported x402 version: ${paymentPayload.x402Version}` }, { status: 400 });
82
+ }
83
+ if (paymentPayload.scheme !== APTOS_SCHEME) {
84
+ console.error(`[x402 Middleware] ❌ Unsupported scheme: ${paymentPayload.scheme}`);
85
+ return NextResponse.json({ error: `Unsupported payment scheme: ${paymentPayload.scheme}` }, { status: 400 });
86
+ }
87
+ // Step 1: Verify payment (fast, no blockchain submission)
88
+ console.log(`\n🔍 [x402 Middleware] STEP 1: Verifying payment`);
89
+ console.log(`[x402 Middleware] Calling: ${facilitatorUrl}/verify`);
90
+ const verifyRequest = {
91
+ x402Version: X402_VERSION,
92
+ paymentHeader: paymentHeader,
93
+ paymentRequirements: paymentRequirements,
94
+ };
95
+ const verifyResponse = await fetch(`${facilitatorUrl}/verify`, {
96
+ method: "POST",
97
+ headers: { "Content-Type": "application/json" },
98
+ body: JSON.stringify(verifyRequest),
99
+ });
100
+ const verification = await verifyResponse.json();
101
+ const verificationTime = verifyResponse.headers.get('x-verification-time');
102
+ console.log(`[x402 Middleware] Verification result:`, verification);
103
+ if (verificationTime) {
104
+ console.log(`[x402 Middleware] ⏱️ Verification took ${verificationTime}ms`);
105
+ }
106
+ // Check if payment is valid
107
+ if (!verification.isValid) {
108
+ console.error(`❌ [x402 Middleware] Verification FAILED`);
109
+ console.error(`[x402 Middleware] Reason:`, verification.invalidReason);
110
+ return NextResponse.json({
111
+ error: "Payment verification failed",
112
+ message: verification.invalidReason,
113
+ }, { status: 403 });
114
+ }
115
+ console.log(`✅ [x402 Middleware] Verification SUCCESS`);
116
+ // Step 2: Settle payment BEFORE providing resource
117
+ console.log(`\n💰 [x402 Middleware] STEP 2: Settling payment`);
118
+ console.log(`[x402 Middleware] Calling: ${facilitatorUrl}/settle`);
119
+ const settleRequest = {
120
+ x402Version: X402_VERSION,
121
+ paymentHeader: paymentHeader,
122
+ paymentRequirements: paymentRequirements,
123
+ };
124
+ const settleResponse = await fetch(`${facilitatorUrl}/settle`, {
125
+ method: "POST",
126
+ headers: { "Content-Type": "application/json" },
127
+ body: JSON.stringify(settleRequest),
128
+ });
129
+ const settlement = await settleResponse.json();
130
+ const settlementTime = settleResponse.headers.get('x-settlement-time');
131
+ console.log(`[x402 Middleware] Settlement result:`, settlement);
132
+ if (settlementTime) {
133
+ console.log(`[x402 Middleware] ⏱️ Settlement took ${settlementTime}ms`);
134
+ }
135
+ // Step 3: Only continue if payment settled successfully
136
+ if (!settlement.success) {
137
+ console.error(`\n❌ [x402 Middleware] Settlement FAILED`);
138
+ console.error(`[x402 Middleware] Error:`, settlement.error);
139
+ return NextResponse.json({
140
+ error: "Payment settlement failed",
141
+ message: settlement.error,
142
+ }, { status: 402 } // Payment required - settlement failed
143
+ );
144
+ }
145
+ console.log(`✅ [x402 Middleware] Settlement SUCCESS`);
146
+ console.log(`[x402 Middleware] Transaction hash:`, settlement.txHash);
147
+ // Step 4: Payment settled! Now execute the route handler
148
+ const response = await NextResponse.next();
149
+ // Step 5: Add X-PAYMENT-RESPONSE header per x402 spec
150
+ const responseHeaders = new Headers(response.headers);
151
+ const paymentResponse = {
152
+ settlement: settlement,
153
+ };
154
+ responseHeaders.set("X-Payment-Response", Buffer.from(JSON.stringify(paymentResponse)).toString('base64'));
155
+ // Add timing headers for client debugging
156
+ if (verificationTime) {
157
+ responseHeaders.set('X-Verification-Time', verificationTime);
158
+ }
159
+ if (settlementTime) {
160
+ responseHeaders.set('X-Settlement-Time', settlementTime);
161
+ }
162
+ return new Response(response.body, {
163
+ status: response.status,
164
+ statusText: response.statusText,
165
+ headers: responseHeaders,
166
+ });
167
+ }
168
+ catch (error) {
169
+ console.error(`[x402 Middleware] Error processing payment for ${pathname}:`, error);
170
+ return NextResponse.json({
171
+ error: "Payment processing failed",
172
+ message: error instanceof Error ? error.message : String(error),
173
+ }, { status: 500 });
174
+ }
175
+ };
176
+ }
177
+ //# sourceMappingURL=x402-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-middleware.js","sourceRoot":"","sources":["../lib/x402-middleware.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAe,YAAY,EAAE,MAAM,aAAa,CAAC;AAWxD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEjG,MAAM,UAAU,iBAAiB,CAC/B,gBAAwB,EACxB,MAAmC,EACnC,iBAAoC;IAEpC,OAAO,KAAK,UAAU,UAAU,CAAC,OAAoB;QACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;QAE1C,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAE1D,mCAAmC;QACnC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;YACtE,OAAO,YAAY,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QAEtD,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAEvD,sDAAsD;QACtD,MAAM,YAAY,GAAG,WAAW,CAAC,OAAQ,CAAC;QAC1C,MAAM,OAAO,GAAG,YAAY,KAAK,SAAS;YACxC,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,YAAY,KAAK,SAAS;gBAC5B,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;oBACnC,CAAC,CAAC,YAAY,CAAE,4BAA4B;oBAC5C,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC;QAE5B,MAAM,cAAc,GAAG,iBAAiB,CAAC,GAAG,CAAC;QAE7C,OAAO,CAAC,GAAG,CAAC,kCAAkC,EAAE;YAC9C,SAAS,EAAE,gBAAgB;YAC3B,KAAK,EAAE,WAAW,CAAC,KAAK;YACxB,OAAO;YACP,WAAW,EAAE,cAAc;YAC3B,UAAU,EAAE,CAAC,CAAC,aAAa;SAC5B,CAAC,CAAC;QAEH,yBAAyB;QACzB,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACrE,OAAO,YAAY,CAAC,IAAI,CACtB,EAAE,KAAK,EAAE,8DAA8D,EAAE,EACzE,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;QACJ,CAAC;QAED,2CAA2C;QAC3C,MAAM,mBAAmB,GAAwB;YAC/C,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,OAAO;YAChB,iBAAiB,EAAE,WAAW,CAAC,KAAK;YACpC,QAAQ,EAAE,OAAO,CAAC,GAAG;YACrB,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,WAAY;YAC7C,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,QAAS;YACvC,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,YAAa;YAC/C,KAAK,EAAE,gBAAgB;YACvB,iBAAiB,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAkB;YACzD,KAAK,EAAE,IAAI;SACZ,CAAC;QAEF,6EAA6E;QAC7E,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;YAE3E,MAAM,WAAW,GAA4B;gBAC3C,WAAW,EAAE,YAAY;gBACzB,OAAO,EAAE,CAAC,mBAAmB,CAAC;aAC/B,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,6CAA6C,EAAE,WAAW,CAAC,CAAC;YACxE,OAAO,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,8CAA8C,aAAa,CAAC,MAAM,SAAS,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,sCAAsC,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;QAEvF,IAAI,CAAC;YACH,6DAA6D;YAC7D,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClF,MAAM,cAAc,GAAmB,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;YAEtE,OAAO,CAAC,GAAG,CAAC,2CAA2C,EAAE;gBACvD,WAAW,EAAE,cAAc,CAAC,WAAW;gBACvC,MAAM,EAAE,cAAc,CAAC,MAAM;gBAC7B,OAAO,EAAE,cAAc,CAAC,OAAO;aAChC,CAAC,CAAC;YAEH,kCAAkC;YAClC,IAAI,cAAc,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;gBAChD,OAAO,CAAC,KAAK,CAAC,iDAAiD,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC7F,OAAO,YAAY,CAAC,IAAI,CACtB,EAAE,KAAK,EAAE,6BAA6B,cAAc,CAAC,WAAW,EAAE,EAAE,EACpE,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;YACJ,CAAC;YAED,IAAI,cAAc,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBAC3C,OAAO,CAAC,KAAK,CAAC,2CAA2C,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;gBAClF,OAAO,YAAY,CAAC,IAAI,CACtB,EAAE,KAAK,EAAE,+BAA+B,cAAc,CAAC,MAAM,EAAE,EAAE,EACjE,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;YACJ,CAAC;YAED,0DAA0D;YAC1D,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,8BAA8B,cAAc,SAAS,CAAC,CAAC;YAEnE,MAAM,aAAa,GAAkB;gBACnC,WAAW,EAAE,YAAY;gBACzB,aAAa,EAAE,aAAa;gBAC5B,mBAAmB,EAAE,mBAAmB;aACzC,CAAC;YAEF,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,SAAS,EAAE;gBAC7D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;aACpC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAmB,MAAM,cAAc,CAAC,IAAI,EAAoB,CAAC;YACnF,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,wCAAwC,EAAE,YAAY,CAAC,CAAC;YACpE,IAAI,gBAAgB,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,2CAA2C,gBAAgB,IAAI,CAAC,CAAC;YAC/E,CAAC;YAED,4BAA4B;YAC5B,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC1B,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBACzD,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,YAAY,CAAC,aAAa,CAAC,CAAC;gBACvE,OAAO,YAAY,CAAC,IAAI,CACtB;oBACE,KAAK,EAAE,6BAA6B;oBACpC,OAAO,EAAE,YAAY,CAAC,aAAa;iBACpC,EACD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YAExD,mDAAmD;YACnD,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,8BAA8B,cAAc,SAAS,CAAC,CAAC;YAEnE,MAAM,aAAa,GAAkB;gBACnC,WAAW,EAAE,YAAY;gBACzB,aAAa,EAAE,aAAa;gBAC5B,mBAAmB,EAAE,mBAAmB;aACzC,CAAC;YAEF,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,SAAS,EAAE;gBAC7D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC;aACpC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAmB,MAAM,cAAc,CAAC,IAAI,EAAoB,CAAC;YACjF,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,sCAAsC,EAAE,UAAU,CAAC,CAAC;YAChE,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,yCAAyC,cAAc,IAAI,CAAC,CAAC;YAC3E,CAAC;YAED,wDAAwD;YACxD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;gBACzD,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;gBAC5D,OAAO,YAAY,CAAC,IAAI,CACtB;oBACE,KAAK,EAAE,2BAA2B;oBAClC,OAAO,EAAE,UAAU,CAAC,KAAK;iBAC1B,EACD,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,uCAAuC;iBACxD,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,qCAAqC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;YAEtE,yDAAyD;YACzD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;YAE3C,sDAAsD;YACtD,MAAM,eAAe,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,eAAe,GAAG;gBACtB,UAAU,EAAE,UAAU;aACvB,CAAC;YACF,eAAe,CAAC,GAAG,CACjB,oBAAoB,EACpB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAChE,CAAC;YAEF,0CAA0C;YAC1C,IAAI,gBAAgB,EAAE,CAAC;gBACrB,eAAe,CAAC,GAAG,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC;YAC/D,CAAC;YACD,IAAI,cAAc,EAAE,CAAC;gBACnB,eAAe,CAAC,GAAG,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;YAC3D,CAAC;YAED,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE;gBACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,OAAO,EAAE,eAAe;aACzB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kDAAkD,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YACpF,OAAO,YAAY,CAAC,IAAI,CACtB;gBACE,KAAK,EAAE,2BAA2B;gBAClC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAChE,EACD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Official x402 Protocol Type Definitions
3
+ * Based on: https://github.com/coinbase/x402
4
+ */
5
+ /**
6
+ * Payment Required Response (402 response body)
7
+ */
8
+ export interface PaymentRequiredResponse {
9
+ /** Version of the x402 payment protocol */
10
+ x402Version: number;
11
+ /** List of payment requirements that the resource server accepts */
12
+ accepts: PaymentRequirements[];
13
+ /** Error message (optional) */
14
+ error?: string;
15
+ }
16
+ /**
17
+ * Payment Requirements
18
+ */
19
+ export interface PaymentRequirements {
20
+ /** Scheme of the payment protocol to use (e.g., "aptos-transfer") */
21
+ scheme: string;
22
+ /** Network of the blockchain to send payment on (e.g., "testnet", "mainnet") */
23
+ network: string;
24
+ /** Maximum amount required to pay for the resource in atomic units */
25
+ maxAmountRequired: string;
26
+ /** URL of resource to pay for */
27
+ resource: string;
28
+ /** Description of the resource */
29
+ description: string;
30
+ /** MIME type of the resource response */
31
+ mimeType: string;
32
+ /** Output schema of the resource response (optional) */
33
+ outputSchema?: object | null;
34
+ /** Address to pay value to */
35
+ payTo: string;
36
+ /** Maximum time in seconds for the resource server to respond */
37
+ maxTimeoutSeconds: number;
38
+ /** Extra information about the payment details specific to the scheme */
39
+ extra?: object | null;
40
+ }
41
+ /**
42
+ * Payment Payload (X-PAYMENT header content, base64 encoded JSON)
43
+ */
44
+ export interface PaymentPayload {
45
+ /** Version of the x402 payment protocol */
46
+ x402Version: number;
47
+ /** Scheme value of the accepted paymentRequirements */
48
+ scheme: string;
49
+ /** Network id of the accepted paymentRequirements */
50
+ network: string;
51
+ /** Scheme-dependent payload (for Aptos "exact" scheme: signature and transaction separately) */
52
+ payload: {
53
+ /** Base64 encoded BCS signature (AccountAuthenticator) */
54
+ signature: string;
55
+ /** Base64 encoded BCS transaction (RawTransaction) */
56
+ transaction: string;
57
+ };
58
+ }
59
+ /**
60
+ * Facilitator /verify endpoint request
61
+ */
62
+ export interface VerifyRequest {
63
+ /** Version of the x402 payment protocol */
64
+ x402Version: number;
65
+ /** The X-PAYMENT header value (base64 encoded PaymentPayload) */
66
+ paymentHeader: string;
67
+ /** The payment requirements being verified against */
68
+ paymentRequirements: PaymentRequirements;
69
+ }
70
+ /**
71
+ * Facilitator /verify endpoint response
72
+ */
73
+ export interface VerifyResponse {
74
+ /** Whether the payment is valid */
75
+ isValid: boolean;
76
+ /** Reason for invalidity (if isValid is false) */
77
+ invalidReason: string | null;
78
+ }
79
+ /**
80
+ * Facilitator /settle endpoint request
81
+ */
82
+ export interface SettleRequest {
83
+ /** Version of the x402 payment protocol */
84
+ x402Version: number;
85
+ /** The X-PAYMENT header value (base64 encoded PaymentPayload) */
86
+ paymentHeader: string;
87
+ /** The payment requirements being settled */
88
+ paymentRequirements: PaymentRequirements;
89
+ }
90
+ /**
91
+ * Facilitator /settle endpoint response
92
+ */
93
+ export interface SettleResponse {
94
+ /** Whether the payment was successful */
95
+ success: boolean;
96
+ /** Error message from the facilitator server (if success is false) */
97
+ error: string | null;
98
+ /** Transaction hash of the settled payment */
99
+ txHash: string | null;
100
+ /** Network id of the blockchain the payment was settled on */
101
+ networkId: string | null;
102
+ }
103
+ /**
104
+ * X-PAYMENT-RESPONSE header content (base64 encoded JSON)
105
+ */
106
+ export interface PaymentResponseHeader {
107
+ /** Settlement response from facilitator */
108
+ settlement: SettleResponse;
109
+ }
110
+ export declare const X402_VERSION = 1;
111
+ export declare const APTOS_SCHEME = "exact";
112
+ export declare const APTOS_MAINNET = "aptos-mainnet";
113
+ export declare const APTOS_TESTNET = "aptos-testnet";
114
+ export declare const APTOS_DEVNET = "aptos-devnet";
115
+ //# sourceMappingURL=x402-protocol-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-protocol-types.d.ts","sourceRoot":"","sources":["../lib/x402-protocol-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IAEpB,oEAAoE;IACpE,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAE/B,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IAEf,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAC;IAEhB,sEAAsE;IACtE,iBAAiB,EAAE,MAAM,CAAC;IAE1B,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IAEjB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IAEpB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IAEjB,wDAAwD;IACxD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B,8BAA8B;IAC9B,KAAK,EAAE,MAAM,CAAC;IAEd,iEAAiE;IACjE,iBAAiB,EAAE,MAAM,CAAC;IAE1B,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IAEpB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IAEf,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAEhB,gGAAgG;IAChG,OAAO,EAAE;QACP,0DAA0D;QAC1D,SAAS,EAAE,MAAM,CAAC;QAClB,sDAAsD;QACtD,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IAEpB,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IAEtB,sDAAsD;IACtD,mBAAmB,EAAE,mBAAmB,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,OAAO,EAAE,OAAO,CAAC;IAEjB,kDAAkD;IAClD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IAEpB,iEAAiE;IACjE,aAAa,EAAE,MAAM,CAAC;IAEtB,6CAA6C;IAC7C,mBAAmB,EAAE,mBAAmB,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IAEjB,sEAAsE;IACtE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAErB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAEtB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,UAAU,EAAE,cAAc,CAAC;CAC5B;AAGD,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,YAAY,UAAU,CAAC;AAGpC,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,YAAY,iBAAiB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Official x402 Protocol Type Definitions
3
+ * Based on: https://github.com/coinbase/x402
4
+ */
5
+ // Constants
6
+ export const X402_VERSION = 1;
7
+ export const APTOS_SCHEME = "exact";
8
+ // Aptos-specific network identifiers
9
+ export const APTOS_MAINNET = "aptos-mainnet";
10
+ export const APTOS_TESTNET = "aptos-testnet";
11
+ export const APTOS_DEVNET = "aptos-devnet";
12
+ //# sourceMappingURL=x402-protocol-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-protocol-types.js","sourceRoot":"","sources":["../lib/x402-protocol-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyIH,YAAY;AACZ,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC;AAEpC,qCAAqC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Simple x402 Request Function
3
+ *
4
+ * Just provide a private key and URL - everything else is automatic!
5
+ *
6
+ * Usage:
7
+ * ```typescript
8
+ * import { x402Request } from '@adipundir/aptos-x402';
9
+ *
10
+ * const response = await x402Request({
11
+ * privateKey: '0x...',
12
+ * url: 'https://api.example.com/protected/data'
13
+ * });
14
+ *
15
+ * console.log(response.data);
16
+ * console.log(response.paymentInfo); // { transactionHash, amountAPT, ... }
17
+ * ```
18
+ */
19
+ export interface X402RequestOptions {
20
+ /** Private key for signing transactions (hex string starting with 0x) */
21
+ privateKey: string;
22
+ /** URL to request */
23
+ url: string;
24
+ /** HTTP method (default: GET) */
25
+ method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
26
+ /** Request body (for POST/PUT/PATCH) */
27
+ body?: any;
28
+ /** Additional headers */
29
+ headers?: Record<string, string>;
30
+ /** Enable debug logging */
31
+ debug?: boolean;
32
+ }
33
+ export interface X402RequestResponse<T = any> {
34
+ /** Response status code */
35
+ status: number;
36
+ /** Response status text */
37
+ statusText: string;
38
+ /** Response data */
39
+ data: T;
40
+ /** Response headers */
41
+ headers: Record<string, string>;
42
+ /** Payment information (if payment was made) */
43
+ paymentInfo?: {
44
+ transactionHash: string;
45
+ amountOctas: string;
46
+ amountAPT: number;
47
+ recipient: string;
48
+ network: string;
49
+ settled: boolean;
50
+ };
51
+ }
52
+ /**
53
+ * Make an x402-enabled HTTP request
54
+ * Automatically handles 402 Payment Required responses
55
+ */
56
+ export declare function x402Request<T = any>(options: X402RequestOptions): Promise<X402RequestResponse<T>>;
57
+ //# sourceMappingURL=x402-request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-request.d.ts","sourceRoot":"","sources":["../lib/x402-request.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAUH,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;IACnB,qBAAqB;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,iCAAiC;IACjC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACrD,wCAAwC;IACxC,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,GAAG;IAC1C,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,IAAI,EAAE,CAAC,CAAC;IACR,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,gDAAgD;IAChD,WAAW,CAAC,EAAE;QACZ,eAAe,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,CAAC,GAAG,GAAG,EACvC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CA6KjC"}