tornado-pool-factory/README.md

101 lines
4.5 KiB
Markdown
Raw Normal View History

2022-08-08 16:49:28 +02:00
# Tornado Pool Factory
2022-02-22 21:03:16 +01:00
2021-10-24 21:54:07 +02:00
## About
2022-08-08 16:49:28 +02:00
Separate instance of [Tornado classic](https://github.com/tornadocash/tornado-core) is needed for each [token, denomination] pair. This repository contains smart contracts of Tornado Pool Factory, which is used to create and register new pools:
2022-08-08 16:49:28 +02:00
- factory creates a new Tornado pool
- if there is [pool registry](https://github.com/Rezan-vm/tornado-relayer-registry/blob/main/contracts/tornado-proxy/InstanceRegistry.sol) on this chain (only ETH mainnet for now), the factory also creates [governance](https://github.com/tornadocash/tornado-governance) proposal for registration new pool in instance registry
There are two deployed contracts:
1. `InstanceFactory` - instance factory for the creation of new Tornado ERC20/native pools
2. `InstanceProposalCreator` - governance proposal factory for the addition of new Tornado instances to the Tornado instance registry
### InstanceFactory
2022-08-08 16:49:28 +02:00
Anyone for sidechains and only governance for mainnet can create a new instance by calling `createInstanceClone` method of the factory with parameters:
2022-08-08 16:49:28 +02:00
1. `address token` - address of ERC20 token for a new instance, zero address for the native currency
2. `uint256 denomination` - denomination for new instance (tokens can only be deposited in certain denominations into Tornado instances)
2022-07-28 12:26:39 +02:00
### InstanceProposalCreator
2021-10-24 21:54:07 +02:00
2022-08-08 16:49:28 +02:00
Anyone can create a governance proposal for the addition of a new instance by calling `createProposalApprove/createProposalPermit` method of the factory with parameters (proposal creation fee in TORN is charged from the sender):
2022-07-28 12:26:39 +02:00
1. `address token` - address of ERC20 token for a new instance, zero address for the native instance
2. `uint24 uniswapPoolSwappingFee` - fee value of Uniswap instance which will be used for `TORN/token` price determination. `3000` means 0.3% fee Uniswap pool. Zero value for the native instance.
2022-02-22 20:15:37 +01:00
3. `uint256[] denominations` - list of denominations for each new instance (tokens can only be deposited in certain denominations into instances).
4. `uint32[] protocolFees` - list of protocol fees for each new instance (this fee is only charged from registrated relayer during withdrawal process). `100` means 1% of instance denomination fee for withdrawal throw registrated relayer.
2022-02-22 21:03:16 +01:00
2022-08-08 16:49:28 +02:00
## Parameters
2022-02-22 21:03:16 +01:00
2022-07-28 12:26:39 +02:00
### InstanceProposalCreator
2022-03-15 16:20:36 +01:00
1. `max number of new instances in one proposal` - the current version supports the addition of a maximum of 4 instances at once.
2022-08-08 16:49:28 +02:00
2. `proposal creation fee` - this fee is charged from creator of the proposal during `createProposalApprove/createProposalPermit` factory method execution. It can be changed by governance. Default value is stored in `config.js`.
3. `TWAPSlotsMin` - minimum number of TWAP slots for Uniswap pool that is chosen during `createProposalApprove/createProposalPermit` factory method call. It can be changed by governance. The default value is stored in `config.js`.
2022-02-22 21:03:16 +01:00
2022-02-23 15:03:05 +01:00
## Warnings
1. This version of the factory creates a proposal for **immutable** Tornado instance initialization.
2022-02-22 20:15:37 +01:00
## Tests
2021-10-24 21:54:07 +02:00
Setting up the repository:
```bash
2022-02-23 18:27:05 +01:00
yarn
cp .env.example .env
2021-10-24 21:54:07 +02:00
```
Please fill out .env according to the template provided in it. Please ensure that all of the example values are set to the correct addresses.
2021-10-24 21:54:07 +02:00
To run test scripts:
```bash
2022-02-23 18:27:05 +01:00
yarn test
2021-10-24 21:54:07 +02:00
```
2022-08-08 16:49:28 +02:00
Test scripts cover instance factory deployment, proposal deployment, and executing proposal.
2022-02-23 17:27:44 +01:00
## Deploy
Check config.js for actual values.
With `salt` = `0x0000000000000000000000000000000000000000000000000000000047941987` address must be:
2022-07-29 19:02:55 +02:00
1. `SidechainInstanceFactory` - `0x3D36D4b204E68e8A1431ec31Bea1fFbA3eC04590`
2. `SidechainInstanceFactory proxy` - `0x9d5C91ccF5c58b312896C4B4De45426fA128b001`
3. `InstanceFactory` - `0x83216783423500116723884F70dB44fB7BBb855b`
4. `InstanceFactory proxy` - `0x300aF836C74c1Af73f4353130AC1314Ed59B6a0A`
5. `InstanceProposalCreator` - `0x2b73b3555F1904CB8042cA6703734438eD4F28a0`
6. `InstanceProposalCreator proxy` - `0x84E013c8699Cb115906929B68b1Dc5ca5B2Fc46c`
2022-02-23 17:27:44 +01:00
Check addresses with current config:
```shell
2022-02-23 18:27:05 +01:00
yarn compile
node -e 'require("./src/generateAddresses").generateWithLog()'
2022-02-23 17:27:44 +01:00
```
2022-07-28 12:26:39 +02:00
Deploy SidechainInstanceFactory:
2022-02-23 17:27:44 +01:00
2022-08-08 16:49:28 +02:00
Check config.js for the actual **admin** value for this sidechain (TornadoCash community multisig).
2022-08-01 12:08:23 +02:00
2022-02-23 17:27:44 +01:00
```shell
2022-07-28 12:26:39 +02:00
yarn hardhat run scripts/deploySidechainInstanceFactory.js --network mainnet
2022-02-23 18:27:05 +01:00
```
2022-08-08 16:49:28 +02:00
Deploy InstanceProposalCreator + InstanceFactory (ETH mainnet):
2022-02-23 18:27:05 +01:00
```shell
2022-07-28 12:26:39 +02:00
yarn hardhat run scripts/deployInstanceProposalCreator.js --network mainnet
2022-02-23 18:27:05 +01:00
```
2022-07-28 12:26:39 +02:00
Verify on Etherscan:
2022-02-23 18:34:01 +01:00
2022-02-23 18:27:05 +01:00
```
yarn hardhat verify --network <network-name> <contract-address> <constructor-arguments>
2022-02-23 17:27:44 +01:00
```