@t402/evm 2.4.0 → 2.6.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 (62) hide show
  1. package/dist/cjs/exact/client/index.d.ts +1 -1
  2. package/dist/cjs/exact/server/index.js +13 -0
  3. package/dist/cjs/exact/server/index.js.map +1 -1
  4. package/dist/cjs/index-fzI2FyBT.d.ts +122 -0
  5. package/dist/cjs/index.d.ts +1 -1
  6. package/dist/cjs/index.js +13 -0
  7. package/dist/cjs/index.js.map +1 -1
  8. package/dist/cjs/permit2/client/index.d.ts +81 -0
  9. package/dist/cjs/permit2/client/index.js +150 -0
  10. package/dist/cjs/permit2/client/index.js.map +1 -0
  11. package/dist/cjs/permit2/facilitator/index.d.ts +82 -0
  12. package/dist/cjs/permit2/facilitator/index.js +301 -0
  13. package/dist/cjs/permit2/facilitator/index.js.map +1 -0
  14. package/dist/cjs/permit2/index.d.ts +145 -0
  15. package/dist/cjs/permit2/index.js +1075 -0
  16. package/dist/cjs/permit2/index.js.map +1 -0
  17. package/dist/cjs/permit2/server/index.d.ts +3 -0
  18. package/dist/cjs/permit2/server/index.js +686 -0
  19. package/dist/cjs/permit2/server/index.js.map +1 -0
  20. package/dist/cjs/{scheme-CIar5W2B.d.ts → scheme-549isuwf.d.ts} +1 -1
  21. package/dist/cjs/upto/client/index.js.map +1 -1
  22. package/dist/cjs/upto/index.d.ts +1 -1
  23. package/dist/cjs/upto/index.js +13 -0
  24. package/dist/cjs/upto/index.js.map +1 -1
  25. package/dist/esm/chunk-3KHB6QTD.mjs +112 -0
  26. package/dist/esm/chunk-3KHB6QTD.mjs.map +1 -0
  27. package/dist/esm/{chunk-SURTCHSX.mjs → chunk-AH3XB4XD.mjs} +1 -1
  28. package/dist/esm/chunk-AH3XB4XD.mjs.map +1 -0
  29. package/dist/esm/{chunk-SJ52GTJJ.mjs → chunk-EEZNFYCW.mjs} +6 -6
  30. package/dist/esm/{chunk-IWSDEZKI.mjs → chunk-FUUW3JGG.mjs} +14 -1
  31. package/dist/esm/chunk-FUUW3JGG.mjs.map +1 -0
  32. package/dist/esm/chunk-MMQSLAA2.mjs +190 -0
  33. package/dist/esm/chunk-MMQSLAA2.mjs.map +1 -0
  34. package/dist/esm/chunk-NIGKNI66.mjs +224 -0
  35. package/dist/esm/chunk-NIGKNI66.mjs.map +1 -0
  36. package/dist/esm/chunk-URG4HEYQ.mjs +74 -0
  37. package/dist/esm/chunk-URG4HEYQ.mjs.map +1 -0
  38. package/dist/esm/exact/client/index.d.mts +1 -1
  39. package/dist/esm/exact/server/index.mjs +1 -1
  40. package/dist/esm/index-fzI2FyBT.d.mts +122 -0
  41. package/dist/esm/index.d.mts +1 -1
  42. package/dist/esm/index.mjs +10 -10
  43. package/dist/esm/permit2/client/index.d.mts +81 -0
  44. package/dist/esm/permit2/client/index.mjs +11 -0
  45. package/dist/esm/permit2/client/index.mjs.map +1 -0
  46. package/dist/esm/permit2/facilitator/index.d.mts +82 -0
  47. package/dist/esm/permit2/facilitator/index.mjs +11 -0
  48. package/dist/esm/permit2/facilitator/index.mjs.map +1 -0
  49. package/dist/esm/permit2/index.d.mts +145 -0
  50. package/dist/esm/permit2/index.mjs +31 -0
  51. package/dist/esm/permit2/index.mjs.map +1 -0
  52. package/dist/esm/permit2/server/index.d.mts +3 -0
  53. package/dist/esm/permit2/server/index.mjs +12 -0
  54. package/dist/esm/permit2/server/index.mjs.map +1 -0
  55. package/dist/esm/{scheme-DATfd6oM.d.mts → scheme-lCNykV7l.d.mts} +1 -1
  56. package/dist/esm/upto/client/index.mjs +1 -1
  57. package/dist/esm/upto/index.d.mts +1 -1
  58. package/dist/esm/upto/index.mjs +3 -3
  59. package/package.json +63 -16
  60. package/dist/esm/chunk-IWSDEZKI.mjs.map +0 -1
  61. package/dist/esm/chunk-SURTCHSX.mjs.map +0 -1
  62. /package/dist/esm/{chunk-SJ52GTJJ.mjs.map → chunk-EEZNFYCW.mjs.map} +0 -0
@@ -0,0 +1,82 @@
1
+ import { SchemeNetworkFacilitator, PaymentPayload, PaymentRequirements, VerifyResponse, SettleResponse, Network } from '@t402/core/types';
2
+ import { F as FacilitatorEvmSigner } from '../../signer-DcavxxZt.mjs';
3
+ import { t402Facilitator } from '@t402/core/facilitator';
4
+
5
+ /**
6
+ * Configuration for Permit2 EVM facilitator
7
+ */
8
+ interface Permit2EvmSchemeConfig {
9
+ [key: string]: unknown;
10
+ }
11
+ /**
12
+ * EVM facilitator implementation for the Permit2 payment scheme.
13
+ *
14
+ * Verifies Permit2 signatures and settles payments by calling
15
+ * permitTransferFrom on the Permit2 contract.
16
+ */
17
+ declare class Permit2EvmScheme implements SchemeNetworkFacilitator {
18
+ private readonly signer;
19
+ readonly scheme = "permit2";
20
+ readonly caipFamily = "eip155:*";
21
+ /**
22
+ * Creates a new Permit2 facilitator instance.
23
+ *
24
+ * @param signer - The facilitator EVM signer
25
+ */
26
+ constructor(signer: FacilitatorEvmSigner);
27
+ /**
28
+ * Get mechanism-specific extra data for supported kinds.
29
+ *
30
+ * @param _ - The network identifier
31
+ * @returns Extra data including permit2 contract address
32
+ */
33
+ getExtra(_: string): Record<string, unknown> | undefined;
34
+ /**
35
+ * Get signer addresses for this facilitator.
36
+ *
37
+ * @param _ - The network identifier
38
+ * @returns Array of signer addresses
39
+ */
40
+ getSigners(_: string): string[];
41
+ /**
42
+ * Verify a Permit2 payment payload.
43
+ *
44
+ * @param payload - The payment payload to verify
45
+ * @param requirements - The payment requirements
46
+ * @returns Verification result
47
+ */
48
+ verify(payload: PaymentPayload, requirements: PaymentRequirements): Promise<VerifyResponse>;
49
+ /**
50
+ * Settle a Permit2 payment by executing permitTransferFrom.
51
+ *
52
+ * @param payload - The payment payload
53
+ * @param requirements - The payment requirements
54
+ * @returns Settlement result
55
+ */
56
+ settle(payload: PaymentPayload, requirements: PaymentRequirements): Promise<SettleResponse>;
57
+ }
58
+
59
+ /**
60
+ * Configuration options for registering Permit2 schemes to an t402Facilitator
61
+ */
62
+ interface Permit2EvmFacilitatorConfig {
63
+ /**
64
+ * The EVM signer for facilitator operations (verify and settle)
65
+ */
66
+ signer: FacilitatorEvmSigner;
67
+ /**
68
+ * Networks to register (single network or array of networks)
69
+ * Examples: "eip155:84532", ["eip155:84532", "eip155:1"]
70
+ */
71
+ networks: Network | Network[];
72
+ }
73
+ /**
74
+ * Registers Permit2 EVM payment schemes to an t402Facilitator instance.
75
+ *
76
+ * @param facilitator - The t402Facilitator instance to register schemes to
77
+ * @param config - Configuration for Permit2 EVM facilitator registration
78
+ * @returns The facilitator instance for chaining
79
+ */
80
+ declare function registerPermit2EvmScheme(facilitator: t402Facilitator, config: Permit2EvmFacilitatorConfig): t402Facilitator;
81
+
82
+ export { type Permit2EvmFacilitatorConfig, Permit2EvmScheme, type Permit2EvmSchemeConfig, registerPermit2EvmScheme };
@@ -0,0 +1,11 @@
1
+ import {
2
+ Permit2EvmScheme,
3
+ registerPermit2EvmScheme
4
+ } from "../../chunk-NIGKNI66.mjs";
5
+ import "../../chunk-URG4HEYQ.mjs";
6
+ import "../../chunk-NSSMTXJJ.mjs";
7
+ export {
8
+ Permit2EvmScheme,
9
+ registerPermit2EvmScheme
10
+ };
11
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,145 @@
1
+ export { Permit2EvmClientConfig, Permit2EvmScheme as Permit2EvmClientScheme, registerPermit2EvmScheme as registerPermit2EvmClientScheme } from './client/index.mjs';
2
+ export { P as Permit2EvmResourceServerConfig, a as Permit2EvmServerScheme, b as Permit2EvmServerSchemeConfig, r as registerPermit2EvmServerScheme } from '../index-fzI2FyBT.mjs';
3
+ export { Permit2EvmFacilitatorConfig, Permit2EvmScheme as Permit2EvmFacilitatorScheme, Permit2EvmSchemeConfig as Permit2EvmFacilitatorSchemeConfig, registerPermit2EvmScheme as registerPermit2EvmFacilitatorScheme } from './facilitator/index.mjs';
4
+ import '@t402/core/types';
5
+ import '../signer-DcavxxZt.mjs';
6
+ import '@t402/core/client';
7
+ import '@t402/core/server';
8
+ import '@t402/core/facilitator';
9
+
10
+ /**
11
+ * Permit2 Types
12
+ *
13
+ * Type definitions for Uniswap Permit2 SignatureTransfer scheme.
14
+ */
15
+ /**
16
+ * Token permissions for Permit2
17
+ */
18
+ type TokenPermissions = {
19
+ /** ERC20 token address */
20
+ token: `0x${string}`;
21
+ /** Maximum amount permitted to transfer */
22
+ amount: string;
23
+ };
24
+ /**
25
+ * Permit2 PermitTransferFrom parameters
26
+ */
27
+ type PermitTransferFrom = {
28
+ /** Token and amount permissions */
29
+ permitted: TokenPermissions;
30
+ /** Unique nonce (monotonically increasing per owner on the Permit2 contract) */
31
+ nonce: string;
32
+ /** Unix timestamp deadline for the permit */
33
+ deadline: string;
34
+ };
35
+ /**
36
+ * Transfer details for Permit2
37
+ */
38
+ type SignatureTransferDetails = {
39
+ /** Recipient address */
40
+ to: `0x${string}`;
41
+ /** Requested transfer amount */
42
+ requestedAmount: string;
43
+ };
44
+ /**
45
+ * Permit2 payment payload (V2)
46
+ */
47
+ type Permit2PayloadV2 = {
48
+ /** The permit parameters */
49
+ permit: PermitTransferFrom;
50
+ /** Transfer destination and amount */
51
+ transferDetails: SignatureTransferDetails;
52
+ /** EIP-712 signature */
53
+ signature: `0x${string}`;
54
+ /** Token owner address */
55
+ owner: `0x${string}`;
56
+ };
57
+
58
+ /**
59
+ * Permit2 Constants
60
+ *
61
+ * Uniswap Permit2 contract addresses, type hashes, and ABI fragments.
62
+ */
63
+ /** Canonical Permit2 contract address (same on all EVM chains) */
64
+ declare const PERMIT2_ADDRESS: "0x000000000022D473030F116dDEE9F6B43aC78BA3";
65
+ /** EIP-712 type definitions for Permit2 SignatureTransfer */
66
+ declare const permit2Types: {
67
+ readonly PermitTransferFrom: readonly [{
68
+ readonly name: "permitted";
69
+ readonly type: "TokenPermissions";
70
+ }, {
71
+ readonly name: "spender";
72
+ readonly type: "address";
73
+ }, {
74
+ readonly name: "nonce";
75
+ readonly type: "uint256";
76
+ }, {
77
+ readonly name: "deadline";
78
+ readonly type: "uint256";
79
+ }];
80
+ readonly TokenPermissions: readonly [{
81
+ readonly name: "token";
82
+ readonly type: "address";
83
+ }, {
84
+ readonly name: "amount";
85
+ readonly type: "uint256";
86
+ }];
87
+ };
88
+ /** Permit2 ABI for permitTransferFrom */
89
+ declare const permit2ABI: readonly [{
90
+ readonly inputs: readonly [{
91
+ readonly components: readonly [{
92
+ readonly components: readonly [{
93
+ readonly name: "token";
94
+ readonly type: "address";
95
+ }, {
96
+ readonly name: "amount";
97
+ readonly type: "uint256";
98
+ }];
99
+ readonly name: "permitted";
100
+ readonly type: "tuple";
101
+ }, {
102
+ readonly name: "nonce";
103
+ readonly type: "uint256";
104
+ }, {
105
+ readonly name: "deadline";
106
+ readonly type: "uint256";
107
+ }];
108
+ readonly name: "permit";
109
+ readonly type: "tuple";
110
+ }, {
111
+ readonly components: readonly [{
112
+ readonly name: "to";
113
+ readonly type: "address";
114
+ }, {
115
+ readonly name: "requestedAmount";
116
+ readonly type: "uint256";
117
+ }];
118
+ readonly name: "transferDetails";
119
+ readonly type: "tuple";
120
+ }, {
121
+ readonly name: "owner";
122
+ readonly type: "address";
123
+ }, {
124
+ readonly name: "signature";
125
+ readonly type: "bytes";
126
+ }];
127
+ readonly name: "permitTransferFrom";
128
+ readonly outputs: readonly [];
129
+ readonly stateMutability: "nonpayable";
130
+ readonly type: "function";
131
+ }, {
132
+ readonly inputs: readonly [{
133
+ readonly name: "account";
134
+ readonly type: "address";
135
+ }];
136
+ readonly name: "balanceOf";
137
+ readonly outputs: readonly [{
138
+ readonly name: "";
139
+ readonly type: "uint256";
140
+ }];
141
+ readonly stateMutability: "view";
142
+ readonly type: "function";
143
+ }];
144
+
145
+ export { PERMIT2_ADDRESS, type Permit2PayloadV2, type PermitTransferFrom, type SignatureTransferDetails, type TokenPermissions, permit2ABI, permit2Types };
@@ -0,0 +1,31 @@
1
+ import {
2
+ Permit2EvmScheme,
3
+ registerPermit2EvmScheme
4
+ } from "../chunk-3KHB6QTD.mjs";
5
+ import {
6
+ Permit2EvmScheme as Permit2EvmScheme2,
7
+ registerPermit2EvmScheme as registerPermit2EvmScheme2
8
+ } from "../chunk-MMQSLAA2.mjs";
9
+ import {
10
+ Permit2EvmScheme as Permit2EvmScheme3,
11
+ registerPermit2EvmScheme as registerPermit2EvmScheme3
12
+ } from "../chunk-NIGKNI66.mjs";
13
+ import {
14
+ PERMIT2_ADDRESS,
15
+ permit2ABI,
16
+ permit2Types
17
+ } from "../chunk-URG4HEYQ.mjs";
18
+ import "../chunk-FUUW3JGG.mjs";
19
+ import "../chunk-NSSMTXJJ.mjs";
20
+ export {
21
+ PERMIT2_ADDRESS,
22
+ Permit2EvmScheme as Permit2EvmClientScheme,
23
+ Permit2EvmScheme3 as Permit2EvmFacilitatorScheme,
24
+ Permit2EvmScheme2 as Permit2EvmServerScheme,
25
+ permit2ABI,
26
+ permit2Types,
27
+ registerPermit2EvmScheme as registerPermit2EvmClientScheme,
28
+ registerPermit2EvmScheme3 as registerPermit2EvmFacilitatorScheme,
29
+ registerPermit2EvmScheme2 as registerPermit2EvmServerScheme
30
+ };
31
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,3 @@
1
+ export { P as Permit2EvmResourceServerConfig, a as Permit2EvmScheme, r as registerPermit2EvmScheme } from '../../index-fzI2FyBT.mjs';
2
+ import '@t402/core/types';
3
+ import '@t402/core/server';
@@ -0,0 +1,12 @@
1
+ import {
2
+ Permit2EvmScheme,
3
+ registerPermit2EvmScheme
4
+ } from "../../chunk-MMQSLAA2.mjs";
5
+ import "../../chunk-URG4HEYQ.mjs";
6
+ import "../../chunk-FUUW3JGG.mjs";
7
+ import "../../chunk-NSSMTXJJ.mjs";
8
+ export {
9
+ Permit2EvmScheme,
10
+ registerPermit2EvmScheme
11
+ };
12
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -197,4 +197,4 @@ declare class UptoEvmFacilitatorScheme implements SchemeNetworkFacilitator {
197
197
  */
198
198
  declare function createUptoEvmFacilitatorScheme(signer: FacilitatorEvmSigner, config?: UptoEvmFacilitatorSchemeConfig): UptoEvmFacilitatorScheme;
199
199
 
200
- export { UptoEvmServerScheme as U, type UptoEvmServerSchemeConfig as a, UptoEvmFacilitatorScheme as b, createUptoEvmServerScheme as c, createUptoEvmFacilitatorScheme as d, type UptoEvmFacilitatorSchemeConfig as e };
200
+ export { UptoEvmFacilitatorScheme as U, type UptoEvmFacilitatorSchemeConfig as a, UptoEvmServerScheme as b, type UptoEvmServerSchemeConfig as c, createUptoEvmFacilitatorScheme as d, createUptoEvmServerScheme as e };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  UptoEvmScheme,
3
3
  createUptoEvmScheme
4
- } from "../../chunk-SURTCHSX.mjs";
4
+ } from "../../chunk-AH3XB4XD.mjs";
5
5
  import "../../chunk-SYVPLXYV.mjs";
6
6
  import "../../chunk-NSSMTXJJ.mjs";
7
7
  export {
@@ -1,5 +1,5 @@
1
1
  export { UptoEvmScheme, createUptoEvmScheme } from './client/index.mjs';
2
- export { b as UptoEvmFacilitatorScheme, e as UptoEvmFacilitatorSchemeConfig, U as UptoEvmServerScheme, a as UptoEvmServerSchemeConfig, d as createUptoEvmFacilitatorScheme, c as createUptoEvmServerScheme } from '../scheme-DATfd6oM.mjs';
2
+ export { U as UptoEvmFacilitatorScheme, a as UptoEvmFacilitatorSchemeConfig, b as UptoEvmServerScheme, c as UptoEvmServerSchemeConfig, d as createUptoEvmFacilitatorScheme, e as createUptoEvmServerScheme } from '../scheme-lCNykV7l.mjs';
3
3
  import '@t402/core/types';
4
4
  import '../signer-DcavxxZt.mjs';
5
5
 
@@ -3,15 +3,15 @@ import {
3
3
  UptoEvmServerScheme,
4
4
  createUptoEvmFacilitatorScheme,
5
5
  createUptoEvmServerScheme
6
- } from "../chunk-SJ52GTJJ.mjs";
7
- import "../chunk-IWSDEZKI.mjs";
6
+ } from "../chunk-EEZNFYCW.mjs";
8
7
  import {
9
8
  UptoEvmScheme,
10
9
  createUptoEvmScheme,
11
10
  isUptoEIP2612Payload,
12
11
  permitTypes
13
- } from "../chunk-SURTCHSX.mjs";
12
+ } from "../chunk-AH3XB4XD.mjs";
14
13
  import "../chunk-SYVPLXYV.mjs";
14
+ import "../chunk-FUUW3JGG.mjs";
15
15
  import "../chunk-NSSMTXJJ.mjs";
16
16
  export {
17
17
  UptoEvmFacilitatorScheme,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@t402/evm",
3
- "version": "2.4.0",
3
+ "version": "2.6.0",
4
4
  "main": "./dist/cjs/index.js",
5
5
  "module": "./dist/esm/index.js",
6
6
  "types": "./dist/cjs/index.d.ts",
@@ -13,30 +13,33 @@
13
13
  ],
14
14
  "license": "Apache-2.0",
15
15
  "author": "T402 Team",
16
- "repository": "https://github.com/t402-io/t402",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/t402-io/t402.git",
19
+ "directory": "sdks/typescript/packages/mechanisms/evm"
20
+ },
17
21
  "description": "t402 Payment Protocol EVM Implementation",
18
22
  "devDependencies": {
19
- "@eslint/js": "^9.24.0",
20
- "@types/node": "^25.2.0",
21
- "@typescript-eslint/eslint-plugin": "^8.29.1",
22
- "@typescript-eslint/parser": "^8.29.1",
23
+ "@eslint/js": "^9.39.2",
24
+ "@types/node": "^25.2.3",
25
+ "@typescript-eslint/eslint-plugin": "^8.56.0",
26
+ "@typescript-eslint/parser": "^8.56.0",
23
27
  "eslint": "^9.24.0",
24
28
  "eslint-plugin-import": "^2.31.0",
25
- "eslint-plugin-jsdoc": "^62.5.0",
26
- "eslint-plugin-prettier": "^5.2.6",
27
- "glob": "^13.0.0",
28
- "prettier": "3.5.2",
29
- "tsup": "^8.4.0",
29
+ "eslint-plugin-jsdoc": "^62.6.0",
30
+ "eslint-plugin-prettier": "^5.5.5",
31
+ "glob": "^13.0.5",
32
+ "prettier": "3.8.1",
33
+ "tsup": "^8.5.1",
30
34
  "tsx": "^4.21.0",
31
- "typescript": "^5.7.3",
35
+ "typescript": "^5.9.3",
32
36
  "vite": "^7.3.1",
33
- "vite-tsconfig-paths": "^5.1.4",
37
+ "vite-tsconfig-paths": "^6.1.1",
34
38
  "vitest": "^3.2.4"
35
39
  },
36
40
  "dependencies": {
37
- "zod": "^3.24.2",
38
- "@t402/core": "2.4.0",
39
- "@t402/evm-core": "2.4.0"
41
+ "@t402/core": "2.6.0",
42
+ "@t402/evm-core": "2.6.0"
40
43
  },
41
44
  "peerDependencies": {
42
45
  "viem": "^2.0.0"
@@ -112,6 +115,46 @@
112
115
  "default": "./dist/cjs/exact/v1/facilitator/index.js"
113
116
  }
114
117
  },
118
+ "./permit2": {
119
+ "import": {
120
+ "types": "./dist/esm/permit2/index.d.mts",
121
+ "default": "./dist/esm/permit2/index.mjs"
122
+ },
123
+ "require": {
124
+ "types": "./dist/cjs/permit2/index.d.ts",
125
+ "default": "./dist/cjs/permit2/index.js"
126
+ }
127
+ },
128
+ "./permit2/client": {
129
+ "import": {
130
+ "types": "./dist/esm/permit2/client/index.d.mts",
131
+ "default": "./dist/esm/permit2/client/index.mjs"
132
+ },
133
+ "require": {
134
+ "types": "./dist/cjs/permit2/client/index.d.ts",
135
+ "default": "./dist/cjs/permit2/client/index.js"
136
+ }
137
+ },
138
+ "./permit2/server": {
139
+ "import": {
140
+ "types": "./dist/esm/permit2/server/index.d.mts",
141
+ "default": "./dist/esm/permit2/server/index.mjs"
142
+ },
143
+ "require": {
144
+ "types": "./dist/cjs/permit2/server/index.d.ts",
145
+ "default": "./dist/cjs/permit2/server/index.js"
146
+ }
147
+ },
148
+ "./permit2/facilitator": {
149
+ "import": {
150
+ "types": "./dist/esm/permit2/facilitator/index.d.mts",
151
+ "default": "./dist/esm/permit2/facilitator/index.mjs"
152
+ },
153
+ "require": {
154
+ "types": "./dist/cjs/permit2/facilitator/index.d.ts",
155
+ "default": "./dist/cjs/permit2/facilitator/index.js"
156
+ }
157
+ },
115
158
  "./upto": {
116
159
  "import": {
117
160
  "types": "./dist/esm/upto/index.d.mts",
@@ -136,6 +179,10 @@
136
179
  "files": [
137
180
  "dist"
138
181
  ],
182
+ "homepage": "https://t402.io",
183
+ "publishConfig": {
184
+ "access": "public"
185
+ },
139
186
  "scripts": {
140
187
  "start": "tsx --env-file=.env index.ts",
141
188
  "build": "tsup",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/tokens.ts"],"sourcesContent":["/**\n * Token configuration for T402 EVM payments\n *\n * This module provides comprehensive token definitions including:\n * - USDT0 (Tether's new omnichain token with EIP-3009 support)\n * - USDC (USD Coin with EIP-3009 support)\n * - Legacy tokens configuration\n */\n\nimport type { Address } from \"viem\";\n\n/**\n * Token type classification for payment scheme selection\n */\nexport type TokenType = \"eip3009\" | \"legacy\";\n\n/**\n * Token configuration with EIP-712 domain parameters\n */\nexport interface TokenConfig {\n /** Token contract address */\n address: Address;\n /** Token symbol (e.g., \"USDT0\", \"USDC\") */\n symbol: string;\n /** EIP-712 domain name for signing */\n name: string;\n /** EIP-712 domain version for signing */\n version: string;\n /** Number of decimal places */\n decimals: number;\n /** Token type for scheme selection */\n tokenType: TokenType;\n /** Payment priority (lower = higher priority) */\n priority: number;\n}\n\n/**\n * Network token registry mapping network -> symbol -> config\n */\nexport type NetworkTokenRegistry = Record<string, Record<string, TokenConfig>>;\n\n/**\n * USDT0 Contract Addresses by Network\n * Source: https://docs.tether.io/usdt0/integration-guide/deployed-contracts\n *\n * USDT0 is Tether's new omnichain token using LayerZero OFT standard.\n * Key features:\n * - Supports EIP-3009 transferWithAuthorization (gasless transfers)\n * - Supports EIP-2612 permit\n * - Native cross-chain via LayerZero\n */\nexport const USDT0_ADDRESSES: Record<string, Address> = {\n // === Existing Networks ===\n // Ethereum Mainnet - OFT Adapter (bridge endpoint)\n \"eip155:1\": \"0x6C96dE32CEa08842dcc4058c14d3aaAD7Fa41dee\",\n // Arbitrum One - Native USDT0\n \"eip155:42161\": \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\",\n // Ink Mainnet\n \"eip155:57073\": \"0x0200C29006150606B650577BBE7B6248F58470c1\",\n // Berachain Mainnet\n \"eip155:80094\": \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\",\n // Unichain Mainnet (updated address)\n \"eip155:130\": \"0x9151434b16b9763660705744891fA906F660EcC5\",\n\n // === Phase 1: High Priority Networks ===\n // Polygon PoS\n \"eip155:137\": \"0xc2132D05D31c914a87C6611C10748AEb04B58e8F\",\n // Mantle\n \"eip155:5000\": \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\",\n // Optimism\n \"eip155:10\": \"0x01bFF41798a0BcF287b996046Ca68b395DbC1071\",\n // Plasma\n \"eip155:9745\": \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\",\n // Sei\n \"eip155:1329\": \"0x9151434b16b9763660705744891fA906F660EcC5\",\n // Conflux eSpace\n \"eip155:1030\": \"0xaf37E8B6C9ED7f6318979f56Fc287d76c30847ff\",\n // Monad\n \"eip155:143\": \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\",\n\n // === Phase 2: Medium Priority Networks ===\n // Rootstock (Bitcoin sidechain)\n \"eip155:30\": \"0x779dED0C9e1022225F8e0630b35A9B54Be713736\",\n // XLayer (OKX L2)\n \"eip155:196\": \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\",\n // Flare\n \"eip155:14\": \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\",\n // Corn\n \"eip155:21000000\": \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\",\n // HyperEVM\n \"eip155:999\": \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\",\n // MegaETH\n \"eip155:4326\": \"0xb8ce59fc3717ada4c02eadf9682a9e934f625ebb\",\n // Stable\n \"eip155:988\": \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\",\n};\n\n/**\n * USDC Contract Addresses by Network\n * Native USDC with EIP-3009 support\n */\nexport const USDC_ADDRESSES: Record<string, Address> = {\n // Ethereum Mainnet\n \"eip155:1\": \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n // Base Mainnet\n \"eip155:8453\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n // Base Sepolia (testnet)\n \"eip155:84532\": \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n // Sepolia (testnet)\n \"eip155:11155111\": \"0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238\",\n // Arbitrum One\n \"eip155:42161\": \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n // Polygon Mainnet\n \"eip155:137\": \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n};\n\n/**\n * Traditional USDT Addresses (Legacy - no EIP-3009 support)\n * These require the approve + transferFrom pattern\n */\nexport const USDT_LEGACY_ADDRESSES: Record<string, Address> = {\n // Ethereum Mainnet\n \"eip155:1\": \"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\n // Polygon Mainnet (native USDT, not USDT0)\n \"eip155:137\": \"0xc2132D05D31c914a87C6611C10748AEb04B58e8F\",\n // BNB Chain (BSC) - BEP-20 USDT\n \"eip155:56\": \"0x55d398326f99059fF775485246999027B3197955\",\n // Avalanche C-Chain\n \"eip155:43114\": \"0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7\",\n // Fantom\n \"eip155:250\": \"0x049d68029688eabf473097a2fc38ef61633a3c7a\",\n // Celo\n \"eip155:42220\": \"0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e\",\n // Kaia (formerly Klaytn)\n \"eip155:8217\": \"0xcee8faf64bb97a73bb51e115aa89c17ffa8dd167\",\n};\n\n/**\n * Complete token registry with all supported tokens per network\n */\nexport const TOKEN_REGISTRY: NetworkTokenRegistry = {\n // Ethereum Mainnet\n \"eip155:1\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:1\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n USDC: {\n address: USDC_ADDRESSES[\"eip155:1\"],\n symbol: \"USDC\",\n name: \"USD Coin\",\n version: \"2\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 2,\n },\n USDT: {\n address: USDT_LEGACY_ADDRESSES[\"eip155:1\"],\n symbol: \"USDT\",\n name: \"TetherUSD\",\n version: \"1\",\n decimals: 6,\n tokenType: \"legacy\",\n priority: 10, // Lower priority due to legacy flow\n },\n },\n\n // Arbitrum One\n \"eip155:42161\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:42161\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n USDC: {\n address: USDC_ADDRESSES[\"eip155:42161\"],\n symbol: \"USDC\",\n name: \"USD Coin\",\n version: \"2\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 2,\n },\n },\n\n // Ink Mainnet\n \"eip155:57073\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:57073\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Berachain Mainnet\n \"eip155:80094\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:80094\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Unichain Mainnet\n \"eip155:130\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:130\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Base Mainnet\n \"eip155:8453\": {\n USDC: {\n address: USDC_ADDRESSES[\"eip155:8453\"],\n symbol: \"USDC\",\n name: \"USD Coin\",\n version: \"2\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 2,\n },\n },\n\n // Base Sepolia (testnet)\n \"eip155:84532\": {\n USDC: {\n address: USDC_ADDRESSES[\"eip155:84532\"],\n symbol: \"USDC\",\n name: \"USDC\",\n version: \"2\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 2,\n },\n },\n\n // Sepolia (testnet)\n \"eip155:11155111\": {\n USDC: {\n address: USDC_ADDRESSES[\"eip155:11155111\"],\n symbol: \"USDC\",\n name: \"USDC\",\n version: \"2\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 2,\n },\n },\n\n // Polygon Mainnet\n \"eip155:137\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:137\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n USDC: {\n address: USDC_ADDRESSES[\"eip155:137\"],\n symbol: \"USDC\",\n name: \"USD Coin\",\n version: \"2\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 2,\n },\n USDT: {\n address: USDT_LEGACY_ADDRESSES[\"eip155:137\"],\n symbol: \"USDT\",\n name: \"TetherUSD\",\n version: \"1\",\n decimals: 6,\n tokenType: \"legacy\",\n priority: 10,\n },\n },\n\n // === Phase 1: High Priority USDT0 Networks ===\n\n // Optimism Mainnet\n \"eip155:10\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:10\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Mantle Mainnet\n \"eip155:5000\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:5000\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Plasma Mainnet\n \"eip155:9745\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:9745\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Sei Mainnet\n \"eip155:1329\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:1329\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Conflux eSpace Mainnet\n \"eip155:1030\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:1030\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Monad Mainnet\n \"eip155:143\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:143\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // === Phase 2: Medium Priority USDT0 Networks ===\n\n // Flare Mainnet\n \"eip155:14\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:14\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Rootstock Mainnet (Bitcoin sidechain)\n \"eip155:30\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:30\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // XLayer Mainnet (OKX L2)\n \"eip155:196\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:196\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Stable Mainnet\n \"eip155:988\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:988\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // HyperEVM Mainnet\n \"eip155:999\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:999\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // MegaETH Mainnet\n \"eip155:4326\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:4326\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Corn Mainnet\n \"eip155:21000000\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:21000000\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // === Legacy USDT Networks (no EIP-3009 support) ===\n\n // BNB Chain (BSC) - BEP-20 USDT\n \"eip155:56\": {\n USDT: {\n address: USDT_LEGACY_ADDRESSES[\"eip155:56\"],\n symbol: \"USDT\",\n name: \"Tether USD\",\n version: \"1\",\n decimals: 18, // BSC USDT uses 18 decimals\n tokenType: \"legacy\",\n priority: 10,\n },\n },\n\n // Avalanche C-Chain\n \"eip155:43114\": {\n USDT: {\n address: USDT_LEGACY_ADDRESSES[\"eip155:43114\"],\n symbol: \"USDT\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"legacy\",\n priority: 10,\n },\n },\n\n // Fantom\n \"eip155:250\": {\n USDT: {\n address: USDT_LEGACY_ADDRESSES[\"eip155:250\"],\n symbol: \"USDT\",\n name: \"Frapped USDT\",\n version: \"1\",\n decimals: 6,\n tokenType: \"legacy\",\n priority: 10,\n },\n },\n\n // Celo\n \"eip155:42220\": {\n USDT: {\n address: USDT_LEGACY_ADDRESSES[\"eip155:42220\"],\n symbol: \"USDT\",\n name: \"Tether USD\",\n version: \"1\",\n decimals: 18,\n tokenType: \"legacy\",\n priority: 10,\n },\n },\n\n // Kaia (formerly Klaytn)\n \"eip155:8217\": {\n USDT: {\n address: USDT_LEGACY_ADDRESSES[\"eip155:8217\"],\n symbol: \"USDT\",\n name: \"Tether USD\",\n version: \"1\",\n decimals: 6,\n tokenType: \"legacy\",\n priority: 10,\n },\n },\n};\n\n/**\n * Token priority for payment method selection\n * Lower number = higher priority\n */\nexport const TOKEN_PRIORITY: Record<string, number> = {\n USDT0: 1, // Highest priority - gasless, cross-chain\n USDC: 2, // Second - wide support, EIP-3009\n USDT: 10, // Lower - requires approval transaction\n DAI: 5, // Medium - good support\n};\n\n/**\n * Get token configuration for a specific token on a network\n *\n * @param network - The network identifier in CAIP-2 format\n * @param symbol - The token symbol (e.g., \"USDT0\", \"USDC\")\n * @returns The token configuration if found, undefined otherwise\n */\nexport function getTokenConfig(network: string, symbol: string): TokenConfig | undefined {\n return TOKEN_REGISTRY[network]?.[symbol.toUpperCase()];\n}\n\n/**\n * Get all tokens available on a network\n *\n * @param network - The network identifier in CAIP-2 format\n * @returns Array of token configurations sorted by priority\n */\nexport function getNetworkTokens(network: string): TokenConfig[] {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return [];\n return Object.values(tokens).sort((a, b) => a.priority - b.priority);\n}\n\n/**\n * Get the default/preferred token for a network\n * Prefers USDT0 > USDC > others based on priority\n *\n * @param network - The network identifier in CAIP-2 format\n * @returns The highest priority token configuration, or undefined if none found\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n const tokens = getNetworkTokens(network);\n return tokens[0]; // Already sorted by priority\n}\n\n/**\n * Get token by contract address on a network\n *\n * @param network - The network identifier in CAIP-2 format\n * @param address - The token contract address\n * @returns The token configuration if found, undefined otherwise\n */\nexport function getTokenByAddress(network: string, address: Address): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n\n const lowerAddress = address.toLowerCase();\n return Object.values(tokens).find(t => t.address.toLowerCase() === lowerAddress);\n}\n\n/**\n * Check if a token supports EIP-3009 (gasless transfers)\n *\n * @param network - The network identifier in CAIP-2 format\n * @param symbol - The token symbol to check\n * @returns True if the token supports EIP-3009 gasless transfers\n */\nexport function supportsEIP3009(network: string, symbol: string): boolean {\n const config = getTokenConfig(network, symbol);\n return config?.tokenType === \"eip3009\";\n}\n\n/**\n * Get all networks that support a specific token\n *\n * @param symbol - The token symbol to search for\n * @returns Array of network identifiers that support the token\n */\nexport function getNetworksForToken(symbol: string): string[] {\n const networks: string[] = [];\n for (const [network, tokens] of Object.entries(TOKEN_REGISTRY)) {\n if (tokens[symbol.toUpperCase()]) {\n networks.push(network);\n }\n }\n return networks;\n}\n\n/**\n * Get USDT0 networks (primary T402 token)\n *\n * @returns Array of network identifiers that support USDT0\n */\nexport function getUsdt0Networks(): string[] {\n return getNetworksForToken(\"USDT0\");\n}\n\n/**\n * EIP-712 domain configuration for a token\n *\n * @param network - The network identifier in CAIP-2 format\n * @param tokenAddress - The token contract address\n * @param chainId - The numeric chain ID\n * @returns The EIP-712 domain configuration, or undefined if token not found\n */\nexport function getEIP712Domain(\n network: string,\n tokenAddress: Address,\n chainId: number,\n): { name: string; version: string; chainId: number; verifyingContract: Address } | undefined {\n const token = getTokenByAddress(network, tokenAddress);\n if (!token) return undefined;\n\n return {\n name: token.name,\n version: token.version,\n chainId,\n verifyingContract: token.address,\n };\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/upto/client/scheme.ts","../../src/types.ts"],"sourcesContent":["import { PaymentPayload, PaymentRequirements, SchemeNetworkClient } from \"@t402/core/types\";\nimport { getAddress } from \"viem\";\nimport { permitTypes, UptoEIP2612Payload, UptoEvmExtra } from \"../../types\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { createNonce } from \"../../utils\";\n\n/**\n * EVM client implementation for the Up-To payment scheme.\n *\n * Uses EIP-2612 Permit to authorize up to a maximum amount,\n * enabling usage-based billing where the actual settlement\n * amount is determined by the server based on usage.\n *\n * @example\n * ```typescript\n * import { UptoEvmScheme } from \"@t402/evm/upto/client\";\n * import { privateKeyToAccount } from \"viem/accounts\";\n *\n * const signer = privateKeyToAccount(privateKey);\n * const scheme = new UptoEvmScheme(signer);\n *\n * // Client will register this with the t402 client\n * client.registerScheme(\"eip155:8453\", scheme);\n * ```\n */\nexport class UptoEvmScheme implements SchemeNetworkClient {\n readonly scheme = \"upto\";\n\n /**\n * Creates a new UptoEvmScheme instance.\n *\n * @param signer - The EVM signer for client operations\n */\n constructor(private readonly signer: ClientEvmSigner) {}\n\n /**\n * Creates a payment payload for the Up-To scheme.\n *\n * The payload contains an EIP-2612 permit signature authorizing\n * the router contract (or facilitator) to transfer up to the\n * specified maximum amount.\n *\n * @param t402Version - The t402 protocol version\n * @param paymentRequirements - The payment requirements (must include maxAmount)\n * @returns Promise resolving to a payment payload\n */\n async createPaymentPayload(\n t402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"t402Version\" | \"payload\">> {\n // Validate that this is an upto requirement\n if (paymentRequirements.scheme !== \"upto\") {\n throw new Error(`Expected upto scheme, got ${paymentRequirements.scheme}`);\n }\n\n const extra = paymentRequirements.extra as UptoEvmExtra;\n if (!extra?.name || !extra?.version) {\n throw new Error(\"EIP-712 domain parameters (name, version) are required for upto scheme\");\n }\n\n // Get maxAmount from the requirements\n const maxAmount = (paymentRequirements as unknown as { maxAmount: string }).maxAmount;\n if (!maxAmount) {\n throw new Error(\"maxAmount is required for upto scheme\");\n }\n\n // Determine the spender (router contract or payTo address)\n const spender = extra.routerAddress\n ? getAddress(extra.routerAddress)\n : getAddress(paymentRequirements.payTo);\n\n // Calculate deadline\n const now = Math.floor(Date.now() / 1000);\n const deadline = now + paymentRequirements.maxTimeoutSeconds;\n\n // Get the permit nonce from the token contract\n // Note: In a real implementation, this would query the token contract\n // For now, we'll use 0 and expect the caller to provide it via extra\n const permitNonce = (extra as { permitNonce?: number }).permitNonce ?? 0;\n\n // Create the permit authorization\n const authorization: UptoEIP2612Payload[\"authorization\"] = {\n owner: this.signer.address,\n spender,\n value: maxAmount,\n deadline: deadline.toString(),\n nonce: permitNonce,\n };\n\n // Sign the permit\n const signature = await this.signPermit(authorization, paymentRequirements);\n\n // Create unique payment nonce\n const paymentNonce = createNonce();\n\n const payload: UptoEIP2612Payload = {\n signature,\n authorization,\n paymentNonce,\n };\n\n return {\n t402Version,\n payload,\n };\n }\n\n /**\n * Sign the EIP-2612 permit using EIP-712\n *\n * @param authorization - The permit authorization to sign\n * @param requirements - The payment requirements\n * @returns Promise resolving to the signature components\n */\n private async signPermit(\n authorization: UptoEIP2612Payload[\"authorization\"],\n requirements: PaymentRequirements,\n ): Promise<UptoEIP2612Payload[\"signature\"]> {\n const chainId = parseInt(requirements.network.split(\":\")[1]);\n const extra = requirements.extra as UptoEvmExtra;\n\n const domain = {\n name: extra.name,\n version: extra.version,\n chainId,\n verifyingContract: getAddress(requirements.asset),\n };\n\n const message = {\n owner: getAddress(authorization.owner),\n spender: getAddress(authorization.spender),\n value: BigInt(authorization.value),\n nonce: BigInt(authorization.nonce),\n deadline: BigInt(authorization.deadline),\n };\n\n // Sign with EIP-712\n const signature = await this.signer.signTypedData({\n domain,\n types: permitTypes,\n primaryType: \"Permit\",\n message,\n });\n\n // Parse signature into v, r, s components\n const r = `0x${signature.slice(2, 66)}` as `0x${string}`;\n const s = `0x${signature.slice(66, 130)}` as `0x${string}`;\n const v = parseInt(signature.slice(130, 132), 16);\n\n return { v, r, s };\n }\n}\n\n/**\n * Factory function to create an UptoEvmScheme.\n *\n * @param signer - The EVM signer\n * @returns A new UptoEvmScheme instance\n */\nexport function createUptoEvmScheme(signer: ClientEvmSigner): UptoEvmScheme {\n return new UptoEvmScheme(signer);\n}\n","export type ExactEIP3009Payload = {\n signature?: `0x${string}`;\n authorization: {\n from: `0x${string}`;\n to: `0x${string}`;\n value: string;\n validAfter: string;\n validBefore: string;\n nonce: `0x${string}`;\n };\n};\n\nexport type ExactEvmPayloadV1 = ExactEIP3009Payload;\n\nexport type ExactEvmPayloadV2 = ExactEIP3009Payload;\n\n/**\n * Payload for exact-legacy scheme (approve + transferFrom pattern)\n * Used for legacy USDT and other tokens without EIP-3009 support\n */\nexport type ExactLegacyPayload = {\n signature?: `0x${string}`;\n authorization: {\n /** Payer address */\n from: `0x${string}`;\n /** Recipient address */\n to: `0x${string}`;\n /** Payment amount in token units */\n value: string;\n /** Unix timestamp after which the authorization is valid */\n validAfter: string;\n /** Unix timestamp before which the authorization is valid */\n validBefore: string;\n /** Unique nonce to prevent replay attacks */\n nonce: `0x${string}`;\n /** Facilitator address that will call transferFrom */\n spender: `0x${string}`;\n };\n};\n\n// ============================================================================\n// Up-To Scheme Types (EIP-2612 Permit)\n// ============================================================================\n\n/**\n * EIP-2612 Permit signature components\n */\nexport type PermitSignature = {\n v: number;\n r: `0x${string}`;\n s: `0x${string}`;\n};\n\n/**\n * EIP-2612 Permit authorization parameters\n */\nexport type PermitAuthorization = {\n /** Token owner address */\n owner: `0x${string}`;\n /** Spender address (router contract or facilitator) */\n spender: `0x${string}`;\n /** Maximum authorized value */\n value: string;\n /** Permit deadline (unix timestamp) */\n deadline: string;\n /** Permit nonce from token contract */\n nonce: number;\n};\n\n/**\n * Payload for upto scheme using EIP-2612 Permit\n */\nexport type UptoEIP2612Payload = {\n /** EIP-2612 permit signature */\n signature: PermitSignature;\n /** Permit authorization parameters */\n authorization: PermitAuthorization;\n /** Unique payment nonce (separate from permit nonce) */\n paymentNonce: `0x${string}`;\n};\n\n/**\n * Compact payload with combined signature bytes\n */\nexport type UptoEIP2612PayloadCompact = {\n /** Combined permit signature (65 bytes) */\n signature: `0x${string}`;\n /** Permit authorization parameters */\n authorization: PermitAuthorization;\n /** Unique payment nonce */\n paymentNonce: `0x${string}`;\n};\n\nexport type UptoEvmPayloadV2 = UptoEIP2612Payload | UptoEIP2612PayloadCompact;\n\n/**\n * Extra fields for upto scheme requirements on EVM\n */\nexport type UptoEvmExtra = {\n /** EIP-712 domain name (from token contract) */\n name: string;\n /** EIP-712 domain version */\n version: string;\n /** Router contract address for settlement */\n routerAddress?: `0x${string}`;\n /** Billing unit */\n unit?: string;\n /** Price per unit */\n unitPrice?: string;\n};\n\n/**\n * Settlement data for upto scheme\n */\nexport type UptoEvmSettlement = {\n /** Actual amount to settle (must be <= maxAmount) */\n settleAmount: string;\n /** Usage details for auditing */\n usageDetails?: {\n unitsConsumed?: number;\n unitPrice?: string;\n unitType?: string;\n startTime?: number;\n endTime?: number;\n };\n};\n\n/**\n * EIP-712 typed data for EIP-2612 Permit\n */\nexport const permitTypes = {\n Permit: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n} as const;\n\n/**\n * Type guard for UptoEIP2612Payload\n *\n * @param payload - The payload to check\n * @returns True if the payload is a valid UptoEIP2612Payload\n */\nexport function isUptoEIP2612Payload(payload: unknown): payload is UptoEIP2612Payload {\n if (typeof payload !== \"object\" || payload === null) return false;\n const p = payload as Record<string, unknown>;\n return (\n \"signature\" in p &&\n \"authorization\" in p &&\n \"paymentNonce\" in p &&\n typeof p.authorization === \"object\" &&\n p.authorization !== null &&\n \"owner\" in (p.authorization as Record<string, unknown>) &&\n \"spender\" in (p.authorization as Record<string, unknown>) &&\n \"value\" in (p.authorization as Record<string, unknown>) &&\n \"deadline\" in (p.authorization as Record<string, unknown>) &&\n \"nonce\" in (p.authorization as Record<string, unknown>)\n );\n}\n"],"mappings":"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","names":[]}