Skip to content

Name the seller in the 402: x402-merchant extension - #57

Merged
Fizzl13 merged 25 commits into
mainfrom
claude/x402-agents-solana-payments-nceg9b
Oct 9, 2026
Merged

Fizzl13 merged 25 commits into
mainfrom
claude/x402-agents-solana-payments-nceg9b

Conversation

@Fizzl13

@Fizzl13 Fizzl13 commented Oct 9, 2026

Copy link
Copy Markdown
Owner

GoPlausible's x402 catalog (facilitator.goplausible.xyz/discovery) lists every Fizzl route since last night's Algorand payments, but the merchant profile is empty (name, website, logo all null). It fills that profile from the x402-merchant extension of the 402 challenge when it settles a payment; one merchant per pay-to address, and all four fizzl.eu services share one on Algorand. Other sellers there (Coil, x402 Echo Service, proptech.watch) use exactly this shape.

  • merchant.js: the extension, { info: { name: "Fizzl", website, logo, categories }, schema }, the same on every fizzl.eu service. The logo is https://fizzl.eu/logo-512.png (Fizzl13/fizzl.eu#49).
  • Added next to the Bazaar extension on both paid routes (check-wallet, explain).
  • Test: the Algorand challenge test checks it (test/algorand.test.js). npm test: 30/30.
  • Checked: x402 Doctor's free check raises nothing about the extension on a service that already has it.

The profile updates on the next settled payment through GoPlausible, so after the four services deploy one small Algorand payment is enough.

🤖 Generated with Claude Code

https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48


Generated by Claude Code

claude added 25 commits October 4, 2026 16:57
mpp-pay from x402-doctor (#139): the agent sends USDC.e on Tempo with the MPP
memo and answers with the transaction hash, checked on a Tempo RPC; the 402
then carries an evm and a tempo challenge and /openapi.json lists both offers.
Off until MPP_TEMPO_RECIPIENT is set.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
A 402 with a payment that was refused now logs network (from the x402
payment header, or the MPP credential's method: evm = base, tempo = Tempo),
so the usage log can show which network traffic comes from.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
On mainnet the paid routes also accept the same dollar price in RLUSD on
the XRP Ledger, to XRPL_PAY_TO (default Frits's account with the RLUSD
trust line; XRPL_PAY_TO=off turns it off), verified and submitted by an
in-process facilitator from @x402/xrpl, as in the other Fizzl services.
The usage log counts RLUSD in dollars.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
Agents built on t54's x402-xrpl / Xrpl.X402 SDK (most of the XRPL AI Hub)
sign with the x402 SourceTag 804681468, bind the invoice in Memos and send
{ signedTxBlob, invoiceId }. @x402/xrpl refuses Memos, so those payments now
go to t54's hosted facilitator, which verified and settled such a payment
on testnet; standard @x402/xrpl payments stay in-process (also re-tested on
testnet with the SourceTag in the requirements). Every XRPL accept now
carries extra.sourceTag. XRPL_T54_URL=off keeps everything local.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
Google crawled the homepage but has not indexed it yet; these give it
a clear signal which URL to index.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
A refused MPP credential is logged as payment_failed with protocol mpp;
it now also carries reason (the problem detail sent back, max 160
characters), so a client that can't pay us shows what went wrong.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
With ALGORAND_PAY_TO set (an Algorand account with the USDC opt-in), both
paid routes also offer the same dollar price in USDC (ASA 31566704) on
Algorand mainnet, settled by GoPlausible's public facilitator, which pays
the Algorand fee. It sits before the URL facilitator and offers only
Algorand, so PayAI never claims it. Off without the variable or with "off".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
GoPlausible's x402 catalog reads the x402-merchant extension (name,
website, logo, categories) when it settles a payment and shows it on the
merchant, one per pay-to address. Both paid routes now carry it, the same
on every fizzl.eu service.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TsD5haPKxeWjYmErHzvU48
@Fizzl13
Fizzl13 merged commit 1040b37 into main Oct 9, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants