Skip to content

Add 402 plugin: read-only Base intelligence priced per call over x402 - #163

Open
sukrutkrdg wants to merge 4 commits into
base:masterfrom
sukrutkrdg:plugin/402
Open

sukrutkrdg wants to merge 4 commits into
base:masterfrom
sukrutkrdg:plugin/402

Conversation

@sukrutkrdg

@sukrutkrdg sukrutkrdg commented Sep 17, 2026 •

Copy link
Copy Markdown

Adds skills/wallet-mcp/plugins/402.md. One new file, plus its four tags added to the tag vocabulary in references/plugin-spec.md; no edits to SKILL.md, the Integration Types examples, or the conformance table, per Contribution Scope.

What it is

402.com.tr prices read-only Base data per call over x402. There is no account, no API key and no tier: an unpaid GET returns 402 with the price and an accepts array, and the same GET with payment returns the answer. The plugin builds no calldata and submits no onchain writes of its own — the only transaction is the x402 payment, via initiate_x402_request / complete_x402_request.

integration: http-api, auth: none, chains: [base], requires.allowlist: [402.com.tr], risk: [irreversible].

Why it might be worth a slot

Tokenized-stock entitlements. Coinbase's tokenized equities are B20 Asset tokens, and B20 does not apply multiplier() to balanceOf() — the number a wallet, indexer or contract reads is not the number of shares owned. That stopped being theoretical on 14 September 2026: GOOGLc's multiplier moved 1.0 → 1.000377118676784179 in block 51310619 while balanceOf for the largest holder (Uniswap V4's PoolManager) and totalSupply both stayed put. Blocks and the cast commands to re-read it: https://402.com.tr/stocks/first-corporate-action. stock-position returns the reported and entitled figures side by side, plus a coverage block naming the venues it does not count.

B20 authenticity. A vanity 0xb200… address proves nothing — an ordinary contract can fake the whole B20 read surface. b20-authenticity decides membership by the onchain transfer-policy administrator instead of an address list.

Chat-only surfaces. Every endpoint is a GET with no auth headers, so there is no key for a user to paste and no POST body to construct. The free /api/catalog and /api/stocks reads need no payment at all.

Accuracy

Prices, parameter names and response shapes were read from the live catalogue and checked against real paid calls rather than copied from docs, including the error contract: after payment a malformed input answers 400 and is not settled, and a low-confidence refusal answers 502 and is not billed. The file tells the agent to read amount/payTo from the live challenge and never from the table.

Happy to adjust anything — naming, the endpoint selection, or the routing table — if a different shape fits the registry better.

@cb-heimdall

cb-heimdall commented Sep 17, 2026 •

Copy link
Copy Markdown
Collaborator

🟡 Heimdall Review Status

Requirement Status More Info
Reviews 🟡 0/1
Denominator calculation
Show calculation
1 if user is bot 0
1 if user is external 0
2 if repo is sensitive 0
From .codeflow.yml 1
Additional review requirements
Show calculation
Max 0
0
From CODEOWNERS 0
Global minimum 0
Max 1
1
1 if commit is unverified 0
Sum 1

402.com.tr prices read-only Base data per call over x402 - no account, no
API key, every endpoint a GET that answers 402 with its own price. The
plugin reads those endpoints and submits nothing onchain of its own; the
only transaction is the x402 payment, through initiate_x402_request /
complete_x402_request.

Two capabilities are hard to get elsewhere. Coinbase's tokenized
equities are B20 Asset tokens, and B20 does not apply multiplier() to
balanceOf() - so the number a wallet or contract reads is not the number
of shares owned. That became concrete on 2026-09-14 when GOOGLc's
multiplier moved 1.0 to 1.000377118676784179 in block 51310619 while
balanceOf and totalSupply both stayed put; stock-position returns the
reported and entitled figures side by side. Separately, a vanity 0xb200
address proves nothing about a B20, so b20-authenticity decides
membership by the onchain transfer-policy administrator.

Every endpoint is a GET with no auth headers, so the chat-only path
needs no key pasted and no POST body constructed.

Endpoint prices, parameters and response shapes were read from the live
catalogue and verified against paid calls, including the error contract:
a malformed input after payment answers 400 and is not settled, and a
low-confidence refusal answers 502 and is not billed.

The tags this plugin introduces are appended to the shared vocabulary in
plugin-spec.md, as that file asks. x402-payments was already in use by
the merged Venice plugin but missing from the list.
@sukrutkrdg sukrutkrdg reopened this Sep 18, 2026
402.com.tr prices read-only Base data per call over x402 - no account, no
API key, every endpoint a GET that answers 402 with its own price. The
plugin reads those endpoints and submits nothing onchain of its own; the
only transaction is the x402 payment, through initiate_x402_request /
complete_x402_request.

Two capabilities are hard to get elsewhere. Coinbase's tokenized
equities are B20 Asset tokens, and B20 does not apply multiplier() to
balanceOf() - so the number a wallet or contract reads is not the number
of shares owned. That became concrete on 2026-09-14 when GOOGLc's
multiplier moved 1.0 to 1.000377118676784179 in block 51310619 while
balanceOf and totalSupply both stayed put; stock-position returns the
reported and entitled figures side by side. Separately, a vanity 0xb200
address proves nothing about a B20, so b20-authenticity decides
membership by the onchain transfer-policy administrator.

Every endpoint is a GET with no auth headers, so the chat-only path
needs no key pasted and no POST body constructed.

Endpoint prices, parameters and response shapes were read from the live
catalogue and verified against paid calls, including the error contract:
a malformed input after payment answers 400 and is not settled, and a
low-confidence refusal answers 502 and is not billed.

The tags this plugin introduces are appended to the shared vocabulary in
plugin-spec.md, as that file asks. x402-payments was already in use by
the merged Venice plugin but missing from the list.
base-mcp is deprecated in favour of wallet-mcp (base#169). The plugin now lives in skills/wallet-mcp/plugins/, with Wallet MCP naming, the new tags added to the wallet-mcp vocabulary, and base-mcp left as on main. Also: stock-position is now $0.04, and step 3 checks payTo against the service's only payee.
@sukrutkrdg

Copy link
Copy Markdown
Author

Hi — gentle ping on this one. Since #169 moved the skill to wallet-mcp, I've moved the plugin to skills/wallet-mcp/plugins/402.md (Wallet MCP naming, tags added to the wallet-mcp vocabulary) and left base-mcp untouched, so it won't need removing in the deprecation follow-up. Branch is up to date with main, and the endpoints, prices and challenge shape were re-checked against the live service today. Happy to adjust anything — thanks for taking a look.

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