@bankofai/x402-evm 1.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +172 -0
- package/dist/cjs/auth-capture/client/index.d.ts +44 -0
- package/dist/cjs/auth-capture/client/index.js +298 -0
- package/dist/cjs/auth-capture/client/index.js.map +1 -0
- package/dist/cjs/batch-settlement/client/file-storage.d.ts +47 -0
- package/dist/cjs/batch-settlement/client/file-storage.js +116 -0
- package/dist/cjs/batch-settlement/client/file-storage.js.map +1 -0
- package/dist/cjs/batch-settlement/client/index.d.ts +111 -0
- package/dist/cjs/batch-settlement/client/index.js +1565 -0
- package/dist/cjs/batch-settlement/client/index.js.map +1 -0
- package/dist/cjs/batch-settlement/facilitator/index.d.ts +72 -0
- package/dist/cjs/batch-settlement/facilitator/index.js +2102 -0
- package/dist/cjs/batch-settlement/facilitator/index.js.map +1 -0
- package/dist/cjs/batch-settlement/server/file-storage.d.ts +53 -0
- package/dist/cjs/batch-settlement/server/file-storage.js +181 -0
- package/dist/cjs/batch-settlement/server/file-storage.js.map +1 -0
- package/dist/cjs/batch-settlement/server/index.d.ts +491 -0
- package/dist/cjs/batch-settlement/server/index.js +1978 -0
- package/dist/cjs/batch-settlement/server/index.js.map +1 -0
- package/dist/cjs/batch-settlement/server/redis-storage.d.ts +87 -0
- package/dist/cjs/batch-settlement/server/redis-storage.js +181 -0
- package/dist/cjs/batch-settlement/server/redis-storage.js.map +1 -0
- package/dist/cjs/client/agent-wallet.d.ts +69 -0
- package/dist/cjs/client/agent-wallet.js +84 -0
- package/dist/cjs/client/agent-wallet.js.map +1 -0
- package/dist/cjs/exact/client/index.d.ts +63 -0
- package/dist/cjs/exact/client/index.js +739 -0
- package/dist/cjs/exact/client/index.js.map +1 -0
- package/dist/cjs/exact/facilitator/index.d.ts +141 -0
- package/dist/cjs/exact/facilitator/index.js +1989 -0
- package/dist/cjs/exact/facilitator/index.js.map +1 -0
- package/dist/cjs/exact/server/index.d.ts +118 -0
- package/dist/cjs/exact/server/index.js +326 -0
- package/dist/cjs/exact/server/index.js.map +1 -0
- package/dist/cjs/exact/v1/client/index.d.ts +38 -0
- package/dist/cjs/exact/v1/client/index.js +193 -0
- package/dist/cjs/exact/v1/client/index.js.map +1 -0
- package/dist/cjs/exact/v1/facilitator/index.d.ts +84 -0
- package/dist/cjs/exact/v1/facilitator/index.js +739 -0
- package/dist/cjs/exact/v1/facilitator/index.js.map +1 -0
- package/dist/cjs/facilitator/agent-wallet.d.ts +109 -0
- package/dist/cjs/facilitator/agent-wallet.js +105 -0
- package/dist/cjs/facilitator/agent-wallet.js.map +1 -0
- package/dist/cjs/index.d.ts +338 -0
- package/dist/cjs/index.js +2860 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/permit2-DK5A8alk.d.ts +729 -0
- package/dist/cjs/permit2-DhJRUcgY.d.ts +729 -0
- package/dist/cjs/rpc-DULZzRne.d.ts +13 -0
- package/dist/cjs/scheme-7ehldYoO.d.ts +307 -0
- package/dist/cjs/scheme-BjBJzHF7.d.ts +307 -0
- package/dist/cjs/scheme-DWgpkDgz.d.ts +47 -0
- package/dist/cjs/signer-BFelv8DL.d.ts +170 -0
- package/dist/cjs/storage-6W5MO46W.d.ts +50 -0
- package/dist/cjs/storage-CHNote8s.d.ts +81 -0
- package/dist/cjs/storage-DjCv5IPh.d.ts +81 -0
- package/dist/cjs/types-CKd3Xoi1.d.ts +180 -0
- package/dist/cjs/types-DIt9uAUy.d.ts +180 -0
- package/dist/cjs/upto/client/index.d.ts +34 -0
- package/dist/cjs/upto/client/index.js +509 -0
- package/dist/cjs/upto/client/index.js.map +1 -0
- package/dist/cjs/upto/facilitator/index.d.ts +54 -0
- package/dist/cjs/upto/facilitator/index.js +1313 -0
- package/dist/cjs/upto/facilitator/index.js.map +1 -0
- package/dist/cjs/upto/server/index.d.ts +69 -0
- package/dist/cjs/upto/server/index.js +296 -0
- package/dist/cjs/upto/server/index.js.map +1 -0
- package/dist/cjs/v1/index.d.ts +40 -0
- package/dist/cjs/v1/index.js +199 -0
- package/dist/cjs/v1/index.js.map +1 -0
- package/dist/esm/auth-capture/client/index.d.mts +44 -0
- package/dist/esm/auth-capture/client/index.mjs +8 -0
- package/dist/esm/auth-capture/client/index.mjs.map +1 -0
- package/dist/esm/batch-settlement/client/file-storage.d.mts +47 -0
- package/dist/esm/batch-settlement/client/file-storage.mjs +63 -0
- package/dist/esm/batch-settlement/client/file-storage.mjs.map +1 -0
- package/dist/esm/batch-settlement/client/index.d.mts +111 -0
- package/dist/esm/batch-settlement/client/index.mjs +58 -0
- package/dist/esm/batch-settlement/client/index.mjs.map +1 -0
- package/dist/esm/batch-settlement/facilitator/index.d.mts +72 -0
- package/dist/esm/batch-settlement/facilitator/index.mjs +1252 -0
- package/dist/esm/batch-settlement/facilitator/index.mjs.map +1 -0
- package/dist/esm/batch-settlement/server/file-storage.d.mts +53 -0
- package/dist/esm/batch-settlement/server/file-storage.mjs +128 -0
- package/dist/esm/batch-settlement/server/file-storage.mjs.map +1 -0
- package/dist/esm/batch-settlement/server/index.d.mts +491 -0
- package/dist/esm/batch-settlement/server/index.mjs +1640 -0
- package/dist/esm/batch-settlement/server/index.mjs.map +1 -0
- package/dist/esm/batch-settlement/server/redis-storage.d.mts +87 -0
- package/dist/esm/batch-settlement/server/redis-storage.mjs +156 -0
- package/dist/esm/batch-settlement/server/redis-storage.mjs.map +1 -0
- package/dist/esm/chunk-2EUQTNJO.mjs +38 -0
- package/dist/esm/chunk-2EUQTNJO.mjs.map +1 -0
- package/dist/esm/chunk-3WZF6722.mjs +36 -0
- package/dist/esm/chunk-3WZF6722.mjs.map +1 -0
- package/dist/esm/chunk-E4Z7PNXC.mjs +275 -0
- package/dist/esm/chunk-E4Z7PNXC.mjs.map +1 -0
- package/dist/esm/chunk-GQVMVP4N.mjs +911 -0
- package/dist/esm/chunk-GQVMVP4N.mjs.map +1 -0
- package/dist/esm/chunk-H2EYJIZL.mjs +489 -0
- package/dist/esm/chunk-H2EYJIZL.mjs.map +1 -0
- package/dist/esm/chunk-H3KPLYGI.mjs +152 -0
- package/dist/esm/chunk-H3KPLYGI.mjs.map +1 -0
- package/dist/esm/chunk-HYABYUBD.mjs +432 -0
- package/dist/esm/chunk-HYABYUBD.mjs.map +1 -0
- package/dist/esm/chunk-I2DVUHM5.mjs +123 -0
- package/dist/esm/chunk-I2DVUHM5.mjs.map +1 -0
- package/dist/esm/chunk-JK7SLLF7.mjs +34 -0
- package/dist/esm/chunk-JK7SLLF7.mjs.map +1 -0
- package/dist/esm/chunk-JNT7C46S.mjs +352 -0
- package/dist/esm/chunk-JNT7C46S.mjs.map +1 -0
- package/dist/esm/chunk-MACPBXCT.mjs +415 -0
- package/dist/esm/chunk-MACPBXCT.mjs.map +1 -0
- package/dist/esm/chunk-P3QOX3QZ.mjs +113 -0
- package/dist/esm/chunk-P3QOX3QZ.mjs.map +1 -0
- package/dist/esm/chunk-QVATVA3J.mjs +47 -0
- package/dist/esm/chunk-QVATVA3J.mjs.map +1 -0
- package/dist/esm/chunk-SHJFA25H.mjs +159 -0
- package/dist/esm/chunk-SHJFA25H.mjs.map +1 -0
- package/dist/esm/chunk-TW7Z65AO.mjs +34 -0
- package/dist/esm/chunk-TW7Z65AO.mjs.map +1 -0
- package/dist/esm/chunk-U4HCGTLU.mjs +35 -0
- package/dist/esm/chunk-U4HCGTLU.mjs.map +1 -0
- package/dist/esm/chunk-VS3RYAYE.mjs +80 -0
- package/dist/esm/chunk-VS3RYAYE.mjs.map +1 -0
- package/dist/esm/chunk-W6ON4LG2.mjs +39 -0
- package/dist/esm/chunk-W6ON4LG2.mjs.map +1 -0
- package/dist/esm/chunk-XG2JLZVJ.mjs +627 -0
- package/dist/esm/chunk-XG2JLZVJ.mjs.map +1 -0
- package/dist/esm/chunk-ZCJRY5LQ.mjs +162 -0
- package/dist/esm/chunk-ZCJRY5LQ.mjs.map +1 -0
- package/dist/esm/client/agent-wallet.d.mts +69 -0
- package/dist/esm/client/agent-wallet.mjs +36 -0
- package/dist/esm/client/agent-wallet.mjs.map +1 -0
- package/dist/esm/exact/client/index.d.mts +63 -0
- package/dist/esm/exact/client/index.mjs +25 -0
- package/dist/esm/exact/client/index.mjs.map +1 -0
- package/dist/esm/exact/facilitator/index.d.mts +141 -0
- package/dist/esm/exact/facilitator/index.mjs +694 -0
- package/dist/esm/exact/facilitator/index.mjs.map +1 -0
- package/dist/esm/exact/server/index.d.mts +118 -0
- package/dist/esm/exact/server/index.mjs +153 -0
- package/dist/esm/exact/server/index.mjs.map +1 -0
- package/dist/esm/exact/v1/client/index.d.mts +38 -0
- package/dist/esm/exact/v1/client/index.mjs +12 -0
- package/dist/esm/exact/v1/client/index.mjs.map +1 -0
- package/dist/esm/exact/v1/facilitator/index.d.mts +84 -0
- package/dist/esm/exact/v1/facilitator/index.mjs +12 -0
- package/dist/esm/exact/v1/facilitator/index.mjs.map +1 -0
- package/dist/esm/facilitator/agent-wallet.d.mts +109 -0
- package/dist/esm/facilitator/agent-wallet.mjs +74 -0
- package/dist/esm/facilitator/agent-wallet.mjs.map +1 -0
- package/dist/esm/index.d.mts +338 -0
- package/dist/esm/index.mjs +144 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/permit2-DhJRUcgY.d.mts +729 -0
- package/dist/esm/rpc-DULZzRne.d.mts +13 -0
- package/dist/esm/scheme-CkNhpXrG.d.mts +307 -0
- package/dist/esm/scheme-D8ZbykGV.d.mts +47 -0
- package/dist/esm/signer-BFelv8DL.d.mts +170 -0
- package/dist/esm/storage-6W5MO46W.d.mts +50 -0
- package/dist/esm/storage-BEzTEiUr.d.mts +81 -0
- package/dist/esm/types-DIt9uAUy.d.mts +180 -0
- package/dist/esm/upto/client/index.d.mts +34 -0
- package/dist/esm/upto/client/index.mjs +22 -0
- package/dist/esm/upto/client/index.mjs.map +1 -0
- package/dist/esm/upto/facilitator/index.d.mts +54 -0
- package/dist/esm/upto/facilitator/index.mjs +507 -0
- package/dist/esm/upto/facilitator/index.mjs.map +1 -0
- package/dist/esm/upto/server/index.d.mts +69 -0
- package/dist/esm/upto/server/index.mjs +124 -0
- package/dist/esm/upto/server/index.mjs.map +1 -0
- package/dist/esm/v1/index.d.mts +40 -0
- package/dist/esm/v1/index.mjs +18 -0
- package/dist/esm/v1/index.mjs.map +1 -0
- package/package.json +250 -0
|
@@ -0,0 +1,739 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/exact/client/index.ts
|
|
21
|
+
var client_exports = {};
|
|
22
|
+
__export(client_exports, {
|
|
23
|
+
ExactEvmScheme: () => ExactEvmScheme,
|
|
24
|
+
createPermit2ApprovalTx: () => createPermit2ApprovalTx,
|
|
25
|
+
erc20AllowanceAbi: () => erc20AllowanceAbi,
|
|
26
|
+
getPermit2AllowanceReadParams: () => getPermit2AllowanceReadParams,
|
|
27
|
+
registerExactEvmScheme: () => registerExactEvmScheme
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(client_exports);
|
|
30
|
+
|
|
31
|
+
// src/exact/client/eip3009.ts
|
|
32
|
+
var import_viem2 = require("viem");
|
|
33
|
+
|
|
34
|
+
// src/constants.ts
|
|
35
|
+
var authorizationTypes = {
|
|
36
|
+
TransferWithAuthorization: [
|
|
37
|
+
{ name: "from", type: "address" },
|
|
38
|
+
{ name: "to", type: "address" },
|
|
39
|
+
{ name: "value", type: "uint256" },
|
|
40
|
+
{ name: "validAfter", type: "uint256" },
|
|
41
|
+
{ name: "validBefore", type: "uint256" },
|
|
42
|
+
{ name: "nonce", type: "bytes32" }
|
|
43
|
+
]
|
|
44
|
+
};
|
|
45
|
+
var permit2WitnessTypes = {
|
|
46
|
+
PermitWitnessTransferFrom: [
|
|
47
|
+
{ name: "permitted", type: "TokenPermissions" },
|
|
48
|
+
{ name: "spender", type: "address" },
|
|
49
|
+
{ name: "nonce", type: "uint256" },
|
|
50
|
+
{ name: "deadline", type: "uint256" },
|
|
51
|
+
{ name: "witness", type: "Witness" }
|
|
52
|
+
],
|
|
53
|
+
TokenPermissions: [
|
|
54
|
+
{ name: "token", type: "address" },
|
|
55
|
+
{ name: "amount", type: "uint256" }
|
|
56
|
+
],
|
|
57
|
+
Witness: [
|
|
58
|
+
{ name: "to", type: "address" },
|
|
59
|
+
{ name: "validAfter", type: "uint256" }
|
|
60
|
+
]
|
|
61
|
+
};
|
|
62
|
+
var eip2612PermitTypes = {
|
|
63
|
+
Permit: [
|
|
64
|
+
{ name: "owner", type: "address" },
|
|
65
|
+
{ name: "spender", type: "address" },
|
|
66
|
+
{ name: "value", type: "uint256" },
|
|
67
|
+
{ name: "nonce", type: "uint256" },
|
|
68
|
+
{ name: "deadline", type: "uint256" }
|
|
69
|
+
]
|
|
70
|
+
};
|
|
71
|
+
var eip2612NoncesAbi = [
|
|
72
|
+
{
|
|
73
|
+
type: "function",
|
|
74
|
+
name: "nonces",
|
|
75
|
+
inputs: [{ name: "owner", type: "address" }],
|
|
76
|
+
outputs: [{ type: "uint256" }],
|
|
77
|
+
stateMutability: "view"
|
|
78
|
+
}
|
|
79
|
+
];
|
|
80
|
+
var erc20ApproveAbi = [
|
|
81
|
+
{
|
|
82
|
+
type: "function",
|
|
83
|
+
name: "approve",
|
|
84
|
+
inputs: [
|
|
85
|
+
{ name: "spender", type: "address" },
|
|
86
|
+
{ name: "amount", type: "uint256" }
|
|
87
|
+
],
|
|
88
|
+
outputs: [{ type: "bool" }],
|
|
89
|
+
stateMutability: "nonpayable"
|
|
90
|
+
}
|
|
91
|
+
];
|
|
92
|
+
var erc20AllowanceAbi = [
|
|
93
|
+
{
|
|
94
|
+
type: "function",
|
|
95
|
+
name: "allowance",
|
|
96
|
+
inputs: [
|
|
97
|
+
{ name: "owner", type: "address" },
|
|
98
|
+
{ name: "spender", type: "address" }
|
|
99
|
+
],
|
|
100
|
+
outputs: [{ type: "uint256" }],
|
|
101
|
+
stateMutability: "view"
|
|
102
|
+
}
|
|
103
|
+
];
|
|
104
|
+
var ERC20_APPROVE_GAS_LIMIT = 70000n;
|
|
105
|
+
var DEFAULT_MAX_FEE_PER_GAS = 1000000000n;
|
|
106
|
+
var DEFAULT_MAX_PRIORITY_FEE_PER_GAS = 100000000n;
|
|
107
|
+
var PERMIT2_ADDRESS = "0x000000000022D473030F116dDEE9F6B43aC78BA3";
|
|
108
|
+
var x402ExactPermit2ProxyAddress = "0x402085c248EeA27D92E8b30b2C58ed07f9E20001";
|
|
109
|
+
|
|
110
|
+
// src/utils.ts
|
|
111
|
+
var import_viem = require("viem");
|
|
112
|
+
function getEvmChainId(network) {
|
|
113
|
+
if (network.startsWith("eip155:")) {
|
|
114
|
+
const idStr = network.split(":")[1];
|
|
115
|
+
const chainId = parseInt(idStr, 10);
|
|
116
|
+
if (isNaN(chainId)) {
|
|
117
|
+
throw new Error(`Invalid CAIP-2 chain ID: ${network}`);
|
|
118
|
+
}
|
|
119
|
+
return chainId;
|
|
120
|
+
}
|
|
121
|
+
throw new Error(`Unsupported network format: ${network} (expected eip155:CHAIN_ID)`);
|
|
122
|
+
}
|
|
123
|
+
function getCrypto() {
|
|
124
|
+
const cryptoObj = globalThis.crypto;
|
|
125
|
+
if (!cryptoObj) {
|
|
126
|
+
throw new Error("Crypto API not available");
|
|
127
|
+
}
|
|
128
|
+
return cryptoObj;
|
|
129
|
+
}
|
|
130
|
+
function createNonce() {
|
|
131
|
+
return (0, import_viem.toHex)(getCrypto().getRandomValues(new Uint8Array(32)));
|
|
132
|
+
}
|
|
133
|
+
function createPermit2Nonce() {
|
|
134
|
+
const randomBytes = getCrypto().getRandomValues(new Uint8Array(32));
|
|
135
|
+
return BigInt((0, import_viem.toHex)(randomBytes)).toString();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// src/exact/client/eip3009.ts
|
|
139
|
+
async function createEIP3009Payload(signer, x402Version, paymentRequirements) {
|
|
140
|
+
const nonce = createNonce();
|
|
141
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
142
|
+
const authorization = {
|
|
143
|
+
from: signer.address,
|
|
144
|
+
to: (0, import_viem2.getAddress)(paymentRequirements.payTo),
|
|
145
|
+
value: paymentRequirements.amount,
|
|
146
|
+
validAfter: "0",
|
|
147
|
+
validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),
|
|
148
|
+
nonce
|
|
149
|
+
};
|
|
150
|
+
const signature = await signEIP3009Authorization(signer, authorization, paymentRequirements);
|
|
151
|
+
const payload = {
|
|
152
|
+
authorization,
|
|
153
|
+
signature
|
|
154
|
+
};
|
|
155
|
+
return {
|
|
156
|
+
x402Version,
|
|
157
|
+
payload
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async function signEIP3009Authorization(signer, authorization, requirements) {
|
|
161
|
+
const chainId = getEvmChainId(requirements.network);
|
|
162
|
+
if (!requirements.extra?.name || !requirements.extra?.version) {
|
|
163
|
+
throw new Error(
|
|
164
|
+
`EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
const { name, version } = requirements.extra;
|
|
168
|
+
const domain = {
|
|
169
|
+
name,
|
|
170
|
+
version,
|
|
171
|
+
chainId,
|
|
172
|
+
verifyingContract: (0, import_viem2.getAddress)(requirements.asset)
|
|
173
|
+
};
|
|
174
|
+
const message = {
|
|
175
|
+
from: (0, import_viem2.getAddress)(authorization.from),
|
|
176
|
+
to: (0, import_viem2.getAddress)(authorization.to),
|
|
177
|
+
value: BigInt(authorization.value),
|
|
178
|
+
validAfter: BigInt(authorization.validAfter),
|
|
179
|
+
validBefore: BigInt(authorization.validBefore),
|
|
180
|
+
nonce: authorization.nonce
|
|
181
|
+
};
|
|
182
|
+
return await signer.signTypedData({
|
|
183
|
+
domain,
|
|
184
|
+
types: authorizationTypes,
|
|
185
|
+
primaryType: "TransferWithAuthorization",
|
|
186
|
+
message
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// src/exact/client/permit2.ts
|
|
191
|
+
var import_viem6 = require("viem");
|
|
192
|
+
|
|
193
|
+
// src/exact/extensions.ts
|
|
194
|
+
var EIP2612_GAS_SPONSORING_KEY = "eip2612GasSponsoring";
|
|
195
|
+
var ERC20_APPROVAL_GAS_SPONSORING_KEY = "erc20ApprovalGasSponsoring";
|
|
196
|
+
var ERC20_APPROVAL_GAS_SPONSORING_VERSION = "1";
|
|
197
|
+
|
|
198
|
+
// src/shared/permit2.ts
|
|
199
|
+
var import_viem5 = require("viem");
|
|
200
|
+
|
|
201
|
+
// src/multicall.ts
|
|
202
|
+
var import_viem3 = require("viem");
|
|
203
|
+
|
|
204
|
+
// src/shared/erc20approval.ts
|
|
205
|
+
var import_viem4 = require("viem");
|
|
206
|
+
|
|
207
|
+
// src/shared/permit2.ts
|
|
208
|
+
async function createPermit2PayloadForProxy(proxyAddress, signer, x402Version, paymentRequirements) {
|
|
209
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
210
|
+
const nonce = createPermit2Nonce();
|
|
211
|
+
const validAfter = "0";
|
|
212
|
+
const deadline = (now + paymentRequirements.maxTimeoutSeconds).toString();
|
|
213
|
+
const permit2Authorization = {
|
|
214
|
+
from: signer.address,
|
|
215
|
+
permitted: {
|
|
216
|
+
token: (0, import_viem5.getAddress)(paymentRequirements.asset),
|
|
217
|
+
amount: paymentRequirements.amount
|
|
218
|
+
},
|
|
219
|
+
spender: proxyAddress,
|
|
220
|
+
nonce,
|
|
221
|
+
deadline,
|
|
222
|
+
witness: {
|
|
223
|
+
to: (0, import_viem5.getAddress)(paymentRequirements.payTo),
|
|
224
|
+
validAfter
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
const signature = await signPermit2Authorization(
|
|
228
|
+
signer,
|
|
229
|
+
permit2Authorization,
|
|
230
|
+
paymentRequirements
|
|
231
|
+
);
|
|
232
|
+
return {
|
|
233
|
+
x402Version,
|
|
234
|
+
payload: { signature, permit2Authorization }
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
async function signPermit2Authorization(signer, permit2Authorization, requirements) {
|
|
238
|
+
const chainId = getEvmChainId(requirements.network);
|
|
239
|
+
return await signer.signTypedData({
|
|
240
|
+
domain: { name: "Permit2", chainId, verifyingContract: PERMIT2_ADDRESS },
|
|
241
|
+
types: permit2WitnessTypes,
|
|
242
|
+
primaryType: "PermitWitnessTransferFrom",
|
|
243
|
+
message: {
|
|
244
|
+
permitted: {
|
|
245
|
+
token: (0, import_viem5.getAddress)(permit2Authorization.permitted.token),
|
|
246
|
+
amount: BigInt(permit2Authorization.permitted.amount)
|
|
247
|
+
},
|
|
248
|
+
spender: (0, import_viem5.getAddress)(permit2Authorization.spender),
|
|
249
|
+
nonce: BigInt(permit2Authorization.nonce),
|
|
250
|
+
deadline: BigInt(permit2Authorization.deadline),
|
|
251
|
+
witness: {
|
|
252
|
+
to: (0, import_viem5.getAddress)(permit2Authorization.witness.to),
|
|
253
|
+
validAfter: BigInt(permit2Authorization.witness.validAfter)
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// src/exact/client/permit2.ts
|
|
260
|
+
var MAX_UINT256 = BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
|
|
261
|
+
async function createPermit2Payload(signer, x402Version, paymentRequirements) {
|
|
262
|
+
return createPermit2PayloadForProxy(
|
|
263
|
+
x402ExactPermit2ProxyAddress,
|
|
264
|
+
signer,
|
|
265
|
+
x402Version,
|
|
266
|
+
paymentRequirements
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
function createPermit2ApprovalTx(tokenAddress) {
|
|
270
|
+
const data = (0, import_viem6.encodeFunctionData)({
|
|
271
|
+
abi: erc20ApproveAbi,
|
|
272
|
+
functionName: "approve",
|
|
273
|
+
args: [PERMIT2_ADDRESS, MAX_UINT256]
|
|
274
|
+
});
|
|
275
|
+
return {
|
|
276
|
+
to: (0, import_viem6.getAddress)(tokenAddress),
|
|
277
|
+
data
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
function getPermit2AllowanceReadParams(params) {
|
|
281
|
+
return {
|
|
282
|
+
address: (0, import_viem6.getAddress)(params.tokenAddress),
|
|
283
|
+
abi: erc20AllowanceAbi,
|
|
284
|
+
functionName: "allowance",
|
|
285
|
+
args: [(0, import_viem6.getAddress)(params.ownerAddress), PERMIT2_ADDRESS]
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// src/shared/extensions/gasSponsoring.ts
|
|
290
|
+
var import_viem10 = require("viem");
|
|
291
|
+
|
|
292
|
+
// src/exact/client/eip2612.ts
|
|
293
|
+
var import_viem7 = require("viem");
|
|
294
|
+
async function signEip2612Permit(signer, tokenAddress, tokenName, tokenVersion, chainId, deadline, permittedAmount) {
|
|
295
|
+
const owner = signer.address;
|
|
296
|
+
const spender = (0, import_viem7.getAddress)(PERMIT2_ADDRESS);
|
|
297
|
+
const nonce = await signer.readContract({
|
|
298
|
+
address: tokenAddress,
|
|
299
|
+
abi: eip2612NoncesAbi,
|
|
300
|
+
functionName: "nonces",
|
|
301
|
+
args: [owner]
|
|
302
|
+
});
|
|
303
|
+
const domain = {
|
|
304
|
+
name: tokenName,
|
|
305
|
+
version: tokenVersion,
|
|
306
|
+
chainId,
|
|
307
|
+
verifyingContract: tokenAddress
|
|
308
|
+
};
|
|
309
|
+
const approvalAmount = BigInt(permittedAmount);
|
|
310
|
+
const message = {
|
|
311
|
+
owner,
|
|
312
|
+
spender,
|
|
313
|
+
value: approvalAmount,
|
|
314
|
+
nonce,
|
|
315
|
+
deadline: BigInt(deadline)
|
|
316
|
+
};
|
|
317
|
+
const signature = await signer.signTypedData({
|
|
318
|
+
domain,
|
|
319
|
+
types: eip2612PermitTypes,
|
|
320
|
+
primaryType: "Permit",
|
|
321
|
+
message
|
|
322
|
+
});
|
|
323
|
+
return {
|
|
324
|
+
from: owner,
|
|
325
|
+
asset: tokenAddress,
|
|
326
|
+
spender,
|
|
327
|
+
amount: approvalAmount.toString(),
|
|
328
|
+
nonce: nonce.toString(),
|
|
329
|
+
deadline,
|
|
330
|
+
signature,
|
|
331
|
+
version: "1"
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// src/exact/client/erc20approval.ts
|
|
336
|
+
var import_viem8 = require("viem");
|
|
337
|
+
async function signErc20ApprovalTransaction(signer, tokenAddress, chainId) {
|
|
338
|
+
const from = signer.address;
|
|
339
|
+
const spender = (0, import_viem8.getAddress)(PERMIT2_ADDRESS);
|
|
340
|
+
const data = (0, import_viem8.encodeFunctionData)({
|
|
341
|
+
abi: erc20ApproveAbi,
|
|
342
|
+
functionName: "approve",
|
|
343
|
+
args: [spender, import_viem8.maxUint256]
|
|
344
|
+
});
|
|
345
|
+
const nonce = await signer.getTransactionCount({ address: from });
|
|
346
|
+
let maxFeePerGas;
|
|
347
|
+
let maxPriorityFeePerGas;
|
|
348
|
+
try {
|
|
349
|
+
const fees = await signer.estimateFeesPerGas?.();
|
|
350
|
+
if (!fees) {
|
|
351
|
+
throw new Error("no fee estimates available");
|
|
352
|
+
}
|
|
353
|
+
maxFeePerGas = fees.maxFeePerGas;
|
|
354
|
+
maxPriorityFeePerGas = fees.maxPriorityFeePerGas;
|
|
355
|
+
} catch {
|
|
356
|
+
maxFeePerGas = DEFAULT_MAX_FEE_PER_GAS;
|
|
357
|
+
maxPriorityFeePerGas = DEFAULT_MAX_PRIORITY_FEE_PER_GAS;
|
|
358
|
+
}
|
|
359
|
+
const signedTransaction = await signer.signTransaction({
|
|
360
|
+
to: tokenAddress,
|
|
361
|
+
data,
|
|
362
|
+
nonce,
|
|
363
|
+
gas: ERC20_APPROVE_GAS_LIMIT,
|
|
364
|
+
maxFeePerGas,
|
|
365
|
+
maxPriorityFeePerGas,
|
|
366
|
+
chainId
|
|
367
|
+
});
|
|
368
|
+
return {
|
|
369
|
+
from,
|
|
370
|
+
asset: tokenAddress,
|
|
371
|
+
spender,
|
|
372
|
+
amount: import_viem8.maxUint256.toString(),
|
|
373
|
+
signedTransaction,
|
|
374
|
+
version: ERC20_APPROVAL_GAS_SPONSORING_VERSION
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
// src/shared/rpc.ts
|
|
379
|
+
var import_viem9 = require("viem");
|
|
380
|
+
var rpcClientCache = /* @__PURE__ */ new Map();
|
|
381
|
+
function isConfigByChainId(options) {
|
|
382
|
+
const keys = Object.keys(options);
|
|
383
|
+
return keys.length > 0 && keys.every((key) => /^\d+$/.test(key));
|
|
384
|
+
}
|
|
385
|
+
function getRpcClient(rpcUrl) {
|
|
386
|
+
const existing = rpcClientCache.get(rpcUrl);
|
|
387
|
+
if (existing) {
|
|
388
|
+
return existing;
|
|
389
|
+
}
|
|
390
|
+
const client = (0, import_viem9.createPublicClient)({
|
|
391
|
+
transport: (0, import_viem9.http)(rpcUrl)
|
|
392
|
+
});
|
|
393
|
+
rpcClientCache.set(rpcUrl, client);
|
|
394
|
+
return client;
|
|
395
|
+
}
|
|
396
|
+
function resolveRpcUrl(network, options) {
|
|
397
|
+
if (!options) {
|
|
398
|
+
return void 0;
|
|
399
|
+
}
|
|
400
|
+
if (isConfigByChainId(options)) {
|
|
401
|
+
const chainId = getEvmChainId(network);
|
|
402
|
+
const optionsByChainId = options;
|
|
403
|
+
return optionsByChainId[chainId]?.rpcUrl;
|
|
404
|
+
}
|
|
405
|
+
return options.rpcUrl;
|
|
406
|
+
}
|
|
407
|
+
function resolveExtensionRpcCapabilities(network, signer, options) {
|
|
408
|
+
const capabilities = {
|
|
409
|
+
signTransaction: signer.signTransaction,
|
|
410
|
+
readContract: signer.readContract,
|
|
411
|
+
getTransactionCount: signer.getTransactionCount,
|
|
412
|
+
estimateFeesPerGas: signer.estimateFeesPerGas
|
|
413
|
+
};
|
|
414
|
+
const needsRpcBackfill = !capabilities.readContract || !capabilities.getTransactionCount || !capabilities.estimateFeesPerGas;
|
|
415
|
+
if (!needsRpcBackfill) {
|
|
416
|
+
return capabilities;
|
|
417
|
+
}
|
|
418
|
+
const rpcUrl = resolveRpcUrl(network, options);
|
|
419
|
+
if (!rpcUrl) {
|
|
420
|
+
return capabilities;
|
|
421
|
+
}
|
|
422
|
+
const rpcClient = getRpcClient(rpcUrl);
|
|
423
|
+
if (!capabilities.readContract) {
|
|
424
|
+
capabilities.readContract = (args) => rpcClient.readContract(args);
|
|
425
|
+
}
|
|
426
|
+
if (!capabilities.getTransactionCount) {
|
|
427
|
+
capabilities.getTransactionCount = async (args) => rpcClient.getTransactionCount({ address: args.address });
|
|
428
|
+
}
|
|
429
|
+
if (!capabilities.estimateFeesPerGas) {
|
|
430
|
+
capabilities.estimateFeesPerGas = async () => rpcClient.estimateFeesPerGas();
|
|
431
|
+
}
|
|
432
|
+
return capabilities;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// src/shared/extensions/gasSponsoring.ts
|
|
436
|
+
async function trySignEip2612PermitExtension(signer, options, requirements, result, context, approvalAmount) {
|
|
437
|
+
const capabilities = resolveExtensionRpcCapabilities(requirements.network, signer, options);
|
|
438
|
+
if (!capabilities.readContract) {
|
|
439
|
+
return void 0;
|
|
440
|
+
}
|
|
441
|
+
if (!context?.extensions?.[EIP2612_GAS_SPONSORING_KEY]) {
|
|
442
|
+
return void 0;
|
|
443
|
+
}
|
|
444
|
+
const tokenName = requirements.extra?.name;
|
|
445
|
+
const tokenVersion = requirements.extra?.version;
|
|
446
|
+
if (!tokenName || !tokenVersion) {
|
|
447
|
+
return void 0;
|
|
448
|
+
}
|
|
449
|
+
const chainId = getEvmChainId(requirements.network);
|
|
450
|
+
const tokenAddress = (0, import_viem10.getAddress)(requirements.asset);
|
|
451
|
+
const requiredAllowance = approvalAmount ?? requirements.amount;
|
|
452
|
+
try {
|
|
453
|
+
const allowance = await capabilities.readContract({
|
|
454
|
+
address: tokenAddress,
|
|
455
|
+
abi: erc20AllowanceAbi,
|
|
456
|
+
functionName: "allowance",
|
|
457
|
+
args: [signer.address, PERMIT2_ADDRESS]
|
|
458
|
+
});
|
|
459
|
+
if (allowance >= BigInt(requiredAllowance)) {
|
|
460
|
+
return void 0;
|
|
461
|
+
}
|
|
462
|
+
} catch {
|
|
463
|
+
}
|
|
464
|
+
const permit2Auth = result.payload?.permit2Authorization;
|
|
465
|
+
const deadline = permit2Auth?.deadline ?? Math.floor(Date.now() / 1e3 + requirements.maxTimeoutSeconds).toString();
|
|
466
|
+
const info = await signEip2612Permit(
|
|
467
|
+
{
|
|
468
|
+
address: signer.address,
|
|
469
|
+
signTypedData: (msg) => signer.signTypedData(msg),
|
|
470
|
+
readContract: capabilities.readContract
|
|
471
|
+
},
|
|
472
|
+
tokenAddress,
|
|
473
|
+
tokenName,
|
|
474
|
+
tokenVersion,
|
|
475
|
+
chainId,
|
|
476
|
+
deadline,
|
|
477
|
+
requiredAllowance
|
|
478
|
+
);
|
|
479
|
+
return {
|
|
480
|
+
[EIP2612_GAS_SPONSORING_KEY]: { info }
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
async function trySignErc20ApprovalExtension(signer, options, requirements, context, approvalAmount) {
|
|
484
|
+
const capabilities = resolveExtensionRpcCapabilities(requirements.network, signer, options);
|
|
485
|
+
if (!capabilities.readContract) {
|
|
486
|
+
return void 0;
|
|
487
|
+
}
|
|
488
|
+
if (!context?.extensions?.[ERC20_APPROVAL_GAS_SPONSORING_KEY]) {
|
|
489
|
+
return void 0;
|
|
490
|
+
}
|
|
491
|
+
if (!capabilities.signTransaction || !capabilities.getTransactionCount) {
|
|
492
|
+
return void 0;
|
|
493
|
+
}
|
|
494
|
+
const chainId = getEvmChainId(requirements.network);
|
|
495
|
+
const tokenAddress = (0, import_viem10.getAddress)(requirements.asset);
|
|
496
|
+
const requiredAllowance = approvalAmount ?? requirements.amount;
|
|
497
|
+
try {
|
|
498
|
+
const allowance = await capabilities.readContract({
|
|
499
|
+
address: tokenAddress,
|
|
500
|
+
abi: erc20AllowanceAbi,
|
|
501
|
+
functionName: "allowance",
|
|
502
|
+
args: [signer.address, PERMIT2_ADDRESS]
|
|
503
|
+
});
|
|
504
|
+
if (allowance >= BigInt(requiredAllowance)) {
|
|
505
|
+
return void 0;
|
|
506
|
+
}
|
|
507
|
+
} catch {
|
|
508
|
+
}
|
|
509
|
+
const info = await signErc20ApprovalTransaction(
|
|
510
|
+
{
|
|
511
|
+
address: signer.address,
|
|
512
|
+
signTransaction: capabilities.signTransaction,
|
|
513
|
+
getTransactionCount: capabilities.getTransactionCount,
|
|
514
|
+
estimateFeesPerGas: capabilities.estimateFeesPerGas
|
|
515
|
+
},
|
|
516
|
+
tokenAddress,
|
|
517
|
+
chainId
|
|
518
|
+
);
|
|
519
|
+
return {
|
|
520
|
+
[ERC20_APPROVAL_GAS_SPONSORING_KEY]: { info }
|
|
521
|
+
};
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// src/exact/client/scheme.ts
|
|
525
|
+
var ExactEvmScheme = class {
|
|
526
|
+
/**
|
|
527
|
+
* Creates a new ExactEvmClient instance.
|
|
528
|
+
*
|
|
529
|
+
* @param signer - The EVM signer for client operations.
|
|
530
|
+
* Base flow only requires `address` + `signTypedData`.
|
|
531
|
+
* Extension enrichment (EIP-2612 / ERC-20 approval sponsoring) additionally
|
|
532
|
+
* requires optional capabilities like `readContract` and tx signing helpers.
|
|
533
|
+
* @param options - Optional RPC configuration used to backfill extension capabilities.
|
|
534
|
+
*/
|
|
535
|
+
constructor(signer, options) {
|
|
536
|
+
this.signer = signer;
|
|
537
|
+
this.options = options;
|
|
538
|
+
this.scheme = "exact";
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Creates a payment payload for the Exact scheme.
|
|
542
|
+
* Routes to EIP-3009 or Permit2 based on requirements.extra.assetTransferMethod.
|
|
543
|
+
*
|
|
544
|
+
* For Permit2 flows, if the server advertises `eip2612GasSponsoring` and the
|
|
545
|
+
* signer supports `readContract`, automatically signs an EIP-2612 permit
|
|
546
|
+
* when Permit2 allowance is insufficient.
|
|
547
|
+
*
|
|
548
|
+
* @param x402Version - The x402 protocol version
|
|
549
|
+
* @param paymentRequirements - The payment requirements
|
|
550
|
+
* @param context - Optional context with server-declared extensions
|
|
551
|
+
* @returns Promise resolving to a payment payload result (with optional extensions)
|
|
552
|
+
*/
|
|
553
|
+
async createPaymentPayload(x402Version, paymentRequirements, context) {
|
|
554
|
+
const assetTransferMethod = paymentRequirements.extra?.assetTransferMethod ?? "eip3009";
|
|
555
|
+
if (assetTransferMethod === "permit2") {
|
|
556
|
+
const result = await createPermit2Payload(this.signer, x402Version, paymentRequirements);
|
|
557
|
+
const eip2612Extensions = await trySignEip2612PermitExtension(
|
|
558
|
+
this.signer,
|
|
559
|
+
this.options,
|
|
560
|
+
paymentRequirements,
|
|
561
|
+
result,
|
|
562
|
+
context
|
|
563
|
+
);
|
|
564
|
+
if (eip2612Extensions) {
|
|
565
|
+
return {
|
|
566
|
+
...result,
|
|
567
|
+
extensions: eip2612Extensions
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
const erc20Extensions = await trySignErc20ApprovalExtension(
|
|
571
|
+
this.signer,
|
|
572
|
+
this.options,
|
|
573
|
+
paymentRequirements,
|
|
574
|
+
context
|
|
575
|
+
);
|
|
576
|
+
if (erc20Extensions) {
|
|
577
|
+
return {
|
|
578
|
+
...result,
|
|
579
|
+
extensions: erc20Extensions
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
return result;
|
|
583
|
+
}
|
|
584
|
+
return createEIP3009Payload(this.signer, x402Version, paymentRequirements);
|
|
585
|
+
}
|
|
586
|
+
};
|
|
587
|
+
|
|
588
|
+
// src/exact/v1/client/scheme.ts
|
|
589
|
+
var import_viem13 = require("viem");
|
|
590
|
+
|
|
591
|
+
// src/exact/v1/facilitator/scheme.ts
|
|
592
|
+
var import_viem12 = require("viem");
|
|
593
|
+
|
|
594
|
+
// src/exact/facilitator/eip3009-utils.ts
|
|
595
|
+
var import_viem11 = require("viem");
|
|
596
|
+
|
|
597
|
+
// src/v1/index.ts
|
|
598
|
+
var EVM_NETWORK_CHAIN_ID_MAP = {
|
|
599
|
+
ethereum: 1,
|
|
600
|
+
sepolia: 11155111,
|
|
601
|
+
abstract: 2741,
|
|
602
|
+
"abstract-testnet": 11124,
|
|
603
|
+
"base-sepolia": 84532,
|
|
604
|
+
base: 8453,
|
|
605
|
+
"avalanche-fuji": 43113,
|
|
606
|
+
avalanche: 43114,
|
|
607
|
+
iotex: 4689,
|
|
608
|
+
sei: 1329,
|
|
609
|
+
"sei-testnet": 1328,
|
|
610
|
+
polygon: 137,
|
|
611
|
+
"polygon-amoy": 80002,
|
|
612
|
+
peaq: 3338,
|
|
613
|
+
story: 1514,
|
|
614
|
+
educhain: 41923,
|
|
615
|
+
"skale-base-sepolia": 324705682,
|
|
616
|
+
megaeth: 4326,
|
|
617
|
+
monad: 143,
|
|
618
|
+
stable: 988,
|
|
619
|
+
"stable-testnet": 2201
|
|
620
|
+
};
|
|
621
|
+
var NETWORKS = Object.keys(EVM_NETWORK_CHAIN_ID_MAP);
|
|
622
|
+
function getEvmChainIdV1(network) {
|
|
623
|
+
const chainId = EVM_NETWORK_CHAIN_ID_MAP[network];
|
|
624
|
+
if (!chainId) {
|
|
625
|
+
throw new Error(`Unsupported v1 network: ${network}`);
|
|
626
|
+
}
|
|
627
|
+
return chainId;
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
// src/exact/v1/client/scheme.ts
|
|
631
|
+
var ExactEvmSchemeV1 = class {
|
|
632
|
+
/**
|
|
633
|
+
* Creates a new ExactEvmClientV1 instance.
|
|
634
|
+
*
|
|
635
|
+
* @param signer - The EVM signer for client operations
|
|
636
|
+
*/
|
|
637
|
+
constructor(signer) {
|
|
638
|
+
this.signer = signer;
|
|
639
|
+
this.scheme = "exact";
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Creates a payment payload for the Exact scheme (V1).
|
|
643
|
+
*
|
|
644
|
+
* @param x402Version - The x402 protocol version
|
|
645
|
+
* @param paymentRequirements - The payment requirements
|
|
646
|
+
* @returns Promise resolving to a payment payload
|
|
647
|
+
*/
|
|
648
|
+
async createPaymentPayload(x402Version, paymentRequirements) {
|
|
649
|
+
const selectedV1 = paymentRequirements;
|
|
650
|
+
const nonce = createNonce();
|
|
651
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
652
|
+
const authorization = {
|
|
653
|
+
from: this.signer.address,
|
|
654
|
+
to: (0, import_viem13.getAddress)(selectedV1.payTo),
|
|
655
|
+
value: selectedV1.maxAmountRequired,
|
|
656
|
+
validAfter: (now - 600).toString(),
|
|
657
|
+
// 10 minutes before
|
|
658
|
+
validBefore: (now + selectedV1.maxTimeoutSeconds).toString(),
|
|
659
|
+
nonce
|
|
660
|
+
};
|
|
661
|
+
const signature = await this.signAuthorization(authorization, selectedV1);
|
|
662
|
+
const payload = {
|
|
663
|
+
authorization,
|
|
664
|
+
signature
|
|
665
|
+
};
|
|
666
|
+
return {
|
|
667
|
+
x402Version,
|
|
668
|
+
scheme: selectedV1.scheme,
|
|
669
|
+
network: selectedV1.network,
|
|
670
|
+
payload
|
|
671
|
+
};
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* Sign the EIP-3009 authorization using EIP-712
|
|
675
|
+
*
|
|
676
|
+
* @param authorization - The authorization to sign
|
|
677
|
+
* @param requirements - The payment requirements
|
|
678
|
+
* @returns Promise resolving to the signature
|
|
679
|
+
*/
|
|
680
|
+
async signAuthorization(authorization, requirements) {
|
|
681
|
+
const chainId = getEvmChainIdV1(requirements.network);
|
|
682
|
+
if (!requirements.extra?.name || !requirements.extra?.version) {
|
|
683
|
+
throw new Error(
|
|
684
|
+
`EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`
|
|
685
|
+
);
|
|
686
|
+
}
|
|
687
|
+
const { name, version } = requirements.extra;
|
|
688
|
+
const domain = {
|
|
689
|
+
name,
|
|
690
|
+
version,
|
|
691
|
+
chainId,
|
|
692
|
+
verifyingContract: (0, import_viem13.getAddress)(requirements.asset)
|
|
693
|
+
};
|
|
694
|
+
const message = {
|
|
695
|
+
from: (0, import_viem13.getAddress)(authorization.from),
|
|
696
|
+
to: (0, import_viem13.getAddress)(authorization.to),
|
|
697
|
+
value: BigInt(authorization.value),
|
|
698
|
+
validAfter: BigInt(authorization.validAfter),
|
|
699
|
+
validBefore: BigInt(authorization.validBefore),
|
|
700
|
+
nonce: authorization.nonce
|
|
701
|
+
};
|
|
702
|
+
return await this.signer.signTypedData({
|
|
703
|
+
domain,
|
|
704
|
+
types: authorizationTypes,
|
|
705
|
+
primaryType: "TransferWithAuthorization",
|
|
706
|
+
message
|
|
707
|
+
});
|
|
708
|
+
}
|
|
709
|
+
};
|
|
710
|
+
|
|
711
|
+
// src/exact/client/register.ts
|
|
712
|
+
function registerExactEvmScheme(client, config) {
|
|
713
|
+
const evmScheme = new ExactEvmScheme(config.signer, config.schemeOptions);
|
|
714
|
+
if (config.networks && config.networks.length > 0) {
|
|
715
|
+
config.networks.forEach((network) => {
|
|
716
|
+
client.register(network, evmScheme);
|
|
717
|
+
});
|
|
718
|
+
} else {
|
|
719
|
+
client.register("eip155:*", evmScheme);
|
|
720
|
+
}
|
|
721
|
+
NETWORKS.forEach((network) => {
|
|
722
|
+
client.registerV1(network, new ExactEvmSchemeV1(config.signer));
|
|
723
|
+
});
|
|
724
|
+
if (config.policies) {
|
|
725
|
+
config.policies.forEach((policy) => {
|
|
726
|
+
client.registerPolicy(policy);
|
|
727
|
+
});
|
|
728
|
+
}
|
|
729
|
+
return client;
|
|
730
|
+
}
|
|
731
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
732
|
+
0 && (module.exports = {
|
|
733
|
+
ExactEvmScheme,
|
|
734
|
+
createPermit2ApprovalTx,
|
|
735
|
+
erc20AllowanceAbi,
|
|
736
|
+
getPermit2AllowanceReadParams,
|
|
737
|
+
registerExactEvmScheme
|
|
738
|
+
});
|
|
739
|
+
//# sourceMappingURL=index.js.map
|