@bankofai/x402-evm 1.0.0-beta.2 → 1.0.0-beta.4

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.
@@ -109,6 +109,7 @@ function createEvmPublicClient(network, rpcUrl) {
109
109
  }
110
110
 
111
111
  // src/adapters/agent-wallet.ts
112
+ var import_x402_core = require("@bankofai/x402-core");
112
113
  async function createClientEvmSigner(wallet, opts) {
113
114
  const address = await wallet.getAddress();
114
115
  const publicClient = createEvmPublicClient(opts.network, opts.rpcUrl);
@@ -184,7 +185,18 @@ async function createFacilitatorEvmSigner(wallet, opts) {
184
185
  throw new Error("EVM facilitator signTransaction must return a serialized hex string");
185
186
  }
186
187
  const serializedTransaction = `0x${signed.replace(/^0x/, "")}`;
187
- return client.sendRawTransaction({ serializedTransaction });
188
+ import_x402_core.log.debug("x402 evm: broadcast start", { to, chainId, nonce });
189
+ try {
190
+ const hash = await client.sendRawTransaction({ serializedTransaction });
191
+ import_x402_core.log.info("x402 evm: broadcast ok", { to, hash });
192
+ return hash;
193
+ } catch (error) {
194
+ import_x402_core.log.error("x402 evm: broadcast failed", {
195
+ to,
196
+ error: error instanceof Error ? error.message : String(error)
197
+ });
198
+ throw error;
199
+ }
188
200
  }
189
201
  const base2 = toFacilitatorEvmSigner({
190
202
  address,
@@ -197,7 +209,14 @@ async function createFacilitatorEvmSigner(wallet, opts) {
197
209
  readContract: (args) => client.readContract({ account: address, ...args }),
198
210
  verifyTypedData: (args) => client.verifyTypedData(args),
199
211
  getCode: (args) => client.getCode(args),
200
- waitForTransactionReceipt: (args) => client.waitForTransactionReceipt(args),
212
+ waitForTransactionReceipt: async (args) => {
213
+ const receipt = await client.waitForTransactionReceipt(args);
214
+ import_x402_core.log[receipt.status === "success" ? "info" : "warn"]("x402 evm: tx receipt", {
215
+ hash: args.hash,
216
+ status: receipt.status
217
+ });
218
+ return receipt;
219
+ },
201
220
  writeContract: (args) => {
202
221
  const data = appendDataSuffix(
203
222
  (0, import_viem3.encodeFunctionData)({
@@ -218,7 +237,9 @@ async function createFacilitatorEvmSigner(wallet, opts) {
218
237
  for (const tx of transactions) {
219
238
  if (typeof tx === "string") {
220
239
  const serializedTransaction = `0x${tx.replace(/^0x/, "")}`;
221
- hashes.push(await client.sendRawTransaction({ serializedTransaction }));
240
+ const hash = await client.sendRawTransaction({ serializedTransaction });
241
+ import_x402_core.log.info("x402 evm: pre-signed tx broadcast ok", { hash });
242
+ hashes.push(hash);
222
243
  } else {
223
244
  hashes.push(await buildSignBroadcast(tx.to, tx.data, tx.gas));
224
245
  }
@@ -1 +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"]}
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\";\nimport { log } from \"@bankofai/x402-core\";\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(\n wallet: ClientWallet,\n): 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 log.debug(\"x402 evm: broadcast start\", { to, chainId, nonce });\n try {\n const hash = await client.sendRawTransaction({ serializedTransaction });\n log.info(\"x402 evm: broadcast ok\", { to, hash });\n return hash;\n } catch (error) {\n log.error(\"x402 evm: broadcast failed\", {\n to,\n error: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\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: async args => {\n const receipt = await client.waitForTransactionReceipt(args);\n log[receipt.status === \"success\" ? \"info\" : \"warn\"](\"x402 evm: tx receipt\", {\n hash: args.hash,\n status: receipt.status,\n });\n return receipt;\n },\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 const hash = await client.sendRawTransaction({ serializedTransaction });\n log.info(\"x402 evm: pre-signed tx broadcast ok\", { hash });\n hashes.push(hash);\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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBA,IAAAA,eAAuD;;;ACiHhD,SAAS,kBACd,QAGA,cAUiB;AACjB,QAAM,eAAe,OAAO,gBAAgB,cAAc,aAAa,KAAK,YAAY;AAExF,QAAM,SAA0B;AAAA,IAC9B,SAAS,OAAO;AAAA,IAChB,eAAe,SAAO,OAAO,cAAc,GAAG;AAAA,EAChD;AAEA,MAAI,cAAc;AAChB,WAAO,eAAe;AAAA,EACxB;AAGA,QAAM,kBAAkB,OAAO;AAC/B,MAAI,iBAAiB;AACnB,WAAO,kBAAkB,UAAQ,gBAAgB,IAAI;AAAA,EACvD;AAEA,QAAM,sBACJ,OAAO,uBAAuB,cAAc,qBAAqB,KAAK,YAAY;AACpF,MAAI,qBAAqB;AACvB,WAAO,sBAAsB,UAAQ,oBAAoB,IAAI;AAAA,EAC/D;AAEA,QAAM,qBACJ,OAAO,sBAAsB,cAAc,oBAAoB,KAAK,YAAY;AAClF,MAAI,oBAAoB;AACtB,WAAO,qBAAqB,MAAM,mBAAmB;AAAA,EACvD;AAEA,SAAO;AACT;AASO,SAAS,uBACd,QACsB;AACtB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc,MAAM,CAAC,OAAO,OAAO;AAAA,EACrC;AACF;;;ACxLA,IAAAC,eAAqF;AACrF,oBAAqE;;;ACVrE,kBAAsB;AASf,SAAS,cAAc,SAAyB;AACrD,MAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,UAAM,QAAQ,QAAQ,MAAM,GAAG,EAAE,CAAC;AAClC,UAAM,UAAU,SAAS,OAAO,EAAE;AAClC,QAAI,MAAM,OAAO,GAAG;AAClB,YAAM,IAAI,MAAM,4BAA4B,OAAO,EAAE;AAAA,IACvD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,+BAA+B,OAAO,6BAA6B;AACrF;;;ADLA,IAAM,eAAsC;AAAA,EAC1C,CAAC,sBAAQ,EAAE,GAAG;AAAA,EACd,CAAC,sBAAQ,EAAE,GAAG;AAAA,EACd,CAAC,mBAAK,EAAE,GAAG;AAAA,EACX,CAAC,0BAAY,EAAE,GAAG;AAAA,EAClB,CAAC,kBAAI,EAAE,GAAG;AAAA,EACV,CAAC,yBAAW,EAAE,GAAG;AACnB;AAUO,SAAS,gBAAgB,SAAiB,QAAwB;AACvE,QAAM,UAAU,cAAc,OAAO;AACrC,QAAM,QAAQ,aAAa,OAAO;AAClC,MAAI,OAAO;AACT,WAAO;AAAA,EACT;AACA,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR,qBAAqB,OAAO;AAAA,IAC9B;AAAA,EACF;AACA,aAAO,0BAAY;AAAA,IACjB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,gBAAgB,EAAE,MAAM,SAAS,QAAQ,OAAO,UAAU,GAAG;AAAA,IAC7D,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE;AAAA,EACzC,CAAC;AACH;AASO,SAAS,sBAAsB,SAAiB,QAA+B;AACpF,QAAM,QAAQ,gBAAgB,SAAS,MAAM;AAC7C,aAAO,iCAAmB,EAAE,OAAO,eAAW,mBAAK,MAAM,EAAE,CAAC;AAC9D;;;AF/BA,uBAAoB;AAkCpB,eAAsB,sBACpB,QACA,MAC0B;AAC1B,QAAM,UAAW,MAAM,OAAO,WAAW;AACzC,QAAM,eAAe,sBAAsB,KAAK,SAAS,KAAK,MAAM;AAKpE,QAAM,kBAAkB,OAAO,iBAAiB,KAAK,MAAM;AAE3D,SAAO;AAAA,IACL;AAAA,MACE;AAAA;AAAA,MAEA,eAAe,OAAM,QAAO;AAC1B,cAAM,MAAM,MAAM,OAAO,cAAc,GAAG;AAC1C,eAAO,KAAK,IAAI,QAAQ,OAAO,EAAE,CAAC;AAAA,MACpC;AAAA;AAAA;AAAA,MAGA,GAAI,kBACA;AAAA,QACE,iBAAiB,OAAO,SAAkC;AACxD,gBAAM,SAAS,MAAM,gBAAgB,IAAI;AACzC,cAAI,OAAO,WAAW,UAAU;AAC9B,kBAAM,IAAI,MAAM,yDAAyD;AAAA,UAC3E;AACA,iBAAO,KAAK,OAAO,QAAQ,OAAO,EAAE,CAAC;AAAA,QACvC;AAAA,MACF,IACA,CAAC;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACF;AAgBA,eAAsB,0BACpB,QAC8B;AAC9B,QAAM,UAAW,MAAM,OAAO,WAAW;AACzC,SAAO;AAAA,IACL;AAAA;AAAA,IAEA,eAAe,OAAM,QAAO;AAC1B,YAAM,MAAM,MAAM,OAAO,cAAc,GAAG;AAC1C,aAAO,KAAK,IAAI,QAAQ,OAAO,EAAE,CAAC;AAAA,IACpC;AAAA,EACF;AACF;AAoGA,SAAS,iBAAiB,MAAqB,QAAuC;AACpF,MAAI,CAAC,UAAU,WAAW,MAAM;AAC9B,WAAO;AAAA,EACT;AACA,SAAO,GAAG,IAAI,GAAG,OAAO,MAAM,CAAC,CAAC;AAClC;AAmBA,eAAsB,2BACpB,QACA,MAC4C;AAC5C,QAAM,UAAW,MAAM,OAAO,WAAW;AAGzC,QAAM,SAAS;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AAGA,iBAAe,mBACb,IACA,MACA,aACwB;AACxB,UAAM,QAAQ;AACd,UAAM,CAAC,SAAS,OAAO,IAAI,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC/C,OAAO,WAAW;AAAA;AAAA;AAAA;AAAA,MAIlB,OAAO,oBAAoB,EAAE,SAAS,UAAU,UAAU,CAAC;AAAA,MAC3D,OAAO,mBAAmB;AAAA,IAC5B,CAAC;AACD,UAAM,MACJ,eACA,KAAK,cACJ,MAAM,OAAO,YAAY,EAAE,SAAS,SAAS,IAAI,MAAM,MAAM,CAAC;AAEjE,UAAM,SAAS,MAAM,OAAO,gBAAgB;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,KAAK;AAAA,MACnB,sBAAsB,KAAK;AAAA,MAC3B;AAAA,IACF,CAAC;AACD,QAAI,OAAO,WAAW,UAAU;AAC9B,YAAM,IAAI,MAAM,qEAAqE;AAAA,IACvF;AAEA,UAAM,wBAAwB,KAAK,OAAO,QAAQ,OAAO,EAAE,CAAC;AAC5D,yBAAI,MAAM,6BAA6B,EAAE,IAAI,SAAS,MAAM,CAAC;AAC7D,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,mBAAmB,EAAE,sBAAsB,CAAC;AACtE,2BAAI,KAAK,0BAA0B,EAAE,IAAI,KAAK,CAAC;AAC/C,aAAO;AAAA,IACT,SAAS,OAAO;AACd,2BAAI,MAAM,8BAA8B;AAAA,QACtC;AAAA,QACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAMC,QAAO,uBAAuB;AAAA,IAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,cAAc,UAAQ,OAAO,aAAa,EAAE,SAAS,SAAS,GAAG,KAAK,CAAC;AAAA,IACvE,iBAAiB,UAAQ,OAAO,gBAAgB,IAAI;AAAA,IACpD,SAAS,UAAQ,OAAO,QAAQ,IAAI;AAAA,IACpC,2BAA2B,OAAM,SAAQ;AACvC,YAAM,UAAU,MAAM,OAAO,0BAA0B,IAAI;AAC3D,2BAAI,QAAQ,WAAW,YAAY,SAAS,MAAM,EAAE,wBAAwB;AAAA,QAC1E,MAAM,KAAK;AAAA,QACX,QAAQ,QAAQ;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACT;AAAA,IACA,eAAe,UAAQ;AACrB,YAAM,OAAO;AAAA,YACX,iCAAmB;AAAA,UACjB,KAAK,KAAK;AAAA,UACV,cAAc,KAAK;AAAA,UACnB,MAAM,KAAK;AAAA,QACb,CAAC;AAAA,QACD,KAAK;AAAA,MACP;AACA,aAAO,mBAAmB,KAAK,SAAS,MAAM,KAAK,GAAG;AAAA,IACxD;AAAA,IACA,iBAAiB,UAAQ,mBAAmB,KAAK,IAAI,KAAK,IAAI;AAAA,EAChE,CAAC;AAKD,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,MAAM,iBAAiB,cAAc;AACnC,YAAM,SAA0B,CAAC;AACjC,iBAAW,MAAM,cAAc;AAC7B,YAAI,OAAO,OAAO,UAAU;AAC1B,gBAAM,wBAAwB,KAAK,GAAG,QAAQ,OAAO,EAAE,CAAC;AACxD,gBAAM,OAAO,MAAM,OAAO,mBAAmB,EAAE,sBAAsB,CAAC;AACtE,+BAAI,KAAK,wCAAwC,EAAE,KAAK,CAAC;AACzD,iBAAO,KAAK,IAAI;AAAA,QAClB,OAAO;AACL,iBAAO,KAAK,MAAM,mBAAmB,GAAG,IAAI,GAAG,MAAM,GAAG,GAAG,CAAC;AAAA,QAC9D;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;","names":["import_viem","import_viem","base"]}