What is the Sui storage fund and storage rebate?
October 28, 2026
The storage fund is a pool of SUI made up of the storage fees users pay whenever a transaction writes data onchain. The fund counts as stake, so it earns stake rewards. Those rewards pay validators for keeping data stored long after the user who wrote it has paid. The storage rebate is the refund you get when you delete or shrink an object. Sui pays back almost all of the fee that was paid when the object was stored, so cleaning up state is cheaper than leaving it.
Why it exists
Storage is paid once, but validators have to keep data forever. The storage fund connects the two. Fees paid today become stake that earns rewards in every future epoch. The docs call it "a cache of SUI that never fully depletes." Only its returns are paid out, never the principal.
How fees flow
- Writing data. A transaction that creates or grows an object pays
storage_units × storage_price. That's 100 storage units per byte at a storage price of 76 MIST per unit (mainnet protocol config, version 139). The fee goes into the fund, and the object records the amount as itsstorage_rebate. - Earning. Each epoch, the fund gets a share of stake rewards in proportion to its size relative to total stake. Most of that share goes to validators. The
storage_fund_reinvest_ratesetting (500 basis points, or 5%) is reinvested in the fund. - Deleting data. When a transaction deletes or shrinks the object, the fund pays back the stored fee times
storage_rebate_rate. The rest is the non-refundable storage fee, which stays in the fund for good.
The fund's two balances show up in the system state:
| Field (epoch 1291, 2026-10-25) | Value |
|---|---|
totalObjectStorageRebates (owed back to current objects) |
~1,493,964 SUI |
nonRefundableBalance |
~1,380,659 SUI |
| Total fund size | ~2,874,622 SUI |
Rebate rate, docs vs chain
The Gas in Sui page says the rebate is 99% of the original storage fee. That matches the long-standing storage_rebate_rate of 9900 basis points. In sui-protocol-config, protocol versions 138 and 139 raise it to 9999 basis points (99.99%), and mainnet reports version 139 with storage_rebate_rate = 9999. Read the live value instead of assuming:
curl -s https://graphql.mainnet.sui.io/graphql \
-H 'content-type: application/json' \
-d '{"query":"{ protocolConfigs { protocolVersion config(key: \"storage_rebate_rate\") { value } } }"}'Check the fund yourself
import { SuiGrpcClient } from '@mysten/sui/grpc'
const client = new SuiGrpcClient({
network: 'mainnet',
baseUrl: 'https://fullnode.mainnet.sui.io:443',
})
const { systemState } = await client.getCurrentSystemState()
console.log(systemState.storageFund)
// { totalObjectStorageRebates: '...', nonRefundableBalance: '...' } in MISTEvery transaction's gas summary also lists storageCost, storageRebate and nonRefundableStorageFee. To see a rebate happen, create an object on testnet in the playground, delete it, and compare the two transactions' gas lines.
Practical consequences
- Delete what you don't need. Burning a used ticket, removing a dynamic field, or merging coins (see merge and split coins) returns storage fees to the sender.
- A rebate can make net gas negative. A transaction that frees more storage than it uses can cost less than its computation fee. The gas coin can even end up with more SUI than before.
- The rebate goes to whoever deletes the object, not to whoever created it. Design your contracts with that in mind.
- Bigger objects cost more up front. Keep structs lean and put large data in Walrus rather than onchain.
Sources
- Gas in Sui, Sui documentation
- Tokenomics, Sui documentation (storage fund)
- storage_fund module reference, Sui documentation
sui-protocol-config, MystenLabs/sui on GitHub