@bankofai/x402-evm 1.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/README.md +172 -0
  2. package/dist/cjs/auth-capture/client/index.d.ts +44 -0
  3. package/dist/cjs/auth-capture/client/index.js +298 -0
  4. package/dist/cjs/auth-capture/client/index.js.map +1 -0
  5. package/dist/cjs/batch-settlement/client/file-storage.d.ts +47 -0
  6. package/dist/cjs/batch-settlement/client/file-storage.js +116 -0
  7. package/dist/cjs/batch-settlement/client/file-storage.js.map +1 -0
  8. package/dist/cjs/batch-settlement/client/index.d.ts +111 -0
  9. package/dist/cjs/batch-settlement/client/index.js +1565 -0
  10. package/dist/cjs/batch-settlement/client/index.js.map +1 -0
  11. package/dist/cjs/batch-settlement/facilitator/index.d.ts +72 -0
  12. package/dist/cjs/batch-settlement/facilitator/index.js +2102 -0
  13. package/dist/cjs/batch-settlement/facilitator/index.js.map +1 -0
  14. package/dist/cjs/batch-settlement/server/file-storage.d.ts +53 -0
  15. package/dist/cjs/batch-settlement/server/file-storage.js +181 -0
  16. package/dist/cjs/batch-settlement/server/file-storage.js.map +1 -0
  17. package/dist/cjs/batch-settlement/server/index.d.ts +491 -0
  18. package/dist/cjs/batch-settlement/server/index.js +1978 -0
  19. package/dist/cjs/batch-settlement/server/index.js.map +1 -0
  20. package/dist/cjs/batch-settlement/server/redis-storage.d.ts +87 -0
  21. package/dist/cjs/batch-settlement/server/redis-storage.js +181 -0
  22. package/dist/cjs/batch-settlement/server/redis-storage.js.map +1 -0
  23. package/dist/cjs/client/agent-wallet.d.ts +69 -0
  24. package/dist/cjs/client/agent-wallet.js +84 -0
  25. package/dist/cjs/client/agent-wallet.js.map +1 -0
  26. package/dist/cjs/exact/client/index.d.ts +63 -0
  27. package/dist/cjs/exact/client/index.js +739 -0
  28. package/dist/cjs/exact/client/index.js.map +1 -0
  29. package/dist/cjs/exact/facilitator/index.d.ts +141 -0
  30. package/dist/cjs/exact/facilitator/index.js +1989 -0
  31. package/dist/cjs/exact/facilitator/index.js.map +1 -0
  32. package/dist/cjs/exact/server/index.d.ts +118 -0
  33. package/dist/cjs/exact/server/index.js +326 -0
  34. package/dist/cjs/exact/server/index.js.map +1 -0
  35. package/dist/cjs/exact/v1/client/index.d.ts +38 -0
  36. package/dist/cjs/exact/v1/client/index.js +193 -0
  37. package/dist/cjs/exact/v1/client/index.js.map +1 -0
  38. package/dist/cjs/exact/v1/facilitator/index.d.ts +84 -0
  39. package/dist/cjs/exact/v1/facilitator/index.js +739 -0
  40. package/dist/cjs/exact/v1/facilitator/index.js.map +1 -0
  41. package/dist/cjs/facilitator/agent-wallet.d.ts +109 -0
  42. package/dist/cjs/facilitator/agent-wallet.js +105 -0
  43. package/dist/cjs/facilitator/agent-wallet.js.map +1 -0
  44. package/dist/cjs/index.d.ts +338 -0
  45. package/dist/cjs/index.js +2860 -0
  46. package/dist/cjs/index.js.map +1 -0
  47. package/dist/cjs/permit2-DK5A8alk.d.ts +729 -0
  48. package/dist/cjs/permit2-DhJRUcgY.d.ts +729 -0
  49. package/dist/cjs/rpc-DULZzRne.d.ts +13 -0
  50. package/dist/cjs/scheme-7ehldYoO.d.ts +307 -0
  51. package/dist/cjs/scheme-BjBJzHF7.d.ts +307 -0
  52. package/dist/cjs/scheme-DWgpkDgz.d.ts +47 -0
  53. package/dist/cjs/signer-BFelv8DL.d.ts +170 -0
  54. package/dist/cjs/storage-6W5MO46W.d.ts +50 -0
  55. package/dist/cjs/storage-CHNote8s.d.ts +81 -0
  56. package/dist/cjs/storage-DjCv5IPh.d.ts +81 -0
  57. package/dist/cjs/types-CKd3Xoi1.d.ts +180 -0
  58. package/dist/cjs/types-DIt9uAUy.d.ts +180 -0
  59. package/dist/cjs/upto/client/index.d.ts +34 -0
  60. package/dist/cjs/upto/client/index.js +509 -0
  61. package/dist/cjs/upto/client/index.js.map +1 -0
  62. package/dist/cjs/upto/facilitator/index.d.ts +54 -0
  63. package/dist/cjs/upto/facilitator/index.js +1313 -0
  64. package/dist/cjs/upto/facilitator/index.js.map +1 -0
  65. package/dist/cjs/upto/server/index.d.ts +69 -0
  66. package/dist/cjs/upto/server/index.js +296 -0
  67. package/dist/cjs/upto/server/index.js.map +1 -0
  68. package/dist/cjs/v1/index.d.ts +40 -0
  69. package/dist/cjs/v1/index.js +199 -0
  70. package/dist/cjs/v1/index.js.map +1 -0
  71. package/dist/esm/auth-capture/client/index.d.mts +44 -0
  72. package/dist/esm/auth-capture/client/index.mjs +8 -0
  73. package/dist/esm/auth-capture/client/index.mjs.map +1 -0
  74. package/dist/esm/batch-settlement/client/file-storage.d.mts +47 -0
  75. package/dist/esm/batch-settlement/client/file-storage.mjs +63 -0
  76. package/dist/esm/batch-settlement/client/file-storage.mjs.map +1 -0
  77. package/dist/esm/batch-settlement/client/index.d.mts +111 -0
  78. package/dist/esm/batch-settlement/client/index.mjs +58 -0
  79. package/dist/esm/batch-settlement/client/index.mjs.map +1 -0
  80. package/dist/esm/batch-settlement/facilitator/index.d.mts +72 -0
  81. package/dist/esm/batch-settlement/facilitator/index.mjs +1252 -0
  82. package/dist/esm/batch-settlement/facilitator/index.mjs.map +1 -0
  83. package/dist/esm/batch-settlement/server/file-storage.d.mts +53 -0
  84. package/dist/esm/batch-settlement/server/file-storage.mjs +128 -0
  85. package/dist/esm/batch-settlement/server/file-storage.mjs.map +1 -0
  86. package/dist/esm/batch-settlement/server/index.d.mts +491 -0
  87. package/dist/esm/batch-settlement/server/index.mjs +1640 -0
  88. package/dist/esm/batch-settlement/server/index.mjs.map +1 -0
  89. package/dist/esm/batch-settlement/server/redis-storage.d.mts +87 -0
  90. package/dist/esm/batch-settlement/server/redis-storage.mjs +156 -0
  91. package/dist/esm/batch-settlement/server/redis-storage.mjs.map +1 -0
  92. package/dist/esm/chunk-2EUQTNJO.mjs +38 -0
  93. package/dist/esm/chunk-2EUQTNJO.mjs.map +1 -0
  94. package/dist/esm/chunk-3WZF6722.mjs +36 -0
  95. package/dist/esm/chunk-3WZF6722.mjs.map +1 -0
  96. package/dist/esm/chunk-E4Z7PNXC.mjs +275 -0
  97. package/dist/esm/chunk-E4Z7PNXC.mjs.map +1 -0
  98. package/dist/esm/chunk-GQVMVP4N.mjs +911 -0
  99. package/dist/esm/chunk-GQVMVP4N.mjs.map +1 -0
  100. package/dist/esm/chunk-H2EYJIZL.mjs +489 -0
  101. package/dist/esm/chunk-H2EYJIZL.mjs.map +1 -0
  102. package/dist/esm/chunk-H3KPLYGI.mjs +152 -0
  103. package/dist/esm/chunk-H3KPLYGI.mjs.map +1 -0
  104. package/dist/esm/chunk-HYABYUBD.mjs +432 -0
  105. package/dist/esm/chunk-HYABYUBD.mjs.map +1 -0
  106. package/dist/esm/chunk-I2DVUHM5.mjs +123 -0
  107. package/dist/esm/chunk-I2DVUHM5.mjs.map +1 -0
  108. package/dist/esm/chunk-JK7SLLF7.mjs +34 -0
  109. package/dist/esm/chunk-JK7SLLF7.mjs.map +1 -0
  110. package/dist/esm/chunk-JNT7C46S.mjs +352 -0
  111. package/dist/esm/chunk-JNT7C46S.mjs.map +1 -0
  112. package/dist/esm/chunk-MACPBXCT.mjs +415 -0
  113. package/dist/esm/chunk-MACPBXCT.mjs.map +1 -0
  114. package/dist/esm/chunk-P3QOX3QZ.mjs +113 -0
  115. package/dist/esm/chunk-P3QOX3QZ.mjs.map +1 -0
  116. package/dist/esm/chunk-QVATVA3J.mjs +47 -0
  117. package/dist/esm/chunk-QVATVA3J.mjs.map +1 -0
  118. package/dist/esm/chunk-SHJFA25H.mjs +159 -0
  119. package/dist/esm/chunk-SHJFA25H.mjs.map +1 -0
  120. package/dist/esm/chunk-TW7Z65AO.mjs +34 -0
  121. package/dist/esm/chunk-TW7Z65AO.mjs.map +1 -0
  122. package/dist/esm/chunk-U4HCGTLU.mjs +35 -0
  123. package/dist/esm/chunk-U4HCGTLU.mjs.map +1 -0
  124. package/dist/esm/chunk-VS3RYAYE.mjs +80 -0
  125. package/dist/esm/chunk-VS3RYAYE.mjs.map +1 -0
  126. package/dist/esm/chunk-W6ON4LG2.mjs +39 -0
  127. package/dist/esm/chunk-W6ON4LG2.mjs.map +1 -0
  128. package/dist/esm/chunk-XG2JLZVJ.mjs +627 -0
  129. package/dist/esm/chunk-XG2JLZVJ.mjs.map +1 -0
  130. package/dist/esm/chunk-ZCJRY5LQ.mjs +162 -0
  131. package/dist/esm/chunk-ZCJRY5LQ.mjs.map +1 -0
  132. package/dist/esm/client/agent-wallet.d.mts +69 -0
  133. package/dist/esm/client/agent-wallet.mjs +36 -0
  134. package/dist/esm/client/agent-wallet.mjs.map +1 -0
  135. package/dist/esm/exact/client/index.d.mts +63 -0
  136. package/dist/esm/exact/client/index.mjs +25 -0
  137. package/dist/esm/exact/client/index.mjs.map +1 -0
  138. package/dist/esm/exact/facilitator/index.d.mts +141 -0
  139. package/dist/esm/exact/facilitator/index.mjs +694 -0
  140. package/dist/esm/exact/facilitator/index.mjs.map +1 -0
  141. package/dist/esm/exact/server/index.d.mts +118 -0
  142. package/dist/esm/exact/server/index.mjs +153 -0
  143. package/dist/esm/exact/server/index.mjs.map +1 -0
  144. package/dist/esm/exact/v1/client/index.d.mts +38 -0
  145. package/dist/esm/exact/v1/client/index.mjs +12 -0
  146. package/dist/esm/exact/v1/client/index.mjs.map +1 -0
  147. package/dist/esm/exact/v1/facilitator/index.d.mts +84 -0
  148. package/dist/esm/exact/v1/facilitator/index.mjs +12 -0
  149. package/dist/esm/exact/v1/facilitator/index.mjs.map +1 -0
  150. package/dist/esm/facilitator/agent-wallet.d.mts +109 -0
  151. package/dist/esm/facilitator/agent-wallet.mjs +74 -0
  152. package/dist/esm/facilitator/agent-wallet.mjs.map +1 -0
  153. package/dist/esm/index.d.mts +338 -0
  154. package/dist/esm/index.mjs +144 -0
  155. package/dist/esm/index.mjs.map +1 -0
  156. package/dist/esm/permit2-DhJRUcgY.d.mts +729 -0
  157. package/dist/esm/rpc-DULZzRne.d.mts +13 -0
  158. package/dist/esm/scheme-CkNhpXrG.d.mts +307 -0
  159. package/dist/esm/scheme-D8ZbykGV.d.mts +47 -0
  160. package/dist/esm/signer-BFelv8DL.d.mts +170 -0
  161. package/dist/esm/storage-6W5MO46W.d.mts +50 -0
  162. package/dist/esm/storage-BEzTEiUr.d.mts +81 -0
  163. package/dist/esm/types-DIt9uAUy.d.mts +180 -0
  164. package/dist/esm/upto/client/index.d.mts +34 -0
  165. package/dist/esm/upto/client/index.mjs +22 -0
  166. package/dist/esm/upto/client/index.mjs.map +1 -0
  167. package/dist/esm/upto/facilitator/index.d.mts +54 -0
  168. package/dist/esm/upto/facilitator/index.mjs +507 -0
  169. package/dist/esm/upto/facilitator/index.mjs.map +1 -0
  170. package/dist/esm/upto/server/index.d.mts +69 -0
  171. package/dist/esm/upto/server/index.mjs +124 -0
  172. package/dist/esm/upto/server/index.mjs.map +1 -0
  173. package/dist/esm/v1/index.d.mts +40 -0
  174. package/dist/esm/v1/index.mjs +18 -0
  175. package/dist/esm/v1/index.mjs.map +1 -0
  176. package/package.json +250 -0
@@ -0,0 +1,507 @@
1
+ import {
2
+ isUptoPermit2Payload
3
+ } from "../../chunk-JK7SLLF7.mjs";
4
+ import "../../chunk-U4HCGTLU.mjs";
5
+ import {
6
+ ErrUptoFacilitatorMismatch,
7
+ ErrUptoInvalidScheme,
8
+ ErrUptoNetworkMismatch,
9
+ ErrUptoSettlementExceedsAmount,
10
+ buildUptoPermit2SettleArgs,
11
+ checkPermit2Prerequisites,
12
+ diagnosePermit2SimulationFailure,
13
+ mapSettleError,
14
+ simulatePermit2Settle,
15
+ simulatePermit2SettleWithErc20Approval,
16
+ simulatePermit2SettleWithPermit,
17
+ splitEip2612Signature,
18
+ validateEip2612PermitForPayment,
19
+ validateErc20ApprovalForPayment,
20
+ waitAndReturnSettleResponse
21
+ } from "../../chunk-H2EYJIZL.mjs";
22
+ import {
23
+ ErrAssetNotDeployedContract,
24
+ ErrPermit2AmountMismatch
25
+ } from "../../chunk-P3QOX3QZ.mjs";
26
+ import {
27
+ ERC20_APPROVAL_GAS_SPONSORING_KEY,
28
+ appendDataSuffix,
29
+ extractEip2612GasSponsoringInfo,
30
+ extractErc20ApprovalGasSponsoringInfo,
31
+ resolveDataSuffix,
32
+ resolveErc20ApprovalExtensionSigner
33
+ } from "../../chunk-JNT7C46S.mjs";
34
+ import {
35
+ PERMIT2_ADDRESS,
36
+ uptoPermit2WitnessTypes,
37
+ x402UptoPermit2ProxyABI,
38
+ x402UptoPermit2ProxyAddress
39
+ } from "../../chunk-MACPBXCT.mjs";
40
+ import "../../chunk-VS3RYAYE.mjs";
41
+ import {
42
+ getEvmChainId
43
+ } from "../../chunk-TW7Z65AO.mjs";
44
+
45
+ // src/upto/facilitator/permit2.ts
46
+ import { getAddress, encodeFunctionData } from "viem";
47
+ var uptoProxyConfig = {
48
+ proxyAddress: x402UptoPermit2ProxyAddress,
49
+ proxyABI: x402UptoPermit2ProxyABI
50
+ };
51
+ async function verifyUptoPermit2(signer, payload, requirements, permit2Payload, context, options) {
52
+ const payer = permit2Payload.permit2Authorization.from;
53
+ if (payload.accepted.scheme !== "upto" || requirements.scheme !== "upto") {
54
+ return {
55
+ isValid: false,
56
+ invalidReason: ErrUptoInvalidScheme,
57
+ payer
58
+ };
59
+ }
60
+ if (payload.accepted.network !== requirements.network) {
61
+ return {
62
+ isValid: false,
63
+ invalidReason: ErrUptoNetworkMismatch,
64
+ payer
65
+ };
66
+ }
67
+ const chainId = getEvmChainId(requirements.network);
68
+ const tokenAddress = getAddress(requirements.asset);
69
+ const assetBytecode = await signer.getCode({ address: tokenAddress });
70
+ if (!assetBytecode || assetBytecode === "0x") {
71
+ return { isValid: false, invalidReason: ErrAssetNotDeployedContract, payer };
72
+ }
73
+ if (getAddress(permit2Payload.permit2Authorization.spender) !== getAddress(x402UptoPermit2ProxyAddress)) {
74
+ return {
75
+ isValid: false,
76
+ invalidReason: "invalid_permit2_spender",
77
+ payer
78
+ };
79
+ }
80
+ if (getAddress(permit2Payload.permit2Authorization.witness.to) !== getAddress(requirements.payTo)) {
81
+ return {
82
+ isValid: false,
83
+ invalidReason: "invalid_permit2_recipient_mismatch",
84
+ payer
85
+ };
86
+ }
87
+ const facilitatorAddresses = signer.getAddresses();
88
+ const witnessFacilitator = getAddress(permit2Payload.permit2Authorization.witness.facilitator);
89
+ const isFacilitatorMatch = facilitatorAddresses.some(
90
+ (addr) => getAddress(addr) === witnessFacilitator
91
+ );
92
+ if (!isFacilitatorMatch) {
93
+ return {
94
+ isValid: false,
95
+ invalidReason: ErrUptoFacilitatorMismatch,
96
+ payer
97
+ };
98
+ }
99
+ const now = Math.floor(Date.now() / 1e3);
100
+ if (BigInt(permit2Payload.permit2Authorization.deadline) < BigInt(now + 6)) {
101
+ return {
102
+ isValid: false,
103
+ invalidReason: "permit2_deadline_expired",
104
+ payer
105
+ };
106
+ }
107
+ if (BigInt(permit2Payload.permit2Authorization.witness.validAfter) > BigInt(now)) {
108
+ return {
109
+ isValid: false,
110
+ invalidReason: "permit2_not_yet_valid",
111
+ payer
112
+ };
113
+ }
114
+ if (BigInt(permit2Payload.permit2Authorization.permitted.amount) !== BigInt(requirements.amount)) {
115
+ return {
116
+ isValid: false,
117
+ invalidReason: ErrPermit2AmountMismatch,
118
+ payer
119
+ };
120
+ }
121
+ if (getAddress(permit2Payload.permit2Authorization.permitted.token) !== tokenAddress) {
122
+ return {
123
+ isValid: false,
124
+ invalidReason: "permit2_token_mismatch",
125
+ payer
126
+ };
127
+ }
128
+ const permit2TypedData = {
129
+ types: uptoPermit2WitnessTypes,
130
+ primaryType: "PermitWitnessTransferFrom",
131
+ domain: {
132
+ name: "Permit2",
133
+ chainId,
134
+ verifyingContract: PERMIT2_ADDRESS
135
+ },
136
+ message: {
137
+ permitted: {
138
+ token: getAddress(permit2Payload.permit2Authorization.permitted.token),
139
+ amount: BigInt(permit2Payload.permit2Authorization.permitted.amount)
140
+ },
141
+ spender: getAddress(permit2Payload.permit2Authorization.spender),
142
+ nonce: BigInt(permit2Payload.permit2Authorization.nonce),
143
+ deadline: BigInt(permit2Payload.permit2Authorization.deadline),
144
+ witness: {
145
+ to: getAddress(permit2Payload.permit2Authorization.witness.to),
146
+ facilitator: getAddress(permit2Payload.permit2Authorization.witness.facilitator),
147
+ validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter)
148
+ }
149
+ }
150
+ };
151
+ let signatureValid = false;
152
+ try {
153
+ signatureValid = await signer.verifyTypedData({
154
+ address: payer,
155
+ ...permit2TypedData,
156
+ signature: permit2Payload.signature
157
+ });
158
+ } catch {
159
+ signatureValid = false;
160
+ }
161
+ if (!signatureValid) {
162
+ const bytecode = await signer.getCode({ address: payer });
163
+ const isDeployedContract = bytecode && bytecode !== "0x";
164
+ if (!isDeployedContract) {
165
+ return {
166
+ isValid: false,
167
+ invalidReason: "invalid_permit2_signature",
168
+ payer
169
+ };
170
+ }
171
+ }
172
+ if (options?.simulate === false) {
173
+ return { isValid: true, invalidReason: void 0, payer };
174
+ }
175
+ const facilitatorAddress = getAddress(permit2Payload.permit2Authorization.witness.facilitator);
176
+ const uptoSettleArgs = buildUptoPermit2SettleArgs(
177
+ permit2Payload,
178
+ BigInt(requirements.amount),
179
+ facilitatorAddress
180
+ );
181
+ const eip2612InfoForSim = extractEip2612GasSponsoringInfo(payload);
182
+ if (eip2612InfoForSim) {
183
+ const fieldResult = validateEip2612PermitForPayment(eip2612InfoForSim, payer, tokenAddress);
184
+ if (!fieldResult.isValid) {
185
+ return { isValid: false, invalidReason: fieldResult.invalidReason, payer };
186
+ }
187
+ const simOk2 = await simulatePermit2SettleWithPermit(
188
+ uptoProxyConfig,
189
+ signer,
190
+ uptoSettleArgs,
191
+ eip2612InfoForSim
192
+ );
193
+ if (!simOk2) {
194
+ return diagnosePermit2SimulationFailure(
195
+ uptoProxyConfig,
196
+ signer,
197
+ tokenAddress,
198
+ permit2Payload,
199
+ requirements.amount
200
+ );
201
+ }
202
+ return { isValid: true, invalidReason: void 0, payer };
203
+ }
204
+ const erc20GasSponsorshipExtension = context?.getExtension(
205
+ ERC20_APPROVAL_GAS_SPONSORING_KEY
206
+ );
207
+ if (erc20GasSponsorshipExtension) {
208
+ const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);
209
+ if (erc20Info) {
210
+ const fieldResult = await validateErc20ApprovalForPayment(erc20Info, payer, tokenAddress);
211
+ if (!fieldResult.isValid) {
212
+ return { isValid: false, invalidReason: fieldResult.invalidReason, payer };
213
+ }
214
+ const extensionSigner = resolveErc20ApprovalExtensionSigner(
215
+ erc20GasSponsorshipExtension,
216
+ requirements.network
217
+ );
218
+ if (extensionSigner?.simulateTransactions) {
219
+ const simOk2 = await simulatePermit2SettleWithErc20Approval(
220
+ uptoProxyConfig,
221
+ extensionSigner,
222
+ uptoSettleArgs,
223
+ erc20Info
224
+ );
225
+ if (!simOk2) {
226
+ return diagnosePermit2SimulationFailure(
227
+ uptoProxyConfig,
228
+ signer,
229
+ tokenAddress,
230
+ permit2Payload,
231
+ requirements.amount
232
+ );
233
+ }
234
+ return { isValid: true, invalidReason: void 0, payer };
235
+ }
236
+ return checkPermit2Prerequisites(
237
+ uptoProxyConfig,
238
+ signer,
239
+ tokenAddress,
240
+ payer,
241
+ requirements.amount
242
+ );
243
+ }
244
+ }
245
+ const simOk = await simulatePermit2Settle(uptoProxyConfig, signer, uptoSettleArgs);
246
+ if (!simOk) {
247
+ return diagnosePermit2SimulationFailure(
248
+ uptoProxyConfig,
249
+ signer,
250
+ tokenAddress,
251
+ permit2Payload,
252
+ requirements.amount
253
+ );
254
+ }
255
+ return {
256
+ isValid: true,
257
+ invalidReason: void 0,
258
+ payer
259
+ };
260
+ }
261
+ async function settleUptoPermit2(signer, payload, requirements, permit2Payload, context, config) {
262
+ const payer = permit2Payload.permit2Authorization.from;
263
+ const settlementAmount = BigInt(requirements.amount);
264
+ const verifyRequirements = {
265
+ ...requirements,
266
+ amount: permit2Payload.permit2Authorization.permitted.amount
267
+ };
268
+ const valid = await verifyUptoPermit2(
269
+ signer,
270
+ payload,
271
+ verifyRequirements,
272
+ permit2Payload,
273
+ context,
274
+ { simulate: config?.simulateInSettle ?? true }
275
+ );
276
+ if (!valid.isValid) {
277
+ return {
278
+ success: false,
279
+ network: payload.accepted.network,
280
+ transaction: "",
281
+ errorReason: valid.invalidReason ?? "invalid_scheme",
282
+ payer
283
+ };
284
+ }
285
+ if (settlementAmount === 0n) {
286
+ return {
287
+ success: true,
288
+ transaction: "",
289
+ network: payload.accepted.network,
290
+ payer,
291
+ amount: "0"
292
+ };
293
+ }
294
+ if (settlementAmount > BigInt(permit2Payload.permit2Authorization.permitted.amount)) {
295
+ return {
296
+ success: false,
297
+ network: payload.accepted.network,
298
+ transaction: "",
299
+ errorReason: ErrUptoSettlementExceedsAmount,
300
+ payer
301
+ };
302
+ }
303
+ const facilitatorAddress = getAddress(permit2Payload.permit2Authorization.witness.facilitator);
304
+ const dataSuffix = await resolveDataSuffix(context, {
305
+ paymentPayload: payload,
306
+ paymentRequirements: requirements
307
+ });
308
+ const eip2612Info = extractEip2612GasSponsoringInfo(payload);
309
+ if (eip2612Info) {
310
+ return settleUptoWithEIP2612(
311
+ signer,
312
+ payload,
313
+ permit2Payload,
314
+ eip2612Info,
315
+ settlementAmount,
316
+ facilitatorAddress,
317
+ dataSuffix
318
+ );
319
+ }
320
+ const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);
321
+ if (erc20Info) {
322
+ const erc20GasSponsorshipExtension = context?.getExtension(
323
+ ERC20_APPROVAL_GAS_SPONSORING_KEY
324
+ );
325
+ const extensionSigner = resolveErc20ApprovalExtensionSigner(
326
+ erc20GasSponsorshipExtension,
327
+ payload.accepted.network
328
+ );
329
+ if (extensionSigner) {
330
+ return settleUptoWithERC20Approval(
331
+ extensionSigner,
332
+ payload,
333
+ permit2Payload,
334
+ erc20Info,
335
+ settlementAmount,
336
+ facilitatorAddress,
337
+ dataSuffix
338
+ );
339
+ }
340
+ }
341
+ return settleUptoDirect(
342
+ signer,
343
+ payload,
344
+ permit2Payload,
345
+ settlementAmount,
346
+ facilitatorAddress,
347
+ dataSuffix
348
+ );
349
+ }
350
+ async function settleUptoWithEIP2612(signer, payload, permit2Payload, eip2612Info, settlementAmount, facilitatorAddress, dataSuffix) {
351
+ const payer = permit2Payload.permit2Authorization.from;
352
+ try {
353
+ const { v, r, s } = splitEip2612Signature(eip2612Info.signature);
354
+ const tx = await signer.writeContract({
355
+ address: uptoProxyConfig.proxyAddress,
356
+ abi: uptoProxyConfig.proxyABI,
357
+ functionName: "settleWithPermit",
358
+ args: [
359
+ {
360
+ value: BigInt(eip2612Info.amount),
361
+ deadline: BigInt(eip2612Info.deadline),
362
+ r,
363
+ s,
364
+ v
365
+ },
366
+ ...buildUptoPermit2SettleArgs(permit2Payload, settlementAmount, facilitatorAddress)
367
+ ],
368
+ dataSuffix
369
+ });
370
+ const response = await waitAndReturnSettleResponse(signer, tx, payload, payer);
371
+ return { ...response, amount: settlementAmount.toString() };
372
+ } catch (error) {
373
+ return mapSettleError(error, payload, payer);
374
+ }
375
+ }
376
+ async function settleUptoWithERC20Approval(extensionSigner, payload, permit2Payload, erc20Info, settlementAmount, facilitatorAddress, dataSuffix) {
377
+ const payer = permit2Payload.permit2Authorization.from;
378
+ try {
379
+ const settleData = appendDataSuffix(
380
+ encodeFunctionData({
381
+ abi: uptoProxyConfig.proxyABI,
382
+ functionName: "settle",
383
+ args: buildUptoPermit2SettleArgs(permit2Payload, settlementAmount, facilitatorAddress)
384
+ }),
385
+ dataSuffix
386
+ );
387
+ const txHashes = await extensionSigner.sendTransactions([
388
+ erc20Info.signedTransaction,
389
+ { to: uptoProxyConfig.proxyAddress, data: settleData, gas: BigInt(3e5) }
390
+ ]);
391
+ const settleTxHash = txHashes[txHashes.length - 1];
392
+ const response = await waitAndReturnSettleResponse(
393
+ extensionSigner,
394
+ settleTxHash,
395
+ payload,
396
+ payer
397
+ );
398
+ return { ...response, amount: settlementAmount.toString() };
399
+ } catch (error) {
400
+ return mapSettleError(error, payload, payer);
401
+ }
402
+ }
403
+ async function settleUptoDirect(signer, payload, permit2Payload, settlementAmount, facilitatorAddress, dataSuffix) {
404
+ const payer = permit2Payload.permit2Authorization.from;
405
+ try {
406
+ const tx = await signer.writeContract({
407
+ address: uptoProxyConfig.proxyAddress,
408
+ abi: uptoProxyConfig.proxyABI,
409
+ functionName: "settle",
410
+ args: buildUptoPermit2SettleArgs(permit2Payload, settlementAmount, facilitatorAddress),
411
+ dataSuffix
412
+ });
413
+ const response = await waitAndReturnSettleResponse(signer, tx, payload, payer);
414
+ return { ...response, amount: settlementAmount.toString() };
415
+ } catch (error) {
416
+ return mapSettleError(error, payload, payer);
417
+ }
418
+ }
419
+
420
+ // src/upto/facilitator/scheme.ts
421
+ var UptoEvmScheme = class {
422
+ /**
423
+ * Creates a new UptoEvmScheme facilitator instance.
424
+ *
425
+ * @param signer - The EVM signer for facilitator operations
426
+ */
427
+ constructor(signer) {
428
+ this.signer = signer;
429
+ this.scheme = "upto";
430
+ this.caipFamily = "eip155:*";
431
+ }
432
+ /**
433
+ * Returns extra metadata required by the upto scheme, including the facilitator address.
434
+ *
435
+ * @param _ - The network identifier (unused)
436
+ * @returns Object with facilitatorAddress, or undefined if no signer addresses are available
437
+ */
438
+ getExtra(_) {
439
+ const addresses = this.signer.getAddresses();
440
+ if (addresses.length === 0) {
441
+ return void 0;
442
+ }
443
+ return { facilitatorAddress: addresses[Math.floor(Math.random() * addresses.length)] };
444
+ }
445
+ /**
446
+ * Returns the list of facilitator signer addresses for the upto scheme.
447
+ *
448
+ * @param _ - The network identifier (unused)
449
+ * @returns Array of facilitator signer addresses
450
+ */
451
+ getSigners(_) {
452
+ return [...this.signer.getAddresses()];
453
+ }
454
+ /**
455
+ * Verifies an upto Permit2 payment payload against the given requirements.
456
+ *
457
+ * @param payload - The payment payload to verify
458
+ * @param requirements - The payment requirements to verify against
459
+ * @param context - Optional facilitator context
460
+ * @param _ - Payment required extensions (unused; reserved for interface parity)
461
+ * @returns Promise resolving to a verification response
462
+ */
463
+ async verify(payload, requirements, context, _) {
464
+ const rawPayload = payload.payload;
465
+ if (!isUptoPermit2Payload(rawPayload)) {
466
+ return { isValid: false, invalidReason: "unsupported_payload_type", payer: "" };
467
+ }
468
+ return verifyUptoPermit2(
469
+ this.signer,
470
+ payload,
471
+ requirements,
472
+ rawPayload,
473
+ context
474
+ );
475
+ }
476
+ /**
477
+ * Settles an upto Permit2 payment on-chain.
478
+ *
479
+ * @param payload - The payment payload to settle
480
+ * @param requirements - The payment requirements
481
+ * @param context - Optional facilitator context
482
+ * @returns Promise resolving to a settlement response
483
+ */
484
+ async settle(payload, requirements, context) {
485
+ const rawPayload = payload.payload;
486
+ if (!isUptoPermit2Payload(rawPayload)) {
487
+ return {
488
+ success: false,
489
+ network: payload.accepted.network,
490
+ transaction: "",
491
+ errorReason: "unsupported_payload_type",
492
+ payer: ""
493
+ };
494
+ }
495
+ return settleUptoPermit2(
496
+ this.signer,
497
+ payload,
498
+ requirements,
499
+ rawPayload,
500
+ context
501
+ );
502
+ }
503
+ };
504
+ export {
505
+ UptoEvmScheme
506
+ };
507
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/upto/facilitator/permit2.ts","../../../../src/upto/facilitator/scheme.ts"],"sourcesContent":["import {\n PaymentPayload,\n PaymentRequirements,\n FacilitatorContext,\n SettleResponse,\n VerifyResponse,\n} from \"@bankofai/x402-core/types\";\nimport {\n extractEip2612GasSponsoringInfo,\n extractErc20ApprovalGasSponsoringInfo,\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n resolveErc20ApprovalExtensionSigner,\n type Erc20ApprovalGasSponsoringFacilitatorExtension,\n type Erc20ApprovalGasSponsoringSigner,\n} from \"../../exact/extensions\";\nimport { getAddress, encodeFunctionData } from \"viem\";\nimport { appendDataSuffix, resolveDataSuffix } from \"../../shared/extensions\";\nimport {\n PERMIT2_ADDRESS,\n uptoPermit2WitnessTypes,\n x402UptoPermit2ProxyABI,\n x402UptoPermit2ProxyAddress,\n} from \"../../constants\";\nimport {\n ErrAssetNotDeployedContract,\n ErrPermit2AmountMismatch,\n ErrUptoSettlementExceedsAmount,\n ErrUptoFacilitatorMismatch,\n ErrUptoInvalidScheme,\n ErrUptoNetworkMismatch,\n} from \"./errors\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { UptoPermit2Payload } from \"../../types\";\nimport { getEvmChainId } from \"../../utils\";\nimport { validateErc20ApprovalForPayment } from \"../../shared/erc20approval\";\nimport {\n buildUptoPermit2SettleArgs,\n waitAndReturnSettleResponse,\n mapSettleError,\n splitEip2612Signature,\n simulatePermit2Settle,\n simulatePermit2SettleWithPermit,\n simulatePermit2SettleWithErc20Approval,\n diagnosePermit2SimulationFailure,\n checkPermit2Prerequisites,\n validateEip2612PermitForPayment,\n type Permit2ProxyConfig,\n} from \"../../shared/permit2\";\nimport type { Eip2612GasSponsoringInfo } from \"../../exact/extensions\";\n\nconst uptoProxyConfig: Permit2ProxyConfig = {\n proxyAddress: x402UptoPermit2ProxyAddress,\n proxyABI: x402UptoPermit2ProxyABI,\n};\n\nexport interface VerifyUptoPermit2Options {\n simulate?: boolean;\n}\n\nexport interface UptoPermit2FacilitatorConfig {\n simulateInSettle?: boolean;\n}\n\n/**\n * Verifies an upto Permit2 payment payload against the given requirements.\n *\n * Validates scheme, network, spender, recipient, facilitator, deadline, amount,\n * token, signature, Permit2 allowance, and payer balance.\n *\n * @param signer - The facilitator signer for contract reads and signature verification\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements to verify against\n * @param permit2Payload - The upto Permit2 specific payload with witness data\n * @param context - Optional facilitator context for extension-provided capabilities\n * @param options - Optional verification options (e.g., skip simulation)\n * @returns Promise resolving to a verification response indicating validity\n */\nexport async function verifyUptoPermit2(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n permit2Payload: UptoPermit2Payload,\n context?: FacilitatorContext,\n options?: VerifyUptoPermit2Options,\n): Promise<VerifyResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n\n if (payload.accepted.scheme !== \"upto\" || requirements.scheme !== \"upto\") {\n return {\n isValid: false,\n invalidReason: ErrUptoInvalidScheme,\n payer,\n };\n }\n\n if (payload.accepted.network !== requirements.network) {\n return {\n isValid: false,\n invalidReason: ErrUptoNetworkMismatch,\n payer,\n };\n }\n\n const chainId = getEvmChainId(requirements.network);\n const tokenAddress = getAddress(requirements.asset);\n\n const assetBytecode = await signer.getCode({ address: tokenAddress });\n if (!assetBytecode || assetBytecode === \"0x\") {\n return { isValid: false, invalidReason: ErrAssetNotDeployedContract, payer };\n }\n\n if (\n getAddress(permit2Payload.permit2Authorization.spender) !==\n getAddress(x402UptoPermit2ProxyAddress)\n ) {\n return {\n isValid: false,\n invalidReason: \"invalid_permit2_spender\",\n payer,\n };\n }\n\n if (\n getAddress(permit2Payload.permit2Authorization.witness.to) !== getAddress(requirements.payTo)\n ) {\n return {\n isValid: false,\n invalidReason: \"invalid_permit2_recipient_mismatch\",\n payer,\n };\n }\n\n // Verify the facilitator address in the witness matches our own address\n const facilitatorAddresses = signer.getAddresses();\n const witnessFacilitator = getAddress(permit2Payload.permit2Authorization.witness.facilitator);\n const isFacilitatorMatch = facilitatorAddresses.some(\n addr => getAddress(addr) === witnessFacilitator,\n );\n if (!isFacilitatorMatch) {\n return {\n isValid: false,\n invalidReason: ErrUptoFacilitatorMismatch,\n payer,\n };\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (BigInt(permit2Payload.permit2Authorization.deadline) < BigInt(now + 6)) {\n return {\n isValid: false,\n invalidReason: \"permit2_deadline_expired\",\n payer,\n };\n }\n\n if (BigInt(permit2Payload.permit2Authorization.witness.validAfter) > BigInt(now)) {\n return {\n isValid: false,\n invalidReason: \"permit2_not_yet_valid\",\n payer,\n };\n }\n\n if (\n BigInt(permit2Payload.permit2Authorization.permitted.amount) !== BigInt(requirements.amount)\n ) {\n return {\n isValid: false,\n invalidReason: ErrPermit2AmountMismatch,\n payer,\n };\n }\n\n if (getAddress(permit2Payload.permit2Authorization.permitted.token) !== tokenAddress) {\n return {\n isValid: false,\n invalidReason: \"permit2_token_mismatch\",\n payer,\n };\n }\n\n // Verify signature using upto-specific witness types (includes facilitator)\n const permit2TypedData = {\n types: uptoPermit2WitnessTypes,\n primaryType: \"PermitWitnessTransferFrom\" as const,\n domain: {\n name: \"Permit2\",\n chainId,\n verifyingContract: PERMIT2_ADDRESS,\n },\n message: {\n permitted: {\n token: getAddress(permit2Payload.permit2Authorization.permitted.token),\n amount: BigInt(permit2Payload.permit2Authorization.permitted.amount),\n },\n spender: getAddress(permit2Payload.permit2Authorization.spender),\n nonce: BigInt(permit2Payload.permit2Authorization.nonce),\n deadline: BigInt(permit2Payload.permit2Authorization.deadline),\n witness: {\n to: getAddress(permit2Payload.permit2Authorization.witness.to),\n facilitator: getAddress(permit2Payload.permit2Authorization.witness.facilitator),\n validAfter: BigInt(permit2Payload.permit2Authorization.witness.validAfter),\n },\n },\n };\n\n // Verify signature\n // Note: verifyTypedData is implementation-dependent and pluggable on FacilitatorEvmSigner\n // Some implementations only do EOA-style ECDSA recovery (e.g. viem/utils verifyTypedData, ethers.verifyTypedData)\n // Viem's publicClient.verifyTypedData supports EOA and Smart Contract Account (ERC-1271 / ERC-6492) signature verification\n let signatureValid = false;\n try {\n signatureValid = await signer.verifyTypedData({\n address: payer,\n ...permit2TypedData,\n signature: permit2Payload.signature,\n });\n } catch {\n signatureValid = false;\n }\n\n if (!signatureValid) {\n // Check if the payer is a deployed smart contract (ERC-1271 / ERC-6492)\n const bytecode = await signer.getCode({ address: payer });\n const isDeployedContract = bytecode && bytecode !== \"0x\";\n\n if (!isDeployedContract) {\n return {\n isValid: false,\n invalidReason: \"invalid_permit2_signature\",\n payer,\n };\n }\n // Deployed smart contract: fall through to simulation\n }\n\n // If simulation is disabled, return early\n if (options?.simulate === false) {\n return { isValid: true, invalidReason: undefined, payer };\n }\n\n const facilitatorAddress = getAddress(permit2Payload.permit2Authorization.witness.facilitator);\n // Per spec §Phase 3 Step 7: simulate with requirements.amount (the worst-case charge).\n // At verify time, requirements.amount = max authorized amount.\n // At settle time, requirements.amount = actual settlement amount (≤ max).\n const uptoSettleArgs = buildUptoPermit2SettleArgs(\n permit2Payload,\n BigInt(requirements.amount),\n facilitatorAddress,\n );\n\n const eip2612InfoForSim = extractEip2612GasSponsoringInfo(payload);\n if (eip2612InfoForSim) {\n const fieldResult = validateEip2612PermitForPayment(eip2612InfoForSim, payer, tokenAddress);\n if (!fieldResult.isValid) {\n return { isValid: false, invalidReason: fieldResult.invalidReason!, payer };\n }\n\n const simOk = await simulatePermit2SettleWithPermit(\n uptoProxyConfig,\n signer,\n uptoSettleArgs,\n eip2612InfoForSim,\n );\n if (!simOk) {\n return diagnosePermit2SimulationFailure(\n uptoProxyConfig,\n signer,\n tokenAddress,\n permit2Payload,\n requirements.amount,\n );\n }\n\n return { isValid: true, invalidReason: undefined, payer };\n }\n\n const erc20GasSponsorshipExtension =\n context?.getExtension<Erc20ApprovalGasSponsoringFacilitatorExtension>(\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n );\n if (erc20GasSponsorshipExtension) {\n const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);\n if (erc20Info) {\n const fieldResult = await validateErc20ApprovalForPayment(erc20Info, payer, tokenAddress);\n if (!fieldResult.isValid) {\n return { isValid: false, invalidReason: fieldResult.invalidReason!, payer };\n }\n\n const extensionSigner = resolveErc20ApprovalExtensionSigner(\n erc20GasSponsorshipExtension,\n requirements.network,\n );\n\n if (extensionSigner?.simulateTransactions) {\n const simOk = await simulatePermit2SettleWithErc20Approval(\n uptoProxyConfig,\n extensionSigner,\n uptoSettleArgs,\n erc20Info,\n );\n if (!simOk) {\n return diagnosePermit2SimulationFailure(\n uptoProxyConfig,\n signer,\n tokenAddress,\n permit2Payload,\n requirements.amount,\n );\n }\n return { isValid: true, invalidReason: undefined, payer };\n }\n\n return checkPermit2Prerequisites(\n uptoProxyConfig,\n signer,\n tokenAddress,\n payer,\n requirements.amount,\n );\n }\n }\n\n const simOk = await simulatePermit2Settle(uptoProxyConfig, signer, uptoSettleArgs);\n if (!simOk) {\n return diagnosePermit2SimulationFailure(\n uptoProxyConfig,\n signer,\n tokenAddress,\n permit2Payload,\n requirements.amount,\n );\n }\n\n return {\n isValid: true,\n invalidReason: undefined,\n payer,\n };\n}\n\n/**\n * Settles an upto Permit2 payment on-chain.\n *\n * Verifies the payment first, then selects the appropriate settlement path:\n * EIP-2612 atomic permit, ERC-20 approval extension, or direct settlement.\n *\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param permit2Payload - The upto Permit2 specific payload with witness data\n * @param context - Optional facilitator context for extension-provided capabilities\n * @param config - Optional facilitator configuration (e.g., simulation settings for settle)\n * @returns Promise resolving to a settlement response indicating success or failure\n */\nexport async function settleUptoPermit2(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n permit2Payload: UptoPermit2Payload,\n context?: FacilitatorContext,\n config?: UptoPermit2FacilitatorConfig,\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n const settlementAmount = BigInt(requirements.amount);\n\n // Re-verify the signature before settling. We override `requirements.amount`\n // with the *authorized maximum* (`permitted.amount`) — NOT the actual\n // settlement amount — because `verifyUptoPermit2` performs strict equality\n // (`permitted.amount === requirements.amount`) to confirm the payload matches\n // what the client signed. The actual settlement amount, which may be lower\n // than the authorized maximum, is validated separately in the guard below\n // (`settlementAmount > permitted.amount`).\n const verifyRequirements: PaymentRequirements = {\n ...requirements,\n amount: permit2Payload.permit2Authorization.permitted.amount,\n };\n\n const valid = await verifyUptoPermit2(\n signer,\n payload,\n verifyRequirements,\n permit2Payload,\n context,\n { simulate: config?.simulateInSettle ?? true },\n );\n if (!valid.isValid) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: valid.invalidReason ?? \"invalid_scheme\",\n payer,\n };\n }\n\n // Zero settlement — no on-chain tx needed\n if (settlementAmount === 0n) {\n return {\n success: true,\n transaction: \"\",\n network: payload.accepted.network,\n payer,\n amount: \"0\",\n };\n }\n\n if (settlementAmount > BigInt(permit2Payload.permit2Authorization.permitted.amount)) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: ErrUptoSettlementExceedsAmount,\n payer,\n };\n }\n\n const facilitatorAddress = getAddress(permit2Payload.permit2Authorization.witness.facilitator);\n\n const dataSuffix = await resolveDataSuffix(context, {\n paymentPayload: payload,\n paymentRequirements: requirements,\n });\n\n // Branch: EIP-2612 gas sponsoring (atomic settleWithPermit via contract)\n const eip2612Info = extractEip2612GasSponsoringInfo(payload);\n if (eip2612Info) {\n return settleUptoWithEIP2612(\n signer,\n payload,\n permit2Payload,\n eip2612Info,\n settlementAmount,\n facilitatorAddress,\n dataSuffix,\n );\n }\n\n // Branch: ERC-20 approval gas sponsoring (broadcast approval + settle via extension signer)\n const erc20Info = extractErc20ApprovalGasSponsoringInfo(payload);\n if (erc20Info) {\n const erc20GasSponsorshipExtension =\n context?.getExtension<Erc20ApprovalGasSponsoringFacilitatorExtension>(\n ERC20_APPROVAL_GAS_SPONSORING_KEY,\n );\n const extensionSigner = resolveErc20ApprovalExtensionSigner(\n erc20GasSponsorshipExtension,\n payload.accepted.network,\n );\n if (extensionSigner) {\n return settleUptoWithERC20Approval(\n extensionSigner,\n payload,\n permit2Payload,\n erc20Info,\n settlementAmount,\n facilitatorAddress,\n dataSuffix,\n );\n }\n }\n\n // Branch: standard settle (allowance already on-chain)\n return settleUptoDirect(\n signer,\n payload,\n permit2Payload,\n settlementAmount,\n facilitatorAddress,\n dataSuffix,\n );\n}\n\n/**\n * Settles an upto Permit2 payment via settleWithPermit, including the EIP-2612 permit atomically.\n *\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload for network info\n * @param permit2Payload - The upto Permit2 specific payload with authorization and signature\n * @param eip2612Info - The EIP-2612 gas sponsoring info from the payload extension\n * @param settlementAmount - The amount to settle on-chain\n * @param facilitatorAddress - The facilitator address authorized in the witness\n * @param dataSuffix - Optional hex suffix appended to the settlement transaction\n * @returns Promise resolving to a settlement response\n */\nasync function settleUptoWithEIP2612(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n permit2Payload: UptoPermit2Payload,\n eip2612Info: Eip2612GasSponsoringInfo,\n settlementAmount: bigint,\n facilitatorAddress: `0x${string}`,\n dataSuffix?: `0x${string}`,\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n try {\n const { v, r, s } = splitEip2612Signature(eip2612Info.signature);\n\n const tx = await signer.writeContract({\n address: uptoProxyConfig.proxyAddress,\n abi: uptoProxyConfig.proxyABI,\n functionName: \"settleWithPermit\",\n args: [\n {\n value: BigInt(eip2612Info.amount),\n deadline: BigInt(eip2612Info.deadline),\n r,\n s,\n v,\n },\n ...buildUptoPermit2SettleArgs(permit2Payload, settlementAmount, facilitatorAddress),\n ],\n dataSuffix,\n });\n\n const response = await waitAndReturnSettleResponse(signer, tx, payload, payer);\n return { ...response, amount: settlementAmount.toString() };\n } catch (error) {\n return mapSettleError(error, payload, payer);\n }\n}\n\n/**\n * Settles an upto Permit2 payment using an ERC-20 approval gas sponsoring extension.\n *\n * Broadcasts the pre-signed approval transaction followed by the settle transaction\n * via the extension signer.\n *\n * @param extensionSigner - The extension signer with sendTransactions capability\n * @param payload - The payment payload for network info\n * @param permit2Payload - The upto Permit2 specific payload with authorization and signature\n * @param erc20Info - Object containing the signed approval transaction\n * @param erc20Info.signedTransaction - The RLP-encoded signed ERC-20 approve transaction hex string\n * @param settlementAmount - The amount to settle on-chain\n * @param facilitatorAddress - The facilitator address authorized in the witness\n * @param dataSuffix - Optional hex suffix appended to the settlement transaction\n * @returns Promise resolving to a settlement response\n */\nasync function settleUptoWithERC20Approval(\n extensionSigner: Erc20ApprovalGasSponsoringSigner,\n payload: PaymentPayload,\n permit2Payload: UptoPermit2Payload,\n erc20Info: { signedTransaction: string },\n settlementAmount: bigint,\n facilitatorAddress: `0x${string}`,\n dataSuffix?: `0x${string}`,\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n\n try {\n const settleData = appendDataSuffix(\n encodeFunctionData({\n abi: uptoProxyConfig.proxyABI,\n functionName: \"settle\",\n args: buildUptoPermit2SettleArgs(permit2Payload, settlementAmount, facilitatorAddress),\n }),\n dataSuffix,\n );\n\n const txHashes = await extensionSigner.sendTransactions([\n erc20Info.signedTransaction as `0x${string}`,\n { to: uptoProxyConfig.proxyAddress, data: settleData, gas: BigInt(300_000) },\n ]);\n\n const settleTxHash = txHashes[txHashes.length - 1];\n const response = await waitAndReturnSettleResponse(\n extensionSigner,\n settleTxHash,\n payload,\n payer,\n );\n return { ...response, amount: settlementAmount.toString() };\n } catch (error) {\n return mapSettleError(error, payload, payer);\n }\n}\n\n/**\n * Settles an upto Permit2 payment directly when Permit2 allowance is already on-chain.\n *\n * @param signer - The facilitator signer for contract writes\n * @param payload - The payment payload for network info\n * @param permit2Payload - The upto Permit2 specific payload with authorization and signature\n * @param settlementAmount - The amount to settle on-chain\n * @param facilitatorAddress - The facilitator address authorized in the witness\n * @param dataSuffix - Optional hex suffix appended to the settlement transaction\n * @returns Promise resolving to a settlement response\n */\nasync function settleUptoDirect(\n signer: FacilitatorEvmSigner,\n payload: PaymentPayload,\n permit2Payload: UptoPermit2Payload,\n settlementAmount: bigint,\n facilitatorAddress: `0x${string}`,\n dataSuffix?: `0x${string}`,\n): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n try {\n const tx = await signer.writeContract({\n address: uptoProxyConfig.proxyAddress,\n abi: uptoProxyConfig.proxyABI,\n functionName: \"settle\",\n args: buildUptoPermit2SettleArgs(permit2Payload, settlementAmount, facilitatorAddress),\n dataSuffix,\n });\n\n const response = await waitAndReturnSettleResponse(signer, tx, payload, payer);\n return { ...response, amount: settlementAmount.toString() };\n } catch (error) {\n return mapSettleError(error, payload, payer);\n }\n}\n","import {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n FacilitatorContext,\n SettleResponse,\n VerifyResponse,\n} from \"@bankofai/x402-core/types\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { UptoPermit2Payload, isUptoPermit2Payload } from \"../../types\";\nimport { verifyUptoPermit2, settleUptoPermit2 } from \"./permit2\";\n\n/**\n * EVM facilitator implementation for the Upto payment scheme.\n * Handles verification and settlement of Permit2-based payments.\n */\nexport class UptoEvmScheme implements SchemeNetworkFacilitator {\n readonly scheme = \"upto\";\n readonly caipFamily = \"eip155:*\";\n\n /**\n * Creates a new UptoEvmScheme facilitator instance.\n *\n * @param signer - The EVM signer for facilitator operations\n */\n constructor(private readonly signer: FacilitatorEvmSigner) {}\n\n /**\n * Returns extra metadata required by the upto scheme, including the facilitator address.\n *\n * @param _ - The network identifier (unused)\n * @returns Object with facilitatorAddress, or undefined if no signer addresses are available\n */\n getExtra(_: string): Record<string, unknown> | undefined {\n const addresses = this.signer.getAddresses();\n if (addresses.length === 0) {\n return undefined;\n }\n return { facilitatorAddress: addresses[Math.floor(Math.random() * addresses.length)] };\n }\n\n /**\n * Returns the list of facilitator signer addresses for the upto scheme.\n *\n * @param _ - The network identifier (unused)\n * @returns Array of facilitator signer addresses\n */\n getSigners(_: string): string[] {\n return [...this.signer.getAddresses()];\n }\n\n /**\n * Verifies an upto Permit2 payment payload against the given requirements.\n *\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements to verify against\n * @param context - Optional facilitator context\n * @param _ - Payment required extensions (unused; reserved for interface parity)\n * @returns Promise resolving to a verification response\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n context?: FacilitatorContext,\n _?: Record<string, unknown>,\n ): Promise<VerifyResponse> {\n const rawPayload = payload.payload as Record<string, unknown>;\n if (!isUptoPermit2Payload(rawPayload)) {\n return { isValid: false, invalidReason: \"unsupported_payload_type\", payer: \"\" };\n }\n return verifyUptoPermit2(\n this.signer,\n payload,\n requirements,\n rawPayload as UptoPermit2Payload,\n context,\n );\n }\n\n /**\n * Settles an upto Permit2 payment on-chain.\n *\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param context - Optional facilitator context\n * @returns Promise resolving to a settlement response\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n context?: FacilitatorContext,\n ): Promise<SettleResponse> {\n const rawPayload = payload.payload as Record<string, unknown>;\n if (!isUptoPermit2Payload(rawPayload)) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: \"unsupported_payload_type\",\n payer: \"\",\n };\n }\n return settleUptoPermit2(\n this.signer,\n payload,\n requirements,\n rawPayload as UptoPermit2Payload,\n context,\n );\n }\n}\n"],"mappings":"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","names":["simOk"]}
@@ -0,0 +1,69 @@
1
+ import { SchemeNetworkServer, MoneyParser, Network, Price, AssetAmount, PaymentRequirements } from '@bankofai/x402-core/types';
2
+
3
+ /**
4
+ * EVM server implementation for the Upto payment scheme.
5
+ * Handles price parsing, payment requirements enhancement, and default asset resolution.
6
+ */
7
+ declare class UptoEvmScheme implements SchemeNetworkServer {
8
+ readonly scheme = "upto";
9
+ private moneyParsers;
10
+ /**
11
+ * Registers a custom money parser for converting prices to asset amounts.
12
+ *
13
+ * @param parser - The money parser function to register
14
+ * @returns This instance for chaining
15
+ */
16
+ registerMoneyParser(parser: MoneyParser): UptoEvmScheme;
17
+ /**
18
+ * Returns the decimal precision of the default stablecoin for the given network.
19
+ * Implements the optional AssetDecimalsProvider interface used by resolveSettlementOverrideAmount.
20
+ *
21
+ * @param _asset - The asset symbol (unused; defaults to the network's default stablecoin)
22
+ * @param network - The network to look up the default asset for
23
+ * @returns The number of decimal places for the asset
24
+ */
25
+ getAssetDecimals(_asset: string, network: Network): number;
26
+ /**
27
+ * Parses a price into an asset amount for the given network.
28
+ *
29
+ * @param price - The price to parse (string, number, or AssetAmount)
30
+ * @param network - The target network
31
+ * @returns Promise resolving to an asset amount
32
+ */
33
+ parsePrice(price: Price, network: Network): Promise<AssetAmount>;
34
+ /**
35
+ * Enhances payment requirements with upto-specific metadata.
36
+ *
37
+ * @param paymentRequirements - The base payment requirements
38
+ * @param supportedKind - The supported scheme/network kind
39
+ * @param supportedKind.x402Version - The x402 protocol version
40
+ * @param supportedKind.scheme - The payment scheme name
41
+ * @param supportedKind.network - The target network
42
+ * @param supportedKind.extra - Optional extra metadata
43
+ * @param extensionKeys - Extension keys to include
44
+ * @returns Promise resolving to enhanced payment requirements
45
+ */
46
+ enhancePaymentRequirements(paymentRequirements: PaymentRequirements, supportedKind: {
47
+ x402Version: number;
48
+ scheme: string;
49
+ network: Network;
50
+ extra?: Record<string, unknown>;
51
+ }, extensionKeys: string[]): Promise<PaymentRequirements>;
52
+ /**
53
+ * Parses a money string or number into a decimal value.
54
+ *
55
+ * @param money - The money value to parse
56
+ * @returns The parsed decimal amount
57
+ */
58
+ private parseMoneyToDecimal;
59
+ /**
60
+ * Converts a numeric dollar amount to an AssetAmount using the default token for the network.
61
+ *
62
+ * @param amount - The dollar amount as a number
63
+ * @param network - The target network
64
+ * @returns The converted asset amount with token metadata
65
+ */
66
+ private defaultMoneyConversion;
67
+ }
68
+
69
+ export { UptoEvmScheme };