Skip to content

v4.0.0

Choose a tag to compare

@atticusofsparta atticusofsparta released this 05 Jun 21:26
· 10 commits to main since this release

4.0.0 (2026-06-05)

  • feat!: port Solana backend from solana-ar-io monorepo (6613766), closes #5

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/./web entries 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/ — --ao switching 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 on ARIO/ANT/
    ANTRegistry, plus the AoARIO* / AoANT* type extensions
    (antProgram field on records, etc.). Default node / web
    entry points re-export Solana classes so import { 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 emitted instructions/
    • errors/ files to point at a slim program-address.ts shim
      (drops the kit-Client arioFooProgram() plugin pattern we don't
      use; keeps the per-instruction builders + per-error constants).
  • .github/workflows/build.yml — new codegen-drift job runs
    yarn codegen on every PR and fails if src/solana/generated/
    would change. Guarantees committed clients are always in sync
    with idls/.

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 — expectAnchorError helper
    • Solana error code re-exports from src/solana/generated/<program>/ errors/index.ts. Tests use the codama-emitted SCREAMING_SNAKE
      error constants directly.

What stayed in the monorepo

  • *.localnet.test.ts — Surfpool-driven on-chain integration tests.