[Optimism] Velodrome Locks

    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    db_img

    Dashboard Objectives

    • The dashboard will look at the new lockups being created on Velodrome Finance.
    • It will attempt to derive insights into the lock-up periods preferred by the users.
    • It will also delve Pool Voting stats and behavours.

    Author:

    QUICK! Lock it up!!! Lock it up!!

    • Taking a glance at Chart 1 to the right, we can spot 4 distinguishable lines across the scatter plot.
    • These lines are roughly at the following levels:
      • 0-1 Weeks
      • 4-5 Weeks = ~ 1 Month
      • 48-51 Weeks = ~1 year
      • 200 Weeks = ~ 4 years

    These levels seem to be of interest…🧐

    Proceeding further with Charts 2 & 3….

    • The figures on these charts also corroborate the keen interest around the aforementioned levels
    • 1 year and lesser periods have mediocre interest…
    • The higher extremes (3 and more years) periods have the highest participation.
    • The middle ground periods (1-3 years) have the least interest…

    Now that we know what the spans are, let’s hop on to the next logical question! …

    Y deez specific duration spans though? 🤔🤔

    • The primary factor for choosing these spans is likely the basic crypto-enjoyer instinct: Numba Go Up

    • The longer the span chosen, the better the lockup reward rate as follows:

      1 VELO locked for 4 years = 1.00 veVELO
      
      1 VELO locked for 3 years = 0.75 veVELO
      
      1 VELO locked for 2 years = 0.50 veVELO
      
      1 VELO locked for 1 years = 0.25 veVELO
      

    BUT WAIT! THERE’S MORE! ↗️↗️↗️

    db_img

    Human Psychology / Velodrome User Interface

    • The interface kind of makes it appear that the only valid/best choices for a user are the four radio-button options readily provided! That and the text below the buttons explaining the rates further would tell the User’s mind to concentrate/decide among only these 4 options 🤯
    • However, as the image (the bottom-right of this panel) shows if you click either the calendar icon, or manually type in the values, you can pick a ‘custom’ lockup period!
    • The custom inputs can also be seen on-chain 🕵️

    veVELO Pool Voting

    • We take a glance at the Voting favorites/preferences the platform’s most users have opted to vote for so far.
    • The analysis can be viewed in Streamlit - here

    Analysis Issues/Difficulty

    • There was a roadblock limiting the usual analysis via velocity/snowflake.
    • The voting data:
      • pool_addresses/token_ids

      • voting_weights/power

        was present in a dynamic hex string as follows:

        # MethodID: 0x7ac09bf7
        # [0]:  0000000000000000000000000000000000000000000000000000000000001077
        # [1]:  0000000000000000000000000000000000000000000000000000000000000060
        # [2]:  00000000000000000000000000000000000000000000000000000000000000a0
        # [3]:  0000000000000000000000000000000000000000000000000000000000000001  -> pool count N
        # [4]:  00000000000000000000000079c912fef520be002c2b6e57ec4324e260f38e50  -> N pools
        # [5]:  0000000000000000000000000000000000000000000000000000000000000001  -> weight count N
        # [6]:  0000000000000000000000000000000000000000000000000000000000002710  -> N weights
        
    • Given the number of pools and their corresponding weights could vary from transaction to transaction, stronger programmability was needed! Hence, python/streamlit to the rescue!

    Basic Algorithm:

    • Pulling all vote transactions with a simple SQL query:

          SELECT 
              block_timestamp,
              tx_hash,
              from_address,
              input_data
              
          from optimism.core.fact_transactions
          WHERE
              input_data LIKE '0x7ac09bf7%'
              AND to_address = '0x09236cff45047dbee6b921e00704bed6d6b8cf7e'
      
    • Once we have the unrefined input_data, Python takes over

      output = []
          for row in data['results']:
              # remove
              long_hex = row[3].split('0x7ac09bf7')[1]
              
              # break up string into 64 length groups
              hex_rows = wrap(long_hex, 64)
      
              token_id = int(hex_rows[0], 16)
              pools = []
              weights = []
      
              #get each address from row 5 onward based on count, fix the address string
              for i in range(0, int(hex_rows[3], 16)):
                  pools.append('0x'+ hex_rows[4 + i][24:])
              #get each weight 
              for i in range(0, int(hex_rows[3 + len(pools) + 1], 16)):
                  weights.append(int(hex_rows[3 + len(pools) + 2 +i], 16))
      

    Lastly, let’s look at the Top lockers in terms of most tokens locked