Skip to content
LogoLogo

Release notes

What changed in the Radius Network, radius-sdk, radius-cli and the Radius skills

View as Markdown

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.

ProductLatestReleased
Radius Networkbuild 099a1b5b2026-09-28
radius-sdk0.7.02026-10-27
radius-cli0.6.02026-10-27
Radius skills0.2.22026-10-26

2026-10-27: radius-sdk 0.7.0

npm · GitHub release

Breaking changes

  • Add Radius to an x402 server you already run. radiusFacilitators(), registerRadius() and assertRadiusSupported() (from radius-sdk/server) put the Radius facilitators and the exact scheme on your own x402ResourceServer, for a pipeline that does its own verify, work and settle. settle is required there.

    Breaking for installs: @x402/core and @x402/evm move 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 newer 2.x (the tests also pass on 2.28.0). Install @x402/core yourself; @x402/evm is an optional peer needed only for radius-sdk/client. A project that relied on the SDK installing them must add them to its own package.json.

    settle: 'before' (the default) never calls the facilitator's /verify: x402 core's verifyPayment() answers isValid: true without checking, and /settle validates. The docs and JSDoc now say so, and RadiusExactScheme exposes settle and logs a one-time warning when built without it. The default for radiusPayments() and createRadiusServer() 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 evm charge method only, not the Tempo method of mppx; the docs say so.

    radius-cli declares @x402/evm itself, which it used to get through radius-sdk.

New

  • createRadiusFetch and wallet pay handle 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/fetch and @x402/axios do. A redirect after payment is followed without the payment header, and the receipt is taken from its PAYMENT-RESPONSE. redirect_refused is no longer raised.
  • createRadiusFetch no longer signs a facilitator-sponsored raw approve (erc20ApprovalGasSponsoring: an unlimited Permit2 allowance) without asking. It now passes the same gate as the automatic Permit2 approval: permit2Approval: 'never' throws approval_required, and onApprovalRequired is called with sponsored: '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. eip2612GasSponsoring permits are signed per payment for the payment amount, so they are part of the payment and are not gated. wallet pay words its prompt and non-interactive refusal for the sponsored case; -y and --approve-permit2 still 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

npm · GitHub release

New

  • createRadiusFetch and wallet pay handle 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/fetch and @x402/axios do. A redirect after payment is followed without the payment header, and the receipt is taken from its PAYMENT-RESPONSE. redirect_refused is no longer raised.

Fixes

  • Add Radius to an x402 server you already run. radiusFacilitators(), registerRadius() and assertRadiusSupported() (from radius-sdk/server) put the Radius facilitators and the exact scheme on your own x402ResourceServer, for a pipeline that does its own verify, work and settle. settle is required there.

    Breaking for installs: @x402/core and @x402/evm move 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 newer 2.x (the tests also pass on 2.28.0). Install @x402/core yourself; @x402/evm is an optional peer needed only for radius-sdk/client. A project that relied on the SDK installing them must add them to its own package.json.

    settle: 'before' (the default) never calls the facilitator's /verify: x402 core's verifyPayment() answers isValid: true without checking, and /settle validates. The docs and JSDoc now say so, and RadiusExactScheme exposes settle and logs a one-time warning when built without it. The default for radiusPayments() and createRadiusServer() 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 evm charge method only, not the Tempo method of mppx; the docs say so.

    radius-cli declares @x402/evm itself, which it used to get through radius-sdk.

  • createRadiusFetch no longer signs a facilitator-sponsored raw approve (erc20ApprovalGasSponsoring: an unlimited Permit2 allowance) without asking. It now passes the same gate as the automatic Permit2 approval: permit2Approval: 'never' throws approval_required, and onApprovalRequired is called with sponsored: '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. eip2612GasSponsoring permits are signed per payment for the payment amount, so they are part of the payment and are not gated. wallet pay words its prompt and non-interactive refusal for the sponsored case; -y and --approve-permit2 still 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 x402 and radius-dev skills install both x402 peer packages, @x402/core and @x402/evm. @x402/evm is an optional peer that npm and pnpm skip, which left radius-sdk/client unable to load. The sell-api skill names @x402/core for 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-api skill says Radius SBC offers use EIP-3009, not Permit2, and that MPP support is the evm charge method only.

2026-10-16: Radius skills 0.2.0

claude plugin update radius@tools · Install the skills

  • Breaking: the plugin is now radius in the tools marketplace. Install it with claude plugin marketplace add radiustechsystems/tools and claude plugin install radius@tools. It replaces radius-dev@radius-cli; an existing install needs a one-time migration (commands). Skill names are unchanged, and slash commands take the radius prefix, 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

npm · GitHub release

New

  • proxyTo(origin) (from radius-sdk/server and radius-sdk/hono) forwards a request to an origin you do not change, for a seller in front of it: pay.wrap(proxyTo(origin)), or app.all('/*', (c) => toOrigin(c.req.raw)) after the Hono middleware. It keeps the method, path and query, buffers the body (a stream body needs duplex on Node), drops Host, hop-by-hop headers (Node's fetch throws on Keep-Alive, Expect and others) and payment credentials, asks for Accept-Encoding: identity and drops Content-Encoding/Content-Length when fetch decoded a compressed body anyway, passes the request's signal so 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 global Response kept the origin's immutable headers, so adding the receipt threw TypeError: immutable: with settle: '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

npm · GitHub release

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) and wallet 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 --json output.
  • sell check <url> checks a seller's 402 without paying: it decodes the x402 PAYMENT-REQUIRED offers and any MPP WWW-Authenticate: Payment challenge, checks each offer's network, asset and EIP-712 domain, amount (against --price, at the asset's decimals), payTo, resource.url and maxTimeoutSeconds, 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-head warns when an unpaid HEAD is served, and --pay --threshold makes 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-api proxy snippet drops Content-Encoding and Content-Length when Node's fetch has already decoded a compressed origin response, and passes the request's signal so 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-api skill 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 the duplex option a stream body needs on Node, and the immutable-headers error a raw fetch() 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-api skill: charge for an API with radius-sdk. It detects the framework, installs and configures the SDK, runs the server locally, verifies the 402 with radius-cli sell check, and hands off deployment, with references for frameworks, protocols, networks and facilitators, and settlement.
  • The x402 skill covers buying and the protocol, and points sellers to sell-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

npm · GitHub release

New

  • Require Node 22 or later. Node 20 reached end of life on 30 April 2026.

  • MPP (the HTTP Payment auth scheme, evm charge method) alongside x402.

    Buyers: createRadiusFetch pays WWW-Authenticate: Payment challenges with an EIP-3009 authorization bound to the challenge, in the Authorization: Payment credential mppx and other MPP servers expect, and reads Payment-Receipt. protocols (default ['x402', 'mpp']) sets the preference when a 402 offers both (a funded network still beats an unfunded one across protocols). PaymentOffer is now X402Offer | MppOffer, told apart by offer.protocol; requirements and x402Version exist on x402 offers only. PaymentReceipt gains protocol, and getPaymentReceipt also reads Payment-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 per settle. Responses carry Payment-Receipt; the handler and onSettled get receipts with protocol: 'mpp'. Not available through the upstream x402 framework adapters.

  • Pay and charge on more than one network. Networks are now PaymentNetworks (was RadiusNetwork), built with definePaymentNetwork({ chain, asset }) (was defineRadiusNetwork), with presets for Radius ('radius' / 'mainnet', 'radius-testnet' / 'testnet'), Base ('base') and Base Sepolia ('base-sepolia'), both paying in USDC. Preset names are now the preset ids ('radius', 'radius-testnet'), and radiusNetworkForChainId is presetForChainId.

    createRadiusFetch({ networks: [...] }) pays on any of the listed networks, preferring them in order among those the payer's balance covers (preferFunded: false skips the balance reads; none funded throws insufficient_balance); offer.network and ApprovalRequest.network are the PaymentNetwork paid on, a USD maxPerRequest is converted per asset, and payFetch.on(network) gives the wallet helpers for each network. x402 v1 challenges that name a network (base, base-sepolia) are matched too.

    radiusPayments({ networks: [...] }) / createRadiusServer offer 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 and onSettled report the network a payment settled on. When a facilitator's /supported names no transfer method, exact offers now default to EIP-3009 (x402's default) instead of Permit2.

2026-10-13: radius-cli 0.4.0

npm · GitHub release

New

  • wallet pay also pays MPP (WWW-Authenticate: Payment, evm charges). --protocol auto|x402|mpp (default auto: x402 when a server offers both) chooses, and the JSON payment object gains protocol. Messages are now prefixed pay: instead of x402:.
  • wallet x402 is renamed wallet pay and can pay in USDC on Base: --networks radius,base (or RADIUS_PAY_NETWORKS / payNetworks in the config file) lists the networks to pay on, in preference order (the first one the wallet can cover wins), and --network testnet pairs Radius testnet with Base Sepolia. Base RPCs are set with RADIUS_BASE_RPC_URL / RADIUS_BASE_SEPOLIA_RPC_URL or rpcUrls.base / rpcUrls["base-sepolia"]. --x402-threshold and --x402-approve-permit2 are renamed --threshold and --approve-permit2, prompts and messages name the network and its token, and the JSON payment object gains network.
  • 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-dev skill requires Node.js 22 or later for radius-sdk.

2026-10-13: Radius skills 0.0.4

claude plugin update radius@tools · Install the skills

  • The skills use radius-cli wallet pay and --threshold, the new names for wallet x402 and --x402-threshold in radius-cli 0.4.0.

2026-10-08: radius-sdk 0.4.0

npm · GitHub release

Breaking changes

  • Accept payments from any HTTP stack, not just Hono. New radius-sdk/server entry point:

    • radiusPayments() is a web-standard handler (Request in, Response out) 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 a routes() builder that plug straight into the upstream adapters: paymentMiddleware(radius.routes({ … }), radius.server) with @x402/express, @x402/next or @x402/hono.
    • onSettled is registered on the resource server, so it fires whichever adapter served the request (it receives the x402 request context; requestOf(context) returns the Request for the SDK's own adapters). Errors thrown by onSettled are 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/hono is now a thin wrapper over the web-standard handler with the same options. RadiusHonoAdapter is removed; RequestAdapter from radius-sdk/server (an x402 HTTPAdapter over a web-standard Request) replaces it.
    • @x402/core / @x402/evm bumped to 2.27.0 (the version line the upstream adapters require).
    • New examples: examples/worker-plain (no framework), examples/express-seller (@x402/express) and examples/astro-seller (validate before charging in an Astro API route).

Fixes

  • radiusPayments accepts facilitators that list the eip3009 transfer method for exact. Previously every paid route answered 500 once the facilitator's /supported named eip3009 before permit2.
  • radiusPayments answers 502 (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 as 402, which a buyer reads as "rejected, nothing moved", although a settle may have reached the chain. The facilitator's own rejections are still 402.

2026-10-08: radius-cli 0.3.1

npm · GitHub release

Uses radius-sdk@0.4.0.

2026-10-07: Radius skills 0.0.3

claude plugin update radius@tools · Install the skills

  • The radius-dev and x402 skills build with radius-sdk (radius-sdk/client for buyers, radius-sdk/hono for sellers) and radius-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, x402 and dripping-faucet skills move into this repository as the radius-dev Claude Code plugin, with eval cases that run in CI.

2026-09-30: radius-sdk 0.3.0

npm · GitHub release

New

  • Add Permit2 interactions covering both SignatureTransfer (with optional witness) and AllowanceTransfer: approvePermit2, signPermit2Transfer, permit2TransferFrom, signPermit2Allowance, permit2Permit, permit2AllowanceTransferFrom, the permit2Actions() client extension and the EIP-712 helpers, exported from radius-sdk/client.

2026-09-30: radius-sdk 0.2.0

npm · GitHub release

New

  • Add ERC-20 interactions as viem actions, exported from radius-sdk/client: getTokenMetadata, getAllowance, approve, transfer, transferFrom, getTransfers, watchTransfers and the erc20Actions({ token?, network? }) client extension. The default token is the payment asset of the client's chain when it is a Radius preset, or of network; any other chain must name a token (a config error, never a silent SBC address). Writes wait for the receipt; wait: false returns status: 'pending' (TxResult.status is now 'pending' | 'success' | 'reverted'). getTransfers defaults to the last MAX_LOG_RANGE (1e6) blocks and splits wider ranges into sequential eth_getLogs calls; watchTransfers is an SDK poller with a resumable fromBlock, ordered at-least-once delivery, onCheckpoint, retry without gaps, and transferKey as the dedupe key. createRadiusFetch(...) gains allowance(spender) and approve(spender, amount); every allowance change it makes (payment-time Permit2 approval, approvePermit2(), approve()) now passes through onApprovalRequired, whose ApprovalRequest carries a reason and an optional offer.

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

npm · GitHub release

New

  • wallet runs its ERC-20 interactions on radius-sdk/client's erc20Actions and balance actions. wallet send <to> <amount> 0xToken transfers any ERC-20 (decimals read on-chain), next to SBC and RUSD. wallet balance now reports native RUSD and SBC separately instead of adding SBC to the aggregate eth_getBalance (which already includes it), so totalUsd no longer double counts; the JSON gains aggregateWei and rusdSource.

Uses radius-sdk@0.3.0.

2026-09-30: radius-cli 0.2.1

npm · GitHub release

Fixes

  • README: SBC has a built-in default address (from radius-sdk); --sbc / RADIUS_SBC_ADDRESS are only needed for another deployment.

Uses radius-sdk@0.2.0.

2026-09-28: Radius Network

Network build 099a1b5b.

Improvements

  • Historical eth_getLogs queries are available again, within the existing address-filter and block-range limits. eth_getBlockByNumber lookups 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. balanceOf in an eth_call returned balance − TURNSTILE_TOKEN_COST regardless of gas price.
  • After: If gas_price × gas_limit + value = 0, zero iterations run. balanceOf in 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

npm · GitHub release

New

  • Add balance queries that separate native RUSD from convertible stablecoin holdings: getBalances, getNativeBalance, getAggregateBalance, getTokenBalance and the radiusActions() client extension, exported from radius-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

npm · GitHub release

New

  • wallet x402 now pays through radius-sdk: Permit2 approvals are gas-sponsored when the server declares eip2612GasSponsoring, 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-permit2 grants an approval even when sponsored. --x402-threshold is now a hard cap even with --yes: an offer above it is refused (exit 2) instead of paid; drop the threshold to let --yes pay any amount. The hand-rolled x402 client is gone.

Fixes

  • Point the package's repository, homepage and bugs metadata at github.com/radiustechsystems/radius-cli (it named a non-existent radiustech org). npm provenance requires repository.url to 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_getBalance now 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_sendRawTransaction now queues transactions rejected with NonceTooHigh in 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_sendRawTransactionSync now returns EIP-7966 error code 6 with the expected nonce on nonce gaps, avoiding an extra eth_getTransactionCount round-trip.
  • eth_call dry-runs now skip balance validation unconditionally.

2026-03-30: Radius Network

Network build b0d6dd06.

BREAKING CHANGES

  • The Mainnet Chain ID has been updated from 723 to 723487.

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 null instead of 0x0 for the to field in contract creation transaction receipts.
  • Return null for invalid block hashes, in requests to eth_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.

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