@payai/x402-evm 2.4.0 → 2.4.2

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 (150) hide show
  1. package/dist/cjs/batch-settlement/client/file-storage.d.ts +47 -0
  2. package/dist/cjs/batch-settlement/client/file-storage.js +116 -0
  3. package/dist/cjs/batch-settlement/client/file-storage.js.map +1 -0
  4. package/dist/cjs/batch-settlement/client/index.d.ts +111 -0
  5. package/dist/cjs/batch-settlement/client/index.js +1565 -0
  6. package/dist/cjs/batch-settlement/client/index.js.map +1 -0
  7. package/dist/cjs/batch-settlement/facilitator/index.d.ts +71 -0
  8. package/dist/cjs/batch-settlement/facilitator/index.js +2032 -0
  9. package/dist/cjs/batch-settlement/facilitator/index.js.map +1 -0
  10. package/dist/cjs/batch-settlement/server/file-storage.d.ts +53 -0
  11. package/dist/cjs/batch-settlement/server/file-storage.js +181 -0
  12. package/dist/cjs/batch-settlement/server/file-storage.js.map +1 -0
  13. package/dist/cjs/batch-settlement/server/index.d.ts +491 -0
  14. package/dist/cjs/batch-settlement/server/index.js +1960 -0
  15. package/dist/cjs/batch-settlement/server/index.js.map +1 -0
  16. package/dist/cjs/batch-settlement/server/redis-storage.d.ts +87 -0
  17. package/dist/cjs/batch-settlement/server/redis-storage.js +181 -0
  18. package/dist/cjs/batch-settlement/server/redis-storage.js.map +1 -0
  19. package/dist/cjs/exact/client/index.d.ts +6 -4
  20. package/dist/cjs/exact/client/index.js +7 -5
  21. package/dist/cjs/exact/client/index.js.map +1 -1
  22. package/dist/cjs/exact/facilitator/index.d.ts +16 -9
  23. package/dist/cjs/exact/facilitator/index.js +56 -9
  24. package/dist/cjs/exact/facilitator/index.js.map +1 -1
  25. package/dist/cjs/exact/server/index.d.ts +0 -8
  26. package/dist/cjs/exact/server/index.js +53 -19
  27. package/dist/cjs/exact/server/index.js.map +1 -1
  28. package/dist/cjs/exact/v1/client/index.d.ts +2 -1
  29. package/dist/cjs/exact/v1/client/index.js.map +1 -1
  30. package/dist/cjs/exact/v1/facilitator/index.d.ts +11 -5
  31. package/dist/cjs/exact/v1/facilitator/index.js +16 -2
  32. package/dist/cjs/exact/v1/facilitator/index.js.map +1 -1
  33. package/dist/cjs/index.d.ts +113 -7
  34. package/dist/cjs/index.js +1353 -5
  35. package/dist/cjs/index.js.map +1 -1
  36. package/dist/{esm/permit2-CyZxwngN.d.mts → cjs/permit2-DhJRUcgY.d.ts} +1 -13
  37. package/dist/cjs/rpc-DULZzRne.d.ts +13 -0
  38. package/dist/cjs/scheme-CvkPJXBD.d.ts +307 -0
  39. package/dist/{esm/scheme-DCR7hsa3.d.mts → cjs/scheme-DTQFE9xp.d.ts} +2 -2
  40. package/dist/{esm/signer-D912R4mq.d.mts → cjs/signer-tYS6Y46X.d.ts} +3 -0
  41. package/dist/cjs/storage-6W5MO46W.d.ts +50 -0
  42. package/dist/cjs/storage-Bl6aD0Xg.d.ts +81 -0
  43. package/dist/cjs/types-CF8P2-NM.d.ts +180 -0
  44. package/dist/cjs/upto/client/index.d.ts +5 -3
  45. package/dist/cjs/upto/client/index.js +7 -5
  46. package/dist/cjs/upto/client/index.js.map +1 -1
  47. package/dist/cjs/upto/facilitator/index.d.ts +2 -1
  48. package/dist/cjs/upto/facilitator/index.js +2 -1
  49. package/dist/cjs/upto/facilitator/index.js.map +1 -1
  50. package/dist/cjs/upto/server/index.d.ts +0 -8
  51. package/dist/cjs/upto/server/index.js +51 -19
  52. package/dist/cjs/upto/server/index.js.map +1 -1
  53. package/dist/cjs/v1/index.d.ts +2 -1
  54. package/dist/cjs/v1/index.js.map +1 -1
  55. package/dist/esm/batch-settlement/client/file-storage.d.mts +47 -0
  56. package/dist/esm/batch-settlement/client/file-storage.mjs +63 -0
  57. package/dist/esm/batch-settlement/client/file-storage.mjs.map +1 -0
  58. package/dist/esm/batch-settlement/client/index.d.mts +111 -0
  59. package/dist/esm/batch-settlement/client/index.mjs +59 -0
  60. package/dist/esm/batch-settlement/client/index.mjs.map +1 -0
  61. package/dist/esm/batch-settlement/facilitator/index.d.mts +71 -0
  62. package/dist/esm/batch-settlement/facilitator/index.mjs +1235 -0
  63. package/dist/esm/batch-settlement/facilitator/index.mjs.map +1 -0
  64. package/dist/esm/batch-settlement/server/file-storage.d.mts +53 -0
  65. package/dist/esm/batch-settlement/server/file-storage.mjs +128 -0
  66. package/dist/esm/batch-settlement/server/file-storage.mjs.map +1 -0
  67. package/dist/esm/batch-settlement/server/index.d.mts +491 -0
  68. package/dist/esm/batch-settlement/server/index.mjs +1645 -0
  69. package/dist/esm/batch-settlement/server/index.mjs.map +1 -0
  70. package/dist/esm/batch-settlement/server/redis-storage.d.mts +87 -0
  71. package/dist/esm/batch-settlement/server/redis-storage.mjs +156 -0
  72. package/dist/esm/batch-settlement/server/redis-storage.mjs.map +1 -0
  73. package/dist/esm/chunk-2EUQTNJO.mjs +38 -0
  74. package/dist/esm/chunk-2EUQTNJO.mjs.map +1 -0
  75. package/dist/esm/chunk-53USC5VE.mjs +47 -0
  76. package/dist/esm/chunk-53USC5VE.mjs.map +1 -0
  77. package/dist/esm/{chunk-GJ57SZGI.mjs → chunk-6WQOGWBE.mjs} +7 -5
  78. package/dist/esm/{chunk-GJ57SZGI.mjs.map → chunk-6WQOGWBE.mjs.map} +1 -1
  79. package/dist/esm/{chunk-NSFLAANF.mjs → chunk-BTYNCDNS.mjs} +51 -2
  80. package/dist/esm/chunk-BTYNCDNS.mjs.map +1 -0
  81. package/dist/esm/{chunk-RYT6M3PA.mjs → chunk-CSQS7ZON.mjs} +47 -7
  82. package/dist/esm/chunk-CSQS7ZON.mjs.map +1 -0
  83. package/dist/esm/chunk-GD4MKCN7.mjs +57 -0
  84. package/dist/esm/chunk-GD4MKCN7.mjs.map +1 -0
  85. package/dist/esm/chunk-HYABYUBD.mjs +432 -0
  86. package/dist/esm/chunk-HYABYUBD.mjs.map +1 -0
  87. package/dist/esm/chunk-IN5YIT5C.mjs +159 -0
  88. package/dist/esm/chunk-IN5YIT5C.mjs.map +1 -0
  89. package/dist/esm/{chunk-JII456TS.mjs → chunk-JK7SLLF7.mjs} +1 -1
  90. package/dist/esm/chunk-JK7SLLF7.mjs.map +1 -0
  91. package/dist/esm/{chunk-C4ZQMS77.mjs → chunk-MACPBXCT.mjs} +2 -216
  92. package/dist/esm/chunk-MACPBXCT.mjs.map +1 -0
  93. package/dist/esm/chunk-NKYVYGRA.mjs +911 -0
  94. package/dist/esm/chunk-NKYVYGRA.mjs.map +1 -0
  95. package/dist/esm/{chunk-D6RXZXOS.mjs → chunk-R7I3RZFF.mjs} +10 -6
  96. package/dist/esm/{chunk-D6RXZXOS.mjs.map → chunk-R7I3RZFF.mjs.map} +1 -1
  97. package/dist/esm/{chunk-CRT6YNY5.mjs → chunk-RWLVVO3B.mjs} +21 -61
  98. package/dist/esm/chunk-RWLVVO3B.mjs.map +1 -0
  99. package/dist/esm/chunk-TGFAVNUD.mjs +111 -0
  100. package/dist/esm/chunk-TGFAVNUD.mjs.map +1 -0
  101. package/dist/esm/chunk-TW7Z65AO.mjs +34 -0
  102. package/dist/esm/chunk-TW7Z65AO.mjs.map +1 -0
  103. package/dist/esm/chunk-U4HCGTLU.mjs +35 -0
  104. package/dist/esm/chunk-U4HCGTLU.mjs.map +1 -0
  105. package/dist/esm/chunk-VS3RYAYE.mjs +80 -0
  106. package/dist/esm/chunk-VS3RYAYE.mjs.map +1 -0
  107. package/dist/esm/chunk-W6ON4LG2.mjs +39 -0
  108. package/dist/esm/chunk-W6ON4LG2.mjs.map +1 -0
  109. package/dist/esm/{chunk-WKBC5YMI.mjs → chunk-YMQCTKDU.mjs} +23 -55
  110. package/dist/esm/chunk-YMQCTKDU.mjs.map +1 -0
  111. package/dist/esm/exact/client/index.d.mts +6 -4
  112. package/dist/esm/exact/client/index.mjs +10 -5
  113. package/dist/esm/exact/facilitator/index.d.mts +16 -9
  114. package/dist/esm/exact/facilitator/index.mjs +39 -16
  115. package/dist/esm/exact/facilitator/index.mjs.map +1 -1
  116. package/dist/esm/exact/server/index.d.mts +0 -8
  117. package/dist/esm/exact/server/index.mjs +3 -19
  118. package/dist/esm/exact/server/index.mjs.map +1 -1
  119. package/dist/esm/exact/v1/client/index.d.mts +2 -1
  120. package/dist/esm/exact/v1/client/index.mjs +5 -2
  121. package/dist/esm/exact/v1/facilitator/index.d.mts +11 -5
  122. package/dist/esm/exact/v1/facilitator/index.mjs +5 -2
  123. package/dist/esm/index.d.mts +113 -7
  124. package/dist/esm/index.mjs +53 -7
  125. package/dist/esm/index.mjs.map +1 -1
  126. package/dist/esm/permit2-DhJRUcgY.d.mts +729 -0
  127. package/dist/esm/rpc-DULZzRne.d.mts +13 -0
  128. package/dist/esm/scheme-DtbSS4Fk.d.mts +307 -0
  129. package/dist/esm/scheme-gtqAIYPJ.d.mts +47 -0
  130. package/dist/esm/signer-tYS6Y46X.d.mts +170 -0
  131. package/dist/esm/storage-6W5MO46W.d.mts +50 -0
  132. package/dist/esm/storage-sZ1CDS4P.d.mts +81 -0
  133. package/dist/esm/types-CF8P2-NM.d.mts +180 -0
  134. package/dist/esm/upto/client/index.d.mts +5 -3
  135. package/dist/esm/upto/client/index.mjs +9 -4
  136. package/dist/esm/upto/facilitator/index.d.mts +2 -1
  137. package/dist/esm/upto/facilitator/index.mjs +17 -9
  138. package/dist/esm/upto/facilitator/index.mjs.map +1 -1
  139. package/dist/esm/upto/server/index.d.mts +0 -8
  140. package/dist/esm/upto/server/index.mjs +3 -19
  141. package/dist/esm/upto/server/index.mjs.map +1 -1
  142. package/dist/esm/v1/index.d.mts +2 -1
  143. package/dist/esm/v1/index.mjs +5 -2
  144. package/package.json +5 -5
  145. package/dist/esm/chunk-C4ZQMS77.mjs.map +0 -1
  146. package/dist/esm/chunk-CRT6YNY5.mjs.map +0 -1
  147. package/dist/esm/chunk-JII456TS.mjs.map +0 -1
  148. package/dist/esm/chunk-NSFLAANF.mjs.map +0 -1
  149. package/dist/esm/chunk-RYT6M3PA.mjs.map +0 -1
  150. package/dist/esm/chunk-WKBC5YMI.mjs.map +0 -1
@@ -0,0 +1,180 @@
1
+ import { TypedData } from 'viem';
2
+
3
+ interface AuthorizerSigner {
4
+ address: `0x${string}`;
5
+ signTypedData(params: {
6
+ domain: Record<string, unknown>;
7
+ types: TypedData;
8
+ primaryType: string;
9
+ message: Record<string, unknown>;
10
+ }): Promise<`0x${string}`>;
11
+ }
12
+ type ChannelState = {
13
+ balance: bigint;
14
+ totalClaimed: bigint;
15
+ withdrawRequestedAt: number;
16
+ refundNonce: bigint;
17
+ };
18
+ type ChannelConfig = {
19
+ payer: `0x${string}`;
20
+ payerAuthorizer: `0x${string}`;
21
+ receiver: `0x${string}`;
22
+ receiverAuthorizer: `0x${string}`;
23
+ token: `0x${string}`;
24
+ withdrawDelay: number;
25
+ salt: `0x${string}`;
26
+ };
27
+ type BatchSettlementErc3009Authorization = {
28
+ validAfter: string;
29
+ validBefore: string;
30
+ salt: `0x${string}`;
31
+ signature: `0x${string}`;
32
+ };
33
+ type BatchSettlementPermit2Authorization = {
34
+ from: `0x${string}`;
35
+ permitted: {
36
+ token: `0x${string}`;
37
+ amount: string;
38
+ };
39
+ spender: `0x${string}`;
40
+ nonce: string;
41
+ deadline: string;
42
+ witness: {
43
+ channelId: `0x${string}`;
44
+ };
45
+ signature: `0x${string}`;
46
+ };
47
+ type BatchSettlementAssetTransferMethod = "eip3009" | "permit2";
48
+ type BatchSettlementDepositAuthorization = {
49
+ erc3009Authorization: BatchSettlementErc3009Authorization;
50
+ permit2Authorization?: never;
51
+ } | {
52
+ erc3009Authorization?: never;
53
+ permit2Authorization: BatchSettlementPermit2Authorization;
54
+ };
55
+ type BatchSettlementDepositPayload = {
56
+ type: "deposit";
57
+ channelConfig: ChannelConfig;
58
+ voucher: BatchSettlementVoucherFields;
59
+ deposit: {
60
+ amount: string;
61
+ authorization: BatchSettlementDepositAuthorization;
62
+ };
63
+ };
64
+ type BatchSettlementVoucherPayload = {
65
+ type: "voucher";
66
+ channelConfig: ChannelConfig;
67
+ voucher: BatchSettlementVoucherFields;
68
+ };
69
+ type BatchSettlementRefundPayload = {
70
+ type: "refund";
71
+ channelConfig: ChannelConfig;
72
+ voucher: BatchSettlementVoucherFields;
73
+ amount?: string;
74
+ };
75
+ type BatchSettlementVoucherFields = {
76
+ channelId: `0x${string}`;
77
+ maxClaimableAmount: string;
78
+ signature: `0x${string}`;
79
+ };
80
+ type BatchSettlementVoucherClaim = {
81
+ voucher: {
82
+ channel: ChannelConfig;
83
+ maxClaimableAmount: string;
84
+ };
85
+ signature: `0x${string}`;
86
+ totalClaimed: string;
87
+ };
88
+ type BatchSettlementChannelStateExtra = {
89
+ channelId: `0x${string}`;
90
+ balance: string;
91
+ totalClaimed: string;
92
+ withdrawRequestedAt: number;
93
+ refundNonce: string;
94
+ chargedCumulativeAmount?: string;
95
+ };
96
+ type BatchSettlementVoucherStateExtra = {
97
+ signedMaxClaimable?: string;
98
+ signature?: `0x${string}`;
99
+ };
100
+ type BatchSettlementPaymentRequirementsExtra = {
101
+ receiverAuthorizer: `0x${string}`;
102
+ withdrawDelay: number;
103
+ name: string;
104
+ version: string;
105
+ assetTransferMethod?: BatchSettlementAssetTransferMethod;
106
+ channelState?: BatchSettlementChannelStateExtra;
107
+ voucherState?: BatchSettlementVoucherStateExtra;
108
+ };
109
+ type FileChannelStorageOptions = {
110
+ /** Root directory; channels are stored under `{directory}/{client|server}/{channelId}.json`. */
111
+ directory: string;
112
+ };
113
+ type BatchSettlementPaymentResponseExtra = {
114
+ chargedAmount?: string;
115
+ channelState?: BatchSettlementChannelStateExtra;
116
+ voucherState?: BatchSettlementVoucherStateExtra;
117
+ };
118
+ type BatchSettlementClaimPayload = {
119
+ type: "claim";
120
+ claims: BatchSettlementVoucherClaim[];
121
+ claimAuthorizerSignature?: `0x${string}`;
122
+ };
123
+ type BatchSettlementSettlePayload = {
124
+ type: "settle";
125
+ receiver: `0x${string}`;
126
+ token: `0x${string}`;
127
+ };
128
+ type BatchSettlementEnrichedRefundPayload = BatchSettlementRefundPayload & {
129
+ amount: string;
130
+ refundNonce: string;
131
+ claims: BatchSettlementVoucherClaim[];
132
+ refundAuthorizerSignature?: `0x${string}`;
133
+ claimAuthorizerSignature?: `0x${string}`;
134
+ };
135
+ type BatchSettlementPayload = BatchSettlementDepositPayload | BatchSettlementVoucherPayload | BatchSettlementRefundPayload;
136
+ type BatchSettlementFacilitatorSettlePayload = BatchSettlementDepositPayload | BatchSettlementClaimPayload | BatchSettlementSettlePayload | BatchSettlementEnrichedRefundPayload;
137
+ /**
138
+ * Type guard for {@link BatchSettlementDepositPayload}.
139
+ *
140
+ * @param payload - Unknown payload to check.
141
+ * @returns True if `payload` is a deposit payload (carries `deposit` and `voucher`).
142
+ */
143
+ declare function isBatchSettlementDepositPayload(payload: unknown): payload is BatchSettlementDepositPayload;
144
+ /**
145
+ * Type guard for {@link BatchSettlementVoucherPayload}.
146
+ *
147
+ * @param payload - Unknown payload to check.
148
+ * @returns True if `payload` is a voucher payload with channel and signature fields.
149
+ */
150
+ declare function isBatchSettlementVoucherPayload(payload: unknown): payload is BatchSettlementVoucherPayload;
151
+ /**
152
+ * Type guard for {@link BatchSettlementRefundPayload}.
153
+ *
154
+ * @param payload - Unknown payload to check.
155
+ * @returns True if `payload` is a refund payload with channel config and voucher fields.
156
+ */
157
+ declare function isBatchSettlementRefundPayload(payload: unknown): payload is BatchSettlementRefundPayload;
158
+ /**
159
+ * Type guard for {@link BatchSettlementClaimPayload}.
160
+ *
161
+ * @param payload - Unknown payload to check.
162
+ * @returns True if `payload` is a settle-action `claimWithSignature` payload.
163
+ */
164
+ declare function isBatchSettlementClaimPayload(payload: unknown): payload is BatchSettlementClaimPayload;
165
+ /**
166
+ * Type guard for {@link BatchSettlementSettlePayload}.
167
+ *
168
+ * @param payload - Unknown payload to check.
169
+ * @returns True if `payload` is a settle-action `settle` payload.
170
+ */
171
+ declare function isBatchSettlementSettlePayload(payload: unknown): payload is BatchSettlementSettlePayload;
172
+ /**
173
+ * Type guard for {@link BatchSettlementEnrichedRefundPayload}.
174
+ *
175
+ * @param payload - Unknown payload to check.
176
+ * @returns True if `payload` is a settle-action `refundWithSignature` payload.
177
+ */
178
+ declare function isBatchSettlementEnrichedRefundPayload(payload: unknown): payload is BatchSettlementEnrichedRefundPayload;
179
+
180
+ export { type AuthorizerSigner as A, type BatchSettlementDepositPayload as B, type ChannelConfig as C, type FileChannelStorageOptions as F, type ChannelState as a, type BatchSettlementVoucherPayload as b, type BatchSettlementRefundPayload as c, type BatchSettlementVoucherFields as d, type BatchSettlementErc3009Authorization as e, type BatchSettlementClaimPayload as f, type BatchSettlementEnrichedRefundPayload as g, type BatchSettlementVoucherClaim as h, type BatchSettlementPayload as i, type BatchSettlementSettlePayload as j, type BatchSettlementFacilitatorSettlePayload as k, type BatchSettlementPaymentRequirementsExtra as l, type BatchSettlementPaymentResponseExtra as m, isBatchSettlementDepositPayload as n, isBatchSettlementVoucherPayload as o, isBatchSettlementRefundPayload as p, isBatchSettlementClaimPayload as q, isBatchSettlementSettlePayload as r, isBatchSettlementEnrichedRefundPayload as s, type BatchSettlementChannelStateExtra as t, type BatchSettlementVoucherStateExtra as u };
@@ -1,7 +1,9 @@
1
1
  import { SchemeNetworkClient, PaymentRequirements, PaymentPayloadContext, PaymentPayloadResult } from '@payai/x402/types';
2
- import { C as ClientEvmSigner } from '../../signer-D912R4mq.mjs';
3
- import { l as EvmSchemeOptions } from '../../permit2-CyZxwngN.mjs';
4
- export { P as Permit2AllowanceParams, m as UptoEvmSchemeConfig, n as UptoEvmSchemeConfigByChainId, c as createPermit2ApprovalTx, e as erc20AllowanceAbi, g as getPermit2AllowanceReadParams } from '../../permit2-CyZxwngN.mjs';
2
+ import { C as ClientEvmSigner } from '../../signer-tYS6Y46X.mjs';
3
+ import { c as EvmSchemeOptions } from '../../rpc-DULZzRne.mjs';
4
+ export { d as UptoEvmSchemeConfig, e as UptoEvmSchemeConfigByChainId } from '../../rpc-DULZzRne.mjs';
5
+ export { P as Permit2AllowanceParams, c as createPermit2ApprovalTx, e as erc20AllowanceAbi, g as getPermit2AllowanceReadParams } from '../../permit2-DhJRUcgY.mjs';
6
+ import 'viem';
5
7
 
6
8
  /**
7
9
  * EVM client implementation for the Upto payment scheme.
@@ -1,14 +1,19 @@
1
1
  import {
2
2
  UptoEvmScheme
3
- } from "../../chunk-GJ57SZGI.mjs";
3
+ } from "../../chunk-6WQOGWBE.mjs";
4
4
  import {
5
5
  createPermit2ApprovalTx,
6
6
  getPermit2AllowanceReadParams
7
- } from "../../chunk-WKBC5YMI.mjs";
8
- import "../../chunk-CRT6YNY5.mjs";
7
+ } from "../../chunk-53USC5VE.mjs";
8
+ import "../../chunk-YMQCTKDU.mjs";
9
+ import "../../chunk-RWLVVO3B.mjs";
10
+ import "../../chunk-GD4MKCN7.mjs";
11
+ import "../../chunk-TGFAVNUD.mjs";
9
12
  import {
10
13
  erc20AllowanceAbi
11
- } from "../../chunk-C4ZQMS77.mjs";
14
+ } from "../../chunk-MACPBXCT.mjs";
15
+ import "../../chunk-VS3RYAYE.mjs";
16
+ import "../../chunk-TW7Z65AO.mjs";
12
17
  export {
13
18
  UptoEvmScheme,
14
19
  createPermit2ApprovalTx,
@@ -1,5 +1,6 @@
1
1
  import { SchemeNetworkFacilitator, PaymentPayload, PaymentRequirements, FacilitatorContext, VerifyResponse, SettleResponse } from '@payai/x402/types';
2
- import { F as FacilitatorEvmSigner } from '../../signer-D912R4mq.mjs';
2
+ import { F as FacilitatorEvmSigner } from '../../signer-tYS6Y46X.mjs';
3
+ import 'viem';
3
4
 
4
5
  /**
5
6
  * EVM facilitator implementation for the Upto payment scheme.
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  isUptoPermit2Payload
3
- } from "../../chunk-JII456TS.mjs";
3
+ } from "../../chunk-JK7SLLF7.mjs";
4
+ import "../../chunk-U4HCGTLU.mjs";
4
5
  import {
5
- ERC20_APPROVAL_GAS_SPONSORING_KEY,
6
6
  ErrUptoFacilitatorMismatch,
7
7
  ErrUptoInvalidScheme,
8
8
  ErrUptoNetworkMismatch,
@@ -10,10 +10,7 @@ import {
10
10
  buildUptoPermit2SettleArgs,
11
11
  checkPermit2Prerequisites,
12
12
  diagnosePermit2SimulationFailure,
13
- extractEip2612GasSponsoringInfo,
14
- extractErc20ApprovalGasSponsoringInfo,
15
13
  mapSettleError,
16
- resolveErc20ApprovalExtensionSigner,
17
14
  simulatePermit2Settle,
18
15
  simulatePermit2SettleWithErc20Approval,
19
16
  simulatePermit2SettleWithPermit,
@@ -21,15 +18,26 @@ import {
21
18
  validateEip2612PermitForPayment,
22
19
  validateErc20ApprovalForPayment,
23
20
  waitAndReturnSettleResponse
24
- } from "../../chunk-CRT6YNY5.mjs";
21
+ } from "../../chunk-RWLVVO3B.mjs";
22
+ import {
23
+ ERC20_APPROVAL_GAS_SPONSORING_KEY,
24
+ extractEip2612GasSponsoringInfo,
25
+ extractErc20ApprovalGasSponsoringInfo,
26
+ resolveErc20ApprovalExtensionSigner
27
+ } from "../../chunk-GD4MKCN7.mjs";
28
+ import {
29
+ ErrPermit2AmountMismatch
30
+ } from "../../chunk-TGFAVNUD.mjs";
25
31
  import {
26
- ErrPermit2AmountMismatch,
27
32
  PERMIT2_ADDRESS,
28
- getEvmChainId,
29
33
  uptoPermit2WitnessTypes,
30
34
  x402UptoPermit2ProxyABI,
31
35
  x402UptoPermit2ProxyAddress
32
- } from "../../chunk-C4ZQMS77.mjs";
36
+ } from "../../chunk-MACPBXCT.mjs";
37
+ import "../../chunk-VS3RYAYE.mjs";
38
+ import {
39
+ getEvmChainId
40
+ } from "../../chunk-TW7Z65AO.mjs";
33
41
 
34
42
  // src/upto/facilitator/permit2.ts
35
43
  import { getAddress, encodeFunctionData } from "viem";
@@ -1 +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 \"@payai/x402/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 {\n PERMIT2_ADDRESS,\n uptoPermit2WitnessTypes,\n x402UptoPermit2ProxyABI,\n x402UptoPermit2ProxyAddress,\n} from \"../../constants\";\nimport {\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 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 // 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 );\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 );\n }\n }\n\n // Branch: standard settle (allowance already on-chain)\n return settleUptoDirect(signer, payload, permit2Payload, settlementAmount, facilitatorAddress);\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 * @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): 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 });\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 * @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): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n\n try {\n const settleData = encodeFunctionData({\n abi: uptoProxyConfig.proxyABI,\n functionName: \"settle\",\n args: buildUptoPermit2SettleArgs(permit2Payload, settlementAmount, facilitatorAddress),\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 * @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): 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 });\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 \"@payai/x402/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 * @returns Promise resolving to a verification response\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n context?: FacilitatorContext,\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"]}
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 \"@payai/x402/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 {\n PERMIT2_ADDRESS,\n uptoPermit2WitnessTypes,\n x402UptoPermit2ProxyABI,\n x402UptoPermit2ProxyAddress,\n} from \"../../constants\";\nimport {\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 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 // 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 );\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 );\n }\n }\n\n // Branch: standard settle (allowance already on-chain)\n return settleUptoDirect(signer, payload, permit2Payload, settlementAmount, facilitatorAddress);\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 * @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): 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 });\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 * @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): Promise<SettleResponse> {\n const payer = permit2Payload.permit2Authorization.from;\n\n try {\n const settleData = encodeFunctionData({\n abi: uptoProxyConfig.proxyABI,\n functionName: \"settle\",\n args: buildUptoPermit2SettleArgs(permit2Payload, settlementAmount, facilitatorAddress),\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 * @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): 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 });\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 \"@payai/x402/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 * @returns Promise resolving to a verification response\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n context?: FacilitatorContext,\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"]}
@@ -64,14 +64,6 @@ declare class UptoEvmScheme implements SchemeNetworkServer {
64
64
  * @returns The converted asset amount with token metadata
65
65
  */
66
66
  private defaultMoneyConversion;
67
- /**
68
- * Converts a decimal string amount to an integer token amount using the given decimals.
69
- *
70
- * @param decimalAmount - The amount as a decimal string (e.g. "1.5")
71
- * @param decimals - The number of decimal places for the token
72
- * @returns The token amount as an integer string in smallest units
73
- */
74
- private convertToTokenAmount;
75
67
  }
76
68
 
77
69
  export { UptoEvmScheme };
@@ -1,8 +1,9 @@
1
1
  import {
2
2
  getDefaultAsset
3
- } from "../../chunk-NSFLAANF.mjs";
3
+ } from "../../chunk-BTYNCDNS.mjs";
4
4
 
5
5
  // src/upto/server/scheme.ts
6
+ import { convertToTokenAmount, numberToDecimalString } from "@payai/x402/utils";
6
7
  import { getAddress } from "viem";
7
8
  var UptoEvmScheme = class {
8
9
  constructor() {
@@ -110,7 +111,7 @@ var UptoEvmScheme = class {
110
111
  */
111
112
  defaultMoneyConversion(amount, network) {
112
113
  const assetInfo = getDefaultAsset(network);
113
- const tokenAmount = this.convertToTokenAmount(amount.toString(), assetInfo.decimals);
114
+ const tokenAmount = convertToTokenAmount(numberToDecimalString(amount), assetInfo.decimals);
114
115
  return {
115
116
  amount: tokenAmount,
116
117
  asset: assetInfo.address,
@@ -121,23 +122,6 @@ var UptoEvmScheme = class {
121
122
  }
122
123
  };
123
124
  }
124
- /**
125
- * Converts a decimal string amount to an integer token amount using the given decimals.
126
- *
127
- * @param decimalAmount - The amount as a decimal string (e.g. "1.5")
128
- * @param decimals - The number of decimal places for the token
129
- * @returns The token amount as an integer string in smallest units
130
- */
131
- convertToTokenAmount(decimalAmount, decimals) {
132
- const amount = parseFloat(decimalAmount);
133
- if (isNaN(amount)) {
134
- throw new Error(`Invalid amount: ${decimalAmount}`);
135
- }
136
- const [intPart, decPart = ""] = String(amount).split(".");
137
- const paddedDec = decPart.padEnd(decimals, "0").slice(0, decimals);
138
- const tokenAmount = (intPart + paddedDec).replace(/^0+/, "") || "0";
139
- return tokenAmount;
140
- }
141
125
  };
142
126
  export {
143
127
  UptoEvmScheme
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/upto/server/scheme.ts"],"sourcesContent":["import {\n AssetAmount,\n Network,\n PaymentRequirements,\n Price,\n SchemeNetworkServer,\n MoneyParser,\n} from \"@payai/x402/types\";\nimport { getAddress } from \"viem\";\nimport { getDefaultAsset } from \"../../shared/defaultAssets\";\n\n/**\n * EVM server implementation for the Upto payment scheme.\n * Handles price parsing, payment requirements enhancement, and default asset resolution.\n */\nexport class UptoEvmScheme implements SchemeNetworkServer {\n readonly scheme = \"upto\";\n private moneyParsers: MoneyParser[] = [];\n\n /**\n * Registers a custom money parser for converting prices to asset amounts.\n *\n * @param parser - The money parser function to register\n * @returns This instance for chaining\n */\n registerMoneyParser(parser: MoneyParser): UptoEvmScheme {\n this.moneyParsers.push(parser);\n return this;\n }\n\n /**\n * Returns the decimal precision of the default stablecoin for the given network.\n * Implements the optional AssetDecimalsProvider interface used by resolveSettlementOverrideAmount.\n *\n * @param _asset - The asset symbol (unused; defaults to the network's default stablecoin)\n * @param network - The network to look up the default asset for\n * @returns The number of decimal places for the asset\n */\n getAssetDecimals(_asset: string, network: Network): number {\n try {\n return getDefaultAsset(network).decimals;\n } catch {\n return 6;\n }\n }\n\n /**\n * Parses a price into an asset amount for the given network.\n *\n * @param price - The price to parse (string, number, or AssetAmount)\n * @param network - The target network\n * @returns Promise resolving to an asset amount\n */\n async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n if (typeof price === \"object\" && price !== null && \"amount\" in price) {\n if (!price.asset) {\n throw new Error(`Asset address must be specified for AssetAmount on network ${network}`);\n }\n return {\n amount: price.amount,\n asset: price.asset,\n extra: price.extra || {},\n };\n }\n\n const amount = this.parseMoneyToDecimal(price);\n\n for (const parser of this.moneyParsers) {\n const result = await parser(amount, network);\n if (result !== null) {\n return result;\n }\n }\n\n return this.defaultMoneyConversion(amount, network);\n }\n\n /**\n * Enhances payment requirements with upto-specific metadata.\n *\n * @param paymentRequirements - The base payment requirements\n * @param supportedKind - The supported scheme/network kind\n * @param supportedKind.x402Version - The x402 protocol version\n * @param supportedKind.scheme - The payment scheme name\n * @param supportedKind.network - The target network\n * @param supportedKind.extra - Optional extra metadata\n * @param extensionKeys - Extension keys to include\n * @returns Promise resolving to enhanced payment requirements\n */\n enhancePaymentRequirements(\n paymentRequirements: PaymentRequirements,\n supportedKind: {\n x402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n },\n extensionKeys: string[],\n ): Promise<PaymentRequirements> {\n void extensionKeys;\n return Promise.resolve({\n ...paymentRequirements,\n extra: {\n ...paymentRequirements.extra,\n assetTransferMethod: \"permit2\",\n ...(supportedKind.extra?.facilitatorAddress\n ? { facilitatorAddress: getAddress(supportedKind.extra.facilitatorAddress as string) }\n : {}),\n },\n });\n }\n\n /**\n * Parses a money string or number into a decimal value.\n *\n * @param money - The money value to parse\n * @returns The parsed decimal amount\n */\n private parseMoneyToDecimal(money: string | number): number {\n if (typeof money === \"number\") {\n return money;\n }\n\n const cleanMoney = money.replace(/^\\$/, \"\").trim();\n const amount = parseFloat(cleanMoney);\n\n if (isNaN(amount)) {\n throw new Error(`Invalid money format: ${money}`);\n }\n\n return amount;\n }\n\n /**\n * Converts a numeric dollar amount to an AssetAmount using the default token for the network.\n *\n * @param amount - The dollar amount as a number\n * @param network - The target network\n * @returns The converted asset amount with token metadata\n */\n private defaultMoneyConversion(amount: number, network: Network): AssetAmount {\n const assetInfo = getDefaultAsset(network);\n const tokenAmount = this.convertToTokenAmount(amount.toString(), assetInfo.decimals);\n\n return {\n amount: tokenAmount,\n asset: assetInfo.address,\n extra: {\n name: assetInfo.name,\n version: assetInfo.version,\n assetTransferMethod: \"permit2\",\n },\n };\n }\n\n /**\n * Converts a decimal string amount to an integer token amount using the given decimals.\n *\n * @param decimalAmount - The amount as a decimal string (e.g. \"1.5\")\n * @param decimals - The number of decimal places for the token\n * @returns The token amount as an integer string in smallest units\n */\n private convertToTokenAmount(decimalAmount: string, decimals: number): string {\n const amount = parseFloat(decimalAmount);\n if (isNaN(amount)) {\n throw new Error(`Invalid amount: ${decimalAmount}`);\n }\n const [intPart, decPart = \"\"] = String(amount).split(\".\");\n const paddedDec = decPart.padEnd(decimals, \"0\").slice(0, decimals);\n const tokenAmount = (intPart + paddedDec).replace(/^0+/, \"\") || \"0\";\n return tokenAmount;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/upto/server/scheme.ts"],"sourcesContent":["import {\n AssetAmount,\n Network,\n PaymentRequirements,\n Price,\n SchemeNetworkServer,\n MoneyParser,\n} from \"@payai/x402/types\";\nimport { convertToTokenAmount, numberToDecimalString } from \"@payai/x402/utils\";\nimport { getAddress } from \"viem\";\nimport { getDefaultAsset } from \"../../shared/defaultAssets\";\n\n/**\n * EVM server implementation for the Upto payment scheme.\n * Handles price parsing, payment requirements enhancement, and default asset resolution.\n */\nexport class UptoEvmScheme implements SchemeNetworkServer {\n readonly scheme = \"upto\";\n private moneyParsers: MoneyParser[] = [];\n\n /**\n * Registers a custom money parser for converting prices to asset amounts.\n *\n * @param parser - The money parser function to register\n * @returns This instance for chaining\n */\n registerMoneyParser(parser: MoneyParser): UptoEvmScheme {\n this.moneyParsers.push(parser);\n return this;\n }\n\n /**\n * Returns the decimal precision of the default stablecoin for the given network.\n * Implements the optional AssetDecimalsProvider interface used by resolveSettlementOverrideAmount.\n *\n * @param _asset - The asset symbol (unused; defaults to the network's default stablecoin)\n * @param network - The network to look up the default asset for\n * @returns The number of decimal places for the asset\n */\n getAssetDecimals(_asset: string, network: Network): number {\n try {\n return getDefaultAsset(network).decimals;\n } catch {\n return 6;\n }\n }\n\n /**\n * Parses a price into an asset amount for the given network.\n *\n * @param price - The price to parse (string, number, or AssetAmount)\n * @param network - The target network\n * @returns Promise resolving to an asset amount\n */\n async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n if (typeof price === \"object\" && price !== null && \"amount\" in price) {\n if (!price.asset) {\n throw new Error(`Asset address must be specified for AssetAmount on network ${network}`);\n }\n return {\n amount: price.amount,\n asset: price.asset,\n extra: price.extra || {},\n };\n }\n\n const amount = this.parseMoneyToDecimal(price);\n\n for (const parser of this.moneyParsers) {\n const result = await parser(amount, network);\n if (result !== null) {\n return result;\n }\n }\n\n return this.defaultMoneyConversion(amount, network);\n }\n\n /**\n * Enhances payment requirements with upto-specific metadata.\n *\n * @param paymentRequirements - The base payment requirements\n * @param supportedKind - The supported scheme/network kind\n * @param supportedKind.x402Version - The x402 protocol version\n * @param supportedKind.scheme - The payment scheme name\n * @param supportedKind.network - The target network\n * @param supportedKind.extra - Optional extra metadata\n * @param extensionKeys - Extension keys to include\n * @returns Promise resolving to enhanced payment requirements\n */\n enhancePaymentRequirements(\n paymentRequirements: PaymentRequirements,\n supportedKind: {\n x402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n },\n extensionKeys: string[],\n ): Promise<PaymentRequirements> {\n void extensionKeys;\n return Promise.resolve({\n ...paymentRequirements,\n extra: {\n ...paymentRequirements.extra,\n assetTransferMethod: \"permit2\",\n ...(supportedKind.extra?.facilitatorAddress\n ? { facilitatorAddress: getAddress(supportedKind.extra.facilitatorAddress as string) }\n : {}),\n },\n });\n }\n\n /**\n * Parses a money string or number into a decimal value.\n *\n * @param money - The money value to parse\n * @returns The parsed decimal amount\n */\n private parseMoneyToDecimal(money: string | number): number {\n if (typeof money === \"number\") {\n return money;\n }\n\n const cleanMoney = money.replace(/^\\$/, \"\").trim();\n const amount = parseFloat(cleanMoney);\n\n if (isNaN(amount)) {\n throw new Error(`Invalid money format: ${money}`);\n }\n\n return amount;\n }\n\n /**\n * Converts a numeric dollar amount to an AssetAmount using the default token for the network.\n *\n * @param amount - The dollar amount as a number\n * @param network - The target network\n * @returns The converted asset amount with token metadata\n */\n private defaultMoneyConversion(amount: number, network: Network): AssetAmount {\n const assetInfo = getDefaultAsset(network);\n const tokenAmount = convertToTokenAmount(numberToDecimalString(amount), assetInfo.decimals);\n\n return {\n amount: tokenAmount,\n asset: assetInfo.address,\n extra: {\n name: assetInfo.name,\n version: assetInfo.version,\n assetTransferMethod: \"permit2\",\n },\n };\n }\n}\n"],"mappings":";;;;;AAQA,SAAS,sBAAsB,6BAA6B;AAC5D,SAAS,kBAAkB;AAOpB,IAAM,gBAAN,MAAmD;AAAA,EAAnD;AACL,SAAS,SAAS;AAClB,SAAQ,eAA8B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQvC,oBAAoB,QAAoC;AACtD,SAAK,aAAa,KAAK,MAAM;AAC7B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBAAiB,QAAgB,SAA0B;AACzD,QAAI;AACF,aAAO,gBAAgB,OAAO,EAAE;AAAA,IAClC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAW,OAAc,SAAwC;AACrE,QAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,YAAY,OAAO;AACpE,UAAI,CAAC,MAAM,OAAO;AAChB,cAAM,IAAI,MAAM,8DAA8D,OAAO,EAAE;AAAA,MACzF;AACA,aAAO;AAAA,QACL,QAAQ,MAAM;AAAA,QACd,OAAO,MAAM;AAAA,QACb,OAAO,MAAM,SAAS,CAAC;AAAA,MACzB;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,oBAAoB,KAAK;AAE7C,eAAW,UAAU,KAAK,cAAc;AACtC,YAAM,SAAS,MAAM,OAAO,QAAQ,OAAO;AAC3C,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO,KAAK,uBAAuB,QAAQ,OAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,2BACE,qBACA,eAMA,eAC8B;AAC9B,SAAK;AACL,WAAO,QAAQ,QAAQ;AAAA,MACrB,GAAG;AAAA,MACH,OAAO;AAAA,QACL,GAAG,oBAAoB;AAAA,QACvB,qBAAqB;AAAA,QACrB,GAAI,cAAc,OAAO,qBACrB,EAAE,oBAAoB,WAAW,cAAc,MAAM,kBAA4B,EAAE,IACnF,CAAC;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,oBAAoB,OAAgC;AAC1D,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,MAAM,QAAQ,OAAO,EAAE,EAAE,KAAK;AACjD,UAAM,SAAS,WAAW,UAAU;AAEpC,QAAI,MAAM,MAAM,GAAG;AACjB,YAAM,IAAI,MAAM,yBAAyB,KAAK,EAAE;AAAA,IAClD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,uBAAuB,QAAgB,SAA+B;AAC5E,UAAM,YAAY,gBAAgB,OAAO;AACzC,UAAM,cAAc,qBAAqB,sBAAsB,MAAM,GAAG,UAAU,QAAQ;AAE1F,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO,UAAU;AAAA,MACjB,OAAO;AAAA,QACL,MAAM,UAAU;AAAA,QAChB,SAAS,UAAU;AAAA,QACnB,qBAAqB;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -1,6 +1,7 @@
1
1
  export { ExactEvmSchemeV1 } from '../exact/v1/client/index.mjs';
2
2
  import '@payai/x402/types';
3
- import '../signer-D912R4mq.mjs';
3
+ import '../signer-tYS6Y46X.mjs';
4
+ import 'viem';
4
5
 
5
6
  declare const EVM_NETWORK_CHAIN_ID_MAP: {
6
7
  readonly ethereum: 1;
@@ -3,8 +3,11 @@ import {
3
3
  ExactEvmSchemeV12 as ExactEvmSchemeV1,
4
4
  NETWORKS,
5
5
  getEvmChainIdV1
6
- } from "../chunk-RYT6M3PA.mjs";
7
- import "../chunk-C4ZQMS77.mjs";
6
+ } from "../chunk-CSQS7ZON.mjs";
7
+ import "../chunk-TGFAVNUD.mjs";
8
+ import "../chunk-MACPBXCT.mjs";
9
+ import "../chunk-VS3RYAYE.mjs";
10
+ import "../chunk-TW7Z65AO.mjs";
8
11
  export {
9
12
  EVM_NETWORK_CHAIN_ID_MAP,
10
13
  ExactEvmSchemeV1,
package/package.json CHANGED
@@ -1,9 +1,12 @@
1
1
  {
2
2
  "name": "@payai/x402-evm",
3
- "version": "2.4.0",
3
+ "version": "2.4.2",
4
4
  "main": "./dist/cjs/index.js",
5
5
  "module": "./dist/esm/index.js",
6
6
  "types": "./dist/cjs/index.d.ts",
7
+ "scripts": {
8
+ "build": "node ./scripts/build.js"
9
+ },
7
10
  "keywords": [
8
11
  "x402",
9
12
  "payment",
@@ -130,8 +133,5 @@
130
133
  ],
131
134
  "publishConfig": {
132
135
  "access": "public"
133
- },
134
- "scripts": {
135
- "build": "node ./scripts/build.js"
136
136
  }
137
- }
137
+ }