@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
@@ -315,6 +315,21 @@ var permit2Types = {
315
315
  { name: "amount", type: "uint256" }
316
316
  ]
317
317
  };
318
+ var permit2WitnessTypes = {
319
+ PermitWitnessTransferFrom: [
320
+ { name: "permitted", type: "TokenPermissions" },
321
+ { name: "spender", type: "address" },
322
+ { name: "nonce", type: "uint256" },
323
+ { name: "deadline", type: "uint256" },
324
+ { name: "witness", type: "Witness" }
325
+ ],
326
+ TokenPermissions: [
327
+ { name: "token", type: "address" },
328
+ { name: "amount", type: "uint256" }
329
+ ],
330
+ Witness: [{ name: "to", type: "address" }]
331
+ };
332
+ var WITNESS_TYPE_STRING = "Witness(address to)";
318
333
  var permit2ABI = [
319
334
  {
320
335
  inputs: [
@@ -384,6 +399,45 @@ var permit2ABI = [
384
399
  outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
385
400
  stateMutability: "view",
386
401
  type: "function"
402
+ },
403
+ {
404
+ inputs: [
405
+ {
406
+ components: [
407
+ {
408
+ components: [
409
+ { internalType: "address", name: "token", type: "address" },
410
+ { internalType: "uint256", name: "amount", type: "uint256" }
411
+ ],
412
+ internalType: "struct ISignatureTransfer.TokenPermissions",
413
+ name: "permitted",
414
+ type: "tuple"
415
+ },
416
+ { internalType: "uint256", name: "nonce", type: "uint256" },
417
+ { internalType: "uint256", name: "deadline", type: "uint256" }
418
+ ],
419
+ internalType: "struct ISignatureTransfer.PermitTransferFrom",
420
+ name: "permit",
421
+ type: "tuple"
422
+ },
423
+ {
424
+ components: [
425
+ { internalType: "address", name: "to", type: "address" },
426
+ { internalType: "uint256", name: "requestedAmount", type: "uint256" }
427
+ ],
428
+ internalType: "struct ISignatureTransfer.SignatureTransferDetails",
429
+ name: "transferDetails",
430
+ type: "tuple"
431
+ },
432
+ { internalType: "address", name: "owner", type: "address" },
433
+ { internalType: "bytes32", name: "witness", type: "bytes32" },
434
+ { internalType: "string", name: "witnessTypeString", type: "string" },
435
+ { internalType: "bytes", name: "signature", type: "bytes" }
436
+ ],
437
+ name: "permitWitnessTransferFrom",
438
+ outputs: [],
439
+ stateMutability: "nonpayable",
440
+ type: "function"
387
441
  }
388
442
  ];
389
443
 
@@ -1201,6 +1255,8 @@ var ErrorReasons = [
1201
1255
  "invalid_authorization_type",
1202
1256
  "invalid_permit_signature",
1203
1257
  "invalid_permit2_signature",
1258
+ "invalid_permit2_witness_signature",
1259
+ "witness_recipient_mismatch",
1204
1260
  "permit_expired",
1205
1261
  "permit2_expired",
1206
1262
  "permit2_not_approved",
@@ -1208,6 +1264,7 @@ var ErrorReasons = [
1208
1264
  "invalid_spender_address",
1209
1265
  "token_mismatch",
1210
1266
  "insufficient_payment_amount",
1267
+ "insufficient_token_balance",
1211
1268
  "transaction_failed",
1212
1269
  "settlement_failed"
1213
1270
  ];
@@ -1250,7 +1307,9 @@ var Permit2EvmPayloadAuthorizationSchema = import_zod3.z.object({
1250
1307
  token: import_zod3.z.string().regex(EvmAddressRegex),
1251
1308
  amount: import_zod3.z.string().refine(isInteger).refine(hasMaxLength(EvmMaxAtomicUnits)),
1252
1309
  deadline: import_zod3.z.string().refine(isInteger),
1253
- nonce: import_zod3.z.string().refine(isInteger)
1310
+ nonce: import_zod3.z.string().refine(isInteger),
1311
+ to: import_zod3.z.string().regex(EvmAddressRegex).optional()
1312
+ // Witness: binds recipient address to signature
1254
1313
  });
1255
1314
  var ExactEvmPayloadSchema = import_zod3.z.discriminatedUnion("authorizationType", [
1256
1315
  import_zod3.z.object({
@@ -1836,6 +1895,264 @@ var import_compute_budget2 = require("@solana-program/compute-budget");
1836
1895
  // src/schemes/exact/index.ts
1837
1896
  var SCHEME = "exact";
1838
1897
 
1898
+ // src/types/shared/evm/permitProxyABI.ts
1899
+ var permitProxyContractABI = [
1900
+ // settleWithPermit - 使用 EIP-2612 Permit 进行结算
1901
+ {
1902
+ inputs: [
1903
+ {
1904
+ internalType: "address",
1905
+ name: "token",
1906
+ type: "address"
1907
+ },
1908
+ {
1909
+ internalType: "address",
1910
+ name: "payer",
1911
+ type: "address"
1912
+ },
1913
+ {
1914
+ internalType: "address",
1915
+ name: "seller",
1916
+ type: "address"
1917
+ },
1918
+ {
1919
+ internalType: "uint256",
1920
+ name: "amount",
1921
+ type: "uint256"
1922
+ },
1923
+ {
1924
+ internalType: "uint256",
1925
+ name: "deadline",
1926
+ type: "uint256"
1927
+ },
1928
+ {
1929
+ internalType: "uint8",
1930
+ name: "v",
1931
+ type: "uint8"
1932
+ },
1933
+ {
1934
+ internalType: "bytes32",
1935
+ name: "r",
1936
+ type: "bytes32"
1937
+ },
1938
+ {
1939
+ internalType: "bytes32",
1940
+ name: "s",
1941
+ type: "bytes32"
1942
+ }
1943
+ ],
1944
+ name: "settleWithPermit",
1945
+ outputs: [],
1946
+ stateMutability: "nonpayable",
1947
+ type: "function"
1948
+ },
1949
+ // settleWithERC3009 - 使用 EIP-3009 TransferWithAuthorization 进行结算
1950
+ {
1951
+ inputs: [
1952
+ {
1953
+ internalType: "address",
1954
+ name: "token",
1955
+ type: "address"
1956
+ },
1957
+ {
1958
+ internalType: "address",
1959
+ name: "payer",
1960
+ type: "address"
1961
+ },
1962
+ {
1963
+ internalType: "address",
1964
+ name: "seller",
1965
+ type: "address"
1966
+ },
1967
+ {
1968
+ internalType: "uint256",
1969
+ name: "amount",
1970
+ type: "uint256"
1971
+ },
1972
+ {
1973
+ internalType: "uint256",
1974
+ name: "validAfter",
1975
+ type: "uint256"
1976
+ },
1977
+ {
1978
+ internalType: "uint256",
1979
+ name: "validBefore",
1980
+ type: "uint256"
1981
+ },
1982
+ {
1983
+ internalType: "bytes32",
1984
+ name: "nonce",
1985
+ type: "bytes32"
1986
+ },
1987
+ {
1988
+ internalType: "uint8",
1989
+ name: "v",
1990
+ type: "uint8"
1991
+ },
1992
+ {
1993
+ internalType: "bytes32",
1994
+ name: "r",
1995
+ type: "bytes32"
1996
+ },
1997
+ {
1998
+ internalType: "bytes32",
1999
+ name: "s",
2000
+ type: "bytes32"
2001
+ }
2002
+ ],
2003
+ name: "settleWithERC3009",
2004
+ outputs: [],
2005
+ stateMutability: "nonpayable",
2006
+ type: "function"
2007
+ },
2008
+ // settleWithERC3009Direct - 直接结算(无手续费)
2009
+ {
2010
+ inputs: [
2011
+ {
2012
+ internalType: "address",
2013
+ name: "token",
2014
+ type: "address"
2015
+ },
2016
+ {
2017
+ internalType: "address",
2018
+ name: "payer",
2019
+ type: "address"
2020
+ },
2021
+ {
2022
+ internalType: "address",
2023
+ name: "seller",
2024
+ type: "address"
2025
+ },
2026
+ {
2027
+ internalType: "uint256",
2028
+ name: "amount",
2029
+ type: "uint256"
2030
+ },
2031
+ {
2032
+ internalType: "uint256",
2033
+ name: "validAfter",
2034
+ type: "uint256"
2035
+ },
2036
+ {
2037
+ internalType: "uint256",
2038
+ name: "validBefore",
2039
+ type: "uint256"
2040
+ },
2041
+ {
2042
+ internalType: "bytes32",
2043
+ name: "nonce",
2044
+ type: "bytes32"
2045
+ },
2046
+ {
2047
+ internalType: "uint8",
2048
+ name: "v",
2049
+ type: "uint8"
2050
+ },
2051
+ {
2052
+ internalType: "bytes32",
2053
+ name: "r",
2054
+ type: "bytes32"
2055
+ },
2056
+ {
2057
+ internalType: "bytes32",
2058
+ name: "s",
2059
+ type: "bytes32"
2060
+ }
2061
+ ],
2062
+ name: "settleWithERC3009Direct",
2063
+ outputs: [],
2064
+ stateMutability: "nonpayable",
2065
+ type: "function"
2066
+ },
2067
+ // Events
2068
+ {
2069
+ anonymous: false,
2070
+ inputs: [
2071
+ {
2072
+ indexed: true,
2073
+ internalType: "address",
2074
+ name: "token",
2075
+ type: "address"
2076
+ },
2077
+ {
2078
+ indexed: true,
2079
+ internalType: "address",
2080
+ name: "payer",
2081
+ type: "address"
2082
+ },
2083
+ {
2084
+ indexed: true,
2085
+ internalType: "address",
2086
+ name: "seller",
2087
+ type: "address"
2088
+ },
2089
+ {
2090
+ indexed: false,
2091
+ internalType: "uint256",
2092
+ name: "amount",
2093
+ type: "uint256"
2094
+ },
2095
+ {
2096
+ indexed: false,
2097
+ internalType: "uint256",
2098
+ name: "sellerAmount",
2099
+ type: "uint256"
2100
+ },
2101
+ {
2102
+ indexed: false,
2103
+ internalType: "uint256",
2104
+ name: "feeAmount",
2105
+ type: "uint256"
2106
+ },
2107
+ {
2108
+ indexed: false,
2109
+ internalType: "string",
2110
+ name: "path",
2111
+ type: "string"
2112
+ }
2113
+ ],
2114
+ name: "SettledSplit",
2115
+ type: "event"
2116
+ },
2117
+ {
2118
+ anonymous: false,
2119
+ inputs: [
2120
+ {
2121
+ indexed: true,
2122
+ internalType: "address",
2123
+ name: "token",
2124
+ type: "address"
2125
+ },
2126
+ {
2127
+ indexed: true,
2128
+ internalType: "address",
2129
+ name: "payer",
2130
+ type: "address"
2131
+ },
2132
+ {
2133
+ indexed: true,
2134
+ internalType: "address",
2135
+ name: "seller",
2136
+ type: "address"
2137
+ },
2138
+ {
2139
+ indexed: false,
2140
+ internalType: "uint256",
2141
+ name: "amount",
2142
+ type: "uint256"
2143
+ },
2144
+ {
2145
+ indexed: false,
2146
+ internalType: "string",
2147
+ name: "path",
2148
+ type: "string"
2149
+ }
2150
+ ],
2151
+ name: "SettledDirect",
2152
+ type: "event"
2153
+ }
2154
+ ];
2155
+
1839
2156
  // src/schemes/exact/evm/eip3009/facilitator.ts
1840
2157
  async function verify2(client, payload, paymentRequirements) {
1841
2158
  const exactEvmPayload = payload.payload;
@@ -1900,7 +2217,7 @@ async function verify2(client, payload, paymentRequirements) {
1900
2217
  payer: exactEvmPayload.authorization.from
1901
2218
  };
1902
2219
  }
1903
- if ((0, import_viem2.getAddress)(exactEvmPayload.authorization.to) !== (0, import_viem2.getAddress)(paymentRequirements.payTo)) {
2220
+ if ((0, import_viem2.getAddress)(exactEvmPayload.authorization.to) !== (0, import_viem2.getAddress)(paymentRequirements.payTo) && (0, import_viem2.getAddress)(exactEvmPayload.authorization.to) !== (0, import_viem2.getAddress)(paymentRequirements.extra?.relayer)) {
1904
2221
  return {
1905
2222
  isValid: false,
1906
2223
  invalidReason: "invalid_exact_evm_payload_recipient_mismatch",
@@ -1973,21 +2290,57 @@ async function settle2(wallet, paymentPayload, paymentRequirements) {
1973
2290
  };
1974
2291
  }
1975
2292
  const { signature } = (0, import_viem2.parseErc6492Signature)(payload.signature);
1976
- const tx = await wallet.writeContract({
1977
- address: paymentRequirements.asset,
1978
- abi: usdcABI,
1979
- functionName: "transferWithAuthorization",
1980
- args: [
1981
- payload.authorization.from,
1982
- payload.authorization.to,
1983
- BigInt(payload.authorization.value),
1984
- BigInt(payload.authorization.validAfter),
1985
- BigInt(payload.authorization.validBefore),
1986
- payload.authorization.nonce,
1987
- signature
1988
- ],
1989
- chain: wallet.chain
1990
- });
2293
+ let tx;
2294
+ if (paymentRequirements.extra?.relayer) {
2295
+ const sig = (0, import_viem2.hexToSignature)(signature);
2296
+ const v = Number(sig.v);
2297
+ const r = sig.r;
2298
+ const s = sig.s;
2299
+ tx = await wallet.writeContract({
2300
+ address: paymentRequirements.extra.relayer,
2301
+ abi: permitProxyContractABI,
2302
+ functionName: "settleWithERC3009",
2303
+ args: [
2304
+ paymentRequirements.asset,
2305
+ // token
2306
+ payload.authorization.from,
2307
+ // payer
2308
+ payload.authorization.to,
2309
+ // seller
2310
+ BigInt(payload.authorization.value),
2311
+ // amount
2312
+ BigInt(payload.authorization.validAfter),
2313
+ // validAfter
2314
+ BigInt(payload.authorization.validBefore),
2315
+ // validBefore
2316
+ payload.authorization.nonce,
2317
+ // nonce
2318
+ v,
2319
+ // v (uint8)
2320
+ r,
2321
+ // r (bytes32)
2322
+ s
2323
+ // s (bytes32)
2324
+ ],
2325
+ chain: wallet.chain
2326
+ });
2327
+ } else {
2328
+ tx = await wallet.writeContract({
2329
+ address: paymentRequirements.asset,
2330
+ abi: usdcABI,
2331
+ functionName: "transferWithAuthorization",
2332
+ args: [
2333
+ payload.authorization.from,
2334
+ payload.authorization.to,
2335
+ BigInt(payload.authorization.value),
2336
+ BigInt(payload.authorization.validAfter),
2337
+ BigInt(payload.authorization.validBefore),
2338
+ payload.authorization.nonce,
2339
+ signature
2340
+ ],
2341
+ chain: wallet.chain
2342
+ });
2343
+ }
1991
2344
  const receipt = await wallet.waitForTransactionReceipt({ hash: tx });
1992
2345
  if (receipt.status !== "success") {
1993
2346
  return {
@@ -2023,63 +2376,6 @@ function splitSignature(signature) {
2023
2376
  return { v, r, s };
2024
2377
  }
2025
2378
 
2026
- // src/types/shared/evm/permitProxyABI.ts
2027
- var permitProxyContractABI = [
2028
- {
2029
- inputs: [
2030
- {
2031
- internalType: "address",
2032
- name: "token",
2033
- type: "address"
2034
- },
2035
- {
2036
- internalType: "address",
2037
- name: "owner",
2038
- type: "address"
2039
- },
2040
- {
2041
- internalType: "address",
2042
- name: "spender",
2043
- type: "address"
2044
- },
2045
- {
2046
- internalType: "uint256",
2047
- name: "value",
2048
- type: "uint256"
2049
- },
2050
- {
2051
- internalType: "uint256",
2052
- name: "deadline",
2053
- type: "uint256"
2054
- },
2055
- {
2056
- internalType: "uint8",
2057
- name: "v",
2058
- type: "uint8"
2059
- },
2060
- {
2061
- internalType: "bytes32",
2062
- name: "r",
2063
- type: "bytes32"
2064
- },
2065
- {
2066
- internalType: "bytes32",
2067
- name: "s",
2068
- type: "bytes32"
2069
- },
2070
- {
2071
- internalType: "address",
2072
- name: "to",
2073
- type: "address"
2074
- }
2075
- ],
2076
- name: "permitAndTransfer",
2077
- outputs: [],
2078
- stateMutability: "nonpayable",
2079
- type: "function"
2080
- }
2081
- ];
2082
-
2083
2379
  // src/schemes/exact/evm/permit/facilitator.ts
2084
2380
  async function verify3(client, payload, paymentRequirements) {
2085
2381
  if (payload.payload.authorizationType !== "permit" || payload.scheme !== SCHEME || paymentRequirements.scheme !== SCHEME) {
@@ -2147,8 +2443,8 @@ async function verify3(client, payload, paymentRequirements) {
2147
2443
  payer: owner
2148
2444
  };
2149
2445
  }
2150
- if (paymentRequirements.extra?.proxyAddress) {
2151
- if ((0, import_viem4.getAddress)(spender) !== (0, import_viem4.getAddress)(paymentRequirements.extra?.proxyAddress)) {
2446
+ if (paymentRequirements.extra?.relayer) {
2447
+ if ((0, import_viem4.getAddress)(spender) !== (0, import_viem4.getAddress)(paymentRequirements.extra?.relayer)) {
2152
2448
  return {
2153
2449
  isValid: false,
2154
2450
  invalidReason: "invalid_spender_address",
@@ -2212,21 +2508,28 @@ async function settle3(wallet, paymentPayload, paymentRequirements) {
2212
2508
  address: wallet.account.address
2213
2509
  });
2214
2510
  let transactionHash;
2215
- if (paymentRequirements.extra?.proxyAddress) {
2511
+ if (paymentRequirements.extra?.relayer) {
2216
2512
  transactionHash = await wallet.writeContract({
2217
- address: paymentRequirements.extra.proxyAddress,
2513
+ address: paymentRequirements.extra.relayer,
2218
2514
  abi: permitProxyContractABI,
2219
- functionName: "permitAndTransfer",
2515
+ functionName: "settleWithPermit",
2220
2516
  args: [
2221
2517
  tokenAddress,
2518
+ // token
2222
2519
  owner,
2223
- spender,
2520
+ // payer
2521
+ paymentRequirements.payTo,
2522
+ // seller
2224
2523
  BigInt(value),
2524
+ // amount
2225
2525
  BigInt(deadline),
2526
+ // deadline
2226
2527
  v,
2528
+ // v
2227
2529
  r,
2228
- s,
2229
- paymentRequirements.payTo
2530
+ // r
2531
+ s
2532
+ // s
2230
2533
  ],
2231
2534
  chain: wallet.chain,
2232
2535
  nonce: txNonce
@@ -2295,11 +2598,41 @@ async function verify4(client, payload, paymentRequirements) {
2295
2598
  };
2296
2599
  }
2297
2600
  const permit2Payload = payload.payload;
2298
- const { owner, spender, token, amount, deadline, nonce } = permit2Payload.authorization;
2601
+ const { owner, spender, token, amount, deadline, nonce, to } = permit2Payload.authorization;
2299
2602
  const chainId = getNetworkId(payload.network);
2300
2603
  const tokenAddress = (0, import_viem5.getAddress)(token);
2301
2604
  const ownerAddress = (0, import_viem5.getAddress)(owner);
2302
- const permit2TypedData = {
2605
+ const hasWitness = !!to;
2606
+ if (hasWitness) {
2607
+ if ((0, import_viem5.getAddress)(to) !== (0, import_viem5.getAddress)(paymentRequirements.payTo)) {
2608
+ return {
2609
+ isValid: false,
2610
+ invalidReason: "witness_recipient_mismatch",
2611
+ payer: owner
2612
+ };
2613
+ }
2614
+ }
2615
+ const permit2TypedData = hasWitness ? {
2616
+ types: permit2WitnessTypes,
2617
+ domain: {
2618
+ name: "Permit2",
2619
+ chainId,
2620
+ verifyingContract: PERMIT2_ADDRESS
2621
+ },
2622
+ primaryType: "PermitWitnessTransferFrom",
2623
+ message: {
2624
+ permitted: {
2625
+ token: tokenAddress,
2626
+ amount
2627
+ },
2628
+ spender: (0, import_viem5.getAddress)(spender),
2629
+ nonce,
2630
+ deadline,
2631
+ witness: {
2632
+ to: (0, import_viem5.getAddress)(to)
2633
+ }
2634
+ }
2635
+ } : {
2303
2636
  types: permit2Types,
2304
2637
  domain: {
2305
2638
  name: "Permit2",
@@ -2325,7 +2658,7 @@ async function verify4(client, payload, paymentRequirements) {
2325
2658
  if (!recoveredAddress) {
2326
2659
  return {
2327
2660
  isValid: false,
2328
- invalidReason: "invalid_permit2_signature",
2661
+ invalidReason: hasWitness ? "invalid_permit2_witness_signature" : "invalid_permit2_signature",
2329
2662
  payer: owner
2330
2663
  };
2331
2664
  }
@@ -2400,10 +2733,34 @@ async function settle4(wallet, paymentPayload, paymentRequirements) {
2400
2733
  payer: permit2Payload.authorization.owner
2401
2734
  };
2402
2735
  }
2403
- const { owner, token, amount, deadline, nonce } = permit2Payload.authorization;
2736
+ const { owner, token, amount, deadline, nonce, to } = permit2Payload.authorization;
2404
2737
  const tokenAddress = (0, import_viem5.getAddress)(token);
2405
2738
  const ownerAddress = (0, import_viem5.getAddress)(owner);
2406
- const tx = await wallet.writeContract({
2739
+ const hasWitness = !!to;
2740
+ const tx = hasWitness ? await wallet.writeContract({
2741
+ address: PERMIT2_ADDRESS,
2742
+ abi: permit2ABI,
2743
+ functionName: "permitWitnessTransferFrom",
2744
+ args: [
2745
+ {
2746
+ permitted: {
2747
+ token: tokenAddress,
2748
+ amount: BigInt(amount)
2749
+ },
2750
+ nonce: BigInt(nonce),
2751
+ deadline: BigInt(deadline)
2752
+ },
2753
+ {
2754
+ to: paymentRequirements.payTo,
2755
+ requestedAmount: BigInt(amount)
2756
+ },
2757
+ ownerAddress,
2758
+ (0, import_viem5.keccak256)((0, import_viem5.encodeAbiParameters)([{ type: "address", name: "to" }], [(0, import_viem5.getAddress)(to)])),
2759
+ WITNESS_TYPE_STRING,
2760
+ permit2Payload.signature
2761
+ ],
2762
+ chain: wallet.chain
2763
+ }) : await wallet.writeContract({
2407
2764
  address: PERMIT2_ADDRESS,
2408
2765
  abi: permit2ABI,
2409
2766
  functionName: "permitTransferFrom",