Important: Bunni v2 has been exploited (see post mortem here), and this repo does not have the relevant issues addressed. Please do not use this code in production as is.
Bunni v2 is a next-gen decentralized exchange with shapeshifting liquidity, the next breakthrough in AMM design after Uniswap v3's concentrated liquidity.
To learn more, see:
This repo is licensed under the MIT License, though some files are licensed under AGPL-3.0. See the SPDX license identifier in each file for details.
To install with Foundry:
forge install bunniapp/bunni-v2
This project uses Foundry as the development framework.
Note: Uniswap's v4-core repo only compiles using Solidity 0.8.26. To develop locally, change the Solidity version of lib/v4-core/src/PoolManager.sol to ^0.8.25.
forge install
forge build
forge test
Bunni uses Medusa and fuzz-utils for fuzzing.
Before fuzzing, BunniSwapMath should be temporarily modified to use internal instead of external and to use memory instead of calldata for the computeSwap function. This is because Medusa doesn't support external libraries.
To start fuzzing, run:
medusa fuzz
To generate Foundry tests from the failed fuzzing runs, run:
fuzz-utils generate ./fuzz/FuzzEntry.sol -c FuzzEntry -cd medusa
To use Foundry to run the failed fuzzing runs, run:
forge test --mc FuzzEntry_Medusa_Test
Please create a .env file before deployment. An example can be found in .env.example.
The Create3 salts for the following contracts are required in the .env file:
BunniSwapMathRebalanceLogicBunniHubBunniHookBunniZoneBunniQuoterGeometricDistributionDoubleGeometricDistributionCarpetedGeometricDistributionCarpetedDoubleGeometricDistributionUniformDistributionBuyTheDipGeometricDistributionBunniHubLogicBunniHookLogic
FOUNDRY_PROFILE=gas forge script script/DeployLibraries.s.sol -f [network]
FOUNDRY_PROFILE=hub_logic forge script script/DeployHubLogic.s.sol -f [network]
FOUNDRY_PROFILE=hook_logic forge script script/DeployHookLogic.s.sol -f [network] --libraries src/lib/BunniSwapMath.sol:BunniSwapMath:[swapMathLibAddress] --libraries src/lib/RebalanceLogic.sol:RebalanceLogic:[rebalanceLibAddress]
FOUNDRY_PROFILE=hub forge script script/DeployHub.s.sol -f [network] --libraries src/lib/BunniHubLogic.sol:BunniHubLogic:[hubLogicLibAddress]
FOUNDRY_PROFILE=gas forge script script/DeployLDFs.s.sol -f [network]
FOUNDRY_PROFILE=gas forge script script/DeployZone.s.sol -f [network]
FOUNDRY_PROFILE=quoter forge script script/DeployBunniQuoter.s.sol -f [network] --libraries src/lib/BunniSwapMath.sol:BunniSwapMath:[swapMathLibAddress] --libraries src/lib/RebalanceLogic.sol:RebalanceLogic:[rebalanceLibAddress] --libraries src/lib/BunniHookLogic.sol:BunniHookLogic:[hookLogicLibAddress]
FOUNDRY_PROFILE=hook forge script script/DeployHook.s.sol -f [network] --libraries src/lib/BunniHookLogic.sol:BunniHookLogic:[hookLogicLibAddress] --libraries src/lib/BunniSwapMath.sol:BunniSwapMath:[swapMathLibAddress] --libraries src/lib/RebalanceLogic.sol:RebalanceLogic:[rebalanceLibAddress]FOUNDRY_PROFILE=gas forge script script/DeployLibraries.s.sol -f [network] --verify --broadcast --slow --account [keystoreAccount]
FOUNDRY_PROFILE=hub_logic forge script script/DeployHubLogic.s.sol -f [network] --verify --broadcast --slow --account [keystoreAccount]
FOUNDRY_PROFILE=hook_logic forge script script/DeployHookLogic.s.sol -f [network] --verify --broadcast --slow --account [keystoreAccount] --libraries src/lib/BunniSwapMath.sol:BunniSwapMath:[swapMathLibAddress] --libraries src/lib/RebalanceLogic.sol:RebalanceLogic:[rebalanceLibAddress]
FOUNDRY_PROFILE=hub forge script script/DeployHub.s.sol -f [network] --verify --broadcast --slow --account [keystoreAccount] --libraries src/lib/BunniHubLogic.sol:BunniHubLogic:[hubLogicLibAddress]
FOUNDRY_PROFILE=gas forge script script/DeployLDFs.s.sol -f [network] --verify --broadcast --slow --account [keystoreAccount]
FOUNDRY_PROFILE=gas forge script script/DeployZone.s.sol -f [network] --verify --broadcast --slow --account [keystoreAccount]
FOUNDRY_PROFILE=quoter forge script script/DeployBunniQuoter.s.sol -f [network] --verify --broadcast --slow --account [keystoreAccount] --libraries src/lib/BunniSwapMath.sol:BunniSwapMath:[swapMathLibAddress] --libraries src/lib/RebalanceLogic.sol:RebalanceLogic:[rebalanceLibAddress] --libraries src/lib/BunniHookLogic.sol:BunniHookLogic:[hookLogicLibAddress]
FOUNDRY_PROFILE=hook forge script script/DeployHook.s.sol -f [network] --verify --broadcast --slow --account [keystoreAccount] --libraries src/lib/BunniHookLogic.sol:BunniHookLogic:[hookLogicLibAddress] --libraries src/lib/BunniSwapMath.sol:BunniSwapMath:[swapMathLibAddress] --libraries src/lib/RebalanceLogic.sol:RebalanceLogic:[rebalanceLibAddress]