diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 9d69542..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "solidity.compileUsingRemoteVersion": "latest" -} diff --git a/gov-input/mainnet/new-DeployChainlinkRelayer.json b/gov-input/mainnet/new-DeployChainlinkRelayer.json index 29d1200..6e32cc0 100644 --- a/gov-input/mainnet/new-DeployChainlinkRelayer.json +++ b/gov-input/mainnet/new-DeployChainlinkRelayer.json @@ -5,17 +5,27 @@ "proposalType": "DeployChainlinkRelayers", "ODGovernor_Address": "", "ChainlinkRelayerFactory_Address": "", + "ChainlinkSequencerFeed": "0xFdB631F5EE196F0ed6FAa767959853A9F217697D", "objectArray": [ { "symbol": "LINK/USD", - "chainlinkFeed": "0x86E53CF1B870786351Da77A57575e79CB55812CB", - "oracleInterval": "86400" + "chainlinkPriceFeed": "0x86E53CF1B870786351Da77A57575e79CB55812CB", + "staleThreshold": "86400", + "gracePeriod": "3600" }, { "symbol": "GRT/USD", - "chainlinkFeed": "0x0F38D86FceF4955B705F35c9e41d1A16e0637c73", - "oracleInterval": "86400" + "chainlinkPriceFeed": "0x0F38D86FceF4955B705F35c9e41d1A16e0637c73", + "staleThreshold": "86400", + "gracePeriod": "3600" + }, + { + "symbol": "ETH/USD", + "chainlinkPriceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "staleThreshold": "86400", + "gracePeriod": "3600" } ], - "arrayLength": "2" -} + "arrayLength": "3", + "PredictedRelayerAddresses": [] +} \ No newline at end of file diff --git a/gov-input/sepolia/new-DeployChainlinkRelayer.json b/gov-input/sepolia/new-DeployChainlinkRelayer.json index c8552bd..957845b 100644 --- a/gov-input/sepolia/new-DeployChainlinkRelayer.json +++ b/gov-input/sepolia/new-DeployChainlinkRelayer.json @@ -5,21 +5,25 @@ "proposalType": "DeployChainlinkRelayers", "ODGovernor_Address": "", "ChainlinkRelayerFactory_Address": "", + "ChainlinkSequencerFeed": "0xFdB631F5EE196F0ed6FAa767959853A9F217697D", "objectArray": [ { "symbol": "LINK/USD", "chainlinkPriceFeed": "0x86E53CF1B870786351Da77A57575e79CB55812CB", - "oracleInterval": "86400" + "staleThreshold": "86400", + "gracePeriod": "3600" }, { "symbol": "GRT/USD", "chainlinkPriceFeed": "0x0F38D86FceF4955B705F35c9e41d1A16e0637c73", - "oracleInterval": "86400" + "staleThreshold": "86400", + "gracePeriod": "3600" }, { "symbol": "ETH/USD", "chainlinkPriceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", - "oracleInterval": "86400" + "staleThreshold": "86400", + "gracePeriod": "3600" } ], "arrayLength": "3", diff --git a/gov-output/mainnet/add-collateral-34858172.json b/gov-output/mainnet/add-collateral-97290491.json similarity index 85% rename from gov-output/mainnet/add-collateral-34858172.json rename to gov-output/mainnet/add-collateral-97290491.json index 7cd7e09..3f8168a 100644 --- a/gov-output/mainnet/add-collateral-34858172.json +++ b/gov-output/mainnet/add-collateral-97290491.json @@ -35,9 +35,7 @@ "0x34463c60574554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000001aba4714957d300d0e549208b31adb1000000000000000000000000000000000000023084f676940b7915149bd08b30d000000000000", "0x34463c605745544800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000033b2e3ca65dca26e20d5eda", "0x34463c60574554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000293b702362918e990dd5f48a80fb139fead642630000000000000000000000000000000000000000000000000e92596fd6290000000000000000000000000022361d8afcc93343e962029a7edab2000000000000", - "0x34463c60574554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000562cce2f4dc383862dc6a926af10deff5fcd172f000000000000000000000000000000000000000003e09de2596099e2b0000000000000000000000000000000000000000000000003b741f8eafc93793e000000", - "0x35b2815300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000293b702362918e990dd5f48a80fb139fead64263", - "0xd94d420800000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000293b702362918e990dd5f48a80fb139fead64263" + "0x34463c60574554480000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000060000000000000000000000000562cce2f4dc383862dc6a926af10deff5fcd172f000000000000000000000000000000000000000003e09de2596099e2b0000000000000000000000000000000000000000000000003b741f8eafc93793e000000" ], "chainid": "42161", "description": "Add WETH collateral", @@ -45,7 +43,7 @@ "network": "mainnet", "newCollateralAddress": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", "newCollateralType": "WETH", - "proposalId": 34858172628765133262997362556758347679155114160723424965616922864986482020293, + "proposalId": 97290491579890362738323444422626923608004417491310716055050700511259453325225, "proposalType": "AddCollateral", "targets": [ "0xa83c0f1e9eD8E383919Dde0fC90744ae370EB7B3", @@ -53,9 +51,7 @@ "0xEff45E8e2353893BD0558bD5892A42786E9142F1", "0xc93F938A95488a03b976A15B20fAcFD52D087fB2", "0x17e546dDCE2EA8A74Bd667269457A2e80b309965", - "0x7404fc1F3796748FAE17011b57Fad9713185c1d6", - "0xEff45E8e2353893BD0558bD5892A42786E9142F1", - "0xEff45E8e2353893BD0558bD5892A42786E9142F1" + "0x7404fc1F3796748FAE17011b57Fad9713185c1d6" ], "values": [ 0, @@ -63,8 +59,6 @@ 0, 0, 0, - 0, - 0, 0 ] } \ No newline at end of file diff --git a/gov-output/sepolia/deploy-chainlink-relayer-61857469.json b/gov-output/sepolia/deploy-chainlink-relayer-61857469.json new file mode 100644 index 0000000..41f5197 --- /dev/null +++ b/gov-output/sepolia/deploy-chainlink-relayer-61857469.json @@ -0,0 +1,61 @@ +{ + "ChainlinkRelayerFactory_Address": "0x555691C860015a5CE8748296fbbAa624410F55A4", + "ChainlinkSequencerFeed": "0xFdB631F5EE196F0ed6FAa767959853A9F217697D", + "ODGovernor_Address": "0x69ae232E574352232aB8678869eAA3BEBd885211", + "PredictedRelayerAddresses": [ + { + "symbol": "LINK/USD", + "address": "0x3Dc02C28D29D6A4D13dE03E7c596a94c76f7600a" + }, + { + "symbol": "GRT/USD", + "address": "0xf589519a17bDC25749AFAcbC6BAFdd05BF5d24Af" + }, + { + "symbol": "ETH/USD", + "address": "0x33660aB6E38F6D8011Eca7AAa6F3CC7ef6380d91" + } + ], + "arrayLength": "3", + "calldatas": [ + "0x251ad9a500000000000000000000000086e53cf1b870786351da77a57575e79cb55812cb000000000000000000000000fdb631f5ee196f0ed6faa767959853a9f217697d00000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000e10", + "0x251ad9a50000000000000000000000000f38d86fcef4955b705f35c9e41d1a16e0637c73000000000000000000000000fdb631f5ee196f0ed6faa767959853a9f217697d00000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000e10", + "0x251ad9a5000000000000000000000000639fe6ab55c921f74e7fac1ee960c0b6293ba612000000000000000000000000fdb631f5ee196f0ed6faa767959853a9f217697d00000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000e10" + ], + "chainid": 421614, + "description": "Deploy new chainlink relayers", + "descriptionHash": "0x03087660ad65289d7f9f35887f72e304a35460e94606f1c40d6d3884e0e36a4c", + "network": "sepolia", + "objectArray": [ + { + "symbol": "LINK/USD", + "chainlinkPriceFeed": "0x86E53CF1B870786351Da77A57575e79CB55812CB", + "staleThreshold": "86400", + "gracePeriod": "3600" + }, + { + "symbol": "GRT/USD", + "chainlinkPriceFeed": "0x0F38D86FceF4955B705F35c9e41d1A16e0637c73", + "staleThreshold": "86400", + "gracePeriod": "3600" + }, + { + "symbol": "ETH/USD", + "chainlinkPriceFeed": "0x639Fe6ab55C921f74e7fac1ee960C0B6293ba612", + "staleThreshold": "86400", + "gracePeriod": "3600" + } + ], + "proposalId": 61857469553398489852308972851954168900597935201047788453491803085690968636070, + "proposalType": "DeployChainlinkRelayers", + "targets": [ + "0x555691C860015a5CE8748296fbbAa624410F55A4", + "0x555691C860015a5CE8748296fbbAa624410F55A4", + "0x555691C860015a5CE8748296fbbAa624410F55A4" + ], + "values": [ + 0, + 0, + 0 + ] +} \ No newline at end of file diff --git a/src/contracts/Generate/GenerateAddCollateralProposal.s.sol b/src/contracts/Generate/GenerateAddCollateralProposal.s.sol index 6fe0d9e..02db79b 100644 --- a/src/contracts/Generate/GenerateAddCollateralProposal.s.sol +++ b/src/contracts/Generate/GenerateAddCollateralProposal.s.sol @@ -120,7 +120,7 @@ contract GenerateAddCollateralProposal is Generator, JSONScript { ODGovernor gov = ODGovernor(payable(governanceAddress)); IGlobalSettlement globalSettlement = IGlobalSettlement(globalSettlementAddress); - address[] memory targets = new address[](8); + address[] memory targets = new address[](6); { targets[0] = address(globalSettlement.collateralJoinFactory()); targets[1] = address(globalSettlement.collateralAuctionHouseFactory()); @@ -128,11 +128,9 @@ contract GenerateAddCollateralProposal is Generator, JSONScript { targets[3] = taxCollector; targets[4] = liquidationEngine; targets[5] = oracleRelayer; - targets[6] = safeEngine; - targets[7] = safeEngine; } // No values needed - uint256[] memory values = new uint256[](8); + uint256[] memory values = new uint256[](6); { values[0] = 0; values[1] = 0; @@ -140,12 +138,10 @@ contract GenerateAddCollateralProposal is Generator, JSONScript { values[3] = 0; values[4] = 0; values[5] = 0; - values[6] = 0; - values[7] = 0; } // Get calldata for: - bytes[] memory calldatas = new bytes[](8); + bytes[] memory calldatas = new bytes[](6); calldatas[0] = abi.encodeWithSelector(ICollateralJoinFactory.deployCollateralJoin.selector, newCType, newCAddress); @@ -164,12 +160,6 @@ contract GenerateAddCollateralProposal is Generator, JSONScript { calldatas[5] = abi.encodeWithSelector( IModifiablePerCollateral.initializeCollateralType.selector, newCType, abi.encode(_oracleCParams) ); - calldatas[6] = abi.encodeWithSelector( - IAuthorizable.addAuthorization.selector, abi.encode(_liquidationEngineCParams.collateralAuctionHouse) - ); - calldatas[7] = abi.encodeWithSelector( - ISAFEEngine.approveSAFEModification.selector, abi.encode(_liquidationEngineCParams.collateralAuctionHouse) - ); // Get the descriptionHash bytes32 descriptionHash = keccak256(bytes(description)); diff --git a/src/contracts/Generate/GenerateDeployChainlinkRelayersProposal.s.sol b/src/contracts/Generate/GenerateDeployChainlinkRelayersProposal.s.sol index a519732..67e79b1 100644 --- a/src/contracts/Generate/GenerateDeployChainlinkRelayersProposal.s.sol +++ b/src/contracts/Generate/GenerateDeployChainlinkRelayersProposal.s.sol @@ -3,10 +3,9 @@ pragma solidity 0.8.20; import {JSONScript} from '../helpers/JSONScript.s.sol'; import {ODGovernor} from '@opendollar/contracts/gov/ODGovernor.sol'; -import {IERC20} from '@openzeppelin/token/ERC20/IERC20.sol'; import {Generator} from '../Generator.s.sol'; import {Strings} from '@openzeppelin/utils/Strings.sol'; -import {IChainlinkRelayerFactory} from '@opendollar/interfaces/factories/IChainlinkRelayerFactory.sol'; +import {IChainlinkRelayerFactory} from '../interfaces/IChainlinkRelayerFactory.sol'; import 'forge-std/StdJson.sol'; /// @title GenerateDeployChainlinkRelayersProposal Script @@ -19,21 +18,26 @@ contract GenerateDeployChainlinkRelayersProposal is Generator, JSONScript { string public description; address public governanceAddress; address public chainlinkRelayerFactory; + address public chainlinkSequencerFeed; address[] public chainlinkFeed; - uint256[] public oracleInterval; + uint256[] public staleThreshold; + uint256[] public gracePeriod; function _loadBaseData(string memory json) internal override { governanceAddress = json.readAddress(string(abi.encodePacked('.ODGovernor_Address:'))); description = json.readString(string(abi.encodePacked('.description'))); chainlinkRelayerFactory = json.readAddress(string(abi.encodePacked('.ChainlinkRelayerFactory_Address'))); + chainlinkSequencerFeed = json.readAddress(string(abi.encodePacked('.ChainlinkSequencerFeed'))); uint256 len = json.readUint(string(abi.encodePacked('.arrayLength'))); for (uint256 i; i < len; i++) { string memory index = Strings.toString(i); address feed = json.readAddress(string(abi.encodePacked('.objectArray[', index, '].chainlinkPriceFeed'))); - uint256 interval = json.readUint(string(abi.encodePacked('.objectArray[', index, '].oracleInterval'))); + uint256 interval = json.readUint(string(abi.encodePacked('.objectArray[', index, '].staleThreshold'))); + uint256 grace = json.readUint(string(abi.encodePacked('.objectArray[', index, '].gracePeriod'))); chainlinkFeed.push(feed); - oracleInterval.push(interval); + staleThreshold.push(interval); + gracePeriod.push(grace); } } @@ -41,7 +45,7 @@ contract GenerateDeployChainlinkRelayersProposal is Generator, JSONScript { ODGovernor gov = ODGovernor(payable(governanceAddress)); uint256 len = chainlinkFeed.length; - require(len == oracleInterval.length, 'CHAINLINK RELAYER: mismatched array lengths'); + require(len == staleThreshold.length, 'CHAINLINK RELAYER: mismatched array lengths'); address[] memory targets = new address[](len); uint256[] memory values = new uint256[](len); @@ -50,7 +54,11 @@ contract GenerateDeployChainlinkRelayersProposal is Generator, JSONScript { for (uint256 i = 0; i < len; i++) { // encode relayer factory function data calldatas[i] = abi.encodeWithSelector( - IChainlinkRelayerFactory.deployChainlinkRelayer.selector, chainlinkFeed[i], oracleInterval[i] + IChainlinkRelayerFactory.deployChainlinkRelayerWithL2Validity.selector, + chainlinkFeed[i], + chainlinkSequencerFeed, + staleThreshold[i], + gracePeriod[i] ); targets[i] = chainlinkRelayerFactory; values[i] = 0; // value is always 0 diff --git a/src/contracts/interfaces/IChainlinkRelayerFactory.sol b/src/contracts/interfaces/IChainlinkRelayerFactory.sol new file mode 100644 index 0000000..daeaf0f --- /dev/null +++ b/src/contracts/interfaces/IChainlinkRelayerFactory.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity 0.8.20; + +import {IBaseOracle} from '@opendollar/interfaces/oracles/IBaseOracle.sol'; + +interface IChainlinkRelayerFactory { + // --- Events --- + event NewChainlinkRelayer(address indexed _chainlinkRelayer, address _aggregator, uint256 _staleThreshold); + + function deployChainlinkRelayer(address _aggregator, uint256 _staleThreshold) external returns (IBaseOracle _relayer); + + function deployChainlinkRelayerWithL2Validity( + address _priceAggregator, + address _sequencerAggregator, + uint256 _staleThreshold, + uint256 _gracePeriod + ) external returns (IBaseOracle _chainlinkRelayer); +}