@bankofai/x402-evm 1.0.0-beta.0 → 1.0.0-beta.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 (56) hide show
  1. package/dist/cjs/adapters/agent-wallet.d.ts +109 -0
  2. package/dist/cjs/adapters/agent-wallet.js +236 -0
  3. package/dist/cjs/adapters/agent-wallet.js.map +1 -0
  4. package/dist/cjs/batch-settlement/client/index.js +2 -2
  5. package/dist/cjs/batch-settlement/client/index.js.map +1 -1
  6. package/dist/cjs/batch-settlement/facilitator/index.js.map +1 -1
  7. package/dist/cjs/batch-settlement/server/index.js +18 -0
  8. package/dist/cjs/batch-settlement/server/index.js.map +1 -1
  9. package/dist/cjs/exact/client/index.js +2 -2
  10. package/dist/cjs/exact/client/index.js.map +1 -1
  11. package/dist/cjs/exact/facilitator/index.js.map +1 -1
  12. package/dist/cjs/exact/server/index.js +18 -0
  13. package/dist/cjs/exact/server/index.js.map +1 -1
  14. package/dist/cjs/index.js +23 -5
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/cjs/upto/client/index.js +1 -1
  17. package/dist/cjs/upto/client/index.js.map +1 -1
  18. package/dist/cjs/upto/facilitator/index.js.map +1 -1
  19. package/dist/cjs/upto/server/index.js +18 -0
  20. package/dist/cjs/upto/server/index.js.map +1 -1
  21. package/dist/esm/adapters/agent-wallet.d.mts +109 -0
  22. package/dist/esm/adapters/agent-wallet.mjs +170 -0
  23. package/dist/esm/adapters/agent-wallet.mjs.map +1 -0
  24. package/dist/esm/batch-settlement/client/index.mjs +1 -1
  25. package/dist/esm/batch-settlement/facilitator/index.mjs +1 -1
  26. package/dist/esm/batch-settlement/server/index.mjs +1 -1
  27. package/dist/esm/{chunk-ZCJRY5LQ.mjs → chunk-5KQLI32E.mjs} +3 -3
  28. package/dist/esm/chunk-5KQLI32E.mjs.map +1 -0
  29. package/dist/esm/{chunk-H3KPLYGI.mjs → chunk-7TVN2CRM.mjs} +19 -1
  30. package/dist/esm/chunk-7TVN2CRM.mjs.map +1 -0
  31. package/dist/esm/{chunk-GQVMVP4N.mjs → chunk-CS7NNAAI.mjs} +3 -3
  32. package/dist/esm/chunk-CS7NNAAI.mjs.map +1 -0
  33. package/dist/esm/{chunk-I2DVUHM5.mjs → chunk-LMKW3B2D.mjs} +2 -2
  34. package/dist/esm/chunk-LMKW3B2D.mjs.map +1 -0
  35. package/dist/esm/{chunk-H2EYJIZL.mjs → chunk-PFKQBC4W.mjs} +2 -2
  36. package/dist/esm/{chunk-H2EYJIZL.mjs.map → chunk-PFKQBC4W.mjs.map} +1 -1
  37. package/dist/esm/{chunk-QVATVA3J.mjs → chunk-T6Y33ZJQ.mjs} +2 -2
  38. package/dist/esm/exact/client/index.mjs +3 -3
  39. package/dist/esm/exact/facilitator/index.mjs +1 -1
  40. package/dist/esm/exact/server/index.mjs +1 -1
  41. package/dist/esm/index.mjs +6 -6
  42. package/dist/esm/upto/client/index.mjs +3 -3
  43. package/dist/esm/upto/facilitator/index.mjs +1 -1
  44. package/dist/esm/upto/server/index.mjs +1 -1
  45. package/package.json +7 -17
  46. package/dist/esm/chunk-GQVMVP4N.mjs.map +0 -1
  47. package/dist/esm/chunk-H3KPLYGI.mjs.map +0 -1
  48. package/dist/esm/chunk-I2DVUHM5.mjs.map +0 -1
  49. package/dist/esm/chunk-ZCJRY5LQ.mjs.map +0 -1
  50. package/dist/esm/client/agent-wallet.d.mts +0 -69
  51. package/dist/esm/client/agent-wallet.mjs +0 -36
  52. package/dist/esm/client/agent-wallet.mjs.map +0 -1
  53. package/dist/esm/facilitator/agent-wallet.d.mts +0 -109
  54. package/dist/esm/facilitator/agent-wallet.mjs +0 -74
  55. package/dist/esm/facilitator/agent-wallet.mjs.map +0 -1
  56. /package/dist/esm/{chunk-QVATVA3J.mjs.map → chunk-T6Y33ZJQ.mjs.map} +0 -0
@@ -0,0 +1,109 @@
1
+ import { ClientWallet, FacilitatorWallet } from '@bankofai/x402-core/wallets';
2
+ import { C as ClientEvmSigner, F as FacilitatorEvmSigner } from '../signer-BFelv8DL.js';
3
+ import 'viem';
4
+
5
+ /** EVM client wallet — the chain-agnostic {@link ClientWallet} (no EVM refinement). */
6
+ type ClientEvmWallet = ClientWallet;
7
+ /** Options for {@link createClientEvmSigner}. */
8
+ interface CreateClientEvmSignerOptions {
9
+ /** CAIP-2 network, e.g. `"eip155:97"`. The viem client is built from it. */
10
+ network: string;
11
+ /** Optional RPC URL override; falls back to the chain's default. */
12
+ rpcUrl?: string;
13
+ }
14
+ /**
15
+ * Creates a {@link ClientEvmSigner} from a wallet — the EVM counterpart of
16
+ * `createClientTronSigner`. The key never enters the SDK; the wallet signs. The
17
+ * viem public client (for EIP-2612 / permit2 enrichment + the gas-sponsored
18
+ * approve) is built internally from `opts.network`.
19
+ *
20
+ * @param wallet - The wallet that signs payment authorizations.
21
+ * @param opts - Target network (+ optional RPC override).
22
+ * @returns A {@link ClientEvmSigner} backed by the wallet.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const wallet = await resolveWallet({ network: "eip155:97" }); // @bankofai/agent-wallet
27
+ * const signer = await createClientEvmSigner(wallet, { network: "eip155:97" });
28
+ * client.register("eip155:97", new ExactEvmScheme(signer));
29
+ * ```
30
+ */
31
+ declare function createClientEvmSigner(wallet: ClientEvmWallet, opts: CreateClientEvmSignerOptions): Promise<ClientEvmSigner>;
32
+ /**
33
+ * A typed-data signer with an eagerly-resolved address. Structurally satisfies
34
+ * the batch-settlement `AuthorizerSigner` (the receiver-authorizer key).
35
+ */
36
+ type EvmAuthorizerSigner = Pick<ClientEvmSigner, "address" | "signTypedData">;
37
+ /**
38
+ * Creates an authorizer signer (address + typed-data signing) from a wallet —
39
+ * e.g. the batch-settlement `receiverAuthorizer`, which signs `ClaimBatch` /
40
+ * `Refund` EIP-712 digests. No chain client is built (signing is offline).
41
+ *
42
+ * @param wallet - The wallet that holds the authorizer key.
43
+ * @returns A signer satisfying batch-settlement's `AuthorizerSigner`.
44
+ */
45
+ declare function createAuthorizerEvmSigner(wallet: ClientWallet): Promise<EvmAuthorizerSigner>;
46
+ /**
47
+ * Typed EIP-1559 fields the facilitator wallet receives to sign a settlement tx.
48
+ * A `type` (not `interface`) so it stays assignable to `Record<string, unknown>`
49
+ * — the shape a generic agent-wallet `signTransaction` accepts.
50
+ */
51
+ type Eip1559TxFields = {
52
+ to: `0x${string}`;
53
+ data: `0x${string}`;
54
+ value: bigint;
55
+ nonce: number;
56
+ gas: bigint;
57
+ maxFeePerGas: bigint;
58
+ maxPriorityFeePerGas: bigint;
59
+ chainId: number;
60
+ };
61
+ /** EVM facilitator wallet — {@link FacilitatorWallet} refined to EIP-1559 fields. */
62
+ type FacilitatorEvmWallet = FacilitatorWallet<Eip1559TxFields>;
63
+ /** Options for {@link createFacilitatorEvmSigner}. */
64
+ interface CreateFacilitatorEvmSignerOptions {
65
+ /** CAIP-2 network, e.g. `"eip155:97"`. The viem client is built from it. */
66
+ network: string;
67
+ /** Optional RPC URL override; falls back to the chain's default. */
68
+ rpcUrl?: string;
69
+ /** Gas limit when a per-call `gas` is not supplied; otherwise estimated. */
70
+ defaultGas?: bigint;
71
+ }
72
+ /**
73
+ * One transaction for {@link GasSponsoringFacilitatorEvmSigner.sendTransactions}:
74
+ * a pre-signed serialized tx (broadcast as-is) or an unsigned call intent (signed
75
+ * by the facilitator wallet, then broadcast).
76
+ */
77
+ type EvmTransactionRequest = `0x${string}` | {
78
+ to: `0x${string}`;
79
+ data: `0x${string}`;
80
+ gas?: bigint;
81
+ };
82
+ /**
83
+ * {@link FacilitatorEvmSigner} plus `sendTransactions` — the shape the ERC-20
84
+ * approval gas-sponsoring extension expects (broadcasts the client's pre-signed
85
+ * `approve` bundled with `settle`).
86
+ */
87
+ type GasSponsoringFacilitatorEvmSigner = FacilitatorEvmSigner & {
88
+ sendTransactions(transactions: readonly EvmTransactionRequest[]): Promise<`0x${string}`[]>;
89
+ };
90
+ /**
91
+ * Creates a {@link FacilitatorEvmSigner} from a wallet — the EVM counterpart of
92
+ * `createFacilitatorTronSigner`. The viem public client (reads / verification /
93
+ * broadcast) is built internally from `opts.network`. The transaction is built
94
+ * (nonce / EIP-1559 fees / gas), handed to the wallet to sign (the private key
95
+ * never enters the SDK), then broadcast.
96
+ *
97
+ * @param wallet - The wallet that signs settlement transactions.
98
+ * @param opts - Target network (+ optional RPC override / default gas).
99
+ * @returns A {@link GasSponsoringFacilitatorEvmSigner} backed by the wallet.
100
+ *
101
+ * @example
102
+ * ```typescript
103
+ * const signer = await createFacilitatorEvmSigner(agentWallet, { network: "eip155:97" });
104
+ * facilitator.register("eip155:97", new ExactEvmScheme(signer));
105
+ * ```
106
+ */
107
+ declare function createFacilitatorEvmSigner(wallet: FacilitatorEvmWallet, opts: CreateFacilitatorEvmSignerOptions): Promise<GasSponsoringFacilitatorEvmSigner>;
108
+
109
+ export { type ClientEvmWallet, type CreateClientEvmSignerOptions, type CreateFacilitatorEvmSignerOptions, type Eip1559TxFields, type EvmAuthorizerSigner, type EvmTransactionRequest, type FacilitatorEvmWallet, type GasSponsoringFacilitatorEvmSigner, createAuthorizerEvmSigner, createClientEvmSigner, createFacilitatorEvmSigner };
@@ -0,0 +1,236 @@
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/adapters/agent-wallet.ts
21
+ var agent_wallet_exports = {};
22
+ __export(agent_wallet_exports, {
23
+ createAuthorizerEvmSigner: () => createAuthorizerEvmSigner,
24
+ createClientEvmSigner: () => createClientEvmSigner,
25
+ createFacilitatorEvmSigner: () => createFacilitatorEvmSigner
26
+ });
27
+ module.exports = __toCommonJS(agent_wallet_exports);
28
+ var import_viem3 = require("viem");
29
+
30
+ // src/signer.ts
31
+ function toClientEvmSigner(signer, publicClient) {
32
+ const readContract = signer.readContract ?? publicClient?.readContract.bind(publicClient);
33
+ const result = {
34
+ address: signer.address,
35
+ signTypedData: (msg) => signer.signTypedData(msg)
36
+ };
37
+ if (readContract) {
38
+ result.readContract = readContract;
39
+ }
40
+ const signTransaction = signer.signTransaction;
41
+ if (signTransaction) {
42
+ result.signTransaction = (args) => signTransaction(args);
43
+ }
44
+ const getTransactionCount = signer.getTransactionCount ?? publicClient?.getTransactionCount?.bind(publicClient);
45
+ if (getTransactionCount) {
46
+ result.getTransactionCount = (args) => getTransactionCount(args);
47
+ }
48
+ const estimateFeesPerGas = signer.estimateFeesPerGas ?? publicClient?.estimateFeesPerGas?.bind(publicClient);
49
+ if (estimateFeesPerGas) {
50
+ result.estimateFeesPerGas = () => estimateFeesPerGas();
51
+ }
52
+ return result;
53
+ }
54
+ function toFacilitatorEvmSigner(client) {
55
+ return {
56
+ ...client,
57
+ getAddresses: () => [client.address]
58
+ };
59
+ }
60
+
61
+ // src/adapters/chains.ts
62
+ var import_viem2 = require("viem");
63
+ var import_chains = require("viem/chains");
64
+
65
+ // src/utils.ts
66
+ var import_viem = require("viem");
67
+ function getEvmChainId(network) {
68
+ if (network.startsWith("eip155:")) {
69
+ const idStr = network.split(":")[1];
70
+ const chainId = parseInt(idStr, 10);
71
+ if (isNaN(chainId)) {
72
+ throw new Error(`Invalid CAIP-2 chain ID: ${network}`);
73
+ }
74
+ return chainId;
75
+ }
76
+ throw new Error(`Unsupported network format: ${network} (expected eip155:CHAIN_ID)`);
77
+ }
78
+
79
+ // src/adapters/chains.ts
80
+ var KNOWN_CHAINS = {
81
+ [import_chains.mainnet.id]: import_chains.mainnet,
82
+ [import_chains.sepolia.id]: import_chains.sepolia,
83
+ [import_chains.base.id]: import_chains.base,
84
+ [import_chains.baseSepolia.id]: import_chains.baseSepolia,
85
+ [import_chains.bsc.id]: import_chains.bsc,
86
+ [import_chains.bscTestnet.id]: import_chains.bscTestnet
87
+ };
88
+ function resolveEvmChain(network, rpcUrl) {
89
+ const chainId = getEvmChainId(network);
90
+ const known = KNOWN_CHAINS[chainId];
91
+ if (known) {
92
+ return known;
93
+ }
94
+ if (!rpcUrl) {
95
+ throw new Error(
96
+ `Unknown EVM chain ${network}: not in KNOWN_CHAINS. Pass rpcUrl to use a custom chain.`
97
+ );
98
+ }
99
+ return (0, import_viem2.defineChain)({
100
+ id: chainId,
101
+ name: network,
102
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
103
+ rpcUrls: { default: { http: [rpcUrl] } }
104
+ });
105
+ }
106
+ function createEvmPublicClient(network, rpcUrl) {
107
+ const chain = resolveEvmChain(network, rpcUrl);
108
+ return (0, import_viem2.createPublicClient)({ chain, transport: (0, import_viem2.http)(rpcUrl) });
109
+ }
110
+
111
+ // src/adapters/agent-wallet.ts
112
+ async function createClientEvmSigner(wallet, opts) {
113
+ const address = await wallet.getAddress();
114
+ const publicClient = createEvmPublicClient(opts.network, opts.rpcUrl);
115
+ const signTransaction = wallet.signTransaction?.bind(wallet);
116
+ return toClientEvmSigner(
117
+ {
118
+ address,
119
+ // agent-wallet strips the `0x` (signature analog of SDK issue #2); re-add it.
120
+ signTypedData: async (msg) => {
121
+ const sig = await wallet.signTypedData(msg);
122
+ return `0x${sig.replace(/^0x/, "")}`;
123
+ },
124
+ // Enables the ERC-20 approval gas-sponsoring extension: the client signs
125
+ // the `approve(Permit2, MaxUint256)` tx offline (facilitator broadcasts it).
126
+ ...signTransaction ? {
127
+ signTransaction: async (args) => {
128
+ const signed = await signTransaction(args);
129
+ if (typeof signed !== "string") {
130
+ throw new Error("EVM signTransaction must return a serialized hex string");
131
+ }
132
+ return `0x${signed.replace(/^0x/, "")}`;
133
+ }
134
+ } : {}
135
+ },
136
+ publicClient
137
+ );
138
+ }
139
+ async function createAuthorizerEvmSigner(wallet) {
140
+ const address = await wallet.getAddress();
141
+ return {
142
+ address,
143
+ // agent-wallet strips the `0x`; re-add it so the signature conforms.
144
+ signTypedData: async (msg) => {
145
+ const sig = await wallet.signTypedData(msg);
146
+ return `0x${sig.replace(/^0x/, "")}`;
147
+ }
148
+ };
149
+ }
150
+ function appendDataSuffix(data, suffix) {
151
+ if (!suffix || suffix === "0x") {
152
+ return data;
153
+ }
154
+ return `${data}${suffix.slice(2)}`;
155
+ }
156
+ async function createFacilitatorEvmSigner(wallet, opts) {
157
+ const address = await wallet.getAddress();
158
+ const client = createEvmPublicClient(
159
+ opts.network,
160
+ opts.rpcUrl
161
+ );
162
+ async function buildSignBroadcast(to, data, gasOverride) {
163
+ const value = 0n;
164
+ const [chainId, nonce, fees] = await Promise.all([
165
+ client.getChainId(),
166
+ // "pending" (not the default "latest") counts the EOA's not-yet-mined txs,
167
+ // so rapid sequential settlements from one facilitator key don't reuse a
168
+ // nonce while the previous settle is still in the mempool.
169
+ client.getTransactionCount({ address, blockTag: "pending" }),
170
+ client.estimateFeesPerGas()
171
+ ]);
172
+ const gas = gasOverride ?? opts.defaultGas ?? await client.estimateGas({ account: address, to, data, value });
173
+ const signed = await wallet.signTransaction({
174
+ to,
175
+ data,
176
+ value,
177
+ nonce,
178
+ gas,
179
+ maxFeePerGas: fees.maxFeePerGas,
180
+ maxPriorityFeePerGas: fees.maxPriorityFeePerGas,
181
+ chainId
182
+ });
183
+ if (typeof signed !== "string") {
184
+ throw new Error("EVM facilitator signTransaction must return a serialized hex string");
185
+ }
186
+ const serializedTransaction = `0x${signed.replace(/^0x/, "")}`;
187
+ return client.sendRawTransaction({ serializedTransaction });
188
+ }
189
+ const base2 = toFacilitatorEvmSigner({
190
+ address,
191
+ // Issue every read as the facilitator EOA (sets the eth_call `from`). View
192
+ // calls ignore the caller, but caller-authorized simulations need it — the
193
+ // upto proxy `settle` reverts with `UnauthorizedFacilitator` unless
194
+ // `msg.sender` is the witness-bound facilitator (= this single-key wallet).
195
+ // `...args` last so an explicit per-call `account` (if upstream ever adds one)
196
+ // overrides this default.
197
+ readContract: (args) => client.readContract({ account: address, ...args }),
198
+ verifyTypedData: (args) => client.verifyTypedData(args),
199
+ getCode: (args) => client.getCode(args),
200
+ waitForTransactionReceipt: (args) => client.waitForTransactionReceipt(args),
201
+ writeContract: (args) => {
202
+ const data = appendDataSuffix(
203
+ (0, import_viem3.encodeFunctionData)({
204
+ abi: args.abi,
205
+ functionName: args.functionName,
206
+ args: args.args
207
+ }),
208
+ args.dataSuffix
209
+ );
210
+ return buildSignBroadcast(args.address, data, args.gas);
211
+ },
212
+ sendTransaction: (args) => buildSignBroadcast(args.to, args.data)
213
+ });
214
+ return {
215
+ ...base2,
216
+ async sendTransactions(transactions) {
217
+ const hashes = [];
218
+ for (const tx of transactions) {
219
+ if (typeof tx === "string") {
220
+ const serializedTransaction = `0x${tx.replace(/^0x/, "")}`;
221
+ hashes.push(await client.sendRawTransaction({ serializedTransaction }));
222
+ } else {
223
+ hashes.push(await buildSignBroadcast(tx.to, tx.data, tx.gas));
224
+ }
225
+ }
226
+ return hashes;
227
+ }
228
+ };
229
+ }
230
+ // Annotate the CommonJS export names for ESM import in node:
231
+ 0 && (module.exports = {
232
+ createAuthorizerEvmSigner,
233
+ createClientEvmSigner,
234
+ createFacilitatorEvmSigner
235
+ });
236
+ //# sourceMappingURL=agent-wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/adapters/agent-wallet.ts","../../../src/signer.ts","../../../src/adapters/chains.ts","../../../src/utils.ts"],"sourcesContent":["/**\n * Adaptation layer — BankofAI overlay, NOT from upstream @x402/evm.\n *\n * Bridges a non-custodial wallet (e.g. `@bankofai/agent-wallet`) to upstream's\n * signer contracts, for both roles. Each factory takes `(wallet, { network })`\n * and builds the viem client internally from the CAIP-2 network — callers no\n * longer construct a viem chain / public client themselves.\n *\n * - {@link createClientEvmSigner} → `ClientEvmSigner`\n * - {@link createFacilitatorEvmSigner} → `FacilitatorEvmSigner`\n *\n * Wallet contracts come from `@bankofai/x402-core/wallets` (the chain-agnostic\n * {@link ClientWallet} / {@link FacilitatorWallet} hierarchy); EVM only refines\n * the facilitator transaction shape via {@link Eip1559TxFields}.\n *\n * Upgrade safety: consumes only upstream's public surface (`toClientEvmSigner` /\n * `toFacilitatorEvmSigner` + the signer types); never edits `signer.ts` /\n * `index.ts`. Wallet types are structural — no runtime coupling to agent-wallet.\n */\nimport { encodeFunctionData, type Abi, type Log } from \"viem\";\n\nimport type { ClientWallet, FacilitatorWallet } from \"@bankofai/x402-core/wallets\";\n\nimport {\n toClientEvmSigner,\n toFacilitatorEvmSigner,\n type ClientEvmSigner,\n type FacilitatorEvmSigner,\n} from \"../signer\";\nimport { createEvmPublicClient } from \"./chains\";\n\n// ────────────────────────────────────────────────────────────────────────────\n// Client\n// ────────────────────────────────────────────────────────────────────────────\n\n/** EVM client wallet — the chain-agnostic {@link ClientWallet} (no EVM refinement). */\nexport type ClientEvmWallet = ClientWallet;\n\n/** Options for {@link createClientEvmSigner}. */\nexport interface CreateClientEvmSignerOptions {\n /** CAIP-2 network, e.g. `\"eip155:97\"`. The viem client is built from it. */\n network: string;\n /** Optional RPC URL override; falls back to the chain's default. */\n rpcUrl?: string;\n}\n\n/**\n * Creates a {@link ClientEvmSigner} from a wallet — the EVM counterpart of\n * `createClientTronSigner`. The key never enters the SDK; the wallet signs. The\n * viem public client (for EIP-2612 / permit2 enrichment + the gas-sponsored\n * approve) is built internally from `opts.network`.\n *\n * @param wallet - The wallet that signs payment authorizations.\n * @param opts - Target network (+ optional RPC override).\n * @returns A {@link ClientEvmSigner} backed by the wallet.\n *\n * @example\n * ```typescript\n * const wallet = await resolveWallet({ network: \"eip155:97\" }); // @bankofai/agent-wallet\n * const signer = await createClientEvmSigner(wallet, { network: \"eip155:97\" });\n * client.register(\"eip155:97\", new ExactEvmScheme(signer));\n * ```\n */\nexport async function createClientEvmSigner(\n wallet: ClientEvmWallet,\n opts: CreateClientEvmSignerOptions,\n): Promise<ClientEvmSigner> {\n const address = (await wallet.getAddress()) as `0x${string}`;\n const publicClient = createEvmPublicClient(opts.network, opts.rpcUrl);\n\n // Bind to the wallet: agent-wallet's `LocalSigner.signTransaction` reads\n // `this._impl`, so a detached reference throws. (`signTypedData` below is\n // invoked as `wallet.signTypedData(...)`, so it stays bound.)\n const signTransaction = wallet.signTransaction?.bind(wallet);\n\n return toClientEvmSigner(\n {\n address,\n // agent-wallet strips the `0x` (signature analog of SDK issue #2); re-add it.\n signTypedData: async msg => {\n const sig = await wallet.signTypedData(msg);\n return `0x${sig.replace(/^0x/, \"\")}` as `0x${string}`;\n },\n // Enables the ERC-20 approval gas-sponsoring extension: the client signs\n // the `approve(Permit2, MaxUint256)` tx offline (facilitator broadcasts it).\n ...(signTransaction\n ? {\n signTransaction: async (args: Record<string, unknown>) => {\n const signed = await signTransaction(args);\n if (typeof signed !== \"string\") {\n throw new Error(\"EVM signTransaction must return a serialized hex string\");\n }\n return `0x${signed.replace(/^0x/, \"\")}` as `0x${string}`;\n },\n }\n : {}),\n },\n publicClient,\n );\n}\n\n/**\n * A typed-data signer with an eagerly-resolved address. Structurally satisfies\n * the batch-settlement `AuthorizerSigner` (the receiver-authorizer key).\n */\nexport type EvmAuthorizerSigner = Pick<ClientEvmSigner, \"address\" | \"signTypedData\">;\n\n/**\n * Creates an authorizer signer (address + typed-data signing) from a wallet —\n * e.g. the batch-settlement `receiverAuthorizer`, which signs `ClaimBatch` /\n * `Refund` EIP-712 digests. No chain client is built (signing is offline).\n *\n * @param wallet - The wallet that holds the authorizer key.\n * @returns A signer satisfying batch-settlement's `AuthorizerSigner`.\n */\nexport async function createAuthorizerEvmSigner(wallet: ClientWallet): Promise<EvmAuthorizerSigner> {\n const address = (await wallet.getAddress()) as `0x${string}`;\n return {\n address,\n // agent-wallet strips the `0x`; re-add it so the signature conforms.\n signTypedData: async msg => {\n const sig = await wallet.signTypedData(msg);\n return `0x${sig.replace(/^0x/, \"\")}` as `0x${string}`;\n },\n };\n}\n\n// ────────────────────────────────────────────────────────────────────────────\n// Facilitator\n// ────────────────────────────────────────────────────────────────────────────\n\n/**\n * Typed EIP-1559 fields the facilitator wallet receives to sign a settlement tx.\n * A `type` (not `interface`) so it stays assignable to `Record<string, unknown>`\n * — the shape a generic agent-wallet `signTransaction` accepts.\n */\nexport type Eip1559TxFields = {\n to: `0x${string}`;\n data: `0x${string}`;\n value: bigint;\n nonce: number;\n gas: bigint;\n maxFeePerGas: bigint;\n maxPriorityFeePerGas: bigint;\n chainId: number;\n};\n\n/** EVM facilitator wallet — {@link FacilitatorWallet} refined to EIP-1559 fields. */\nexport type FacilitatorEvmWallet = FacilitatorWallet<Eip1559TxFields>;\n\n/**\n * Loose view of the viem public client for internal forwarding. viem's read/verify\n * methods are generic and strict, while upstream's `FacilitatorEvmSigner` shape is\n * loose; we narrow once here so the impedance is resolved inside the SDK.\n */\ntype LooseEvmPublicClient = {\n getChainId(): Promise<number>;\n getTransactionCount(args: {\n address: `0x${string}`;\n blockTag?: \"latest\" | \"pending\";\n }): Promise<number>;\n estimateFeesPerGas(): Promise<{ maxFeePerGas: bigint; maxPriorityFeePerGas: bigint }>;\n estimateGas(args: {\n account: `0x${string}`;\n to: `0x${string}`;\n data: `0x${string}`;\n value?: bigint;\n }): Promise<bigint>;\n sendRawTransaction(args: { serializedTransaction: `0x${string}` }): Promise<`0x${string}`>;\n readContract(args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n account?: `0x${string}`;\n }): Promise<unknown>;\n verifyTypedData(args: {\n address: `0x${string}`;\n domain: Record<string, unknown>;\n types: Record<string, unknown>;\n primaryType: string;\n message: Record<string, unknown>;\n signature: `0x${string}`;\n }): Promise<boolean>;\n getCode(args: { address: `0x${string}` }): Promise<`0x${string}` | undefined>;\n waitForTransactionReceipt(args: {\n hash: `0x${string}`;\n }): Promise<{ status: string; logs?: readonly Log[] }>;\n};\n\n/** Options for {@link createFacilitatorEvmSigner}. */\nexport interface CreateFacilitatorEvmSignerOptions {\n /** CAIP-2 network, e.g. `\"eip155:97\"`. The viem client is built from it. */\n network: string;\n /** Optional RPC URL override; falls back to the chain's default. */\n rpcUrl?: string;\n /** Gas limit when a per-call `gas` is not supplied; otherwise estimated. */\n defaultGas?: bigint;\n}\n\n/**\n * One transaction for {@link GasSponsoringFacilitatorEvmSigner.sendTransactions}:\n * a pre-signed serialized tx (broadcast as-is) or an unsigned call intent (signed\n * by the facilitator wallet, then broadcast).\n */\nexport type EvmTransactionRequest =\n | `0x${string}`\n | { to: `0x${string}`; data: `0x${string}`; gas?: bigint };\n\n/**\n * {@link FacilitatorEvmSigner} plus `sendTransactions` — the shape the ERC-20\n * approval gas-sponsoring extension expects (broadcasts the client's pre-signed\n * `approve` bundled with `settle`).\n */\nexport type GasSponsoringFacilitatorEvmSigner = FacilitatorEvmSigner & {\n sendTransactions(transactions: readonly EvmTransactionRequest[]): Promise<`0x${string}`[]>;\n};\n\n/**\n * Appends an extension data suffix (e.g. a builder code) to encoded calldata.\n *\n * @param data - The encoded function calldata.\n * @param suffix - Optional `0x`-prefixed suffix to append.\n * @returns The calldata with the suffix appended, or `data` unchanged.\n */\nfunction appendDataSuffix(data: `0x${string}`, suffix?: `0x${string}`): `0x${string}` {\n if (!suffix || suffix === \"0x\") {\n return data;\n }\n return `${data}${suffix.slice(2)}` as `0x${string}`;\n}\n\n/**\n * Creates a {@link FacilitatorEvmSigner} from a wallet — the EVM counterpart of\n * `createFacilitatorTronSigner`. The viem public client (reads / verification /\n * broadcast) is built internally from `opts.network`. The transaction is built\n * (nonce / EIP-1559 fees / gas), handed to the wallet to sign (the private key\n * never enters the SDK), then broadcast.\n *\n * @param wallet - The wallet that signs settlement transactions.\n * @param opts - Target network (+ optional RPC override / default gas).\n * @returns A {@link GasSponsoringFacilitatorEvmSigner} backed by the wallet.\n *\n * @example\n * ```typescript\n * const signer = await createFacilitatorEvmSigner(agentWallet, { network: \"eip155:97\" });\n * facilitator.register(\"eip155:97\", new ExactEvmScheme(signer));\n * ```\n */\nexport async function createFacilitatorEvmSigner(\n wallet: FacilitatorEvmWallet,\n opts: CreateFacilitatorEvmSignerOptions,\n): Promise<GasSponsoringFacilitatorEvmSigner> {\n const address = (await wallet.getAddress()) as `0x${string}`;\n // Narrow once: viem's strict generic methods → the loose shape we forward to\n // upstream's FacilitatorEvmSigner. Keeps the cast inside the SDK.\n const client = createEvmPublicClient(\n opts.network,\n opts.rpcUrl,\n ) as unknown as LooseEvmPublicClient;\n\n // Build → wallet-sign → broadcast. Shared by writeContract and sendTransaction.\n async function buildSignBroadcast(\n to: `0x${string}`,\n data: `0x${string}`,\n gasOverride?: bigint,\n ): Promise<`0x${string}`> {\n const value = 0n; // x402 settlement never transfers native value.\n const [chainId, nonce, fees] = await Promise.all([\n client.getChainId(),\n // \"pending\" (not the default \"latest\") counts the EOA's not-yet-mined txs,\n // so rapid sequential settlements from one facilitator key don't reuse a\n // nonce while the previous settle is still in the mempool.\n client.getTransactionCount({ address, blockTag: \"pending\" }),\n client.estimateFeesPerGas(),\n ]);\n const gas =\n gasOverride ??\n opts.defaultGas ??\n (await client.estimateGas({ account: address, to, data, value }));\n\n const signed = await wallet.signTransaction({\n to,\n data,\n value,\n nonce,\n gas,\n maxFeePerGas: fees.maxFeePerGas,\n maxPriorityFeePerGas: fees.maxPriorityFeePerGas,\n chainId,\n });\n if (typeof signed !== \"string\") {\n throw new Error(\"EVM facilitator signTransaction must return a serialized hex string\");\n }\n // agent-wallet strips the `0x` prefix; strip-then-prefix is robust either way.\n const serializedTransaction = `0x${signed.replace(/^0x/, \"\")}` as `0x${string}`;\n return client.sendRawTransaction({ serializedTransaction });\n }\n\n const base = toFacilitatorEvmSigner({\n address,\n // Issue every read as the facilitator EOA (sets the eth_call `from`). View\n // calls ignore the caller, but caller-authorized simulations need it — the\n // upto proxy `settle` reverts with `UnauthorizedFacilitator` unless\n // `msg.sender` is the witness-bound facilitator (= this single-key wallet).\n // `...args` last so an explicit per-call `account` (if upstream ever adds one)\n // overrides this default.\n readContract: args => client.readContract({ account: address, ...args }),\n verifyTypedData: args => client.verifyTypedData(args),\n getCode: args => client.getCode(args),\n waitForTransactionReceipt: args => client.waitForTransactionReceipt(args),\n writeContract: args => {\n const data = appendDataSuffix(\n encodeFunctionData({\n abi: args.abi as Abi,\n functionName: args.functionName,\n args: args.args,\n }),\n args.dataSuffix,\n );\n return buildSignBroadcast(args.address, data, args.gas);\n },\n sendTransaction: args => buildSignBroadcast(args.to, args.data),\n });\n\n // Batch broadcast for the ERC-20 approval gas-sponsoring extension: the\n // client's pre-signed `approve` (a serialized tx) is broadcast as-is; the\n // `settle` call intent is signed by the facilitator wallet and broadcast.\n return {\n ...base,\n async sendTransactions(transactions) {\n const hashes: `0x${string}`[] = [];\n for (const tx of transactions) {\n if (typeof tx === \"string\") {\n const serializedTransaction = `0x${tx.replace(/^0x/, \"\")}` as `0x${string}`;\n hashes.push(await client.sendRawTransaction({ serializedTransaction }));\n } else {\n hashes.push(await buildSignBroadcast(tx.to, tx.data, tx.gas));\n }\n }\n return hashes;\n },\n };\n}\n","import type { Log } from \"viem\";\n\n/**\n * ClientEvmSigner - Used by x402 clients to sign payment authorizations.\n *\n * Typically a viem WalletClient extended with publicActions:\n * ```typescript\n * const client = createWalletClient({\n * account: privateKeyToAccount('0x...'),\n * chain: baseSepolia,\n * transport: http(),\n * }).extend(publicActions);\n * ```\n *\n * Or composed via `toClientEvmSigner(account, publicClient)`.\n */\nexport type ClientEvmSigner = {\n readonly address: `0x${string}`;\n signTypedData(message: {\n domain: Record<string, unknown>;\n types: Record<string, unknown>;\n primaryType: string;\n message: Record<string, unknown>;\n }): Promise<`0x${string}`>;\n /**\n * Optional on-chain reads.\n * Required only for extension enrichment (EIP-2612 / ERC-20 approval).\n */\n readContract?(args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n }): Promise<unknown>;\n /**\n * Optional: Signs a raw EIP-1559 transaction without broadcasting.\n * Required for ERC-20 approval gas sponsoring when the token lacks EIP-2612.\n */\n signTransaction?(args: {\n to: `0x${string}`;\n data: `0x${string}`;\n nonce: number;\n gas: bigint;\n maxFeePerGas: bigint;\n maxPriorityFeePerGas: bigint;\n chainId: number;\n }): Promise<`0x${string}`>;\n /**\n * Optional: Gets the current transaction count (nonce) for an address.\n * Required for ERC-20 approval gas sponsoring.\n */\n getTransactionCount?(args: { address: `0x${string}` }): Promise<number>;\n /**\n * Optional: Estimates current gas fees per gas.\n * Required for ERC-20 approval gas sponsoring.\n */\n estimateFeesPerGas?(): Promise<{ maxFeePerGas: bigint; maxPriorityFeePerGas: bigint }>;\n};\n\n/**\n * FacilitatorEvmSigner - Used by x402 facilitators to verify and settle payments\n * This is typically a viem PublicClient + WalletClient combination that can\n * read contract state, verify signatures, write transactions, and wait for receipts\n *\n * Supports multiple addresses for load balancing, key rotation, and high availability\n */\nexport type FacilitatorEvmSigner = {\n /**\n * Get all addresses this facilitator can use for signing\n * Enables dynamic address selection for load balancing and key rotation\n */\n getAddresses(): readonly `0x${string}`[];\n\n readContract(args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n }): Promise<unknown>;\n verifyTypedData(args: {\n address: `0x${string}`;\n domain: Record<string, unknown>;\n types: Record<string, unknown>;\n primaryType: string;\n message: Record<string, unknown>;\n signature: `0x${string}`;\n }): Promise<boolean>;\n writeContract(args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args: readonly unknown[];\n gas?: bigint;\n dataSuffix?: `0x${string}`;\n }): Promise<`0x${string}`>;\n sendTransaction(args: { to: `0x${string}`; data: `0x${string}` }): Promise<`0x${string}`>;\n waitForTransactionReceipt(args: { hash: `0x${string}` }): Promise<{\n status: string;\n logs?: readonly Log[];\n }>;\n getCode(args: { address: `0x${string}` }): Promise<`0x${string}` | undefined>;\n};\n\n/**\n * Composes a ClientEvmSigner from a local account and a public client.\n *\n * Use this when your signer (e.g., `privateKeyToAccount`) doesn't have\n * `readContract`. The `publicClient` provides the on-chain read capability.\n *\n * Alternatively, use a WalletClient extended with publicActions directly:\n * ```typescript\n * const signer = createWalletClient({\n * account: privateKeyToAccount('0x...'),\n * chain: baseSepolia,\n * transport: http(),\n * }).extend(publicActions);\n * ```\n *\n * @param signer - A signer with `address` and `signTypedData` (and optionally `readContract`)\n * @param publicClient - A client with optional read/nonce/fee helpers\n * @param publicClient.readContract - The readContract method from the public client\n * @param publicClient.getTransactionCount - Optional getTransactionCount for ERC-20 approval\n * @param publicClient.estimateFeesPerGas - Optional estimateFeesPerGas for ERC-20 approval\n * @returns A ClientEvmSigner with any available optional capabilities\n *\n * @example\n * ```typescript\n * const account = privateKeyToAccount(\"0x...\");\n * const publicClient = createPublicClient({ chain: baseSepolia, transport: http() });\n * const signer = toClientEvmSigner(account, publicClient);\n * ```\n */\nexport function toClientEvmSigner(\n signer: Omit<ClientEvmSigner, \"readContract\"> & {\n readContract?: ClientEvmSigner[\"readContract\"];\n },\n publicClient?: {\n readContract(args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n }): Promise<unknown>;\n getTransactionCount?(args: { address: `0x${string}` }): Promise<number>;\n estimateFeesPerGas?(): Promise<{ maxFeePerGas: bigint; maxPriorityFeePerGas: bigint }>;\n },\n): ClientEvmSigner {\n const readContract = signer.readContract ?? publicClient?.readContract.bind(publicClient);\n\n const result: ClientEvmSigner = {\n address: signer.address,\n signTypedData: msg => signer.signTypedData(msg),\n };\n\n if (readContract) {\n result.readContract = readContract;\n }\n\n // Forward optional capabilities from signer or publicClient\n const signTransaction = signer.signTransaction;\n if (signTransaction) {\n result.signTransaction = args => signTransaction(args);\n }\n\n const getTransactionCount =\n signer.getTransactionCount ?? publicClient?.getTransactionCount?.bind(publicClient);\n if (getTransactionCount) {\n result.getTransactionCount = args => getTransactionCount(args);\n }\n\n const estimateFeesPerGas =\n signer.estimateFeesPerGas ?? publicClient?.estimateFeesPerGas?.bind(publicClient);\n if (estimateFeesPerGas) {\n result.estimateFeesPerGas = () => estimateFeesPerGas();\n }\n\n return result;\n}\n\n/**\n * Converts a viem client with single address to a FacilitatorEvmSigner\n * Wraps the single address in a getAddresses() function for compatibility\n *\n * @param client - The client to convert (must have 'address' property)\n * @returns FacilitatorEvmSigner with getAddresses() support\n */\nexport function toFacilitatorEvmSigner(\n client: Omit<FacilitatorEvmSigner, \"getAddresses\"> & { address: `0x${string}` },\n): FacilitatorEvmSigner {\n return {\n ...client,\n getAddresses: () => [client.address],\n };\n}\n","/**\n * Adaptation layer — CAIP-2 → viem client resolution.\n *\n * Centralizes the `eip155:<chainId>` → viem `Chain` → `PublicClient` construction\n * that callers previously hand-wired (importing a viem chain + `createPublicClient`\n * in every example). Known chains are resolved by id; an unknown chain is allowed\n * when an `rpcUrl` is supplied (built via `defineChain`). Adding a common chain is\n * one entry in `KNOWN_CHAINS`.\n */\nimport { createPublicClient, defineChain, http, type Chain, type PublicClient } from \"viem\";\nimport { base, baseSepolia, bsc, bscTestnet, mainnet, sepolia } from \"viem/chains\";\n\nimport { getEvmChainId } from \"../utils\";\n\n/** Common chains resolved by chain id (extend as needed). */\nconst KNOWN_CHAINS: Record<number, Chain> = {\n [mainnet.id]: mainnet,\n [sepolia.id]: sepolia,\n [base.id]: base,\n [baseSepolia.id]: baseSepolia,\n [bsc.id]: bsc,\n [bscTestnet.id]: bscTestnet,\n};\n\n/**\n * Resolves a viem `Chain` for a CAIP-2 network. Known chains are returned\n * directly; an unknown chain requires `rpcUrl` and is built via `defineChain`.\n *\n * @param network - CAIP-2 id, e.g. `\"eip155:8453\"`.\n * @param rpcUrl - Optional RPC URL (required for chains not in `KNOWN_CHAINS`).\n * @returns The resolved viem chain.\n */\nexport function resolveEvmChain(network: string, rpcUrl?: string): Chain {\n const chainId = getEvmChainId(network);\n const known = KNOWN_CHAINS[chainId];\n if (known) {\n return known;\n }\n if (!rpcUrl) {\n throw new Error(\n `Unknown EVM chain ${network}: not in KNOWN_CHAINS. Pass rpcUrl to use a custom chain.`,\n );\n }\n return defineChain({\n id: chainId,\n name: network,\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: { default: { http: [rpcUrl] } },\n });\n}\n\n/**\n * Builds a key-less viem `PublicClient` for a CAIP-2 network (reads + broadcast).\n *\n * @param network - CAIP-2 id, e.g. `\"eip155:97\"`.\n * @param rpcUrl - Optional RPC URL override; falls back to the chain's default.\n * @returns A viem public client.\n */\nexport function createEvmPublicClient(network: string, rpcUrl?: string): PublicClient {\n const chain = resolveEvmChain(network, rpcUrl);\n return createPublicClient({ chain, transport: http(rpcUrl) });\n}\n","import { toHex } from \"viem\";\n\n/**\n * Extract chain ID from a CAIP-2 network identifier (eip155:CHAIN_ID).\n *\n * @param network - The network identifier in CAIP-2 format (e.g., \"eip155:8453\")\n * @returns The numeric chain ID\n * @throws Error if the network format is invalid\n */\nexport function getEvmChainId(network: string): number {\n if (network.startsWith(\"eip155:\")) {\n const idStr = network.split(\":\")[1];\n const chainId = parseInt(idStr, 10);\n if (isNaN(chainId)) {\n throw new Error(`Invalid CAIP-2 chain ID: ${network}`);\n }\n return chainId;\n }\n\n throw new Error(`Unsupported network format: ${network} (expected eip155:CHAIN_ID)`);\n}\n\n/**\n * Get the crypto object from the global scope.\n *\n * @returns The crypto object\n * @throws Error if crypto API is not available\n */\nfunction getCrypto(): Crypto {\n const cryptoObj = globalThis.crypto as Crypto | undefined;\n if (!cryptoObj) {\n throw new Error(\"Crypto API not available\");\n }\n return cryptoObj;\n}\n\n/**\n * Create a random 32-byte nonce for EIP-3009 authorization.\n *\n * @returns A hex-encoded 32-byte nonce\n */\nexport function createNonce(): `0x${string}` {\n return toHex(getCrypto().getRandomValues(new Uint8Array(32)));\n}\n\n/**\n * Creates a random 256-bit nonce for Permit2.\n * Permit2 uses uint256 nonces (not bytes32 like EIP-3009).\n *\n * @returns A string representation of the random nonce\n */\nexport function createPermit2Nonce(): string {\n const randomBytes = getCrypto().getRandomValues(new Uint8Array(32));\n return BigInt(toHex(randomBytes)).toString();\n}\n"],"mappings":"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","names":["import_viem","import_viem","base"]}
@@ -508,7 +508,7 @@ async function createBatchSettlementEIP3009DepositPayload(signer, x402Version, p
508
508
  from: (0, import_viem9.getAddress)(signer.address),
509
509
  to: (0, import_viem9.getAddress)(ERC3009_DEPOSIT_COLLECTOR_ADDRESS),
510
510
  value: BigInt(depositAmount),
511
- validAfter: BigInt(0),
511
+ validAfter: BigInt(now - 600),
512
512
  validBefore: BigInt(now + paymentRequirements.maxTimeoutSeconds),
513
513
  nonce: erc3009Nonce
514
514
  }
@@ -528,7 +528,7 @@ async function createBatchSettlementEIP3009DepositPayload(signer, x402Version, p
528
528
  amount: depositAmount,
529
529
  authorization: {
530
530
  erc3009Authorization: {
531
- validAfter: "0",
531
+ validAfter: (now - 600).toString(),
532
532
  validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),
533
533
  salt,
534
534
  signature