Vault, reward token, funding
Each project has its own ProjectVault on Sepolia, at an address fixed by the project id (CREATE2 from the vault factory). It holds the reward token, pays settled epochs, enforces the epoch cap and fee split, and lets you withdraw unused funds after a delay.
Choosing the reward token
Section titled “Choosing the reward token”economics.reward_token can be any ERC-20 on Sepolia. Test NECTA
(0x52efcdf0bd3ca7554c0dfb3141125b1a4d54eb7e) is the simplest: the faucet gives 1,000 NECTA per address every
24 hours. For larger budgets deploy your own test ERC-20 and mint it to yourself. Tokens with transfer fees
are rejected by fund (UnsupportedToken).
Size the budget
Section titled “Size the budget”epoch_cap = floor(daily_emission × epoch_secs / 86400) # the most one epoch can payThe reference project sets daily_emission = 24,000 NECTA with 1-hour epochs, so epoch_cap = 1,000 NECTA.
If the vault’s free balance drops below one epoch_cap, the project is underfunded: tasks still run,
but as validator rounds that pay nobody, until you top up. Plan for several days of daily_emission.
Create and fund the vault
Section titled “Create and fund the vault”Creating the vault is the one transaction you pay gas for (a very small amount of Sepolia ETH). It must be sent by the developer address, after the project is registered on-chain, and its configuration must match the manifest’s economics.
-
Create the vault with
ProjectVaultFactory.createVault(projectId, rewardToken, config), whereconfig = (minerBp, developerBp, treasuryBp, epochSecs, epochCap, developerPayout). With Foundry’scast:Terminal window FACTORY=0x4d6b1abf2475452acd904682144db283e039c46fNECTA=0x52efcdf0bd3ca7554c0dfb3141125b1a4d54eb7eRPC=https://ethereum-sepolia-rpc.publicnode.comPROJECT_ID=0x… # from prepare / your project pageDEV=0x… # your developer address (also receives the developer share here)EPOCH_CAP=1000000000000000000000 # floor(daily_emission × epoch_secs / 86400)cast send $FACTORY \"createVault(bytes32,address,(uint16,uint16,uint16,uint32,uint256,address))" \$PROJECT_ID $NECTA "(8500,1000,500,3600,$EPOCH_CAP,$DEV)" \--rpc-url $RPC --account my-testnet-walletcast call $FACTORY "predictVault(bytes32)(address)" $PROJECT_ID --rpc-url $RPCmust print the same address as your manifest’seconomics.vault. The call reverts withProjectNotRegisteredbefore registration is indexed on-chain,NotDeveloperfrom another address, andVaultExistsif it already exists. -
Approve and fund.
fund(amount)pulls tokens you approved:Terminal window VAULT=0x… # economics.vaultAMOUNT=10000000000000000000000 # 10,000 tokens with 18 decimalscast send $NECTA "approve(address,uint256)" $VAULT $AMOUNT --rpc-url $RPC --account my-testnet-walletcast send $VAULT "fund(uint256)" $AMOUNT --rpc-url $RPC --account my-testnet-walletAnyone can fund a vault, so a sponsor or community can top it up too.
-
Check runway.
Terminal window cast call $VAULT "runwayEpochs()(uint256)" --rpc-url $RPCcurl -s https://testnet-rpc.necter.network/v1/projects/$PROJECT_ID/economics
Where the money goes
Section titled “Where the money goes”Each settled epoch reserves its gross amount. After the challenge window (1 hour):
- miners claim their amounts with Merkle proofs (gasless through the Hub);
release(epoch)(callable by anyone) pays the developer share todeveloperPayoutand the treasury share to the network treasury.
Withdrawing unused funds
Section titled “Withdrawing unused funds”Only the developer can take money back out, with a delay so miners are never surprised:
cast send $VAULT "requestWithdraw(uint256)" $AMOUNT --rpc-url $RPC --account my-testnet-wallet# after the withdraw delay (172,800 s = 48 h on the testnet):cast send $VAULT "executeWithdraw()" --rpc-url $RPC --account my-testnet-walletOnly the free balance (not amounts reserved for settled epochs) can be withdrawn. cancelWithdraw() cancels.
Changing the split or cap
Section titled “Changing the split or cap”scheduleConfig(config) on the vault schedules a new (minerBp, developerBp, treasuryBp, epochSecs, epochCap, developerPayout) that activates after the registry’s activation delay. epochSecs can never change. Change
the manifest’s consensus economics in a new version at the same time, so validators and the vault agree:
Versions and activation.