@voltz-protocol/voltz-core

1.1.0 • Public • Published

Voltz Core

Introduction

Voltz is a noncustodial automated market maker for Interest Rate Swaps (IRS). Voltz uses a Concentrated Liquidity Virtual AMM (vAMM) for price discovery only, with the management of the underlying assets performed by the Margin Engine. The combined impact of these modules enables counterparties to create and trade fixed and variable rates through a mechanism that is up to 3,000x more capital efficient than alternative interest rate swap models, whilst also providing Liquidity Providers and Traders with significant control and flexibility over their positions.

This repository contains the smart contracts that power Voltz Protocol. Over time, Voltz Protocol will be governed by the DAO, so that the protocol is owned and managed by the community that uses it. Decentralizing ownership is critical to ensure the strength of the ecosystem we are all looking to build and to provide control to those that use the system. However, Voltz will initially be controlled by the Voltz Multisigs whilst the DAO is being created.

We would love to see how you can build and improve upon what we've built here at Voltz.

Community Deployment

Community Deployer Address Kovan: 0x9ff64338E09F46708Af86d72Dc9F0E226B07a279

Active LP Optimization

In order to test out a simple Active LP Optimizer on top of Voltz Protocol, head over to Active LP Simulation.

Refer to Active LP Strategy to check out a simple active lp strategy contract implementation.

Liquidator Bot (example)

In order to test out a simple liquidator bot simulation on top of Voltz, head over to Liquidator Bot Simulation.

Refer to LiquidatorBot to check out a simple liquidator bot implementation.

To run a liquidator bot simulation: run:

npx hardhat test test/liquidator_bot/liquidator_bot.ts

Bug Bounty

Alongside third-party auditors we want help from the community in ensuring Voltz Protocol remains secure. As a result, we have a generous bug-bounty program on Immunifi. We look forward to your help in creating one of the most important lego-blocks of a new financial system!

Uniswap v3 Additional Use Grant

There are a large number of innovative design decisions required to create Voltz Protocol, including the use of concentrated liquidity pioneered in Uniswap v3. However, Uniswap v3 is subject to a Business Source License, meaning Uniswap v3 code can only be used in another protocol if that protocol is provided with an “Additional Use Grant” by the Uniswap community.

Voltz was provided an Additional Use Grant, executed following an on-chain governance vote by the Uniswap Community. This means Uniswap v3 code can be used within Voltz Protocol. However, if another project wishes to use this code they will also need to get an Additional Use Grant from Uniswap Governance in accordance with the Business Source License.

The Uniswap v3 code subject to the Business Source License can be identified by the “SPDX-License-Identifier: BUSL-1.1” at the top of each library or smart contract.

Code Contributions

We are extremely excited to have the support of individuals and teams that wish to contribute to Voltz core contracts. Before starting to work on major contributions make sure to discuss them with the Voltz community to make sure they are in alignment with our roadmap and long-term vision. If you have any questions or just want to have a discussion feel free to jump into our discord.

Build and Test

Getting Started

Install Yarn

Install and Setup Hardhat

Setup

git clone https://github.com/voltzprotocol/voltz-core.git
cd voltz-core
yarn
npx husky install

Compile

npx hardhat compile

Test

npx hardhat test

Linting

We use eslint, solhint and prettier to handle linting.

package.json contains a few scripts to help you with linting and formatting.

The most important is yarn run check, which will fix any formatting and linting issues and then run the entire codebase through the linter. You should always run this before merging any code into main.

By default, we install a pre-push hook to run yarn run check before each push. If you need to override this, you can pass the --no-verify flag:

git push -u origin my-fancy-branch --no-verify

Linting

  • yarn lint - Lint the entire codebase.
  • yarn lint:sol - Lint Solidity files.
  • yarn lint:ts - Lint TypeScript files.
  • yarn lint:sol:fix - Fix Solidity files.
  • yarn lint:ts:fix - Fix TypeScript files.
  • yarn lint:fix - Fix linting errors across the entire codebase.

Formatting

  • yarn format - Format the entire codebase.
  • yarn format:sol - Format Solidity files.
  • yarn format:ts - Format TypeScript files.
  • yarn format:sol:check - Check the formatting of all Solidity files.
  • yarn format:ts:check - Check the formatting of all TypeScript files.
  • yarn format:check - Check the formatting of all files.

Deployment and Testing

Create a local deployment for testing

To start a local blockchain (hardhat node) and deploy our contracts to it, run:

yarn deploy:localhost

Fork mainnet for testing

To fork third party contracts (e.g. Aave, Compound, Lido, Rocket, ...) from mainnet to a local blockchain (hardhat node) for testing, run:

yarn deploy:mainnet_fork

This will deploy a new system of the latest Voltz contracts on top of those third party contracts. You can interact with this system using --network localhost.

To instead test / simulate / expirment with the Voltz mainnet deployment on your local blockchain, you can subsequently run:

rm -rf deployments/localhost && cp -p -r deployments/mainnet deployments/localhost

You can now interact with a fork of the current mainnet system using --network localhost.

To change the block production cadence of the local blockchain (sometimes useful to mirror timing on mainnet), see commented out lines in deploy/0.factory.ts

Deploy to kovan

To deploy our contracts to the kovan testnet, first check the configuration for kovan in the deployment config, and once it is correct run:

yarn deploy:kovan

To verify the deployed contracts in etherscan, ensure that you have a valid ETHERSCAN_API_KEY value defined in your .env file and then run:

npx hardhat --network kovan etherscan-verify --solc-input

(At the time of writing the --solc-input flag is required due to some solidity issues. The result is somewhat unsatisfactory because all known contract code is displayed in etherscan for each contract, rather than just the relevant contracts. See here for some discussion, but note that for us it seems to fail even with solc 0.8.9.)

Mint tokens for testing

There is a task for this. Run npx hardhat help mintTestTokens for task usage.

Deploy an IRS Instance

Run: npx hardhat createIrsInstance --network <networkName> --rate-oracle <rateOracleName> [--tick-spacing <tickSpacingValue>]

Where rateOracleName is the name of a rate oracle instance as defined in the deployments/<networkName> directory. E.g. it might be "MockTestRateOracle" on localhost, or "AaveRateOracle_USDT" on kovan.

List IRS Instances

npx hardhat listIrsInstances --network <networkName>

For humans, some post-processing can be useful to make the output more readable. E.g. in bash:

npx hardhat listIrsInstances --network <networkName> | column -s, -t

Upgrading contracts

See usage for upgrade tasks, e.g.:

  • npx hardhat deployUpdatedImplementations --help
  • npx hardhat updateRateOracle --help
  • npx hardhat upgradeVAMM --help

Python package management

When running the python scripts use the pipenv virtual environment and pip3 package manager. To do this you need to make sure that you have a clean installation of python3, pip3, and pipenv. You can python3 with brew which also installs pip3 with it. You can then install pipenv using pip3 install pipenv.

Next, open a terminal in the VS Code repo you want and run pipenv shell, creating a python virtual environment. You can then use pipenv install [package name] to install packages like pandas. This creates 2 files, a Pipfile and a Piplock file. These keep track of the packages and can be treated like the package.json and package.lock files for a node projecty.

Terms and Conditions

The Voltz Protocol, and any products or services associated therewith, is offered only to persons (aged 18 years or older) or entities who are not residents of, citizens of, are incorporated in, owned or controlled by a person or entity in, located in, or have a registered office or principal place of business in any “Restricted Territory.”

The term Restricted Territory includes the United States of America (including its territories), Algeria, Bangladesh, Bolivia, Belarus, Myanmar (Burma), Côte d’Ivoire (Ivory Coast), Egypt, Republic of Crimea, Cuba, Democratic Republic of the Congo, Iran, Iraq, Liberia, Libya, Mali, Morocco, Nepal, North Korea, Oman, Qatar, Somalia, Sudan, Syria, Tunisia, Venezuela, Yemen, Zimbabwe; or any jurisdictions in which the sale of cryptocurrencies are prohibited, restricted or unauthorized in any form or manner whether in full or in part under the laws, regulatory requirements or rules in such jurisdiction; or any state, country, or region that is subject to sanctions enforced by the United States, such as the Specially Designed Nationals and Blocked Persons List (“SDN List”) and Consolidated Sanctions List (“Non-SDN Lists”), the United Kingdom, or the European Union.

Readme

Keywords

none

Package Sidebar

Install

npm i @voltz-protocol/voltz-core

Weekly Downloads

0

Version

1.1.0

License

BUSL-1.1

Unpacked Size

3.25 MB

Total Files

329

Last publish

Collaborators

  • ioanaroceanu
  • aniculae
  • 0xzenus
  • filip-voltz
  • voltzprotocol