Code Monkey home page Code Monkey logo

lammbert's Introduction

LAMMbert Uniswap v4 Hook

Based on the Euler Finance tweet by Michael Bentley

Bentley's White Paper

TLDR

Unlike Uniswap v3 liquidity concentration with ranges, Uniswap v4 allows one to create unique invariants to offer a reduced price impact and to be able to also provide liquidity in the tails. A unique invariant that is between constant sum (x+y=k) and constant product (xy=k) is implemented as a hook based on the work of Michael Bentley utilizing the Lambert W function implemented with the solady fixdepointmath.sol library by vectorized.eth.

Screen.Recording.2024-03-01.at.11.18.27.PM.mov

Desmos example

  1. Default hook from Uniswap Foundation Counter.sol demonstrate the beforeSwap() hook where the invariant logic is inserted.
  2. The invariant curve constant sum template used as our starting point Counter.t.sol preconfigures the v4 pool manager, test tokens, and test liquidity.

We solved the equation for swapping and removed c the liquidity concentrationg parameter for the sake of simplicity (dashed line above):

Though a more advanced hook could be to link c to a ZK-coprocessor such as Axiom which would calculate volatility offchain and use that as a barometer. A high volatility would translate in c moving the LAMMbert curve towards a constant product invariant and a low c would move it towards a constant sum invariant.

An interesting combo we wanted to implement is to use Euler Vaults inside a beforeSwap() for Just-in-Time liquidity provision, then move the gathered fees back into the Euler Vault. Potential problem there would be changes in returning the same proportion of assets back as the LP composition changes though and we couldn't figure out how to return the same proportions that we borrowed.


Set up as outlined by Saucepoints

requires foundry

forge install
forge test

add solady's fixedpointmath.sol library containing the Lambert W equation

forge install vectorized/solady

Local Development (Anvil)

Other than writing unit tests (recommended!), you can only deploy & test hooks on anvil

# start anvil with TSTORE support
# (`foundryup`` to update if cancun is not an option)
anvil --hardfork cancun

# in a new terminal
forge script script/Anvil.s.sol \
    --rpc-url http://localhost:8545 \
    --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
    --broadcast

Testnets

We ran out of time to test the invariant, only compiled it, but the Goerli deployment is out of sync with the latest v4. It is recommend to use local testing instead

POOL_MANAGER = 0x0
POOL_MODIFY_POSITION_TEST = 0x0
SWAP_ROUTER = 0x0

Update the following command with your own private key:

forge script script/00_Counter.s.sol \
--rpc-url https://rpc.ankr.com/eth_goerli \
--private-key [your_private_key_on_goerli_here] \
--broadcast

Deploying your own Tokens For Testing according to Saucepoints

Because V4 is still in testing mode, most networks don't have liquidity pools live on V4 testnets. We recommend launching your own test tokens and expirementing with them that. We've included in the templace a Mock UNI and Mock USDC contract for easier testing. You can deploy the contracts and when you do you'll have 1 million mock tokens to test with for each contract. See deployment commands below

forge create script/mocks/mUNI.sol:MockUNI \
--rpc-url [your_rpc_url_here] \
--private-key [your_private_key_on_goerli_here]
forge create script/mocks/mUSDC.sol:MockUSDC \
--rpc-url [your_rpc_url_here] \
--private-key [your_private_key_on_goerli_here]

Troubleshooting

Permission Denied

When installing dependencies with forge install, Github may throw a Permission Denied error

Typically caused by missing Github SSH keys, and can be resolved by following the steps here

Or adding the keys to your ssh-agent, if you have already uploaded SSH keys

Hook deployment failures

Hook deployment failures are caused by incorrect flags or incorrect salt mining

  1. Verify the flags are in agreement:
    • getHookCalls() returns the correct flags
    • flags provided to HookMiner.find(...)
  2. Verify salt mining is correct:
    • In forge test: the deployer for: new Hook{salt: salt}(...) and HookMiner.find(deployer, ...) are the same. This will be address(this). If using vm.prank, the deployer will be the pranking address
    • In forge script: the deployer must be the CREATE2 Proxy: 0x4e59b44847b379578588920cA78FbF26c0B4956C
      • If anvil does not have the CREATE2 deployer, your foundry may be out of date. You can update it with foundryup

lammbert's People

Contributors

v-for-vasya avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.