Alluo Explained
  • Welcome
    • 🧭 The Basics
  • Getting Started
    • πŸ’» The DeFi Web App
      • ❓ Connecting to the app
      • 🚜 Depositing into the farms
      • πŸ™Œ Other basics
      • 🏦 Importing your Mobile app wallet to Metamask
      • 🧬 Add the polygon network manually in Metamask.
      • ⛓️ Bridging Stablecoins from another chain
    • πŸ“±The Mobile app
      • πŸ—οΈ Setting up your account
      • 🏦 Depositing money into the app
      • πŸ™Œ Other basics
      • πŸ” Exporting your private key
    • πŸ“–Tech deep dive: Contract Address Library
  • Understanding Alluo
    • πŸ’΅ How does Alluo get the yield?
      • 🐰 Going deeper into the Alluo protocol rabbit hole
    • 🧐 FAQ
  • Tokens & Tokenomics
    • πŸͺ™ The tokens
    • πŸ‘¨β€πŸ”¬Tech deep dive: Interest Bearing {asset} token
      • Depositing
      • Withdrawals
      • IbAlluo on different chains
      • StIbAlluo and Superfluid
        • A closer look at the integration between IbAlluo and StIbAlluo
      • Using the IbAlluo contract directly to create streams
      • Liquidity Handler and adapters
        • Deposit process with the Liquidity Handler
        • Withdraw process with the Liquidity Handler
    • πŸ“ˆ Tokenomics
    • πŸ‘¨β€πŸ”¬Tech deep dive: Boosting yield by compounding rewards
      • Deposit into the Vault
      • Withdraw from the Vault
      • Redeem rewards
      • Automatic boosting with Alluo
      • FraxConvex Vaults
      • Managing withdrawal requests in IERC4626
  • Decentralisation and Trust
    • πŸ—³οΈ Trustless governance and execution
    • πŸ‘¨β€πŸ”¬Tech deep dive: Vote Executor Architecture
      • Off chain votes to on chain data
      • Onchain data verifcation
      • Automated execution of votes
        • Tokenomics
        • Liquidity Direction
        • Setting APYs on farms
      • Cross chain execution of votes
      • Manually submitting vote results onchain
    • ↔️Alluo Exchange
      • Interacting with the Exchange
    • vlAlluo Architecture
    • Contracts upgrades
    • Investment strategies
      • πŸ“ˆFrax Convex Finance
        • Adding new pools into the strategy
        • Investing into a pool
  • More Advanced Features
    • πŸ” Repeat payments, streaming IbAlluo
  • Product Updates
    • πŸ‘Œ Product Roadmap: Building the right products
    • πŸ’» Web App releases
    • πŸ“± Mobile App releases
    • 🏎️ Alluo Boost
  • tutorial projects
    • Example: USDC to streaming 1 IbAlluo per second
    • Example: Using IbAlluoUSD and Ricochet to do capital efficient DCA into ETH
Powered by GitBook
On this page
  • Minting $ALLUO tokens to reward lockers
  • Returning retained profits back to Lockers through CVX-ETH
  1. Decentralisation and Trust
  2. Tech deep dive: Vote Executor Architecture
  3. Automated execution of votes

Tokenomics

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

PreviousAutomated execution of votesNextLiquidity Direction

Last updated 2 years ago

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:

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);
}
πŸ‘¨β€πŸ”¬
https://vote.alluo.com/#/proposal/0xbf7f6697874d07937aec16507432d0d84a08689ab95f7ccb4f7f289f4bfc6edc