Tokenomics

V1 to V2. Returning real yield back to $ALLUO lockers.

Currently, there are two automated execution of tokenomics behind $ALLUO.

  1. Minting $ALLUO tokens to reward lockers

  2. Returning retained profits of the protocol back to lockers through CVX-ETH.

Minting $ALLUO tokens to reward lockers

Ever since the migration from tokenomics v1 --> v2, minting of $ALLUO has generally been forgone in lieu of the alternative of returning retained profits in the form of CVX-ETH LP tokens. However, it is included as an option in each governance cycle.

During every governance cycle, a proposal to mint $ALLUO for lockers is created.

The result is parsed by an offchain open-source execution script through Github actions, then when the vote is executed, the VoteExecutorMaster mints the appropriate amount to the Locker contract and queues the reward to be vested for $ALLUO lockers.

else if (commandIndex == 1) {
                    (uint256 mintAmount, uint256 period) = abi.decode(
                        messages[j].commandData,
                        (uint256, uint256)
                    );
                    IAlluoToken(ALLUO).mint(locker, mintAmount);
                    ILocker(locker).setReward(mintAmount / (period));

An example of such a proposal to do so proposed biweekly is: https://vote.alluo.com/#/proposal/0xbf7f6697874d07937aec16507432d0d84a08689ab95f7ccb4f7f289f4bfc6edc

Returning retained profits back to Lockers through CVX-ETH

With the introduction of tokenomics V2, all the profits of the protocol earned through liquidity direction are returned back to Alluo lockers.

For example, if the promised yield on the USD farm is 7% but the obtained yield is higher at 9%, the spread of 2% is returned to Alluo lockers.

The steps of how this happens are as below, all in one transaction when doing the automated execution of our votes.

1. Calculate expected yield vs obtained yield.

StrategyHandler.sol
 uint256 interest = IIbAlluo(info.ibAlluo).annualInterest();
 uint256 expectedAddition = (info.amountDeployed *
                interest *
                timePass) /
                31536000 /
                10000;
 uint256 expectedFullAmount = info.amountDeployed + expectedAddition;
 uint256 actualAmount = newAmountDeployed + totalRewards;
  1. If the spread is positive, send this to the CvxDistributor.

if (actualAmount > expectedFullAmount) {
    uint256 surplus = actualAmount - expectedFullAmount;
    console.log("expectedAddition:", expectedAddition);
    console.log("surplus:", surplus);
    if (surplus < totalRewards) {
        IERC20Upgradeable(primaryToken).transfer(
            booster,
            (totalRewardsBalance * surplus) / totalRewards
        );
        ...
        ...

This is sent in the form of 'primary tokens' for each asset class. USDC, WETH, WBTC, and EURT.

  1. Distribute CVX-ETH rewards to lockers.

Convert all primary tokens into CVX-ETH and then distribute the reward to all lockers.

function updateReward(
        bool exchangePrimary,
        bool claimBooster
) external onlyRole(PROTOCOL_ROLE) {
        if (exchangePrimary) {
            exchangePrimaryTokens();
        }
        if (claimBooster) {
            IAlluoVault(alluoCvxVault).claimRewards();
        }
        uint lpBalance = CRV_CVX_ETH.balanceOf(address(this));
        if (lpBalance > 0) {
            IAlluoVault(alluoCvxVault).deposit(lpBalance, address(this));
        }
        allProduced = produced();
        producedTime = block.timestamp;
        rewardTotal = lpBalance;
        emit RewardAmountUpdated(lpBalance, allProduced);
}

Last updated