The veToken model, originating from Curve's (veCRV) token, is a significant development in the token economy of digital assets. Since its introduction, it has been adopted by many other DeFi protocols and has undergone several transformations.
The value of veToken primarily comes from its governance rights. Holders of veToken stake the protocol's governance token for extended periods to drive the protocol, influence its emissions, and share in the protocol's earnings.
Current models of veToken have some drawbacks and this project is essentially built to address those concerns.
- User's stake their tokens for longer periods to earn higher incentives, however given the nature of the veToken model, user's assets are locked for long long time (like 4 years) and there is no other way out, but to wait for unlock time.
- Meta-governance protocols provide an alternate option of liquid staking while getting the exact benefits for the users, which ends up with these governance protocols handling majority of veTokens.
Make the veToken an nft. Allowing user's to create multiple staking positions for each address, and brining them a flexibility to sell of their positions in case of need in an external / protocol's provided market.
BaseContract: https://github.com/Sperax/Vote-Escrow-Smart-Contract-Template
- Optimize the process of querying a user's balance.
- Implement a protocol-provided marketplace to facilitate the sale of existing veNFT positions.
- Add more advanced functionalities such as merging and splitting existing NFT positions.
- Redesign the Gauge architecture to incorporate the veNFT model.
To set up the repository, please use the following commands:
$npm ci
$ forge build --force
$ forge test
$ forge coverage
$ npm run forge-coverage #Requires `genhtml` | `ekhtml` package
$ npm run lint-contract
$ npm run slither-analyze
(Ref: https://book.getfoundry.sh/tutorials/solidity-scripting)
- Add and update
.env
file in the root as guided by.env.example
- Load the env file using command
$ source .env
- Deploy contract to a forknet
$ forge script scripts/Deployment.s.sol:Deployment --fork-url $ARBITRUM_MAINNET -vv
- Deploy contract to a mainnet | local network
$ forge script scripts/Deployment.s.sol:Deployment --rpc-url $ARBITRUM_MAINNET --broadcast --verify -vv