diff --git a/.openzeppelin/base_8453.json b/.openzeppelin/base_8453.json new file mode 100644 index 000000000..6c4c4a367 --- /dev/null +++ b/.openzeppelin/base_8453.json @@ -0,0 +1,3149 @@ +{ + "manifestVersion": "3.2", + "proxies": [], + "impls": { + "9ff12d14530d638900db7dd2f55b43196fd6d1fe09e9c635a8da175a62a5cda5": { + "address": "0x1D6d0B74E7A701aE5C2E11967b242E9861275143", + "txHash": "0x4843fca0d0fb070bfe72919ca1f530e5ac723964e47aea2feb2fd8bf59797401", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC165Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol:41" + }, + { + "label": "_roles", + "offset": 0, + "slot": "101", + "type": "t_mapping(t_bytes32,t_struct(RoleData)3741_storage)", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:61" + }, + { + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage", + "contract": "AccessControlUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol:259" + }, + { + "label": "longFreezes", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_address,t_uint256)", + "contract": "Auth", + "src": "contracts/mixins/Auth.sol:36" + }, + { + "label": "unfreezeAt", + "offset": 0, + "slot": "152", + "type": "t_uint48", + "contract": "Auth", + "src": "contracts/mixins/Auth.sol:38" + }, + { + "label": "shortFreeze", + "offset": 6, + "slot": "152", + "type": "t_uint48", + "contract": "Auth", + "src": "contracts/mixins/Auth.sol:39" + }, + { + "label": "longFreeze", + "offset": 12, + "slot": "152", + "type": "t_uint48", + "contract": "Auth", + "src": "contracts/mixins/Auth.sol:40" + }, + { + "label": "tradingPaused", + "offset": 18, + "slot": "152", + "type": "t_bool", + "contract": "Auth", + "src": "contracts/mixins/Auth.sol:45", + "renamedFrom": "paused" + }, + { + "label": "issuancePaused", + "offset": 19, + "slot": "152", + "type": "t_bool", + "contract": "Auth", + "src": "contracts/mixins/Auth.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "153", + "type": "t_array(t_uint256)48_storage", + "contract": "Auth", + "src": "contracts/mixins/Auth.sol:225" + }, + { + "label": "rToken", + "offset": 0, + "slot": "201", + "type": "t_contract(IRToken)26835", + "contract": "ComponentRegistry", + "src": "contracts/mixins/ComponentRegistry.sol:34" + }, + { + "label": "stRSR", + "offset": 0, + "slot": "202", + "type": "t_contract(IStRSR)27176", + "contract": "ComponentRegistry", + "src": "contracts/mixins/ComponentRegistry.sol:42" + }, + { + "label": "assetRegistry", + "offset": 0, + "slot": "203", + "type": "t_contract(IAssetRegistry)24822", + "contract": "ComponentRegistry", + "src": "contracts/mixins/ComponentRegistry.sol:50" + }, + { + "label": "basketHandler", + "offset": 0, + "slot": "204", + "type": "t_contract(IBasketHandler)25131", + "contract": "ComponentRegistry", + "src": "contracts/mixins/ComponentRegistry.sol:58" + }, + { + "label": "backingManager", + "offset": 0, + "slot": "205", + "type": "t_contract(IBackingManager)24884", + "contract": "ComponentRegistry", + "src": "contracts/mixins/ComponentRegistry.sol:66" + }, + { + "label": "distributor", + "offset": 0, + "slot": "206", + "type": "t_contract(IDistributor)25643", + "contract": "ComponentRegistry", + "src": "contracts/mixins/ComponentRegistry.sol:74" + }, + { + "label": "rsrTrader", + "offset": 0, + "slot": "207", + "type": "t_contract(IRevenueTrader)26964", + "contract": "ComponentRegistry", + "src": "contracts/mixins/ComponentRegistry.sol:82" + }, + { + "label": "rTokenTrader", + "offset": 0, + "slot": "208", + "type": "t_contract(IRevenueTrader)26964", + "contract": "ComponentRegistry", + "src": "contracts/mixins/ComponentRegistry.sol:90" + }, + { + "label": "furnace", + "offset": 0, + "slot": "209", + "type": "t_contract(IFurnace)26171", + "contract": "ComponentRegistry", + "src": "contracts/mixins/ComponentRegistry.sol:98" + }, + { + "label": "broker", + "offset": 0, + "slot": "210", + "type": "t_contract(IBroker)25280", + "contract": "ComponentRegistry", + "src": "contracts/mixins/ComponentRegistry.sol:106" + }, + { + "label": "__gap", + "offset": 0, + "slot": "211", + "type": "t_array(t_uint256)40_storage", + "contract": "ComponentRegistry", + "src": "contracts/mixins/ComponentRegistry.sol:119" + }, + { + "label": "__gap", + "offset": 0, + "slot": "251", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "301", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "rsr", + "offset": 0, + "slot": "351", + "type": "t_contract(IERC20)15339", + "contract": "MainP1", + "src": "contracts/p1/Main.sol:19" + }, + { + "label": "__gap", + "offset": 0, + "slot": "352", + "type": "t_array(t_uint256)49_storage", + "contract": "MainP1", + "src": "contracts/p1/Main.sol:71" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)40_storage": { + "label": "uint256[40]", + "numberOfBytes": "1280" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(IAssetRegistry)24822": { + "label": "contract IAssetRegistry", + "numberOfBytes": "20" + }, + "t_contract(IBackingManager)24884": { + "label": "contract IBackingManager", + "numberOfBytes": "20" + }, + "t_contract(IBasketHandler)25131": { + "label": "contract IBasketHandler", + "numberOfBytes": "20" + }, + "t_contract(IBroker)25280": { + "label": "contract IBroker", + "numberOfBytes": "20" + }, + "t_contract(IDistributor)25643": { + "label": "contract IDistributor", + "numberOfBytes": "20" + }, + "t_contract(IERC20)15339": { + "label": "contract IERC20", + "numberOfBytes": "20" + }, + "t_contract(IFurnace)26171": { + "label": "contract IFurnace", + "numberOfBytes": "20" + }, + "t_contract(IRToken)26835": { + "label": "contract IRToken", + "numberOfBytes": "20" + }, + "t_contract(IRevenueTrader)26964": { + "label": "contract IRevenueTrader", + "numberOfBytes": "20" + }, + "t_contract(IStRSR)27176": { + "label": "contract IStRSR", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(RoleData)3741_storage)": { + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32" + }, + "t_struct(RoleData)3741_storage": { + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "label": "members", + "type": "t_mapping(t_address,t_bool)", + "offset": 0, + "slot": "0" + }, + { + "label": "adminRole", + "type": "t_bytes32", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "fe0f2dec194b882efa0d8220d324cba3ec32136c7c6322c221bd90103690d736": { + "address": "0x9c387fc258061bd3E02c851F36aE227DB03a396C", + "txHash": "0x931576bc01d5984558263d8d5facbbd4748e81f53f5cdb4cc732215000dcbbb6", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "main", + "offset": 0, + "slot": "151", + "type": "t_contract(IMain)26615", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:21" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:69" + }, + { + "label": "basketHandler", + "offset": 0, + "slot": "201", + "type": "t_contract(IBasketHandler)25131", + "contract": "AssetRegistryP1", + "src": "contracts/p1/AssetRegistry.sol:19" + }, + { + "label": "backingManager", + "offset": 0, + "slot": "202", + "type": "t_contract(IBackingManager)24884", + "contract": "AssetRegistryP1", + "src": "contracts/p1/AssetRegistry.sol:20" + }, + { + "label": "_erc20s", + "offset": 0, + "slot": "203", + "type": "t_struct(AddressSet)21587_storage", + "contract": "AssetRegistryP1", + "src": "contracts/p1/AssetRegistry.sol:23" + }, + { + "label": "assets", + "offset": 0, + "slot": "205", + "type": "t_mapping(t_contract(IERC20)15339,t_contract(IAsset)24579)", + "contract": "AssetRegistryP1", + "src": "contracts/p1/AssetRegistry.sol:26" + }, + { + "label": "lastRefresh", + "offset": 0, + "slot": "206", + "type": "t_uint48", + "contract": "AssetRegistryP1", + "src": "contracts/p1/AssetRegistry.sol:30" + }, + { + "label": "__gap", + "offset": 0, + "slot": "207", + "type": "t_array(t_uint256)46_storage", + "contract": "AssetRegistryP1", + "src": "contracts/p1/AssetRegistry.sol:233" + } + ], + "types": { + "t_array(t_bytes32)dyn_storage": { + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)46_storage": { + "label": "uint256[46]", + "numberOfBytes": "1472" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(IAsset)24579": { + "label": "contract IAsset", + "numberOfBytes": "20" + }, + "t_contract(IBackingManager)24884": { + "label": "contract IBackingManager", + "numberOfBytes": "20" + }, + "t_contract(IBasketHandler)25131": { + "label": "contract IBasketHandler", + "numberOfBytes": "20" + }, + "t_contract(IERC20)15339": { + "label": "contract IERC20", + "numberOfBytes": "20" + }, + "t_contract(IMain)26615": { + "label": "contract IMain", + "numberOfBytes": "20" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_contract(IERC20)15339,t_contract(IAsset)24579)": { + "label": "mapping(contract IERC20 => contract IAsset)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)21587_storage": { + "label": "struct EnumerableSet.AddressSet", + "members": [ + { + "label": "_inner", + "type": "t_struct(Set)21286_storage", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Set)21286_storage": { + "label": "struct EnumerableSet.Set", + "members": [ + { + "label": "_values", + "type": "t_array(t_bytes32)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "_indexes", + "type": "t_mapping(t_bytes32,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "48661fdf6237c49a10304321f297c21ad2799eb111db81c7380ea05da78601f2": { + "address": "0x63e12c3b2DBCaeF1835Bb99Ac1Fdb0Ebe1bE69bE", + "txHash": "0x05c4ce9b2e15eac4b03c76588ae104e9d43308a385d3d03eaeae82942c4c02a2", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "main", + "offset": 0, + "slot": "151", + "type": "t_contract(IMain)26615", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:21" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:69" + }, + { + "label": "_status", + "offset": 0, + "slot": "201", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:74" + }, + { + "label": "broker", + "offset": 0, + "slot": "251", + "type": "t_contract(IBroker)25280", + "contract": "TradingP1", + "src": "contracts/p1/mixins/Trading.sol:27" + }, + { + "label": "trades", + "offset": 0, + "slot": "252", + "type": "t_mapping(t_contract(IERC20)15339,t_contract(ITrade)27311)", + "contract": "TradingP1", + "src": "contracts/p1/mixins/Trading.sol:30" + }, + { + "label": "tradesOpen", + "offset": 0, + "slot": "253", + "type": "t_uint48", + "contract": "TradingP1", + "src": "contracts/p1/mixins/Trading.sol:31" + }, + { + "label": "maxTradeSlippage", + "offset": 6, + "slot": "253", + "type": "t_uint192", + "contract": "TradingP1", + "src": "contracts/p1/mixins/Trading.sol:34" + }, + { + "label": "minTradeVolume", + "offset": 0, + "slot": "254", + "type": "t_uint192", + "contract": "TradingP1", + "src": "contracts/p1/mixins/Trading.sol:35" + }, + { + "label": "tradesNonce", + "offset": 0, + "slot": "255", + "type": "t_uint256", + "contract": "TradingP1", + "src": "contracts/p1/mixins/Trading.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "256", + "type": "t_array(t_uint256)45_storage", + "contract": "TradingP1", + "src": "contracts/p1/mixins/Trading.sol:155" + }, + { + "label": "assetRegistry", + "offset": 0, + "slot": "301", + "type": "t_contract(IAssetRegistry)24822", + "contract": "BackingManagerP1", + "src": "contracts/p1/BackingManager.sol:30" + }, + { + "label": "basketHandler", + "offset": 0, + "slot": "302", + "type": "t_contract(IBasketHandler)25131", + "contract": "BackingManagerP1", + "src": "contracts/p1/BackingManager.sol:31" + }, + { + "label": "distributor", + "offset": 0, + "slot": "303", + "type": "t_contract(IDistributor)25643", + "contract": "BackingManagerP1", + "src": "contracts/p1/BackingManager.sol:32" + }, + { + "label": "rToken", + "offset": 0, + "slot": "304", + "type": "t_contract(IRToken)26835", + "contract": "BackingManagerP1", + "src": "contracts/p1/BackingManager.sol:33" + }, + { + "label": "rsr", + "offset": 0, + "slot": "305", + "type": "t_contract(IERC20)15339", + "contract": "BackingManagerP1", + "src": "contracts/p1/BackingManager.sol:34" + }, + { + "label": "stRSR", + "offset": 0, + "slot": "306", + "type": "t_contract(IStRSR)27176", + "contract": "BackingManagerP1", + "src": "contracts/p1/BackingManager.sol:35" + }, + { + "label": "rsrTrader", + "offset": 0, + "slot": "307", + "type": "t_contract(IRevenueTrader)26964", + "contract": "BackingManagerP1", + "src": "contracts/p1/BackingManager.sol:36" + }, + { + "label": "rTokenTrader", + "offset": 0, + "slot": "308", + "type": "t_contract(IRevenueTrader)26964", + "contract": "BackingManagerP1", + "src": "contracts/p1/BackingManager.sol:37" + }, + { + "label": "tradingDelay", + "offset": 20, + "slot": "308", + "type": "t_uint48", + "contract": "BackingManagerP1", + "src": "contracts/p1/BackingManager.sol:41" + }, + { + "label": "backingBuffer", + "offset": 0, + "slot": "309", + "type": "t_uint192", + "contract": "BackingManagerP1", + "src": "contracts/p1/BackingManager.sol:42" + }, + { + "label": "furnace", + "offset": 0, + "slot": "310", + "type": "t_contract(IFurnace)26171", + "contract": "BackingManagerP1", + "src": "contracts/p1/BackingManager.sol:45" + }, + { + "label": "tradeEnd", + "offset": 0, + "slot": "311", + "type": "t_mapping(t_enum(TradeKind)25153,t_uint48)", + "contract": "BackingManagerP1", + "src": "contracts/p1/BackingManager.sol:46" + }, + { + "label": "__gap", + "offset": 0, + "slot": "312", + "type": "t_array(t_uint256)39_storage", + "contract": "BackingManagerP1", + "src": "contracts/p1/BackingManager.sol:310" + } + ], + "types": { + "t_array(t_uint256)39_storage": { + "label": "uint256[39]", + "numberOfBytes": "1248" + }, + "t_array(t_uint256)45_storage": { + "label": "uint256[45]", + "numberOfBytes": "1440" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(IAssetRegistry)24822": { + "label": "contract IAssetRegistry", + "numberOfBytes": "20" + }, + "t_contract(IBasketHandler)25131": { + "label": "contract IBasketHandler", + "numberOfBytes": "20" + }, + "t_contract(IBroker)25280": { + "label": "contract IBroker", + "numberOfBytes": "20" + }, + "t_contract(IDistributor)25643": { + "label": "contract IDistributor", + "numberOfBytes": "20" + }, + "t_contract(IERC20)15339": { + "label": "contract IERC20", + "numberOfBytes": "20" + }, + "t_contract(IFurnace)26171": { + "label": "contract IFurnace", + "numberOfBytes": "20" + }, + "t_contract(IMain)26615": { + "label": "contract IMain", + "numberOfBytes": "20" + }, + "t_contract(IRToken)26835": { + "label": "contract IRToken", + "numberOfBytes": "20" + }, + "t_contract(IRevenueTrader)26964": { + "label": "contract IRevenueTrader", + "numberOfBytes": "20" + }, + "t_contract(IStRSR)27176": { + "label": "contract IStRSR", + "numberOfBytes": "20" + }, + "t_contract(ITrade)27311": { + "label": "contract ITrade", + "numberOfBytes": "20" + }, + "t_enum(TradeKind)25153": { + "label": "enum TradeKind", + "members": ["DUTCH_AUCTION", "BATCH_AUCTION"], + "numberOfBytes": "1" + }, + "t_mapping(t_contract(IERC20)15339,t_contract(ITrade)27311)": { + "label": "mapping(contract IERC20 => contract ITrade)", + "numberOfBytes": "32" + }, + "t_mapping(t_enum(TradeKind)25153,t_uint48)": { + "label": "mapping(enum TradeKind => uint48)", + "numberOfBytes": "32" + }, + "t_uint192": { + "label": "uint192", + "numberOfBytes": "24" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "4e2cfd07678877b4bd048e05bb2382697948cb5ed20e4611cda549bf9f1c5541": { + "address": "0x25E92785C1AC01B397224E0534f3D626868A1Cbf", + "txHash": "0x6d83e8e952d340e41f0e83e6db70f0f92e89ec87c1a9a1e3a3fd75215ee1ad97", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "main", + "offset": 0, + "slot": "151", + "type": "t_contract(IMain)26615", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:21" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:69" + }, + { + "label": "assetRegistry", + "offset": 0, + "slot": "201", + "type": "t_contract(IAssetRegistry)24822", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:34" + }, + { + "label": "backingManager", + "offset": 0, + "slot": "202", + "type": "t_contract(IBackingManager)24884", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:35" + }, + { + "label": "rsr", + "offset": 0, + "slot": "203", + "type": "t_contract(IERC20)15339", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:36" + }, + { + "label": "rToken", + "offset": 0, + "slot": "204", + "type": "t_contract(IRToken)26835", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:37" + }, + { + "label": "stRSR", + "offset": 0, + "slot": "205", + "type": "t_contract(IStRSR)27176", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:38" + }, + { + "label": "config", + "offset": 0, + "slot": "206", + "type": "t_struct(BasketConfig)54599_storage", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:42" + }, + { + "label": "basket", + "offset": 0, + "slot": "210", + "type": "t_struct(Basket)54609_storage", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:46" + }, + { + "label": "nonce", + "offset": 0, + "slot": "212", + "type": "t_uint48", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:48" + }, + { + "label": "timestamp", + "offset": 6, + "slot": "212", + "type": "t_uint48", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:49" + }, + { + "label": "disabled", + "offset": 12, + "slot": "212", + "type": "t_bool", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:53" + }, + { + "label": "_targetNames", + "offset": 0, + "slot": "213", + "type": "t_struct(Bytes32Set)21480_storage", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:59" + }, + { + "label": "_newBasket", + "offset": 0, + "slot": "215", + "type": "t_struct(Basket)54609_storage", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:60" + }, + { + "label": "warmupPeriod", + "offset": 0, + "slot": "217", + "type": "t_uint48", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:66" + }, + { + "label": "lastStatusTimestamp", + "offset": 6, + "slot": "217", + "type": "t_uint48", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:70" + }, + { + "label": "lastStatus", + "offset": 12, + "slot": "217", + "type": "t_enum(CollateralStatus)24611", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:71" + }, + { + "label": "basketHistory", + "offset": 0, + "slot": "218", + "type": "t_mapping(t_uint48,t_struct(Basket)54609_storage)", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:77" + }, + { + "label": "_targetAmts", + "offset": 0, + "slot": "219", + "type": "t_struct(Bytes32ToUintMap)21092_storage", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:80" + }, + { + "label": "__gap", + "offset": 0, + "slot": "222", + "type": "t_array(t_uint256)37_storage", + "contract": "BasketHandlerP1", + "src": "contracts/p1/BasketHandler.sol:673" + } + ], + "types": { + "t_array(t_bytes32)dyn_storage": { + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_array(t_contract(IERC20)15339)dyn_storage": { + "label": "contract IERC20[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)37_storage": { + "label": "uint256[37]", + "numberOfBytes": "1184" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(IAssetRegistry)24822": { + "label": "contract IAssetRegistry", + "numberOfBytes": "20" + }, + "t_contract(IBackingManager)24884": { + "label": "contract IBackingManager", + "numberOfBytes": "20" + }, + "t_contract(IERC20)15339": { + "label": "contract IERC20", + "numberOfBytes": "20" + }, + "t_contract(IMain)26615": { + "label": "contract IMain", + "numberOfBytes": "20" + }, + "t_contract(IRToken)26835": { + "label": "contract IRToken", + "numberOfBytes": "20" + }, + "t_contract(IStRSR)27176": { + "label": "contract IStRSR", + "numberOfBytes": "20" + }, + "t_enum(CollateralStatus)24611": { + "label": "enum CollateralStatus", + "members": ["SOUND", "IFFY", "DISABLED"], + "numberOfBytes": "1" + }, + "t_mapping(t_bytes32,t_bytes32)": { + "label": "mapping(bytes32 => bytes32)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_struct(BackupConfig)54579_storage)": { + "label": "mapping(bytes32 => struct BackupConfig)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_contract(IERC20)15339,t_bytes32)": { + "label": "mapping(contract IERC20 => bytes32)", + "numberOfBytes": "32" + }, + "t_mapping(t_contract(IERC20)15339,t_uint192)": { + "label": "mapping(contract IERC20 => uint192)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint48,t_struct(Basket)54609_storage)": { + "label": "mapping(uint48 => struct Basket)", + "numberOfBytes": "32" + }, + "t_struct(BackupConfig)54579_storage": { + "label": "struct BackupConfig", + "members": [ + { + "label": "max", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "erc20s", + "type": "t_array(t_contract(IERC20)15339)dyn_storage", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Basket)54609_storage": { + "label": "struct Basket", + "members": [ + { + "label": "erc20s", + "type": "t_array(t_contract(IERC20)15339)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "refAmts", + "type": "t_mapping(t_contract(IERC20)15339,t_uint192)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(BasketConfig)54599_storage": { + "label": "struct BasketConfig", + "members": [ + { + "label": "erc20s", + "type": "t_array(t_contract(IERC20)15339)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "targetAmts", + "type": "t_mapping(t_contract(IERC20)15339,t_uint192)", + "offset": 0, + "slot": "1" + }, + { + "label": "targetNames", + "type": "t_mapping(t_contract(IERC20)15339,t_bytes32)", + "offset": 0, + "slot": "2" + }, + { + "label": "backups", + "type": "t_mapping(t_bytes32,t_struct(BackupConfig)54579_storage)", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_struct(Bytes32Set)21480_storage": { + "label": "struct EnumerableSet.Bytes32Set", + "members": [ + { + "label": "_inner", + "type": "t_struct(Set)21286_storage", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Bytes32ToBytes32Map)20169_storage": { + "label": "struct EnumerableMap.Bytes32ToBytes32Map", + "members": [ + { + "label": "_keys", + "type": "t_struct(Bytes32Set)21480_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "_values", + "type": "t_mapping(t_bytes32,t_bytes32)", + "offset": 0, + "slot": "2" + } + ], + "numberOfBytes": "96" + }, + "t_struct(Bytes32ToUintMap)21092_storage": { + "label": "struct EnumerableMap.Bytes32ToUintMap", + "members": [ + { + "label": "_inner", + "type": "t_struct(Bytes32ToBytes32Map)20169_storage", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "96" + }, + "t_struct(Set)21286_storage": { + "label": "struct EnumerableSet.Set", + "members": [ + { + "label": "_values", + "type": "t_array(t_bytes32)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "_indexes", + "type": "t_mapping(t_bytes32,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint192": { + "label": "uint192", + "numberOfBytes": "24" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "eb36ed3a59a82baec4bd56fa27434f627d80b31df3a101e16165d869c850512c": { + "address": "0x12c3BB1B0da85fDaE0137aE8fDe901F7D0e106ba", + "txHash": "0x5fe697334dd0eef6a26b080b6245022a5cf7837ef03c1b7af54c9f060d2aab12", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "main", + "offset": 0, + "slot": "151", + "type": "t_contract(IMain)26615", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:21" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:69" + }, + { + "label": "backingManager", + "offset": 0, + "slot": "201", + "type": "t_contract(IBackingManager)24884", + "contract": "BrokerP1", + "src": "contracts/p1/Broker.sol:31" + }, + { + "label": "rsrTrader", + "offset": 0, + "slot": "202", + "type": "t_contract(IRevenueTrader)26964", + "contract": "BrokerP1", + "src": "contracts/p1/Broker.sol:32" + }, + { + "label": "rTokenTrader", + "offset": 0, + "slot": "203", + "type": "t_contract(IRevenueTrader)26964", + "contract": "BrokerP1", + "src": "contracts/p1/Broker.sol:33" + }, + { + "label": "batchTradeImplementation", + "offset": 0, + "slot": "204", + "type": "t_contract(ITrade)27311", + "contract": "BrokerP1", + "src": "contracts/p1/Broker.sol:37", + "renamedFrom": "tradeImplementation" + }, + { + "label": "gnosis", + "offset": 0, + "slot": "205", + "type": "t_contract(IGnosis)26271", + "contract": "BrokerP1", + "src": "contracts/p1/Broker.sol:40" + }, + { + "label": "batchAuctionLength", + "offset": 20, + "slot": "205", + "type": "t_uint48", + "contract": "BrokerP1", + "src": "contracts/p1/Broker.sol:44", + "renamedFrom": "auctionLength" + }, + { + "label": "batchTradeDisabled", + "offset": 26, + "slot": "205", + "type": "t_bool", + "contract": "BrokerP1", + "src": "contracts/p1/Broker.sol:50", + "renamedFrom": "disabled" + }, + { + "label": "trades", + "offset": 0, + "slot": "206", + "type": "t_mapping(t_address,t_bool)", + "contract": "BrokerP1", + "src": "contracts/p1/Broker.sol:53" + }, + { + "label": "dutchTradeImplementation", + "offset": 0, + "slot": "207", + "type": "t_contract(ITrade)27311", + "contract": "BrokerP1", + "src": "contracts/p1/Broker.sol:58" + }, + { + "label": "dutchAuctionLength", + "offset": 20, + "slot": "207", + "type": "t_uint48", + "contract": "BrokerP1", + "src": "contracts/p1/Broker.sol:61" + }, + { + "label": "dutchTradeDisabled", + "offset": 0, + "slot": "208", + "type": "t_mapping(t_contract(IERC20Metadata)15364,t_bool)", + "contract": "BrokerP1", + "src": "contracts/p1/Broker.sol:64" + }, + { + "label": "__gap", + "offset": 0, + "slot": "209", + "type": "t_array(t_uint256)42_storage", + "contract": "BrokerP1", + "src": "contracts/p1/Broker.sol:278" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)42_storage": { + "label": "uint256[42]", + "numberOfBytes": "1344" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(IBackingManager)24884": { + "label": "contract IBackingManager", + "numberOfBytes": "20" + }, + "t_contract(IERC20Metadata)15364": { + "label": "contract IERC20Metadata", + "numberOfBytes": "20" + }, + "t_contract(IGnosis)26271": { + "label": "contract IGnosis", + "numberOfBytes": "20" + }, + "t_contract(IMain)26615": { + "label": "contract IMain", + "numberOfBytes": "20" + }, + "t_contract(IRevenueTrader)26964": { + "label": "contract IRevenueTrader", + "numberOfBytes": "20" + }, + "t_contract(ITrade)27311": { + "label": "contract ITrade", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_contract(IERC20Metadata)15364,t_bool)": { + "label": "mapping(contract IERC20Metadata => bool)", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "ba4e753809f0c7a43fa0a310c6445dbc18238bc5e8e399210a08bce936c83763": { + "address": "0xd31de64957b79435bfc702044590ac417e02c19B", + "txHash": "0x3fd4499d73d2c4bcd3b07bf2cd73b8f4c9ccfd2c1b30354308f852e2d9fa8bcb", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "main", + "offset": 0, + "slot": "151", + "type": "t_contract(IMain)26615", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:21" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:69" + }, + { + "label": "destinations", + "offset": 0, + "slot": "201", + "type": "t_struct(AddressSet)21587_storage", + "contract": "DistributorP1", + "src": "contracts/p1/Distributor.sol:17" + }, + { + "label": "distribution", + "offset": 0, + "slot": "203", + "type": "t_mapping(t_address,t_struct(RevenueShare)25581_storage)", + "contract": "DistributorP1", + "src": "contracts/p1/Distributor.sol:18" + }, + { + "label": "rsr", + "offset": 0, + "slot": "204", + "type": "t_contract(IERC20)15339", + "contract": "DistributorP1", + "src": "contracts/p1/Distributor.sol:36" + }, + { + "label": "rToken", + "offset": 0, + "slot": "205", + "type": "t_contract(IERC20)15339", + "contract": "DistributorP1", + "src": "contracts/p1/Distributor.sol:37" + }, + { + "label": "furnace", + "offset": 0, + "slot": "206", + "type": "t_address", + "contract": "DistributorP1", + "src": "contracts/p1/Distributor.sol:38" + }, + { + "label": "stRSR", + "offset": 0, + "slot": "207", + "type": "t_address", + "contract": "DistributorP1", + "src": "contracts/p1/Distributor.sol:39" + }, + { + "label": "rTokenTrader", + "offset": 0, + "slot": "208", + "type": "t_address", + "contract": "DistributorP1", + "src": "contracts/p1/Distributor.sol:40" + }, + { + "label": "rsrTrader", + "offset": 0, + "slot": "209", + "type": "t_address", + "contract": "DistributorP1", + "src": "contracts/p1/Distributor.sol:41" + }, + { + "label": "__gap", + "offset": 0, + "slot": "210", + "type": "t_array(t_uint256)44_storage", + "contract": "DistributorP1", + "src": "contracts/p1/Distributor.sol:206" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_bytes32)dyn_storage": { + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)44_storage": { + "label": "uint256[44]", + "numberOfBytes": "1408" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(IERC20)15339": { + "label": "contract IERC20", + "numberOfBytes": "20" + }, + "t_contract(IMain)26615": { + "label": "contract IMain", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_struct(RevenueShare)25581_storage)": { + "label": "mapping(address => struct RevenueShare)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)21587_storage": { + "label": "struct EnumerableSet.AddressSet", + "members": [ + { + "label": "_inner", + "type": "t_struct(Set)21286_storage", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "64" + }, + "t_struct(RevenueShare)25581_storage": { + "label": "struct RevenueShare", + "members": [ + { + "label": "rTokenDist", + "type": "t_uint16", + "offset": 0, + "slot": "0" + }, + { + "label": "rsrDist", + "type": "t_uint16", + "offset": 2, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Set)21286_storage": { + "label": "struct EnumerableSet.Set", + "members": [ + { + "label": "_values", + "type": "t_array(t_bytes32)dyn_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "_indexes", + "type": "t_mapping(t_bytes32,t_uint256)", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_uint16": { + "label": "uint16", + "numberOfBytes": "2" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "546202a50d79a0dd7cfcb3f9e0e3a2794622502a556be156f418d865aa4d7d04": { + "address": "0x45D7dFE976cdF80962d863A66918346a457b87Bd", + "txHash": "0x0be38d9b586b534dc0afe9089b00aedcf6045c46930becd5dc34283bb4f38d02", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "main", + "offset": 0, + "slot": "151", + "type": "t_contract(IMain)26615", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:21" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:69" + }, + { + "label": "rToken", + "offset": 0, + "slot": "201", + "type": "t_contract(IRToken)26835", + "contract": "FurnaceP1", + "src": "contracts/p1/Furnace.sol:21" + }, + { + "label": "ratio", + "offset": 0, + "slot": "202", + "type": "t_uint192", + "contract": "FurnaceP1", + "src": "contracts/p1/Furnace.sol:24" + }, + { + "label": "lastPayout", + "offset": 24, + "slot": "202", + "type": "t_uint48", + "contract": "FurnaceP1", + "src": "contracts/p1/Furnace.sol:27" + }, + { + "label": "lastPayoutBal", + "offset": 0, + "slot": "203", + "type": "t_uint256", + "contract": "FurnaceP1", + "src": "contracts/p1/Furnace.sol:28" + }, + { + "label": "__gap", + "offset": 0, + "slot": "204", + "type": "t_array(t_uint256)47_storage", + "contract": "FurnaceP1", + "src": "contracts/p1/Furnace.sol:112" + } + ], + "types": { + "t_array(t_uint256)47_storage": { + "label": "uint256[47]", + "numberOfBytes": "1504" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(IMain)26615": { + "label": "contract IMain", + "numberOfBytes": "20" + }, + "t_contract(IRToken)26835": { + "label": "contract IRToken", + "numberOfBytes": "20" + }, + "t_uint192": { + "label": "uint192", + "numberOfBytes": "24" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "632dbf8b9744ed3b4bedeca088a559a83fb7354de5b593aefa39ab7993ce04bf": { + "address": "0xAeA6BD7b231C0eC7f35C2bdf47A76053D09dbD09", + "txHash": "0xa366202f823e4a4cf49e8e3ab5c69193088302464785962f31dc22778e3a822b", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "main", + "offset": 0, + "slot": "151", + "type": "t_contract(IMain)26615", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:21" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:69" + }, + { + "label": "_status", + "offset": 0, + "slot": "201", + "type": "t_uint256", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)49_storage", + "contract": "ReentrancyGuardUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol:74" + }, + { + "label": "broker", + "offset": 0, + "slot": "251", + "type": "t_contract(IBroker)25280", + "contract": "TradingP1", + "src": "contracts/p1/mixins/Trading.sol:27" + }, + { + "label": "trades", + "offset": 0, + "slot": "252", + "type": "t_mapping(t_contract(IERC20)15339,t_contract(ITrade)27311)", + "contract": "TradingP1", + "src": "contracts/p1/mixins/Trading.sol:30" + }, + { + "label": "tradesOpen", + "offset": 0, + "slot": "253", + "type": "t_uint48", + "contract": "TradingP1", + "src": "contracts/p1/mixins/Trading.sol:31" + }, + { + "label": "maxTradeSlippage", + "offset": 6, + "slot": "253", + "type": "t_uint192", + "contract": "TradingP1", + "src": "contracts/p1/mixins/Trading.sol:34" + }, + { + "label": "minTradeVolume", + "offset": 0, + "slot": "254", + "type": "t_uint192", + "contract": "TradingP1", + "src": "contracts/p1/mixins/Trading.sol:35" + }, + { + "label": "tradesNonce", + "offset": 0, + "slot": "255", + "type": "t_uint256", + "contract": "TradingP1", + "src": "contracts/p1/mixins/Trading.sol:38" + }, + { + "label": "__gap", + "offset": 0, + "slot": "256", + "type": "t_array(t_uint256)45_storage", + "contract": "TradingP1", + "src": "contracts/p1/mixins/Trading.sol:155" + }, + { + "label": "tokenToBuy", + "offset": 0, + "slot": "301", + "type": "t_contract(IERC20)15339", + "contract": "RevenueTraderP1", + "src": "contracts/p1/RevenueTrader.sol:19" + }, + { + "label": "assetRegistry", + "offset": 0, + "slot": "302", + "type": "t_contract(IAssetRegistry)24822", + "contract": "RevenueTraderP1", + "src": "contracts/p1/RevenueTrader.sol:20" + }, + { + "label": "distributor", + "offset": 0, + "slot": "303", + "type": "t_contract(IDistributor)25643", + "contract": "RevenueTraderP1", + "src": "contracts/p1/RevenueTrader.sol:21" + }, + { + "label": "backingManager", + "offset": 0, + "slot": "304", + "type": "t_contract(IBackingManager)24884", + "contract": "RevenueTraderP1", + "src": "contracts/p1/RevenueTrader.sol:22" + }, + { + "label": "furnace", + "offset": 0, + "slot": "305", + "type": "t_contract(IFurnace)26171", + "contract": "RevenueTraderP1", + "src": "contracts/p1/RevenueTrader.sol:23" + }, + { + "label": "rToken", + "offset": 0, + "slot": "306", + "type": "t_contract(IRToken)26835", + "contract": "RevenueTraderP1", + "src": "contracts/p1/RevenueTrader.sol:24" + }, + { + "label": "rsr", + "offset": 0, + "slot": "307", + "type": "t_contract(IERC20)15339", + "contract": "RevenueTraderP1", + "src": "contracts/p1/RevenueTrader.sol:25" + }, + { + "label": "__gap", + "offset": 0, + "slot": "308", + "type": "t_array(t_uint256)43_storage", + "contract": "RevenueTraderP1", + "src": "contracts/p1/RevenueTrader.sol:190" + } + ], + "types": { + "t_array(t_uint256)43_storage": { + "label": "uint256[43]", + "numberOfBytes": "1376" + }, + "t_array(t_uint256)45_storage": { + "label": "uint256[45]", + "numberOfBytes": "1440" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(IAssetRegistry)24822": { + "label": "contract IAssetRegistry", + "numberOfBytes": "20" + }, + "t_contract(IBackingManager)24884": { + "label": "contract IBackingManager", + "numberOfBytes": "20" + }, + "t_contract(IBroker)25280": { + "label": "contract IBroker", + "numberOfBytes": "20" + }, + "t_contract(IDistributor)25643": { + "label": "contract IDistributor", + "numberOfBytes": "20" + }, + "t_contract(IERC20)15339": { + "label": "contract IERC20", + "numberOfBytes": "20" + }, + "t_contract(IFurnace)26171": { + "label": "contract IFurnace", + "numberOfBytes": "20" + }, + "t_contract(IMain)26615": { + "label": "contract IMain", + "numberOfBytes": "20" + }, + "t_contract(IRToken)26835": { + "label": "contract IRToken", + "numberOfBytes": "20" + }, + "t_contract(ITrade)27311": { + "label": "contract ITrade", + "numberOfBytes": "20" + }, + "t_mapping(t_contract(IERC20)15339,t_contract(ITrade)27311)": { + "label": "mapping(contract IERC20 => contract ITrade)", + "numberOfBytes": "32" + }, + "t_uint192": { + "label": "uint192", + "numberOfBytes": "24" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "654ae924bb358aa1208293e52f8ad1216a89fcc33581dfea5664a9666450057b": { + "address": "0xA42850A760151bb3ACF17E7f8643EB4d864bF7a6", + "txHash": "0x20a2299b0aa2cce8b168ef6e0583addce5dadf5f12fcef83be3ec367a44320f2", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "main", + "offset": 0, + "slot": "151", + "type": "t_contract(IMain)26615", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:21" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:69" + }, + { + "label": "_balances", + "offset": 0, + "slot": "201", + "type": "t_mapping(t_address,t_uint256)", + "contract": "ERC20Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:37" + }, + { + "label": "_allowances", + "offset": 0, + "slot": "202", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))", + "contract": "ERC20Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:39" + }, + { + "label": "_totalSupply", + "offset": 0, + "slot": "203", + "type": "t_uint256", + "contract": "ERC20Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:41" + }, + { + "label": "_name", + "offset": 0, + "slot": "204", + "type": "t_string_storage", + "contract": "ERC20Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:43" + }, + { + "label": "_symbol", + "offset": 0, + "slot": "205", + "type": "t_string_storage", + "contract": "ERC20Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:44" + }, + { + "label": "__gap", + "offset": 0, + "slot": "206", + "type": "t_array(t_uint256)45_storage", + "contract": "ERC20Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:394" + }, + { + "label": "_HASHED_NAME", + "offset": 0, + "slot": "251", + "type": "t_bytes32", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol:32" + }, + { + "label": "_HASHED_VERSION", + "offset": 0, + "slot": "252", + "type": "t_bytes32", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol:33" + }, + { + "label": "__gap", + "offset": 0, + "slot": "253", + "type": "t_array(t_uint256)50_storage", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol:120" + }, + { + "label": "_nonces", + "offset": 0, + "slot": "303", + "type": "t_mapping(t_address,t_struct(Counter)6400_storage)", + "contract": "ERC20PermitUpgradeable", + "src": "contracts/vendor/ERC20PermitUpgradeable.sol:37" + }, + { + "label": "_PERMIT_TYPEHASH_DEPRECATED_SLOT", + "offset": 0, + "slot": "304", + "type": "t_bytes32", + "contract": "ERC20PermitUpgradeable", + "src": "contracts/vendor/ERC20PermitUpgradeable.sol:51", + "renamedFrom": "_PERMIT_TYPEHASH" + }, + { + "label": "__gap", + "offset": 0, + "slot": "305", + "type": "t_array(t_uint256)48_storage", + "contract": "ERC20PermitUpgradeable", + "src": "contracts/vendor/ERC20PermitUpgradeable.sol:129" + }, + { + "label": "mandate", + "offset": 0, + "slot": "353", + "type": "t_string_storage", + "contract": "RTokenP1", + "src": "contracts/p1/RToken.sol:44" + }, + { + "label": "assetRegistry", + "offset": 0, + "slot": "354", + "type": "t_contract(IAssetRegistry)24822", + "contract": "RTokenP1", + "src": "contracts/p1/RToken.sol:47" + }, + { + "label": "basketHandler", + "offset": 0, + "slot": "355", + "type": "t_contract(IBasketHandler)25131", + "contract": "RTokenP1", + "src": "contracts/p1/RToken.sol:48" + }, + { + "label": "backingManager", + "offset": 0, + "slot": "356", + "type": "t_contract(IBackingManager)24884", + "contract": "RTokenP1", + "src": "contracts/p1/RToken.sol:49" + }, + { + "label": "furnace", + "offset": 0, + "slot": "357", + "type": "t_contract(IFurnace)26171", + "contract": "RTokenP1", + "src": "contracts/p1/RToken.sol:50" + }, + { + "label": "basketsNeeded", + "offset": 0, + "slot": "358", + "type": "t_uint192", + "contract": "RTokenP1", + "src": "contracts/p1/RToken.sol:55" + }, + { + "label": "issuanceThrottle", + "offset": 0, + "slot": "359", + "type": "t_struct(Throttle)29644_storage", + "contract": "RTokenP1", + "src": "contracts/p1/RToken.sol:58" + }, + { + "label": "redemptionThrottle", + "offset": 0, + "slot": "363", + "type": "t_struct(Throttle)29644_storage", + "contract": "RTokenP1", + "src": "contracts/p1/RToken.sol:59" + }, + { + "label": "__gap", + "offset": 0, + "slot": "367", + "type": "t_array(t_uint256)42_storage", + "contract": "RTokenP1", + "src": "contracts/p1/RToken.sol:536" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_uint256)42_storage": { + "label": "uint256[42]", + "numberOfBytes": "1344" + }, + "t_array(t_uint256)45_storage": { + "label": "uint256[45]", + "numberOfBytes": "1440" + }, + "t_array(t_uint256)48_storage": { + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(IAssetRegistry)24822": { + "label": "contract IAssetRegistry", + "numberOfBytes": "20" + }, + "t_contract(IBackingManager)24884": { + "label": "contract IBackingManager", + "numberOfBytes": "20" + }, + "t_contract(IBasketHandler)25131": { + "label": "contract IBasketHandler", + "numberOfBytes": "20" + }, + "t_contract(IFurnace)26171": { + "label": "contract IFurnace", + "numberOfBytes": "20" + }, + "t_contract(IMain)26615": { + "label": "contract IMain", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Counter)6400_storage)": { + "label": "mapping(address => struct CountersUpgradeable.Counter)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Counter)6400_storage": { + "label": "struct CountersUpgradeable.Counter", + "members": [ + { + "label": "_value", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Params)29636_storage": { + "label": "struct ThrottleLib.Params", + "members": [ + { + "label": "amtRate", + "type": "t_uint256", + "offset": 0, + "slot": "0" + }, + { + "label": "pctRate", + "type": "t_uint192", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Throttle)29644_storage": { + "label": "struct ThrottleLib.Throttle", + "members": [ + { + "label": "params", + "type": "t_struct(Params)29636_storage", + "offset": 0, + "slot": "0" + }, + { + "label": "lastTimestamp", + "type": "t_uint48", + "offset": 0, + "slot": "2" + }, + { + "label": "lastAvailable", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_uint192": { + "label": "uint192", + "numberOfBytes": "24" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "2ea71a5ba1eac5bb0c264e453e5886b4b378edf1164bf5292a0b3e6989933c2b": { + "address": "0x53321f03A7cce52413515DFD0527e0163ec69A46", + "txHash": "0xd1d7036ee0562557797266d49b3260261a198212725e596b185c62533f847c3e", + "layout": { + "solcVersion": "0.8.19", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:62", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:67" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC1967UpgradeUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol:211" + }, + { + "label": "__gap", + "offset": 0, + "slot": "101", + "type": "t_array(t_uint256)50_storage", + "contract": "UUPSUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol:107" + }, + { + "label": "main", + "offset": 0, + "slot": "151", + "type": "t_contract(IMain)26615", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:21" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage", + "contract": "ComponentP1", + "src": "contracts/p1/mixins/Component.sol:69" + }, + { + "label": "_HASHED_NAME", + "offset": 0, + "slot": "201", + "type": "t_bytes32", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol:32" + }, + { + "label": "_HASHED_VERSION", + "offset": 0, + "slot": "202", + "type": "t_bytes32", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol:33" + }, + { + "label": "__gap", + "offset": 0, + "slot": "203", + "type": "t_array(t_uint256)50_storage", + "contract": "EIP712Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol:120" + }, + { + "label": "name", + "offset": 0, + "slot": "253", + "type": "t_string_storage", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:48" + }, + { + "label": "symbol", + "offset": 0, + "slot": "254", + "type": "t_string_storage", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:49" + }, + { + "label": "assetRegistry", + "offset": 0, + "slot": "255", + "type": "t_contract(IAssetRegistry)24822", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:54" + }, + { + "label": "backingManager", + "offset": 0, + "slot": "256", + "type": "t_contract(IBackingManager)24884", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:55" + }, + { + "label": "basketHandler", + "offset": 0, + "slot": "257", + "type": "t_contract(IBasketHandler)25131", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:56" + }, + { + "label": "rsr", + "offset": 0, + "slot": "258", + "type": "t_contract(IERC20)15339", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:57" + }, + { + "label": "era", + "offset": 0, + "slot": "259", + "type": "t_uint256", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:62" + }, + { + "label": "stakes", + "offset": 0, + "slot": "260", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:66" + }, + { + "label": "totalStakes", + "offset": 0, + "slot": "261", + "type": "t_uint256", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:67" + }, + { + "label": "stakeRSR", + "offset": 0, + "slot": "262", + "type": "t_uint256", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:68" + }, + { + "label": "stakeRate", + "offset": 0, + "slot": "263", + "type": "t_uint192", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:69" + }, + { + "label": "_allowances", + "offset": 0, + "slot": "264", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_mapping(t_address,t_uint256)))", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:74" + }, + { + "label": "draftEra", + "offset": 0, + "slot": "265", + "type": "t_uint256", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:79" + }, + { + "label": "draftQueues", + "offset": 0, + "slot": "266", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(CumulativeDraft)51598_storage)dyn_storage))", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:87" + }, + { + "label": "firstRemainingDraft", + "offset": 0, + "slot": "267", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:88" + }, + { + "label": "totalDrafts", + "offset": 0, + "slot": "268", + "type": "t_uint256", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:89" + }, + { + "label": "draftRSR", + "offset": 0, + "slot": "269", + "type": "t_uint256", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:90" + }, + { + "label": "draftRate", + "offset": 0, + "slot": "270", + "type": "t_uint192", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:91" + }, + { + "label": "_nonces", + "offset": 0, + "slot": "271", + "type": "t_mapping(t_address,t_struct(Counter)6400_storage)", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:129" + }, + { + "label": "_delegationNonces", + "offset": 0, + "slot": "272", + "type": "t_mapping(t_address,t_struct(Counter)6400_storage)", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:131" + }, + { + "label": "unstakingDelay", + "offset": 0, + "slot": "273", + "type": "t_uint48", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:141" + }, + { + "label": "rewardRatio", + "offset": 6, + "slot": "273", + "type": "t_uint192", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:142" + }, + { + "label": "payoutLastPaid", + "offset": 0, + "slot": "274", + "type": "t_uint48", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:153" + }, + { + "label": "rsrRewardsAtLastPayout", + "offset": 0, + "slot": "275", + "type": "t_uint256", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:156" + }, + { + "label": "leaked", + "offset": 0, + "slot": "276", + "type": "t_uint192", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:162" + }, + { + "label": "lastWithdrawRefresh", + "offset": 24, + "slot": "276", + "type": "t_uint48", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:163" + }, + { + "label": "withdrawalLeak", + "offset": 0, + "slot": "277", + "type": "t_uint192", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:164" + }, + { + "label": "__gap", + "offset": 0, + "slot": "278", + "type": "t_array(t_uint256)28_storage", + "contract": "StRSRP1", + "src": "contracts/p1/StRSR.sol:1001" + }, + { + "label": "_delegates", + "offset": 0, + "slot": "306", + "type": "t_mapping(t_address,t_address)", + "contract": "StRSRP1Votes", + "src": "contracts/p1/StRSRVotes.sol:31" + }, + { + "label": "_eras", + "offset": 0, + "slot": "307", + "type": "t_array(t_struct(Checkpoint)53832_storage)dyn_storage", + "contract": "StRSRP1Votes", + "src": "contracts/p1/StRSRVotes.sol:34" + }, + { + "label": "_checkpoints", + "offset": 0, + "slot": "308", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(Checkpoint)53832_storage)dyn_storage))", + "contract": "StRSRP1Votes", + "src": "contracts/p1/StRSRVotes.sol:38" + }, + { + "label": "_totalSupplyCheckpoints", + "offset": 0, + "slot": "309", + "type": "t_mapping(t_uint256,t_array(t_struct(Checkpoint)53832_storage)dyn_storage)", + "contract": "StRSRP1Votes", + "src": "contracts/p1/StRSRVotes.sol:40" + }, + { + "label": "__gap", + "offset": 0, + "slot": "310", + "type": "t_array(t_uint256)46_storage", + "contract": "StRSRP1Votes", + "src": "contracts/p1/StRSRVotes.sol:243" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(Checkpoint)53832_storage)dyn_storage": { + "label": "struct StRSRP1Votes.Checkpoint[]", + "numberOfBytes": "32" + }, + "t_array(t_struct(CumulativeDraft)51598_storage)dyn_storage": { + "label": "struct StRSRP1.CumulativeDraft[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)28_storage": { + "label": "uint256[28]", + "numberOfBytes": "896" + }, + "t_array(t_uint256)46_storage": { + "label": "uint256[46]", + "numberOfBytes": "1472" + }, + "t_array(t_uint256)49_storage": { + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(IAssetRegistry)24822": { + "label": "contract IAssetRegistry", + "numberOfBytes": "20" + }, + "t_contract(IBackingManager)24884": { + "label": "contract IBackingManager", + "numberOfBytes": "20" + }, + "t_contract(IBasketHandler)25131": { + "label": "contract IBasketHandler", + "numberOfBytes": "20" + }, + "t_contract(IERC20)15339": { + "label": "contract IERC20", + "numberOfBytes": "20" + }, + "t_contract(IMain)26615": { + "label": "contract IMain", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_address)": { + "label": "mapping(address => address)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_array(t_struct(Checkpoint)53832_storage)dyn_storage)": { + "label": "mapping(address => struct StRSRP1Votes.Checkpoint[])", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_array(t_struct(CumulativeDraft)51598_storage)dyn_storage)": { + "label": "mapping(address => struct StRSRP1.CumulativeDraft[])", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(Counter)6400_storage)": { + "label": "mapping(address => struct CountersUpgradeable.Counter)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_array(t_struct(Checkpoint)53832_storage)dyn_storage)": { + "label": "mapping(uint256 => struct StRSRP1Votes.Checkpoint[])", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(Checkpoint)53832_storage)dyn_storage))": { + "label": "mapping(uint256 => mapping(address => struct StRSRP1Votes.Checkpoint[]))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_array(t_struct(CumulativeDraft)51598_storage)dyn_storage))": { + "label": "mapping(uint256 => mapping(address => struct StRSRP1.CumulativeDraft[]))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_mapping(t_address,t_uint256)))": { + "label": "mapping(uint256 => mapping(address => mapping(address => uint256)))", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { + "label": "mapping(uint256 => mapping(address => uint256))", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Checkpoint)53832_storage": { + "label": "struct StRSRP1Votes.Checkpoint", + "members": [ + { + "label": "fromBlock", + "type": "t_uint48", + "offset": 0, + "slot": "0" + }, + { + "label": "val", + "type": "t_uint224", + "offset": 0, + "slot": "1" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Counter)6400_storage": { + "label": "struct CountersUpgradeable.Counter", + "members": [ + { + "label": "_value", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(CumulativeDraft)51598_storage": { + "label": "struct StRSRP1.CumulativeDraft", + "members": [ + { + "label": "drafts", + "type": "t_uint176", + "offset": 0, + "slot": "0" + }, + { + "label": "availableAt", + "type": "t_uint64", + "offset": 22, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_uint176": { + "label": "uint176", + "numberOfBytes": "22" + }, + "t_uint192": { + "label": "uint192", + "numberOfBytes": "24" + }, + "t_uint224": { + "label": "uint224", + "numberOfBytes": "28" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint48": { + "label": "uint48", + "numberOfBytes": "6" + }, + "t_uint64": { + "label": "uint64", + "numberOfBytes": "8" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + } + } +} diff --git a/common/configuration.ts b/common/configuration.ts index 37cf05a0c..c9b10de79 100644 --- a/common/configuration.ts +++ b/common/configuration.ts @@ -27,7 +27,7 @@ export interface ITokens { aWBTC?: string aCRV?: string aEthUSDC?: string - aUSDbCv3?: string + aBasUSDbC?: string aWETHv3?: string acbETHv3?: string cDAI?: string @@ -109,6 +109,9 @@ interface INetworkConfig { MORPHO_AAVE_CONTROLLER?: string MORPHO_REWARDS_DISTRIBUTOR?: string MORPHO_AAVE_LENS?: string + COMET_REWARDS?: string + AAVE_V3_INCENTIVES_CONTROLLER?: string + AAVE_V3_POOL?: string } export const networkConfig: { [key: string]: INetworkConfig } = { @@ -212,6 +215,9 @@ export const networkConfig: { [key: string]: INetworkConfig } = { MORPHO_AAVE_LENS: '0x507fA343d0A90786d86C7cd885f5C49263A91FF4', MORPHO_AAVE_CONTROLLER: '0x777777c9898D384F785Ee44Acfe945efDFf5f3E0', MORPHO_REWARDS_DISTRIBUTOR: '0x3b14e5c73e0a56d607a8688098326fd4b4292135', + COMET_REWARDS: '0x1B0e765F6224C21223AeA2af16c1C46E38885a40', + AAVE_V3_POOL: '0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2', + AAVE_V3_INCENTIVES_CONTROLLER: '0x8164Cc65827dcFe994AB23944CBC90e0aa80bFcb', }, '1': { name: 'mainnet', @@ -304,6 +310,9 @@ export const networkConfig: { [key: string]: INetworkConfig } = { MORPHO_AAVE_LENS: '0x507fA343d0A90786d86C7cd885f5C49263A91FF4', MORPHO_AAVE_CONTROLLER: '0x777777c9898D384F785Ee44Acfe945efDFf5f3E0', MORPHO_REWARDS_DISTRIBUTOR: '0x3b14e5c73e0a56d607a8688098326fd4b4292135', + COMET_REWARDS: '0x1B0e765F6224C21223AeA2af16c1C46E38885a40', + AAVE_V3_POOL: '0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2', + AAVE_V3_INCENTIVES_CONTROLLER: '0x8164Cc65827dcFe994AB23944CBC90e0aa80bFcb', }, '3': { name: 'tenderly', @@ -396,6 +405,9 @@ export const networkConfig: { [key: string]: INetworkConfig } = { MORPHO_AAVE_LENS: '0x507fA343d0A90786d86C7cd885f5C49263A91FF4', MORPHO_AAVE_CONTROLLER: '0x777777c9898D384F785Ee44Acfe945efDFf5f3E0', MORPHO_REWARDS_DISTRIBUTOR: '0x3b14e5c73e0a56d607a8688098326fd4b4292135', + COMET_REWARDS: '0x1B0e765F6224C21223AeA2af16c1C46E38885a40', + AAVE_V3_POOL: '0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2', + AAVE_V3_INCENTIVES_CONTROLLER: '0x8164Cc65827dcFe994AB23944CBC90e0aa80bFcb', }, '5': { name: 'goerli', @@ -495,13 +507,13 @@ export const networkConfig: { [key: string]: INetworkConfig } = { WETH: '0x4200000000000000000000000000000000000006', cbETH: '0x2ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec22', cUSDbCv3: '0x9c4ec768c28520B50860ea7a15bd7213a9fF58bf', - aUSDbCv3: '0x0a1d576f3eFeF75b330424287a95A366e8281D54', + aBasUSDbC: '0x0a1d576f3eFeF75b330424287a95A366e8281D54', aWETHv3: '0xD4a0e0b9149BCee3C920d2E00b5dE09138fd8bb7', - acbETHv3: '0xcf3D55c10DB69f28fD1A75Bd73f3D8A2d9c595ad' + acbETHv3: '0xcf3D55c10DB69f28fD1A75Bd73f3D8A2d9c595ad', }, chainlinkFeeds: { DAI: '0x591e79239a7d679378ec8c847e5038150364c78f', // 0.3%, 24hr - ETH: '0x71041dddad3595f9ced3dccfbe3d1f4b0a16bb70', // 0.5%, 24hr + ETH: '0x71041dddad3595f9ced3dccfbe3d1f4b0a16bb70', // 0.15%, 20min WBTC: '0xccadc697c55bbb68dc5bcdf8d3cbe83cdd4e071e', // 0.5%, 24hr USDC: '0x7e860098f58bbfc8648a4311b374b1d669a2bc6b', // 0.3%, 24hr USDT: '0xf19d560eb8d2adf07bd6d13ed03e1d11215721f9', // 0.3%, 24hr @@ -512,6 +524,9 @@ export const networkConfig: { [key: string]: INetworkConfig } = { cbETHETHexr: '0x868a501e68F3D1E89CfC0D22F6b22E8dabce5F04', // 0.5%, 24hr }, GNOSIS_EASY_AUCTION: '0xb1875Feaeea32Bbb02DE83D81772e07E37A40f02', // mock + COMET_REWARDS: '0x123964802e6ABabBE1Bc9547D72Ef1B69B00A6b1', + AAVE_V3_POOL: '0xA238Dd80C259a72e81d7e4664a9801593F98d1c5', + AAVE_V3_INCENTIVES_CONTROLLER: '0xf9cc4F0D883F1a1eb2c253bdb46c254Ca51E1F44', }, } diff --git a/hardhat.config.ts b/hardhat.config.ts index 1fc54a3a5..7b540748d 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -142,6 +142,14 @@ const config: HardhatUserConfig = { etherscan: { apiKey: useEnv('ETHERSCAN_API_KEY'), customChains: [ + { + network: 'base', + chainId: 8453, + urls: { + apiURL: 'https://api.basescan.org/api', + browserURL: 'https://basescan.org', + }, + }, { network: 'base-goerli', chainId: 84531, diff --git a/scripts/addresses/base-3.0.0/8453-tmp-assets-collateral.json b/scripts/addresses/base-3.0.0/8453-tmp-assets-collateral.json new file mode 100644 index 000000000..ec42edd11 --- /dev/null +++ b/scripts/addresses/base-3.0.0/8453-tmp-assets-collateral.json @@ -0,0 +1,22 @@ +{ + "assets": { + "COMP": "0x277FD5f51fE53a9B3707a0383bF930B149C74ABf" + }, + "collateral": { + "DAI": "0x5EBE8927e5495e0A7731888C81AF463cD63602fb", + "WETH": "0x42D0fA25d6d5bff01aC050c0F5aB0B2C9D01b4a3", + "USDbC": "0x6490D66B17A1E9a460Ab54131165C8F921aCcDeB", + "cbETH": "0x5fE248625aC2AB0e17A115fef288f17AF1952402", + "cUSDbCv3": "0xa372EC846131FBf9AE8b589efa3D041D9a94dF41", + "aBasUSDbC": "0x1DdB7dfdC5D26FE1f2aD02d9972f12481346Ae9b" + }, + "erc20s": { + "COMP": "0x9e1028F5F1D5eDE59748FFceE5532509976840E0", + "DAI": "0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb", + "WETH": "0x4200000000000000000000000000000000000006", + "USDbC": "0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA", + "cbETH": "0x2ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec22", + "cUSDbCv3": "0xbC0033679AEf41Fb9FeB553Fdf55a8Bb2fC5B29e", + "aBasUSDbC": "0x308447562442Cc43978f8274fA722C9C14BafF8b" + } +} diff --git a/scripts/addresses/base-3.0.0/8453-tmp-deployments.json b/scripts/addresses/base-3.0.0/8453-tmp-deployments.json new file mode 100644 index 000000000..1cc976752 --- /dev/null +++ b/scripts/addresses/base-3.0.0/8453-tmp-deployments.json @@ -0,0 +1,35 @@ +{ + "prerequisites": { + "RSR": "0xaB36452DbAC151bE02b16Ca17d8919826072f64a", + "RSR_FEED": "0xAa98aE504658766Dfe11F31c5D95a0bdcABDe0b1", + "GNOSIS_EASY_AUCTION": "0xb1875Feaeea32Bbb02DE83D81772e07E37A40f02" + }, + "tradingLib": "0x4E01677488384B851EeAa09C8b8F6Dd0b16d7E9B", + "cvxMiningLib": "", + "facadeRead": "0xe1aa15DA8b993c6312BAeD91E0b470AE405F91BF", + "facadeAct": "0x3d6D679c863858E89e35c925F937F5814ca687F3", + "facadeWriteLib": "0x29e9740275D26fdeDBb0ABA8129C74c15c393027", + "basketLib": "0x199E12d58B36deE2D2B3dD2b91aD7bb25c787a71", + "facadeWrite": "0x0903048fD4E948c60451B41A48B35E0bafc0967F", + "deployer": "0xf1B06c2305445E34CF0147466352249724c2EAC1", + "rsrAsset": "0x23b57479327f9BccE6A1F6Be65F3dAa3C9Db797B", + "implementations": { + "main": "0x1D6d0B74E7A701aE5C2E11967b242E9861275143", + "trading": { + "gnosisTrade": "0xD4e1D5b1311C992b2735710D46A10284Bcd7D39F", + "dutchTrade": "0xDfCc89cf76aC93D113A21Da8fbfA63365b1E3DC7" + }, + "components": { + "assetRegistry": "0x9c387fc258061bd3E02c851F36aE227DB03a396C", + "backingManager": "0x63e12c3b2DBCaeF1835Bb99Ac1Fdb0Ebe1bE69bE", + "basketHandler": "0x25E92785C1AC01B397224E0534f3D626868A1Cbf", + "broker": "0x12c3BB1B0da85fDaE0137aE8fDe901F7D0e106ba", + "distributor": "0xd31de64957b79435bfc702044590ac417e02c19B", + "furnace": "0x45D7dFE976cdF80962d863A66918346a457b87Bd", + "rsrTrader": "0xAeA6BD7b231C0eC7f35C2bdf47A76053D09dbD09", + "rTokenTrader": "0xAeA6BD7b231C0eC7f35C2bdf47A76053D09dbD09", + "rToken": "0xA42850A760151bb3ACF17E7f8643EB4d864bF7a6", + "stRSR": "0x53321f03A7cce52413515DFD0527e0163ec69A46" + } + } +} diff --git a/scripts/addresses/mainnet-3.0.0/1-tmp-assets-collateral.json b/scripts/addresses/mainnet-3.0.0/1-tmp-assets-collateral.json index ca75461e7..7cb86310e 100644 --- a/scripts/addresses/mainnet-3.0.0/1-tmp-assets-collateral.json +++ b/scripts/addresses/mainnet-3.0.0/1-tmp-assets-collateral.json @@ -46,7 +46,8 @@ "maDAI": "0x9d38BFF9Af50738DF92a54Ceab2a2C2322BB1FAB", "maWBTC": "0x49A44d50d3B1E098DAC9402c4aF8D0C0E499F250", "maWETH": "0x878b995bDD2D9900BEE896Bd78ADd877672e1637", - "maStETH": "0x33E840e5711549358f6d4D11F9Ab2896B36E9822" + "maStETH": "0x33E840e5711549358f6d4D11F9Ab2896B36E9822", + "aEthUSDC": "0x12c3BB1B0da85fDaE0137aE8fDe901F7D0e106ba" }, "erc20s": { "stkAAVE": "0x4da27a545c0c5B758a6BA100e3a049001de870f5", @@ -93,6 +94,7 @@ "maDAI": "0xE2b16e14dB6216e33082D5A8Be1Ef01DF7511bBb", "maWBTC": "0xe0E1d3c6f09DA01399e84699722B11308607BBfC", "maWETH": "0x291ed25eB61fcc074156eE79c5Da87e5DA94198F", - "maStETH": "0x97F9d5ed17A0C99B279887caD5254d15fb1B619B" + "maStETH": "0x97F9d5ed17A0C99B279887caD5254d15fb1B619B", + "aEthUSDC": "0x63e12c3b2DBCaeF1835Bb99Ac1Fdb0Ebe1bE69bE" } } \ No newline at end of file diff --git a/scripts/deploy.ts b/scripts/deploy.ts index c1c1e1915..12e104aee 100644 --- a/scripts/deploy.ts +++ b/scripts/deploy.ts @@ -1,7 +1,7 @@ /* eslint-disable no-process-exit */ import hre from 'hardhat' import { getChainId } from '../common/blockchain-utils' -import { networkConfig } from '../common/configuration' +import { baseL2Chains, networkConfig } from '../common/configuration' import { sh } from './deployment/utils' async function main() { @@ -25,7 +25,8 @@ async function main() { // Part 1/3 of the *overall* deployment process: Deploy all contracts // See `confirm.ts` for part 2 - const scripts = [ + // Phase 1- Implementations + let scripts = [ 'phase1-common/0_setup_deployments.ts', 'phase1-common/1_deploy_libraries.ts', 'phase1-common/2_deploy_implementations.ts', @@ -34,35 +35,55 @@ async function main() { 'phase1-common/5_deploy_deployer.ts', 'phase1-common/6_deploy_facadeWrite.ts', 'phase1-common/7_deploy_facadeAct.ts', - // ============================================= - 'phase2-assets/0_setup_deployments.ts', - 'phase2-assets/1_deploy_assets.ts', - 'phase2-assets/assets/deploy_crv.ts', - 'phase2-assets/assets/deploy_cvx.ts', - 'phase2-assets/2_deploy_collateral.ts', - 'phase2-assets/collaterals/deploy_lido_wsteth_collateral.ts', - 'phase2-assets/collaterals/deploy_rocket_pool_reth_collateral.ts', - 'phase2-assets/collaterals/deploy_flux_finance_collateral.ts', - 'phase2-assets/collaterals/deploy_ctokenv3_usdc_collateral.ts', - 'phase2-assets/collaterals/deploy_convex_stable_plugin.ts', - 'phase2-assets/collaterals/deploy_convex_rToken_metapool_plugin.ts', - 'phase2-assets/collaterals/deploy_convex_stable_metapool_plugin.ts', - 'phase2-assets/collaterals/deploy_curve_stable_plugin.ts', - 'phase2-assets/collaterals/deploy_curve_rToken_metapool_plugin.ts', - 'phase2-assets/collaterals/deploy_curve_stable_metapool_plugin.ts', - 'phase2-assets/collaterals/deploy_dsr_sdai.ts', - 'phase2-assets/collaterals/deploy_cbeth_collateral.ts', - 'phase2-assets/collaterals/deploy_morpho_aavev2_plugin.ts', - 'phase2-assets/collaterals/deploy_aave_v3_usdc.ts', - // =============================================== - // These phase3 scripts will not deploy functional RTokens or Governance. They deploy bricked - // versions that are used for verification only. Further deployment is left up to the Register. - // 'phase3-rtoken/0_setup_deployments.ts', - // 'phase3-rtoken/1_deploy_rtoken.ts', - // 'phase3-rtoken/2_deploy_governance.ts', - // We can uncomment this section whenever we update governance, which will be rarely ] + // ============================================= + + // Phase 2 - Assets/Collateral + if (!baseL2Chains.includes(hre.network.name)) { + scripts.push( + 'phase2-assets/0_setup_deployments.ts', + 'phase2-assets/1_deploy_assets.ts', + 'phase2-assets/assets/deploy_crv.ts', + 'phase2-assets/assets/deploy_cvx.ts', + 'phase2-assets/2_deploy_collateral.ts', + 'phase2-assets/collaterals/deploy_lido_wsteth_collateral.ts', + 'phase2-assets/collaterals/deploy_rocket_pool_reth_collateral.ts', + 'phase2-assets/collaterals/deploy_flux_finance_collateral.ts', + 'phase2-assets/collaterals/deploy_ctokenv3_usdc_collateral.ts', + 'phase2-assets/collaterals/deploy_convex_stable_plugin.ts', + 'phase2-assets/collaterals/deploy_convex_rToken_metapool_plugin.ts', + 'phase2-assets/collaterals/deploy_convex_stable_metapool_plugin.ts', + 'phase2-assets/collaterals/deploy_curve_stable_plugin.ts', + 'phase2-assets/collaterals/deploy_curve_rToken_metapool_plugin.ts', + 'phase2-assets/collaterals/deploy_curve_stable_metapool_plugin.ts', + 'phase2-assets/collaterals/deploy_dsr_sdai.ts', + 'phase2-assets/collaterals/deploy_cbeth_collateral.ts', + 'phase2-assets/collaterals/deploy_morpho_aavev2_plugin.ts', + 'phase2-assets/collaterals/deploy_aave_v3_usdc.ts' + ) + } else if (chainId == '8453' || chainId == '84531') { + // Base L2 chains + scripts.push( + 'phase2-assets/0_setup_deployments.ts', + 'phase2-assets/1_deploy_assets.ts', + 'phase2-assets/2_deploy_collateral.ts', + 'phase2-assets/collaterals/deploy_cbeth_collateral.ts', + 'phase2-assets/collaterals/deploy_ctokenv3_usdbc_collateral.ts', + 'phase2-assets/collaterals/deploy_aave_v3_usdbc.ts' + ) + } + + // =============================================== + + // Phase 3 - RTokens + // These phase3 scripts will not deploy functional RTokens or Governance. They deploy bricked + // versions that are used for verification only. Further deployment is left up to the Register. + // 'phase3-rtoken/0_setup_deployments.ts', + // 'phase3-rtoken/1_deploy_rtoken.ts', + // 'phase3-rtoken/2_deploy_governance.ts', + // We can uncomment and prepare this section whenever we update governance, which will be rarely + for (const script of scripts) { console.log('\n===========================================\n', script, '') await sh(`hardhat run scripts/deployment/${script}`) diff --git a/scripts/deployment/phase1-common/1_deploy_libraries.ts b/scripts/deployment/phase1-common/1_deploy_libraries.ts index 764676c32..35fc34e37 100644 --- a/scripts/deployment/phase1-common/1_deploy_libraries.ts +++ b/scripts/deployment/phase1-common/1_deploy_libraries.ts @@ -1,7 +1,7 @@ import fs from 'fs' import hre, { ethers } from 'hardhat' import { getChainId } from '../../../common/blockchain-utils' -import { networkConfig } from '../../../common/configuration' +import { baseL2Chains, networkConfig } from '../../../common/configuration' import { getDeploymentFile, getDeploymentFilename, IDeployments } from '../common' import { validatePrerequisites } from '../utils' import { BasketLibP1, CvxMining, RecollateralizationLibP1 } from '../../../typechain' @@ -47,17 +47,19 @@ async function main() { fs.writeFileSync(deploymentFilename, JSON.stringify(deployments, null, 2)) // Deploy CvxMining external library - const CvxMiningFactory = await ethers.getContractFactory('CvxMining') - cvxMiningLib = await CvxMiningFactory.connect(burner).deploy() - await cvxMiningLib.deployed() - deployments.cvxMiningLib = cvxMiningLib.address + if (!baseL2Chains.includes(hre.network.name)) { + const CvxMiningFactory = await ethers.getContractFactory('CvxMining') + cvxMiningLib = await CvxMiningFactory.connect(burner).deploy() + await cvxMiningLib.deployed() + deployments.cvxMiningLib = cvxMiningLib.address - fs.writeFileSync(deploymentFilename, JSON.stringify(deployments, null, 2)) + fs.writeFileSync(deploymentFilename, JSON.stringify(deployments, null, 2)) + } console.log(`Deployed to ${hre.network.name} (${chainId}): TradingLib: ${tradingLib.address} BasketLib: ${basketLib.address} - CvxMiningLib: ${cvxMiningLib.address} + CvxMiningLib: ${cvxMiningLib ? cvxMiningLib.address : 'N/A'} Deployment file: ${deploymentFilename}`) } diff --git a/scripts/deployment/phase2-assets/1_deploy_assets.ts b/scripts/deployment/phase2-assets/1_deploy_assets.ts index 67d0c52b7..cab49a551 100644 --- a/scripts/deployment/phase2-assets/1_deploy_assets.ts +++ b/scripts/deployment/phase2-assets/1_deploy_assets.ts @@ -1,7 +1,7 @@ import fs from 'fs' import hre, { ethers } from 'hardhat' import { getChainId } from '../../../common/blockchain-utils' -import { networkConfig } from '../../../common/configuration' +import { baseL2Chains, networkConfig } from '../../../common/configuration' import { fp } from '../../../common/numbers' import { getDeploymentFile, @@ -37,19 +37,21 @@ async function main() { const deployedAssets: string[] = [] /******** Deploy StkAAVE Asset **************************/ - const { asset: stkAAVEAsset } = await hre.run('deploy-asset', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.AAVE, - oracleError: fp('0.01').toString(), // 1% - tokenAddress: networkConfig[chainId].tokens.stkAAVE, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr - }) - await (await ethers.getContractAt('Asset', stkAAVEAsset)).refresh() + if (!baseL2Chains.includes(hre.network.name)) { + const { asset: stkAAVEAsset } = await hre.run('deploy-asset', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.AAVE, + oracleError: fp('0.01').toString(), // 1% + tokenAddress: networkConfig[chainId].tokens.stkAAVE, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr + }) + await (await ethers.getContractAt('Asset', stkAAVEAsset)).refresh() - assetCollDeployments.assets.stkAAVE = stkAAVEAsset - assetCollDeployments.erc20s.stkAAVE = networkConfig[chainId].tokens.stkAAVE - deployedAssets.push(stkAAVEAsset.toString()) + assetCollDeployments.assets.stkAAVE = stkAAVEAsset + assetCollDeployments.erc20s.stkAAVE = networkConfig[chainId].tokens.stkAAVE + deployedAssets.push(stkAAVEAsset.toString()) + } /******** Deploy Comp Asset **************************/ const { asset: compAsset } = await hre.run('deploy-asset', { diff --git a/scripts/deployment/phase2-assets/2_deploy_collateral.ts b/scripts/deployment/phase2-assets/2_deploy_collateral.ts index 5a9dd0a3d..b232dc5ed 100644 --- a/scripts/deployment/phase2-assets/2_deploy_collateral.ts +++ b/scripts/deployment/phase2-assets/2_deploy_collateral.ts @@ -2,7 +2,7 @@ import fs from 'fs' import hre, { ethers } from 'hardhat' import { expect } from 'chai' import { getChainId } from '../../../common/blockchain-utils' -import { networkConfig } from '../../../common/configuration' +import { baseL2Chains, networkConfig } from '../../../common/configuration' import { bn, fp } from '../../../common/numbers' import { CollateralStatus } from '../../../common/constants' import { @@ -40,657 +40,733 @@ async function main() { // Get Oracle Lib address if previously deployed (can override with arbitrary address) const deployedCollateral: string[] = [] + let collateral: ICollateral + /******** Deploy Fiat Collateral - DAI **************************/ - const { collateral: daiCollateral } = await hre.run('deploy-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.DAI, - oracleError: fp('0.0025').toString(), // 0.25% - tokenAddress: networkConfig[chainId].tokens.DAI, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.0125').toString(), // 1.25% - delayUntilDefault: bn('86400').toString(), // 24h - }) - let collateral = await ethers.getContractAt('ICollateral', daiCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.DAI = daiCollateral - assetCollDeployments.erc20s.DAI = networkConfig[chainId].tokens.DAI - deployedCollateral.push(daiCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + const daiOracleTimeout = baseL2Chains.includes(hre.network.name) ? 86400 : 3600 // 24 hr (Base) or 1 hour + const daiOracleError = baseL2Chains.includes(hre.network.name) ? fp('0.003') : fp('0.0025') // 0.3% (Base) or 0.25% + + if (networkConfig[chainId].tokens.DAI && networkConfig[chainId].chainlinkFeeds.DAI) { + const { collateral: daiCollateral } = await hre.run('deploy-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.DAI, + oracleError: daiOracleError.toString(), + tokenAddress: networkConfig[chainId].tokens.DAI, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, daiOracleTimeout).toString(), + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.01').add(daiOracleError).toString(), + delayUntilDefault: bn('86400').toString(), // 24h + }) + collateral = await ethers.getContractAt('ICollateral', daiCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.DAI = daiCollateral + assetCollDeployments.erc20s.DAI = networkConfig[chainId].tokens.DAI + deployedCollateral.push(daiCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + } + + const usdcOracleTimeout = 86400 // 24 hr + const usdcOracleError = baseL2Chains.includes(hre.network.name) ? fp('0.003') : fp('0.0025') // 0.3% (Base) or 0.25% /******** Deploy Fiat Collateral - USDC **************************/ - const { collateral: usdcCollateral } = await hre.run('deploy-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.USDC, - oracleError: fp('0.0025').toString(), // 0.25% - tokenAddress: networkConfig[chainId].tokens.USDC, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.0125').toString(), // 1.25% - delayUntilDefault: bn('86400').toString(), // 24h - }) - collateral = await ethers.getContractAt('ICollateral', usdcCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) - - assetCollDeployments.collateral.USDC = usdcCollateral - assetCollDeployments.erc20s.USDC = networkConfig[chainId].tokens.USDC - deployedCollateral.push(usdcCollateral.toString()) + if (networkConfig[chainId].tokens.USDC && networkConfig[chainId].chainlinkFeeds.USDC) { + const { collateral: usdcCollateral } = await hre.run('deploy-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.USDC, + oracleError: usdcOracleError.toString(), + tokenAddress: networkConfig[chainId].tokens.USDC, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, usdcOracleTimeout).toString(), // 24 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.01').add(usdcOracleError).toString(), + delayUntilDefault: bn('86400').toString(), // 24h + }) + collateral = await ethers.getContractAt('ICollateral', usdcCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.USDC = usdcCollateral + assetCollDeployments.erc20s.USDC = networkConfig[chainId].tokens.USDC + deployedCollateral.push(usdcCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + } /******** Deploy Fiat Collateral - USDT **************************/ - const { collateral: usdtCollateral } = await hre.run('deploy-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.USDT, - oracleError: fp('0.0025').toString(), // 0.25% - tokenAddress: networkConfig[chainId].tokens.USDT, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.0125').toString(), // 1.25% - delayUntilDefault: bn('86400').toString(), // 24h - }) - collateral = await ethers.getContractAt('ICollateral', usdtCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.USDT = usdtCollateral - assetCollDeployments.erc20s.USDT = networkConfig[chainId].tokens.USDT - deployedCollateral.push(usdtCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + const usdtOracleTimeout = 86400 // 24 hr + const usdtOracleError = baseL2Chains.includes(hre.network.name) ? fp('0.003') : fp('0.0025') // 0.3% (Base) or 0.25% + + if (networkConfig[chainId].tokens.USDT && networkConfig[chainId].chainlinkFeeds.USDT) { + const { collateral: usdtCollateral } = await hre.run('deploy-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.USDT, + oracleError: usdtOracleError.toString(), + tokenAddress: networkConfig[chainId].tokens.USDT, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, usdtOracleTimeout).toString(), // 24 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.01').add(usdtOracleError).toString(), + delayUntilDefault: bn('86400').toString(), // 24h + }) + collateral = await ethers.getContractAt('ICollateral', usdtCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.USDT = usdtCollateral + assetCollDeployments.erc20s.USDT = networkConfig[chainId].tokens.USDT + deployedCollateral.push(usdtCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + } /******** Deploy Fiat Collateral - USDP **************************/ - const { collateral: usdpCollateral } = await hre.run('deploy-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.USDP, - oracleError: fp('0.01').toString(), // 1% - tokenAddress: networkConfig[chainId].tokens.USDP, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.02').toString(), // 2% - delayUntilDefault: bn('86400').toString(), // 24h - }) - collateral = await ethers.getContractAt('ICollateral', usdpCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.USDP = usdpCollateral - assetCollDeployments.erc20s.USDP = networkConfig[chainId].tokens.USDP - deployedCollateral.push(usdpCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) - /******** Deploy Fiat Collateral - TUSD **************************/ - const { collateral: tusdCollateral } = await hre.run('deploy-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.TUSD, - oracleError: fp('0.003').toString(), // 0.3% - tokenAddress: networkConfig[chainId].tokens.TUSD, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.013').toString(), // 1.3% - delayUntilDefault: bn('86400').toString(), // 24h - }) - collateral = await ethers.getContractAt('ICollateral', tusdCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.TUSD = tusdCollateral - assetCollDeployments.erc20s.TUSD = networkConfig[chainId].tokens.TUSD - deployedCollateral.push(tusdCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + if (networkConfig[chainId].tokens.USDP && networkConfig[chainId].chainlinkFeeds.USDP) { + const { collateral: usdpCollateral } = await hre.run('deploy-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.USDP, + oracleError: fp('0.01').toString(), // 1% + tokenAddress: networkConfig[chainId].tokens.USDP, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.02').toString(), // 2% + delayUntilDefault: bn('86400').toString(), // 24h + }) + collateral = await ethers.getContractAt('ICollateral', usdpCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.USDP = usdpCollateral + assetCollDeployments.erc20s.USDP = networkConfig[chainId].tokens.USDP + deployedCollateral.push(usdpCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + } + /******** Deploy Fiat Collateral - TUSD **************************/ + if (networkConfig[chainId].tokens.TUSD && networkConfig[chainId].chainlinkFeeds.TUSD) { + const { collateral: tusdCollateral } = await hre.run('deploy-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.TUSD, + oracleError: fp('0.003').toString(), // 0.3% + tokenAddress: networkConfig[chainId].tokens.TUSD, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.013').toString(), // 1.3% + delayUntilDefault: bn('86400').toString(), // 24h + }) + collateral = await ethers.getContractAt('ICollateral', tusdCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.TUSD = tusdCollateral + assetCollDeployments.erc20s.TUSD = networkConfig[chainId].tokens.TUSD + deployedCollateral.push(tusdCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + } /******** Deploy Fiat Collateral - BUSD **************************/ - const { collateral: busdCollateral } = await hre.run('deploy-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.BUSD, - oracleError: fp('0.005').toString(), // 0.5% - tokenAddress: networkConfig[chainId].tokens.BUSD, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.015').toString(), // 1.5% - delayUntilDefault: bn('86400').toString(), // 24h - }) - collateral = await ethers.getContractAt('ICollateral', busdCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.BUSD = busdCollateral - assetCollDeployments.erc20s.BUSD = networkConfig[chainId].tokens.BUSD - deployedCollateral.push(busdCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) - - /******** Deploy AToken Fiat Collateral - aDAI **************************/ - - // Get AToken to retrieve name and symbol - let aToken: ATokenMock = ( - await ethers.getContractAt('ATokenMock', networkConfig[chainId].tokens.aDAI as string) - ) - - // Wrap in StaticAToken - const StaticATokenFactory = await ethers.getContractFactory('StaticATokenLM') - const adaiStaticToken: StaticATokenLM = ( - await StaticATokenFactory.connect(burner).deploy( - networkConfig[chainId].AAVE_LENDING_POOL as string, - aToken.address, - 'Static ' + (await aToken.name()), - 's' + (await aToken.symbol()) + if (networkConfig[chainId].tokens.BUSD && networkConfig[chainId].chainlinkFeeds.BUSD) { + const { collateral: busdCollateral } = await hre.run('deploy-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.BUSD, + oracleError: fp('0.005').toString(), // 0.5% + tokenAddress: networkConfig[chainId].tokens.BUSD, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.015').toString(), // 1.5% + delayUntilDefault: bn('86400').toString(), // 24h + }) + collateral = await ethers.getContractAt('ICollateral', busdCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.BUSD = busdCollateral + assetCollDeployments.erc20s.BUSD = networkConfig[chainId].tokens.BUSD + deployedCollateral.push(busdCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + } + + /******** Base L2 - Deploy Fiat Collateral - USDbC **************************/ + if (networkConfig[chainId].tokens.USDbC && networkConfig[chainId].chainlinkFeeds.USDC) { + const { collateral: usdcCollateral } = await hre.run('deploy-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.USDC, + oracleError: usdcOracleError.toString(), + tokenAddress: networkConfig[chainId].tokens.USDbC, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, usdcOracleTimeout).toString(), // 24 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.01').add(usdcOracleError).toString(), // 1.3% + delayUntilDefault: bn('86400').toString(), // 24h + }) + collateral = await ethers.getContractAt('ICollateral', usdcCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.USDbC = usdcCollateral + assetCollDeployments.erc20s.USDbC = networkConfig[chainId].tokens.USDbC + deployedCollateral.push(usdcCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + } + + /*** AAVE V2 not available in Base L2s */ + if (!baseL2Chains.includes(hre.network.name)) { + /******** Deploy AToken Fiat Collateral - aDAI **************************/ + + // Get AToken to retrieve name and symbol + let aToken: ATokenMock = ( + await ethers.getContractAt('ATokenMock', networkConfig[chainId].tokens.aDAI as string) + ) + + // Wrap in StaticAToken + const StaticATokenFactory = await ethers.getContractFactory('StaticATokenLM') + const adaiStaticToken: StaticATokenLM = ( + await StaticATokenFactory.connect(burner).deploy( + networkConfig[chainId].AAVE_LENDING_POOL as string, + aToken.address, + 'Static ' + (await aToken.name()), + 's' + (await aToken.symbol()) + ) ) - ) - await adaiStaticToken.deployed() - console.log( - `Deployed StaticAToken for aDAI on ${hre.network.name} (${chainId}): ${adaiStaticToken.address} ` - ) - - const { collateral: aDaiCollateral } = await hre.run('deploy-atoken-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.DAI, - oracleError: fp('0.0025').toString(), // 0.25% - staticAToken: adaiStaticToken.address, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.0125').toString(), // 1.25% - delayUntilDefault: bn('86400').toString(), // 24h - revenueHiding: revenueHiding.toString(), - }) - collateral = await ethers.getContractAt('ICollateral', aDaiCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.aDAI = aDaiCollateral - assetCollDeployments.erc20s.aDAI = adaiStaticToken.address - deployedCollateral.push(aDaiCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) - - /******** Deploy AToken Fiat Collateral - aUSDC **************************/ - - // Get AToken to retrieve name and symbol - aToken = ( - await ethers.getContractAt('ATokenMock', networkConfig[chainId].tokens.aUSDC as string) - ) - - // Wrap in StaticAToken - const ausdcStaticToken: StaticATokenLM = ( - await StaticATokenFactory.connect(burner).deploy( - networkConfig[chainId].AAVE_LENDING_POOL as string, - aToken.address, - 'Static ' + (await aToken.name()), - 's' + (await aToken.symbol()) + await adaiStaticToken.deployed() + console.log( + `Deployed StaticAToken for aDAI on ${hre.network.name} (${chainId}): ${adaiStaticToken.address} ` ) - ) - await ausdcStaticToken.deployed() - - console.log( - `Deployed StaticAToken for aUSDC on ${hre.network.name} (${chainId}): ${ausdcStaticToken.address} ` - ) - - const { collateral: aUsdcCollateral } = await hre.run('deploy-atoken-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.USDC, - oracleError: fp('0.0025').toString(), // 0.25% - staticAToken: ausdcStaticToken.address, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.0125').toString(), // 1.25% - delayUntilDefault: bn('86400').toString(), // 24h - revenueHiding: revenueHiding.toString(), - }) - collateral = await ethers.getContractAt('ICollateral', aUsdcCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.aUSDC = aUsdcCollateral - assetCollDeployments.erc20s.aUSDC = ausdcStaticToken.address - deployedCollateral.push(aUsdcCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) - - /******** Deploy AToken Fiat Collateral - aUSDT **************************/ - - // Get AToken to retrieve name and symbol - aToken = ( - await ethers.getContractAt('ATokenMock', networkConfig[chainId].tokens.aUSDT as string) - ) - - // Wrap in StaticAToken - const ausdtStaticToken: StaticATokenLM = ( - await StaticATokenFactory.connect(burner).deploy( - networkConfig[chainId].AAVE_LENDING_POOL as string, - aToken.address, - 'Static ' + (await aToken.name()), - 's' + (await aToken.symbol()) + + const { collateral: aDaiCollateral } = await hre.run('deploy-atoken-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.DAI, + oracleError: fp('0.0025').toString(), // 0.25% + staticAToken: adaiStaticToken.address, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.0125').toString(), // 1.25% + delayUntilDefault: bn('86400').toString(), // 24h + revenueHiding: revenueHiding.toString(), + }) + collateral = await ethers.getContractAt('ICollateral', aDaiCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.aDAI = aDaiCollateral + assetCollDeployments.erc20s.aDAI = adaiStaticToken.address + deployedCollateral.push(aDaiCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + + /******** Deploy AToken Fiat Collateral - aUSDC **************************/ + + // Get AToken to retrieve name and symbol + aToken = ( + await ethers.getContractAt('ATokenMock', networkConfig[chainId].tokens.aUSDC as string) ) - ) - await ausdtStaticToken.deployed() - - console.log( - `Deployed StaticAToken for aUSDT on ${hre.network.name} (${chainId}): ${ausdtStaticToken.address} ` - ) - - const { collateral: aUsdtCollateral } = await hre.run('deploy-atoken-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.USDT, - oracleError: fp('0.0025').toString(), // 0.25% - staticAToken: ausdtStaticToken.address, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.0125').toString(), // 1.25% - delayUntilDefault: bn('86400').toString(), // 24h - revenueHiding: revenueHiding.toString(), - }) - collateral = await ethers.getContractAt('ICollateral', aUsdtCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.aUSDT = aUsdtCollateral - assetCollDeployments.erc20s.aUSDT = ausdtStaticToken.address - deployedCollateral.push(aUsdtCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) - - /******** Deploy AToken Fiat Collateral - aBUSD **************************/ - - // Get AToken to retrieve name and symbol - aToken = ( - await ethers.getContractAt('ATokenMock', networkConfig[chainId].tokens.aBUSD as string) - ) - - const abusdStaticToken: StaticATokenLM = ( - await StaticATokenFactory.connect(burner).deploy( - networkConfig[chainId].AAVE_LENDING_POOL as string, - aToken.address, - 'Static ' + (await aToken.name()), - 's' + (await aToken.symbol()) + + // Wrap in StaticAToken + const ausdcStaticToken: StaticATokenLM = ( + await StaticATokenFactory.connect(burner).deploy( + networkConfig[chainId].AAVE_LENDING_POOL as string, + aToken.address, + 'Static ' + (await aToken.name()), + 's' + (await aToken.symbol()) + ) ) - ) - await abusdStaticToken.deployed() - - console.log( - `Deployed StaticAToken for aBUSD on ${hre.network.name} (${chainId}): ${abusdStaticToken.address} ` - ) - - const { collateral: aBusdCollateral } = await hre.run('deploy-atoken-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.BUSD, - oracleError: fp('0.005').toString(), // 0.5% - staticAToken: abusdStaticToken.address, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.015').toString(), // 1.5% - delayUntilDefault: bn('86400').toString(), // 24h - revenueHiding: revenueHiding.toString(), - }) - collateral = await ethers.getContractAt('ICollateral', aBusdCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.aBUSD = aBusdCollateral - assetCollDeployments.erc20s.aBUSD = abusdStaticToken.address - deployedCollateral.push(aBusdCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) - - /******** Deploy AToken Fiat Collateral - aUSDP **************************/ - - // Get AToken to retrieve name and symbol - aToken = ( - await ethers.getContractAt('ATokenMock', networkConfig[chainId].tokens.aUSDP as string) - ) - - // Wrap in StaticAToken - const ausdpStaticToken: StaticATokenLM = ( - await StaticATokenFactory.connect(burner).deploy( - networkConfig[chainId].AAVE_LENDING_POOL as string, - aToken.address, - 'Static ' + (await aToken.name()), - 's' + (await aToken.symbol()) + await ausdcStaticToken.deployed() + + console.log( + `Deployed StaticAToken for aUSDC on ${hre.network.name} (${chainId}): ${ausdcStaticToken.address} ` ) - ) - await ausdpStaticToken.deployed() - - console.log( - `Deployed StaticAToken for aUSDP on ${hre.network.name} (${chainId}): ${ausdpStaticToken.address} ` - ) - - const { collateral: aUsdpCollateral } = await hre.run('deploy-atoken-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.USDP, - oracleError: fp('0.01').toString(), // 1% - staticAToken: ausdpStaticToken.address, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.02').toString(), // 2% - delayUntilDefault: bn('86400').toString(), // 24h - revenueHiding: revenueHiding.toString(), - }) - collateral = await ethers.getContractAt('ICollateral', aUsdpCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.aUSDP = aUsdpCollateral - assetCollDeployments.erc20s.aUSDP = ausdpStaticToken.address - deployedCollateral.push(aUsdpCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) - - /******** Deploy CToken Fiat Collateral - cDAI **************************/ - const CTokenFactory = await ethers.getContractFactory('CTokenWrapper') - const cDai = await ethers.getContractAt('IERC20Metadata', networkConfig[chainId].tokens.cDAI!) - - const cDaiVault = await CTokenFactory.deploy( - networkConfig[chainId].tokens.cDAI!, - `${await cDai.name()} Vault`, - `${await cDai.symbol()}-VAULT`, - networkConfig[chainId].COMPTROLLER! - ) - - await cDaiVault.deployed() - - console.log(`Deployed Vault for cDAI on ${hre.network.name} (${chainId}): ${cDaiVault.address} `) - - const { collateral: cDaiCollateral } = await hre.run('deploy-ctoken-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.DAI, - oracleError: fp('0.0025').toString(), // 0.25% - cToken: cDaiVault.address, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.0125').toString(), // 1.25% - delayUntilDefault: bn('86400').toString(), // 24h - revenueHiding: revenueHiding.toString(), - }) - collateral = await ethers.getContractAt('ICollateral', cDaiCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.cDAI = cDaiCollateral - assetCollDeployments.erc20s.cDAI = cDaiVault.address - deployedCollateral.push(cDaiCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) - - /******** Deploy CToken Fiat Collateral - cUSDC **************************/ - const cUsdc = await ethers.getContractAt('IERC20Metadata', networkConfig[chainId].tokens.cUSDC!) - - const cUsdcVault = await CTokenFactory.deploy( - networkConfig[chainId].tokens.cUSDC!, - `${await cUsdc.name()} Vault`, - `${await cUsdc.symbol()}-VAULT`, - networkConfig[chainId].COMPTROLLER! - ) - - await cUsdcVault.deployed() - - console.log( - `Deployed Vault for cUSDC on ${hre.network.name} (${chainId}): ${cUsdcVault.address} ` - ) - - const { collateral: cUsdcCollateral } = await hre.run('deploy-ctoken-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.USDC, - oracleError: fp('0.0025').toString(), // 0.25% - cToken: cUsdcVault.address, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.0125').toString(), // 1.25% - delayUntilDefault: bn('86400').toString(), // 24h - revenueHiding: revenueHiding.toString(), - }) - collateral = await ethers.getContractAt('ICollateral', cUsdcCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.cUSDC = cUsdcCollateral - assetCollDeployments.erc20s.cUSDC = cUsdcVault.address - deployedCollateral.push(cUsdcCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) - - /******** Deploy CToken Fiat Collateral - cUSDT **************************/ - const cUsdt = await ethers.getContractAt('IERC20Metadata', networkConfig[chainId].tokens.cUSDT!) - - const cUsdtVault = await CTokenFactory.deploy( - networkConfig[chainId].tokens.cUSDT!, - `${await cUsdt.name()} Vault`, - `${await cUsdt.symbol()}-VAULT`, - networkConfig[chainId].COMPTROLLER! - ) - - await cUsdtVault.deployed() - - console.log( - `Deployed Vault for cUSDT on ${hre.network.name} (${chainId}): ${cUsdtVault.address} ` - ) - - const { collateral: cUsdtCollateral } = await hre.run('deploy-ctoken-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.USDT, - oracleError: fp('0.0025').toString(), // 0.25% - cToken: cUsdtVault.address, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.0125').toString(), // 1.25% - delayUntilDefault: bn('86400').toString(), // 24h - revenueHiding: revenueHiding.toString(), - }) - collateral = await ethers.getContractAt('ICollateral', cUsdtCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.cUSDT = cUsdtCollateral - assetCollDeployments.erc20s.cUSDT = cUsdtVault.address - deployedCollateral.push(cUsdtCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) - - /******** Deploy CToken Fiat Collateral - cUSDP **************************/ - const cUsdp = await ethers.getContractAt('IERC20Metadata', networkConfig[chainId].tokens.cUSDP!) - - const cUsdpVault = await CTokenFactory.deploy( - networkConfig[chainId].tokens.cUSDP!, - `${await cUsdp.name()} Vault`, - `${await cUsdp.symbol()}-VAULT`, - networkConfig[chainId].COMPTROLLER! - ) - - await cUsdpVault.deployed() - - console.log( - `Deployed Vault for cUSDP on ${hre.network.name} (${chainId}): ${cUsdpVault.address} ` - ) - - const { collateral: cUsdpCollateral } = await hre.run('deploy-ctoken-fiat-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.USDP, - oracleError: fp('0.01').toString(), // 1% - cToken: cUsdpVault.address, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr - targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.02').toString(), // 2% - delayUntilDefault: bn('86400').toString(), // 24h - revenueHiding: revenueHiding.toString(), - }) - collateral = await ethers.getContractAt('ICollateral', cUsdpCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.cUSDP = cUsdpCollateral - assetCollDeployments.erc20s.cUSDP = cUsdpVault.address - deployedCollateral.push(cUsdpCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) - - /******** Deploy CToken Non-Fiat Collateral - cWBTC **************************/ - const cWBTC = await ethers.getContractAt('IERC20Metadata', networkConfig[chainId].tokens.cWBTC!) - - const cWBTCVault = await CTokenFactory.deploy( - networkConfig[chainId].tokens.cWBTC!, - `${await cWBTC.name()} Vault`, - `${await cWBTC.symbol()}-VAULT`, - networkConfig[chainId].COMPTROLLER! - ) - - await cWBTCVault.deployed() - - console.log( - `Deployed Vault for cWBTC on ${hre.network.name} (${chainId}): ${cWBTCVault.address} ` - ) + + const { collateral: aUsdcCollateral } = await hre.run('deploy-atoken-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.USDC, + oracleError: fp('0.0025').toString(), // 0.25% + staticAToken: ausdcStaticToken.address, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.0125').toString(), // 1.25% + delayUntilDefault: bn('86400').toString(), // 24h + revenueHiding: revenueHiding.toString(), + }) + collateral = await ethers.getContractAt('ICollateral', aUsdcCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.aUSDC = aUsdcCollateral + assetCollDeployments.erc20s.aUSDC = ausdcStaticToken.address + deployedCollateral.push(aUsdcCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + + /******** Deploy AToken Fiat Collateral - aUSDT **************************/ + + // Get AToken to retrieve name and symbol + aToken = ( + await ethers.getContractAt('ATokenMock', networkConfig[chainId].tokens.aUSDT as string) + ) + + // Wrap in StaticAToken + const ausdtStaticToken: StaticATokenLM = ( + await StaticATokenFactory.connect(burner).deploy( + networkConfig[chainId].AAVE_LENDING_POOL as string, + aToken.address, + 'Static ' + (await aToken.name()), + 's' + (await aToken.symbol()) + ) + ) + await ausdtStaticToken.deployed() + + console.log( + `Deployed StaticAToken for aUSDT on ${hre.network.name} (${chainId}): ${ausdtStaticToken.address} ` + ) + + const { collateral: aUsdtCollateral } = await hre.run('deploy-atoken-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.USDT, + oracleError: fp('0.0025').toString(), // 0.25% + staticAToken: ausdtStaticToken.address, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.0125').toString(), // 1.25% + delayUntilDefault: bn('86400').toString(), // 24h + revenueHiding: revenueHiding.toString(), + }) + collateral = await ethers.getContractAt('ICollateral', aUsdtCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.aUSDT = aUsdtCollateral + assetCollDeployments.erc20s.aUSDT = ausdtStaticToken.address + deployedCollateral.push(aUsdtCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + + /******** Deploy AToken Fiat Collateral - aBUSD **************************/ + + // Get AToken to retrieve name and symbol + aToken = ( + await ethers.getContractAt('ATokenMock', networkConfig[chainId].tokens.aBUSD as string) + ) + + const abusdStaticToken: StaticATokenLM = ( + await StaticATokenFactory.connect(burner).deploy( + networkConfig[chainId].AAVE_LENDING_POOL as string, + aToken.address, + 'Static ' + (await aToken.name()), + 's' + (await aToken.symbol()) + ) + ) + await abusdStaticToken.deployed() + + console.log( + `Deployed StaticAToken for aBUSD on ${hre.network.name} (${chainId}): ${abusdStaticToken.address} ` + ) + + const { collateral: aBusdCollateral } = await hre.run('deploy-atoken-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.BUSD, + oracleError: fp('0.005').toString(), // 0.5% + staticAToken: abusdStaticToken.address, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.015').toString(), // 1.5% + delayUntilDefault: bn('86400').toString(), // 24h + revenueHiding: revenueHiding.toString(), + }) + collateral = await ethers.getContractAt('ICollateral', aBusdCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.aBUSD = aBusdCollateral + assetCollDeployments.erc20s.aBUSD = abusdStaticToken.address + deployedCollateral.push(aBusdCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + + /******** Deploy AToken Fiat Collateral - aUSDP **************************/ + + // Get AToken to retrieve name and symbol + aToken = ( + await ethers.getContractAt('ATokenMock', networkConfig[chainId].tokens.aUSDP as string) + ) + + // Wrap in StaticAToken + const ausdpStaticToken: StaticATokenLM = ( + await StaticATokenFactory.connect(burner).deploy( + networkConfig[chainId].AAVE_LENDING_POOL as string, + aToken.address, + 'Static ' + (await aToken.name()), + 's' + (await aToken.symbol()) + ) + ) + await ausdpStaticToken.deployed() + + console.log( + `Deployed StaticAToken for aUSDP on ${hre.network.name} (${chainId}): ${ausdpStaticToken.address} ` + ) + + const { collateral: aUsdpCollateral } = await hre.run('deploy-atoken-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.USDP, + oracleError: fp('0.01').toString(), // 1% + staticAToken: ausdpStaticToken.address, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.02').toString(), // 2% + delayUntilDefault: bn('86400').toString(), // 24h + revenueHiding: revenueHiding.toString(), + }) + collateral = await ethers.getContractAt('ICollateral', aUsdpCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.aUSDP = aUsdpCollateral + assetCollDeployments.erc20s.aUSDP = ausdpStaticToken.address + deployedCollateral.push(aUsdpCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + } const wbtcOracleError = fp('0.02') // 2% const btcOracleError = fp('0.005') // 0.5% const combinedBTCWBTCError = combinedError(wbtcOracleError, btcOracleError) - const { collateral: cWBTCCollateral } = await hre.run('deploy-ctoken-nonfiat-collateral', { - priceTimeout: priceTimeout.toString(), - referenceUnitFeed: networkConfig[chainId].chainlinkFeeds.WBTC, - targetUnitFeed: networkConfig[chainId].chainlinkFeeds.BTC, - combinedOracleError: combinedBTCWBTCError.toString(), - cToken: cWBTCVault.address, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr - targetUnitOracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr - targetName: hre.ethers.utils.formatBytes32String('BTC'), - defaultThreshold: fp('0.01').add(combinedBTCWBTCError).toString(), // ~3.5% - delayUntilDefault: bn('86400').toString(), // 24h - revenueHiding: revenueHiding.toString(), - }) - collateral = await ethers.getContractAt('ICollateral', cWBTCCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.cWBTC = cWBTCCollateral - assetCollDeployments.erc20s.cWBTC = cWBTCVault.address - deployedCollateral.push(cWBTCCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) - - /******** Deploy CToken Self-Referential Collateral - cETH **************************/ - const cETH = await ethers.getContractAt('IERC20Metadata', networkConfig[chainId].tokens.cETH!) - - const cETHVault = await CTokenFactory.deploy( - networkConfig[chainId].tokens.cETH!, - `${await cETH.name()} Vault`, - `${await cETH.symbol()}-VAULT`, - networkConfig[chainId].COMPTROLLER! - ) - - await cETHVault.deployed() - - console.log(`Deployed Vault for cETH on ${hre.network.name} (${chainId}): ${cETHVault.address} `) - - const { collateral: cETHCollateral } = await hre.run('deploy-ctoken-selfreferential-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.ETH, - oracleError: fp('0.005').toString(), // 0.5% - cToken: cETHVault.address, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr - targetName: hre.ethers.utils.formatBytes32String('ETH'), - revenueHiding: revenueHiding.toString(), - referenceERC20Decimals: '18', - }) - collateral = await ethers.getContractAt('ICollateral', cETHCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.cETH = cETHCollateral - assetCollDeployments.erc20s.cETH = cETHVault.address - deployedCollateral.push(cETHCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + /*** Compound V2 not available in Base L2s */ + if (!baseL2Chains.includes(hre.network.name)) { + /******** Deploy CToken Fiat Collateral - cDAI **************************/ + const CTokenFactory = await ethers.getContractFactory('CTokenWrapper') + const cDai = await ethers.getContractAt('IERC20Metadata', networkConfig[chainId].tokens.cDAI!) + + const cDaiVault = await CTokenFactory.deploy( + networkConfig[chainId].tokens.cDAI!, + `${await cDai.name()} Vault`, + `${await cDai.symbol()}-VAULT`, + networkConfig[chainId].COMPTROLLER! + ) - /******** Deploy Non-Fiat Collateral - wBTC **************************/ - const { collateral: wBTCCollateral } = await hre.run('deploy-nonfiat-collateral', { - priceTimeout: priceTimeout.toString(), - referenceUnitFeed: networkConfig[chainId].chainlinkFeeds.WBTC, - targetUnitFeed: networkConfig[chainId].chainlinkFeeds.BTC, - combinedOracleError: combinedBTCWBTCError.toString(), - tokenAddress: networkConfig[chainId].tokens.WBTC, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr - targetUnitOracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr - targetName: ethers.utils.formatBytes32String('BTC'), - defaultThreshold: fp('0.01').add(combinedBTCWBTCError).toString(), // ~3.5% - delayUntilDefault: bn('86400').toString(), // 24h - }) - collateral = await ethers.getContractAt('ICollateral', wBTCCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.WBTC = wBTCCollateral - assetCollDeployments.erc20s.WBTC = networkConfig[chainId].tokens.WBTC - deployedCollateral.push(wBTCCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + await cDaiVault.deployed() + + console.log( + `Deployed Vault for cDAI on ${hre.network.name} (${chainId}): ${cDaiVault.address} ` + ) + + const { collateral: cDaiCollateral } = await hre.run('deploy-ctoken-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.DAI, + oracleError: fp('0.0025').toString(), // 0.25% + cToken: cDaiVault.address, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.0125').toString(), // 1.25% + delayUntilDefault: bn('86400').toString(), // 24h + revenueHiding: revenueHiding.toString(), + }) + collateral = await ethers.getContractAt('ICollateral', cDaiCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.cDAI = cDaiCollateral + assetCollDeployments.erc20s.cDAI = cDaiVault.address + deployedCollateral.push(cDaiCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + + /******** Deploy CToken Fiat Collateral - cUSDC **************************/ + const cUsdc = await ethers.getContractAt('IERC20Metadata', networkConfig[chainId].tokens.cUSDC!) + + const cUsdcVault = await CTokenFactory.deploy( + networkConfig[chainId].tokens.cUSDC!, + `${await cUsdc.name()} Vault`, + `${await cUsdc.symbol()}-VAULT`, + networkConfig[chainId].COMPTROLLER! + ) + + await cUsdcVault.deployed() + + console.log( + `Deployed Vault for cUSDC on ${hre.network.name} (${chainId}): ${cUsdcVault.address} ` + ) + + const { collateral: cUsdcCollateral } = await hre.run('deploy-ctoken-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.USDC, + oracleError: fp('0.0025').toString(), // 0.25% + cToken: cUsdcVault.address, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.0125').toString(), // 1.25% + delayUntilDefault: bn('86400').toString(), // 24h + revenueHiding: revenueHiding.toString(), + }) + collateral = await ethers.getContractAt('ICollateral', cUsdcCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.cUSDC = cUsdcCollateral + assetCollDeployments.erc20s.cUSDC = cUsdcVault.address + deployedCollateral.push(cUsdcCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + + /******** Deploy CToken Fiat Collateral - cUSDT **************************/ + const cUsdt = await ethers.getContractAt('IERC20Metadata', networkConfig[chainId].tokens.cUSDT!) + + const cUsdtVault = await CTokenFactory.deploy( + networkConfig[chainId].tokens.cUSDT!, + `${await cUsdt.name()} Vault`, + `${await cUsdt.symbol()}-VAULT`, + networkConfig[chainId].COMPTROLLER! + ) + + await cUsdtVault.deployed() + + console.log( + `Deployed Vault for cUSDT on ${hre.network.name} (${chainId}): ${cUsdtVault.address} ` + ) + + const { collateral: cUsdtCollateral } = await hre.run('deploy-ctoken-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.USDT, + oracleError: fp('0.0025').toString(), // 0.25% + cToken: cUsdtVault.address, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.0125').toString(), // 1.25% + delayUntilDefault: bn('86400').toString(), // 24h + revenueHiding: revenueHiding.toString(), + }) + collateral = await ethers.getContractAt('ICollateral', cUsdtCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.cUSDT = cUsdtCollateral + assetCollDeployments.erc20s.cUSDT = cUsdtVault.address + deployedCollateral.push(cUsdtCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + + /******** Deploy CToken Fiat Collateral - cUSDP **************************/ + const cUsdp = await ethers.getContractAt('IERC20Metadata', networkConfig[chainId].tokens.cUSDP!) + + const cUsdpVault = await CTokenFactory.deploy( + networkConfig[chainId].tokens.cUSDP!, + `${await cUsdp.name()} Vault`, + `${await cUsdp.symbol()}-VAULT`, + networkConfig[chainId].COMPTROLLER! + ) + + await cUsdpVault.deployed() + + console.log( + `Deployed Vault for cUSDP on ${hre.network.name} (${chainId}): ${cUsdpVault.address} ` + ) + const { collateral: cUsdpCollateral } = await hre.run('deploy-ctoken-fiat-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.USDP, + oracleError: fp('0.01').toString(), // 1% + cToken: cUsdpVault.address, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.02').toString(), // 2% + delayUntilDefault: bn('86400').toString(), // 24h + revenueHiding: revenueHiding.toString(), + }) + collateral = await ethers.getContractAt('ICollateral', cUsdpCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.cUSDP = cUsdpCollateral + assetCollDeployments.erc20s.cUSDP = cUsdpVault.address + deployedCollateral.push(cUsdpCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + + /******** Deploy CToken Non-Fiat Collateral - cWBTC **************************/ + const cWBTC = await ethers.getContractAt('IERC20Metadata', networkConfig[chainId].tokens.cWBTC!) + + const cWBTCVault = await CTokenFactory.deploy( + networkConfig[chainId].tokens.cWBTC!, + `${await cWBTC.name()} Vault`, + `${await cWBTC.symbol()}-VAULT`, + networkConfig[chainId].COMPTROLLER! + ) + + await cWBTCVault.deployed() + + console.log( + `Deployed Vault for cWBTC on ${hre.network.name} (${chainId}): ${cWBTCVault.address} ` + ) + + const { collateral: cWBTCCollateral } = await hre.run('deploy-ctoken-nonfiat-collateral', { + priceTimeout: priceTimeout.toString(), + referenceUnitFeed: networkConfig[chainId].chainlinkFeeds.WBTC, + targetUnitFeed: networkConfig[chainId].chainlinkFeeds.BTC, + combinedOracleError: combinedBTCWBTCError.toString(), + cToken: cWBTCVault.address, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr + targetUnitOracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr + targetName: hre.ethers.utils.formatBytes32String('BTC'), + defaultThreshold: fp('0.01').add(combinedBTCWBTCError).toString(), // ~3.5% + delayUntilDefault: bn('86400').toString(), // 24h + revenueHiding: revenueHiding.toString(), + }) + collateral = await ethers.getContractAt('ICollateral', cWBTCCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.cWBTC = cWBTCCollateral + assetCollDeployments.erc20s.cWBTC = cWBTCVault.address + deployedCollateral.push(cWBTCCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + + /******** Deploy CToken Self-Referential Collateral - cETH **************************/ + const cETH = await ethers.getContractAt('IERC20Metadata', networkConfig[chainId].tokens.cETH!) + + const cETHVault = await CTokenFactory.deploy( + networkConfig[chainId].tokens.cETH!, + `${await cETH.name()} Vault`, + `${await cETH.symbol()}-VAULT`, + networkConfig[chainId].COMPTROLLER! + ) + + await cETHVault.deployed() + + console.log( + `Deployed Vault for cETH on ${hre.network.name} (${chainId}): ${cETHVault.address} ` + ) + + const { collateral: cETHCollateral } = await hre.run( + 'deploy-ctoken-selfreferential-collateral', + { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.ETH, + oracleError: fp('0.005').toString(), // 0.5% + cToken: cETHVault.address, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr + targetName: hre.ethers.utils.formatBytes32String('ETH'), + revenueHiding: revenueHiding.toString(), + referenceERC20Decimals: '18', + } + ) + collateral = await ethers.getContractAt('ICollateral', cETHCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.cETH = cETHCollateral + assetCollDeployments.erc20s.cETH = cETHVault.address + deployedCollateral.push(cETHCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + } + + /******** Deploy Non-Fiat Collateral - wBTC **************************/ + if ( + networkConfig[chainId].tokens.WBTC && + networkConfig[chainId].chainlinkFeeds.BTC && + networkConfig[chainId].chainlinkFeeds.WBTC + ) { + const { collateral: wBTCCollateral } = await hre.run('deploy-nonfiat-collateral', { + priceTimeout: priceTimeout.toString(), + referenceUnitFeed: networkConfig[chainId].chainlinkFeeds.WBTC, + targetUnitFeed: networkConfig[chainId].chainlinkFeeds.BTC, + combinedOracleError: combinedBTCWBTCError.toString(), + tokenAddress: networkConfig[chainId].tokens.WBTC, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr + targetUnitOracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr + targetName: ethers.utils.formatBytes32String('BTC'), + defaultThreshold: fp('0.01').add(combinedBTCWBTCError).toString(), // ~3.5% + delayUntilDefault: bn('86400').toString(), // 24h + }) + collateral = await ethers.getContractAt('ICollateral', wBTCCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.WBTC = wBTCCollateral + assetCollDeployments.erc20s.WBTC = networkConfig[chainId].tokens.WBTC + deployedCollateral.push(wBTCCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + } /******** Deploy Self Referential Collateral - wETH **************************/ - const { collateral: wETHCollateral } = await hre.run('deploy-selfreferential-collateral', { - priceTimeout: priceTimeout.toString(), - priceFeed: networkConfig[chainId].chainlinkFeeds.ETH, - oracleError: fp('0.005').toString(), // 0.5% - tokenAddress: networkConfig[chainId].tokens.WETH, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr - targetName: hre.ethers.utils.formatBytes32String('ETH'), - }) - collateral = await ethers.getContractAt('ICollateral', wETHCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.WETH = wETHCollateral - assetCollDeployments.erc20s.WETH = networkConfig[chainId].tokens.WETH - deployedCollateral.push(wETHCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + if (networkConfig[chainId].tokens.WETH && networkConfig[chainId].chainlinkFeeds.ETH) { + const ethOracleTimeout = baseL2Chains.includes(hre.network.name) ? 1200 : 3600 // 20 min (Base) or 1 hr + const ethOracleError = baseL2Chains.includes(hre.network.name) ? fp('0.0015') : fp('0.005') // 0.15% (Base) or 0.5% + + const { collateral: wETHCollateral } = await hre.run('deploy-selfreferential-collateral', { + priceTimeout: priceTimeout.toString(), + priceFeed: networkConfig[chainId].chainlinkFeeds.ETH, + oracleError: ethOracleError.toString(), + tokenAddress: networkConfig[chainId].tokens.WETH, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, ethOracleTimeout).toString(), + targetName: hre.ethers.utils.formatBytes32String('ETH'), + }) + collateral = await ethers.getContractAt('ICollateral', wETHCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.WETH = wETHCollateral + assetCollDeployments.erc20s.WETH = networkConfig[chainId].tokens.WETH + deployedCollateral.push(wETHCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + } /******** Deploy EUR Fiat Collateral - EURT **************************/ const eurtError = fp('0.02') // 2% - const { collateral: eurtCollateral } = await hre.run('deploy-eurfiat-collateral', { - priceTimeout: priceTimeout.toString(), - referenceUnitFeed: networkConfig[chainId].chainlinkFeeds.EURT, - targetUnitFeed: networkConfig[chainId].chainlinkFeeds.EUR, - oracleError: eurtError.toString(), // 2% - tokenAddress: networkConfig[chainId].tokens.EURT, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr - targetUnitOracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr - targetName: ethers.utils.formatBytes32String('EUR'), - defaultThreshold: fp('0.03').toString(), // 3% - delayUntilDefault: bn('86400').toString(), // 24h - }) - collateral = await ethers.getContractAt('ICollateral', eurtCollateral) - await (await collateral.refresh()).wait() - expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - - assetCollDeployments.collateral.EURT = eurtCollateral - assetCollDeployments.erc20s.EURT = networkConfig[chainId].tokens.EURT - deployedCollateral.push(eurtCollateral.toString()) - - fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + if ( + networkConfig[chainId].tokens.EURT && + networkConfig[chainId].chainlinkFeeds.EUR && + networkConfig[chainId].chainlinkFeeds.EURT + ) { + const { collateral: eurtCollateral } = await hre.run('deploy-eurfiat-collateral', { + priceTimeout: priceTimeout.toString(), + referenceUnitFeed: networkConfig[chainId].chainlinkFeeds.EURT, + targetUnitFeed: networkConfig[chainId].chainlinkFeeds.EUR, + oracleError: eurtError.toString(), // 2% + tokenAddress: networkConfig[chainId].tokens.EURT, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr + targetUnitOracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24 hr + targetName: ethers.utils.formatBytes32String('EUR'), + defaultThreshold: fp('0.03').toString(), // 3% + delayUntilDefault: bn('86400').toString(), // 24h + }) + collateral = await ethers.getContractAt('ICollateral', eurtCollateral) + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + assetCollDeployments.collateral.EURT = eurtCollateral + assetCollDeployments.erc20s.EURT = networkConfig[chainId].tokens.EURT + deployedCollateral.push(eurtCollateral.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + } console.log(`Deployed collateral to ${hre.network.name} (${chainId}) New deployments: ${deployedCollateral} diff --git a/scripts/deployment/phase2-assets/collaterals/deploy_aave_v3_usdbc.ts b/scripts/deployment/phase2-assets/collaterals/deploy_aave_v3_usdbc.ts new file mode 100644 index 000000000..e7fbc9851 --- /dev/null +++ b/scripts/deployment/phase2-assets/collaterals/deploy_aave_v3_usdbc.ts @@ -0,0 +1,110 @@ +import fs from 'fs' +import hre, { ethers } from 'hardhat' +import { getChainId } from '../../../../common/blockchain-utils' +import { baseL2Chains, networkConfig } from '../../../../common/configuration' +import { expect } from 'chai' +import { CollateralStatus } from '../../../../common/constants' +import { + getDeploymentFile, + getAssetCollDeploymentFilename, + IAssetCollDeployments, + getDeploymentFilename, + fileExists, +} from '../../common' +import { bn, fp } from '#/common/numbers' +import { AaveV3FiatCollateral } from '../../../../typechain' +import { priceTimeout, revenueHiding, oracleTimeout } from '../../utils' + +// This file specifically deploys Aave V3 USDC collateral + +async function main() { + // ==== Read Configuration ==== + const [deployer] = await hre.ethers.getSigners() + + const chainId = await getChainId(hre) + + console.log(`Deploying Collateral to network ${hre.network.name} (${chainId}) + with burner account: ${deployer.address}`) + + if (!networkConfig[chainId]) { + throw new Error(`Missing network configuration for ${hre.network.name}`) + } + + // Only exists on Base L2 + if (!baseL2Chains.includes(hre.network.name)) { + throw new Error(`Invalid network ${hre.network.name} - only available on Base`) + } + + // Get phase1 deployment + const phase1File = getDeploymentFilename(chainId) + if (!fileExists(phase1File)) { + throw new Error(`${phase1File} doesn't exist yet. Run phase 1`) + } + + // Check previous step completed + const assetCollDeploymentFilename = getAssetCollDeploymentFilename(chainId) + const assetCollDeployments = getDeploymentFile(assetCollDeploymentFilename) + + const deployedCollateral: string[] = [] + + /******** Deploy Aave V3 USDbC wrapper **************************/ + + const StaticATokenFactory = await hre.ethers.getContractFactory('StaticATokenV3LM') + const erc20 = await StaticATokenFactory.deploy( + networkConfig[chainId].AAVE_V3_POOL!, + networkConfig[chainId].AAVE_V3_INCENTIVES_CONTROLLER! + ) + await erc20.deployed() + await ( + await erc20.initialize( + networkConfig[chainId].tokens.aBasUSDbC!, + 'Static Aave Base USDbC', + 'saBasUSDbC' + ) + ).wait() + + console.log( + `Deployed wrapper for Aave V3 USDbC on ${hre.network.name} (${chainId}): ${erc20.address} ` + ) + + /******** Deploy Aave V3 USDbC collateral plugin **************************/ + + const CollateralFactory = await ethers.getContractFactory('AaveV3FiatCollateral') + const collateral = await CollateralFactory.connect(deployer).deploy( + { + priceTimeout: priceTimeout, + chainlinkFeed: networkConfig[chainId].chainlinkFeeds.USDC!, + oracleError: fp('0.003'), // 3% + erc20: erc20.address, + maxTradeVolume: fp('1e6'), + oracleTimeout: oracleTimeout(chainId, bn('86400')), // 24 hr + targetName: ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.013'), + delayUntilDefault: bn('86400'), + }, + revenueHiding + ) + + await collateral.deployed() + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + console.log( + `Deployed Aave V3 USDbC collateral to ${hre.network.name} (${chainId}): ${collateral.address}` + ) + + assetCollDeployments.collateral.aBasUSDbC = collateral.address + assetCollDeployments.erc20s.aBasUSDbC = erc20.address + deployedCollateral.push(collateral.address.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + + console.log(`Deployed collateral to ${hre.network.name} (${chainId}) + New deployments: ${deployedCollateral} + Deployment file: ${assetCollDeploymentFilename}`) +} + +main().catch((error) => { + console.error(error) + process.exitCode = 1 +}) diff --git a/scripts/deployment/phase2-assets/collaterals/deploy_aave_v3_usdc.ts b/scripts/deployment/phase2-assets/collaterals/deploy_aave_v3_usdc.ts index d8b18059a..2d56f9d3f 100644 --- a/scripts/deployment/phase2-assets/collaterals/deploy_aave_v3_usdc.ts +++ b/scripts/deployment/phase2-assets/collaterals/deploy_aave_v3_usdc.ts @@ -1,7 +1,7 @@ import fs from 'fs' import hre, { ethers } from 'hardhat' import { getChainId } from '../../../../common/blockchain-utils' -import { networkConfig } from '../../../../common/configuration' +import { baseL2Chains, networkConfig } from '../../../../common/configuration' import { expect } from 'chai' import { CollateralStatus } from '../../../../common/constants' import { @@ -14,10 +14,6 @@ import { import { bn, fp } from '#/common/numbers' import { AaveV3FiatCollateral } from '../../../../typechain' import { priceTimeout, revenueHiding, oracleTimeout } from '../../utils' -import { - AAVE_V3_USDC_POOL, - AAVE_V3_INCENTIVES_CONTROLLER, -} from '../../../../test/plugins/individual-collateral/aave-v3/constants' // This file specifically deploys Aave V3 USDC collateral @@ -34,6 +30,11 @@ async function main() { throw new Error(`Missing network configuration for ${hre.network.name}`) } + // Only exists on Mainnet + if (baseL2Chains.includes(hre.network.name)) { + throw new Error(`Invalid network ${hre.network.name} - only available on Mainnet`) + } + // Get phase1 deployment const phase1File = getDeploymentFilename(chainId) if (!fileExists(phase1File)) { @@ -49,7 +50,10 @@ async function main() { /******** Deploy Aave V3 USDC wrapper **************************/ const StaticATokenFactory = await hre.ethers.getContractFactory('StaticATokenV3LM') - const erc20 = await StaticATokenFactory.deploy(AAVE_V3_USDC_POOL, AAVE_V3_INCENTIVES_CONTROLLER) + const erc20 = await StaticATokenFactory.deploy( + networkConfig[chainId].AAVE_V3_POOL!, + networkConfig[chainId].AAVE_V3_INCENTIVES_CONTROLLER! + ) await erc20.deployed() await ( await erc20.initialize( @@ -64,18 +68,20 @@ async function main() { ) /******** Deploy Aave V3 USDC collateral plugin **************************/ + const usdcOracleTimeout = 86400 // 24 hr + const usdcOracleError = baseL2Chains.includes(hre.network.name) ? fp('0.003') : fp('0.0025') // 0.3% (Base) or 0.25% const CollateralFactory = await ethers.getContractFactory('AaveV3FiatCollateral') const collateral = await CollateralFactory.connect(deployer).deploy( { priceTimeout: priceTimeout, chainlinkFeed: networkConfig[chainId].chainlinkFeeds.USDC!, - oracleError: fp('0.0025'), + oracleError: usdcOracleError, erc20: erc20.address, maxTradeVolume: fp('1e6'), - oracleTimeout: oracleTimeout(chainId, bn('86400')), + oracleTimeout: oracleTimeout(chainId, usdcOracleTimeout), targetName: ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.0125'), + defaultThreshold: fp('0.01').add(usdcOracleError), delayUntilDefault: bn('86400'), }, revenueHiding diff --git a/scripts/deployment/phase2-assets/collaterals/deploy_cbeth_collateral.ts b/scripts/deployment/phase2-assets/collaterals/deploy_cbeth_collateral.ts index 1e27c4260..eab685015 100644 --- a/scripts/deployment/phase2-assets/collaterals/deploy_cbeth_collateral.ts +++ b/scripts/deployment/phase2-assets/collaterals/deploy_cbeth_collateral.ts @@ -1,7 +1,7 @@ import fs from 'fs' import hre from 'hardhat' import { getChainId } from '../../../../common/blockchain-utils' -import { networkConfig } from '../../../../common/configuration' +import { baseL2Chains, networkConfig } from '../../../../common/configuration' import { bn, fp } from '../../../../common/numbers' import { expect } from 'chai' import { CollateralStatus } from '../../../../common/constants' @@ -13,7 +13,12 @@ import { fileExists, } from '../../common' import { priceTimeout, oracleTimeout, combinedError } from '../../utils' -import { CBEthCollateral, CBEthCollateralL2, CBEthCollateralL2__factory, CBEthCollateral__factory } from '../../../../typechain' +import { + CBEthCollateral, + CBEthCollateralL2, + CBEthCollateralL2__factory, + CBEthCollateral__factory, +} from '../../../../typechain' async function main() { // ==== Read Configuration ==== @@ -41,15 +46,15 @@ async function main() { /******** Deploy Coinbase ETH Collateral - CBETH **************************/ - let collateral: CBEthCollateral | CBEthCollateralL2; + let collateral: CBEthCollateral | CBEthCollateralL2 - if (chainId == '1' || chainId == '1337' || chainId == '31337') { + if (!baseL2Chains.includes(hre.network.name)) { const CBETHCollateralFactory: CBEthCollateral__factory = (await hre.ethers.getContractFactory( 'CBEthCollateral' )) as CBEthCollateral__factory - + const oracleError = combinedError(fp('0.005'), fp('0.02')) // 0.5% & 2% - + collateral = await CBETHCollateralFactory.connect(deployer).deploy( { priceTimeout: priceTimeout.toString(), @@ -69,23 +74,24 @@ async function main() { await collateral.deployed() await (await collateral.refresh()).wait() expect(await collateral.status()).to.equal(CollateralStatus.SOUND) - } else if (chainId == '8453') { + } else if (chainId == '8453' || chainId == '84531') { + // Base L2 chains const CBETHCollateralFactory: CBEthCollateralL2__factory = (await hre.ethers.getContractFactory( 'CBEthCollateralL2' )) as CBEthCollateralL2__factory - - const oracleError = combinedError(fp('0.005'), fp('0.02')) // 0.5% & 2% - + + const oracleError = combinedError(fp('0.0015'), fp('0.005')) // 0.15% & 0.5% + collateral = await CBETHCollateralFactory.connect(deployer).deploy( { priceTimeout: priceTimeout.toString(), chainlinkFeed: networkConfig[chainId].chainlinkFeeds.ETH!, - oracleError: oracleError.toString(), // 0.5% & 2%, + oracleError: oracleError.toString(), // 0.15% & 0.5%, erc20: networkConfig[chainId].tokens.cbETH!, maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr, + oracleTimeout: oracleTimeout(chainId, '1200').toString(), // 20 min targetName: hre.ethers.utils.formatBytes32String('ETH'), - defaultThreshold: fp('0.02').add(oracleError).toString(), // ~4.5% + defaultThreshold: fp('0.02').add(oracleError).toString(), // ~2.5% delayUntilDefault: bn('86400').toString(), // 24h }, fp('1e-4').toString(), // revenueHiding = 0.01% diff --git a/scripts/deployment/phase2-assets/collaterals/deploy_ctokenv3_usdbc_collateral.ts b/scripts/deployment/phase2-assets/collaterals/deploy_ctokenv3_usdbc_collateral.ts new file mode 100644 index 000000000..3f4755ff7 --- /dev/null +++ b/scripts/deployment/phase2-assets/collaterals/deploy_ctokenv3_usdbc_collateral.ts @@ -0,0 +1,104 @@ +import fs from 'fs' +import hre from 'hardhat' +import { getChainId } from '../../../../common/blockchain-utils' +import { baseL2Chains, networkConfig } from '../../../../common/configuration' +import { bn, fp } from '../../../../common/numbers' +import { expect } from 'chai' +import { CollateralStatus } from '../../../../common/constants' +import { + getDeploymentFile, + getAssetCollDeploymentFilename, + IAssetCollDeployments, + getDeploymentFilename, + fileExists, +} from '../../common' +import { priceTimeout, oracleTimeout, revenueHiding } from '../../utils' +import { CTokenV3Collateral } from '../../../../typechain' +import { ContractFactory } from 'ethers' + +async function main() { + // ==== Read Configuration ==== + const [deployer] = await hre.ethers.getSigners() + + const chainId = await getChainId(hre) + + console.log(`Deploying Collateral to network ${hre.network.name} (${chainId}) + with burner account: ${deployer.address}`) + + if (!networkConfig[chainId]) { + throw new Error(`Missing network configuration for ${hre.network.name}`) + } + + // Only exists on Base L2 + if (!baseL2Chains.includes(hre.network.name)) { + throw new Error(`Invalid network ${hre.network.name} - only available on Base`) + } + + // Get phase1 deployment + const phase1File = getDeploymentFilename(chainId) + if (!fileExists(phase1File)) { + throw new Error(`${phase1File} doesn't exist yet. Run phase 1`) + } + // Check previous step completed + const assetCollDeploymentFilename = getAssetCollDeploymentFilename(chainId) + const assetCollDeployments = getDeploymentFile(assetCollDeploymentFilename) + + const deployedCollateral: string[] = [] + + /******** Deploy CompoundV3 USDC - cUSDbCv3 **************************/ + + const WrapperFactory: ContractFactory = await hre.ethers.getContractFactory('CusdcV3Wrapper') + const erc20 = await WrapperFactory.deploy( + networkConfig[chainId].tokens.cUSDbCv3, + networkConfig[chainId].COMET_REWARDS, + networkConfig[chainId].tokens.COMP + ) + await erc20.deployed() + + console.log( + `Deployed wrapper for cUSDbCv3 on ${hre.network.name} (${chainId}): ${erc20.address} ` + ) + + const CTokenV3Factory: ContractFactory = await hre.ethers.getContractFactory('CTokenV3Collateral') + + const usdcOracleTimeout = 86400 // 24 hr + const usdcOracleError = fp('0.003') // 0.3% (Base) + + const collateral = await CTokenV3Factory.connect(deployer).deploy( + { + priceTimeout: priceTimeout.toString(), + chainlinkFeed: networkConfig[chainId].chainlinkFeeds.USDC, + oracleError: usdcOracleError.toString(), + erc20: erc20.address, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, usdcOracleTimeout).toString(), // 24h hr, + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.01').add(usdcOracleError).toString(), // 1% + 0.3% + delayUntilDefault: bn('86400').toString(), // 24h + }, + revenueHiding.toString(), + bn('10000e6').toString() // $10k + ) + await collateral.deployed() + await (await collateral.refresh()).wait() + expect(await collateral.status()).to.equal(CollateralStatus.SOUND) + + console.log( + `Deployed CompoundV3 USDbC to ${hre.network.name} (${chainId}): ${collateral.address}` + ) + + assetCollDeployments.collateral.cUSDbCv3 = collateral.address + assetCollDeployments.erc20s.cUSDbCv3 = erc20.address + deployedCollateral.push(collateral.address.toString()) + + fs.writeFileSync(assetCollDeploymentFilename, JSON.stringify(assetCollDeployments, null, 2)) + + console.log(`Deployed collateral to ${hre.network.name} (${chainId}) + New deployments: ${deployedCollateral} + Deployment file: ${assetCollDeploymentFilename}`) +} + +main().catch((error) => { + console.error(error) + process.exitCode = 1 +}) diff --git a/scripts/deployment/phase2-assets/collaterals/deploy_ctokenv3_usdc_collateral.ts b/scripts/deployment/phase2-assets/collaterals/deploy_ctokenv3_usdc_collateral.ts index a6d0bd5e8..873b8fbcc 100644 --- a/scripts/deployment/phase2-assets/collaterals/deploy_ctokenv3_usdc_collateral.ts +++ b/scripts/deployment/phase2-assets/collaterals/deploy_ctokenv3_usdc_collateral.ts @@ -1,7 +1,7 @@ import fs from 'fs' import hre from 'hardhat' import { getChainId } from '../../../../common/blockchain-utils' -import { networkConfig } from '../../../../common/configuration' +import { baseL2Chains, networkConfig } from '../../../../common/configuration' import { bn, fp } from '../../../../common/numbers' import { expect } from 'chai' import { CollateralStatus } from '../../../../common/constants' @@ -29,6 +29,11 @@ async function main() { throw new Error(`Missing network configuration for ${hre.network.name}`) } + // Only exists on Mainnet + if (baseL2Chains.includes(hre.network.name)) { + throw new Error(`Invalid network ${hre.network.name} - only available on Mainnet`) + } + // Get phase1 deployment const phase1File = getDeploymentFilename(chainId) if (!fileExists(phase1File)) { @@ -40,13 +45,12 @@ async function main() { const deployedCollateral: string[] = [] - /******** Deploy CompoundV3 USDC - cUSDCv3 **************************/ + /******** Deploy CompoundV3 USDC - cUSDCv3 **************************/ const WrapperFactory: ContractFactory = await hre.ethers.getContractFactory('CusdcV3Wrapper') - const erc20 = await WrapperFactory.deploy( networkConfig[chainId].tokens.cUSDCv3, - '0x1B0e765F6224C21223AeA2af16c1C46E38885a40', + networkConfig[chainId].COMET_REWARDS, networkConfig[chainId].tokens.COMP ) await erc20.deployed() @@ -55,16 +59,19 @@ async function main() { const CTokenV3Factory: ContractFactory = await hre.ethers.getContractFactory('CTokenV3Collateral') + const usdcOracleTimeout = 86400 // 24 hr + const usdcOracleError = baseL2Chains.includes(hre.network.name) ? fp('0.003') : fp('0.0025') // 0.3% (Base) or 0.25% + const collateral = await CTokenV3Factory.connect(deployer).deploy( { priceTimeout: priceTimeout.toString(), chainlinkFeed: networkConfig[chainId].chainlinkFeeds.USDC, - oracleError: fp('0.0025').toString(), // 0.25%, + oracleError: usdcOracleError.toString(), erc20: erc20.address, maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24h hr, + oracleTimeout: oracleTimeout(chainId, usdcOracleTimeout).toString(), // 24h hr, targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.0125').toString(), // 1% + 0.25% + defaultThreshold: fp('0.01').add(usdcOracleError).toString(), delayUntilDefault: bn('86400').toString(), // 24h }, revenueHiding.toString(), diff --git a/scripts/deployment/utils.ts b/scripts/deployment/utils.ts index a76d0f4e6..84dad2be5 100644 --- a/scripts/deployment/utils.ts +++ b/scripts/deployment/utils.ts @@ -17,7 +17,7 @@ export const longOracleTimeout = bn('4294967296') // Returns the base plus 1 minute export const oracleTimeout = (chainId: string, base: BigNumberish) => { - return chainId == '1' ? bn('60').add(base) : longOracleTimeout + return chainId == '1' || chainId == '8453' ? bn('60').add(base) : longOracleTimeout } export const combinedError = (x: BigNumber, y: BigNumber): BigNumber => { diff --git a/scripts/verification/6_verify_collateral.ts b/scripts/verification/6_verify_collateral.ts index fc5314d16..f857f2887 100644 --- a/scripts/verification/6_verify_collateral.ts +++ b/scripts/verification/6_verify_collateral.ts @@ -1,7 +1,7 @@ import hre, { ethers } from 'hardhat' import { getChainId } from '../../common/blockchain-utils' -import { developmentChains, networkConfig } from '../../common/configuration' +import { baseL2Chains, developmentChains, networkConfig } from '../../common/configuration' import { fp, bn } from '../../common/numbers' import { getDeploymentFile, @@ -34,6 +34,9 @@ async function main() { deployments = getDeploymentFile(assetCollDeploymentFilename) /******** Verify Fiat Collateral - DAI **************************/ + const daiOracleTimeout = baseL2Chains.includes(hre.network.name) ? 86400 : 3600 // 24 hr (Base) or 1 hour + const daiOracleError = baseL2Chains.includes(hre.network.name) ? fp('0.003') : fp('0.0025') // 0.3% (Base) or 0.25% + await verifyContract( chainId, deployments.collateral.DAI, @@ -41,17 +44,43 @@ async function main() { { priceTimeout: priceTimeout.toString(), chainlinkFeed: networkConfig[chainId].chainlinkFeeds.DAI, - oracleError: fp('0.0025').toString(), // 0.25% + oracleError: daiOracleError.toString(), erc20: networkConfig[chainId].tokens.DAI, maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr + oracleTimeout: oracleTimeout(chainId, daiOracleTimeout).toString(), targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.0125').toString(), // 1.25% + defaultThreshold: fp('0.01').add(daiOracleError).toString(), delayUntilDefault: bn('86400').toString(), // 24h }, ], 'contracts/plugins/assets/FiatCollateral.sol:FiatCollateral' ) + + /******** Verify Fiat Collateral - USDbC **************************/ + const usdcOracleTimeout = 86400 // 24 hr + const usdcOracleError = baseL2Chains.includes(hre.network.name) ? fp('0.003') : fp('0.0025') // 0.3% (Base) or 0.25% + + if (baseL2Chains.includes(hre.network.name)) { + await verifyContract( + chainId, + deployments.collateral.USDbC, + [ + { + priceTimeout: priceTimeout.toString(), + chainlinkFeed: networkConfig[chainId].chainlinkFeeds.USDC, + oracleError: usdcOracleError.toString(), + erc20: networkConfig[chainId].tokens.USDbC, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, usdcOracleTimeout).toString(), + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.01').add(usdcOracleError).toString(), + delayUntilDefault: bn('86400').toString(), // 24h + }, + ], + 'contracts/plugins/assets/FiatCollateral.sol:FiatCollateral' + ) + } + /******** Verify StaticATokenLM - aDAI **************************/ // Get AToken to retrieve name and symbol const aToken: ATokenMock = ( @@ -200,7 +229,11 @@ async function main() { ], 'contracts/plugins/assets/NonFiatCollateral.sol:NonFiatCollateral' ) + /********************** Verify SelfReferentialCollateral - WETH ****************************************/ + const ethOracleTimeout = baseL2Chains.includes(hre.network.name) ? 1200 : 3600 // 20 min (Base) or 1 hr + const ethOracleError = baseL2Chains.includes(hre.network.name) ? fp('0.0015') : fp('0.005') // 0.15% (Base) or 0.5% + await verifyContract( chainId, deployments.collateral.WETH, @@ -208,10 +241,10 @@ async function main() { { priceTimeout: priceTimeout.toString(), chainlinkFeed: networkConfig[chainId].chainlinkFeeds.ETH, - oracleError: fp('0.005').toString(), // 0.5% + oracleError: ethOracleError.toString(), // 0.5% erc20: networkConfig[chainId].tokens.WETH, maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '3600').toString(), + oracleTimeout: oracleTimeout(chainId, ethOracleTimeout).toString(), targetName: hre.ethers.utils.formatBytes32String('ETH'), defaultThreshold: '0', delayUntilDefault: '0', diff --git a/scripts/verification/collateral-plugins/verify_aave_v3_usdbc.ts b/scripts/verification/collateral-plugins/verify_aave_v3_usdbc.ts new file mode 100644 index 000000000..edb092d1a --- /dev/null +++ b/scripts/verification/collateral-plugins/verify_aave_v3_usdbc.ts @@ -0,0 +1,71 @@ +import hre, { ethers } from 'hardhat' +import { getChainId } from '../../../common/blockchain-utils' +import { baseL2Chains, developmentChains, networkConfig } from '../../../common/configuration' +import { + getDeploymentFile, + getAssetCollDeploymentFilename, + IAssetCollDeployments, +} from '../../deployment/common' +import { fp, bn } from '../../../common/numbers' +import { priceTimeout, oracleTimeout, verifyContract, revenueHiding } from '../../deployment/utils' + +let deployments: IAssetCollDeployments + +async function main() { + // ********** Read config ********** + const chainId = await getChainId(hre) + if (!networkConfig[chainId]) { + throw new Error(`Missing network configuration for ${hre.network.name}`) + } + + if (developmentChains.includes(hre.network.name)) { + throw new Error(`Cannot verify contracts for development chain ${hre.network.name}`) + } + + // Only exists on Base L2 + if (!baseL2Chains.includes(hre.network.name)) { + throw new Error(`Invalid network ${hre.network.name} - only available on Base`) + } + + const assetCollDeploymentFilename = getAssetCollDeploymentFilename(chainId) + deployments = getDeploymentFile(assetCollDeploymentFilename) + + /******** Verify Wrapper **************************/ + const erc20 = await ethers.getContractAt( + 'StaticATokenV3LM', + deployments.erc20s.aBasUSDbC as string + ) + + await verifyContract( + chainId, + deployments.erc20s.aBasUSDbC, + [await erc20.POOL(), await erc20.INCENTIVES_CONTROLLER()], + 'contracts/plugins/assets/aave-v3/vendor/StaticATokenV3LM.sol:StaticATokenV3LM' + ) + + /******** Verify Aave V3 USDbC plugin **************************/ + await verifyContract( + chainId, + deployments.collateral.aBasUSDbC, + [ + { + erc20: erc20.address, + targetName: ethers.utils.formatBytes32String('USD'), + priceTimeout: priceTimeout.toString(), + chainlinkFeed: networkConfig[chainId].chainlinkFeeds.USDC!, + oracleError: fp('0.003').toString(), // 3% + oracleTimeout: oracleTimeout(chainId, bn('86400')).toString(), // 24 hr + maxTradeVolume: fp('1e6').toString(), + defaultThreshold: fp('0.013').toString(), + delayUntilDefault: bn('86400').toString(), + }, + revenueHiding.toString(), + ], + 'contracts/plugins/assets/aave-v3/AaveV3FiatCollateral.sol:AaveV3FiatCollateral' + ) +} + +main().catch((error) => { + console.error(error) + process.exitCode = 1 +}) diff --git a/scripts/verification/collateral-plugins/verify_aave_v3_usdc.ts b/scripts/verification/collateral-plugins/verify_aave_v3_usdc.ts index 3dd46b4ea..1486c37ca 100644 --- a/scripts/verification/collateral-plugins/verify_aave_v3_usdc.ts +++ b/scripts/verification/collateral-plugins/verify_aave_v3_usdc.ts @@ -1,14 +1,13 @@ import hre, { ethers } from 'hardhat' import { getChainId } from '../../../common/blockchain-utils' -import { developmentChains, networkConfig } from '../../../common/configuration' +import { baseL2Chains, developmentChains, networkConfig } from '../../../common/configuration' import { getDeploymentFile, getAssetCollDeploymentFilename, IAssetCollDeployments, } from '../../deployment/common' -import { verifyContract } from '../../deployment/utils' -import { revenueHiding } from '../../deployment/utils' -import { defaultCollateralOpts } from '../../../test/plugins/individual-collateral/aave-v3/AaveV3FiatCollateral.test' +import { fp, bn } from '../../../common/numbers' +import { priceTimeout, oracleTimeout, verifyContract, revenueHiding } from '../../deployment/utils' let deployments: IAssetCollDeployments @@ -40,10 +39,8 @@ async function main() { ) /******** Verify Aave V3 USDC plugin **************************/ - const collateral = await ethers.getContractAt( - 'AaveV3FiatCollateral', - deployments.collateral.aEthUSDC as string - ) + const usdcOracleTimeout = 86400 // 24 hr + const usdcOracleError = baseL2Chains.includes(hre.network.name) ? fp('0.003') : fp('0.0025') // 0.3% (Base) or 0.25% await verifyContract( chainId, @@ -51,14 +48,14 @@ async function main() { [ { erc20: erc20.address, - targetName: await collateral.targetName(), - priceTimeout: await collateral.priceTimeout(), - chainlinkFeed: await collateral.chainlinkFeed(), - oracleError: await collateral.oracleError(), - oracleTimeout: await collateral.oracleTimeout(), - maxTradeVolume: await collateral.maxTradeVolume(), - defaultThreshold: defaultCollateralOpts.defaultThreshold.toString(), - delayUntilDefault: await collateral.delayUntilDefault(), + targetName: ethers.utils.formatBytes32String('USD'), + priceTimeout: priceTimeout.toString(), + chainlinkFeed: networkConfig[chainId].chainlinkFeeds.USDC!, + oracleError: usdcOracleError.toString(), + oracleTimeout: oracleTimeout(chainId, usdcOracleTimeout).toString(), // 24 hr + maxTradeVolume: fp('1e6').toString(), + defaultThreshold: fp('0.01').add(usdcOracleError).toString(), + delayUntilDefault: bn('86400').toString(), }, revenueHiding.toString(), ], diff --git a/scripts/verification/collateral-plugins/verify_cbeth.ts b/scripts/verification/collateral-plugins/verify_cbeth.ts index 5b6a81f30..4e58ad88d 100644 --- a/scripts/verification/collateral-plugins/verify_cbeth.ts +++ b/scripts/verification/collateral-plugins/verify_cbeth.ts @@ -1,6 +1,6 @@ import hre from 'hardhat' import { getChainId } from '../../../common/blockchain-utils' -import { developmentChains, networkConfig } from '../../../common/configuration' +import { baseL2Chains, developmentChains, networkConfig } from '../../../common/configuration' import { fp, bn } from '../../../common/numbers' import { getDeploymentFile, @@ -26,28 +26,57 @@ async function main() { deployments = getDeploymentFile(assetCollDeploymentFilename) /******** Verify Coinbase staked ETH - CBETH **************************/ - const oracleError = combinedError(fp('0.005'), fp('0.02')) // 0.5% & 2% - await verifyContract( - chainId, - deployments.collateral.cbETH, - [ - { - priceTimeout: priceTimeout.toString(), - chainlinkFeed: networkConfig[chainId].chainlinkFeeds.ETH, - oracleError: oracleError.toString(), // 0.5% & 2%, - erc20: networkConfig[chainId].tokens.cbETH!, - maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr, - targetName: hre.ethers.utils.formatBytes32String('ETH'), - defaultThreshold: fp('0.02').add(oracleError).toString(), // ~4.5% - delayUntilDefault: bn('86400').toString(), // 24h - }, - fp('1e-4'), // revenueHiding = 0.01% - networkConfig[chainId].chainlinkFeeds.cbETH!, // refPerTokChainlinkFeed - oracleTimeout(chainId, '86400').toString(), // refPerTokChainlinkTimeout - ], - 'contracts/plugins/assets/cbeth/CBETHCollateral.sol:CBEthCollateral' - ) + + if (!baseL2Chains.includes(hre.network.name)) { + const oracleError = combinedError(fp('0.005'), fp('0.02')) // 0.5% & 2% + + await verifyContract( + chainId, + deployments.collateral.cbETH, + [ + { + priceTimeout: priceTimeout.toString(), + chainlinkFeed: networkConfig[chainId].chainlinkFeeds.ETH, + oracleError: oracleError.toString(), // 0.5% & 2% + erc20: networkConfig[chainId].tokens.cbETH!, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '3600').toString(), // 1 hr + targetName: hre.ethers.utils.formatBytes32String('ETH'), + defaultThreshold: fp('0.02').add(oracleError).toString(), // ~4.5% + delayUntilDefault: bn('86400').toString(), // 24h + }, + fp('1e-4'), // revenueHiding = 0.01% + networkConfig[chainId].chainlinkFeeds.cbETH!, // refPerTokChainlinkFeed + oracleTimeout(chainId, '86400').toString(), // refPerTokChainlinkTimeout + ], + 'contracts/plugins/assets/cbeth/CBETHCollateral.sol:CBEthCollateral' + ) + } else if (chainId == '8453' || chainId == '84531') { + const oracleError = combinedError(fp('0.0015'), fp('0.005')) // 0.15% & 0.5% + await verifyContract( + chainId, + deployments.collateral.cbETH, + [ + { + priceTimeout: priceTimeout.toString(), + chainlinkFeed: networkConfig[chainId].chainlinkFeeds.ETH, + oracleError: oracleError.toString(), // 0.15% & 0.5%, + erc20: networkConfig[chainId].tokens.cbETH!, + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, '1200').toString(), // 20 min + targetName: hre.ethers.utils.formatBytes32String('ETH'), + defaultThreshold: fp('0.02').add(oracleError).toString(), // ~2.5% + delayUntilDefault: bn('86400').toString(), // 24h + }, + fp('1e-4'), // revenueHiding = 0.01% + networkConfig[chainId].chainlinkFeeds.cbETH!, // refPerTokChainlinkFeed + oracleTimeout(chainId, '86400').toString(), // refPerTokChainlinkTimeout + networkConfig[chainId].chainlinkFeeds.cbETHETHexr!, // exchangeRateChainlinkFeed + oracleTimeout(chainId, '86400').toString(), // exchangeRateChainlinkTimeout + ], + 'contracts/plugins/assets/cbeth/CBETHCollateralL2.sol:CBEthCollateralL2' + ) + } } main().catch((error) => { diff --git a/scripts/verification/collateral-plugins/verify_cusdbcv3.ts b/scripts/verification/collateral-plugins/verify_cusdbcv3.ts new file mode 100644 index 000000000..c3a6cb314 --- /dev/null +++ b/scripts/verification/collateral-plugins/verify_cusdbcv3.ts @@ -0,0 +1,81 @@ +import hre, { ethers } from 'hardhat' +import { getChainId } from '../../../common/blockchain-utils' +import { baseL2Chains, developmentChains, networkConfig } from '../../../common/configuration' +import { fp, bn } from '../../../common/numbers' +import { + getDeploymentFile, + getAssetCollDeploymentFilename, + IAssetCollDeployments, +} from '../../deployment/common' +import { priceTimeout, oracleTimeout, verifyContract, revenueHiding } from '../../deployment/utils' + +let deployments: IAssetCollDeployments + +async function main() { + // ********** Read config ********** + const chainId = await getChainId(hre) + if (!networkConfig[chainId]) { + throw new Error(`Missing network configuration for ${hre.network.name}`) + } + + if (developmentChains.includes(hre.network.name)) { + throw new Error(`Cannot verify contracts for development chain ${hre.network.name}`) + } + + // Only exists on Base L2 + if (!baseL2Chains.includes(hre.network.name)) { + throw new Error(`Invalid network ${hre.network.name} - only available on Base`) + } + + const assetCollDeploymentFilename = getAssetCollDeploymentFilename(chainId) + deployments = getDeploymentFile(assetCollDeploymentFilename) + + const collateral = await ethers.getContractAt( + 'CTokenV3Collateral', + deployments.collateral.cUSDbCv3 as string + ) + + /******** Verify Wrapper token - wcUSDCv3 **************************/ + + await verifyContract( + chainId, + await collateral.erc20(), + [ + networkConfig[chainId].tokens.cUSDbCv3, + networkConfig[chainId].COMET_REWARDS, + networkConfig[chainId].tokens.COMP, + ], + 'contracts/plugins/assets/compoundv3/CusdcV3Wrapper.sol:CusdcV3Wrapper' + ) + + /******** Verify Collateral - wcUSDbCv3 **************************/ + + const usdcOracleTimeout = 86400 // 24 hr + const usdcOracleError = fp('0.003') // 0.3% (Base) + + await verifyContract( + chainId, + deployments.collateral.cUSDbCv3, + [ + { + priceTimeout: priceTimeout.toString(), + chainlinkFeed: networkConfig[chainId].chainlinkFeeds.USDC, + oracleError: usdcOracleError.toString(), + erc20: await collateral.erc20(), + maxTradeVolume: fp('1e6').toString(), // $1m, + oracleTimeout: oracleTimeout(chainId, usdcOracleTimeout).toString(), // 24h hr, + targetName: hre.ethers.utils.formatBytes32String('USD'), + defaultThreshold: fp('0.01').add(usdcOracleError).toString(), // 1% + 0.3% + delayUntilDefault: bn('86400').toString(), // 24h + }, + revenueHiding, + bn('10000e6'), // $10k + ], + 'contracts/plugins/assets/compoundv3/CTokenV3Collateral.sol:CTokenV3Collateral' + ) +} + +main().catch((error) => { + console.error(error) + process.exitCode = 1 +}) diff --git a/scripts/verification/collateral-plugins/verify_cusdcv3.ts b/scripts/verification/collateral-plugins/verify_cusdcv3.ts index 6632edbac..62c138928 100644 --- a/scripts/verification/collateral-plugins/verify_cusdcv3.ts +++ b/scripts/verification/collateral-plugins/verify_cusdcv3.ts @@ -1,6 +1,6 @@ import hre, { ethers } from 'hardhat' import { getChainId } from '../../../common/blockchain-utils' -import { developmentChains, networkConfig } from '../../../common/configuration' +import { baseL2Chains, developmentChains, networkConfig } from '../../../common/configuration' import { fp, bn } from '../../../common/numbers' import { getDeploymentFile, @@ -37,7 +37,7 @@ async function main() { await collateral.erc20(), [ networkConfig[chainId].tokens.cUSDCv3, - '0x1B0e765F6224C21223AeA2af16c1C46E38885a40', + networkConfig[chainId].COMET_REWARDS, networkConfig[chainId].tokens.COMP, ], 'contracts/plugins/assets/compoundv3/CusdcV3Wrapper.sol:CusdcV3Wrapper' @@ -45,6 +45,9 @@ async function main() { /******** Verify Collateral - wcUSDCv3 **************************/ + const usdcOracleTimeout = 86400 // 24 hr + const usdcOracleError = baseL2Chains.includes(hre.network.name) ? fp('0.003') : fp('0.0025') // 0.3% (Base) or 0.25% + await verifyContract( chainId, deployments.collateral.cUSDCv3, @@ -52,12 +55,12 @@ async function main() { { priceTimeout: priceTimeout.toString(), chainlinkFeed: networkConfig[chainId].chainlinkFeeds.USDC, - oracleError: fp('0.0025').toString(), // 0.25%, + oracleError: usdcOracleError.toString(), erc20: await collateral.erc20(), maxTradeVolume: fp('1e6').toString(), // $1m, - oracleTimeout: oracleTimeout(chainId, '86400').toString(), // 24h hr, + oracleTimeout: oracleTimeout(chainId, usdcOracleTimeout).toString(), // 24h hr, targetName: hre.ethers.utils.formatBytes32String('USD'), - defaultThreshold: fp('0.0125').toString(), // 1% + 0.25% + defaultThreshold: fp('0.01').add(usdcOracleError).toString(), delayUntilDefault: bn('86400').toString(), // 24h }, revenueHiding, diff --git a/scripts/verify_etherscan.ts b/scripts/verify_etherscan.ts index c9415cd33..b32aac277 100644 --- a/scripts/verify_etherscan.ts +++ b/scripts/verify_etherscan.ts @@ -1,7 +1,7 @@ /* eslint-disable no-process-exit */ import hre from 'hardhat' import { getChainId } from '../common/blockchain-utils' -import { developmentChains, networkConfig } from '../common/configuration' +import { baseL2Chains, developmentChains, networkConfig } from '../common/configuration' import { sh } from './deployment/utils' import { getDeploymentFile, @@ -35,7 +35,8 @@ async function main() { // This process is intelligent enough that it can be run on all verify scripts, // even if some portions have already been verified - const scripts = [ + // Phase 1- Common + let scripts = [ '0_verify_libraries.ts', '1_verify_implementations.ts', '2_verify_rsrAsset.ts', @@ -43,23 +44,38 @@ async function main() { '4_verify_facade.ts', '5_verify_facadeWrite.ts', '6_verify_collateral.ts', - // '7_verify_rToken.ts', - // '8_verify_governance.ts', - 'collateral-plugins/verify_convex_stable.ts', - 'collateral-plugins/verify_convex_stable_metapool.ts', - 'collateral-plugins/verify_convex_stable_rtoken_metapool.ts', - 'collateral-plugins/verify_curve_stable.ts', - 'collateral-plugins/verify_curve_stable_metapool.ts', - 'collateral-plugins/verify_curve_stable_rtoken_metapool.ts', - 'collateral-plugins/verify_cusdcv3.ts', - 'collateral-plugins/verify_reth.ts', - 'collateral-plugins/verify_wsteth.ts', - 'collateral-plugins/verify_cbeth.ts', - 'collateral-plugins/verify_sdai.ts', - 'collateral-plugins/verify_morpho.ts', - 'collateral-plugins/verify_aave_v3_usdc.ts', ] + // Phase 2 - Individual Plugins + if (!baseL2Chains.includes(hre.network.name)) { + scripts.push( + 'collateral-plugins/verify_convex_stable.ts', + 'collateral-plugins/verify_convex_stable_metapool.ts', + 'collateral-plugins/verify_convex_stable_rtoken_metapool.ts', + 'collateral-plugins/verify_curve_stable.ts', + 'collateral-plugins/verify_curve_stable_metapool.ts', + 'collateral-plugins/verify_curve_stable_rtoken_metapool.ts', + 'collateral-plugins/verify_cusdcv3.ts', + 'collateral-plugins/verify_reth.ts', + 'collateral-plugins/verify_wsteth.ts', + 'collateral-plugins/verify_cbeth.ts', + 'collateral-plugins/verify_sdai.ts', + 'collateral-plugins/verify_morpho.ts', + 'collateral-plugins/verify_aave_v3_usdc.ts' + ) + } else if (chainId == '8453' || chainId == '84531') { + // Base L2 chains + scripts.push( + 'collateral-plugins/verify_cbeth.ts', + 'collateral-plugins/verify_cusdbcv3.ts', + 'collateral-plugins/verify_aave_v3_usdbc' + ) + } + + // Phase 3 - RTokens and Governance + // '7_verify_rToken.ts', + // '8_verify_governance.ts', + for (const script of scripts) { console.log('\n===========================================\n', script, '') await sh(`hardhat run scripts/verification/${script}`) diff --git a/tasks/deployment/get-addresses.ts b/tasks/deployment/get-addresses.ts index 900416f4f..c7423cb19 100644 --- a/tasks/deployment/get-addresses.ts +++ b/tasks/deployment/get-addresses.ts @@ -1,7 +1,12 @@ import { getChainId } from '../../common/blockchain-utils' import { task, types } from 'hardhat/config' import fs from 'fs' -import { IAssetCollDeployments, getAssetCollDeploymentFilename, getDeploymentFile, getDeploymentFilename } from '#/scripts/deployment/common' +import { + IAssetCollDeployments, + getAssetCollDeploymentFilename, + getDeploymentFile, + getDeploymentFilename, +} from '#/scripts/deployment/common' import { ITokens } from '#/common/configuration' import { MainP1 } from '@typechain/MainP1' import { Contract } from 'ethers' @@ -11,63 +16,75 @@ task('get-addys', 'Compile the deployed addresses of an RToken deployment') .addOptionalParam('gov', 'The address of the RToken Governance', undefined, types.string) .addOptionalParam('ver', 'The target version', undefined, types.string) .setAction(async (params, hre) => { - /* Helper functions */ const capitalize = (s: string) => s && s[0].toUpperCase() + s.slice(1) - const etherscanUrl = "https://etherscan.io/address/" + const etherscanUrl = 'https://etherscan.io/address/' const getVersion = async (c: Contract) => { - try { - return await c.version() - } catch (e) { - return 'N/A' - } + try { + return await c.version() + } catch (e) { + return 'N/A' + } } const createRTokenTableRow = async (name: string, address: string) => { - const url = `https://api.etherscan.io/api?module=contract&action=getsourcecode&address=${address}&apikey=${process.env.ETHERSCAN_API_KEY}` - const response = await fetch(url) - const data = await response.json() - const implementation = data.result[0].Implementation - const component = await hre.ethers.getContractAt('ComponentP1', address) - return `| ${name} | [${address}](${etherscanUrl}${address}) | [${implementation}](${etherscanUrl}${implementation}#code) | ${await getVersion(component)} |` + const url = `https://api.etherscan.io/api?module=contract&action=getsourcecode&address=${address}&apikey=${process.env.ETHERSCAN_API_KEY}` + const response = await fetch(url) + const data = await response.json() + const implementation = data.result[0].Implementation + const component = await hre.ethers.getContractAt('ComponentP1', address) + return `| ${name} | [${address}](${etherscanUrl}${address}) | [${implementation}](${etherscanUrl}${implementation}#code) | ${await getVersion( + component + )} |` } const createAssetTableRow = async (name: string, address: string) => { - return `| ${name} | [${address}](${etherscanUrl}${address}) |` + return `| ${name} | [${address}](${etherscanUrl}${address}) |` } - const createTableRows = async (components: { name: string, address: string }[], isRToken: boolean) => { - const rows = [] - for (const component of components) { - isRToken - ? rows.push(await createRTokenTableRow(component.name, component.address)) - : rows.push(await createAssetTableRow(component.name, component.address)) - } - return rows.join('\n') + const createTableRows = async ( + components: { name: string; address: string }[], + isRToken: boolean + ) => { + const rows = [] + for (const component of components) { + isRToken + ? rows.push(await createRTokenTableRow(component.name, component.address)) + : rows.push(await createAssetTableRow(component.name, component.address)) + } + return rows.join('\n') } - const createRTokenMarkdown = async (name: string, address: string, rows: string, govRows: string | undefined) => { - return `# [${name}](${etherscanUrl}${address}) + const createRTokenMarkdown = async ( + name: string, + address: string, + rows: string, + govRows: string | undefined + ) => { + return `# [${name}](${etherscanUrl}${address}) ## Component Addresses | Contract | Address | Implementation | Version | | --- | --- | --- | --- | ${rows} -${govRows && ` +${ + govRows && + ` ## Governance Addresses | Contract | Address | Implementation | Version | | --- | --- | --- | --- | ${govRows} -`} +` +} ` } const createAssetMarkdown = async (name: string, assets: string, collaterals: string) => { - return `# ${name} + return `# ${name} ## Assets | Contract | Address | | --- | --- | @@ -81,50 +98,50 @@ ${collaterals} } const getRTokenFileName = async (rtoken: string) => { - const chainId = await getChainId(hre) - const rToken = await hre.ethers.getContractAt('IRToken', rtoken) - const rTokenSymbol = await rToken.symbol() - return `${outputDir}${chainId}-${rTokenSymbol}.md` + const chainId = await getChainId(hre) + const rToken = await hre.ethers.getContractAt('IRToken', rtoken) + const rTokenSymbol = await rToken.symbol() + return `${outputDir}${chainId}-${rTokenSymbol}.md` } const getAssetFileName = async (version: string) => { - const chainId = await getChainId(hre) - return `${outputDir}${chainId}-assets-${version}.md` + const chainId = await getChainId(hre) + return `${outputDir}${chainId}-assets-${version}.md` } const getComponentFileName = async (version: string) => { - const chainId = await getChainId(hre) - return `${outputDir}${chainId}-components-${version}.md` + const chainId = await getChainId(hre) + return `${outputDir}${chainId}-components-${version}.md` } const getActiveRoleHolders = async (main: MainP1, role: string) => { - // get active owners - // - const grantedFilter = main.filters.RoleGranted(role) - const revokedFilter = main.filters.RoleRevoked(role) - - // get granted owners - const ownersGranted = await main.queryFilter(grantedFilter) - let owners = ownersGranted.map((event) => { - return event.args![1] - }) - interface OwnerCount { - [key: string]: number - } - - // count granted owners - let ownerCount: OwnerCount = {} - owners.forEach((owner: string) => { - ownerCount[owner] = (ownerCount[owner] || 0) + 1 - }) - - // reduce counts by revoked owners - const ownersRevoked = await main.queryFilter(revokedFilter) - ownersRevoked.forEach((event) => { - const owner = event.args![1] - ownerCount[owner] = (ownerCount[owner] || 0) - 1 - }) - return Object.keys(ownerCount).filter((owner) => ownerCount[owner] > 0) + // get active owners + // + const grantedFilter = main.filters.RoleGranted(role) + const revokedFilter = main.filters.RoleRevoked(role) + + // get granted owners + const ownersGranted = await main.queryFilter(grantedFilter) + let owners = ownersGranted.map((event) => { + return event.args![1] + }) + interface OwnerCount { + [key: string]: number + } + + // count granted owners + let ownerCount: OwnerCount = {} + owners.forEach((owner: string) => { + ownerCount[owner] = (ownerCount[owner] || 0) + 1 + }) + + // reduce counts by revoked owners + const ownersRevoked = await main.queryFilter(revokedFilter) + ownersRevoked.forEach((event) => { + const owner = event.args![1] + ownerCount[owner] = (ownerCount[owner] || 0) - 1 + }) + return Object.keys(ownerCount).filter((owner) => ownerCount[owner] > 0) } /* @@ -134,97 +151,119 @@ ${collaterals} const outputDir = 'docs/deployed-addresses/' if (params.rtoken && params.gov) { - // if rtoken address is provided, print component addresses - - const rToken = await hre.ethers.getContractAt('IRToken', params.rtoken) - const mainAddress = await rToken.main() - const main = await hre.ethers.getContractAt('MainP1', mainAddress) - const backingManagerAddress = await main.backingManager() - const basketHandlerAddress = await main.basketHandler() - const brokerAddress = await main.broker() - const rsrTraderAddress = await main.rsrTrader() - const rTokenTraderAddress = await main.rTokenTrader() - const furnaceAddress = await main.furnace() - const assetRegistryAddress = await main.assetRegistry() - const distributorAddress = await main.distributor() - const stRSRAddress = await main.stRSR() - - const components = [ - { name: 'RToken', address: params.rtoken}, - { name: 'Main', address: mainAddress}, - { name: 'AssetRegistry', address: assetRegistryAddress }, - { name: 'BackingManager', address: backingManagerAddress }, - { name: 'BasketHandler', address: basketHandlerAddress }, - { name: 'Broker', address: brokerAddress }, - { name: 'RSRTrader', address: rsrTraderAddress }, - { name: 'RTokenTrader', address: rTokenTraderAddress }, - { name: 'Distributor', address: distributorAddress }, - { name: 'Furnace', address: furnaceAddress }, - { name: 'StRSR', address: stRSRAddress } - ] - - const governance = await hre.ethers.getContractAt('Governance', params.gov) - const timelock = await governance.timelock() - - // confirm timelock is in fact owner of main - const isOwner = await main.hasRole(await main.OWNER_ROLE(), timelock) - if (!isOwner) { - throw new Error('Wrong governance address (Timelock is not owner of Main)') - } - - const govComponents = [ - { name: 'Governor Alexios', address: params.gov }, - { name: 'Timelock', address: timelock } - ] - - const rTokenName = await rToken.name() - const rTokenSymbol = await rToken.symbol() - - const rows = await createTableRows(components, true) - const govRows = await createTableRows(govComponents, true) - const markdown = await createRTokenMarkdown(`${rTokenSymbol} (${rTokenName})`, params.rtoken, rows, govRows) - fs.writeFileSync(await getRTokenFileName(params.rtoken), markdown) + // if rtoken address is provided, print component addresses + + const rToken = await hre.ethers.getContractAt('IRToken', params.rtoken) + const mainAddress = await rToken.main() + const main = await hre.ethers.getContractAt('MainP1', mainAddress) + const backingManagerAddress = await main.backingManager() + const basketHandlerAddress = await main.basketHandler() + const brokerAddress = await main.broker() + const rsrTraderAddress = await main.rsrTrader() + const rTokenTraderAddress = await main.rTokenTrader() + const furnaceAddress = await main.furnace() + const assetRegistryAddress = await main.assetRegistry() + const distributorAddress = await main.distributor() + const stRSRAddress = await main.stRSR() + + const components = [ + { name: 'RToken', address: params.rtoken }, + { name: 'Main', address: mainAddress }, + { name: 'AssetRegistry', address: assetRegistryAddress }, + { name: 'BackingManager', address: backingManagerAddress }, + { name: 'BasketHandler', address: basketHandlerAddress }, + { name: 'Broker', address: brokerAddress }, + { name: 'RSRTrader', address: rsrTraderAddress }, + { name: 'RTokenTrader', address: rTokenTraderAddress }, + { name: 'Distributor', address: distributorAddress }, + { name: 'Furnace', address: furnaceAddress }, + { name: 'StRSR', address: stRSRAddress }, + ] + + const governance = await hre.ethers.getContractAt('Governance', params.gov) + const timelock = await governance.timelock() + + // confirm timelock is in fact owner of main + const isOwner = await main.hasRole(await main.OWNER_ROLE(), timelock) + if (!isOwner) { + throw new Error('Wrong governance address (Timelock is not owner of Main)') + } + + const govComponents = [ + { name: 'Governor Alexios', address: params.gov }, + { name: 'Timelock', address: timelock }, + ] + + const rTokenName = await rToken.name() + const rTokenSymbol = await rToken.symbol() + + const rows = await createTableRows(components, true) + const govRows = await createTableRows(govComponents, true) + const markdown = await createRTokenMarkdown( + `${rTokenSymbol} (${rTokenName})`, + params.rtoken, + rows, + govRows + ) + fs.writeFileSync(await getRTokenFileName(params.rtoken), markdown) } else if (params.ver) { - // if version is provided, print implementation addresses - const version = `${hre.network.name}-${params.ver}` - const collateralDepl = getDeploymentFile(getAssetCollDeploymentFilename(await getChainId(hre), version)) as IAssetCollDeployments - - const collaterals = Object.keys(collateralDepl.collateral).map((coll) => { - const key = coll as keyof ITokens - return { name: coll, address: collateralDepl.collateral[key]! } - }) - const collateralRows = await createTableRows(collaterals, false) - - const assets = Object.keys(collateralDepl.assets).map((ass) => { - const key = ass as keyof ITokens - return { name: ass, address: collateralDepl.assets[key]! } - }) - const assetRows = await createTableRows(assets, false) - - const assetMarkdown = await createAssetMarkdown(`Assets (${capitalize(hre.network.name)} ${params.ver})`, assetRows, collateralRows) - fs.writeFileSync(await getAssetFileName(params.ver), assetMarkdown) - - const componentDepl = getDeploymentFile(getDeploymentFilename(await getChainId(hre), version)) - const recursiveDestructure = (obj: string | {[key: string]: string}, key: string): Array<{name: string, address: string}> | {name: string, address: string} => { - if (typeof obj === "string") { - return { name: capitalize(key), address: obj } - } else { - return Object.keys(obj).map(k => { - return recursiveDestructure(obj[k], k) - }).flat() - } + // if version is provided, print implementation addresses + const version = `${hre.network.name}-${params.ver}` + const collateralDepl = getDeploymentFile( + getAssetCollDeploymentFilename(await getChainId(hre), version) + ) as IAssetCollDeployments + + const collaterals = Object.keys(collateralDepl.collateral).map((coll) => { + const key = coll as keyof ITokens + return { name: coll, address: collateralDepl.collateral[key]! } + }) + const collateralRows = await createTableRows(collaterals, false) + + const assets = Object.keys(collateralDepl.assets).map((ass) => { + const key = ass as keyof ITokens + return { name: ass, address: collateralDepl.assets[key]! } + }) + const assetRows = await createTableRows(assets, false) + + const assetMarkdown = await createAssetMarkdown( + `Assets (${capitalize(hre.network.name)} ${params.ver})`, + assetRows, + collateralRows + ) + fs.writeFileSync(await getAssetFileName(params.ver), assetMarkdown) + + const componentDepl = getDeploymentFile(getDeploymentFilename(await getChainId(hre), version)) + const recursiveDestructure = ( + obj: string | { [key: string]: string }, + key: string + ): Array<{ name: string; address: string }> | { name: string; address: string } => { + if (typeof obj === 'string') { + return { name: capitalize(key), address: obj } + } else { + return Object.keys(obj) + .map((k) => { + return recursiveDestructure(obj[k], k) + }) + .flat() } - - let components = recursiveDestructure(componentDepl as {}, '') as Array<{name: string, address: string}> - components = components.sort((a, b) => a.name.localeCompare(b.name)) - const componentMarkdown = await createRTokenMarkdown(`Component Implementations (${capitalize(hre.network.name)} ${params.ver})`, params.version, await createTableRows(components, false), undefined) - fs.writeFileSync(await getComponentFileName(params.ver), componentMarkdown) + } + + let components = recursiveDestructure(componentDepl as {}, '') as Array<{ + name: string + address: string + }> + components = components.sort((a, b) => a.name.localeCompare(b.name)) + const componentMarkdown = await createRTokenMarkdown( + `Component Implementations (${capitalize(hre.network.name)} ${params.ver})`, + params.version, + await createTableRows(components, false), + undefined + ) + fs.writeFileSync(await getComponentFileName(params.ver), componentMarkdown) } else { - // if neither rtoken address nor version number is provided, throw error - throw new Error('must provide either RToken address (--rtoken) and RToken governance (--gov), or Version (--ver)') + // if neither rtoken address nor version number is provided, throw error + throw new Error( + 'must provide either RToken address (--rtoken) and RToken governance (--gov), or Version (--ver)' + ) } - - - - -}) \ No newline at end of file + }) diff --git a/utils/fork.ts b/utils/fork.ts index 801190a6c..6749b5054 100644 --- a/utils/fork.ts +++ b/utils/fork.ts @@ -7,6 +7,6 @@ const BASE_GOERLI_RPC_URL = useEnv('BASE_GOERLI_RPC_URL') const BASE_RPC_URL = useEnv('BASE_RPC_URL') export type Network = 'mainnet' | 'base' export const forkRpcs = { - 'mainnet': MAINNET_RPC_URL, - 'base': BASE_RPC_URL, -} \ No newline at end of file + mainnet: MAINNET_RPC_URL, + base: BASE_RPC_URL, +}