# 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](https://docs.radiustech.xyz/release-notes.xml), or read this page as [Markdown](https://docs.radiustech.xyz/release-notes.md).

| Product        | Latest                                       | Released   |
| -------------- | -------------------------------------------- | ---------- |
| Radius Network | [build 099a1b5b](#2026-09-28-radius-network) | 2026-09-28 |
| radius-sdk     | [0.7.0](#2026-10-27-radius-sdk-070)          | 2026-10-27 |
| radius-cli     | [0.6.0](#2026-10-27-radius-cli-060)          | 2026-10-27 |
| Radius skills  | [0.2.2](#2026-10-26-radius-skills-022)       | 2026-10-26 |

## 2026-10-27: radius-sdk 0.7.0

[npm](https://www.npmjs.com/package/radius-sdk/v/0.7.0) · [GitHub release](https://github.com/radiustechsystems/tools/releases/tag/radius-sdk%400.7.0)

### 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](https://www.npmjs.com/package/radius-cli/v/0.6.0) · [GitHub release](https://github.com/radiustechsystems/tools/releases/tag/radius-cli%400.6.0)

### 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](/build/coding-assistants.md)

* **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](/build/coding-assistants.md)

* **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](/build/coding-assistants.md)

* **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](https://docs.radiustech.xyz/build/coding-assistants#claude-code)). 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](https://www.npmjs.com/package/radius-sdk/v/0.6.0) · [GitHub release](https://github.com/radiustechsystems/tools/releases/tag/radius-sdk%400.6.0)

### 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](https://www.npmjs.com/package/radius-cli/v/0.5.0) · [GitHub release](https://github.com/radiustechsystems/tools/releases/tag/radius-cli%400.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) 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](/build/coding-assistants.md)

* **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](/build/coding-assistants.md)

* **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](/build/coding-assistants.md)

* **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](/build/coding-assistants.md)

* **Links and install commands point at the renamed repository, github.com/radiustechsystems/tools.**

## 2026-10-13: radius-sdk 0.5.0

[npm](https://www.npmjs.com/package/radius-sdk/v/0.5.0) · [GitHub release](https://github.com/radiustechsystems/tools/releases/tag/radius-sdk%400.5.0)

### 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 `PaymentNetwork`s (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 `name`s 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](https://www.npmjs.com/package/radius-cli/v/0.4.0) · [GitHub release](https://github.com/radiustechsystems/tools/releases/tag/radius-cli%400.4.0)

### 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](/build/coding-assistants.md)

* **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](/build/coding-assistants.md)

* **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](https://www.npmjs.com/package/radius-sdk/v/0.4.0) · [GitHub release](https://github.com/radiustechsystems/tools/releases/tag/radius-sdk%400.4.0)

### 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](https://www.npmjs.com/package/radius-cli/v/0.3.1) · [GitHub release](https://github.com/radiustechsystems/tools/releases/tag/radius-cli%400.3.1)

Uses `radius-sdk@0.4.0`.

## 2026-10-07: Radius skills 0.0.3

`claude plugin update radius@tools` · [Install the skills](/build/coding-assistants.md)

* **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](/build/coding-assistants.md)

* **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](https://www.npmjs.com/package/radius-sdk/v/0.3.0) · [GitHub release](https://github.com/radiustechsystems/tools/releases/tag/radius-sdk%400.3.0)

### 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](https://www.npmjs.com/package/radius-sdk/v/0.2.0) · [GitHub release](https://github.com/radiustechsystems/tools/releases/tag/radius-sdk%400.2.0)

### 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](https://www.npmjs.com/package/radius-cli/v/0.3.0) · [GitHub release](https://github.com/radiustechsystems/tools/releases/tag/radius-cli%400.3.0)

### 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](https://www.npmjs.com/package/radius-cli/v/0.2.1) · [GitHub release](https://github.com/radiustechsystems/tools/releases/tag/radius-cli%400.2.1)

### 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](https://www.npmjs.com/package/radius-sdk/v/0.1.0) · [GitHub release](https://github.com/radiustechsystems/tools/releases/tag/radius-sdk%400.1.0)

### 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](https://www.npmjs.com/package/radius-cli/v/0.2.0) · [GitHub release](https://github.com/radiustechsystems/tools/releases/tag/radius-cli%400.2.0)

### 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
