Skip to content

pull in latest upstream - #2

Open
TtheBC01 wants to merge 890 commits into
1Shot-API:mainfrom
x402-foundation:main
Open

pull in latest upstream#2
TtheBC01 wants to merge 890 commits into
1Shot-API:mainfrom
x402-foundation:main

Conversation

@TtheBC01

Copy link
Copy Markdown

Description

Tests

Checklist

  • I have formatted and linted my code
  • All new and existing tests pass
  • My commits are signed (required for merge) -- you may need to rebase if you initially pushed unsigned commits
  • I added a changelog fragment for user-facing changes (docs-only changes can skip)

fallintoplace and others added 18 commits May 26, 2026 20:30
* add dev tools docs

* add discovery sect to ecosystem
* fix: add client ceiling protection to x402-axios that mirrors x402-fetch

* fix: test
* fix: go verify result was being discarded

* chore: add changelog fragment

* fix: format/lint
…urceInfo (#2447)

* feat(python): thread bazaar service metadata from RouteConfig to ResourceInfo

The `resource.{serviceName,tags,iconUrl}` schema fields landed in #2200 but
the Python server-side `RouteConfig` dataclass had no way to populate them —
servers wanting rich Bazaar listings had to bypass the SDK or post-process
the 402 response. This wires the missing plumbing:

- Add `service_name`, `tags`, `icon_url` fields to `RouteConfig`
- Accept `serviceName`/`iconUrl` (camelCase) and snake_case in
  `_parse_route_config` to match existing `mimeType` parsing convention
- Pass the fields through to `ResourceInfo` in `x402_http_server_base.py`
- Test asserts the fields flow from RouteConfig → resource on the 402

* review: snake_case sibling test + RouteConfig limits docstring

Addresses @TateLyman's two non-blocking review suggestions:

1. Add an integration test for the snake_case input path
   (service_name / icon_url) so a future refactor cannot silently drop
   support for either casing while leaving the camelCase test green.
2. Expand the RouteConfig docstring to flag that it does not itself
   enforce Bazaar indexer caps — the stricter resource_info helper
   soft-drops non-conforming values later. Points server authors at
   the limits (service_name ≤ 32, ≤ 5 tags of ≤ 32 chars, absolute
   http(s) icon URLs ≤ 2048) at the SDK boundary.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Christopher Ferjo <270686917+hypeprinter007-stack@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
* fix: aptos gas price vulnerability

* fix: spec
* fix: correct microLamports field path in compute price cap check

* chore: add changelog fragment

* fix: changelog fragments
* fix: solana cache deduplication

* feat: cleanup decode calls

* fix: format

* chore: add changelog fragments
* feat: validate bazaar config on server startup

* fix: python format

* chore: changelog fragments

* feat: pr feedback

* format/lint & handle empty method string in ValidateDiscoveryExtensionSpec

* chore: ruff format python facilitator

* fix: validation

* fix: lint

* fix: pr reviewer feedback

* fix: format python
* fix: erc-6492 factory call was server driven

* fix: builds

* feat: pr review feedback

* feat: enable 6492 deploys for x402.org

* fix: format
* Update docs/extensions/bazaar.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/extensions/bazaar.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

---------

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
Adds wallet-agnostic smart wallet verification to the SVM facilitator.
Verifies payment outcomes by inspecting CPI inner instructions from
transaction simulation, rather than parsing each wallet type's proprietary
instruction format. Works for any smart wallet program (Squads, Swig, SPL
Governance, Metaplex Core, etc.) that executes TransferChecked via CPI.

Dual-path verification:
- Path 1 (static): strict positional instruction validation for standard
  wallets. Fast, preserves existing behavior. Instruction cap raised 6 -> 7
  so Phantom transactions carrying wallet-injected Lighthouse assertions pass
  statically (see #828, #2097).
- Path 2 (simulation): outcome-based verification reached only when Path 1
  fails for a recoverable layout reason. Semantic rejections (amount/mint/
  recipient/memo mismatch, self-spend, failed simulation) return their real
  reason instead of being masked behind a smart_wallet_* code.

Security model:
- Fee payer isolation (fee payer never appears in instruction accounts),
  resolving Address Lookup Tables first so hidden accounts are caught.
- Operator-configurable compute budget caps.
- Program allowlist gating which programs reach simulation (Squads x2, Swig,
  SPL Governance, Metaplex Core, Lighthouse).
- Exactly one matching TransferChecked in the CPI trace.
- Post-settlement verification (TOCTOU defense): confirms the transfer
  executed on-chain via inner instructions, with a balance-delta fallback for
  both SPL Token and Token-2022.
- Seller-required memo enforced in Path 2 at parity with Path 1.

The internal _verify reports which path validated the payment so settle()
knows when post-settlement verification is required without re-deriving it.
The constructor requires all four smart-wallet signer methods (including
fetchAddressLookupTables) so misconfiguration fails at construction, not at
verify time.

15 dedicated smart-wallet tests plus path-classification, ALT-failure, and
7-instruction Phantom coverage. 190/190 passing. Rebased onto current main,
preserving the message-hash settlement cache key.

Made-with: Claude Code
PR #1527 merged without a changeset, so the simulation-based smart wallet
verification feature would ship without a version bump or changelog entry.
This adds the missing @x402/svm minor changeset.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix service metadata ts

* same for py

* same for go

* clean up

* fix e2e

* add changelogs

* map outputSchema to bazaar extension

* fix format
* Add Concordium exact scheme for Concordium blockchain integration

* Update Concordium schema design to match desired Coinbase x402 architecture

* Update validation rules:
- exact amount
- signature SHOULD -> MUST
- Make spec implementation agnostic
- Update asset ""

* Update Asset PaymentRequirements:
- An empty string MAY represent the network's native asset

* docs(spec): align Concordium exact sponsorship + clarifications

* docs(spec): tighten Concordium exact scope + preflight

* docs(spec): use CCD for native asset

---------

Co-authored-by: Oleg <oleh.drozd@boostylabs.com>
* feat(evm): add auth-capture client scheme

Client-side auth-capture for @x402/evm: detects auth-capture payment requirements and signs the payload (ERC-3009 default, Permit2 alternative) over the payer-agnostic PaymentInfo hash. Server and facilitator support follow separately.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(evm): trim speculative comment in auth-capture constants

Drops the speculative chain-coverage paragraph flagged in review; keeps the address provenance note. No functional change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* chore(evm): move auth-capture attribution to package NOTICE

Per review feedback, attribution belongs at the @x402/evm package root rather than the repo-level NOTICE. Wording covers only the client portion of the TS implementation, since that is all that upstreams in this PR.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
phdargen and others added 30 commits August 12, 2026 16:43
* require TransferChecked discriminator

* changeset
* feat(svm): add usage-based upto payment scheme

* add examples

* spec fixes: settle payload, receiverAuth and withdrawdelay

* align with spec

* revert back to payload.authorizedSigner; extend toFacilitatorSvmSigner; do full sim before broadcasting open

* auto refund client when route handler fails

* make verify and settle stateless and independent

* add rent cleanup manager

* working examples

* add dynamicExtraFields

* rent cleanup must not race in-flight settle

* minor fixes

* add settlement cache

* pr review

* fix(svm): satisfy CI formatting checks

* align with payment flow

* update spec + README

* pr review

* add e2e tests

* align mcp

* reject already open

* open layout hardening

* allow lighthouse+memo

* add delete to settle cache and move upsertChannelStorage before broadcast

* enforce maxChannelLifetimSecs at deposit

---------

Co-authored-by: Ludo Galabru <ludo.galabru@solana.org>
* Update docs/schemes/upto.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/schemes/upto.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/schemes/upto.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/sdk-features.md

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

---------

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
* add payment flow

* core plumbing for svm upto

* align mcp

* pr feedback 1-3

* pr feedback 4-6
Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
* siwx: bind client challenges to the request origin

* removed resources origin check
* Update docs/extensions/sign-in-with-x.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/extensions/sign-in-with-x.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

---------

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
* add spendControls

* add svm stablecoins

* refactor svm assets

* make non-default assets optin

* pr review
* Update docs/getting-started/quickstart-for-buyers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/advanced-concepts/lifecycle-hooks.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/sdk-features.md

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

---------

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
* fix(evm): correct Monad USDC v1 EIP-712 domain name to "USDC"

#3105 corrected the v2 default-asset tables but left the legacy v1
network tables in the Go and Python SDKs on "USD Coin". The v1 exact
client reads these tables to build the EIP-3009 signing domain, so v1
payments on Monad still fail on-chain signature recovery. TypeScript
needs no change; its v1 path resolves through the already-fixed shared
table.

* chore: changelog fragments for the v1 Monad USDC domain fix
)

* feat(ts): add ComputeBudget instructions to svm upto transactions

Without a SetComputeUnitLimit, the runtime derives 200k CU per non-builtin
instruction (SIMD-0170), so every upto transaction reserved 400-403k CU
while consuming 2-50k. Block and per-account cost accounting charge the
reserved amount, and priority fees are charged on the requested limit.

- Client open builder: prefix SetComputeUnitLimit (default 90k, ~2x
  observed consumption) + SetComputeUnitPrice (default 1 microlamport/CU),
  overridable or removable via BuildOpenArgs / UptoClientSvmConfig. The
  default prefix passes verifyOpenTransaction under the default caps.
- Facilitator submitSettle (claim, cancel, cleanup close + reclaim
  batches): derive the limit from a pre-broadcast simulation (2x
  unitsConsumed + 25k headroom, clamped to the 1.4M per-tx max), falling
  back to 400k when simulation is unavailable so a sim outage is never
  riskier than the previous behavior. Attach a configurable
  SetComputeUnitPrice (UptoSvmFacilitatorConfig /
  UptoSvmRentCleanupManagerConfig, default 1).

* refactor(ts): size svm upto settlement compute statically instead of via simulation

Per review discussion: static limits keep the time-critical claim free of
an extra RPC round-trip, a stale-blockhash window, and a fallback code
path, while the current upto shape (single-recipient distribution,
standard SPL Token mints) makes the worst case predictable.

- submitSettle: SetComputeUnitLimit defaults to
  DEFAULT_SETTLE_COMPUTE_UNIT_LIMIT (100k; measured warm-ATA claim ~21.6k
  + ~25k for a recreated recipient ATA), overridable per call and via
  settleComputeUnitLimit on UptoSvmFacilitatorConfig and
  UptoSvmRentCleanupManagerConfig.
- Reclaim batches size per channel: 25k + 5k x batch (measured ~320
  CU/reclaim, mint-independent), clamped to the per-tx max.
- Defaults assume standard SPL Token behavior; compute-heavy Token-2022
  extension mints (e.g. transfer hooks) need explicit overrides — same
  assumption documented on the client open default.
The v1-to-v2 network mapping table listed `solana:devnet` and
`solana:mainnet`. Neither is a valid CAIP-2 identifier: the solana
namespace uses the first 32 characters of the base58 genesis hash, and
normalizeNetwork() in typescript/packages/mechanisms/svm/src/constants.ts
throws "Unsupported SVM network" for anything outside the supported set.

Replace them with the values V1_TO_V2_NETWORK_MAP actually holds
(constants.ts:53-54), which the Go and Python SDKs and the e2e config
also use, and which every other docs page already documents.
…3183)

UptoSvmFacilitatorConfig.rpc (and the rent cleanup manager's config) now
accept a pre-built RPC client, preferred over constructing one from
rpcUrl. Lets a facilitator route channel claim/cleanup sends through its
own paced/instrumented transport instead of an unmanaged raw client.
* feat: add solana upto core work to go sdk

* feat: added client implementation

* feat: added server implementation

* feat: added facilitator implementation

* feat: added integration tests

* feat: update .mds

* feat: add client examples

* feat: add server examples

* feat: add facilitator example

* feat: add e2e integration

* feat: add changeset fragments

* fix: add typescript bug fixes

* feat: AI PR review

Correctness:
- ResolveTokenProgram no longer routes a registry lookup through
  MustPublicKeyFromBase58, and GetStablecoinTokenProgram honors its documented
  SPL Token default when a symbol is registered without a program. Same in TS,
  where the gap surfaced as undefined.
- The TS upto client validates extra.tokenProgram through the shared parser the
  facilitator already uses, so a broken challenge fails naming the field rather
  than after a round trip. Go already did this.
- A reclaim batch that fails to broadcast reports every channel in it through
  onError, not just the first. Both SDKs.
- Cleanup returns on a canceled context instead of walking the remaining records
  over a dead connection during Stop.

Clean-up:
- Collapse VerifiedOpenChannel onto the channel keys it duplicated, drop the six
  fields nothing read, and project settlement inputs through a method instead of
  respelling the key set at each call site.
- Rename SettlementSimChannel to settlementChannel: it builds the real claim too.
- Unexport the facilitator plumbing types; nothing outside the package uses them.
- Name the ComputeBudget instruction discriminators and the remaining channel
  account offsets, and correct the offsets' rationale.
- Delete Channel.DerivePDA and ErrReceiverAuthorizerMissing, both unused.

Tests:
- Canceled cleanup pass, failed reclaim batch reporting, incomplete-registry
  token program fallback, a second payment-channels open smuggled after the
  canonical one, and the TS client rejecting an unsupported tokenProgram.
- The integration rent-cleanup case now asserts the deferral it actually checks
  and is named for it.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: retry temporarily missing SVM upto channels

RPC providers can report an open transaction as confirmed before the same
channel account is visible from the replica serving account reads. Retry only
missing confirmed accounts with bounded backoff in Go and TypeScript while
keeping existing invalid state terminal.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: fail SVM upto deposit settle before broadcast on storage failure

An open transaction broadcast without a durable channel index can never be
found by rent cleanup, permanently stranding the facilitator's rent. Persist
the pre-broadcast index and fail closed (dedup key released, nothing
broadcast) when it cannot be written, in both the Go and TypeScript SDKs.
Post-confirmation bookkeeping on the claim path remains fail-open.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: budget SVM upto rent cleanup reclaims per signer, add resumable scan

Reclaim transactions were budgeted from one MaxTxsPerRun pool shared across
every rent-payer group, so adding managed signer keys split a fixed budget
instead of adding throughput. Give each group its own budget. Also remember
where a budget-limited scan stopped and resume there next pass, so a backlog
bigger than the budget cannot permanently starve records ordered later in
storage.List/list().

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* feat: add spec §6 onchain discovery for SVM upto rent cleanup

Add DiscoverChannelsByRentPayer / discoverChannelsByRentPayer: a
getProgramAccounts sweep by rent_payer, independently validated against
account owner, discriminator, and rederived channel PDA rather than trusting
the RPC provider's filter. This recovers Distributed channels missing from
offchain storage. Add matching TypeScript unit tests (previously untested)
and bring its owner check to parity with the Go implementation.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* test: add golden serialization gate for SVM upto reclaim batch size

Build the exact instruction set submitReclaimGroup submits (N
BuildReclaimInstruction calls sharing one rent-payer fee payer) and assert
the serialized transaction stays under Solana's PACKET_DATA_SIZE, deriving
the largest safe batch size from the measured per-reclaim byte cost. This
gates raising MaxReclaimsPerTx in facilitator configs: 16 reclaims serialize
to 776 bytes, well under the 1232 byte limit, with room up to ~28.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: update svm test import after rebase onto upstream stablecoin registry

USDC_DEVNET_ADDRESS/USDC_MAINNET_ADDRESS moved from constants.ts to
defaultAssets.ts on upstream main. Vitest doesn't type-check, so the stale
import silently resolved to undefined and getChannelDistributionHash hashed
an undefined recipient instead of failing at compile time.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* chore: consolidate SVM upto changelog fragments

Six Go changelog entries and five TypeScript changesets had accumulated
across the branch's individual fix commits, all describing hardening to a
scheme that has not shipped in either SDK yet. Drop them: Go keeps the two
original entries (the upto scheme itself, and the stablecoin registry, which
is not upto-specific). TypeScript's upto is still unreleased, so the existing
svm-upto-scheme.md changeset already covers it and needs no addition.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: wire findDefaultAsset into the SVM upto client scheme

Client spend controls decide whether an asset is a recognized default
by calling scheme.findDefaultAsset(). Every other client scheme (SVM
exact, EVM exact/upto/batch-settlement) wires this in; the SVM upto
client scheme never did, so spend controls rejected canonical
devnet/mainnet USDC as a non-default asset unless callers explicitly
configured allowedAssets.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: move SVM upto ComputeBudget overrides onto shared ClientSvmConfig

Removes UptoClientSvmConfig / UptoClientConfig (TS/Go), a scheme-specific
intersection type introduced alongside the upto ComputeBudget work, in favor
of extending the shared ClientSvmConfig / ClientConfig that every SVM client
scheme already takes. exact's client now honors the same
computeUnitLimit / computeUnitPriceMicroLamports overrides instead of always
using the scheme's hardcoded defaults, matching upto's client. Both are still
unreleased on this branch, so this is a pre-release API consolidation, not a
breaking change.

Also updates the svm-upto-compute-budget changeset to describe the
consolidated config surface.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: drop unused assertLimit min parameter to satisfy unparam lint

Every call site passed 1 for min (unsigned config fields already make 0 the
only unusable floor for the fields that need no check), so unparam correctly
flagged it as dead. Renamed to assertPositive with the floor hardcoded.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* feat(svm): split upto rent discovery from cleanup and inject RPC clients

Address review feedback on the upto rent cleanup manager in both SDKs, and
bring Go to parity with the TypeScript RPC injection from #3183.

The getProgramAccounts recovery sweep no longer rides the short cleanup
interval: it is a public discover() on its own interval that writes the
Distributed channels it finds into storage for cleanup to reclaim. stop() now
waits for the in-flight pass instead of leaving a broadcast settle orphaned.
maxTxsPerRun only bounds the storage scan; per-rent-payer reclaim moves to
maxTxsPerSigner so a reclaim backlog cannot starve the scan. The scan sorts by
channel id before applying its resume cursor, since storage.list promises no
order.

The client compute-unit overrides are gone: 0 meant "omit" on upto and "use
zero" on exact, which is not a coherent shared config, and no caller needed
them. An empty extra.memo is now unset rather than a required empty memo.

Go gains RPC *rpc.Client on the facilitator Config and RentCleanupConfig,
preferred over building one from the URL, so operators can route sends through
their own instrumented transport.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: harden SVM upto facilitator and rent cleanup after audit review

Address must-fix and should-fix findings from a Go/TypeScript parity audit:
clamp reclaim batch size to a serialization-proven ceiling, reject malformed
tokenProgram/amount inputs instead of silently mishandling or throwing, drop
dead code, DRY up a duplicated constant, and distinguish a settlement
confirmation timeout from a definite onchain rejection so a retry cannot
race a transaction that may still land.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: gofmt struct literal alignment in upto SVM client scheme

BuildOpenArgs field values were over-aligned (stale spacing from a
previously longer field name), which check-format-go's `make fmt` +
git-diff check flags as unformatted even though a bare `go fmt` run
against gofmt's cached/previous output looked clean locally.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Claude <noreply@anthropic.com>
* implement settlement_pending

* add upto support across sdks

* fixes

* fixes

* update supporting documentation

* cleanup

* fixes

* add batch_settlement support

* fixes

* fixes

* fix batch erc20 deposit and export python error

* fixes

* more fixes

* cleanup

* fix lint

* fixes

* fix failing lint

* more fixes

* update to optional so changes are backwards-compatible

* restore old error

* revert starknet changes

* fix: treat post-broadcast receipt-processing errors as settlement_pending

* feat: pr review

* fix: pr review

* refactor: move EVM receipt-wait timeout from scheme config to signer

Per review feedback, configuring confirmationTimeoutMs on every scheme
config was inconsistent with the other SDKs: Python bounds the wait on
FacilitatorWeb3Signer and Go bounds it via the settle ctx.

toFacilitatorEvmSigner now accepts { confirmationTimeoutMs } (default
180_000, matching viem's own) and wraps waitForTransactionReceipt so the
returned signer applies the bound to every receipt wait. An explicit
per-call timeout still wins.

This reverts the confirmationTimeoutMs threading from EvmFacilitatorConfig,
ExactEvmSchemeConfig, EIP3009FacilitatorConfig, Permit2FacilitatorConfig,
UptoPermit2FacilitatorConfig (and UptoEvmScheme's constructor),
BatchSettlementEvmSchemeConfig, ExactEvmSchemeV1Config, the ten private
handler signatures, shared/settleReceipt.ts, and the mirrored
Erc20ApprovalGasSponsoringSigner interface in @x402/extensions.

Every receipt wait in @x402/evm goes through a FacilitatorEvmSigner -- the
shared settle helper, v1's two waits, and the ERC-6492 deploy waits in
eip3009.ts and deposit.ts -- so all of them inherit the bound with no
per-call-site threading. The ERC-20-approval extension path waits on the
extension's own signer, which the config approach never reached.

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: trim receipt-timeout surface to what is used

Drop the speculative API added alongside the signer bound:

- unexport DEFAULT_CONFIRMATION_TIMEOUT_MS and FacilitatorEvmSignerOptions
  and remove them from the barrel; nothing consumed either. The constant is
  now module-private, matching _DEFAULT_TX_GAS_LIMIT in the Python signer,
  and the options shape is inlined on the parameter.
- drop the per-call timeout override. No caller passes one, so
  `args.timeout ?? bound` was an untaken branch; the signer owns the bound
  outright.
- drop the settleReceipt test for a signer-configured bound expiring. It
  asserted the same thing as the existing receipt-wait-failure test.

Also trim narration: the four-line README bullet, the three-paragraph
option docs, and the Python constant/docstring comments.

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: register scheme server in settlement-pending mechanism-error test

Upstream main's GetPaymentFlow now requires a registered scheme server
to resolve a payment flow; add the missing WithSchemeServer option so
TestProcessSettlement_MechanismErrorPreservesReasonAndTransaction
matches its sibling tests after rebasing onto main.

Co-Authored-By: Claude <noreply@anthropic.com>

* feat: pr review

* fix: format/lint

* fix: drop stale terminal-settle-failure test reintroduced during main rebase

The rebase onto x402-foundation/main resurrected a test removed in an earlier
PR review pass (transaction-hash stripping moved out of core's resource
server). Re-delete it so core stays aligned with that decision.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Ethan Oroshiba <ethan.oroshiba@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
* Update docs/sdk-features.md

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/schemes/upto.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-sellers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

---------

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
* add spend controls

* align mcp

* review feedback

* add test

* unify money coversion

* add guard

* rebase
Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
* spend controls go

* Address review: share EVM money conversion and document MCP spend-control options.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Apply MCP spend-control Options in NewX402MCPClient as well as FromConfig.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Remove unused ExactEvmScheme.ConvertToTokenAmount that collided with the package helper.

Co-authored-by: Cursor <cursoragent@cursor.com>

* clean up dead code

* revert duplicated mcp wrapper options

* unify money parser

* add guard

* rebase

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
* Update docs/sdk-features.md

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/getting-started/quickstart-for-buyers.mdx

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

---------

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
* Update docs/sdk-features.md

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

* Update docs/sdk-features.md

Generated-By: mintlify-agent

Mintlify-Source: dashboard-editor

---------

Co-authored-by: mintlify[bot] <109931778+mintlify[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.