Use staked $NEAR in Sputnik v2

Sputnik v2 supports voting on DAOs proposals with arbitrary token.
This means that one can create a DAO where people would stake $NEAR to vote.
But most of the liquid $NEAR is staked, which means not much token would participate in the governance.

Instead a DAO should use staked $NEAR for delegation and voting.
There are couple liquid staking solution that offer a staked $NEAR as result but there are two issues with that: already more than one token for this, lockups wouldn’t support liquid tokens.

Alternative is to implement a validator voting + staking delegator override.
Meaning validator votes for some decision, but during voting period the delegators can override vote with their portion of stake. This model is used in Cosmos governance.

The validator vote is easily implementable in staking contract for Sputnik. There is a host function in NEAR that allows to read given account’s stake in the system.

The override though, would require more work.

There are three options I see:

  • Have a tool that queries state of the staking contract for the given account at the beginning of a given epoch. This tool would provide a merkle path as well, that would be rooted into an epoch header’s merkle root hash of the state. Voting smart contract would need to verify that this is a valid merkle root of chunk included in a valid block header (there is host function in progress to expose block headers?) to determine weight of the given user.
  • New staking contracts that support querying state of the user at the given epoch (maintaining history X epochs before for each user). Voting smart contract would call it with the epoch when vote started to determine the weight of the given user.
  • Voting smart contract would call staking contract and query the state. Voting time limited by 3 epochs (unstaking period).

Are there any other options to facilitate voting?