Release notes
What changed in the Radius Network, radius-sdk, radius-cli and the Radius skills
Every release, newest first. Each heading is a link you can share. Follow new releases with the Atom feed, or read this page as Markdown.
| Product | Latest | Released |
|---|---|---|
| Radius Network | build 099a1b5b | 2026-09-28 |
| radius-sdk | 0.7.0 | 2026-10-27 |
| radius-cli | 0.6.0 | 2026-10-27 |
| Radius skills | 0.2.2 | 2026-10-26 |
2026-10-27: radius-sdk 0.7.0
Breaking changes
-
Add Radius to an x402 server you already run.
radiusFacilitators(),registerRadius()andassertRadiusSupported()(fromradius-sdk/server) put the Radius facilitators and theexactscheme on your ownx402ResourceServer, for a pipeline that does its own verify, work and settle.settleis required there.Breaking for installs:
@x402/coreand@x402/evmmove from exact-pinned dependencies (2.27.0) to peer dependencies (^2.27.0), so your app and the SDK share one copy, and you can use a newer2.x(the tests also pass on 2.28.0). Install@x402/coreyourself;@x402/evmis an optional peer needed only forradius-sdk/client. A project that relied on the SDK installing them must add them to its ownpackage.json.settle: 'before'(the default) never calls the facilitator's/verify: x402 core'sverifyPayment()answersisValid: truewithout checking, and/settlevalidates. The docs and JSDoc now say so, andRadiusExactSchemeexposessettleand logs a one-time warning when built without it. The default forradiusPayments()andcreateRadiusServer()does not change.The README no longer says offers use Permit2: they use EIP-3009 unless a facilitator lists Permit2 first. The SDK's MPP covers the
evmcharge method only, not the Tempo method ofmppx; the docs say so.radius-clideclares@x402/evmitself, which it used to get throughradius-sdk.
New
createRadiusFetchandwallet payhandle redirects around a payment. A request whose 402 follows a redirect (fetch follows it, up to its limit of 20) is paid at the final URL, repeating the original method and body, as@x402/fetchand@x402/axiosdo. A redirect after payment is followed without the payment header, and the receipt is taken from itsPAYMENT-RESPONSE.redirect_refusedis no longer raised.createRadiusFetchno longer signs a facilitator-sponsored rawapprove(erc20ApprovalGasSponsoring: an unlimited Permit2 allowance) without asking. It now passes the same gate as the automatic Permit2 approval:permit2Approval: 'never'throwsapproval_required, andonApprovalRequiredis called withsponsored: 'erc20Approval'and may decline. The raw approve is withheld from the signing scheme unless approved, so it cannot be signed on its own, including when the allowance read fails.eip2612GasSponsoringpermits are signed per payment for the payment amount, so they are part of the payment and are not gated.wallet paywords its prompt and non-interactive refusal for the sponsored case;-yand--approve-permit2still allow it.
Fixes
- Await durable transfer checkpoint callbacks before advancing, retry failed checkpoints, and lag Radius transfer polling by five seconds by default. Document replay, chain-scoped deduplication, and archive receipt reconciliation limits.
2026-10-27: radius-cli 0.6.0
New
createRadiusFetchandwallet payhandle redirects around a payment. A request whose 402 follows a redirect (fetch follows it, up to its limit of 20) is paid at the final URL, repeating the original method and body, as@x402/fetchand@x402/axiosdo. A redirect after payment is followed without the payment header, and the receipt is taken from itsPAYMENT-RESPONSE.redirect_refusedis no longer raised.
Fixes
-
Add Radius to an x402 server you already run.
radiusFacilitators(),registerRadius()andassertRadiusSupported()(fromradius-sdk/server) put the Radius facilitators and theexactscheme on your ownx402ResourceServer, for a pipeline that does its own verify, work and settle.settleis required there.Breaking for installs:
@x402/coreand@x402/evmmove from exact-pinned dependencies (2.27.0) to peer dependencies (^2.27.0), so your app and the SDK share one copy, and you can use a newer2.x(the tests also pass on 2.28.0). Install@x402/coreyourself;@x402/evmis an optional peer needed only forradius-sdk/client. A project that relied on the SDK installing them must add them to its ownpackage.json.settle: 'before'(the default) never calls the facilitator's/verify: x402 core'sverifyPayment()answersisValid: truewithout checking, and/settlevalidates. The docs and JSDoc now say so, andRadiusExactSchemeexposessettleand logs a one-time warning when built without it. The default forradiusPayments()andcreateRadiusServer()does not change.The README no longer says offers use Permit2: they use EIP-3009 unless a facilitator lists Permit2 first. The SDK's MPP covers the
evmcharge method only, not the Tempo method ofmppx; the docs say so.radius-clideclares@x402/evmitself, which it used to get throughradius-sdk. -
createRadiusFetchno longer signs a facilitator-sponsored rawapprove(erc20ApprovalGasSponsoring: an unlimited Permit2 allowance) without asking. It now passes the same gate as the automatic Permit2 approval:permit2Approval: 'never'throwsapproval_required, andonApprovalRequiredis called withsponsored: 'erc20Approval'and may decline. The raw approve is withheld from the signing scheme unless approved, so it cannot be signed on its own, including when the allowance read fails.eip2612GasSponsoringpermits are signed per payment for the payment amount, so they are part of the payment and are not gated.wallet paywords its prompt and non-interactive refusal for the sponsored case;-yand--approve-permit2still allow it.
Uses radius-sdk@0.7.0.
2026-10-26: Radius skills 0.2.2
claude plugin update radius@tools · Install the skills
- The buyer install commands in the
x402andradius-devskills install both x402 peer packages,@x402/coreand@x402/evm.@x402/evmis an optional peer that npm and pnpm skip, which leftradius-sdk/clientunable to load. Thesell-apiskill names@x402/corefor sellers, and the plugin README says which peer each entry point needs.
2026-10-21: Radius skills 0.2.1
claude plugin update radius@tools · Install the skills
- The
sell-apiskill says Radius SBC offers use EIP-3009, not Permit2, and that MPP support is theevmcharge method only.
2026-10-16: Radius skills 0.2.0
claude plugin update radius@tools · Install the skills
- Breaking: the plugin is now
radiusin thetoolsmarketplace. Install it withclaude plugin marketplace add radiustechsystems/toolsandclaude plugin install radius@tools. It replacesradius-dev@radius-cli; an existing install needs a one-time migration (commands). Skill names are unchanged, and slash commands take theradiusprefix, for example/radius:sell-api. - The plugin README shows how to install the skills in Codex with
npx skills add.
2026-10-15: radius-sdk 0.6.0
New
proxyTo(origin)(fromradius-sdk/serverandradius-sdk/hono) forwards a request to an origin you do not change, for a seller in front of it:pay.wrap(proxyTo(origin)), orapp.all('/*', (c) => toOrigin(c.req.raw))after the Hono middleware. It keeps the method, path and query, buffers the body (a stream body needsduplexon Node), dropsHost, hop-by-hop headers (Node'sfetchthrows onKeep-Alive,Expectand others) and payment credentials, asks forAccept-Encoding: identityand dropsContent-Encoding/Content-Lengthwhenfetchdecoded a compressed body anyway, passes the request'ssignalso a disconnect aborts the origin request, returns redirects unfollowed, and copies the response headers so the receipt can be added.
Fixes
- Package metadata points at the renamed repository, github.com/radiustechsystems/tools.
- A paid route whose handler returns a
fetch()response no longer fails after settlement under@hono/node-server. The server's globalResponsekept the origin's immutable headers, so adding the receipt threwTypeError: immutable: withsettle: 'before'the payer was charged and got a 500, and with'after'a 402. The SDK now copies the headers before it adds the receipt.
2026-10-15: radius-cli 0.5.0
New
- Add
network: print the resolved network config (chain id, RPC, explorer, faucet, facilitator, SBC) as text or--json, without touching the network. - Add
wallet sign-typed-data(EIP-712) andwallet sign-jwt(ES256K), so agents can sign with the local account without exporting the private key. - Add
wallet faucet: request a faucet drip for the local account (testnet ~0.5 SBC, mainnet ~0.01 SBC/day), with--jsonoutput. sell check <url>checks a seller's402without paying: it decodes the x402PAYMENT-REQUIREDoffers and any MPPWWW-Authenticate: Paymentchallenge, checks each offer's network, asset and EIP-712 domain, amount (against--price, at the asset's decimals),payTo,resource.urlandmaxTimeoutSeconds, reads the facilitator's/supported(--facilitator, default the network's) for each offer's scheme, network and transfer method, and asks the SDK buyer whether it would pay.--probe-headwarns when an unpaidHEADis served, and--pay --thresholdmakes one paid request (testnet unless--network mainnet) and checks the receipt. Like the SDK buyer it also reads an x402 challenge from the JSON body, and a malformed offer is a failed check, not a crash. Prints a checklist or, with--json, a report; exits 1 when a check fails and 2 on invalid flags.
Fixes
- Package metadata points at the renamed repository, github.com/radiustechsystems/tools.
Uses radius-sdk@0.6.0.
2026-10-15: Radius skills 0.1.2
claude plugin update radius@tools · Install the skills
- The
sell-apiproxy snippet dropsContent-EncodingandContent-Lengthwhen Node'sfetchhas already decoded a compressed origin response, and passes the request'ssignalso a client disconnect aborts the origin request.
2026-10-15: Radius skills 0.1.1
claude plugin update radius@tools · Install the skills
- The
sell-apiskill covers a Hono proxy on Node in front of an origin (with a Dockerfile), checks that free routes stay free, and ends with a minimum verify checklist. Its gotchas add theduplexoption a stream body needs on Node, and the immutable-headers error a rawfetch()response hit after settlement under@hono/node-server.
2026-10-15: Radius skills 0.1.0
claude plugin update radius@tools · Install the skills
- New
sell-apiskill: charge for an API withradius-sdk. It detects the framework, installs and configures the SDK, runs the server locally, verifies the402withradius-cli sell check, and hands off deployment, with references for frameworks, protocols, networks and facilitators, and settlement. - The
x402skill covers buying and the protocol, and points sellers tosell-api.
2026-10-14: Radius skills 0.0.6
claude plugin update radius@tools · Install the skills
- Links and install commands point at the renamed repository, github.com/radiustechsystems/tools.
2026-10-13: radius-sdk 0.5.0
New
-
Require Node 22 or later. Node 20 reached end of life on 30 April 2026.
-
MPP (the HTTP
Paymentauth scheme,evmcharge method) alongside x402.Buyers:
createRadiusFetchpaysWWW-Authenticate: Paymentchallenges with an EIP-3009 authorization bound to the challenge, in theAuthorization: Paymentcredential mppx and other MPP servers expect, and readsPayment-Receipt.protocols(default['x402', 'mpp']) sets the preference when a 402 offers both (a funded network still beats an unfunded one across protocols).PaymentOfferis nowX402Offer | MppOffer, told apart byoffer.protocol;requirementsandx402Versionexist on x402 offers only.PaymentReceiptgainsprotocol, andgetPaymentReceiptalso readsPayment-Receipt.Sellers:
radiusPayments({ mpp: { secretKey } })adds an MPP challenge per network to every 402, mirroring the x402 offers, and accepts MPP credentials: checked statelessly (HMAC challenge id, realm, expiry, route price, nonce binding), then verified and settled by the network's x402 facilitator, before or after the handler persettle. Responses carryPayment-Receipt; the handler andonSettledget receipts withprotocol: 'mpp'. Not available through the upstream x402 framework adapters. -
Pay and charge on more than one network. Networks are now
PaymentNetworks (wasRadiusNetwork), built withdefinePaymentNetwork({ chain, asset })(wasdefineRadiusNetwork), with presets for Radius ('radius'/'mainnet','radius-testnet'/'testnet'), Base ('base') and Base Sepolia ('base-sepolia'), both paying in USDC. Presetnames are now the preset ids ('radius','radius-testnet'), andradiusNetworkForChainIdispresetForChainId.createRadiusFetch({ networks: [...] })pays on any of the listed networks, preferring them in order among those the payer's balance covers (preferFunded: falseskips the balance reads; none funded throwsinsufficient_balance);offer.networkandApprovalRequest.networkare thePaymentNetworkpaid on, a USDmaxPerRequestis converted per asset, andpayFetch.on(network)gives the wallet helpers for each network. x402 v1 challenges that name a network (base,base-sepolia) are matched too.radiusPayments({ networks: [...] })/createRadiusServeroffer one payment option per network on every route, each settled by its own facilitator ({ network, facilitator }); Base mainnet has no default facilitator, so sellers name one, and Base Sepolia defaults to x402.org. Receipts andonSettledreport the network a payment settled on. When a facilitator's/supportednames no transfer method,exactoffers now default to EIP-3009 (x402's default) instead of Permit2.
2026-10-13: radius-cli 0.4.0
New
wallet payalso pays MPP (WWW-Authenticate: Payment,evmcharges).--protocol auto|x402|mpp(defaultauto: x402 when a server offers both) chooses, and the JSONpaymentobject gainsprotocol. Messages are now prefixedpay:instead ofx402:.wallet x402is renamedwallet payand can pay in USDC on Base:--networks radius,base(orRADIUS_PAY_NETWORKS/payNetworksin the config file) lists the networks to pay on, in preference order (the first one the wallet can cover wins), and--network testnetpairs Radius testnet with Base Sepolia. Base RPCs are set withRADIUS_BASE_RPC_URL/RADIUS_BASE_SEPOLIA_RPC_URLorrpcUrls.base/rpcUrls["base-sepolia"].--x402-thresholdand--x402-approve-permit2are renamed--thresholdand--approve-permit2, prompts and messages name the network and its token, and the JSONpaymentobject gainsnetwork.- Require Node 22 or later. Node 20 reached end of life on 30 April 2026.
Uses radius-sdk@0.5.0.
2026-10-13: Radius skills 0.0.5
claude plugin update radius@tools · Install the skills
- The
radius-devskill requires Node.js 22 or later forradius-sdk.
2026-10-13: Radius skills 0.0.4
claude plugin update radius@tools · Install the skills
- The skills use
radius-cli wallet payand--threshold, the new names forwallet x402and--x402-thresholdin radius-cli 0.4.0.
2026-10-08: radius-sdk 0.4.0
Breaking changes
-
Accept payments from any HTTP stack, not just Hono. New
radius-sdk/serverentry point:radiusPayments()is a web-standard handler (Requestin,Responseout) for Cloudflare Workers without a framework, Bun, Deno, Node 18+, and Next.js / SvelteKit / Remix route handlers. Paid handlers receive the settled receipt as a second argument.createRadiusServer()exposes the Radius x402 resource server and aroutes()builder that plug straight into the upstream adapters:paymentMiddleware(radius.routes({ … }), radius.server)with@x402/express,@x402/nextor@x402/hono.onSettledis registered on the resource server, so it fires whichever adapter served the request (it receives the x402 request context;requestOf(context)returns theRequestfor the SDK's own adapters). Errors thrown byonSettledare logged by x402 core instead of failing the request.- Paid responses stream through in the default
settle: 'before'flow instead of being buffered (the previous Hono middleware buffered every paid response, stalling SSE and token streams). - Breaking:
radius-sdk/honois now a thin wrapper over the web-standard handler with the same options.RadiusHonoAdapteris removed;RequestAdapterfromradius-sdk/server(an x402HTTPAdapterover a web-standardRequest) replaces it. @x402/core/@x402/evmbumped to 2.27.0 (the version line the upstream adapters require).- New examples:
examples/worker-plain(no framework),examples/express-seller(@x402/express) andexamples/astro-seller(validate before charging in an Astro API route).
Fixes
radiusPaymentsaccepts facilitators that list theeip3009transfer method forexact. Previously every paid route answered 500 once the facilitator's/supportednamedeip3009beforepermit2.radiusPaymentsanswers502(facilitator_error) when a facilitator call fails without the facilitator's own answer, such as a dropped connection or an error page from a gateway. These were reported as402, which a buyer reads as "rejected, nothing moved", although a settle may have reached the chain. The facilitator's own rejections are still402.
2026-10-08: radius-cli 0.3.1
Uses radius-sdk@0.4.0.
2026-10-07: Radius skills 0.0.3
claude plugin update radius@tools · Install the skills
- The
radius-devandx402skills build withradius-sdk(radius-sdk/clientfor buyers,radius-sdk/honofor sellers) andradius-cli, with viem for other EVM work, instead of hand-written viem payment code.
2026-10-02: Radius skills 0.0.2
claude plugin update radius@tools · Install the skills
- The
radius-dev,x402anddripping-faucetskills move into this repository as theradius-devClaude Code plugin, with eval cases that run in CI.
2026-09-30: radius-sdk 0.3.0
New
- Add Permit2 interactions covering both SignatureTransfer (with optional witness) and AllowanceTransfer:
approvePermit2,signPermit2Transfer,permit2TransferFrom,signPermit2Allowance,permit2Permit,permit2AllowanceTransferFrom, thepermit2Actions()client extension and the EIP-712 helpers, exported fromradius-sdk/client.
2026-09-30: radius-sdk 0.2.0
New
- Add ERC-20 interactions as viem actions, exported from
radius-sdk/client:getTokenMetadata,getAllowance,approve,transfer,transferFrom,getTransfers,watchTransfersand theerc20Actions({ token?, network? })client extension. The default token is the payment asset of the client's chain when it is a Radius preset, or ofnetwork; any other chain must name atoken(aconfigerror, never a silent SBC address). Writes wait for the receipt;wait: falsereturnsstatus: 'pending'(TxResult.statusis now'pending' | 'success' | 'reverted').getTransfersdefaults to the lastMAX_LOG_RANGE(1e6) blocks and splits wider ranges into sequentialeth_getLogscalls;watchTransfersis an SDK poller with a resumablefromBlock, ordered at-least-once delivery,onCheckpoint, retry without gaps, andtransferKeyas the dedupe key.createRadiusFetch(...)gainsallowance(spender)andapprove(spender, amount); every allowance change it makes (payment-time Permit2 approval,approvePermit2(),approve()) now passes throughonApprovalRequired, whoseApprovalRequestcarries areasonand an optionaloffer.
Fixes
- README: drop the PoC and unpublished-preview wording, add an entry-point table, and list every
src/module.
2026-09-30: radius-cli 0.3.0
New
walletruns its ERC-20 interactions onradius-sdk/client'serc20Actionsand balance actions.wallet send <to> <amount> 0xTokentransfers any ERC-20 (decimals read on-chain), next toSBCandRUSD.wallet balancenow reports native RUSD and SBC separately instead of adding SBC to the aggregateeth_getBalance(which already includes it), sototalUsdno longer double counts; the JSON gainsaggregateWeiandrusdSource.
Uses radius-sdk@0.3.0.
2026-09-30: radius-cli 0.2.1
Fixes
- README: SBC has a built-in default address (from
radius-sdk);--sbc/RADIUS_SBC_ADDRESSare only needed for another deployment.
Uses radius-sdk@0.2.0.
2026-09-28: Radius Network
Network build 099a1b5b.
Improvements
- Historical
eth_getLogsqueries are available again, within the existing address-filter and block-range limits.eth_getBlockByNumberlookups are faster. - Reduced overhead for RPC requests.
- Improved reliability when scaling nodes and recovering from failures.
2026-09-24: Radius Network
Network build 10eea1f9.
Improvements
- Improved reliability when scaling nodes.
API / RPC changes
eth_call / eth_estimateGas — Turnstile simulation behavior
- Before: One full Turnstile iteration was always applied during simulation.
balanceOfin aneth_callreturnedbalance − TURNSTILE_TOKEN_COSTregardless of gas price. - After: If
gas_price × gas_limit + value = 0, zero iterations run.balanceOfin simulation returns the actual, unmodified balance.
Affected clients: If your integration calls eth_call against a Turnstile-enabled wallet and parses the returned balance by subtracting an expected TURNSTILE_TOKEN_COST, update your logic. At zero gas price, no deduction occurs and the full balance is returned. No change is required for integrations running against nodes with a non-zero system gas price.
eth_sendRawTransaction / eth_sendRawTransactionSync — Rejection error messages differentiated
- Before: All pending pool rejections returned a single generic error message.
- After: Each rejection reason (gas price too low, duplicate nonce, replace-by-fee underpriced, and so on) returns a distinct error message.
Affected clients: If your client inspects the error message text to detect and handle specific rejection reasons, update your error parsing to match the new format. Clients that only check for the presence of an error without parsing the message body are unaffected.
2026-09-23: radius-sdk 0.1.0
New
- Add balance queries that separate native RUSD from convertible stablecoin holdings:
getBalances,getNativeBalance,getAggregateBalance,getTokenBalanceand theradiusActions()client extension, exported fromradius-sdk/client.
Fixes
- Make viem an optional peer dependency so buyer applications can supply their existing compatible installation. Remove its runtime import from shared network definitions so root and Hono seller imports no longer load viem. Document entry-point dependencies and add runtime import-isolation checks. Upstream x402 dependencies can still install viem transitively.
2026-09-23: radius-cli 0.2.0
New
wallet x402now pays throughradius-sdk: Permit2 approvals are gas-sponsored when the server declareseip2612GasSponsoring, payments are in SBC only on the configured network, the keystore is unlocked only after a 402 has been parsed and matched, and--x402-approve-permit2grants an approval even when sponsored.--x402-thresholdis now a hard cap even with--yes: an offer above it is refused (exit 2) instead of paid; drop the threshold to let--yespay any amount. The hand-rolled x402 client is gone.
Fixes
- Point the package's
repository,homepageandbugsmetadata at github.com/radiustechsystems/radius-cli (it named a non-existentradiustechorg). npm provenance requiresrepository.urlto match the repository the package is published from.
Uses radius-sdk@0.1.0.
2026-05-11: Radius Network
Network build 0d56ee4e.
Improvements
-
Lower Turnstile minimum transaction size: The minimum amount of SBC required to trigger a Turnstile gas conversion has been reduced tenfold — from 0.10 SBC to 0.01 SBC per execution. Wallets with small token balances can now participate in transactions that previously required a larger deposit. The 10.0 SBC per-transaction ceiling is unchanged.
-
More accurate balance reporting:
eth_getBalancenow returns your full SBC token holdings converted to native currency, with no artificial ceiling. Previously the reported balance was capped at the per-transaction execution limit; now wallets with larger holdings see their true total displayed in block explorers and wallets. Note that the per-transaction spending limit remains in effect — the displayed balance may exceed what can be spent in a single transaction.
API / RPC changes
eth_getBalance — semantics change
- Before: Balance was floored to the nearest minimum debit unit and capped at the maximum per-transaction backfill amount.
- After:
token_balance × per_unit_exchange_rate + raw_native— no floor rounding, no cap.
Affected clients: Any client that uses eth_getBalance to predict whether a transaction will succeed based on comparing the balance to the transaction value. The returned balance may now be higher than what the network will actually provision for a single transaction. Use eth_estimateGas to validate that a specific transaction will succeed before submitting.
2026-04-23: Radius Network
Network build 1c1556c2.
Improvements
- Internal stability and reliability improvements.
2026-04-15: Radius Network
Network build 7b8a282a.
Improvements
eth_sendRawTransactionnow queues transactions rejected withNonceTooHighin a per-sender pending transaction pool and retries them automatically in a background clearout loop. The pool supports up to 30 queued transactions per sender across up to 100 addresses. Replace-by-fee is supported.eth_sendRawTransactionSyncnow returns EIP-7966 error code6with the expected nonce on nonce gaps, avoiding an extraeth_getTransactionCountround-trip.eth_calldry-runs now skip balance validation unconditionally.
2026-03-30: Radius Network
Network build b0d6dd06.
BREAKING CHANGES
- The Mainnet Chain ID has been updated from
723to723487.
New features
- Method requests referring to old states will now return an error. Radius does not store historical state and such requests succeeding may be misleading. Note: block numbers within the last 1000 seconds will be treated as "current" for tooling compatibility.
- Supports
eth_maxPriorityFeePerGas.
Improvements
- Internal Performance Improvements
Bug Fixes
- Logs in receipts will correctly populate block hash, block number and transaction index.
- Return
nullinstead of0x0for thetofield in contract creation transaction receipts. - Return
nullfor invalid block hashes, in requests toeth_getBlockByHash.
2026-03-26: Radius Network
Network build 89b06f15.
New features
- Support for
eth_sendRawTransactionSync - You can now trigger the turnstile by sending gas tokens directly, rather than just allowin the turnstile to cover gas fees.
- E.g.
cast send --value 0.1ether ...will trigger the turnstile if you do not have enough gas tokens to cover the transaction, up to a limit of 10 RUSD.
- E.g.
Improvements
- Internal Performance Improvements
Bug fixes
- Fixes a bug where in some cases receipt requests would return the incorrect receipt. This occurred in cases of very high load on transactions involving conflicting state.
Docs
- Added release notes page