-
Notifications
You must be signed in to change notification settings - Fork 145
DAO Staking Rewards
Staking rewards are a way to gradually distribute tokens to DAO members proportional to the number of tokens they have staked. A legitimate use case for staking rewards is to encourage the "locking up" of a token, which may reduce its circulating supply.
I encourage anyone considering using staking rewards for that purpose read the linked paper, then, consider the price of the token who's staking rewards system it describes.
Staking rewards alone do not make a high value token.
There are three smart contracts which coordinate rewards and staking.
-
stake-cw20
- The smart contract that holds staked governance tokens and updates staked balances. -
stake-cw20-rewards-distributor
- A contract for distributing rewards in terms of the token being staked to stakers in astake-cw20
contract. -
stake-cw20-external-rewards
- A contract for distributing rewards denominated in a token different from the one being staked.
Depending on the token you are distributing staking rewards in terms of, you'll select a different pair of these contracts.
For example, if you are distributing staking rewards in terms of $JUNO and have a governance token called $ONUJ you'll use stake-cw20
in conjunction with stake-cw20-external-rewards
. If you instead wanted to distribute rewards in terms of $ONUJ you'd use stake-cw20
with stake-cw20-rewards-distributor
.
When you stake tokens in stake-cw20
, you get a percentage ownership of all of the tokens in that contract. When rewards are added your percentage ownership stays the same, but the absolute number of tokens available to you increases.
The Fund {}
message adds rewards to a stake-cw20
contract.
The stake-cw20-rewards-distributor
contract can help in providing rewards at a constant rate. In effect it automates the calling of Fund {}
with an amount of tokens that brings the total rewards up to the target rewards. To bring the number of tokens distributed up to the target rate, one may executed Distribute {}
on the contract.
There are two important things to keep in mind here:
- The
Distribute {}
method must be called periodically for rewards to be distributed. Calling distribute is permissionless, so this could be done as cron job or as a button visitors to a website may press to distribute rewards. - The rewards distributor must be funded with as many tokens as you would like to distribute. There is no special message needed for this and the contract can be funded by sending tokens to it.
The reward rate in the distributor contract is set by the reward_rate
field in its instantiate and config update messages. reward_rate
has a unit of micro tokens per block (i.e. not considering the token decimals). For example, if one was distributing $JUNO, the reward rate would be specified as $uJUNO per block (1 $uJUNO ==
This contract is not supported by the DAO DAO UI, though as staked balances are auto-compounding if a rewards contract is present DAO members will see their staked token balances increase over time in the UI.
To provide staking rewards to stakers in a stake-cw20
contract in terms of a token that is different from the one being staked, we turn to stake-cw20-external-rewards
.
To configure this contract, instantiate it and set it as a stake-cw20
hook receiver via the AddHook { addr }
message on that contract. To fund this contract, execute a Fund {}
message. To claim rewards, execute a Claim {}
message. Claiming can not be done until the contract has been funded and added as a hook receiver.
At the time of writing this contract has no support in the DAO DAO UI. DAOs looking to add external rewards to their DAO will need to implement their own interface for claiming rewards.