@inflowpayai/x402-buyer 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +129 -0
- package/dist/index.cjs +592 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +427 -0
- package/dist/index.d.ts +427 -0
- package/dist/index.js +576 -0
- package/dist/index.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/_foundation-bridge.ts","../src/signer.ts","../src/inflow-client.ts","../src/decode-evm-key.ts","../src/decode-solana-key.ts"],"names":["InflowHttpClient","EXTENSION_REGISTRY","validatePaymentId","x402Client","extensions","getExtension","setExtension","bs58"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { TransactionStatus } from './types.js';\n\n/**\n * Thrown by `awaitPayload` when the server moves the approval out of `'INITIATED'` without producing an\n * `encodedPayload` — the server has decided not to sign (insufficient funds, user-rejected, internal error, etc.). The\n * terminal `status` string is surfaced verbatim so callers can branch on it without the SDK having to enumerate every\n * server-side failure state.\n */\nexport class X402ApprovalFailedError extends Error {\n /** The approval id the server returned from `POST /v1/transactions/x402`. */\n readonly approvalId: string;\n /** Terminal status reported by the server. */\n readonly status: TransactionStatus;\n\n /**\n * @param approvalId - Server-issued approval id.\n * @param status - Terminal status string from the polling response.\n */\n constructor(approvalId: string, status: TransactionStatus) {\n super(`Approval ${approvalId} terminated as ${status} with no payload`);\n this.name = 'X402ApprovalFailedError';\n this.approvalId = approvalId;\n this.status = status;\n }\n}\n\n/**\n * Thrown by `awaitPayload` when `cancel()` is called on the same `PreparedPayment`. The cancel is fire-and-forget\n * against the server; the SDK exits the polling loop immediately and never returns the partially-fetched state to the\n * caller.\n */\nexport class X402ApprovalCancelledError extends Error {\n /** The approval id the server returned from `POST /v1/transactions/x402`. */\n readonly approvalId: string;\n\n constructor(approvalId: string) {\n super(`Approval ${approvalId} cancelled by caller`);\n this.name = 'X402ApprovalCancelledError';\n this.approvalId = approvalId;\n }\n}\n\n/**\n * Thrown by `awaitPayload` when wall-clock exceeds `timeoutMs` or the caller's `signal` aborts before the server has\n * signed.\n */\nexport class X402ApprovalTimeoutError extends Error {\n /** The approval id the server returned from `POST /v1/transactions/x402`. */\n readonly approvalId: string;\n /** Effective timeout in milliseconds. */\n readonly timeoutMs: number;\n\n /**\n * @param approvalId - Server-issued approval id.\n * @param timeoutMs - The configured timeout that elapsed.\n */\n constructor(approvalId: string, timeoutMs: number) {\n super(`Approval ${approvalId} not signed within ${String(timeoutMs)}ms`);\n this.name = 'X402ApprovalTimeoutError';\n this.approvalId = approvalId;\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Thrown by `prepare()` / `sign()` when `SignOptions.paymentId` does not satisfy the `payment-identifier` extension's\n * format rules (16–128 chars, `^[a-zA-Z0-9_-]+$`). Surfaced client-side before any server round trip.\n */\nexport class X402PaymentIdFormatError extends Error {\n /** The offending input. */\n readonly input: string;\n\n /** @param input - The {@link SignOptions.paymentId} value that failed validation. */\n constructor(input: string) {\n // JSON.stringify wraps in double quotes and escapes embedded quotes / backslashes / control chars, so an input\n // like `foo\"bar` produces an unambiguous, copy-pasteable message instead of `Invalid paymentId \"foo\"bar\";...`.\n super(`Invalid paymentId ${JSON.stringify(input)}; must be 16-128 chars matching ^[a-zA-Z0-9_-]+$`);\n this.name = 'X402PaymentIdFormatError';\n this.input = input;\n }\n}\n\n/**\n * Thrown by {@link InflowClient.prepareInflowPayment} when the caller asks the two-phase flow for a requirement the\n * InFlow signer cannot sign. The two-phase flow only exists for InFlow-signed requirements; foundation-signed schemes\n * have no equivalent.\n */\nexport class X402AdapterRoutingError extends Error {\n /** Scheme of the requirement the adapter could not route. */\n readonly scheme: string;\n /** Network of the requirement the adapter could not route. */\n readonly network: string;\n\n /**\n * @param scheme - Scheme of the offending requirement.\n * @param network - Network of the offending requirement.\n */\n constructor(scheme: string, network: string) {\n super(\n `InflowClient cannot route requirement (scheme: \"${scheme}\", network: \"${network}\"): ` +\n `not in the InFlow buyer capability cache and no two-phase flow exists for foundation-signed schemes`,\n );\n this.name = 'X402AdapterRoutingError';\n this.scheme = scheme;\n this.network = network;\n }\n}\n\n/**\n * Thrown by `parseEvmPrivateKey` when the input cannot be normalized to a 32-byte secp256k1 secret. The accepted input\n * forms are `0x`-prefixed hex, bare hex, and InFlow's Java `Hex.encodeHexString(BigInteger.toByteArray())` seed\n * (including the 33-byte sign-byte and sub-32-byte leading-zero-stripped shapes).\n *\n * The raw input is intentionally **not** preserved on the error: a decoding failure can be the user pasting a real key\n * in the wrong encoding (e.g. a Solana base58 secret into the EVM decoder), so the offending value is treated as\n * potential cryptographic material. Use {@link X402InvalidEvmKeyError.reason} for diagnostics; never log the input.\n */\nexport class X402InvalidEvmKeyError extends Error {\n /** Why the input failed validation. Never contains key bytes. */\n readonly reason: string;\n\n /**\n * @param reason - Short explanation appended to the error message. Must not contain the raw input — produce a length\n * / shape description instead (e.g. `'expected 32 bytes, got 31'`).\n */\n constructor(reason: string) {\n super(`Invalid EVM private key: ${reason}`);\n this.name = 'X402InvalidEvmKeyError';\n this.reason = reason;\n }\n}\n\n/**\n * Thrown by `decodeSolanaSecret` when the input cannot be decoded to a 64-byte Ed25519 secret key. Accepted input forms\n * are a base58 string (matches InFlow's `SolanaClient.Account.getSeed()` and Phantom's export) or a JSON byte array\n * (matches `solana-keygen`'s output file).\n *\n * The raw input is intentionally **not** preserved on the error: a decoding failure can be the user pasting a real key\n * in the wrong encoding (e.g. a base58 secret with one character mistyped), so the offending value is treated as\n * potential cryptographic material. Use {@link X402InvalidSolanaKeyError.reason} for diagnostics; never log the input.\n */\nexport class X402InvalidSolanaKeyError extends Error {\n /** Why the input failed validation. Never contains key bytes. */\n readonly reason: string;\n\n /**\n * @param reason - Short explanation appended to the error message. Must not contain the raw input — produce a length\n * / shape description instead (e.g. `'expected 64 bytes, got 32'`).\n */\n constructor(reason: string) {\n super(\n `Invalid Solana private key: ${reason}. ` +\n 'Expected a 64-byte Ed25519 secret key, supplied either as a base58 string ' +\n '(matches InFlow SolanaClient.Account.getSeed()) or a JSON byte array ' +\n '(matches solana-keygen).',\n );\n this.name = 'X402InvalidSolanaKeyError';\n this.reason = reason;\n }\n}\n","import type {\n PaymentPayload as FoundationPaymentPayload,\n PaymentRequirements as FoundationPaymentRequirements,\n} from '@x402/core/types';\nimport type { InflowPaymentPayload, PaymentRequirements } from '@inflowpayai/x402';\n\n/**\n * Single, documented type boundary between InFlow's widened wire types and the foundation's narrower ones. Concentrated\n * here so additions to the foundation shape upstream surface in one place rather than at scattered cast sites.\n *\n * Type asymmetry (runtime-equivalent in both directions; the casts encode that):\n *\n * - **InFlow → foundation is the lossy direction.** InFlow's `PaymentRequirements.extra` is optional; the foundation's is\n * required. InFlow's `PaymentRequirements.network` is the wider `string`; the foundation's is the CAIP-2 template\n * literal `${string}:${string}`. Going InFlow → foundation requires `as unknown as` because TS can't see that an\n * absent `extra` is the empty record at runtime, or that an InFlow `network: string` is always CAIP-2 shaped in\n * practice.\n * - **Foundation → InFlow is the safe direction** and the implicit assignment compiles without a cast: foundation's\n * required `extra` is assignable to InFlow's optional one, and `${string}:${string}` is assignable to `string`.\n * `fromFoundationRequirements` exists only so the call site at `inflow-client.ts:createPaymentPayload` reads\n * symmetrically against the InFlow → foundation direction.\n *\n * Per AGENTS.md §Conventions: `as unknown as` lives at documented type boundaries; this module is the documented\n * boundary for the buyer side.\n *\n * @internal\n */\n\n/** Foundation `PaymentRequirements[]` → InFlow `readonly PaymentRequirements[]`. Safe direction; no cast needed. */\nexport function fromFoundationRequirements(\n r: readonly FoundationPaymentRequirements[],\n): readonly PaymentRequirements[] {\n return r;\n}\n\n/** InFlow `PaymentPayload` → foundation `PaymentPayload`. Lossy direction; safe under V2 wire shape. */\nexport function toFoundationPayload(p: InflowPaymentPayload): FoundationPaymentPayload {\n return p as unknown as FoundationPaymentPayload;\n}\n","import { InflowHttpClient } from '@inflowpayai/x402';\nimport type {\n InflowPaymentPayload,\n PaymentRequirements,\n PaymentScheme,\n X402BuyerSupportedResponse,\n} from '@inflowpayai/x402';\nimport { EXTENSION_REGISTRY, validatePaymentId } from '@inflowpayai/x402/extensions';\n\nimport {\n X402ApprovalCancelledError,\n X402ApprovalFailedError,\n X402ApprovalTimeoutError,\n X402PaymentIdFormatError,\n} from './errors.js';\nimport type {\n ApprovalStatus,\n EncodedPayment,\n InflowSigner,\n PreparedPayment,\n SignerOptions,\n SignOptions,\n SigningContext,\n TransactionStatus,\n X402PayloadResponse,\n X402TransactionResponse,\n} from './types.js';\n\nconst SUPPORTED_PATH = '/v1/transactions/x402-supported';\nconst TRANSACTIONS_PATH = '/v1/transactions/x402';\nconst APPROVAL_CANCEL_PATH = (id: string): string => `/v1/approvals/${id}/cancel`;\nconst TRANSACTION_X402_PATH = (id: string): string => `/v1/transactions/${id}/x402`;\n\nconst CACHE_TTL_MS = 60 * 60 * 1000;\nconst DEFAULT_POLL_INTERVAL_MS = 5000;\nconst DEFAULT_TIMEOUT_MS = 15 * 60 * 1000;\nconst DEFAULT_PREFER: readonly PaymentScheme[] = ['balance', 'exact'];\nconst APPROVAL_APPROVED: ApprovalStatus = 'APPROVED';\n\n/**\n * Async factory for {@link InflowSigner}. Primes the buyer-supported cache before resolving so `supports()` is honestly\n * synchronous. Implementation detail of {@link createInflowClient}; not re-exported from the package barrel.\n *\n * @internal\n */\nexport async function createInflowSigner(options: SignerOptions): Promise<InflowSigner> {\n const http = new InflowHttpClient(options);\n const prefer = options.prefer ?? DEFAULT_PREFER;\n const extensionsHandled: ReadonlySet<string> = new Set(EXTENSION_REGISTRY.keys());\n\n interface CacheEntry<T> {\n value: T | undefined;\n expiresAt: number;\n inFlight: Promise<T> | undefined;\n }\n const supportedCache: CacheEntry<X402BuyerSupportedResponse> = {\n value: undefined,\n expiresAt: 0,\n inFlight: undefined,\n };\n\n async function fetchSupported(): Promise<X402BuyerSupportedResponse> {\n const fresh = await http.get<X402BuyerSupportedResponse>(SUPPORTED_PATH);\n supportedCache.value = fresh;\n supportedCache.expiresAt = Date.now() + CACHE_TTL_MS;\n return fresh;\n }\n\n function getSupported(): Promise<X402BuyerSupportedResponse> {\n if (supportedCache.value !== undefined && Date.now() < supportedCache.expiresAt) {\n return Promise.resolve(supportedCache.value);\n }\n if (supportedCache.inFlight !== undefined) return supportedCache.inFlight;\n const inFlight = fetchSupported().finally(() => {\n supportedCache.inFlight = undefined;\n });\n supportedCache.inFlight = inFlight;\n return inFlight;\n }\n\n /**\n * Reissues the fetch and atomically swaps in the new value on success. The previously cached value remains live until\n * the refresh resolves, so a transient failure does not flip `supports()` to false.\n */\n function refreshSupported(): Promise<X402BuyerSupportedResponse> {\n if (supportedCache.inFlight !== undefined) return supportedCache.inFlight;\n const inFlight = fetchSupported().finally(() => {\n supportedCache.inFlight = undefined;\n });\n supportedCache.inFlight = inFlight;\n return inFlight;\n }\n\n function supports(requirement: PaymentRequirements): boolean {\n const cached = supportedCache.value;\n if (cached === undefined) return false;\n return cached.kinds.some((k) => k.scheme === requirement.scheme && k.network === requirement.network);\n }\n\n async function prepare(\n requirement: PaymentRequirements,\n context: SigningContext,\n callOptions?: SignOptions,\n ): Promise<PreparedPayment> {\n const merged = { ...options.signDefaults, ...callOptions };\n if (merged.paymentId !== undefined && !validatePaymentId(merged.paymentId)) {\n throw new X402PaymentIdFormatError(merged.paymentId);\n }\n const body = {\n accept: requirement,\n resource: context.resource,\n x402Version: context.x402Version,\n ...(merged.paymentId !== undefined ? { remotePaymentId: merged.paymentId } : {}),\n };\n // Retries disabled: `POST /v1/transactions/x402` is idempotent only when\n // the caller supplies a `remotePaymentId` (server-side `putIfAbsent`).\n // Without that, a transparent 5xx retry would create a second Approval\n // and Transaction while the first one ages out at the 15-min expiry.\n // The buyer signer's polling loop is itself the retry mechanism for the\n // approval-window patience; transport-level retry here would be unsafe.\n const created = await http.post<X402TransactionResponse>(TRANSACTIONS_PATH, body, {\n retries: 0,\n ...(merged.signal !== undefined ? { signal: merged.signal } : {}),\n });\n return makePreparedPayment(http, created, merged);\n }\n\n async function sign(\n requirement: PaymentRequirements,\n context: SigningContext,\n callOptions?: SignOptions,\n ): Promise<EncodedPayment> {\n const prepared = await prepare(requirement, context, callOptions);\n try {\n return await prepared.awaitPayload(callOptions);\n } catch (err) {\n // Fire-and-forget cancel; never let it mask the original error.\n void prepared.cancel();\n throw err;\n }\n }\n\n // Prime the supported cache before returning so `supports()` is honest.\n await fetchSupported();\n\n const signer: InflowSigner = {\n prefer,\n extensionsHandled,\n supports,\n sign,\n prepare,\n ready: () => Promise.resolve(),\n getSupported,\n refreshSupported,\n };\n return signer;\n}\n\n/**\n * Construct the {@link PreparedPayment} returned by `prepare()`. The `awaitPayload` polling loop is created lazily on\n * first call; concurrent callers share the same in-flight promise.\n */\nfunction makePreparedPayment(\n http: InflowHttpClient,\n created: X402TransactionResponse,\n preparedOptions: SignOptions,\n): PreparedPayment {\n let awaitInFlight: Promise<EncodedPayment> | undefined;\n let cancelled = false;\n // Signal fired by `cancel()` to break the polling loop immediately.\n const cancelController = new AbortController();\n\n function buildEncodedPayment(encodedPayload: string, paymentPayload: InflowPaymentPayload): EncodedPayment {\n return { encodedPayload, paymentPayload, transactionId: created.transactionId };\n }\n\n async function pollOnce(signal?: AbortSignal): Promise<X402PayloadResponse> {\n return http.get<X402PayloadResponse>(TRANSACTION_X402_PATH(created.transactionId), {\n retries: 0,\n ...(signal !== undefined ? { signal } : {}),\n });\n }\n\n async function awaitPayload(callOptions?: SignOptions): Promise<EncodedPayment> {\n if (cancelled) {\n throw new X402ApprovalCancelledError(created.approvalId);\n }\n if (awaitInFlight !== undefined) return awaitInFlight;\n const merged: SignOptions = { ...preparedOptions, ...callOptions };\n const pollIntervalMs = merged.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const timeoutMs = merged.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const callerSignal = merged.signal;\n // The poll loop honours an abort from either the caller or `cancel()`.\n const signal = composeSignals(callerSignal, cancelController.signal);\n const promise = runPollLoop({\n pollOnce,\n buildEncodedPayment,\n approvalId: created.approvalId,\n pollIntervalMs,\n timeoutMs,\n signal,\n // Short-circuit for the synchronous-approval path: when the server\n // signed during `POST /v1/transactions/x402` (approvalStatus = APPROVED),\n // the very first GET should already have the payload; the loop is\n // still robust to a missed first poll.\n createdApprovalStatus: created.approvalStatus,\n }).catch((err: unknown) => {\n if (cancelled) {\n throw new X402ApprovalCancelledError(created.approvalId);\n }\n throw err;\n });\n awaitInFlight = promise;\n promise.catch(() => {\n // Reset in-flight on rejection so a retry re-enters the loop instead\n // of replaying the same rejection.\n awaitInFlight = undefined;\n });\n return promise;\n }\n\n async function statusFn(): Promise<TransactionStatus> {\n const payload = await pollOnce();\n return payload.status;\n }\n\n async function cancel(): Promise<void> {\n // Client-side cancel: flip the flag and abort the poll loop *before*\n // touching the network. Any in-flight `awaitPayload()` rejects with\n // `X402ApprovalCancelledError` immediately. The server cancel is\n // fire-and-forget — errors never surface to the caller.\n cancelled = true;\n cancelController.abort();\n try {\n await http.post(APPROVAL_CANCEL_PATH(created.approvalId), undefined, { retries: 0 });\n } catch {\n // swallow\n }\n }\n\n return {\n transactionId: created.transactionId,\n approvalId: created.approvalId,\n awaitPayload,\n status: statusFn,\n cancel,\n };\n}\n\n/**\n * Single `AbortSignal` fired when any of the inputs aborts. Uses native `AbortSignal.any` on Node 20.3+; falls back to\n * a manual fan-in otherwise.\n */\nfunction composeSignals(...signals: (AbortSignal | undefined)[]): AbortSignal {\n const live = signals.filter((s): s is AbortSignal => s !== undefined);\n // Fast path for the single-signal case so the caller observes that signal's `.reason` unchanged. Avoids the\n // `live[0]!` non-null assertion AGENTS.md §Conventions prohibits — under `noUncheckedIndexedAccess`, indexed\n // access on the filtered array still types as `AbortSignal | undefined`.\n const [first, ...rest] = live;\n if (first !== undefined && rest.length === 0) return first;\n // Prefer native `AbortSignal.any` (Node 20.3+); fall back to a manual fan-in. The single-level cast lets the\n // feature detect typecheck without reaching for `as unknown as`.\n const anyFn = (AbortSignal as { any?: (s: AbortSignal[]) => AbortSignal }).any;\n if (typeof anyFn === 'function') return anyFn(live);\n // Manual fan-in. When any input aborts, fire the controller and remove the listeners we added to the siblings —\n // otherwise the siblings hold references to a closure that's no longer useful, and a long-lived composed signal\n // would accumulate dead listeners on long-lived parents.\n const controller = new AbortController();\n const cleanups: Array<() => void> = [];\n const fire = (reason: unknown): void => {\n controller.abort(reason);\n for (const c of cleanups) c();\n };\n for (const s of live) {\n if (s.aborted) {\n fire(s.reason);\n return controller.signal;\n }\n const handler = (): void => fire(s.reason);\n s.addEventListener('abort', handler, { once: true });\n cleanups.push(() => s.removeEventListener('abort', handler));\n }\n return controller.signal;\n}\n\n/**\n * Poll loop core. Inspects `encodedPayload` presence first, then status: payload present → signed; status in\n * {@link TERMINAL_FAILURE_STATUSES} → failed; everything else → pending (including non-terminal statuses racing the\n * server's `encodedPayload` write). 5xx and network errors during a single poll are swallowed; the loop is itself the\n * retry mechanism.\n */\nasync function runPollLoop(input: {\n pollOnce: (signal?: AbortSignal) => Promise<X402PayloadResponse>;\n buildEncodedPayment: (encodedPayload: string, paymentPayload: InflowPaymentPayload) => EncodedPayment;\n approvalId: string;\n pollIntervalMs: number;\n timeoutMs: number;\n signal?: AbortSignal;\n createdApprovalStatus: ApprovalStatus;\n}): Promise<EncodedPayment> {\n const { pollOnce, buildEncodedPayment, approvalId, pollIntervalMs, timeoutMs, signal } = input;\n const startedAt = Date.now();\n const deadline = startedAt + timeoutMs;\n const isAborted = (): boolean => signal !== undefined && signal.aborted;\n\n if (isAborted()) {\n throw new X402ApprovalTimeoutError(approvalId, timeoutMs);\n }\n\n // Synchronous-approval path: skip the first sleep.\n let firstPoll = input.createdApprovalStatus === APPROVAL_APPROVED;\n\n while (Date.now() < deadline) {\n if (isAborted()) {\n throw new X402ApprovalTimeoutError(approvalId, timeoutMs);\n }\n let response: X402PayloadResponse | undefined;\n try {\n // Thread the caller signal so an in-flight GET aborts immediately on\n // caller cancel instead of running out the HTTP client's 30s default.\n response = await pollOnce(signal);\n } catch (err) {\n // If the abort fired, propagate as timeout/abort error instead of\n // silently sleeping and re-polling.\n if (signal !== undefined && signal.aborted) {\n throw new X402ApprovalTimeoutError(approvalId, timeoutMs);\n }\n void err;\n // 5xx / network error → swallow; sleep and retry.\n response = undefined;\n }\n if (response !== undefined) {\n const settled = evaluatePoll(response);\n if (settled === 'pending') {\n // Still INITIATED, or transitioned to a non-terminal/success state\n // whose `encodedPayload` write hasn't landed yet. Sleep and retry.\n } else if (settled === 'failed') {\n throw new X402ApprovalFailedError(approvalId, response.status);\n } else {\n // settled === 'signed' → response.encodedPayload && paymentPayload present.\n return buildEncodedPayment(response.encodedPayload as string, response.paymentPayload as InflowPaymentPayload);\n }\n }\n if (firstPoll) {\n firstPoll = false;\n continue;\n }\n await sleep(pollIntervalMs, signal);\n }\n throw new X402ApprovalTimeoutError(approvalId, timeoutMs);\n}\n\n/**\n * Terminal failure statuses produced by the InFlow `TransactionStatus` enum (see `inflow-server`\n * `datastore/local/TransactionStatus.java`). On any of these the poll loop rejects with `X402ApprovalFailedError`\n * without waiting for a payload — the payment will never settle.\n *\n * Any other status (`PENDING`, `PROCESSING`, success states racing the `encodedPayload` write) is treated as `pending`\n * so transient gaps between status flip and payload write don't poison the buyer.\n */\nconst TERMINAL_FAILURE_STATUSES: ReadonlySet<string> = new Set([\n 'DECLINED',\n 'EXPIRED',\n 'GENERAL_ERROR',\n 'INSUFFICIENT_FUNDS',\n]);\n\nfunction evaluatePoll(response: X402PayloadResponse): 'pending' | 'signed' | 'failed' {\n if (response.encodedPayload != null && response.paymentPayload != null) {\n return 'signed';\n }\n if (TERMINAL_FAILURE_STATUSES.has(response.status)) {\n return 'failed';\n }\n return 'pending';\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve) => {\n const timer = setTimeout(resolve, ms);\n if (signal !== undefined) {\n const onAbort = (): void => {\n clearTimeout(timer);\n resolve();\n };\n if (signal.aborted) {\n clearTimeout(timer);\n resolve();\n } else {\n signal.addEventListener('abort', onAbort, { once: true });\n }\n }\n });\n}\n","import { x402Client } from '@x402/core/client';\nimport type {\n AfterPaymentCreationHook,\n BeforePaymentCreationHook,\n ClientExtension,\n OnPaymentCreationFailureHook,\n OnPaymentResponseHook,\n PaymentPolicy,\n} from '@x402/core/client';\nimport type { Network, PaymentPayload, PaymentRequired, SchemeNetworkClient } from '@x402/core/types';\n\nimport type { InflowPaymentPayload, PaymentRequirements, PaymentScheme } from '@inflowpayai/x402';\nimport { EXTENSION_REGISTRY, getExtension, setExtension, type SignContext } from '@inflowpayai/x402/extensions';\n\nimport { X402AdapterRoutingError } from './errors.js';\nimport { fromFoundationRequirements, toFoundationPayload } from './_foundation-bridge.js';\nimport { createInflowSigner } from './signer.js';\nimport type { InflowSigner, PreparedPayment, SignerOptions, SignOptions, SigningContext } from './types.js';\n\n/**\n * Subclass of `@x402/core`'s `x402Client` that adds the InFlow MPC signing branch and the two-phase\n * {@link InflowClient.prepareInflowPayment} flow. Construct via {@link createInflowClient}.\n */\nexport class InflowClient extends x402Client {\n /**\n * The InFlow-signed branch of the routing decision. Kept private — callers compose by passing the {@link InflowClient}\n * to `x402HTTPClient` (and to `registerExactEvmScheme` / `registerExactSvmScheme` for foundation-signed networks).\n */\n private readonly inflowSigner: InflowSigner;\n /**\n * Ordered scheme preference used when picking among multiple InFlow-acceptable requirements. Sourced from the InFlow\n * signer at construction so the buyer's intent (`prefer: ['balance', 'exact']` by default) survives across the\n * override.\n */\n private readonly preferOrder: readonly PaymentScheme[];\n\n /**\n * Construct via {@link createInflowClient}. The factory primes the buyer capability cache before resolving, so the\n * routing decision in {@link InflowClient.createPaymentPayload} is synchronous against in-memory data. The constructor\n * is exported only so the class is referenceable for `instanceof` checks, generic constraints, and return types.\n *\n * @param inflowSigner - Primed InFlow signer carrying the buyer capability cache, MPC signing flow, and prefer order.\n * @internal\n */\n constructor(inflowSigner: InflowSigner) {\n super();\n this.inflowSigner = inflowSigner;\n this.preferOrder = inflowSigner.prefer;\n }\n\n /**\n * Routing override. InFlow signs when the buyer capability cache covers a requirement (preferred-scheme order);\n * otherwise the foundation signs and any registered extension handlers are folded into `payload.extensions`. A\n * `required: true` extension whose handler returns `null` throws.\n */\n override async createPaymentPayload(paymentRequired: PaymentRequired): Promise<PaymentPayload> {\n // All foundation/InFlow type translation goes through ./_foundation-bridge.ts; see that file for the rationale on\n // why these casts are safe under the V2 wire shape.\n const inflowMatch = this.pickInflowMatch(fromFoundationRequirements(paymentRequired.accepts));\n if (inflowMatch !== null) {\n const context: SigningContext = {\n resource: paymentRequired.resource,\n x402Version: paymentRequired.x402Version,\n ...(paymentRequired.extensions !== undefined ? { extensions: paymentRequired.extensions } : {}),\n };\n const result = await this.inflowSigner.sign(inflowMatch, context);\n return toFoundationPayload(result.paymentPayload);\n }\n const payload = await super.createPaymentPayload(paymentRequired);\n // Foundation PaymentPayload is structurally assignable to InflowPaymentPayload (foundation `payload: Record<string,\n // unknown>` is the catch-all branch of `InflowPaymentPayloadData`; foundation `network: ${string}:${string}` is\n // assignable to InFlow's wider `network: string`). No cast needed here.\n const folded = foldInflowExtensions(payload, paymentRequired);\n return toFoundationPayload(folded);\n }\n\n /**\n * Two-phase signing flow for callers that want to surface pending- approval UI before the protected request is\n * replayed. Forwarded to the InFlow signer's `prepare()`; returns a {@link PreparedPayment} the caller can\n * `awaitPayload()` or `cancel()` independently.\n *\n * Has no foundation equivalent — `x402Client.createPaymentPayload` is one-shot. The handle is InFlow-specific and\n * only applies to requirements InFlow can sign.\n *\n * @param requirement - The chosen `PaymentRequirements` (re-exported from `@inflowpayai/x402`) — must match an entry\n * in the InFlow buyer capability cache.\n * @param context - Seller-side {@link SigningContext}.\n * @param options - Per-call {@link SignOptions}.\n * @returns A {@link PreparedPayment} handle.\n * @throws {@link X402AdapterRoutingError} When the requirement is not in the InFlow buyer capability cache\n * (foundation-signed requirements have no two-phase flow).\n */\n async prepareInflowPayment(\n requirement: PaymentRequirements,\n context: SigningContext,\n options?: SignOptions,\n ): Promise<PreparedPayment> {\n if (!this.inflowSigner.supports(requirement)) {\n throw new X402AdapterRoutingError(requirement.scheme, requirement.network);\n }\n return this.inflowSigner.prepare(requirement, context, options);\n }\n\n // The eight overrides below preserve foundation `x402Client` behavior\n // verbatim and only narrow the return type to `this` so chaining\n // stays in the {@link InflowClient} subclass.\n\n override register(network: Network, schemeNetworkClient: SchemeNetworkClient): this {\n super.register(network, schemeNetworkClient);\n return this;\n }\n\n override registerV1(network: string, schemeNetworkClient: SchemeNetworkClient): this {\n super.registerV1(network, schemeNetworkClient);\n return this;\n }\n\n override registerPolicy(policy: PaymentPolicy): this {\n super.registerPolicy(policy);\n return this;\n }\n\n override registerExtension(extension: ClientExtension): this {\n super.registerExtension(extension);\n return this;\n }\n\n override onBeforePaymentCreation(hook: BeforePaymentCreationHook): this {\n super.onBeforePaymentCreation(hook);\n return this;\n }\n\n override onAfterPaymentCreation(hook: AfterPaymentCreationHook): this {\n super.onAfterPaymentCreation(hook);\n return this;\n }\n\n override onPaymentCreationFailure(hook: OnPaymentCreationFailureHook): this {\n super.onPaymentCreationFailure(hook);\n return this;\n }\n\n override onPaymentResponse(hook: OnPaymentResponseHook): this {\n super.onPaymentResponse(hook);\n return this;\n }\n\n /**\n * Pick the buyer's preferred `accepts[]` entry the InFlow signer can handle. Walks {@link InflowClient.preferOrder}\n * and returns the first entry whose `(scheme, network)` is in the InFlow capability cache; returns `null` when no\n * entry matches (the foundation branch takes over).\n */\n private pickInflowMatch(accepts: readonly PaymentRequirements[]): PaymentRequirements | null {\n for (const scheme of this.preferOrder) {\n const match = accepts.find((r) => r.scheme === scheme && this.inflowSigner.supports(r));\n if (match !== undefined) return match;\n }\n return null;\n }\n}\n\n/**\n * Async factory for {@link InflowClient}. Constructs the InFlow signer (which primes the buyer-supported cache) and\n * attaches it to a fresh `InflowClient` instance.\n *\n * Foundation-managed scheme registrations (`registerExactEvmScheme(client, …)`, `registerExactSvmScheme(client, …)`)\n * are applied to the returned instance by the caller after this factory resolves.\n *\n * @param options - {@link SignerOptions}.\n * @returns A primed {@link InflowClient} ready for `x402HTTPClient` and any further foundation scheme registrations.\n */\nexport async function createInflowClient(options: SignerOptions): Promise<InflowClient> {\n const inflowSigner = await createInflowSigner(options);\n return new InflowClient(inflowSigner);\n}\n\n/**\n * Run every handler in `EXTENSION_REGISTRY` against the seller's `paymentRequired.extensions`. For each declared\n * extension whose handler returns a non-`null` payload entry, fold the entry into `paymentPayload.extensions`. Required\n * declarations whose handler returns `null` throw.\n *\n * The foundation `x402Client` does not know about `EXTENSION_REGISTRY`, so this fold-up runs only on the\n * foundation-signed branch of the routing decision. The InFlow-signed branch is unaffected — the InFlow server already\n * handled extensions when constructing the server-side payload.\n */\nfunction foldInflowExtensions(\n paymentPayload: InflowPaymentPayload,\n paymentRequired: PaymentRequired,\n): InflowPaymentPayload {\n const declared = paymentRequired.extensions;\n if (declared === undefined) return paymentPayload;\n\n const signContext: SignContext = {};\n let extensions: Record<string, unknown> | undefined = paymentPayload.extensions;\n for (const handler of EXTENSION_REGISTRY.values()) {\n const declaration = getExtension(declared, handler);\n if (declaration === undefined) continue;\n const entry = handler.buildPayloadEntry(declaration, signContext);\n if (entry !== null) {\n extensions = setExtension(extensions, handler, entry);\n continue;\n }\n const required =\n declaration !== null &&\n typeof declaration === 'object' &&\n 'required' in declaration &&\n declaration.required === true;\n if (required) {\n throw new Error(\n `InflowClient: extension \"${handler.name}\" is declared as required but no payload entry was produced`,\n );\n }\n }\n if (extensions === undefined) return paymentPayload;\n return { ...paymentPayload, extensions };\n}\n","import { X402InvalidEvmKeyError } from './errors.js';\n\nconst HEX_RE = /^[0-9a-f]+$/;\n\n/**\n * Normalize a secp256k1 secret to viem's `0x`-prefixed 32-byte hex form. Accepts `0x`-prefixed hex, bare hex, or an\n * InFlow Java seed (`BigInteger.toByteArray()` output — two's-complement, so 33 bytes with a leading sign byte for\n * high-bit-set secrets, or short when leading zero bytes were dropped). Both edges renormalize to 32 bytes.\n *\n * @example\n *\n * ```ts\n * import { privateKeyToAccount } from 'viem/accounts';\n * import { parseEvmPrivateKey } from '@inflowpayai/x402-buyer';\n *\n * const account = privateKeyToAccount(parseEvmPrivateKey(process.env.EVM_PRIVATE_KEY!));\n * ```\n *\n * @throws {@link X402InvalidEvmKeyError} On non-hex input or a payload that doesn't reduce to exactly 32 bytes.\n */\nexport function parseEvmPrivateKey(value: string): `0x${string}` {\n let hex = value.trim().toLowerCase();\n if (hex.startsWith('0x')) hex = hex.slice(2);\n if (hex === '' || !HEX_RE.test(hex)) {\n throw new X402InvalidEvmKeyError('expected hex characters (0x-prefixed or bare)');\n }\n // Strip the Java BigInteger sign byte: a 33-byte two's-complement\n // encoding of a positive secp256k1 secret whose top byte is >= 0x80.\n if (hex.length === 66 && hex.startsWith('00')) {\n hex = hex.slice(2);\n }\n // Left-pad short keys whose leading zero bytes were dropped by\n // `BigInteger.toByteArray()`.\n if (hex.length < 64) hex = hex.padStart(64, '0');\n if (hex.length !== 64) {\n throw new X402InvalidEvmKeyError(`expected 32 bytes after normalization; got ${(hex.length / 2).toString()}`);\n }\n return `0x${hex}`;\n}\n","import bs58 from 'bs58';\n\nimport { X402InvalidSolanaKeyError } from './errors.js';\n\nconst EXPECTED_LENGTH = 64;\n\n/**\n * Decode a Solana secret into the 64-byte Ed25519 form expected by `@solana/kit`'s `createKeyPairSignerFromBytes`.\n * Auto-detects between a JSON byte array (`[...]`, as written by `solana-keygen`) and base58 (as emitted by InFlow's\n * `SolanaClient.Account.getSeed()` and by Phantom's exported secret).\n *\n * @example\n *\n * ```ts\n * import { createKeyPairSignerFromBytes } from '@solana/kit';\n * import { decodeSolanaSecret } from '@inflowpayai/x402-buyer';\n *\n * const bytes = decodeSolanaSecret(process.env.SOLANA_PRIVATE_KEY!);\n * const signer = await createKeyPairSignerFromBytes(bytes);\n * ```\n *\n * @throws {@link X402InvalidSolanaKeyError} On empty input, unparseable payloads, or anything that doesn't decode to\n * exactly 64 bytes.\n */\nexport function decodeSolanaSecret(value: string): Uint8Array {\n const trimmed = value.trim();\n if (trimmed === '') {\n throw new X402InvalidSolanaKeyError('input is empty');\n }\n if (trimmed.startsWith('[')) {\n return decodeJsonByteArray(trimmed);\n }\n return decodeBase58(trimmed);\n}\n\nfunction decodeJsonByteArray(trimmed: string): Uint8Array {\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch (err) {\n throw new X402InvalidSolanaKeyError(`JSON parse failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n if (!Array.isArray(parsed)) {\n throw new X402InvalidSolanaKeyError('JSON value is not an array');\n }\n if (parsed.length !== EXPECTED_LENGTH) {\n throw new X402InvalidSolanaKeyError(\n `JSON array length is ${parsed.length.toString()}, expected ${EXPECTED_LENGTH.toString()}`,\n );\n }\n const bytes = new Uint8Array(EXPECTED_LENGTH);\n for (let i = 0; i < EXPECTED_LENGTH; i += 1) {\n const element: unknown = parsed[i];\n if (typeof element !== 'number' || !Number.isInteger(element) || element < 0 || element > 255) {\n throw new X402InvalidSolanaKeyError(`JSON array element at index ${i.toString()} is not an integer in 0..255`);\n }\n bytes[i] = element;\n }\n return bytes;\n}\n\nfunction decodeBase58(trimmed: string): Uint8Array {\n let decoded: Uint8Array;\n try {\n decoded = bs58.decode(trimmed);\n } catch (err) {\n throw new X402InvalidSolanaKeyError(`base58 decode failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n if (decoded.length !== EXPECTED_LENGTH) {\n throw new X402InvalidSolanaKeyError(\n `base58 decoded to ${decoded.length.toString()} bytes, expected ${EXPECTED_LENGTH.toString()}`,\n );\n }\n return decoded;\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
import { x402Client, PaymentPolicy, ClientExtension, BeforePaymentCreationHook, AfterPaymentCreationHook, OnPaymentCreationFailureHook, OnPaymentResponseHook } from '@x402/core/client';
|
|
2
|
+
import { PaymentRequired, PaymentPayload, Network, SchemeNetworkClient } from '@x402/core/types';
|
|
3
|
+
import { InflowPaymentPayload, PaymentScheme, PaymentRequirements, ResourceInfo, X402BuyerSupportedResponse, InflowClientOptions, InstrumentType } from '@inflowpayai/x402';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Status of an x402 transaction's signing flow. `'INITIATED'` means the server-side approval is still pending. Any
|
|
7
|
+
* other value indicates the approval has cleared — successful when paired with an `encodedPayload`, failed otherwise.
|
|
8
|
+
* The SDK treats values other than `'INITIATED'` opaquely so new statuses don't require client changes.
|
|
9
|
+
*/
|
|
10
|
+
type TransactionStatus = 'INITIATED' | (string & {});
|
|
11
|
+
/**
|
|
12
|
+
* Status of a buyer-side approval. `'APPROVED'` means the server has synchronously signed; `'PENDING'` means the buyer
|
|
13
|
+
* must approve in their dashboard. Other terminal values (declined, cancelled, etc.) are surfaced verbatim and treated
|
|
14
|
+
* opaquely.
|
|
15
|
+
*/
|
|
16
|
+
type ApprovalStatus = 'APPROVED' | 'PENDING' | (string & {});
|
|
17
|
+
/**
|
|
18
|
+
* Response body of `POST /v1/transactions/x402`. The buyer creates a transaction and Approval; this is what the server
|
|
19
|
+
* returns synchronously.
|
|
20
|
+
*/
|
|
21
|
+
interface X402TransactionResponse {
|
|
22
|
+
approvalId: string;
|
|
23
|
+
approvalStatus: ApprovalStatus;
|
|
24
|
+
transactionId: string;
|
|
25
|
+
amount: string;
|
|
26
|
+
currency: string;
|
|
27
|
+
resource?: ResourceInfo;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Response body of `GET /v1/transactions/{transactionId}/x402`. While `status === 'INITIATED'`, neither
|
|
31
|
+
* `encodedPayload` nor `paymentPayload` are populated. Once the server has signed, both appear together.
|
|
32
|
+
*/
|
|
33
|
+
interface X402PayloadResponse {
|
|
34
|
+
status: TransactionStatus;
|
|
35
|
+
encodedPayload?: string;
|
|
36
|
+
paymentPayload?: InflowPaymentPayload;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Context the buyer learned from the seller's 402 response, threaded into `prepare()` / `sign()` so the server-side
|
|
40
|
+
* `POST /v1/transactions/x402` endpoint receives the seller's exact `resource` and `x402Version`.
|
|
41
|
+
*/
|
|
42
|
+
interface SigningContext {
|
|
43
|
+
/** From `PaymentRequired.resource`. */
|
|
44
|
+
resource: ResourceInfo;
|
|
45
|
+
/** From `PaymentRequired.x402Version`. Should be `2`. */
|
|
46
|
+
x402Version: number;
|
|
47
|
+
/**
|
|
48
|
+
* From `PaymentRequired.extensions`. The signer dispatches handlers registered in the core extensions registry for
|
|
49
|
+
* the names it sees here.
|
|
50
|
+
*/
|
|
51
|
+
extensions?: Record<string, unknown>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Output of a successful signing. `encodedPayload` is the base64 string to set as the `PAYMENT-SIGNATURE` header — the
|
|
55
|
+
* SDK never re-encodes the server-produced value.
|
|
56
|
+
*/
|
|
57
|
+
interface EncodedPayment {
|
|
58
|
+
/** Base64-encoded `InflowPaymentPayload` (re-exported from `@inflowpayai/x402`). */
|
|
59
|
+
encodedPayload: string;
|
|
60
|
+
/** Parsed payload for inspection. */
|
|
61
|
+
paymentPayload: InflowPaymentPayload;
|
|
62
|
+
/**
|
|
63
|
+
* Server-side transaction id for correlation. Present when the InFlow-signed branch produced this payment; absent on
|
|
64
|
+
* the foundation-signed branch (no InFlow Approval was created).
|
|
65
|
+
*/
|
|
66
|
+
transactionId?: string;
|
|
67
|
+
}
|
|
68
|
+
/** Per-call options accepted by every signing entry point. */
|
|
69
|
+
interface SignOptions {
|
|
70
|
+
/**
|
|
71
|
+
* Poll cadence while approval is `'INITIATED'`. Default 5000 ms (fixed — no exponential backoff, no jitter; the
|
|
72
|
+
* polling loop is itself the retry mechanism for the approval window).
|
|
73
|
+
*/
|
|
74
|
+
pollIntervalMs?: number;
|
|
75
|
+
/**
|
|
76
|
+
* Hard timeout for the full sign / `awaitPayload` call. Default 900 000 ms (15 minutes) — matches the server-side
|
|
77
|
+
* approval expiry.
|
|
78
|
+
*/
|
|
79
|
+
timeoutMs?: number;
|
|
80
|
+
/** Cooperative cancellation. */
|
|
81
|
+
signal?: AbortSignal;
|
|
82
|
+
/**
|
|
83
|
+
* Caller-supplied payment identifier forwarded to the server's `remotePaymentId` field. Validated client-side via the
|
|
84
|
+
* `payment-identifier` extension rules (16–128 chars, `^[a-zA-Z0-9_-]+$`); invalid values throw
|
|
85
|
+
* {@link X402PaymentIdFormatError} before any server round trip.
|
|
86
|
+
*/
|
|
87
|
+
paymentId?: string;
|
|
88
|
+
}
|
|
89
|
+
/** Constructor options for {@link createInflowClient}. */
|
|
90
|
+
interface SignerOptions extends InflowClientOptions {
|
|
91
|
+
/**
|
|
92
|
+
* Ordered scheme preference used when picking among multiple InFlow-acceptable requirements inside
|
|
93
|
+
* {@link InflowClient.createPaymentPayload}. Default `['balance', 'exact']`.
|
|
94
|
+
*/
|
|
95
|
+
prefer?: PaymentScheme[];
|
|
96
|
+
/** Reserved instrument-scheme configuration. */
|
|
97
|
+
instrument?: {
|
|
98
|
+
id?: string;
|
|
99
|
+
types?: InstrumentType[];
|
|
100
|
+
};
|
|
101
|
+
/** Default poll / timeout / paymentId values applied to every signing call. */
|
|
102
|
+
signDefaults?: SignOptions;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Handle returned by {@link InflowClient.prepareInflowPayment}. The transaction + approval have already been created
|
|
106
|
+
* server-side; the caller decides when to await the signed payload.
|
|
107
|
+
*/
|
|
108
|
+
interface PreparedPayment {
|
|
109
|
+
readonly transactionId: string;
|
|
110
|
+
readonly approvalId: string;
|
|
111
|
+
/**
|
|
112
|
+
* Poll `GET /v1/transactions/{transactionId}/x402` at `pollIntervalMs` cadence until the server has signed, the call
|
|
113
|
+
* times out, or the caller's `AbortSignal` aborts.
|
|
114
|
+
*
|
|
115
|
+
* @param options - Per-call overrides. Concurrent callers share the underlying loop; only the FIRST call's
|
|
116
|
+
* `pollIntervalMs` / `timeoutMs` are honored.
|
|
117
|
+
* @returns The signed {@link EncodedPayment}.
|
|
118
|
+
* @throws {@link X402ApprovalFailedError} When the server moves out of `'INITIATED'` without producing an
|
|
119
|
+
* `encodedPayload`.
|
|
120
|
+
* @throws {@link X402ApprovalTimeoutError} When wall-clock exceeds `timeoutMs` or the caller's `signal` aborts.
|
|
121
|
+
*/
|
|
122
|
+
awaitPayload(options?: SignOptions): Promise<EncodedPayment>;
|
|
123
|
+
/**
|
|
124
|
+
* One-shot poll: returns the current {@link TransactionStatus} without waiting.
|
|
125
|
+
*
|
|
126
|
+
* @returns The latest status reported by the server.
|
|
127
|
+
*/
|
|
128
|
+
status(): Promise<TransactionStatus>;
|
|
129
|
+
/**
|
|
130
|
+
* Best-effort cancel of the underlying server-side approval. Calls `POST /v1/approvals/{approvalId}/cancel`.
|
|
131
|
+
* **Fire-and-forget by design** — always resolves, never rejects. Use to release a `PreparedPayment` the caller no
|
|
132
|
+
* longer intends to await.
|
|
133
|
+
*
|
|
134
|
+
* @returns A promise that always resolves.
|
|
135
|
+
*/
|
|
136
|
+
cancel(): Promise<void>;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Minimal buyer-side signer contract. Implementation detail of {@link InflowClient}; not re-exported from the package
|
|
140
|
+
* barrel.
|
|
141
|
+
*
|
|
142
|
+
* @internal
|
|
143
|
+
*/
|
|
144
|
+
interface Signer {
|
|
145
|
+
/** Ordered scheme preference this signer would like callers to honor. */
|
|
146
|
+
readonly prefer: readonly PaymentScheme[];
|
|
147
|
+
/**
|
|
148
|
+
* Set of extension names this signer can satisfy on the buyer side. Used to filter `accepts[]` entries whose
|
|
149
|
+
* `PaymentRequired` declares a `required: true` extension this signer cannot handle.
|
|
150
|
+
*/
|
|
151
|
+
readonly extensionsHandled: ReadonlySet<string>;
|
|
152
|
+
/**
|
|
153
|
+
* Synchronous predicate: does this signer know how to sign the given requirement?
|
|
154
|
+
*
|
|
155
|
+
* @param requirement - The candidate {@link PaymentRequirements}.
|
|
156
|
+
* @returns `true` if `sign(requirement, ctx)` is expected to succeed.
|
|
157
|
+
*/
|
|
158
|
+
supports(requirement: PaymentRequirements): boolean;
|
|
159
|
+
/**
|
|
160
|
+
* Single-shot signing. Produces a base64-encoded {@link InflowPaymentPayload} ready to set as the `PAYMENT-SIGNATURE`
|
|
161
|
+
* header.
|
|
162
|
+
*
|
|
163
|
+
* @param requirement - The chosen {@link PaymentRequirements}.
|
|
164
|
+
* @param context - Seller-side {@link SigningContext} (resource + `x402Version` + extensions declarations).
|
|
165
|
+
* @param options - Per-call {@link SignOptions}.
|
|
166
|
+
* @returns The signed {@link EncodedPayment}.
|
|
167
|
+
*/
|
|
168
|
+
sign(requirement: PaymentRequirements, context: SigningContext, options?: SignOptions): Promise<EncodedPayment>;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* InFlow-specific buyer signer. Adds the InFlow-server capability table, priming hooks, and a two-phase `prepare()` /
|
|
172
|
+
* `awaitPayload()` flow for callers that want to surface pending-approval UI before the protected request.
|
|
173
|
+
* Implementation detail of {@link InflowClient}; not re-exported from the package barrel.
|
|
174
|
+
*
|
|
175
|
+
* @internal
|
|
176
|
+
*/
|
|
177
|
+
interface InflowSigner extends Signer {
|
|
178
|
+
/**
|
|
179
|
+
* Idempotent no-op for callers that have a long-lived signer and want to assert readiness explicitly. The async
|
|
180
|
+
* factory has already primed the capability cache; `ready()` exists for ergonomics only.
|
|
181
|
+
*
|
|
182
|
+
* @returns A resolved promise.
|
|
183
|
+
*/
|
|
184
|
+
ready(): Promise<void>;
|
|
185
|
+
/**
|
|
186
|
+
* Return the cached buyer capability set. 60-min TTL.
|
|
187
|
+
*
|
|
188
|
+
* @returns The {@link X402BuyerSupportedResponse}.
|
|
189
|
+
*/
|
|
190
|
+
getSupported(): Promise<X402BuyerSupportedResponse>;
|
|
191
|
+
/**
|
|
192
|
+
* Force a refetch of the buyer capability table.
|
|
193
|
+
*
|
|
194
|
+
* @returns The freshly fetched {@link X402BuyerSupportedResponse}.
|
|
195
|
+
*/
|
|
196
|
+
refreshSupported(): Promise<X402BuyerSupportedResponse>;
|
|
197
|
+
/**
|
|
198
|
+
* Kick off the buyer's transaction and Approval and return a handle the caller can await independently.
|
|
199
|
+
*
|
|
200
|
+
* @param requirement - The chosen {@link PaymentRequirements}.
|
|
201
|
+
* @param context - Seller-side {@link SigningContext}.
|
|
202
|
+
* @param options - Per-call {@link SignOptions}.
|
|
203
|
+
* @returns A {@link PreparedPayment} handle.
|
|
204
|
+
* @throws {@link X402PaymentIdFormatError} When `options.paymentId` is set but doesn't satisfy `validatePaymentId`.
|
|
205
|
+
*/
|
|
206
|
+
prepare(requirement: PaymentRequirements, context: SigningContext, options?: SignOptions): Promise<PreparedPayment>;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Subclass of `@x402/core`'s `x402Client` that adds the InFlow MPC signing branch and the two-phase
|
|
211
|
+
* {@link InflowClient.prepareInflowPayment} flow. Construct via {@link createInflowClient}.
|
|
212
|
+
*/
|
|
213
|
+
declare class InflowClient extends x402Client {
|
|
214
|
+
/**
|
|
215
|
+
* The InFlow-signed branch of the routing decision. Kept private — callers compose by passing the {@link InflowClient}
|
|
216
|
+
* to `x402HTTPClient` (and to `registerExactEvmScheme` / `registerExactSvmScheme` for foundation-signed networks).
|
|
217
|
+
*/
|
|
218
|
+
private readonly inflowSigner;
|
|
219
|
+
/**
|
|
220
|
+
* Ordered scheme preference used when picking among multiple InFlow-acceptable requirements. Sourced from the InFlow
|
|
221
|
+
* signer at construction so the buyer's intent (`prefer: ['balance', 'exact']` by default) survives across the
|
|
222
|
+
* override.
|
|
223
|
+
*/
|
|
224
|
+
private readonly preferOrder;
|
|
225
|
+
/**
|
|
226
|
+
* Construct via {@link createInflowClient}. The factory primes the buyer capability cache before resolving, so the
|
|
227
|
+
* routing decision in {@link InflowClient.createPaymentPayload} is synchronous against in-memory data. The constructor
|
|
228
|
+
* is exported only so the class is referenceable for `instanceof` checks, generic constraints, and return types.
|
|
229
|
+
*
|
|
230
|
+
* @param inflowSigner - Primed InFlow signer carrying the buyer capability cache, MPC signing flow, and prefer order.
|
|
231
|
+
* @internal
|
|
232
|
+
*/
|
|
233
|
+
constructor(inflowSigner: InflowSigner);
|
|
234
|
+
/**
|
|
235
|
+
* Routing override. InFlow signs when the buyer capability cache covers a requirement (preferred-scheme order);
|
|
236
|
+
* otherwise the foundation signs and any registered extension handlers are folded into `payload.extensions`. A
|
|
237
|
+
* `required: true` extension whose handler returns `null` throws.
|
|
238
|
+
*/
|
|
239
|
+
createPaymentPayload(paymentRequired: PaymentRequired): Promise<PaymentPayload>;
|
|
240
|
+
/**
|
|
241
|
+
* Two-phase signing flow for callers that want to surface pending- approval UI before the protected request is
|
|
242
|
+
* replayed. Forwarded to the InFlow signer's `prepare()`; returns a {@link PreparedPayment} the caller can
|
|
243
|
+
* `awaitPayload()` or `cancel()` independently.
|
|
244
|
+
*
|
|
245
|
+
* Has no foundation equivalent — `x402Client.createPaymentPayload` is one-shot. The handle is InFlow-specific and
|
|
246
|
+
* only applies to requirements InFlow can sign.
|
|
247
|
+
*
|
|
248
|
+
* @param requirement - The chosen `PaymentRequirements` (re-exported from `@inflowpayai/x402`) — must match an entry
|
|
249
|
+
* in the InFlow buyer capability cache.
|
|
250
|
+
* @param context - Seller-side {@link SigningContext}.
|
|
251
|
+
* @param options - Per-call {@link SignOptions}.
|
|
252
|
+
* @returns A {@link PreparedPayment} handle.
|
|
253
|
+
* @throws {@link X402AdapterRoutingError} When the requirement is not in the InFlow buyer capability cache
|
|
254
|
+
* (foundation-signed requirements have no two-phase flow).
|
|
255
|
+
*/
|
|
256
|
+
prepareInflowPayment(requirement: PaymentRequirements, context: SigningContext, options?: SignOptions): Promise<PreparedPayment>;
|
|
257
|
+
register(network: Network, schemeNetworkClient: SchemeNetworkClient): this;
|
|
258
|
+
registerV1(network: string, schemeNetworkClient: SchemeNetworkClient): this;
|
|
259
|
+
registerPolicy(policy: PaymentPolicy): this;
|
|
260
|
+
registerExtension(extension: ClientExtension): this;
|
|
261
|
+
onBeforePaymentCreation(hook: BeforePaymentCreationHook): this;
|
|
262
|
+
onAfterPaymentCreation(hook: AfterPaymentCreationHook): this;
|
|
263
|
+
onPaymentCreationFailure(hook: OnPaymentCreationFailureHook): this;
|
|
264
|
+
onPaymentResponse(hook: OnPaymentResponseHook): this;
|
|
265
|
+
/**
|
|
266
|
+
* Pick the buyer's preferred `accepts[]` entry the InFlow signer can handle. Walks {@link InflowClient.preferOrder}
|
|
267
|
+
* and returns the first entry whose `(scheme, network)` is in the InFlow capability cache; returns `null` when no
|
|
268
|
+
* entry matches (the foundation branch takes over).
|
|
269
|
+
*/
|
|
270
|
+
private pickInflowMatch;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Async factory for {@link InflowClient}. Constructs the InFlow signer (which primes the buyer-supported cache) and
|
|
274
|
+
* attaches it to a fresh `InflowClient` instance.
|
|
275
|
+
*
|
|
276
|
+
* Foundation-managed scheme registrations (`registerExactEvmScheme(client, …)`, `registerExactSvmScheme(client, …)`)
|
|
277
|
+
* are applied to the returned instance by the caller after this factory resolves.
|
|
278
|
+
*
|
|
279
|
+
* @param options - {@link SignerOptions}.
|
|
280
|
+
* @returns A primed {@link InflowClient} ready for `x402HTTPClient` and any further foundation scheme registrations.
|
|
281
|
+
*/
|
|
282
|
+
declare function createInflowClient(options: SignerOptions): Promise<InflowClient>;
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* Normalize a secp256k1 secret to viem's `0x`-prefixed 32-byte hex form. Accepts `0x`-prefixed hex, bare hex, or an
|
|
286
|
+
* InFlow Java seed (`BigInteger.toByteArray()` output — two's-complement, so 33 bytes with a leading sign byte for
|
|
287
|
+
* high-bit-set secrets, or short when leading zero bytes were dropped). Both edges renormalize to 32 bytes.
|
|
288
|
+
*
|
|
289
|
+
* @example
|
|
290
|
+
*
|
|
291
|
+
* ```ts
|
|
292
|
+
* import { privateKeyToAccount } from 'viem/accounts';
|
|
293
|
+
* import { parseEvmPrivateKey } from '@inflowpayai/x402-buyer';
|
|
294
|
+
*
|
|
295
|
+
* const account = privateKeyToAccount(parseEvmPrivateKey(process.env.EVM_PRIVATE_KEY!));
|
|
296
|
+
* ```
|
|
297
|
+
*
|
|
298
|
+
* @throws {@link X402InvalidEvmKeyError} On non-hex input or a payload that doesn't reduce to exactly 32 bytes.
|
|
299
|
+
*/
|
|
300
|
+
declare function parseEvmPrivateKey(value: string): `0x${string}`;
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Decode a Solana secret into the 64-byte Ed25519 form expected by `@solana/kit`'s `createKeyPairSignerFromBytes`.
|
|
304
|
+
* Auto-detects between a JSON byte array (`[...]`, as written by `solana-keygen`) and base58 (as emitted by InFlow's
|
|
305
|
+
* `SolanaClient.Account.getSeed()` and by Phantom's exported secret).
|
|
306
|
+
*
|
|
307
|
+
* @example
|
|
308
|
+
*
|
|
309
|
+
* ```ts
|
|
310
|
+
* import { createKeyPairSignerFromBytes } from '@solana/kit';
|
|
311
|
+
* import { decodeSolanaSecret } from '@inflowpayai/x402-buyer';
|
|
312
|
+
*
|
|
313
|
+
* const bytes = decodeSolanaSecret(process.env.SOLANA_PRIVATE_KEY!);
|
|
314
|
+
* const signer = await createKeyPairSignerFromBytes(bytes);
|
|
315
|
+
* ```
|
|
316
|
+
*
|
|
317
|
+
* @throws {@link X402InvalidSolanaKeyError} On empty input, unparseable payloads, or anything that doesn't decode to
|
|
318
|
+
* exactly 64 bytes.
|
|
319
|
+
*/
|
|
320
|
+
declare function decodeSolanaSecret(value: string): Uint8Array;
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Thrown by `awaitPayload` when the server moves the approval out of `'INITIATED'` without producing an
|
|
324
|
+
* `encodedPayload` — the server has decided not to sign (insufficient funds, user-rejected, internal error, etc.). The
|
|
325
|
+
* terminal `status` string is surfaced verbatim so callers can branch on it without the SDK having to enumerate every
|
|
326
|
+
* server-side failure state.
|
|
327
|
+
*/
|
|
328
|
+
declare class X402ApprovalFailedError extends Error {
|
|
329
|
+
/** The approval id the server returned from `POST /v1/transactions/x402`. */
|
|
330
|
+
readonly approvalId: string;
|
|
331
|
+
/** Terminal status reported by the server. */
|
|
332
|
+
readonly status: TransactionStatus;
|
|
333
|
+
/**
|
|
334
|
+
* @param approvalId - Server-issued approval id.
|
|
335
|
+
* @param status - Terminal status string from the polling response.
|
|
336
|
+
*/
|
|
337
|
+
constructor(approvalId: string, status: TransactionStatus);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Thrown by `awaitPayload` when `cancel()` is called on the same `PreparedPayment`. The cancel is fire-and-forget
|
|
341
|
+
* against the server; the SDK exits the polling loop immediately and never returns the partially-fetched state to the
|
|
342
|
+
* caller.
|
|
343
|
+
*/
|
|
344
|
+
declare class X402ApprovalCancelledError extends Error {
|
|
345
|
+
/** The approval id the server returned from `POST /v1/transactions/x402`. */
|
|
346
|
+
readonly approvalId: string;
|
|
347
|
+
constructor(approvalId: string);
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Thrown by `awaitPayload` when wall-clock exceeds `timeoutMs` or the caller's `signal` aborts before the server has
|
|
351
|
+
* signed.
|
|
352
|
+
*/
|
|
353
|
+
declare class X402ApprovalTimeoutError extends Error {
|
|
354
|
+
/** The approval id the server returned from `POST /v1/transactions/x402`. */
|
|
355
|
+
readonly approvalId: string;
|
|
356
|
+
/** Effective timeout in milliseconds. */
|
|
357
|
+
readonly timeoutMs: number;
|
|
358
|
+
/**
|
|
359
|
+
* @param approvalId - Server-issued approval id.
|
|
360
|
+
* @param timeoutMs - The configured timeout that elapsed.
|
|
361
|
+
*/
|
|
362
|
+
constructor(approvalId: string, timeoutMs: number);
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Thrown by `prepare()` / `sign()` when `SignOptions.paymentId` does not satisfy the `payment-identifier` extension's
|
|
366
|
+
* format rules (16–128 chars, `^[a-zA-Z0-9_-]+$`). Surfaced client-side before any server round trip.
|
|
367
|
+
*/
|
|
368
|
+
declare class X402PaymentIdFormatError extends Error {
|
|
369
|
+
/** The offending input. */
|
|
370
|
+
readonly input: string;
|
|
371
|
+
/** @param input - The {@link SignOptions.paymentId} value that failed validation. */
|
|
372
|
+
constructor(input: string);
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Thrown by {@link InflowClient.prepareInflowPayment} when the caller asks the two-phase flow for a requirement the
|
|
376
|
+
* InFlow signer cannot sign. The two-phase flow only exists for InFlow-signed requirements; foundation-signed schemes
|
|
377
|
+
* have no equivalent.
|
|
378
|
+
*/
|
|
379
|
+
declare class X402AdapterRoutingError extends Error {
|
|
380
|
+
/** Scheme of the requirement the adapter could not route. */
|
|
381
|
+
readonly scheme: string;
|
|
382
|
+
/** Network of the requirement the adapter could not route. */
|
|
383
|
+
readonly network: string;
|
|
384
|
+
/**
|
|
385
|
+
* @param scheme - Scheme of the offending requirement.
|
|
386
|
+
* @param network - Network of the offending requirement.
|
|
387
|
+
*/
|
|
388
|
+
constructor(scheme: string, network: string);
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Thrown by `parseEvmPrivateKey` when the input cannot be normalized to a 32-byte secp256k1 secret. The accepted input
|
|
392
|
+
* forms are `0x`-prefixed hex, bare hex, and InFlow's Java `Hex.encodeHexString(BigInteger.toByteArray())` seed
|
|
393
|
+
* (including the 33-byte sign-byte and sub-32-byte leading-zero-stripped shapes).
|
|
394
|
+
*
|
|
395
|
+
* The raw input is intentionally **not** preserved on the error: a decoding failure can be the user pasting a real key
|
|
396
|
+
* in the wrong encoding (e.g. a Solana base58 secret into the EVM decoder), so the offending value is treated as
|
|
397
|
+
* potential cryptographic material. Use {@link X402InvalidEvmKeyError.reason} for diagnostics; never log the input.
|
|
398
|
+
*/
|
|
399
|
+
declare class X402InvalidEvmKeyError extends Error {
|
|
400
|
+
/** Why the input failed validation. Never contains key bytes. */
|
|
401
|
+
readonly reason: string;
|
|
402
|
+
/**
|
|
403
|
+
* @param reason - Short explanation appended to the error message. Must not contain the raw input — produce a length
|
|
404
|
+
* / shape description instead (e.g. `'expected 32 bytes, got 31'`).
|
|
405
|
+
*/
|
|
406
|
+
constructor(reason: string);
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Thrown by `decodeSolanaSecret` when the input cannot be decoded to a 64-byte Ed25519 secret key. Accepted input forms
|
|
410
|
+
* are a base58 string (matches InFlow's `SolanaClient.Account.getSeed()` and Phantom's export) or a JSON byte array
|
|
411
|
+
* (matches `solana-keygen`'s output file).
|
|
412
|
+
*
|
|
413
|
+
* The raw input is intentionally **not** preserved on the error: a decoding failure can be the user pasting a real key
|
|
414
|
+
* in the wrong encoding (e.g. a base58 secret with one character mistyped), so the offending value is treated as
|
|
415
|
+
* potential cryptographic material. Use {@link X402InvalidSolanaKeyError.reason} for diagnostics; never log the input.
|
|
416
|
+
*/
|
|
417
|
+
declare class X402InvalidSolanaKeyError extends Error {
|
|
418
|
+
/** Why the input failed validation. Never contains key bytes. */
|
|
419
|
+
readonly reason: string;
|
|
420
|
+
/**
|
|
421
|
+
* @param reason - Short explanation appended to the error message. Must not contain the raw input — produce a length
|
|
422
|
+
* / shape description instead (e.g. `'expected 64 bytes, got 32'`).
|
|
423
|
+
*/
|
|
424
|
+
constructor(reason: string);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
export { type ApprovalStatus, type EncodedPayment, InflowClient, type PreparedPayment, type SignOptions, type SignerOptions, type SigningContext, type TransactionStatus, X402AdapterRoutingError, X402ApprovalCancelledError, X402ApprovalFailedError, X402ApprovalTimeoutError, X402InvalidEvmKeyError, X402InvalidSolanaKeyError, type X402PayloadResponse, X402PaymentIdFormatError, type X402TransactionResponse, createInflowClient, decodeSolanaSecret, parseEvmPrivateKey };
|