Last 24hassertions verified316discrepancies0feed lead p50+840mschain head21,963,011rollup0x23A19d…2D94
AccessVault

Stake VERD, or pay monthly. Same table either way.

A tier raises your rate limits and removes the artificial delay on the feed relay. It is purchasable two ways — stake the token, or pay in ETH or USDG — because a product that forces you to hold a token in order to use it is selling the token, not the product. What no tier buys, at any price, is a position in the sequencer's queue.

contractnot deployed
AccessVault is not deployed

There is no address to stake into, no total staked figure and no reward rate, so none of those appear below. The token is not deployed either: no VERD address.

Everything on this page is the mechanism as written in AccessVault.sol — the thresholds, the periods and the reward maths are constructor arguments and constants you will be able to read on-chain the day it ships. Tier access in the meantime is granted directly against the monthly price.

Thresholds

What each tier costs and what it lifts

Stake requirements are whole VERD held past the warmup. The monthly price is the same tier on a different rail.

TierVERD stakedor per monthfeed delayrpc / ssubssimulate / minbundles / minRadarArchive
Publicnonefree2,000 ms51no accessno accessnono
Pro250,000$400real time100560060yesno
Turbo2,000,000$2,500real time1,000256,000600yesyes
Colocatedcontractcontractreal time10,00020060,0006,000yesyes

Thresholds live on-chain as an ascending array and are readable with tierThresholds(). Index 0 is the free tier at zero stake. The public tier’s feed delay is deliberate rather than incidental: giving away the real-time feed would destroy the product that funds the watchtower, and the watchtower is free forever. What no tier buys →

Three parameters, three attacks

Why the vault is not just a balance check

Turbo RPC and the bundle relay are worth real money per hour, which makes tier eligibility worth attacking. Each rule below exists because a specific cheap trick works without it.

warmupPeriod = 24h

Freshly staked tokens do not count for a day

Without a warmup, the attack is one transaction long: flash-borrow two million VERD, stake, call the turbo endpoint, unstake, repay. The tier is worth an hour of privileged throughput and the capital was rented for one block.

A 24-hour warmup makes that impossible, because no flash loan survives a block boundary. A top-up extends the clock only on the new tokens — a matured balance is never dragged back into warmup by a later deposit.

This only needs to defeat cheap capital. Somebody who genuinely holds two million VERD for a day is not an attacker, they are a customer, and the warmup is the price of admission rather than an obstacle.

MAX_WARMUP 7 daysrewards need no warmup
cooldownPeriod = 7d

Unstaking takes a week, and stops paying immediately

requestUnstake moves your principal out of totalStaked and into totalPendingUnstake in the same call. From that second it earns nothing and dilutes nobody — the tokens are held by the contract but are no longer staked.

That ordering matters. If exiting principal kept earning through a week of cooldown, every staker would be paying the people who already left, and the last one out would pay the most.

Up to 16 unstake requests can be in flight at once, each with its own claim time and its own index.

MAX_COOLDOWN 30 dayswarming tokens exit first
rewardRate · periodFinish

Rewards stream, they do not land

With instant pro-rata distribution, anyone watching for a notifyReward call could deposit immediately before it and take a slice of a month’s revenue for a few seconds of exposure. The stakers who carried the month would fund it.

So rewards use the Synthetix streaming accumulator: notifyReward(amount, duration) sets a per-second rate and every staker accrues against the seconds they were actually in. Reward becomes proportional to time held, which is the thing we are trying to pay for.

It also explains why rewards need no warmup while tiers do: you cannot capture a stream you were not in. Leftover from an unfinished period rolls into the next rate rather than being stranded.

per-second accrualsolvency checked on notify
Lifecycle

A position, from deposit to exit

Every row is one contract call and its exact effect on the two things you care about: whether your stake counts toward a tier, and whether it is earning.

WhenCallTier eligibilityRewardsWhat actually happens
t + 0stake(amount)not yet countedaccruingTokens land, totalStaked rises, and the position starts earning from this second. The whole amount is marked warming and warmupEndsAt is set to now + 24 hours.
t + 24hwarmup elapsescountedaccruingeligibleStake catches up with the full balance and tierOf returns the tier the balance buys. No transaction is needed; the clock does it.
any timeclaimRewards()unchangedpaid outRewards are paid from a reserve that is tracked separately from principal, so a claim can never eat another staker’s stake.
u + 0requestUnstake(amount)recalculatedstops on that amountThe principal leaves totalStaked immediately and moves to totalPendingUnstake, so it neither earns rewards nor dilutes the stakers who stayed. Warming tokens are consumed first, which preserves your tier for as long as possible.
u + 7dclaimUnstake(index)unchangednone on that amountThe queue slot is zeroed rather than swapped out, because indexes are handed to you in an event and reordering would silently repoint one you already hold.
Principal and rewards are the same token, and are never confused

Stake token and reward token are both VERD, which is the setup where a lazy implementation reads balanceOf(address(this)) and lets an undistributed reward top-up be withdrawn as if it were principal.

Every balance here is tracked explicitly instead: totalStaked, totalPendingUnstake and rewardReserve. notifyReward reverts unless the whole stream is covered by tokens that are none of those three, and sweep can only touch what is left over after all three — so no owner action reaches a staker’s balance.

What staking does not buy

Rate limits, feed freshness, radar and archive access. That is the entire list. The sequencer orders strictly by arrival, eth_maxPriorityFeePerGas returns 0x0, and there is no auction for a staker to win. A Turbo customer who submits one millisecond later than a Public one is sequenced second.

Staking is also not a yield promise. Rewards are whatever the buyback bought plus whatever remains of the 36-month incentive allocation, and both are variable. Where the tokens come from →