infrastructure-upgrade/test/OracleTests.sol

146 lines
4.7 KiB
Solidity
Raw Normal View History

// 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"
);
}
}