V2 contracts for Velodrome Finance, an AMM on Optimism inspired by Solidly.
See SPECIFICATION.md
for more detail.
Filename | Description |
---|---|
Pool.sol |
AMM constant-product implementation similar to Uniswap V2 liquidity pools |
Router.sol |
Handles multi-pool swaps, deposit/withdrawal, similar to Uniswap V2 Router interface |
PoolFees.sol |
Stores the liquidity pool trading fees, these are kept separate from the reserves |
VelodromeLibrary.sol |
Provides router-related helpers, eg. for price-impact calculations |
FactoryRegistry.sol |
Registry of factories approved for creation of pools, gauges, bribes and managed rewards. |
Filename | Description |
---|---|
Velo.sol |
Protocol ERC20 token |
VotingEscrow.sol |
Protocol ERC-721 (ve)NFT representing the protocol vote-escrow lock. Beyond standard ve-type functions, there is also the ability to merge, split and create managed nfts. |
Minter.sol |
Protocol token minter. Distributes emissions to Voter.sol and rebases to RewardsDistributor.sol . |
RewardsDistributor.sol |
Is used to handle the rebases distribution for (ve)NFTs/lockers. |
VeArtProxy.sol |
(ve)NFT art proxy contract, exists for upgradability purposes |
Filename | Description |
---|---|
Voter.sol |
Handles votes for the current epoch, gauge and voting reward creation as well as emission distribution to Gauge.sol contracts. |
Gauge.sol |
Gauges are attached to a Pool and based on the (ve)NFT votes it receives, it distributes proportional emissions in the form of protocol tokens. Deposits to the gauge take the form of LP tokens for the Pool. In exchange for receiving protocol emissions, claims on fees from the pool are relinquished to the gauge. Standard rewards contract. |
rewards/ |
|
Reward.sol |
Base reward contract to be inherited for distribution of rewards to stakers. |
VotingReward.sol |
Rewards contracts used by FeesVotingReward.sol and BribeVotingReward.sol which inherits Reward.sol . Rewards are distributed in the following epoch proportionally based on the last checkpoint created by the user, and are earned through "voting" for a pool or gauge. |
FeesVotingReward.sol |
Stores LP fees (from the gauge via PoolFees.sol ) to be distributed for the current voting epoch to it's voters. |
BribeVotingReward.sol |
Stores the users/externally provided rewards for the current voting epoch to it's voters. These are deposited externally every week. |
ManagedReward.sol |
Staking implementation for managed veNFTs used by LockedManagedReward.sol and FreeManagedReward.sol which inherits Reward.sol . Rewards can be earned passively by veNFTs who delegate their voting power to a "managed" veNFT. |
LockedManagedReward.sol |
Handles "locked" rewards (i.e. Velo rewards / rebases that are compounded) for managed NFTs. Rewards are not distributed and only returned to VotingEscrow.sol when the user withdraws from the managed NFT. |
FreeManagedReward.sol |
Handles "free" (i.e. unlocked) rewards for managed NFTs. Any rewards earned by a managed NFT that a manager passes on will be distributed to the users that deposited into the managed NFT. |
Filename | Description |
---|---|
v1/sink/ |
|
SinkManager.sol |
Used to capture V1 protocol tokens (via conversion of V1 NFTs to V2 NFTs or V1 Velo to V2 Velo). |
SinkDrain.sol |
A "fake" pool used solely for the purpose of collecting gauge emissions from V1. |
SinkConverter.sol |
A "fake" pool used solely to enable routers swapping from v1 VELO to v2 VELO. |
Filename | Description |
---|---|
VeloGovernor.sol |
OpenZeppelin's Governor contracts used in protocol-wide access control to whitelist tokens for trade within Velodrome, update minting emissions, and create managed veNFTs. |
EpochGovernor.sol |
A simple epoch-based governance contract used exclusively for adjusting emissions. |
This repository uses Foundry for testing and deployment.
Foundry Setup
forge install
forge build
forge test
In order to run mainnet fork tests against optimism, inherit BaseTest
in BaseTest.sol
in your new class and set the deploymentType
variable to Deployment.FORK
. See SinkManager.t.sol
for examples. The OPTIMISM_RPC_URL
field must be set in .env
. Optionally, BLOCK_NUMBER
can be set in the .env
file or in the test file if you wish to test against a consistent fork state (this will make tests faster).
yarn format
to run prettier.
yarn lint
to run solhint (currently disabled in CI).
See script/README.md
for more detail.
For general information about security include audits, bug bounty and deployed contracts, go here.
See PERMISSIONS.md
for more detail.
Velodrome has a live bug bounty hosted on (Immunefi).
Name | Address |
---|---|
ArtProxy | 0x4A9eA0dd5649eC4B6745c60d1769e2184C1782DD |
RewardsDistributor | 0x9D4736EC60715e71aFe72973f7885DCBC21EA99b |
FactoryRegistry | 0xF4c67CdEAaB8360370F41514d06e32CcD8aA1d7B |
Forwarder | 0x06824df38D1D77eADEB6baFCB03904E27429Ab74 |
GaugeFactory | 0x8391fE399640E7228A059f8Fa104b8a7B4835071 |
ManagedRewardsFactory | 0xcDd9585005095ac7447d1fDbC990C5CFB805cff0 |
Minter | 0x6dc9E1C04eE59ed3531d73a72256C0da46D10982 |
PoolFactory | 0xF1046053aa5682b4F9a81b5481394DA16BE5FF5a |
Router | 0xa062aE8A9c5e11aaA026fc2670B0D65cCc8B2858 |
SinkConverter | 0x585Af0b397AC42dbeF7f18395426BF878634f18D |
SinkManager | 0x5aeE5F0E6C2055EbD776DB25F48f6c9A68ABcdaE |
SinkManagerFacilitatorImplementation | 0x45fF00822E8235b86Cb605ac8295c14628cE78a4 |
VELO | 0x9560e827aF36c94D2Ac33a39bCE1Fe78631088Db |
Voter | 0x41C914ee0c7E1A5edCD0295623e6dC557B5aBf3C |
VotingEscrow | 0xFAf8FD17D9840595845582fCB047DF13f006787d |
VotingRewardsFactory | 0x756E7C245C69d351FfFBfb88bA234aa395AdA8ec |
Pool | 0x95885af5492195f0754be71ad1545fe81364e531 |