/** * EIP-2612 Gas Sponsoring Extension Type Definitions * * EIP-2612 permit-based gas sponsoring for the t402 payment protocol. * Allows facilitators to sponsor gas fees by having clients sign off-chain * permits instead of submitting on-chain approval transactions. */ /** * Information provided by server about gas sponsoring availability. */ interface Eip2612GasSponsorExtensionInfo { /** CAIP-2 network identifiers where gas sponsoring is available */ sponsoredNetworks: string[]; /** Maximum token amount (in base units) the sponsor will cover per permit */ maxAmount: string; /** Default permit deadline in seconds from now */ permitDeadline: number; /** Address of the sponsor/facilitator that will call permit + transferFrom */ sponsorAddress: string; } /** * Gas sponsor extension declaration for server responses. */ interface Eip2612GasSponsorExtension { /** Extension information */ info: Eip2612GasSponsorExtensionInfo; /** JSON Schema for validation */ schema: object; } /** * Complete gas sponsor payload from client including permit signature. */ interface Eip2612GasSponsorPayload { /** CAIP-2 network identifier (must be in sponsoredNetworks) */ network: string; /** Full hex-encoded EIP-2612 permit signature (65 bytes, r + s + v) */ permitSignature: string; /** Token owner address (the client's wallet) */ owner: string; /** Spender address (must match sponsorAddress) */ spender: string; /** Token amount in base units */ value: string; /** Unix timestamp for permit expiry */ deadline: number; /** Recovery parameter from signature */ v: number; /** Signature r component (32 bytes hex) */ r: string; /** Signature s component (32 bytes hex) */ s: string; } /** * Options for declaring gas sponsor extension on server. */ interface DeclareEip2612GasSponsorOptions { /** CAIP-2 network identifiers where gas sponsoring is available */ sponsoredNetworks: string[]; /** Maximum token amount (in base units) the sponsor will cover per permit */ maxAmount: string; /** Default permit deadline in seconds from now (defaults to 300 = 5 minutes) */ permitDeadline?: number; /** Address of the sponsor/facilitator */ sponsorAddress: string; } /** * Options for validating gas sponsor payloads. */ interface ValidateEip2612GasSponsorOptions { /** Custom time function for testing (defaults to Date.now) */ now?: () => number; } /** * Result of gas sponsor payload validation. */ interface Eip2612GasSponsorValidationResult { /** Whether the payload is valid */ valid: boolean; /** Error message if invalid */ error?: string; } /** * Parameters for creating an EIP-2612 permit signature. */ interface CreatePermitParams { /** EIP-712 signer interface */ signer: PermitSigner; /** ERC-20 token contract address */ tokenAddress: string; /** Token name (used in EIP-712 domain) */ tokenName: string; /** Chain ID (numeric, e.g. 8453 for Base) */ chainId: number; /** Spender address (the facilitator/sponsor) */ spender: string; /** Token amount in base units */ value: string; /** Unix timestamp for permit expiry */ deadline: number; /** Current permit nonce for the owner (defaults to 0) */ nonce?: number; } /** * Signer interface for EIP-2612 permit signing. */ interface PermitSigner { /** Wallet address */ address: string; /** * Sign EIP-712 typed data and return hex-encoded signature. * * @param data - EIP-712 typed data to sign * @param data.domain - EIP-712 domain separator fields * @param data.types - EIP-712 type definitions * @param data.primaryType - Primary type name for signing * @param data.message - Message values to sign * @returns Hex-encoded signature */ signTypedData(data: { domain: Record; types: Record>; primaryType: string; message: Record; }): Promise; } /** * EIP-2612 Gas Sponsoring Extension Server-Side Implementation * * Provides functions for servers to declare gas sponsoring requirements, * parse client headers, and validate permit payloads. */ /** * Declares an EIP-2612 gas sponsor extension for server responses. * * @param options - Extension declaration options * @returns Gas sponsor extension object ready for response * * @example * ```typescript * const extension = declareEip2612GasSponsorExtension({ * sponsoredNetworks: ["eip155:8453", "eip155:42161"], * maxAmount: "1000000000", * sponsorAddress: "0xFacilitator...", * }); * ``` */ declare function declareEip2612GasSponsorExtension(options: DeclareEip2612GasSponsorOptions): Eip2612GasSponsorExtension; /** * Parses an EIP-2612 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 = parseEip2612GasSponsorHeader( * request.headers['x-t402-eip2612-gas-sponsoring'] * ); * ``` */ declare function parseEip2612GasSponsorHeader(header: string): Eip2612GasSponsorPayload; /** * Validates an EIP-2612 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 = validateEip2612GasSponsorPayload(payload, extension.info); * if (!result.valid) { * throw new Error(result.error); * } * ``` */ declare function validateEip2612GasSponsorPayload(payload: Eip2612GasSponsorPayload, extensionInfo: Eip2612GasSponsorExtensionInfo, options?: ValidateEip2612GasSponsorOptions): Eip2612GasSponsorValidationResult; /** * EIP-2612 Gas Sponsoring Extension Client-Side Implementation * * Provides functions for clients to create EIP-2612 permit signatures * and encode gas sponsor payloads for transmission. */ /** * Extension key for EIP-2612 gas sponsoring in payment requirements. */ declare const EIP2612_GAS_SPONSOR_EXTENSION_KEY = "eip2612GasSponsoring"; /** * HTTP header name for EIP-2612 gas sponsor payload. */ declare const EIP2612_GAS_SPONSOR_HEADER_NAME = "X-T402-EIP2612-Gas-Sponsoring"; /** * Creates an EIP-2612 permit signature using EIP-712 typed data signing. * * @param params - Permit signing parameters * @returns Permit data including the signature components * * @example * ```typescript * const permit = await createPermitSignature({ * signer: wallet, * tokenAddress: "0xUSDT...", * tokenName: "Tether USD", * chainId: 8453, * spender: facilitatorAddress, * value: "1000000", * deadline: Math.floor(Date.now() / 1000) + 300, * }); * ``` */ declare function createPermitSignature(params: CreatePermitParams): Promise<{ owner: string; spender: string; value: string; deadline: number; v: number; r: string; s: string; permitSignature: string; }>; /** * Creates a gas sponsor payload from permit data and network. * * @param permit - Permit signature data from createPermitSignature * @param permit.owner - Token owner address * @param permit.spender - Approved spender address * @param permit.value - Token amount in base units * @param permit.deadline - Unix timestamp for permit expiry * @param permit.v - Recovery parameter from signature * @param permit.r - Signature r component (32 bytes hex) * @param permit.s - Signature s component (32 bytes hex) * @param permit.permitSignature - Full hex-encoded permit signature * @param network - CAIP-2 network identifier (e.g., "eip155:8453") * @returns Gas sponsor payload ready for header encoding * * @example * ```typescript * const payload = createEip2612GasSponsorPayload(permit, "eip155:8453"); * ``` */ declare function createEip2612GasSponsorPayload(permit: { owner: string; spender: string; value: string; deadline: number; v: number; r: string; s: string; permitSignature: string; }, network: string): Eip2612GasSponsorPayload; /** * Encodes a 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 = encodeEip2612GasSponsorHeader(payload); * fetch(url, { * headers: { [EIP2612_GAS_SPONSOR_HEADER_NAME]: header } * }); * ``` */ declare function encodeEip2612GasSponsorHeader(payload: Eip2612GasSponsorPayload): string; /** * EIP-2612 Gas Sponsoring Extension Facilitator-Side Implementation * * Provides functions for facilitators to extract permit data from payment * extensions, validate permits, and prepare on-chain submission. */ /** * Extracts the EIP-2612 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 permit = extractEip2612GasSponsorPayload(paymentPayload.extensions); * if (permit) { * // Submit permit tx then settle via Permit2 * } * ``` */ declare function extractEip2612GasSponsorPayload(extensions: Record | undefined): Eip2612GasSponsorPayload | null; /** * Validates and extracts the EIP-2612 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 = validateAndExtractPermit( * paymentPayload.extensions, * extensionInfo * ); * if (result.valid && result.payload) { * // Submit permit() on token contract, then settle via Permit2 * } * ``` */ declare function validateAndExtractPermit(extensions: Record | undefined, extensionInfo: Eip2612GasSponsorExtensionInfo): Eip2612GasSponsorValidationResult & { payload?: Eip2612GasSponsorPayload; }; /** * Builds the EIP-2612 permit function call data for on-chain submission. * * Returns the ABI-encoded parameters needed to call `permit(owner, spender, value, deadline, v, r, s)` * on the token contract. * * @param payload - The validated gas sponsor payload * @returns Object with the permit call parameters * * @example * ```typescript * const permitCall = buildPermitCallData(payload); * // Use permitCall with your preferred web3 library to submit the tx * ``` */ declare function buildPermitCallData(payload: Eip2612GasSponsorPayload): { owner: string; spender: string; value: string; deadline: number; v: number; r: string; s: string; }; export { type CreatePermitParams, type DeclareEip2612GasSponsorOptions, EIP2612_GAS_SPONSOR_EXTENSION_KEY, EIP2612_GAS_SPONSOR_HEADER_NAME, type Eip2612GasSponsorExtension, type Eip2612GasSponsorExtensionInfo, type Eip2612GasSponsorPayload, type Eip2612GasSponsorValidationResult, type PermitSigner, type ValidateEip2612GasSponsorOptions, buildPermitCallData, createEip2612GasSponsorPayload, createPermitSignature, declareEip2612GasSponsorExtension, encodeEip2612GasSponsorHeader, extractEip2612GasSponsorPayload, parseEip2612GasSponsorHeader, validateAndExtractPermit, validateEip2612GasSponsorPayload };