Skip to main content
Grantex uses x402 as the payment-message transport and the prepaid-wallet service as the authorization and accounting authority. Payment requirements alone do not prove that an AI agent has delegated authority or available principal-owned value; the server-issued reservation connects those facts.

Components

Protocol flow

Exact binding

The authorization JWT and database reservation bind:
  • authorization and reservation identifiers;
  • developer, principal, agent, grant, wallet, and assignment;
  • amount in atomic units, asset, and network;
  • recipient and exact resource URL;
  • delegated action scope;
  • canonical request hash and expiry.
The authorization lifetime is at most 300 seconds. The accepted x402 requirements must exactly equal the requirements supplied to the facilitator. The facilitator rejects malformed envelopes, unsupported versions/schemes, expired signatures, released reservations, and any binding mismatch. Verification is provisional. A resource server must settle successfully before starting irreversible protected work or returning the paid result; treating verification alone as payment would reintroduce a verify/use race. Remote resource URLs must use HTTPS so PAYMENT-SIGNATURE cannot disclose the one-time authorization over plaintext. HTTP is accepted only for explicit loopback development addresses.

Idempotency and replay

The agent supplies a high-entropy idempotency key when reserving. Its hash is unique across the developer, principal, and agent, not merely within one wallet. This is important for automatic wallet selection: a lost response can be retried, but the retry cannot select a different wallet or change its terms. Settlement is idempotent and returns the original transaction identifier. Calling authorization again with a key whose reservation settled returns PAYMENT_ALREADY_SETTLED. Verification accepts only a currently reserved authorization; a settled authorization cannot verify again and therefore cannot re-run protected work. Released and expired reservations cannot be revived. The fetch adapter accepts a caller-provided idempotencyKey. Callers should derive it from a durable logical order/request identifier and reuse it after a timeout or a lost wallet-authorization response. The generated default protects a single fetch flow, but cannot correlate two independently restarted caller invocations. That option is deliberately not an HTTP header and cannot recover merchant work after settlement. A side-effecting merchant must also accept a normal Idempotency-Key request header, atomically persist its business result under that key, and return the cached result on a caller retry. Without that merchant record, a response lost after settlement fails closed with PAYMENT_ALREADY_SETTLED; Grantex does not replay protected work.

Blocking semantics

For grantex:prepaid, applying an assignment, wallet, or all-wallet agent block happens in the same database transaction that releases affected outstanding reservations. New authorizations fail, old authorizations stop verifying, and reserved value returns to available value. Historical settlements remain immutable. For opt-in Base USDC, blocks prevent new signatures but cannot recall signatures already issued. These EVM reservations remain held until finalized settlement or confirmed unused expiry. Manual release, local timeout, policy mutation and RPC failure do not return that exposure to the available balance.

Legacy GDT boundary

The package still includes standalone GDT issuance and verification for signed authorization context. That path is not the managed wallet protocol. A GDT is stateless unless the host supplies durable state, so its spendLimit claim must not be described as an atomically enforced cumulative balance. New prepaid x402 integrations should use PrepaidWalletAgentClient.x402Authorizer.

External payment rails

grantex:prepaid identifies the repository’s managed prepaid settlement scheme. It does not claim an on-chain transfer. The opt-in Base USDC adapter uses standard x402 v2 exact on eip155:8453, a policy-gated EIP-3009 signer and the merchant’s EVM facilitator. Grantex checks finalized USDC funding and reconciles on-chain nonce/transfer evidence independently of the merchant’s HTTP response. It does not send an internal Grantex JWT to an EVM merchant. Other rails require separate adapters. Base agent.fetch binds the original request URL, sends the stable logical request key as HTTP Idempotency-Key, rejects redirects and reuses the stored signature after response loss. Merchant-side result persistence is still required. Unconfigured custody, stale RPC or ambiguous evidence fails closed.
Last modified on September 6, 2026