@wtflabs/x402 0.0.1-beta.4 → 0.0.1-beta.6

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 (81) hide show
  1. package/dist/cjs/client/index.d.ts +1 -1
  2. package/dist/cjs/client/index.js +7 -2
  3. package/dist/cjs/client/index.js.map +1 -1
  4. package/dist/cjs/facilitator/index.d.ts +1 -1
  5. package/dist/cjs/facilitator/index.js +444 -87
  6. package/dist/cjs/facilitator/index.js.map +1 -1
  7. package/dist/cjs/index.d.ts +1 -1
  8. package/dist/cjs/index.js +445 -88
  9. package/dist/cjs/index.js.map +1 -1
  10. package/dist/cjs/{middleware-Brgsx32F.d.ts → middleware-nzDe-TDJ.d.ts} +1 -1
  11. package/dist/cjs/paywall/index.d.ts +1 -1
  12. package/dist/cjs/schemes/index.d.ts +25 -7
  13. package/dist/cjs/schemes/index.js +477 -95
  14. package/dist/cjs/schemes/index.js.map +1 -1
  15. package/dist/cjs/shared/index.d.ts +2 -2
  16. package/dist/cjs/shared/index.js +6 -1
  17. package/dist/cjs/shared/index.js.map +1 -1
  18. package/dist/cjs/types/index.d.ts +93 -4
  19. package/dist/cjs/types/index.js +64 -1
  20. package/dist/cjs/types/index.js.map +1 -1
  21. package/dist/cjs/verify/index.d.ts +2 -2
  22. package/dist/cjs/verify/index.js +6 -1
  23. package/dist/cjs/verify/index.js.map +1 -1
  24. package/dist/{esm/x402Specs-CYq5tSY1.d.mts → cjs/x402Specs-BtRXj67U.d.ts} +43 -10
  25. package/dist/esm/{chunk-G6WN2WYX.mjs → chunk-3SCH5JL2.mjs} +433 -98
  26. package/dist/esm/chunk-3SCH5JL2.mjs.map +1 -0
  27. package/dist/esm/{chunk-2AM3S66N.mjs → chunk-7MNUQUHN.mjs} +3 -3
  28. package/dist/esm/{chunk-34YNR4LY.mjs → chunk-KABV25HJ.mjs} +3 -3
  29. package/dist/esm/{chunk-UCBE7FDY.mjs → chunk-NPWDNT2P.mjs} +67 -2
  30. package/dist/esm/chunk-NPWDNT2P.mjs.map +1 -0
  31. package/dist/esm/{chunk-RX2JKK4O.mjs → chunk-VTLJOZXM.mjs} +3 -3
  32. package/dist/esm/chunk-VTLJOZXM.mjs.map +1 -0
  33. package/dist/esm/client/index.d.mts +1 -1
  34. package/dist/esm/client/index.mjs +3 -3
  35. package/dist/esm/facilitator/index.d.mts +1 -1
  36. package/dist/esm/facilitator/index.mjs +4 -4
  37. package/dist/esm/index.d.mts +1 -1
  38. package/dist/esm/index.mjs +5 -5
  39. package/dist/esm/{middleware-BSjsPDKM.d.mts → middleware-DSDucaQ5.d.mts} +1 -1
  40. package/dist/esm/paywall/index.d.mts +1 -1
  41. package/dist/esm/schemes/index.d.mts +25 -7
  42. package/dist/esm/schemes/index.mjs +3 -3
  43. package/dist/esm/shared/index.d.mts +2 -2
  44. package/dist/esm/shared/index.mjs +1 -1
  45. package/dist/esm/types/index.d.mts +93 -4
  46. package/dist/esm/types/index.mjs +1 -1
  47. package/dist/esm/verify/index.d.mts +2 -2
  48. package/dist/esm/verify/index.mjs +1 -1
  49. package/dist/{cjs/x402Specs-CYq5tSY1.d.ts → esm/x402Specs-BtRXj67U.d.mts} +43 -10
  50. package/package.json +15 -15
  51. package/dist/cjs/middleware-6_1ApcJn.d.ts +0 -93
  52. package/dist/cjs/middleware-B_ewwsQp.d.ts +0 -93
  53. package/dist/cjs/middleware-BwfW7mAs.d.ts +0 -93
  54. package/dist/cjs/middleware-CQb61c1k.d.ts +0 -93
  55. package/dist/cjs/middleware-DB9lqy9f.d.ts +0 -93
  56. package/dist/cjs/middleware-DcHctwQV.d.ts +0 -93
  57. package/dist/cjs/middleware-De0jD3Bp.d.ts +0 -93
  58. package/dist/cjs/middleware-HoFOmpgv.d.ts +0 -93
  59. package/dist/cjs/middleware-Y8AiAfYw.d.ts +0 -93
  60. package/dist/cjs/middleware-pnres9YM.d.ts +0 -93
  61. package/dist/cjs/network-RtNddYQk.d.ts +0 -11
  62. package/dist/cjs/rpc-Ca8eHCWz.d.ts +0 -35
  63. package/dist/cjs/wallet-BRWfOM5D.d.ts +0 -153
  64. package/dist/cjs/wallet-BYRAGtOB.d.ts +0 -153
  65. package/dist/cjs/wallet-BmEtlgEf.d.ts +0 -48
  66. package/dist/cjs/wallet-CNOAmyZ6.d.ts +0 -48
  67. package/dist/cjs/wallet-D1SoxFTw.d.ts +0 -48
  68. package/dist/cjs/wallet-SJ-hbjm9.d.ts +0 -153
  69. package/dist/cjs/wallet-ecnda4Aj.d.ts +0 -48
  70. package/dist/cjs/wallet-gP8Qoi-c.d.ts +0 -74
  71. package/dist/cjs/x402Specs-B7InXo2L.d.ts +0 -1065
  72. package/dist/cjs/x402Specs-BLH3j34O.d.ts +0 -1696
  73. package/dist/cjs/x402Specs-C7LipAZg.d.ts +0 -1715
  74. package/dist/cjs/x402Specs-CeajqonG.d.ts +0 -1696
  75. package/dist/cjs/x402Specs-qMujgEV5.d.ts +0 -1715
  76. package/dist/cjs/x402Specs-qUBCpcuz.d.ts +0 -1715
  77. package/dist/esm/chunk-G6WN2WYX.mjs.map +0 -1
  78. package/dist/esm/chunk-RX2JKK4O.mjs.map +0 -1
  79. package/dist/esm/chunk-UCBE7FDY.mjs.map +0 -1
  80. /package/dist/esm/{chunk-2AM3S66N.mjs.map → chunk-7MNUQUHN.mjs.map} +0 -0
  81. /package/dist/esm/{chunk-34YNR4LY.mjs.map → chunk-KABV25HJ.mjs.map} +0 -0
@@ -9,11 +9,12 @@ import {
9
9
  preparePaymentHeader,
10
10
  signAuthorization,
11
11
  signPaymentHeader
12
- } from "./chunk-RX2JKK4O.mjs";
12
+ } from "./chunk-VTLJOZXM.mjs";
13
13
  import {
14
14
  ErrorReasons,
15
15
  PERMIT2_ADDRESS,
16
16
  SupportedSVMNetworks,
17
+ WITNESS_TYPE_STRING,
17
18
  authorizationTypes,
18
19
  decodeTransactionFromPayload,
19
20
  erc20PermitABI,
@@ -24,9 +25,10 @@ import {
24
25
  isSignerWallet,
25
26
  permit2ABI,
26
27
  permit2Types,
28
+ permit2WitnessTypes,
27
29
  permitTypes,
28
30
  signAndSimulateTransaction
29
- } from "./chunk-UCBE7FDY.mjs";
31
+ } from "./chunk-NPWDNT2P.mjs";
30
32
  import {
31
33
  getERC20Allowance,
32
34
  getERC20Balance,
@@ -59,7 +61,271 @@ __export(evm_exports, {
59
61
  });
60
62
 
61
63
  // src/schemes/exact/evm/eip3009/facilitator.ts
62
- import { getAddress, parseErc6492Signature } from "viem";
64
+ import {
65
+ getAddress,
66
+ parseErc6492Signature,
67
+ hexToSignature
68
+ } from "viem";
69
+
70
+ // src/types/shared/evm/permitProxyABI.ts
71
+ var permitProxyContractABI = [
72
+ // settleWithPermit - 使用 EIP-2612 Permit 进行结算
73
+ {
74
+ inputs: [
75
+ {
76
+ internalType: "address",
77
+ name: "token",
78
+ type: "address"
79
+ },
80
+ {
81
+ internalType: "address",
82
+ name: "payer",
83
+ type: "address"
84
+ },
85
+ {
86
+ internalType: "address",
87
+ name: "seller",
88
+ type: "address"
89
+ },
90
+ {
91
+ internalType: "uint256",
92
+ name: "amount",
93
+ type: "uint256"
94
+ },
95
+ {
96
+ internalType: "uint256",
97
+ name: "deadline",
98
+ type: "uint256"
99
+ },
100
+ {
101
+ internalType: "uint8",
102
+ name: "v",
103
+ type: "uint8"
104
+ },
105
+ {
106
+ internalType: "bytes32",
107
+ name: "r",
108
+ type: "bytes32"
109
+ },
110
+ {
111
+ internalType: "bytes32",
112
+ name: "s",
113
+ type: "bytes32"
114
+ }
115
+ ],
116
+ name: "settleWithPermit",
117
+ outputs: [],
118
+ stateMutability: "nonpayable",
119
+ type: "function"
120
+ },
121
+ // settleWithERC3009 - 使用 EIP-3009 TransferWithAuthorization 进行结算
122
+ {
123
+ inputs: [
124
+ {
125
+ internalType: "address",
126
+ name: "token",
127
+ type: "address"
128
+ },
129
+ {
130
+ internalType: "address",
131
+ name: "payer",
132
+ type: "address"
133
+ },
134
+ {
135
+ internalType: "address",
136
+ name: "seller",
137
+ type: "address"
138
+ },
139
+ {
140
+ internalType: "uint256",
141
+ name: "amount",
142
+ type: "uint256"
143
+ },
144
+ {
145
+ internalType: "uint256",
146
+ name: "validAfter",
147
+ type: "uint256"
148
+ },
149
+ {
150
+ internalType: "uint256",
151
+ name: "validBefore",
152
+ type: "uint256"
153
+ },
154
+ {
155
+ internalType: "bytes32",
156
+ name: "nonce",
157
+ type: "bytes32"
158
+ },
159
+ {
160
+ internalType: "uint8",
161
+ name: "v",
162
+ type: "uint8"
163
+ },
164
+ {
165
+ internalType: "bytes32",
166
+ name: "r",
167
+ type: "bytes32"
168
+ },
169
+ {
170
+ internalType: "bytes32",
171
+ name: "s",
172
+ type: "bytes32"
173
+ }
174
+ ],
175
+ name: "settleWithERC3009",
176
+ outputs: [],
177
+ stateMutability: "nonpayable",
178
+ type: "function"
179
+ },
180
+ // settleWithERC3009Direct - 直接结算(无手续费)
181
+ {
182
+ inputs: [
183
+ {
184
+ internalType: "address",
185
+ name: "token",
186
+ type: "address"
187
+ },
188
+ {
189
+ internalType: "address",
190
+ name: "payer",
191
+ type: "address"
192
+ },
193
+ {
194
+ internalType: "address",
195
+ name: "seller",
196
+ type: "address"
197
+ },
198
+ {
199
+ internalType: "uint256",
200
+ name: "amount",
201
+ type: "uint256"
202
+ },
203
+ {
204
+ internalType: "uint256",
205
+ name: "validAfter",
206
+ type: "uint256"
207
+ },
208
+ {
209
+ internalType: "uint256",
210
+ name: "validBefore",
211
+ type: "uint256"
212
+ },
213
+ {
214
+ internalType: "bytes32",
215
+ name: "nonce",
216
+ type: "bytes32"
217
+ },
218
+ {
219
+ internalType: "uint8",
220
+ name: "v",
221
+ type: "uint8"
222
+ },
223
+ {
224
+ internalType: "bytes32",
225
+ name: "r",
226
+ type: "bytes32"
227
+ },
228
+ {
229
+ internalType: "bytes32",
230
+ name: "s",
231
+ type: "bytes32"
232
+ }
233
+ ],
234
+ name: "settleWithERC3009Direct",
235
+ outputs: [],
236
+ stateMutability: "nonpayable",
237
+ type: "function"
238
+ },
239
+ // Events
240
+ {
241
+ anonymous: false,
242
+ inputs: [
243
+ {
244
+ indexed: true,
245
+ internalType: "address",
246
+ name: "token",
247
+ type: "address"
248
+ },
249
+ {
250
+ indexed: true,
251
+ internalType: "address",
252
+ name: "payer",
253
+ type: "address"
254
+ },
255
+ {
256
+ indexed: true,
257
+ internalType: "address",
258
+ name: "seller",
259
+ type: "address"
260
+ },
261
+ {
262
+ indexed: false,
263
+ internalType: "uint256",
264
+ name: "amount",
265
+ type: "uint256"
266
+ },
267
+ {
268
+ indexed: false,
269
+ internalType: "uint256",
270
+ name: "sellerAmount",
271
+ type: "uint256"
272
+ },
273
+ {
274
+ indexed: false,
275
+ internalType: "uint256",
276
+ name: "feeAmount",
277
+ type: "uint256"
278
+ },
279
+ {
280
+ indexed: false,
281
+ internalType: "string",
282
+ name: "path",
283
+ type: "string"
284
+ }
285
+ ],
286
+ name: "SettledSplit",
287
+ type: "event"
288
+ },
289
+ {
290
+ anonymous: false,
291
+ inputs: [
292
+ {
293
+ indexed: true,
294
+ internalType: "address",
295
+ name: "token",
296
+ type: "address"
297
+ },
298
+ {
299
+ indexed: true,
300
+ internalType: "address",
301
+ name: "payer",
302
+ type: "address"
303
+ },
304
+ {
305
+ indexed: true,
306
+ internalType: "address",
307
+ name: "seller",
308
+ type: "address"
309
+ },
310
+ {
311
+ indexed: false,
312
+ internalType: "uint256",
313
+ name: "amount",
314
+ type: "uint256"
315
+ },
316
+ {
317
+ indexed: false,
318
+ internalType: "string",
319
+ name: "path",
320
+ type: "string"
321
+ }
322
+ ],
323
+ name: "SettledDirect",
324
+ type: "event"
325
+ }
326
+ ];
327
+
328
+ // src/schemes/exact/evm/eip3009/facilitator.ts
63
329
  async function verify(client, payload, paymentRequirements) {
64
330
  const exactEvmPayload = payload.payload;
65
331
  if (exactEvmPayload.authorizationType !== "eip3009") {
@@ -123,7 +389,7 @@ async function verify(client, payload, paymentRequirements) {
123
389
  payer: exactEvmPayload.authorization.from
124
390
  };
125
391
  }
126
- if (getAddress(exactEvmPayload.authorization.to) !== getAddress(paymentRequirements.payTo)) {
392
+ if (getAddress(exactEvmPayload.authorization.to) !== getAddress(paymentRequirements.payTo) && getAddress(exactEvmPayload.authorization.to) !== getAddress(paymentRequirements.extra?.relayer)) {
127
393
  return {
128
394
  isValid: false,
129
395
  invalidReason: "invalid_exact_evm_payload_recipient_mismatch",
@@ -196,21 +462,57 @@ async function settle(wallet, paymentPayload, paymentRequirements) {
196
462
  };
197
463
  }
198
464
  const { signature } = parseErc6492Signature(payload.signature);
199
- const tx = await wallet.writeContract({
200
- address: paymentRequirements.asset,
201
- abi: usdcABI,
202
- functionName: "transferWithAuthorization",
203
- args: [
204
- payload.authorization.from,
205
- payload.authorization.to,
206
- BigInt(payload.authorization.value),
207
- BigInt(payload.authorization.validAfter),
208
- BigInt(payload.authorization.validBefore),
209
- payload.authorization.nonce,
210
- signature
211
- ],
212
- chain: wallet.chain
213
- });
465
+ let tx;
466
+ if (paymentRequirements.extra?.relayer) {
467
+ const sig = hexToSignature(signature);
468
+ const v = Number(sig.v);
469
+ const r = sig.r;
470
+ const s = sig.s;
471
+ tx = await wallet.writeContract({
472
+ address: paymentRequirements.extra.relayer,
473
+ abi: permitProxyContractABI,
474
+ functionName: "settleWithERC3009",
475
+ args: [
476
+ paymentRequirements.asset,
477
+ // token
478
+ payload.authorization.from,
479
+ // payer
480
+ payload.authorization.to,
481
+ // seller
482
+ BigInt(payload.authorization.value),
483
+ // amount
484
+ BigInt(payload.authorization.validAfter),
485
+ // validAfter
486
+ BigInt(payload.authorization.validBefore),
487
+ // validBefore
488
+ payload.authorization.nonce,
489
+ // nonce
490
+ v,
491
+ // v (uint8)
492
+ r,
493
+ // r (bytes32)
494
+ s
495
+ // s (bytes32)
496
+ ],
497
+ chain: wallet.chain
498
+ });
499
+ } else {
500
+ tx = await wallet.writeContract({
501
+ address: paymentRequirements.asset,
502
+ abi: usdcABI,
503
+ functionName: "transferWithAuthorization",
504
+ args: [
505
+ payload.authorization.from,
506
+ payload.authorization.to,
507
+ BigInt(payload.authorization.value),
508
+ BigInt(payload.authorization.validAfter),
509
+ BigInt(payload.authorization.validBefore),
510
+ payload.authorization.nonce,
511
+ signature
512
+ ],
513
+ chain: wallet.chain
514
+ });
515
+ }
214
516
  const receipt = await wallet.waitForTransactionReceipt({ hash: tx });
215
517
  if (receipt.status !== "success") {
216
518
  return {
@@ -304,63 +606,6 @@ function splitSignature(signature) {
304
606
  return { v, r, s };
305
607
  }
306
608
 
307
- // src/types/shared/evm/permitProxyABI.ts
308
- var permitProxyContractABI = [
309
- {
310
- inputs: [
311
- {
312
- internalType: "address",
313
- name: "token",
314
- type: "address"
315
- },
316
- {
317
- internalType: "address",
318
- name: "owner",
319
- type: "address"
320
- },
321
- {
322
- internalType: "address",
323
- name: "spender",
324
- type: "address"
325
- },
326
- {
327
- internalType: "uint256",
328
- name: "value",
329
- type: "uint256"
330
- },
331
- {
332
- internalType: "uint256",
333
- name: "deadline",
334
- type: "uint256"
335
- },
336
- {
337
- internalType: "uint8",
338
- name: "v",
339
- type: "uint8"
340
- },
341
- {
342
- internalType: "bytes32",
343
- name: "r",
344
- type: "bytes32"
345
- },
346
- {
347
- internalType: "bytes32",
348
- name: "s",
349
- type: "bytes32"
350
- },
351
- {
352
- internalType: "address",
353
- name: "to",
354
- type: "address"
355
- }
356
- ],
357
- name: "permitAndTransfer",
358
- outputs: [],
359
- stateMutability: "nonpayable",
360
- type: "function"
361
- }
362
- ];
363
-
364
609
  // src/schemes/exact/evm/permit/facilitator.ts
365
610
  async function verify2(client, payload, paymentRequirements) {
366
611
  if (payload.payload.authorizationType !== "permit" || payload.scheme !== SCHEME || paymentRequirements.scheme !== SCHEME) {
@@ -428,8 +673,8 @@ async function verify2(client, payload, paymentRequirements) {
428
673
  payer: owner
429
674
  };
430
675
  }
431
- if (paymentRequirements.extra?.proxyAddress) {
432
- if (getAddress3(spender) !== getAddress3(paymentRequirements.extra?.proxyAddress)) {
676
+ if (paymentRequirements.extra?.relayer) {
677
+ if (getAddress3(spender) !== getAddress3(paymentRequirements.extra?.relayer)) {
433
678
  return {
434
679
  isValid: false,
435
680
  invalidReason: "invalid_spender_address",
@@ -493,21 +738,28 @@ async function settle2(wallet, paymentPayload, paymentRequirements) {
493
738
  address: wallet.account.address
494
739
  });
495
740
  let transactionHash;
496
- if (paymentRequirements.extra?.proxyAddress) {
741
+ if (paymentRequirements.extra?.relayer) {
497
742
  transactionHash = await wallet.writeContract({
498
- address: paymentRequirements.extra.proxyAddress,
743
+ address: paymentRequirements.extra.relayer,
499
744
  abi: permitProxyContractABI,
500
- functionName: "permitAndTransfer",
745
+ functionName: "settleWithPermit",
501
746
  args: [
502
747
  tokenAddress,
748
+ // token
503
749
  owner,
504
- spender,
750
+ // payer
751
+ paymentRequirements.payTo,
752
+ // seller
505
753
  BigInt(value),
754
+ // amount
506
755
  BigInt(deadline),
756
+ // deadline
507
757
  v,
758
+ // v
508
759
  r,
509
- s,
510
- paymentRequirements.payTo
760
+ // r
761
+ s
762
+ // s
511
763
  ],
512
764
  chain: wallet.chain,
513
765
  nonce: txNonce
@@ -567,7 +819,11 @@ async function settle2(wallet, paymentPayload, paymentRequirements) {
567
819
  }
568
820
 
569
821
  // src/schemes/exact/evm/permit2/facilitator.ts
570
- import { getAddress as getAddress4 } from "viem";
822
+ import {
823
+ encodeAbiParameters,
824
+ getAddress as getAddress4,
825
+ keccak256
826
+ } from "viem";
571
827
  async function verify3(client, payload, paymentRequirements) {
572
828
  if (payload.payload.authorizationType !== "permit2" || payload.scheme !== SCHEME || paymentRequirements.scheme !== SCHEME) {
573
829
  return {
@@ -576,11 +832,41 @@ async function verify3(client, payload, paymentRequirements) {
576
832
  };
577
833
  }
578
834
  const permit2Payload = payload.payload;
579
- const { owner, spender, token, amount, deadline, nonce } = permit2Payload.authorization;
835
+ const { owner, spender, token, amount, deadline, nonce, to } = permit2Payload.authorization;
580
836
  const chainId = getNetworkId(payload.network);
581
837
  const tokenAddress = getAddress4(token);
582
838
  const ownerAddress = getAddress4(owner);
583
- const permit2TypedData = {
839
+ const hasWitness = !!to;
840
+ if (hasWitness) {
841
+ if (getAddress4(to) !== getAddress4(paymentRequirements.payTo)) {
842
+ return {
843
+ isValid: false,
844
+ invalidReason: "witness_recipient_mismatch",
845
+ payer: owner
846
+ };
847
+ }
848
+ }
849
+ const permit2TypedData = hasWitness ? {
850
+ types: permit2WitnessTypes,
851
+ domain: {
852
+ name: "Permit2",
853
+ chainId,
854
+ verifyingContract: PERMIT2_ADDRESS
855
+ },
856
+ primaryType: "PermitWitnessTransferFrom",
857
+ message: {
858
+ permitted: {
859
+ token: tokenAddress,
860
+ amount
861
+ },
862
+ spender: getAddress4(spender),
863
+ nonce,
864
+ deadline,
865
+ witness: {
866
+ to: getAddress4(to)
867
+ }
868
+ }
869
+ } : {
584
870
  types: permit2Types,
585
871
  domain: {
586
872
  name: "Permit2",
@@ -606,7 +892,7 @@ async function verify3(client, payload, paymentRequirements) {
606
892
  if (!recoveredAddress) {
607
893
  return {
608
894
  isValid: false,
609
- invalidReason: "invalid_permit2_signature",
895
+ invalidReason: hasWitness ? "invalid_permit2_witness_signature" : "invalid_permit2_signature",
610
896
  payer: owner
611
897
  };
612
898
  }
@@ -681,10 +967,34 @@ async function settle3(wallet, paymentPayload, paymentRequirements) {
681
967
  payer: permit2Payload.authorization.owner
682
968
  };
683
969
  }
684
- const { owner, token, amount, deadline, nonce } = permit2Payload.authorization;
970
+ const { owner, token, amount, deadline, nonce, to } = permit2Payload.authorization;
685
971
  const tokenAddress = getAddress4(token);
686
972
  const ownerAddress = getAddress4(owner);
687
- const tx = await wallet.writeContract({
973
+ const hasWitness = !!to;
974
+ const tx = hasWitness ? await wallet.writeContract({
975
+ address: PERMIT2_ADDRESS,
976
+ abi: permit2ABI,
977
+ functionName: "permitWitnessTransferFrom",
978
+ args: [
979
+ {
980
+ permitted: {
981
+ token: tokenAddress,
982
+ amount: BigInt(amount)
983
+ },
984
+ nonce: BigInt(nonce),
985
+ deadline: BigInt(deadline)
986
+ },
987
+ {
988
+ to: paymentRequirements.payTo,
989
+ requestedAmount: BigInt(amount)
990
+ },
991
+ ownerAddress,
992
+ keccak256(encodeAbiParameters([{ type: "address", name: "to" }], [getAddress4(to)])),
993
+ WITNESS_TYPE_STRING,
994
+ permit2Payload.signature
995
+ ],
996
+ chain: wallet.chain
997
+ }) : await wallet.writeContract({
688
998
  address: PERMIT2_ADDRESS,
689
999
  abi: permit2ABI,
690
1000
  functionName: "permitTransferFrom",
@@ -764,7 +1074,7 @@ function preparePaymentHeader2(from, x402Version, paymentRequirements) {
764
1074
  signature: void 0,
765
1075
  authorization: {
766
1076
  owner: from,
767
- spender: paymentRequirements.extra?.feePayer,
1077
+ spender: paymentRequirements.extra?.relayer || paymentRequirements.payTo,
768
1078
  value: paymentRequirements.maxAmountRequired,
769
1079
  deadline
770
1080
  }
@@ -818,13 +1128,34 @@ __export(permit2_exports, {
818
1128
 
819
1129
  // src/schemes/exact/evm/permit2/sign.ts
820
1130
  import { getAddress as getAddress5 } from "viem";
821
- async function signPermit2(walletClient, { owner, spender, token, amount, deadline }, { network }) {
1131
+ async function signPermit2(walletClient, { owner, spender, token, amount, deadline, to }, { network }) {
822
1132
  const chainId = getNetworkId(network);
823
1133
  const tokenAddress = getAddress5(token);
824
1134
  const ownerAddress = getAddress5(owner);
825
1135
  const spenderAddress = getAddress5(spender);
826
1136
  const nonce = await createPermit2Nonce(walletClient, ownerAddress);
827
- const data = {
1137
+ const hasWitness = !!to;
1138
+ const data = hasWitness ? {
1139
+ types: permit2WitnessTypes,
1140
+ domain: {
1141
+ name: "Permit2",
1142
+ chainId,
1143
+ verifyingContract: PERMIT2_ADDRESS
1144
+ },
1145
+ primaryType: "PermitWitnessTransferFrom",
1146
+ message: {
1147
+ permitted: {
1148
+ token: tokenAddress,
1149
+ amount: BigInt(amount)
1150
+ },
1151
+ spender: spenderAddress,
1152
+ nonce,
1153
+ deadline: BigInt(deadline),
1154
+ witness: {
1155
+ to: getAddress5(to)
1156
+ }
1157
+ }
1158
+ } : {
828
1159
  types: permit2Types,
829
1160
  domain: {
830
1161
  name: "Permit2",
@@ -902,16 +1233,18 @@ function preparePaymentHeader3(from, x402Version, paymentRequirements) {
902
1233
  spender: paymentRequirements.payTo,
903
1234
  token: paymentRequirements.asset,
904
1235
  amount: paymentRequirements.maxAmountRequired,
905
- deadline
1236
+ deadline,
1237
+ to: paymentRequirements.payTo
1238
+ // Witness: bind recipient to signature
906
1239
  }
907
1240
  }
908
1241
  };
909
1242
  }
910
1243
  async function signPaymentHeader3(client, paymentRequirements, unsignedPaymentHeader) {
911
- const { owner, spender, token, amount, deadline } = unsignedPaymentHeader.payload.authorization;
1244
+ const { owner, spender, token, amount, deadline, to } = unsignedPaymentHeader.payload.authorization;
912
1245
  const { signature, nonce } = await signPermit2(
913
1246
  client,
914
- { owner, spender, token, amount, deadline },
1247
+ { owner, spender, token, amount, deadline, to },
915
1248
  paymentRequirements
916
1249
  );
917
1250
  return {
@@ -925,7 +1258,9 @@ async function signPaymentHeader3(client, paymentRequirements, unsignedPaymentHe
925
1258
  token,
926
1259
  amount,
927
1260
  deadline,
928
- nonce
1261
+ nonce,
1262
+ ...to ? { to } : {}
1263
+ // Include `to` field if present (witness mode)
929
1264
  }
930
1265
  }
931
1266
  };
@@ -1409,4 +1744,4 @@ export {
1409
1744
  verify4 as verify2,
1410
1745
  settle4 as settle2
1411
1746
  };
1412
- //# sourceMappingURL=chunk-G6WN2WYX.mjs.map
1747
+ //# sourceMappingURL=chunk-3SCH5JL2.mjs.map