Energy Points

Epochs, retroactive budgets, and the time-weighted pro-rata split that makes points flash-loan immune.

Energy Points

Energy Points are the network's accounting unit for absorbed surplus. One point is one kWh of curtailed energy that the network took in. Points are non-transferable and exist only to be burned into vouchers.

Epochs

Time is cut into fixed epochs. Epoch length is TBD and undetermined; it trades measurement latency against gas and attestation overhead.

An epoch has three phases:

PhaseWhat happens
OpenStake and unstake freely. The vault accrues stake-seconds. No budget exists.
ClosedThe epoch boundary passes. Stake-seconds are frozen for that window. Still no budget.
FinalisedAttesters submit the measured absorbed energy. The budget is written on-chain and points become claimable.

The gap between closed and finalised is deliberate. Meter data has to be read, reconciled and signed. Until that happens the epoch has a total but no value.

The retroactive budget

The budget for epoch e, written B(e), is the number of kWh of curtailed energy the network's sites actually absorbed during e. It is not a target, a cap, or a schedule. It is a measurement, taken after the fact, of something that either happened or did not.

This is the single most important design decision in the protocol, and it has a direct consequence: if the network absorbs nothing, it distributes nothing. There is no floor. A cloudy fortnight with no curtailment produces epochs with a budget of zero, and stakers earn zero for them. That is correct behaviour, not a failure. Points are a claim on a physical quantity, and you cannot distribute a physical quantity that does not exist.

Contrast this with an emissions schedule, where a fixed number of units is minted per block regardless of what the underlying system did. Such a schedule pays out in exactly the same way whether the infrastructure is running at capacity or switched off. Watt's budget cannot do that, because it is derived from meter readings rather than a constant in the contract.

The split

Within an epoch, each staker's weight is their stake integrated over time, stake-seconds, not a balance.

w_i(e) = Σ over epoch e of  stake_i(t) · dt          [WATT-seconds]
W(e)   = Σ_i w_i(e)                                   [WATT-seconds]

P_i(e) = B(e) · w_i(e) / W(e)                         [kWh]

Implementation detail: the vault does not iterate over stakers. It maintains a cumulative accumulator per epoch and a per-account checkpoint, so w_i(e) is recoverable in O(1) at claim time. Rounding is floor-biased in the protocol's favour so the sum of claims can never exceed B(e).

Worked example. Epoch budget is 10,000 kWh. Alice stakes 100 WATT for the whole epoch. Bob stakes 400 WATT but only for the final quarter of it.

w_alice = 100 × 1.00 = 100 WATT-epochs
w_bob   = 400 × 0.25 = 100 WATT-epochs
W       = 200

P_alice = 10,000 × 100/200 = 5,000 kWh
P_bob   = 10,000 × 100/200 = 5,000 kWh

Bob's larger balance buys him nothing extra, because he was absent for three quarters of the energy he is claiming against. The split follows the energy, and the energy was produced across the whole window.

Why this is flash-loan immune

The standard attack on a staking distribution is: borrow a very large balance, be in the snapshot, claim, repay, all within a single transaction. It works whenever rewards are a function of balance at an instant.

Here the reward is a function of stake-seconds over the epoch. A position borrowed and repaid inside one block contributes stake × block_time, one block out of an epoch. Against an epoch of even a few hours, that is a rounding error. To capture a meaningful share you must hold the position for a meaningful fraction of the epoch, which means bearing price risk on the token for that whole period. At that point it is not a flash loan. It is staking, which is the behaviour the mechanism is trying to buy.

There is no snapshot to be in, so there is nothing to time.

Why the budget is published after the epoch closes

Suppose the budget were announced in advance, or were predictable from public data. A large holder would stake heavily into the high-budget epochs and sit out the rest, diluting everyone who stayed through the low ones. The people who took the risk of holding a position through a poor stretch would subsidise the people who only showed up for the good stretch.

Publishing B(e) only after e has closed removes the information advantage entirely. At the moment you decide to stake, the budget for the epoch you are staking into does not exist yet, not to you, not to the protocol, not to anyone. The only way to earn points across many epochs is to be staked across many epochs.

Note that this protects against front-running the budget, not against every form of gaming. It relies on the attestation set reporting honestly. See Legal for the trust assumptions.

Properties

  • Points are denominated in kWh and carry no monetary unit.
  • Points are non-transferable. They cannot be sold, only burned into vouchers, which can be sold.
  • Points do not expire, but the vouchers minted from them do.
  • Unclaimed points from a finalised epoch remain claimable indefinitely.
  • A zero-budget epoch distributes zero. This is expected and will happen.