// SPDX-License-Identifier: MIT pragma solidity 0.7.6; pragma abicoder v2; import "./interfaces/IInstanceRegistry.sol"; import "./InstanceFactory.sol"; contract AddInstanceProposal { InstanceFactory public immutable instanceFactory; IInstanceRegistry public immutable instanceRegistry; address public immutable token; uint24 public immutable uniswapPoolSwappingFee; uint256 public immutable numInstances; uint256 internal immutable denomination0; uint256 internal immutable denomination1; uint256 internal immutable denomination2; uint32 internal immutable protocolFee0; uint32 internal immutable protocolFee1; uint32 internal immutable protocolFee2; event AddInstanceForRegistry(address instance, address token, uint256 denomination); constructor( address _instanceFactory, address _instanceRegistry, address _token, uint24 _uniswapPoolSwappingFee, uint256[] memory _denominations, uint32[] memory _protocolFees ) { instanceFactory = InstanceFactory(_instanceFactory); instanceRegistry = IInstanceRegistry(_instanceRegistry); token = _token; uniswapPoolSwappingFee = _uniswapPoolSwappingFee; require(_denominations.length == _protocolFees.length); uint256 _numInstances = _denominations.length; require(_numInstances > 0); require(_numInstances < 4); numInstances = _numInstances; denomination0 = _numInstances > 0 ? _denominations[0] : 0; denomination1 = _numInstances > 1 ? _denominations[1] : 0; denomination2 = _numInstances > 2 ? _denominations[2] : 0; protocolFee0 = _numInstances > 0 ? _protocolFees[0] : 0; protocolFee1 = _numInstances > 1 ? _protocolFees[1] : 0; protocolFee2 = _numInstances > 2 ? _protocolFees[2] : 0; } function executeProposal() external { for (uint256 i = 0; i < numInstances; i++) { address instance = instanceFactory.createInstanceClone(denominationByIndex(i), token); IInstanceRegistry.Instance memory newInstanceData = IInstanceRegistry.Instance( true, 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) { if (_index == 0) { return denomination0; } else if (_index == 1) { return denomination1; } else if (_index == 2) { return denomination2; } else { revert("Invalid instance index"); } } function protocolFeeByIndex(uint256 _index) public view returns (uint32) { if (_index == 0) { return protocolFee0; } else if (_index == 1) { return protocolFee1; } else if (_index == 2) { return protocolFee2; } else { revert("Invalid instance index"); } } }