/** * ERC-20 Approval Gas Sponsoring Extension Type Definitions * * ERC-20 approve()-based gas sponsoring for the t402 payment protocol. * For tokens WITHOUT EIP-2612 permit support, the client signs an offline * approve() transaction and the facilitator broadcasts it on their behalf. */ /** * Information provided by server about ERC-20 approval gas sponsoring availability. */ interface ERC20ApprovalGasSponsorExtensionInfo { /** CAIP-2 network identifiers where gas sponsoring is available */ sponsoredNetworks: string[]; /** Maximum token amount (in base units) the sponsor will cover per approval */ maxAmount: string; /** Address of the sponsor/facilitator that will submit transactions */ sponsorAddress: string; /** Optional Permit2 proxy address for advanced settlement flows */ permit2Address?: string; /** Whether atomic batch execution is required (e.g., via Multicall3) */ requiresAtomicBatch: boolean; } /** * ERC-20 approval gas sponsor extension declaration for server responses. */ interface ERC20ApprovalGasSponsorExtension { /** Extension information */ info: ERC20ApprovalGasSponsorExtensionInfo; /** JSON Schema for validation */ schema: object; } /** * Complete ERC-20 approval gas sponsor payload from client. */ interface ERC20ApprovalGasSponsorPayload { /** CAIP-2 network identifier (must be in sponsoredNetworks) */ network: string; /** Client wallet address that signed the transaction */ from: string; /** ERC-20 token contract address */ asset: string; /** Approval amount in base units */ amount: string; /** Raw signed approve() transaction (hex-encoded with 0x prefix) */ signedApprovalTx: string; /** Chain ID for replay protection */ chainId: number; /** Client's account nonce (if known) */ nonce?: number; } /** * Options for declaring ERC-20 approval gas sponsor extension on server. */ interface DeclareERC20ApprovalGasSponsorOptions { /** CAIP-2 network identifiers where gas sponsoring is available */ sponsoredNetworks: string[]; /** Maximum token amount (in base units) the sponsor will cover per approval */ maxAmount: string; /** Address of the sponsor/facilitator */ sponsorAddress: string; /** Optional Permit2 proxy address */ permit2Address?: string; /** Whether atomic batch execution is required (defaults to false) */ requiresAtomicBatch?: boolean; } /** * Options for validating ERC-20 approval gas sponsor payloads. */ interface ValidateERC20ApprovalGasSponsorOptions { /** Expected chain IDs per CAIP-2 network (e.g., { "eip155:8453": 8453 }) */ expectedChainIds?: Record; } /** * Result of ERC-20 approval gas sponsor payload validation. */ interface ERC20ApprovalGasSponsorValidationResult { /** Whether the payload is valid */ valid: boolean; /** Error message if invalid */ error?: string; } /** * Parameters for creating an ERC-20 approval gas sponsor payload. */ interface CreateERC20ApprovalParams { /** CAIP-2 network identifier */ network: string; /** Client wallet address */ from: string; /** ERC-20 token contract address */ asset: string; /** Approval amount in base units */ amount: string; /** Raw signed approve() transaction (hex-encoded) */ signedApprovalTx: string; /** Chain ID for replay protection */ chainId: number; /** Client's account nonce (if known) */ nonce?: number; } /** * ERC-20 Approval Gas Sponsoring Extension Server-Side Implementation * * Provides functions for servers to declare gas sponsoring requirements, * parse client headers, and validate approval payloads. */ /** * Declares an ERC-20 approval gas sponsor extension for server responses. * * @param options - Extension declaration options * @returns Gas sponsor extension object ready for response * * @example * ```typescript * const extension = declareERC20ApprovalGasSponsorExtension({ * sponsoredNetworks: ["eip155:8453", "eip155:42161"], * maxAmount: "1000000000", * sponsorAddress: "0xFacilitator...", * requiresAtomicBatch: true, * }); * ``` */ declare function declareERC20ApprovalGasSponsorExtension(options: DeclareERC20ApprovalGasSponsorOptions): ERC20ApprovalGasSponsorExtension; /** * Parses an ERC-20 approval gas sponsor header from client request. * * The header format is base64-encoded JSON. * * @param header - Base64-encoded gas sponsor header value * @returns Parsed gas sponsor payload * @throws Error if header is invalid * * @example * ```typescript * const payload = parseERC20ApprovalGasSponsorHeader( * request.headers['x-t402-erc20-approval-gas-sponsoring'] * ); * ``` */ declare function parseERC20ApprovalGasSponsorHeader(header: string): ERC20ApprovalGasSponsorPayload; /** * Validates an ERC-20 approval gas sponsor payload against server extension info. * * @param payload - The gas sponsor payload from the client * @param extensionInfo - The server's gas sponsor extension info * @param options - Validation options * @returns Validation result * * @example * ```typescript * const result = validateERC20ApprovalGasSponsorPayload(payload, extension.info); * if (!result.valid) { * throw new Error(result.error); * } * ``` */ declare function validateERC20ApprovalGasSponsorPayload(payload: ERC20ApprovalGasSponsorPayload, extensionInfo: ERC20ApprovalGasSponsorExtensionInfo, options?: ValidateERC20ApprovalGasSponsorOptions): ERC20ApprovalGasSponsorValidationResult; /** * ERC-20 Approval Gas Sponsoring Extension Client-Side Implementation * * Provides functions for clients to construct ERC-20 approve() calldata * and encode gas sponsor payloads for transmission. */ /** * Extension key for ERC-20 approval gas sponsoring in payment requirements. */ declare const ERC20_APPROVAL_GAS_SPONSOR_EXTENSION_KEY = "erc20ApprovalGasSponsoring"; /** * HTTP header name for ERC-20 approval gas sponsor payload. */ declare const ERC20_APPROVAL_GAS_SPONSOR_HEADER_NAME = "X-T402-ERC20-Approval-Gas-Sponsoring"; /** * ERC-20 approve(address,uint256) function selector. */ declare const APPROVE_FUNCTION_SELECTOR = "0x095ea7b3"; /** * Encodes ERC-20 approve(address spender, uint256 amount) calldata. * * @param spender - The spender address to approve * @param amount - The approval amount in base units * @returns Hex-encoded calldata with 0x prefix * * @example * ```typescript * const calldata = encodeApproveCalldata("0xFacilitator...", "1000000"); * // Returns "0x095ea7b3" + abi-encoded args * ``` */ declare function encodeApproveCalldata(spender: string, amount: string): string; /** * Creates an ERC-20 approval gas sponsor payload from params and extension info. * * @param _info - The server's extension info (reserved for future use) * @param params - The approval parameters * @returns Gas sponsor payload ready for header encoding * * @example * ```typescript * const payload = createERC20ApprovalGasSponsorPayload(extensionInfo, { * network: "eip155:8453", * from: wallet.address, * asset: "0xUSDT...", * amount: "1000000", * signedApprovalTx: signedTx, * chainId: 8453, * }); * ``` */ declare function createERC20ApprovalGasSponsorPayload(_info: ERC20ApprovalGasSponsorExtensionInfo, params: CreateERC20ApprovalParams): ERC20ApprovalGasSponsorPayload; /** * Encodes an ERC-20 approval gas sponsor payload for transmission in HTTP header. * * @param payload - The gas sponsor payload to encode * @returns Base64-encoded JSON string * * @example * ```typescript * const header = encodeERC20ApprovalGasSponsorHeader(payload); * fetch(url, { * headers: { [ERC20_APPROVAL_GAS_SPONSOR_HEADER_NAME]: header } * }); * ``` */ declare function encodeERC20ApprovalGasSponsorHeader(payload: ERC20ApprovalGasSponsorPayload): string; /** * ERC-20 Approval Gas Sponsoring Extension Facilitator-Side Implementation * * Provides functions for facilitators to extract approval data from payment * extensions, validate the signed approve() transaction, and prepare for * on-chain submission. */ /** * Extracts the ERC-20 approval gas sponsor payload from payment extensions. * * @param extensions - The extensions map from a PaymentPayload * @returns The gas sponsor payload if present, or null * * @example * ```typescript * const approval = extractERC20ApprovalGasSponsorPayload(paymentPayload.extensions); * if (approval) { * // Validate and broadcast the approval tx, then settle * } * ``` */ declare function extractERC20ApprovalGasSponsorPayload(extensions: Record | undefined): ERC20ApprovalGasSponsorPayload | null; /** * Processes and validates an ERC-20 approval payload for the facilitator. * * Combines extraction validation with approve() function selector verification. * Checks that the signed transaction data contains the correct approve() selector * and that the approval amount matches the declared amount. * * @param payload - The ERC-20 approval gas sponsor payload * @param extensionInfo - The server's gas sponsor extension info * @returns Validation result * * @example * ```typescript * const result = processERC20ApprovalPayload(payload, extensionInfo); * if (result.valid) { * // Safe to broadcast the approval tx and settle * } * ``` */ declare function processERC20ApprovalPayload(payload: ERC20ApprovalGasSponsorPayload, extensionInfo: ERC20ApprovalGasSponsorExtensionInfo): ERC20ApprovalGasSponsorValidationResult; /** * Validates and extracts the ERC-20 approval gas sponsor payload in one step. * * This is a convenience function for facilitators that combines extraction * and validation against the server's extension info. * * @param extensions - The extensions map from a PaymentPayload * @param extensionInfo - The server's gas sponsor extension info * @returns Validation result with the extracted payload if valid * * @example * ```typescript * const result = validateAndExtractApproval( * paymentPayload.extensions, * extensionInfo * ); * if (result.valid && result.payload) { * // Broadcast approval tx, then settle * } * ``` */ declare function validateAndExtractApproval(extensions: Record | undefined, extensionInfo: ERC20ApprovalGasSponsorExtensionInfo): ERC20ApprovalGasSponsorValidationResult & { payload?: ERC20ApprovalGasSponsorPayload; }; /** * Decodes the approve() calldata from a hex string to extract spender and amount. * * @param calldata - Hex-encoded approve() calldata (with or without 0x prefix) * @returns Decoded spender and amount, or null if not valid approve() calldata * * @example * ```typescript * const decoded = decodeApproveCalldata("0x095ea7b3..."); * if (decoded) { * console.log(decoded.spender, decoded.amount); * } * ``` */ declare function decodeApproveCalldata(calldata: string): { spender: string; amount: string; } | null; export { APPROVE_FUNCTION_SELECTOR, type CreateERC20ApprovalParams, type DeclareERC20ApprovalGasSponsorOptions, type ERC20ApprovalGasSponsorExtension, type ERC20ApprovalGasSponsorExtensionInfo, type ERC20ApprovalGasSponsorPayload, type ERC20ApprovalGasSponsorValidationResult, ERC20_APPROVAL_GAS_SPONSOR_EXTENSION_KEY, ERC20_APPROVAL_GAS_SPONSOR_HEADER_NAME, type ValidateERC20ApprovalGasSponsorOptions, createERC20ApprovalGasSponsorPayload, declareERC20ApprovalGasSponsorExtension, decodeApproveCalldata, encodeApproveCalldata, encodeERC20ApprovalGasSponsorHeader, extractERC20ApprovalGasSponsorPayload, parseERC20ApprovalGasSponsorHeader, processERC20ApprovalPayload, validateAndExtractApproval, validateERC20ApprovalGasSponsorPayload };