v4.0.0
4.0.0 (2026-06-05)
Bug Fixes
- address CodeRabbit review findings from PR #666 (6a45703)
- ant-readable: use static crypto import for undername hash in getRecords (5885903)
- apis: add batch read apis (e4ab718)
- ci: biome ignore test/fixtures (e2e-test-wallet.json) (d2a2cd2)
- ci: keep AO defaults; lint/format fixes for CI (6da8250)
- cli: make claim-withdrawal Solana-only (24e3820)
- codama clients: update codama usage (16b0f45)
- codama: update codama clients and primary name price fetching (0a33d63)
- codama: update codama generated clients (889fedb)
- coderabbit: address all 11 review findings (74c06ca)
- contracts sdk: bump version to 18 (4ab5586)
- convert Solana delegate reward share from basis points to percent (7b14292)
- deps: pin @ar.io/solana-contracts to stable 1.0.0 (099c006), closes #666
- df: update demand factor instruction (20fd1fa)
- errors: fix lint errors (a34bc64)
- escrow: bind recipient + correct headers in canonical claim message (857f8c8)
- gateway: wire updateObserverAddress into updateGatewaySettings (c9e4320)
- idls: update idl package version (c1a4f22)
- ids: upgrade program ids (e152566)
- localnet-e2e: make sdk-e2e bootstrap work after monorepo split (4bdc89d), closes #6037
- mainnet ids: add mainnet ids (4957f18)
- package: add default export conditions for sdk entrypoints (980cbcf)
- package: update package.json types (2d50249)
- payment: update purchasing for names (dc0fc2b)
- pkg: re-export ARIO/ANT/ANTRegistry/types from solana barrel (a801c86)
- program ids: update program ids (bfef46b)
- solana/escrow: add clock-skew tolerance + isVaultClaimable helper (6e690a0)
- solana: add tenure and performance checks to gateway operator discount (65788f3)
- solana: address CodeRabbit nits on prune surface (99cf7f7), closes #621
- solana: bump @ar.io/solana-contracts to 0.4.0; wire ant_asset for reassign/release (50c92b2), closes #74 #73 pre-PR-#73
- solana: bundle CreateATA on every fresh-wallet path; add prune surface (9b84c33), closes #3012 #112
- solana: cap MAX_COMPOUND_BATCH at 6 so compound crank tx fits 1232B limit (012ea6e)
- solana: correct EscrowAntState/EscrowTokenState version field type (7f210f3), closes #639
- solana: crankEpochStep handles AO-continuity cold start (currentIndex>0) (baea1d8)
- solana: disable active vault-claim path; require post-unlock liquid claim (4a8087d), closes #74
- solana: don't sign ANT writes against an untrusted auto-detected program (6767501)
- solana: fail-fast on legacy primary-name state + add localnet coverage (174ccef), closes #643 pre-#159 post-#159
- solana: finalize_gone discovers Leaving gateways + supplies swapped-slot PDA (3f7bf04)
- solana: gateway deser drift + auto_stake cleanup (28772ee)
- solana: getTokenSupply protocolBalance = live reward reserve (dc4a003)
- solana: honor interface contracts in getDelegations, getCostDetails, transfer (e0bda92), closes #1
- solana: keep cumulativeRewardPerToken out of the public AoGateway shape (82dbfc4)
- solana: off-by-one in getCurrentEpoch + use codama decoder for Epoch (a3b356b)
- solana: pass AntConfig account for primary-name authorization (1d6371b), closes #91
- solana: primary-name deserializer + approvePrimaryName config + test 9 hermeticity (86edc61)
- solana: sync IDLs (eventing + admin-repair) and add cluster constants (94eca17), closes #103 #105
- tests: update tests (752b4f6)
- token bucket: add token bucket logic to circuit breaker rpc (1065547)
- use instant withdrawal when decreaase delegate instant boolean true (2962cc3)
- version: set version to 2 on solana tag (29fee17)
Features
- circuit breaker: add circuit breaker fallback on 429 to base public rpc (1377b32)
- cli: add claim-withdrawal command (d449db0)
- crank: close epoch observations before close_epoch (un-wedge progression) (9b26e1e)
- crank: prune expired returned names inside crankEpochStep (ad4ffbb)
- solana/escrow: expose claimVaultArweaveIx for attested-claim composition (5e0baed)
- solana: add crankEpochStep() — generalized one-action epoch crank primitive (ad4eb3e)
- solana: add getDisabledGatewaysWithDelegatedStake discovery helper (bd3595d), closes #6
- solana: add getWithdrawals per-owner read (14b918b)
- solana: compound + demand-factor crank steps in crankEpochStep (310ff1f)
- solana: expose save_observations + observer-side pre-flight helpers (c84a7d3)
- solana: finish AO rip — CLI cleanup, types prune, drop aoconnect dep (488811f)
- solana: predict prescribe_epoch observer selection off-chain (size-safe cranker path) (ebe3be3)
- solana: reclaim leaked prescribe Address Lookup Tables (d0fbb43)
- solana: return live delegation balances from read methods (d2d53a7)
- solana: submit prescribe via ephemeral Address Lookup Table; cap lifecycle batch (a39ee6f), closes #87
- solana: support disabled-gateway delegate claim + deferred reward-share ratio (GAR 1.1.0) (2398c3b), closes 6/#7 #7 #6
- solana: switch ario_* codegen to @ar.io/solana-contracts@0.1.0-devnet.0 (f8a0970), closes #19
- solana: switch SDK transfer() to standard SPL transferChecked (74a2fe5)
BREAKING CHANGES
- solana: for SDK consumers; wire-level routing changes only
The on-chain ario-core::transfer ix is being marked deprecated in
ar-io/ar-io-solana-contracts (separate PR). Coordinated with
ar-io/solana-ar-io PR for test cleanup + docs.
Note for reviewers: the existing @solana-program/compute-budget dep
in package.json is currently unused in source (send.ts hand-rolls
compute budget IXs). This PR sets the precedent of actually consuming
a @solana-program/* package — worth a follow-up to either consolidate
on @solana-program/* or drop the unused dep.
Plan: docs/REMOVE_CUSTOM_TRANSFER_PLAN.md in ar-io/solana-ar-io.
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
- adds a new
./solana(and./solana/generated)
subpath export. Default././node/./webentries unchanged and
remain AO-only. Major version bump per the plan: 3.24.0-solana → 4.0.0-solana.
Code
- src/solana/ — full SDK port: io-readable/io-writeable, ant-readable/
ant-writeable, ant-registry-readable/-writeable, escrow, spawn-ant,
funding-plan, canonical-message, deserialize, pda, send, ata,
metadata, mpl-core helpers, json-rpc shim, plus unit tests. - src/solana/generated/ — Codama-emitted typed clients for ario_ant,
ario_ant_escrow, ario_arns, ario_core, ario_gar, plus vendored
mpl_core. Committed per Solana ecosystem norm (mpl-core, spl-token). - src/cli/ —
--aoswitching flag, escrow CLI commands, ANT-program
override (--ant-program-id), Solana write paths in arnsPurchase /
gateway / transfer / antCommands. CLI is now a unified surface
across both AO + Solana backends. - src/common/io.ts, src/types/io.ts, src/utils/, src/types/ant*,
src/types/ant-registry.ts — Solana-aware factories onARIO/ANT/
ANTRegistry, plus the AoARIO* / AoANT* type extensions
(antProgramfield on records, etc.). Defaultnode/web
entry points re-export Solana classes soimport { ARIO } from '@ar.io/sdk/solana'resolves to the kit-backed implementation.
IDLs + codegen
- idls/ario_.json — checked-in copies of contracts/target/idl/.json
from solana-ar-io. Refresh runbook at docs/IDL_REFRESH.md. - idls/mpl_core.json — vendored from metaplex-foundation/mpl-core,
pinned to 4f97997fc1f514d51319ee32258902aae32a7ee0
(release/core@0.12.0). - scripts/codegen.mjs — Codama lowering pipeline. Reads idls/, emits
src/solana/generated//. Patches the
from '../programs'import on Codama's emittedinstructions/errors/files to point at a slimprogram-address.tsshim
(drops the kit-ClientarioFooProgram()plugin pattern we don't
use; keeps the per-instruction builders + per-error constants).
- .github/workflows/build.yml — new
codegen-driftjob runs
yarn codegenon every PR and fails ifsrc/solana/generated/
would change. Guarantees committed clients are always in sync
withidls/.
package.json
- version: 3.24.0-solana.1 → 4.0.0-solana.0
- keywords += "solana"
- exports: + "./solana" + "./solana/generated"
- dependencies: + @ardrive/turbo-sdk, + @solana-program/compute-budget,
- @solana/kit (runtime — kit types are in the public API),
- bs58
- devDependencies: + @codama/nodes-from-anchor, + @codama/renderers-js
(pinned 2.1.0; 2.2.0 changed DISCRIMINATOR types to ReadonlyUint8Array
which breaks downstream typing), + codama - scripts: + "codegen": "node ./scripts/codegen.mjs"
Test fixtures
- test/fixtures/e2e-test-wallet.json + README — localnet-only test
wallet copied from the monorepo. Localnet-only, never funded with
real assets. - test/helpers/{errors,index,time}.ts —
expectAnchorErrorhelper- Solana error code re-exports from
src/solana/generated/<program>/ errors/index.ts. Tests use the codama-emitted SCREAMING_SNAKE
error constants directly.
- Solana error code re-exports from
What stayed in the monorepo
- *.localnet.test.ts — Surfpool-driven on-chain integration tests.