Users
Anyone storing files
purchaseStorage()
Pay exactly storagePrice, once per wallet. Any other amount, and any repeat purchase, reverts.
The money layer · Ethereum Mainnet
Every storage payment and every node operator payout runs through one public contract, StorageIncentive. Nobody can pay operators more than users paid in, and nobody can take back what an operator has earned.
01 · Money flow
Money enters only through a storage purchase or a direct top-up of the pool. The contract tracks who each wei belongs to.
Exactly storagePrice, once per wallet. Wrong amounts and repeat purchases revert.
The pool belongs to node operators. The fee is the only part the owner can ever collect.
The coordinator meters each node's storage, bandwidth and uptime, and as settler moves earnings from the pool to the operator's balance.
rewardNode()Whenever they like, straight to their own wallet. A credited balance can't be clawed back.
withdraw()02 · Roles
Anyone storing files
purchaseStorage()Pay exactly storagePrice, once per wallet. Any other amount, and any repeat purchase, reverts.
Anyone running nodes
registerNode()withdraw()Register a payout wallet once, then pull your full credited balance whenever you want.
The coordinator's key
rewardNode(node, amount)Can only move money from the reward pool to registered operators, never more than the pool holds.
The deployer
setStoragePrice()setSettler()withdrawProtocolFees()transferOwnership()Can collect protocol fees and nothing else. The reward pool and operator balances are out of reach.
03 · Guarantees
04 · Events
| Event | Meaning |
|---|---|
StoragePurchased(user, amount) | A wallet paid for storage. The backend requires this event before it unlocks uploads. |
NodeRegistered(node) | An operator registered a payout wallet. |
NodeRewarded(node, amount) | The settler moved earnings from the pool to an operator's balance. |
Withdraw(node, amount) | An operator pulled their balance out. |
RewardPoolFunded(from, amount) | Someone topped up the reward pool directly. |
ProtocolFeesWithdrawn(to, amount) | The owner collected protocol fees. |
Source: contracts/src/StorageIncentive.sol, covered by unit tests and verified on Etherscan. How the backend checks a payment