Cost & plans
Three things drive what an upload costs — storage size, retention epochs, and your subscription tier. The first two are paid in Walrus FROST per PUT; the third is paid in USDC per billing period via the dapp.
Two separate costs
Per-blob fee charged at PUT time. Scales with encoded size × epochs. Paid from the publisher's wallet — your wallet pays SUI for Sui gas only.
Recurring fee for plan tier — gates SEAL access, file-count cap, lifetime cap. Paid via the Waldrop dapp; SDK only reads the active subscription.
The storage math
The 5× factor is RaptorQ erasure-coding redundancy. The exact factor
depends on n_shards (variable across Walrus networks), but 5× is a safe
upper bound the dapp + SDK both use.
storage_price_per_unit_per_epoch and write_price_per_unit come from
the live Walrus System shared object — read via:
Worked example — 10 MiB for 26 epochs
Run it yourself:
Whose wallet pays for storage?
The Walrus publisher does. The publisher is a service that:
- Receives your bytes via HTTP PUT
- Erasure-codes them into slivers
- Distributes slivers to storage nodes
- Pays the storage nodes in WAL from its own wallet
- Records the blob certificate on-chain
- Returns the
blob_idto you
The public testnet publisher (publisher.walrus-testnet.walrus.space)
absorbs the WAL cost — that's why it's free to use, with rate limits. For
production you'd run your own publisher and fund it.
Your wallet pays SUI for gas on the register_blob Sui transaction —
about 0.008 SUI per upload (~$0.0001 at testnet rates).
Subscription plans
Plans are managed by the contract's subscription module:
| Tier | SEAL | File cap | Lifetime cap | Notes |
|---|---|---|---|---|
| Free (0) | ❌ | low | short | Default — no encryption. |
| Starter (1) | ✅ | medium | medium | First paid tier. |
| Pro (2) | ✅ | high | long | Most use cases. |
| Enterprise (3) | ✅ | unlimited | maximum | Custom contract. |
Exact caps are stored in PlanRegistry on chain — they change without a
contract upgrade. The SDK reads SubscriptionSummary but doesn't surface
the registry yet; check the dapp's plans page for current numbers.
How to forecast cost in a UI
Drop this into your upload wizard so the user sees the cost before they commit:
For many estimates at once (a per-file table), fetch pricing once and pass it through to skip the per-call live read — see the Cost recipe.
Subscription lifecycle
The SDK only reads. To subscribe / upgrade / renew, build the PTBs with
@mysten/sui directly — the dapp's lib/transactions.ts is the reference.
When pricing isn't available
The on-chain Walrus System object can return partial state during network
upgrades. client.cost.estimate exposes this:
epochDays is 0 on testnet because epoch_duration_ms lives on a
different Walrus shared object (StakingInner). Default to 1 day per epoch
for testnet display.