From 1003e95dcb4fda2f88d2114b86aa494706766166 Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Tue, 9 Jul 2024 12:45:46 -0700 Subject: [PATCH 01/12] Deploy new oracles (#63) * add delayed oracle * fix l2validity arguments * simulate success * 6/7/24 deployment * variable naming MAINNET_ORACLE_DELAY --- package.json | 2 +- script/Common.s.sol | 2 + script/DeployOracle.s.sol | 74 +++++++++++++++++++ script/Registry.s.sol | 61 ++++++++------- script/predeployment/DeployRelayers.s.sol | 8 +- .../factories/IDelayedOracleFactory.sol | 39 ++++++++++ src/interfaces/oracles/IDelayedOracle.sol | 56 ++++++++++++++ 7 files changed, 210 insertions(+), 32 deletions(-) create mode 100644 script/DeployOracle.s.sol create mode 100644 src/interfaces/factories/IDelayedOracleFactory.sol create mode 100644 src/interfaces/oracles/IDelayedOracle.sol diff --git a/package.json b/package.json index ba1df38..856fba2 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "url": "https://github.com/open-dollar/od-relayer" }, "license": "MIT", - "author": "Keyp", + "author": "OpenFi Foundation", "contributors": [ "pi0neerpat (https://github.com/pi0neerpat)", "daopunk (https://github.com/daopunk)", diff --git a/script/Common.s.sol b/script/Common.s.sol index dcc3166..e5fef49 100644 --- a/script/Common.s.sol +++ b/script/Common.s.sol @@ -10,12 +10,14 @@ import {IAuthorizable} from '@interfaces/utils/IAuthorizable.sol'; import {CamelotRelayerFactory} from '@contracts/factories/CamelotRelayerFactory.sol'; import {ChainlinkRelayerFactory} from '@contracts/factories/ChainlinkRelayerFactory.sol'; import {DenominatedOracleFactory} from '@contracts/factories/DenominatedOracleFactory.sol'; +import {IDelayedOracleFactory} from '@interfaces/factories/IDelayedOracleFactory.sol'; abstract contract CommonMainnet is Script { ChainlinkRelayerFactory public chainlinkRelayerFactory = ChainlinkRelayerFactory(MAINNET_CHAINLINK_RELAYER_FACTORY); CamelotRelayerFactory public camelotRelayerFactory = CamelotRelayerFactory(MAINNET_CAMELOT_RELAYER_FACTORY); DenominatedOracleFactory public denominatedOracleFactory = DenominatedOracleFactory(MAINNET_DENOMINATED_ORACLE_FACTORY); + IDelayedOracleFactory public delayedOracleFactory = IDelayedOracleFactory(MAINNET_DELAYED_ORACLE_FACTORY); } abstract contract CommonSepolia is Script { diff --git a/script/DeployOracle.s.sol b/script/DeployOracle.s.sol new file mode 100644 index 0000000..030a1df --- /dev/null +++ b/script/DeployOracle.s.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.7.6; + +import '@script/Registry.s.sol'; +import {Script} from 'forge-std/Script.sol'; +import {CommonMainnet} from '@script/Common.s.sol'; +import 'forge-std/console2.sol'; + +import {CamelotRelayerFactory} from '@contracts/factories/CamelotRelayerFactory.sol'; +import {ChainlinkRelayerFactory} from '@contracts/factories/ChainlinkRelayerFactory.sol'; +import {DenominatedOracleFactory} from '@contracts/factories/DenominatedOracleFactory.sol'; +import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; + +// BROADCAST +// source .env && forge script DeployEthUsdRelayer --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY --account defaultKey --sender $DEFAULT_KEY_PUBLIC_ADDRESS + +// SIMULATE +// source .env && forge script DeployEthUsdRelayer --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --sender $DEFAULT_KEY_PUBLIC_ADDRESS + +contract DeployEthUsdRelayer is Script, CommonMainnet { + function run() public { + vm.startBroadcast(); + + chainlinkRelayerFactory.deployChainlinkRelayerWithL2Validity( + MAINNET_CHAINLINK_ETH_USD_FEED, + MAINNET_CHAINLINK_SEQUENCER_FEED, + 1 days, + MAINNET_CHAINLINK_L2VALIDITY_GRACE_PERIOD + ); + + vm.stopBroadcast(); + } +} + +// BROADCAST +// source .env && forge script DeployLinkGrtEthOracles --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY --account defaultKey --sender $DEFAULT_KEY_PUBLIC_ADDRESS + +// SIMULATE +// source .env && forge script DeployLinkGrtEthOracles --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --sender $DEFAULT_KEY_PUBLIC_ADDRESS + +contract DeployLinkGrtEthOracles is Script, CommonMainnet { + IBaseOracle public _linkUSDRelayer; + IBaseOracle public _grtUSDRelayer; + IBaseOracle public _ethDelayedOracle; + + function run() public { + vm.startBroadcast(); + + _linkUSDRelayer = chainlinkRelayerFactory.deployChainlinkRelayerWithL2Validity( + MAINNET_CHAINLINK_LINK_USD_FEED, + MAINNET_CHAINLINK_SEQUENCER_FEED, + 1 hours, + MAINNET_CHAINLINK_L2VALIDITY_GRACE_PERIOD + ); + _grtUSDRelayer = chainlinkRelayerFactory.deployChainlinkRelayerWithL2Validity( + MAINNET_CHAINLINK_GRT_USD_FEED, + MAINNET_CHAINLINK_SEQUENCER_FEED, + 1 days, + MAINNET_CHAINLINK_L2VALIDITY_GRACE_PERIOD + ); + + IBaseOracle linkOracle = delayedOracleFactory.deployDelayedOracle(_linkUSDRelayer, MAINNET_ORACLE_DELAY); + IBaseOracle grtOracle = delayedOracleFactory.deployDelayedOracle(_grtUSDRelayer, MAINNET_ORACLE_DELAY); + IBaseOracle ethOracle = delayedOracleFactory.deployDelayedOracle( + IBaseOracle(MAINNET_CHAINLINK_L2VALIDITY_ETH_USD_RELAYER), MAINNET_ORACLE_DELAY + ); + + linkOracle.getResultWithValidity(); + grtOracle.getResultWithValidity(); + ethOracle.getResultWithValidity(); + + vm.stopBroadcast(); + } +} diff --git a/script/Registry.s.sol b/script/Registry.s.sol index 4bf4b55..6f9d37c 100644 --- a/script/Registry.s.sol +++ b/script/Registry.s.sol @@ -60,44 +60,51 @@ address constant SEPOLIA_ALGEBRA_FARM_CENTER = 0x04e4A5A4E4D2A5a0fb48ECde0bbD555 // -- Mainnet -- -address constant MAINNET_PROTOCOL_TOKEN = 0x000D636bD52BFc1B3a699165Ef5aa340BEA8939c; -address constant MAINNET_WETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; - +////////// FACTORIES ////////// +address constant MAINNET_CAMELOT_RELAYER_FACTORY = 0x36645830479170265A154Acb726780fdaE41A28F; +address constant MAINNET_CHAINLINK_RELAYER_FACTORY = 0x06C32500489C28Bd57c551afd8311Fef20bFaBB5; +address constant MAINNET_DENOMINATED_ORACLE_FACTORY = 0xBF760b23d2ef3615cec549F22b95a34DB0F8f5CD; address constant MAINNET_ALGEBRA_FACTORY = 0x1a3c9B1d2F0529D97f2afC5136Cc23e58f1FD35B; +address constant MAINNET_DELAYED_ORACLE_FACTORY = 0x9Dd63fA54dEfd8820BCAb3e3cC39aeEc1aE88098; -// Pre-deployment relayer factories -address constant MAINNET_CAMELOT_RELAYER_FACTORY = 0xC235041D2ea652261f816e4e8F56bD02AD623E11; -address constant MAINNET_CHAINLINK_RELAYER_FACTORY = 0x62f4A8565BDca2bB2b7975D4d5B48F61DA8846f5; -address constant MAINNET_DENOMINATED_ORACLE_FACTORY = 0xb6010972669953F6212B4AD969753c6e22ed5131; - -// Relayers +////////// RELAYERS ////////// +// Camelot address constant MAINNET_CAMELOT_ODG_WETH_RELAYER = 0xF7Ec9ad3192d4ec1E54d52B3E492B5B66AB02889; - -address constant MAINNET_CHAINLINK_ETH_USD_RELAYER = 0x1d2eA5253A3dc201d2275885621c095C6e656e29; -address constant MAINNET_CHAINLINK_RETH_ETH_RELAYER = 0x007E6300C8D98F5B34dFe040248A596482d82B3f; +// Chainlink +address constant MAINNET_CHAINLINK_ETH_USD_RELAYER = 0x3e6C1621f674da311E57646007fBfAd857084383; +address constant MAINNET_CHAINLINK_L2VALIDITY_ETH_USD_RELAYER = 0x4617Feb8B72167c3b8253a1327CddE44e54670Ce; +address constant MAINNET_CHAINLINK_RETH_ETH_RELAYER = 0x2b98972Ee61e8928F9dFa6504301296f0e7645Ca; address constant MAINNET_CHAINLINK_WSTETH_ETH_RELAYER = 0x48D3B7605B8dc3Ae231Bd59e40513C9e9Ac6D33a; - +address constant MAINNET_CHAINLINK_ARB_USD_RELAYER = 0x2635f731BB6981E72F92A781578952450759F762; +// Denominated address constant MAINNET_DENOMINATED_ODG_USD_ORACLE = 0xE90E52eb676bc00DD85FAE83D2FAC22062F7f470; -address constant MAINNET_DENOMINATED_RETH_USD_ORACLE = 0xCa3AD386d14d851A5fF5f08De2Bd2de88db2d5A0; -address constant MAINNET_DENOMINATED_WSTETH_USD_ORACLE = 0xCeE84f86d76bADa12262138b860D772812334DD6; - -// Oracles params -uint256 constant MAINNET_ORACLE_INTERVAL = 1 hours; - -// Chainlink price feeds to USD -address constant MAINNET_CHAINLINK_ARB_USD_FEED = 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6; +address constant MAINNET_DENOMINATED_RETH_USD_ORACLE = 0xE0ac4511A617cBee55ECb62667B08DB6864B9d8e; +address constant MAINNET_DENOMINATED_WSTETH_USD_ORACLE = 0x8746664d1E0F0e61275EF3B52A8a3b3dFC11CcAb; +// Delayed +address constant MAINNET_DELAYED_RETH_USD_ORACLE = 0x0859c0B3EF150fAb129E43B74a63da13F5d2Dd35; +address constant MAINNET_DELAYED_WSTETH_USD_ORACLE = 0xa8dEa011Ed90C53BA4601868Ccc9a36A6F442499; +address constant MAINNET_DELAYED_ARB_USD_ORACLE = 0xa4e0410E7eb9a02aa9C0505F629d01890c816A77; + +////////// CHAINLINK ////////// +// Price feeds to USD address constant MAINNET_CHAINLINK_ETH_USD_FEED = 0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612; - -// Chainlink price feeds to ETH +address constant MAINNET_CHAINLINK_ARB_USD_FEED = 0xb2A824043730FE05F3DA2efaFa1CBbe83fa548D6; +// Price feeds to ETH +address constant MAINNET_CHAINLINK_RETH_ETH_FEED = 0xD6aB2298946840262FcC278fF31516D39fF611eF; address constant MAINNET_CHAINLINK_WSTETH_ETH_FEED = 0xb523AE262D20A936BC152e6023996e46FDC2A95D; address constant MAINNET_CHAINLINK_CBETH_ETH_FEED = 0xa668682974E3f121185a3cD94f00322beC674275; -address constant MAINNET_CHAINLINK_RETH_ETH_FEED = 0xD6aB2298946840262FcC278fF31516D39fF611eF; +address constant MAINNET_CHAINLINK_LINK_USD_FEED = 0x86E53CF1B870786351Da77A57575e79CB55812CB; +address constant MAINNET_CHAINLINK_GRT_USD_FEED = 0x0F38D86FceF4955B705F35c9e41d1A16e0637c73; -// Chainlink sequencer feed for Arbitrum One +// Sequencer for Arbitrum One address constant MAINNET_CHAINLINK_SEQUENCER_FEED = 0xFdB631F5EE196F0ed6FAa767959853A9F217697D; +////////// PARAMS ////////// +address constant MAINNET_DEPLOYER = 0xF78dA2A37049627636546E0cFAaB2aD664950917; +uint256 constant MAINNET_ORACLE_DELAY = 1 hours; +uint256 constant MAINNET_CHAINLINK_L2VALIDITY_GRACE_PERIOD = 1 hours; +address constant MAINNET_PROTOCOL_TOKEN = 0x000D636bD52BFc1B3a699165Ef5aa340BEA8939c; +address constant MAINNET_WETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; address constant ETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; address constant ARB = 0x912CE59144191C1204E64559FE8253a0e49E6548; address constant ETH_ARB_POOL = 0xe51635ae8136aBAc44906A8f230C2D235E9c195F; - -address constant MAINNET_DEPLOYER = 0xF78dA2A37049627636546E0cFAaB2aD664950917; diff --git a/script/predeployment/DeployRelayers.s.sol b/script/predeployment/DeployRelayers.s.sol index 03ab429..bea87ef 100644 --- a/script/predeployment/DeployRelayers.s.sol +++ b/script/predeployment/DeployRelayers.s.sol @@ -19,7 +19,7 @@ contract DeployODGCamelotRelayerMainnet is CommonMainnet { function run() public { vm.startBroadcast(vm.envUint('ARB_MAINNET_DEPLOYER_PK')); camelotRelayerFactory.deployAlgebraRelayer( - MAINNET_ALGEBRA_FACTORY, MAINNET_PROTOCOL_TOKEN, MAINNET_WETH, uint32(MAINNET_ORACLE_INTERVAL) + MAINNET_ALGEBRA_FACTORY, MAINNET_PROTOCOL_TOKEN, MAINNET_WETH, uint32(MAINNET_ORACLE_DELAY) ); vm.stopBroadcast(); } @@ -56,7 +56,7 @@ contract DeployEthUsdChainlinkRelayerMainnet is CommonMainnet { function run() public { vm.startBroadcast(vm.envUint('ARB_MAINNET_DEPLOYER_PK')); - chainlinkRelayerFactory.deployChainlinkRelayer(MAINNET_CHAINLINK_ETH_USD_FEED, MAINNET_ORACLE_INTERVAL); + chainlinkRelayerFactory.deployChainlinkRelayer(MAINNET_CHAINLINK_ETH_USD_FEED, MAINNET_ORACLE_DELAY); vm.stopBroadcast(); } } @@ -73,7 +73,7 @@ contract DeployRethEthChainlinkRelayerMainnet is CommonMainnet { function run() public { vm.startBroadcast(vm.envUint('ARB_MAINNET_DEPLOYER_PK')); IBaseOracle _chainlinkRethEthPriceFeed = - chainlinkRelayerFactory.deployChainlinkRelayer(MAINNET_CHAINLINK_RETH_ETH_FEED, MAINNET_ORACLE_INTERVAL); + chainlinkRelayerFactory.deployChainlinkRelayer(MAINNET_CHAINLINK_RETH_ETH_FEED, MAINNET_ORACLE_DELAY); IBaseOracle _rethUsdOracle = denominatedOracleFactory.deployDenominatedOracle( _chainlinkRethEthPriceFeed, IBaseOracle(MAINNET_CHAINLINK_ETH_USD_RELAYER), false @@ -96,7 +96,7 @@ contract DeployWstethEthChainlinkRelayerMainnet is CommonMainnet { function run() public { vm.startBroadcast(vm.envUint('ARB_MAINNET_DEPLOYER_PK')); IBaseOracle _chainlinkWstethEthPriceFeed = - chainlinkRelayerFactory.deployChainlinkRelayer(MAINNET_CHAINLINK_WSTETH_ETH_FEED, MAINNET_ORACLE_INTERVAL); + chainlinkRelayerFactory.deployChainlinkRelayer(MAINNET_CHAINLINK_WSTETH_ETH_FEED, MAINNET_ORACLE_DELAY); IBaseOracle _wstethUsdOracle = denominatedOracleFactory.deployDenominatedOracle( _chainlinkWstethEthPriceFeed, IBaseOracle(MAINNET_CHAINLINK_ETH_USD_RELAYER), false diff --git a/src/interfaces/factories/IDelayedOracleFactory.sol b/src/interfaces/factories/IDelayedOracleFactory.sol new file mode 100644 index 0000000..5943a58 --- /dev/null +++ b/src/interfaces/factories/IDelayedOracleFactory.sol @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.7.6; + +import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; +import {IDelayedOracle} from '@interfaces/oracles/IDelayedOracle.sol'; +import {IAuthorizable} from '@interfaces/utils/IAuthorizable.sol'; + +interface IDelayedOracleFactory is IAuthorizable { + // --- Events --- + + /** + * @notice Emitted when a new DelayedOracle contract is deployed + * @param _delayedOracle Address of the deployed DelayedOracle contract + * @param _priceSource Address of the price source for the DelayedOracle contract + * @param _updateDelay Delay in seconds to be applied between the price source and the delayed oracle feeds + */ + event NewDelayedOracle(address indexed _delayedOracle, address _priceSource, uint256 _updateDelay); + + // --- Methods --- + + /** + * @notice Deploys a new DelayedOracle contract + * @param _priceSource Address of the price source for the DelayedOracle contract + * @param _updateDelay Delay in seconds to be applied between the price source and the delayed oracle feeds + * @return _delayedOracle Address of the deployed DelayedOracle contract + */ + function deployDelayedOracle( + IBaseOracle _priceSource, + uint256 _updateDelay + ) external returns (IDelayedOracle _delayedOracle); + + // --- Views --- + + /** + * @notice Getter for the list of DelayedOracle contracts + * @return _delayedOraclesList List of DelayedOracle contracts + */ + function delayedOraclesList() external view returns (address[] memory _delayedOraclesList); +} diff --git a/src/interfaces/oracles/IDelayedOracle.sol b/src/interfaces/oracles/IDelayedOracle.sol new file mode 100644 index 0000000..9da91be --- /dev/null +++ b/src/interfaces/oracles/IDelayedOracle.sol @@ -0,0 +1,56 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.7.6; + +import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; + +interface IDelayedOracle is IBaseOracle { + // --- Events --- + + /** + * @notice Emitted when the oracle is updated + * @param _newMedian The new median value + * @param _lastUpdateTime The timestamp of the update + */ + event UpdateResult(uint256 _newMedian, uint256 _lastUpdateTime); + + // --- Structs --- + + struct Feed { + // The value of the price feed + uint256 /* WAD */ value; + // Whether the value is valid or not + bool /* bool */ isValid; + } + + /** + * @notice Address of the non-delayed price source + * @dev Assumes that the price source is a valid IBaseOracle + */ + function priceSource() external view returns (IBaseOracle _priceSource); + + /** + * @notice The next valid price feed, taking effect at the next updateResult call + * @return _result The value in 18 decimals format of the next price feed + * @return _validity Whether the next price feed is valid or not + */ + function getNextResultWithValidity() external view returns (uint256 _result, bool _validity); + + /// @notice The delay in seconds that should elapse between updates + function updateDelay() external view returns (uint256 _updateDelay); + + /// @notice The timestamp of the last update + function lastUpdateTime() external view returns (uint256 _lastUpdateTime); + + /** + * @notice Indicates if a delay has passed since the last update + * @return _ok Whether the oracle should be updated or not + */ + function shouldUpdate() external view returns (bool _ok); + + /** + * @notice Updates the current price with the last next price, and reads the next price feed + * @dev Will revert if the delay since last update has not elapsed + * @return _success Whether the update was successful or not + */ + function updateResult() external returns (bool _success); +} From 9d375665d89d217f7311ee24b2b88be87baaab6e Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Thu, 11 Jul 2024 11:46:41 -0700 Subject: [PATCH 02/12] add MAINNET_DELAYED_ETH_USD_ORACLE --- script/Registry.s.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/script/Registry.s.sol b/script/Registry.s.sol index 6f9d37c..043cc23 100644 --- a/script/Registry.s.sol +++ b/script/Registry.s.sol @@ -84,6 +84,7 @@ address constant MAINNET_DENOMINATED_WSTETH_USD_ORACLE = 0x8746664d1E0F0e61275EF address constant MAINNET_DELAYED_RETH_USD_ORACLE = 0x0859c0B3EF150fAb129E43B74a63da13F5d2Dd35; address constant MAINNET_DELAYED_WSTETH_USD_ORACLE = 0xa8dEa011Ed90C53BA4601868Ccc9a36A6F442499; address constant MAINNET_DELAYED_ARB_USD_ORACLE = 0xa4e0410E7eb9a02aa9C0505F629d01890c816A77; +address constant MAINNET_DELAYED_ETH_USD_ORACLE = 0x562CCE2F4dc383862dC6A926AF10DeFf5fCd172F; ////////// CHAINLINK ////////// // Price feeds to USD From 76fae454ea9b7c138a9ab2b1c8f46fcebbb882a6 Mon Sep 17 00:00:00 2001 From: MrDeadCe11 <84342118+MrDeadCe11@users.noreply.github.com> Date: Tue, 16 Jul 2024 14:06:15 -0500 Subject: [PATCH 03/12] Adding relayers for pendle oracles (#65) * added Interfaces for pendle * added pendle pt to sy relayer * added pendle yt and lp relayers * removed extra interface * added relayer factory and children * added relayer factory deploy script for sepolia * added tests for relatyer child deployment * updated symbol * removed irrelevant tokens from relayer * removed authorization call from factory deployer script * using cast wallet --- foundry.toml | 3 +- script/Registry.s.sol | 8 + script/dexrelayer/DeployPendleFactory.s.sol | 29 ++++ script/predeployment/DeployRelayers.s.sol | 2 +- .../pendle/PendleLpToSyRelayerChild.sol | 20 +++ .../pendle/PendlePtToSyRelayerChild.sol | 20 +++ .../factories/pendle/PendleRelayerFactory.sol | 59 ++++++++ .../pendle/PendleYtToSyRelayerChild.sol | 20 +++ .../oracles/pendle/PendleLpToSyRelayer.sol | 48 ++++++ .../oracles/pendle/PendlePtToSyRelayer.sol | 51 +++++++ .../oracles/pendle/PendleYtToSyRelayer.sol | 49 ++++++ .../factories/IPendleRelayerFactory.sol | 33 ++++ src/interfaces/oracles/IBaseOracle.sol | 2 +- src/interfaces/oracles/pendle/IPMarket.sol | 11 ++ src/interfaces/oracles/pendle/IPOracle.sol | 41 +++++ .../oracles/pendle/IPPrincipalToken.sol | 22 +++ .../oracles/pendle/IPYieldToken.sol | 71 +++++++++ .../oracles/pendle/IPendleRelayer.sol | 18 +++ .../oracles/pendle/IStandardizedYield.sol | 143 ++++++++++++++++++ src/interfaces/utils/IERC20Metadata.sol | 24 +++ test/unit/RelayerFactories.t.sol | 73 +++++++++ 21 files changed, 744 insertions(+), 3 deletions(-) create mode 100644 script/dexrelayer/DeployPendleFactory.s.sol create mode 100644 src/contracts/factories/pendle/PendleLpToSyRelayerChild.sol create mode 100644 src/contracts/factories/pendle/PendlePtToSyRelayerChild.sol create mode 100644 src/contracts/factories/pendle/PendleRelayerFactory.sol create mode 100644 src/contracts/factories/pendle/PendleYtToSyRelayerChild.sol create mode 100644 src/contracts/oracles/pendle/PendleLpToSyRelayer.sol create mode 100644 src/contracts/oracles/pendle/PendlePtToSyRelayer.sol create mode 100644 src/contracts/oracles/pendle/PendleYtToSyRelayer.sol create mode 100644 src/interfaces/factories/IPendleRelayerFactory.sol create mode 100644 src/interfaces/oracles/pendle/IPMarket.sol create mode 100644 src/interfaces/oracles/pendle/IPOracle.sol create mode 100644 src/interfaces/oracles/pendle/IPPrincipalToken.sol create mode 100644 src/interfaces/oracles/pendle/IPYieldToken.sol create mode 100644 src/interfaces/oracles/pendle/IPendleRelayer.sol create mode 100644 src/interfaces/oracles/pendle/IStandardizedYield.sol create mode 100644 src/interfaces/utils/IERC20Metadata.sol diff --git a/foundry.toml b/foundry.toml index b1afa9b..b4293ed 100644 --- a/foundry.toml +++ b/foundry.toml @@ -9,6 +9,7 @@ number_underscore = 'thousands' wrap_comments = false [profile.default] +evm_version = "cancun" auto_detect_solc = true src = "src" out = "out" @@ -16,4 +17,4 @@ libs = ["lib"] [rpc_endpoints] mainnet = "${ARB_MAINNET_RPC}" -sepolia = "${ARB_SEPOLIA_RPC}" \ No newline at end of file +sepolia = "${ARB_SEPOLIA_RPC}" diff --git a/script/Registry.s.sol b/script/Registry.s.sol index 043cc23..b2ec235 100644 --- a/script/Registry.s.sol +++ b/script/Registry.s.sol @@ -109,3 +109,11 @@ address constant MAINNET_WETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; address constant ETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; address constant ARB = 0x912CE59144191C1204E64559FE8253a0e49E6548; address constant ETH_ARB_POOL = 0xe51635ae8136aBAc44906A8f230C2D235E9c195F; + +address constant MAINNET_DEPLOYER = 0xF78dA2A37049627636546E0cFAaB2aD664950917; + +//Pendle +address constant MAINNET_PENDLE_ORACLE = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; +address constant MAINNET_PENDLE_RETH_MARKET = 0x14FbC760eFaF36781cB0eb3Cb255aD976117B9Bd; +address constant MAINNET_PENDLE_STETH_MARKET = 0x08a152834de126d2ef83D612ff36e4523FD0017F; + diff --git a/script/dexrelayer/DeployPendleFactory.s.sol b/script/dexrelayer/DeployPendleFactory.s.sol new file mode 100644 index 0000000..15fe3a4 --- /dev/null +++ b/script/dexrelayer/DeployPendleFactory.s.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.7.6; + +import '@script/Registry.s.sol'; +import {Script} from 'forge-std/Script.sol'; +import {PendleRelayerFactory} from '@contracts/factories/pendle/PendleRelayerFactory.sol'; +import {IAuthorizable} from '@interfaces/utils/IAuthorizable.sol'; +import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; + +// BROADCAST +// source .env && forge script DeployPendleFactory --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY --account defaultKey --sender $DEFAULT_KEY_PUBLIC_ADDRESS + +// SIMULATE +// source .env && forge script DeployPendleFactory --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_SEPOLIA_RPC --account defaultKey --sender $DEFAULT_KEY_PUBLIC_ADDRESS + +contract DeployPendleFactory is Script { + IBaseOracle public pendleLpToSyRelayer; + IBaseOracle public pendleYtToSyRelayer; + IBaseOracle public pendlePtToSyRelayer; + + PendleRelayerFactory public pendleRelayerFactory; + + function run() public { + uint256 pk = vm.envUint(); + vm.startBroadcast(pk); + pendleRelayerFactory = new PendleRelayerFactory(); + vm.stopBroadcast(); + } +} diff --git a/script/predeployment/DeployRelayers.s.sol b/script/predeployment/DeployRelayers.s.sol index bea87ef..b38b190 100644 --- a/script/predeployment/DeployRelayers.s.sol +++ b/script/predeployment/DeployRelayers.s.sol @@ -85,7 +85,7 @@ contract DeployRethEthChainlinkRelayerMainnet is CommonMainnet { } // BROADCAST -// source .env && forge script DeployWstethEthChainlinkRelayerMainnet --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY +// source .env && forge script DeployWstethEthChainlinkRelayerMainnet --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY --account defaultKey --sender $DEFAULT_KEY_PUBLIC_ADDRESS // SIMULATE // source .env && forge script DeployWstethEthChainlinkRelayerMainnet --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC diff --git a/src/contracts/factories/pendle/PendleLpToSyRelayerChild.sol b/src/contracts/factories/pendle/PendleLpToSyRelayerChild.sol new file mode 100644 index 0000000..795e2df --- /dev/null +++ b/src/contracts/factories/pendle/PendleLpToSyRelayerChild.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.7.6; + +import {PendleLpToSyRelayer} from '@contracts/oracles/pendle/PendleLpToSyRelayer.sol'; +import {FactoryChild} from '@contracts/factories/FactoryChild.sol'; + +contract PendleLpToSyRelayerChild is PendleLpToSyRelayer, FactoryChild { + // --- Init --- + + /** + * @param _market The address pendle market + * @param _oracle The address of the pendle oracle + * @param _twapDuration the amount in seconds of the desired twap observations (recommended 900s) + */ + constructor( + address _market, + address _oracle, + uint32 _twapDuration + ) PendleLpToSyRelayer(_market, _oracle, _twapDuration) {} +} diff --git a/src/contracts/factories/pendle/PendlePtToSyRelayerChild.sol b/src/contracts/factories/pendle/PendlePtToSyRelayerChild.sol new file mode 100644 index 0000000..8ea1274 --- /dev/null +++ b/src/contracts/factories/pendle/PendlePtToSyRelayerChild.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.7.6; + +import {PendlePtToSyRelayer} from '@contracts/oracles/pendle/PendlePtToSyRelayer.sol'; +import {FactoryChild} from '@contracts/factories/FactoryChild.sol'; + +contract PendlePtToSyRelayerChild is PendlePtToSyRelayer, FactoryChild { + // --- Init --- + + /** + * @param _market The address pendle market + * @param _oracle The address of the pendle oracle + * @param _twapDuration the amount in seconds of the desired twap observations (recommended 900s) + */ + constructor( + address _market, + address _oracle, + uint32 _twapDuration + ) PendlePtToSyRelayer(_market, _oracle, _twapDuration) {} +} diff --git a/src/contracts/factories/pendle/PendleRelayerFactory.sol b/src/contracts/factories/pendle/PendleRelayerFactory.sol new file mode 100644 index 0000000..06104e3 --- /dev/null +++ b/src/contracts/factories/pendle/PendleRelayerFactory.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.7.6; + +import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; +import {PendlePtToSyRelayerChild} from '@contracts/factories/pendle/PendlePtToSyRelayerChild.sol'; +import {PendleYtToSyRelayerChild} from '@contracts/factories/pendle/PendleYtToSyRelayerChild.sol'; +import {PendleLpToSyRelayerChild} from '@contracts/factories/pendle/PendleLpToSyRelayerChild.sol'; +import {Authorizable} from '@contracts/utils/Authorizable.sol'; +import 'forge-std/console2.sol'; + +contract PendleRelayerFactory is Authorizable { + uint256 public relayerId; + + // --- Events --- + event NewPendlePtRelayer(address indexed _market, address _oracle, uint32 _twapDuration); + event NewPendleYtRelayer(address indexed _market, address _oracle, uint32 _twapDuration); + event NewPendleLpRelayer(address indexed _market, address _oracle, uint32 _twapDuration); + + // --- Data --- + mapping(uint256 => address) public relayerById; + + // --- Init --- + constructor() Authorizable(msg.sender) {} + + // --- Methods --- + + function deployPendlePtRelayer( + address _market, + address _oracle, + uint32 _twapDuration + ) external isAuthorized returns (IBaseOracle _pendlePtRelayerChild) { + _pendlePtRelayerChild = IBaseOracle(address(new PendlePtToSyRelayerChild(_market, _oracle, _twapDuration))); + relayerId++; + relayerById[relayerId] = address(_pendlePtRelayerChild); + emit NewPendlePtRelayer(address(_market), _oracle, _twapDuration); + } + + function deployPendleYtRelayer( + address _market, + address _oracle, + uint32 _twapDuration + ) external isAuthorized returns (IBaseOracle _pendleYtRelayerChild) { + _pendleYtRelayerChild = IBaseOracle(address(new PendleYtToSyRelayerChild(_market, _oracle, _twapDuration))); + relayerId++; + relayerById[relayerId] = address(_pendleYtRelayerChild); + emit NewPendleYtRelayer(address(_market), _oracle, _twapDuration); + } + + function deployPendleLpRelayer( + address _market, + address _oracle, + uint32 _twapDuration + ) external isAuthorized returns (IBaseOracle _pendleLpRelayerChild) { + _pendleLpRelayerChild = IBaseOracle(address(new PendleLpToSyRelayerChild(_market, _oracle, _twapDuration))); + relayerId++; + relayerById[relayerId] = address(_pendleLpRelayerChild); + emit NewPendleLpRelayer(address(_market), _oracle, _twapDuration); + } +} diff --git a/src/contracts/factories/pendle/PendleYtToSyRelayerChild.sol b/src/contracts/factories/pendle/PendleYtToSyRelayerChild.sol new file mode 100644 index 0000000..6d83aa3 --- /dev/null +++ b/src/contracts/factories/pendle/PendleYtToSyRelayerChild.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.7.6; + +import {PendleYtToSyRelayer} from '@contracts/oracles/pendle/PendleYtToSyRelayer.sol'; +import {FactoryChild} from '@contracts/factories/FactoryChild.sol'; + +contract PendleYtToSyRelayerChild is PendleYtToSyRelayer, FactoryChild { + // --- Init --- + + /** + * @param _market The address pendle market + * @param _oracle The address of the pendle oracle + * @param _twapDuration the amount in seconds of the desired twap observations (recommended 900s) + */ + constructor( + address _market, + address _oracle, + uint32 _twapDuration + ) PendleYtToSyRelayer(_market, _oracle, _twapDuration) {} +} diff --git a/src/contracts/oracles/pendle/PendleLpToSyRelayer.sol b/src/contracts/oracles/pendle/PendleLpToSyRelayer.sol new file mode 100644 index 0000000..0b6fbc4 --- /dev/null +++ b/src/contracts/oracles/pendle/PendleLpToSyRelayer.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.7.6; + +import '@interfaces/oracles/pendle/IPOracle.sol'; +import '@interfaces/oracles/pendle/IPMarket.sol'; + +/** + * @title PendleRelayer + * @notice This contracts transforms a Pendle TWAP price feed into a standard IBaseOracle feed + * + */ +contract PendleLpToSyRelayer { + IStandardizedYield public SY; + + IPMarket public market; + IPOracle public oracle; + + uint32 public twapDuration; + string public symbol; + + constructor(address _market, address _oracle, uint32 _twapDuration) { + require(_market != address(0) && _oracle != address(0), 'Invalid address'); + require(_twapDuration != 0, 'Invalid TWAP duration'); + + market = IPMarket(_market); + oracle = IPOracle(_oracle); + twapDuration = _twapDuration; + + (SY,,) = market.readTokens(); + symbol = string(abi.encodePacked('LP / ', SY.symbol())); + // test if oracle is ready + (bool increaseCardinalityRequired,, bool oldestObservationSatisfied) = oracle.getOracleState(_market, _twapDuration); + // It's required to call IPMarket(market).increaseObservationsCardinalityNext(cardinalityRequired) and wait + // for at least the twapDuration, to allow data population. + // also + // It's necessary to wait for at least the twapDuration, to allow data population. + require(!increaseCardinalityRequired && oldestObservationSatisfied, 'Oracle not ready'); + } + + function getResultWithValidity() external view returns (uint256 _result, bool _validity) { + _result = oracle.getLpToSyRate(address(market), twapDuration); + _validity = true; + } + + function read() external view returns (uint256 _value) { + _value = oracle.getLpToSyRate(address(market), twapDuration); + } +} diff --git a/src/contracts/oracles/pendle/PendlePtToSyRelayer.sol b/src/contracts/oracles/pendle/PendlePtToSyRelayer.sol new file mode 100644 index 0000000..06c3c7b --- /dev/null +++ b/src/contracts/oracles/pendle/PendlePtToSyRelayer.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.7.6; + +import '@interfaces/oracles/pendle/IPOracle.sol'; +import '@interfaces/oracles/pendle/IPMarket.sol'; +import 'forge-std/console2.sol'; +/** + * @title PendleRelayer + * @notice This contracts transforms a Pendle TWAP price feed into a standard IBaseOracle feed + * + */ + +contract PendlePtToSyRelayer { + IStandardizedYield public SY; + IPPrincipalToken public PT; + + IPMarket public market; + IPOracle public oracle; + + uint32 public twapDuration; + string public symbol; + + constructor(address _market, address _oracle, uint32 _twapDuration) { + require(_market != address(0) && _oracle != address(0), 'Invalid address'); + require(_twapDuration != uint32(0), 'Invalid TWAP duration'); + + market = IPMarket(_market); + oracle = IPOracle(_oracle); + twapDuration = _twapDuration; + + (SY, PT,) = market.readTokens(); + symbol = string(abi.encodePacked(PT.symbol(), ' / ', SY.symbol())); + + // test if oracle is ready + (bool increaseCardinalityRequired,, bool oldestObservationSatisfied) = oracle.getOracleState(_market, _twapDuration); + // It's required to call IPMarket(market).increaseObservationsCardinalityNext(cardinalityRequired) and wait + // for at least the twapDuration, to allow data population. + // also + // It's necessary to wait for at least the twapDuration, to allow data population. + require(!increaseCardinalityRequired && oldestObservationSatisfied, 'Oracle not ready'); + } + + function getResultWithValidity() external view returns (uint256 _result, bool _validity) { + _result = oracle.getPtToSyRate(address(market), twapDuration); + _validity = true; + } + + function read() external view returns (uint256 _value) { + _value = oracle.getPtToSyRate(address(market), twapDuration); + } +} diff --git a/src/contracts/oracles/pendle/PendleYtToSyRelayer.sol b/src/contracts/oracles/pendle/PendleYtToSyRelayer.sol new file mode 100644 index 0000000..9c26448 --- /dev/null +++ b/src/contracts/oracles/pendle/PendleYtToSyRelayer.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.7.6; + +import '@interfaces/oracles/pendle/IPOracle.sol'; +import '@interfaces/oracles/pendle/IPMarket.sol'; + +/** + * @title PendleRelayer + * @notice This contracts transforms a Pendle TWAP price feed into a standard IBaseOracle feed + * + */ +contract PendleYtToSyRelayer { + IStandardizedYield public SY; + IPYieldToken public YT; + + IPMarket public market; + IPOracle public oracle; + + uint32 public twapDuration; + string public symbol; + + constructor(address _market, address _oracle, uint32 _twapDuration) { + require(_market != address(0) && _oracle != address(0), 'Invalid address'); + require(_twapDuration != 0, 'Invalid TWAP duration'); + + market = IPMarket(_market); + oracle = IPOracle(_oracle); + twapDuration = _twapDuration; + + (SY,, YT) = market.readTokens(); + symbol = string(abi.encodePacked(YT.symbol(), ' / ', SY.symbol())); + // test if oracle is ready + (bool increaseCardinalityRequired,, bool oldestObservationSatisfied) = oracle.getOracleState(_market, _twapDuration); + // It's required to call IPMarket(market).increaseObservationsCardinalityNext(cardinalityRequired) and wait + // for at least the twapDuration, to allow data population. + // also + // It's necessary to wait for at least the twapDuration, to allow data population. + require(!increaseCardinalityRequired && oldestObservationSatisfied, 'Oracle not ready'); + } + + function getResultWithValidity() external view returns (uint256 _result, bool _validity) { + _result = oracle.getYtToSyRate(address(market), twapDuration); + _validity = true; + } + + function read() external view returns (uint256 _value) { + _value = oracle.getYtToSyRate(address(market), twapDuration); + } +} diff --git a/src/interfaces/factories/IPendleRelayerFactory.sol b/src/interfaces/factories/IPendleRelayerFactory.sol new file mode 100644 index 0000000..44ec165 --- /dev/null +++ b/src/interfaces/factories/IPendleRelayerFactory.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.7.6; + +import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; +import {IAuthorizable} from '@interfaces/utils/IAuthorizable.sol'; + +interface IPendleRelayerFactory is IAuthorizable { + // --- Events --- + event NewPendlePtRelayer(address indexed _market, address _oracle, uint32 _twapDuration); + event NewPendleYtRelayer(address indexed _market, address _oracle, uint32 _twapDuration); + event NewPendleLpRelayer(address indexed _market, address _oracle, uint32 _twapDuration); + + // --- Methods --- + function relayerId() external view returns (uint256); + + function deployPendlePtRelayer( + address _market, + address _oracle, + uint32 _twapDuration + ) external returns (IBaseOracle _pendlePtRelayerChild); + + function deployPendleYtRelayer( + address _market, + address _oracle, + uint32 _twapDuration + ) external returns (IBaseOracle _pendleYtRelayerChild); + + function deployPendleLpRelayer( + address _market, + address _oracle, + uint32 _twapDuration + ) external returns (IBaseOracle _pendleLpRelayerChild); +} diff --git a/src/interfaces/oracles/IBaseOracle.sol b/src/interfaces/oracles/IBaseOracle.sol index c5062e0..400ee3e 100644 --- a/src/interfaces/oracles/IBaseOracle.sol +++ b/src/interfaces/oracles/IBaseOracle.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.7.6; +pragma solidity ^0.7.6; /** * @title IBaseOracle diff --git a/src/interfaces/oracles/pendle/IPMarket.sol b/src/interfaces/oracles/pendle/IPMarket.sol new file mode 100644 index 0000000..707b00e --- /dev/null +++ b/src/interfaces/oracles/pendle/IPMarket.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.7.6; + +import {IStandardizedYield} from '@interfaces/oracles/pendle/IStandardizedYield.sol'; +import {IPPrincipalToken} from '@interfaces/oracles/pendle/IPPrincipalToken.sol'; +import {IPYieldToken} from '@interfaces/oracles/pendle/IPYieldToken.sol'; +import {IERC20Metadata} from '@interfaces/utils/IERC20Metadata.sol'; + +interface IPMarket is IERC20Metadata { + function readTokens() external view returns (IStandardizedYield _SY, IPPrincipalToken _PT, IPYieldToken _YT); +} diff --git a/src/interfaces/oracles/pendle/IPOracle.sol b/src/interfaces/oracles/pendle/IPOracle.sol new file mode 100644 index 0000000..e4456fc --- /dev/null +++ b/src/interfaces/oracles/pendle/IPOracle.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.7.6; + +// a minimal interface to interact with Pendle TWAP oracles +interface IPOracle { + /*/////////////////////////////////////////////////////////////// + PT, YT, LP to SY + //////////////////////////////////////////////////////////////*/ + + function getPtToSyRate(address market, uint32 duration) external view returns (uint256); + + function getYtToSyRate(address market, uint32 duration) external view returns (uint256); + + function getLpToSyRate(address market, uint32 duration) external view returns (uint256); + + /*/////////////////////////////////////////////////////////////// + PT, YT, LP to Asset + //////////////////////////////////////////////////////////////*/ + + /// @notice make sure you have taken into account the risk of not being able to withdraw from SY to Asset + function getPtToAssetRate(address market, uint32 duration) external view returns (uint256); + + function getYtToAssetRate(address market, uint32 duration) external view returns (uint256); + + function getLpToAssetRate(address market, uint32 duration) external view returns (uint256); + + /** + * A check function for the cardinality status of the market + * @param market PendleMarket address + * @param duration twap duration + * @return increaseCardinalityRequired a boolean indicates whether the cardinality should be increased to serve the duration + * @return cardinalityRequired the amount of cardinality required for the twap duration + */ + function getOracleState( + address market, + uint32 duration + ) + external + view + returns (bool increaseCardinalityRequired, uint16 cardinalityRequired, bool oldestObservationSatisfied); +} diff --git a/src/interfaces/oracles/pendle/IPPrincipalToken.sol b/src/interfaces/oracles/pendle/IPPrincipalToken.sol new file mode 100644 index 0000000..588525b --- /dev/null +++ b/src/interfaces/oracles/pendle/IPPrincipalToken.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.7.6; + +import {IERC20Metadata} from '@interfaces/utils/IERC20Metadata.sol'; + +interface IPPrincipalToken is IERC20Metadata { + function burnByYT(address user, uint256 amount) external; + + function mintByYT(address user, uint256 amount) external; + + function initialize(address _YT) external; + + function SY() external view returns (address); + + function YT() external view returns (address); + + function factory() external view returns (address); + + function expiry() external view returns (uint256); + + function isExpired() external view returns (bool); +} diff --git a/src/interfaces/oracles/pendle/IPYieldToken.sol b/src/interfaces/oracles/pendle/IPYieldToken.sol new file mode 100644 index 0000000..47f3ddd --- /dev/null +++ b/src/interfaces/oracles/pendle/IPYieldToken.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.7.6; + +import {IERC20Metadata} from '@interfaces/utils/IERC20Metadata.sol'; + +interface IRewardManager { + function userReward(address token, address user) external view returns (uint128 index, uint128 accrued); +} + +interface IPInterestManagerYT { + event CollectInterestFee(uint256 amountInterestFee); + + function userInterest(address user) external view returns (uint128 lastPYIndex, uint128 accruedInterest); +} + +interface IPYieldToken is IERC20Metadata, IRewardManager, IPInterestManagerYT { + event NewInterestIndex(uint256 indexed newIndex); + + event Mint( + address indexed caller, + address indexed receiverPT, + address indexed receiverYT, + uint256 amountSyToMint, + uint256 amountPYOut + ); + + event Burn(address indexed caller, address indexed receiver, uint256 amountPYToRedeem, uint256 amountSyOut); + + event RedeemRewards(address indexed user, uint256[] amountRewardsOut); + + event RedeemInterest(address indexed user, uint256 interestOut); + + event CollectRewardFee(address indexed rewardToken, uint256 amountRewardFee); + + function mintPY(address receiverPT, address receiverYT) external returns (uint256 amountPYOut); + + function redeemPY(address receiver) external returns (uint256 amountSyOut); + + function redeemPYMulti( + address[] calldata receivers, + uint256[] calldata amountPYToRedeems + ) external returns (uint256[] memory amountSyOuts); + + function redeemDueInterestAndRewards( + address user, + bool redeemInterest, + bool redeemRewards + ) external returns (uint256 interestOut, uint256[] memory rewardsOut); + + function rewardIndexesCurrent() external returns (uint256[] memory); + + function pyIndexCurrent() external returns (uint256); + + function pyIndexStored() external view returns (uint256); + + function getRewardTokens() external view returns (address[] memory); + + function SY() external view returns (address); + + function PT() external view returns (address); + + function factory() external view returns (address); + + function expiry() external view returns (uint256); + + function isExpired() external view returns (bool); + + function doCacheIndexSameBlock() external view returns (bool); + + function pyIndexLastUpdatedBlock() external view returns (uint128); +} diff --git a/src/interfaces/oracles/pendle/IPendleRelayer.sol b/src/interfaces/oracles/pendle/IPendleRelayer.sol new file mode 100644 index 0000000..1968db8 --- /dev/null +++ b/src/interfaces/oracles/pendle/IPendleRelayer.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.7.6; + +import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; +import {IPMarket} from '@interfaces/oracles/pendle/IPMarket.sol'; +import {IPOracle} from '@interfaces/oracles/pendle/IPOracle.sol'; +import {IStandardizedYield} from '@interfaces/oracles/pendle/IStandardizedYield.sol'; +import {IPPrincipalToken} from '@interfaces/oracles/pendle/IPPrincipalToken.sol'; +import {IPYieldToken} from '@interfaces/oracles/pendle/IPYieldToken.sol'; + +interface IPendleRelayer is IBaseOracle { + function twapDuration() external view returns (uint32); + function market() external view returns (IPMarket); + function oracle() external view returns (IPOracle); + function SY() external view returns (IStandardizedYield); + function PT() external view returns (IPPrincipalToken); + function YT() external view returns (IPYieldToken); +} diff --git a/src/interfaces/oracles/pendle/IStandardizedYield.sol b/src/interfaces/oracles/pendle/IStandardizedYield.sol new file mode 100644 index 0000000..599c1f7 --- /dev/null +++ b/src/interfaces/oracles/pendle/IStandardizedYield.sol @@ -0,0 +1,143 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.7.6; + +import {IERC20Metadata} from '@interfaces/utils/IERC20Metadata.sol'; + +interface IStandardizedYield is IERC20Metadata { + /// @dev Emitted when any base tokens is deposited to mint shares + event Deposit( + address indexed caller, + address indexed receiver, + address indexed tokenIn, + uint256 amountDeposited, + uint256 amountSyOut + ); + + /// @dev Emitted when any shares are redeemed for base tokens + event Redeem( + address indexed caller, + address indexed receiver, + address indexed tokenOut, + uint256 amountSyToRedeem, + uint256 amountTokenOut + ); + + /// @dev check `assetInfo()` for more information + enum AssetType { + TOKEN, + LIQUIDITY + } + + /// @dev Emitted when (`user`) claims their rewards + event ClaimRewards(address indexed user, address[] rewardTokens, uint256[] rewardAmounts); + + /** + * @notice mints an amount of shares by depositing a base token. + * @param receiver shares recipient address + * @param tokenIn address of the base tokens to mint shares + * @param amountTokenToDeposit amount of base tokens to be transferred from (`msg.sender`) + * @param minSharesOut reverts if amount of shares minted is lower than this + * @return amountSharesOut amount of shares minted + * @dev Emits a {Deposit} event + * + * Requirements: + * - (`tokenIn`) must be a valid base token. + */ + function deposit( + address receiver, + address tokenIn, + uint256 amountTokenToDeposit, + uint256 minSharesOut + ) external payable returns (uint256 amountSharesOut); + + /** + * @notice redeems an amount of base tokens by burning some shares + * @param receiver recipient address + * @param amountSharesToRedeem amount of shares to be burned + * @param tokenOut address of the base token to be redeemed + * @param minTokenOut reverts if amount of base token redeemed is lower than this + * @param burnFromInternalBalance if true, burns from balance of `address(this)`, otherwise burns from `msg.sender` + * @return amountTokenOut amount of base tokens redeemed + * @dev Emits a {Redeem} event + * + * Requirements: + * - (`tokenOut`) must be a valid base token. + */ + function redeem( + address receiver, + uint256 amountSharesToRedeem, + address tokenOut, + uint256 minTokenOut, + bool burnFromInternalBalance + ) external returns (uint256 amountTokenOut); + + /** + * @notice exchangeRate * syBalance / 1e18 must return the asset balance of the account + * @notice vice-versa, if a user uses some amount of tokens equivalent to X asset, the amount of sy + * he can mint must be X * exchangeRate / 1e18 + * @dev SYUtils's assetToSy & syToAsset should be used instead of raw multiplication + * & division + */ + function exchangeRate() external view returns (uint256 res); + + /** + * @notice claims reward for (`user`) + * @param user the user receiving their rewards + * @return rewardAmounts an array of reward amounts in the same order as `getRewardTokens` + * @dev + * Emits a `ClaimRewards` event + * See {getRewardTokens} for list of reward tokens + */ + function claimRewards(address user) external returns (uint256[] memory rewardAmounts); + + /** + * @notice get the amount of unclaimed rewards for (`user`) + * @param user the user to check for + * @return rewardAmounts an array of reward amounts in the same order as `getRewardTokens` + */ + function accruedRewards(address user) external view returns (uint256[] memory rewardAmounts); + + function rewardIndexesCurrent() external returns (uint256[] memory indexes); + + function rewardIndexesStored() external view returns (uint256[] memory indexes); + + /** + * @notice returns the list of reward token addresses + */ + function getRewardTokens() external view returns (address[] memory); + + /** + * @notice returns the address of the underlying yield token + */ + function yieldToken() external view returns (address); + + /** + * @notice returns all tokens that can mint this SY + */ + function getTokensIn() external view returns (address[] memory res); + + /** + * @notice returns all tokens that can be redeemed by this SY + */ + function getTokensOut() external view returns (address[] memory res); + + function isValidTokenIn(address token) external view returns (bool); + + function isValidTokenOut(address token) external view returns (bool); + + function previewDeposit( + address tokenIn, + uint256 amountTokenToDeposit + ) external view returns (uint256 amountSharesOut); + + function previewRedeem(address tokenOut, uint256 amountSharesToRedeem) external view returns (uint256 amountTokenOut); + + /** + * @notice This function contains information to interpret what the asset is + * @return assetType the type of the asset (0 for ERC20 tokens, 1 for AMM liquidity tokens, + * 2 for bridged yield bearing tokens like wstETH, rETH on Arbi whose the underlying asset doesn't exist on the chain) + * @return assetAddress the address of the asset + * @return assetDecimals the decimals of the asset + */ + function assetInfo() external view returns (AssetType assetType, address assetAddress, uint8 assetDecimals); +} diff --git a/src/interfaces/utils/IERC20Metadata.sol b/src/interfaces/utils/IERC20Metadata.sol new file mode 100644 index 0000000..01a2793 --- /dev/null +++ b/src/interfaces/utils/IERC20Metadata.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.7.6; + +import {IERC20} from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; + +/** + * @dev Interface for the optional metadata functions from the ERC-20 standard. + */ +interface IERC20Metadata is IERC20 { + /** + * @dev Returns the name of the token. + */ + function name() external view returns (string memory); + + /** + * @dev Returns the symbol of the token. + */ + function symbol() external view returns (string memory); + + /** + * @dev Returns the decimals places of the token. + */ + function decimals() external view returns (uint8); +} diff --git a/test/unit/RelayerFactories.t.sol b/test/unit/RelayerFactories.t.sol index 0452169..7aab628 100644 --- a/test/unit/RelayerFactories.t.sol +++ b/test/unit/RelayerFactories.t.sol @@ -11,10 +11,14 @@ import {CamelotRelayerFactory} from '@contracts/factories/CamelotRelayerFactory. import {CamelotRelayerChild} from '@contracts/factories/CamelotRelayerChild.sol'; import {ChainlinkRelayerFactory} from '@contracts/factories/ChainlinkRelayerFactory.sol'; import {ChainlinkRelayerChild} from '@contracts/factories/ChainlinkRelayerChild.sol'; +import {PendleRelayerFactory} from '@contracts/factories/pendle/PendleRelayerFactory.sol'; import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; import {DenominatedOracleFactory} from '@contracts/factories/DenominatedOracleFactory.sol'; import {DenominatedOracleChild} from '@contracts/factories/DenominatedOracleChild.sol'; +import {MAINNET_PENDLE_ORACLE, MAINNET_PENDLE_RETH_MARKET} from '@script/Registry.s.sol'; import {IAuthorizable} from '@interfaces/utils/IAuthorizable.sol'; +import {IPendleRelayerFactory} from '@interfaces/factories/IPendleRelayerFactory.sol'; +import {IPendleRelayer} from '@interfaces/oracles/pendle/IPendleRelayer.sol'; abstract contract Base is DSTestPlus { address deployer = label('deployer'); @@ -381,3 +385,72 @@ contract Unit_DenominatedPriceOracleFactory_DeployDenominatedOracle is Base { ); } } + +contract Unit_PendleRelayerFactory_DeployPendleOracles is Base { + IPendleRelayerFactory public pendleFactory; + + function setUp() public virtual override { + super.setUp(); + vm.createSelectFork(vm.envString('ARB_MAINNET_RPC')); + pendleFactory = IPendleRelayerFactory(address(new PendleRelayerFactory())); + } + + function test_Deploy_PendleFactory() public { + assertEq(pendleFactory.relayerId(), 0); + assertEq(pendleFactory.authorizedAccounts()[0], address(this)); + } + + function test_Deploy_PT_Oracle() public { + IBaseOracle ptOracle = + pendleFactory.deployPendlePtRelayer(MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, uint32(900)); + assertTrue(keccak256(abi.encode(ptOracle.symbol())) != keccak256(abi.encode(''))); + assertEq(uint256(IPendleRelayer(address(ptOracle)).twapDuration()), 900); + assertEq(address(IPendleRelayer(address(ptOracle)).market()), MAINNET_PENDLE_RETH_MARKET); + assertEq(address(IPendleRelayer(address(ptOracle)).oracle()), MAINNET_PENDLE_ORACLE); + assertEq(address(IPendleRelayer(address(ptOracle)).PT()), 0x685155D3BD593508Fe32Be39729810A591ED9c87); + assertEq(address(IPendleRelayer(address(ptOracle)).YT()), 0xe822AE44EB2466B4E263b1cbC94b4833dDEf9700); + assertEq(address(IPendleRelayer(address(ptOracle)).SY()), 0xc0Cf4b266bE5B3229C49590B59E67A09c15b22f4); + } + + function test_Deploy_YT_Oracle() public { + IBaseOracle ytOracle = + pendleFactory.deployPendleYtRelayer(MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, uint32(900)); + assertTrue(keccak256(abi.encode(ytOracle.symbol())) != keccak256(abi.encode(''))); + assertEq(uint256(IPendleRelayer(address(ytOracle)).twapDuration()), 900); + assertEq(address(IPendleRelayer(address(ytOracle)).market()), MAINNET_PENDLE_RETH_MARKET); + assertEq(address(IPendleRelayer(address(ytOracle)).oracle()), MAINNET_PENDLE_ORACLE); + assertEq(address(IPendleRelayer(address(ytOracle)).PT()), 0x685155D3BD593508Fe32Be39729810A591ED9c87); + assertEq(address(IPendleRelayer(address(ytOracle)).YT()), 0xe822AE44EB2466B4E263b1cbC94b4833dDEf9700); + assertEq(address(IPendleRelayer(address(ytOracle)).SY()), 0xc0Cf4b266bE5B3229C49590B59E67A09c15b22f4); + } + + function test_Deploy_LP_Oracle() public { + IBaseOracle lpOracle = + pendleFactory.deployPendleLpRelayer(MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, uint32(900)); + assertTrue(keccak256(abi.encode(lpOracle.symbol())) != keccak256(abi.encode(''))); + assertEq(uint256(IPendleRelayer(address(lpOracle)).twapDuration()), 900); + assertEq(address(IPendleRelayer(address(lpOracle)).market()), MAINNET_PENDLE_RETH_MARKET); + assertEq(address(IPendleRelayer(address(lpOracle)).oracle()), MAINNET_PENDLE_ORACLE); + assertEq(address(IPendleRelayer(address(lpOracle)).PT()), 0x685155D3BD593508Fe32Be39729810A591ED9c87); + assertEq(address(IPendleRelayer(address(lpOracle)).YT()), 0xe822AE44EB2466B4E263b1cbC94b4833dDEf9700); + assertEq(address(IPendleRelayer(address(lpOracle)).SY()), 0xc0Cf4b266bE5B3229C49590B59E67A09c15b22f4); + } + + function test_Deploy_Oracle_Revert_Invalid_Twap() public { + vm.expectRevert('Invalid TWAP duration'); + pendleFactory.deployPendlePtRelayer(MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, uint32(0)); + vm.expectRevert('Invalid TWAP duration'); + pendleFactory.deployPendleYtRelayer(MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, uint32(0)); + vm.expectRevert('Invalid TWAP duration'); + pendleFactory.deployPendleLpRelayer(MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, uint32(0)); + } + + function test_Deploy_Oracle_Revert_Invalid_Address() public { + vm.expectRevert('Invalid address'); + pendleFactory.deployPendlePtRelayer(address(0), MAINNET_PENDLE_ORACLE, uint32(900)); + vm.expectRevert('Invalid address'); + pendleFactory.deployPendleYtRelayer(address(0), MAINNET_PENDLE_ORACLE, uint32(900)); + vm.expectRevert('Invalid address'); + pendleFactory.deployPendleLpRelayer(address(0), MAINNET_PENDLE_ORACLE, uint32(900)); + } +} From fda38b01920befb1a70c87d6c05d3ddd43036e84 Mon Sep 17 00:00:00 2001 From: MrDeadCe11 <84342118+MrDeadCe11@users.noreply.github.com> Date: Tue, 16 Jul 2024 14:09:29 -0500 Subject: [PATCH 04/12] Pendle scripts (#68) * added Interfaces for pendle * added pendle pt to sy relayer * added pendle yt and lp relayers * removed extra interface * added relayer factory and children * added relayer factory deploy script for sepolia * added tests for relatyer child deployment * updated symbol * added script to deploy reth and wsteh pendle pt oracles * variable names fix * changed scripts to use cast wallet and fixed spellings. * added delayed oracle to pendle pt oracle deployments * using commonMainnet delayed oracle factory * noved scripts to deployOracle.s.sol --- .env.example | 2 + script/Common.s.sol | 2 + script/DeployOracle.s.sol | 48 +++++++++++++++++++ script/Registry.s.sol | 5 +- script/dexrelayer/DeployPendleFactory.s.sol | 2 + script/predeployment/DeployRelayers.s.sol | 1 + .../oracles/pendle/PendleLpToSyRelayer.sol | 1 + .../oracles/pendle/PendlePtToSyRelayer.sol | 1 + .../oracles/pendle/PendleYtToSyRelayer.sol | 1 + test/unit/RelayerFactories.t.sol | 1 + 10 files changed, 62 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index 4632c43..b5d1ad3 100644 --- a/.env.example +++ b/.env.example @@ -14,3 +14,5 @@ ARB_MAINNET_RPC= ARB_MAINNET_DEPLOYER_PK=0x ARB_MAINNET_ADMIN_PK=0x + +DEFAULT_KEY_PUBLIC_ADDRESS=0x diff --git a/script/Common.s.sol b/script/Common.s.sol index e5fef49..fdb1194 100644 --- a/script/Common.s.sol +++ b/script/Common.s.sol @@ -10,6 +10,7 @@ import {IAuthorizable} from '@interfaces/utils/IAuthorizable.sol'; import {CamelotRelayerFactory} from '@contracts/factories/CamelotRelayerFactory.sol'; import {ChainlinkRelayerFactory} from '@contracts/factories/ChainlinkRelayerFactory.sol'; import {DenominatedOracleFactory} from '@contracts/factories/DenominatedOracleFactory.sol'; +import {PendleRelayerFactory} from '@contracts/factories/pendle/PendleRelayerFactory.sol'; import {IDelayedOracleFactory} from '@interfaces/factories/IDelayedOracleFactory.sol'; abstract contract CommonMainnet is Script { @@ -17,6 +18,7 @@ abstract contract CommonMainnet is Script { CamelotRelayerFactory public camelotRelayerFactory = CamelotRelayerFactory(MAINNET_CAMELOT_RELAYER_FACTORY); DenominatedOracleFactory public denominatedOracleFactory = DenominatedOracleFactory(MAINNET_DENOMINATED_ORACLE_FACTORY); + PendleRelayerFactory public pendleRelayerFactory = PendleRelayerFactory(MAINNET_PENDLE_RELAYER_FACTORY); IDelayedOracleFactory public delayedOracleFactory = IDelayedOracleFactory(MAINNET_DELAYED_ORACLE_FACTORY); } diff --git a/script/DeployOracle.s.sol b/script/DeployOracle.s.sol index 030a1df..b6a4167 100644 --- a/script/DeployOracle.s.sol +++ b/script/DeployOracle.s.sol @@ -72,3 +72,51 @@ contract DeployLinkGrtEthOracles is Script, CommonMainnet { vm.stopBroadcast(); } } + +// BROADCAST +// source .env && forge script DeployRethPtToSyPendleRelayerMainnet rtEthOracles --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY --account defaultKey --sender $DEFAULT_KEY_PUBLIC_ADDRESS +// SIMULATE +// source .env && forge script DeployRethPtToSyPendleRelayerMainnet rtEthOracles --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --account defaultKey --sender $DEFAULT_KEY_PUBLIC +contract DeployRethPtToSyPendleRelayerMainnet is CommonMainnet { + function run() public { + vm.startBroadcast(); + IBaseOracle _pendleRethPtToSyFeed = pendleRelayerFactory.deployPendlePtRelayer( + MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, MAINNET_PENDLE_TWAP_DURATION + ); + + IBaseOracle _rethToUSDOracle = denominatedOracleFactory.deployDenominatedOracle( + _pendleRethPtToSyFeed, IBaseOracle(MAINNET_DENOMINATED_RETH_USD_ORACLE), false + ); + + IBaseOracle __rethToUSDOracleDelayedOracle = + delayedOracleFactory.deployDelayedOracle(_wstethyToUSDOracle, MAINNET_ORACLE_DELAY); + + __rethToUSDOracleDelayedOracle.symbol(); + vm.stopBroadcast(); + } +} + +// BROADCAST +// source .env && forge script DeployWsethPtToSyPendleRelayerMainnet --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY --account defaultKey --sender $DEFAULT_KEY_PUBLIC_ADDRESS + +// SIMULATE +// source .env && forge script DeployWsethPtToSyPendleRelayerMainnet --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --account defaultKey --sender $DEFAULT_KEY_PUBLIC + +contract DeployWstethPtToSyPendleRelayerMainnet is CommonMainnet { + function run() public { + vm.startBroadcast(); + IBaseOracle _pendleWstethPtToSyFeed = pendleRelayerFactory.deployPendlePtRelayer( + MAINNET_PENDLE_WSTETH_MARKET, MAINNET_PENDLE_ORACLE, MAINNET_PENDLE_TWAP_DURATION + ); + + IBaseOracle _wstethToUSDOracle = denominatedOracleFactory.deployDenominatedOracle( + _pendleRethPtToSyFeed, IBaseOracle(MAINNET_DENOMINATED_WSTETH_USD_ORACLE), false + ); + + IBaseOracle _wstethToUSDDelayedOracle = + delayedOracleFactory.deployDelayedOracle(_wstethToUSDOracle, MAINNET_ORACLE_DELAY); + + _wstethToUSDDelayedOracle.symbol(); + vm.stopBroadcast(); + } +} diff --git a/script/Registry.s.sol b/script/Registry.s.sol index b2ec235..c4a48ab 100644 --- a/script/Registry.s.sol +++ b/script/Registry.s.sol @@ -109,11 +109,12 @@ address constant MAINNET_WETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; address constant ETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; address constant ARB = 0x912CE59144191C1204E64559FE8253a0e49E6548; address constant ETH_ARB_POOL = 0xe51635ae8136aBAc44906A8f230C2D235E9c195F; - address constant MAINNET_DEPLOYER = 0xF78dA2A37049627636546E0cFAaB2aD664950917; //Pendle +uint32 constant MAINNET_PENDLE_TWAP_DURATION = 900; address constant MAINNET_PENDLE_ORACLE = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; address constant MAINNET_PENDLE_RETH_MARKET = 0x14FbC760eFaF36781cB0eb3Cb255aD976117B9Bd; -address constant MAINNET_PENDLE_STETH_MARKET = 0x08a152834de126d2ef83D612ff36e4523FD0017F; +address constant MAINNET_PENDLE_WSTETH_MARKET = 0x08a152834de126d2ef83D612ff36e4523FD0017F; +address constant MAINNET_PENDLE_RELAYER_FACTORY = 0xToBeDeployed; diff --git a/script/dexrelayer/DeployPendleFactory.s.sol b/script/dexrelayer/DeployPendleFactory.s.sol index 15fe3a4..c791ce3 100644 --- a/script/dexrelayer/DeployPendleFactory.s.sol +++ b/script/dexrelayer/DeployPendleFactory.s.sol @@ -8,6 +8,7 @@ import {IAuthorizable} from '@interfaces/utils/IAuthorizable.sol'; import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; // BROADCAST + // source .env && forge script DeployPendleFactory --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY --account defaultKey --sender $DEFAULT_KEY_PUBLIC_ADDRESS // SIMULATE @@ -21,6 +22,7 @@ contract DeployPendleFactory is Script { PendleRelayerFactory public pendleRelayerFactory; function run() public { + uint256 pk = vm.envUint(); vm.startBroadcast(pk); pendleRelayerFactory = new PendleRelayerFactory(); diff --git a/script/predeployment/DeployRelayers.s.sol b/script/predeployment/DeployRelayers.s.sol index b38b190..96019f7 100644 --- a/script/predeployment/DeployRelayers.s.sol +++ b/script/predeployment/DeployRelayers.s.sol @@ -5,6 +5,7 @@ import '@script/Registry.s.sol'; import {CommonMainnet} from '@script/Common.s.sol'; import {IAlgebraFactory} from '@algebra-core/interfaces/IAlgebraFactory.sol'; import {IAlgebraPool} from '@algebra-core/interfaces/IAlgebraPool.sol'; +import {IDelayedOracleFactory} from '@interfaces/factories/IDelayedOracleFactory.sol'; import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; // BROADCAST diff --git a/src/contracts/oracles/pendle/PendleLpToSyRelayer.sol b/src/contracts/oracles/pendle/PendleLpToSyRelayer.sol index 0b6fbc4..de7e55e 100644 --- a/src/contracts/oracles/pendle/PendleLpToSyRelayer.sol +++ b/src/contracts/oracles/pendle/PendleLpToSyRelayer.sol @@ -27,6 +27,7 @@ contract PendleLpToSyRelayer { twapDuration = _twapDuration; (SY,,) = market.readTokens(); + symbol = string(abi.encodePacked('LP / ', SY.symbol())); // test if oracle is ready (bool increaseCardinalityRequired,, bool oldestObservationSatisfied) = oracle.getOracleState(_market, _twapDuration); diff --git a/src/contracts/oracles/pendle/PendlePtToSyRelayer.sol b/src/contracts/oracles/pendle/PendlePtToSyRelayer.sol index 06c3c7b..7879110 100644 --- a/src/contracts/oracles/pendle/PendlePtToSyRelayer.sol +++ b/src/contracts/oracles/pendle/PendlePtToSyRelayer.sol @@ -29,6 +29,7 @@ contract PendlePtToSyRelayer { twapDuration = _twapDuration; (SY, PT,) = market.readTokens(); + symbol = string(abi.encodePacked(PT.symbol(), ' / ', SY.symbol())); // test if oracle is ready diff --git a/src/contracts/oracles/pendle/PendleYtToSyRelayer.sol b/src/contracts/oracles/pendle/PendleYtToSyRelayer.sol index 9c26448..e291c8e 100644 --- a/src/contracts/oracles/pendle/PendleYtToSyRelayer.sol +++ b/src/contracts/oracles/pendle/PendleYtToSyRelayer.sol @@ -28,6 +28,7 @@ contract PendleYtToSyRelayer { twapDuration = _twapDuration; (SY,, YT) = market.readTokens(); + symbol = string(abi.encodePacked(YT.symbol(), ' / ', SY.symbol())); // test if oracle is ready (bool increaseCardinalityRequired,, bool oldestObservationSatisfied) = oracle.getOracleState(_market, _twapDuration); diff --git a/test/unit/RelayerFactories.t.sol b/test/unit/RelayerFactories.t.sol index 7aab628..5bd90ba 100644 --- a/test/unit/RelayerFactories.t.sol +++ b/test/unit/RelayerFactories.t.sol @@ -400,6 +400,7 @@ contract Unit_PendleRelayerFactory_DeployPendleOracles is Base { assertEq(pendleFactory.authorizedAccounts()[0], address(this)); } + function test_Deploy_PT_Oracle() public { IBaseOracle ptOracle = pendleFactory.deployPendlePtRelayer(MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, uint32(900)); From 250811c9a6b5d507ab70c3e6a19a767cdbfbc725 Mon Sep 17 00:00:00 2001 From: MrDeadCe11 <84342118+MrDeadCe11@users.noreply.github.com> Date: Tue, 16 Jul 2024 16:47:31 -0500 Subject: [PATCH 05/12] added ezEth-usd relayer deployment script (#70) * added ezEth-usd relayer deployment script * added delayed oracle and added a test for the ezEth deployment --- script/Registry.s.sol | 5 ++- script/predeployment/DeployRelayers.s.sol | 25 +++++++++++++ .../factories/IChainlinkRelayerFactory.sol | 14 +++++++ test/unit/RelayerFactories.t.sol | 37 ++++++++++++++++++- 4 files changed, 77 insertions(+), 4 deletions(-) diff --git a/script/Registry.s.sol b/script/Registry.s.sol index c4a48ab..10d9d4b 100644 --- a/script/Registry.s.sol +++ b/script/Registry.s.sol @@ -109,12 +109,13 @@ address constant MAINNET_WETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; address constant ETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; address constant ARB = 0x912CE59144191C1204E64559FE8253a0e49E6548; address constant ETH_ARB_POOL = 0xe51635ae8136aBAc44906A8f230C2D235E9c195F; -address constant MAINNET_DEPLOYER = 0xF78dA2A37049627636546E0cFAaB2aD664950917; + +//////RENZO +address constant MAINNET_CHAINLINK_EZETH_ETH_FEED = 0x11E1836bFF2ce9d6A5bec9cA79dc998210f3886d; //Pendle uint32 constant MAINNET_PENDLE_TWAP_DURATION = 900; address constant MAINNET_PENDLE_ORACLE = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; address constant MAINNET_PENDLE_RETH_MARKET = 0x14FbC760eFaF36781cB0eb3Cb255aD976117B9Bd; address constant MAINNET_PENDLE_WSTETH_MARKET = 0x08a152834de126d2ef83D612ff36e4523FD0017F; -address constant MAINNET_PENDLE_RELAYER_FACTORY = 0xToBeDeployed; diff --git a/script/predeployment/DeployRelayers.s.sol b/script/predeployment/DeployRelayers.s.sol index 96019f7..999c98b 100644 --- a/script/predeployment/DeployRelayers.s.sol +++ b/script/predeployment/DeployRelayers.s.sol @@ -107,3 +107,28 @@ contract DeployWstethEthChainlinkRelayerMainnet is CommonMainnet { vm.stopBroadcast(); } } + +// BROADCAST +// source .env && forge script DeployEzEthUSDPriceFeed rtEthOracles --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY --account defaultKey --sender $DEFAULT_KEY_PUBLIC_ADDRESS +// SIMULATE +// source .env && forge script DeployEzEthUSDPriceFeed rtEthOracles --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --sender $DEFAULT_KEY_PUBLIC +contract DeployEzEthUSDPriceFeed is CommonMainnet { + function run() public { + vm.startBroadcast(); + IBaseOracle _ezEthEthPriceFeed = chainlinkRelayerFactory.deployChainlinkRelayerWithL2Validity( + MAINNET_CHAINLINK_EZETH_ETH_FEED, + MAINNET_CHAINLINK_SEQUENCER_FEED, + MAINNET_ORACLE_DELAY, + MAINNET_CHAINLINK_L2VALIDITY_GRACE_PERIOD + ); + + IBaseOracle _ezEthUsdOracle = denominatedOracleFactory.deployDenominatedOracle( + _ezEthEthPriceFeed, IBaseOracle(MAINNET_CHAINLINK_ETH_USD_RELAYER), false + ); + + IBaseOracle _ezEthUsdDelayedOracle = delayedOracleFactory.deployDelayedOracle(_ezEthUsdOracle, MAINNET_ORACLE_DELAY); + + _ezEthUsdDelayedOracle.symbol(); // "(EZETH / ETH) * (ETH / USD)" + vm.stopBroadcast(); + } +} diff --git a/src/interfaces/factories/IChainlinkRelayerFactory.sol b/src/interfaces/factories/IChainlinkRelayerFactory.sol index 327e47c..bff5c60 100644 --- a/src/interfaces/factories/IChainlinkRelayerFactory.sol +++ b/src/interfaces/factories/IChainlinkRelayerFactory.sol @@ -6,6 +6,20 @@ import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; interface IChainlinkRelayerFactory { // --- Events --- event NewChainlinkRelayer(address indexed _chainlinkRelayer, address _aggregator, uint256 _staleThreshold); + event NewChainlinkRelayerWithL2Validity( + address indexed _chainlinkRelayer, + address _priceAggregator, + address _sequencerAggregator, + uint256 _staleThreshold, + uint256 _gracePeriod + ); function deployChainlinkRelayer(address _aggregator, uint256 _staleThreshold) external returns (IBaseOracle _relayer); + + function deployChainlinkRelayerWithL2Validity( + address _priceAggregator, + address _sequencerAggregator, + uint256 _staleThreshold, + uint256 _gracePeriod + ) external returns (IBaseOracle _chainlinkRelayer); } diff --git a/test/unit/RelayerFactories.t.sol b/test/unit/RelayerFactories.t.sol index 5bd90ba..7536e87 100644 --- a/test/unit/RelayerFactories.t.sol +++ b/test/unit/RelayerFactories.t.sol @@ -15,6 +15,8 @@ import {PendleRelayerFactory} from '@contracts/factories/pendle/PendleRelayerFac import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; import {DenominatedOracleFactory} from '@contracts/factories/DenominatedOracleFactory.sol'; import {DenominatedOracleChild} from '@contracts/factories/DenominatedOracleChild.sol'; +import {IDelayedOracleFactory} from '@interfaces/factories/IDelayedOracleFactory.sol'; +import {IAuthorizable} from '@interfaces/utils/IAuthorizable.sol'; import {MAINNET_PENDLE_ORACLE, MAINNET_PENDLE_RETH_MARKET} from '@script/Registry.s.sol'; import {IAuthorizable} from '@interfaces/utils/IAuthorizable.sol'; import {IPendleRelayerFactory} from '@interfaces/factories/IPendleRelayerFactory.sol'; @@ -39,6 +41,9 @@ abstract contract Base is DSTestPlus { DenominatedOracleFactory denominatedOracleFactory; IBaseOracle denominatedOracleChild; + IDelayedOracleFactory delayedOracleFactory; + IBaseOracle delayedOracleChild; + address mockAggregator = mockContract('ChainlinkAggregator'); function setUp() public virtual { @@ -386,13 +391,41 @@ contract Unit_DenominatedPriceOracleFactory_DeployDenominatedOracle is Base { } } -contract Unit_PendleRelayerFactory_DeployPendleOracles is Base { +contract Unit_Pendle_Renzo_Deploy_Oracle is Base { + address mainnetAuthorizedAccount = 0xF78dA2A37049627636546E0cFAaB2aD664950917; IPendleRelayerFactory public pendleFactory; function setUp() public virtual override { super.setUp(); vm.createSelectFork(vm.envString('ARB_MAINNET_RPC')); - pendleFactory = IPendleRelayerFactory(address(new PendleRelayerFactory())); + delayedOracleFactory = IDelayedOracleFactory(MAINNET_DELAYED_ORACLE_FACTORY); + chainlinkRelayerFactory = ChainlinkRelayerFactory(MAINNET_CHAINLINK_RELAYER_FACTORY); + denominatedOracleFactory = DenominatedOracleFactory(MAINNET_DENOMINATED_ORACLE_FACTORY); + pendleFactory = IPendleRelayerFactory(address(new PendleRelayerFactory())); + label(address(delayedOracleFactory), 'DelayedOracleFactory'); + label(address(chainlinkRelayerFactory), 'ChainlinkRelayerFactory'); + label(address(denominatedOracleFactory), 'DenominatedOracleFactory'); + } + + function test_DeployEzEthRelayer() public { + vm.startPrank(mainnetAuthorizedAccount); + IBaseOracle _ezEthEthPriceFeed = chainlinkRelayerFactory.deployChainlinkRelayerWithL2Validity( + MAINNET_CHAINLINK_EZETH_ETH_FEED, + MAINNET_CHAINLINK_SEQUENCER_FEED, + MAINNET_ORACLE_DELAY, + MAINNET_CHAINLINK_L2VALIDITY_GRACE_PERIOD + ); + + IBaseOracle _ezEthUsdOracle = denominatedOracleFactory.deployDenominatedOracle( + _ezEthEthPriceFeed, IBaseOracle(MAINNET_CHAINLINK_ETH_USD_RELAYER), false + ); + + IBaseOracle _ezEthUsdDelayedOracle = delayedOracleFactory.deployDelayedOracle(_ezEthUsdOracle, MAINNET_ORACLE_DELAY); + + string memory _ezEthSymbol = _ezEthUsdDelayedOracle.symbol(); // "(EZETH / ETH) * (ETH / USD)" + vm.stopPrank(); + assertEq(_ezEthSymbol, '(ezETH / ETH) * (ETH / USD)'); + } function test_Deploy_PendleFactory() public { From 55e4655db4511099c3024e1d215fe08d70a84ca8 Mon Sep 17 00:00:00 2001 From: MrDeadCe11 <84342118+MrDeadCe11@users.noreply.github.com> Date: Tue, 23 Jul 2024 14:09:34 -0500 Subject: [PATCH 06/12] Remove pendle (#77) * fixed compiler errors * removed pendle tests * finished removing pendle contracts * removed console log from chainlink relayer --- script/Common.s.sol | 2 - script/DeployOracle.s.sol | 48 ------ script/Registry.s.sol | 7 - script/dexrelayer/DeployPendleFactory.s.sol | 31 ---- .../pendle/PendleLpToSyRelayerChild.sol | 20 --- .../pendle/PendlePtToSyRelayerChild.sol | 20 --- .../factories/pendle/PendleRelayerFactory.sol | 59 -------- .../pendle/PendleYtToSyRelayerChild.sol | 20 --- .../oracles/pendle/PendleLpToSyRelayer.sol | 49 ------ .../oracles/pendle/PendlePtToSyRelayer.sol | 52 ------- .../oracles/pendle/PendleYtToSyRelayer.sol | 50 ------ .../factories/IPendleRelayerFactory.sol | 33 ---- src/interfaces/oracles/pendle/IPMarket.sol | 11 -- src/interfaces/oracles/pendle/IPOracle.sol | 41 ----- .../oracles/pendle/IPPrincipalToken.sol | 22 --- .../oracles/pendle/IPYieldToken.sol | 71 --------- .../oracles/pendle/IPendleRelayer.sol | 18 --- .../oracles/pendle/IStandardizedYield.sol | 143 ------------------ test/unit/RelayerFactories.t.sol | 69 +-------- 19 files changed, 1 insertion(+), 765 deletions(-) delete mode 100644 script/dexrelayer/DeployPendleFactory.s.sol delete mode 100644 src/contracts/factories/pendle/PendleLpToSyRelayerChild.sol delete mode 100644 src/contracts/factories/pendle/PendlePtToSyRelayerChild.sol delete mode 100644 src/contracts/factories/pendle/PendleRelayerFactory.sol delete mode 100644 src/contracts/factories/pendle/PendleYtToSyRelayerChild.sol delete mode 100644 src/contracts/oracles/pendle/PendleLpToSyRelayer.sol delete mode 100644 src/contracts/oracles/pendle/PendlePtToSyRelayer.sol delete mode 100644 src/contracts/oracles/pendle/PendleYtToSyRelayer.sol delete mode 100644 src/interfaces/factories/IPendleRelayerFactory.sol delete mode 100644 src/interfaces/oracles/pendle/IPMarket.sol delete mode 100644 src/interfaces/oracles/pendle/IPOracle.sol delete mode 100644 src/interfaces/oracles/pendle/IPPrincipalToken.sol delete mode 100644 src/interfaces/oracles/pendle/IPYieldToken.sol delete mode 100644 src/interfaces/oracles/pendle/IPendleRelayer.sol delete mode 100644 src/interfaces/oracles/pendle/IStandardizedYield.sol diff --git a/script/Common.s.sol b/script/Common.s.sol index fdb1194..e5fef49 100644 --- a/script/Common.s.sol +++ b/script/Common.s.sol @@ -10,7 +10,6 @@ import {IAuthorizable} from '@interfaces/utils/IAuthorizable.sol'; import {CamelotRelayerFactory} from '@contracts/factories/CamelotRelayerFactory.sol'; import {ChainlinkRelayerFactory} from '@contracts/factories/ChainlinkRelayerFactory.sol'; import {DenominatedOracleFactory} from '@contracts/factories/DenominatedOracleFactory.sol'; -import {PendleRelayerFactory} from '@contracts/factories/pendle/PendleRelayerFactory.sol'; import {IDelayedOracleFactory} from '@interfaces/factories/IDelayedOracleFactory.sol'; abstract contract CommonMainnet is Script { @@ -18,7 +17,6 @@ abstract contract CommonMainnet is Script { CamelotRelayerFactory public camelotRelayerFactory = CamelotRelayerFactory(MAINNET_CAMELOT_RELAYER_FACTORY); DenominatedOracleFactory public denominatedOracleFactory = DenominatedOracleFactory(MAINNET_DENOMINATED_ORACLE_FACTORY); - PendleRelayerFactory public pendleRelayerFactory = PendleRelayerFactory(MAINNET_PENDLE_RELAYER_FACTORY); IDelayedOracleFactory public delayedOracleFactory = IDelayedOracleFactory(MAINNET_DELAYED_ORACLE_FACTORY); } diff --git a/script/DeployOracle.s.sol b/script/DeployOracle.s.sol index b6a4167..030a1df 100644 --- a/script/DeployOracle.s.sol +++ b/script/DeployOracle.s.sol @@ -72,51 +72,3 @@ contract DeployLinkGrtEthOracles is Script, CommonMainnet { vm.stopBroadcast(); } } - -// BROADCAST -// source .env && forge script DeployRethPtToSyPendleRelayerMainnet rtEthOracles --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY --account defaultKey --sender $DEFAULT_KEY_PUBLIC_ADDRESS -// SIMULATE -// source .env && forge script DeployRethPtToSyPendleRelayerMainnet rtEthOracles --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --account defaultKey --sender $DEFAULT_KEY_PUBLIC -contract DeployRethPtToSyPendleRelayerMainnet is CommonMainnet { - function run() public { - vm.startBroadcast(); - IBaseOracle _pendleRethPtToSyFeed = pendleRelayerFactory.deployPendlePtRelayer( - MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, MAINNET_PENDLE_TWAP_DURATION - ); - - IBaseOracle _rethToUSDOracle = denominatedOracleFactory.deployDenominatedOracle( - _pendleRethPtToSyFeed, IBaseOracle(MAINNET_DENOMINATED_RETH_USD_ORACLE), false - ); - - IBaseOracle __rethToUSDOracleDelayedOracle = - delayedOracleFactory.deployDelayedOracle(_wstethyToUSDOracle, MAINNET_ORACLE_DELAY); - - __rethToUSDOracleDelayedOracle.symbol(); - vm.stopBroadcast(); - } -} - -// BROADCAST -// source .env && forge script DeployWsethPtToSyPendleRelayerMainnet --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY --account defaultKey --sender $DEFAULT_KEY_PUBLIC_ADDRESS - -// SIMULATE -// source .env && forge script DeployWsethPtToSyPendleRelayerMainnet --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --account defaultKey --sender $DEFAULT_KEY_PUBLIC - -contract DeployWstethPtToSyPendleRelayerMainnet is CommonMainnet { - function run() public { - vm.startBroadcast(); - IBaseOracle _pendleWstethPtToSyFeed = pendleRelayerFactory.deployPendlePtRelayer( - MAINNET_PENDLE_WSTETH_MARKET, MAINNET_PENDLE_ORACLE, MAINNET_PENDLE_TWAP_DURATION - ); - - IBaseOracle _wstethToUSDOracle = denominatedOracleFactory.deployDenominatedOracle( - _pendleRethPtToSyFeed, IBaseOracle(MAINNET_DENOMINATED_WSTETH_USD_ORACLE), false - ); - - IBaseOracle _wstethToUSDDelayedOracle = - delayedOracleFactory.deployDelayedOracle(_wstethToUSDOracle, MAINNET_ORACLE_DELAY); - - _wstethToUSDDelayedOracle.symbol(); - vm.stopBroadcast(); - } -} diff --git a/script/Registry.s.sol b/script/Registry.s.sol index 10d9d4b..73641cc 100644 --- a/script/Registry.s.sol +++ b/script/Registry.s.sol @@ -112,10 +112,3 @@ address constant ETH_ARB_POOL = 0xe51635ae8136aBAc44906A8f230C2D235E9c195F; //////RENZO address constant MAINNET_CHAINLINK_EZETH_ETH_FEED = 0x11E1836bFF2ce9d6A5bec9cA79dc998210f3886d; - -//Pendle -uint32 constant MAINNET_PENDLE_TWAP_DURATION = 900; -address constant MAINNET_PENDLE_ORACLE = 0x9a9Fa8338dd5E5B2188006f1Cd2Ef26d921650C2; -address constant MAINNET_PENDLE_RETH_MARKET = 0x14FbC760eFaF36781cB0eb3Cb255aD976117B9Bd; -address constant MAINNET_PENDLE_WSTETH_MARKET = 0x08a152834de126d2ef83D612ff36e4523FD0017F; - diff --git a/script/dexrelayer/DeployPendleFactory.s.sol b/script/dexrelayer/DeployPendleFactory.s.sol deleted file mode 100644 index c791ce3..0000000 --- a/script/dexrelayer/DeployPendleFactory.s.sol +++ /dev/null @@ -1,31 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.7.6; - -import '@script/Registry.s.sol'; -import {Script} from 'forge-std/Script.sol'; -import {PendleRelayerFactory} from '@contracts/factories/pendle/PendleRelayerFactory.sol'; -import {IAuthorizable} from '@interfaces/utils/IAuthorizable.sol'; -import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; - -// BROADCAST - -// source .env && forge script DeployPendleFactory --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY --account defaultKey --sender $DEFAULT_KEY_PUBLIC_ADDRESS - -// SIMULATE -// source .env && forge script DeployPendleFactory --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_SEPOLIA_RPC --account defaultKey --sender $DEFAULT_KEY_PUBLIC_ADDRESS - -contract DeployPendleFactory is Script { - IBaseOracle public pendleLpToSyRelayer; - IBaseOracle public pendleYtToSyRelayer; - IBaseOracle public pendlePtToSyRelayer; - - PendleRelayerFactory public pendleRelayerFactory; - - function run() public { - - uint256 pk = vm.envUint(); - vm.startBroadcast(pk); - pendleRelayerFactory = new PendleRelayerFactory(); - vm.stopBroadcast(); - } -} diff --git a/src/contracts/factories/pendle/PendleLpToSyRelayerChild.sol b/src/contracts/factories/pendle/PendleLpToSyRelayerChild.sol deleted file mode 100644 index 795e2df..0000000 --- a/src/contracts/factories/pendle/PendleLpToSyRelayerChild.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.7.6; - -import {PendleLpToSyRelayer} from '@contracts/oracles/pendle/PendleLpToSyRelayer.sol'; -import {FactoryChild} from '@contracts/factories/FactoryChild.sol'; - -contract PendleLpToSyRelayerChild is PendleLpToSyRelayer, FactoryChild { - // --- Init --- - - /** - * @param _market The address pendle market - * @param _oracle The address of the pendle oracle - * @param _twapDuration the amount in seconds of the desired twap observations (recommended 900s) - */ - constructor( - address _market, - address _oracle, - uint32 _twapDuration - ) PendleLpToSyRelayer(_market, _oracle, _twapDuration) {} -} diff --git a/src/contracts/factories/pendle/PendlePtToSyRelayerChild.sol b/src/contracts/factories/pendle/PendlePtToSyRelayerChild.sol deleted file mode 100644 index 8ea1274..0000000 --- a/src/contracts/factories/pendle/PendlePtToSyRelayerChild.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.7.6; - -import {PendlePtToSyRelayer} from '@contracts/oracles/pendle/PendlePtToSyRelayer.sol'; -import {FactoryChild} from '@contracts/factories/FactoryChild.sol'; - -contract PendlePtToSyRelayerChild is PendlePtToSyRelayer, FactoryChild { - // --- Init --- - - /** - * @param _market The address pendle market - * @param _oracle The address of the pendle oracle - * @param _twapDuration the amount in seconds of the desired twap observations (recommended 900s) - */ - constructor( - address _market, - address _oracle, - uint32 _twapDuration - ) PendlePtToSyRelayer(_market, _oracle, _twapDuration) {} -} diff --git a/src/contracts/factories/pendle/PendleRelayerFactory.sol b/src/contracts/factories/pendle/PendleRelayerFactory.sol deleted file mode 100644 index 06104e3..0000000 --- a/src/contracts/factories/pendle/PendleRelayerFactory.sol +++ /dev/null @@ -1,59 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.7.6; - -import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; -import {PendlePtToSyRelayerChild} from '@contracts/factories/pendle/PendlePtToSyRelayerChild.sol'; -import {PendleYtToSyRelayerChild} from '@contracts/factories/pendle/PendleYtToSyRelayerChild.sol'; -import {PendleLpToSyRelayerChild} from '@contracts/factories/pendle/PendleLpToSyRelayerChild.sol'; -import {Authorizable} from '@contracts/utils/Authorizable.sol'; -import 'forge-std/console2.sol'; - -contract PendleRelayerFactory is Authorizable { - uint256 public relayerId; - - // --- Events --- - event NewPendlePtRelayer(address indexed _market, address _oracle, uint32 _twapDuration); - event NewPendleYtRelayer(address indexed _market, address _oracle, uint32 _twapDuration); - event NewPendleLpRelayer(address indexed _market, address _oracle, uint32 _twapDuration); - - // --- Data --- - mapping(uint256 => address) public relayerById; - - // --- Init --- - constructor() Authorizable(msg.sender) {} - - // --- Methods --- - - function deployPendlePtRelayer( - address _market, - address _oracle, - uint32 _twapDuration - ) external isAuthorized returns (IBaseOracle _pendlePtRelayerChild) { - _pendlePtRelayerChild = IBaseOracle(address(new PendlePtToSyRelayerChild(_market, _oracle, _twapDuration))); - relayerId++; - relayerById[relayerId] = address(_pendlePtRelayerChild); - emit NewPendlePtRelayer(address(_market), _oracle, _twapDuration); - } - - function deployPendleYtRelayer( - address _market, - address _oracle, - uint32 _twapDuration - ) external isAuthorized returns (IBaseOracle _pendleYtRelayerChild) { - _pendleYtRelayerChild = IBaseOracle(address(new PendleYtToSyRelayerChild(_market, _oracle, _twapDuration))); - relayerId++; - relayerById[relayerId] = address(_pendleYtRelayerChild); - emit NewPendleYtRelayer(address(_market), _oracle, _twapDuration); - } - - function deployPendleLpRelayer( - address _market, - address _oracle, - uint32 _twapDuration - ) external isAuthorized returns (IBaseOracle _pendleLpRelayerChild) { - _pendleLpRelayerChild = IBaseOracle(address(new PendleLpToSyRelayerChild(_market, _oracle, _twapDuration))); - relayerId++; - relayerById[relayerId] = address(_pendleLpRelayerChild); - emit NewPendleLpRelayer(address(_market), _oracle, _twapDuration); - } -} diff --git a/src/contracts/factories/pendle/PendleYtToSyRelayerChild.sol b/src/contracts/factories/pendle/PendleYtToSyRelayerChild.sol deleted file mode 100644 index 6d83aa3..0000000 --- a/src/contracts/factories/pendle/PendleYtToSyRelayerChild.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.7.6; - -import {PendleYtToSyRelayer} from '@contracts/oracles/pendle/PendleYtToSyRelayer.sol'; -import {FactoryChild} from '@contracts/factories/FactoryChild.sol'; - -contract PendleYtToSyRelayerChild is PendleYtToSyRelayer, FactoryChild { - // --- Init --- - - /** - * @param _market The address pendle market - * @param _oracle The address of the pendle oracle - * @param _twapDuration the amount in seconds of the desired twap observations (recommended 900s) - */ - constructor( - address _market, - address _oracle, - uint32 _twapDuration - ) PendleYtToSyRelayer(_market, _oracle, _twapDuration) {} -} diff --git a/src/contracts/oracles/pendle/PendleLpToSyRelayer.sol b/src/contracts/oracles/pendle/PendleLpToSyRelayer.sol deleted file mode 100644 index de7e55e..0000000 --- a/src/contracts/oracles/pendle/PendleLpToSyRelayer.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.7.6; - -import '@interfaces/oracles/pendle/IPOracle.sol'; -import '@interfaces/oracles/pendle/IPMarket.sol'; - -/** - * @title PendleRelayer - * @notice This contracts transforms a Pendle TWAP price feed into a standard IBaseOracle feed - * - */ -contract PendleLpToSyRelayer { - IStandardizedYield public SY; - - IPMarket public market; - IPOracle public oracle; - - uint32 public twapDuration; - string public symbol; - - constructor(address _market, address _oracle, uint32 _twapDuration) { - require(_market != address(0) && _oracle != address(0), 'Invalid address'); - require(_twapDuration != 0, 'Invalid TWAP duration'); - - market = IPMarket(_market); - oracle = IPOracle(_oracle); - twapDuration = _twapDuration; - - (SY,,) = market.readTokens(); - - symbol = string(abi.encodePacked('LP / ', SY.symbol())); - // test if oracle is ready - (bool increaseCardinalityRequired,, bool oldestObservationSatisfied) = oracle.getOracleState(_market, _twapDuration); - // It's required to call IPMarket(market).increaseObservationsCardinalityNext(cardinalityRequired) and wait - // for at least the twapDuration, to allow data population. - // also - // It's necessary to wait for at least the twapDuration, to allow data population. - require(!increaseCardinalityRequired && oldestObservationSatisfied, 'Oracle not ready'); - } - - function getResultWithValidity() external view returns (uint256 _result, bool _validity) { - _result = oracle.getLpToSyRate(address(market), twapDuration); - _validity = true; - } - - function read() external view returns (uint256 _value) { - _value = oracle.getLpToSyRate(address(market), twapDuration); - } -} diff --git a/src/contracts/oracles/pendle/PendlePtToSyRelayer.sol b/src/contracts/oracles/pendle/PendlePtToSyRelayer.sol deleted file mode 100644 index 7879110..0000000 --- a/src/contracts/oracles/pendle/PendlePtToSyRelayer.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.7.6; - -import '@interfaces/oracles/pendle/IPOracle.sol'; -import '@interfaces/oracles/pendle/IPMarket.sol'; -import 'forge-std/console2.sol'; -/** - * @title PendleRelayer - * @notice This contracts transforms a Pendle TWAP price feed into a standard IBaseOracle feed - * - */ - -contract PendlePtToSyRelayer { - IStandardizedYield public SY; - IPPrincipalToken public PT; - - IPMarket public market; - IPOracle public oracle; - - uint32 public twapDuration; - string public symbol; - - constructor(address _market, address _oracle, uint32 _twapDuration) { - require(_market != address(0) && _oracle != address(0), 'Invalid address'); - require(_twapDuration != uint32(0), 'Invalid TWAP duration'); - - market = IPMarket(_market); - oracle = IPOracle(_oracle); - twapDuration = _twapDuration; - - (SY, PT,) = market.readTokens(); - - symbol = string(abi.encodePacked(PT.symbol(), ' / ', SY.symbol())); - - // test if oracle is ready - (bool increaseCardinalityRequired,, bool oldestObservationSatisfied) = oracle.getOracleState(_market, _twapDuration); - // It's required to call IPMarket(market).increaseObservationsCardinalityNext(cardinalityRequired) and wait - // for at least the twapDuration, to allow data population. - // also - // It's necessary to wait for at least the twapDuration, to allow data population. - require(!increaseCardinalityRequired && oldestObservationSatisfied, 'Oracle not ready'); - } - - function getResultWithValidity() external view returns (uint256 _result, bool _validity) { - _result = oracle.getPtToSyRate(address(market), twapDuration); - _validity = true; - } - - function read() external view returns (uint256 _value) { - _value = oracle.getPtToSyRate(address(market), twapDuration); - } -} diff --git a/src/contracts/oracles/pendle/PendleYtToSyRelayer.sol b/src/contracts/oracles/pendle/PendleYtToSyRelayer.sol deleted file mode 100644 index e291c8e..0000000 --- a/src/contracts/oracles/pendle/PendleYtToSyRelayer.sol +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity 0.7.6; - -import '@interfaces/oracles/pendle/IPOracle.sol'; -import '@interfaces/oracles/pendle/IPMarket.sol'; - -/** - * @title PendleRelayer - * @notice This contracts transforms a Pendle TWAP price feed into a standard IBaseOracle feed - * - */ -contract PendleYtToSyRelayer { - IStandardizedYield public SY; - IPYieldToken public YT; - - IPMarket public market; - IPOracle public oracle; - - uint32 public twapDuration; - string public symbol; - - constructor(address _market, address _oracle, uint32 _twapDuration) { - require(_market != address(0) && _oracle != address(0), 'Invalid address'); - require(_twapDuration != 0, 'Invalid TWAP duration'); - - market = IPMarket(_market); - oracle = IPOracle(_oracle); - twapDuration = _twapDuration; - - (SY,, YT) = market.readTokens(); - - symbol = string(abi.encodePacked(YT.symbol(), ' / ', SY.symbol())); - // test if oracle is ready - (bool increaseCardinalityRequired,, bool oldestObservationSatisfied) = oracle.getOracleState(_market, _twapDuration); - // It's required to call IPMarket(market).increaseObservationsCardinalityNext(cardinalityRequired) and wait - // for at least the twapDuration, to allow data population. - // also - // It's necessary to wait for at least the twapDuration, to allow data population. - require(!increaseCardinalityRequired && oldestObservationSatisfied, 'Oracle not ready'); - } - - function getResultWithValidity() external view returns (uint256 _result, bool _validity) { - _result = oracle.getYtToSyRate(address(market), twapDuration); - _validity = true; - } - - function read() external view returns (uint256 _value) { - _value = oracle.getYtToSyRate(address(market), twapDuration); - } -} diff --git a/src/interfaces/factories/IPendleRelayerFactory.sol b/src/interfaces/factories/IPendleRelayerFactory.sol deleted file mode 100644 index 44ec165..0000000 --- a/src/interfaces/factories/IPendleRelayerFactory.sol +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.7.6; - -import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; -import {IAuthorizable} from '@interfaces/utils/IAuthorizable.sol'; - -interface IPendleRelayerFactory is IAuthorizable { - // --- Events --- - event NewPendlePtRelayer(address indexed _market, address _oracle, uint32 _twapDuration); - event NewPendleYtRelayer(address indexed _market, address _oracle, uint32 _twapDuration); - event NewPendleLpRelayer(address indexed _market, address _oracle, uint32 _twapDuration); - - // --- Methods --- - function relayerId() external view returns (uint256); - - function deployPendlePtRelayer( - address _market, - address _oracle, - uint32 _twapDuration - ) external returns (IBaseOracle _pendlePtRelayerChild); - - function deployPendleYtRelayer( - address _market, - address _oracle, - uint32 _twapDuration - ) external returns (IBaseOracle _pendleYtRelayerChild); - - function deployPendleLpRelayer( - address _market, - address _oracle, - uint32 _twapDuration - ) external returns (IBaseOracle _pendleLpRelayerChild); -} diff --git a/src/interfaces/oracles/pendle/IPMarket.sol b/src/interfaces/oracles/pendle/IPMarket.sol deleted file mode 100644 index 707b00e..0000000 --- a/src/interfaces/oracles/pendle/IPMarket.sol +++ /dev/null @@ -1,11 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.7.6; - -import {IStandardizedYield} from '@interfaces/oracles/pendle/IStandardizedYield.sol'; -import {IPPrincipalToken} from '@interfaces/oracles/pendle/IPPrincipalToken.sol'; -import {IPYieldToken} from '@interfaces/oracles/pendle/IPYieldToken.sol'; -import {IERC20Metadata} from '@interfaces/utils/IERC20Metadata.sol'; - -interface IPMarket is IERC20Metadata { - function readTokens() external view returns (IStandardizedYield _SY, IPPrincipalToken _PT, IPYieldToken _YT); -} diff --git a/src/interfaces/oracles/pendle/IPOracle.sol b/src/interfaces/oracles/pendle/IPOracle.sol deleted file mode 100644 index e4456fc..0000000 --- a/src/interfaces/oracles/pendle/IPOracle.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.7.6; - -// a minimal interface to interact with Pendle TWAP oracles -interface IPOracle { - /*/////////////////////////////////////////////////////////////// - PT, YT, LP to SY - //////////////////////////////////////////////////////////////*/ - - function getPtToSyRate(address market, uint32 duration) external view returns (uint256); - - function getYtToSyRate(address market, uint32 duration) external view returns (uint256); - - function getLpToSyRate(address market, uint32 duration) external view returns (uint256); - - /*/////////////////////////////////////////////////////////////// - PT, YT, LP to Asset - //////////////////////////////////////////////////////////////*/ - - /// @notice make sure you have taken into account the risk of not being able to withdraw from SY to Asset - function getPtToAssetRate(address market, uint32 duration) external view returns (uint256); - - function getYtToAssetRate(address market, uint32 duration) external view returns (uint256); - - function getLpToAssetRate(address market, uint32 duration) external view returns (uint256); - - /** - * A check function for the cardinality status of the market - * @param market PendleMarket address - * @param duration twap duration - * @return increaseCardinalityRequired a boolean indicates whether the cardinality should be increased to serve the duration - * @return cardinalityRequired the amount of cardinality required for the twap duration - */ - function getOracleState( - address market, - uint32 duration - ) - external - view - returns (bool increaseCardinalityRequired, uint16 cardinalityRequired, bool oldestObservationSatisfied); -} diff --git a/src/interfaces/oracles/pendle/IPPrincipalToken.sol b/src/interfaces/oracles/pendle/IPPrincipalToken.sol deleted file mode 100644 index 588525b..0000000 --- a/src/interfaces/oracles/pendle/IPPrincipalToken.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.7.6; - -import {IERC20Metadata} from '@interfaces/utils/IERC20Metadata.sol'; - -interface IPPrincipalToken is IERC20Metadata { - function burnByYT(address user, uint256 amount) external; - - function mintByYT(address user, uint256 amount) external; - - function initialize(address _YT) external; - - function SY() external view returns (address); - - function YT() external view returns (address); - - function factory() external view returns (address); - - function expiry() external view returns (uint256); - - function isExpired() external view returns (bool); -} diff --git a/src/interfaces/oracles/pendle/IPYieldToken.sol b/src/interfaces/oracles/pendle/IPYieldToken.sol deleted file mode 100644 index 47f3ddd..0000000 --- a/src/interfaces/oracles/pendle/IPYieldToken.sol +++ /dev/null @@ -1,71 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.7.6; - -import {IERC20Metadata} from '@interfaces/utils/IERC20Metadata.sol'; - -interface IRewardManager { - function userReward(address token, address user) external view returns (uint128 index, uint128 accrued); -} - -interface IPInterestManagerYT { - event CollectInterestFee(uint256 amountInterestFee); - - function userInterest(address user) external view returns (uint128 lastPYIndex, uint128 accruedInterest); -} - -interface IPYieldToken is IERC20Metadata, IRewardManager, IPInterestManagerYT { - event NewInterestIndex(uint256 indexed newIndex); - - event Mint( - address indexed caller, - address indexed receiverPT, - address indexed receiverYT, - uint256 amountSyToMint, - uint256 amountPYOut - ); - - event Burn(address indexed caller, address indexed receiver, uint256 amountPYToRedeem, uint256 amountSyOut); - - event RedeemRewards(address indexed user, uint256[] amountRewardsOut); - - event RedeemInterest(address indexed user, uint256 interestOut); - - event CollectRewardFee(address indexed rewardToken, uint256 amountRewardFee); - - function mintPY(address receiverPT, address receiverYT) external returns (uint256 amountPYOut); - - function redeemPY(address receiver) external returns (uint256 amountSyOut); - - function redeemPYMulti( - address[] calldata receivers, - uint256[] calldata amountPYToRedeems - ) external returns (uint256[] memory amountSyOuts); - - function redeemDueInterestAndRewards( - address user, - bool redeemInterest, - bool redeemRewards - ) external returns (uint256 interestOut, uint256[] memory rewardsOut); - - function rewardIndexesCurrent() external returns (uint256[] memory); - - function pyIndexCurrent() external returns (uint256); - - function pyIndexStored() external view returns (uint256); - - function getRewardTokens() external view returns (address[] memory); - - function SY() external view returns (address); - - function PT() external view returns (address); - - function factory() external view returns (address); - - function expiry() external view returns (uint256); - - function isExpired() external view returns (bool); - - function doCacheIndexSameBlock() external view returns (bool); - - function pyIndexLastUpdatedBlock() external view returns (uint128); -} diff --git a/src/interfaces/oracles/pendle/IPendleRelayer.sol b/src/interfaces/oracles/pendle/IPendleRelayer.sol deleted file mode 100644 index 1968db8..0000000 --- a/src/interfaces/oracles/pendle/IPendleRelayer.sol +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.7.6; - -import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; -import {IPMarket} from '@interfaces/oracles/pendle/IPMarket.sol'; -import {IPOracle} from '@interfaces/oracles/pendle/IPOracle.sol'; -import {IStandardizedYield} from '@interfaces/oracles/pendle/IStandardizedYield.sol'; -import {IPPrincipalToken} from '@interfaces/oracles/pendle/IPPrincipalToken.sol'; -import {IPYieldToken} from '@interfaces/oracles/pendle/IPYieldToken.sol'; - -interface IPendleRelayer is IBaseOracle { - function twapDuration() external view returns (uint32); - function market() external view returns (IPMarket); - function oracle() external view returns (IPOracle); - function SY() external view returns (IStandardizedYield); - function PT() external view returns (IPPrincipalToken); - function YT() external view returns (IPYieldToken); -} diff --git a/src/interfaces/oracles/pendle/IStandardizedYield.sol b/src/interfaces/oracles/pendle/IStandardizedYield.sol deleted file mode 100644 index 599c1f7..0000000 --- a/src/interfaces/oracles/pendle/IStandardizedYield.sol +++ /dev/null @@ -1,143 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.7.6; - -import {IERC20Metadata} from '@interfaces/utils/IERC20Metadata.sol'; - -interface IStandardizedYield is IERC20Metadata { - /// @dev Emitted when any base tokens is deposited to mint shares - event Deposit( - address indexed caller, - address indexed receiver, - address indexed tokenIn, - uint256 amountDeposited, - uint256 amountSyOut - ); - - /// @dev Emitted when any shares are redeemed for base tokens - event Redeem( - address indexed caller, - address indexed receiver, - address indexed tokenOut, - uint256 amountSyToRedeem, - uint256 amountTokenOut - ); - - /// @dev check `assetInfo()` for more information - enum AssetType { - TOKEN, - LIQUIDITY - } - - /// @dev Emitted when (`user`) claims their rewards - event ClaimRewards(address indexed user, address[] rewardTokens, uint256[] rewardAmounts); - - /** - * @notice mints an amount of shares by depositing a base token. - * @param receiver shares recipient address - * @param tokenIn address of the base tokens to mint shares - * @param amountTokenToDeposit amount of base tokens to be transferred from (`msg.sender`) - * @param minSharesOut reverts if amount of shares minted is lower than this - * @return amountSharesOut amount of shares minted - * @dev Emits a {Deposit} event - * - * Requirements: - * - (`tokenIn`) must be a valid base token. - */ - function deposit( - address receiver, - address tokenIn, - uint256 amountTokenToDeposit, - uint256 minSharesOut - ) external payable returns (uint256 amountSharesOut); - - /** - * @notice redeems an amount of base tokens by burning some shares - * @param receiver recipient address - * @param amountSharesToRedeem amount of shares to be burned - * @param tokenOut address of the base token to be redeemed - * @param minTokenOut reverts if amount of base token redeemed is lower than this - * @param burnFromInternalBalance if true, burns from balance of `address(this)`, otherwise burns from `msg.sender` - * @return amountTokenOut amount of base tokens redeemed - * @dev Emits a {Redeem} event - * - * Requirements: - * - (`tokenOut`) must be a valid base token. - */ - function redeem( - address receiver, - uint256 amountSharesToRedeem, - address tokenOut, - uint256 minTokenOut, - bool burnFromInternalBalance - ) external returns (uint256 amountTokenOut); - - /** - * @notice exchangeRate * syBalance / 1e18 must return the asset balance of the account - * @notice vice-versa, if a user uses some amount of tokens equivalent to X asset, the amount of sy - * he can mint must be X * exchangeRate / 1e18 - * @dev SYUtils's assetToSy & syToAsset should be used instead of raw multiplication - * & division - */ - function exchangeRate() external view returns (uint256 res); - - /** - * @notice claims reward for (`user`) - * @param user the user receiving their rewards - * @return rewardAmounts an array of reward amounts in the same order as `getRewardTokens` - * @dev - * Emits a `ClaimRewards` event - * See {getRewardTokens} for list of reward tokens - */ - function claimRewards(address user) external returns (uint256[] memory rewardAmounts); - - /** - * @notice get the amount of unclaimed rewards for (`user`) - * @param user the user to check for - * @return rewardAmounts an array of reward amounts in the same order as `getRewardTokens` - */ - function accruedRewards(address user) external view returns (uint256[] memory rewardAmounts); - - function rewardIndexesCurrent() external returns (uint256[] memory indexes); - - function rewardIndexesStored() external view returns (uint256[] memory indexes); - - /** - * @notice returns the list of reward token addresses - */ - function getRewardTokens() external view returns (address[] memory); - - /** - * @notice returns the address of the underlying yield token - */ - function yieldToken() external view returns (address); - - /** - * @notice returns all tokens that can mint this SY - */ - function getTokensIn() external view returns (address[] memory res); - - /** - * @notice returns all tokens that can be redeemed by this SY - */ - function getTokensOut() external view returns (address[] memory res); - - function isValidTokenIn(address token) external view returns (bool); - - function isValidTokenOut(address token) external view returns (bool); - - function previewDeposit( - address tokenIn, - uint256 amountTokenToDeposit - ) external view returns (uint256 amountSharesOut); - - function previewRedeem(address tokenOut, uint256 amountSharesToRedeem) external view returns (uint256 amountTokenOut); - - /** - * @notice This function contains information to interpret what the asset is - * @return assetType the type of the asset (0 for ERC20 tokens, 1 for AMM liquidity tokens, - * 2 for bridged yield bearing tokens like wstETH, rETH on Arbi whose the underlying asset doesn't exist on the chain) - * @return assetAddress the address of the asset - * @return assetDecimals the decimals of the asset - */ - function assetInfo() external view returns (AssetType assetType, address assetAddress, uint8 assetDecimals); -} diff --git a/test/unit/RelayerFactories.t.sol b/test/unit/RelayerFactories.t.sol index 7536e87..84be2aa 100644 --- a/test/unit/RelayerFactories.t.sol +++ b/test/unit/RelayerFactories.t.sol @@ -11,16 +11,12 @@ import {CamelotRelayerFactory} from '@contracts/factories/CamelotRelayerFactory. import {CamelotRelayerChild} from '@contracts/factories/CamelotRelayerChild.sol'; import {ChainlinkRelayerFactory} from '@contracts/factories/ChainlinkRelayerFactory.sol'; import {ChainlinkRelayerChild} from '@contracts/factories/ChainlinkRelayerChild.sol'; -import {PendleRelayerFactory} from '@contracts/factories/pendle/PendleRelayerFactory.sol'; import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; import {DenominatedOracleFactory} from '@contracts/factories/DenominatedOracleFactory.sol'; import {DenominatedOracleChild} from '@contracts/factories/DenominatedOracleChild.sol'; import {IDelayedOracleFactory} from '@interfaces/factories/IDelayedOracleFactory.sol'; import {IAuthorizable} from '@interfaces/utils/IAuthorizable.sol'; -import {MAINNET_PENDLE_ORACLE, MAINNET_PENDLE_RETH_MARKET} from '@script/Registry.s.sol'; import {IAuthorizable} from '@interfaces/utils/IAuthorizable.sol'; -import {IPendleRelayerFactory} from '@interfaces/factories/IPendleRelayerFactory.sol'; -import {IPendleRelayer} from '@interfaces/oracles/pendle/IPendleRelayer.sol'; abstract contract Base is DSTestPlus { address deployer = label('deployer'); @@ -391,9 +387,8 @@ contract Unit_DenominatedPriceOracleFactory_DeployDenominatedOracle is Base { } } -contract Unit_Pendle_Renzo_Deploy_Oracle is Base { +contract Unit_Renzo_Deploy_Oracle is Base { address mainnetAuthorizedAccount = 0xF78dA2A37049627636546E0cFAaB2aD664950917; - IPendleRelayerFactory public pendleFactory; function setUp() public virtual override { super.setUp(); @@ -401,7 +396,6 @@ contract Unit_Pendle_Renzo_Deploy_Oracle is Base { delayedOracleFactory = IDelayedOracleFactory(MAINNET_DELAYED_ORACLE_FACTORY); chainlinkRelayerFactory = ChainlinkRelayerFactory(MAINNET_CHAINLINK_RELAYER_FACTORY); denominatedOracleFactory = DenominatedOracleFactory(MAINNET_DENOMINATED_ORACLE_FACTORY); - pendleFactory = IPendleRelayerFactory(address(new PendleRelayerFactory())); label(address(delayedOracleFactory), 'DelayedOracleFactory'); label(address(chainlinkRelayerFactory), 'ChainlinkRelayerFactory'); label(address(denominatedOracleFactory), 'DenominatedOracleFactory'); @@ -425,66 +419,5 @@ contract Unit_Pendle_Renzo_Deploy_Oracle is Base { string memory _ezEthSymbol = _ezEthUsdDelayedOracle.symbol(); // "(EZETH / ETH) * (ETH / USD)" vm.stopPrank(); assertEq(_ezEthSymbol, '(ezETH / ETH) * (ETH / USD)'); - - } - - function test_Deploy_PendleFactory() public { - assertEq(pendleFactory.relayerId(), 0); - assertEq(pendleFactory.authorizedAccounts()[0], address(this)); - } - - - function test_Deploy_PT_Oracle() public { - IBaseOracle ptOracle = - pendleFactory.deployPendlePtRelayer(MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, uint32(900)); - assertTrue(keccak256(abi.encode(ptOracle.symbol())) != keccak256(abi.encode(''))); - assertEq(uint256(IPendleRelayer(address(ptOracle)).twapDuration()), 900); - assertEq(address(IPendleRelayer(address(ptOracle)).market()), MAINNET_PENDLE_RETH_MARKET); - assertEq(address(IPendleRelayer(address(ptOracle)).oracle()), MAINNET_PENDLE_ORACLE); - assertEq(address(IPendleRelayer(address(ptOracle)).PT()), 0x685155D3BD593508Fe32Be39729810A591ED9c87); - assertEq(address(IPendleRelayer(address(ptOracle)).YT()), 0xe822AE44EB2466B4E263b1cbC94b4833dDEf9700); - assertEq(address(IPendleRelayer(address(ptOracle)).SY()), 0xc0Cf4b266bE5B3229C49590B59E67A09c15b22f4); - } - - function test_Deploy_YT_Oracle() public { - IBaseOracle ytOracle = - pendleFactory.deployPendleYtRelayer(MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, uint32(900)); - assertTrue(keccak256(abi.encode(ytOracle.symbol())) != keccak256(abi.encode(''))); - assertEq(uint256(IPendleRelayer(address(ytOracle)).twapDuration()), 900); - assertEq(address(IPendleRelayer(address(ytOracle)).market()), MAINNET_PENDLE_RETH_MARKET); - assertEq(address(IPendleRelayer(address(ytOracle)).oracle()), MAINNET_PENDLE_ORACLE); - assertEq(address(IPendleRelayer(address(ytOracle)).PT()), 0x685155D3BD593508Fe32Be39729810A591ED9c87); - assertEq(address(IPendleRelayer(address(ytOracle)).YT()), 0xe822AE44EB2466B4E263b1cbC94b4833dDEf9700); - assertEq(address(IPendleRelayer(address(ytOracle)).SY()), 0xc0Cf4b266bE5B3229C49590B59E67A09c15b22f4); - } - - function test_Deploy_LP_Oracle() public { - IBaseOracle lpOracle = - pendleFactory.deployPendleLpRelayer(MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, uint32(900)); - assertTrue(keccak256(abi.encode(lpOracle.symbol())) != keccak256(abi.encode(''))); - assertEq(uint256(IPendleRelayer(address(lpOracle)).twapDuration()), 900); - assertEq(address(IPendleRelayer(address(lpOracle)).market()), MAINNET_PENDLE_RETH_MARKET); - assertEq(address(IPendleRelayer(address(lpOracle)).oracle()), MAINNET_PENDLE_ORACLE); - assertEq(address(IPendleRelayer(address(lpOracle)).PT()), 0x685155D3BD593508Fe32Be39729810A591ED9c87); - assertEq(address(IPendleRelayer(address(lpOracle)).YT()), 0xe822AE44EB2466B4E263b1cbC94b4833dDEf9700); - assertEq(address(IPendleRelayer(address(lpOracle)).SY()), 0xc0Cf4b266bE5B3229C49590B59E67A09c15b22f4); - } - - function test_Deploy_Oracle_Revert_Invalid_Twap() public { - vm.expectRevert('Invalid TWAP duration'); - pendleFactory.deployPendlePtRelayer(MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, uint32(0)); - vm.expectRevert('Invalid TWAP duration'); - pendleFactory.deployPendleYtRelayer(MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, uint32(0)); - vm.expectRevert('Invalid TWAP duration'); - pendleFactory.deployPendleLpRelayer(MAINNET_PENDLE_RETH_MARKET, MAINNET_PENDLE_ORACLE, uint32(0)); - } - - function test_Deploy_Oracle_Revert_Invalid_Address() public { - vm.expectRevert('Invalid address'); - pendleFactory.deployPendlePtRelayer(address(0), MAINNET_PENDLE_ORACLE, uint32(900)); - vm.expectRevert('Invalid address'); - pendleFactory.deployPendleYtRelayer(address(0), MAINNET_PENDLE_ORACLE, uint32(900)); - vm.expectRevert('Invalid address'); - pendleFactory.deployPendleLpRelayer(address(0), MAINNET_PENDLE_ORACLE, uint32(900)); } } From 8aa650141e96e2d455c859daef86e3b0a2265c97 Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Tue, 23 Jul 2024 15:20:39 -0700 Subject: [PATCH 07/12] add DeployWstethRethL2ValidityOracles --- script/DeployOracle.s.sol | 44 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/script/DeployOracle.s.sol b/script/DeployOracle.s.sol index 030a1df..8e610ef 100644 --- a/script/DeployOracle.s.sol +++ b/script/DeployOracle.s.sol @@ -72,3 +72,47 @@ contract DeployLinkGrtEthOracles is Script, CommonMainnet { vm.stopBroadcast(); } } + +// BROADCAST +// source .env && forge script DeployWstethRethL2ValidityOracles --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY --account defaultKey --sender $DEFAULT_KEY_PUBLIC_ADDRESS + +// SIMULATE +// source .env && forge script DeployWstethRethL2ValidityOracles --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --sender $DEFAULT_KEY_PUBLIC_ADDRESS + +contract DeployWstethRethL2ValidityOracles is Script, CommonMainnet { + IBaseOracle public _wstethETHRelayer; + IBaseOracle public _rethETHRelayer; + + function run() public { + vm.startBroadcast(); + + _wstethETHRelayer = chainlinkRelayerFactory.deployChainlinkRelayerWithL2Validity( + MAINNET_CHAINLINK_WSTETH_ETH_FEED, + MAINNET_CHAINLINK_SEQUENCER_FEED, + 1 days, + MAINNET_CHAINLINK_L2VALIDITY_GRACE_PERIOD + ); + _rethETHRelayer = chainlinkRelayerFactory.deployChainlinkRelayerWithL2Validity( + MAINNET_CHAINLINK_RETH_ETH_FEED, + MAINNET_CHAINLINK_SEQUENCER_FEED, + 1 days, + MAINNET_CHAINLINK_L2VALIDITY_GRACE_PERIOD + ); + + IBaseOracle _wstethUsdOracle = denominatedOracleFactory.deployDenominatedOracle( + _wstethETHRelayer, IBaseOracle(MAINNET_CHAINLINK_L2VALIDITY_ETH_USD_RELAYER), false + ); + + IBaseOracle _rethUsdOracle = denominatedOracleFactory.deployDenominatedOracle( + _rethETHRelayer, IBaseOracle(MAINNET_CHAINLINK_L2VALIDITY_ETH_USD_RELAYER), false + ); + + IBaseOracle wstethOracle = delayedOracleFactory.deployDelayedOracle(_wstethUsdOracle, MAINNET_ORACLE_DELAY); + IBaseOracle rethOracle = delayedOracleFactory.deployDelayedOracle(_rethUsdOracle, MAINNET_ORACLE_DELAY); + + wstethOracle.getResultWithValidity(); + rethOracle.getResultWithValidity(); + + vm.stopBroadcast(); + } +} From 04de0d82d6dd122d1e7194432dbd8fb925a78be5 Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Tue, 23 Jul 2024 21:23:10 -0700 Subject: [PATCH 08/12] Deploy pt oracles (#82) * Update registry with new wsteth and reth oracles * cleanup registry * fix coverage action --- .github/workflows/coverage.yml | 5 +++++ script/Registry.s.sol | 31 +++++++++++++++++-------------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index f6c8bcf..f46f8d5 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -6,6 +6,11 @@ concurrency: group: ${{github.workflow}}-${{github.ref}} cancel-in-progress: true +env: + FOUNDRY_PROFILE: ci + ARB_SEPOLIA_RPC: ${{ secrets.ARB_SEPOLIA_RPC }} + ARB_MAINNET_RPC: ${{ secrets.ARB_MAINNET_RPC }} + jobs: build: runs-on: ubuntu-latest diff --git a/script/Registry.s.sol b/script/Registry.s.sol index 73641cc..cb5fdf9 100644 --- a/script/Registry.s.sol +++ b/script/Registry.s.sol @@ -60,6 +60,16 @@ address constant SEPOLIA_ALGEBRA_FARM_CENTER = 0x04e4A5A4E4D2A5a0fb48ECde0bbD555 // -- Mainnet -- +////////// CONSTANTS ////////// +address constant MAINNET_DEPLOYER = 0xF78dA2A37049627636546E0cFAaB2aD664950917; +uint256 constant MAINNET_ORACLE_DELAY = 1 hours; +uint256 constant MAINNET_CHAINLINK_L2VALIDITY_GRACE_PERIOD = 1 hours; +address constant MAINNET_PROTOCOL_TOKEN = 0x000D636bD52BFc1B3a699165Ef5aa340BEA8939c; +address constant MAINNET_WETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; +address constant ETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; +address constant ARB = 0x912CE59144191C1204E64559FE8253a0e49E6548; +address constant ETH_ARB_POOL = 0xe51635ae8136aBAc44906A8f230C2D235E9c195F; + ////////// FACTORIES ////////// address constant MAINNET_CAMELOT_RELAYER_FACTORY = 0x36645830479170265A154Acb726780fdaE41A28F; address constant MAINNET_CHAINLINK_RELAYER_FACTORY = 0x06C32500489C28Bd57c551afd8311Fef20bFaBB5; @@ -75,14 +85,20 @@ address constant MAINNET_CHAINLINK_ETH_USD_RELAYER = 0x3e6C1621f674da311E5764600 address constant MAINNET_CHAINLINK_L2VALIDITY_ETH_USD_RELAYER = 0x4617Feb8B72167c3b8253a1327CddE44e54670Ce; address constant MAINNET_CHAINLINK_RETH_ETH_RELAYER = 0x2b98972Ee61e8928F9dFa6504301296f0e7645Ca; address constant MAINNET_CHAINLINK_WSTETH_ETH_RELAYER = 0x48D3B7605B8dc3Ae231Bd59e40513C9e9Ac6D33a; +address constant MAINNET_CHAINLINK_L2VALIDITY_RETH_ETH_RELAYER = 0x77A15A5b9b7e1DE3EDf797662ADf1e74AF88f8Bd; +address constant MAINNET_CHAINLINK_L2VALIDITY_WSTETH_ETH_RELAYER = 0x4dF7048DC8696832A146ac4Ba8f7a791f258916c; address constant MAINNET_CHAINLINK_ARB_USD_RELAYER = 0x2635f731BB6981E72F92A781578952450759F762; // Denominated address constant MAINNET_DENOMINATED_ODG_USD_ORACLE = 0xE90E52eb676bc00DD85FAE83D2FAC22062F7f470; address constant MAINNET_DENOMINATED_RETH_USD_ORACLE = 0xE0ac4511A617cBee55ECb62667B08DB6864B9d8e; address constant MAINNET_DENOMINATED_WSTETH_USD_ORACLE = 0x8746664d1E0F0e61275EF3B52A8a3b3dFC11CcAb; +address constant MAINNET_DENOMINATED_L2VALIDITY_RETH_USD_ORACLE = 0x35843B3B7838eA15D0cAf2E61AD52C72b95b3Ca7; +address constant MAINNET_DENOMINATED_L2VALIDITY_WSTETH_USD_ORACLE = 0x9C9D6E07b58d1808d29d9dB118dd32b97DBba26A; // Delayed address constant MAINNET_DELAYED_RETH_USD_ORACLE = 0x0859c0B3EF150fAb129E43B74a63da13F5d2Dd35; address constant MAINNET_DELAYED_WSTETH_USD_ORACLE = 0xa8dEa011Ed90C53BA4601868Ccc9a36A6F442499; +address constant MAINNET_DELAYED_L2VALIDITY_RETH_USD_ORACLE = 0xCe962D4Ac9d70776e17C031192Fac64540F1a5D9; +address constant MAINNET_DELAYED_L2VALIDITY_WSTETH_USD_ORACLE = 0xb0ecE3904d69CCC4B7A7EcFEedf96298448B2CB9; address constant MAINNET_DELAYED_ARB_USD_ORACLE = 0xa4e0410E7eb9a02aa9C0505F629d01890c816A77; address constant MAINNET_DELAYED_ETH_USD_ORACLE = 0x562CCE2F4dc383862dC6A926AF10DeFf5fCd172F; @@ -96,19 +112,6 @@ address constant MAINNET_CHAINLINK_WSTETH_ETH_FEED = 0xb523AE262D20A936BC152e602 address constant MAINNET_CHAINLINK_CBETH_ETH_FEED = 0xa668682974E3f121185a3cD94f00322beC674275; address constant MAINNET_CHAINLINK_LINK_USD_FEED = 0x86E53CF1B870786351Da77A57575e79CB55812CB; address constant MAINNET_CHAINLINK_GRT_USD_FEED = 0x0F38D86FceF4955B705F35c9e41d1A16e0637c73; - +address constant MAINNET_CHAINLINK_EZETH_ETH_FEED = 0x11E1836bFF2ce9d6A5bec9cA79dc998210f3886d; // Sequencer for Arbitrum One address constant MAINNET_CHAINLINK_SEQUENCER_FEED = 0xFdB631F5EE196F0ed6FAa767959853A9F217697D; - -////////// PARAMS ////////// -address constant MAINNET_DEPLOYER = 0xF78dA2A37049627636546E0cFAaB2aD664950917; -uint256 constant MAINNET_ORACLE_DELAY = 1 hours; -uint256 constant MAINNET_CHAINLINK_L2VALIDITY_GRACE_PERIOD = 1 hours; -address constant MAINNET_PROTOCOL_TOKEN = 0x000D636bD52BFc1B3a699165Ef5aa340BEA8939c; -address constant MAINNET_WETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; -address constant ETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; -address constant ARB = 0x912CE59144191C1204E64559FE8253a0e49E6548; -address constant ETH_ARB_POOL = 0xe51635ae8136aBAc44906A8f230C2D235E9c195F; - -//////RENZO -address constant MAINNET_CHAINLINK_EZETH_ETH_FEED = 0x11E1836bFF2ce9d6A5bec9cA79dc998210f3886d; From c878ff300823a1e1c15e7a6e081f46088a65dfa8 Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Tue, 23 Jul 2024 21:27:12 -0700 Subject: [PATCH 09/12] add coverage badge --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 3f69c7b..147eb66 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ Open Dollar Relayer +[![codecov](https://codecov.io/gh/open-dollar/od-relayer/graph/badge.svg?token=FB1JMPI0GX)](https://codecov.io/gh/open-dollar/od-relayer) + This repository contains the smart contracts for the relayers used in Open Dollar. # Resources From 0008f58ea75c3d6e45b8a757549839e149ac3227 Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Tue, 23 Jul 2024 21:45:27 -0700 Subject: [PATCH 10/12] add codecov.yml --- .github/workflows/coverage.yml | 2 +- codecov.yml | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 codecov.yml diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index f46f8d5..a93a999 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -12,7 +12,7 @@ env: ARB_MAINNET_RPC: ${{ secrets.ARB_MAINNET_RPC }} jobs: - build: + coverage: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..4d3a330 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,34 @@ +codecov: + require_ci_to_pass: yes + +coverage: + status: + project: + default: + target: auto + threshold: 95 + base: auto + precision: 2 + round: down + range: "95...100" + +parsers: + gcov: + branch_detection: + conditional: yes + loop: yes + method: no + macro: no + +comment: + layout: "reach, diff, flags, files" + behavior: default + require_changes: false + require_base: no + require_head: yes + +ignore: + - "test" + - "script" + - "src/libraries/" + - "src/contracts/for-test/" From 82f6db02ff38690668194adb8d7216ce714b657f Mon Sep 17 00:00:00 2001 From: MrDeadCe11 <84342118+MrDeadCe11@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:18:31 -0500 Subject: [PATCH 11/12] Merge conflicts (#84) * 4-21-24 Deployment (#60) * chainlink updates and remove old deployment * deploy relayer factories * update registry w deployment * Add addresses priceSource WSTETH and RETH * Add DeployArbUsdChainlinkRelayerMainnet * add arb oracle relayer --------- Co-authored-by: Patrick Gallagher * fixed undeclared identifier in deploy relayer script --------- Co-authored-by: Joseph Schiarizzi <9449596+cupOJoseph@users.noreply.github.com> Co-authored-by: Patrick Gallagher --- .../42161/run-latest.json | 120 ++++++++++--- .../mainnet/deploy-factories-4-21-2024.json | 160 ++++++++++++++++++ script/predeployment/DeployFactories.s.sol | 6 +- script/predeployment/DeployRelayers.s.sol | 16 ++ 4 files changed, 271 insertions(+), 31 deletions(-) create mode 100644 deployments/mainnet/deploy-factories-4-21-2024.json diff --git a/broadcast/DeployRelayers.s.sol/42161/run-latest.json b/broadcast/DeployRelayers.s.sol/42161/run-latest.json index f92e8b9..65f738e 100644 --- a/broadcast/DeployRelayers.s.sol/42161/run-latest.json +++ b/broadcast/DeployRelayers.s.sol/42161/run-latest.json @@ -1,27 +1,60 @@ { "transactions": [ { - "hash": "0x0e96b679085276a91c36552c85793118bc6cb3fdaf09d22c89e5fa7a52ca30ce", + "hash": "0xe96975390e454a992ac546a8ad63cea34760ca95f4823175f5eef0b3076ac24b", "transactionType": "CALL", "contractName": null, - "contractAddress": "0xb6010972669953F6212B4AD969753c6e22ed5131", - "function": null, - "arguments": null, + "contractAddress": "0x06C32500489C28Bd57c551afd8311Fef20bFaBB5", + "function": "deployChainlinkRelayer(address,uint256)", + "arguments": [ + "0xb523AE262D20A936BC152e6023996e46FDC2A95D", + "3600" + ], "transaction": { "type": "0x02", - "from": "0xa0313248556dea42fd17b345817dd5dc5674c1e1", - "to": "0xb6010972669953f6212b4ad969753c6e22ed5131", - "gas": "0x2cf1cd", + "from": "0xf78da2a37049627636546e0cfaab2ad664950917", + "to": "0x06c32500489c28bd57c551afd8311fef20bfabb5", + "gas": "0x99ad9", "value": "0x0", - "data": "0xc361d270000000000000000000000000f7ec9ad3192d4ec1e54d52b3e492b5b66ab028890000000000000000000000001d2ea5253a3dc201d2275885621c095c6e656e290000000000000000000000000000000000000000000000000000000000000000", - "nonce": "0xd", + "data": "0x0e880baf000000000000000000000000b523ae262d20a936bc152e6023996e46fdc2a95d0000000000000000000000000000000000000000000000000000000000000e10", + "nonce": "0x2f", "accessList": [] }, "additionalContracts": [ { "transactionType": "CREATE", - "address": "0xE90E52eb676bc00DD85FAE83D2FAC22062F7f470", - "initCode": "0x60806040523480156200001157600080fd5b5060405162000e0d38038062000e0d833981810160405260608110156200003757600080fd5b50805160208201516040909201519091908282826001600160a01b038316620000a7576040805162461bcd60e51b815260206004820152601560248201527f44656e6f6d5f4e756c6c5072696365536f757263650000000000000000000000604482015290519081900360640190fd5b6001600160a01b03821662000103576040805162461bcd60e51b815260206004820152601560248201527f44656e6f6d5f4e756c6c5072696365536f757263650000000000000000000000604482015290519081900360640190fd5b600080546001600160a01b038086166001600160a01b0319928316179092556001805492851692909116919091179055600380548215801560ff1990921691909117909155620004b05760008054604080516395d89b4160e01b815290516001600160a01b03909216926395d89b4192600480840193829003018186803b1580156200018e57600080fd5b505afa158015620001a3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015620001cd57600080fd5b8101908080516040519392919084640100000000821115620001ee57600080fd5b9083019060208201858111156200020457600080fd5b82516401000000008111828201881017156200021f57600080fd5b82525081516020918201929091019080838360005b838110156200024e57818101518382015260200162000234565b50505050905090810190601f1680156200027c5780820380516001836020036101000a031916815260200191505b5060408181526001546395d89b4160e01b835290516001600160a01b0390911694506395d89b41935060048083019350600092829003018186803b158015620002c457600080fd5b505afa158015620002d9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200030357600080fd5b81019080805160405193929190846401000000008211156200032457600080fd5b9083019060208201858111156200033a57600080fd5b82516401000000008111828201881017156200035557600080fd5b82525081516020918201929091019080838360005b83811015620003845781810151838201526020016200036a565b50505050905090810190601f168015620003b25780820380516001836020036101000a031916815260200191505b506040525050506040516020018080600560fb1b81525060010183805190602001908083835b60208310620003f95780518252601f199092019160209182019101620003d8565b51815160209384036101000a600019018019909216911617905267052bc5a62405e40560c31b919093019081528451600890910192850191508083835b60208310620004575780518252601f19909201916020918201910162000436565b51815160209384036101000a6000190180199092169116179052602960f81b9190930190815260408051808303601e19018152600190920190528051620004a9965060029550920192506200082f9050565b506200080b565b60008054604080516395d89b4160e01b815290516001600160a01b03909216926395d89b4192600480840193829003018186803b158015620004f157600080fd5b505afa15801562000506573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200053057600080fd5b81019080805160405193929190846401000000008211156200055157600080fd5b9083019060208201858111156200056757600080fd5b82516401000000008111828201881017156200058257600080fd5b82525081516020918201929091019080838360005b83811015620005b157818101518382015260200162000597565b50505050905090810190601f168015620005df5780820380516001836020036101000a031916815260200191505b5060408181526001546395d89b4160e01b835290516001600160a01b0390911694506395d89b41935060048083019350600092829003018186803b1580156200062757600080fd5b505afa1580156200063c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200066657600080fd5b81019080805160405193929190846401000000008211156200068757600080fd5b9083019060208201858111156200069d57600080fd5b8251640100000000811182820188101715620006b857600080fd5b82525081516020918201929091019080838360005b83811015620006e7578181015183820152602001620006cd565b50505050905090810190601f168015620007155780820380516001836020036101000a031916815260200191505b506040525050506040516020018080600560fb1b81525060010183805190602001908083835b602083106200075c5780518252601f1990920191602091820191016200073b565b51815160209384036101000a600019018019909216911617905264052405440560db1b919093019081528451600590910192850191508083835b60208310620007b75780518252601f19909201916020918201910162000796565b51815160209384036101000a6000190180199092169116179052602960f81b9190930190815260408051808303601e1901815260019092019052805162000809965060029550920192506200082f9050565b505b505060038054610100600160a81b031916336101000217905550620008db92505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620008675760008555620008b2565b82601f106200088257805160ff1916838001178555620008b2565b82800160010185558215620008b2579182015b82811115620008b257825182559160200191906001019062000895565b50620008c0929150620008c4565b5090565b5b80821115620008c05760008155600101620008c5565b61052280620008eb6000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806367e368fc1161005b57806367e368fc146100e157806395d89b41146100fd578063bf8c7df51461017a578063c45a0155146101825761007d565b806320531bc9146100825780634fd0ada8146100a657806357de26a4146100c7575b600080fd5b61008a61018a565b604080516001600160a01b039092168252519081900360200190f35b6100ae610199565b6040805192835290151560208301528051918290030190f35b6100cf6102e5565b60408051918252519081900360200190f35b6100e9610405565b604080519115158252519081900360200190f35b61010561040e565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561013f578181015183820152602001610127565b50505050905090810190601f16801561016c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61008a610499565b61008a6104a8565b6000546001600160a01b031681565b60008060008060008054906101000a90046001600160a01b03166001600160a01b0316634fd0ada86040518163ffffffff1660e01b8152600401604080518083038186803b1580156101ea57600080fd5b505afa1580156101fe573d6000803e3d6000fd5b505050506040513d604081101561021457600080fd5b508051602090910151600154604080516309fa15b560e31b8152815194965092945060009384936001600160a01b0390931692634fd0ada8926004808301939192829003018186803b15801561026957600080fd5b505afa15801561027d573d6000803e3d6000fd5b505050506040513d604081101561029357600080fd5b508051602090910151600354919350915060ff166102b157836102c3565b6102c3670de0b6b3a7640000856104bc565b93506102cf84836104d9565b95508280156102db5750805b9450505050509091565b60008054604080516315f789a960e21b8152905183926001600160a01b0316916357de26a4916004808301926020929190829003018186803b15801561032a57600080fd5b505afa15801561033e573d6000803e3d6000fd5b505050506040513d602081101561035457600080fd5b5051600154604080516315f789a960e21b815290519293506000926001600160a01b03909216916357de26a491600480820192602092909190829003018186803b1580156103a157600080fd5b505afa1580156103b5573d6000803e3d6000fd5b505050506040513d60208110156103cb57600080fd5b505160035490915060ff166103e057816103f2565b6103f2670de0b6b3a7640000836104bc565b91506103fe82826104d9565b9250505090565b60035460ff1681565b6002805460408051602060018416156101000260001901909316849004601f810184900484028201840190925281815292918301828280156104915780601f1061046657610100808354040283529160200191610491565b820191906000526020600020905b81548152906001019060200180831161047457829003601f168201915b505050505081565b6001546001600160a01b031681565b60035461010090046001600160a01b031681565b600081670de0b6b3a76400008402816104d157fe5b049392505050565b6000670de0b6b3a76400008383026104d156fea2646970667358221220ecd28c38f34366e2463cde311ffeb888c7081c1a393a1fb2aa0e413827a4861964736f6c63430007060033000000000000000000000000f7ec9ad3192d4ec1e54d52b3e492b5b66ab028890000000000000000000000001d2ea5253a3dc201d2275885621c095c6e656e290000000000000000000000000000000000000000000000000000000000000000" + "address": "0x4Bf4dA2E61EA7f5214686567c32C302A089FD563", + "initCode": "0x60c060405234801561001057600080fd5b506040516108e53803806108e58339818101604052604081101561003357600080fd5b50805160209091015181816001600160a01b03821661005157600080fd5b8061005b57600080fd5b6080819052600080546001600160a01b0319166001600160a01b0384811691909117918290556040805163313ce56760e01b81529051929091169163313ce56791600480820192602092909190829003018186803b1580156100bc57600080fd5b505afa1580156100d0573d6000803e3d6000fd5b505050506040513d60208110156100e657600080fd5b505160ff1660120360a0526000805460408051633942720b60e11b815290516001600160a01b0390921692637284e41692600480840193829003018186803b15801561013157600080fd5b505afa158015610145573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561016e57600080fd5b810190808051604051939291908464010000000082111561018e57600080fd5b9083019060208201858111156101a357600080fd5b82516401000000008111828201881017156101bd57600080fd5b82525081516020918201929091019080838360005b838110156101ea5781810151838201526020016101d2565b50505050905090810190601f1680156102175780820380516001836020036101000a031916815260200191505b506040525050815161023092600192506020019061024d565b5050600280546001600160a01b03191633179055506102ee915050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261028357600085556102c9565b82601f1061029c57805160ff19168380011785556102c9565b828001600101855582156102c9579182015b828111156102c95782518255916020019190600101906102ae565b506102d59291506102d9565b5090565b5b808211156102d557600081556001016102da565b60805160a0516105bb61032a60003980610178528061046a528061049852806104c052806104ee525080610344528061053d52506105bb6000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80635bdddcd01161005b5780635bdddcd0146100c55780637dbdf1f5146100cd57806395d89b41146100f1578063c45a01551461016e5761007d565b8063059f8b16146100825780634fd0ada81461009c57806357de26a4146100bd575b600080fd5b61008a610176565b60408051918252519081900360200190f35b6100a461019a565b6040805192835290151560208301528051918290030190f35b61008a61024e565b61008a610342565b6100d5610366565b604080516001600160a01b039092168252519081900360200190f35b6100f9610375565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561013357818101518382015260200161011b565b50505050905090810190601f1680156101605780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100d5610402565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060008060008054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156101ec57600080fd5b505afa158015610200573d6000803e3d6000fd5b505050506040513d60a081101561021657600080fd5b506020810151606090910151909250905061023082610411565b9350600082138015610246575061024681610526565b925050509091565b60008060008060009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156102a057600080fd5b505afa1580156102b4573d6000803e3d6000fd5b505050506040513d60a08110156102ca57600080fd5b506020810151606090910151909250905081158015906102ee57506102ee81610526565b610332576040805162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59141c9a58d95199595960821b604482015290519081900360640190fd5b61033b82610411565b9250505090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031681565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103fa5780601f106103cf576101008083540402835291602001916103fa565b820191906000526020600020905b8154815290600101906020018083116103dd57829003601f168201915b505050505081565b6002546001600160a01b031681565b600080821215610468576040805162461bcd60e51b815260206004820181905260248201527f4e656761746976652070726963652076616c7565206e6f7420616c6c6f776564604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000000000610494575080610521565b60007f000000000000000000000000000000000000000000000000000000000000000013156104e957507f0000000000000000000000000000000000000000000000000000000000000000600a0a8102610521565b6105127f0000000000000000000000000000000000000000000000000000000000000000610569565b600a0a828161051d57fe5b0490505b919050565b6000428083111561053b576000915050610521565b7f00000000000000000000000000000000000000000000000000000000000000008382031115915050919050565b60008082121561057c578160000361057e565b815b509091905056fea264697066735822122017aab045d68078cbe43f4a00ea18c8eb7b8cefc31a28865abdf0c613d01ffc1264736f6c63430007060033000000000000000000000000b523ae262d20a936bc152e6023996e46fdc2a95d0000000000000000000000000000000000000000000000000000000000000e10" + } + ], + "isFixedGasLimit": false + }, + { + "hash": "0x61ab3e78cb13e65e982d1049c7145a57f9b9fe1aadd85bea55c1580479d28d5d", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xBF760b23d2ef3615cec549F22b95a34DB0F8f5CD", + "function": "deployDenominatedOracle(address,address,bool)", + "arguments": [ + "0x4Bf4dA2E61EA7f5214686567c32C302A089FD563", + "0x3e6C1621f674da311E57646007fBfAd857084383", + "false" + ], + "transaction": { + "type": "0x02", + "from": "0xf78da2a37049627636546e0cfaab2ad664950917", + "to": "0xbf760b23d2ef3615cec549f22b95a34db0f8f5cd", + "gas": "0xb4fe7", + "value": "0x0", + "data": "0xc361d2700000000000000000000000004bf4da2e61ea7f5214686567c32c302a089fd5630000000000000000000000003e6c1621f674da311e57646007fbfad8570843830000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x30", + "accessList": [] + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xD0cf1FfFF3FB90c87210D76DFBc3AcfFd02D6B12", + "initCode": "0x60a06040523480156200001157600080fd5b5060405162000e9338038062000e93833981810160405260608110156200003757600080fd5b50805160208201516040909201519091908282826001600160a01b0383166200005f57600080fd5b6001600160a01b0382166200007357600080fd5b600080546001600160a01b038086166001600160a01b03199283161790925560018054928516929091169190911790558015801560f81b608052620004155760008054604080516395d89b4160e01b815290516001600160a01b03909216926395d89b4192600480840193829003018186803b158015620000f357600080fd5b505afa15801562000108573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200013257600080fd5b81019080805160405193929190846401000000008211156200015357600080fd5b9083019060208201858111156200016957600080fd5b82516401000000008111828201881017156200018457600080fd5b82525081516020918201929091019080838360005b83811015620001b357818101518382015260200162000199565b50505050905090810190601f168015620001e15780820380516001836020036101000a031916815260200191505b5060408181526001546395d89b4160e01b835290516001600160a01b0390911694506395d89b41935060048083019350600092829003018186803b1580156200022957600080fd5b505afa1580156200023e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200026857600080fd5b81019080805160405193929190846401000000008211156200028957600080fd5b9083019060208201858111156200029f57600080fd5b8251640100000000811182820188101715620002ba57600080fd5b82525081516020918201929091019080838360005b83811015620002e9578181015183820152602001620002cf565b50505050905090810190601f168015620003175780820380516001836020036101000a031916815260200191505b506040525050506040516020018080600560fb1b81525060010183805190602001908083835b602083106200035e5780518252601f1990920191602091820191016200033d565b51815160209384036101000a600019018019909216911617905267052bc5a62405e40560c31b919093019081528451600890910192850191508083835b60208310620003bc5780518252601f1990920191602091820191016200039b565b51815160209384036101000a6000190180199092169116179052602960f81b9190930190815260408051808303601e190181526001909201905280516200040e965060029550920192506200078f9050565b5062000770565b60008054604080516395d89b4160e01b815290516001600160a01b03909216926395d89b4192600480840193829003018186803b1580156200045657600080fd5b505afa1580156200046b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200049557600080fd5b8101908080516040519392919084640100000000821115620004b657600080fd5b908301906020820185811115620004cc57600080fd5b8251640100000000811182820188101715620004e757600080fd5b82525081516020918201929091019080838360005b8381101562000516578181015183820152602001620004fc565b50505050905090810190601f168015620005445780820380516001836020036101000a031916815260200191505b5060408181526001546395d89b4160e01b835290516001600160a01b0390911694506395d89b41935060048083019350600092829003018186803b1580156200058c57600080fd5b505afa158015620005a1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015620005cb57600080fd5b8101908080516040519392919084640100000000821115620005ec57600080fd5b9083019060208201858111156200060257600080fd5b82516401000000008111828201881017156200061d57600080fd5b82525081516020918201929091019080838360005b838110156200064c57818101518382015260200162000632565b50505050905090810190601f1680156200067a5780820380516001836020036101000a031916815260200191505b506040525050506040516020018080600560fb1b81525060010183805190602001908083835b60208310620006c15780518252601f199092019160209182019101620006a0565b51815160209384036101000a600019018019909216911617905264052405440560db1b919093019081528451600590910192850191508083835b602083106200071c5780518252601f199092019160209182019101620006fb565b51815160209384036101000a6000190180199092169116179052602960f81b9190930190815260408051808303601e190181526001909201905280516200076e965060029550920192506200078f9050565b505b5050600380546001600160a01b03191633179055506200083b92505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620007c7576000855562000812565b82601f10620007e257805160ff191683800117855562000812565b8280016001018555821562000812579182015b8281111562000812578251825591602001919060010190620007f5565b506200082092915062000824565b5090565b5b8082111562000820576000815560010162000825565b60805160f81c61063062000863600039806102a3528061040d528061054752506106306000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806395d89b411161005b57806395d89b41146100e1578063bf8c7df51461015e578063c45a015514610166578063d5647f0d1461016e5761007d565b806320531bc9146100825780634fd0ada8146100a657806357de26a4146100c7575b600080fd5b61008a61018a565b604080516001600160a01b039092168252519081900360200190f35b6100ae610199565b6040805192835290151560208301528051918290030190f35b6100cf610321565b60408051918252519081900360200190f35b6100e961049c565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561012357818101518382015260200161010b565b50505050905090810190601f1680156101505780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61008a610527565b61008a610536565b610176610545565b604080519115158252519081900360200190f35b6000546001600160a01b031681565b60008060008060008054906101000a90046001600160a01b03166001600160a01b0316634fd0ada86040518163ffffffff1660e01b8152600401604080518083038186803b1580156101ea57600080fd5b505afa1580156101fe573d6000803e3d6000fd5b505050506040513d604081101561021457600080fd5b508051602090910151600154604080516309fa15b560e31b8152815194965092945060009384936001600160a01b0390931692634fd0ada8926004808301939192829003018186803b15801561026957600080fd5b505afa15801561027d573d6000803e3d6000fd5b505050506040513d604081101561029357600080fd5b50805160209091015190925090507f0000000000000000000000000000000000000000000000000000000000000000156102ff57836102dc57600080955095505050505061031d565b6102f8846102f2670de0b6b3a764000085610569565b906105dd565b955061030c565b6103098483610569565b95505b8280156103165750805b9450505050505b9091565b60008054604080516315f789a960e21b8152905183926001600160a01b0316916357de26a4916004808301926020929190829003018186803b15801561036657600080fd5b505afa15801561037a573d6000803e3d6000fd5b505050506040513d602081101561039057600080fd5b5051600154604080516315f789a960e21b815290519293506000926001600160a01b03909216916357de26a491600480820192602092909190829003018186803b1580156103dd57600080fd5b505afa1580156103f1573d6000803e3d6000fd5b505050506040513d602081101561040757600080fd5b505190507f00000000000000000000000000000000000000000000000000000000000000001561048b5781610476576040805162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59141c9a58d95199595960821b604482015290519081900360640190fd5b610488670de0b6b3a7640000836105dd565b91505b6104958282610569565b9250505090565b6002805460408051602060018416156101000260001901909316849004601f8101849004840282018401909252818152929183018282801561051f5780601f106104f45761010080835404028352916020019161051f565b820191906000526020600020905b81548152906001019060200180831161050257829003601f168201915b505050505081565b6001546001600160a01b031681565b6003546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008282028284828161057857fe5b04146105cb576040805162461bcd60e51b815260206004820152601c60248201527f776d756c206f766572666c6f77206572726f7220646574656374656400000000604482015290519081900360640190fd5b670de0b6b3a764000090049392505050565b600081670de0b6b3a76400008402816105f257fe5b04939250505056fea2646970667358221220b51ef5f600dbafc357dd8202e8528867858a3410c9423afa769502a6fba9561864736f6c634300070600330000000000000000000000004bf4da2e61ea7f5214686567c32c302a089fd5630000000000000000000000003e6c1621f674da311e57646007fbfad8570843830000000000000000000000000000000000000000000000000000000000000000" } ], "isFixedGasLimit": false @@ -29,42 +62,73 @@ ], "receipts": [ { - "transactionHash": "0x0e96b679085276a91c36552c85793118bc6cb3fdaf09d22c89e5fa7a52ca30ce", + "transactionHash": "0xe96975390e454a992ac546a8ad63cea34760ca95f4823175f5eef0b3076ac24b", + "transactionIndex": "0x5", + "blockHash": "0xed8a82ab5d7ed197aba9c5809dac9543e02f44621a377160f0745146fe4054ee", + "blockNumber": "0xc21622c", + "from": "0xF78dA2A37049627636546E0cFAaB2aD664950917", + "to": "0x06C32500489C28Bd57c551afd8311Fef20bFaBB5", + "cumulativeGasUsed": "0x1ac513", + "gasUsed": "0x75282", + "contractAddress": null, + "logs": [ + { + "address": "0x06C32500489C28Bd57c551afd8311Fef20bFaBB5", + "topics": [ + "0xe4c825eca1b3bffc8243945a2adb32b3c8c6f7282e3f6f8fbf3aa79b052d9808", + "0x0000000000000000000000004bf4da2e61ea7f5214686567c32c302a089fd563" + ], + "data": "0x000000000000000000000000b523ae262d20a936bc152e6023996e46fdc2a95d0000000000000000000000000000000000000000000000000000000000000e10", + "blockHash": "0xed8a82ab5d7ed197aba9c5809dac9543e02f44621a377160f0745146fe4054ee", + "blockNumber": "0xc21622c", + "transactionHash": "0xe96975390e454a992ac546a8ad63cea34760ca95f4823175f5eef0b3076ac24b", + "transactionIndex": "0x5", + "logIndex": "0x28", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000800000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000100000000000000000000400000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x989680" + }, + { + "transactionHash": "0x61ab3e78cb13e65e982d1049c7145a57f9b9fe1aadd85bea55c1580479d28d5d", "transactionIndex": "0x1", - "blockHash": "0xf95028257583e9a752b1b19b3818fa51ebf25877e7096e932ca222aec09c45eb", - "blockNumber": "0xaa2de5a", - "from": "0xA0313248556DeA42fd17B345817Dd5DC5674c1E1", - "to": "0xb6010972669953F6212B4AD969753c6e22ed5131", - "cumulativeGasUsed": "0x1d269e", - "gasUsed": "0x1d269e", + "blockHash": "0xeac303f3dca1128f9b8b04a92dbeb75fa22d7741587ea2a24ee4391c867b4122", + "blockNumber": "0xc216250", + "from": "0xF78dA2A37049627636546E0cFAaB2aD664950917", + "to": "0xBF760b23d2ef3615cec549F22b95a34DB0F8f5CD", + "cumulativeGasUsed": "0x80763", + "gasUsed": "0x80763", "contractAddress": null, "logs": [ { - "address": "0xb6010972669953F6212B4AD969753c6e22ed5131", + "address": "0xBF760b23d2ef3615cec549F22b95a34DB0F8f5CD", "topics": [ "0x55291a17f5d704dcd502dee45b56ae143341f856be5dc48a5344ff8d54832296", - "0x000000000000000000000000e90e52eb676bc00dd85fae83d2fac22062f7f470" + "0x000000000000000000000000d0cf1ffff3fb90c87210d76dfbc3acffd02d6b12" ], - "data": "0x000000000000000000000000f7ec9ad3192d4ec1e54d52b3e492b5b66ab028890000000000000000000000001d2ea5253a3dc201d2275885621c095c6e656e290000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xf95028257583e9a752b1b19b3818fa51ebf25877e7096e932ca222aec09c45eb", - "blockNumber": "0xaa2de5a", - "transactionHash": "0x0e96b679085276a91c36552c85793118bc6cb3fdaf09d22c89e5fa7a52ca30ce", + "data": "0x0000000000000000000000004bf4da2e61ea7f5214686567c32c302a089fd5630000000000000000000000003e6c1621f674da311e57646007fbfad8570843830000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xeac303f3dca1128f9b8b04a92dbeb75fa22d7741587ea2a24ee4391c867b4122", + "blockNumber": "0xc216250", + "transactionHash": "0x61ab3e78cb13e65e982d1049c7145a57f9b9fe1aadd85bea55c1580479d28d5d", "transactionIndex": "0x1", "logIndex": "0x0", "removed": false } ], "status": "0x1", - "logsBloom": "0x00000000000000000000000000000000000000000000000000020000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000080000000000000000000020000000000000000000020000000400000000000000000000000000000000000100000", + "logsBloom": "0x10000000000000000000000000040000000000000000000000000000000000400008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000080008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "effectiveGasPrice": "0x5f5e100" + "effectiveGasPrice": "0x989680" } ], "libraries": [], "pending": [], "returns": {}, - "timestamp": 1707335803, + "timestamp": 1713753080, "chain": 42161, "multi": false, - "commit": "0085ee4" + "commit": "099a5a8" } \ No newline at end of file diff --git a/deployments/mainnet/deploy-factories-4-21-2024.json b/deployments/mainnet/deploy-factories-4-21-2024.json new file mode 100644 index 0000000..dbd0209 --- /dev/null +++ b/deployments/mainnet/deploy-factories-4-21-2024.json @@ -0,0 +1,160 @@ +{ + "transactions": [ + { + "hash": "0x4943981f3102b6c8c13043326702437bc3fa6310bc0168a674312b6278b28772", + "transactionType": "CREATE", + "contractName": "CamelotRelayerFactory", + "contractAddress": "0x36645830479170265A154Acb726780fdaE41A28F", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0xf78da2a37049627636546e0cfaab2ad664950917", + "gas": "0x2aaf8d", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b503361001b81610021565b5061017b565b61002a816100c8565b15610070576040805162461bcd60e51b8152602060048201526011602482015270105b1c9958591e505d5d1a1bdc9a5e9959607a1b604482015290519081900360640190fd5b6100888160006100e860201b6104971790919060201c565b50604080516001600160a01b038316815290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029181900360200190a150565b60006100e282600061010460201b6104b51790919060201c565b92915050565b60006100fd836001600160a01b038416610119565b9392505050565b60006100fd836001600160a01b038416610163565b60006101258383610163565b61015b575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556100e2565b5060006100e2565b60009081526001919091016020526040902054151590565b611d928061018a6000396000f3fe60806040523480156200001157600080fd5b5060043610620000885760003560e01c806394f3f81d116200006357806394f3f81d1462000151578063a3df71b2146200017a578063abe2c52a1462000196578063e0ac631614620001d25762000088565b806324ba5884146200008d5780632e39187614620000ca57806335b281531462000126575b600080fd5b620000b660048036036020811015620000a557600080fd5b50356001600160a01b031662000218565b604080519115158252519081900360200190f35b620000d46200022b565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101562000112578181015183820152602001620000f8565b505050509050019250505060405180910390f35b6200014f600480360360208110156200013e57600080fd5b50356001600160a01b031662000288565b005b6200014f600480360360208110156200016957600080fd5b50356001600160a01b0316620002e2565b6200018462000339565b60408051918252519081900360200190f35b620001b660048036036020811015620001ae57600080fd5b50356200033f565b604080516001600160a01b039092168252519081900360200190f35b620001b660048036036080811015620001ea57600080fd5b5080356001600160a01b03908116916020810135821691604082013516906060013563ffffffff166200035a565b60006200022582620004cc565b92915050565b60008054604080516020808402820181019092528281526060939290918391908301828280156200027c57602002820191906000526020600020905b81548152602001906001019080831162000267575b50939550505050505090565b6200029333620004cc565b620002d4576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b620002df81620004da565b50565b620002ed33620004cc565b6200032e576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b620002df8162000579565b60025481565b6003602052600090815260409020546001600160a01b031681565b60006200036733620004cc565b620003a8576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b84848484604051620003ba9062000757565b6001600160a01b0394851681529284166020840152921660408083019190915263ffffffff9092166060820152905190819003608001906000f08015801562000407573d6000803e3d6000fd5b50600280546001019081905560009081526003602090815260409182902080546001600160a01b038086166001600160a01b03199092168217909255835189831681529188169282019290925263ffffffff8616818401529151929350917fb266a0f1bc37f12d44c6be02c0273791f9928a102505a2a759b8992b44d729089181900360600190a2949350505050565b6000620004ae836001600160a01b03841662000613565b9392505050565b6000620004ae836001600160a01b03841662000662565b6000620002258183620004b5565b620004e581620004cc565b156200052c576040805162461bcd60e51b8152602060048201526011602482015270105b1c9958591e505d5d1a1bdc9a5e9959607a1b604482015290519081900360640190fd5b6200053960008262000497565b50604080516001600160a01b038316815290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029181900360200190a150565b6200058481620004cc565b620005c6576040805162461bcd60e51b815260206004820152600d60248201526c139bdd105d5d1a1bdc9a5e9959609a1b604482015290519081900360640190fd5b620005d36000826200067a565b50604080516001600160a01b038316815290517f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b9039181900360200190a150565b600062000621838362000662565b620006595750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000225565b50600062000225565b60009081526001919091016020526040902054151590565b6000620004ae836001600160a01b038416600081815260018301602052604081205480156200074c5783546000198083019190810190600090879083908110620006c057fe5b9060005260206000200154905080876000018481548110620006de57fe5b6000918252602080832090910192909255828152600189810190925260409020908401905586548790806200070f57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505062000225565b600091505062000225565b6115f780620007668339019056fe60e06040523480156200001157600080fd5b50604051620015f7380380620015f7833981810160405260808110156200003757600080fd5b508051602080830151604080850151606090950151815163d9a641e160e01b81526001600160a01b03808516600483015280881660248301529251959693959394919387938793879387939287169263d9a641e192604480840193919291829003018186803b158015620000aa57600080fd5b505afa158015620000bf573d6000803e3d6000fd5b505050506040513d6020811015620000d657600080fd5b5051600080546001600160a01b0319166001600160a01b039283161790819055166200010157600080fd5b60008060009054906101000a90046001600160a01b03166001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b1580156200015157600080fd5b505afa15801562000166573d6000803e3d6000fd5b505050506040513d60208110156200017d57600080fd5b5051600080546040805163d21220a760e01b8152905193945091926001600160a01b039091169163d21220a7916004808301926020929190829003018186803b158015620001ca57600080fd5b505afa158015620001df573d6000803e3d6000fd5b505050506040513d6020811015620001f657600080fd5b505190506001600160a01b0382811690861614156200024557600180546001600160a01b038085166001600160a01b031992831617909255600280549284169290911691909117905562000276565b600180546001600160a01b038084166001600160a01b03199283161790925560028054928516929091169190911790555b846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015620002b057600080fd5b505afa158015620002c5573d6000803e3d6000fd5b505050506040513d6020811015620002dc57600080fd5b505160ff16600a0a60801b6001600160801b03191660c0526040805163313ce56760e01b815290516001600160a01b0386169163313ce567916004808301926020929190829003018186803b1580156200033557600080fd5b505afa1580156200034a573d6000803e3d6000fd5b505050506040513d60208110156200036157600080fd5b505160ff166012036080526001600160e01b031960e084901b1660a052604080516395d89b4160e01b815290516001600160a01b038716916395d89b41916004808301926000929190829003018186803b158015620003bf57600080fd5b505afa158015620003d4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015620003fe57600080fd5b81019080805160405193929190846401000000008211156200041f57600080fd5b9083019060208201858111156200043557600080fd5b82516401000000008111828201881017156200045057600080fd5b82525081516020918201929091019080838360005b838110156200047f57818101518382015260200162000465565b50505050905090810190601f168015620004ad5780820380516001836020036101000a031916815260200191505b50604052505050846001600160a01b03166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015620004ee57600080fd5b505afa15801562000503573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200052d57600080fd5b81019080805160405193929190846401000000008211156200054e57600080fd5b9083019060208201858111156200056457600080fd5b82516401000000008111828201881017156200057f57600080fd5b82525081516020918201929091019080838360005b83811015620005ae57818101518382015260200162000594565b50505050905090810190601f168015620005dc5780820380516001836020036101000a031916815260200191505b506040525050506040516020018083805190602001908083835b60208310620006175780518252601f199092019160209182019101620005f6565b51815160209384036101000a60001901801990921691161790526201017960ed1b919093019081528451600390910192850191508083835b60208310620006705780518252601f1990920191602091820191016200064f565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405260039080519060200190620006bc929190620006e0565b5050600480546001600160a01b03191633179055506200078c975050505050505050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000718576000855562000763565b82601f106200073357805160ff191683800117855562000763565b8280016001018555821562000763579182015b828111156200076357825182559160200191906001019062000746565b506200077192915062000775565b5090565b5b8082111562000771576000815560010162000776565b60805160a05160e01c60c05160801c610e10620007e760003980610219528061028a528061031f52508061025252806102e752806104205250806101e652806109475280610975528061099d52806109cb5250610e106000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c806395d89b411161006657806395d89b411461012e5780639f747b20146101ab578063c45a0155146101b3578063c55dae63146101bb578063f9c80cde146101c35761009e565b8063059f8b16146100a3578063217a4b70146100bd57806325de1092146100e15780634fd0ada81461010557806357de26a414610126575b600080fd5b6100ab6101e4565b60408051918252519081900360200190f35b6100c5610208565b604080516001600160a01b039092168252519081900360200190f35b6100e9610217565b604080516001600160801b039092168252519081900360200190f35b61010d61023b565b6040805192835290151560208301528051918290030190f35b6100ab6102d2565b610136610363565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610170578181015183820152602001610158565b50505050905090810190601f16801561019d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100c56103f1565b6100c5610400565b6100c561040f565b6101cb61041e565b6040805163ffffffff9092168252519081900360200190f35b7f000000000000000000000000000000000000000000000000000000000000000081565b6002546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000805481908190610276906001600160a01b03167f0000000000000000000000000000000000000000000000000000000000000000610442565b6001546002549192506000916102bc9184917f0000000000000000000000000000000000000000000000000000000000000000916001600160a01b03908116911661084c565b90506102c781610943565b946001945092505050565b60008054819061030b906001600160a01b03167f0000000000000000000000000000000000000000000000000000000000000000610442565b6001546002549192506000916103519184917f0000000000000000000000000000000000000000000000000000000000000000916001600160a01b03908116911661084c565b905061035c81610943565b9250505090565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103e95780601f106103be576101008083540402835291602001916103e9565b820191906000526020600020905b8154815290600101906020018083116103cc57829003601f168201915b505050505081565b6000546001600160a01b031681565b6004546001600160a01b031681565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8216610481576040805162461bcd60e51b8152602060048201526002602482015261042560f41b604482015290519081900360640190fd5b60408051600280825260608201835260009260208301908036833701905050905082816000815181106104b057fe5b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106104d957fe5b63ffffffff909216602092830291909101820152604051639d3a524160e01b8152600481018281528351602483015283516000936001600160a01b03891693639d3a5241938793909283926044019185820191028083838b5b8381101561054a578181015183820152602001610532565b505050509050019250505060006040518083038186803b15801561056d57600080fd5b505afa158015610581573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260808110156105aa57600080fd5b8101908080516040519392919084600160201b8211156105c957600080fd5b9083019060208201858111156105de57600080fd5b82518660208202830111600160201b821117156105fa57600080fd5b82525081516020918201928201910280838360005b8381101561062757818101518382015260200161060f565b5050505090500160405260200180516040519392919084600160201b82111561064f57600080fd5b90830190602082018581111561066457600080fd5b82518660208202830111600160201b8211171561068057600080fd5b82525081516020918201928201910280838360005b838110156106ad578181015183820152602001610695565b5050505090500160405260200180516040519392919084600160201b8211156106d557600080fd5b9083019060208201858111156106ea57600080fd5b82518660208202830111600160201b8211171561070657600080fd5b82525081516020918201928201910280838360005b8381101561073357818101518382015260200161071b565b5050505090500160405260200180516040519392919084600160201b82111561075b57600080fd5b90830190602082018581111561077057600080fd5b82518660208202830111600160201b8211171561078c57600080fd5b82525081516020918201928201910280838360005b838110156107b95781810151838201526020016107a1565b5050505090500160405250505050505090506000816000815181106107da57fe5b6020026020010151826001815181106107ef57fe5b60200260200101510390508463ffffffff168160060b8161080c57fe5b05935060008160060b12801561083657508463ffffffff168160060b8161082f57fe5b0760060b15155b1561084357600019909301925b50505092915050565b60008061085886610a03565b90506001600160801b036001600160a01b038216116108c7576001600160a01b03808216800290848116908616106108a7576108a2600160c01b876001600160801b031683610d27565b6108bf565b6108bf81876001600160801b0316600160c01b610d27565b92505061093a565b60006108e66001600160a01b0383168068010000000000000000610d27565b9050836001600160a01b0316856001600160a01b03161061091e57610919600160801b876001600160801b031683610d27565b610936565b61093681876001600160801b0316600160801b610d27565b9250505b50949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006109715750806109fe565b60007f000000000000000000000000000000000000000000000000000000000000000013156109c657507f0000000000000000000000000000000000000000000000000000000000000000600a0a81026109fe565b6109ef7f0000000000000000000000000000000000000000000000000000000000000000610dbe565b600a0a82816109fa57fe5b0490505b919050565b6000600282810b60171d90818418829003900b620d89e8811115610a52576040805162461bcd60e51b81526020600482015260016024820152601560fa1b604482015290519081900360640190fd5b600060018216610a6657600160801b610a78565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615610aac576ffff97272373d413259a46990580e213a0260801c5b6004821615610acb576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615610aea576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615610b09576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615610b28576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615610b47576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615610b66576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615610b86576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615610ba6576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615610bc6576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615610be6576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615610c06576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615610c26576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615610c46576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615610c66576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615610c87576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615610ca7576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615610cc6576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615610ce3576b048a170391f7dc42444e8fa20260801c5b60008560020b1315610cfe578060001981610cfa57fe5b0490505b600160201b810615610d11576001610d14565b60005b60ff16602082901c019350505050919050565b60008383028160001985870982811083820303915050808411610d4957600080fd5b80610d5957508290049050610db7565b8385870960008581038616958690049560026003880281188089028203028089028203028089028203028089028203028089028203028089029091030291819003819004600101858411909403939093029190930391909104170290505b9392505050565b600080821215610dd15781600003610dd3565b815b509091905056fea264697066735822122065e91c94f9b02a076f16bb4a50135239458fd07eed2c5c00ca13aac40447e39c64736f6c63430007060033a26469706673582212200bc6c17ffe439e2a14cadc91258bf14f3cfd7a1c0b23155e8ea2f156ebeddfca64736f6c63430007060033", + "nonce": "0x27", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x813cc9eef5477b89fbba92f06509d9b1f5b45baa4918e7853b31c6f9e090ee20", + "transactionType": "CREATE", + "contractName": "ChainlinkRelayerFactory", + "contractAddress": "0x06C32500489C28Bd57c551afd8311Fef20bFaBB5", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0xf78da2a37049627636546e0cfaab2ad664950917", + "gas": "0x2a24c6", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b503361001b81610021565b5061017b565b61002a816100c8565b15610070576040805162461bcd60e51b8152602060048201526011602482015270105b1c9958591e505d5d1a1bdc9a5e9959607a1b604482015290519081900360640190fd5b6100888160006100e860201b6106411790919060201c565b50604080516001600160a01b038316815290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029181900360200190a150565b60006100e282600061010460201b61065f1790919060201c565b92915050565b60006100fd836001600160a01b038416610119565b9392505050565b60006100fd836001600160a01b038416610163565b60006101258383610163565b61015b575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556100e2565b5060006100e2565b60009081526001919091016020526040902054151590565b611df88061018a6000396000f3fe60806040523480156200001157600080fd5b5060043610620000ac5760003560e01c806376815bc9116200006f57806376815bc914620001ff57806394f3f81d146200021f578063a3df71b21462000248578063abe2c52a1462000264578063fdcfc506146200028457620000ac565b80630e880baf14620000b157806324ba588414620000fc578063251ad9a514620001395780632e391876146200017857806335b2815314620001d4575b600080fd5b620000e060048036036040811015620000c957600080fd5b506001600160a01b0381351690602001356200028e565b604080516001600160a01b039092168252519081900360200190f35b62000125600480360360208110156200011457600080fd5b50356001600160a01b03166200039e565b604080519115158252519081900360200190f35b620000e0600480360360808110156200015157600080fd5b506001600160a01b03813581169160208101359091169060408101359060600135620003b1565b62000182620004f1565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015620001c0578181015183820152602001620001a6565b505050509050019250505060405180910390f35b620001fd60048036036020811015620001ec57600080fd5b50356001600160a01b03166200054e565b005b620000e0600480360360208110156200021757600080fd5b5035620005a8565b620001fd600480360360208110156200023757600080fd5b50356001600160a01b0316620005c3565b620002526200061a565b60408051918252519081900360200190f35b620000e0600480360360208110156200027c57600080fd5b503562000620565b620002526200063b565b60006200029b3362000676565b620002dc576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b8282604051620002ec9062000901565b6001600160a01b0390921682526020820152604080519182900301906000f0801580156200031e573d6000803e3d6000fd5b50600280546001019081905560009081526004602090815260409182902080546001600160a01b0319166001600160a01b0385811691821790925583519188168252918101869052825193945090927fe4c825eca1b3bffc8243945a2adb32b3c8c6f7282e3f6f8fbf3aa79b052d9808929181900390910190a292915050565b6000620003ab8262000676565b92915050565b6000620003be3362000676565b620003ff576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b8484848460405162000411906200090f565b80856001600160a01b03168152602001846001600160a01b03168152602001838152602001828152602001945050505050604051809103906000f0801580156200045f573d6000803e3d6000fd5b50600380546001019081905560009081526005602090815260409182902080546001600160a01b038086166001600160a01b0319909216821790925583518a8316815291891692820192909252808301879052606081018690529151929350917f0f0fa6a05d67e6ad94030181d592a7b8ea973c037ae286a024178f5f3240dab69181900360800190a2949350505050565b60008054604080516020808402820181019092528281526060939290918391908301828280156200054257602002820191906000526020600020905b8154815260200190600101908083116200052d575b50939550505050505090565b620005593362000676565b6200059a576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b620005a58162000684565b50565b6005602052600090815260409020546001600160a01b031681565b620005ce3362000676565b6200060f576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b620005a58162000723565b60025481565b6004602052600090815260409020546001600160a01b031681565b60035481565b600062000658836001600160a01b038416620007bd565b9392505050565b600062000658836001600160a01b0384166200080c565b6000620003ab81836200065f565b6200068f8162000676565b15620006d6576040805162461bcd60e51b8152602060048201526011602482015270105b1c9958591e505d5d1a1bdc9a5e9959607a1b604482015290519081900360640190fd5b620006e360008262000641565b50604080516001600160a01b038316815290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029181900360200190a150565b6200072e8162000676565b62000770576040805162461bcd60e51b815260206004820152600d60248201526c139bdd105d5d1a1bdc9a5e9959609a1b604482015290519081900360640190fd5b6200077d60008262000824565b50604080516001600160a01b038316815290517f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b9039181900360200190a150565b6000620007cb83836200080c565b6200080357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620003ab565b506000620003ab565b60009081526001919091016020526040902054151590565b600062000658836001600160a01b03841660008181526001830160205260408120548015620008f657835460001980830191908101906000908790839081106200086a57fe5b90600052602060002001549050808760000184815481106200088857fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080620008b957fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050620003ab565b6000915050620003ab565b6108e5806200091e83390190565b610bc080620012038339019056fe60c060405234801561001057600080fd5b506040516108e53803806108e58339818101604052604081101561003357600080fd5b50805160209091015181816001600160a01b03821661005157600080fd5b8061005b57600080fd5b6080819052600080546001600160a01b0319166001600160a01b0384811691909117918290556040805163313ce56760e01b81529051929091169163313ce56791600480820192602092909190829003018186803b1580156100bc57600080fd5b505afa1580156100d0573d6000803e3d6000fd5b505050506040513d60208110156100e657600080fd5b505160ff1660120360a0526000805460408051633942720b60e11b815290516001600160a01b0390921692637284e41692600480840193829003018186803b15801561013157600080fd5b505afa158015610145573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561016e57600080fd5b810190808051604051939291908464010000000082111561018e57600080fd5b9083019060208201858111156101a357600080fd5b82516401000000008111828201881017156101bd57600080fd5b82525081516020918201929091019080838360005b838110156101ea5781810151838201526020016101d2565b50505050905090810190601f1680156102175780820380516001836020036101000a031916815260200191505b506040525050815161023092600192506020019061024d565b5050600280546001600160a01b03191633179055506102ee915050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928261028357600085556102c9565b82601f1061029c57805160ff19168380011785556102c9565b828001600101855582156102c9579182015b828111156102c95782518255916020019190600101906102ae565b506102d59291506102d9565b5090565b5b808211156102d557600081556001016102da565b60805160a0516105bb61032a60003980610178528061046a528061049852806104c052806104ee525080610344528061053d52506105bb6000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80635bdddcd01161005b5780635bdddcd0146100c55780637dbdf1f5146100cd57806395d89b41146100f1578063c45a01551461016e5761007d565b8063059f8b16146100825780634fd0ada81461009c57806357de26a4146100bd575b600080fd5b61008a610176565b60408051918252519081900360200190f35b6100a461019a565b6040805192835290151560208301528051918290030190f35b61008a61024e565b61008a610342565b6100d5610366565b604080516001600160a01b039092168252519081900360200190f35b6100f9610375565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561013357818101518382015260200161011b565b50505050905090810190601f1680156101605780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100d5610402565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060008060008054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156101ec57600080fd5b505afa158015610200573d6000803e3d6000fd5b505050506040513d60a081101561021657600080fd5b506020810151606090910151909250905061023082610411565b9350600082138015610246575061024681610526565b925050509091565b60008060008060009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156102a057600080fd5b505afa1580156102b4573d6000803e3d6000fd5b505050506040513d60a08110156102ca57600080fd5b506020810151606090910151909250905081158015906102ee57506102ee81610526565b610332576040805162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59141c9a58d95199595960821b604482015290519081900360640190fd5b61033b82610411565b9250505090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031681565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103fa5780601f106103cf576101008083540402835291602001916103fa565b820191906000526020600020905b8154815290600101906020018083116103dd57829003601f168201915b505050505081565b6002546001600160a01b031681565b600080821215610468576040805162461bcd60e51b815260206004820181905260248201527f4e656761746976652070726963652076616c7565206e6f7420616c6c6f776564604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000000000610494575080610521565b60007f000000000000000000000000000000000000000000000000000000000000000013156104e957507f0000000000000000000000000000000000000000000000000000000000000000600a0a8102610521565b6105127f0000000000000000000000000000000000000000000000000000000000000000610569565b600a0a828161051d57fe5b0490505b919050565b6000428083111561053b576000915050610521565b7f00000000000000000000000000000000000000000000000000000000000000008382031115915050919050565b60008082121561057c578160000361057e565b815b509091905056fea264697066735822122017aab045d68078cbe43f4a00ea18c8eb7b8cefc31a28865abdf0c613d01ffc1264736f6c634300070600336101006040523480156200001257600080fd5b5060405162000bc038038062000bc0833981810160405260808110156200003857600080fd5b508051602082015160408301516060909301519192909183838383828185846001600160a01b0382166200006b57600080fd5b806200007657600080fd5b6080819052600080546001600160a01b0319166001600160a01b0384811691909117918290556040805163313ce56760e01b81529051929091169163313ce56791600480820192602092909190829003018186803b158015620000d857600080fd5b505afa158015620000ed573d6000803e3d6000fd5b505050506040513d60208110156200010457600080fd5b505160ff1660120360a0526000805460408051633942720b60e11b815290516001600160a01b0390921692637284e41692600480840193829003018186803b1580156200015057600080fd5b505afa15801562000165573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200018f57600080fd5b8101908080516040519392919084640100000000821115620001b057600080fd5b908301906020820185811115620001c657600080fd5b8251640100000000811182820188101715620001e157600080fd5b82525081516020918201929091019080838360005b8381101562000210578181015183820152602001620001f6565b50505050905090810190601f1680156200023e5780820380516001836020036101000a031916815260200191505b506040525050815162000259926001925060200190620002b4565b5050506001600160a01b0382166200027057600080fd5b806200027b57600080fd5b60609190911b6001600160601b03191660e05260c052505060028054336001600160a01b03199091161790555062000360945050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620002ec576000855562000337565b82601f106200030757805160ff191683800117855562000337565b8280016001018555821562000337579182015b82811115620003375782518255916020019190600101906200031a565b506200034592915062000349565b5090565b5b808211156200034557600081556001016200034a565b60805160a05160c05160e05160601c610804620003bc600039806101f252806104905250806102db528061045d5250806101c552806106b352806106e15280610709528061073752508061039d528061078652506108046000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80637dbdf1f5116100665780637dbdf1f51461010a57806395d89b411461012e578063c1a287e2146101ab578063c45a0155146101b3578063c5980182146101bb5761009e565b8063059f8b16146100a35780632b574356146100bd5780634fd0ada8146100d957806357de26a4146100fa5780635bdddcd014610102575b600080fd5b6100ab6101c3565b60408051918252519081900360200190f35b6100c56101e7565b604080519115158252519081900360200190f35b6100e161031e565b6040805192835290151560208301528051918290030190f35b6100ab610343565b6100ab61039b565b6101126103bf565b604080516001600160a01b039092168252519081900360200190f35b6101366103ce565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610170578181015183820152602001610158565b50505050905090810190601f16801561019d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6100ab61045b565b61011261047f565b61011261048e565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561024957600080fd5b505afa15801561025d573d6000803e3d6000fd5b505050506040513d60a081101561027357600080fd5b50805160208201516040830151606084015160809094015192985090965094509092509050848110156102ae5760009550505050505061031b565b83156102c25760009550505050505061031b565b816102d55760009550505050505061031b565b428390037f0000000000000000000000000000000000000000000000000000000000000000811015610310576000965050505050505061031b565b600196505050505050505b90565b6000806103296104b2565b9092509050801561033f5761033c6101e7565b90505b9091565b600061034d6101e7565b61038e576040805162461bcd60e51b815260206004820152600d60248201526c29b2b8bab2b731b2b92237bbb760991b604482015290519081900360640190fd5b610396610566565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b031681565b60018054604080516020600284861615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104535780601f1061042857610100808354040283529160200191610453565b820191906000526020600020905b81548152906001019060200180831161043657829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6002546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060008060008054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b15801561050457600080fd5b505afa158015610518573d6000803e3d6000fd5b505050506040513d60a081101561052e57600080fd5b50602081015160609091015190925090506105488261065a565b935060008213801561055e575061055e8161076f565b925050509091565b60008060008060009054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156105b857600080fd5b505afa1580156105cc573d6000803e3d6000fd5b505050506040513d60a08110156105e257600080fd5b5060208101516060909101519092509050811580159061060657506106068161076f565b61064a576040805162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59141c9a58d95199595960821b604482015290519081900360640190fd5b6106538261065a565b9250505090565b6000808212156106b1576040805162461bcd60e51b815260206004820181905260248201527f4e656761746976652070726963652076616c7565206e6f7420616c6c6f776564604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006106dd57508061076a565b60007f0000000000000000000000000000000000000000000000000000000000000000131561073257507f0000000000000000000000000000000000000000000000000000000000000000600a0a810261076a565b61075b7f00000000000000000000000000000000000000000000000000000000000000006107b2565b600a0a828161076657fe5b0490505b919050565b6000428083111561078457600091505061076a565b7f00000000000000000000000000000000000000000000000000000000000000008382031115915050919050565b6000808212156107c557816000036107c7565b815b509091905056fea2646970667358221220d3c4e325a694575cbb040bfbdda30c7f70880e45fb7032f377a2e4e59f15c1b764736f6c63430007060033a2646970667358221220b4652d288e69e412d41d04d81bb9f9f078cb558674b83f181e7c1a58ccb489f864736f6c63430007060033", + "nonce": "0x28", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xd0e909dcb8af672f3ac8360d46592dcf8edfada88825a0ee1cff434cd996ff81", + "transactionType": "CREATE", + "contractName": "DenominatedOracleFactory", + "contractAddress": "0xBF760b23d2ef3615cec549F22b95a34DB0F8f5CD", + "function": null, + "arguments": null, + "transaction": { + "type": "0x02", + "from": "0xf78da2a37049627636546e0cfaab2ad664950917", + "gas": "0x20517a", + "value": "0x0", + "data": "0x608060405234801561001057600080fd5b503361001b81610021565b5061017b565b61002a816100c8565b15610070576040805162461bcd60e51b8152602060048201526011602482015270105b1c9958591e505d5d1a1bdc9a5e9959607a1b604482015290519081900360640190fd5b6100888160006100e860201b6104821790919060201c565b50604080516001600160a01b038316815290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029181900360200190a150565b60006100e282600061010460201b6104a01790919060201c565b92915050565b60006100fd836001600160a01b038416610119565b9392505050565b60006100fd836001600160a01b038416610163565b60006101258383610163565b61015b575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556100e2565b5060006100e2565b60009081526001919091016020526040902054151590565b6116198061018a6000396000f3fe60806040523480156200001157600080fd5b5060043610620000885760003560e01c806335b28153116200006357806335b2815314620001425780634736619b146200016d57806394f3f81d14620001a9578063c361d27014620001d25762000088565b80632121778d146200008d57806324ba588414620000a95780632e39187614620000e6575b600080fd5b620000976200020d565b60408051918252519081900360200190f35b620000d260048036036020811015620000c157600080fd5b50356001600160a01b031662000213565b604080519115158252519081900360200190f35b620000f062000226565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156200012e57818101518382015260200162000114565b505050509050019250505060405180910390f35b6200016b600480360360208110156200015a57600080fd5b50356001600160a01b031662000283565b005b6200018d600480360360208110156200018557600080fd5b5035620002dd565b604080516001600160a01b039092168252519081900360200190f35b6200016b60048036036020811015620001c157600080fd5b50356001600160a01b0316620002f8565b6200018d60048036036060811015620001ea57600080fd5b506001600160a01b0381358116916020810135909116906040013515156200034f565b60025481565b60006200022082620004b7565b92915050565b60008054604080516020808402820181019092528281526060939290918391908301828280156200027757602002820191906000526020600020905b81548152602001906001019080831162000262575b50939550505050505090565b6200028e33620004b7565b620002cf576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b620002da81620004c5565b50565b6003602052600090815260409020546001600160a01b031681565b6200030333620004b7565b62000344576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b620002da8162000564565b60006200035c33620004b7565b6200039d576040805162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b604482015290519081900360640190fd5b838383604051620003ae9062000742565b80846001600160a01b03168152602001836001600160a01b0316815260200182151581526020019350505050604051809103906000f080158015620003f7573d6000803e3d6000fd5b50600280546001019081905560009081526003602090815260409182902080546001600160a01b038086166001600160a01b031990921682179092558351898316815291881692820192909252851515818401529151929350917f55291a17f5d704dcd502dee45b56ae143341f856be5dc48a5344ff8d548322969181900360600190a29392505050565b600062000499836001600160a01b038416620005fe565b9392505050565b600062000499836001600160a01b0384166200064d565b6000620002208183620004a0565b620004d081620004b7565b1562000517576040805162461bcd60e51b8152602060048201526011602482015270105b1c9958591e505d5d1a1bdc9a5e9959607a1b604482015290519081900360640190fd5b6200052460008262000482565b50604080516001600160a01b038316815290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029181900360200190a150565b6200056f81620004b7565b620005b1576040805162461bcd60e51b815260206004820152600d60248201526c139bdd105d5d1a1bdc9a5e9959609a1b604482015290519081900360640190fd5b620005be60008262000665565b50604080516001600160a01b038316815290517f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b9039181900360200190a150565b60006200060c83836200064d565b620006445750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000220565b50600062000220565b60009081526001919091016020526040902054151590565b600062000499836001600160a01b03841660008181526001830160205260408120548015620007375783546000198083019190810190600090879083908110620006ab57fe5b9060005260206000200154905080876000018481548110620006c957fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080620006fa57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505062000220565b600091505062000220565b610e9380620007518339019056fe60a06040523480156200001157600080fd5b5060405162000e9338038062000e93833981810160405260608110156200003757600080fd5b50805160208201516040909201519091908282826001600160a01b0383166200005f57600080fd5b6001600160a01b0382166200007357600080fd5b600080546001600160a01b038086166001600160a01b03199283161790925560018054928516929091169190911790558015801560f81b608052620004155760008054604080516395d89b4160e01b815290516001600160a01b03909216926395d89b4192600480840193829003018186803b158015620000f357600080fd5b505afa15801562000108573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200013257600080fd5b81019080805160405193929190846401000000008211156200015357600080fd5b9083019060208201858111156200016957600080fd5b82516401000000008111828201881017156200018457600080fd5b82525081516020918201929091019080838360005b83811015620001b357818101518382015260200162000199565b50505050905090810190601f168015620001e15780820380516001836020036101000a031916815260200191505b5060408181526001546395d89b4160e01b835290516001600160a01b0390911694506395d89b41935060048083019350600092829003018186803b1580156200022957600080fd5b505afa1580156200023e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200026857600080fd5b81019080805160405193929190846401000000008211156200028957600080fd5b9083019060208201858111156200029f57600080fd5b8251640100000000811182820188101715620002ba57600080fd5b82525081516020918201929091019080838360005b83811015620002e9578181015183820152602001620002cf565b50505050905090810190601f168015620003175780820380516001836020036101000a031916815260200191505b506040525050506040516020018080600560fb1b81525060010183805190602001908083835b602083106200035e5780518252601f1990920191602091820191016200033d565b51815160209384036101000a600019018019909216911617905267052bc5a62405e40560c31b919093019081528451600890910192850191508083835b60208310620003bc5780518252601f1990920191602091820191016200039b565b51815160209384036101000a6000190180199092169116179052602960f81b9190930190815260408051808303601e190181526001909201905280516200040e965060029550920192506200078f9050565b5062000770565b60008054604080516395d89b4160e01b815290516001600160a01b03909216926395d89b4192600480840193829003018186803b1580156200045657600080fd5b505afa1580156200046b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200049557600080fd5b8101908080516040519392919084640100000000821115620004b657600080fd5b908301906020820185811115620004cc57600080fd5b8251640100000000811182820188101715620004e757600080fd5b82525081516020918201929091019080838360005b8381101562000516578181015183820152602001620004fc565b50505050905090810190601f168015620005445780820380516001836020036101000a031916815260200191505b5060408181526001546395d89b4160e01b835290516001600160a01b0390911694506395d89b41935060048083019350600092829003018186803b1580156200058c57600080fd5b505afa158015620005a1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015620005cb57600080fd5b8101908080516040519392919084640100000000821115620005ec57600080fd5b9083019060208201858111156200060257600080fd5b82516401000000008111828201881017156200061d57600080fd5b82525081516020918201929091019080838360005b838110156200064c57818101518382015260200162000632565b50505050905090810190601f1680156200067a5780820380516001836020036101000a031916815260200191505b506040525050506040516020018080600560fb1b81525060010183805190602001908083835b60208310620006c15780518252601f199092019160209182019101620006a0565b51815160209384036101000a600019018019909216911617905264052405440560db1b919093019081528451600590910192850191508083835b602083106200071c5780518252601f199092019160209182019101620006fb565b51815160209384036101000a6000190180199092169116179052602960f81b9190930190815260408051808303601e190181526001909201905280516200076e965060029550920192506200078f9050565b505b5050600380546001600160a01b03191633179055506200083b92505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620007c7576000855562000812565b82601f10620007e257805160ff191683800117855562000812565b8280016001018555821562000812579182015b8281111562000812578251825591602001919060010190620007f5565b506200082092915062000824565b5090565b5b8082111562000820576000815560010162000825565b60805160f81c61063062000863600039806102a3528061040d528061054752506106306000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806395d89b411161005b57806395d89b41146100e1578063bf8c7df51461015e578063c45a015514610166578063d5647f0d1461016e5761007d565b806320531bc9146100825780634fd0ada8146100a657806357de26a4146100c7575b600080fd5b61008a61018a565b604080516001600160a01b039092168252519081900360200190f35b6100ae610199565b6040805192835290151560208301528051918290030190f35b6100cf610321565b60408051918252519081900360200190f35b6100e961049c565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561012357818101518382015260200161010b565b50505050905090810190601f1680156101505780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61008a610527565b61008a610536565b610176610545565b604080519115158252519081900360200190f35b6000546001600160a01b031681565b60008060008060008054906101000a90046001600160a01b03166001600160a01b0316634fd0ada86040518163ffffffff1660e01b8152600401604080518083038186803b1580156101ea57600080fd5b505afa1580156101fe573d6000803e3d6000fd5b505050506040513d604081101561021457600080fd5b508051602090910151600154604080516309fa15b560e31b8152815194965092945060009384936001600160a01b0390931692634fd0ada8926004808301939192829003018186803b15801561026957600080fd5b505afa15801561027d573d6000803e3d6000fd5b505050506040513d604081101561029357600080fd5b50805160209091015190925090507f0000000000000000000000000000000000000000000000000000000000000000156102ff57836102dc57600080955095505050505061031d565b6102f8846102f2670de0b6b3a764000085610569565b906105dd565b955061030c565b6103098483610569565b95505b8280156103165750805b9450505050505b9091565b60008054604080516315f789a960e21b8152905183926001600160a01b0316916357de26a4916004808301926020929190829003018186803b15801561036657600080fd5b505afa15801561037a573d6000803e3d6000fd5b505050506040513d602081101561039057600080fd5b5051600154604080516315f789a960e21b815290519293506000926001600160a01b03909216916357de26a491600480820192602092909190829003018186803b1580156103dd57600080fd5b505afa1580156103f1573d6000803e3d6000fd5b505050506040513d602081101561040757600080fd5b505190507f00000000000000000000000000000000000000000000000000000000000000001561048b5781610476576040805162461bcd60e51b815260206004820152601060248201526f125b9d985b1a59141c9a58d95199595960821b604482015290519081900360640190fd5b610488670de0b6b3a7640000836105dd565b91505b6104958282610569565b9250505090565b6002805460408051602060018416156101000260001901909316849004601f8101849004840282018401909252818152929183018282801561051f5780601f106104f45761010080835404028352916020019161051f565b820191906000526020600020905b81548152906001019060200180831161050257829003601f168201915b505050505081565b6001546001600160a01b031681565b6003546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008282028284828161057857fe5b04146105cb576040805162461bcd60e51b815260206004820152601c60248201527f776d756c206f766572666c6f77206572726f7220646574656374656400000000604482015290519081900360640190fd5b670de0b6b3a764000090049392505050565b600081670de0b6b3a76400008402816105f257fe5b04939250505056fea2646970667358221220b51ef5f600dbafc357dd8202e8528867858a3410c9423afa769502a6fba9561864736f6c63430007060033a2646970667358221220e625bdd08349c29e25e7b9f9ca281872d8d0b7fe4b222abb41fb78cb38ecb2cf64736f6c63430007060033", + "nonce": "0x29", + "accessList": [] + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "transactionHash": "0x4943981f3102b6c8c13043326702437bc3fa6310bc0168a674312b6278b28772", + "transactionIndex": "0x6", + "blockHash": "0x8ebb29cf241672a787de08157c2c87eba86777b91d97697939e8c22deede870b", + "blockNumber": "0xc21441f", + "from": "0xF78dA2A37049627636546E0cFAaB2aD664950917", + "to": null, + "cumulativeGasUsed": "0x5eac07", + "gasUsed": "0x2031e4", + "contractAddress": "0x36645830479170265A154Acb726780fdaE41A28F", + "logs": [ + { + "address": "0x36645830479170265A154Acb726780fdaE41A28F", + "topics": [ + "0x599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f7000102" + ], + "data": "0x000000000000000000000000f78da2a37049627636546e0cfaab2ad664950917", + "blockHash": "0x8ebb29cf241672a787de08157c2c87eba86777b91d97697939e8c22deede870b", + "blockNumber": "0xc21441f", + "transactionHash": "0x4943981f3102b6c8c13043326702437bc3fa6310bc0168a674312b6278b28772", + "transactionIndex": "0x6", + "logIndex": "0x2c", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x989680" + }, + { + "transactionHash": "0x813cc9eef5477b89fbba92f06509d9b1f5b45baa4918e7853b31c6f9e090ee20", + "transactionIndex": "0x2", + "blockHash": "0x6f3acff39298afdf516cfe13ddf37f784699f73c1712842d6e7ac1073b22d646", + "blockNumber": "0xc21443e", + "from": "0xF78dA2A37049627636546E0cFAaB2aD664950917", + "to": null, + "cumulativeGasUsed": "0x22b843", + "gasUsed": "0x1fdeed", + "contractAddress": "0x06C32500489C28Bd57c551afd8311Fef20bFaBB5", + "logs": [ + { + "address": "0x06C32500489C28Bd57c551afd8311Fef20bFaBB5", + "topics": [ + "0x599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f7000102" + ], + "data": "0x000000000000000000000000f78da2a37049627636546e0cfaab2ad664950917", + "blockHash": "0x6f3acff39298afdf516cfe13ddf37f784699f73c1712842d6e7ac1073b22d646", + "blockNumber": "0xc21443e", + "transactionHash": "0x813cc9eef5477b89fbba92f06509d9b1f5b45baa4918e7853b31c6f9e090ee20", + "transactionIndex": "0x2", + "logIndex": "0x2", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000100000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x989680" + }, + { + "transactionHash": "0xd0e909dcb8af672f3ac8360d46592dcf8edfada88825a0ee1cff434cd996ff81", + "transactionIndex": "0x12", + "blockHash": "0x3e7b830896d5e86b3fdc0272687bce18e4f2e45afb87cbe636ce522c077888e8", + "blockNumber": "0xc21445d", + "from": "0xF78dA2A37049627636546E0cFAaB2aD664950917", + "to": null, + "cumulativeGasUsed": "0x405ebe", + "gasUsed": "0x18630c", + "contractAddress": "0xBF760b23d2ef3615cec549F22b95a34DB0F8f5CD", + "logs": [ + { + "address": "0xBF760b23d2ef3615cec549F22b95a34DB0F8f5CD", + "topics": [ + "0x599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f7000102" + ], + "data": "0x000000000000000000000000f78da2a37049627636546e0cfaab2ad664950917", + "blockHash": "0x3e7b830896d5e86b3fdc0272687bce18e4f2e45afb87cbe636ce522c077888e8", + "blockNumber": "0xc21445d", + "transactionHash": "0xd0e909dcb8af672f3ac8360d46592dcf8edfada88825a0ee1cff434cd996ff81", + "transactionIndex": "0x12", + "logIndex": "0x22", + "removed": false + } + ], + "status": "0x1", + "logsBloom": "0x00000000000000000000000000040000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "effectiveGasPrice": "0x989680" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1713751165, + "chain": 42161, + "multi": false, + "commit": "6fa9037" +} \ No newline at end of file diff --git a/script/predeployment/DeployFactories.s.sol b/script/predeployment/DeployFactories.s.sol index 7f62133..5628bda 100644 --- a/script/predeployment/DeployFactories.s.sol +++ b/script/predeployment/DeployFactories.s.sol @@ -24,9 +24,9 @@ contract DeployFactoriesMain is Script { _chainlinkRelayerFactory = new ChainlinkRelayerFactory(); _denominatedOracleFactory = new DenominatedOracleFactory(); - _camelotRelayerFactory.addAuthorization(MAINNET_DEPLOYER); - _chainlinkRelayerFactory.addAuthorization(MAINNET_DEPLOYER); - _denominatedOracleFactory.addAuthorization(MAINNET_DEPLOYER); + //_camelotRelayerFactory.addAuthorization(MAINNET_DEPLOYER); + //_chainlinkRelayerFactory.addAuthorization(MAINNET_DEPLOYER); + //_denominatedOracleFactory.addAuthorization(MAINNET_DEPLOYER); vm.stopBroadcast(); } } diff --git a/script/predeployment/DeployRelayers.s.sol b/script/predeployment/DeployRelayers.s.sol index 999c98b..208addb 100644 --- a/script/predeployment/DeployRelayers.s.sol +++ b/script/predeployment/DeployRelayers.s.sol @@ -132,3 +132,19 @@ contract DeployEzEthUSDPriceFeed is CommonMainnet { vm.stopBroadcast(); } } + +// BROADCAST +// source .env && forge script DeployArbUsdChainlinkRelayerMainnet --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY + +// SIMULATE +// source .env && forge script DeployArbUsdChainlinkRelayerMainnet --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC + +contract DeployArbUsdChainlinkRelayerMainnet is CommonMainnet { + IAlgebraFactory public algebraFactory = IAlgebraFactory(MAINNET_ALGEBRA_FACTORY); + + function run() public { + vm.startBroadcast(vm.envUint('ARB_MAINNET_DEPLOYER_PK')); + chainlinkRelayerFactory.deployChainlinkRelayer(MAINNET_CHAINLINK_ARB_USD_FEED, MAINNET_ORACLE_DELAY); + vm.stopBroadcast(); + } +} From d6d772adb5dc86dd4c08296ca50ba8162ba1c0be Mon Sep 17 00:00:00 2001 From: Patrick Gallagher Date: Thu, 25 Jul 2024 21:25:08 -0700 Subject: [PATCH 12/12] Deploy OD / USD Oracle (#83) * Add DeployCamelotOdUsdOracle * Fix quote period and redeploy OD and ODG oracles --- script/DeployOracle.s.sol | 57 ++++++++++++++++++++++++++++++++++++--- script/Registry.s.sol | 8 ++++-- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/script/DeployOracle.s.sol b/script/DeployOracle.s.sol index 8e610ef..460f7b2 100644 --- a/script/DeployOracle.s.sol +++ b/script/DeployOracle.s.sol @@ -6,9 +6,6 @@ import {Script} from 'forge-std/Script.sol'; import {CommonMainnet} from '@script/Common.s.sol'; import 'forge-std/console2.sol'; -import {CamelotRelayerFactory} from '@contracts/factories/CamelotRelayerFactory.sol'; -import {ChainlinkRelayerFactory} from '@contracts/factories/ChainlinkRelayerFactory.sol'; -import {DenominatedOracleFactory} from '@contracts/factories/DenominatedOracleFactory.sol'; import {IBaseOracle} from '@interfaces/oracles/IBaseOracle.sol'; // BROADCAST @@ -116,3 +113,57 @@ contract DeployWstethRethL2ValidityOracles is Script, CommonMainnet { vm.stopBroadcast(); } } + +// BROADCAST +// source .env && forge script DeployCamelotOdUsdOracle --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY --sender $DEFAULT_KEY_PUBLIC_ADDRESS --account defaultKey + +// SIMULATE +// source .env && forge script DeployCamelotOdUsdOracle --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --sender $DEFAULT_KEY_PUBLIC_ADDRESS + +contract DeployCamelotOdUsdOracle is Script, CommonMainnet { + IBaseOracle public _odEthCamelotRelayer; + IBaseOracle public _odUsdOracle; + + function run() public { + vm.startBroadcast(); + + _odEthCamelotRelayer = camelotRelayerFactory.deployAlgebraRelayer( + MAINNET_ALGEBRA_FACTORY, MAINNET_SYSTEM_COIN, MAINNET_WETH, uint32(MAINNET_CAMELOT_QUOTE_PERIOD) + ); + + _odUsdOracle = denominatedOracleFactory.deployDenominatedOracle( + _odEthCamelotRelayer, IBaseOracle(MAINNET_CHAINLINK_L2VALIDITY_ETH_USD_RELAYER), false + ); + + _odUsdOracle.getResultWithValidity(); + + vm.stopBroadcast(); + } +} + +// BROADCAST +// source .env && forge script DeployCamelotOdgUsdOracle --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --broadcast --verify --etherscan-api-key $ARB_ETHERSCAN_API_KEY --sender $DEFAULT_KEY_PUBLIC_ADDRESS --account defaultKey + +// SIMULATE +// source .env && forge script DeployCamelotOdgUsdOracle --with-gas-price 2000000000 -vvvvv --rpc-url $ARB_MAINNET_RPC --sender $DEFAULT_KEY_PUBLIC_ADDRESS + +contract DeployCamelotOdgUsdOracle is Script, CommonMainnet { + IBaseOracle public _odgEthCamelotRelayer; + IBaseOracle public _odgUsdOracle; + + function run() public { + vm.startBroadcast(); + + _odgEthCamelotRelayer = camelotRelayerFactory.deployAlgebraRelayer( + MAINNET_ALGEBRA_FACTORY, MAINNET_PROTOCOL_TOKEN, MAINNET_WETH, uint32(MAINNET_CAMELOT_QUOTE_PERIOD) + ); + + _odgUsdOracle = denominatedOracleFactory.deployDenominatedOracle( + _odgEthCamelotRelayer, IBaseOracle(MAINNET_CHAINLINK_L2VALIDITY_ETH_USD_RELAYER), false + ); + + _odgUsdOracle.getResultWithValidity(); + + vm.stopBroadcast(); + } +} diff --git a/script/Registry.s.sol b/script/Registry.s.sol index cb5fdf9..5c4011d 100644 --- a/script/Registry.s.sol +++ b/script/Registry.s.sol @@ -64,7 +64,9 @@ address constant SEPOLIA_ALGEBRA_FARM_CENTER = 0x04e4A5A4E4D2A5a0fb48ECde0bbD555 address constant MAINNET_DEPLOYER = 0xF78dA2A37049627636546E0cFAaB2aD664950917; uint256 constant MAINNET_ORACLE_DELAY = 1 hours; uint256 constant MAINNET_CHAINLINK_L2VALIDITY_GRACE_PERIOD = 1 hours; +uint256 constant MAINNET_CAMELOT_QUOTE_PERIOD = 1 hours; address constant MAINNET_PROTOCOL_TOKEN = 0x000D636bD52BFc1B3a699165Ef5aa340BEA8939c; +address constant MAINNET_SYSTEM_COIN = 0x221A0f68770658C15B525d0F89F5da2baAB5f321; address constant MAINNET_WETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; address constant ETH = 0x82aF49447D8a07e3bd95BD0d56f35241523fBab1; address constant ARB = 0x912CE59144191C1204E64559FE8253a0e49E6548; @@ -79,7 +81,8 @@ address constant MAINNET_DELAYED_ORACLE_FACTORY = 0x9Dd63fA54dEfd8820BCAb3e3cC39 ////////// RELAYERS ////////// // Camelot -address constant MAINNET_CAMELOT_ODG_WETH_RELAYER = 0xF7Ec9ad3192d4ec1E54d52B3E492B5B66AB02889; +address constant MAINNET_CAMELOT_ODG_WETH_RELAYER = 0x10ef7FEcf888Bc4B1F64757B77317946fFBc5873; +address constant MAINNET_CAMELOT_OD_WETH_RELAYER = 0x43261bFF12F8D26Ae3E3ef6924Eca6FA5c32f4b6; // Chainlink address constant MAINNET_CHAINLINK_ETH_USD_RELAYER = 0x3e6C1621f674da311E57646007fBfAd857084383; address constant MAINNET_CHAINLINK_L2VALIDITY_ETH_USD_RELAYER = 0x4617Feb8B72167c3b8253a1327CddE44e54670Ce; @@ -89,7 +92,8 @@ address constant MAINNET_CHAINLINK_L2VALIDITY_RETH_ETH_RELAYER = 0x77A15A5b9b7e1 address constant MAINNET_CHAINLINK_L2VALIDITY_WSTETH_ETH_RELAYER = 0x4dF7048DC8696832A146ac4Ba8f7a791f258916c; address constant MAINNET_CHAINLINK_ARB_USD_RELAYER = 0x2635f731BB6981E72F92A781578952450759F762; // Denominated -address constant MAINNET_DENOMINATED_ODG_USD_ORACLE = 0xE90E52eb676bc00DD85FAE83D2FAC22062F7f470; +address constant MAINNET_DENOMINATED_ODG_USD_ORACLE = 0x734B085f68Ee612A7e51927e7B070CddE948C510; +address constant MAINNET_DENOMINATED_OD_USD_ORACLE = 0x53BA82f08639F5D0ac7b61471A6CAc0B2FAb7372; address constant MAINNET_DENOMINATED_RETH_USD_ORACLE = 0xE0ac4511A617cBee55ECb62667B08DB6864B9d8e; address constant MAINNET_DENOMINATED_WSTETH_USD_ORACLE = 0x8746664d1E0F0e61275EF3B52A8a3b3dFC11CcAb; address constant MAINNET_DENOMINATED_L2VALIDITY_RETH_USD_ORACLE = 0x35843B3B7838eA15D0cAf2E61AD52C72b95b3Ca7;