// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; // OZ Imports import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // Tornado imports import { ITornadoInstance } from "tornado-anonymity-mining/contracts/interfaces/ITornadoInstance.sol"; // STD Imports import { Test } from "forge-std/Test.sol"; import { console2 } from "forge-std/console2.sol"; // Local imports import { IGovernance, Proposal } from "common/interfaces/IGovernance.sol"; import { TornadoAddresses } from "common/TornadoAddresses.sol"; import { UniswapV3FeeOracle } from "src/v2/UniswapV3FeeOracle.sol"; import { CurveFeeOracle, ICurvePriceOracle, CurveChainedOracles } from "src/v2/CurveFeeOracle.sol"; import { InstanceData } from "src/v2/InstanceRegistry.sol"; contract OracleTests is Test { // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VARIABLES ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ address public constant crvUSDUSDCStableswap2Pool = 0x4DEcE678ceceb27446b35C672dC7d61F30bAD69E; address public constant tricryptoUSDCPool = 0x7F86Bf177Dd4F3494b841a37e810A34dD56c829B; ITornadoInstance public constant cu10_000 = ITornadoInstance(0x49f173CDAB99a2C3800F1255393DF9B7a17B82Bb); IERC20 public constant TORN = IERC20(0x77777FeDdddFfC19Ff86DB637967013e6C6A116C); UniswapV3FeeOracle v3FeeOracle; CurveFeeOracle feeOracle; // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TESTING ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function setUp() public { vm.createSelectFork(vm.envString("MAINNET_RPC_URL")); v3FeeOracle = new UniswapV3FeeOracle(address(this)); v3FeeOracle.setGlobalTornPoolFee(10_000, true); v3FeeOracle.setGlobalTwapIntervalSeconds(5400); v3FeeOracle.setGlobalMinObservationCardinality(10); feeOracle = new CurveFeeOracle(address(this)); feeOracle.setTornOracleIsUniswapV3(false); feeOracle.setUniswapV3FeeOracle(v3FeeOracle); } function test_curveFeeSingleTricrypto() public { _setCurveFeeSimpleTricryptoOracleForInstance(feeOracle, cu10_000); // CRVUSD 10_000 console2.log( "\nShould be 30 * (ETH/USD) ------------------------------------------------\n", uint256( feeOracle.getFee( TORN, cu10_000, InstanceData(IERC20(cu10_000.token()), 0, true, true), 30, 10_000 ) ), "\n------------------------------------------------------------------------\n" ); } function test_curveFeeChainedTORN() public { feeOracle.setTornOracleIsUniswapV3(true); _setCurveFeeChainedOracleForInstance(feeOracle, cu10_000); // CRVUSD 10_000 console2.log( "\nTORN Fee calculated ------------------------------------------------------\n", uint256( feeOracle.getFee( TORN, cu10_000, InstanceData(IERC20(cu10_000.token()), 0, true, true), 30, 10_000 ) ), "\n------------------------------------------------------------------------\n" ); } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ HELPERS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ function _setCurveFeeSimpleTricryptoOracleForInstance( CurveFeeOracle _feeOracle, ITornadoInstance _instance ) internal { ICurvePriceOracle[] memory _oracles = new ICurvePriceOracle[](1); _oracles[0] = ICurvePriceOracle(tricryptoUSDCPool); bytes4[] memory _selectors = new bytes4[](1); _selectors[0] = CurveChainedOracles.PRICE_ORACLE_UINT256_SELECTOR; uint8[] memory _coins = new uint8[](1); _coins[0] = 1; // ETHER bool[] memory _invert = new bool[](1); _invert[0] = true; _feeOracle.modifyChainedOracleForInstance( _instance, _oracles, _selectors, _coins, _invert, "ETH/CRVUSD" ); } function _setCurveFeeChainedOracleForInstance(CurveFeeOracle _feeOracle, ITornadoInstance _instance) internal { ICurvePriceOracle[] memory _oracles = new ICurvePriceOracle[](2); _oracles[0] = ICurvePriceOracle(crvUSDUSDCStableswap2Pool); _oracles[1] = ICurvePriceOracle(tricryptoUSDCPool); bytes4[] memory _selectors = new bytes4[](2); _selectors[0] = CurveChainedOracles.PRICE_ORACLE_SELECTOR; _selectors[1] = CurveChainedOracles.PRICE_ORACLE_UINT256_SELECTOR; uint8[] memory _coins = new uint8[](2); _coins[1] = 1; bool[] memory _invert = new bool[](2); _invert[0] = false; _invert[1] = true; _feeOracle.modifyChainedOracleForInstance( _instance, _oracles, _selectors, _coins, _invert, "ETH/CRVUSD" ); } }