146 lines
4.7 KiB
Solidity
146 lines
4.7 KiB
Solidity
|
// 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"
|
||
|
);
|
||
|
}
|
||
|
}
|