This is a Uniswap V4 hook that dynamically adjusts pool fees based on market sentiment data from CoinMarketCap. The hook DECREASES fees during bullish market conditions and INCREASES them during bearish conditions in order to optimize pool performance!
- Dynamic fee adjustment based on market sentiment
- Integration with CoinMarketCap API for real-time market data
- Configurable sentiment thresholds and fee ranges
- Pausable oracle for emergency situations
- Confidence scoring for sentiment data
- Node.js v16 or higher
- A CoinMarketCap API key
- Clone the repository:
git clone https://github.com/yourusername/sweet-hook.git
cd sweet-hook- Install dependencies:
npm install- Copy the environment file and fill in your values:
cp .env.example .envEdit the .env file with your values:
COINMARKETCAP_API_KEY: Your CoinMarketCap API keyORACLE_ADDRESS: The deployed MarketSentimentOracle contract addressMAINNET_RPC_URL: Your Ethereum node RPC URLPRIVATE_KEY: Your wallet private key (for deployment)
npx hardhat run scripts/deploy-poolmanager.ts --network unichain-sepolia- Deploy the MarketSentimentOracle:
npx hardhat run scripts/deploy-oracle.ts --network mainnet- Deploy the MarketSentimentHook:
npx hardhat run scripts/deploy-hook.ts --network mainnet- Deploy the hook
npx hardhat run scripts/create-pool.ts --network unichain-sepoliaRun the script to update market sentiment data:
npm run update-sentimentThis script will:
- Fetch current market data from CoinMarketCap
- Calculate sentiment based on price and volume changes
- Update the oracle contract with new sentiment values
The hook adjusts fees based on the following rules:
- Base fee: 0.03%
- Maximum fee: 1%
- Minimum fee: 0.03%
- Bullish threshold: 70 (decreases fee by 20%)
- Bearish threshold: 30 (increases fee by 20%)
- The oracle is pausable in case of emergencies
- Sentiment data has a maximum age of 1 hour
- Confidence scoring helps filter out unreliable data
- Only the owner can update sentiment data
MIT
- The example hook Counter.sol demonstrates the
beforeSwap()andafterSwap()hooks - The test template Counter.t.sol preconfigures the v4 pool manager, test tokens, and test liquidity.
Updating to v4-template:latest
This template is actively maintained -- you can update the v4 dependencies, scripts, and helpers:
git remote add template https://github.com/uniswapfoundation/v4-template
git fetch template
git merge template/main <BRANCH> --allow-unrelated-historiesEnsure that you have correctly installed Foundry (Forge) Stable. You can update Foundry by running:
foundryup
v4-template appears to be incompatible with Foundry Nightly. See foundry announcements to revert back to the stable build
requires foundry
forge install
forge test
Other than writing unit tests (recommended!), you can only deploy & test hooks on anvil
# start anvil, a local EVM chain
anvil
# in a new terminal
forge script script/Anvil.s.sol \
--rpc-url http://localhost:8545 \
--private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \
--broadcastSee script/ for hook deployment, pool creation, liquidity provision, and swapping.
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 are caused by incorrect flags or incorrect salt mining
- Verify the flags are in agreement:
getHookCalls()returns the correct flagsflagsprovided toHookMiner.find(...)
- Verify salt mining is correct:
- In forge test: the deployer for:
new Hook{salt: salt}(...)andHookMiner.find(deployer, ...)are the same. This will beaddress(this). If usingvm.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
- If anvil does not have the CREATE2 deployer, your foundry may be out of date. You can update it with
- In forge test: the deployer for:
Additional resources:
v4-periphery contains advanced hook implementations that serve as a great reference