Skip to content

🥨 Contracts for Merkl, Angle Labs incentivization product for concentrated liquidity AMMs

License

Notifications You must be signed in to change notification settings

AngleProtocol/merkl-contracts

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

f2afad7 · Jan 10, 2025

History

92 Commits
Dec 6, 2024
Feb 16, 2024
Dec 6, 2024
Jan 10, 2025
Dec 20, 2024
Jan 10, 2025
Jan 2, 2025
Dec 20, 2024
Dec 6, 2024
Dec 20, 2024
Nov 2, 2023
Nov 2, 2023
Dec 6, 2024
Nov 2, 2023
Dec 11, 2024
Nov 8, 2022
Dec 6, 2024
Dec 11, 2024
Dec 20, 2024
Dec 6, 2024
Dec 20, 2024
Nov 8, 2022
Dec 20, 2024
Dec 20, 2024
Nov 17, 2023
Nov 2, 2023

Repository files navigation

CI Coverage

This repository contains the smart contracts of Merkl.

It basically contains two contracts:

  • DistributionCreator: to which DAOs and individuals can deposit their rewards to incentivize onchain actions
  • Distributor: the contract where users can claim their rewards

You can learn more about the Merkl system in the documentation.

Setup

Install packages

You can install all dependencies by running

bun i

Create .env file

You can copy paste .env.example file into .env and fill with your keys/RPCs.

Warning: always keep your confidential information safe.

Foundry Installation

curl -L https://foundry.paradigm.xyz | bash

source /root/.zshrc
# or, if you're under bash: source /root/.bashrc

foundryup

Tests

# Whole test suite
forge test

Deploying

Run without broadcasting:

yarn foundry:script <path_to_script> --rpc-url <network>

Run with broadcasting:

yarn foundry:deploy <path_to_script> --rpc-url <network>

Scripts

Scripts can be executed in two ways:

  1. With parameters: directly passing values as arguments
  2. Without parameters: modifying the default values in the script

Running Scripts

# With parameters
forge script scripts/MockToken.s.sol:Deploy --rpc-url <network> --sender <address> --broadcast -i 1 \
  --sig "run(string,string,uint8)" "MyToken" "MTK" 18

# Without parameters (modify default values in the script first)
forge script scripts/MockToken.s.sol:Deploy --rpc-url <network> --sender <address> --broadcast -i 1

# Common options:
#   --broadcast         Broadcasts the transactions to the network
#   --sender <address>  The address which will execute the script
#   -i 1                Open an interactive prompt to enter private key of the sender when broadcasting

Examples

# Deploy a Mock Token
forge script scripts/MockToken.s.sol:Deploy --rpc-url <network> --sender <address> --broadcast \
  --sig "run(string,string,uint8)" "MyToken" "MTK" 18

# Mint tokens
forge script scripts/MockToken.s.sol:Mint --rpc-url <network> --sender <address> --broadcast \
  --sig "run(address,address,uint256)" <token_address> <recipient> 1000000000000000000

# Set minimum reward token amount
forge script scripts/DistributionCreator.s.sol:SetRewardTokenMinAmounts --rpc-url <network> --sender <address> --broadcast \
  --sig "run(address,uint256)" <reward_token_address> <min_amount>

# Set fees for campaign
forge script scripts/DistributionCreator.s.sol:SetCampaignFees --rpc-url <network> --sender <address> --broadcast \
  --sig "run(uint32,uint256)" <campaign_type> <fees>

# Toggle token whitelist status
forge script scripts/DistributionCreator.s.sol:ToggleTokenWhitelist --rpc-url <network> --sender <address> --broadcast \
  --sig "run(address)" <token_address>

For scripts without parameters, you can modify the default values directly in the script file:

// In scripts/MockToken.s.sol:Deploy
function run() external broadcast {
  // MODIFY THESE VALUES TO SET YOUR DESIRED TOKEN PARAMETERS
  string memory name = 'My Token'; // <- modify this
  string memory symbol = 'MTK'; // <- modify this
  uint8 decimals = 18; // <- modify this
  _run(name, symbol, decimals);
}

Audits

The Merkl smart contracts have been audited by Code4rena, find the audit report here.

Media

Don't hesitate to reach out on Twitter 🐦