tornado-pool-factory/contracts/AddInstanceProposal.sol

103 lines
3.4 KiB
Solidity
Raw Normal View History

2022-02-16 14:50:46 +01:00
// SPDX-License-Identifier: MIT
pragma solidity 0.7.6;
pragma abicoder v2;
import "./interfaces/IInstanceRegistry.sol";
2022-07-28 12:26:39 +02:00
import "./interfaces/IInstanceFactory.sol";
2022-02-16 14:50:46 +01:00
contract AddInstanceProposal {
2022-07-28 12:26:39 +02:00
IInstanceFactory public immutable instanceFactory;
2022-02-16 14:50:46 +01:00
IInstanceRegistry public immutable instanceRegistry;
address public immutable token;
uint24 public immutable uniswapPoolSwappingFee;
2022-02-17 21:15:19 +01:00
uint256 public immutable numInstances;
2022-02-16 14:50:46 +01:00
uint256 internal immutable denomination0;
uint256 internal immutable denomination1;
uint256 internal immutable denomination2;
2022-03-15 16:20:36 +01:00
uint256 internal immutable denomination3;
2022-02-16 14:50:46 +01:00
uint32 internal immutable protocolFee0;
uint32 internal immutable protocolFee1;
uint32 internal immutable protocolFee2;
2022-03-15 16:20:36 +01:00
uint32 internal immutable protocolFee3;
2022-02-16 14:50:46 +01:00
event AddInstanceForRegistry(address instance, address token, uint256 denomination);
constructor(
address _instanceFactory,
address _instanceRegistry,
address _token,
uint24 _uniswapPoolSwappingFee,
uint256[] memory _denominations,
uint32[] memory _protocolFees
) {
2022-07-28 12:26:39 +02:00
instanceFactory = IInstanceFactory(_instanceFactory);
2022-02-16 14:50:46 +01:00
instanceRegistry = IInstanceRegistry(_instanceRegistry);
token = _token;
uniswapPoolSwappingFee = _uniswapPoolSwappingFee;
2022-03-15 18:55:01 +01:00
require(_denominations.length == _protocolFees.length, "Incorrect denominations/fees length");
2022-02-16 14:50:46 +01:00
uint256 _numInstances = _denominations.length;
2022-03-15 16:20:36 +01:00
require(_numInstances > 0 && _numInstances <= 4, "incorrect instances number");
2022-02-16 14:50:46 +01:00
numInstances = _numInstances;
denomination0 = _numInstances > 0 ? _denominations[0] : 0;
denomination1 = _numInstances > 1 ? _denominations[1] : 0;
denomination2 = _numInstances > 2 ? _denominations[2] : 0;
2022-03-15 16:20:36 +01:00
denomination3 = _numInstances > 3 ? _denominations[3] : 0;
2022-02-16 14:50:46 +01:00
protocolFee0 = _numInstances > 0 ? _protocolFees[0] : 0;
protocolFee1 = _numInstances > 1 ? _protocolFees[1] : 0;
protocolFee2 = _numInstances > 2 ? _protocolFees[2] : 0;
2022-03-15 16:20:36 +01:00
protocolFee3 = _numInstances > 3 ? _protocolFees[3] : 0;
2022-02-16 14:50:46 +01:00
}
function executeProposal() external {
for (uint256 i = 0; i < numInstances; i++) {
address instance = instanceFactory.createInstanceClone(denominationByIndex(i), token);
IInstanceRegistry.Instance memory newInstanceData = IInstanceRegistry.Instance(
2022-07-28 12:26:39 +02:00
token != address(0),
2022-02-16 14:50:46 +01:00
IERC20(token),
IInstanceRegistry.InstanceState.ENABLED,
uniswapPoolSwappingFee,
protocolFeeByIndex(i)
);
IInstanceRegistry.Tornado memory tornadoForUpdate = IInstanceRegistry.Tornado(instance, newInstanceData);
instanceRegistry.updateInstance(tornadoForUpdate);
emit AddInstanceForRegistry(address(instance), token, denominationByIndex(i));
}
}
function denominationByIndex(uint256 _index) public view returns (uint256) {
2022-02-22 17:20:33 +01:00
if (_index == 0) {
return denomination0;
} else if (_index == 1) {
return denomination1;
} else if (_index == 2) {
return denomination2;
2022-03-15 16:20:36 +01:00
} else if (_index == 3) {
return denomination3;
2022-02-22 17:20:33 +01:00
} else {
2022-02-16 14:50:46 +01:00
revert("Invalid instance index");
}
}
function protocolFeeByIndex(uint256 _index) public view returns (uint32) {
2022-02-22 17:20:33 +01:00
if (_index == 0) {
return protocolFee0;
} else if (_index == 1) {
return protocolFee1;
} else if (_index == 2) {
return protocolFee2;
2022-03-15 16:20:36 +01:00
} else if (_index == 3) {
return protocolFee3;
2022-02-22 17:20:33 +01:00
} else {
2022-02-16 14:50:46 +01:00
revert("Invalid instance index");
}
}
}