@bankofai/x402-evm 1.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +172 -0
- package/dist/cjs/auth-capture/client/index.d.ts +44 -0
- package/dist/cjs/auth-capture/client/index.js +298 -0
- package/dist/cjs/auth-capture/client/index.js.map +1 -0
- package/dist/cjs/batch-settlement/client/file-storage.d.ts +47 -0
- package/dist/cjs/batch-settlement/client/file-storage.js +116 -0
- package/dist/cjs/batch-settlement/client/file-storage.js.map +1 -0
- package/dist/cjs/batch-settlement/client/index.d.ts +111 -0
- package/dist/cjs/batch-settlement/client/index.js +1565 -0
- package/dist/cjs/batch-settlement/client/index.js.map +1 -0
- package/dist/cjs/batch-settlement/facilitator/index.d.ts +72 -0
- package/dist/cjs/batch-settlement/facilitator/index.js +2102 -0
- package/dist/cjs/batch-settlement/facilitator/index.js.map +1 -0
- package/dist/cjs/batch-settlement/server/file-storage.d.ts +53 -0
- package/dist/cjs/batch-settlement/server/file-storage.js +181 -0
- package/dist/cjs/batch-settlement/server/file-storage.js.map +1 -0
- package/dist/cjs/batch-settlement/server/index.d.ts +491 -0
- package/dist/cjs/batch-settlement/server/index.js +1978 -0
- package/dist/cjs/batch-settlement/server/index.js.map +1 -0
- package/dist/cjs/batch-settlement/server/redis-storage.d.ts +87 -0
- package/dist/cjs/batch-settlement/server/redis-storage.js +181 -0
- package/dist/cjs/batch-settlement/server/redis-storage.js.map +1 -0
- package/dist/cjs/client/agent-wallet.d.ts +69 -0
- package/dist/cjs/client/agent-wallet.js +84 -0
- package/dist/cjs/client/agent-wallet.js.map +1 -0
- package/dist/cjs/exact/client/index.d.ts +63 -0
- package/dist/cjs/exact/client/index.js +739 -0
- package/dist/cjs/exact/client/index.js.map +1 -0
- package/dist/cjs/exact/facilitator/index.d.ts +141 -0
- package/dist/cjs/exact/facilitator/index.js +1989 -0
- package/dist/cjs/exact/facilitator/index.js.map +1 -0
- package/dist/cjs/exact/server/index.d.ts +118 -0
- package/dist/cjs/exact/server/index.js +326 -0
- package/dist/cjs/exact/server/index.js.map +1 -0
- package/dist/cjs/exact/v1/client/index.d.ts +38 -0
- package/dist/cjs/exact/v1/client/index.js +193 -0
- package/dist/cjs/exact/v1/client/index.js.map +1 -0
- package/dist/cjs/exact/v1/facilitator/index.d.ts +84 -0
- package/dist/cjs/exact/v1/facilitator/index.js +739 -0
- package/dist/cjs/exact/v1/facilitator/index.js.map +1 -0
- package/dist/cjs/facilitator/agent-wallet.d.ts +109 -0
- package/dist/cjs/facilitator/agent-wallet.js +105 -0
- package/dist/cjs/facilitator/agent-wallet.js.map +1 -0
- package/dist/cjs/index.d.ts +338 -0
- package/dist/cjs/index.js +2860 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/permit2-DK5A8alk.d.ts +729 -0
- package/dist/cjs/permit2-DhJRUcgY.d.ts +729 -0
- package/dist/cjs/rpc-DULZzRne.d.ts +13 -0
- package/dist/cjs/scheme-7ehldYoO.d.ts +307 -0
- package/dist/cjs/scheme-BjBJzHF7.d.ts +307 -0
- package/dist/cjs/scheme-DWgpkDgz.d.ts +47 -0
- package/dist/cjs/signer-BFelv8DL.d.ts +170 -0
- package/dist/cjs/storage-6W5MO46W.d.ts +50 -0
- package/dist/cjs/storage-CHNote8s.d.ts +81 -0
- package/dist/cjs/storage-DjCv5IPh.d.ts +81 -0
- package/dist/cjs/types-CKd3Xoi1.d.ts +180 -0
- package/dist/cjs/types-DIt9uAUy.d.ts +180 -0
- package/dist/cjs/upto/client/index.d.ts +34 -0
- package/dist/cjs/upto/client/index.js +509 -0
- package/dist/cjs/upto/client/index.js.map +1 -0
- package/dist/cjs/upto/facilitator/index.d.ts +54 -0
- package/dist/cjs/upto/facilitator/index.js +1313 -0
- package/dist/cjs/upto/facilitator/index.js.map +1 -0
- package/dist/cjs/upto/server/index.d.ts +69 -0
- package/dist/cjs/upto/server/index.js +296 -0
- package/dist/cjs/upto/server/index.js.map +1 -0
- package/dist/cjs/v1/index.d.ts +40 -0
- package/dist/cjs/v1/index.js +199 -0
- package/dist/cjs/v1/index.js.map +1 -0
- package/dist/esm/auth-capture/client/index.d.mts +44 -0
- package/dist/esm/auth-capture/client/index.mjs +8 -0
- package/dist/esm/auth-capture/client/index.mjs.map +1 -0
- package/dist/esm/batch-settlement/client/file-storage.d.mts +47 -0
- package/dist/esm/batch-settlement/client/file-storage.mjs +63 -0
- package/dist/esm/batch-settlement/client/file-storage.mjs.map +1 -0
- package/dist/esm/batch-settlement/client/index.d.mts +111 -0
- package/dist/esm/batch-settlement/client/index.mjs +58 -0
- package/dist/esm/batch-settlement/client/index.mjs.map +1 -0
- package/dist/esm/batch-settlement/facilitator/index.d.mts +72 -0
- package/dist/esm/batch-settlement/facilitator/index.mjs +1252 -0
- package/dist/esm/batch-settlement/facilitator/index.mjs.map +1 -0
- package/dist/esm/batch-settlement/server/file-storage.d.mts +53 -0
- package/dist/esm/batch-settlement/server/file-storage.mjs +128 -0
- package/dist/esm/batch-settlement/server/file-storage.mjs.map +1 -0
- package/dist/esm/batch-settlement/server/index.d.mts +491 -0
- package/dist/esm/batch-settlement/server/index.mjs +1640 -0
- package/dist/esm/batch-settlement/server/index.mjs.map +1 -0
- package/dist/esm/batch-settlement/server/redis-storage.d.mts +87 -0
- package/dist/esm/batch-settlement/server/redis-storage.mjs +156 -0
- package/dist/esm/batch-settlement/server/redis-storage.mjs.map +1 -0
- package/dist/esm/chunk-2EUQTNJO.mjs +38 -0
- package/dist/esm/chunk-2EUQTNJO.mjs.map +1 -0
- package/dist/esm/chunk-3WZF6722.mjs +36 -0
- package/dist/esm/chunk-3WZF6722.mjs.map +1 -0
- package/dist/esm/chunk-E4Z7PNXC.mjs +275 -0
- package/dist/esm/chunk-E4Z7PNXC.mjs.map +1 -0
- package/dist/esm/chunk-GQVMVP4N.mjs +911 -0
- package/dist/esm/chunk-GQVMVP4N.mjs.map +1 -0
- package/dist/esm/chunk-H2EYJIZL.mjs +489 -0
- package/dist/esm/chunk-H2EYJIZL.mjs.map +1 -0
- package/dist/esm/chunk-H3KPLYGI.mjs +152 -0
- package/dist/esm/chunk-H3KPLYGI.mjs.map +1 -0
- package/dist/esm/chunk-HYABYUBD.mjs +432 -0
- package/dist/esm/chunk-HYABYUBD.mjs.map +1 -0
- package/dist/esm/chunk-I2DVUHM5.mjs +123 -0
- package/dist/esm/chunk-I2DVUHM5.mjs.map +1 -0
- package/dist/esm/chunk-JK7SLLF7.mjs +34 -0
- package/dist/esm/chunk-JK7SLLF7.mjs.map +1 -0
- package/dist/esm/chunk-JNT7C46S.mjs +352 -0
- package/dist/esm/chunk-JNT7C46S.mjs.map +1 -0
- package/dist/esm/chunk-MACPBXCT.mjs +415 -0
- package/dist/esm/chunk-MACPBXCT.mjs.map +1 -0
- package/dist/esm/chunk-P3QOX3QZ.mjs +113 -0
- package/dist/esm/chunk-P3QOX3QZ.mjs.map +1 -0
- package/dist/esm/chunk-QVATVA3J.mjs +47 -0
- package/dist/esm/chunk-QVATVA3J.mjs.map +1 -0
- package/dist/esm/chunk-SHJFA25H.mjs +159 -0
- package/dist/esm/chunk-SHJFA25H.mjs.map +1 -0
- package/dist/esm/chunk-TW7Z65AO.mjs +34 -0
- package/dist/esm/chunk-TW7Z65AO.mjs.map +1 -0
- package/dist/esm/chunk-U4HCGTLU.mjs +35 -0
- package/dist/esm/chunk-U4HCGTLU.mjs.map +1 -0
- package/dist/esm/chunk-VS3RYAYE.mjs +80 -0
- package/dist/esm/chunk-VS3RYAYE.mjs.map +1 -0
- package/dist/esm/chunk-W6ON4LG2.mjs +39 -0
- package/dist/esm/chunk-W6ON4LG2.mjs.map +1 -0
- package/dist/esm/chunk-XG2JLZVJ.mjs +627 -0
- package/dist/esm/chunk-XG2JLZVJ.mjs.map +1 -0
- package/dist/esm/chunk-ZCJRY5LQ.mjs +162 -0
- package/dist/esm/chunk-ZCJRY5LQ.mjs.map +1 -0
- package/dist/esm/client/agent-wallet.d.mts +69 -0
- package/dist/esm/client/agent-wallet.mjs +36 -0
- package/dist/esm/client/agent-wallet.mjs.map +1 -0
- package/dist/esm/exact/client/index.d.mts +63 -0
- package/dist/esm/exact/client/index.mjs +25 -0
- package/dist/esm/exact/client/index.mjs.map +1 -0
- package/dist/esm/exact/facilitator/index.d.mts +141 -0
- package/dist/esm/exact/facilitator/index.mjs +694 -0
- package/dist/esm/exact/facilitator/index.mjs.map +1 -0
- package/dist/esm/exact/server/index.d.mts +118 -0
- package/dist/esm/exact/server/index.mjs +153 -0
- package/dist/esm/exact/server/index.mjs.map +1 -0
- package/dist/esm/exact/v1/client/index.d.mts +38 -0
- package/dist/esm/exact/v1/client/index.mjs +12 -0
- package/dist/esm/exact/v1/client/index.mjs.map +1 -0
- package/dist/esm/exact/v1/facilitator/index.d.mts +84 -0
- package/dist/esm/exact/v1/facilitator/index.mjs +12 -0
- package/dist/esm/exact/v1/facilitator/index.mjs.map +1 -0
- package/dist/esm/facilitator/agent-wallet.d.mts +109 -0
- package/dist/esm/facilitator/agent-wallet.mjs +74 -0
- package/dist/esm/facilitator/agent-wallet.mjs.map +1 -0
- package/dist/esm/index.d.mts +338 -0
- package/dist/esm/index.mjs +144 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/permit2-DhJRUcgY.d.mts +729 -0
- package/dist/esm/rpc-DULZzRne.d.mts +13 -0
- package/dist/esm/scheme-CkNhpXrG.d.mts +307 -0
- package/dist/esm/scheme-D8ZbykGV.d.mts +47 -0
- package/dist/esm/signer-BFelv8DL.d.mts +170 -0
- package/dist/esm/storage-6W5MO46W.d.mts +50 -0
- package/dist/esm/storage-BEzTEiUr.d.mts +81 -0
- package/dist/esm/types-DIt9uAUy.d.mts +180 -0
- package/dist/esm/upto/client/index.d.mts +34 -0
- package/dist/esm/upto/client/index.mjs +22 -0
- package/dist/esm/upto/client/index.mjs.map +1 -0
- package/dist/esm/upto/facilitator/index.d.mts +54 -0
- package/dist/esm/upto/facilitator/index.mjs +507 -0
- package/dist/esm/upto/facilitator/index.mjs.map +1 -0
- package/dist/esm/upto/server/index.d.mts +69 -0
- package/dist/esm/upto/server/index.mjs +124 -0
- package/dist/esm/upto/server/index.mjs.map +1 -0
- package/dist/esm/v1/index.d.mts +40 -0
- package/dist/esm/v1/index.mjs +18 -0
- package/dist/esm/v1/index.mjs.map +1 -0
- package/package.json +250 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/exact/v1/client/scheme.ts","../../src/exact/v1/facilitator/scheme.ts","../../src/exact/facilitator/eip3009-utils.ts","../../src/v1/index.ts"],"sourcesContent":["import {\n Network,\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkClient,\n} from \"@bankofai/x402-core/types\";\nimport { PaymentRequirementsV1 } from \"@bankofai/x402-core/types/v1\";\nimport { getAddress } from \"viem\";\nimport { authorizationTypes } from \"../../../constants\";\nimport { ClientEvmSigner } from \"../../../signer\";\nimport { ExactEvmPayloadV1 } from \"../../../types\";\nimport { createNonce } from \"../../../utils\";\nimport { EvmNetworkV1, getEvmChainIdV1 } from \"../../../v1\";\n\n/**\n * EVM client implementation for the Exact payment scheme (V1).\n */\nexport class ExactEvmSchemeV1 implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n /**\n * Creates a new ExactEvmClientV1 instance.\n *\n * @param signer - The EVM signer for client operations\n */\n constructor(private readonly signer: ClientEvmSigner) {}\n\n /**\n * Creates a payment payload for the Exact scheme (V1).\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<\n Pick<PaymentPayload, \"x402Version\" | \"payload\"> & { scheme: string; network: Network }\n > {\n const selectedV1 = paymentRequirements as unknown as PaymentRequirementsV1;\n const nonce = createNonce();\n const now = Math.floor(Date.now() / 1000);\n\n const authorization: ExactEvmPayloadV1[\"authorization\"] = {\n from: this.signer.address,\n to: getAddress(selectedV1.payTo),\n value: selectedV1.maxAmountRequired,\n validAfter: (now - 600).toString(), // 10 minutes before\n validBefore: (now + selectedV1.maxTimeoutSeconds).toString(),\n nonce,\n };\n\n // Sign the authorization\n const signature = await this.signAuthorization(authorization, selectedV1);\n\n const payload: ExactEvmPayloadV1 = {\n authorization,\n signature,\n };\n\n return {\n x402Version,\n scheme: selectedV1.scheme,\n network: selectedV1.network,\n payload,\n };\n }\n\n /**\n * Sign the EIP-3009 authorization using EIP-712\n *\n * @param authorization - The authorization to sign\n * @param requirements - The payment requirements\n * @returns Promise resolving to the signature\n */\n private async signAuthorization(\n authorization: ExactEvmPayloadV1[\"authorization\"],\n requirements: PaymentRequirementsV1,\n ): Promise<`0x${string}`> {\n const chainId = getEvmChainIdV1(requirements.network as EvmNetworkV1);\n\n if (!requirements.extra?.name || !requirements.extra?.version) {\n throw new Error(\n `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`,\n );\n }\n\n const { name, version } = requirements.extra;\n\n const domain = {\n name,\n version,\n chainId,\n verifyingContract: getAddress(requirements.asset),\n };\n\n const message = {\n from: getAddress(authorization.from),\n to: getAddress(authorization.to),\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce,\n };\n\n return await this.signer.signTypedData({\n domain,\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\",\n message,\n });\n }\n}\n","import {\n PaymentPayload,\n PaymentPayloadV1,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n FacilitatorContext,\n SettleResponse,\n VerifyResponse,\n} from \"@bankofai/x402-core/types\";\nimport { resolveDataSuffix } from \"../../../shared/extensions\";\nimport { PaymentRequirementsV1 } from \"@bankofai/x402-core/types/v1\";\nimport { getAddress, Hex, isAddressEqual, parseErc6492Signature } from \"viem\";\nimport { authorizationTypes } from \"../../../constants\";\nimport { FacilitatorEvmSigner } from \"../../../signer\";\nimport { ExactEvmPayloadV1 } from \"../../../types\";\nimport { EvmNetworkV1, getEvmChainIdV1 } from \"../../../v1\";\nimport * as Errors from \"../../facilitator/errors\";\nimport {\n diagnoseEip3009SimulationFailure,\n executeTransferWithAuthorization,\n simulateEip3009Transfer,\n} from \"../../facilitator/eip3009-utils\";\n\nexport interface VerifyV1Options {\n /** Run onchain simulation. Defaults to true. */\n simulate?: boolean;\n}\n\nexport interface ExactEvmSchemeV1Config {\n /**\n * Allowlist of factory contract addresses (hex strings, case-insensitive) that the facilitator\n * will call when deploying an undeployed smart wallet via ERC-6492.\n *\n * A non-empty list enables ERC-4337 smart wallet deployment via EIP-6492. Facilitators must\n * explicitly list every factory they trust to prevent arbitrary transaction injection via\n * attacker-controlled ERC-6492 signature wrappers. An empty or omitted list denies all factory\n * deployment calls.\n *\n * @default []\n */\n eip6492AllowedFactories?: string[];\n /**\n * If enabled, simulates transaction before settling. Defaults to false, ie only simulate during verify.\n *\n * @default false\n */\n simulateInSettle?: boolean;\n}\n\n/**\n * EVM facilitator implementation for the Exact payment scheme (V1).\n */\nexport class ExactEvmSchemeV1 implements SchemeNetworkFacilitator {\n readonly scheme = \"exact\";\n readonly caipFamily = \"eip155:*\";\n private readonly config: Required<ExactEvmSchemeV1Config>;\n\n /**\n * Creates a new ExactEvmFacilitatorV1 instance.\n *\n * @param signer - The EVM signer for facilitator operations\n * @param config - Optional configuration for the facilitator\n */\n constructor(\n private readonly signer: FacilitatorEvmSigner,\n config?: ExactEvmSchemeV1Config,\n ) {\n this.config = {\n eip6492AllowedFactories: config?.eip6492AllowedFactories ?? [],\n simulateInSettle: config?.simulateInSettle ?? false,\n };\n }\n\n /**\n * Get mechanism-specific extra data for the supported kinds endpoint.\n * For EVM, no extra data is needed.\n *\n * @param _ - The network identifier (unused for EVM)\n * @returns undefined (EVM has no extra data)\n */\n getExtra(_: string): Record<string, unknown> | undefined {\n return undefined;\n }\n\n /**\n * Get signer addresses used by this facilitator.\n * Returns all addresses this facilitator can use for signing/settling transactions.\n *\n * @param _ - The network identifier (unused for EVM, addresses are network-agnostic)\n * @returns Array of facilitator wallet addresses\n */\n getSigners(_: string): string[] {\n return [...this.signer.getAddresses()];\n }\n\n /**\n * Verifies a payment payload (V1).\n *\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @returns Promise resolving to verification response\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n return this._verify(payload, requirements);\n }\n\n /**\n * Settles a payment by executing the transfer (V1).\n *\n * @param payload - The payment payload to settle\n * @param requirements - The payment requirements\n * @param context - Optional facilitator context for extension capabilities\n * @returns Promise resolving to settlement response\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n context?: FacilitatorContext,\n ): Promise<SettleResponse> {\n const payloadV1 = payload as unknown as PaymentPayloadV1;\n const exactEvmPayload = payload.payload as ExactEvmPayloadV1;\n\n // Re-verify before settling\n const valid = await this._verify(payload, requirements, {\n simulate: this.config.simulateInSettle ?? false,\n });\n if (!valid.isValid) {\n return {\n success: false,\n network: payloadV1.network,\n transaction: \"\",\n errorReason: valid.invalidReason ?? Errors.ErrInvalidScheme,\n payer: exactEvmPayload.authorization.from,\n };\n }\n\n try {\n // Parse ERC-6492 signature if applicable (for optional deployment)\n const { address: factoryAddress, data: factoryCalldata } = parseErc6492Signature(\n exactEvmPayload.signature!,\n );\n\n // Deploy ERC-4337 smart wallet via EIP-6492 if factory is in the allowlist\n if (\n factoryAddress &&\n factoryCalldata &&\n !isAddressEqual(factoryAddress, \"0x0000000000000000000000000000000000000000\")\n ) {\n // Check if smart wallet is already deployed\n const payerAddress = exactEvmPayload.authorization.from;\n const bytecode = await this.signer.getCode({ address: payerAddress });\n\n if (!bytecode || bytecode === \"0x\") {\n const normalizedFactory = factoryAddress.toLowerCase();\n const isAllowed = (this.config.eip6492AllowedFactories ?? []).some(\n allowed => allowed.toLowerCase() === normalizedFactory,\n );\n if (!isAllowed) {\n return {\n success: false,\n errorReason: Errors.ErrFactoryNotAllowed,\n transaction: \"\",\n network: payloadV1.network,\n payer: exactEvmPayload.authorization.from,\n };\n }\n\n // Send the factory calldata directly as a transaction\n // The factoryCalldata already contains the complete encoded function call\n const deployTx = await this.signer.sendTransaction({\n to: factoryAddress as Hex,\n data: factoryCalldata as Hex,\n });\n\n // Wait for deployment transaction\n await this.signer.waitForTransactionReceipt({ hash: deployTx });\n }\n }\n\n // V1 payloads carry no extensions, so the builder-code suffix can only contain the\n // facilitator's own wallet code (`w`); client app (`a`) and service (`s`) codes are\n // always absent.\n const dataSuffix = await resolveDataSuffix(context, {\n paymentPayload: payload,\n paymentRequirements: requirements,\n });\n\n const tx = await executeTransferWithAuthorization(\n this.signer,\n getAddress(requirements.asset),\n exactEvmPayload,\n dataSuffix,\n );\n\n // Wait for transaction confirmation\n const receipt = await this.signer.waitForTransactionReceipt({ hash: tx });\n\n if (receipt.status !== \"success\") {\n return {\n success: false,\n errorReason: Errors.ErrTransactionFailed,\n transaction: tx,\n network: payloadV1.network,\n payer: exactEvmPayload.authorization.from,\n };\n }\n\n return {\n success: true,\n transaction: tx,\n network: payloadV1.network,\n payer: exactEvmPayload.authorization.from,\n };\n } catch (error) {\n return {\n success: false,\n errorReason: error instanceof Error ? error.message : Errors.ErrTransactionFailed,\n transaction: \"\",\n network: payloadV1.network,\n payer: exactEvmPayload.authorization.from,\n };\n }\n }\n\n /**\n * Internal verify with optional simulation control.\n *\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @param options - Verification options (e.g. simulate)\n * @returns Promise resolving to verification response\n */\n private async _verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n options?: VerifyV1Options,\n ): Promise<VerifyResponse> {\n const requirementsV1 = requirements as unknown as PaymentRequirementsV1;\n const payloadV1 = payload as unknown as PaymentPayloadV1;\n const exactEvmPayload = payload.payload as ExactEvmPayloadV1;\n const payer = exactEvmPayload.authorization.from;\n let eip6492Deployment:\n | { factoryAddress: `0x${string}`; factoryCalldata: `0x${string}` }\n | undefined;\n\n // Verify scheme matches\n if (payloadV1.scheme !== \"exact\" || requirements.scheme !== \"exact\") {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidScheme,\n payer,\n };\n }\n\n // Get chain configuration\n let chainId: number;\n try {\n chainId = getEvmChainIdV1(payloadV1.network as EvmNetworkV1);\n } catch {\n return {\n isValid: false,\n invalidReason: Errors.ErrNetworkMismatch,\n payer,\n };\n }\n\n if (!requirements.extra?.name || !requirements.extra?.version) {\n return {\n isValid: false,\n invalidReason: Errors.ErrMissingEip712Domain,\n payer,\n };\n }\n\n const { name, version } = requirements.extra;\n const erc20Address = getAddress(requirements.asset);\n\n // Verify network matches\n if (payloadV1.network !== requirements.network) {\n return {\n isValid: false,\n invalidReason: Errors.ErrNetworkMismatch,\n payer,\n };\n }\n\n // Build typed data for signature verification\n const permitTypedData = {\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\" as const,\n domain: {\n name,\n version,\n chainId,\n verifyingContract: erc20Address,\n },\n message: {\n from: exactEvmPayload.authorization.from,\n to: exactEvmPayload.authorization.to,\n value: BigInt(exactEvmPayload.authorization.value),\n validAfter: BigInt(exactEvmPayload.authorization.validAfter),\n validBefore: BigInt(exactEvmPayload.authorization.validBefore),\n nonce: exactEvmPayload.authorization.nonce,\n },\n };\n\n // Verify signature (flatten EIP-6492 handling out of catch block)\n let isValid = false;\n try {\n isValid = await this.signer.verifyTypedData({\n address: payer,\n ...permitTypedData,\n signature: exactEvmPayload.signature!,\n });\n } catch {\n isValid = false;\n }\n\n const signature = exactEvmPayload.signature!;\n const sigLen = signature.startsWith(\"0x\") ? signature.length - 2 : signature.length;\n\n // Extract EIP-6492 deployment info (factory address + calldata) if present\n const erc6492Data = parseErc6492Signature(signature);\n const hasDeploymentInfo =\n erc6492Data.address &&\n erc6492Data.data &&\n !isAddressEqual(erc6492Data.address, \"0x0000000000000000000000000000000000000000\");\n\n if (hasDeploymentInfo) {\n eip6492Deployment = {\n factoryAddress: erc6492Data.address!,\n factoryCalldata: erc6492Data.data!,\n };\n }\n\n if (!isValid) {\n const isSmartWallet = sigLen > 130; // 65 bytes = 130 hex chars for EOA\n\n if (!isSmartWallet) {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidSignature,\n payer,\n };\n }\n\n const bytecode = await this.signer.getCode({ address: payer });\n const isDeployed = bytecode && bytecode !== \"0x\";\n\n if (!isDeployed && !hasDeploymentInfo) {\n return {\n isValid: false,\n invalidReason: Errors.ErrUndeployedSmartWallet,\n payer,\n };\n }\n }\n\n // Verify payment recipient matches\n if (getAddress(exactEvmPayload.authorization.to) !== getAddress(requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrRecipientMismatch,\n payer,\n };\n }\n\n // Verify validBefore is in the future (with 6 second buffer for block time)\n const now = Math.floor(Date.now() / 1000);\n if (BigInt(exactEvmPayload.authorization.validBefore) < BigInt(now + 6)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrValidBeforeExpired,\n payer,\n };\n }\n\n // Verify validAfter is not in the future\n if (BigInt(exactEvmPayload.authorization.validAfter) > BigInt(now)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrValidAfterInFuture,\n payer,\n };\n }\n\n // Verify amount exactly matches requirements\n if (BigInt(exactEvmPayload.authorization.value) !== BigInt(requirementsV1.maxAmountRequired)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrInvalidAuthorizationValue,\n payer,\n };\n }\n\n // Transaction simulation\n if (options?.simulate !== false) {\n const simulationSucceeded = await simulateEip3009Transfer(\n this.signer,\n erc20Address,\n exactEvmPayload,\n eip6492Deployment,\n );\n if (!simulationSucceeded) {\n return diagnoseEip3009SimulationFailure(\n this.signer,\n erc20Address,\n exactEvmPayload,\n requirements,\n requirementsV1.maxAmountRequired,\n );\n }\n }\n\n return {\n isValid: true,\n invalidReason: undefined,\n payer,\n };\n }\n}\n","import { PaymentRequirements, VerifyResponse } from \"@bankofai/x402-core/types\";\nimport { encodeFunctionData, getAddress, Hex, parseErc6492Signature, parseSignature } from \"viem\";\nimport { eip3009ABI } from \"../../constants\";\nimport { multicall, ContractCall, RawContractCall } from \"../../multicall\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { ExactEIP3009Payload } from \"../../types\";\nimport * as Errors from \"./errors\";\n\nexport interface Eip6492Deployment {\n factoryAddress: `0x${string}`;\n factoryCalldata: `0x${string}`;\n}\n\n/**\n * Simulates transferWithAuthorization via eth_call.\n * Returns true if simulation succeeded, false if it failed.\n *\n * @param signer - EVM signer for contract reads\n * @param erc20Address - ERC-20 token contract address\n * @param payload - EIP-3009 transfer authorization payload\n * @param eip6492Deployment - Optional EIP-6492 factory info for undeployed smart wallets\n *\n * @returns true if simulation succeeded, false if it failed\n */\nexport async function simulateEip3009Transfer(\n signer: FacilitatorEvmSigner,\n erc20Address: `0x${string}`,\n payload: ExactEIP3009Payload,\n eip6492Deployment?: Eip6492Deployment,\n): Promise<boolean> {\n const auth = payload.authorization;\n const transferArgs = [\n getAddress(auth.from),\n getAddress(auth.to),\n BigInt(auth.value),\n BigInt(auth.validAfter),\n BigInt(auth.validBefore),\n auth.nonce,\n ] as const;\n\n if (eip6492Deployment) {\n const { signature: innerSignature } = parseErc6492Signature(payload.signature!);\n const transferCalldata = encodeFunctionData({\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [...transferArgs, innerSignature],\n });\n\n try {\n const results = await multicall(signer.readContract.bind(signer), [\n {\n address: getAddress(eip6492Deployment.factoryAddress),\n callData: eip6492Deployment.factoryCalldata,\n } satisfies RawContractCall,\n {\n address: erc20Address,\n callData: transferCalldata,\n } satisfies RawContractCall,\n ]);\n\n return results[1]?.status === \"success\";\n } catch {\n return false;\n }\n }\n\n const sig = payload.signature!;\n const sigLength = sig.startsWith(\"0x\") ? sig.length - 2 : sig.length;\n const isECDSA = sigLength === 130;\n\n try {\n if (isECDSA) {\n const parsedSig = parseSignature(sig);\n await signer.readContract({\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [\n ...transferArgs,\n (parsedSig.v as number | undefined) ?? parsedSig.yParity,\n parsedSig.r,\n parsedSig.s,\n ],\n });\n } else {\n await signer.readContract({\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [...transferArgs, sig],\n });\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * After simulation fails, runs a single diagnostic multicall to determine the most specific error reason.\n * Checks balanceOf, name, version and authorizationState in one RPC round-trip.\n *\n * @param signer - EVM signer used for the payment\n * @param erc20Address - Address of the ERC-20 token contract\n * @param payload - The EIP-3009 transfer authorization payload\n * @param requirements - Payment requirements to validate against\n * @param amountRequired - Required amount for the payment (balance check)\n *\n * @returns Promise resolving to the verification result with validity and optional invalid reason\n */\nexport async function diagnoseEip3009SimulationFailure(\n signer: FacilitatorEvmSigner,\n erc20Address: `0x${string}`,\n payload: ExactEIP3009Payload,\n requirements: PaymentRequirements,\n amountRequired: string,\n): Promise<VerifyResponse> {\n const payer = payload.authorization.from;\n\n const diagnosticCalls: ContractCall[] = [\n {\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"balanceOf\",\n args: [payload.authorization.from],\n },\n {\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"name\",\n },\n {\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"version\",\n },\n {\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"authorizationState\",\n args: [payload.authorization.from, payload.authorization.nonce],\n },\n ];\n\n try {\n const results = await multicall(signer.readContract.bind(signer), diagnosticCalls);\n\n const [balanceResult, nameResult, versionResult, authStateResult] = results;\n\n if (authStateResult.status === \"failure\") {\n return { isValid: false, invalidReason: Errors.ErrEip3009NotSupported, payer };\n }\n\n if (authStateResult.status === \"success\" && authStateResult.result === true) {\n return { isValid: false, invalidReason: Errors.ErrEip3009NonceAlreadyUsed, payer };\n }\n\n if (\n nameResult.status === \"success\" &&\n requirements.extra?.name &&\n nameResult.result !== requirements.extra.name\n ) {\n return { isValid: false, invalidReason: Errors.ErrEip3009TokenNameMismatch, payer };\n }\n\n if (\n versionResult.status === \"success\" &&\n requirements.extra?.version &&\n versionResult.result !== requirements.extra.version\n ) {\n return { isValid: false, invalidReason: Errors.ErrEip3009TokenVersionMismatch, payer };\n }\n\n if (balanceResult.status === \"success\") {\n const balance = balanceResult.result as bigint;\n if (balance < BigInt(amountRequired)) {\n return {\n isValid: false,\n invalidReason: Errors.ErrEip3009InsufficientBalance,\n payer,\n };\n }\n }\n } catch {\n // Diagnostic multicall failed — fall through to generic error\n }\n\n return { isValid: false, invalidReason: Errors.ErrEip3009SimulationFailed, payer };\n}\n\n/**\n * Maps an EIP-3009 contract revert error to a specific error code.\n * Falls back to ErrTransactionFailed when the revert reason is unknown.\n *\n * @param error - The error thrown during transfer execution\n * @returns A specific error reason string\n */\nexport function parseEip3009TransferError(error: unknown): string {\n const msg = error instanceof Error ? error.message : String(error);\n if (/authorization.*(expired|valid before)/i.test(msg) || /AuthorizationExpired/i.test(msg)) {\n return Errors.ErrValidBeforeExpired;\n }\n if (/authorization.*not.*valid|AuthorizationNotYetValid/i.test(msg)) {\n return Errors.ErrValidAfterInFuture;\n }\n if (/authorization.*used|AuthorizationAlreadyUsed|AuthorizationUsedOrCanceled/i.test(msg)) {\n return Errors.ErrEip3009NonceAlreadyUsed;\n }\n if (/transfer.*exceeds.*balance|insufficient.*balance|ERC20InsufficientBalance/i.test(msg)) {\n return Errors.ErrEip3009InsufficientBalance;\n }\n if (/invalid.*signature|SignerMismatch|InvalidSignatureV|InvalidSignatureS/i.test(msg)) {\n return Errors.ErrInvalidSignature;\n }\n return Errors.ErrTransactionFailed;\n}\n\n/**\n * Executes transferWithAuthorization onchain.\n *\n * @param signer - EVM signer for contract writes\n * @param erc20Address - ERC-20 token contract address\n * @param payload - EIP-3009 transfer authorization payload\n * @param dataSuffix - Optional hex bytes to append after the ABI-encoded calldata\n *\n * @returns Transaction hash\n */\nexport async function executeTransferWithAuthorization(\n signer: FacilitatorEvmSigner,\n erc20Address: `0x${string}`,\n payload: ExactEIP3009Payload,\n dataSuffix?: Hex,\n): Promise<Hex> {\n const { signature } = parseErc6492Signature(payload.signature!);\n const signatureLength = signature.startsWith(\"0x\") ? signature.length - 2 : signature.length;\n const isECDSA = signatureLength === 130;\n\n const auth = payload.authorization;\n const baseArgs = [\n getAddress(auth.from),\n getAddress(auth.to),\n BigInt(auth.value),\n BigInt(auth.validAfter),\n BigInt(auth.validBefore),\n auth.nonce,\n ] as const;\n\n let signatureArgs: readonly unknown[];\n if (isECDSA) {\n const parsedSig = parseSignature(signature);\n signatureArgs = [\n (parsedSig.v as number | undefined) || parsedSig.yParity,\n parsedSig.r,\n parsedSig.s,\n ];\n } else {\n signatureArgs = [signature];\n }\n\n return signer.writeContract({\n address: erc20Address,\n abi: eip3009ABI,\n functionName: \"transferWithAuthorization\",\n args: [...baseArgs, ...signatureArgs],\n dataSuffix,\n });\n}\n","export { ExactEvmSchemeV1 } from \"../exact/v1\";\n\nexport const EVM_NETWORK_CHAIN_ID_MAP = {\n ethereum: 1,\n sepolia: 11155111,\n abstract: 2741,\n \"abstract-testnet\": 11124,\n \"base-sepolia\": 84532,\n base: 8453,\n \"avalanche-fuji\": 43113,\n avalanche: 43114,\n iotex: 4689,\n sei: 1329,\n \"sei-testnet\": 1328,\n polygon: 137,\n \"polygon-amoy\": 80002,\n peaq: 3338,\n story: 1514,\n educhain: 41923,\n \"skale-base-sepolia\": 324705682,\n megaeth: 4326,\n monad: 143,\n stable: 988,\n \"stable-testnet\": 2201,\n} as const;\n\nexport type EvmNetworkV1 = keyof typeof EVM_NETWORK_CHAIN_ID_MAP;\n\nexport const NETWORKS: string[] = Object.keys(EVM_NETWORK_CHAIN_ID_MAP);\n\n/**\n * Extract chain ID from a v1 legacy network name.\n *\n * @param network - The v1 network name (e.g., \"base-sepolia\", \"polygon\")\n * @returns The numeric chain ID\n * @throws Error if the network name is not a known v1 network\n */\nexport function getEvmChainIdV1(network: string): number {\n const chainId = EVM_NETWORK_CHAIN_ID_MAP[network as EvmNetworkV1];\n if (!chainId) {\n throw new Error(`Unsupported v1 network: ${network}`);\n }\n return chainId;\n}\n"],"mappings":"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","names":["getAddress","parseErc6492Signature","getAddress","getAddress","ExactEvmSchemeV1","parseErc6492Signature","getAddress"]}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ExactEvmSchemeV12 as ExactEvmSchemeV1,
|
|
3
|
+
NETWORKS
|
|
4
|
+
} from "./chunk-XG2JLZVJ.mjs";
|
|
5
|
+
import {
|
|
6
|
+
createPermit2Payload
|
|
7
|
+
} from "./chunk-QVATVA3J.mjs";
|
|
8
|
+
import {
|
|
9
|
+
trySignEip2612PermitExtension,
|
|
10
|
+
trySignErc20ApprovalExtension
|
|
11
|
+
} from "./chunk-JNT7C46S.mjs";
|
|
12
|
+
import {
|
|
13
|
+
authorizationTypes
|
|
14
|
+
} from "./chunk-MACPBXCT.mjs";
|
|
15
|
+
import {
|
|
16
|
+
createNonce,
|
|
17
|
+
getEvmChainId
|
|
18
|
+
} from "./chunk-TW7Z65AO.mjs";
|
|
19
|
+
|
|
20
|
+
// src/exact/client/eip3009.ts
|
|
21
|
+
import { getAddress } from "viem";
|
|
22
|
+
async function createEIP3009Payload(signer, x402Version, paymentRequirements) {
|
|
23
|
+
const nonce = createNonce();
|
|
24
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
25
|
+
const authorization = {
|
|
26
|
+
from: signer.address,
|
|
27
|
+
to: getAddress(paymentRequirements.payTo),
|
|
28
|
+
value: paymentRequirements.amount,
|
|
29
|
+
validAfter: "0",
|
|
30
|
+
validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),
|
|
31
|
+
nonce
|
|
32
|
+
};
|
|
33
|
+
const signature = await signEIP3009Authorization(signer, authorization, paymentRequirements);
|
|
34
|
+
const payload = {
|
|
35
|
+
authorization,
|
|
36
|
+
signature
|
|
37
|
+
};
|
|
38
|
+
return {
|
|
39
|
+
x402Version,
|
|
40
|
+
payload
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async function signEIP3009Authorization(signer, authorization, requirements) {
|
|
44
|
+
const chainId = getEvmChainId(requirements.network);
|
|
45
|
+
if (!requirements.extra?.name || !requirements.extra?.version) {
|
|
46
|
+
throw new Error(
|
|
47
|
+
`EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
const { name, version } = requirements.extra;
|
|
51
|
+
const domain = {
|
|
52
|
+
name,
|
|
53
|
+
version,
|
|
54
|
+
chainId,
|
|
55
|
+
verifyingContract: getAddress(requirements.asset)
|
|
56
|
+
};
|
|
57
|
+
const message = {
|
|
58
|
+
from: getAddress(authorization.from),
|
|
59
|
+
to: getAddress(authorization.to),
|
|
60
|
+
value: BigInt(authorization.value),
|
|
61
|
+
validAfter: BigInt(authorization.validAfter),
|
|
62
|
+
validBefore: BigInt(authorization.validBefore),
|
|
63
|
+
nonce: authorization.nonce
|
|
64
|
+
};
|
|
65
|
+
return await signer.signTypedData({
|
|
66
|
+
domain,
|
|
67
|
+
types: authorizationTypes,
|
|
68
|
+
primaryType: "TransferWithAuthorization",
|
|
69
|
+
message
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// src/exact/client/scheme.ts
|
|
74
|
+
var ExactEvmScheme = class {
|
|
75
|
+
/**
|
|
76
|
+
* Creates a new ExactEvmClient instance.
|
|
77
|
+
*
|
|
78
|
+
* @param signer - The EVM signer for client operations.
|
|
79
|
+
* Base flow only requires `address` + `signTypedData`.
|
|
80
|
+
* Extension enrichment (EIP-2612 / ERC-20 approval sponsoring) additionally
|
|
81
|
+
* requires optional capabilities like `readContract` and tx signing helpers.
|
|
82
|
+
* @param options - Optional RPC configuration used to backfill extension capabilities.
|
|
83
|
+
*/
|
|
84
|
+
constructor(signer, options) {
|
|
85
|
+
this.signer = signer;
|
|
86
|
+
this.options = options;
|
|
87
|
+
this.scheme = "exact";
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Creates a payment payload for the Exact scheme.
|
|
91
|
+
* Routes to EIP-3009 or Permit2 based on requirements.extra.assetTransferMethod.
|
|
92
|
+
*
|
|
93
|
+
* For Permit2 flows, if the server advertises `eip2612GasSponsoring` and the
|
|
94
|
+
* signer supports `readContract`, automatically signs an EIP-2612 permit
|
|
95
|
+
* when Permit2 allowance is insufficient.
|
|
96
|
+
*
|
|
97
|
+
* @param x402Version - The x402 protocol version
|
|
98
|
+
* @param paymentRequirements - The payment requirements
|
|
99
|
+
* @param context - Optional context with server-declared extensions
|
|
100
|
+
* @returns Promise resolving to a payment payload result (with optional extensions)
|
|
101
|
+
*/
|
|
102
|
+
async createPaymentPayload(x402Version, paymentRequirements, context) {
|
|
103
|
+
const assetTransferMethod = paymentRequirements.extra?.assetTransferMethod ?? "eip3009";
|
|
104
|
+
if (assetTransferMethod === "permit2") {
|
|
105
|
+
const result = await createPermit2Payload(this.signer, x402Version, paymentRequirements);
|
|
106
|
+
const eip2612Extensions = await trySignEip2612PermitExtension(
|
|
107
|
+
this.signer,
|
|
108
|
+
this.options,
|
|
109
|
+
paymentRequirements,
|
|
110
|
+
result,
|
|
111
|
+
context
|
|
112
|
+
);
|
|
113
|
+
if (eip2612Extensions) {
|
|
114
|
+
return {
|
|
115
|
+
...result,
|
|
116
|
+
extensions: eip2612Extensions
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const erc20Extensions = await trySignErc20ApprovalExtension(
|
|
120
|
+
this.signer,
|
|
121
|
+
this.options,
|
|
122
|
+
paymentRequirements,
|
|
123
|
+
context
|
|
124
|
+
);
|
|
125
|
+
if (erc20Extensions) {
|
|
126
|
+
return {
|
|
127
|
+
...result,
|
|
128
|
+
extensions: erc20Extensions
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
return result;
|
|
132
|
+
}
|
|
133
|
+
return createEIP3009Payload(this.signer, x402Version, paymentRequirements);
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// src/exact/client/register.ts
|
|
138
|
+
function registerExactEvmScheme(client, config) {
|
|
139
|
+
const evmScheme = new ExactEvmScheme(config.signer, config.schemeOptions);
|
|
140
|
+
if (config.networks && config.networks.length > 0) {
|
|
141
|
+
config.networks.forEach((network) => {
|
|
142
|
+
client.register(network, evmScheme);
|
|
143
|
+
});
|
|
144
|
+
} else {
|
|
145
|
+
client.register("eip155:*", evmScheme);
|
|
146
|
+
}
|
|
147
|
+
NETWORKS.forEach((network) => {
|
|
148
|
+
client.registerV1(network, new ExactEvmSchemeV1(config.signer));
|
|
149
|
+
});
|
|
150
|
+
if (config.policies) {
|
|
151
|
+
config.policies.forEach((policy) => {
|
|
152
|
+
client.registerPolicy(policy);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return client;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export {
|
|
159
|
+
ExactEvmScheme,
|
|
160
|
+
registerExactEvmScheme
|
|
161
|
+
};
|
|
162
|
+
//# sourceMappingURL=chunk-ZCJRY5LQ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/exact/client/eip3009.ts","../../src/exact/client/scheme.ts","../../src/exact/client/register.ts"],"sourcesContent":["import { PaymentRequirements, PaymentPayloadResult } from \"@bankofai/x402-core/types\";\nimport { getAddress } from \"viem\";\nimport { authorizationTypes } from \"../../constants\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { ExactEIP3009Payload } from \"../../types\";\nimport { createNonce, getEvmChainId } from \"../../utils\";\n\n/**\n * Creates an EIP-3009 (transferWithAuthorization) payload.\n *\n * @param signer - The EVM signer for client operations\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload result\n */\nexport async function createEIP3009Payload(\n signer: ClientEvmSigner,\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n): Promise<PaymentPayloadResult> {\n const nonce = createNonce();\n const now = Math.floor(Date.now() / 1000);\n\n const authorization: ExactEIP3009Payload[\"authorization\"] = {\n from: signer.address,\n to: getAddress(paymentRequirements.payTo),\n value: paymentRequirements.amount,\n validAfter: \"0\",\n validBefore: (now + paymentRequirements.maxTimeoutSeconds).toString(),\n nonce,\n };\n\n const signature = await signEIP3009Authorization(signer, authorization, paymentRequirements);\n\n const payload: ExactEIP3009Payload = {\n authorization,\n signature,\n };\n\n return {\n x402Version,\n payload,\n };\n}\n\n/**\n * Sign the EIP-3009 authorization using EIP-712.\n *\n * @param signer - The EVM signer\n * @param authorization - The authorization to sign\n * @param requirements - The payment requirements\n * @returns Promise resolving to the signature\n */\nasync function signEIP3009Authorization(\n signer: ClientEvmSigner,\n authorization: ExactEIP3009Payload[\"authorization\"],\n requirements: PaymentRequirements,\n): Promise<`0x${string}`> {\n const chainId = getEvmChainId(requirements.network);\n\n if (!requirements.extra?.name || !requirements.extra?.version) {\n throw new Error(\n `EIP-712 domain parameters (name, version) are required in payment requirements for asset ${requirements.asset}`,\n );\n }\n\n const { name, version } = requirements.extra;\n\n const domain = {\n name,\n version,\n chainId,\n verifyingContract: getAddress(requirements.asset),\n };\n\n const message = {\n from: getAddress(authorization.from),\n to: getAddress(authorization.to),\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce,\n };\n\n return await signer.signTypedData({\n domain,\n types: authorizationTypes,\n primaryType: \"TransferWithAuthorization\",\n message,\n });\n}\n","import {\n SchemeNetworkClient,\n PaymentRequirements,\n PaymentPayloadResult,\n PaymentPayloadContext,\n} from \"@bankofai/x402-core/types\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { AssetTransferMethod } from \"../../types\";\nimport { createEIP3009Payload } from \"./eip3009\";\nimport { createPermit2Payload } from \"./permit2\";\nimport {\n trySignEip2612PermitExtension,\n trySignErc20ApprovalExtension,\n} from \"../../shared/extensions\";\nimport { ExactEvmSchemeOptions } from \"./rpc\";\n\n/**\n * EVM client implementation for the Exact payment scheme.\n * Supports both EIP-3009 (transferWithAuthorization) and Permit2 flows.\n *\n * Routes to the appropriate authorization method based on\n * `requirements.extra.assetTransferMethod`. Defaults to EIP-3009\n * for backward compatibility with older facilitators.\n *\n * When the server advertises `eip2612GasSponsoring` and the asset transfer\n * method is `permit2`, the scheme automatically signs an EIP-2612 permit\n * if the user lacks Permit2 approval. This requires `readContract` on the signer.\n */\nexport class ExactEvmScheme implements SchemeNetworkClient {\n readonly scheme = \"exact\";\n\n /**\n * Creates a new ExactEvmClient instance.\n *\n * @param signer - The EVM signer for client operations.\n * Base flow only requires `address` + `signTypedData`.\n * Extension enrichment (EIP-2612 / ERC-20 approval sponsoring) additionally\n * requires optional capabilities like `readContract` and tx signing helpers.\n * @param options - Optional RPC configuration used to backfill extension capabilities.\n */\n constructor(\n private readonly signer: ClientEvmSigner,\n private readonly options?: ExactEvmSchemeOptions,\n ) {}\n\n /**\n * Creates a payment payload for the Exact scheme.\n * Routes to EIP-3009 or Permit2 based on requirements.extra.assetTransferMethod.\n *\n * For Permit2 flows, if the server advertises `eip2612GasSponsoring` and the\n * signer supports `readContract`, automatically signs an EIP-2612 permit\n * when Permit2 allowance is insufficient.\n *\n * @param x402Version - The x402 protocol version\n * @param paymentRequirements - The payment requirements\n * @param context - Optional context with server-declared extensions\n * @returns Promise resolving to a payment payload result (with optional extensions)\n */\n async createPaymentPayload(\n x402Version: number,\n paymentRequirements: PaymentRequirements,\n context?: PaymentPayloadContext,\n ): Promise<PaymentPayloadResult> {\n const assetTransferMethod =\n (paymentRequirements.extra?.assetTransferMethod as AssetTransferMethod) ?? \"eip3009\";\n\n if (assetTransferMethod === \"permit2\") {\n const result = await createPermit2Payload(this.signer, x402Version, paymentRequirements);\n\n const eip2612Extensions = await trySignEip2612PermitExtension(\n this.signer,\n this.options,\n paymentRequirements,\n result,\n context,\n );\n\n if (eip2612Extensions) {\n return {\n ...result,\n extensions: eip2612Extensions,\n };\n }\n\n const erc20Extensions = await trySignErc20ApprovalExtension(\n this.signer,\n this.options,\n paymentRequirements,\n context,\n );\n if (erc20Extensions) {\n return {\n ...result,\n extensions: erc20Extensions,\n };\n }\n\n return result;\n }\n\n return createEIP3009Payload(this.signer, x402Version, paymentRequirements);\n }\n}\n","import { x402Client, SelectPaymentRequirements, PaymentPolicy } from \"@bankofai/x402-core/client\";\nimport { Network } from \"@bankofai/x402-core/types\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { ExactEvmScheme } from \"./scheme\";\nimport { ExactEvmSchemeOptions } from \"./rpc\";\nimport { ExactEvmSchemeV1 } from \"../v1/client/scheme\";\nimport { NETWORKS } from \"../../v1\";\n\n/**\n * Configuration options for registering EVM schemes to an x402Client\n */\nexport interface EvmClientConfig {\n /**\n * The EVM signer to use for creating payment payloads\n */\n signer: ClientEvmSigner;\n\n /**\n * Optional payment requirements selector function\n * If not provided, uses the default selector (first available option)\n */\n paymentRequirementsSelector?: SelectPaymentRequirements;\n\n /**\n * Optional policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Optional Exact EVM client scheme options.\n * Supports either a single config ({ rpcUrl }) or per-chain configs\n * keyed by EVM chain ID ({ 8453: { rpcUrl: \"...\" } }).\n */\n schemeOptions?: ExactEvmSchemeOptions;\n\n /**\n * Optional specific networks to register.\n * If not provided, registers wildcard support (eip155:*).\n */\n networks?: Network[];\n}\n\n/**\n * Registers EVM exact payment schemes to an x402Client instance.\n *\n * This function registers:\n * - V2: eip155:* wildcard scheme with ExactEvmScheme (or specific networks if provided)\n * - V1: All supported EVM networks with ExactEvmSchemeV1\n *\n * @param client - The x402Client instance to register schemes to\n * @param config - Configuration for EVM client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactEvmScheme } from \"@bankofai/x402-evm/exact/client/register\";\n * import { x402Client } from \"@bankofai/x402-core/client\";\n * import { privateKeyToAccount } from \"viem/accounts\";\n *\n * const account = privateKeyToAccount(\"0x...\");\n * const client = new x402Client();\n * registerExactEvmScheme(client, { signer: account });\n * ```\n */\nexport function registerExactEvmScheme(client: x402Client, config: EvmClientConfig): x402Client {\n const evmScheme = new ExactEvmScheme(config.signer, config.schemeOptions);\n\n // Register V2 scheme\n // EIP-2612 gas sponsoring is handled internally by the scheme when the\n // server advertises support - no separate extension registration needed.\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach(network => {\n client.register(network, evmScheme);\n });\n } else {\n // Register wildcard for all EVM chains\n client.register(\"eip155:*\", evmScheme);\n }\n\n // Register all V1 networks\n NETWORKS.forEach(network => {\n client.registerV1(network as Network, new ExactEvmSchemeV1(config.signer));\n });\n\n // Apply policies if provided\n if (config.policies) {\n config.policies.forEach(policy => {\n client.registerPolicy(policy);\n });\n }\n\n return client;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { C as ClientEvmSigner } from '../signer-BFelv8DL.mjs';
|
|
2
|
+
import 'viem';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* BankofAI overlay — NOT from upstream @x402/evm.
|
|
6
|
+
*
|
|
7
|
+
* Client-side wallet-bridge factory, symmetric to TRON's
|
|
8
|
+
* `createClientTronSigner` and to this package's `createFacilitatorEvmSigner`.
|
|
9
|
+
* Upstream ships only `toClientEvmSigner`, a composition helper that expects an
|
|
10
|
+
* already-resolved `{ address, signTypedData }`; it does not adapt an
|
|
11
|
+
* `@bankofai/agent-wallet` wallet (async `getAddress`, and a `signTypedData`
|
|
12
|
+
* that strips the `0x` prefix). This factory closes that gap so client examples
|
|
13
|
+
* stay a one-liner and never touch a raw key.
|
|
14
|
+
*
|
|
15
|
+
* Upgrade safety: consumes only upstream's public surface (`toClientEvmSigner` +
|
|
16
|
+
* the `ClientEvmSigner` type); never edits `signer.ts` / `index.ts`.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* A wallet that signs EIP-712 typed data without exposing its key — structurally
|
|
21
|
+
* compatible with `@bankofai/agent-wallet`'s `EvmSigner`. `signTypedData` may
|
|
22
|
+
* return the signature with or without the `0x` prefix (agent-wallet strips it);
|
|
23
|
+
* the factory normalizes it.
|
|
24
|
+
*/
|
|
25
|
+
interface ClientEvmWallet {
|
|
26
|
+
getAddress(): Promise<string>;
|
|
27
|
+
signTypedData(data: {
|
|
28
|
+
domain: Record<string, unknown>;
|
|
29
|
+
types: Record<string, unknown>;
|
|
30
|
+
primaryType: string;
|
|
31
|
+
message: Record<string, unknown>;
|
|
32
|
+
}): Promise<string>;
|
|
33
|
+
/**
|
|
34
|
+
* Optionally sign a fully-specified EIP-1559 transaction (e.g. the one-time
|
|
35
|
+
* `approve(Permit2)` for the ERC-20 approval gas-sponsoring extension).
|
|
36
|
+
* agent-wallet's `EvmSigner` satisfies this; the returned hex may omit the
|
|
37
|
+
* `0x` prefix (agent-wallet strips it). When absent, the signer can't produce
|
|
38
|
+
* the gas-sponsored approval and that flow is simply skipped.
|
|
39
|
+
*/
|
|
40
|
+
signTransaction?(tx: Record<string, unknown>): Promise<string>;
|
|
41
|
+
}
|
|
42
|
+
/** Minimal read surface for permit2 allowance enrichment (a viem client satisfies it). */
|
|
43
|
+
interface ClientEvmReadClient {
|
|
44
|
+
readContract(args: {
|
|
45
|
+
address: `0x${string}`;
|
|
46
|
+
abi: readonly unknown[];
|
|
47
|
+
functionName: string;
|
|
48
|
+
args?: readonly unknown[];
|
|
49
|
+
}): Promise<unknown>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Creates a {@link ClientEvmSigner} from an agent-wallet — the EVM counterpart
|
|
53
|
+
* of `createClientTronSigner`. The key never enters the SDK; the wallet signs.
|
|
54
|
+
*
|
|
55
|
+
* @param wallet - The wallet that signs payment authorizations.
|
|
56
|
+
* @param publicClient - Optional viem client; enables EIP-2612/permit2
|
|
57
|
+
* enrichment via `readContract`. Omit for ERC-3009-only flows.
|
|
58
|
+
* @returns A {@link ClientEvmSigner} backed by the wallet.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```typescript
|
|
62
|
+
* const wallet = await resolveWallet({ network: "evm" }); // @bankofai/agent-wallet
|
|
63
|
+
* const signer = await createClientEvmSigner(wallet, publicClient);
|
|
64
|
+
* new ExactEvmScheme(signer);
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
declare function createClientEvmSigner(wallet: ClientEvmWallet, publicClient?: ClientEvmReadClient): Promise<ClientEvmSigner>;
|
|
68
|
+
|
|
69
|
+
export { type ClientEvmReadClient, type ClientEvmWallet, createClientEvmSigner };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import {
|
|
2
|
+
toClientEvmSigner
|
|
3
|
+
} from "../chunk-3WZF6722.mjs";
|
|
4
|
+
|
|
5
|
+
// src/client/agent-wallet.ts
|
|
6
|
+
async function createClientEvmSigner(wallet, publicClient) {
|
|
7
|
+
const address = await wallet.getAddress();
|
|
8
|
+
const signTransaction = wallet.signTransaction?.bind(wallet);
|
|
9
|
+
return toClientEvmSigner(
|
|
10
|
+
{
|
|
11
|
+
address,
|
|
12
|
+
// agent-wallet strips the `0x` (signature analog of SDK issue #2);
|
|
13
|
+
// re-add it so the returned signature matches the ClientEvmSigner contract.
|
|
14
|
+
signTypedData: async (msg) => {
|
|
15
|
+
const sig = await wallet.signTypedData(msg);
|
|
16
|
+
return `0x${sig.replace(/^0x/, "")}`;
|
|
17
|
+
},
|
|
18
|
+
// Enables the ERC-20 approval gas-sponsoring extension: the client signs
|
|
19
|
+
// the `approve(Permit2, MaxUint256)` tx offline (facilitator broadcasts it).
|
|
20
|
+
// agent-wallet's EvmSigner.signTransaction takes the viem EIP-1559 fields
|
|
21
|
+
// as-is and strips the `0x`; re-add it. getTransactionCount/estimateFeesPerGas
|
|
22
|
+
// come from `publicClient` via toClientEvmSigner.
|
|
23
|
+
...signTransaction ? {
|
|
24
|
+
signTransaction: async (args) => {
|
|
25
|
+
const signed = await signTransaction(args);
|
|
26
|
+
return `0x${signed.replace(/^0x/, "")}`;
|
|
27
|
+
}
|
|
28
|
+
} : {}
|
|
29
|
+
},
|
|
30
|
+
publicClient
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
createClientEvmSigner
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=agent-wallet.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/client/agent-wallet.ts"],"sourcesContent":["/**\n * BankofAI overlay — NOT from upstream @x402/evm.\n *\n * Client-side wallet-bridge factory, symmetric to TRON's\n * `createClientTronSigner` and to this package's `createFacilitatorEvmSigner`.\n * Upstream ships only `toClientEvmSigner`, a composition helper that expects an\n * already-resolved `{ address, signTypedData }`; it does not adapt an\n * `@bankofai/agent-wallet` wallet (async `getAddress`, and a `signTypedData`\n * that strips the `0x` prefix). This factory closes that gap so client examples\n * stay a one-liner and never touch a raw key.\n *\n * Upgrade safety: consumes only upstream's public surface (`toClientEvmSigner` +\n * the `ClientEvmSigner` type); never edits `signer.ts` / `index.ts`.\n */\nimport { toClientEvmSigner, type ClientEvmSigner } from \"../signer\";\n\n/**\n * A wallet that signs EIP-712 typed data without exposing its key — structurally\n * compatible with `@bankofai/agent-wallet`'s `EvmSigner`. `signTypedData` may\n * return the signature with or without the `0x` prefix (agent-wallet strips it);\n * the factory normalizes it.\n */\nexport interface ClientEvmWallet {\n getAddress(): Promise<string>;\n signTypedData(data: {\n domain: Record<string, unknown>;\n types: Record<string, unknown>;\n primaryType: string;\n message: Record<string, unknown>;\n }): Promise<string>;\n /**\n * Optionally sign a fully-specified EIP-1559 transaction (e.g. the one-time\n * `approve(Permit2)` for the ERC-20 approval gas-sponsoring extension).\n * agent-wallet's `EvmSigner` satisfies this; the returned hex may omit the\n * `0x` prefix (agent-wallet strips it). When absent, the signer can't produce\n * the gas-sponsored approval and that flow is simply skipped.\n */\n signTransaction?(tx: Record<string, unknown>): Promise<string>;\n}\n\n/** Minimal read surface for permit2 allowance enrichment (a viem client satisfies it). */\nexport interface ClientEvmReadClient {\n readContract(args: {\n address: `0x${string}`;\n abi: readonly unknown[];\n functionName: string;\n args?: readonly unknown[];\n }): Promise<unknown>;\n}\n\n/**\n * Creates a {@link ClientEvmSigner} from an agent-wallet — the EVM counterpart\n * of `createClientTronSigner`. The key never enters the SDK; the wallet signs.\n *\n * @param wallet - The wallet that signs payment authorizations.\n * @param publicClient - Optional viem client; enables EIP-2612/permit2\n * enrichment via `readContract`. Omit for ERC-3009-only flows.\n * @returns A {@link ClientEvmSigner} backed by the wallet.\n *\n * @example\n * ```typescript\n * const wallet = await resolveWallet({ network: \"evm\" }); // @bankofai/agent-wallet\n * const signer = await createClientEvmSigner(wallet, publicClient);\n * new ExactEvmScheme(signer);\n * ```\n */\nexport async function createClientEvmSigner(\n wallet: ClientEvmWallet,\n publicClient?: ClientEvmReadClient,\n): Promise<ClientEvmSigner> {\n const address = (await wallet.getAddress()) as `0x${string}`;\n\n // Bind to the wallet: agent-wallet's `LocalSigner.signTransaction` reads\n // `this._impl`, so calling a detached reference throws. (`signTypedData` below\n // is 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);\n // re-add it so the returned signature matches the ClientEvmSigner contract.\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 // agent-wallet's EvmSigner.signTransaction takes the viem EIP-1559 fields\n // as-is and strips the `0x`; re-add it. getTransactionCount/estimateFeesPerGas\n // come from `publicClient` via toClientEvmSigner.\n ...(signTransaction\n ? {\n signTransaction: async (args: Record<string, unknown>) => {\n const signed = await signTransaction(args);\n return `0x${signed.replace(/^0x/, \"\")}` as `0x${string}`;\n },\n }\n : {}),\n },\n publicClient,\n );\n}\n"],"mappings":";;;;;AAkEA,eAAsB,sBACpB,QACA,cAC0B;AAC1B,QAAM,UAAW,MAAM,OAAO,WAAW;AAKzC,QAAM,kBAAkB,OAAO,iBAAiB,KAAK,MAAM;AAE3D,SAAO;AAAA,IACL;AAAA,MACE;AAAA;AAAA;AAAA,MAGA,eAAe,OAAM,QAAO;AAC1B,cAAM,MAAM,MAAM,OAAO,cAAc,GAAG;AAC1C,eAAO,KAAK,IAAI,QAAQ,OAAO,EAAE,CAAC;AAAA,MACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,GAAI,kBACA;AAAA,QACE,iBAAiB,OAAO,SAAkC;AACxD,gBAAM,SAAS,MAAM,gBAAgB,IAAI;AACzC,iBAAO,KAAK,OAAO,QAAQ,OAAO,EAAE,CAAC;AAAA,QACvC;AAAA,MACF,IACA,CAAC;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export { E as ExactEvmScheme } from '../../scheme-D8ZbykGV.mjs';
|
|
2
|
+
import { x402Client, SelectPaymentRequirements, PaymentPolicy } from '@bankofai/x402-core/client';
|
|
3
|
+
import { Network } from '@bankofai/x402-core/types';
|
|
4
|
+
import { C as ClientEvmSigner } from '../../signer-BFelv8DL.mjs';
|
|
5
|
+
import { E as ExactEvmSchemeOptions } from '../../rpc-DULZzRne.mjs';
|
|
6
|
+
export { a as ExactEvmSchemeConfig, b as ExactEvmSchemeConfigByChainId } from '../../rpc-DULZzRne.mjs';
|
|
7
|
+
export { P as Permit2AllowanceParams, c as createPermit2ApprovalTx, e as erc20AllowanceAbi, g as getPermit2AllowanceReadParams } from '../../permit2-DhJRUcgY.mjs';
|
|
8
|
+
import 'viem';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Configuration options for registering EVM schemes to an x402Client
|
|
12
|
+
*/
|
|
13
|
+
interface EvmClientConfig {
|
|
14
|
+
/**
|
|
15
|
+
* The EVM signer to use for creating payment payloads
|
|
16
|
+
*/
|
|
17
|
+
signer: ClientEvmSigner;
|
|
18
|
+
/**
|
|
19
|
+
* Optional payment requirements selector function
|
|
20
|
+
* If not provided, uses the default selector (first available option)
|
|
21
|
+
*/
|
|
22
|
+
paymentRequirementsSelector?: SelectPaymentRequirements;
|
|
23
|
+
/**
|
|
24
|
+
* Optional policies to apply to the client
|
|
25
|
+
*/
|
|
26
|
+
policies?: PaymentPolicy[];
|
|
27
|
+
/**
|
|
28
|
+
* Optional Exact EVM client scheme options.
|
|
29
|
+
* Supports either a single config ({ rpcUrl }) or per-chain configs
|
|
30
|
+
* keyed by EVM chain ID ({ 8453: { rpcUrl: "..." } }).
|
|
31
|
+
*/
|
|
32
|
+
schemeOptions?: ExactEvmSchemeOptions;
|
|
33
|
+
/**
|
|
34
|
+
* Optional specific networks to register.
|
|
35
|
+
* If not provided, registers wildcard support (eip155:*).
|
|
36
|
+
*/
|
|
37
|
+
networks?: Network[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Registers EVM exact payment schemes to an x402Client instance.
|
|
41
|
+
*
|
|
42
|
+
* This function registers:
|
|
43
|
+
* - V2: eip155:* wildcard scheme with ExactEvmScheme (or specific networks if provided)
|
|
44
|
+
* - V1: All supported EVM networks with ExactEvmSchemeV1
|
|
45
|
+
*
|
|
46
|
+
* @param client - The x402Client instance to register schemes to
|
|
47
|
+
* @param config - Configuration for EVM client registration
|
|
48
|
+
* @returns The client instance for chaining
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* import { registerExactEvmScheme } from "@bankofai/x402-evm/exact/client/register";
|
|
53
|
+
* import { x402Client } from "@bankofai/x402-core/client";
|
|
54
|
+
* import { privateKeyToAccount } from "viem/accounts";
|
|
55
|
+
*
|
|
56
|
+
* const account = privateKeyToAccount("0x...");
|
|
57
|
+
* const client = new x402Client();
|
|
58
|
+
* registerExactEvmScheme(client, { signer: account });
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
declare function registerExactEvmScheme(client: x402Client, config: EvmClientConfig): x402Client;
|
|
62
|
+
|
|
63
|
+
export { type EvmClientConfig, ExactEvmSchemeOptions, registerExactEvmScheme };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ExactEvmScheme,
|
|
3
|
+
registerExactEvmScheme
|
|
4
|
+
} from "../../chunk-ZCJRY5LQ.mjs";
|
|
5
|
+
import "../../chunk-XG2JLZVJ.mjs";
|
|
6
|
+
import {
|
|
7
|
+
createPermit2ApprovalTx,
|
|
8
|
+
getPermit2AllowanceReadParams
|
|
9
|
+
} from "../../chunk-QVATVA3J.mjs";
|
|
10
|
+
import "../../chunk-H2EYJIZL.mjs";
|
|
11
|
+
import "../../chunk-P3QOX3QZ.mjs";
|
|
12
|
+
import "../../chunk-JNT7C46S.mjs";
|
|
13
|
+
import {
|
|
14
|
+
erc20AllowanceAbi
|
|
15
|
+
} from "../../chunk-MACPBXCT.mjs";
|
|
16
|
+
import "../../chunk-VS3RYAYE.mjs";
|
|
17
|
+
import "../../chunk-TW7Z65AO.mjs";
|
|
18
|
+
export {
|
|
19
|
+
ExactEvmScheme,
|
|
20
|
+
createPermit2ApprovalTx,
|
|
21
|
+
erc20AllowanceAbi,
|
|
22
|
+
getPermit2AllowanceReadParams,
|
|
23
|
+
registerExactEvmScheme
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { SchemeNetworkFacilitator, PaymentPayload, PaymentRequirements, FacilitatorContext, VerifyResponse, SettleResponse, Network } from '@bankofai/x402-core/types';
|
|
2
|
+
import { F as FacilitatorEvmSigner } from '../../signer-BFelv8DL.mjs';
|
|
3
|
+
import { x402Facilitator } from '@bankofai/x402-core/facilitator';
|
|
4
|
+
import 'viem';
|
|
5
|
+
|
|
6
|
+
interface ExactEvmSchemeConfig {
|
|
7
|
+
/**
|
|
8
|
+
* Allowlist of factory contract addresses (hex strings, case-insensitive) that the facilitator
|
|
9
|
+
* will call when deploying an undeployed smart wallet via ERC-6492.
|
|
10
|
+
*
|
|
11
|
+
* A non-empty list enables ERC-4337 smart wallet deployment via EIP-6492. An empty or omitted
|
|
12
|
+
* list denies all factory deployment calls (feature disabled by default).
|
|
13
|
+
*
|
|
14
|
+
* @default []
|
|
15
|
+
*/
|
|
16
|
+
eip6492AllowedFactories?: string[];
|
|
17
|
+
/**
|
|
18
|
+
* If enabled, run on-chain simulation during settle's re-verify.
|
|
19
|
+
*
|
|
20
|
+
* @default false
|
|
21
|
+
*/
|
|
22
|
+
simulateInSettle?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* EVM facilitator implementation for the Exact payment scheme.
|
|
26
|
+
* Thin router that delegates to EIP-3009 or Permit2 based on payload type.
|
|
27
|
+
* All extension handling (EIP-2612, ERC-20 approval gas sponsoring) is owned
|
|
28
|
+
* by the Permit2 functions via FacilitatorContext.
|
|
29
|
+
*/
|
|
30
|
+
declare class ExactEvmScheme implements SchemeNetworkFacilitator {
|
|
31
|
+
private readonly signer;
|
|
32
|
+
readonly scheme = "exact";
|
|
33
|
+
readonly caipFamily = "eip155:*";
|
|
34
|
+
private readonly config;
|
|
35
|
+
/**
|
|
36
|
+
* Creates a new ExactEvmScheme facilitator instance.
|
|
37
|
+
*
|
|
38
|
+
* @param signer - The EVM signer for facilitator operations
|
|
39
|
+
* @param config - Optional configuration
|
|
40
|
+
*/
|
|
41
|
+
constructor(signer: FacilitatorEvmSigner, config?: ExactEvmSchemeConfig);
|
|
42
|
+
/**
|
|
43
|
+
* Returns undefined — EVM has no mechanism-specific extra data.
|
|
44
|
+
*
|
|
45
|
+
* @param _ - The network identifier (unused)
|
|
46
|
+
* @returns undefined
|
|
47
|
+
*/
|
|
48
|
+
getExtra(_: string): Record<string, unknown> | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Returns facilitator wallet addresses for the supported response.
|
|
51
|
+
*
|
|
52
|
+
* @param _ - The network identifier (unused, addresses are network-agnostic)
|
|
53
|
+
* @returns Array of facilitator wallet addresses
|
|
54
|
+
*/
|
|
55
|
+
getSigners(_: string): string[];
|
|
56
|
+
/**
|
|
57
|
+
* Verifies a payment payload. Routes to Permit2 or EIP-3009 based on payload type.
|
|
58
|
+
*
|
|
59
|
+
* @param payload - The payment payload to verify
|
|
60
|
+
* @param requirements - The payment requirements
|
|
61
|
+
* @param context - Optional facilitator context for extension capabilities
|
|
62
|
+
* @param _ - Payment required extensions (unused; reserved for interface parity)
|
|
63
|
+
* @returns Promise resolving to verification response
|
|
64
|
+
*/
|
|
65
|
+
verify(payload: PaymentPayload, requirements: PaymentRequirements, context?: FacilitatorContext, _?: Record<string, unknown>): Promise<VerifyResponse>;
|
|
66
|
+
/**
|
|
67
|
+
* Settles a payment. Routes to Permit2 or EIP-3009 based on payload type.
|
|
68
|
+
*
|
|
69
|
+
* @param payload - The payment payload to settle
|
|
70
|
+
* @param requirements - The payment requirements
|
|
71
|
+
* @param context - Optional facilitator context for extension capabilities
|
|
72
|
+
* @returns Promise resolving to settlement response
|
|
73
|
+
*/
|
|
74
|
+
settle(payload: PaymentPayload, requirements: PaymentRequirements, context?: FacilitatorContext): Promise<SettleResponse>;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Configuration options for registering EVM schemes to an x402Facilitator
|
|
79
|
+
*/
|
|
80
|
+
interface EvmFacilitatorConfig {
|
|
81
|
+
/**
|
|
82
|
+
* The EVM signer for facilitator operations (verify and settle)
|
|
83
|
+
*/
|
|
84
|
+
signer: FacilitatorEvmSigner;
|
|
85
|
+
/**
|
|
86
|
+
* Networks to register (single network or array of networks)
|
|
87
|
+
* Examples: "eip155:84532", ["eip155:84532", "eip155:1"]
|
|
88
|
+
*/
|
|
89
|
+
networks: Network | Network[];
|
|
90
|
+
/**
|
|
91
|
+
* Allowlist of factory contract addresses (hex strings, case-insensitive) that the facilitator
|
|
92
|
+
* will call when deploying an undeployed smart wallet via ERC-6492.
|
|
93
|
+
*
|
|
94
|
+
* A non-empty list enables ERC-4337 smart wallet deployment via EIP-6492. An empty or omitted
|
|
95
|
+
* list denies all factory deployment calls (feature disabled by default).
|
|
96
|
+
*
|
|
97
|
+
* @default []
|
|
98
|
+
*/
|
|
99
|
+
eip6492AllowedFactories?: string[];
|
|
100
|
+
/**
|
|
101
|
+
* If enabled, reruns on-chain simulation during settle's re-verify.
|
|
102
|
+
*
|
|
103
|
+
* @default false
|
|
104
|
+
*/
|
|
105
|
+
simulateInSettle?: boolean;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Registers EVM exact payment schemes to an x402Facilitator instance.
|
|
109
|
+
*
|
|
110
|
+
* This function registers:
|
|
111
|
+
* - V2: Specified networks with ExactEvmScheme
|
|
112
|
+
* - V1: All supported EVM networks with ExactEvmSchemeV1
|
|
113
|
+
*
|
|
114
|
+
* @param facilitator - The x402Facilitator instance to register schemes to
|
|
115
|
+
* @param config - Configuration for EVM facilitator registration
|
|
116
|
+
* @returns The facilitator instance for chaining
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* import { registerExactEvmScheme } from "@bankofai/x402-evm/exact/facilitator/register";
|
|
121
|
+
* import { x402Facilitator } from "@bankofai/x402-core/facilitator";
|
|
122
|
+
* import { createPublicClient, createWalletClient } from "viem";
|
|
123
|
+
*
|
|
124
|
+
* const facilitator = new x402Facilitator();
|
|
125
|
+
*
|
|
126
|
+
* // Single network
|
|
127
|
+
* registerExactEvmScheme(facilitator, {
|
|
128
|
+
* signer: combinedClient,
|
|
129
|
+
* networks: "eip155:84532" // Base Sepolia
|
|
130
|
+
* });
|
|
131
|
+
*
|
|
132
|
+
* // Multiple networks (will auto-derive eip155:* pattern)
|
|
133
|
+
* registerExactEvmScheme(facilitator, {
|
|
134
|
+
* signer: combinedClient,
|
|
135
|
+
* networks: ["eip155:84532", "eip155:1"] // Base Sepolia and Mainnet
|
|
136
|
+
* });
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
139
|
+
declare function registerExactEvmScheme(facilitator: x402Facilitator, config: EvmFacilitatorConfig): x402Facilitator;
|
|
140
|
+
|
|
141
|
+
export { type EvmFacilitatorConfig, ExactEvmScheme, type ExactEvmSchemeConfig, registerExactEvmScheme };
|