@haven_ai/sdk 0.1.6 → 0.1.7
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 +6 -13
- package/dist/index.cjs +50 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -5
- package/dist/index.d.ts +25 -5
- package/dist/index.js +50 -11
- package/dist/index.js.map +1 -1
- package/examples/x402_openapi_python.py +2 -2
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/signer.ts","../src/x402.ts","../src/mpp.ts","../src/client.ts","../src/tool-descriptions.ts","../src/tools.ts"],"names":["ethers","createHash","decodeBase64Json","AsyncLocalStorage","receipt","request","privateKeyToAccount","exact"],"mappings":"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","file":"index.cjs","sourcesContent":["// ── Client Configuration ─────────────────────────────────────────\n\nexport interface HavenClientConfig {\n /** Haven API key (sk_agent_xxx) */\n apiKey: string\n\n /** Agent's delegate EOA private key. If provided, the SDK handles signing automatically. */\n delegateKey?: string\n\n /** Haven API base URL (default: http://localhost:3001) */\n baseUrl?: string\n\n /** Optional wallet identity to send as the x402-wallet header. */\n x402Wallet?: string\n\n /** Timeout in ms for individual HTTP requests (default: 30000) */\n requestTimeout?: number\n\n /** Timeout in ms when polling for tx confirmation (default: 90000) */\n confirmationTimeout?: number\n\n /** Polling interval in ms when waiting for confirmation (default: 3000) */\n pollingInterval?: number\n\n /**\n * Extra headers to attach to every request to the Haven API.\n *\n * Used by the MCP server to tag requests with `X-Haven-MCP-Tool: <name>`\n * so the backend can record an audit-log entry per tool invocation. Has\n * no effect on outbound merchant requests (x402 / MPP) — those are\n * standard HTTP and never carry Haven-internal headers.\n */\n defaultHeaders?: Record<string, string>\n}\n\n// ── Payment Types ────────────────────────────────────────────────\n\nexport interface PaymentRequest {\n /** Token symbol: \"EURe\", \"USDC.e\", or \"xDAI\" */\n token: string\n\n /** Amount as a decimal string, e.g. \"5.00\" */\n amount: string\n\n /** Recipient Ethereum address (0x...) */\n to: string\n}\n\nexport interface SignData {\n /** The hash to sign (keccak256, 0x-prefixed) */\n hash: string\n\n /** Breakdown of values that were hashed — useful for debugging */\n components: {\n safe: string\n token: string\n to: string\n amount: string\n payment_token: string\n payment: string\n nonce: number\n }\n\n /** Human-readable signing instructions */\n instructions: string\n}\n\nexport interface PaymentIntent {\n /** Unique payment ID */\n paymentId: string\n\n /** Current status */\n status: 'pending_signature'\n\n /** ISO 8601 expiry timestamp */\n expiresAt: string\n\n /** Data needed to sign the payment */\n signData: SignData\n}\n\nexport type PaymentStatus =\n | 'pending_signature'\n | 'submitted'\n | 'confirmed'\n | 'pending_approval'\n | 'approved'\n | 'proposed'\n | 'executed'\n | 'rejected'\n | 'expired'\n | 'failed'\n\nexport interface PaymentResult {\n /** Unique payment ID */\n paymentId: string\n\n /** Final status */\n status: PaymentStatus\n\n /** Token that was sent */\n token: string\n\n /** Amount that was sent (human-readable) */\n amount: string\n\n /** Recipient address */\n to: string\n\n /** On-chain transaction hash (present when confirmed) */\n txHash: string | null\n\n /** Error message (present when failed) */\n errorMessage: string | null\n\n /** Block explorer URL for the transaction (chain-dependent) */\n explorerUrl: string | null\n\n /** ISO 8601 timestamps */\n createdAt: string\n signedAt: string | null\n submittedAt: string | null\n confirmedAt: string | null\n expiresAt: string\n}\n\n// ── x402 Types ──────────────────────────────────────────────────\n\n/** Payment requirements from an HTTP 402 response (x402 protocol). */\nexport interface X402PaymentRequired {\n x402Version: number\n resource: {\n url: string\n description?: string\n mimeType?: string\n }\n accepts: X402PaymentOption[]\n error?: string\n}\n\n/** A single payment option from x402 PaymentRequired. */\nexport interface X402PaymentOption {\n scheme: string // \"exact\"\n network: string // CAIP-2 chain ID or x402 network, e.g. \"eip155:8453\" or \"base\"\n amount: string // Atomic units\n maxAmountRequired?: string // Atomic units (official x402 field)\n resource?: string\n description?: string\n mimeType?: string\n asset: string // Token contract address\n payTo: string // Recipient address\n maxTimeoutSeconds: number\n extra?: Record<string, unknown>\n}\n\n/** Receipt returned after a successful x402 payment. */\nexport interface X402Receipt {\n success: boolean\n paymentId: string\n txHash: string\n token: string\n amount: string\n to: string\n resourceUrl: string\n explorerUrl: string\n accepted?: X402PaymentOption\n paymentHeader?: string\n merchantTo?: string | null\n payer?: string\n chainId?: number\n haven?: {\n paymentId: string\n fundingTxHash: string\n fundingExplorerUrl: string\n }\n merchant?: {\n payTo: string | null\n settlementTxHash?: string | null\n settlementExplorerUrl?: string | null\n }\n x402?: {\n amount: string\n token: string\n network: string\n asset: string\n resource: string\n }\n}\n\nexport interface X402AuthorizationOptions {\n /** Stable caller-supplied key for this user intent. Prevents duplicate approvals across fresh 402 quotes. */\n idempotencyKey?: string\n}\n\n/**\n * Keyless x402 construct result.\n *\n * Returned by `createX402Intent` — the non-custodial half of an x402 payment.\n * It carries the unsigned funding hash (`signData.hash`, Safe → delegate EOA)\n * plus everything the *edge* needs to build and sign the EIP-3009 merchant\n * header itself. The construct path never signs; both delegate signatures\n * (funding hash + merchant header) happen on the machine that holds the key.\n */\nexport interface X402Intent {\n /** Haven payment id for the funding transfer. */\n paymentId: string\n status: 'pending_signature'\n /** ISO 8601 expiry of the funding intent, if returned. */\n expiresAt?: string\n /** The unsigned funding hash to sign with the delegate key (Safe → delegate EOA). */\n signData: SignData\n /** The selected x402 option — the edge needs this to build the EIP-3009 header. */\n accepted: X402PaymentOption\n /** Resource URL the 402 came from. */\n resourceUrl: string\n /** Merchant payTo address (the final recipient of the EIP-3009 transfer). */\n merchantTo: string\n /** Atomic amount the edge signer must authorize in the merchant header. */\n amountAtomic: string\n /** Token contract the merchant header must pay. */\n asset: string\n /** x402 network the merchant header must use. */\n network: string\n /** Haven-authenticated binding over the x402 expected context. */\n expectedAuth: X402ExpectedAuth\n /** Delegate EOA the funding transfer tops up (the x402 payer). */\n fundingTo: string\n}\n\nexport interface X402ExpectedContext {\n paymentId: string\n payloadHash: string\n resourceUrl: string\n merchantTo: string\n amount: string\n asset: string\n network: string\n}\n\nexport interface X402ExpectedAuth {\n version: 1\n message: string\n signature: string\n signer: string\n}\n\n/** Serializable HTTP request state for retrying the same x402 merchant request. */\nexport interface X402RequestSnapshot {\n url: string\n method: string\n headers: [string, string][]\n body?: string\n}\n\n/** Quote parsed from an HTTP 402 response without creating a Haven payment. */\nexport interface X402Quote {\n rail: 'x402'\n idempotencyKey: string\n paymentRequired: X402PaymentRequired\n accepted: X402PaymentOption\n request: X402RequestSnapshot\n resourceUrl: string\n description: string | null\n mimeType: string | null\n amountAtomic: string\n amount: string\n token: string\n asset: string\n network: string\n chainId: number | null\n merchantAddress: string\n maxTimeoutSeconds: number\n}\n\n/** State bundle an agent can persist while waiting for manual x402 approval. */\nexport interface X402ResumeState {\n rail: 'x402'\n paymentId: string\n idempotencyKey: string\n paymentRequired: X402PaymentRequired\n accepted: X402PaymentOption\n url: string\n request?: X402RequestSnapshot\n resourceUrl: string\n description: string | null\n amountAtomic: string\n amount: string\n token: string\n asset: string\n network: string\n chainId: number | null\n merchantAddress: string\n}\n\nexport interface MppAuthorizationOptions {\n /** Stable caller-supplied key for this user intent. Prevents duplicate approvals across retries. */\n idempotencyKey?: string\n}\n\n/** Quote parsed from an MPP challenge without creating a Haven payment. */\nexport interface MppQuote {\n rail: 'mpp'\n paymentRail: MachinePaymentRail\n idempotencyKey: string\n challenge: MachinePaymentChallenge\n request: X402RequestSnapshot\n resourceUrl: string\n description: string | null\n amountAtomic: string\n amount: string\n token: string\n asset: string\n network: string\n chainId: number\n merchantAddress: string\n expiresAt: string\n}\n\n/** State bundle an agent can persist while waiting for manual MPP approval. */\nexport interface MppResumeState {\n rail: 'mpp'\n paymentRail: MachinePaymentRail\n paymentId: string\n idempotencyKey: string\n challenge: MachinePaymentChallenge\n url: string\n request?: X402RequestSnapshot\n resourceUrl: string\n description: string | null\n amountAtomic: string\n amount: string\n token: string\n asset: string\n network: string\n chainId: number\n merchantAddress: string\n expiresAt: string\n}\n\nexport type PaymentResumeState = X402ResumeState | MppResumeState\n\nexport interface ResumeAuthorizedX402Input extends X402AuthorizationOptions {\n /** Payment or approval request ID returned by authorizeX402 / haven.fetch. */\n paymentId: string\n\n /** Original or freshly parsed x402 requirements for the merchant retry. */\n paymentRequired: X402PaymentRequired\n}\n\nexport interface ResumeX402PaymentInput extends X402AuthorizationOptions {\n /** Payment or approval request ID returned by authorizeX402 / haven.fetch. */\n paymentId: string\n\n /** Original paid URL. If paymentRequired is omitted, Haven will call it once to re-read the 402 challenge. */\n url: string\n\n /** Original fetch options. Reused for the 402 probe and final merchant retry. */\n init?: RequestInit\n\n /** Serializable original request captured by quoteX402() / pending approval errors. */\n request?: X402RequestSnapshot\n\n /** Original or freshly parsed x402 requirements. Supplying this avoids an extra merchant 402 probe. */\n paymentRequired?: X402PaymentRequired\n}\n\nexport interface ResumeAuthorizedMppInput extends MppAuthorizationOptions {\n /** Payment or approval request ID returned by authorizeMachinePayment / haven.fetch. */\n paymentId: string\n\n /** Original MPP challenge returned by the paid resource. */\n challenge: MachinePaymentChallenge\n}\n\nexport interface ResumeMppPaymentInput extends MppAuthorizationOptions {\n /** Payment or approval request ID returned by authorizeMachinePayment / haven.fetch. */\n paymentId: string\n\n /** Original paid URL. If challenge is omitted, Haven will call it once to re-read the MPP challenge. */\n url: string\n\n /** Original fetch options. Reused for the 402 probe and final merchant retry. */\n init?: RequestInit\n\n /** Serializable original request captured by quoteMpp() / pending approval errors. */\n request?: X402RequestSnapshot\n\n /** Original MPP challenge. Supplying this avoids an extra paid-resource 402 probe. */\n challenge?: MachinePaymentChallenge\n}\n\n// ── Machine Payment Types ───────────────────────────────────────\n\nexport type MachinePaymentRail =\n | 'x402'\n | 'mpp_demo'\n | 'mpp_crypto'\n | 'stripe_deposit'\n | 'spt'\n\nexport interface MachinePaymentChallenge {\n rail: MachinePaymentRail\n version: string\n challengeId: string\n resource: string\n description: string\n network: {\n chainId: number\n name: 'base'\n }\n asset: {\n symbol: 'USDC'\n address: string\n decimals: 6\n }\n amount: {\n display: string\n atomic: string\n }\n recipient: string\n expiresAt: string\n metadata?: Record<string, unknown>\n}\n\nexport interface MachinePaymentReceipt {\n success: boolean\n rail: MachinePaymentRail\n paymentId: string\n challengeId: string\n txHash: string\n token: string\n amount: string\n to: string\n resourceUrl: string\n explorerUrl: string\n payer?: string\n chainId?: number\n proofHeader: string\n}\n\nexport interface HavenAgent {\n id: string\n name: string\n status: string\n safeAddress: string\n delegateAddress: string\n chainId: number\n}\n\nexport interface HavenAllowance {\n id: string\n tokenAddress: string\n tokenSymbol: string\n configuredAmount: string\n resetPeriodMin: number\n onchain: {\n amount: string\n spent: string\n remaining: string\n effectiveSpent: string\n resetTimeMin: number\n lastResetMin: number\n nonce: number\n isResetPending: boolean\n }\n}\n\nexport interface HavenAllowanceSummary {\n agentId: string\n safeAddress: string\n delegateAddress: string\n chainId: number\n allowances: HavenAllowance[]\n}\n\nexport interface HavenPaymentReceipt {\n id: string\n paymentId: string\n paymentIntentId?: string | null\n approvalRequestId?: string | null\n rail: string\n proofStatus: string\n txHash: string\n chainId: number\n resourceUrl: string\n merchantAddress: string | null\n payerAddress: string\n settlementAddress: string\n tokenSymbol: string\n tokenAddress: string\n amountRaw: string\n amount: string\n challengeId: string | null\n idempotencyKey: string | null\n challengePayload?: Record<string, unknown> | null\n selectedPayment?: Record<string, unknown> | null\n paymentProofHeaderName: string | null\n protocolReceiptHeaderName: string | null\n protocolReceiptPayload?: Record<string, unknown> | null\n merchantStatus: number | null\n confirmedAt: string | null\n createdAt: string\n updatedAt: string\n}\n\n// ── Agent Payment State Types ────────────────────────────────────\n\nexport type PaymentStateKind = 'payment_intent' | 'approval_request'\n\nexport interface AgentPaymentEnumSchema {\n type: 'string'\n enum: readonly string[]\n description: string\n 'x-enumDescriptions': Record<string, string>\n}\n\nexport const AgentPaymentPhase = {\n /** The agent must sign and submit the prepared payment before Haven can relay it. */\n AgentSignatureRequired: 'agent_signature_required',\n /** Haven has received the signed payment and the agent should poll for confirmation. */\n PaymentSubmitted: 'payment_submitted',\n /** The direct payment is confirmed; the agent does not need to do more for this payment id. */\n PaymentConfirmed: 'payment_confirmed',\n /** The payment needs wallet owner approval in Haven before it can continue. */\n UserApprovalRequired: 'user_approval_required',\n /** The wallet owner approved the request and still needs to complete the funding payment. */\n UserExecutionRequired: 'user_execution_required',\n /** The funding payment was proposed and is waiting for the remaining account approvals. */\n WaitingForAdditionalApprovals: 'waiting_for_additional_approvals',\n /** The Haven funding leg was sent; the agent can continue the merchant/protocol leg. */\n FundingSent: 'funding_sent',\n /** The wallet owner rejected the request; the agent should stop and tell the user. */\n Rejected: 'rejected',\n /** The payment or approval request expired before completion. */\n Expired: 'expired',\n /** Haven could not complete the payment; the agent should stop and surface the failure. */\n Failed: 'failed',\n} as const\n\nexport type AgentPaymentPhase = (typeof AgentPaymentPhase)[keyof typeof AgentPaymentPhase]\n\nexport const AgentPaymentNextAction = {\n /** Sign with the delegate key and submit the payment to Haven. */\n SignAndSubmitPayment: 'sign_and_submit_payment',\n /** Poll getPaymentStatus later using this payment id. */\n CheckStatusLater: 'check_status_later',\n /** No further agent action is required for this payment id. */\n None: 'none',\n /** Wait for the wallet owner to approve or reject the request in Haven. */\n WaitForUserApproval: 'wait_for_user_approval',\n /** Wait for the wallet owner to finish sending the approved funding payment. */\n WaitForUserToCompletePayment: 'wait_for_user_to_complete_payment',\n /** Resume this payment id and retry the original x402 request with the merchant payment header. */\n RetryOriginalX402Request: 'retry_original_x402_request',\n /** Stop retrying this payment and tell the user what happened. */\n StopAndTellUser: 'stop_and_tell_user',\n /** Ask again only if the user still wants the payment after expiry. */\n RequestAgainIfUserStillWantsIt: 'request_again_if_user_still_wants_it',\n} as const\n\nexport type AgentPaymentNextAction = (typeof AgentPaymentNextAction)[keyof typeof AgentPaymentNextAction]\n\n/**\n * Stable rail identifier carried on Haven agent payment responses and resume\n * state.\n *\n * Two layers of vocabulary share this enum because both reach the wire:\n *\n * - **Categorical rails** identify the rail family and are used as\n * discriminators on `PaymentResumeState`: `direct`, `x402`, `mpp`.\n * - **Granular rails** identify the specific protocol the backend persists\n * and returns on response bodies: `mpp_demo`, `mpp_crypto`,\n * `stripe_deposit`, `spt`. `x402` doubles as both categorical and\n * granular.\n *\n * Consumers reading the top-level `rail` field on a payment status response\n * should treat any `mpp*` value as the MPP family; consumers reading the\n * `rail` field on a `MppResumeState` will always see the categorical `mpp`,\n * with the granular value on `paymentRail`.\n */\nexport const AgentPaymentRail = {\n /** Standard Haven payment from the user's Safe through an approved delegate allowance. */\n Direct: 'direct',\n /** x402 HTTP 402 payment flow with a Haven funding leg and merchant retry leg. */\n X402: 'x402',\n /** Machine Payment Protocol family — categorical value used as a resume-state discriminator. */\n Mpp: 'mpp',\n /** Haven internal MPP demo rail. Not for production traffic. */\n MppDemo: 'mpp_demo',\n /** Crypto-settled MPP rail. */\n MppCrypto: 'mpp_crypto',\n /** Stripe-deposit-backed MPP rail. */\n StripeDeposit: 'stripe_deposit',\n /** Stripe Payment Token MPP rail. */\n Spt: 'spt',\n} as const\n\nexport type AgentPaymentRail = (typeof AgentPaymentRail)[keyof typeof AgentPaymentRail]\n\nexport type PaymentPhase = AgentPaymentPhase\n\nexport type PaymentNextAction = AgentPaymentNextAction\n\nexport const AGENT_PAYMENT_PHASE_VALUES = Object.values(AgentPaymentPhase)\n\nexport const AGENT_PAYMENT_NEXT_ACTION_VALUES = Object.values(AgentPaymentNextAction)\n\nexport const AGENT_PAYMENT_RAIL_VALUES = Object.values(AgentPaymentRail)\n\nexport const AgentPaymentPhaseDescriptions: Record<AgentPaymentPhase, string> = {\n [AgentPaymentPhase.AgentSignatureRequired]: 'The agent must sign and submit the prepared payment before Haven can relay it.',\n [AgentPaymentPhase.PaymentSubmitted]: 'Haven has received the signed payment and the agent should poll for confirmation.',\n [AgentPaymentPhase.PaymentConfirmed]: 'The direct payment is confirmed; the agent does not need to do more for this payment id.',\n [AgentPaymentPhase.UserApprovalRequired]: 'The payment needs wallet owner approval in Haven before it can continue.',\n [AgentPaymentPhase.UserExecutionRequired]: 'The wallet owner approved the request and still needs to complete the funding payment.',\n [AgentPaymentPhase.WaitingForAdditionalApprovals]: 'The funding payment was proposed and is waiting for the remaining account approvals.',\n [AgentPaymentPhase.FundingSent]: 'The Haven funding leg was sent; the agent can continue the merchant/protocol leg.',\n [AgentPaymentPhase.Rejected]: 'The wallet owner rejected the request; the agent should stop and tell the user.',\n [AgentPaymentPhase.Expired]: 'The payment or approval request expired before completion.',\n [AgentPaymentPhase.Failed]: 'Haven could not complete the payment; the agent should stop and surface the failure.',\n}\n\nexport const AgentPaymentNextActionDescriptions: Record<AgentPaymentNextAction, string> = {\n [AgentPaymentNextAction.SignAndSubmitPayment]: 'Sign with the delegate key and submit the payment to Haven.',\n [AgentPaymentNextAction.CheckStatusLater]: 'Poll getPaymentStatus later using this payment id.',\n [AgentPaymentNextAction.None]: 'No further agent action is required for this payment id.',\n [AgentPaymentNextAction.WaitForUserApproval]: 'Wait for the wallet owner to approve or reject the request in Haven.',\n [AgentPaymentNextAction.WaitForUserToCompletePayment]: 'Wait for the wallet owner to finish sending the approved funding payment.',\n [AgentPaymentNextAction.RetryOriginalX402Request]: 'Resume this payment id and retry the original x402 request with the merchant payment header.',\n [AgentPaymentNextAction.StopAndTellUser]: 'Stop retrying this payment and tell the user what happened.',\n [AgentPaymentNextAction.RequestAgainIfUserStillWantsIt]: 'Ask again only if the user still wants the payment after expiry.',\n}\n\nexport const AgentPaymentRailDescriptions: Record<AgentPaymentRail, string> = {\n [AgentPaymentRail.Direct]: 'Standard Haven payment from the user-controlled Safe through an approved delegate allowance.',\n [AgentPaymentRail.X402]: 'x402 HTTP 402 payment flow with a Haven funding leg and merchant retry leg.',\n [AgentPaymentRail.Mpp]: 'Categorical MPP rail value used as a resume-state discriminator. Response bodies carry a granular mpp_* value instead.',\n [AgentPaymentRail.MppDemo]: 'Haven internal MPP demo rail. Not for production traffic.',\n [AgentPaymentRail.MppCrypto]: 'Crypto-settled MPP rail.',\n [AgentPaymentRail.StripeDeposit]: 'Stripe-deposit-backed MPP rail.',\n [AgentPaymentRail.Spt]: 'Stripe Payment Token MPP rail.',\n}\n\nexport const AgentPaymentPhaseSchema: AgentPaymentEnumSchema = {\n type: 'string',\n enum: AGENT_PAYMENT_PHASE_VALUES,\n description: 'Stable Haven agent payment state phase.',\n 'x-enumDescriptions': AgentPaymentPhaseDescriptions,\n}\n\nexport const AgentPaymentNextActionSchema: AgentPaymentEnumSchema = {\n type: 'string',\n enum: AGENT_PAYMENT_NEXT_ACTION_VALUES,\n description: 'Stable next action an agent should take for a Haven payment state.',\n 'x-enumDescriptions': AgentPaymentNextActionDescriptions,\n}\n\nexport const AgentPaymentRailSchema: AgentPaymentEnumSchema = {\n type: 'string',\n enum: AGENT_PAYMENT_RAIL_VALUES,\n description: 'Stable rail identifier for Haven agent payment states.',\n 'x-enumDescriptions': AgentPaymentRailDescriptions,\n}\n\nexport interface PaymentStatusResult {\n paymentId: string\n kind: PaymentStateKind\n rail: string\n status: PaymentStatus | string\n phase: PaymentPhase\n nextAction: PaymentNextAction\n amount: string\n token: string\n resourceUrl: string | null\n merchantAddress: string | null\n txHash: string | null\n expiresAt: string\n chainId: number\n message: string\n amountAtomic?: string | null\n asset?: string | null\n network?: string | null\n description?: string | null\n idempotencyKey?: string | null\n x402?: {\n amountAtomic: string | null\n asset: string | null\n network: string | null\n resourceUrl: string | null\n merchantAddress: string | null\n description: string | null\n idempotencyKey: string | null\n }\n mpp?: {\n amountAtomic: string | null\n asset: string | null\n network: string | null\n resourceUrl: string | null\n merchantAddress: string | null\n description: string | null\n idempotencyKey: string | null\n challengeId: string | null\n }\n}\n\nexport interface PendingApproval extends PaymentStatusResult {\n kind: 'approval_request'\n status: 'pending_approval' | 'pending' | string\n phase: typeof AgentPaymentPhase.UserApprovalRequired\n nextAction: typeof AgentPaymentNextAction.WaitForUserApproval\n requested?: string\n remaining?: string | null\n}\n\n/** @internal */\nexport interface RawMachinePaymentAuthorizeResponse {\n success?: boolean\n payment_id: string\n kind?: string\n status: string\n phase?: string\n next_action?: string\n message?: string\n remaining?: string | null\n requested?: string\n tx_hash?: string\n chain_id?: number\n safe_address?: string\n payer?: string\n token?: string\n amount?: string\n amount_atomic?: string | null\n asset?: string | null\n network?: string | null\n description?: string | null\n idempotency_key?: string | null\n to?: string\n merchant_to?: string | null\n merchant_address?: string | null\n resource_url?: string\n rail?: string\n x402?: RawX402StateContext\n mpp?: RawMppStateContext\n challenge_id?: string\n explorer_url?: string\n expires_at?: string\n sign_data?: {\n hash: string\n components: {\n safe: string\n token: string\n to: string\n amount: string\n payment_token: string\n payment: string\n nonce: number\n }\n instructions: string\n }\n error?: string\n}\n\n/** @internal */\nexport interface RawX402AuthorizeResponse {\n success?: boolean\n payment_id: string\n kind?: string\n rail?: string\n status: string\n phase?: string\n next_action?: string\n message?: string\n remaining?: string | null\n requested?: string\n tx_hash?: string\n chain_id?: number\n safe_address?: string\n payer?: string\n token?: string\n amount?: string\n amount_atomic?: string | null\n asset?: string | null\n network?: string | null\n description?: string | null\n idempotency_key?: string | null\n to?: string\n merchant_to?: string | null\n merchant_address?: string | null\n x402_expected_auth?: X402ExpectedAuth\n resource_url?: string\n explorer_url?: string\n x402?: RawX402StateContext\n mpp?: RawMppStateContext\n challenge_id?: string\n expires_at?: string\n sign_data?: {\n hash: string\n components: {\n safe: string\n token: string\n to: string\n amount: string\n payment_token: string\n payment: string\n nonce: number\n }\n instructions: string\n }\n error?: string\n}\n\n// ── API Response Shapes (raw, snake_case from server) ────────────\n\n/** @internal */\nexport interface RawCreateResponse {\n payment_id: string\n kind?: string\n status: string\n phase?: string\n next_action?: string\n message?: string\n remaining?: string | null\n requested?: string\n expires_at: string\n sign_data: {\n hash: string\n components: {\n safe: string\n token: string\n to: string\n amount: string\n payment_token: string\n payment: string\n nonce: number\n }\n instructions: string\n }\n error?: string\n supported?: string[]\n}\n\n/** @internal */\nexport interface RawSignResponse {\n payment_id: string\n kind?: string\n status: string\n phase?: string\n next_action?: string\n message?: string\n remaining?: string | null\n requested?: string\n tx_hash?: string\n token?: string\n amount?: string\n amount_atomic?: string | null\n asset?: string | null\n network?: string | null\n description?: string | null\n idempotency_key?: string | null\n to?: string\n merchant_to?: string | null\n merchant_address?: string | null\n resource_url?: string\n rail?: string\n x402?: RawX402StateContext\n mpp?: RawMppStateContext\n challenge_id?: string\n explorer_url?: string\n chain_id?: number\n expires_at?: string\n error?: string\n details?: string\n}\n\n/** @internal */\nexport interface RawStatusResponse {\n payment_id: string\n status: string\n token: string\n amount: string\n to: string\n tx_hash: string | null\n explorer_url?: string | null\n chain_id?: number\n error_message: string | null\n created_at: string\n signed_at: string | null\n submitted_at: string | null\n confirmed_at: string | null\n expires_at: string\n}\n\n/** @internal */\nexport interface RawPaymentStatusResult {\n payment_id: string\n kind: PaymentStateKind\n rail: string\n status: string\n phase: PaymentPhase\n next_action: PaymentNextAction\n amount: string\n token: string\n resource_url: string | null\n merchant_address: string | null\n tx_hash: string | null\n expires_at: string\n chain_id: number\n message: string\n amount_atomic?: string | null\n asset?: string | null\n network?: string | null\n description?: string | null\n idempotency_key?: string | null\n x402?: RawX402StateContext\n mpp?: RawMppStateContext\n}\n\n/** @internal */\nexport interface RawHavenAgent {\n id: string\n name: string\n status: string\n safe_address: string\n delegate_address: string\n chain_id: number\n}\n\n/** @internal */\nexport interface RawHavenAllowance {\n id: string\n token_address: string\n token_symbol: string\n configured_amount: string\n reset_period_min: number\n onchain: {\n amount: string\n spent: string\n remaining: string\n effective_spent: string\n reset_time_min: number\n last_reset_min: number\n nonce: number\n is_reset_pending: boolean\n }\n}\n\n/** @internal */\nexport interface RawHavenAllowanceSummary {\n agent_id: string\n safe_address: string\n delegate_address: string\n chain_id: number\n allowances: RawHavenAllowance[]\n}\n\n/** @internal */\nexport interface RawHavenPaymentReceipt {\n id: string\n payment_id: string\n payment_intent_id?: string | null\n approval_request_id?: string | null\n rail: string\n proof_status: string\n tx_hash: string\n chain_id: number\n resource_url: string\n merchant_address: string | null\n payer_address: string\n settlement_address: string\n token_symbol: string\n token_address: string\n amount_raw: string\n amount_human: string\n challenge_id: string | null\n idempotency_key: string | null\n challenge_payload?: Record<string, unknown> | null\n selected_payment?: Record<string, unknown> | null\n payment_proof_header_name: string | null\n protocol_receipt_header_name: string | null\n protocol_receipt_payload?: Record<string, unknown> | null\n merchant_status: number | null\n confirmed_at: string | null\n created_at: string\n updated_at: string\n}\n\n/** @internal */\nexport interface RawHavenPaymentReceiptsResponse {\n receipts: RawHavenPaymentReceipt[]\n}\n\n/** @internal */\nexport interface RawX402StateContext {\n amount_atomic?: string | null\n asset?: string | null\n network?: string | null\n resource_url?: string | null\n merchant_address?: string | null\n description?: string | null\n idempotency_key?: string | null\n}\n\n/** @internal */\nexport interface RawMppStateContext {\n amount_atomic?: string | null\n asset?: string | null\n network?: string | null\n resource_url?: string | null\n merchant_address?: string | null\n description?: string | null\n idempotency_key?: string | null\n challenge_id?: string | null\n}\n\n// ── Error Types ──────────────────────────────────────────────────\n\nexport class HavenError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly statusCode?: number,\n public readonly paymentId?: string,\n ) {\n super(message)\n this.name = 'HavenError'\n }\n}\n\nexport class HavenApiError extends HavenError {\n constructor(\n message: string,\n statusCode: number,\n public readonly body?: unknown,\n paymentId?: string,\n ) {\n super(message, 'API_ERROR', statusCode, paymentId)\n this.name = 'HavenApiError'\n }\n}\n\nexport class HavenPaymentStateError extends HavenApiError {\n resumeState?: X402ResumeState | MppResumeState\n\n constructor(\n message: string,\n statusCode: number,\n public readonly state: PaymentStatusResult,\n body?: unknown,\n ) {\n super(message, statusCode, body, state.paymentId)\n this.name = 'HavenPaymentStateError'\n }\n\n get status(): string {\n return this.state.status\n }\n\n get phase(): PaymentPhase {\n return this.state.phase\n }\n\n get nextAction(): PaymentNextAction {\n return this.state.nextAction\n }\n}\n\nexport class HavenSigningError extends HavenError {\n constructor(message: string) {\n super(message, 'SIGNING_ERROR')\n this.name = 'HavenSigningError'\n }\n}\n\nexport class HavenTimeoutError extends HavenError {\n constructor(paymentId: string) {\n super(\n `Timed out waiting for payment ${paymentId} to confirm`,\n 'TIMEOUT',\n undefined,\n paymentId,\n )\n this.name = 'HavenTimeoutError'\n }\n}\n","import { ethers } from 'ethers'\nimport { HavenSigningError } from './types.js'\n\n/**\n * Sign a hash using raw ECDSA (no Ethereum message prefix).\n *\n * This matches what Safe's AllowanceModule `checkSignature` expects —\n * a direct ecrecover over the hash, NOT the \"\\x19Ethereum Signed Message\" variant.\n *\n * Uses ethers.SigningKey.sign() instead of wallet.signMessage() to avoid the prefix.\n */\nexport function signHash(privateKey: string, hash: string): string {\n try {\n const signingKey = new ethers.SigningKey(privateKey)\n const sig = signingKey.sign(hash)\n return sig.serialized // 0x + r(32) + s(32) + v(1)\n } catch (err) {\n throw new HavenSigningError(\n `Failed to sign hash: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n}\n\n/**\n * Derive the Ethereum address from a private key.\n */\nexport function addressFromKey(privateKey: string): string {\n try {\n return new ethers.Wallet(privateKey).address\n } catch (err) {\n throw new HavenSigningError(\n `Invalid private key: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n}\n\n/**\n * Verify that a signature over a hash recovers to the expected address.\n */\nexport function verifySignature(hash: string, signature: string, expectedAddress: string): boolean {\n try {\n const recovered = ethers.recoverAddress(hash, signature)\n return recovered.toLowerCase() === expectedAddress.toLowerCase()\n } catch {\n return false\n }\n}\n","/**\n * x402 protocol support for the Haven SDK.\n *\n * Provides:\n * - parsePaymentRequired() — extract payment requirements from a 402 response\n * - parsePaymentRequiredResponse() — async parser with JSON body fallback\n * - encodePaymentProof() — encode a receipt as a PAYMENT-SIGNATURE header\n *\n * The main authorizeX402() and fetchWithPayment() are methods on HavenClient\n * (see client.ts) since they need API access and signing.\n */\n\nimport { createHash } from 'node:crypto'\nimport type { X402ExpectedContext, X402PaymentRequired, X402PaymentOption } from './types.js'\nimport type { PaymentRequirements } from 'x402/types'\n\nconst BASE_USDC_ADDRESS = '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913'\nconst X402_IDEMPOTENCY_BUCKET_MS = 300_000\n\nfunction decodeBase64Json<T>(value: string, label: string): T {\n try {\n return JSON.parse(atob(value)) as T\n } catch {\n throw new Error(`Failed to decode ${label}`)\n }\n}\n\nfunction normalizePaymentOption(value: unknown): X402PaymentOption | null {\n const candidate = value as Partial<X402PaymentOption> | null\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n typeof candidate.scheme !== 'string' ||\n typeof candidate.network !== 'string' ||\n typeof candidate.asset !== 'string' ||\n typeof candidate.payTo !== 'string'\n ) {\n return null\n }\n\n const amount =\n typeof candidate.amount === 'string'\n ? candidate.amount\n : typeof candidate.maxAmountRequired === 'string'\n ? candidate.maxAmountRequired\n : null\n\n if (!amount) return null\n\n return {\n scheme: candidate.scheme,\n network: candidate.network,\n amount,\n maxAmountRequired: candidate.maxAmountRequired,\n resource: candidate.resource,\n description: candidate.description,\n mimeType: candidate.mimeType,\n asset: candidate.asset,\n payTo: candidate.payTo,\n maxTimeoutSeconds: candidate.maxTimeoutSeconds ?? 30,\n extra: candidate.extra,\n }\n}\n\nfunction normalizePaymentRequired(value: unknown): X402PaymentRequired | null {\n const candidate = value as Partial<X402PaymentRequired> | null\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n typeof candidate.x402Version !== 'number' ||\n !Array.isArray(candidate.accepts)\n ) {\n return null\n }\n\n const accepts = candidate.accepts\n .map((option) => normalizePaymentOption(option))\n .filter((option): option is X402PaymentOption => !!option)\n\n if (accepts.length === 0) return null\n\n const first = accepts[0]\n const resourceUrl = candidate.resource?.url ?? first.resource\n if (!resourceUrl) return null\n\n const resource = {\n url: resourceUrl,\n description: candidate.resource?.description ?? first.description,\n mimeType: candidate.resource?.mimeType ?? first.mimeType,\n }\n\n return {\n x402Version: candidate.x402Version,\n resource,\n accepts,\n error: candidate.error,\n }\n}\n\n// ── Supported networks ───────────────────────────────────────────\n\n/** Network identifiers that Haven can recognise in x402 payment requests. */\nexport const SUPPORTED_X402_NETWORKS: Record<string, string> = {\n 'eip155:100': 'Gnosis Chain',\n 'eip155:8453': 'Base',\n 'base': 'Base',\n}\n\n/** Networks supported by the official x402 EIP-3009 exact scheme. */\nconst STANDARD_X402_NETWORKS: Record<string, PaymentRequirements['network']> = {\n 'eip155:8453': 'base',\n 'base': 'base',\n}\n\n// ── Token address maps ────────────────────────────────────────────\n\n/** Known tokens on Gnosis Chain (chainId 100). */\nconst GNOSIS_TOKENS: Record<string, { symbol: string; decimals: number }> = {\n '0x0000000000000000000000000000000000000000': { symbol: 'xDAI', decimals: 18 },\n '0xcb444e90d8198415266c6a2724b7900fb12fc56e': { symbol: 'EURe', decimals: 18 },\n '0x2a22f9c3b484c3629090feed35f17ff8f88f76f0': { symbol: 'USDC.e', decimals: 6 },\n}\n\n/** Known tokens on Base (chainId 8453). */\nconst BASE_TOKENS: Record<string, { symbol: string; decimals: number }> = {\n '0x0000000000000000000000000000000000000000': { symbol: 'ETH', decimals: 18 },\n '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913': { symbol: 'USDC', decimals: 6 },\n}\n\n/** All known tokens across all supported chains (for display / resolution). */\nconst ALL_TOKENS: Record<string, { symbol: string; decimals: number }> = {\n ...GNOSIS_TOKENS,\n ...BASE_TOKENS,\n}\n\n/** Maps CAIP-2 network ID → token address map. */\nconst NETWORK_TOKENS: Record<string, Record<string, { symbol: string; decimals: number }>> = {\n 'eip155:100': GNOSIS_TOKENS,\n 'eip155:8453': BASE_TOKENS,\n 'base': BASE_TOKENS,\n}\n\n// ── Parser ───────────────────────────────────────────────────────\n\n/**\n * Parse an HTTP 402 response into x402 PaymentRequired data.\n *\n * Supports:\n * - v2: PAYMENT-REQUIRED header (base64 JSON)\n * - v1 fallback: X-PAYMENT header or response body\n */\nexport function parsePaymentRequired(response: Response): X402PaymentRequired {\n // v2: PAYMENT-REQUIRED header\n const v2Header = response.headers.get('PAYMENT-REQUIRED')\n if (v2Header) {\n const parsed = normalizePaymentRequired(\n decodeBase64Json<unknown>(v2Header, 'PAYMENT-REQUIRED header'),\n )\n if (parsed) return parsed\n }\n\n // v1: X-PAYMENT header\n const v1Header = response.headers.get('X-PAYMENT')\n if (v1Header) {\n const parsed = normalizePaymentRequired(\n decodeBase64Json<unknown>(v1Header, 'X-PAYMENT header'),\n )\n if (parsed) return parsed\n }\n\n throw new Error(\n 'No x402 payment headers found in 402 response. ' +\n 'Expected PAYMENT-REQUIRED (v2) or X-PAYMENT (v1) header.',\n )\n}\n\n/**\n * Parse an HTTP 402 response into x402 PaymentRequired data.\n *\n * Soundside and other Bazaar-style MCP endpoints return the PaymentRequired\n * object in the JSON body, while older Haven demos and many x402 examples use\n * base64 headers. This keeps the synchronous header parser intact and adds the\n * body fallback needed for those endpoints.\n */\nexport async function parsePaymentRequiredResponse(\n response: Response,\n): Promise<X402PaymentRequired> {\n try {\n return parsePaymentRequired(response)\n } catch (headerErr) {\n try {\n const body = await response.clone().json()\n const parsed = normalizePaymentRequired(body)\n if (parsed) return parsed\n } catch {\n // Fall through to the original, more specific header error below.\n }\n\n throw headerErr\n }\n}\n\n/**\n * Select the best payment option from the x402 accepts array.\n *\n * Preference order:\n * 1. Option on a Haven-supported network with a known token\n * 2. Any option on a Haven-supported network\n * 3. null — no compatible option\n */\nexport function selectPaymentOption(\n accepts: X402PaymentOption[],\n): X402PaymentOption | null {\n if (!accepts || accepts.length === 0) return null\n\n // First pass: find a supported network with a known token\n for (const opt of accepts) {\n if (opt.network in SUPPORTED_X402_NETWORKS) {\n const networkTokens = NETWORK_TOKENS[opt.network]\n if (networkTokens?.[opt.asset.toLowerCase()]) return opt\n }\n }\n\n // Second pass: any supported network\n for (const opt of accepts) {\n if (opt.network in SUPPORTED_X402_NETWORKS) {\n return opt\n }\n }\n\n // No compatible option found\n return null\n}\n\n/**\n * Select an option that can be paid with the official x402 EIP-3009 exact\n * scheme. Haven's older tx-hash proof path can describe more networks; the\n * merchant-verified path currently needs Base USDC.\n */\nexport function selectStandardPaymentOption(\n accepts: X402PaymentOption[],\n): X402PaymentOption | null {\n if (!accepts || accepts.length === 0) return null\n\n for (const opt of accepts) {\n if (\n opt.scheme === 'exact' &&\n opt.network in STANDARD_X402_NETWORKS &&\n opt.asset.toLowerCase() === BASE_USDC_ADDRESS\n ) {\n return opt\n }\n }\n\n return null\n}\n\nexport function x402AuthorizationAmount(option: X402PaymentOption): string {\n return option.maxAmountRequired ?? option.amount\n}\n\nexport function buildX402ExpectedMessage(context: X402ExpectedContext): string {\n return `Haven x402 expected context v1\\n${stableStringify({\n version: 1,\n kind: 'haven.x402.expected',\n paymentId: context.paymentId,\n payloadHash: context.payloadHash.toLowerCase(),\n resourceUrl: context.resourceUrl,\n merchantTo: context.merchantTo.toLowerCase(),\n amount: context.amount,\n asset: context.asset.toLowerCase(),\n network: context.network,\n })}`\n}\n\nexport function toStandardPaymentRequirements(\n paymentRequired: X402PaymentRequired,\n option: X402PaymentOption,\n): PaymentRequirements {\n const network = STANDARD_X402_NETWORKS[option.network]\n if (!network) {\n throw new Error(`x402 exact payments are not supported on ${option.network}`)\n }\n\n if (option.scheme !== 'exact') {\n throw new Error(`Unsupported x402 scheme: ${option.scheme}`)\n }\n\n return {\n scheme: 'exact',\n network,\n maxAmountRequired: x402AuthorizationAmount(option),\n resource: option.resource ?? paymentRequired.resource.url,\n description:\n option.description ??\n paymentRequired.resource.description ??\n 'Haven x402 payment',\n mimeType:\n option.mimeType ??\n paymentRequired.resource.mimeType ??\n 'application/octet-stream',\n payTo: option.payTo,\n asset: option.asset,\n maxTimeoutSeconds: option.maxTimeoutSeconds,\n extra: option.extra,\n }\n}\n\nexport function buildX402IdempotencyKey(\n paymentRequired: X402PaymentRequired,\n option: X402PaymentOption,\n now = Date.now(),\n): string {\n const bucket = Math.floor(now / X402_IDEMPOTENCY_BUCKET_MS)\n const material = [\n paymentRequired.resource.url,\n paymentRequired.resource.description ?? '',\n option.payTo.toLowerCase(),\n option.asset.toLowerCase(),\n x402AuthorizationAmount(option),\n option.network,\n bucket,\n ].join('|')\n\n return `x402:${createHash('sha256').update(material).digest('hex').slice(0, 16)}`\n}\n\n/**\n * Encode a payment receipt as a base64 PAYMENT-SIGNATURE header value.\n *\n * This follows the x402 v2 protocol — the server's facilitator will\n * verify the on-chain transaction referenced by tx_hash.\n */\nexport function encodePaymentProof(receipt: {\n txHash: string\n paymentId: string\n token: string\n amount: string\n to: string\n resourceUrl?: string\n accepted?: X402PaymentOption\n payer?: string\n chainId?: number\n}): string {\n const payload = {\n x402Version: 2,\n resource: receipt.resourceUrl ? { url: receipt.resourceUrl } : undefined,\n accepted: receipt.accepted,\n payload: {\n type: 'haven_tx_hash',\n txHash: receipt.txHash,\n paymentId: receipt.paymentId,\n settledVia: 'haven',\n payer: receipt.payer,\n chainId: receipt.chainId,\n },\n }\n return btoa(JSON.stringify(payload))\n}\n\n/**\n * Resolve a token symbol from a contract address.\n *\n * Checks all supported chains. For chain-specific resolution,\n * pass the optional `network` CAIP-2 string (e.g. \"eip155:100\").\n */\nexport function resolveTokenFromAddress(\n address: string,\n network?: string,\n): { symbol: string; decimals: number } | null {\n const lower = address.toLowerCase()\n\n if (network && network in NETWORK_TOKENS) {\n return NETWORK_TOKENS[network][lower] ?? null\n }\n\n return ALL_TOKENS[lower] ?? null\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') {\n const primitive = JSON.stringify(value)\n return primitive === undefined ? 'undefined' : primitive\n }\n if (Array.isArray(value)) return `[${value.map((item) => stableStringify(item)).join(',')}]`\n const object = value as Record<string, unknown>\n return `{${Object.keys(object)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${stableStringify(object[key])}`)\n .join(',')}}`\n}\n","import { createHash } from 'node:crypto'\nimport type {\n MachinePaymentChallenge,\n MachinePaymentReceipt,\n} from './types.js'\n\nfunction decodeBase64Json<T>(value: string, label: string): T {\n try {\n return JSON.parse(atob(value)) as T\n } catch {\n throw new Error(`Failed to decode ${label}`)\n }\n}\n\nfunction normalizeChallenge(value: unknown): MachinePaymentChallenge | null {\n const candidate = value as Partial<MachinePaymentChallenge> | null\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n candidate.rail !== 'mpp_demo' ||\n typeof candidate.version !== 'string' ||\n typeof candidate.challengeId !== 'string' ||\n typeof candidate.resource !== 'string' ||\n typeof candidate.description !== 'string' ||\n // TODO: relax these checks when non-demo machine payment rails are added.\n candidate.network?.chainId !== 8453 ||\n candidate.network?.name !== 'base' ||\n candidate.asset?.symbol !== 'USDC' ||\n typeof candidate.asset?.address !== 'string' ||\n candidate.asset.decimals !== 6 ||\n typeof candidate.amount?.display !== 'string' ||\n typeof candidate.amount?.atomic !== 'string' ||\n typeof candidate.recipient !== 'string' ||\n typeof candidate.expiresAt !== 'string'\n ) {\n return null\n }\n\n return {\n rail: candidate.rail,\n version: candidate.version,\n challengeId: candidate.challengeId,\n resource: candidate.resource,\n description: candidate.description,\n network: candidate.network,\n asset: candidate.asset,\n amount: candidate.amount,\n recipient: candidate.recipient,\n expiresAt: candidate.expiresAt,\n metadata: candidate.metadata,\n }\n}\n\nexport function parseMachinePaymentChallenge(response: Response): MachinePaymentChallenge {\n const header = response.headers.get('MACHINE-PAYMENT-CHALLENGE')\n if (!header) {\n throw new Error('No MACHINE-PAYMENT-CHALLENGE header found in 402 response.')\n }\n\n const parsed = normalizeChallenge(\n decodeBase64Json<unknown>(header, 'MACHINE-PAYMENT-CHALLENGE header'),\n )\n if (!parsed) throw new Error('Invalid machine payment challenge')\n return parsed\n}\n\nexport async function parseMachinePaymentChallengeResponse(\n response: Response,\n): Promise<MachinePaymentChallenge> {\n try {\n return parseMachinePaymentChallenge(response)\n } catch (headerErr) {\n try {\n const body = await response.clone().json() as { challenge?: unknown }\n const parsed = normalizeChallenge(body.challenge)\n if (parsed) return parsed\n } catch {\n // Fall through to the original, more specific header error.\n }\n\n throw headerErr\n }\n}\n\nexport function buildMachinePaymentIdempotencyKey(\n challenge: MachinePaymentChallenge,\n): string {\n const material = [\n challenge.rail,\n challenge.challengeId,\n challenge.resource,\n challenge.recipient.toLowerCase(),\n challenge.asset.address.toLowerCase(),\n challenge.amount.atomic,\n challenge.network.chainId,\n ].join('|')\n\n return `${challenge.rail}:${createHash('sha256').update(material).digest('hex').slice(0, 16)}`\n}\n\nexport function encodeMachinePaymentProof(receipt: Omit<MachinePaymentReceipt, 'proofHeader'>): string {\n return btoa(JSON.stringify({\n rail: receipt.rail,\n challengeId: receipt.challengeId,\n paymentId: receipt.paymentId,\n txHash: receipt.txHash,\n settledVia: 'haven',\n payer: receipt.payer,\n chainId: receipt.chainId,\n }))\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\nimport { exact } from 'x402/schemes'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { signHash, addressFromKey, verifySignature } from './signer.js'\nimport type {\n HavenClientConfig,\n PaymentRequest,\n PaymentIntent,\n PaymentResult,\n PaymentStatus,\n PaymentPhase,\n PaymentNextAction,\n PaymentStatusResult,\n PaymentResumeState,\n SignData,\n X402AuthorizationOptions,\n RawCreateResponse,\n RawSignResponse,\n RawStatusResponse,\n RawPaymentStatusResult,\n X402PaymentRequired,\n X402PaymentOption,\n X402Intent,\n X402Quote,\n X402Receipt,\n X402RequestSnapshot,\n X402ResumeState,\n ResumeAuthorizedX402Input,\n ResumeX402PaymentInput,\n MppAuthorizationOptions,\n MppQuote,\n MppResumeState,\n ResumeAuthorizedMppInput,\n ResumeMppPaymentInput,\n RawX402AuthorizeResponse,\n MachinePaymentChallenge,\n MachinePaymentReceipt,\n RawMachinePaymentAuthorizeResponse,\n HavenAgent,\n HavenAllowanceSummary,\n HavenPaymentReceipt,\n RawHavenAgent,\n RawHavenAllowanceSummary,\n RawHavenPaymentReceiptsResponse,\n RawHavenPaymentReceipt,\n} from './types.js'\nimport {\n AgentPaymentNextAction,\n AgentPaymentPhase,\n HavenApiError,\n HavenPaymentStateError,\n HavenSigningError,\n HavenTimeoutError,\n} from './types.js'\nimport {\n buildX402IdempotencyKey,\n parsePaymentRequiredResponse,\n resolveTokenFromAddress,\n selectStandardPaymentOption,\n toStandardPaymentRequirements,\n x402AuthorizationAmount,\n} from './x402.js'\nimport {\n buildMachinePaymentIdempotencyKey,\n encodeMachinePaymentProof,\n parseMachinePaymentChallengeResponse,\n} from './mpp.js'\n\nconst DEFAULT_BASE_URL = 'http://localhost:3001'\n\nconst CHAIN_EXPLORER_TX: Record<number, string> = {\n 100: 'https://gnosisscan.io/tx',\n 8453: 'https://basescan.org/tx',\n}\n\nfunction buildExplorerUrl(chainId: number | undefined, txHash: string): string {\n const base = CHAIN_EXPLORER_TX[chainId ?? 8453] ?? CHAIN_EXPLORER_TX[8453]\n return `${base}/${txHash}`\n}\n\nfunction explorerUrlOrEmpty(chainId: number | undefined, txHash: string | null | undefined): string {\n return txHash ? buildExplorerUrl(chainId, txHash) : ''\n}\n\nconst DEFAULT_REQUEST_TIMEOUT = 30_000\nconst DEFAULT_CONFIRMATION_TIMEOUT = 90_000\nconst DEFAULT_POLLING_INTERVAL = 3_000\n\nconst PAYMENT_STATE_STATUS_CODES: Record<string, number> = {\n pending: 202,\n pending_approval: 202,\n approved: 202,\n proposed: 202,\n executed: 200,\n pending_signature: 409,\n submitted: 409,\n expired: 410,\n failed: 502,\n rejected: 409,\n}\n\nfunction chainIdFromNetwork(network: string | undefined): number | undefined {\n if (network === 'base') return 8453\n if (!network?.startsWith('eip155:')) return undefined\n const chainId = Number(network.slice('eip155:'.length))\n return Number.isFinite(chainId) ? chainId : undefined\n}\n\nfunction chainIdOrNull(network: string | undefined): number | null {\n return chainIdFromNetwork(network) ?? null\n}\n\nfunction phaseForStatus(status: string): PaymentPhase | null {\n if (status === 'pending_signature') return AgentPaymentPhase.AgentSignatureRequired\n if (status === 'submitted') return AgentPaymentPhase.PaymentSubmitted\n if (status === 'confirmed') return AgentPaymentPhase.PaymentConfirmed\n if (status === 'pending' || status === 'pending_approval') return AgentPaymentPhase.UserApprovalRequired\n if (status === 'approved') return AgentPaymentPhase.UserExecutionRequired\n if (status === 'proposed') return AgentPaymentPhase.WaitingForAdditionalApprovals\n if (status === 'executed') return AgentPaymentPhase.FundingSent\n if (status === 'rejected') return AgentPaymentPhase.Rejected\n if (status === 'expired') return AgentPaymentPhase.Expired\n if (status === 'failed') return AgentPaymentPhase.Failed\n return null\n}\n\nfunction nextActionForStatus(status: string): PaymentNextAction | null {\n if (status === 'pending_signature') return AgentPaymentNextAction.SignAndSubmitPayment\n if (status === 'submitted') return AgentPaymentNextAction.CheckStatusLater\n if (status === 'confirmed') return AgentPaymentNextAction.None\n if (status === 'pending' || status === 'pending_approval') return AgentPaymentNextAction.WaitForUserApproval\n if (status === 'approved') return AgentPaymentNextAction.WaitForUserToCompletePayment\n if (status === 'proposed') return AgentPaymentNextAction.WaitForUserApproval\n if (status === 'executed') return AgentPaymentNextAction.RetryOriginalX402Request\n if (status === 'rejected') return AgentPaymentNextAction.StopAndTellUser\n if (status === 'expired') return AgentPaymentNextAction.RequestAgainIfUserStillWantsIt\n if (status === 'failed') return AgentPaymentNextAction.StopAndTellUser\n return null\n}\n\nfunction messageForState(\n label: string,\n status: string,\n paymentId: string,\n nextAction: PaymentNextAction,\n): string {\n if (status === 'pending' || status === 'pending_approval') {\n return `${label} is above the remaining agent budget and is waiting for user approval in Haven (payment_id: ${paymentId}).`\n }\n if (status === 'executed') {\n return 'The user completed the funding payment. Retry the original x402 request.'\n }\n if (status === 'rejected') {\n return `The user rejected this payment request (payment_id: ${paymentId}).`\n }\n if (status === 'expired') {\n return `This payment request expired (payment_id: ${paymentId}).`\n }\n return `${label} is ${status}; next_action=${nextAction} (payment_id: ${paymentId}).`\n}\n\nfunction sameAddress(a: string | null | undefined, b: string | null | undefined): boolean {\n return Boolean(a && b && a.toLowerCase() === b.toLowerCase())\n}\n\nfunction isMppRail(rail: string | null | undefined): boolean {\n return rail === 'mpp' || Boolean(rail?.startsWith('mpp_'))\n}\n\nfunction decimalFromUsdcAtomic(value: string): string {\n const amount = BigInt(value)\n const whole = amount / 1_000_000n\n const fraction = (amount % 1_000_000n).toString().padStart(6, '0').replace(/0+$/, '')\n return fraction ? `${whole}.${fraction}` : whole.toString()\n}\n\nfunction normalizeDecimal(value: string): string {\n if (!value.includes('.')) return value.replace(/^0+(?=\\d)/, '') || '0'\n const [whole, fraction = ''] = value.split('.')\n const normalizedWhole = whole.replace(/^0+(?=\\d)/, '') || '0'\n const normalizedFraction = fraction.replace(/0+$/, '')\n return normalizedFraction ? `${normalizedWhole}.${normalizedFraction}` : normalizedWhole\n}\n\nfunction parseMerchantSettlement(header: string | null): {\n settlementTxHash?: string | null\n} {\n if (!header) return {}\n const parsed = parseProtocolReceiptHeader(header)\n const tx =\n typeof parsed?.transaction === 'string'\n ? parsed.transaction\n : typeof parsed?.txHash === 'string'\n ? parsed.txHash\n : typeof parsed?.tx_hash === 'string'\n ? parsed.tx_hash\n : null\n return { settlementTxHash: tx }\n}\n\nexport class HavenClient {\n private readonly apiKey: string\n private readonly delegateKey: string | undefined\n private readonly baseUrl: string\n private readonly x402Wallet: string | undefined\n private readonly requestTimeout: number\n private readonly confirmationTimeout: number\n private readonly pollingInterval: number\n private readonly inFlightX402 = new Map<string, Promise<X402Receipt>>()\n private readonly x402ReceiptCache = new Map<string, { expiresAt: number; receipt: X402Receipt }>()\n private readonly inFlightMachinePayments = new Map<string, Promise<MachinePaymentReceipt>>()\n /**\n * Setup-time headers configured via `HavenClientConfig.defaultHeaders`.\n * Read-only after construction — use `withRequestContext` for per-call\n * scoping so concurrent requests don't race on shared mutable state.\n */\n private readonly defaultHeaders: Record<string, string>\n /**\n * Async-local store for per-request context (currently: extra headers).\n * Each `withRequestContext` invocation produces an isolated store, so\n * overlapping async work — like two MCP tool dispatches in flight at\n * the same time — see their own headers without stepping on each other.\n */\n private readonly requestContext = new AsyncLocalStorage<{ headers: Record<string, string> }>()\n\n /** Delegate address derived from the private key (if provided) */\n readonly delegateAddress: string | undefined\n\n constructor(config: HavenClientConfig) {\n this.apiKey = config.apiKey\n this.delegateKey = config.delegateKey\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '')\n this.x402Wallet = config.x402Wallet\n this.requestTimeout = config.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT\n this.confirmationTimeout = config.confirmationTimeout ?? DEFAULT_CONFIRMATION_TIMEOUT\n this.pollingInterval = config.pollingInterval ?? DEFAULT_POLLING_INTERVAL\n this.defaultHeaders = { ...(config.defaultHeaders ?? {}) }\n\n if (this.delegateKey) {\n this.delegateAddress = addressFromKey(this.delegateKey)\n }\n }\n\n /**\n * Run `fn` with extra Haven-API headers scoped to the async work it\n * performs. Used by the MCP server to tag every Haven API request that\n * a single tool dispatch makes with `X-Haven-MCP-Tool: <name>` so the\n * backend can write an audit-log row attributing the call.\n *\n * The headers are held in an `AsyncLocalStorage` so overlapping\n * dispatches do not leak headers into each other's requests. The store\n * inherits across `await` boundaries, so any Haven API call made while\n * `fn` is awaiting will pick up the right headers.\n *\n * Has no effect on outbound merchant requests (x402 / MPP) — those\n * never go through the internal `request<T>` path that reads the\n * context.\n */\n withRequestContext<T>(headers: Record<string, string>, fn: () => Promise<T>): Promise<T> {\n return this.requestContext.run({ headers: { ...headers } }, fn)\n }\n\n // ── High-Level API ───────────────────────────────────────────────\n\n /**\n * Send a payment in one call.\n *\n * Creates the intent, signs the hash, submits the signature,\n * and polls until confirmed (or throws on failure/timeout).\n *\n * Requires `delegateKey` to be set in the client config.\n */\n async pay(request: PaymentRequest): Promise<PaymentResult> {\n if (!this.delegateKey) {\n throw new HavenSigningError(\n 'Cannot use pay() without a delegateKey. Use createIntent() + submitSignature() for manual signing.',\n )\n }\n\n // Step 1: Create intent\n const intent = await this.createIntent(request)\n\n // Step 2: Sign\n const signature = this.sign(intent.signData.hash)\n\n // Step 3: Submit\n await this.submitSignature(intent.paymentId, signature)\n\n // Step 4: Wait for confirmation\n return this.waitForConfirmation(intent.paymentId)\n }\n\n // ── Step-by-Step API ─────────────────────────────────────────────\n\n /**\n * Step 1: Create a payment intent.\n *\n * Returns the intent with the hash to sign.\n */\n async createIntent(request: PaymentRequest): Promise<PaymentIntent> {\n const raw = await this.post<RawCreateResponse>('/payments', {\n token: request.token,\n amount: request.amount,\n to: request.to,\n })\n\n // Haven returns HTTP 202 with this status when the requested amount\n // exceeds the on-chain allowance. The payment is parked for the owner\n // to approve in the dashboard — there's nothing to sign yet, so the SDK\n // surfaces it as an explicit error rather than returning a malformed\n // intent with no signData.\n if (raw.status === 'pending_approval') {\n this.throwPaymentStateError('Payment', raw)\n }\n\n return {\n paymentId: raw.payment_id,\n status: 'pending_signature',\n expiresAt: raw.expires_at,\n signData: raw.sign_data,\n }\n }\n\n /**\n * Keyless x402 construct.\n *\n * The non-custodial half of an x402 payment: posts the funding request to\n * `/x402` and returns the unsigned funding hash plus the data the caller\n * needs to build and sign the EIP-3009 merchant header itself. Crucially it\n * does **not** sign — neither the funding hash nor the merchant header — so\n * it works without a `delegateKey`. Both delegate signatures happen on the\n * machine that holds the key (the edge); the hosted MCP server relays only.\n *\n * Use this from the hosted, keyless server. The all-in-one `authorizeX402`\n * remains for local clients that hold the key.\n *\n * Throws (via the shared payment-state path) when the amount exceeds the\n * on-chain allowance — there is nothing to sign until the user approves.\n */\n async createX402Intent(\n paymentRequired: X402PaymentRequired,\n options: X402AuthorizationOptions = {},\n ): Promise<X402Intent> {\n const option = selectStandardPaymentOption(paymentRequired.accepts)\n if (!option) {\n throw new HavenApiError(\n 'No compatible payment option found in x402 requirements. ' +\n 'Haven supports standard x402 exact payments on Base USDC.',\n 400,\n )\n }\n\n // The funding transfer tops up the agent's delegate EOA. With no local key\n // we resolve that address from the authenticated agent record rather than\n // deriving it from a private key.\n const agent = await this.getAgent()\n const fundingTo = agent.delegateAddress\n if (!fundingTo) {\n throw new HavenApiError('Authenticated agent has no delegate address registered.', 502)\n }\n\n const idempotencyKey = options.idempotencyKey ?? buildX402IdempotencyKey(paymentRequired, option)\n const raw = await this.post<RawX402AuthorizeResponse>('/x402', {\n url: paymentRequired.resource.url,\n payTo: fundingTo,\n merchantPayTo: option.payTo,\n amount: x402AuthorizationAmount(option),\n asset: option.asset,\n network: option.network,\n description: paymentRequired.resource.description,\n idempotencyKey,\n })\n\n // Anything other than a signable funding intent (pending_approval,\n // expired, already-executed, error) is surfaced through the shared path.\n if (raw.status !== 'pending_signature') {\n this.throwPaymentStateError('x402 payment', raw)\n }\n if (!raw.sign_data?.hash) {\n throw new HavenApiError('No sign_hash returned from x402/authorize', 500, raw)\n }\n if (!raw.x402_expected_auth) {\n throw new HavenApiError('No x402 expected-context binding returned from x402/authorize', 500, raw)\n }\n\n return {\n paymentId: raw.payment_id,\n status: 'pending_signature',\n expiresAt: raw.expires_at,\n signData: raw.sign_data,\n accepted: option,\n resourceUrl: paymentRequired.resource.url,\n merchantTo: raw.merchant_to ?? option.payTo,\n amountAtomic: x402AuthorizationAmount(option),\n asset: option.asset,\n network: option.network,\n expectedAuth: raw.x402_expected_auth,\n fundingTo,\n }\n }\n\n /**\n * Step 2: Sign a hash with the delegate key.\n *\n * Returns the 65-byte signature (0x-prefixed).\n * Requires `delegateKey` to be set in the client config.\n */\n sign(hash: string): string {\n if (!this.delegateKey) {\n throw new HavenSigningError(\n 'Cannot sign without a delegateKey. Pass the private key in HavenClient config, or sign externally.',\n )\n }\n\n const signature = signHash(this.delegateKey, hash)\n\n // Verify the signature locally before submitting\n if (!verifySignature(hash, signature, this.delegateAddress!)) {\n throw new HavenSigningError(\n 'Local signature verification failed — recovered address does not match delegate key.',\n )\n }\n\n return signature\n }\n\n /**\n * Step 3: Submit a signature to execute the payment.\n *\n * The signature can come from `client.sign()` or from external signing.\n */\n async submitSignature(\n paymentId: string,\n signature: string,\n ): Promise<{ status: string; txHash?: string }> {\n const raw = await this.post<RawSignResponse>(\n `/payments/${paymentId}/sign`,\n { signature },\n )\n\n return {\n status: raw.status,\n txHash: raw.tx_hash,\n }\n }\n\n /**\n * Get the current status of a payment.\n */\n async getPayment(paymentId: string): Promise<PaymentResult> {\n const raw = await this.get<RawStatusResponse>(`/payments/${paymentId}`)\n return this.mapPaymentResult(raw)\n }\n\n /**\n * Get agent-actionable status for a payment intent or approval request.\n *\n * Use this for IDs returned by agent tools and machine-payment/x402 flows.\n * `getPayment()` remains available for payment-intent-only integrations.\n */\n async getPaymentStatus(paymentId: string): Promise<PaymentStatusResult> {\n const raw = await this.get<RawPaymentStatusResult>(`/machine-payments/${paymentId}/status`)\n return this.mapPaymentStatusResult(raw)\n }\n\n /**\n * Get the agent identity tied to this API key.\n */\n async getAgent(): Promise<HavenAgent> {\n const raw = await this.get<RawHavenAgent>('/machine-payments/agent')\n return {\n id: raw.id,\n name: raw.name,\n status: raw.status,\n safeAddress: raw.safe_address,\n delegateAddress: raw.delegate_address,\n chainId: raw.chain_id,\n }\n }\n\n /**\n * Get configured and on-chain allowances for the authenticated agent.\n */\n async getAllowances(): Promise<HavenAllowanceSummary> {\n const raw = await this.get<RawHavenAllowanceSummary>('/machine-payments/allowances')\n return {\n agentId: raw.agent_id,\n safeAddress: raw.safe_address,\n delegateAddress: raw.delegate_address,\n chainId: raw.chain_id,\n allowances: raw.allowances.map((allowance) => ({\n id: allowance.id,\n tokenAddress: allowance.token_address,\n tokenSymbol: allowance.token_symbol,\n configuredAmount: allowance.configured_amount,\n resetPeriodMin: allowance.reset_period_min,\n onchain: {\n amount: allowance.onchain.amount,\n spent: allowance.onchain.spent,\n remaining: allowance.onchain.remaining,\n effectiveSpent: allowance.onchain.effective_spent,\n resetTimeMin: allowance.onchain.reset_time_min,\n lastResetMin: allowance.onchain.last_reset_min,\n nonce: allowance.onchain.nonce,\n isResetPending: allowance.onchain.is_reset_pending,\n },\n })),\n }\n }\n\n /**\n * List recent machine-payment receipts/evidence for bookkeeping.\n */\n async listReceipts(options: { limit?: number } = {}): Promise<HavenPaymentReceipt[]> {\n const query = options.limit ? `?limit=${encodeURIComponent(String(options.limit))}` : ''\n const raw = await this.get<RawHavenPaymentReceiptsResponse>(`/machine-payments/receipts${query}`)\n return raw.receipts.map((receipt) => this.mapPaymentReceipt(receipt))\n }\n\n /**\n * Rehydrate the x402/MPP resume-state bundle for a payment id.\n *\n * The server returns stored protocol context only. The client still signs the\n * merchant proof locally when resumeX402Payment() or resumeMppPayment() runs.\n */\n async getResumeState(paymentId: string): Promise<PaymentResumeState> {\n return this.get<PaymentResumeState>(`/payments/${paymentId}/resume_state`)\n }\n\n /**\n * Poll until a payment reaches a terminal status (confirmed, failed, expired).\n */\n async waitForConfirmation(paymentId: string): Promise<PaymentResult> {\n const deadline = Date.now() + this.confirmationTimeout\n\n while (Date.now() < deadline) {\n const result = await this.getPayment(paymentId)\n\n if (result.status === 'confirmed' || result.status === 'failed' || result.status === 'expired') {\n return result\n }\n\n await sleep(this.pollingInterval)\n }\n\n throw new HavenTimeoutError(paymentId)\n }\n\n // ── x402 Protocol Support ────────────────────────────────────────\n\n /**\n * Authorize an x402 payment.\n *\n * Takes the parsed PaymentRequired from a 402 response, selects a compatible\n * option, funds the delegate wallet through Haven, and returns the standard\n * x402 header that the merchant can verify and settle.\n *\n * Requires `delegateKey` to be set in the client config.\n */\n async authorizeX402(\n paymentRequired: X402PaymentRequired,\n options: X402AuthorizationOptions = {},\n ): Promise<X402Receipt> {\n if (!this.delegateKey) {\n throw new HavenSigningError(\n 'delegateKey is required for x402 payments. Pass it in the HavenClient config.',\n )\n }\n if (!this.delegateAddress) {\n throw new HavenSigningError('delegateAddress could not be derived from delegateKey.')\n }\n\n // 1. Select best payment option\n const option = selectStandardPaymentOption(paymentRequired.accepts)\n if (!option) {\n throw new HavenApiError(\n 'No compatible payment option found in x402 requirements. ' +\n 'Haven supports standard x402 exact payments on Base USDC.',\n 400,\n )\n }\n\n const idempotencyKey = options.idempotencyKey ?? buildX402IdempotencyKey(paymentRequired, option)\n const cached = this.x402ReceiptCache.get(idempotencyKey)\n if (cached && cached.expiresAt > Date.now()) return cached.receipt\n\n const inFlight = this.inFlightX402.get(idempotencyKey)\n if (inFlight) return inFlight\n\n const promise = this.authorizeStandardX402(paymentRequired, option, idempotencyKey)\n this.inFlightX402.set(idempotencyKey, promise)\n\n try {\n return await promise\n } catch (err) {\n this.attachResumeState(err, {\n rail: 'x402',\n paymentRequired,\n accepted: option,\n idempotencyKey,\n })\n throw err\n } finally {\n this.inFlightX402.delete(idempotencyKey)\n }\n }\n\n /**\n * Probe a paid endpoint and return its x402 quote without creating a Haven\n * payment or approval request.\n */\n async quoteX402(\n url: string,\n init?: RequestInit,\n options: X402AuthorizationOptions = {},\n ): Promise<X402Quote> {\n const initialInit = this.withX402Wallet(init, this.x402PayerAddress())\n const request = this.snapshotX402Request(url, initialInit)\n const response = await globalThis.fetch(url, initialInit)\n\n if (response.status !== 402) {\n throw new HavenApiError(\n `Expected an x402 quote response with HTTP 402, got HTTP ${response.status}.`,\n response.status || 400,\n )\n }\n\n if (response.headers.get('MACHINE-PAYMENT-CHALLENGE')) {\n throw new HavenApiError('quoteX402 only supports standard x402 Payment Required responses.', 400)\n }\n\n const paymentRequired = await parsePaymentRequiredResponse(response)\n return this.buildX402Quote(paymentRequired, request, options.idempotencyKey)\n }\n\n /**\n * Pay a previously inspected x402 quote and retry the exact captured request.\n */\n async payX402Quote(\n quote: X402Quote,\n options: X402AuthorizationOptions = {},\n ): Promise<Response> {\n const idempotencyKey = options.idempotencyKey ?? quote.idempotencyKey\n\n try {\n const receipt = await this.authorizeX402(quote.paymentRequired, { idempotencyKey })\n return this.retryX402Request(\n quote.request.url,\n this.requestInitFromSnapshot(quote.request),\n quote.paymentRequired,\n receipt,\n )\n } catch (err) {\n this.attachResumeState(err, {\n rail: 'x402',\n paymentRequired: quote.paymentRequired,\n accepted: quote.accepted,\n idempotencyKey,\n request: quote.request,\n })\n throw err\n }\n }\n\n private async authorizeStandardX402(\n paymentRequired: X402PaymentRequired,\n option: X402PaymentOption,\n idempotencyKey: string,\n ): Promise<X402Receipt> {\n // 2. Standard x402 settles from an EOA, so the SDK uses the agent-owned\n // delegate EOA for the merchant-facing EIP-3009 authorization. Haven does\n // not control this EOA or its private key.\n //\n // The only automated funding path is a separate Safe AllowanceModule\n // transfer signed by the agent key and constrained by the user's on-chain\n // allowance. Haven's backend relays that signed top-up; it is not the source\n // of payment authority.\n // Sign before funding so retries reuse one EIP-3009 nonce. If funding fails,\n // the unused authorization simply expires via validBefore.\n const paymentHeader = await this.createStandardX402Header(paymentRequired, option)\n const raw = await this.post<RawX402AuthorizeResponse>('/x402', {\n url: paymentRequired.resource.url,\n payTo: this.delegateAddress,\n merchantPayTo: option.payTo,\n amount: x402AuthorizationAmount(option),\n asset: option.asset,\n network: option.network,\n description: paymentRequired.resource.description,\n idempotencyKey,\n })\n\n // If the backend already executed (shouldn't happen without sig), return\n if (raw.success && raw.tx_hash) {\n const receipt = this.mapX402ReceiptFromAuthorization(paymentRequired, option, paymentHeader, raw)\n this.cacheX402Receipt(idempotencyKey, paymentHeader, receipt)\n return receipt\n }\n\n const state = this.paymentStateFromRaw('x402 payment', raw)\n if (state?.nextAction === AgentPaymentNextAction.RetryOriginalX402Request) {\n const receipt = this.mapX402ReceiptFromStatus(paymentRequired, option, paymentHeader, state)\n this.cacheX402Receipt(idempotencyKey, paymentHeader, receipt)\n return receipt\n }\n\n this.throwIfNonSignableAuthorizationState('x402 payment', raw)\n\n // 3. Sign the hash\n if (!raw.sign_data?.hash) {\n throw new HavenApiError('No sign_hash returned from x402/authorize', 500, raw)\n }\n const sig = signHash(this.delegateKey!, raw.sign_data.hash)\n\n // 4. Submit signature (reuse existing payments/:id/sign endpoint)\n const execResult = await this.post<RawSignResponse>(\n `/payments/${raw.payment_id}/sign`,\n { signature: sig },\n )\n\n if (execResult.status !== 'confirmed') {\n this.throwPaymentStateError('x402 payment', execResult)\n }\n\n const receipt = this.mapX402ReceiptFromAuthorization(paymentRequired, option, paymentHeader, raw, execResult)\n this.cacheX402Receipt(idempotencyKey, paymentHeader, receipt)\n return receipt\n }\n\n async resumeAuthorizedX402(input: ResumeAuthorizedX402Input): Promise<X402Receipt> {\n if (!this.delegateKey) {\n throw new HavenSigningError(\n 'delegateKey is required for x402 payments. Pass it in the HavenClient config.',\n )\n }\n if (!this.delegateAddress) {\n throw new HavenSigningError('delegateAddress could not be derived from delegateKey.')\n }\n\n const option = selectStandardPaymentOption(input.paymentRequired.accepts)\n if (!option) {\n throw new HavenApiError(\n 'No compatible payment option found in x402 requirements. ' +\n 'Haven supports standard x402 exact payments on Base USDC.',\n 400,\n )\n }\n\n const idempotencyKey = input.idempotencyKey ?? buildX402IdempotencyKey(input.paymentRequired, option)\n const cached = this.x402ReceiptCache.get(idempotencyKey)\n if (cached && cached.expiresAt > Date.now()) return cached.receipt\n\n const status = await this.getPaymentStatus(input.paymentId)\n this.assertCanResumeX402(status, input.paymentRequired, option)\n\n const paymentHeader = await this.createStandardX402Header(input.paymentRequired, option)\n const receipt = this.mapX402ReceiptFromStatus(input.paymentRequired, option, paymentHeader, status)\n this.cacheX402Receipt(idempotencyKey, paymentHeader, receipt)\n return receipt\n }\n\n async resumeX402Payment(input: ResumeX402PaymentInput | X402ResumeState): Promise<Response> {\n const inputInit = 'init' in input ? input.init : undefined\n const initialInit = this.withX402Wallet(\n inputInit ?? (input.request ? this.requestInitFromSnapshot(input.request) : undefined),\n this.x402PayerAddress(),\n )\n let paymentRequired = input.paymentRequired\n const url = input.url ?? input.request?.url\n\n if (!paymentRequired) {\n if (!url) {\n throw new HavenApiError('x402 resume requires the original URL or a captured request snapshot.', 400)\n }\n const response = await globalThis.fetch(url, initialInit)\n if (response.status !== 402) {\n throw new HavenApiError('Expected the original x402 request to return HTTP 402 before resuming.', 400)\n }\n paymentRequired = await parsePaymentRequiredResponse(response)\n }\n\n const receipt = await this.resumeAuthorizedX402({\n paymentId: input.paymentId,\n paymentRequired,\n idempotencyKey: input.idempotencyKey,\n })\n\n return this.retryX402Request(url ?? paymentRequired.resource.url, initialInit, paymentRequired, receipt)\n }\n\n /**\n * Fetch wrapper that automatically handles HTTP 402 responses.\n *\n * Works like the standard `fetch()` but intercepts 402 responses,\n * pays via x402 through Haven, and retries the request.\n *\n * ```ts\n * const response = await haven.fetch('https://paid-api.com/data')\n * const data = await response.json()\n * ```\n *\n * Requires `delegateKey` to be set in the client config.\n */\n async fetch(\n url: string,\n init?: RequestInit,\n options: X402AuthorizationOptions = {},\n ): Promise<Response> {\n const initialInit = this.withX402Wallet(init, this.x402PayerAddress())\n\n // 1. Make the original request\n const response = await globalThis.fetch(url, initialInit)\n\n // 2. Not a 402 — return as-is\n if (response.status !== 402) return response\n\n const machineChallengeHeader = response.headers.get('MACHINE-PAYMENT-CHALLENGE')\n if (machineChallengeHeader) {\n const challenge = await parseMachinePaymentChallengeResponse(response)\n return this.fetchWithMachinePayment(url, initialInit, challenge)\n }\n\n // 3. Parse x402 payment requirements\n let paymentRequired: X402PaymentRequired\n try {\n paymentRequired = await parsePaymentRequiredResponse(response)\n } catch {\n let challenge: MachinePaymentChallenge\n try {\n challenge = await parseMachinePaymentChallengeResponse(response)\n } catch {\n // Not a Haven machine-payment 402 — return original response\n return response\n }\n return this.fetchWithMachinePayment(url, initialInit, challenge)\n }\n\n // 4. Pay through Haven\n const request = this.snapshotX402Request(url, initialInit)\n const option = selectStandardPaymentOption(paymentRequired.accepts)\n const idempotencyKey = options.idempotencyKey ?? (option ? buildX402IdempotencyKey(paymentRequired, option) : undefined)\n let receipt: X402Receipt\n try {\n receipt = await this.authorizeX402(paymentRequired, options)\n } catch (err) {\n if (option && idempotencyKey) {\n this.attachResumeState(err, {\n rail: 'x402',\n paymentRequired,\n accepted: option,\n idempotencyKey,\n request,\n })\n }\n throw err\n }\n return this.retryX402Request(url, initialInit, paymentRequired, receipt)\n }\n\n /**\n * Probe a paid MPP endpoint or inspect an existing challenge without creating\n * a Haven payment or approval request.\n */\n async quoteMpp(\n challengeOrUrl: MachinePaymentChallenge | string,\n init?: RequestInit,\n options: MppAuthorizationOptions = {},\n ): Promise<MppQuote> {\n if (typeof challengeOrUrl !== 'string') {\n const request = this.snapshotX402Request(challengeOrUrl.resource, init)\n return this.buildMppQuote(challengeOrUrl, request, options.idempotencyKey)\n }\n\n const request = this.snapshotX402Request(challengeOrUrl, init)\n const response = await globalThis.fetch(challengeOrUrl, init)\n\n if (response.status !== 402) {\n throw new HavenApiError(\n `Expected an MPP quote response with HTTP 402, got HTTP ${response.status}.`,\n response.status || 400,\n )\n }\n\n const challenge = await parseMachinePaymentChallengeResponse(response)\n return this.buildMppQuote(challenge, request, options.idempotencyKey)\n }\n\n /**\n * Pay a previously inspected MPP quote and retry the exact captured request.\n */\n async payMppChallenge(\n quote: MppQuote,\n options: MppAuthorizationOptions = {},\n ): Promise<Response> {\n const idempotencyKey = options.idempotencyKey ?? quote.idempotencyKey\n\n try {\n const receipt = await this.authorizeMachinePayment(quote.challenge, { idempotencyKey })\n return this.retryMppRequest(\n quote.request.url,\n this.requestInitFromSnapshot(quote.request),\n quote.challenge,\n receipt,\n )\n } catch (err) {\n this.attachResumeState(err, {\n rail: 'mpp',\n challenge: quote.challenge,\n idempotencyKey,\n request: quote.request,\n })\n throw err\n }\n }\n\n private async retryX402Request(\n url: string,\n initialInit: RequestInit | undefined,\n paymentRequired: X402PaymentRequired,\n receipt: X402Receipt,\n ): Promise<Response> {\n if (!receipt.accepted) {\n throw new HavenApiError('No accepted x402 option was recorded for payment retry', 500)\n }\n if (!receipt.paymentHeader) {\n throw new HavenApiError('No x402 payment header was returned for payment retry', 500)\n }\n\n // 5. Retry with a merchant-verifiable x402 EIP-3009 payment header.\n const retryHeaders = new Headers(initialInit?.headers)\n retryHeaders.set('X-PAYMENT', receipt.paymentHeader)\n\n const retryResponse = await globalThis.fetch(url, {\n ...initialInit,\n headers: retryHeaders,\n })\n\n if (!retryResponse.ok) {\n await this.recordMerchantRetryRejected({\n rail: 'x402',\n paymentId: receipt.paymentId,\n txHash: receipt.txHash,\n resourceUrl: receipt.resourceUrl,\n retryResponse,\n details: {\n merchant_to: receipt.merchantTo,\n delegate_to: receipt.to,\n },\n })\n\n throw new HavenApiError(\n 'x402 retry failed after Haven funded the delegate wallet; reconciliation may be required.',\n retryResponse.status,\n {\n marker: 'x402_retry_rejected_after_funding',\n payment_id: receipt.paymentId,\n tx_hash: receipt.txHash,\n resource_url: receipt.resourceUrl,\n merchant_to: receipt.merchantTo,\n delegate_to: receipt.to,\n },\n )\n }\n\n const merchantSettlement = parseMerchantSettlement(retryResponse.headers.get('PAYMENT-RESPONSE'))\n if (receipt.merchant && merchantSettlement.settlementTxHash) {\n receipt.merchant.settlementTxHash = merchantSettlement.settlementTxHash\n receipt.merchant.settlementExplorerUrl = buildExplorerUrl(\n receipt.chainId,\n merchantSettlement.settlementTxHash,\n )\n }\n\n await this.reportMachinePaymentEvidence({\n paymentId: receipt.paymentId,\n rail: 'x402',\n txHash: receipt.txHash,\n resourceUrl: receipt.resourceUrl,\n merchantStatus: retryResponse.status,\n challengePayload: paymentRequired as unknown as Record<string, unknown>,\n selectedPayment: receipt.accepted as unknown as Record<string, unknown>,\n paymentProofHeaderName: 'X-PAYMENT',\n paymentProofHeader: receipt.paymentHeader,\n protocolReceiptHeaderName: 'PAYMENT-RESPONSE',\n protocolReceiptHeader: retryResponse.headers.get('PAYMENT-RESPONSE') ?? undefined,\n })\n\n return retryResponse\n }\n\n async authorizeMachinePayment(\n challenge: MachinePaymentChallenge,\n options: MppAuthorizationOptions = {},\n ): Promise<MachinePaymentReceipt> {\n if (!this.delegateKey) {\n throw new HavenSigningError(\n 'delegateKey is required for machine payments. Pass it in the HavenClient config.',\n )\n }\n\n if (challenge.rail !== 'mpp_demo') {\n throw new HavenApiError(`Unsupported machine payment rail: ${challenge.rail}`, 400)\n }\n\n const idempotencyKey = options.idempotencyKey ?? buildMachinePaymentIdempotencyKey(challenge)\n const inFlight = this.inFlightMachinePayments.get(idempotencyKey)\n if (inFlight) return inFlight\n\n const promise = this.authorizeMppDemoPayment(challenge, idempotencyKey)\n this.inFlightMachinePayments.set(idempotencyKey, promise)\n\n try {\n return await promise\n } catch (err) {\n this.attachResumeState(err, {\n rail: 'mpp',\n challenge,\n idempotencyKey,\n })\n throw err\n } finally {\n this.inFlightMachinePayments.delete(idempotencyKey)\n }\n }\n\n private async authorizeMppDemoPayment(\n challenge: MachinePaymentChallenge,\n idempotencyKey: string,\n ): Promise<MachinePaymentReceipt> {\n const raw = await this.post<RawMachinePaymentAuthorizeResponse>(\n '/machine-payments/authorize',\n { challenge, idempotencyKey },\n )\n\n if (raw.success && raw.tx_hash) {\n return this.mapMachinePaymentReceipt(challenge, raw, raw.tx_hash)\n }\n\n this.throwIfNonSignableAuthorizationState('Machine payment', raw)\n\n if (!raw.sign_data?.hash) {\n throw new HavenApiError('No sign_hash returned from machine payment authorization', 500, raw)\n }\n\n const sig = signHash(this.delegateKey!, raw.sign_data.hash)\n const execResult = await this.post<RawSignResponse>(\n `/payments/${raw.payment_id}/sign`,\n { signature: sig },\n )\n\n if (execResult.status !== 'confirmed' || !execResult.tx_hash) {\n this.throwPaymentStateError('Machine payment', execResult)\n }\n\n return this.mapMachinePaymentReceipt(challenge, raw, execResult.tx_hash, execResult)\n }\n\n async resumeAuthorizedMpp(input: ResumeAuthorizedMppInput): Promise<MachinePaymentReceipt> {\n if (!this.delegateKey) {\n throw new HavenSigningError(\n 'delegateKey is required for machine payments. Pass it in the HavenClient config.',\n )\n }\n\n const status = await this.getPaymentStatus(input.paymentId)\n this.assertCanResumeMpp(status, input.challenge)\n\n return this.mapMachinePaymentReceiptFromStatus(input.challenge, status)\n }\n\n async resumeMppPayment(input: ResumeMppPaymentInput | MppResumeState): Promise<Response> {\n const inputInit = 'init' in input ? input.init : undefined\n const initialInit = inputInit ?? (input.request ? this.requestInitFromSnapshot(input.request) : undefined)\n let challenge = input.challenge\n const url = input.url ?? input.request?.url\n\n if (!challenge) {\n if (!url) {\n throw new HavenApiError('MPP resume requires the original URL or a captured request snapshot.', 400)\n }\n const response = await globalThis.fetch(url, initialInit)\n if (response.status !== 402) {\n throw new HavenApiError('Expected the original MPP request to return HTTP 402 before resuming.', 400)\n }\n challenge = await parseMachinePaymentChallengeResponse(response)\n }\n\n const receipt = await this.resumeAuthorizedMpp({\n paymentId: input.paymentId,\n challenge,\n idempotencyKey: input.idempotencyKey,\n })\n\n return this.retryMppRequest(url ?? challenge.resource, initialInit, challenge, receipt)\n }\n\n private async fetchWithMachinePayment(\n url: string,\n initialInit: RequestInit | undefined,\n challenge: MachinePaymentChallenge,\n ): Promise<Response> {\n const request = this.snapshotX402Request(url, initialInit)\n const idempotencyKey = buildMachinePaymentIdempotencyKey(challenge)\n let receipt: MachinePaymentReceipt\n try {\n receipt = await this.authorizeMachinePayment(challenge, { idempotencyKey })\n } catch (err) {\n this.attachResumeState(err, {\n rail: 'mpp',\n challenge,\n idempotencyKey,\n request,\n })\n throw err\n }\n\n return this.retryMppRequest(url, initialInit, challenge, receipt)\n }\n\n private async retryMppRequest(\n url: string,\n initialInit: RequestInit | undefined,\n challenge: MachinePaymentChallenge,\n receipt: MachinePaymentReceipt,\n ): Promise<Response> {\n const retryHeaders = new Headers(initialInit?.headers)\n retryHeaders.set('MACHINE-PAYMENT-PROOF', receipt.proofHeader)\n\n const retryResponse = await globalThis.fetch(url, {\n ...initialInit,\n headers: retryHeaders,\n })\n\n if (!retryResponse.ok) {\n await this.recordMerchantRetryRejected({\n rail: receipt.rail,\n paymentId: receipt.paymentId,\n txHash: receipt.txHash,\n resourceUrl: receipt.resourceUrl,\n retryResponse,\n details: {\n challenge_id: receipt.challengeId,\n },\n })\n\n throw new HavenApiError(\n 'Machine payment retry failed after Haven sent the payment.',\n retryResponse.status,\n {\n marker: 'machine_payment_retry_rejected_after_payment',\n payment_id: receipt.paymentId,\n tx_hash: receipt.txHash,\n resource_url: receipt.resourceUrl,\n rail: receipt.rail,\n },\n )\n }\n\n await this.reportMachinePaymentEvidence({\n paymentId: receipt.paymentId,\n rail: receipt.rail,\n txHash: receipt.txHash,\n resourceUrl: receipt.resourceUrl,\n merchantStatus: retryResponse.status,\n challengePayload: challenge as unknown as Record<string, unknown>,\n paymentProofHeaderName: 'MACHINE-PAYMENT-PROOF',\n paymentProofHeader: receipt.proofHeader,\n protocolReceiptHeaderName:\n retryResponse.headers.has('Payment-Receipt')\n ? 'Payment-Receipt'\n : retryResponse.headers.has('MACHINE-PAYMENT-RESPONSE')\n ? 'MACHINE-PAYMENT-RESPONSE'\n : undefined,\n protocolReceiptHeader:\n retryResponse.headers.get('Payment-Receipt') ??\n retryResponse.headers.get('MACHINE-PAYMENT-RESPONSE') ??\n undefined,\n })\n\n return retryResponse\n }\n\n private assertCanResumeX402(\n status: PaymentStatusResult,\n paymentRequired: X402PaymentRequired,\n option: X402PaymentOption,\n ): void {\n if (status.rail !== 'x402') {\n throw new HavenPaymentStateError(\n `Payment ${status.paymentId} is ${status.rail}, not x402.`,\n 409,\n status,\n )\n }\n\n if (status.nextAction !== AgentPaymentNextAction.RetryOriginalX402Request) {\n throw new HavenPaymentStateError(status.message, PAYMENT_STATE_STATUS_CODES[status.status] ?? 409, status)\n }\n\n if (!status.txHash) {\n throw new HavenApiError(\n `x402 payment ${status.paymentId} is ready to retry but has no Haven transaction hash.`,\n 502,\n status,\n status.paymentId,\n )\n }\n\n if (status.resourceUrl && status.resourceUrl !== paymentRequired.resource.url) {\n throw new HavenApiError(\n 'x402 resume request does not match the approved resource URL.',\n 409,\n { status, paymentRequired },\n status.paymentId,\n )\n }\n\n if (status.merchantAddress && !sameAddress(status.merchantAddress, option.payTo)) {\n throw new HavenApiError(\n 'x402 resume request does not match the approved merchant.',\n 409,\n { status, selectedPayment: option },\n status.paymentId,\n )\n }\n\n const optionChainId = chainIdFromNetwork(option.network)\n if (status.chainId && optionChainId && status.chainId !== optionChainId) {\n throw new HavenApiError(\n 'x402 resume request does not match the approved network.',\n 409,\n { status, selectedPayment: option },\n status.paymentId,\n )\n }\n\n if (status.token && status.token !== 'USDC') {\n throw new HavenApiError(\n 'x402 resume request does not match the approved token.',\n 409,\n { status, selectedPayment: option },\n status.paymentId,\n )\n }\n\n const approvedAmount = status.amount ? normalizeDecimal(status.amount) : ''\n const requestedAmount = normalizeDecimal(decimalFromUsdcAtomic(x402AuthorizationAmount(option)))\n if (approvedAmount && approvedAmount !== requestedAmount) {\n throw new HavenApiError(\n 'x402 resume request does not match the approved amount.',\n 409,\n { status, selectedPayment: option },\n status.paymentId,\n )\n }\n }\n\n private assertCanResumeMpp(\n status: PaymentStatusResult,\n challenge: MachinePaymentChallenge,\n ): void {\n if (!isMppRail(status.rail)) {\n throw new HavenPaymentStateError(\n `Payment ${status.paymentId} is ${status.rail}, not MPP.`,\n 409,\n status,\n )\n }\n\n if (status.nextAction !== AgentPaymentNextAction.RetryOriginalX402Request) {\n throw new HavenPaymentStateError(status.message, PAYMENT_STATE_STATUS_CODES[status.status] ?? 409, status)\n }\n\n if (!status.txHash) {\n throw new HavenApiError(\n `MPP payment ${status.paymentId} is ready to retry but has no Haven transaction hash.`,\n 502,\n status,\n status.paymentId,\n )\n }\n\n if (status.resourceUrl && status.resourceUrl !== challenge.resource) {\n throw new HavenApiError(\n 'MPP resume request does not match the approved resource URL.',\n 409,\n { status, challenge },\n status.paymentId,\n )\n }\n\n if (status.merchantAddress && !sameAddress(status.merchantAddress, challenge.recipient)) {\n throw new HavenApiError(\n 'MPP resume request does not match the approved merchant.',\n 409,\n { status, challenge },\n status.paymentId,\n )\n }\n\n if (status.chainId && status.chainId !== challenge.network.chainId) {\n throw new HavenApiError(\n 'MPP resume request does not match the approved network.',\n 409,\n { status, challenge },\n status.paymentId,\n )\n }\n\n if (status.token && status.token !== challenge.asset.symbol) {\n throw new HavenApiError(\n 'MPP resume request does not match the approved token.',\n 409,\n { status, challenge },\n status.paymentId,\n )\n }\n\n const approvedAmount = status.amount ? normalizeDecimal(status.amount) : ''\n const requestedAmount = normalizeDecimal(challenge.amount.display)\n if (approvedAmount && approvedAmount !== requestedAmount) {\n throw new HavenApiError(\n 'MPP resume request does not match the approved amount.',\n 409,\n { status, challenge },\n status.paymentId,\n )\n }\n }\n\n private mapX402ReceiptFromAuthorization(\n paymentRequired: X402PaymentRequired,\n option: X402PaymentOption,\n paymentHeader: string,\n raw: RawX402AuthorizeResponse,\n execResult?: RawSignResponse,\n ): X402Receipt {\n const txHash = execResult?.tx_hash ?? raw.tx_hash ?? ''\n const chainId = execResult?.chain_id ?? raw.chain_id ?? chainIdFromNetwork(option.network)\n const token = execResult?.token ?? raw.token ?? 'USDC'\n const amount = execResult?.amount ?? raw.amount ?? decimalFromUsdcAtomic(x402AuthorizationAmount(option))\n const to = execResult?.to ?? raw.to ?? this.delegateAddress ?? ''\n const explorerUrl = execResult?.explorer_url ?? raw.explorer_url ?? explorerUrlOrEmpty(chainId, txHash)\n const merchantTo = execResult?.merchant_to ?? raw.merchant_to ?? option.payTo\n const payer = raw.payer ?? raw.safe_address ?? raw.sign_data?.components.safe\n\n return this.buildX402Receipt({\n paymentId: raw.payment_id,\n txHash,\n token,\n amount,\n to,\n resourceUrl: paymentRequired.resource.url,\n explorerUrl,\n accepted: option,\n paymentHeader,\n merchantTo,\n payer,\n chainId,\n })\n }\n\n private mapX402ReceiptFromStatus(\n paymentRequired: X402PaymentRequired,\n option: X402PaymentOption,\n paymentHeader: string,\n status: PaymentStatusResult,\n ): X402Receipt {\n if (!status.txHash) {\n throw new HavenApiError(\n `x402 payment ${status.paymentId} is ready to retry but has no Haven transaction hash.`,\n 502,\n status,\n status.paymentId,\n )\n }\n\n return this.buildX402Receipt({\n paymentId: status.paymentId,\n txHash: status.txHash,\n token: status.token || 'USDC',\n amount: status.amount || decimalFromUsdcAtomic(x402AuthorizationAmount(option)),\n to: this.delegateAddress ?? '',\n resourceUrl: paymentRequired.resource.url,\n explorerUrl: explorerUrlOrEmpty(status.chainId, status.txHash),\n accepted: option,\n paymentHeader,\n merchantTo: status.merchantAddress ?? option.payTo,\n payer: this.x402Wallet,\n chainId: status.chainId || chainIdFromNetwork(option.network),\n })\n }\n\n private buildX402Receipt(input: {\n paymentId: string\n txHash: string\n token: string\n amount: string\n to: string\n resourceUrl: string\n explorerUrl: string\n accepted: X402PaymentOption\n paymentHeader: string\n merchantTo?: string | null\n payer?: string\n chainId?: number\n }): X402Receipt {\n const fundingExplorerUrl = input.explorerUrl || explorerUrlOrEmpty(input.chainId, input.txHash)\n\n return {\n success: true,\n paymentId: input.paymentId,\n txHash: input.txHash,\n token: input.token,\n amount: input.amount,\n to: input.to,\n resourceUrl: input.resourceUrl,\n explorerUrl: input.explorerUrl,\n accepted: input.accepted,\n paymentHeader: input.paymentHeader,\n merchantTo: input.merchantTo ?? input.accepted.payTo,\n payer: input.payer,\n chainId: input.chainId,\n haven: {\n paymentId: input.paymentId,\n fundingTxHash: input.txHash,\n fundingExplorerUrl,\n },\n merchant: {\n payTo: input.merchantTo ?? input.accepted.payTo,\n },\n x402: {\n amount: x402AuthorizationAmount(input.accepted),\n token: input.token,\n network: input.accepted.network,\n asset: input.accepted.asset,\n resource: input.accepted.resource ?? input.resourceUrl,\n },\n }\n }\n\n private async createStandardX402Header(\n paymentRequired: X402PaymentRequired,\n option: X402PaymentOption,\n ): Promise<string> {\n if (!this.delegateKey) {\n throw new HavenSigningError('delegateKey is required to sign x402 payment headers.')\n }\n\n const account = privateKeyToAccount(this.delegateKey as `0x${string}`)\n const requirements = toStandardPaymentRequirements(paymentRequired, option)\n\n const header = await exact.evm.createPaymentHeader(\n account,\n paymentRequired.x402Version,\n requirements,\n )\n if (paymentRequired.x402Version < 2) return header\n\n const payment = decodeBase64Json<{ payload: unknown }>(header)\n return btoa(JSON.stringify({\n x402Version: paymentRequired.x402Version,\n accepted: option,\n payload: payment.payload,\n }))\n }\n\n private cacheX402Receipt(\n idempotencyKey: string,\n paymentHeader: string,\n receipt: X402Receipt,\n ): void {\n const expiresAt = getPaymentHeaderValidBefore(paymentHeader)\n if (expiresAt > Date.now()) {\n this.x402ReceiptCache.set(idempotencyKey, { expiresAt, receipt })\n }\n }\n\n private mapMachinePaymentReceipt(\n challenge: MachinePaymentChallenge,\n raw: RawMachinePaymentAuthorizeResponse,\n txHash: string,\n execResult?: RawSignResponse,\n ): MachinePaymentReceipt {\n const receiptWithoutHeader = {\n success: true,\n rail: challenge.rail,\n paymentId: raw.payment_id,\n challengeId: challenge.challengeId,\n txHash,\n token: execResult?.token ?? raw.token ?? challenge.asset.symbol,\n amount: execResult?.amount ?? raw.amount ?? challenge.amount.display,\n to: execResult?.to ?? raw.to ?? challenge.recipient,\n resourceUrl: raw.resource_url ?? challenge.resource,\n explorerUrl:\n execResult?.explorer_url ??\n raw.explorer_url ??\n buildExplorerUrl(execResult?.chain_id ?? raw.chain_id ?? challenge.network.chainId, txHash),\n payer: raw.payer ?? raw.safe_address,\n chainId: execResult?.chain_id ?? raw.chain_id ?? challenge.network.chainId,\n }\n\n return {\n ...receiptWithoutHeader,\n proofHeader: encodeMachinePaymentProof(receiptWithoutHeader),\n }\n }\n\n private mapMachinePaymentReceiptFromStatus(\n challenge: MachinePaymentChallenge,\n status: PaymentStatusResult,\n ): MachinePaymentReceipt {\n if (!status.txHash) {\n throw new HavenApiError(\n `MPP payment ${status.paymentId} is ready to retry but has no Haven transaction hash.`,\n 502,\n status,\n status.paymentId,\n )\n }\n\n const receiptWithoutHeader = {\n success: true,\n rail: challenge.rail,\n paymentId: status.paymentId,\n challengeId: challenge.challengeId,\n txHash: status.txHash,\n token: status.token || challenge.asset.symbol,\n amount: status.amount || challenge.amount.display,\n to: status.merchantAddress ?? challenge.recipient,\n resourceUrl: status.resourceUrl ?? challenge.resource,\n explorerUrl: explorerUrlOrEmpty(status.chainId || challenge.network.chainId, status.txHash),\n chainId: status.chainId || challenge.network.chainId,\n }\n\n return {\n ...receiptWithoutHeader,\n proofHeader: encodeMachinePaymentProof(receiptWithoutHeader),\n }\n }\n\n private async recordMerchantRetryRejected(input: {\n rail: string\n paymentId: string\n txHash: string\n resourceUrl: string\n retryResponse: Response\n details?: Record<string, unknown>\n }): Promise<void> {\n try {\n await this.post('/machine-payments/reconciliation-events', {\n paymentId: input.paymentId,\n rail: input.rail,\n eventType: 'merchant_retry_rejected_after_payment',\n txHash: input.txHash,\n reason: `Merchant returned HTTP ${input.retryResponse.status} after Haven payment confirmation`,\n details: {\n resource_url: input.resourceUrl,\n retry_status: input.retryResponse.status,\n retry_body: await responseSnippet(input.retryResponse),\n ...input.details,\n },\n })\n } catch {\n // Best-effort durability: preserve the original retry failure for callers.\n }\n }\n\n private async reportMachinePaymentEvidence(input: {\n paymentId: string\n rail: string\n txHash: string\n resourceUrl: string\n merchantStatus: number\n challengePayload?: Record<string, unknown>\n selectedPayment?: Record<string, unknown>\n paymentProofHeaderName?: string\n paymentProofHeader?: string\n protocolReceiptHeaderName?: string\n protocolReceiptHeader?: string\n }): Promise<void> {\n try {\n await this.post('/machine-payments/evidence', {\n paymentId: input.paymentId,\n rail: input.rail,\n txHash: input.txHash,\n resourceUrl: input.resourceUrl,\n merchantStatus: input.merchantStatus,\n challengePayload: input.challengePayload,\n selectedPayment: input.selectedPayment,\n paymentProofHeaderName: input.paymentProofHeaderName,\n paymentProofHeader: input.paymentProofHeader,\n protocolReceiptHeaderName: input.protocolReceiptHeaderName,\n protocolReceiptHeader: input.protocolReceiptHeader,\n protocolReceiptPayload: input.protocolReceiptHeader\n ? parseProtocolReceiptHeader(input.protocolReceiptHeader)\n : undefined,\n })\n } catch {\n // Evidence reporting is best-effort. The paid resource response remains\n // the caller-visible result when merchant retry succeeded.\n }\n }\n\n private throwIfNonSignableAuthorizationState(\n label: string,\n raw: RawMachinePaymentAuthorizeResponse | RawX402AuthorizeResponse,\n ): void {\n if (raw.status === 'pending_signature') return\n this.throwPaymentStateError(label, raw)\n }\n\n private throwPaymentStateError(\n label: string,\n raw: RawMachinePaymentAuthorizeResponse | RawX402AuthorizeResponse | RawSignResponse,\n ): never {\n const statusCode = PAYMENT_STATE_STATUS_CODES[raw.status] ?? 502\n const state = this.paymentStateFromRaw(label, raw)\n\n if (state) {\n throw new HavenPaymentStateError(state.message, statusCode, state, raw)\n }\n\n if (raw.status === 'pending_approval') {\n throw new HavenApiError(\n `${label} exceeds the on-chain allowance and was queued for owner approval (payment_id: ${raw.payment_id}).`,\n statusCode,\n raw,\n )\n }\n\n if (raw.status === 'expired') {\n throw new HavenApiError(\n `${label} expired before it could be completed (payment_id: ${raw.payment_id}).`,\n statusCode,\n raw,\n )\n }\n\n const paymentId = raw.payment_id ? ` (payment_id: ${raw.payment_id})` : ''\n const message = raw.error ?? `${label} ${raw.status}${paymentId}`\n throw new HavenApiError(message, statusCode, raw)\n }\n\n private paymentStateFromRaw(\n label: string,\n raw: RawMachinePaymentAuthorizeResponse | RawX402AuthorizeResponse | RawSignResponse,\n ): PaymentStatusResult | null {\n if (!raw.payment_id || !raw.status) return null\n\n const phase = (raw.phase as PaymentPhase | undefined) ?? phaseForStatus(raw.status)\n const nextAction = (raw.next_action as PaymentNextAction | undefined) ?? nextActionForStatus(raw.status)\n if (!phase || !nextAction) return null\n\n const amount = raw.amount ?? raw.requested ?? ''\n const token = raw.token ?? ''\n const message =\n raw.message ??\n raw.error ??\n messageForState(label, raw.status, raw.payment_id, nextAction)\n\n return {\n paymentId: raw.payment_id,\n kind: raw.kind === 'payment_intent' ? 'payment_intent' : 'approval_request',\n rail: raw.rail ?? 'direct',\n status: raw.status === 'pending' ? 'pending_approval' : raw.status,\n phase,\n nextAction,\n amount,\n token,\n resourceUrl: raw.resource_url ?? null,\n merchantAddress: raw.merchant_address ?? raw.merchant_to ?? null,\n txHash: raw.tx_hash ?? null,\n expiresAt: raw.expires_at ?? '',\n chainId: raw.chain_id ?? 0,\n message,\n amountAtomic: raw.amount_atomic ?? raw.x402?.amount_atomic ?? raw.mpp?.amount_atomic ?? null,\n asset: raw.asset ?? raw.x402?.asset ?? raw.mpp?.asset ?? null,\n network: raw.network ?? raw.x402?.network ?? raw.mpp?.network ?? null,\n description: raw.description ?? raw.x402?.description ?? raw.mpp?.description ?? null,\n idempotencyKey: raw.idempotency_key ?? raw.x402?.idempotency_key ?? raw.mpp?.idempotency_key ?? null,\n x402: raw.x402\n ? {\n amountAtomic: raw.x402.amount_atomic ?? raw.amount_atomic ?? null,\n asset: raw.x402.asset ?? raw.asset ?? null,\n network: raw.x402.network ?? raw.network ?? null,\n resourceUrl: raw.x402.resource_url ?? raw.resource_url ?? null,\n merchantAddress: raw.x402.merchant_address ?? raw.merchant_address ?? raw.merchant_to ?? null,\n description: raw.x402.description ?? raw.description ?? null,\n idempotencyKey: raw.x402.idempotency_key ?? raw.idempotency_key ?? null,\n }\n : undefined,\n mpp: raw.mpp\n ? {\n amountAtomic: raw.mpp.amount_atomic ?? raw.amount_atomic ?? null,\n asset: raw.mpp.asset ?? raw.asset ?? null,\n network: raw.mpp.network ?? raw.network ?? null,\n resourceUrl: raw.mpp.resource_url ?? raw.resource_url ?? null,\n merchantAddress: raw.mpp.merchant_address ?? raw.merchant_address ?? raw.merchant_to ?? null,\n description: raw.mpp.description ?? raw.description ?? null,\n idempotencyKey: raw.mpp.idempotency_key ?? raw.idempotency_key ?? null,\n challengeId: raw.mpp.challenge_id ?? raw.challenge_id ?? null,\n }\n : undefined,\n }\n }\n\n private x402PayerAddress(): string | undefined {\n return this.delegateAddress ?? this.x402Wallet\n }\n\n private snapshotX402Request(url: string, init?: RequestInit): X402RequestSnapshot {\n return {\n url,\n method: init?.method ?? 'GET',\n headers: Array.from(new Headers(init?.headers).entries()),\n body: this.snapshotRequestBody(init?.body),\n }\n }\n\n private snapshotRequestBody(body: BodyInit | null | undefined): string | undefined {\n if (body == null) return undefined\n if (typeof body === 'string') return body\n if (body instanceof URLSearchParams) return body.toString()\n\n throw new HavenApiError(\n 'Quote helpers can only capture resumable request bodies that are strings or URLSearchParams. ' +\n 'For streams, blobs, or binary bodies, preserve the original request yourself and call the matching resume method with fresh init.',\n 400,\n )\n }\n\n private requestInitFromSnapshot(request: X402RequestSnapshot): RequestInit {\n return {\n method: request.method,\n headers: request.headers,\n body: request.body,\n }\n }\n\n private withX402Wallet(init?: RequestInit, wallet = this.x402PayerAddress()): RequestInit | undefined {\n if (!wallet) return init\n\n const headers = new Headers(init?.headers)\n if (!headers.has('x402-wallet')) {\n headers.set('x402-wallet', wallet)\n }\n\n return {\n ...init,\n headers,\n }\n }\n\n private buildX402Quote(\n paymentRequired: X402PaymentRequired,\n request: X402RequestSnapshot,\n idempotencyKey?: string,\n ): X402Quote {\n const option = selectStandardPaymentOption(paymentRequired.accepts)\n if (!option) {\n throw new HavenApiError(\n 'No compatible payment option found in x402 requirements. ' +\n 'Haven supports standard x402 exact payments on Base USDC.',\n 400,\n )\n }\n\n const token = resolveTokenFromAddress(option.asset, option.network)\n return {\n rail: 'x402',\n idempotencyKey: idempotencyKey ?? buildX402IdempotencyKey(paymentRequired, option),\n paymentRequired,\n accepted: option,\n request,\n resourceUrl: paymentRequired.resource.url,\n description: paymentRequired.resource.description ?? option.description ?? null,\n mimeType: paymentRequired.resource.mimeType ?? option.mimeType ?? null,\n amountAtomic: x402AuthorizationAmount(option),\n amount: decimalFromUsdcAtomic(x402AuthorizationAmount(option)),\n token: token?.symbol ?? 'USDC',\n asset: option.asset,\n network: option.network,\n chainId: chainIdOrNull(option.network),\n merchantAddress: option.payTo,\n maxTimeoutSeconds: option.maxTimeoutSeconds,\n }\n }\n\n private buildX402ResumeState(input: {\n paymentId: string\n paymentRequired: X402PaymentRequired\n accepted: X402PaymentOption\n idempotencyKey: string\n request?: X402RequestSnapshot\n }): X402ResumeState {\n const token = resolveTokenFromAddress(input.accepted.asset, input.accepted.network)\n return {\n rail: 'x402',\n paymentId: input.paymentId,\n idempotencyKey: input.idempotencyKey,\n paymentRequired: input.paymentRequired,\n accepted: input.accepted,\n url: input.request?.url ?? input.paymentRequired.resource.url,\n request: input.request,\n resourceUrl: input.paymentRequired.resource.url,\n description: input.paymentRequired.resource.description ?? input.accepted.description ?? null,\n amountAtomic: x402AuthorizationAmount(input.accepted),\n amount: decimalFromUsdcAtomic(x402AuthorizationAmount(input.accepted)),\n token: token?.symbol ?? 'USDC',\n asset: input.accepted.asset,\n network: input.accepted.network,\n chainId: chainIdOrNull(input.accepted.network),\n merchantAddress: input.accepted.payTo,\n }\n }\n\n private buildMppQuote(\n challenge: MachinePaymentChallenge,\n request: X402RequestSnapshot,\n idempotencyKey?: string,\n ): MppQuote {\n return {\n rail: 'mpp',\n paymentRail: challenge.rail,\n idempotencyKey: idempotencyKey ?? buildMachinePaymentIdempotencyKey(challenge),\n challenge,\n request,\n resourceUrl: challenge.resource,\n description: challenge.description ?? null,\n amountAtomic: challenge.amount.atomic,\n amount: challenge.amount.display,\n token: challenge.asset.symbol,\n asset: challenge.asset.address,\n network: challenge.network.name,\n chainId: challenge.network.chainId,\n merchantAddress: challenge.recipient,\n expiresAt: challenge.expiresAt,\n }\n }\n\n private buildMppResumeState(input: {\n paymentId: string\n challenge: MachinePaymentChallenge\n idempotencyKey: string\n request?: X402RequestSnapshot\n }): MppResumeState {\n const quote = this.buildMppQuote(\n input.challenge,\n input.request ?? this.snapshotX402Request(input.challenge.resource),\n input.idempotencyKey,\n )\n\n return {\n rail: 'mpp',\n paymentRail: quote.paymentRail,\n paymentId: input.paymentId,\n idempotencyKey: quote.idempotencyKey,\n challenge: input.challenge,\n url: input.request?.url ?? input.challenge.resource,\n request: input.request,\n resourceUrl: quote.resourceUrl,\n description: quote.description,\n amountAtomic: quote.amountAtomic,\n amount: quote.amount,\n token: quote.token,\n asset: quote.asset,\n network: quote.network,\n chainId: quote.chainId,\n merchantAddress: quote.merchantAddress,\n expiresAt: quote.expiresAt,\n }\n }\n\n private attachResumeState(\n err: unknown,\n input:\n | {\n rail: 'x402'\n paymentRequired: X402PaymentRequired\n accepted: X402PaymentOption\n idempotencyKey: string\n request?: X402RequestSnapshot\n }\n | {\n rail: 'mpp'\n challenge: MachinePaymentChallenge\n idempotencyKey: string\n request?: X402RequestSnapshot\n },\n ): void {\n if (input.rail === 'x402') {\n this.attachX402ResumeState(\n err,\n input.paymentRequired,\n input.accepted,\n input.idempotencyKey,\n input.request,\n )\n return\n }\n\n this.attachMppResumeState(err, input.challenge, input.idempotencyKey, input.request)\n }\n\n private attachX402ResumeState(\n err: unknown,\n paymentRequired: X402PaymentRequired,\n accepted: X402PaymentOption,\n idempotencyKey: string,\n request?: X402RequestSnapshot,\n ): void {\n if (!(err instanceof HavenPaymentStateError)) return\n if (err.state.rail !== 'x402') return\n\n err.resumeState = this.buildX402ResumeState({\n paymentId: err.state.paymentId,\n paymentRequired,\n accepted,\n idempotencyKey,\n request,\n })\n }\n\n private attachMppResumeState(\n err: unknown,\n challenge: MachinePaymentChallenge,\n idempotencyKey: string,\n request?: X402RequestSnapshot,\n ): void {\n if (!(err instanceof HavenPaymentStateError)) return\n if (!isMppRail(err.state.rail)) return\n\n err.resumeState = this.buildMppResumeState({\n paymentId: err.state.paymentId,\n challenge,\n idempotencyKey,\n request,\n })\n }\n\n // ── Tool Execution (for agent frameworks) ────────────────────────\n\n /**\n * Execute a tool call by name and input.\n *\n * Designed to plug directly into agent tool-call handlers:\n *\n * ```ts\n * if (block.type === 'tool_use') {\n * const result = await haven.executeTool(block.name, block.input)\n * // send result back to the model\n * }\n * ```\n */\n async executeTool(\n toolName: string,\n input: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n if (toolName === 'make_payment') {\n const { token, amount, to } = input as {\n token: string\n amount: string\n to: string\n }\n\n try {\n const result = await this.pay({ token, amount, to })\n return {\n success: result.status === 'confirmed',\n payment_id: result.paymentId,\n status: result.status,\n tx_hash: result.txHash,\n token: result.token,\n amount: result.amount,\n to: result.to,\n explorer_url: result.explorerUrl,\n error: result.errorMessage,\n }\n } catch (err) {\n return this.toolError(err)\n }\n }\n\n if (toolName === 'authorize_x402_payment') {\n const { url, payTo, amount, asset, network, description, idempotencyKey } = input as {\n url: string\n payTo: string\n amount: string\n asset: string\n network: string\n description?: string\n idempotencyKey?: string\n }\n\n try {\n const receipt = await this.authorizeX402(\n this.toolX402PaymentRequired({ url, payTo, amount, asset, network, description }),\n { idempotencyKey },\n )\n return this.x402ToolReceipt(receipt)\n } catch (err) {\n return this.toolError(err)\n }\n }\n\n if (toolName === 'resume_x402_payment') {\n const { payment_id, url, payTo, amount, asset, network, description, idempotencyKey } = input as {\n payment_id: string\n url: string\n payTo: string\n amount: string\n asset: string\n network: string\n description?: string\n idempotencyKey?: string\n }\n\n try {\n const receipt = await this.resumeAuthorizedX402({\n paymentId: payment_id,\n paymentRequired: this.toolX402PaymentRequired({ url, payTo, amount, asset, network, description }),\n idempotencyKey,\n })\n return this.x402ToolReceipt(receipt)\n } catch (err) {\n return this.toolError(err)\n }\n }\n\n if (toolName === 'authorize_machine_payment') {\n const { challenge, idempotencyKey } = input as {\n challenge: MachinePaymentChallenge\n idempotencyKey?: string\n }\n\n try {\n const receipt = await this.authorizeMachinePayment(challenge, { idempotencyKey })\n return {\n success: true,\n payment_id: receipt.paymentId,\n tx_hash: receipt.txHash,\n token: receipt.token,\n amount: receipt.amount,\n to: receipt.to,\n resource_url: receipt.resourceUrl,\n explorer_url: receipt.explorerUrl,\n proof_header: receipt.proofHeader,\n rail: receipt.rail,\n challenge_id: receipt.challengeId,\n payer: receipt.payer,\n chain_id: receipt.chainId,\n }\n } catch (err) {\n return this.toolError(err)\n }\n }\n\n if (toolName === 'get_payment_status') {\n const { payment_id } = input as { payment_id: string }\n const result = await this.getPaymentStatus(payment_id)\n return {\n payment_id: result.paymentId,\n kind: result.kind,\n rail: result.rail,\n status: result.status,\n phase: result.phase,\n next_action: result.nextAction,\n tx_hash: result.txHash,\n token: result.token,\n amount: result.amount,\n resource_url: result.resourceUrl,\n merchant_address: result.merchantAddress,\n amount_atomic: result.amountAtomic,\n asset: result.asset,\n network: result.network,\n description: result.description,\n idempotency_key: result.idempotencyKey,\n x402: result.x402,\n mpp: result.mpp,\n expires_at: result.expiresAt,\n chain_id: result.chainId,\n message: result.message,\n }\n }\n\n if (toolName === 'get_allowances') {\n return { ...await this.getAllowances() }\n }\n\n throw new Error(`Unknown tool: ${toolName}`)\n }\n\n private toolX402PaymentRequired(input: {\n url: string\n payTo: string\n amount: string\n asset: string\n network: string\n description?: string\n }): X402PaymentRequired {\n return {\n x402Version: 2,\n resource: { url: input.url, description: input.description },\n accepts: [\n {\n scheme: 'exact',\n network: input.network,\n amount: input.amount,\n asset: input.asset,\n payTo: input.payTo,\n maxTimeoutSeconds: 30,\n },\n ],\n }\n }\n\n private x402ToolReceipt(receipt: X402Receipt): Record<string, unknown> {\n return {\n success: true,\n payment_id: receipt.paymentId,\n tx_hash: receipt.txHash,\n token: receipt.token,\n amount: receipt.amount,\n to: receipt.to,\n resource_url: receipt.resourceUrl,\n explorer_url: receipt.explorerUrl,\n payment_header: receipt.paymentHeader,\n merchant_to: receipt.merchantTo,\n payer: receipt.payer,\n chain_id: receipt.chainId,\n haven: receipt.haven,\n merchant: receipt.merchant,\n x402: receipt.x402,\n }\n }\n\n private toolError(err: unknown): Record<string, unknown> {\n if (err instanceof HavenPaymentStateError) {\n return {\n success: false,\n payment_id: err.state.paymentId,\n kind: err.state.kind,\n rail: err.state.rail,\n status: err.state.status,\n phase: err.state.phase,\n next_action: err.state.nextAction,\n tx_hash: err.state.txHash,\n token: err.state.token,\n amount: err.state.amount,\n resource_url: err.state.resourceUrl,\n merchant_address: err.state.merchantAddress,\n amount_atomic: err.state.amountAtomic,\n asset: err.state.asset,\n network: err.state.network,\n description: err.state.description,\n idempotency_key: err.state.idempotencyKey,\n x402: err.state.x402\n ? {\n amount_atomic: err.state.x402.amountAtomic,\n asset: err.state.x402.asset,\n network: err.state.x402.network,\n resource_url: err.state.x402.resourceUrl,\n merchant_address: err.state.x402.merchantAddress,\n description: err.state.x402.description,\n idempotency_key: err.state.x402.idempotencyKey,\n }\n : undefined,\n mpp: err.state.mpp\n ? {\n amount_atomic: err.state.mpp.amountAtomic,\n asset: err.state.mpp.asset,\n network: err.state.mpp.network,\n resource_url: err.state.mpp.resourceUrl,\n merchant_address: err.state.mpp.merchantAddress,\n description: err.state.mpp.description,\n idempotency_key: err.state.mpp.idempotencyKey,\n challenge_id: err.state.mpp.challengeId,\n }\n : undefined,\n resume_state: err.resumeState,\n expires_at: err.state.expiresAt,\n chain_id: err.state.chainId,\n message: err.state.message,\n error: err.message,\n }\n }\n\n if (err instanceof HavenApiError) {\n return {\n success: false,\n status_code: err.statusCode,\n error: err.message,\n body: err.body,\n }\n }\n\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n }\n }\n\n // ── HTTP Helpers ─────────────────────────────────────────────────\n\n private async post<T>(path: string, body: Record<string, unknown>): Promise<T> {\n return this.request<T>('POST', path, body)\n }\n\n private async get<T>(path: string): Promise<T> {\n return this.request<T>('GET', path)\n }\n\n private async request<T>(\n method: 'GET' | 'POST',\n path: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), this.requestTimeout)\n\n try {\n const contextHeaders = this.requestContext.getStore()?.headers ?? {}\n const res = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n ...this.defaultHeaders,\n ...contextHeaders,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n })\n\n const data = await res.json()\n\n if (!res.ok) {\n const message =\n (data as Record<string, unknown>).error as string\n ?? (data as Record<string, unknown>).details as string\n ?? `API request failed`\n throw new HavenApiError(message, res.status, data)\n }\n\n return data as T\n } catch (err) {\n if (err instanceof HavenApiError) throw err\n if (err instanceof Error && err.name === 'AbortError') {\n throw new HavenApiError(`Request to ${path} timed out`, 408)\n }\n throw new HavenApiError(\n `Request to ${path} failed: ${err instanceof Error ? err.message : String(err)}`,\n 0,\n )\n } finally {\n clearTimeout(timeout)\n }\n }\n\n // ── Mapping Helpers ──────────────────────────────────────────────\n\n private mapPaymentResult(raw: RawStatusResponse): PaymentResult {\n return {\n paymentId: raw.payment_id,\n status: raw.status as PaymentStatus,\n token: raw.token,\n amount: raw.amount,\n to: raw.to,\n txHash: raw.tx_hash,\n errorMessage: raw.error_message,\n explorerUrl: raw.explorer_url ?? (raw.tx_hash ? buildExplorerUrl(raw.chain_id, raw.tx_hash) : null),\n createdAt: raw.created_at,\n signedAt: raw.signed_at,\n submittedAt: raw.submitted_at,\n confirmedAt: raw.confirmed_at,\n expiresAt: raw.expires_at,\n }\n }\n\n private mapPaymentStatusResult(raw: RawPaymentStatusResult): PaymentStatusResult {\n return {\n paymentId: raw.payment_id,\n kind: raw.kind,\n rail: raw.rail,\n status: raw.status,\n phase: raw.phase,\n nextAction: raw.next_action,\n amount: raw.amount,\n token: raw.token,\n resourceUrl: raw.resource_url,\n merchantAddress: raw.merchant_address,\n txHash: raw.tx_hash,\n expiresAt: raw.expires_at,\n chainId: raw.chain_id,\n message: raw.message,\n amountAtomic: raw.amount_atomic ?? raw.x402?.amount_atomic ?? null,\n asset: raw.asset ?? raw.x402?.asset ?? null,\n network: raw.network ?? raw.x402?.network ?? null,\n description: raw.description ?? raw.x402?.description ?? null,\n idempotencyKey: raw.idempotency_key ?? raw.x402?.idempotency_key ?? null,\n x402: raw.x402\n ? {\n amountAtomic: raw.x402.amount_atomic ?? raw.amount_atomic ?? null,\n asset: raw.x402.asset ?? raw.asset ?? null,\n network: raw.x402.network ?? raw.network ?? null,\n resourceUrl: raw.x402.resource_url ?? raw.resource_url,\n merchantAddress: raw.x402.merchant_address ?? raw.merchant_address,\n description: raw.x402.description ?? raw.description ?? null,\n idempotencyKey: raw.x402.idempotency_key ?? raw.idempotency_key ?? null,\n }\n : undefined,\n }\n }\n\n private mapPaymentReceipt(raw: RawHavenPaymentReceipt): HavenPaymentReceipt {\n const receipt: HavenPaymentReceipt = {\n id: raw.id,\n paymentId: raw.payment_id,\n rail: raw.rail,\n proofStatus: raw.proof_status,\n txHash: raw.tx_hash,\n chainId: raw.chain_id,\n resourceUrl: raw.resource_url,\n merchantAddress: raw.merchant_address,\n payerAddress: raw.payer_address,\n settlementAddress: raw.settlement_address,\n tokenSymbol: raw.token_symbol,\n tokenAddress: raw.token_address,\n amountRaw: raw.amount_raw,\n amount: raw.amount_human,\n challengeId: raw.challenge_id,\n idempotencyKey: raw.idempotency_key,\n challengePayload: raw.challenge_payload,\n selectedPayment: raw.selected_payment,\n paymentProofHeaderName: raw.payment_proof_header_name,\n protocolReceiptHeaderName: raw.protocol_receipt_header_name,\n protocolReceiptPayload: raw.protocol_receipt_payload,\n merchantStatus: raw.merchant_status,\n confirmedAt: raw.confirmed_at,\n createdAt: raw.created_at,\n updatedAt: raw.updated_at,\n }\n\n if ('payment_intent_id' in raw) {\n receipt.paymentIntentId = raw.payment_intent_id ?? null\n }\n if ('approval_request_id' in raw) {\n receipt.approvalRequestId = raw.approval_request_id ?? null\n }\n\n return receipt\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction getPaymentHeaderValidBefore(paymentHeader: string): number {\n try {\n const payment = decodeBase64Json<{ payload?: { authorization?: { validBefore?: string } } }>(\n paymentHeader,\n )\n const payload = payment.payload as { authorization?: { validBefore?: string } }\n const validBeforeSeconds = Number(payload.authorization?.validBefore)\n if (Number.isFinite(validBeforeSeconds)) return validBeforeSeconds * 1000\n } catch {\n // If the header cannot be decoded, skip caching rather than hiding errors.\n }\n\n return 0\n}\n\nfunction decodeBase64Json<T>(value: string): T {\n return JSON.parse(atob(value)) as T\n}\n\nfunction parseProtocolReceiptHeader(value: string): Record<string, unknown> | undefined {\n try {\n return JSON.parse(atob(value)) as Record<string, unknown>\n } catch {\n try {\n return JSON.parse(value) as Record<string, unknown>\n } catch {\n return undefined\n }\n }\n}\n\nasync function responseSnippet(response: Response): Promise<string | null> {\n try {\n const text = await response.clone().text()\n return text.slice(0, 1000) || null\n } catch {\n return null\n }\n}\n","/**\n * Shared semantic descriptions for Haven agent payment tools.\n *\n * Two surfaces in this repo expose Haven as a tool: the Claude / OpenAI\n * function-calling tool definitions in `tools.ts` (used for direct SDK\n * integrations) and the MCP server in `packages/mcp` (used by any MCP-speaking\n * agent runtime). The two surfaces use different tool *names* — the SDK's\n * tools are tuned for tool-calling conventions (`make_payment`,\n * `authorize_x402_payment`); the MCP tools follow the MCP `haven_*` naming\n * (`haven_pay_x402_quote`).\n *\n * The underlying *operations* are the same, so the descriptive prose should\n * live in one place. Both surfaces import from this module and compose their\n * own tool descriptions from these semantic fragments. Drift is caught by\n * tests asserting each consumer's description string contains the shared\n * `summary` from this module.\n */\n\nexport interface ToolDescription {\n /** One-line summary of the operation. Used as the first sentence of every\n * downstream description and as a stable substring for drift tests. */\n summary: string\n /** Natural-language user intents that should make an agent prefer this\n * tool over adjacent tools. Empty or omitted when the summary is enough. */\n selectionGuidance?: string\n /** Concrete behaviour the tool performs end-to-end, including which\n * non-custodial guarantee applies. */\n behavior: string\n /** What the agent should do next on error / pending-approval states.\n * Empty string if not applicable. */\n nextActionGuidance: string\n}\n\n/**\n * Build a single description string from the three fragments. Joined with\n * spaces so consumers can split on the summary substring if they need to.\n */\nexport function composeDescription(d: ToolDescription): string {\n return [d.summary, d.selectionGuidance, d.behavior, d.nextActionGuidance]\n .filter(Boolean)\n .join(' ')\n}\n\nexport const toolDescriptions = {\n quoteX402: {\n summary:\n 'Inspect an HTTP 402 x402 paid resource without creating a Haven payment, signature, approval, or on-chain transaction.',\n behavior:\n 'Probes the merchant directly and parses the 402 response. Pure read-only client behavior — Haven is not contacted.',\n nextActionGuidance: '',\n },\n payX402: {\n summary:\n 'Pay an inspected x402 quote. The delegate key signs locally; Haven only validates and relays signed, on-chain-constrained payment transactions.',\n selectionGuidance:\n 'Do not use this for read-only allowance, budget, spend-limit, remaining-amount, reset-period, or what-can-I-spend questions; use the allowance lookup tool instead.',\n behavior:\n 'Signs the EIP-3009 payment from the delegate wallet, asks Haven for a Safe AllowanceModule top-up if needed, and returns the merchant response or a pending-approval state.',\n nextActionGuidance:\n 'If approval is needed, preserve the returned resume_state and wait for nextAction=retry_original_x402_request before resuming.',\n },\n resumeX402: {\n summary:\n 'Resume an x402 payment after the Haven wallet owner approved the funding step.',\n behavior:\n 'Accepts either resume_state or payment_id, validates the original x402 details against the approved Haven funding, and retries the merchant request with the X-PAYMENT header. No new Haven approval is created.',\n nextActionGuidance:\n 'Only use when get_payment_status returns nextAction=retry_original_x402_request; do not start a new merchant session.',\n },\n quoteMpp: {\n summary:\n 'Inspect a Haven MPP challenge or paid MPP URL without creating a Haven payment, signature, approval, or on-chain transaction.',\n behavior:\n 'Parses an MPP challenge envelope and returns a typed quote with rail tag, amount, asset, and merchant context. Pure read-only — Haven is not contacted.',\n nextActionGuidance: '',\n },\n payMpp: {\n summary:\n 'Pay an inspected MPP challenge. The delegate key signs locally; Haven only validates and relays signed, on-chain-constrained payment transactions.',\n selectionGuidance:\n 'Do not use this for read-only allowance, budget, spend-limit, remaining-amount, reset-period, or what-can-I-spend questions; use the allowance lookup tool instead.',\n behavior:\n 'Authorizes the payment through Haven within the on-chain allowance, signs the challenge proof, and returns the proof header for retrying the original paid resource.',\n nextActionGuidance:\n 'If approval is needed, preserve resume_state or payment_id and wait for nextAction=retry_original_x402_request before resuming.',\n },\n resumeMpp: {\n summary:\n 'Resume an MPP payment after the Haven wallet owner approved the funding step.',\n behavior:\n 'Accepts either resume_state or payment_id and retries the original paid resource with the MPP proof header. No new Haven approval is created.',\n nextActionGuidance: '',\n },\n getPaymentStatus: {\n summary:\n 'Fetch structured Haven payment status, including phase and nextAction taxonomy for agent recovery.',\n behavior:\n 'Accepts a payment intent or approval request id and returns the full state taxonomy (phase, nextAction, rail, amount, merchant, resource url, idempotency key, message).',\n nextActionGuidance: '',\n },\n getResumeState: {\n summary:\n 'Rehydrate stored x402 or MPP resume_state by payment_id.',\n behavior:\n 'Returns the context that the agent originally received in a pending-approval response, reconstructed from Haven\\'s database. This is context only; signing still happens locally when a resume tool is called.',\n nextActionGuidance: '',\n },\n getAgent: {\n summary:\n 'Return the authenticated agent identity, Haven wallet, delegate address, chain, and status.',\n behavior:\n 'Read-only identity lookup. Useful for verifying which on-chain Safe and delegate the credential is bound to.',\n nextActionGuidance: '',\n },\n getAllowances: {\n summary:\n 'Return configured and on-chain allowance state for the authenticated agent. On-chain allowance is the real spend gate.',\n selectionGuidance:\n 'Use this when the user asks about allowance, budget, spend limit, remaining amount, remaining allowance, remaining budget, daily limit, reset period, what can I spend, or what the agent can still spend.',\n behavior:\n 'Reads the Safe AllowanceModule snapshot per token (allowance, spent, remaining, reset window). Configured amounts from Haven are returned alongside the on-chain truth.',\n nextActionGuidance: '',\n },\n listReceipts: {\n summary:\n 'List recent machine-payment receipts and evidence for bookkeeping.',\n selectionGuidance:\n 'Use this for transaction history, receipts, payment evidence, or bookkeeping; use the allowance tool instead for remaining allowance, budget, spend-limit, or what-can-I-spend questions.',\n behavior:\n 'Returns the agent\\'s recent machine-payment receipts ordered by recency. Proof header values are not returned.',\n nextActionGuidance: '',\n },\n} as const satisfies Record<string, ToolDescription>\n\nexport type SharedToolKey = keyof typeof toolDescriptions\n","/**\n * Pre-built tool definitions for AI agent frameworks.\n *\n * These definitions describe Haven's direct SDK tool-calling surface in the\n * formats expected by Claude (Anthropic) and OpenAI.\n *\n * The agent payment surface used by these tools is shared with the\n * `@haven_ai/mcp` server — both consume `toolDescriptions` from\n * `./tool-descriptions.ts`. Each consumer composes its own user-visible string\n * from the same semantic fragments, so guidance lands in both surfaces at\n * once and a downstream test asserts the shared summary appears in every\n * consumer description.\n *\n * Usage with Claude:\n * const response = await anthropic.messages.create({\n * tools: havenTools.claude(),\n * ...\n * })\n *\n * Usage with OpenAI:\n * const response = await openai.chat.completions.create({\n * tools: havenTools.openai(),\n * ...\n * })\n */\n\nimport { composeDescription, toolDescriptions as sharedDescriptions } from './tool-descriptions.js'\n\n// ── JSON Schema (shared across formats) ──────────────────────────\n\nconst makePaymentSchema = {\n type: 'object' as const,\n properties: {\n token: {\n type: 'string' as const,\n description: 'Token to send. Gnosis Chain: EURe, USDC.e, xDAI. Base: USDC, ETH.',\n },\n amount: {\n type: 'string' as const,\n description: 'Amount to send as a decimal string, e.g. \"5.00\"',\n },\n to: {\n type: 'string' as const,\n description: 'Recipient Ethereum address (0x...)',\n },\n reason: {\n type: 'string' as const,\n description: 'Brief reason for this payment (for audit trail)',\n },\n },\n required: ['token', 'amount', 'to', 'reason'] as const,\n}\n\nconst getPaymentStatusSchema = {\n type: 'object' as const,\n properties: {\n payment_id: {\n type: 'string' as const,\n description: 'The payment ID returned from make_payment',\n },\n },\n required: ['payment_id'] as const,\n}\n\nconst getAllowancesSchema = {\n type: 'object' as const,\n properties: {},\n required: [] as const,\n}\n\nconst authorizeX402Schema = {\n type: 'object' as const,\n properties: {\n url: {\n type: 'string' as const,\n description: 'The URL that returned HTTP 402',\n },\n payTo: {\n type: 'string' as const,\n description: 'Payment recipient address from the 402 response',\n },\n amount: {\n type: 'string' as const,\n description: 'Payment amount in atomic units (e.g. \"1000000\" for 1 USDC)',\n },\n asset: {\n type: 'string' as const,\n description: 'Token contract address from the 402 response',\n },\n network: {\n type: 'string' as const,\n description: 'CAIP-2 chain ID. \"eip155:100\" for Gnosis Chain, \"eip155:8453\" for Base.',\n },\n description: {\n type: 'string' as const,\n description: 'Description of the resource being paid for',\n },\n idempotencyKey: {\n type: 'string' as const,\n description: 'Stable caller-supplied key for this user intent. Reuse it when resuming after user approval.',\n },\n },\n required: ['url', 'payTo', 'amount', 'asset', 'network'] as const,\n}\n\nconst resumeX402Schema = {\n type: 'object' as const,\n properties: {\n payment_id: {\n type: 'string' as const,\n description: 'The payment or approval request ID returned by authorize_x402_payment.',\n },\n url: {\n type: 'string' as const,\n description: 'The original URL that returned HTTP 402.',\n },\n payTo: {\n type: 'string' as const,\n description: 'Payment recipient address from the original 402 response.',\n },\n amount: {\n type: 'string' as const,\n description: 'Payment amount in atomic units from the original 402 response.',\n },\n asset: {\n type: 'string' as const,\n description: 'Token contract address from the original 402 response.',\n },\n network: {\n type: 'string' as const,\n description: 'CAIP-2 chain ID or x402 network from the original 402 response.',\n },\n description: {\n type: 'string' as const,\n description: 'Description of the resource being paid for.',\n },\n idempotencyKey: {\n type: 'string' as const,\n description: 'Stable caller-supplied key used for the original authorization.',\n },\n },\n required: ['payment_id', 'url', 'payTo', 'amount', 'asset', 'network'] as const,\n}\n\nconst authorizeMachinePaymentSchema = {\n type: 'object' as const,\n properties: {\n challenge: {\n type: 'object' as const,\n description: 'Machine payment challenge returned by a Haven demo endpoint',\n },\n },\n required: ['challenge'] as const,\n}\n\nconst MAKE_PAYMENT_DESCRIPTION =\n 'Request and sign a payment from the user-controlled Safe within approved on-chain limits. ' +\n 'For read-only allowance, budget, spend-limit, remaining-amount, or reset-period questions, use get_allowances instead of making a payment. ' +\n 'Haven authenticates the agent, validates the signed intent, and relays the Safe AllowanceModule transaction; it does not hold keys or control funds. ' +\n 'Gnosis Chain tokens: EURe, USDC.e, xDAI. Base tokens: USDC, ETH.'\n\n// Descriptions are composed from the shared semantic source so the SDK and MCP\n// surfaces stay in lockstep. Each constant prepends the shared `summary` (the\n// stable substring tests assert on) and then appends the SDK-specific guidance\n// for tool-calling consumers.\n\nconst GET_STATUS_DESCRIPTION =\n sharedDescriptions.getPaymentStatus.summary + ' ' +\n 'Accepts payment intent IDs and approval request IDs. Returns the current status, phase, next_action, transaction hash if available, and payment details.'\n\nconst GET_ALLOWANCES_DESCRIPTION = composeDescription(sharedDescriptions.getAllowances)\n\nconst AUTHORIZE_X402_DESCRIPTION =\n composeDescription(sharedDescriptions.payX402) + ' ' +\n 'In this SDK tool set, the allowance lookup tool is get_allowances. ' +\n 'When a paid API returns x402 payment requirements, use this tool to sign with the agent-owned delegate key and request a policy-limited Safe AllowanceModule top-up when needed. ' +\n 'Haven relays signed transactions only; the agent key authorizes payment and on-chain limits enforce spend. ' +\n 'If this returns pending_approval, tell the user it is waiting in Haven, preserve the original merchant/MCP session and x402 details, call get_payment_status later, and use resume_x402_payment only when next_action is retry_original_x402_request. Do not start a new merchant session or loop retries while approval is pending. ' +\n 'Use the returned payment_header as the X-PAYMENT header on the retry request when doing a manual HTTP retry.'\n\nconst RESUME_X402_DESCRIPTION =\n sharedDescriptions.resumeX402.summary + ' ' +\n 'Use this only after get_payment_status returns next_action=retry_original_x402_request. ' +\n 'It checks the approved payment, validates the original x402 details, and returns a merchant X-PAYMENT header without creating a new approval request or merchant session.'\n\nconst AUTHORIZE_MACHINE_PAYMENT_DESCRIPTION =\n composeDescription(sharedDescriptions.payMpp) + ' ' +\n 'In this SDK tool set, the allowance lookup tool is get_allowances. ' +\n 'Currently scoped to the internal MPP demo rail. ' +\n 'The agent signs the payment, Haven relays it within the on-chain allowance, and the tool returns a proof header for the retry request.'\n\n// ── Claude (Anthropic) format ────────────────────────────────────\n\nexport interface ClaudeTool {\n name: string\n description: string\n input_schema: {\n type: 'object'\n properties: Record<string, unknown>\n required: readonly string[]\n }\n}\n\nfunction claudeTools(): ClaudeTool[] {\n return [\n {\n name: 'make_payment',\n description: MAKE_PAYMENT_DESCRIPTION,\n input_schema: makePaymentSchema,\n },\n {\n name: 'get_payment_status',\n description: GET_STATUS_DESCRIPTION,\n input_schema: getPaymentStatusSchema,\n },\n {\n name: 'get_allowances',\n description: GET_ALLOWANCES_DESCRIPTION,\n input_schema: getAllowancesSchema,\n },\n {\n name: 'authorize_x402_payment',\n description: AUTHORIZE_X402_DESCRIPTION,\n input_schema: authorizeX402Schema,\n },\n {\n name: 'resume_x402_payment',\n description: RESUME_X402_DESCRIPTION,\n input_schema: resumeX402Schema,\n },\n {\n name: 'authorize_machine_payment',\n description: AUTHORIZE_MACHINE_PAYMENT_DESCRIPTION,\n input_schema: authorizeMachinePaymentSchema,\n },\n ]\n}\n\n// ── OpenAI format ────────────────────────────────────────────────\n\nexport interface OpenAITool {\n type: 'function'\n function: {\n name: string\n description: string\n parameters: {\n type: 'object'\n properties: Record<string, unknown>\n required: readonly string[]\n }\n }\n}\n\nfunction openaiTools(): OpenAITool[] {\n return [\n {\n type: 'function',\n function: {\n name: 'make_payment',\n description: MAKE_PAYMENT_DESCRIPTION,\n parameters: makePaymentSchema,\n },\n },\n {\n type: 'function',\n function: {\n name: 'get_payment_status',\n description: GET_STATUS_DESCRIPTION,\n parameters: getPaymentStatusSchema,\n },\n },\n {\n type: 'function',\n function: {\n name: 'get_allowances',\n description: GET_ALLOWANCES_DESCRIPTION,\n parameters: getAllowancesSchema,\n },\n },\n {\n type: 'function',\n function: {\n name: 'authorize_x402_payment',\n description: AUTHORIZE_X402_DESCRIPTION,\n parameters: authorizeX402Schema,\n },\n },\n {\n type: 'function',\n function: {\n name: 'resume_x402_payment',\n description: RESUME_X402_DESCRIPTION,\n parameters: resumeX402Schema,\n },\n },\n {\n type: 'function',\n function: {\n name: 'authorize_machine_payment',\n description: AUTHORIZE_MACHINE_PAYMENT_DESCRIPTION,\n parameters: authorizeMachinePaymentSchema,\n },\n },\n ]\n}\n\n// ── Public API ───────────────────────────────────────────────────\n\nexport const havenTools = {\n /** Tool definitions in Anthropic/Claude format */\n claude: claudeTools,\n\n /** Tool definitions in OpenAI function-calling format */\n openai: openaiTools,\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/signer.ts","../src/x402.ts","../src/mpp.ts","../src/client.ts","../src/tool-descriptions.ts","../src/tools.ts"],"names":["ethers","createHash","decodeBase64Json","AsyncLocalStorage","receipt","request","privateKeyToAccount","exact"],"mappings":"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","file":"index.cjs","sourcesContent":["// ── Client Configuration ─────────────────────────────────────────\n\nexport interface HavenClientConfig {\n /** Haven API key (sk_agent_xxx) */\n apiKey: string\n\n /** Agent's delegate EOA private key. If provided, the SDK handles signing automatically. */\n delegateKey?: string\n\n /** Haven API base URL (default: http://localhost:3001) */\n baseUrl?: string\n\n /** Optional wallet identity to send as the x402-wallet header. */\n x402Wallet?: string\n\n /** Timeout in ms for individual HTTP requests (default: 30000) */\n requestTimeout?: number\n\n /** Timeout in ms when polling for tx confirmation (default: 90000) */\n confirmationTimeout?: number\n\n /** Polling interval in ms when waiting for confirmation (default: 3000) */\n pollingInterval?: number\n\n /**\n * Extra headers to attach to every request to the Haven API.\n *\n * Used by the MCP server to tag requests with `X-Haven-MCP-Tool: <name>`\n * so the backend can record an audit-log entry per tool invocation. Has\n * no effect on outbound merchant requests (x402 / MPP) — those are\n * standard HTTP and never carry Haven-internal headers.\n */\n defaultHeaders?: Record<string, string>\n}\n\n// ── Payment Types ────────────────────────────────────────────────\n\nexport interface PaymentRequest {\n /** Token symbol: \"EURe\", \"USDC.e\", or \"xDAI\" */\n token: string\n\n /** Amount as a decimal string, e.g. \"5.00\" */\n amount: string\n\n /** Recipient Ethereum address (0x...) */\n to: string\n}\n\nexport interface SignData {\n /** The hash to sign (keccak256, 0x-prefixed) */\n hash: string\n\n /** Breakdown of values that were hashed — useful for debugging */\n components: {\n safe: string\n token: string\n to: string\n amount: string\n payment_token: string\n payment: string\n nonce: number\n }\n\n /** Human-readable signing instructions */\n instructions: string\n}\n\nexport interface PaymentIntent {\n /** Unique payment ID */\n paymentId: string\n\n /** Current status */\n status: 'pending_signature'\n\n /** ISO 8601 expiry timestamp */\n expiresAt: string\n\n /** Data needed to sign the payment */\n signData: SignData\n}\n\nexport type PaymentStatus =\n | 'pending_signature'\n | 'submitted'\n | 'confirmed'\n | 'pending_approval'\n | 'approved'\n | 'proposed'\n | 'executed'\n | 'rejected'\n | 'expired'\n | 'failed'\n\nexport interface PaymentResult {\n /** Unique payment ID */\n paymentId: string\n\n /** Final status */\n status: PaymentStatus\n\n /** Token that was sent */\n token: string\n\n /** Amount that was sent (human-readable) */\n amount: string\n\n /** Recipient address */\n to: string\n\n /** On-chain transaction hash (present when confirmed) */\n txHash: string | null\n\n /** Error message (present when failed) */\n errorMessage: string | null\n\n /** Block explorer URL for the transaction (chain-dependent) */\n explorerUrl: string | null\n\n /** ISO 8601 timestamps */\n createdAt: string\n signedAt: string | null\n submittedAt: string | null\n confirmedAt: string | null\n expiresAt: string\n}\n\n// ── x402 Types ──────────────────────────────────────────────────\n\n/** Payment requirements from an HTTP 402 response (x402 protocol). */\nexport interface X402PaymentRequired {\n x402Version: number\n resource: {\n url: string\n description?: string\n mimeType?: string\n }\n accepts: X402PaymentOption[]\n error?: string\n}\n\n/** A single payment option from x402 PaymentRequired. */\nexport interface X402PaymentOption {\n scheme: string // \"exact\"\n network: string // CAIP-2 chain ID or x402 network, e.g. \"eip155:8453\" or \"base\"\n amount: string // Atomic units\n maxAmountRequired?: string // Atomic units (official x402 field)\n resource?: string\n description?: string\n mimeType?: string\n asset: string // Token contract address\n payTo: string // Recipient address\n maxTimeoutSeconds: number\n extra?: Record<string, unknown>\n}\n\n/** Receipt returned after a successful x402 payment. */\nexport interface X402Receipt {\n success: boolean\n paymentId: string\n txHash: string\n token: string\n amount: string\n to: string\n resourceUrl: string\n explorerUrl: string\n accepted?: X402PaymentOption\n paymentHeader?: string\n merchantTo?: string | null\n payer?: string\n chainId?: number\n haven?: {\n paymentId: string\n fundingTxHash: string\n fundingExplorerUrl: string\n }\n merchant?: {\n payTo: string | null\n settlementTxHash?: string | null\n settlementExplorerUrl?: string | null\n }\n x402?: {\n amount: string\n token: string\n network: string\n asset: string\n resource: string\n }\n}\n\nexport interface X402AuthorizationOptions {\n /** Stable caller-supplied key for this user intent. Prevents duplicate approvals across fresh 402 quotes. */\n idempotencyKey?: string\n}\n\n/**\n * Keyless x402 construct result.\n *\n * Returned by `createX402Intent` — the non-custodial half of an x402 payment.\n * It carries the unsigned funding hash (`signData.hash`, Safe → delegate EOA)\n * plus everything the *edge* needs to build and sign the EIP-3009 merchant\n * header itself. The construct path never signs; both delegate signatures\n * (funding hash + merchant header) happen on the machine that holds the key.\n */\nexport interface X402Intent {\n /** Haven payment id for the funding transfer. */\n paymentId: string\n status: 'pending_signature'\n /** ISO 8601 expiry of the funding intent, if returned. */\n expiresAt?: string\n /** The unsigned funding hash to sign with the delegate key (Safe → delegate EOA). */\n signData: SignData\n /** The selected x402 option — the edge needs this to build the EIP-3009 header. */\n accepted: X402PaymentOption\n /** Resource URL the 402 came from. */\n resourceUrl: string\n /** Merchant payTo address (the final recipient of the EIP-3009 transfer). */\n merchantTo: string\n /** Atomic amount the edge signer must authorize in the merchant header. */\n amountAtomic: string\n /** Token contract the merchant header must pay. */\n asset: string\n /** x402 network the merchant header must use. */\n network: string\n /** Haven-authenticated binding over the x402 expected context. */\n expectedAuth: X402ExpectedAuth\n /** Delegate EOA the funding transfer tops up (the x402 payer). */\n fundingTo: string\n}\n\nexport interface X402ExpectedContext {\n paymentId: string\n payloadHash: string\n resourceUrl: string\n merchantTo: string\n amount: string\n asset: string\n network: string\n}\n\nexport interface X402ExpectedAuth {\n version: 1\n message: string\n signature: string\n signer: string\n}\n\n/** Serializable HTTP request state for retrying the same x402 merchant request. */\nexport interface X402RequestSnapshot {\n url: string\n method: string\n headers: [string, string][]\n body?: string\n}\n\n/** Quote parsed from an HTTP 402 response without creating a Haven payment. */\nexport interface X402Quote {\n rail: 'x402'\n idempotencyKey: string\n paymentRequired: X402PaymentRequired\n accepted: X402PaymentOption\n request: X402RequestSnapshot\n resourceUrl: string\n description: string | null\n mimeType: string | null\n amountAtomic: string\n amount: string\n token: string\n asset: string\n network: string\n chainId: number | null\n merchantAddress: string\n maxTimeoutSeconds: number\n}\n\n/** State bundle an agent can persist while waiting for manual x402 approval. */\nexport interface X402ResumeState {\n rail: 'x402'\n paymentId: string\n idempotencyKey: string\n paymentRequired: X402PaymentRequired\n accepted: X402PaymentOption\n url: string\n request?: X402RequestSnapshot\n resourceUrl: string\n description: string | null\n amountAtomic: string\n amount: string\n token: string\n asset: string\n network: string\n chainId: number | null\n merchantAddress: string\n}\n\nexport interface MppAuthorizationOptions {\n /** Stable caller-supplied key for this user intent. Prevents duplicate approvals across retries. */\n idempotencyKey?: string\n}\n\n/** Quote parsed from an MPP challenge without creating a Haven payment. */\nexport interface MppQuote {\n rail: 'mpp'\n paymentRail: MachinePaymentRail\n idempotencyKey: string\n challenge: MachinePaymentChallenge\n request: X402RequestSnapshot\n resourceUrl: string\n description: string | null\n amountAtomic: string\n amount: string\n token: string\n asset: string\n network: string\n chainId: number\n merchantAddress: string\n expiresAt: string\n}\n\n/** State bundle an agent can persist while waiting for manual MPP approval. */\nexport interface MppResumeState {\n rail: 'mpp'\n paymentRail: MachinePaymentRail\n paymentId: string\n idempotencyKey: string\n challenge: MachinePaymentChallenge\n url: string\n request?: X402RequestSnapshot\n resourceUrl: string\n description: string | null\n amountAtomic: string\n amount: string\n token: string\n asset: string\n network: string\n chainId: number\n merchantAddress: string\n expiresAt: string\n}\n\nexport type PaymentResumeState = X402ResumeState | MppResumeState\n\nexport interface ResumeAuthorizedX402Input extends X402AuthorizationOptions {\n /** Payment or approval request ID returned by authorizeX402 / haven.fetch. */\n paymentId: string\n\n /** Original or freshly parsed x402 requirements for the merchant retry. */\n paymentRequired: X402PaymentRequired\n}\n\nexport interface ResumeX402PaymentInput extends X402AuthorizationOptions {\n /** Payment or approval request ID returned by authorizeX402 / haven.fetch. */\n paymentId: string\n\n /** Original paid URL. If paymentRequired is omitted, Haven will call it once to re-read the 402 challenge. */\n url: string\n\n /** Original fetch options. Reused for the 402 probe and final merchant retry. */\n init?: RequestInit\n\n /** Serializable original request captured by quoteX402() / pending approval errors. */\n request?: X402RequestSnapshot\n\n /** Original or freshly parsed x402 requirements. Supplying this avoids an extra merchant 402 probe. */\n paymentRequired?: X402PaymentRequired\n}\n\nexport interface ResumeAuthorizedMppInput extends MppAuthorizationOptions {\n /** Payment or approval request ID returned by authorizeMachinePayment / haven.fetch. */\n paymentId: string\n\n /** Original MPP challenge returned by the paid resource. */\n challenge: MachinePaymentChallenge\n}\n\nexport interface ResumeMppPaymentInput extends MppAuthorizationOptions {\n /** Payment or approval request ID returned by authorizeMachinePayment / haven.fetch. */\n paymentId: string\n\n /** Original paid URL. If challenge is omitted, Haven will call it once to re-read the MPP challenge. */\n url: string\n\n /** Original fetch options. Reused for the 402 probe and final merchant retry. */\n init?: RequestInit\n\n /** Serializable original request captured by quoteMpp() / pending approval errors. */\n request?: X402RequestSnapshot\n\n /** Original MPP challenge. Supplying this avoids an extra paid-resource 402 probe. */\n challenge?: MachinePaymentChallenge\n}\n\n// ── Machine Payment Types ───────────────────────────────────────\n\nexport type MachinePaymentRail =\n | 'x402'\n | 'mpp_demo'\n | 'mpp_crypto'\n | 'stripe_deposit'\n | 'spt'\n\nexport interface MachinePaymentChallenge {\n rail: MachinePaymentRail\n version: string\n challengeId: string\n resource: string\n description: string\n network: {\n chainId: number\n name: 'base'\n }\n asset: {\n symbol: 'USDC'\n address: string\n decimals: 6\n }\n amount: {\n display: string\n atomic: string\n }\n recipient: string\n expiresAt: string\n metadata?: Record<string, unknown>\n}\n\nexport interface MachinePaymentReceipt {\n success: boolean\n rail: MachinePaymentRail\n paymentId: string\n challengeId: string\n txHash: string\n token: string\n amount: string\n to: string\n resourceUrl: string\n explorerUrl: string\n payer?: string\n chainId?: number\n proofHeader: string\n}\n\nexport interface HavenAgent {\n id: string\n name: string\n status: string\n safeAddress: string\n delegateAddress: string\n chainId: number\n}\n\nexport interface HavenAllowance {\n id: string\n tokenAddress: string\n tokenSymbol: string\n configuredAmount: string\n resetPeriodMin: number\n onchain: {\n amount: string\n spent: string\n remaining: string\n effectiveSpent: string\n resetTimeMin: number\n lastResetMin: number\n nonce: number\n isResetPending: boolean\n }\n}\n\nexport interface HavenAllowanceSummary {\n agentId: string\n safeAddress: string\n delegateAddress: string\n chainId: number\n allowances: HavenAllowance[]\n}\n\nexport interface HavenPaymentReceipt {\n id: string\n paymentId: string\n paymentIntentId?: string | null\n approvalRequestId?: string | null\n rail: string\n proofStatus: string\n txHash: string\n chainId: number\n resourceUrl: string\n merchantAddress: string | null\n payerAddress: string\n settlementAddress: string\n tokenSymbol: string\n tokenAddress: string\n amountRaw: string\n amount: string\n challengeId: string | null\n idempotencyKey: string | null\n challengePayload?: Record<string, unknown> | null\n selectedPayment?: Record<string, unknown> | null\n paymentProofHeaderName: string | null\n protocolReceiptHeaderName: string | null\n protocolReceiptPayload?: Record<string, unknown> | null\n merchantStatus: number | null\n confirmedAt: string | null\n createdAt: string\n updatedAt: string\n}\n\n// ── Agent Payment State Types ────────────────────────────────────\n\nexport type PaymentStateKind = 'payment_intent' | 'approval_request'\n\nexport interface AgentPaymentEnumSchema {\n type: 'string'\n enum: readonly string[]\n description: string\n 'x-enumDescriptions': Record<string, string>\n}\n\nexport const AgentPaymentPhase = {\n /** The agent must sign and submit the prepared payment before Haven can relay it. */\n AgentSignatureRequired: 'agent_signature_required',\n /** Haven has received the signed payment and the agent should poll for confirmation. */\n PaymentSubmitted: 'payment_submitted',\n /** The direct payment is confirmed; the agent does not need to do more for this payment id. */\n PaymentConfirmed: 'payment_confirmed',\n /** The payment needs wallet owner approval in Haven before it can continue. */\n UserApprovalRequired: 'user_approval_required',\n /** The wallet owner approved the request and still needs to complete the funding payment. */\n UserExecutionRequired: 'user_execution_required',\n /** The funding payment was proposed and is waiting for the remaining account approvals. */\n WaitingForAdditionalApprovals: 'waiting_for_additional_approvals',\n /** The Haven funding leg was sent; the agent can continue the merchant/protocol leg. */\n FundingSent: 'funding_sent',\n /** The wallet owner rejected the request; the agent should stop and tell the user. */\n Rejected: 'rejected',\n /** The payment or approval request expired before completion. */\n Expired: 'expired',\n /** Haven could not complete the payment; the agent should stop and surface the failure. */\n Failed: 'failed',\n /**\n * Pre-flight check determined the delegate's existing balance plus the\n * remaining on-chain allowance cannot cover the requested amount, so no\n * payment intent was created. Distinct from `UserApprovalRequired`: there\n * is no approval that would fix this — the originating Safe needs more\n * funds or the agent's per-token allowance needs to be raised first.\n */\n InsufficientFunds: 'insufficient_funds',\n} as const\n\nexport type AgentPaymentPhase = (typeof AgentPaymentPhase)[keyof typeof AgentPaymentPhase]\n\nexport const AgentPaymentNextAction = {\n /** Sign with the delegate key and submit the payment to Haven. */\n SignAndSubmitPayment: 'sign_and_submit_payment',\n /** Poll getPaymentStatus later using this payment id. */\n CheckStatusLater: 'check_status_later',\n /** No further agent action is required for this payment id. */\n None: 'none',\n /** Wait for the wallet owner to approve or reject the request in Haven. */\n WaitForUserApproval: 'wait_for_user_approval',\n /** Wait for the wallet owner to finish sending the approved funding payment. */\n WaitForUserToCompletePayment: 'wait_for_user_to_complete_payment',\n /** Resume this payment id and retry the original x402 request with the merchant payment header. */\n RetryOriginalX402Request: 'retry_original_x402_request',\n /** Stop retrying this payment and tell the user what happened. */\n StopAndTellUser: 'stop_and_tell_user',\n /** Ask again only if the user still wants the payment after expiry. */\n RequestAgainIfUserStillWantsIt: 'request_again_if_user_still_wants_it',\n /**\n * Stop and tell the user that the originating Safe needs to be funded or\n * the agent's per-token allowance needs to be raised before the payment\n * can succeed. A user approval will not fix this state on its own.\n */\n FundSafeOrRaiseAllowance: 'fund_safe_or_raise_allowance',\n} as const\n\nexport type AgentPaymentNextAction = (typeof AgentPaymentNextAction)[keyof typeof AgentPaymentNextAction]\n\n/**\n * Stable rail identifier carried on Haven agent payment responses and resume\n * state.\n *\n * Two layers of vocabulary share this enum because both reach the wire:\n *\n * - **Categorical rails** identify the rail family and are used as\n * discriminators on `PaymentResumeState`: `direct`, `x402`, `mpp`.\n * - **Granular rails** identify the specific protocol the backend persists\n * and returns on response bodies: `mpp_demo`, `mpp_crypto`,\n * `stripe_deposit`, `spt`. `x402` doubles as both categorical and\n * granular.\n *\n * Consumers reading the top-level `rail` field on a payment status response\n * should treat any `mpp*` value as the MPP family; consumers reading the\n * `rail` field on a `MppResumeState` will always see the categorical `mpp`,\n * with the granular value on `paymentRail`.\n */\nexport const AgentPaymentRail = {\n /** Standard Haven payment from the user's Safe through an approved delegate allowance. */\n Direct: 'direct',\n /** x402 HTTP 402 payment flow with a Haven funding leg and merchant retry leg. */\n X402: 'x402',\n /** Machine Payment Protocol family — categorical value used as a resume-state discriminator. */\n Mpp: 'mpp',\n /** Haven internal MPP demo rail. Not for production traffic. */\n MppDemo: 'mpp_demo',\n /** Crypto-settled MPP rail. */\n MppCrypto: 'mpp_crypto',\n /** Stripe-deposit-backed MPP rail. */\n StripeDeposit: 'stripe_deposit',\n /** Stripe Payment Token MPP rail. */\n Spt: 'spt',\n} as const\n\nexport type AgentPaymentRail = (typeof AgentPaymentRail)[keyof typeof AgentPaymentRail]\n\nexport type PaymentPhase = AgentPaymentPhase\n\nexport type PaymentNextAction = AgentPaymentNextAction\n\nexport const AGENT_PAYMENT_PHASE_VALUES = Object.values(AgentPaymentPhase)\n\nexport const AGENT_PAYMENT_NEXT_ACTION_VALUES = Object.values(AgentPaymentNextAction)\n\nexport const AGENT_PAYMENT_RAIL_VALUES = Object.values(AgentPaymentRail)\n\nexport const AgentPaymentPhaseDescriptions: Record<AgentPaymentPhase, string> = {\n [AgentPaymentPhase.AgentSignatureRequired]: 'The agent must sign and submit the prepared payment before Haven can relay it.',\n [AgentPaymentPhase.PaymentSubmitted]: 'Haven has received the signed payment and the agent should poll for confirmation.',\n [AgentPaymentPhase.PaymentConfirmed]: 'The direct payment is confirmed; the agent does not need to do more for this payment id.',\n [AgentPaymentPhase.UserApprovalRequired]: 'The payment needs wallet owner approval in Haven before it can continue.',\n [AgentPaymentPhase.UserExecutionRequired]: 'The wallet owner approved the request and still needs to complete the funding payment.',\n [AgentPaymentPhase.WaitingForAdditionalApprovals]: 'The funding payment was proposed and is waiting for the remaining account approvals.',\n [AgentPaymentPhase.FundingSent]: 'The Haven funding leg was sent; the agent can continue the merchant/protocol leg.',\n [AgentPaymentPhase.Rejected]: 'The wallet owner rejected the request; the agent should stop and tell the user.',\n [AgentPaymentPhase.Expired]: 'The payment or approval request expired before completion.',\n [AgentPaymentPhase.Failed]: 'Haven could not complete the payment; the agent should stop and surface the failure.',\n [AgentPaymentPhase.InsufficientFunds]:\n 'Pre-flight check determined the delegate balance plus the remaining on-chain allowance cannot cover the requested amount, so no payment was created. The originating Safe must be funded or the agent allowance raised before retrying.',\n}\n\nexport const AgentPaymentNextActionDescriptions: Record<AgentPaymentNextAction, string> = {\n [AgentPaymentNextAction.SignAndSubmitPayment]: 'Sign with the delegate key and submit the payment to Haven.',\n [AgentPaymentNextAction.CheckStatusLater]: 'Poll getPaymentStatus later using this payment id.',\n [AgentPaymentNextAction.None]: 'No further agent action is required for this payment id.',\n [AgentPaymentNextAction.WaitForUserApproval]: 'Wait for the wallet owner to approve or reject the request in Haven.',\n [AgentPaymentNextAction.WaitForUserToCompletePayment]: 'Wait for the wallet owner to finish sending the approved funding payment.',\n [AgentPaymentNextAction.RetryOriginalX402Request]: 'Resume this payment id and retry the original x402 request with the merchant payment header.',\n [AgentPaymentNextAction.StopAndTellUser]: 'Stop retrying this payment and tell the user what happened.',\n [AgentPaymentNextAction.RequestAgainIfUserStillWantsIt]: 'Ask again only if the user still wants the payment after expiry.',\n [AgentPaymentNextAction.FundSafeOrRaiseAllowance]:\n 'Stop and tell the user that the originating Safe needs to be funded or the agent allowance raised before the payment can succeed.',\n}\n\nexport const AgentPaymentRailDescriptions: Record<AgentPaymentRail, string> = {\n [AgentPaymentRail.Direct]: 'Standard Haven payment from the user-controlled Safe through an approved delegate allowance.',\n [AgentPaymentRail.X402]: 'x402 HTTP 402 payment flow with a Haven funding leg and merchant retry leg.',\n [AgentPaymentRail.Mpp]: 'Categorical MPP rail value used as a resume-state discriminator. Response bodies carry a granular mpp_* value instead.',\n [AgentPaymentRail.MppDemo]: 'Haven internal MPP demo rail. Not for production traffic.',\n [AgentPaymentRail.MppCrypto]: 'Crypto-settled MPP rail.',\n [AgentPaymentRail.StripeDeposit]: 'Stripe-deposit-backed MPP rail.',\n [AgentPaymentRail.Spt]: 'Stripe Payment Token MPP rail.',\n}\n\nexport const AgentPaymentPhaseSchema: AgentPaymentEnumSchema = {\n type: 'string',\n enum: AGENT_PAYMENT_PHASE_VALUES,\n description: 'Stable Haven agent payment state phase.',\n 'x-enumDescriptions': AgentPaymentPhaseDescriptions,\n}\n\nexport const AgentPaymentNextActionSchema: AgentPaymentEnumSchema = {\n type: 'string',\n enum: AGENT_PAYMENT_NEXT_ACTION_VALUES,\n description: 'Stable next action an agent should take for a Haven payment state.',\n 'x-enumDescriptions': AgentPaymentNextActionDescriptions,\n}\n\nexport const AgentPaymentRailSchema: AgentPaymentEnumSchema = {\n type: 'string',\n enum: AGENT_PAYMENT_RAIL_VALUES,\n description: 'Stable rail identifier for Haven agent payment states.',\n 'x-enumDescriptions': AgentPaymentRailDescriptions,\n}\n\nexport interface PaymentStatusResult {\n paymentId: string\n kind: PaymentStateKind\n rail: string\n status: PaymentStatus | string\n phase: PaymentPhase\n nextAction: PaymentNextAction\n amount: string\n token: string\n resourceUrl: string | null\n merchantAddress: string | null\n txHash: string | null\n expiresAt: string\n chainId: number\n message: string\n amountAtomic?: string | null\n asset?: string | null\n network?: string | null\n description?: string | null\n idempotencyKey?: string | null\n x402?: {\n amountAtomic: string | null\n asset: string | null\n network: string | null\n resourceUrl: string | null\n merchantAddress: string | null\n description: string | null\n idempotencyKey: string | null\n }\n mpp?: {\n amountAtomic: string | null\n asset: string | null\n network: string | null\n resourceUrl: string | null\n merchantAddress: string | null\n description: string | null\n idempotencyKey: string | null\n challengeId: string | null\n }\n}\n\nexport interface PendingApproval extends PaymentStatusResult {\n kind: 'approval_request'\n status: 'pending_approval' | 'pending' | string\n phase: typeof AgentPaymentPhase.UserApprovalRequired\n nextAction: typeof AgentPaymentNextAction.WaitForUserApproval\n requested?: string\n remaining?: string | null\n}\n\n/** @internal */\nexport interface RawMachinePaymentAuthorizeResponse {\n success?: boolean\n payment_id: string\n kind?: string\n status: string\n phase?: string\n next_action?: string\n message?: string\n remaining?: string | null\n requested?: string\n tx_hash?: string\n chain_id?: number\n safe_address?: string\n payer?: string\n token?: string\n amount?: string\n amount_atomic?: string | null\n asset?: string | null\n network?: string | null\n description?: string | null\n idempotency_key?: string | null\n to?: string\n merchant_to?: string | null\n merchant_address?: string | null\n resource_url?: string\n rail?: string\n x402?: RawX402StateContext\n mpp?: RawMppStateContext\n challenge_id?: string\n explorer_url?: string\n expires_at?: string\n sign_data?: {\n hash: string\n components: {\n safe: string\n token: string\n to: string\n amount: string\n payment_token: string\n payment: string\n nonce: number\n }\n instructions: string\n }\n error?: string\n}\n\n/** @internal */\nexport interface RawX402AuthorizeResponse {\n success?: boolean\n payment_id: string\n kind?: string\n rail?: string\n status: string\n phase?: string\n next_action?: string\n message?: string\n remaining?: string | null\n requested?: string\n tx_hash?: string\n chain_id?: number\n safe_address?: string\n payer?: string\n token?: string\n amount?: string\n amount_atomic?: string | null\n asset?: string | null\n network?: string | null\n description?: string | null\n idempotency_key?: string | null\n to?: string\n merchant_to?: string | null\n merchant_address?: string | null\n x402_expected_auth?: X402ExpectedAuth\n resource_url?: string\n explorer_url?: string\n x402?: RawX402StateContext\n mpp?: RawMppStateContext\n challenge_id?: string\n expires_at?: string\n sign_data?: {\n hash: string\n components: {\n safe: string\n token: string\n to: string\n amount: string\n payment_token: string\n payment: string\n nonce: number\n }\n instructions: string\n }\n error?: string\n}\n\n// ── API Response Shapes (raw, snake_case from server) ────────────\n\n/** @internal */\nexport interface RawCreateResponse {\n payment_id: string\n kind?: string\n status: string\n phase?: string\n next_action?: string\n message?: string\n remaining?: string | null\n requested?: string\n expires_at: string\n sign_data: {\n hash: string\n components: {\n safe: string\n token: string\n to: string\n amount: string\n payment_token: string\n payment: string\n nonce: number\n }\n instructions: string\n }\n error?: string\n supported?: string[]\n}\n\n/** @internal */\nexport interface RawSignResponse {\n payment_id: string\n kind?: string\n status: string\n phase?: string\n next_action?: string\n message?: string\n remaining?: string | null\n requested?: string\n tx_hash?: string\n token?: string\n amount?: string\n amount_atomic?: string | null\n asset?: string | null\n network?: string | null\n description?: string | null\n idempotency_key?: string | null\n to?: string\n merchant_to?: string | null\n merchant_address?: string | null\n resource_url?: string\n rail?: string\n x402?: RawX402StateContext\n mpp?: RawMppStateContext\n challenge_id?: string\n explorer_url?: string\n chain_id?: number\n expires_at?: string\n error?: string\n details?: string\n}\n\n/** @internal */\nexport interface RawStatusResponse {\n payment_id: string\n status: string\n token: string\n amount: string\n to: string\n tx_hash: string | null\n explorer_url?: string | null\n chain_id?: number\n error_message: string | null\n created_at: string\n signed_at: string | null\n submitted_at: string | null\n confirmed_at: string | null\n expires_at: string\n}\n\n/** @internal */\nexport interface RawPaymentStatusResult {\n payment_id: string\n kind: PaymentStateKind\n rail: string\n status: string\n phase: PaymentPhase\n next_action: PaymentNextAction\n amount: string\n token: string\n resource_url: string | null\n merchant_address: string | null\n tx_hash: string | null\n expires_at: string\n chain_id: number\n message: string\n amount_atomic?: string | null\n asset?: string | null\n network?: string | null\n description?: string | null\n idempotency_key?: string | null\n x402?: RawX402StateContext\n mpp?: RawMppStateContext\n}\n\n/** @internal */\nexport interface RawHavenAgent {\n id: string\n name: string\n status: string\n safe_address: string\n delegate_address: string\n chain_id: number\n}\n\n/** @internal */\nexport interface RawHavenAllowance {\n id: string\n token_address: string\n token_symbol: string\n configured_amount: string\n reset_period_min: number\n onchain: {\n amount: string\n spent: string\n remaining: string\n effective_spent: string\n reset_time_min: number\n last_reset_min: number\n nonce: number\n is_reset_pending: boolean\n }\n}\n\n/** @internal */\nexport interface RawHavenAllowanceSummary {\n agent_id: string\n safe_address: string\n delegate_address: string\n chain_id: number\n allowances: RawHavenAllowance[]\n}\n\n/** @internal */\nexport interface RawHavenPaymentReceipt {\n id: string\n payment_id: string\n payment_intent_id?: string | null\n approval_request_id?: string | null\n rail: string\n proof_status: string\n tx_hash: string\n chain_id: number\n resource_url: string\n merchant_address: string | null\n payer_address: string\n settlement_address: string\n token_symbol: string\n token_address: string\n amount_raw: string\n amount_human: string\n challenge_id: string | null\n idempotency_key: string | null\n challenge_payload?: Record<string, unknown> | null\n selected_payment?: Record<string, unknown> | null\n payment_proof_header_name: string | null\n protocol_receipt_header_name: string | null\n protocol_receipt_payload?: Record<string, unknown> | null\n merchant_status: number | null\n confirmed_at: string | null\n created_at: string\n updated_at: string\n}\n\n/** @internal */\nexport interface RawHavenPaymentReceiptsResponse {\n receipts: RawHavenPaymentReceipt[]\n}\n\n/** @internal */\nexport interface RawX402StateContext {\n amount_atomic?: string | null\n asset?: string | null\n network?: string | null\n resource_url?: string | null\n merchant_address?: string | null\n description?: string | null\n idempotency_key?: string | null\n}\n\n/** @internal */\nexport interface RawMppStateContext {\n amount_atomic?: string | null\n asset?: string | null\n network?: string | null\n resource_url?: string | null\n merchant_address?: string | null\n description?: string | null\n idempotency_key?: string | null\n challenge_id?: string | null\n}\n\n// ── Error Types ──────────────────────────────────────────────────\n\nexport class HavenError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly statusCode?: number,\n public readonly paymentId?: string,\n ) {\n super(message)\n this.name = 'HavenError'\n }\n}\n\nexport class HavenApiError extends HavenError {\n constructor(\n message: string,\n statusCode: number,\n public readonly body?: unknown,\n paymentId?: string,\n ) {\n super(message, 'API_ERROR', statusCode, paymentId)\n this.name = 'HavenApiError'\n }\n}\n\nexport class HavenPaymentStateError extends HavenApiError {\n resumeState?: X402ResumeState | MppResumeState\n\n constructor(\n message: string,\n statusCode: number,\n public readonly state: PaymentStatusResult,\n body?: unknown,\n ) {\n super(message, statusCode, body, state.paymentId)\n this.name = 'HavenPaymentStateError'\n }\n\n get status(): string {\n return this.state.status\n }\n\n get phase(): PaymentPhase {\n return this.state.phase\n }\n\n get nextAction(): PaymentNextAction {\n return this.state.nextAction\n }\n}\n\nexport class HavenSigningError extends HavenError {\n constructor(message: string) {\n super(message, 'SIGNING_ERROR')\n this.name = 'HavenSigningError'\n }\n}\n\nexport class HavenTimeoutError extends HavenError {\n constructor(paymentId: string) {\n super(\n `Timed out waiting for payment ${paymentId} to confirm`,\n 'TIMEOUT',\n undefined,\n paymentId,\n )\n this.name = 'HavenTimeoutError'\n }\n}\n","import { ethers } from 'ethers'\nimport { HavenSigningError } from './types.js'\n\n/**\n * Sign a hash using raw ECDSA (no Ethereum message prefix).\n *\n * This matches what Safe's AllowanceModule `checkSignature` expects —\n * a direct ecrecover over the hash, NOT the \"\\x19Ethereum Signed Message\" variant.\n *\n * Uses ethers.SigningKey.sign() instead of wallet.signMessage() to avoid the prefix.\n */\nexport function signHash(privateKey: string, hash: string): string {\n try {\n const signingKey = new ethers.SigningKey(privateKey)\n const sig = signingKey.sign(hash)\n return sig.serialized // 0x + r(32) + s(32) + v(1)\n } catch (err) {\n throw new HavenSigningError(\n `Failed to sign hash: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n}\n\n/**\n * Derive the Ethereum address from a private key.\n */\nexport function addressFromKey(privateKey: string): string {\n try {\n return new ethers.Wallet(privateKey).address\n } catch (err) {\n throw new HavenSigningError(\n `Invalid private key: ${err instanceof Error ? err.message : String(err)}`,\n )\n }\n}\n\n/**\n * Verify that a signature over a hash recovers to the expected address.\n */\nexport function verifySignature(hash: string, signature: string, expectedAddress: string): boolean {\n try {\n const recovered = ethers.recoverAddress(hash, signature)\n return recovered.toLowerCase() === expectedAddress.toLowerCase()\n } catch {\n return false\n }\n}\n","/**\n * x402 protocol support for the Haven SDK.\n *\n * Provides:\n * - parsePaymentRequired() — extract payment requirements from a 402 response\n * - parsePaymentRequiredResponse() — async parser with JSON body fallback\n * - encodePaymentProof() — encode a receipt as a PAYMENT-SIGNATURE header\n *\n * The main authorizeX402() and fetchWithPayment() are methods on HavenClient\n * (see client.ts) since they need API access and signing.\n */\n\nimport { createHash } from 'node:crypto'\nimport type { X402ExpectedContext, X402PaymentRequired, X402PaymentOption } from './types.js'\nimport type { PaymentRequirements } from 'x402/types'\n\nconst BASE_USDC_ADDRESS = '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913'\nconst X402_IDEMPOTENCY_BUCKET_MS = 300_000\nconst DECIMAL_ATOMIC_AMOUNT_RE = /^[0-9]+$/\n\nfunction decodeBase64Json<T>(value: string, label: string): T {\n try {\n return JSON.parse(atob(value)) as T\n } catch {\n throw new Error(`Failed to decode ${label}`)\n }\n}\n\nfunction isPositiveDecimalAtomicAmount(value: string): boolean {\n return DECIMAL_ATOMIC_AMOUNT_RE.test(value) && BigInt(value) > 0n\n}\n\nfunction optionAuthorizationAmount(option: X402PaymentOption): string {\n return option.maxAmountRequired ?? option.amount\n}\n\nfunction normalizePaymentOption(value: unknown): X402PaymentOption | null {\n const candidate = value as Partial<X402PaymentOption> | null\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n typeof candidate.scheme !== 'string' ||\n typeof candidate.network !== 'string' ||\n typeof candidate.asset !== 'string' ||\n typeof candidate.payTo !== 'string'\n ) {\n return null\n }\n\n const amount =\n typeof candidate.amount === 'string'\n ? candidate.amount\n : typeof candidate.maxAmountRequired === 'string'\n ? candidate.maxAmountRequired\n : null\n\n if (!amount) return null\n if (!isPositiveDecimalAtomicAmount(amount)) return null\n if (\n candidate.maxAmountRequired !== undefined &&\n (\n typeof candidate.maxAmountRequired !== 'string' ||\n !isPositiveDecimalAtomicAmount(candidate.maxAmountRequired)\n )\n ) {\n return null\n }\n\n return {\n scheme: candidate.scheme,\n network: candidate.network,\n amount,\n maxAmountRequired: candidate.maxAmountRequired,\n resource: candidate.resource,\n description: candidate.description,\n mimeType: candidate.mimeType,\n asset: candidate.asset,\n payTo: candidate.payTo,\n maxTimeoutSeconds: candidate.maxTimeoutSeconds ?? 30,\n extra: candidate.extra,\n }\n}\n\nfunction normalizePaymentRequired(value: unknown): X402PaymentRequired | null {\n const candidate = value as Partial<X402PaymentRequired> | null\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n typeof candidate.x402Version !== 'number' ||\n !Array.isArray(candidate.accepts)\n ) {\n return null\n }\n\n const accepts = candidate.accepts\n .map((option) => normalizePaymentOption(option))\n .filter((option): option is X402PaymentOption => !!option)\n\n if (accepts.length === 0) return null\n\n const first = accepts[0]\n const resourceUrl = candidate.resource?.url ?? first.resource\n if (!resourceUrl) return null\n\n const resource = {\n url: resourceUrl,\n description: candidate.resource?.description ?? first.description,\n mimeType: candidate.resource?.mimeType ?? first.mimeType,\n }\n\n return {\n x402Version: candidate.x402Version,\n resource,\n accepts,\n error: candidate.error,\n }\n}\n\n// ── Supported networks ───────────────────────────────────────────\n\n/** Network identifiers that Haven can recognise in x402 payment requests. */\nexport const SUPPORTED_X402_NETWORKS: Record<string, string> = {\n 'eip155:100': 'Gnosis Chain',\n 'eip155:8453': 'Base',\n 'base': 'Base',\n}\n\n/** Networks supported by the official x402 EIP-3009 exact scheme. */\nconst STANDARD_X402_NETWORKS: Record<string, PaymentRequirements['network']> = {\n 'eip155:8453': 'base',\n 'base': 'base',\n}\n\n// ── Token address maps ────────────────────────────────────────────\n\n/** Known tokens on Gnosis Chain (chainId 100). */\nconst GNOSIS_TOKENS: Record<string, { symbol: string; decimals: number }> = {\n '0x0000000000000000000000000000000000000000': { symbol: 'xDAI', decimals: 18 },\n '0xcb444e90d8198415266c6a2724b7900fb12fc56e': { symbol: 'EURe', decimals: 18 },\n '0x2a22f9c3b484c3629090feed35f17ff8f88f76f0': { symbol: 'USDC.e', decimals: 6 },\n}\n\n/** Known tokens on Base (chainId 8453). */\nconst BASE_TOKENS: Record<string, { symbol: string; decimals: number }> = {\n '0x0000000000000000000000000000000000000000': { symbol: 'ETH', decimals: 18 },\n '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913': { symbol: 'USDC', decimals: 6 },\n}\n\n/** All known tokens across all supported chains (for display / resolution). */\nconst ALL_TOKENS: Record<string, { symbol: string; decimals: number }> = {\n ...GNOSIS_TOKENS,\n ...BASE_TOKENS,\n}\n\n/** Maps CAIP-2 network ID → token address map. */\nconst NETWORK_TOKENS: Record<string, Record<string, { symbol: string; decimals: number }>> = {\n 'eip155:100': GNOSIS_TOKENS,\n 'eip155:8453': BASE_TOKENS,\n 'base': BASE_TOKENS,\n}\n\n// ── Parser ───────────────────────────────────────────────────────\n\n/**\n * Parse an HTTP 402 response into x402 PaymentRequired data.\n *\n * Supports:\n * - v2: PAYMENT-REQUIRED header (base64 JSON)\n * - v1 fallback: X-PAYMENT header or response body\n */\nexport function parsePaymentRequired(response: Response): X402PaymentRequired {\n // v2: PAYMENT-REQUIRED header\n const v2Header = response.headers.get('PAYMENT-REQUIRED')\n if (v2Header) {\n const parsed = normalizePaymentRequired(\n decodeBase64Json<unknown>(v2Header, 'PAYMENT-REQUIRED header'),\n )\n if (parsed) return parsed\n }\n\n // v1: X-PAYMENT header\n const v1Header = response.headers.get('X-PAYMENT')\n if (v1Header) {\n const parsed = normalizePaymentRequired(\n decodeBase64Json<unknown>(v1Header, 'X-PAYMENT header'),\n )\n if (parsed) return parsed\n }\n\n throw new Error(\n 'No x402 payment headers found in 402 response. ' +\n 'Expected PAYMENT-REQUIRED (v2) or X-PAYMENT (v1) header.',\n )\n}\n\n/**\n * Parse an HTTP 402 response into x402 PaymentRequired data.\n *\n * Soundside and other Bazaar-style MCP endpoints return the PaymentRequired\n * object in the JSON body, while older Haven demos and many x402 examples use\n * base64 headers. This keeps the synchronous header parser intact and adds the\n * body fallback needed for those endpoints.\n */\nexport async function parsePaymentRequiredResponse(\n response: Response,\n): Promise<X402PaymentRequired> {\n try {\n return parsePaymentRequired(response)\n } catch (headerErr) {\n try {\n const body = await response.clone().json()\n const parsed = normalizePaymentRequired(body)\n if (parsed) return parsed\n } catch {\n // Fall through to the original, more specific header error below.\n }\n\n throw headerErr\n }\n}\n\n/**\n * Select the best payment option from the x402 accepts array.\n *\n * Preference order:\n * 1. Option on a Haven-supported network with a known token\n * 2. Any option on a Haven-supported network\n * 3. null — no compatible option\n */\nexport function selectPaymentOption(\n accepts: X402PaymentOption[],\n): X402PaymentOption | null {\n if (!accepts || accepts.length === 0) return null\n\n // First pass: find a supported network with a known token\n for (const opt of accepts) {\n if (opt.network in SUPPORTED_X402_NETWORKS) {\n const networkTokens = NETWORK_TOKENS[opt.network]\n if (\n networkTokens?.[opt.asset.toLowerCase()] &&\n isPositiveDecimalAtomicAmount(optionAuthorizationAmount(opt))\n ) {\n return opt\n }\n }\n }\n\n // Second pass: any supported network\n for (const opt of accepts) {\n if (\n opt.network in SUPPORTED_X402_NETWORKS &&\n isPositiveDecimalAtomicAmount(optionAuthorizationAmount(opt))\n ) {\n return opt\n }\n }\n\n // No compatible option found\n return null\n}\n\n/**\n * Select an option that can be paid with the official x402 EIP-3009 exact\n * scheme. Haven's older tx-hash proof path can describe more networks; the\n * merchant-verified path currently needs Base USDC.\n */\nexport function selectStandardPaymentOption(\n accepts: X402PaymentOption[],\n): X402PaymentOption | null {\n if (!accepts || accepts.length === 0) return null\n\n for (const opt of accepts) {\n if (\n opt.scheme === 'exact' &&\n opt.network in STANDARD_X402_NETWORKS &&\n opt.asset.toLowerCase() === BASE_USDC_ADDRESS &&\n isPositiveDecimalAtomicAmount(optionAuthorizationAmount(opt))\n ) {\n return opt\n }\n }\n\n return null\n}\n\nexport function x402AuthorizationAmount(option: X402PaymentOption): string {\n const amount = optionAuthorizationAmount(option)\n if (!isPositiveDecimalAtomicAmount(amount)) {\n throw new Error('Invalid x402 amount: must be a positive decimal atomic amount')\n }\n return amount\n}\n\nexport function buildX402ExpectedMessage(context: X402ExpectedContext): string {\n return `Haven x402 expected context v1\\n${stableStringify({\n version: 1,\n kind: 'haven.x402.expected',\n paymentId: context.paymentId,\n payloadHash: context.payloadHash.toLowerCase(),\n resourceUrl: context.resourceUrl,\n merchantTo: context.merchantTo.toLowerCase(),\n amount: context.amount,\n asset: context.asset.toLowerCase(),\n network: context.network,\n })}`\n}\n\nexport function toStandardPaymentRequirements(\n paymentRequired: X402PaymentRequired,\n option: X402PaymentOption,\n): PaymentRequirements {\n const network = STANDARD_X402_NETWORKS[option.network]\n if (!network) {\n throw new Error(`x402 exact payments are not supported on ${option.network}`)\n }\n\n if (option.scheme !== 'exact') {\n throw new Error(`Unsupported x402 scheme: ${option.scheme}`)\n }\n\n return {\n scheme: 'exact',\n network,\n maxAmountRequired: x402AuthorizationAmount(option),\n resource: option.resource ?? paymentRequired.resource.url,\n description:\n option.description ??\n paymentRequired.resource.description ??\n 'Haven x402 payment',\n mimeType:\n option.mimeType ??\n paymentRequired.resource.mimeType ??\n 'application/octet-stream',\n payTo: option.payTo,\n asset: option.asset,\n maxTimeoutSeconds: option.maxTimeoutSeconds,\n extra: option.extra,\n }\n}\n\nexport function buildX402IdempotencyKey(\n paymentRequired: X402PaymentRequired,\n option: X402PaymentOption,\n now = Date.now(),\n): string {\n const bucket = Math.floor(now / X402_IDEMPOTENCY_BUCKET_MS)\n const material = [\n paymentRequired.resource.url,\n paymentRequired.resource.description ?? '',\n option.payTo.toLowerCase(),\n option.asset.toLowerCase(),\n x402AuthorizationAmount(option),\n option.network,\n bucket,\n ].join('|')\n\n return `x402:${createHash('sha256').update(material).digest('hex').slice(0, 16)}`\n}\n\n/**\n * Encode a payment receipt as a base64 PAYMENT-SIGNATURE header value.\n *\n * This follows the x402 v2 protocol — the server's facilitator will\n * verify the on-chain transaction referenced by tx_hash.\n */\nexport function encodePaymentProof(receipt: {\n txHash: string\n paymentId: string\n token: string\n amount: string\n to: string\n resourceUrl?: string\n accepted?: X402PaymentOption\n payer?: string\n chainId?: number\n}): string {\n const payload = {\n x402Version: 2,\n resource: receipt.resourceUrl ? { url: receipt.resourceUrl } : undefined,\n accepted: receipt.accepted,\n payload: {\n type: 'haven_tx_hash',\n txHash: receipt.txHash,\n paymentId: receipt.paymentId,\n settledVia: 'haven',\n payer: receipt.payer,\n chainId: receipt.chainId,\n },\n }\n return btoa(JSON.stringify(payload))\n}\n\n/**\n * Resolve a token symbol from a contract address.\n *\n * Checks all supported chains. For chain-specific resolution,\n * pass the optional `network` CAIP-2 string (e.g. \"eip155:100\").\n */\nexport function resolveTokenFromAddress(\n address: string,\n network?: string,\n): { symbol: string; decimals: number } | null {\n const lower = address.toLowerCase()\n\n if (network && network in NETWORK_TOKENS) {\n return NETWORK_TOKENS[network][lower] ?? null\n }\n\n return ALL_TOKENS[lower] ?? null\n}\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== 'object') {\n const primitive = JSON.stringify(value)\n return primitive === undefined ? 'undefined' : primitive\n }\n if (Array.isArray(value)) return `[${value.map((item) => stableStringify(item)).join(',')}]`\n const object = value as Record<string, unknown>\n return `{${Object.keys(object)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${stableStringify(object[key])}`)\n .join(',')}}`\n}\n","import { createHash } from 'node:crypto'\nimport type {\n MachinePaymentChallenge,\n MachinePaymentReceipt,\n} from './types.js'\n\nfunction decodeBase64Json<T>(value: string, label: string): T {\n try {\n return JSON.parse(atob(value)) as T\n } catch {\n throw new Error(`Failed to decode ${label}`)\n }\n}\n\nfunction normalizeChallenge(value: unknown): MachinePaymentChallenge | null {\n const candidate = value as Partial<MachinePaymentChallenge> | null\n if (\n !candidate ||\n typeof candidate !== 'object' ||\n candidate.rail !== 'mpp_demo' ||\n typeof candidate.version !== 'string' ||\n typeof candidate.challengeId !== 'string' ||\n typeof candidate.resource !== 'string' ||\n typeof candidate.description !== 'string' ||\n // TODO: relax these checks when non-demo machine payment rails are added.\n candidate.network?.chainId !== 8453 ||\n candidate.network?.name !== 'base' ||\n candidate.asset?.symbol !== 'USDC' ||\n typeof candidate.asset?.address !== 'string' ||\n candidate.asset.decimals !== 6 ||\n typeof candidate.amount?.display !== 'string' ||\n typeof candidate.amount?.atomic !== 'string' ||\n typeof candidate.recipient !== 'string' ||\n typeof candidate.expiresAt !== 'string'\n ) {\n return null\n }\n\n return {\n rail: candidate.rail,\n version: candidate.version,\n challengeId: candidate.challengeId,\n resource: candidate.resource,\n description: candidate.description,\n network: candidate.network,\n asset: candidate.asset,\n amount: candidate.amount,\n recipient: candidate.recipient,\n expiresAt: candidate.expiresAt,\n metadata: candidate.metadata,\n }\n}\n\nexport function parseMachinePaymentChallenge(response: Response): MachinePaymentChallenge {\n const header = response.headers.get('MACHINE-PAYMENT-CHALLENGE')\n if (!header) {\n throw new Error('No MACHINE-PAYMENT-CHALLENGE header found in 402 response.')\n }\n\n const parsed = normalizeChallenge(\n decodeBase64Json<unknown>(header, 'MACHINE-PAYMENT-CHALLENGE header'),\n )\n if (!parsed) throw new Error('Invalid machine payment challenge')\n return parsed\n}\n\nexport async function parseMachinePaymentChallengeResponse(\n response: Response,\n): Promise<MachinePaymentChallenge> {\n try {\n return parseMachinePaymentChallenge(response)\n } catch (headerErr) {\n try {\n const body = await response.clone().json() as { challenge?: unknown }\n const parsed = normalizeChallenge(body.challenge)\n if (parsed) return parsed\n } catch {\n // Fall through to the original, more specific header error.\n }\n\n throw headerErr\n }\n}\n\nexport function buildMachinePaymentIdempotencyKey(\n challenge: MachinePaymentChallenge,\n): string {\n const material = [\n challenge.rail,\n challenge.challengeId,\n challenge.resource,\n challenge.recipient.toLowerCase(),\n challenge.asset.address.toLowerCase(),\n challenge.amount.atomic,\n challenge.network.chainId,\n ].join('|')\n\n return `${challenge.rail}:${createHash('sha256').update(material).digest('hex').slice(0, 16)}`\n}\n\nexport function encodeMachinePaymentProof(receipt: Omit<MachinePaymentReceipt, 'proofHeader'>): string {\n return btoa(JSON.stringify({\n rail: receipt.rail,\n challengeId: receipt.challengeId,\n paymentId: receipt.paymentId,\n txHash: receipt.txHash,\n settledVia: 'haven',\n payer: receipt.payer,\n chainId: receipt.chainId,\n }))\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\nimport { exact } from 'x402/schemes'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { signHash, addressFromKey, verifySignature } from './signer.js'\nimport type {\n HavenClientConfig,\n PaymentRequest,\n PaymentIntent,\n PaymentResult,\n PaymentStatus,\n PaymentPhase,\n PaymentNextAction,\n PaymentStatusResult,\n PaymentResumeState,\n SignData,\n X402AuthorizationOptions,\n RawCreateResponse,\n RawSignResponse,\n RawStatusResponse,\n RawPaymentStatusResult,\n X402PaymentRequired,\n X402PaymentOption,\n X402Intent,\n X402Quote,\n X402Receipt,\n X402RequestSnapshot,\n X402ResumeState,\n ResumeAuthorizedX402Input,\n ResumeX402PaymentInput,\n MppAuthorizationOptions,\n MppQuote,\n MppResumeState,\n ResumeAuthorizedMppInput,\n ResumeMppPaymentInput,\n RawX402AuthorizeResponse,\n MachinePaymentChallenge,\n MachinePaymentReceipt,\n RawMachinePaymentAuthorizeResponse,\n HavenAgent,\n HavenAllowanceSummary,\n HavenPaymentReceipt,\n RawHavenAgent,\n RawHavenAllowanceSummary,\n RawHavenPaymentReceiptsResponse,\n RawHavenPaymentReceipt,\n} from './types.js'\nimport {\n AgentPaymentNextAction,\n AgentPaymentPhase,\n HavenApiError,\n HavenPaymentStateError,\n HavenSigningError,\n HavenTimeoutError,\n} from './types.js'\nimport {\n buildX402IdempotencyKey,\n parsePaymentRequiredResponse,\n resolveTokenFromAddress,\n selectStandardPaymentOption,\n toStandardPaymentRequirements,\n x402AuthorizationAmount,\n} from './x402.js'\nimport {\n buildMachinePaymentIdempotencyKey,\n encodeMachinePaymentProof,\n parseMachinePaymentChallengeResponse,\n} from './mpp.js'\n\nconst DEFAULT_BASE_URL = 'http://localhost:3001'\n\nconst CHAIN_EXPLORER_TX: Record<number, string> = {\n 100: 'https://gnosisscan.io/tx',\n 8453: 'https://basescan.org/tx',\n}\n\nfunction buildExplorerUrl(chainId: number | undefined, txHash: string): string {\n const base = CHAIN_EXPLORER_TX[chainId ?? 8453] ?? CHAIN_EXPLORER_TX[8453]\n return `${base}/${txHash}`\n}\n\nfunction explorerUrlOrEmpty(chainId: number | undefined, txHash: string | null | undefined): string {\n return txHash ? buildExplorerUrl(chainId, txHash) : ''\n}\n\nconst DEFAULT_REQUEST_TIMEOUT = 30_000\nconst DEFAULT_CONFIRMATION_TIMEOUT = 90_000\nconst DEFAULT_POLLING_INTERVAL = 3_000\n\nconst PAYMENT_STATE_STATUS_CODES: Record<string, number> = {\n pending: 202,\n pending_approval: 202,\n approved: 202,\n proposed: 202,\n executed: 200,\n pending_signature: 409,\n submitted: 409,\n expired: 410,\n failed: 502,\n rejected: 409,\n}\n\nfunction chainIdFromNetwork(network: string | undefined): number | undefined {\n if (network === 'base') return 8453\n if (!network?.startsWith('eip155:')) return undefined\n const chainId = Number(network.slice('eip155:'.length))\n return Number.isFinite(chainId) ? chainId : undefined\n}\n\nfunction chainIdOrNull(network: string | undefined): number | null {\n return chainIdFromNetwork(network) ?? null\n}\n\nfunction phaseForStatus(status: string): PaymentPhase | null {\n if (status === 'pending_signature') return AgentPaymentPhase.AgentSignatureRequired\n if (status === 'submitted') return AgentPaymentPhase.PaymentSubmitted\n if (status === 'confirmed') return AgentPaymentPhase.PaymentConfirmed\n if (status === 'pending' || status === 'pending_approval') return AgentPaymentPhase.UserApprovalRequired\n if (status === 'approved') return AgentPaymentPhase.UserExecutionRequired\n if (status === 'proposed') return AgentPaymentPhase.WaitingForAdditionalApprovals\n if (status === 'executed') return AgentPaymentPhase.FundingSent\n if (status === 'rejected') return AgentPaymentPhase.Rejected\n if (status === 'expired') return AgentPaymentPhase.Expired\n if (status === 'failed') return AgentPaymentPhase.Failed\n return null\n}\n\nfunction nextActionForStatus(status: string): PaymentNextAction | null {\n if (status === 'pending_signature') return AgentPaymentNextAction.SignAndSubmitPayment\n if (status === 'submitted') return AgentPaymentNextAction.CheckStatusLater\n if (status === 'confirmed') return AgentPaymentNextAction.None\n if (status === 'pending' || status === 'pending_approval') return AgentPaymentNextAction.WaitForUserApproval\n if (status === 'approved') return AgentPaymentNextAction.WaitForUserToCompletePayment\n if (status === 'proposed') return AgentPaymentNextAction.WaitForUserApproval\n if (status === 'executed') return AgentPaymentNextAction.RetryOriginalX402Request\n if (status === 'rejected') return AgentPaymentNextAction.StopAndTellUser\n if (status === 'expired') return AgentPaymentNextAction.RequestAgainIfUserStillWantsIt\n if (status === 'failed') return AgentPaymentNextAction.StopAndTellUser\n return null\n}\n\nfunction messageForState(\n label: string,\n status: string,\n paymentId: string,\n nextAction: PaymentNextAction,\n): string {\n if (status === 'pending' || status === 'pending_approval') {\n return `${label} is above the remaining agent budget and is waiting for user approval in Haven (payment_id: ${paymentId}).`\n }\n if (status === 'executed') {\n return 'The user completed the funding payment. Retry the original x402 request.'\n }\n if (status === 'rejected') {\n return `The user rejected this payment request (payment_id: ${paymentId}).`\n }\n if (status === 'expired') {\n return `This payment request expired (payment_id: ${paymentId}).`\n }\n return `${label} is ${status}; next_action=${nextAction} (payment_id: ${paymentId}).`\n}\n\nfunction sameAddress(a: string | null | undefined, b: string | null | undefined): boolean {\n return Boolean(a && b && a.toLowerCase() === b.toLowerCase())\n}\n\nfunction isMppRail(rail: string | null | undefined): boolean {\n return rail === 'mpp' || Boolean(rail?.startsWith('mpp_'))\n}\n\nfunction decimalFromUsdcAtomic(value: string): string {\n const amount = BigInt(value)\n const whole = amount / 1_000_000n\n const fraction = (amount % 1_000_000n).toString().padStart(6, '0').replace(/0+$/, '')\n return fraction ? `${whole}.${fraction}` : whole.toString()\n}\n\nfunction normalizeDecimal(value: string): string {\n if (!value.includes('.')) return value.replace(/^0+(?=\\d)/, '') || '0'\n const [whole, fraction = ''] = value.split('.')\n const normalizedWhole = whole.replace(/^0+(?=\\d)/, '') || '0'\n const normalizedFraction = fraction.replace(/0+$/, '')\n return normalizedFraction ? `${normalizedWhole}.${normalizedFraction}` : normalizedWhole\n}\n\nfunction parseMerchantSettlement(header: string | null): {\n settlementTxHash?: string | null\n} {\n if (!header) return {}\n const parsed = parseProtocolReceiptHeader(header)\n const tx =\n typeof parsed?.transaction === 'string'\n ? parsed.transaction\n : typeof parsed?.txHash === 'string'\n ? parsed.txHash\n : typeof parsed?.tx_hash === 'string'\n ? parsed.tx_hash\n : null\n return { settlementTxHash: tx }\n}\n\nexport class HavenClient {\n private readonly apiKey: string\n private readonly delegateKey: string | undefined\n private readonly baseUrl: string\n private readonly x402Wallet: string | undefined\n private readonly requestTimeout: number\n private readonly confirmationTimeout: number\n private readonly pollingInterval: number\n private readonly inFlightX402 = new Map<string, Promise<X402Receipt>>()\n private readonly x402ReceiptCache = new Map<string, { expiresAt: number; receipt: X402Receipt }>()\n private readonly inFlightMachinePayments = new Map<string, Promise<MachinePaymentReceipt>>()\n /**\n * Setup-time headers configured via `HavenClientConfig.defaultHeaders`.\n * Read-only after construction — use `withRequestContext` for per-call\n * scoping so concurrent requests don't race on shared mutable state.\n */\n private readonly defaultHeaders: Record<string, string>\n /**\n * Async-local store for per-request context (currently: extra headers).\n * Each `withRequestContext` invocation produces an isolated store, so\n * overlapping async work — like two MCP tool dispatches in flight at\n * the same time — see their own headers without stepping on each other.\n */\n private readonly requestContext = new AsyncLocalStorage<{ headers: Record<string, string> }>()\n\n /** Delegate address derived from the private key (if provided) */\n readonly delegateAddress: string | undefined\n\n constructor(config: HavenClientConfig) {\n this.apiKey = config.apiKey\n this.delegateKey = config.delegateKey\n this.baseUrl = (config.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '')\n this.x402Wallet = config.x402Wallet\n this.requestTimeout = config.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT\n this.confirmationTimeout = config.confirmationTimeout ?? DEFAULT_CONFIRMATION_TIMEOUT\n this.pollingInterval = config.pollingInterval ?? DEFAULT_POLLING_INTERVAL\n this.defaultHeaders = { ...(config.defaultHeaders ?? {}) }\n\n if (this.delegateKey) {\n this.delegateAddress = addressFromKey(this.delegateKey)\n }\n }\n\n /**\n * Run `fn` with extra Haven-API headers scoped to the async work it\n * performs. Used by the MCP server to tag every Haven API request that\n * a single tool dispatch makes with `X-Haven-MCP-Tool: <name>` so the\n * backend can write an audit-log row attributing the call.\n *\n * The headers are held in an `AsyncLocalStorage` so overlapping\n * dispatches do not leak headers into each other's requests. The store\n * inherits across `await` boundaries, so any Haven API call made while\n * `fn` is awaiting will pick up the right headers.\n *\n * Has no effect on outbound merchant requests (x402 / MPP) — those\n * never go through the internal `request<T>` path that reads the\n * context.\n */\n withRequestContext<T>(headers: Record<string, string>, fn: () => Promise<T>): Promise<T> {\n return this.requestContext.run({ headers: { ...headers } }, fn)\n }\n\n // ── High-Level API ───────────────────────────────────────────────\n\n /**\n * Send a payment in one call.\n *\n * Creates the intent, signs the hash, submits the signature,\n * and polls until confirmed (or throws on failure/timeout).\n *\n * Requires `delegateKey` to be set in the client config.\n */\n async pay(request: PaymentRequest): Promise<PaymentResult> {\n if (!this.delegateKey) {\n throw new HavenSigningError(\n 'Cannot use pay() without a delegateKey. Use createIntent() + submitSignature() for manual signing.',\n )\n }\n\n // Step 1: Create intent\n const intent = await this.createIntent(request)\n\n // Step 2: Sign\n const signature = this.sign(intent.signData.hash)\n\n // Step 3: Submit\n await this.submitSignature(intent.paymentId, signature)\n\n // Step 4: Wait for confirmation\n return this.waitForConfirmation(intent.paymentId)\n }\n\n // ── Step-by-Step API ─────────────────────────────────────────────\n\n /**\n * Step 1: Create a payment intent.\n *\n * Returns the intent with the hash to sign.\n */\n async createIntent(request: PaymentRequest): Promise<PaymentIntent> {\n const raw = await this.post<RawCreateResponse>('/payments', {\n token: request.token,\n amount: request.amount,\n to: request.to,\n })\n\n // Haven returns HTTP 202 with this status when the requested amount\n // exceeds the on-chain allowance. The payment is parked for the owner\n // to approve in the dashboard — there's nothing to sign yet, so the SDK\n // surfaces it as an explicit error rather than returning a malformed\n // intent with no signData.\n if (raw.status === 'pending_approval') {\n this.throwPaymentStateError('Payment', raw)\n }\n\n return {\n paymentId: raw.payment_id,\n status: 'pending_signature',\n expiresAt: raw.expires_at,\n signData: raw.sign_data,\n }\n }\n\n /**\n * Keyless x402 construct.\n *\n * The non-custodial half of an x402 payment: posts the funding request to\n * `/x402` and returns the unsigned funding hash plus the data the caller\n * needs to build and sign the EIP-3009 merchant header itself. Crucially it\n * does **not** sign — neither the funding hash nor the merchant header — so\n * it works without a `delegateKey`. Both delegate signatures happen on the\n * machine that holds the key (the edge); the hosted MCP server relays only.\n *\n * Use this from the hosted, keyless server. The all-in-one `authorizeX402`\n * remains for local clients that hold the key.\n *\n * Throws (via the shared payment-state path) when the amount exceeds the\n * on-chain allowance — there is nothing to sign until the user approves.\n */\n async createX402Intent(\n paymentRequired: X402PaymentRequired,\n options: X402AuthorizationOptions = {},\n ): Promise<X402Intent> {\n const option = selectStandardPaymentOption(paymentRequired.accepts)\n if (!option) {\n throw new HavenApiError(\n 'No compatible payment option found in x402 requirements. ' +\n 'Haven supports standard x402 exact payments on Base USDC.',\n 400,\n )\n }\n\n // The funding transfer tops up the agent's delegate EOA. With no local key\n // we resolve that address from the authenticated agent record rather than\n // deriving it from a private key.\n const agent = await this.getAgent()\n const fundingTo = agent.delegateAddress\n if (!fundingTo) {\n throw new HavenApiError('Authenticated agent has no delegate address registered.', 502)\n }\n\n const idempotencyKey = options.idempotencyKey ?? buildX402IdempotencyKey(paymentRequired, option)\n const raw = await this.post<RawX402AuthorizeResponse>('/x402', {\n url: paymentRequired.resource.url,\n payTo: fundingTo,\n merchantPayTo: option.payTo,\n amount: x402AuthorizationAmount(option),\n asset: option.asset,\n network: option.network,\n description: paymentRequired.resource.description,\n idempotencyKey,\n })\n\n // Anything other than a signable funding intent (pending_approval,\n // expired, already-executed, error) is surfaced through the shared path.\n if (raw.status !== 'pending_signature') {\n this.throwPaymentStateError('x402 payment', raw)\n }\n if (!raw.sign_data?.hash) {\n throw new HavenApiError('No sign_hash returned from x402/authorize', 500, raw)\n }\n if (!raw.x402_expected_auth) {\n throw new HavenApiError('No x402 expected-context binding returned from x402/authorize', 500, raw)\n }\n\n return {\n paymentId: raw.payment_id,\n status: 'pending_signature',\n expiresAt: raw.expires_at,\n signData: raw.sign_data,\n accepted: option,\n resourceUrl: paymentRequired.resource.url,\n merchantTo: raw.merchant_to ?? option.payTo,\n amountAtomic: x402AuthorizationAmount(option),\n asset: option.asset,\n network: option.network,\n expectedAuth: raw.x402_expected_auth,\n fundingTo,\n }\n }\n\n /**\n * Step 2: Sign a hash with the delegate key.\n *\n * Returns the 65-byte signature (0x-prefixed).\n * Requires `delegateKey` to be set in the client config.\n */\n sign(hash: string): string {\n if (!this.delegateKey) {\n throw new HavenSigningError(\n 'Cannot sign without a delegateKey. Pass the private key in HavenClient config, or sign externally.',\n )\n }\n\n const signature = signHash(this.delegateKey, hash)\n\n // Verify the signature locally before submitting\n if (!verifySignature(hash, signature, this.delegateAddress!)) {\n throw new HavenSigningError(\n 'Local signature verification failed — recovered address does not match delegate key.',\n )\n }\n\n return signature\n }\n\n /**\n * Step 3: Submit a signature to execute the payment.\n *\n * The signature can come from `client.sign()` or from external signing.\n */\n async submitSignature(\n paymentId: string,\n signature: string,\n ): Promise<{ status: string; txHash?: string }> {\n const raw = await this.post<RawSignResponse>(\n `/payments/${paymentId}/sign`,\n { signature },\n )\n\n return {\n status: raw.status,\n txHash: raw.tx_hash,\n }\n }\n\n /**\n * Get the current status of a payment.\n */\n async getPayment(paymentId: string): Promise<PaymentResult> {\n const raw = await this.get<RawStatusResponse>(`/payments/${paymentId}`)\n return this.mapPaymentResult(raw)\n }\n\n /**\n * Get agent-actionable status for a payment intent or approval request.\n *\n * Use this for IDs returned by agent tools and machine-payment/x402 flows.\n * `getPayment()` remains available for payment-intent-only integrations.\n */\n async getPaymentStatus(paymentId: string): Promise<PaymentStatusResult> {\n const raw = await this.get<RawPaymentStatusResult>(`/machine-payments/${paymentId}/status`)\n return this.mapPaymentStatusResult(raw)\n }\n\n /**\n * Get the agent identity tied to this API key.\n */\n async getAgent(): Promise<HavenAgent> {\n const raw = await this.get<RawHavenAgent>('/machine-payments/agent')\n return {\n id: raw.id,\n name: raw.name,\n status: raw.status,\n safeAddress: raw.safe_address,\n delegateAddress: raw.delegate_address,\n chainId: raw.chain_id,\n }\n }\n\n /**\n * Get configured and on-chain allowances for the authenticated agent.\n */\n async getAllowances(): Promise<HavenAllowanceSummary> {\n const raw = await this.get<RawHavenAllowanceSummary>('/machine-payments/allowances')\n return {\n agentId: raw.agent_id,\n safeAddress: raw.safe_address,\n delegateAddress: raw.delegate_address,\n chainId: raw.chain_id,\n allowances: raw.allowances.map((allowance) => ({\n id: allowance.id,\n tokenAddress: allowance.token_address,\n tokenSymbol: allowance.token_symbol,\n configuredAmount: allowance.configured_amount,\n resetPeriodMin: allowance.reset_period_min,\n onchain: {\n amount: allowance.onchain.amount,\n spent: allowance.onchain.spent,\n remaining: allowance.onchain.remaining,\n effectiveSpent: allowance.onchain.effective_spent,\n resetTimeMin: allowance.onchain.reset_time_min,\n lastResetMin: allowance.onchain.last_reset_min,\n nonce: allowance.onchain.nonce,\n isResetPending: allowance.onchain.is_reset_pending,\n },\n })),\n }\n }\n\n /**\n * List recent machine-payment receipts/evidence for bookkeeping.\n */\n async listReceipts(options: { limit?: number } = {}): Promise<HavenPaymentReceipt[]> {\n const query = options.limit ? `?limit=${encodeURIComponent(String(options.limit))}` : ''\n const raw = await this.get<RawHavenPaymentReceiptsResponse>(`/machine-payments/receipts${query}`)\n return raw.receipts.map((receipt) => this.mapPaymentReceipt(receipt))\n }\n\n /**\n * Rehydrate the x402/MPP resume-state bundle for a payment id.\n *\n * The server returns stored protocol context only. The client still signs the\n * merchant proof locally when resumeX402Payment() or resumeMppPayment() runs.\n */\n async getResumeState(paymentId: string): Promise<PaymentResumeState> {\n return this.get<PaymentResumeState>(`/payments/${paymentId}/resume_state`)\n }\n\n /**\n * Poll until a payment reaches a terminal status (confirmed, failed, expired).\n */\n async waitForConfirmation(paymentId: string): Promise<PaymentResult> {\n const deadline = Date.now() + this.confirmationTimeout\n\n while (Date.now() < deadline) {\n const result = await this.getPayment(paymentId)\n\n if (result.status === 'confirmed' || result.status === 'failed' || result.status === 'expired') {\n return result\n }\n\n await sleep(this.pollingInterval)\n }\n\n throw new HavenTimeoutError(paymentId)\n }\n\n // ── x402 Protocol Support ────────────────────────────────────────\n\n /**\n * Authorize an x402 payment.\n *\n * Takes the parsed PaymentRequired from a 402 response, selects a compatible\n * option, funds the delegate wallet through Haven, and returns the standard\n * x402 header that the merchant can verify and settle.\n *\n * Requires `delegateKey` to be set in the client config.\n */\n async authorizeX402(\n paymentRequired: X402PaymentRequired,\n options: X402AuthorizationOptions = {},\n ): Promise<X402Receipt> {\n if (!this.delegateKey) {\n throw new HavenSigningError(\n 'delegateKey is required for x402 payments. Pass it in the HavenClient config.',\n )\n }\n if (!this.delegateAddress) {\n throw new HavenSigningError('delegateAddress could not be derived from delegateKey.')\n }\n\n // 1. Select best payment option\n const option = selectStandardPaymentOption(paymentRequired.accepts)\n if (!option) {\n throw new HavenApiError(\n 'No compatible payment option found in x402 requirements. ' +\n 'Haven supports standard x402 exact payments on Base USDC.',\n 400,\n )\n }\n\n const idempotencyKey = options.idempotencyKey ?? buildX402IdempotencyKey(paymentRequired, option)\n const cached = this.x402ReceiptCache.get(idempotencyKey)\n if (cached && cached.expiresAt > Date.now()) return cached.receipt\n\n const inFlight = this.inFlightX402.get(idempotencyKey)\n if (inFlight) return inFlight\n\n const promise = this.authorizeStandardX402(paymentRequired, option, idempotencyKey)\n this.inFlightX402.set(idempotencyKey, promise)\n\n try {\n return await promise\n } catch (err) {\n this.attachResumeState(err, {\n rail: 'x402',\n paymentRequired,\n accepted: option,\n idempotencyKey,\n })\n throw err\n } finally {\n this.inFlightX402.delete(idempotencyKey)\n }\n }\n\n /**\n * Probe a paid endpoint and return its x402 quote without creating a Haven\n * payment or approval request.\n */\n async quoteX402(\n url: string,\n init?: RequestInit,\n options: X402AuthorizationOptions = {},\n ): Promise<X402Quote> {\n const initialInit = this.withX402Wallet(init, this.x402PayerAddress())\n const request = this.snapshotX402Request(url, initialInit)\n const response = await globalThis.fetch(url, initialInit)\n\n if (response.status !== 402) {\n throw new HavenApiError(\n `Expected an x402 quote response with HTTP 402, got HTTP ${response.status}.`,\n response.status || 400,\n )\n }\n\n if (response.headers.get('MACHINE-PAYMENT-CHALLENGE')) {\n throw new HavenApiError('quoteX402 only supports standard x402 Payment Required responses.', 400)\n }\n\n const paymentRequired = await parsePaymentRequiredResponse(response)\n return this.buildX402Quote(paymentRequired, request, options.idempotencyKey)\n }\n\n /**\n * Pay a previously inspected x402 quote and retry the exact captured request.\n */\n async payX402Quote(\n quote: X402Quote,\n options: X402AuthorizationOptions = {},\n ): Promise<Response> {\n const idempotencyKey = options.idempotencyKey ?? quote.idempotencyKey\n\n try {\n const receipt = await this.authorizeX402(quote.paymentRequired, { idempotencyKey })\n return this.retryX402Request(\n quote.request.url,\n this.requestInitFromSnapshot(quote.request),\n quote.paymentRequired,\n receipt,\n )\n } catch (err) {\n this.attachResumeState(err, {\n rail: 'x402',\n paymentRequired: quote.paymentRequired,\n accepted: quote.accepted,\n idempotencyKey,\n request: quote.request,\n })\n throw err\n }\n }\n\n private async authorizeStandardX402(\n paymentRequired: X402PaymentRequired,\n option: X402PaymentOption,\n idempotencyKey: string,\n ): Promise<X402Receipt> {\n // 2. Standard x402 settles from an EOA, so the SDK uses the agent-owned\n // delegate EOA for the merchant-facing EIP-3009 authorization. Haven does\n // not control this EOA or its private key.\n //\n // The only automated funding path is a separate Safe AllowanceModule\n // transfer signed by the agent key and constrained by the user's on-chain\n // allowance. Haven's backend relays that signed top-up; it is not the source\n // of payment authority.\n // Sign before funding so retries reuse one EIP-3009 nonce. If funding fails,\n // the unused authorization simply expires via validBefore.\n const paymentHeader = await this.createStandardX402Header(paymentRequired, option)\n const raw = await this.post<RawX402AuthorizeResponse>('/x402', {\n url: paymentRequired.resource.url,\n payTo: this.delegateAddress,\n merchantPayTo: option.payTo,\n amount: x402AuthorizationAmount(option),\n asset: option.asset,\n network: option.network,\n description: paymentRequired.resource.description,\n idempotencyKey,\n })\n\n // If the backend already executed (shouldn't happen without sig), return\n if (raw.success && raw.tx_hash) {\n const receipt = this.mapX402ReceiptFromAuthorization(paymentRequired, option, paymentHeader, raw)\n this.cacheX402Receipt(idempotencyKey, paymentHeader, receipt)\n return receipt\n }\n\n const state = this.paymentStateFromRaw('x402 payment', raw)\n if (state?.nextAction === AgentPaymentNextAction.RetryOriginalX402Request) {\n const receipt = this.mapX402ReceiptFromStatus(paymentRequired, option, paymentHeader, state)\n this.cacheX402Receipt(idempotencyKey, paymentHeader, receipt)\n return receipt\n }\n\n this.throwIfNonSignableAuthorizationState('x402 payment', raw)\n\n // 3. Sign the hash\n if (!raw.sign_data?.hash) {\n throw new HavenApiError('No sign_hash returned from x402/authorize', 500, raw)\n }\n const sig = signHash(this.delegateKey!, raw.sign_data.hash)\n\n // 4. Submit signature (reuse existing payments/:id/sign endpoint)\n const execResult = await this.post<RawSignResponse>(\n `/payments/${raw.payment_id}/sign`,\n { signature: sig },\n )\n\n if (execResult.status !== 'confirmed') {\n this.throwPaymentStateError('x402 payment', execResult)\n }\n\n const receipt = this.mapX402ReceiptFromAuthorization(paymentRequired, option, paymentHeader, raw, execResult)\n this.cacheX402Receipt(idempotencyKey, paymentHeader, receipt)\n return receipt\n }\n\n async resumeAuthorizedX402(input: ResumeAuthorizedX402Input): Promise<X402Receipt> {\n if (!this.delegateKey) {\n throw new HavenSigningError(\n 'delegateKey is required for x402 payments. Pass it in the HavenClient config.',\n )\n }\n if (!this.delegateAddress) {\n throw new HavenSigningError('delegateAddress could not be derived from delegateKey.')\n }\n\n const option = selectStandardPaymentOption(input.paymentRequired.accepts)\n if (!option) {\n throw new HavenApiError(\n 'No compatible payment option found in x402 requirements. ' +\n 'Haven supports standard x402 exact payments on Base USDC.',\n 400,\n )\n }\n\n const idempotencyKey = input.idempotencyKey ?? buildX402IdempotencyKey(input.paymentRequired, option)\n const cached = this.x402ReceiptCache.get(idempotencyKey)\n if (cached && cached.expiresAt > Date.now()) return cached.receipt\n\n const status = await this.getPaymentStatus(input.paymentId)\n this.assertCanResumeX402(status, input.paymentRequired, option)\n\n const paymentHeader = await this.createStandardX402Header(input.paymentRequired, option)\n const receipt = this.mapX402ReceiptFromStatus(input.paymentRequired, option, paymentHeader, status)\n this.cacheX402Receipt(idempotencyKey, paymentHeader, receipt)\n return receipt\n }\n\n async resumeX402Payment(input: ResumeX402PaymentInput | X402ResumeState): Promise<Response> {\n const inputInit = 'init' in input ? input.init : undefined\n const initialInit = this.withX402Wallet(\n inputInit ?? (input.request ? this.requestInitFromSnapshot(input.request) : undefined),\n this.x402PayerAddress(),\n )\n let paymentRequired = input.paymentRequired\n const url = input.url ?? input.request?.url\n\n if (!paymentRequired) {\n if (!url) {\n throw new HavenApiError('x402 resume requires the original URL or a captured request snapshot.', 400)\n }\n const response = await globalThis.fetch(url, initialInit)\n if (response.status !== 402) {\n throw new HavenApiError('Expected the original x402 request to return HTTP 402 before resuming.', 400)\n }\n paymentRequired = await parsePaymentRequiredResponse(response)\n }\n\n const receipt = await this.resumeAuthorizedX402({\n paymentId: input.paymentId,\n paymentRequired,\n idempotencyKey: input.idempotencyKey,\n })\n\n return this.retryX402Request(url ?? paymentRequired.resource.url, initialInit, paymentRequired, receipt)\n }\n\n /**\n * Fetch wrapper that automatically handles HTTP 402 responses.\n *\n * Works like the standard `fetch()` but intercepts 402 responses,\n * pays via x402 through Haven, and retries the request.\n *\n * ```ts\n * const response = await haven.fetch('https://paid-api.com/data')\n * const data = await response.json()\n * ```\n *\n * Requires `delegateKey` to be set in the client config.\n */\n async fetch(\n url: string,\n init?: RequestInit,\n options: X402AuthorizationOptions = {},\n ): Promise<Response> {\n const initialInit = this.withX402Wallet(init, this.x402PayerAddress())\n\n // 1. Make the original request\n const response = await globalThis.fetch(url, initialInit)\n\n // 2. Not a 402 — return as-is\n if (response.status !== 402) return response\n\n const machineChallengeHeader = response.headers.get('MACHINE-PAYMENT-CHALLENGE')\n if (machineChallengeHeader) {\n const challenge = await parseMachinePaymentChallengeResponse(response)\n return this.fetchWithMachinePayment(url, initialInit, challenge)\n }\n\n // 3. Parse x402 payment requirements\n let paymentRequired: X402PaymentRequired\n try {\n paymentRequired = await parsePaymentRequiredResponse(response)\n } catch {\n let challenge: MachinePaymentChallenge\n try {\n challenge = await parseMachinePaymentChallengeResponse(response)\n } catch {\n // Not a Haven machine-payment 402 — return original response\n return response\n }\n return this.fetchWithMachinePayment(url, initialInit, challenge)\n }\n\n // 4. Pay through Haven\n const request = this.snapshotX402Request(url, initialInit)\n const option = selectStandardPaymentOption(paymentRequired.accepts)\n const idempotencyKey = options.idempotencyKey ?? (option ? buildX402IdempotencyKey(paymentRequired, option) : undefined)\n let receipt: X402Receipt\n try {\n receipt = await this.authorizeX402(paymentRequired, options)\n } catch (err) {\n if (option && idempotencyKey) {\n this.attachResumeState(err, {\n rail: 'x402',\n paymentRequired,\n accepted: option,\n idempotencyKey,\n request,\n })\n }\n throw err\n }\n return this.retryX402Request(url, initialInit, paymentRequired, receipt)\n }\n\n /**\n * Probe a paid MPP endpoint or inspect an existing challenge without creating\n * a Haven payment or approval request.\n */\n async quoteMpp(\n challengeOrUrl: MachinePaymentChallenge | string,\n init?: RequestInit,\n options: MppAuthorizationOptions = {},\n ): Promise<MppQuote> {\n if (typeof challengeOrUrl !== 'string') {\n const request = this.snapshotX402Request(challengeOrUrl.resource, init)\n return this.buildMppQuote(challengeOrUrl, request, options.idempotencyKey)\n }\n\n const request = this.snapshotX402Request(challengeOrUrl, init)\n const response = await globalThis.fetch(challengeOrUrl, init)\n\n if (response.status !== 402) {\n throw new HavenApiError(\n `Expected an MPP quote response with HTTP 402, got HTTP ${response.status}.`,\n response.status || 400,\n )\n }\n\n const challenge = await parseMachinePaymentChallengeResponse(response)\n return this.buildMppQuote(challenge, request, options.idempotencyKey)\n }\n\n /**\n * Pay a previously inspected MPP quote and retry the exact captured request.\n */\n async payMppChallenge(\n quote: MppQuote,\n options: MppAuthorizationOptions = {},\n ): Promise<Response> {\n const idempotencyKey = options.idempotencyKey ?? quote.idempotencyKey\n\n try {\n const receipt = await this.authorizeMachinePayment(quote.challenge, { idempotencyKey })\n return this.retryMppRequest(\n quote.request.url,\n this.requestInitFromSnapshot(quote.request),\n quote.challenge,\n receipt,\n )\n } catch (err) {\n this.attachResumeState(err, {\n rail: 'mpp',\n challenge: quote.challenge,\n idempotencyKey,\n request: quote.request,\n })\n throw err\n }\n }\n\n private async retryX402Request(\n url: string,\n initialInit: RequestInit | undefined,\n paymentRequired: X402PaymentRequired,\n receipt: X402Receipt,\n ): Promise<Response> {\n if (!receipt.accepted) {\n throw new HavenApiError('No accepted x402 option was recorded for payment retry', 500)\n }\n if (!receipt.paymentHeader) {\n throw new HavenApiError('No x402 payment header was returned for payment retry', 500)\n }\n\n // 5. Retry with a merchant-verifiable x402 EIP-3009 payment header.\n const retryHeaders = new Headers(initialInit?.headers)\n retryHeaders.set('X-PAYMENT', receipt.paymentHeader)\n\n const retryResponse = await globalThis.fetch(url, {\n ...initialInit,\n headers: retryHeaders,\n })\n\n if (!retryResponse.ok) {\n await this.recordMerchantRetryRejected({\n rail: 'x402',\n paymentId: receipt.paymentId,\n txHash: receipt.txHash,\n resourceUrl: receipt.resourceUrl,\n retryResponse,\n details: {\n merchant_to: receipt.merchantTo,\n delegate_to: receipt.to,\n },\n })\n\n throw new HavenApiError(\n 'x402 retry failed after Haven funded the delegate wallet; reconciliation may be required.',\n retryResponse.status,\n {\n marker: 'x402_retry_rejected_after_funding',\n payment_id: receipt.paymentId,\n tx_hash: receipt.txHash,\n resource_url: receipt.resourceUrl,\n merchant_to: receipt.merchantTo,\n delegate_to: receipt.to,\n },\n )\n }\n\n const merchantSettlement = parseMerchantSettlement(retryResponse.headers.get('PAYMENT-RESPONSE'))\n if (receipt.merchant && merchantSettlement.settlementTxHash) {\n receipt.merchant.settlementTxHash = merchantSettlement.settlementTxHash\n receipt.merchant.settlementExplorerUrl = buildExplorerUrl(\n receipt.chainId,\n merchantSettlement.settlementTxHash,\n )\n }\n\n await this.reportMachinePaymentEvidence({\n paymentId: receipt.paymentId,\n rail: 'x402',\n txHash: receipt.txHash,\n resourceUrl: receipt.resourceUrl,\n merchantStatus: retryResponse.status,\n challengePayload: paymentRequired as unknown as Record<string, unknown>,\n selectedPayment: receipt.accepted as unknown as Record<string, unknown>,\n paymentProofHeaderName: 'X-PAYMENT',\n paymentProofHeader: receipt.paymentHeader,\n protocolReceiptHeaderName: 'PAYMENT-RESPONSE',\n protocolReceiptHeader: retryResponse.headers.get('PAYMENT-RESPONSE') ?? undefined,\n })\n\n return retryResponse\n }\n\n async authorizeMachinePayment(\n challenge: MachinePaymentChallenge,\n options: MppAuthorizationOptions = {},\n ): Promise<MachinePaymentReceipt> {\n if (!this.delegateKey) {\n throw new HavenSigningError(\n 'delegateKey is required for machine payments. Pass it in the HavenClient config.',\n )\n }\n\n if (challenge.rail !== 'mpp_demo') {\n throw new HavenApiError(`Unsupported machine payment rail: ${challenge.rail}`, 400)\n }\n\n const idempotencyKey = options.idempotencyKey ?? buildMachinePaymentIdempotencyKey(challenge)\n const inFlight = this.inFlightMachinePayments.get(idempotencyKey)\n if (inFlight) return inFlight\n\n const promise = this.authorizeMppDemoPayment(challenge, idempotencyKey)\n this.inFlightMachinePayments.set(idempotencyKey, promise)\n\n try {\n return await promise\n } catch (err) {\n this.attachResumeState(err, {\n rail: 'mpp',\n challenge,\n idempotencyKey,\n })\n throw err\n } finally {\n this.inFlightMachinePayments.delete(idempotencyKey)\n }\n }\n\n private async authorizeMppDemoPayment(\n challenge: MachinePaymentChallenge,\n idempotencyKey: string,\n ): Promise<MachinePaymentReceipt> {\n const raw = await this.post<RawMachinePaymentAuthorizeResponse>(\n '/machine-payments/authorize',\n { challenge, idempotencyKey },\n )\n\n if (raw.success && raw.tx_hash) {\n return this.mapMachinePaymentReceipt(challenge, raw, raw.tx_hash)\n }\n\n this.throwIfNonSignableAuthorizationState('Machine payment', raw)\n\n if (!raw.sign_data?.hash) {\n throw new HavenApiError('No sign_hash returned from machine payment authorization', 500, raw)\n }\n\n const sig = signHash(this.delegateKey!, raw.sign_data.hash)\n const execResult = await this.post<RawSignResponse>(\n `/payments/${raw.payment_id}/sign`,\n { signature: sig },\n )\n\n if (execResult.status !== 'confirmed' || !execResult.tx_hash) {\n this.throwPaymentStateError('Machine payment', execResult)\n }\n\n return this.mapMachinePaymentReceipt(challenge, raw, execResult.tx_hash, execResult)\n }\n\n async resumeAuthorizedMpp(input: ResumeAuthorizedMppInput): Promise<MachinePaymentReceipt> {\n if (!this.delegateKey) {\n throw new HavenSigningError(\n 'delegateKey is required for machine payments. Pass it in the HavenClient config.',\n )\n }\n\n const status = await this.getPaymentStatus(input.paymentId)\n this.assertCanResumeMpp(status, input.challenge)\n\n return this.mapMachinePaymentReceiptFromStatus(input.challenge, status)\n }\n\n async resumeMppPayment(input: ResumeMppPaymentInput | MppResumeState): Promise<Response> {\n const inputInit = 'init' in input ? input.init : undefined\n const initialInit = inputInit ?? (input.request ? this.requestInitFromSnapshot(input.request) : undefined)\n let challenge = input.challenge\n const url = input.url ?? input.request?.url\n\n if (!challenge) {\n if (!url) {\n throw new HavenApiError('MPP resume requires the original URL or a captured request snapshot.', 400)\n }\n const response = await globalThis.fetch(url, initialInit)\n if (response.status !== 402) {\n throw new HavenApiError('Expected the original MPP request to return HTTP 402 before resuming.', 400)\n }\n challenge = await parseMachinePaymentChallengeResponse(response)\n }\n\n const receipt = await this.resumeAuthorizedMpp({\n paymentId: input.paymentId,\n challenge,\n idempotencyKey: input.idempotencyKey,\n })\n\n return this.retryMppRequest(url ?? challenge.resource, initialInit, challenge, receipt)\n }\n\n private async fetchWithMachinePayment(\n url: string,\n initialInit: RequestInit | undefined,\n challenge: MachinePaymentChallenge,\n ): Promise<Response> {\n const request = this.snapshotX402Request(url, initialInit)\n const idempotencyKey = buildMachinePaymentIdempotencyKey(challenge)\n let receipt: MachinePaymentReceipt\n try {\n receipt = await this.authorizeMachinePayment(challenge, { idempotencyKey })\n } catch (err) {\n this.attachResumeState(err, {\n rail: 'mpp',\n challenge,\n idempotencyKey,\n request,\n })\n throw err\n }\n\n return this.retryMppRequest(url, initialInit, challenge, receipt)\n }\n\n private async retryMppRequest(\n url: string,\n initialInit: RequestInit | undefined,\n challenge: MachinePaymentChallenge,\n receipt: MachinePaymentReceipt,\n ): Promise<Response> {\n const retryHeaders = new Headers(initialInit?.headers)\n retryHeaders.set('MACHINE-PAYMENT-PROOF', receipt.proofHeader)\n\n const retryResponse = await globalThis.fetch(url, {\n ...initialInit,\n headers: retryHeaders,\n })\n\n if (!retryResponse.ok) {\n await this.recordMerchantRetryRejected({\n rail: receipt.rail,\n paymentId: receipt.paymentId,\n txHash: receipt.txHash,\n resourceUrl: receipt.resourceUrl,\n retryResponse,\n details: {\n challenge_id: receipt.challengeId,\n },\n })\n\n throw new HavenApiError(\n 'Machine payment retry failed after Haven sent the payment.',\n retryResponse.status,\n {\n marker: 'machine_payment_retry_rejected_after_payment',\n payment_id: receipt.paymentId,\n tx_hash: receipt.txHash,\n resource_url: receipt.resourceUrl,\n rail: receipt.rail,\n },\n )\n }\n\n await this.reportMachinePaymentEvidence({\n paymentId: receipt.paymentId,\n rail: receipt.rail,\n txHash: receipt.txHash,\n resourceUrl: receipt.resourceUrl,\n merchantStatus: retryResponse.status,\n challengePayload: challenge as unknown as Record<string, unknown>,\n paymentProofHeaderName: 'MACHINE-PAYMENT-PROOF',\n paymentProofHeader: receipt.proofHeader,\n protocolReceiptHeaderName:\n retryResponse.headers.has('Payment-Receipt')\n ? 'Payment-Receipt'\n : retryResponse.headers.has('MACHINE-PAYMENT-RESPONSE')\n ? 'MACHINE-PAYMENT-RESPONSE'\n : undefined,\n protocolReceiptHeader:\n retryResponse.headers.get('Payment-Receipt') ??\n retryResponse.headers.get('MACHINE-PAYMENT-RESPONSE') ??\n undefined,\n })\n\n return retryResponse\n }\n\n private assertCanResumeX402(\n status: PaymentStatusResult,\n paymentRequired: X402PaymentRequired,\n option: X402PaymentOption,\n ): void {\n if (status.rail !== 'x402') {\n throw new HavenPaymentStateError(\n `Payment ${status.paymentId} is ${status.rail}, not x402.`,\n 409,\n status,\n )\n }\n\n if (status.nextAction !== AgentPaymentNextAction.RetryOriginalX402Request) {\n throw new HavenPaymentStateError(status.message, PAYMENT_STATE_STATUS_CODES[status.status] ?? 409, status)\n }\n\n if (!status.txHash) {\n throw new HavenApiError(\n `x402 payment ${status.paymentId} is ready to retry but has no Haven transaction hash.`,\n 502,\n status,\n status.paymentId,\n )\n }\n\n if (status.resourceUrl && status.resourceUrl !== paymentRequired.resource.url) {\n throw new HavenApiError(\n 'x402 resume request does not match the approved resource URL.',\n 409,\n { status, paymentRequired },\n status.paymentId,\n )\n }\n\n if (status.merchantAddress && !sameAddress(status.merchantAddress, option.payTo)) {\n throw new HavenApiError(\n 'x402 resume request does not match the approved merchant.',\n 409,\n { status, selectedPayment: option },\n status.paymentId,\n )\n }\n\n const optionChainId = chainIdFromNetwork(option.network)\n if (status.chainId && optionChainId && status.chainId !== optionChainId) {\n throw new HavenApiError(\n 'x402 resume request does not match the approved network.',\n 409,\n { status, selectedPayment: option },\n status.paymentId,\n )\n }\n\n if (status.token && status.token !== 'USDC') {\n throw new HavenApiError(\n 'x402 resume request does not match the approved token.',\n 409,\n { status, selectedPayment: option },\n status.paymentId,\n )\n }\n\n const approvedAmount = status.amount ? normalizeDecimal(status.amount) : ''\n const requestedAmount = normalizeDecimal(decimalFromUsdcAtomic(x402AuthorizationAmount(option)))\n if (approvedAmount && approvedAmount !== requestedAmount) {\n throw new HavenApiError(\n 'x402 resume request does not match the approved amount.',\n 409,\n { status, selectedPayment: option },\n status.paymentId,\n )\n }\n }\n\n private assertCanResumeMpp(\n status: PaymentStatusResult,\n challenge: MachinePaymentChallenge,\n ): void {\n if (!isMppRail(status.rail)) {\n throw new HavenPaymentStateError(\n `Payment ${status.paymentId} is ${status.rail}, not MPP.`,\n 409,\n status,\n )\n }\n\n if (status.nextAction !== AgentPaymentNextAction.RetryOriginalX402Request) {\n throw new HavenPaymentStateError(status.message, PAYMENT_STATE_STATUS_CODES[status.status] ?? 409, status)\n }\n\n if (!status.txHash) {\n throw new HavenApiError(\n `MPP payment ${status.paymentId} is ready to retry but has no Haven transaction hash.`,\n 502,\n status,\n status.paymentId,\n )\n }\n\n if (status.resourceUrl && status.resourceUrl !== challenge.resource) {\n throw new HavenApiError(\n 'MPP resume request does not match the approved resource URL.',\n 409,\n { status, challenge },\n status.paymentId,\n )\n }\n\n if (status.merchantAddress && !sameAddress(status.merchantAddress, challenge.recipient)) {\n throw new HavenApiError(\n 'MPP resume request does not match the approved merchant.',\n 409,\n { status, challenge },\n status.paymentId,\n )\n }\n\n if (status.chainId && status.chainId !== challenge.network.chainId) {\n throw new HavenApiError(\n 'MPP resume request does not match the approved network.',\n 409,\n { status, challenge },\n status.paymentId,\n )\n }\n\n if (status.token && status.token !== challenge.asset.symbol) {\n throw new HavenApiError(\n 'MPP resume request does not match the approved token.',\n 409,\n { status, challenge },\n status.paymentId,\n )\n }\n\n const approvedAmount = status.amount ? normalizeDecimal(status.amount) : ''\n const requestedAmount = normalizeDecimal(challenge.amount.display)\n if (approvedAmount && approvedAmount !== requestedAmount) {\n throw new HavenApiError(\n 'MPP resume request does not match the approved amount.',\n 409,\n { status, challenge },\n status.paymentId,\n )\n }\n }\n\n private mapX402ReceiptFromAuthorization(\n paymentRequired: X402PaymentRequired,\n option: X402PaymentOption,\n paymentHeader: string,\n raw: RawX402AuthorizeResponse,\n execResult?: RawSignResponse,\n ): X402Receipt {\n const txHash = execResult?.tx_hash ?? raw.tx_hash ?? ''\n const chainId = execResult?.chain_id ?? raw.chain_id ?? chainIdFromNetwork(option.network)\n const token = execResult?.token ?? raw.token ?? 'USDC'\n const amount = execResult?.amount ?? raw.amount ?? decimalFromUsdcAtomic(x402AuthorizationAmount(option))\n const to = execResult?.to ?? raw.to ?? this.delegateAddress ?? ''\n const explorerUrl = execResult?.explorer_url ?? raw.explorer_url ?? explorerUrlOrEmpty(chainId, txHash)\n const merchantTo = execResult?.merchant_to ?? raw.merchant_to ?? option.payTo\n const payer = raw.payer ?? raw.safe_address ?? raw.sign_data?.components.safe\n\n return this.buildX402Receipt({\n paymentId: raw.payment_id,\n txHash,\n token,\n amount,\n to,\n resourceUrl: paymentRequired.resource.url,\n explorerUrl,\n accepted: option,\n paymentHeader,\n merchantTo,\n payer,\n chainId,\n })\n }\n\n private mapX402ReceiptFromStatus(\n paymentRequired: X402PaymentRequired,\n option: X402PaymentOption,\n paymentHeader: string,\n status: PaymentStatusResult,\n ): X402Receipt {\n if (!status.txHash) {\n throw new HavenApiError(\n `x402 payment ${status.paymentId} is ready to retry but has no Haven transaction hash.`,\n 502,\n status,\n status.paymentId,\n )\n }\n\n return this.buildX402Receipt({\n paymentId: status.paymentId,\n txHash: status.txHash,\n token: status.token || 'USDC',\n amount: status.amount || decimalFromUsdcAtomic(x402AuthorizationAmount(option)),\n to: this.delegateAddress ?? '',\n resourceUrl: paymentRequired.resource.url,\n explorerUrl: explorerUrlOrEmpty(status.chainId, status.txHash),\n accepted: option,\n paymentHeader,\n merchantTo: status.merchantAddress ?? option.payTo,\n payer: this.x402Wallet,\n chainId: status.chainId || chainIdFromNetwork(option.network),\n })\n }\n\n private buildX402Receipt(input: {\n paymentId: string\n txHash: string\n token: string\n amount: string\n to: string\n resourceUrl: string\n explorerUrl: string\n accepted: X402PaymentOption\n paymentHeader: string\n merchantTo?: string | null\n payer?: string\n chainId?: number\n }): X402Receipt {\n const fundingExplorerUrl = input.explorerUrl || explorerUrlOrEmpty(input.chainId, input.txHash)\n\n return {\n success: true,\n paymentId: input.paymentId,\n txHash: input.txHash,\n token: input.token,\n amount: input.amount,\n to: input.to,\n resourceUrl: input.resourceUrl,\n explorerUrl: input.explorerUrl,\n accepted: input.accepted,\n paymentHeader: input.paymentHeader,\n merchantTo: input.merchantTo ?? input.accepted.payTo,\n payer: input.payer,\n chainId: input.chainId,\n haven: {\n paymentId: input.paymentId,\n fundingTxHash: input.txHash,\n fundingExplorerUrl,\n },\n merchant: {\n payTo: input.merchantTo ?? input.accepted.payTo,\n },\n x402: {\n amount: x402AuthorizationAmount(input.accepted),\n token: input.token,\n network: input.accepted.network,\n asset: input.accepted.asset,\n resource: input.accepted.resource ?? input.resourceUrl,\n },\n }\n }\n\n private async createStandardX402Header(\n paymentRequired: X402PaymentRequired,\n option: X402PaymentOption,\n ): Promise<string> {\n if (!this.delegateKey) {\n throw new HavenSigningError('delegateKey is required to sign x402 payment headers.')\n }\n\n const account = privateKeyToAccount(this.delegateKey as `0x${string}`)\n const requirements = toStandardPaymentRequirements(paymentRequired, option)\n\n const header = await exact.evm.createPaymentHeader(\n account,\n paymentRequired.x402Version,\n requirements,\n )\n if (paymentRequired.x402Version < 2) return header\n\n const payment = decodeBase64Json<{ payload: unknown }>(header)\n return btoa(JSON.stringify({\n x402Version: paymentRequired.x402Version,\n accepted: option,\n payload: payment.payload,\n }))\n }\n\n private cacheX402Receipt(\n idempotencyKey: string,\n paymentHeader: string,\n receipt: X402Receipt,\n ): void {\n const expiresAt = getPaymentHeaderValidBefore(paymentHeader)\n if (expiresAt > Date.now()) {\n this.x402ReceiptCache.set(idempotencyKey, { expiresAt, receipt })\n }\n }\n\n private mapMachinePaymentReceipt(\n challenge: MachinePaymentChallenge,\n raw: RawMachinePaymentAuthorizeResponse,\n txHash: string,\n execResult?: RawSignResponse,\n ): MachinePaymentReceipt {\n const receiptWithoutHeader = {\n success: true,\n rail: challenge.rail,\n paymentId: raw.payment_id,\n challengeId: challenge.challengeId,\n txHash,\n token: execResult?.token ?? raw.token ?? challenge.asset.symbol,\n amount: execResult?.amount ?? raw.amount ?? challenge.amount.display,\n to: execResult?.to ?? raw.to ?? challenge.recipient,\n resourceUrl: raw.resource_url ?? challenge.resource,\n explorerUrl:\n execResult?.explorer_url ??\n raw.explorer_url ??\n buildExplorerUrl(execResult?.chain_id ?? raw.chain_id ?? challenge.network.chainId, txHash),\n payer: raw.payer ?? raw.safe_address,\n chainId: execResult?.chain_id ?? raw.chain_id ?? challenge.network.chainId,\n }\n\n return {\n ...receiptWithoutHeader,\n proofHeader: encodeMachinePaymentProof(receiptWithoutHeader),\n }\n }\n\n private mapMachinePaymentReceiptFromStatus(\n challenge: MachinePaymentChallenge,\n status: PaymentStatusResult,\n ): MachinePaymentReceipt {\n if (!status.txHash) {\n throw new HavenApiError(\n `MPP payment ${status.paymentId} is ready to retry but has no Haven transaction hash.`,\n 502,\n status,\n status.paymentId,\n )\n }\n\n const receiptWithoutHeader = {\n success: true,\n rail: challenge.rail,\n paymentId: status.paymentId,\n challengeId: challenge.challengeId,\n txHash: status.txHash,\n token: status.token || challenge.asset.symbol,\n amount: status.amount || challenge.amount.display,\n to: status.merchantAddress ?? challenge.recipient,\n resourceUrl: status.resourceUrl ?? challenge.resource,\n explorerUrl: explorerUrlOrEmpty(status.chainId || challenge.network.chainId, status.txHash),\n chainId: status.chainId || challenge.network.chainId,\n }\n\n return {\n ...receiptWithoutHeader,\n proofHeader: encodeMachinePaymentProof(receiptWithoutHeader),\n }\n }\n\n private async recordMerchantRetryRejected(input: {\n rail: string\n paymentId: string\n txHash: string\n resourceUrl: string\n retryResponse: Response\n details?: Record<string, unknown>\n }): Promise<void> {\n try {\n await this.post('/machine-payments/reconciliation-events', {\n paymentId: input.paymentId,\n rail: input.rail,\n eventType: 'merchant_retry_rejected_after_payment',\n txHash: input.txHash,\n reason: `Merchant returned HTTP ${input.retryResponse.status} after Haven payment confirmation`,\n details: {\n resource_url: input.resourceUrl,\n retry_status: input.retryResponse.status,\n retry_body: await responseSnippet(input.retryResponse),\n ...input.details,\n },\n })\n } catch {\n // Best-effort durability: preserve the original retry failure for callers.\n }\n }\n\n private async reportMachinePaymentEvidence(input: {\n paymentId: string\n rail: string\n txHash: string\n resourceUrl: string\n merchantStatus: number\n challengePayload?: Record<string, unknown>\n selectedPayment?: Record<string, unknown>\n paymentProofHeaderName?: string\n paymentProofHeader?: string\n protocolReceiptHeaderName?: string\n protocolReceiptHeader?: string\n }): Promise<void> {\n try {\n await this.post('/machine-payments/evidence', {\n paymentId: input.paymentId,\n rail: input.rail,\n txHash: input.txHash,\n resourceUrl: input.resourceUrl,\n merchantStatus: input.merchantStatus,\n challengePayload: input.challengePayload,\n selectedPayment: input.selectedPayment,\n paymentProofHeaderName: input.paymentProofHeaderName,\n paymentProofHeader: input.paymentProofHeader,\n protocolReceiptHeaderName: input.protocolReceiptHeaderName,\n protocolReceiptHeader: input.protocolReceiptHeader,\n protocolReceiptPayload: input.protocolReceiptHeader\n ? parseProtocolReceiptHeader(input.protocolReceiptHeader)\n : undefined,\n })\n } catch {\n // Evidence reporting is best-effort. The paid resource response remains\n // the caller-visible result when merchant retry succeeded.\n }\n }\n\n private throwIfNonSignableAuthorizationState(\n label: string,\n raw: RawMachinePaymentAuthorizeResponse | RawX402AuthorizeResponse,\n ): void {\n if (raw.status === 'pending_signature') return\n this.throwPaymentStateError(label, raw)\n }\n\n private throwPaymentStateError(\n label: string,\n raw: RawMachinePaymentAuthorizeResponse | RawX402AuthorizeResponse | RawSignResponse,\n ): never {\n const statusCode = PAYMENT_STATE_STATUS_CODES[raw.status] ?? 502\n const state = this.paymentStateFromRaw(label, raw)\n\n if (state) {\n throw new HavenPaymentStateError(state.message, statusCode, state, raw)\n }\n\n if (raw.status === 'pending_approval') {\n throw new HavenApiError(\n `${label} exceeds the on-chain allowance and was queued for owner approval (payment_id: ${raw.payment_id}).`,\n statusCode,\n raw,\n )\n }\n\n if (raw.status === 'expired') {\n throw new HavenApiError(\n `${label} expired before it could be completed (payment_id: ${raw.payment_id}).`,\n statusCode,\n raw,\n )\n }\n\n const paymentId = raw.payment_id ? ` (payment_id: ${raw.payment_id})` : ''\n const message = raw.error ?? `${label} ${raw.status}${paymentId}`\n throw new HavenApiError(message, statusCode, raw)\n }\n\n private paymentStateFromRaw(\n label: string,\n raw: RawMachinePaymentAuthorizeResponse | RawX402AuthorizeResponse | RawSignResponse,\n ): PaymentStatusResult | null {\n if (!raw.payment_id || !raw.status) return null\n\n const phase = (raw.phase as PaymentPhase | undefined) ?? phaseForStatus(raw.status)\n const nextAction = (raw.next_action as PaymentNextAction | undefined) ?? nextActionForStatus(raw.status)\n if (!phase || !nextAction) return null\n\n const amount = raw.amount ?? raw.requested ?? ''\n const token = raw.token ?? ''\n const message =\n raw.message ??\n raw.error ??\n messageForState(label, raw.status, raw.payment_id, nextAction)\n\n return {\n paymentId: raw.payment_id,\n kind: raw.kind === 'payment_intent' ? 'payment_intent' : 'approval_request',\n rail: raw.rail ?? 'direct',\n status: raw.status === 'pending' ? 'pending_approval' : raw.status,\n phase,\n nextAction,\n amount,\n token,\n resourceUrl: raw.resource_url ?? null,\n merchantAddress: raw.merchant_address ?? raw.merchant_to ?? null,\n txHash: raw.tx_hash ?? null,\n expiresAt: raw.expires_at ?? '',\n chainId: raw.chain_id ?? 0,\n message,\n amountAtomic: raw.amount_atomic ?? raw.x402?.amount_atomic ?? raw.mpp?.amount_atomic ?? null,\n asset: raw.asset ?? raw.x402?.asset ?? raw.mpp?.asset ?? null,\n network: raw.network ?? raw.x402?.network ?? raw.mpp?.network ?? null,\n description: raw.description ?? raw.x402?.description ?? raw.mpp?.description ?? null,\n idempotencyKey: raw.idempotency_key ?? raw.x402?.idempotency_key ?? raw.mpp?.idempotency_key ?? null,\n x402: raw.x402\n ? {\n amountAtomic: raw.x402.amount_atomic ?? raw.amount_atomic ?? null,\n asset: raw.x402.asset ?? raw.asset ?? null,\n network: raw.x402.network ?? raw.network ?? null,\n resourceUrl: raw.x402.resource_url ?? raw.resource_url ?? null,\n merchantAddress: raw.x402.merchant_address ?? raw.merchant_address ?? raw.merchant_to ?? null,\n description: raw.x402.description ?? raw.description ?? null,\n idempotencyKey: raw.x402.idempotency_key ?? raw.idempotency_key ?? null,\n }\n : undefined,\n mpp: raw.mpp\n ? {\n amountAtomic: raw.mpp.amount_atomic ?? raw.amount_atomic ?? null,\n asset: raw.mpp.asset ?? raw.asset ?? null,\n network: raw.mpp.network ?? raw.network ?? null,\n resourceUrl: raw.mpp.resource_url ?? raw.resource_url ?? null,\n merchantAddress: raw.mpp.merchant_address ?? raw.merchant_address ?? raw.merchant_to ?? null,\n description: raw.mpp.description ?? raw.description ?? null,\n idempotencyKey: raw.mpp.idempotency_key ?? raw.idempotency_key ?? null,\n challengeId: raw.mpp.challenge_id ?? raw.challenge_id ?? null,\n }\n : undefined,\n }\n }\n\n private x402PayerAddress(): string | undefined {\n return this.delegateAddress ?? this.x402Wallet\n }\n\n private snapshotX402Request(url: string, init?: RequestInit): X402RequestSnapshot {\n return {\n url,\n method: init?.method ?? 'GET',\n headers: Array.from(new Headers(init?.headers).entries()),\n body: this.snapshotRequestBody(init?.body),\n }\n }\n\n private snapshotRequestBody(body: BodyInit | null | undefined): string | undefined {\n if (body == null) return undefined\n if (typeof body === 'string') return body\n if (body instanceof URLSearchParams) return body.toString()\n\n throw new HavenApiError(\n 'Quote helpers can only capture resumable request bodies that are strings or URLSearchParams. ' +\n 'For streams, blobs, or binary bodies, preserve the original request yourself and call the matching resume method with fresh init.',\n 400,\n )\n }\n\n private requestInitFromSnapshot(request: X402RequestSnapshot): RequestInit {\n return {\n method: request.method,\n headers: request.headers,\n body: request.body,\n }\n }\n\n private withX402Wallet(init?: RequestInit, wallet = this.x402PayerAddress()): RequestInit | undefined {\n if (!wallet) return init\n\n const headers = new Headers(init?.headers)\n if (!headers.has('x402-wallet')) {\n headers.set('x402-wallet', wallet)\n }\n\n return {\n ...init,\n headers,\n }\n }\n\n private buildX402Quote(\n paymentRequired: X402PaymentRequired,\n request: X402RequestSnapshot,\n idempotencyKey?: string,\n ): X402Quote {\n const option = selectStandardPaymentOption(paymentRequired.accepts)\n if (!option) {\n throw new HavenApiError(\n 'No compatible payment option found in x402 requirements. ' +\n 'Haven supports standard x402 exact payments on Base USDC.',\n 400,\n )\n }\n\n const token = resolveTokenFromAddress(option.asset, option.network)\n return {\n rail: 'x402',\n idempotencyKey: idempotencyKey ?? buildX402IdempotencyKey(paymentRequired, option),\n paymentRequired,\n accepted: option,\n request,\n resourceUrl: paymentRequired.resource.url,\n description: paymentRequired.resource.description ?? option.description ?? null,\n mimeType: paymentRequired.resource.mimeType ?? option.mimeType ?? null,\n amountAtomic: x402AuthorizationAmount(option),\n amount: decimalFromUsdcAtomic(x402AuthorizationAmount(option)),\n token: token?.symbol ?? 'USDC',\n asset: option.asset,\n network: option.network,\n chainId: chainIdOrNull(option.network),\n merchantAddress: option.payTo,\n maxTimeoutSeconds: option.maxTimeoutSeconds,\n }\n }\n\n private buildX402ResumeState(input: {\n paymentId: string\n paymentRequired: X402PaymentRequired\n accepted: X402PaymentOption\n idempotencyKey: string\n request?: X402RequestSnapshot\n }): X402ResumeState {\n const token = resolveTokenFromAddress(input.accepted.asset, input.accepted.network)\n return {\n rail: 'x402',\n paymentId: input.paymentId,\n idempotencyKey: input.idempotencyKey,\n paymentRequired: input.paymentRequired,\n accepted: input.accepted,\n url: input.request?.url ?? input.paymentRequired.resource.url,\n request: input.request,\n resourceUrl: input.paymentRequired.resource.url,\n description: input.paymentRequired.resource.description ?? input.accepted.description ?? null,\n amountAtomic: x402AuthorizationAmount(input.accepted),\n amount: decimalFromUsdcAtomic(x402AuthorizationAmount(input.accepted)),\n token: token?.symbol ?? 'USDC',\n asset: input.accepted.asset,\n network: input.accepted.network,\n chainId: chainIdOrNull(input.accepted.network),\n merchantAddress: input.accepted.payTo,\n }\n }\n\n private buildMppQuote(\n challenge: MachinePaymentChallenge,\n request: X402RequestSnapshot,\n idempotencyKey?: string,\n ): MppQuote {\n return {\n rail: 'mpp',\n paymentRail: challenge.rail,\n idempotencyKey: idempotencyKey ?? buildMachinePaymentIdempotencyKey(challenge),\n challenge,\n request,\n resourceUrl: challenge.resource,\n description: challenge.description ?? null,\n amountAtomic: challenge.amount.atomic,\n amount: challenge.amount.display,\n token: challenge.asset.symbol,\n asset: challenge.asset.address,\n network: challenge.network.name,\n chainId: challenge.network.chainId,\n merchantAddress: challenge.recipient,\n expiresAt: challenge.expiresAt,\n }\n }\n\n private buildMppResumeState(input: {\n paymentId: string\n challenge: MachinePaymentChallenge\n idempotencyKey: string\n request?: X402RequestSnapshot\n }): MppResumeState {\n const quote = this.buildMppQuote(\n input.challenge,\n input.request ?? this.snapshotX402Request(input.challenge.resource),\n input.idempotencyKey,\n )\n\n return {\n rail: 'mpp',\n paymentRail: quote.paymentRail,\n paymentId: input.paymentId,\n idempotencyKey: quote.idempotencyKey,\n challenge: input.challenge,\n url: input.request?.url ?? input.challenge.resource,\n request: input.request,\n resourceUrl: quote.resourceUrl,\n description: quote.description,\n amountAtomic: quote.amountAtomic,\n amount: quote.amount,\n token: quote.token,\n asset: quote.asset,\n network: quote.network,\n chainId: quote.chainId,\n merchantAddress: quote.merchantAddress,\n expiresAt: quote.expiresAt,\n }\n }\n\n private attachResumeState(\n err: unknown,\n input:\n | {\n rail: 'x402'\n paymentRequired: X402PaymentRequired\n accepted: X402PaymentOption\n idempotencyKey: string\n request?: X402RequestSnapshot\n }\n | {\n rail: 'mpp'\n challenge: MachinePaymentChallenge\n idempotencyKey: string\n request?: X402RequestSnapshot\n },\n ): void {\n if (input.rail === 'x402') {\n this.attachX402ResumeState(\n err,\n input.paymentRequired,\n input.accepted,\n input.idempotencyKey,\n input.request,\n )\n return\n }\n\n this.attachMppResumeState(err, input.challenge, input.idempotencyKey, input.request)\n }\n\n private attachX402ResumeState(\n err: unknown,\n paymentRequired: X402PaymentRequired,\n accepted: X402PaymentOption,\n idempotencyKey: string,\n request?: X402RequestSnapshot,\n ): void {\n if (!(err instanceof HavenPaymentStateError)) return\n if (err.state.rail !== 'x402') return\n\n err.resumeState = this.buildX402ResumeState({\n paymentId: err.state.paymentId,\n paymentRequired,\n accepted,\n idempotencyKey,\n request,\n })\n }\n\n private attachMppResumeState(\n err: unknown,\n challenge: MachinePaymentChallenge,\n idempotencyKey: string,\n request?: X402RequestSnapshot,\n ): void {\n if (!(err instanceof HavenPaymentStateError)) return\n if (!isMppRail(err.state.rail)) return\n\n err.resumeState = this.buildMppResumeState({\n paymentId: err.state.paymentId,\n challenge,\n idempotencyKey,\n request,\n })\n }\n\n // ── Tool Execution (for agent frameworks) ────────────────────────\n\n /**\n * Execute a tool call by name and input.\n *\n * Designed to plug directly into agent tool-call handlers:\n *\n * ```ts\n * if (block.type === 'tool_use') {\n * const result = await haven.executeTool(block.name, block.input)\n * // send result back to the model\n * }\n * ```\n */\n async executeTool(\n toolName: string,\n input: Record<string, unknown>,\n ): Promise<Record<string, unknown>> {\n if (toolName === 'make_payment') {\n const { token, amount, to } = input as {\n token: string\n amount: string\n to: string\n }\n\n try {\n const result = await this.pay({ token, amount, to })\n return {\n success: result.status === 'confirmed',\n payment_id: result.paymentId,\n status: result.status,\n tx_hash: result.txHash,\n token: result.token,\n amount: result.amount,\n to: result.to,\n explorer_url: result.explorerUrl,\n error: result.errorMessage,\n }\n } catch (err) {\n return this.toolError(err)\n }\n }\n\n if (toolName === 'authorize_x402_payment') {\n const { url, payTo, amount, asset, network, description, idempotencyKey } = input as {\n url: string\n payTo: string\n amount: string\n asset: string\n network: string\n description?: string\n idempotencyKey?: string\n }\n\n try {\n const receipt = await this.authorizeX402(\n this.toolX402PaymentRequired({ url, payTo, amount, asset, network, description }),\n { idempotencyKey },\n )\n return this.x402ToolReceipt(receipt)\n } catch (err) {\n return this.toolError(err)\n }\n }\n\n if (toolName === 'resume_x402_payment') {\n const { payment_id, url, payTo, amount, asset, network, description, idempotencyKey } = input as {\n payment_id: string\n url: string\n payTo: string\n amount: string\n asset: string\n network: string\n description?: string\n idempotencyKey?: string\n }\n\n try {\n const receipt = await this.resumeAuthorizedX402({\n paymentId: payment_id,\n paymentRequired: this.toolX402PaymentRequired({ url, payTo, amount, asset, network, description }),\n idempotencyKey,\n })\n return this.x402ToolReceipt(receipt)\n } catch (err) {\n return this.toolError(err)\n }\n }\n\n if (toolName === 'authorize_machine_payment') {\n const { challenge, idempotencyKey } = input as {\n challenge: MachinePaymentChallenge\n idempotencyKey?: string\n }\n\n try {\n const receipt = await this.authorizeMachinePayment(challenge, { idempotencyKey })\n return {\n success: true,\n payment_id: receipt.paymentId,\n tx_hash: receipt.txHash,\n token: receipt.token,\n amount: receipt.amount,\n to: receipt.to,\n resource_url: receipt.resourceUrl,\n explorer_url: receipt.explorerUrl,\n proof_header: receipt.proofHeader,\n rail: receipt.rail,\n challenge_id: receipt.challengeId,\n payer: receipt.payer,\n chain_id: receipt.chainId,\n }\n } catch (err) {\n return this.toolError(err)\n }\n }\n\n if (toolName === 'get_payment_status') {\n const { payment_id } = input as { payment_id: string }\n const result = await this.getPaymentStatus(payment_id)\n return {\n payment_id: result.paymentId,\n kind: result.kind,\n rail: result.rail,\n status: result.status,\n phase: result.phase,\n next_action: result.nextAction,\n tx_hash: result.txHash,\n token: result.token,\n amount: result.amount,\n resource_url: result.resourceUrl,\n merchant_address: result.merchantAddress,\n amount_atomic: result.amountAtomic,\n asset: result.asset,\n network: result.network,\n description: result.description,\n idempotency_key: result.idempotencyKey,\n x402: result.x402,\n mpp: result.mpp,\n expires_at: result.expiresAt,\n chain_id: result.chainId,\n message: result.message,\n }\n }\n\n if (toolName === 'get_allowances') {\n return { ...await this.getAllowances() }\n }\n\n throw new Error(`Unknown tool: ${toolName}`)\n }\n\n private toolX402PaymentRequired(input: {\n url: string\n payTo: string\n amount: string\n asset: string\n network: string\n description?: string\n }): X402PaymentRequired {\n return {\n x402Version: 2,\n resource: { url: input.url, description: input.description },\n accepts: [\n {\n scheme: 'exact',\n network: input.network,\n amount: input.amount,\n asset: input.asset,\n payTo: input.payTo,\n maxTimeoutSeconds: 30,\n },\n ],\n }\n }\n\n private x402ToolReceipt(receipt: X402Receipt): Record<string, unknown> {\n return {\n success: true,\n payment_id: receipt.paymentId,\n tx_hash: receipt.txHash,\n token: receipt.token,\n amount: receipt.amount,\n to: receipt.to,\n resource_url: receipt.resourceUrl,\n explorer_url: receipt.explorerUrl,\n payment_header: receipt.paymentHeader,\n merchant_to: receipt.merchantTo,\n payer: receipt.payer,\n chain_id: receipt.chainId,\n haven: receipt.haven,\n merchant: receipt.merchant,\n x402: receipt.x402,\n }\n }\n\n private toolError(err: unknown): Record<string, unknown> {\n if (err instanceof HavenPaymentStateError) {\n return {\n success: false,\n payment_id: err.state.paymentId,\n kind: err.state.kind,\n rail: err.state.rail,\n status: err.state.status,\n phase: err.state.phase,\n next_action: err.state.nextAction,\n tx_hash: err.state.txHash,\n token: err.state.token,\n amount: err.state.amount,\n resource_url: err.state.resourceUrl,\n merchant_address: err.state.merchantAddress,\n amount_atomic: err.state.amountAtomic,\n asset: err.state.asset,\n network: err.state.network,\n description: err.state.description,\n idempotency_key: err.state.idempotencyKey,\n x402: err.state.x402\n ? {\n amount_atomic: err.state.x402.amountAtomic,\n asset: err.state.x402.asset,\n network: err.state.x402.network,\n resource_url: err.state.x402.resourceUrl,\n merchant_address: err.state.x402.merchantAddress,\n description: err.state.x402.description,\n idempotency_key: err.state.x402.idempotencyKey,\n }\n : undefined,\n mpp: err.state.mpp\n ? {\n amount_atomic: err.state.mpp.amountAtomic,\n asset: err.state.mpp.asset,\n network: err.state.mpp.network,\n resource_url: err.state.mpp.resourceUrl,\n merchant_address: err.state.mpp.merchantAddress,\n description: err.state.mpp.description,\n idempotency_key: err.state.mpp.idempotencyKey,\n challenge_id: err.state.mpp.challengeId,\n }\n : undefined,\n resume_state: err.resumeState,\n expires_at: err.state.expiresAt,\n chain_id: err.state.chainId,\n message: err.state.message,\n error: err.message,\n }\n }\n\n if (err instanceof HavenApiError) {\n return {\n success: false,\n status_code: err.statusCode,\n error: err.message,\n body: err.body,\n }\n }\n\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n }\n }\n\n // ── HTTP Helpers ─────────────────────────────────────────────────\n\n private async post<T>(path: string, body: Record<string, unknown>): Promise<T> {\n return this.request<T>('POST', path, body)\n }\n\n private async get<T>(path: string): Promise<T> {\n return this.request<T>('GET', path)\n }\n\n private async request<T>(\n method: 'GET' | 'POST',\n path: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), this.requestTimeout)\n\n try {\n const contextHeaders = this.requestContext.getStore()?.headers ?? {}\n const res = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.apiKey}`,\n ...this.defaultHeaders,\n ...contextHeaders,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n })\n\n const data = await res.json()\n\n if (!res.ok) {\n const message =\n (data as Record<string, unknown>).error as string\n ?? (data as Record<string, unknown>).details as string\n ?? `API request failed`\n throw new HavenApiError(message, res.status, data)\n }\n\n return data as T\n } catch (err) {\n if (err instanceof HavenApiError) throw err\n if (err instanceof Error && err.name === 'AbortError') {\n throw new HavenApiError(`Request to ${path} timed out`, 408)\n }\n throw new HavenApiError(\n `Request to ${path} failed: ${err instanceof Error ? err.message : String(err)}`,\n 0,\n )\n } finally {\n clearTimeout(timeout)\n }\n }\n\n // ── Mapping Helpers ──────────────────────────────────────────────\n\n private mapPaymentResult(raw: RawStatusResponse): PaymentResult {\n return {\n paymentId: raw.payment_id,\n status: raw.status as PaymentStatus,\n token: raw.token,\n amount: raw.amount,\n to: raw.to,\n txHash: raw.tx_hash,\n errorMessage: raw.error_message,\n explorerUrl: raw.explorer_url ?? (raw.tx_hash ? buildExplorerUrl(raw.chain_id, raw.tx_hash) : null),\n createdAt: raw.created_at,\n signedAt: raw.signed_at,\n submittedAt: raw.submitted_at,\n confirmedAt: raw.confirmed_at,\n expiresAt: raw.expires_at,\n }\n }\n\n private mapPaymentStatusResult(raw: RawPaymentStatusResult): PaymentStatusResult {\n return {\n paymentId: raw.payment_id,\n kind: raw.kind,\n rail: raw.rail,\n status: raw.status,\n phase: raw.phase,\n nextAction: raw.next_action,\n amount: raw.amount,\n token: raw.token,\n resourceUrl: raw.resource_url,\n merchantAddress: raw.merchant_address,\n txHash: raw.tx_hash,\n expiresAt: raw.expires_at,\n chainId: raw.chain_id,\n message: raw.message,\n amountAtomic: raw.amount_atomic ?? raw.x402?.amount_atomic ?? null,\n asset: raw.asset ?? raw.x402?.asset ?? null,\n network: raw.network ?? raw.x402?.network ?? null,\n description: raw.description ?? raw.x402?.description ?? null,\n idempotencyKey: raw.idempotency_key ?? raw.x402?.idempotency_key ?? null,\n x402: raw.x402\n ? {\n amountAtomic: raw.x402.amount_atomic ?? raw.amount_atomic ?? null,\n asset: raw.x402.asset ?? raw.asset ?? null,\n network: raw.x402.network ?? raw.network ?? null,\n resourceUrl: raw.x402.resource_url ?? raw.resource_url,\n merchantAddress: raw.x402.merchant_address ?? raw.merchant_address,\n description: raw.x402.description ?? raw.description ?? null,\n idempotencyKey: raw.x402.idempotency_key ?? raw.idempotency_key ?? null,\n }\n : undefined,\n }\n }\n\n private mapPaymentReceipt(raw: RawHavenPaymentReceipt): HavenPaymentReceipt {\n const receipt: HavenPaymentReceipt = {\n id: raw.id,\n paymentId: raw.payment_id,\n rail: raw.rail,\n proofStatus: raw.proof_status,\n txHash: raw.tx_hash,\n chainId: raw.chain_id,\n resourceUrl: raw.resource_url,\n merchantAddress: raw.merchant_address,\n payerAddress: raw.payer_address,\n settlementAddress: raw.settlement_address,\n tokenSymbol: raw.token_symbol,\n tokenAddress: raw.token_address,\n amountRaw: raw.amount_raw,\n amount: raw.amount_human,\n challengeId: raw.challenge_id,\n idempotencyKey: raw.idempotency_key,\n challengePayload: raw.challenge_payload,\n selectedPayment: raw.selected_payment,\n paymentProofHeaderName: raw.payment_proof_header_name,\n protocolReceiptHeaderName: raw.protocol_receipt_header_name,\n protocolReceiptPayload: raw.protocol_receipt_payload,\n merchantStatus: raw.merchant_status,\n confirmedAt: raw.confirmed_at,\n createdAt: raw.created_at,\n updatedAt: raw.updated_at,\n }\n\n if ('payment_intent_id' in raw) {\n receipt.paymentIntentId = raw.payment_intent_id ?? null\n }\n if ('approval_request_id' in raw) {\n receipt.approvalRequestId = raw.approval_request_id ?? null\n }\n\n return receipt\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction getPaymentHeaderValidBefore(paymentHeader: string): number {\n try {\n const payment = decodeBase64Json<{ payload?: { authorization?: { validBefore?: string } } }>(\n paymentHeader,\n )\n const payload = payment.payload as { authorization?: { validBefore?: string } }\n const validBeforeSeconds = Number(payload.authorization?.validBefore)\n if (Number.isFinite(validBeforeSeconds)) return validBeforeSeconds * 1000\n } catch {\n // If the header cannot be decoded, skip caching rather than hiding errors.\n }\n\n return 0\n}\n\nfunction decodeBase64Json<T>(value: string): T {\n return JSON.parse(atob(value)) as T\n}\n\nfunction parseProtocolReceiptHeader(value: string): Record<string, unknown> | undefined {\n try {\n return JSON.parse(atob(value)) as Record<string, unknown>\n } catch {\n try {\n return JSON.parse(value) as Record<string, unknown>\n } catch {\n return undefined\n }\n }\n}\n\nasync function responseSnippet(response: Response): Promise<string | null> {\n try {\n const text = await response.clone().text()\n return text.slice(0, 1000) || null\n } catch {\n return null\n }\n}\n","/**\n * Shared semantic descriptions for Haven agent payment tools.\n *\n * Two surfaces in this repo expose Haven as a tool: the Claude / OpenAI\n * function-calling tool definitions in `tools.ts` (used for direct SDK\n * integrations) and the MCP server in `packages/mcp` (used by any MCP-speaking\n * agent runtime). The two surfaces use different tool *names* — the SDK's\n * tools are tuned for tool-calling conventions (`make_payment`,\n * `authorize_x402_payment`); the MCP tools follow the MCP `haven_*` naming\n * (`haven_pay_x402_quote`).\n *\n * The underlying *operations* are the same, so the descriptive prose should\n * live in one place. Both surfaces import from this module and compose their\n * own tool descriptions from these semantic fragments. Drift is caught by\n * tests asserting each consumer's description string contains the shared\n * `summary` from this module.\n */\n\nexport interface ToolDescription {\n /** One-line summary of the operation. Used as the first sentence of every\n * downstream description and as a stable substring for drift tests. */\n summary: string\n /** Natural-language user intents that should make an agent prefer this\n * tool over adjacent tools. Empty or omitted when the summary is enough. */\n selectionGuidance?: string\n /** Concrete behaviour the tool performs end-to-end, including which\n * non-custodial guarantee applies. */\n behavior: string\n /** What the agent should do next on error / pending-approval states.\n * Empty string if not applicable. */\n nextActionGuidance: string\n}\n\n/**\n * Build a single description string from the three fragments. Joined with\n * spaces so consumers can split on the summary substring if they need to.\n */\nexport function composeDescription(d: ToolDescription): string {\n return [d.summary, d.selectionGuidance, d.behavior, d.nextActionGuidance]\n .filter(Boolean)\n .join(' ')\n}\n\nexport const toolDescriptions = {\n quoteX402: {\n summary:\n 'Inspect an HTTP 402 x402 paid resource without creating a Haven payment, signature, approval, or on-chain transaction.',\n behavior:\n 'Probes the merchant directly and parses the 402 response. Pure read-only client behavior — Haven is not contacted.',\n nextActionGuidance:\n 'On success the returned quote is the input to haven_pay_x402_quote. Do not call the merchant again — Haven re-uses the captured request when paying.',\n },\n payX402: {\n summary:\n 'Pay an inspected x402 quote. The delegate key signs locally; Haven only validates and relays signed, on-chain-constrained payment transactions.',\n selectionGuidance:\n 'Do not use this for read-only allowance, budget, spend-limit, remaining-amount, reset-period, or what-can-I-spend questions; use the allowance lookup tool instead.',\n behavior:\n 'Signs the EIP-3009 payment from the delegate wallet, asks Haven for a Safe AllowanceModule top-up if needed, and returns the merchant response or a pending-approval state.',\n nextActionGuidance:\n 'If approval is needed, preserve the returned resume_state and wait for nextAction=retry_original_x402_request before resuming. ' +\n 'If the response carries phase=insufficient_funds and nextAction=fund_safe_or_raise_allowance, the payment cannot be retried until the originating Safe is funded or the agent allowance raised — stop and tell the user the shortfall reported on the response.',\n },\n payX402OneShot: {\n summary:\n 'Fetch an x402 paid HTTP resource in a single call. Handles the full probe -> pay -> retry round trip and returns the merchant response.',\n selectionGuidance:\n 'Prefer this over the quote+pay split when the agent just wants the paid resource and does not need to inspect the price first. If you already have a quote from haven_quote_x402, use haven_pay_x402_quote instead. Do not use for read-only allowance, budget, spend-limit, remaining-amount, reset-period, or what-can-I-spend questions; use the allowance lookup tool instead.',\n behavior:\n 'Calls the URL, parses any HTTP 402 x402 challenge, signs the EIP-3009 payment from the delegate wallet, asks Haven for a Safe AllowanceModule top-up if needed, then retries the original request with the X-PAYMENT header and returns the merchant response. If the resource returns an MPP machine-payment challenge instead of standard x402, the MPP payment path is used automatically. If the resource returns a non-402 status, returns it unchanged without contacting Haven.',\n nextActionGuidance:\n 'If approval is needed, preserve the returned resume_state or paymentId and call the resume tool once nextAction=retry_original_x402_request. ' +\n 'If the response carries phase=insufficient_funds and nextAction=fund_safe_or_raise_allowance, the payment cannot be retried until the originating Safe is funded or the agent allowance raised — stop and tell the user the shortfall reported on the response.',\n },\n resumeX402: {\n summary:\n 'Resume an x402 payment after the Haven wallet owner approved the funding step.',\n behavior:\n 'Accepts either resume_state or payment_id, validates the original x402 details against the approved Haven funding, and retries the merchant request with the X-PAYMENT header. No new Haven approval is created.',\n nextActionGuidance:\n 'Only use when get_payment_status returns nextAction=retry_original_x402_request; do not start a new merchant session.',\n },\n quoteMpp: {\n summary:\n 'Inspect a Haven MPP challenge or paid MPP URL without creating a Haven payment, signature, approval, or on-chain transaction.',\n behavior:\n 'Parses an MPP challenge envelope and returns a typed quote with rail tag, amount, asset, and merchant context. Pure read-only — Haven is not contacted.',\n nextActionGuidance:\n 'On success the returned quote is the input to haven_pay_mpp_challenge. Do not call the merchant again — Haven re-uses the captured request when paying.',\n },\n payMpp: {\n summary:\n 'Pay an inspected MPP challenge. The delegate key signs locally; Haven only validates and relays signed, on-chain-constrained payment transactions.',\n selectionGuidance:\n 'Do not use this for read-only allowance, budget, spend-limit, remaining-amount, reset-period, or what-can-I-spend questions; use the allowance lookup tool instead.',\n behavior:\n 'Authorizes the payment through Haven within the on-chain allowance, signs the challenge proof, and returns the proof header for retrying the original paid resource.',\n nextActionGuidance:\n 'If approval is needed, preserve resume_state or payment_id and wait for nextAction=retry_original_x402_request before resuming.',\n },\n resumeMpp: {\n summary:\n 'Resume an MPP payment after the Haven wallet owner approved the funding step.',\n behavior:\n 'Accepts either resume_state or payment_id and retries the original paid resource with the MPP proof header. No new Haven approval is created.',\n nextActionGuidance: '',\n },\n getPaymentStatus: {\n summary:\n 'Fetch structured Haven payment status, including phase and nextAction taxonomy for agent recovery.',\n behavior:\n 'Accepts a payment intent or approval request id and returns the full state taxonomy (phase, nextAction, rail, amount, merchant, resource url, idempotency key, message).',\n nextActionGuidance: '',\n },\n getResumeState: {\n summary:\n 'Rehydrate stored x402 or MPP resume_state by payment_id.',\n behavior:\n 'Returns the context that the agent originally received in a pending-approval response, reconstructed from Haven\\'s database. This is context only; signing still happens locally when a resume tool is called.',\n nextActionGuidance: '',\n },\n getAgent: {\n summary:\n 'Return the authenticated agent identity, Haven wallet, delegate address, chain, and status.',\n behavior:\n 'Read-only identity lookup. Useful for verifying which on-chain Safe and delegate the credential is bound to.',\n nextActionGuidance: '',\n },\n getAllowances: {\n summary:\n 'Return configured and on-chain allowance state for the authenticated agent. On-chain allowance is the real spend gate.',\n selectionGuidance:\n 'Use this when the user asks about allowance, budget, spend limit, remaining amount, remaining allowance, remaining budget, daily limit, reset period, what can I spend, or what the agent can still spend.',\n behavior:\n 'Reads the Safe AllowanceModule snapshot per token (allowance, spent, remaining, reset window). Configured amounts from Haven are returned alongside the on-chain truth.',\n nextActionGuidance: '',\n },\n listReceipts: {\n summary:\n 'List recent machine-payment receipts and evidence for bookkeeping.',\n selectionGuidance:\n 'Use this for transaction history, receipts, payment evidence, or bookkeeping; use the allowance tool instead for remaining allowance, budget, spend-limit, or what-can-I-spend questions.',\n behavior:\n 'Returns the agent\\'s recent machine-payment receipts ordered by recency. Proof header values are not returned.',\n nextActionGuidance: '',\n },\n} as const satisfies Record<string, ToolDescription>\n\nexport type SharedToolKey = keyof typeof toolDescriptions\n","/**\n * Pre-built tool definitions for AI agent frameworks.\n *\n * These definitions describe Haven's direct SDK tool-calling surface in the\n * formats expected by Claude (Anthropic) and OpenAI.\n *\n * The agent payment surface used by these tools is shared with the\n * `@haven_ai/mcp` server — both consume `toolDescriptions` from\n * `./tool-descriptions.ts`. Each consumer composes its own user-visible string\n * from the same semantic fragments, so guidance lands in both surfaces at\n * once and a downstream test asserts the shared summary appears in every\n * consumer description.\n *\n * Usage with Claude:\n * const response = await anthropic.messages.create({\n * tools: havenTools.claude(),\n * ...\n * })\n *\n * Usage with OpenAI:\n * const response = await openai.chat.completions.create({\n * tools: havenTools.openai(),\n * ...\n * })\n */\n\nimport { composeDescription, toolDescriptions as sharedDescriptions } from './tool-descriptions.js'\n\n// ── JSON Schema (shared across formats) ──────────────────────────\n\nconst makePaymentSchema = {\n type: 'object' as const,\n properties: {\n token: {\n type: 'string' as const,\n description: 'Token to send. Gnosis Chain: EURe, USDC.e, xDAI. Base: USDC, ETH.',\n },\n amount: {\n type: 'string' as const,\n description: 'Amount to send as a decimal string, e.g. \"5.00\"',\n },\n to: {\n type: 'string' as const,\n description: 'Recipient Ethereum address (0x...)',\n },\n reason: {\n type: 'string' as const,\n description: 'Brief reason for this payment (for audit trail)',\n },\n },\n required: ['token', 'amount', 'to', 'reason'] as const,\n}\n\nconst getPaymentStatusSchema = {\n type: 'object' as const,\n properties: {\n payment_id: {\n type: 'string' as const,\n description: 'The payment ID returned from make_payment',\n },\n },\n required: ['payment_id'] as const,\n}\n\nconst getAllowancesSchema = {\n type: 'object' as const,\n properties: {},\n required: [] as const,\n}\n\nconst authorizeX402Schema = {\n type: 'object' as const,\n properties: {\n url: {\n type: 'string' as const,\n description: 'The URL that returned HTTP 402',\n },\n payTo: {\n type: 'string' as const,\n description: 'Payment recipient address from the 402 response',\n },\n amount: {\n type: 'string' as const,\n description: 'Payment amount in atomic units (e.g. \"1000000\" for 1 USDC)',\n },\n asset: {\n type: 'string' as const,\n description: 'Token contract address from the 402 response',\n },\n network: {\n type: 'string' as const,\n description: 'CAIP-2 chain ID. \"eip155:100\" for Gnosis Chain, \"eip155:8453\" for Base.',\n },\n description: {\n type: 'string' as const,\n description: 'Description of the resource being paid for',\n },\n idempotencyKey: {\n type: 'string' as const,\n description: 'Stable caller-supplied key for this user intent. Reuse it when resuming after user approval.',\n },\n },\n required: ['url', 'payTo', 'amount', 'asset', 'network'] as const,\n}\n\nconst resumeX402Schema = {\n type: 'object' as const,\n properties: {\n payment_id: {\n type: 'string' as const,\n description: 'The payment or approval request ID returned by authorize_x402_payment.',\n },\n url: {\n type: 'string' as const,\n description: 'The original URL that returned HTTP 402.',\n },\n payTo: {\n type: 'string' as const,\n description: 'Payment recipient address from the original 402 response.',\n },\n amount: {\n type: 'string' as const,\n description: 'Payment amount in atomic units from the original 402 response.',\n },\n asset: {\n type: 'string' as const,\n description: 'Token contract address from the original 402 response.',\n },\n network: {\n type: 'string' as const,\n description: 'CAIP-2 chain ID or x402 network from the original 402 response.',\n },\n description: {\n type: 'string' as const,\n description: 'Description of the resource being paid for.',\n },\n idempotencyKey: {\n type: 'string' as const,\n description: 'Stable caller-supplied key used for the original authorization.',\n },\n },\n required: ['payment_id', 'url', 'payTo', 'amount', 'asset', 'network'] as const,\n}\n\nconst authorizeMachinePaymentSchema = {\n type: 'object' as const,\n properties: {\n challenge: {\n type: 'object' as const,\n description: 'Machine payment challenge returned by a Haven demo endpoint',\n },\n },\n required: ['challenge'] as const,\n}\n\nconst MAKE_PAYMENT_DESCRIPTION =\n 'Request and sign a payment from the user-controlled Safe within approved on-chain limits. ' +\n 'For read-only allowance, budget, spend-limit, remaining-amount, or reset-period questions, use get_allowances instead of making a payment. ' +\n 'Haven authenticates the agent, validates the signed intent, and relays the Safe AllowanceModule transaction; it does not hold keys or control funds. ' +\n 'Gnosis Chain tokens: EURe, USDC.e, xDAI. Base tokens: USDC, ETH.'\n\n// Descriptions are composed from the shared semantic source so the SDK and MCP\n// surfaces stay in lockstep. Each constant prepends the shared `summary` (the\n// stable substring tests assert on) and then appends the SDK-specific guidance\n// for tool-calling consumers.\n\nconst GET_STATUS_DESCRIPTION =\n sharedDescriptions.getPaymentStatus.summary + ' ' +\n 'Accepts payment intent IDs and approval request IDs. Returns the current status, phase, next_action, transaction hash if available, and payment details.'\n\nconst GET_ALLOWANCES_DESCRIPTION = composeDescription(sharedDescriptions.getAllowances)\n\nconst AUTHORIZE_X402_DESCRIPTION =\n composeDescription(sharedDescriptions.payX402) + ' ' +\n 'In this SDK tool set, the allowance lookup tool is get_allowances. ' +\n 'When a paid API returns x402 payment requirements, use this tool to sign with the agent-owned delegate key and request a policy-limited Safe AllowanceModule top-up when needed. ' +\n 'Haven relays signed transactions only; the agent key authorizes payment and on-chain limits enforce spend. ' +\n 'If this returns pending_approval, tell the user it is waiting in Haven, preserve the original merchant/MCP session and x402 details, call get_payment_status later, and use resume_x402_payment only when next_action is retry_original_x402_request. Do not start a new merchant session or loop retries while approval is pending. ' +\n 'Use the returned payment_header as the X-PAYMENT header on the retry request when doing a manual HTTP retry.'\n\nconst RESUME_X402_DESCRIPTION =\n sharedDescriptions.resumeX402.summary + ' ' +\n 'Use this only after get_payment_status returns next_action=retry_original_x402_request. ' +\n 'It checks the approved payment, validates the original x402 details, and returns a merchant X-PAYMENT header without creating a new approval request or merchant session.'\n\nconst AUTHORIZE_MACHINE_PAYMENT_DESCRIPTION =\n composeDescription(sharedDescriptions.payMpp) + ' ' +\n 'In this SDK tool set, the allowance lookup tool is get_allowances. ' +\n 'Currently scoped to the internal MPP demo rail. ' +\n 'The agent signs the payment, Haven relays it within the on-chain allowance, and the tool returns a proof header for the retry request.'\n\n// ── Claude (Anthropic) format ────────────────────────────────────\n\nexport interface ClaudeTool {\n name: string\n description: string\n input_schema: {\n type: 'object'\n properties: Record<string, unknown>\n required: readonly string[]\n }\n}\n\nfunction claudeTools(): ClaudeTool[] {\n return [\n {\n name: 'make_payment',\n description: MAKE_PAYMENT_DESCRIPTION,\n input_schema: makePaymentSchema,\n },\n {\n name: 'get_payment_status',\n description: GET_STATUS_DESCRIPTION,\n input_schema: getPaymentStatusSchema,\n },\n {\n name: 'get_allowances',\n description: GET_ALLOWANCES_DESCRIPTION,\n input_schema: getAllowancesSchema,\n },\n {\n name: 'authorize_x402_payment',\n description: AUTHORIZE_X402_DESCRIPTION,\n input_schema: authorizeX402Schema,\n },\n {\n name: 'resume_x402_payment',\n description: RESUME_X402_DESCRIPTION,\n input_schema: resumeX402Schema,\n },\n {\n name: 'authorize_machine_payment',\n description: AUTHORIZE_MACHINE_PAYMENT_DESCRIPTION,\n input_schema: authorizeMachinePaymentSchema,\n },\n ]\n}\n\n// ── OpenAI format ────────────────────────────────────────────────\n\nexport interface OpenAITool {\n type: 'function'\n function: {\n name: string\n description: string\n parameters: {\n type: 'object'\n properties: Record<string, unknown>\n required: readonly string[]\n }\n }\n}\n\nfunction openaiTools(): OpenAITool[] {\n return [\n {\n type: 'function',\n function: {\n name: 'make_payment',\n description: MAKE_PAYMENT_DESCRIPTION,\n parameters: makePaymentSchema,\n },\n },\n {\n type: 'function',\n function: {\n name: 'get_payment_status',\n description: GET_STATUS_DESCRIPTION,\n parameters: getPaymentStatusSchema,\n },\n },\n {\n type: 'function',\n function: {\n name: 'get_allowances',\n description: GET_ALLOWANCES_DESCRIPTION,\n parameters: getAllowancesSchema,\n },\n },\n {\n type: 'function',\n function: {\n name: 'authorize_x402_payment',\n description: AUTHORIZE_X402_DESCRIPTION,\n parameters: authorizeX402Schema,\n },\n },\n {\n type: 'function',\n function: {\n name: 'resume_x402_payment',\n description: RESUME_X402_DESCRIPTION,\n parameters: resumeX402Schema,\n },\n },\n {\n type: 'function',\n function: {\n name: 'authorize_machine_payment',\n description: AUTHORIZE_MACHINE_PAYMENT_DESCRIPTION,\n parameters: authorizeMachinePaymentSchema,\n },\n },\n ]\n}\n\n// ── Public API ───────────────────────────────────────────────────\n\nexport const havenTools = {\n /** Tool definitions in Anthropic/Claude format */\n claude: claudeTools,\n\n /** Tool definitions in OpenAI function-calling format */\n openai: openaiTools,\n}\n"]}
|