diff --git a/.openzeppelin/mainnet.json b/.openzeppelin/mainnet.json index 6fe5d2b5..52c3b516 100644 --- a/.openzeppelin/mainnet.json +++ b/.openzeppelin/mainnet.json @@ -1254,6 +1254,41 @@ "address": "0x70Ba3211f2584Bf1C8a2aCdF0a00dba559CE1Ffa", "txHash": "0x258f4a7913d2df2eac20102900f300001786a1d725f2d61a1ecf8d2c9adfdfe0", "kind": "transparent" + }, + { + "address": "0x7433806912Eae67919e66aea853d46Fa0aef98A8", + "txHash": "0xacc1f08c1f1ea036fa35444b67328ae3d3098d6cbbc520eacc81116156eb7772", + "kind": "transparent" + }, + { + "address": "0x66Aa9fcD63DF74e1f67A9452E6E59Fbc67f75E38", + "txHash": "0x8755d219b347231abc94e23457b63429e14c28b50bf210997e26f8d685674b23", + "kind": "transparent" + }, + { + "address": "0x58476f452df10E6Bf17dc1fee418E98dE9e14868", + "txHash": "0x9ed642b52585ccb3b6424d6f4570a90ffddf12c409255ad09be731e108261274", + "kind": "transparent" + }, + { + "address": "0xb468A6F63868cB6C6D99105EDfbe73d6B21f139E", + "txHash": "0xc68a3898f890655dffbb0202c4eb5c2f43cd51a4376de900e4d4eadcf981fbdb", + "kind": "transparent" + }, + { + "address": "0xCe29c36c6D4556f2d01d79414C1354B968dDDEf1", + "txHash": "0xa1243f34d306d4137b845f6080cf8760bbee337fb4e5bb16b4f5186d5cf283c8", + "kind": "transparent" + }, + { + "address": "0xA0Fc8BDFb1E6a705C1375810989B1d70a982b01B", + "txHash": "0x521e5ce006e24b9f414bc00990805b079358a0fa9328a757a18da5f163c73e61", + "kind": "transparent" + }, + { + "address": "0x1e0fd66753198c7b8bA64edEe8d41D8628Bf20D7", + "txHash": "0x6998a067e4868b9cfd26908d389c1a870e1cd56dbca7d97fed217c8b04459ebe", + "kind": "transparent" } ], "impls": { @@ -65800,6 +65835,2133 @@ } } } + }, + "7d5230897f14f9b73acb75577bcfc248e184c634037eedf32aa7205e6257ccf5": { + "address": "0xD22bE883b7194Ac2D1751Bf8E6e4962D87f2f75a", + "txHash": "0x56e5c216383e7f3a9bbdbcafacb3d0500ab87c04d0193aa781f6bbb072d41a61", + "layout": { + "solcVersion": "0.8.9", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_balances", + "offset": 0, + "slot": "51", + "type": "t_mapping(t_address,t_uint256)", + "contract": "ERC20Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:40" + }, + { + "label": "_allowances", + "offset": 0, + "slot": "52", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))", + "contract": "ERC20Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:42" + }, + { + "label": "_totalSupply", + "offset": 0, + "slot": "53", + "type": "t_uint256", + "contract": "ERC20Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:44" + }, + { + "label": "_name", + "offset": 0, + "slot": "54", + "type": "t_string_storage", + "contract": "ERC20Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:46" + }, + { + "label": "_symbol", + "offset": 0, + "slot": "55", + "type": "t_string_storage", + "contract": "ERC20Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:47" + }, + { + "label": "__gap", + "offset": 0, + "slot": "56", + "type": "t_array(t_uint256)45_storage", + "contract": "ERC20Upgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol:376" + }, + { + "label": "_paused", + "offset": 0, + "slot": "101", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "__gap", + "offset": 0, + "slot": "151", + "type": "t_array(t_uint256)50_storage", + "contract": "ERC20PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20PausableUpgradeable.sol:48" + }, + { + "label": "accessControl", + "offset": 0, + "slot": "201", + "type": "t_contract(MidasAccessControl)17274", + "contract": "WithMidasAccessControl", + "src": "contracts/access/WithMidasAccessControl.sol:24" + }, + { + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)50_storage", + "contract": "WithMidasAccessControl", + "src": "contracts/access/WithMidasAccessControl.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "252", + "type": "t_array(t_uint256)50_storage", + "contract": "Blacklistable", + "src": "contracts/access/Blacklistable.sol:16" + }, + { + "label": "metadata", + "offset": 0, + "slot": "302", + "type": "t_mapping(t_bytes32,t_bytes_storage)", + "contract": "mToken", + "src": "contracts/mToken.sol:18" + }, + { + "label": "__gap", + "offset": 0, + "slot": "303", + "type": "t_array(t_uint256)50_storage", + "contract": "mToken", + "src": "contracts/mToken.sol:23" + }, + { + "label": "__gap", + "offset": 0, + "slot": "353", + "type": "t_array(t_uint256)50_storage", + "contract": "mTokenPermissioned", + "src": "contracts/mTokenPermissioned.sol:16" + }, + { + "label": "__gap", + "offset": 0, + "slot": "403", + "type": "t_array(t_uint256)50_storage", + "contract": "mGLOBAL", + "src": "contracts/products/mGLOBAL/mGLOBAL.sol:34" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "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_bytes32": { + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_bytes_storage": { + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(MidasAccessControl)17274": { + "label": "contract MidasAccessControl", + "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_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_bytes_storage)": { + "label": "mapping(bytes32 => bytes)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "a66c809c817349e0fbd70b43e36fd2d65ef71f649d098407874aa5d8e4fb9b62": { + "address": "0x96AC55e782b9Ee3F1Dd72B3bA033352b5AF95e49", + "txHash": "0xa1a7eb4b83575ac02c0801e42ffb031cd3f897839df9d8394694d5c5794461d4", + "layout": { + "solcVersion": "0.8.9", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "accessControl", + "offset": 2, + "slot": "0", + "type": "t_contract(MidasAccessControl)17274", + "contract": "WithMidasAccessControl", + "src": "contracts/access/WithMidasAccessControl.sol:24" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "WithMidasAccessControl", + "src": "contracts/access/WithMidasAccessControl.sol:29" + }, + { + "label": "description", + "offset": 0, + "slot": "51", + "type": "t_string_storage", + "contract": "CustomAggregatorV3CompatibleFeedGrowth", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeedGrowth.sol:41" + }, + { + "label": "maxAnswerDeviation", + "offset": 0, + "slot": "52", + "type": "t_uint256", + "contract": "CustomAggregatorV3CompatibleFeedGrowth", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeedGrowth.sol:47" + }, + { + "label": "minAnswer", + "offset": 0, + "slot": "53", + "type": "t_int192", + "contract": "CustomAggregatorV3CompatibleFeedGrowth", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeedGrowth.sol:52" + }, + { + "label": "maxAnswer", + "offset": 0, + "slot": "54", + "type": "t_int192", + "contract": "CustomAggregatorV3CompatibleFeedGrowth", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeedGrowth.sol:57" + }, + { + "label": "minGrowthApr", + "offset": 0, + "slot": "55", + "type": "t_int80", + "contract": "CustomAggregatorV3CompatibleFeedGrowth", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeedGrowth.sol:62" + }, + { + "label": "maxGrowthApr", + "offset": 10, + "slot": "55", + "type": "t_int80", + "contract": "CustomAggregatorV3CompatibleFeedGrowth", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeedGrowth.sol:67" + }, + { + "label": "latestRound", + "offset": 20, + "slot": "55", + "type": "t_uint80", + "contract": "CustomAggregatorV3CompatibleFeedGrowth", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeedGrowth.sol:72" + }, + { + "label": "onlyUp", + "offset": 30, + "slot": "55", + "type": "t_bool", + "contract": "CustomAggregatorV3CompatibleFeedGrowth", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeedGrowth.sol:78" + }, + { + "label": "_roundData", + "offset": 0, + "slot": "56", + "type": "t_mapping(t_uint80,t_struct(RoundDataWithGrowth)18576_storage)", + "contract": "CustomAggregatorV3CompatibleFeedGrowth", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeedGrowth.sol:83" + }, + { + "label": "__gap", + "offset": 0, + "slot": "57", + "type": "t_array(t_uint256)50_storage", + "contract": "CustomAggregatorV3CompatibleFeedGrowth", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeedGrowth.sol:88" + }, + { + "label": "__gap", + "offset": 0, + "slot": "107", + "type": "t_array(t_uint256)50_storage", + "contract": "MGlobalCustomAggregatorFeedGrowth", + "src": "contracts/products/mGLOBAL/MGlobalCustomAggregatorFeedGrowth.sol:21" + } + ], + "types": { + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(MidasAccessControl)17274": { + "label": "contract MidasAccessControl", + "numberOfBytes": "20" + }, + "t_int192": { + "label": "int192", + "numberOfBytes": "24" + }, + "t_int256": { + "label": "int256", + "numberOfBytes": "32" + }, + "t_int80": { + "label": "int80", + "numberOfBytes": "10" + }, + "t_mapping(t_uint80,t_struct(RoundDataWithGrowth)18576_storage)": { + "label": "mapping(uint80 => struct CustomAggregatorV3CompatibleFeedGrowth.RoundDataWithGrowth)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(RoundDataWithGrowth)18576_storage": { + "label": "struct CustomAggregatorV3CompatibleFeedGrowth.RoundDataWithGrowth", + "members": [ + { + "label": "roundId", + "type": "t_uint80", + "offset": 0, + "slot": "0" + }, + { + "label": "answeredInRound", + "type": "t_uint80", + "offset": 10, + "slot": "0" + }, + { + "label": "growthApr", + "type": "t_int80", + "offset": 20, + "slot": "0" + }, + { + "label": "answer", + "type": "t_int256", + "offset": 0, + "slot": "1" + }, + { + "label": "startedAt", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "updatedAt", + "type": "t_uint256", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + }, + "t_uint80": { + "label": "uint80", + "numberOfBytes": "10" + } + } + } + }, + "8411f67d0c5d879e15f1aba1d365d3b500283e307da6f71ce845dd0e46c7fb03": { + "address": "0x94Cd5b8904c1F1426f9408eE5c98b789c6a864c6", + "txHash": "0x48786fa1fb1a470b491171d3935dd8d9497ca6b1a68031e5d8509411e5254b8e", + "layout": { + "solcVersion": "0.8.9", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "accessControl", + "offset": 2, + "slot": "0", + "type": "t_contract(MidasAccessControl)17274", + "contract": "WithMidasAccessControl", + "src": "contracts/access/WithMidasAccessControl.sol:24" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "WithMidasAccessControl", + "src": "contracts/access/WithMidasAccessControl.sol:29" + }, + { + "label": "aggregator", + "offset": 0, + "slot": "51", + "type": "t_contract(AggregatorV3Interface)45", + "contract": "DataFeed", + "src": "contracts/feeds/DataFeed.sol:22" + }, + { + "label": "healthyDiff", + "offset": 0, + "slot": "52", + "type": "t_uint256", + "contract": "DataFeed", + "src": "contracts/feeds/DataFeed.sol:27" + }, + { + "label": "minExpectedAnswer", + "offset": 0, + "slot": "53", + "type": "t_int256", + "contract": "DataFeed", + "src": "contracts/feeds/DataFeed.sol:32" + }, + { + "label": "maxExpectedAnswer", + "offset": 0, + "slot": "54", + "type": "t_int256", + "contract": "DataFeed", + "src": "contracts/feeds/DataFeed.sol:37" + }, + { + "label": "__gap", + "offset": 0, + "slot": "55", + "type": "t_array(t_uint256)50_storage", + "contract": "DataFeed", + "src": "contracts/feeds/DataFeed.sol:42" + }, + { + "label": "__gap", + "offset": 0, + "slot": "105", + "type": "t_array(t_uint256)50_storage", + "contract": "MGlobalDataFeed", + "src": "contracts/products/mGLOBAL/MGlobalDataFeed.sol:16" + } + ], + "types": { + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(AggregatorV3Interface)45": { + "label": "contract AggregatorV3Interface", + "numberOfBytes": "20" + }, + "t_contract(MidasAccessControl)17274": { + "label": "contract MidasAccessControl", + "numberOfBytes": "20" + }, + "t_int256": { + "label": "int256", + "numberOfBytes": "32" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "ce1e062a1f02bb81cc35d56b32521870b6de114329c6c8fb66bf916709420729": { + "address": "0x08E4432F84E660235821c63764Fb2fFcC7e2b477", + "txHash": "0x5ce92f44544cf768046f59131e00379bf47842fe05541d4091b79f9895519af9", + "layout": { + "solcVersion": "0.8.9", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "accessControl", + "offset": 2, + "slot": "0", + "type": "t_contract(MidasAccessControl)17274", + "contract": "WithMidasAccessControl", + "src": "contracts/access/WithMidasAccessControl.sol:24" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "WithMidasAccessControl", + "src": "contracts/access/WithMidasAccessControl.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_paused", + "offset": 0, + "slot": "101", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "fnPaused", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_bytes4,t_bool)", + "contract": "Pausable", + "src": "contracts/access/Pausable.sol:14" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)50_storage", + "contract": "Pausable", + "src": "contracts/access/Pausable.sol:19" + }, + { + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)50_storage", + "contract": "Blacklistable", + "src": "contracts/access/Blacklistable.sol:16" + }, + { + "label": "greenlistEnabled", + "offset": 0, + "slot": "252", + "type": "t_bool", + "contract": "Greenlistable", + "src": "contracts/access/Greenlistable.sol:16" + }, + { + "label": "__gap", + "offset": 0, + "slot": "253", + "type": "t_array(t_uint256)50_storage", + "contract": "Greenlistable", + "src": "contracts/access/Greenlistable.sol:21" + }, + { + "label": "sanctionsList", + "offset": 0, + "slot": "303", + "type": "t_address", + "contract": "WithSanctionsList", + "src": "contracts/abstract/WithSanctionsList.sol:18" + }, + { + "label": "__gap", + "offset": 0, + "slot": "304", + "type": "t_array(t_uint256)50_storage", + "contract": "WithSanctionsList", + "src": "contracts/abstract/WithSanctionsList.sol:23" + }, + { + "label": "currentRequestId", + "offset": 0, + "slot": "354", + "type": "t_struct(Counter)8079_storage", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:53" + }, + { + "label": "mToken", + "offset": 0, + "slot": "355", + "type": "t_contract(IMToken)20057", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:66" + }, + { + "label": "mTokenDataFeed", + "offset": 0, + "slot": "356", + "type": "t_contract(IDataFeed)19772", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:71" + }, + { + "label": "tokensReceiver", + "offset": 0, + "slot": "357", + "type": "t_address", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:76" + }, + { + "label": "instantFee", + "offset": 0, + "slot": "358", + "type": "t_uint256", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:81" + }, + { + "label": "instantDailyLimit", + "offset": 0, + "slot": "359", + "type": "t_uint256", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:88" + }, + { + "label": "dailyLimits", + "offset": 0, + "slot": "360", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:93" + }, + { + "label": "feeReceiver", + "offset": 0, + "slot": "361", + "type": "t_address", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:98" + }, + { + "label": "variationTolerance", + "offset": 0, + "slot": "362", + "type": "t_uint256", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:103" + }, + { + "label": "waivedFeeRestriction", + "offset": 0, + "slot": "363", + "type": "t_mapping(t_address,t_bool)", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:108" + }, + { + "label": "_paymentTokens", + "offset": 0, + "slot": "364", + "type": "t_struct(AddressSet)3891_storage", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:113" + }, + { + "label": "tokensConfig", + "offset": 0, + "slot": "366", + "type": "t_mapping(t_address,t_struct(TokenConfig)20070_storage)", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:118" + }, + { + "label": "minAmount", + "offset": 0, + "slot": "367", + "type": "t_uint256", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:123" + }, + { + "label": "isFreeFromMinAmount", + "offset": 0, + "slot": "368", + "type": "t_mapping(t_address,t_bool)", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:128" + }, + { + "label": "__gap", + "offset": 0, + "slot": "369", + "type": "t_array(t_uint256)50_storage", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:133" + }, + { + "label": "minMTokenAmountForFirstDeposit", + "offset": 0, + "slot": "419", + "type": "t_uint256", + "contract": "DepositVault", + "src": "contracts/DepositVault.sol:78" + }, + { + "label": "mintRequests", + "offset": 0, + "slot": "420", + "type": "t_mapping(t_uint256,t_struct(Request)19789_storage)", + "contract": "DepositVault", + "src": "contracts/DepositVault.sol:83" + }, + { + "label": "totalMinted", + "offset": 0, + "slot": "421", + "type": "t_mapping(t_address,t_uint256)", + "contract": "DepositVault", + "src": "contracts/DepositVault.sol:88" + }, + { + "label": "maxSupplyCap", + "offset": 0, + "slot": "422", + "type": "t_uint256", + "contract": "DepositVault", + "src": "contracts/DepositVault.sol:95" + }, + { + "label": "__gap", + "offset": 0, + "slot": "423", + "type": "t_array(t_uint256)49_storage", + "contract": "DepositVault", + "src": "contracts/DepositVault.sol:103" + }, + { + "label": "aavePools", + "offset": 0, + "slot": "472", + "type": "t_mapping(t_address,t_contract(IAaveV3Pool)20654)", + "contract": "DepositVaultWithAave", + "src": "contracts/DepositVaultWithAave.sol:24" + }, + { + "label": "aaveDepositsEnabled", + "offset": 0, + "slot": "473", + "type": "t_bool", + "contract": "DepositVaultWithAave", + "src": "contracts/DepositVaultWithAave.sol:30" + }, + { + "label": "autoInvestFallbackEnabled", + "offset": 1, + "slot": "473", + "type": "t_bool", + "contract": "DepositVaultWithAave", + "src": "contracts/DepositVaultWithAave.sol:36" + }, + { + "label": "__gap", + "offset": 0, + "slot": "474", + "type": "t_array(t_uint256)50_storage", + "contract": "DepositVaultWithAave", + "src": "contracts/DepositVaultWithAave.sol:41" + }, + { + "label": "__gap", + "offset": 0, + "slot": "524", + "type": "t_array(t_uint256)50_storage", + "contract": "MGlobalDepositVaultWithAave", + "src": "contracts/products/mGLOBAL/MGlobalDepositVaultWithAave.sol:19" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_bytes32)dyn_storage": { + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "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_bytes4": { + "label": "bytes4", + "numberOfBytes": "4" + }, + "t_contract(IAaveV3Pool)20654": { + "label": "contract IAaveV3Pool", + "numberOfBytes": "20" + }, + "t_contract(IDataFeed)19772": { + "label": "contract IDataFeed", + "numberOfBytes": "20" + }, + "t_contract(IMToken)20057": { + "label": "contract IMToken", + "numberOfBytes": "20" + }, + "t_contract(MidasAccessControl)17274": { + "label": "contract MidasAccessControl", + "numberOfBytes": "20" + }, + "t_enum(RequestStatus)20074": { + "label": "enum RequestStatus", + "members": ["Pending", "Processed", "Canceled"], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_contract(IAaveV3Pool)20654)": { + "label": "mapping(address => contract IAaveV3Pool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(TokenConfig)20070_storage)": { + "label": "mapping(address => struct TokenConfig)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_uint256)": { + "label": "mapping(address => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes4,t_bool)": { + "label": "mapping(bytes4 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Request)19789_storage)": { + "label": "mapping(uint256 => struct Request)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3891_storage": { + "label": "struct EnumerableSetUpgradeable.AddressSet", + "members": [ + { + "label": "_inner", + "type": "t_struct(Set)3576_storage", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Counter)8079_storage": { + "label": "struct Counters.Counter", + "members": [ + { + "label": "_value", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Request)19789_storage": { + "label": "struct Request", + "members": [ + { + "label": "sender", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "tokenIn", + "type": "t_address", + "offset": 0, + "slot": "1" + }, + { + "label": "status", + "type": "t_enum(RequestStatus)20074", + "offset": 20, + "slot": "1" + }, + { + "label": "depositedUsdAmount", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "usdAmountWithoutFees", + "type": "t_uint256", + "offset": 0, + "slot": "3" + }, + { + "label": "tokenOutRate", + "type": "t_uint256", + "offset": 0, + "slot": "4" + } + ], + "numberOfBytes": "160" + }, + "t_struct(Set)3576_storage": { + "label": "struct EnumerableSetUpgradeable.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_struct(TokenConfig)20070_storage": { + "label": "struct TokenConfig", + "members": [ + { + "label": "dataFeed", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "fee", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "allowance", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "stable", + "type": "t_bool", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "74fc1abe14a24484b496df25d49ad07be245ac611b1e67698ff6a8421280c7a7": { + "address": "0xf687E76e3d62d62fE6F6A7f66ce9faE21df6438d", + "txHash": "0x79f1f2d07d4102026a22afb9cb24035fd9cd0901d476f7e91348ba2795e894fe", + "layout": { + "solcVersion": "0.8.9", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "accessControl", + "offset": 2, + "slot": "0", + "type": "t_contract(MidasAccessControl)17274", + "contract": "WithMidasAccessControl", + "src": "contracts/access/WithMidasAccessControl.sol:24" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "WithMidasAccessControl", + "src": "contracts/access/WithMidasAccessControl.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_paused", + "offset": 0, + "slot": "101", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "fnPaused", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_bytes4,t_bool)", + "contract": "Pausable", + "src": "contracts/access/Pausable.sol:14" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)50_storage", + "contract": "Pausable", + "src": "contracts/access/Pausable.sol:19" + }, + { + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)50_storage", + "contract": "Blacklistable", + "src": "contracts/access/Blacklistable.sol:16" + }, + { + "label": "greenlistEnabled", + "offset": 0, + "slot": "252", + "type": "t_bool", + "contract": "Greenlistable", + "src": "contracts/access/Greenlistable.sol:16" + }, + { + "label": "__gap", + "offset": 0, + "slot": "253", + "type": "t_array(t_uint256)50_storage", + "contract": "Greenlistable", + "src": "contracts/access/Greenlistable.sol:21" + }, + { + "label": "sanctionsList", + "offset": 0, + "slot": "303", + "type": "t_address", + "contract": "WithSanctionsList", + "src": "contracts/abstract/WithSanctionsList.sol:18" + }, + { + "label": "__gap", + "offset": 0, + "slot": "304", + "type": "t_array(t_uint256)50_storage", + "contract": "WithSanctionsList", + "src": "contracts/abstract/WithSanctionsList.sol:23" + }, + { + "label": "currentRequestId", + "offset": 0, + "slot": "354", + "type": "t_struct(Counter)8079_storage", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:53" + }, + { + "label": "mToken", + "offset": 0, + "slot": "355", + "type": "t_contract(IMToken)20057", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:66" + }, + { + "label": "mTokenDataFeed", + "offset": 0, + "slot": "356", + "type": "t_contract(IDataFeed)19772", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:71" + }, + { + "label": "tokensReceiver", + "offset": 0, + "slot": "357", + "type": "t_address", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:76" + }, + { + "label": "instantFee", + "offset": 0, + "slot": "358", + "type": "t_uint256", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:81" + }, + { + "label": "instantDailyLimit", + "offset": 0, + "slot": "359", + "type": "t_uint256", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:88" + }, + { + "label": "dailyLimits", + "offset": 0, + "slot": "360", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:93" + }, + { + "label": "feeReceiver", + "offset": 0, + "slot": "361", + "type": "t_address", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:98" + }, + { + "label": "variationTolerance", + "offset": 0, + "slot": "362", + "type": "t_uint256", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:103" + }, + { + "label": "waivedFeeRestriction", + "offset": 0, + "slot": "363", + "type": "t_mapping(t_address,t_bool)", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:108" + }, + { + "label": "_paymentTokens", + "offset": 0, + "slot": "364", + "type": "t_struct(AddressSet)3891_storage", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:113" + }, + { + "label": "tokensConfig", + "offset": 0, + "slot": "366", + "type": "t_mapping(t_address,t_struct(TokenConfig)20070_storage)", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:118" + }, + { + "label": "minAmount", + "offset": 0, + "slot": "367", + "type": "t_uint256", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:123" + }, + { + "label": "isFreeFromMinAmount", + "offset": 0, + "slot": "368", + "type": "t_mapping(t_address,t_bool)", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:128" + }, + { + "label": "__gap", + "offset": 0, + "slot": "369", + "type": "t_array(t_uint256)50_storage", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:133" + }, + { + "label": "minFiatRedeemAmount", + "offset": 0, + "slot": "419", + "type": "t_uint256", + "contract": "RedemptionVault", + "src": "contracts/RedemptionVault.sol:69" + }, + { + "label": "fiatAdditionalFee", + "offset": 0, + "slot": "420", + "type": "t_uint256", + "contract": "RedemptionVault", + "src": "contracts/RedemptionVault.sol:74" + }, + { + "label": "fiatFlatFee", + "offset": 0, + "slot": "421", + "type": "t_uint256", + "contract": "RedemptionVault", + "src": "contracts/RedemptionVault.sol:79" + }, + { + "label": "redeemRequests", + "offset": 0, + "slot": "422", + "type": "t_mapping(t_uint256,t_struct(Request)20338_storage)", + "contract": "RedemptionVault", + "src": "contracts/RedemptionVault.sol:84" + }, + { + "label": "requestRedeemer", + "offset": 0, + "slot": "423", + "type": "t_address", + "contract": "RedemptionVault", + "src": "contracts/RedemptionVault.sol:89" + }, + { + "label": "__gap", + "offset": 0, + "slot": "424", + "type": "t_array(t_uint256)50_storage", + "contract": "RedemptionVault", + "src": "contracts/RedemptionVault.sol:94" + }, + { + "label": "aavePools", + "offset": 0, + "slot": "474", + "type": "t_mapping(t_address,t_contract(IAaveV3Pool)20654)", + "contract": "RedemptionVaultWithAave", + "src": "contracts/RedemptionVaultWithAave.sol:24" + }, + { + "label": "__gap", + "offset": 0, + "slot": "475", + "type": "t_array(t_uint256)50_storage", + "contract": "RedemptionVaultWithAave", + "src": "contracts/RedemptionVaultWithAave.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "525", + "type": "t_array(t_uint256)50_storage", + "contract": "MGlobalRedemptionVaultWithAave", + "src": "contracts/products/mGLOBAL/MGlobalRedemptionVaultWithAave.sol:19" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_bytes32)dyn_storage": { + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "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_bytes4": { + "label": "bytes4", + "numberOfBytes": "4" + }, + "t_contract(IAaveV3Pool)20654": { + "label": "contract IAaveV3Pool", + "numberOfBytes": "20" + }, + "t_contract(IDataFeed)19772": { + "label": "contract IDataFeed", + "numberOfBytes": "20" + }, + "t_contract(IMToken)20057": { + "label": "contract IMToken", + "numberOfBytes": "20" + }, + "t_contract(MidasAccessControl)17274": { + "label": "contract MidasAccessControl", + "numberOfBytes": "20" + }, + "t_enum(RequestStatus)20074": { + "label": "enum RequestStatus", + "members": ["Pending", "Processed", "Canceled"], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_contract(IAaveV3Pool)20654)": { + "label": "mapping(address => contract IAaveV3Pool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(TokenConfig)20070_storage)": { + "label": "mapping(address => struct TokenConfig)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes4,t_bool)": { + "label": "mapping(bytes4 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Request)20338_storage)": { + "label": "mapping(uint256 => struct Request)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3891_storage": { + "label": "struct EnumerableSetUpgradeable.AddressSet", + "members": [ + { + "label": "_inner", + "type": "t_struct(Set)3576_storage", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Counter)8079_storage": { + "label": "struct Counters.Counter", + "members": [ + { + "label": "_value", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Request)20338_storage": { + "label": "struct Request", + "members": [ + { + "label": "sender", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "tokenOut", + "type": "t_address", + "offset": 0, + "slot": "1" + }, + { + "label": "status", + "type": "t_enum(RequestStatus)20074", + "offset": 20, + "slot": "1" + }, + { + "label": "amountMToken", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "mTokenRate", + "type": "t_uint256", + "offset": 0, + "slot": "3" + }, + { + "label": "tokenOutRate", + "type": "t_uint256", + "offset": 0, + "slot": "4" + } + ], + "numberOfBytes": "160" + }, + "t_struct(Set)3576_storage": { + "label": "struct EnumerableSetUpgradeable.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_struct(TokenConfig)20070_storage": { + "label": "struct TokenConfig", + "members": [ + { + "label": "dataFeed", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "fee", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "allowance", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "stable", + "type": "t_bool", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } + }, + "bd60b4f1380b8070745a972f01e95243dbda523f6af0a69503aacbc50c8802bb": { + "address": "0xE98a4Fb7a2e87AD888CceF0587DC820cf1a7CAbB", + "txHash": "0xa13d988d19299ca575689672810bba6e174fb32dd803515a92d72c13400fbf1d", + "layout": { + "solcVersion": "0.8.9", + "storage": [ + { + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:63", + "retypedFrom": "bool" + }, + { + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool", + "contract": "Initializable", + "src": "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol:68" + }, + { + "label": "accessControl", + "offset": 2, + "slot": "0", + "type": "t_contract(MidasAccessControl)17274", + "contract": "WithMidasAccessControl", + "src": "contracts/access/WithMidasAccessControl.sol:24" + }, + { + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage", + "contract": "WithMidasAccessControl", + "src": "contracts/access/WithMidasAccessControl.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage", + "contract": "ContextUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol:36" + }, + { + "label": "_paused", + "offset": 0, + "slot": "101", + "type": "t_bool", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:29" + }, + { + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage", + "contract": "PausableUpgradeable", + "src": "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol:116" + }, + { + "label": "fnPaused", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_bytes4,t_bool)", + "contract": "Pausable", + "src": "contracts/access/Pausable.sol:14" + }, + { + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)50_storage", + "contract": "Pausable", + "src": "contracts/access/Pausable.sol:19" + }, + { + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)50_storage", + "contract": "Blacklistable", + "src": "contracts/access/Blacklistable.sol:16" + }, + { + "label": "greenlistEnabled", + "offset": 0, + "slot": "252", + "type": "t_bool", + "contract": "Greenlistable", + "src": "contracts/access/Greenlistable.sol:16" + }, + { + "label": "__gap", + "offset": 0, + "slot": "253", + "type": "t_array(t_uint256)50_storage", + "contract": "Greenlistable", + "src": "contracts/access/Greenlistable.sol:21" + }, + { + "label": "sanctionsList", + "offset": 0, + "slot": "303", + "type": "t_address", + "contract": "WithSanctionsList", + "src": "contracts/abstract/WithSanctionsList.sol:18" + }, + { + "label": "__gap", + "offset": 0, + "slot": "304", + "type": "t_array(t_uint256)50_storage", + "contract": "WithSanctionsList", + "src": "contracts/abstract/WithSanctionsList.sol:23" + }, + { + "label": "currentRequestId", + "offset": 0, + "slot": "354", + "type": "t_struct(Counter)8079_storage", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:53" + }, + { + "label": "mToken", + "offset": 0, + "slot": "355", + "type": "t_contract(IMToken)20057", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:66" + }, + { + "label": "mTokenDataFeed", + "offset": 0, + "slot": "356", + "type": "t_contract(IDataFeed)19772", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:71" + }, + { + "label": "tokensReceiver", + "offset": 0, + "slot": "357", + "type": "t_address", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:76" + }, + { + "label": "instantFee", + "offset": 0, + "slot": "358", + "type": "t_uint256", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:81" + }, + { + "label": "instantDailyLimit", + "offset": 0, + "slot": "359", + "type": "t_uint256", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:88" + }, + { + "label": "dailyLimits", + "offset": 0, + "slot": "360", + "type": "t_mapping(t_uint256,t_uint256)", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:93" + }, + { + "label": "feeReceiver", + "offset": 0, + "slot": "361", + "type": "t_address", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:98" + }, + { + "label": "variationTolerance", + "offset": 0, + "slot": "362", + "type": "t_uint256", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:103" + }, + { + "label": "waivedFeeRestriction", + "offset": 0, + "slot": "363", + "type": "t_mapping(t_address,t_bool)", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:108" + }, + { + "label": "_paymentTokens", + "offset": 0, + "slot": "364", + "type": "t_struct(AddressSet)3891_storage", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:113" + }, + { + "label": "tokensConfig", + "offset": 0, + "slot": "366", + "type": "t_mapping(t_address,t_struct(TokenConfig)20070_storage)", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:118" + }, + { + "label": "minAmount", + "offset": 0, + "slot": "367", + "type": "t_uint256", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:123" + }, + { + "label": "isFreeFromMinAmount", + "offset": 0, + "slot": "368", + "type": "t_mapping(t_address,t_bool)", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:128" + }, + { + "label": "__gap", + "offset": 0, + "slot": "369", + "type": "t_array(t_uint256)50_storage", + "contract": "ManageableVault", + "src": "contracts/abstract/ManageableVault.sol:133" + }, + { + "label": "minFiatRedeemAmount", + "offset": 0, + "slot": "419", + "type": "t_uint256", + "contract": "RedemptionVault", + "src": "contracts/RedemptionVault.sol:69" + }, + { + "label": "fiatAdditionalFee", + "offset": 0, + "slot": "420", + "type": "t_uint256", + "contract": "RedemptionVault", + "src": "contracts/RedemptionVault.sol:74" + }, + { + "label": "fiatFlatFee", + "offset": 0, + "slot": "421", + "type": "t_uint256", + "contract": "RedemptionVault", + "src": "contracts/RedemptionVault.sol:79" + }, + { + "label": "redeemRequests", + "offset": 0, + "slot": "422", + "type": "t_mapping(t_uint256,t_struct(Request)20338_storage)", + "contract": "RedemptionVault", + "src": "contracts/RedemptionVault.sol:84" + }, + { + "label": "requestRedeemer", + "offset": 0, + "slot": "423", + "type": "t_address", + "contract": "RedemptionVault", + "src": "contracts/RedemptionVault.sol:89" + }, + { + "label": "__gap", + "offset": 0, + "slot": "424", + "type": "t_array(t_uint256)50_storage", + "contract": "RedemptionVault", + "src": "contracts/RedemptionVault.sol:94" + }, + { + "label": "___gap", + "offset": 0, + "slot": "474", + "type": "t_array(t_uint256)50_storage", + "contract": "RedemptionVaultWithSwapper", + "src": "contracts/RedemptionVaultWithSwapper.sol:34" + }, + { + "label": "mTbillRedemptionVault", + "offset": 0, + "slot": "524", + "type": "t_contract(IRedemptionVault)20575", + "contract": "RedemptionVaultWithSwapper", + "src": "contracts/RedemptionVaultWithSwapper.sol:41" + }, + { + "label": "liquidityProvider", + "offset": 0, + "slot": "525", + "type": "t_address", + "contract": "RedemptionVaultWithSwapper", + "src": "contracts/RedemptionVaultWithSwapper.sol:43" + }, + { + "label": "__gap", + "offset": 0, + "slot": "526", + "type": "t_array(t_uint256)50_storage", + "contract": "RedemptionVaultWithSwapper", + "src": "contracts/RedemptionVaultWithSwapper.sol:48" + }, + { + "label": "__gap", + "offset": 0, + "slot": "576", + "type": "t_array(t_uint256)50_storage", + "contract": "MGlobalRedemptionVaultWithSwapper", + "src": "contracts/products/mGLOBAL/MGlobalRedemptionVaultWithSwapper.sol:19" + } + ], + "types": { + "t_address": { + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_bytes32)dyn_storage": { + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "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_bytes4": { + "label": "bytes4", + "numberOfBytes": "4" + }, + "t_contract(IDataFeed)19772": { + "label": "contract IDataFeed", + "numberOfBytes": "20" + }, + "t_contract(IMToken)20057": { + "label": "contract IMToken", + "numberOfBytes": "20" + }, + "t_contract(IRedemptionVault)20575": { + "label": "contract IRedemptionVault", + "numberOfBytes": "20" + }, + "t_contract(MidasAccessControl)17274": { + "label": "contract MidasAccessControl", + "numberOfBytes": "20" + }, + "t_enum(RequestStatus)20074": { + "label": "enum RequestStatus", + "members": ["Pending", "Processed", "Canceled"], + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "label": "mapping(address => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_struct(TokenConfig)20070_storage)": { + "label": "mapping(address => struct TokenConfig)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_uint256)": { + "label": "mapping(bytes32 => uint256)", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes4,t_bool)": { + "label": "mapping(bytes4 => bool)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_struct(Request)20338_storage)": { + "label": "mapping(uint256 => struct Request)", + "numberOfBytes": "32" + }, + "t_mapping(t_uint256,t_uint256)": { + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32" + }, + "t_struct(AddressSet)3891_storage": { + "label": "struct EnumerableSetUpgradeable.AddressSet", + "members": [ + { + "label": "_inner", + "type": "t_struct(Set)3576_storage", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "64" + }, + "t_struct(Counter)8079_storage": { + "label": "struct Counters.Counter", + "members": [ + { + "label": "_value", + "type": "t_uint256", + "offset": 0, + "slot": "0" + } + ], + "numberOfBytes": "32" + }, + "t_struct(Request)20338_storage": { + "label": "struct Request", + "members": [ + { + "label": "sender", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "tokenOut", + "type": "t_address", + "offset": 0, + "slot": "1" + }, + { + "label": "status", + "type": "t_enum(RequestStatus)20074", + "offset": 20, + "slot": "1" + }, + { + "label": "amountMToken", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "mTokenRate", + "type": "t_uint256", + "offset": 0, + "slot": "3" + }, + { + "label": "tokenOutRate", + "type": "t_uint256", + "offset": 0, + "slot": "4" + } + ], + "numberOfBytes": "160" + }, + "t_struct(Set)3576_storage": { + "label": "struct EnumerableSetUpgradeable.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_struct(TokenConfig)20070_storage": { + "label": "struct TokenConfig", + "members": [ + { + "label": "dataFeed", + "type": "t_address", + "offset": 0, + "slot": "0" + }, + { + "label": "fee", + "type": "t_uint256", + "offset": 0, + "slot": "1" + }, + { + "label": "allowance", + "type": "t_uint256", + "offset": 0, + "slot": "2" + }, + { + "label": "stable", + "type": "t_bool", + "offset": 0, + "slot": "3" + } + ], + "numberOfBytes": "128" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + } + } + } } } } diff --git a/ROLES.md b/ROLES.md index 244e3cf2..7781a849 100644 --- a/ROLES.md +++ b/ROLES.md @@ -28,6 +28,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x1082007de1a74e6fd3a41711e0de78a15fefc346dbafdebc6a72059a491690fe` | | ***depositVaultAdmin*** | `0x2728bd32a7e1e24afac41a073e9c92dbb65527c9ec3baa2a8d5ee1d06c0fa779` | | ***redemptionVaultAdmin*** | `0x57df534b215589c7ade8c8abe0978debf2ea95cf1d442550f94eec78a69d238e` | +| ***greenlisted*** | `0xd2576bd6a4c5558421de15cb8ecdf4eb3282aac06b94d4f004e8cd0d00f3ebd8` | ### mBASIS Roles @@ -39,6 +40,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x3f67562b4b097846c1ba1e811b8b755e50e08f2216afae238738db05e64dd219` | | ***depositVaultAdmin*** | `0x031828825684a933bf0200fc18d12f8f54001457300a4ffdd41c39d7ddd77467` | | ***redemptionVaultAdmin*** | `0xbcb79079f0c0f3532cdb407455586dbb9968f9bf24407593963d2358944ec6de` | +| ***greenlisted*** | `0x6684433dd1583e80f122d098f5381a0596507e533494e11dd6fb1156a4a8a0d9` | ### mBTC Roles @@ -50,6 +52,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xa528e00521e2b02fe8f617f337664f3c4e2599acd01e89797d224321ba7715d2` | | ***depositVaultAdmin*** | `0xc1f224c5831d29f97aad86fbb8a4773a93f859055fd1601e07f84059007e1fe6` | | ***redemptionVaultAdmin*** | `0xdfc4e15e3a5976c9d989b83fc72efd611b2bf7d1a53e3dab2b24bdeafed2ff6b` | +| ***greenlisted*** | `0xc6ff1c7ea84db4ea22b52a72392d5b75019644267f511421c01a4b972eaba6ad` | ### mEDGE Roles @@ -61,6 +64,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x2501a0cad9a349c441407b7fd76d87b7c02f6dd034095f67a7744d0522dcd597` | | ***depositVaultAdmin*** | `0x836f31f9c910e2aea353965d7f3ff605f3e9cbe3717030ebac30527686f13231` | | ***redemptionVaultAdmin*** | `0xd36509da749681847f00f42962eeac9c5afc710f238d0d74f99363d95e901029` | +| ***greenlisted*** | `0x03e5ceefe93c0c29a28a7a89b8012e7678af9dfd5e7520e1bd8ad009fd7e70b1` | ### mMEV Roles @@ -72,6 +76,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xc37736bc91553080fa6e36d359a13aafb3bbf0551ddf7dbba81e45bbe1752884` | | ***depositVaultAdmin*** | `0xbcf8a4f903c8ac8db2ca0069f22cf6fe0aa7211a163fa371a85bde2e614ae434` | | ***redemptionVaultAdmin*** | `0x44b22dfed3e7f9fab55a628f6ecd7359e021b7d9cc75315099ae88b76c197c45` | +| ***greenlisted*** | `0xdaaa0988e6c7da3c736c3a1cd3d6d4c313e474c2203dc20a8e88007c0dbbf0a4` | ### mRE7 Roles @@ -83,6 +88,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xc6ad291847747ab905c0fb1a2a00f0cc9d4d8af8c76516770365407d5c60d284` | | ***depositVaultAdmin*** | `0x798b653d5cbe36c6e86307a13d8f1a22454184746c0735462d6b79b73856d732` | | ***redemptionVaultAdmin*** | `0x08d94ed677925f6d75bed3697c6ebebd14565082d8c4481840c66da1586fdd12` | +| ***greenlisted*** | `0xf76ad3bd5ab99386876c1ef86a0be7e682568378609d924da3918a0958512b72` | ### mRE7SOL Roles @@ -94,6 +100,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x4d94b4292928820575e235996b429e6637143146fc4a1b5c3e054e8d79456756` | | ***depositVaultAdmin*** | `0x9b4e55e8de230bedd27d0e7c47d1fbab2b169fb1e77d738bf687b70d7cd90fe1` | | ***redemptionVaultAdmin*** | `0x06eedf8d6f31879c73bbae06fd13a702c2faed8dd4116d3cc7808bea58436654` | +| ***greenlisted*** | `0x6a3cb2418cf540ff4dbd36305e786bc26f317a59cb8a9519a9566d9de55cc45b` | ### mSL Roles @@ -105,6 +112,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xf80f6b1ce400fb45a90070da8ef94bfa137c3a4afcc9f1dc662ca00d31475d69` | | ***depositVaultAdmin*** | `0xb9677857a06ff06e2dd61ecc2895662176274e7eb9f8fe7f3dd57e4579879f0e` | | ***redemptionVaultAdmin*** | `0x4cf4c2c0ed12a847be721192faec7cd5d0e4aad307918a94ccb0452e197ff899` | +| ***greenlisted*** | `0x452ffacc2a33c74023aa500822e08562c1ea20c38b0bc788f71a3c236ced5fcb` | ### hbUSDT Roles @@ -116,6 +124,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x518ccabaff0fce07d2c6ca6e0b6d235c32bacbfcd32f4eeb638f8b955be66d6a` | | ***depositVaultAdmin*** | `0x67c435dd03cae84170ef8ae997cd606604e3fe867e73e8b73001eaf8b09a2729` | | ***redemptionVaultAdmin*** | `0x856107334cd53181a978573c21093cf543862499f00c157be5bcc123ccf9f869` | +| ***greenlisted*** | `0x5a1547ea3b8e3e9da9158251f735a557f974feac7b332ee6b30fe3cb1b5155fe` | ### hbXAUt Roles @@ -127,6 +136,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x8e7c1e63e33b695f8bd5baad16a1b3d924c6664bafadfaf89a30f168c3b4dc86` | | ***depositVaultAdmin*** | `0x5f0716459fa0edab42d200fcf71ca5098a061b13e7bdee99a7a9189f34bbc03c` | | ***redemptionVaultAdmin*** | `0xedeb6b0f7208dd2541c532419cf72c97d5dfe49ba9f62d7ae77829625560bd9f` | +| ***greenlisted*** | `0x5fe4acc3367201c279ae8d40bc4d1a16e89eb3eed8fff4a66cd6d368c8e45ab7` | ### mF-ONE Roles @@ -138,6 +148,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xdb5e9dab3324bd3260229fbc56a0f12fa0317c8cb14bee310acef564572cd504` | | ***depositVaultAdmin*** | `0xc36e0ff97dfe3349dafe1988294b64f3512b08a634f42b52895a3c3559879a23` | | ***redemptionVaultAdmin*** | `0xe48f52da9588e92d268adb569f098fc35caa5a1913185feefe9c4e62554590bd` | +| ***greenlisted*** | `0x4fb235f2293990c239a865426421665ce051d8a6b4de71c8e67ffd51bfb5f7fe` | ### mHYPER Roles @@ -149,6 +160,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xf579edbdfe71eecb0735bb2656b6d53f5b7ee74072467c73e651c84bd4f94e1b` | | ***depositVaultAdmin*** | `0x5375b38f2ad9c8c8833b90d06ab20e4199feca9d6a6c8f2369d8f717325f4732` | | ***redemptionVaultAdmin*** | `0xa6095bf1d1689844730f85ea9c1edf7d9e1566838e1baa0327271b6c8c31dd8a` | +| ***greenlisted*** | `0x8eaf16685f46bf63dec11e4e5fdd23942ef623735b5cb911d19c29f052a78e7c` | ### mAPOLLO Roles @@ -160,6 +172,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xcdd2c3a00a01651579d9e60180508ef1b0735d9ea12d2ccc6a5a17304c3865e0` | | ***depositVaultAdmin*** | `0x257642c7a907c8e097f048c5aec3671d93280c2ea79e740dbf3db850fbbfe87c` | | ***redemptionVaultAdmin*** | `0xba606c08c0542611892ee357c770c7db19d0a4746e65e6ed76098fab6f5a1f74` | +| ***greenlisted*** | `0x45015a3a524001a20abef155f27185320f97115157b3668779a47a3def823c91` | ### mLIQUIDITY Roles @@ -171,6 +184,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xf409dfa7d5715bbbb250c8dd3daaf7b5c4c59c07d8282b3deb399ecc8b77ef40` | | ***depositVaultAdmin*** | `0x4ae10937608921453c928fd22bad34da4971f9071b8fd6ad79ea29afc5c6afe7` | | ***redemptionVaultAdmin*** | `0xbba515ef02587c62bf179bced88e29e0477a897d3720d05c096e7ed9ee151d86` | +| ***greenlisted*** | `0x2018420471052f5fddc03e96dcf0e9e9022cf262d71d8fa9d24dda085da20ea3` | ### hypeETH Roles @@ -182,6 +196,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x764eb035040faf73d2287eafcba7e6337ae76fdc3ee35ba8ef40e1a09a23de68` | | ***depositVaultAdmin*** | `0xae553d551009abb750be60f0012aa8c3ddd983693b8dff01c72865ce4a168e3d` | | ***redemptionVaultAdmin*** | `0x95e83dad8318203a8f5403e876f060568bd41bd30657932e74ed22179b9f74fa` | +| ***greenlisted*** | `0x39ee20162dbb915214674133524f5dafc6eb0cf6d86653ff0a31293107d05928` | ### hypeBTC Roles @@ -193,6 +208,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xe81d2e411cf48d8070dfd236034f5656d19658a97844d351d55c2536afbf8321` | | ***depositVaultAdmin*** | `0x474c3b5a03a85f7ac94c9ded863a405764a213bd8bed7770e569f81bd232ad75` | | ***redemptionVaultAdmin*** | `0x8b9bcd8fb4b73ecd219ebec8d58d51d733b323c22f603782b1e81dd39a873410` | +| ***greenlisted*** | `0x13f780d83eb4bfad18704aafdaa9c1851da2b63fdfe6cd4527368ddc0c8e211b` | ### hypeUSD Roles @@ -204,6 +220,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xa86b37593aa43463e8b076a34a3ffff1a50aea0b0e387506c1842cb639ee6033` | | ***depositVaultAdmin*** | `0x7220536b5d20cb1a8c46de14f2477acabbe0406a3bb145148014db34f5320ca1` | | ***redemptionVaultAdmin*** | `0x7cc4d19b3d33bc058b66d70205654d56c5b97d2bfbb6db726b4853de3503e416` | +| ***greenlisted*** | `0x045d85a1285e3fdbe0006067fd088b14d7421d515f38d94bfeb779838c583c67` | ### tETH Roles @@ -215,6 +232,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x15a9a8831d7e86b8cacded60e5295dd3f73e83a49069ee92480fc811440c5c3e` | | ***depositVaultAdmin*** | `0xed5678b978fd67f3777524a00f27c79e5552efeca1f047f9e805a5dc7c2dadff` | | ***redemptionVaultAdmin*** | `0x7bd1951470f20c89a15b10ee03824a5ddb66ad1f15509a43080312e5afb004b7` | +| ***greenlisted*** | `0x34bff47e56588fa7be76ad4c8e29addf29b9df256bff7aca8bf718aa9656685a` | ### tUSDe Roles @@ -226,6 +244,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x8b327b58b2c3abc1a461e6623e61b8b0404e1e91a4d9ca6e1af4bdf0bad2d4b9` | | ***depositVaultAdmin*** | `0x1cd832df82a54ef7800c554190a44c6835fb6308758d0426bf0e85d781b2f073` | | ***redemptionVaultAdmin*** | `0x32398e3056e30f5c1dd6941eafb112330604efa8280fcf2bf5ef4dbdeb136eba` | +| ***greenlisted*** | `0x3b778c3a364945f52c7996bcc38447534c54f726965ead37959b3aaddd0eb3af` | ### tBTC Roles @@ -237,6 +256,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x49751bf2540718c600c491dd4da359346fb58d59d9f77d86299120a903126697` | | ***depositVaultAdmin*** | `0x9562e90a6c3b1619669a0d4c8c5f655585009190c4d3109c5377837bf98bff05` | | ***redemptionVaultAdmin*** | `0x01276c74fcbd62f81a3fba8e104829892f528bebcc43b3881d27774e716f4366` | +| ***greenlisted*** | `0x5af9cbc50043241d317aa9ee6bba4148617444b0346fae756d5206bdc1154bdf` | ### mevBTC Roles @@ -248,6 +268,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xa8b1ccf7c601c1749cd6c7c918f98291cbf616e3b866cf1dc556d8f50633444d` | | ***depositVaultAdmin*** | `0x47a846aa32c59e889fc832ab1f36a3ddfdb2811bf9584199312c2e9f9e2e65d2` | | ***redemptionVaultAdmin*** | `0xa584655a424c1847696a6f0b8baf98ccf0779d1ce1aa17ee76d36d10eb092153` | +| ***greenlisted*** | `0x579f509479362d4f42e068a280304231c01ddf1bf348dc180df4a92d9bf95856` | ### lstHYPE Roles @@ -259,6 +280,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x745baa764d110b42b6dabca1d82c565ed4cbc8cd27bf9f332de5f0ddab2bcb56` | | ***depositVaultAdmin*** | `0x35f1adb8c633db7cf4cc370ccfb50b8aa56b5e38a8cdf1bf5d3a58f82dc21cc0` | | ***redemptionVaultAdmin*** | `0x22e39eb53f44668fbc61c98ca3b75d9c269561162df7cd08bf1b4b51ee2d40c6` | +| ***greenlisted*** | `0x1c19beb39c9de2257261f7bf925b5213142be5329247b997f04653feb30828a8` | ### liquidHYPE Roles @@ -270,6 +292,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xc8008cecd14e51254a5f110598d40e4f0176f51948f29516417e78147adb3b4f` | | ***depositVaultAdmin*** | `0x8eb8d75c3e48abb8e2dd66f0c7051267ad19ead14e551bc18d1833986047eba9` | | ***redemptionVaultAdmin*** | `0x00788a6cc736b61867c5eef2e9b994a921eb9dd76db6909af6b392748456e8e5` | +| ***greenlisted*** | `0x4841878a3804a6f5ebe57fae5916072040675581d98ea3f04b64df23ffbcff63` | ### TACmBTC Roles @@ -281,6 +304,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `-` | | ***depositVaultAdmin*** | `0xc8438dea533b5899a4e47059184296a68a18e6c91572176928f4569a16f3bb2e` | | ***redemptionVaultAdmin*** | `0x3feb12a81841c00d0fb893950ffee2fa65b33ed8f0301bd4b42b1c99cbc56e29` | +| ***greenlisted*** | `0xb0b39fff04a7135bde3994da6651b9f2a6d67c4c56191ddb2879b9e211c68030` | ### TACmEDGE Roles @@ -292,6 +316,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `-` | | ***depositVaultAdmin*** | `0x2bfee145dfcfa12cfadb6b23429ae5e69203ae9bc7e3525becf8db6aea0df1cd` | | ***redemptionVaultAdmin*** | `0x531f178c9d65bdb94673da40873ff8352f439541a40c8292c9458d8dea326924` | +| ***greenlisted*** | `0x2757b83bccef2fccac9be9c5723442846bdccdcd07feb86e9154c0de6068b65c` | ### TACmMEV Roles @@ -303,6 +328,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `-` | | ***depositVaultAdmin*** | `0x747cb0a703a70d6f4c9a939eb8562c818cbd166a32ee124c8f67d378fb7b3acf` | | ***redemptionVaultAdmin*** | `0x2b1562306621e9994db493bf6f01d859047d843e24d2e2505ed812afb0c7f338` | +| ***greenlisted*** | `0xca55fce9da978f1bc5a7e23fee051b87c714841d6774e656e85b532fc97bbeff` | ### hbUSDC Roles @@ -314,6 +340,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x603932159a2fefd8c549b75abe1d23fe5211cd34a4bb7945e88e3c42c8c173f7` | | ***depositVaultAdmin*** | `0xc64aa4a26572bae0f2719e17bf4594e9ec8bb07aef40b7b0818304a893d63170` | | ***redemptionVaultAdmin*** | `0x481f8f2b28aa45d9ba7b67678369b327b4529746a5fa71a98cc876f7d15aa4dd` | +| ***greenlisted*** | `0xbd022120251653ef6ced782a34c1f71c4d84dd7b9531633672a856637fbd787b` | ### mFARM Roles @@ -325,6 +352,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xfb1d0031ec1705a943a0695bf27369ae0b167541a884e44a9e91504de7aae075` | | ***depositVaultAdmin*** | `0x4b61fcf8d91f6b99ff29dad530952626e9ed7a6634e1d082aa9e0432946d5757` | | ***redemptionVaultAdmin*** | `0xbb80e82ebcffb068fd66d2474f92fe07ea9e2f9632558b329c31222e9da85e6b` | +| ***greenlisted*** | `0x7db2911c9f9a623284c101307e749fa13b446e0928d9a52f0862f31f564e46ad` | ### wVLP Roles @@ -336,6 +364,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x3f432526d0924b86b31ffe829fc2e4385918b496986416b1c65362d15eaf964f` | | ***depositVaultAdmin*** | `0x1ee7d12c7a766d581e4f989301a06c9133b0dbb42703642517a774a566971a62` | | ***redemptionVaultAdmin*** | `0xf04ffa729da990f2cc7686bd568199dd5167eb3d26ce9fc2b45d4a60e086ea46` | +| ***greenlisted*** | `0x089f48692758328a3ecb833c1a872b6d235204ff9c7d5b30669e31897512591c` | ### dnHYPE Roles @@ -347,6 +376,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x43e95c54572f14f462bbfb5d540f1012e3c0455e0f380fee416c74c6055e1fe8` | | ***depositVaultAdmin*** | `0x426022399d5da895ea0c35138ac5caeae38531970babda5dfeb18feff43eba10` | | ***redemptionVaultAdmin*** | `0x49d2e07c4a1a5e243e851a5978b261b3369affead7b332779057d6622d7ccbec` | +| ***greenlisted*** | `0x5e19821f89b829516860deab21bd0883ca37852e254fdb0fb6a50bff2401c572` | ### kmiUSD Roles @@ -358,6 +388,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xb81d2c6ada30c222c72e59cbb7f9918867981b6be5e0de70a02c28699231f04e` | | ***depositVaultAdmin*** | `0x7537f0610d8c5c0e3877e4eaf4bbfa46ce64756a4162f35656eb7046cfa87906` | | ***redemptionVaultAdmin*** | `0x399c51febc66485c68c893eec57d25171ec297bcacececed07b76d2455734e21` | +| ***greenlisted*** | `0x5463fbf947bcd54b1834786d964de43257fa06f35a67f6557e5b6678262b57f3` | ### msyrupUSD Roles @@ -369,6 +400,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x870b9b3fdc67967aa82ccfb38d1e4e648eb11d78327a2a6e3aaae15ae9823b24` | | ***depositVaultAdmin*** | `0xfe44d23e8f577a6ba0d046ab5f3cac6d2b9f150dc4b50f87d740e53517153f3f` | | ***redemptionVaultAdmin*** | `0x19c29ddc0aeab94d66fcbc6d50146a9cabab754f3c97586d4747b127d45e3892` | +| ***greenlisted*** | `0x6aa47586627b1059e104cd58f5dc262674205f4e9ee55cc62853c8fce9a86877` | ### msyrupUSDp Roles @@ -380,6 +412,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x83fc35b9da75679c8242595bd87f935f92e5408e3c5047f4a4655d9788e93ad4` | | ***depositVaultAdmin*** | `0x661436c564a32bf31767ee8a3780101ecc23e47d665edede38d1ab5607f33981` | | ***redemptionVaultAdmin*** | `0x8dd09df1c86f6fc63f05a3bdcfc83593d52c7175e376ba25ccadbc941eee65ff` | +| ***greenlisted*** | `0x960002b94d9a9a96cad67bed4df2ad35d983484647d390b4073158f0a4cbad62` | ### dnPUMP Roles @@ -391,6 +424,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x728c0a1eea2007432e79a91bed6d19cf266038ce1a7ee9a960f7785f5bda4afc` | | ***depositVaultAdmin*** | `0xeab34f918f3eaf11763e3b4c1628d3f2a0ead31457d67a8b5ef39c5b85eb39c9` | | ***redemptionVaultAdmin*** | `0x361ea91ec68cf81833f8a6bb6a10b11c9c25ad9047fac6abdde00f8d30e58f2d` | +| ***greenlisted*** | `0x450aa32ffb4a053c43e66e0037d8fce1256f441b9b6882bb45ccba831fb87689` | ### zeroGUSDV Roles @@ -402,6 +436,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xf87c883a04f4641a44f6322372cac4d07a0222da4ace1a7ec2f82a98f31302ed` | | ***depositVaultAdmin*** | `0x145d33241f259437f09bf7d4911f9cee4cc798cd8305c1b3e7b5f34a9d0437ea` | | ***redemptionVaultAdmin*** | `0x365d3570d580bc3e72d04c9445f1b406f9d5dade1bdbd129e2f4b01451be661e` | +| ***greenlisted*** | `0x8745c9415f4af4bb9d8a2d57dd53a496637c7817f59fc891678ca5eaf32fb163` | ### zeroGETHV Roles @@ -413,6 +448,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xf3cd853d6f1ded5d35bd6aec0128deac32fd871147d8bd59c615b107d9657f05` | | ***depositVaultAdmin*** | `0x06dee9c89a1a47896eeccbdb0d5955ad3a063225cde414cd81fd862f1ed27473` | | ***redemptionVaultAdmin*** | `0x612890e7ee1f4eaa7326bdf276b97571ca077daea87d49f73ea6835ef6be794f` | +| ***greenlisted*** | `0x1a949613e2a8e661720f439518ef2c868d19fa4cadb4e9a567ac2facd4df400c` | ### zeroGBTCV Roles @@ -424,6 +460,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x61fac8e2b1e1eb9f905fc33364ee506a249f7274c4fd40266b1bee5079405433` | | ***depositVaultAdmin*** | `0x25056fdcb4c845a528d77b0134bd9b70c59ec3082a9e4548f2456cd0f963af5e` | | ***redemptionVaultAdmin*** | `0x2f2d35e32176224d8c30665c0b1883eed76ae78d1b5aa3dd2660a94de252654b` | +| ***greenlisted*** | `0xa131afc27ba41e155ed97a164a1bb59a38240731d6dce4b21125cf8aecd03515` | ### JIV Roles @@ -435,6 +472,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x689ed6e09db35150b55f60539620c3e18bd2c01c0aecb4b08d9e9a09ddd091ac` | | ***depositVaultAdmin*** | `0x02494000d12aeda6a5ae117ad607664bf9d77511cb2889d7ffb5c85827cd2b30` | | ***redemptionVaultAdmin*** | `0xb793c79b5c06cdf988d20676ee61c85a67c7be07ef92992d8418bc902e261ff5` | +| ***greenlisted*** | `0x8552a797dd1c486a54fdb60f4e875b9a14a8820c30dbc28a312311942fc0f17a` | ### mRE7BTC Roles @@ -446,6 +484,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x0e834dbd187b6db9f485835ea68d86c01ea3d10e91d3395d644b16d9c1ac9989` | | ***depositVaultAdmin*** | `0xec021bad33927d0a31d0986cae91e212be88d8b1642ee14d95c0098732b1f728` | | ***redemptionVaultAdmin*** | `0xbc624b939e289e4a276b6079082ce3d147365b84f0a63219d1e21aa5471ceeea` | +| ***greenlisted*** | `0x074f255d509a1aed517584698cea817ad882a59ca91c47a07f43ecffb4786db5` | ### kitUSD Roles @@ -457,6 +496,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x0bbe3e4cfbe4f95a3d87435abea1cb62d44b919b8f6b287461aa6b73168390c5` | | ***depositVaultAdmin*** | `0xa99539dd2331cd167d1bfcdaf78d8e0739895f8489326a28fc1fe630a6832307` | | ***redemptionVaultAdmin*** | `0x7a35a47a8eff1fd643b166da8e67c35e9623b663562ec485bf27e47ca10cf18b` | +| ***greenlisted*** | `0xfa684b10093d69b8fe5cc8e0b61de30f312f7a2246d31ef76258269ee4c711e4` | ### kitHYPE Roles @@ -468,6 +508,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xfaf4e89c54ca33061b4c54b63026753bb4529bd3d4cf800adac5e04f4f95bd19` | | ***depositVaultAdmin*** | `0x7692bd33e40262fc8350f963b4ce1a7dbba015ad7524e4c52246f987daef352e` | | ***redemptionVaultAdmin*** | `0xac612345a6c3aa9d8f67f715c35d81009e58462ee3ce32ebc3a98c8d8595dca9` | +| ***greenlisted*** | `0xd8a08cd8150e4b276095f514acd62bbd4a1066aacd3552ec18e9abb481180228` | ### kitBTC Roles @@ -479,6 +520,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xca3aeb1603b77ecb43b881dd05322eb9c1def396c1afad559e5f1010f3cb214a` | | ***depositVaultAdmin*** | `0xcb5b64df91879704427dd7394b5ddff6e25e3743689be1aae53e9088d0b35d0b` | | ***redemptionVaultAdmin*** | `0x4336930100e78c3c156a3ae63e35b7772e5c1bb73fd8c37afef9794e22139608` | +| ***greenlisted*** | `0x37400f687a1cdc660f4fdca98f204f3e38827a1bbe2549bd4484872729dcc88d` | ### dnFART Roles @@ -490,6 +532,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x66686ff0b744151218fb5716ba358f0408b05da16c0c1e1c78d0107f946a9e4a` | | ***depositVaultAdmin*** | `0x417e14db456e902f2d371bec4e84825022525cefb826769cb8633d30d3a677bd` | | ***redemptionVaultAdmin*** | `0xa779203b36bd5709628760a7c50bce0f822e144f8f6c6b115123e8a6c8c03dc9` | +| ***greenlisted*** | `0x8e10f41c003a8a929f3348a090c5a32d171e36e14e1b8ac2aac241ef64103ebd` | ### mXRP Roles @@ -501,6 +544,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x7339fe69eca710386145bcf48d64b175d4732f29391d8b4fce0eddd0f1c17c6e` | | ***depositVaultAdmin*** | `0x362885d5fdff43d17e2a02dd9fdc0991e345ad2809b4420b164cf45b79b7135e` | | ***redemptionVaultAdmin*** | `0xf35bad42d7bf4455cd28ba806419ba6983ae1bb82763acbe23000a54c73ba852` | +| ***greenlisted*** | `0x486609453f20bad8470ef51213289f69d63f127caa252f2f55a243c0bb7f6e69` | ### mWildUSD Roles @@ -512,6 +556,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xd325a43b044e6e8435ed548b3c3d79803f32e4092eeb8998c2d7e1355129359d` | | ***depositVaultAdmin*** | `0x27f46edf3790dcce9aa8381c77450360eb1b2a813b4aaa0f441b1c8930b9cca8` | | ***redemptionVaultAdmin*** | `0xd74f0ab688f992253a8d29d9beda11ebf2b2553f61db63a38aa18592737a7203` | +| ***greenlisted*** | `0xf8b12516ff95fb400b9f437c0ca018462710b09010abd2019d8fb703bb9dabd5` | ### plUSD Roles @@ -523,6 +568,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xe54e0c34ec9e21e5d494cc31362a1a01738b9c8201b1492e0a8c41f29bab8657` | | ***depositVaultAdmin*** | `0x22151d250e2118f0a16b6920179063985868b7c375109bcf40a854feb8556c6a` | | ***redemptionVaultAdmin*** | `0xcf2928af735fbee9eead9fd436593c5b39360362708871dbbbb7fa0574134d67` | +| ***greenlisted*** | `0x61973c22eb5664d1875bf37ce8feb95e45d5ff0cdba2153917b0b83fc72b9cda` | ### splUSD Roles @@ -534,6 +580,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xd2d07f97d51691d9cc3dc68de62c3bd3be35ee2426aece71654736de3858c66a` | | ***depositVaultAdmin*** | `0x6c6c511df5580240e086f99f7decdb2b9767bb4083e4506c24d14e991d89e7d7` | | ***redemptionVaultAdmin*** | `0xa7995f0865402fb3417af3099ecedbe1b8298a8bce795be2537994ba24c86757` | +| ***greenlisted*** | `0x92e0df95e5f07a00574d4727d6ca1a898796f23a66f7f7b8926d683b187d945e` | ### tacTON Roles @@ -545,6 +592,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x81a79a630fac70055a885e3cc4f43299de225f21a4dd0f3c12cd0cdb02f63673` | | ***depositVaultAdmin*** | `0x9ae16f76236cd21a9c3a22874243757b3a01d98698efcd43e3807fcda6edacf9` | | ***redemptionVaultAdmin*** | `0x07eb88e81bee4cfc727fa562de5aa8d6e39f4f1c9d51247523d940ba14302fd3` | +| ***greenlisted*** | `0x2068b9638b19aa4097aa35006b26804f552d080b4ba6b5059dad840db8e00ec6` | ### wNLP Roles @@ -556,6 +604,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x63f2d27d9b0a2ece8b9dcf87a2d9be85fe42e30303b34a075adaeab1f183aea0` | | ***depositVaultAdmin*** | `0xb4d28d7037796e169153e99eee9da3930adcd94170546fb14dbb844820ec2f66` | | ***redemptionVaultAdmin*** | `0x44e3d235985b514b1c86d9212eec487c89a9619644ab647779a38808eac4c57f` | +| ***greenlisted*** | `0xa2a81fd3c935194b75ff52b71deffc8f87fef95aa77c86d2d8c58873b3af8db0` | ### dnETH Roles @@ -567,6 +616,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x28f650fd7c41a419241dd95cbb2d5569eec89f8f2c2780453d11c294723a3656` | | ***depositVaultAdmin*** | `0x03da0adfdd81109cfba2909555ec8543a7fe511ada31ea34686e0f3bca09eed9` | | ***redemptionVaultAdmin*** | `0x48fef00ff7593576dfca68bb4580740b15927bc02d2b7147db715316519d40c6` | +| ***greenlisted*** | `0xb88ab27ad8fa94e814e84f688f8f70552f90cefa66e31e2a0e32871abd87e1f3` | ### dnTEST Roles @@ -578,6 +628,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x5c6640f5ca5fab75a7a647f5e9894eefe85a48c3eb36e32f7b66dd7c9b56fb25` | | ***depositVaultAdmin*** | `0xd53d90af3ccc60519f093fe7911711a2d74a86f334c078566ce9393227caaf20` | | ***redemptionVaultAdmin*** | `0x1c906f2abe99d47697b6f1a165f077c1939561421368d5884f652c07ac1987ef` | +| ***greenlisted*** | `0x5877a42044f9d3c95b57afa9d922af53d2d1e4a5e90b44b9634ac9255ef7f2aa` | ### acremBTC1 Roles @@ -589,6 +640,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x86066fb137b3d96927953e29c7bd5859470f3df040a44ba5bc22b1045d7b8e9e` | | ***depositVaultAdmin*** | `0x87355dd738f6623c15ab03e7dbf6a8c7065c52f47e97d349569591316ca1db67` | | ***redemptionVaultAdmin*** | `0x78b212079219087ec51f016511547fe54c7b05faa00bcd3783a5d6d79a293a0c` | +| ***greenlisted*** | `0x7c5081a2d8c47d479a11a645e5b82b46a83dc43f2169c35cf132eed29690ca04` | ### obeatUSD Roles @@ -600,6 +652,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x5d281460b909f8793b674674da4ebbd26006cb7e2fcf552c512d7310f825ee57` | | ***depositVaultAdmin*** | `0x22b2aa4957159ba4a9bc7980518f0c14f6012665862887276e86346c30a85a81` | | ***redemptionVaultAdmin*** | `0x8a33b6a8b6efdcf608e113af7bd38450ff80983ed62e5fb79511e63748622392` | +| ***greenlisted*** | `0x7308cf34fcfea4a3aa39bea2bdad4fe3c02f876879ded453fe7e6e056c83aff6` | ### mEVUSD Roles @@ -611,6 +664,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x6bfcc6405d34628bdfe92a284ba48ea6a6fb58edbd9ed0871bf54243870486f5` | | ***depositVaultAdmin*** | `0x59579aaa79d3138f941932d6d507884c7129dd3a28943a0e84380d0edde2e059` | | ***redemptionVaultAdmin*** | `0xbae9f1280706d56bad5bdea387c13ea5f0aa60d029a3863a304dc06fcf424a98` | +| ***greenlisted*** | `0xe9b1f1a1375555cd9b5f6123c0b8c951f365abc01c07f0890715e12f278aa628` | ### cUSDO Roles @@ -622,6 +676,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x249e992c5120f989604ccbd4424e0d8b50bd6a2608c6b822eb3cc288976d2f05` | | ***depositVaultAdmin*** | `0xaf2aad6a073c559869b34232f3b4c8e869c209dbce9b2fe68a618237614c2933` | | ***redemptionVaultAdmin*** | `0x895f69c8681a32c46f20c256cd5269c07897422cd9f6e9b619d95e128504daa0` | +| ***greenlisted*** | `0x02d208b889aa7b89079b46490a8c39e69ee142a11a584097acc75a8051d20bc1` | ### mHyperETH Roles @@ -633,6 +688,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xc8244e0d4922fa470db2e7022511229db7ae826724f73a29c8f8bea4d1aca3a6` | | ***depositVaultAdmin*** | `0x21d95919121161d4afe59d1bf781b18d09c9220f3ed493202e84bb8b791f4c53` | | ***redemptionVaultAdmin*** | `0xa4e6989faa7272b44195e76aab9bbf72ec6494ed664db64dc4fd077a2d4de6eb` | +| ***greenlisted*** | `0x7f1358510c7c5c469f94e700121541fdbcc7fb36380ad88bce7274b8214fc4fe` | ### mHyperBTC Roles @@ -644,6 +700,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xa8a5d84b506c7f678f2cc98f457f4eac3c3d6663b76db30e8cbb4b7665a4de35` | | ***depositVaultAdmin*** | `0x2e55e4462941cb91f5ff782032797a0cbda0aa6618f1558ba5b912d781b45be1` | | ***redemptionVaultAdmin*** | `0xaed1dfcb561f850481cdb3d35a3076d203b3bf6785bb0e8b8a52f608d0f82984` | +| ***greenlisted*** | `0xbc58fc115f0b79f6e248ac4c8db34618ed169bbc471e307d2dfc372f394166fa` | ### mPortofino Roles @@ -655,6 +712,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xbe67daee6b1b2282b6f74b3c92463b0fefc9c8eb37782a1758bc46200602e323` | | ***depositVaultAdmin*** | `0x3275e112edcda83fa1a983c6b503dda520825e0e93d86d92cdd9eaada8062115` | | ***redemptionVaultAdmin*** | `0xdc5a9c620266100042e71ec8a53cdcb4c0e3088ef200160c6cebac9aa2f625cb` | +| ***greenlisted*** | `0xf3e93d00cffe857cf851873a8567bc26898637943377b9ff8abfb84226f75adf` | ### liquidRESERVE Roles @@ -666,6 +724,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x0c4804cfdaa6fb0fb66b000b7efc6e10bbbec2295d7aa3119853b58d07cd56c4` | | ***depositVaultAdmin*** | `0x95e4444f4da9c63e0c10754468d5902bc394407e8f5cbeaf8302a1d93d6bafa4` | | ***redemptionVaultAdmin*** | `0x78a4d3a8242cca19aaec7f83d35b555e265608ffc8ca6b31f41ab6cc3576e2d6` | +| ***greenlisted*** | `0x96c066cd7c57194740f94f11ec9fcbc91557b4f9c51024a48efde4927abcf191` | ### mKRalpha Roles @@ -677,6 +736,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xe78d636d054c66cf8b45497e80d40c605d569b751c596222b7956726f364281b` | | ***depositVaultAdmin*** | `0x17f1e94afa834429dda5899bc488de1268caf3e8dc23fdfac8fce94af164883c` | | ***redemptionVaultAdmin*** | `0x62abf558cc1ffca0e98b65c5fbbe1fe4e7985ebb55a35e960ebdabea99490e19` | +| ***greenlisted*** | `0xb18331498e0ffedd3bb4f84c7c67b8df0a0f00c07f4e349416dc11fa0c0cdacd` | ### sLINJ Roles @@ -688,6 +748,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x6e88c0145b21b9dac4d8c86b05559507c93f80f1a795b7efd77ace6a74f6e5e5` | | ***depositVaultAdmin*** | `0xcd578dd983142075a2ed216acac5b73a5acc6d8f4b9195d054f2961770d988b6` | | ***redemptionVaultAdmin*** | `0x84fd2ae525734a655a1f412b400fe87e866dd5f9ffd8cbc8996de34c0dc3ef08` | +| ***greenlisted*** | `0x26a3a3a6429f694921d35bf9608ad26e6752fe47a5f22f2811c2e84b62afd143` | ### mROX Roles @@ -699,6 +760,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x551415cf4cc2b01f0725d18b40d9c16863d7c15269a30ea856a5590ea1d21498` | | ***depositVaultAdmin*** | `0xc8997ee9f86291fd3ac059284a65fab79fe3445c9a6ecefcabbb65cef2fab60e` | | ***redemptionVaultAdmin*** | `0x6b657f2b0d8acc821aaffa50e43ed825a893b0a45e14f75ee651c67ed0eb2cd0` | +| ***greenlisted*** | `0x78e3d8aaa89b3befef29c09abdf53ffe29820bb576b0684184f86b9beff9a8b9` | ### weEUR Roles @@ -710,6 +772,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0xfb95d927c73e0fca84cd32a7fe715d7e15bed2ff5dbcd74ab37ed0f18b7e6130` | | ***depositVaultAdmin*** | `0x660a740f704a1913dfd48c91a23d6f3fd814dd274cbd3a97cd219662c2d517a6` | | ***redemptionVaultAdmin*** | `0x7df3e9c64a8f407ac6d41b8a7c9933921870dcf2e1dc26634db612ecbd2a6c2b` | +| ***greenlisted*** | `0x2e6bdafa4ed6d0ca587bcf00da65be0719d676245963c191abae28d6b5eeb4b0` | ### mTU Roles @@ -721,6 +784,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x0d63a9c5269957d3e39208ee3afab89b411adf237866b2fa8c16f7566aa0f005` | | ***depositVaultAdmin*** | `0xc06d898b9385a8a78d84ae8938bea31e5e51d27cd8e8f2c4062cb377edf5b2ae` | | ***redemptionVaultAdmin*** | `0x5cabee3b96eb2fc64b9ccd892aa6825cc25584278d1b948a5cdb01d5d31bb19f` | +| ***greenlisted*** | `0x42256b715eb653101ad9b7fe9b108deb7cef52b9b148f762325fa489d70d2d47` | ### mM1USD Roles @@ -732,6 +796,7 @@ All the roles for the Midas protocol smart contracts are listed below. | ***customFeedAdmin*** | `0x611014d106fde488a6777e4edcdf617a5efa1d338bd69a08a39fcc2fc5a0e157` | | ***depositVaultAdmin*** | `0x0e1940e672eb264dbd85c24c06c804fabf4f2b2581deda529a1d87e5587959cb` | | ***redemptionVaultAdmin*** | `0x46c34f93bd31e702e9aee98b0dc288a6404a0cdbb567f2e1592bb7ccad8bacbc` | +| ***greenlisted*** | `0x6bf0ce8470456e7e10429fac4534a74a2e1a46f1dac7c55e9b00f53392c197dc` | ### mRe7ETH Roles @@ -742,4 +807,17 @@ All the roles for the Midas protocol smart contracts are listed below. | ***pauser*** | `0x8f4b7dfb05ebffc760b8d398af5b0d327b890a22f9030321740d68be514e8f60` | | ***customFeedAdmin*** | `0xc9f03f672dadad915001ad6a5393aba8482f9c28ea275c4b5480f7b994778ed5` | | ***depositVaultAdmin*** | `0x798de9824ed446b72c97afa7b28844dbbfbde8830d58977e9462289a757aafb7` | -| ***redemptionVaultAdmin*** | `0x37c36a61c043b91d5ec6d117c64ef865031d25c49609bb25d6530b1fcb8e2e1c` | \ No newline at end of file +| ***redemptionVaultAdmin*** | `0x37c36a61c043b91d5ec6d117c64ef865031d25c49609bb25d6530b1fcb8e2e1c` | +| ***greenlisted*** | `0xaf89762de5b3ac516a157f34bdea33ad26e67a6b7b2fd15723c756fea2414446` | + +### mGLOBAL Roles + +| Role Name | Role | +| --- | --- | +| ***minter*** | `0x86c2e8326862f916bf4ee800260d2306dc3c829808f94feb79f6d3a20aaf9bc2` | +| ***burner*** | `0xf30202443f5c1b5b1b44966689f7c464e1326952511f7c4520c3eeb7d0fb2c73` | +| ***pauser*** | `0x3f94a477c62da96b0917fe3f96e482fe996d0d72f3f205681d63700034625987` | +| ***customFeedAdmin*** | `0x9e02beae92a72aee37131404ba654d9d66746f20885ff63bd08d7b4b8864a54e` | +| ***depositVaultAdmin*** | `0xaf615efb4fe11d00bb4ee681716ff39d814b6276c659d78678e657cc93d3c7ad` | +| ***redemptionVaultAdmin*** | `0x4f489379521d284f6d62800bc46b6bc11dd3de438eba9c5a37a9e70f84ceb552` | +| ***greenlisted*** | `0x49a103d47daa98d445728ba0f2e848dccbbd73dea56729c961450eeb09890acc` | \ No newline at end of file diff --git a/config/constants/addresses.ts b/config/constants/addresses.ts index 567dcbf2..4721ad49 100644 --- a/config/constants/addresses.ts +++ b/config/constants/addresses.ts @@ -30,9 +30,20 @@ type AxelarTokenAddresses = { executables?: Partial>; }; -export type TokenAddresses = { +type TokenFeedAddresses = { customFeed?: string; + customFeedGrowth?: string; + + customFeedAdjusted?: string; + customFeedDv?: string; + customFeedRv?: string; + dataFeed?: string; + dataFeedDv?: string; + dataFeedRv?: string; +}; + +export type TokenAddresses = TokenFeedAddresses & { token?: string; layerZero?: LayerZeroTokenAddresses; axelar?: AxelarTokenAddresses; @@ -505,6 +516,19 @@ export const midasAddressesPerNetwork: ConfigPerNetwork< depositVault: '0x0f7e323103b29E1B18d521DE957Ed0c4c0A8189E', redemptionVaultSwapper: '0x70Ba3211f2584Bf1C8a2aCdF0a00dba559CE1Ffa', }, + mGLOBAL: { + token: '0x7433806912Eae67919e66aea853d46Fa0aef98A8', + customFeedGrowth: '0x66Aa9fcD63DF74e1f67A9452E6E59Fbc67f75E38', + // Adjusted growth feed: +7% + customFeedDv: '0x494F142c35167cFbDD3887E8D7897822e63c9618', + // Adjusted growth feed: -7% + customFeedRv: '0x4c825154d02eaFAB7F3c779D96c279BCDB9fCf6F', + dataFeedDv: '0x58476f452df10E6Bf17dc1fee418E98dE9e14868', + dataFeedRv: '0xb468A6F63868cB6C6D99105EDfbe73d6B21f139E', + depositVaultAave: '0xCe29c36c6D4556f2d01d79414C1354B968dDDEf1', + redemptionVaultAave: '0xA0Fc8BDFb1E6a705C1375810989B1d70a982b01B', + redemptionVaultSwapper: '0x1e0fd66753198c7b8bA64edEe8d41D8628Bf20D7', + }, }, arbitrum: { accessControl: '0x0312A9D1Ff2372DDEdCBB21e4B6389aFc919aC4B', @@ -895,7 +919,7 @@ export const midasAddressesPerNetwork: ConfigPerNetwork< }, dnTEST: { token: '0x80cAE1bb1B90980148C5bC9c5701b69fAfE7d6B2', - customFeed: '0x0c459A098EB325fD7ea602Cd7664EE43f1D4Bd08', + customFeedGrowth: '0x0c459A098EB325fD7ea602Cd7664EE43f1D4Bd08', dataFeed: '0xA7A8F3414e02AEcb50E206aF31001CC4990b4D0a', depositVault: '0xed51fEb552d596F3014B127D21ECcE5a7D8e8b19', redemptionVaultSwapper: '0x35D44B87D6c786e9434DA337eb59D373e8b84941', diff --git a/config/types/tokens.ts b/config/types/tokens.ts index 9e5c02f2..2bc48641 100644 --- a/config/types/tokens.ts +++ b/config/types/tokens.ts @@ -65,6 +65,7 @@ export enum MTokenNameEnum { mTU = 'mTU', mM1USD = 'mM1USD', mRe7ETH = 'mRe7ETH', + mGLOBAL = 'mGLOBAL', } export type MTokenName = keyof typeof MTokenNameEnum; diff --git a/contracts/products/mGLOBAL/MGlobalCustomAggregatorFeedGrowth.sol b/contracts/products/mGLOBAL/MGlobalCustomAggregatorFeedGrowth.sol new file mode 100644 index 00000000..7fc09a23 --- /dev/null +++ b/contracts/products/mGLOBAL/MGlobalCustomAggregatorFeedGrowth.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.9; + +import "../../feeds/CustomAggregatorV3CompatibleFeedGrowth.sol"; +import "./MGlobalMidasAccessControlRoles.sol"; + +/** + * @title MGlobalCustomAggregatorFeedGrowth + * @notice AggregatorV3 compatible feed for mGLOBAL, + * where price is submitted manually by feed admins, + * and growth apr applies to the answer. + * @author RedDuck Software + */ +contract MGlobalCustomAggregatorFeedGrowth is + CustomAggregatorV3CompatibleFeedGrowth, + MGlobalMidasAccessControlRoles +{ + /** + * @dev leaving a storage gap for futures updates + */ + uint256[50] private __gap; + + /** + * @inheritdoc CustomAggregatorV3CompatibleFeedGrowth + */ + function feedAdminRole() public pure override returns (bytes32) { + return M_GLOBAL_CUSTOM_AGGREGATOR_FEED_ADMIN_ROLE; + } +} diff --git a/contracts/products/mGLOBAL/MGlobalDataFeed.sol b/contracts/products/mGLOBAL/MGlobalDataFeed.sol new file mode 100644 index 00000000..cafba33a --- /dev/null +++ b/contracts/products/mGLOBAL/MGlobalDataFeed.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.9; + +import "../../feeds/DataFeed.sol"; +import "./MGlobalMidasAccessControlRoles.sol"; + +/** + * @title MGlobalDataFeed + * @notice DataFeed for mGLOBAL product + * @author RedDuck Software + */ +contract MGlobalDataFeed is DataFeed, MGlobalMidasAccessControlRoles { + /** + * @dev leaving a storage gap for futures updates + */ + uint256[50] private __gap; + + /** + * @inheritdoc DataFeed + */ + function feedAdminRole() public pure override returns (bytes32) { + return M_GLOBAL_CUSTOM_AGGREGATOR_FEED_ADMIN_ROLE; + } +} diff --git a/contracts/products/mGLOBAL/MGlobalDepositVaultWithAave.sol b/contracts/products/mGLOBAL/MGlobalDepositVaultWithAave.sol new file mode 100644 index 00000000..f8d42b59 --- /dev/null +++ b/contracts/products/mGLOBAL/MGlobalDepositVaultWithAave.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.9; + +import "../../DepositVaultWithAave.sol"; +import "./MGlobalMidasAccessControlRoles.sol"; + +/** + * @title MGlobalDepositVaultWithAave + * @notice Smart contract that handles mGLOBAL minting with Aave V3 auto-invest + * @author RedDuck Software + */ +contract MGlobalDepositVaultWithAave is + DepositVaultWithAave, + MGlobalMidasAccessControlRoles +{ + /** + * @dev leaving a storage gap for futures updates + */ + uint256[50] private __gap; + + /** + * @inheritdoc ManageableVault + */ + function vaultRole() public pure override returns (bytes32) { + return M_GLOBAL_DEPOSIT_VAULT_ADMIN_ROLE; + } + + /** + * @inheritdoc Greenlistable + */ + function greenlistedRole() public pure override returns (bytes32) { + return M_GLOBAL_GREENLISTED_ROLE; + } +} diff --git a/contracts/products/mGLOBAL/MGlobalMidasAccessControlRoles.sol b/contracts/products/mGLOBAL/MGlobalMidasAccessControlRoles.sol new file mode 100644 index 00000000..561d0ea6 --- /dev/null +++ b/contracts/products/mGLOBAL/MGlobalMidasAccessControlRoles.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.9; + +/** + * @title MGlobalMidasAccessControlRoles + * @notice Base contract that stores all roles descriptors for mGLOBAL contracts + * @author RedDuck Software + */ +abstract contract MGlobalMidasAccessControlRoles { + /** + * @notice actor that can manage MGlobalDepositVault + */ + bytes32 public constant M_GLOBAL_DEPOSIT_VAULT_ADMIN_ROLE = + keccak256("M_GLOBAL_DEPOSIT_VAULT_ADMIN_ROLE"); + + /** + * @notice actor that can manage MGlobalRedemptionVault + */ + bytes32 public constant M_GLOBAL_REDEMPTION_VAULT_ADMIN_ROLE = + keccak256("M_GLOBAL_REDEMPTION_VAULT_ADMIN_ROLE"); + + /** + * @notice actor that can manage MGlobalCustomAggregatorFeed and MGlobalDataFeed + */ + bytes32 public constant M_GLOBAL_CUSTOM_AGGREGATOR_FEED_ADMIN_ROLE = + keccak256("M_GLOBAL_CUSTOM_AGGREGATOR_FEED_ADMIN_ROLE"); + + /** + * @notice greenlist role for mGLOBAL + */ + bytes32 public constant M_GLOBAL_GREENLISTED_ROLE = + keccak256("M_GLOBAL_GREENLISTED_ROLE"); +} diff --git a/contracts/products/mGLOBAL/MGlobalRedemptionVaultWithAave.sol b/contracts/products/mGLOBAL/MGlobalRedemptionVaultWithAave.sol new file mode 100644 index 00000000..17f19dbb --- /dev/null +++ b/contracts/products/mGLOBAL/MGlobalRedemptionVaultWithAave.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.9; + +import "../../RedemptionVaultWithAave.sol"; +import "./MGlobalMidasAccessControlRoles.sol"; + +/** + * @title MGlobalRedemptionVaultWithAave + * @notice Smart contract that handles mGLOBAL redemptions via Aave V3 + * @author RedDuck Software + */ +contract MGlobalRedemptionVaultWithAave is + RedemptionVaultWithAave, + MGlobalMidasAccessControlRoles +{ + /** + * @dev leaving a storage gap for futures updates + */ + uint256[50] private __gap; + + /** + * @inheritdoc ManageableVault + */ + function vaultRole() public pure override returns (bytes32) { + return M_GLOBAL_REDEMPTION_VAULT_ADMIN_ROLE; + } + + /** + * @inheritdoc Greenlistable + */ + function greenlistedRole() public pure override returns (bytes32) { + return M_GLOBAL_GREENLISTED_ROLE; + } +} diff --git a/contracts/products/mGLOBAL/MGlobalRedemptionVaultWithSwapper.sol b/contracts/products/mGLOBAL/MGlobalRedemptionVaultWithSwapper.sol new file mode 100644 index 00000000..88f68ef1 --- /dev/null +++ b/contracts/products/mGLOBAL/MGlobalRedemptionVaultWithSwapper.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.9; + +import "../../RedemptionVaultWithSwapper.sol"; +import "./MGlobalMidasAccessControlRoles.sol"; + +/** + * @title MGlobalRedemptionVaultWithSwapper + * @notice Smart contract that handles mGLOBAL redemptions + * @author RedDuck Software + */ +contract MGlobalRedemptionVaultWithSwapper is + RedemptionVaultWithSwapper, + MGlobalMidasAccessControlRoles +{ + /** + * @dev leaving a storage gap for futures updates + */ + uint256[50] private __gap; + + /** + * @inheritdoc ManageableVault + */ + function vaultRole() public pure override returns (bytes32) { + return M_GLOBAL_REDEMPTION_VAULT_ADMIN_ROLE; + } + + /** + * @inheritdoc Greenlistable + */ + function greenlistedRole() public pure override returns (bytes32) { + return M_GLOBAL_GREENLISTED_ROLE; + } +} diff --git a/contracts/products/mGLOBAL/mGLOBAL.sol b/contracts/products/mGLOBAL/mGLOBAL.sol new file mode 100644 index 00000000..626639b4 --- /dev/null +++ b/contracts/products/mGLOBAL/mGLOBAL.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.9; + +import "../../mTokenPermissioned.sol"; +import "./MGlobalMidasAccessControlRoles.sol"; + +/** + * @title mGLOBAL + * @author RedDuck Software + */ +//solhint-disable contract-name-camelcase +contract mGLOBAL is mTokenPermissioned, MGlobalMidasAccessControlRoles { + /** + * @notice actor that can mint mGLOBAL + */ + bytes32 public constant M_GLOBAL_MINT_OPERATOR_ROLE = + keccak256("M_GLOBAL_MINT_OPERATOR_ROLE"); + + /** + * @notice actor that can burn mGLOBAL + */ + bytes32 public constant M_GLOBAL_BURN_OPERATOR_ROLE = + keccak256("M_GLOBAL_BURN_OPERATOR_ROLE"); + + /** + * @notice actor that can pause mGLOBAL + */ + bytes32 public constant M_GLOBAL_PAUSE_OPERATOR_ROLE = + keccak256("M_GLOBAL_PAUSE_OPERATOR_ROLE"); + + /** + * @dev leaving a storage gap for futures updates + */ + uint256[50] private __gap; + + /** + * @inheritdoc mToken + */ + function _getNameSymbol() + internal + pure + override + returns (string memory, string memory) + { + return ("Midas Fasanara Global", "mGLOBAL"); + } + + /** + * @dev AC role, owner of which can mint mGLOBAL token + */ + function _minterRole() internal pure override returns (bytes32) { + return M_GLOBAL_MINT_OPERATOR_ROLE; + } + + /** + * @dev AC role, owner of which can burn mGLOBAL token + */ + function _burnerRole() internal pure override returns (bytes32) { + return M_GLOBAL_BURN_OPERATOR_ROLE; + } + + /** + * @dev AC role, owner of which can pause mGLOBAL token + */ + function _pauserRole() internal pure override returns (bytes32) { + return M_GLOBAL_PAUSE_OPERATOR_ROLE; + } + + /** + * @inheritdoc mTokenPermissioned + */ + function _greenlistedRole() internal pure override returns (bytes32) { + return M_GLOBAL_GREENLISTED_ROLE; + } +} diff --git a/helpers/contracts.ts b/helpers/contracts.ts index a1eaa303..79a6fe21 100644 --- a/helpers/contracts.ts +++ b/helpers/contracts.ts @@ -129,6 +129,7 @@ export const contractNamesPrefixes: Record = { mTU: 'MTu', mM1USD: 'MM1Usd', mRe7ETH: 'MRe7Eth', + mGLOBAL: 'MGlobal', }; export const getCommonContractNames = (): CommonContractNames => { diff --git a/helpers/mtokens-metadata.ts b/helpers/mtokens-metadata.ts index 65089bbb..5103ee0e 100644 --- a/helpers/mtokens-metadata.ts +++ b/helpers/mtokens-metadata.ts @@ -268,4 +268,9 @@ export const mTokensMetadata: Record< name: 'Midas Re7 Ethereum', symbol: 'mRe7ETH', }, + mGLOBAL: { + name: 'Midas Fasanara Global', + symbol: 'mGLOBAL', + isPermissioned: true, + }, }; diff --git a/helpers/roles.ts b/helpers/roles.ts index 1c900e09..8cf76624 100644 --- a/helpers/roles.ts +++ b/helpers/roles.ts @@ -71,6 +71,7 @@ const prefixes: Record = { mTU: 'M_TU', mM1USD: 'M_M1_USD', mRe7ETH: 'M_RE7ETH', + mGLOBAL: 'M_GLOBAL', }; const mappedTokenNames: Partial> = { diff --git a/package.json b/package.json index bfb9bd0a..5fe4b318 100644 --- a/package.json +++ b/package.json @@ -42,14 +42,24 @@ "deploy:timelock": "yarn hh:run:script scripts/deploy/deploy_TimeLock.ts", "deploy:token": "yarn hh:run:script scripts/deploy/deploy_Token.ts", "deploy:aggregator": "yarn hh:run:script scripts/deploy/deploy_CustomAggregator.ts", + "deploy:aggregator:adjusted": "yarn hh:run:script scripts/deploy/misc/deploy_CustomAggregatorAdjusted.ts", + "deploy:aggregator:adjusted:dv": "yarn hh:run:script scripts/deploy/misc/deploy_CustomAggregatorAdjustedDv.ts", + "deploy:aggregator:adjusted:rv": "yarn hh:run:script scripts/deploy/misc/deploy_CustomAggregatorAdjustedRv.ts", "deploy:aggregator:ptoken": "yarn hh:run:script scripts/deploy/deploy_PaymentToken_CustomAggregator.ts", "deploy:feed": "yarn hh:run:script scripts/deploy/deploy_DataFeed.ts", + "deploy:feed:dv": "yarn hh:run:script scripts/deploy/deploy_DataFeedDv.ts", + "deploy:feed:rv": "yarn hh:run:script scripts/deploy/deploy_DataFeedRv.ts", "deploy:feed:ptoken": "yarn hh:run:script scripts/deploy/deploy_PaymentToken_DataFeed.ts", "deploy:dv": "yarn hh:run:script scripts/deploy/deploy_DV.ts", "deploy:dv:ustb": "yarn hh:run:script scripts/deploy/deploy_DVUstb.ts", + "deploy:dv:aave": "yarn hh:run:script scripts/deploy/deploy_DVAave.ts", + "deploy:dv:morpho": "yarn hh:run:script scripts/deploy/deploy_DVMorpho.ts", + "deploy:dv:mtoken": "yarn hh:run:script scripts/deploy/deploy_DVMToken.ts", "deploy:rv": "yarn hh:run:script scripts/deploy/deploy_RV.ts", "deploy:rv:swapper": "yarn hh:run:script scripts/deploy/deploy_RVSwapper.ts", - "deploy:rv:buidl": "yarn hh:run:script scripts/deploy/deploy_RVSwapper.ts", + "deploy:rv:aave": "yarn hh:run:script scripts/deploy/deploy_RVAave.ts", + "deploy:rv:morpho": "yarn hh:run:script scripts/deploy/deploy_RVMorpho.ts", + "deploy:rv:mtoken": "yarn hh:run:script scripts/deploy/deploy_RVMToken.ts", "deploy:generate:contracts": "yarn hh:run:script scripts/deploy/codegen/generate_contracts.ts", "deploy:generate:config": "yarn hh:run:script scripts/deploy/codegen/generate_config.ts", "deploy:post:add:ptokens": "yarn hh:run:script scripts/deploy/post-deploy/add_PaymentTokens.ts", diff --git a/scripts/deploy/codegen/common/index.ts b/scripts/deploy/codegen/common/index.ts index 86a64855..8d42c4fe 100644 --- a/scripts/deploy/codegen/common/index.ts +++ b/scripts/deploy/codegen/common/index.ts @@ -349,9 +349,13 @@ export const generateDeploymentConfig = async ( genericConfig: {}, }; + let isGrowthAggregator = false; + if (!deploymentConfigFileExists) { - deploymentConfig.genericConfig = - await configsPerNetworkConfig.genericConfig(mToken); + const genericResult = await configsPerNetworkConfig.genericConfig(mToken); + isGrowthAggregator = genericResult.isGrowth; + const { isGrowth: _, ...genericConfig } = genericResult; + deploymentConfig.genericConfig = genericConfig; } if ( @@ -453,13 +457,21 @@ export const ${deploymentConfigVarName}: DeploymentConfig = { postDeployProperty.remove(); } + const setRoundData: Record = isGrowthAggregator + ? { + type: expr("'GROWTH'"), + data: expr('parseUnits("1", 8)'), + apr: expr('parseUnits("0", 8)'), + } + : { + data: expr('parseUnits("1", 8)'), + }; + networkConfigPropertyInit.addPropertyAssignment({ name: 'postDeploy', initializer: objectToCode({ ...deploymentConfig.postDeploy, - setRoundData: { - data: expr('parseUnits("1", 8)'), - }, + setRoundData, }), }); } diff --git a/scripts/deploy/codegen/common/ui/deployment-config.ts b/scripts/deploy/codegen/common/ui/deployment-config.ts index 6e599ad4..f0645cd8 100644 --- a/scripts/deploy/codegen/common/ui/deployment-config.ts +++ b/scripts/deploy/codegen/common/ui/deployment-config.ts @@ -5,6 +5,7 @@ import { multiselect, outro, PromptGroup, + select, stream, text, } from '@clack/prompts'; @@ -39,32 +40,109 @@ export const configsPerNetworkConfig = { }; async function getGenericConfigFromUser(mToken: MTokenName) { - const config = await group({ - intro: () => Promise.resolve(intro('Generic Config')).then(() => undefined), - maxAswerDeviation: () => - text({ - message: 'Aggregator max answer deviation', - validate: (value) => validateFloat(value, 8), - }) - .then(requireNotCancelled) - .then((value) => requireFloatToBigNumberish(value, 8)), - tokenDenomination: () => - text({ - message: 'Token Denomination', - defaultValue: 'USD', - initialValue: 'USD', - placeholder: 'USD', - }).then(requireNotCancelled), - outro: () => Promise.resolve(outro('Done...')).then(() => undefined), - }).then(clearIntroOutro); + intro('Generic Config'); + + const maxAnswerDeviation = await text({ + message: 'Aggregator max answer deviation', + validate: (value) => validateFloat(value, 8), + }) + .then(requireNotCancelled) + .then((value) => requireFloatToBigNumberish(value, 8)); + + const tokenDenomination = await text({ + message: 'Token Denomination', + defaultValue: 'USD', + initialValue: 'USD', + placeholder: 'USD', + }).then(requireNotCancelled); + + const aggregatorType = await select<'REGULAR' | 'GROWTH'>({ + message: 'Aggregator type', + options: [ + { value: 'REGULAR', label: 'Regular' }, + { value: 'GROWTH', label: 'Growth (applies APR to answer)' }, + ], + initialValue: 'REGULAR', + }).then(requireNotCancelled); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const customAggregator: Record = { + maxAnswerDeviation, + description: `${mToken}/${tokenDenomination}`, + }; - return { - customAggregator: { - maxAnswerDeviation: config.maxAswerDeviation, - description: `${mToken}/${config.tokenDenomination}`, - }, + if (aggregatorType === 'GROWTH') { + customAggregator.type = expr("'GROWTH'"); + + const onlyUp = await confirm({ + message: 'Only up? (price can only increase)', + initialValue: true, + }).then(requireNotCancelled); + + const minGrowthApr = await text({ + message: 'Min growth APR (in %)', + defaultValue: '0', + initialValue: '0', + validate: (value) => validateFloat(value, 8), + }) + .then(requireNotCancelled) + .then((value) => requireFloatToBigNumberish(value, 8)); + + const maxGrowthApr = await text({ + message: 'Max growth APR (in %)', + validate: (value) => validateFloat(value, 8), + }) + .then(requireNotCancelled) + .then((value) => requireFloatToBigNumberish(value, 8)); + + customAggregator.onlyUp = onlyUp; + customAggregator.minGrowthApr = minGrowthApr; + customAggregator.maxGrowthApr = maxGrowthApr; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const result: Record = { + customAggregator, dataFeed: {}, }; + + const useAdjustedDvRv = await confirm({ + message: + 'Use adjusted DV/RV feeds? (separate +/- % for deposit/redemption)', + initialValue: false, + }).then(requireNotCancelled); + + if (useAdjustedDvRv) { + const adjustmentPercentageDv = await text({ + message: 'Adjustment percentage for DV (e.g. 7 for +7%)', + validate: (value) => validateFloat(value, 8), + }) + .then(requireNotCancelled) + .then((value) => requireFloatToBigNumberish(value, 8)); + + const adjustmentPercentageRv = await text({ + message: 'Adjustment percentage for RV (e.g. -7 for -7%)', + validate: (value) => validateFloat(value, 8), + }) + .then(requireNotCancelled) + .then((value) => requireFloatToBigNumberish(value, 8)); + + const feedRef = + aggregatorType === 'GROWTH' ? "'customFeedGrowth'" : "'customFeed'"; + + result.customAggregatorAdjustedDv = { + adjustmentPercentage: adjustmentPercentageDv, + underlyingFeed: expr(feedRef), + }; + result.customAggregatorAdjustedRv = { + adjustmentPercentage: adjustmentPercentageRv, + underlyingFeed: expr(feedRef), + }; + } + + outro('Done...'); + + return { ...result, isGrowth: aggregatorType === 'GROWTH' }; } async function getDvConfigFromUser(hre: HardhatRuntimeEnvironment) { diff --git a/scripts/deploy/common/data-feed.ts b/scripts/deploy/common/data-feed.ts index 563da3c7..636e97e9 100644 --- a/scripts/deploy/common/data-feed.ts +++ b/scripts/deploy/common/data-feed.ts @@ -6,6 +6,7 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { deployAndVerify, deployAndVerifyProxy, + getDeployer, getDeploymentGenericConfig, getNetworkConfig, sendAndWaitForCustomTxSign, @@ -74,7 +75,7 @@ export type DeployCustomAggregatorRegularConfig = export type DeployCustomAggregatorAdjustedConfig = { adjustmentPercentage: BigNumberish; - underlyingFeed: `0x${string}` | 'customFeed'; + underlyingFeed: `0x${string}` | 'customFeed' | 'customFeedGrowth'; }; export type DeployCustomAggregatorGrowthConfig = @@ -158,7 +159,9 @@ export const setRoundDataMToken = async ( } const addresses = getCurrentAddresses(hre); - const customFeed = addresses?.[token]?.customFeed; + const tokenAddresses = addresses?.[token]; + const customFeed = + tokenAddresses?.customFeedGrowth ?? tokenAddresses?.customFeed; if (!customFeed) { throw new Error('Token config is not found or aggregator is not set'); @@ -392,7 +395,12 @@ export const deployMTokenDataFeed = async ( const addresses = getCurrentAddresses(hre); const tokenAddresses = addresses?.[token]; - if (!tokenAddresses?.customFeed) { + const aggregator = + tokenAddresses?.customFeedAdjusted ?? + tokenAddresses?.customFeedGrowth ?? + tokenAddresses?.customFeed; + + if (!aggregator) { throw new Error('Token config is not found or customFeed is not set'); } @@ -402,9 +410,13 @@ export const deployMTokenDataFeed = async ( throw new Error('Data feed contract name is not set'); } + if (tokenAddresses?.customFeedAdjusted) { + console.log('Using single adjusted feed as aggregator for DataFeed'); + } + await deployTokenDataFeed( hre, - tokenAddresses.customFeed, + aggregator, dataFeedContractName, getDeploymentGenericConfig(hre, token, 'dataFeed'), ); @@ -421,6 +433,78 @@ export const deployMTokenCustomAggregatorAdjusted = async ( ); }; +export const deployMTokenCustomAggregatorAdjustedDv = async ( + hre: HardhatRuntimeEnvironment, + token: MTokenName, +) => { + await deployCustomAggregatorAdjusted( + hre, + token, + getDeploymentGenericConfig(hre, token, 'customAggregatorAdjustedDv'), + ); +}; + +export const deployMTokenCustomAggregatorAdjustedRv = async ( + hre: HardhatRuntimeEnvironment, + token: MTokenName, +) => { + await deployCustomAggregatorAdjusted( + hre, + token, + getDeploymentGenericConfig(hre, token, 'customAggregatorAdjustedRv'), + ); +}; + +export const deployMTokenDataFeedDv = async ( + hre: HardhatRuntimeEnvironment, + token: MTokenName, +) => { + const addresses = getCurrentAddresses(hre); + const tokenAddresses = addresses?.[token]; + + if (!tokenAddresses?.customFeedDv) { + throw new Error('Token config is not found or customFeedDv is not set'); + } + + const dataFeedContractName = getTokenContractNames(token).dataFeed; + + if (!dataFeedContractName) { + throw new Error('Data feed contract name is not set'); + } + + await deployTokenDataFeed( + hre, + tokenAddresses.customFeedDv, + dataFeedContractName, + getDeploymentGenericConfig(hre, token, 'dataFeed'), + ); +}; + +export const deployMTokenDataFeedRv = async ( + hre: HardhatRuntimeEnvironment, + token: MTokenName, +) => { + const addresses = getCurrentAddresses(hre); + const tokenAddresses = addresses?.[token]; + + if (!tokenAddresses?.customFeedRv) { + throw new Error('Token config is not found or customFeedRv is not set'); + } + + const dataFeedContractName = getTokenContractNames(token).dataFeed; + + if (!dataFeedContractName) { + throw new Error('Data feed contract name is not set'); + } + + await deployTokenDataFeed( + hre, + tokenAddresses.customFeedRv, + dataFeedContractName, + getDeploymentGenericConfig(hre, token, 'dataFeed'), + ); +}; + export const deployMTokenCustomAggregator = async ( hre: HardhatRuntimeEnvironment, token: MTokenName, @@ -547,18 +631,22 @@ const deployCustomAggregatorAdjusted = async ( throw new Error('Network config is not found'); } + const feedKey = networkConfig.underlyingFeed; const underlyingFeed = - networkConfig.underlyingFeed === 'customFeed' - ? addresses?.[token]?.customFeed + feedKey === 'customFeed' || feedKey === 'customFeedGrowth' + ? addresses?.[token]?.[feedKey] : networkConfig.underlyingFeed; if (!underlyingFeed) { throw new Error('Underlying feed is not found'); } + const deployer = await getDeployer(hre); + await deployAndVerify( hre, getCommonContractNames().customAggregatorAdjusted, [underlyingFeed, networkConfig.adjustmentPercentage], + deployer, ); }; diff --git a/scripts/deploy/common/dv.ts b/scripts/deploy/common/dv.ts index 32bd76a3..f7093775 100644 --- a/scripts/deploy/common/dv.ts +++ b/scripts/deploy/common/dv.ts @@ -94,7 +94,7 @@ export const deployDepositVault = async ( `Detected TAC wrapper, will be used data feed from ${originalTokenName}: ${dataFeed}`, ); } else { - dataFeed = tokenAddresses?.dataFeed; + dataFeed = tokenAddresses?.dataFeedDv ?? tokenAddresses?.dataFeed; } const dvContractName = getTokenContractNames(token)[type]; diff --git a/scripts/deploy/common/roles.ts b/scripts/deploy/common/roles.ts index bf9c7a2b..f56a0fea 100644 --- a/scripts/deploy/common/roles.ts +++ b/scripts/deploy/common/roles.ts @@ -9,7 +9,7 @@ import { } from './utils'; import { defaultDepositVaultPriority, - resolveVaultAddress, + resolveAllVaultAddresses, roleGrantRedemptionVaultPriority, } from './vault-resolver'; @@ -75,29 +75,38 @@ export const grantAllProductRoles = async ( const defaultManager = provider.address; - // Build vault contract roles and addresses conditionally const contractsRoles: string[] = []; const contractsAddresses: string[] = []; - const depositVault = resolveVaultAddress( + const depositVaults = resolveAllVaultAddresses( tokenAddresses, defaultDepositVaultPriority, ); - const redemptionVault = resolveVaultAddress( + const redemptionVaults = resolveAllVaultAddresses( tokenAddresses, roleGrantRedemptionVaultPriority, ); - if (depositVault) { - contractsRoles.push(tokenRoles.minter); - contractsAddresses.push(depositVault); + if (depositVaults.length > 0) { + for (const dv of depositVaults) { + contractsRoles.push(tokenRoles.minter); + contractsAddresses.push(dv); + } + console.log( + `✅ Granting minter role to ${depositVaults.length} deposit vault(s)`, + ); } else { console.log(`⚠️ Skipping minter role for depositVault (not deployed)`); } - if (redemptionVault) { - contractsRoles.push(tokenRoles.burner); - contractsAddresses.push(redemptionVault); + if (redemptionVaults.length > 0) { + for (const rv of redemptionVaults) { + contractsRoles.push(tokenRoles.burner); + contractsAddresses.push(rv); + } + console.log( + `✅ Granting burner role to ${redemptionVaults.length} redemption vault(s)`, + ); } else { console.log(`⚠️ Skipping burner role for redemptionVault (not deployed)`); } diff --git a/scripts/deploy/common/rv.ts b/scripts/deploy/common/rv.ts index dfaee5c2..2f8de38a 100644 --- a/scripts/deploy/common/rv.ts +++ b/scripts/deploy/common/rv.ts @@ -158,7 +158,7 @@ export const deployRedemptionVault = async ( `Detected TAC wrapper, will be used data feed from ${originalTokenName}: ${dataFeed}`, ); } else { - dataFeed = tokenAddresses?.dataFeed; + dataFeed = tokenAddresses?.dataFeedRv ?? tokenAddresses?.dataFeed; } const sanctionsList = networkConfig.enableSanctionsList diff --git a/scripts/deploy/common/types.ts b/scripts/deploy/common/types.ts index f5f6b500..d5968f5e 100644 --- a/scripts/deploy/common/types.ts +++ b/scripts/deploy/common/types.ts @@ -95,6 +95,8 @@ export type DeploymentConfig = { genericConfigs: { customAggregator?: DeployCustomAggregatorConfig; customAggregatorAdjusted?: DeployCustomAggregatorAdjustedConfig; + customAggregatorAdjustedDv?: DeployCustomAggregatorAdjustedConfig; + customAggregatorAdjustedRv?: DeployCustomAggregatorAdjustedConfig; dataFeed?: DeployDataFeedConfig; }; networkConfigs: Record< diff --git a/scripts/deploy/common/vault-resolver.ts b/scripts/deploy/common/vault-resolver.ts index 305e7bc9..d8debb03 100644 --- a/scripts/deploy/common/vault-resolver.ts +++ b/scripts/deploy/common/vault-resolver.ts @@ -43,3 +43,15 @@ export const resolveVaultAddress = ( return undefined; }; + +export const resolveAllVaultAddresses = ( + tokenAddresses: TokenAddresses, + vaultTypes: readonly (DepositVaultType | RedemptionVaultType)[], +): string[] => { + const addresses: string[] = []; + for (const key of vaultTypes) { + const value = tokenAddresses[key]; + if (value) addresses.push(value); + } + return addresses; +}; diff --git a/scripts/deploy/configs/index.ts b/scripts/deploy/configs/index.ts index 508dec82..737869ca 100644 --- a/scripts/deploy/configs/index.ts +++ b/scripts/deploy/configs/index.ts @@ -27,6 +27,7 @@ import { mevBTCDeploymentConfig } from './mevBTC'; import { mEVUSDDeploymentConfig } from './mEVUSD'; import { mFARMDeploymentConfig } from './mFARM'; import { mFONEDeploymentConfig } from './mFONE'; +import { mGLOBALDeploymentConfig } from './mGLOBAL'; import { mHYPERDeploymentConfig } from './mHYPER'; import { mHyperBTCDeploymentConfig } from './mHyperBTC'; import { mHyperETHDeploymentConfig } from './mHyperETH'; @@ -135,4 +136,5 @@ export const configsPerToken: Record = { mTU: mTUDeploymentConfig, mM1USD: mM1USDDeploymentConfig, mRe7ETH: mRe7ETHDeploymentConfig, + mGLOBAL: mGLOBALDeploymentConfig, }; diff --git a/scripts/deploy/configs/mGLOBAL.ts b/scripts/deploy/configs/mGLOBAL.ts new file mode 100644 index 00000000..8603a1df --- /dev/null +++ b/scripts/deploy/configs/mGLOBAL.ts @@ -0,0 +1,127 @@ +import { constants } from 'ethers'; +import { parseUnits } from 'ethers/lib/utils'; + +import { chainIds } from '../../../config'; +import { DeploymentConfig } from '../common/types'; + +export const mGLOBALDeploymentConfig: DeploymentConfig = { + genericConfigs: { + customAggregator: { + type: 'GROWTH', + maxAnswerDeviation: parseUnits('1', 8), + description: 'mGLOBAL/USD', + onlyUp: true, + minGrowthApr: parseUnits('0', 8), + maxGrowthApr: parseUnits('0', 8), + }, + customAggregatorAdjustedDv: { + adjustmentPercentage: parseUnits('7', 8), + underlyingFeed: 'customFeedGrowth', + }, + customAggregatorAdjustedRv: { + adjustmentPercentage: parseUnits('-7', 8), + underlyingFeed: 'customFeedGrowth', + }, + dataFeed: {}, + }, + networkConfigs: { + [chainIds.main]: { + dvAave: { + type: 'AAVE', + enableSanctionsList: true, + feeReceiver: '0xE64F2b295F49dfa826278824993600a6b3e40174', + tokensReceiver: '0xb38c71199d7B480A8FEBaDEEff59e5516338bcf6', + instantDailyLimit: constants.MaxUint256, + instantFee: parseUnits('0', 2), + variationTolerance: parseUnits('2', 2), + minAmount: parseUnits('0', 18), + minMTokenAmountForFirstDeposit: parseUnits('0', 18), + maxSupplyCap: constants.MaxUint256, + }, + rvAave: { + type: 'AAVE', + feeReceiver: '0xE64F2b295F49dfa826278824993600a6b3e40174', + tokensReceiver: '0xb38c71199d7B480A8FEBaDEEff59e5516338bcf6', + requestRedeemer: '0xaB9dA7953D82d81006639A6f87883d59594918b9', + instantDailyLimit: parseUnits('200000', 18), + instantFee: parseUnits('0.5', 2), + variationTolerance: parseUnits('2', 2), + enableSanctionsList: true, + minAmount: parseUnits('1', 18), + }, + rvSwapper: { + type: 'SWAPPER', + feeReceiver: '0xE64F2b295F49dfa826278824993600a6b3e40174', + tokensReceiver: '0xb38c71199d7B480A8FEBaDEEff59e5516338bcf6', + requestRedeemer: '0xaB9dA7953D82d81006639A6f87883d59594918b9', + instantDailyLimit: parseUnits('200000', 18), + instantFee: parseUnits('0.5', 2), + variationTolerance: parseUnits('2', 2), + minAmount: parseUnits('1', 18), + liquidityProvider: 'dummy', + enableSanctionsList: true, + swapperVault: { + mToken: 'mLIQUIDITY', + redemptionVaultType: 'redemptionVault', + }, + }, + postDeploy: { + addPaymentTokens: { + vaults: [ + { + paymentTokens: [ + { + token: 'usdc', + allowance: parseUnits('1000000000', 18), + }, + ], + type: 'depositVaultAave', + }, + { + paymentTokens: [ + { + token: 'usdc', + allowance: parseUnits('1000000000', 18), + }, + ], + type: 'redemptionVaultAave', + }, + { + paymentTokens: [ + { + token: 'usdc', + allowance: parseUnits('1000000000', 18), + }, + ], + type: 'redemptionVaultSwapper', + }, + ], + }, + grantRoles: { + tokenManagerAddress: '0x76E350c5a674Db787918E5F728466C7356d4d361', + vaultsManagerAddress: '0x2ACB4BdCbEf02f81BF713b696Ac26390d7f79A12', + oracleManagerAddress: '0x088a74De7dF74E6a6EB832D28878a9f134eE4F05', + }, + setRoundData: { + type: 'GROWTH', + data: parseUnits('1', 8), + apr: parseUnits('0', 8), + }, + addFeeWaived: [ + { + fromVault: { mToken: 'mLIQUIDITY', type: 'redemptionVault' }, + toWaive: [{ mToken: 'mGLOBAL', type: 'redemptionVaultSwapper' }], + }, + ], + pauseFunctions: { + depositVaultAave: [ + 'depositRequest', + 'depositRequestWithCustomRecipient', + ], + redemptionVaultAave: ['redeemFiatRequest'], + redemptionVaultSwapper: ['redeemFiatRequest'], + }, + }, + }, + }, +}; diff --git a/scripts/deploy/deploy_DataFeedDv.ts b/scripts/deploy/deploy_DataFeedDv.ts new file mode 100644 index 00000000..00dc9b30 --- /dev/null +++ b/scripts/deploy/deploy_DataFeedDv.ts @@ -0,0 +1,13 @@ +import { HardhatRuntimeEnvironment } from 'hardhat/types'; + +import { deployMTokenDataFeedDv } from './common/data-feed'; +import { DeployFunction } from './common/types'; + +import { getMTokenOrThrow } from '../../helpers/utils'; + +const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { + const mToken = getMTokenOrThrow(hre); + await deployMTokenDataFeedDv(hre, mToken); +}; + +export default func; diff --git a/scripts/deploy/deploy_DataFeedRv.ts b/scripts/deploy/deploy_DataFeedRv.ts new file mode 100644 index 00000000..dfc5efc6 --- /dev/null +++ b/scripts/deploy/deploy_DataFeedRv.ts @@ -0,0 +1,13 @@ +import { HardhatRuntimeEnvironment } from 'hardhat/types'; + +import { deployMTokenDataFeedRv } from './common/data-feed'; +import { DeployFunction } from './common/types'; + +import { getMTokenOrThrow } from '../../helpers/utils'; + +const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { + const mToken = getMTokenOrThrow(hre); + await deployMTokenDataFeedRv(hre, mToken); +}; + +export default func; diff --git a/scripts/deploy/misc/deploy_CustomAggregatorAdjustedDv.ts b/scripts/deploy/misc/deploy_CustomAggregatorAdjustedDv.ts new file mode 100644 index 00000000..75ce1c03 --- /dev/null +++ b/scripts/deploy/misc/deploy_CustomAggregatorAdjustedDv.ts @@ -0,0 +1,12 @@ +import { HardhatRuntimeEnvironment } from 'hardhat/types'; + +import { getMTokenOrThrow } from '../../../helpers/utils'; +import { deployMTokenCustomAggregatorAdjustedDv } from '../common/data-feed'; +import { DeployFunction } from '../common/types'; + +const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { + const mToken = getMTokenOrThrow(hre); + await deployMTokenCustomAggregatorAdjustedDv(hre, mToken); +}; + +export default func; diff --git a/scripts/deploy/misc/deploy_CustomAggregatorAdjustedRv.ts b/scripts/deploy/misc/deploy_CustomAggregatorAdjustedRv.ts new file mode 100644 index 00000000..89c7d62a --- /dev/null +++ b/scripts/deploy/misc/deploy_CustomAggregatorAdjustedRv.ts @@ -0,0 +1,12 @@ +import { HardhatRuntimeEnvironment } from 'hardhat/types'; + +import { getMTokenOrThrow } from '../../../helpers/utils'; +import { deployMTokenCustomAggregatorAdjustedRv } from '../common/data-feed'; +import { DeployFunction } from '../common/types'; + +const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { + const mToken = getMTokenOrThrow(hre); + await deployMTokenCustomAggregatorAdjustedRv(hre, mToken); +}; + +export default func; diff --git a/scripts/deploy/post-deploy/add_ToAddressBook.ts b/scripts/deploy/post-deploy/add_ToAddressBook.ts index 466f8abe..7d3b6f3a 100644 --- a/scripts/deploy/post-deploy/add_ToAddressBook.ts +++ b/scripts/deploy/post-deploy/add_ToAddressBook.ts @@ -3,10 +3,52 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { getCurrentAddresses, LayerZeroTokenAddresses, + TokenAddresses, } from '../../../config/constants/addresses'; import { getMTokenOrThrow } from '../../../helpers/utils'; import { DeployFunction } from '../common/types'; +type AddressBookEntryConfig = { + contractName: string | ((mToken: string) => string); + contractTag?: string; + extractAddress?: (value: unknown) => string | undefined; +}; + +const ADDRESS_BOOK_MAPPING: Partial< + Record +> = { + token: { contractName: (mToken) => mToken }, + + customFeed: { contractName: 'Oracle' }, + customFeedGrowth: { contractName: 'Oracle (Growth)' }, + customFeedAdjusted: { contractName: 'Oracle (Adjusted)' }, + customFeedDv: { contractName: 'Oracle (DV)' }, + customFeedRv: { contractName: 'Oracle (RV)' }, + + dataFeed: { contractName: 'Oracle', contractTag: 'datafeed' }, + dataFeedDv: { contractName: 'Oracle (DV)', contractTag: 'datafeed' }, + dataFeedRv: { contractName: 'Oracle (RV)', contractTag: 'datafeed' }, + + depositVault: { contractName: 'Minter Vault' }, + depositVaultUstb: { contractName: 'Minter Vault (USTB)' }, + depositVaultAave: { contractName: 'Minter Vault (Aave)' }, + depositVaultMorpho: { contractName: 'Minter Vault (Morpho)' }, + depositVaultMToken: { contractName: 'Minter Vault (MToken)' }, + + redemptionVault: { contractName: 'Redemption Vault' }, + redemptionVaultBuidl: { contractName: 'Redemption Vault (BUIDL)' }, + redemptionVaultSwapper: { contractName: 'Redemption Vault (Swapper)' }, + redemptionVaultMToken: { contractName: 'Redemption Vault (MToken)' }, + redemptionVaultUstb: { contractName: 'Redemption Vault (USTB)' }, + redemptionVaultAave: { contractName: 'Redemption Vault (Aave)' }, + redemptionVaultMorpho: { contractName: 'Redemption Vault (Morpho)' }, + + layerZero: { + contractName: 'OFT Adapter', + extractAddress: (v) => (v as LayerZeroTokenAddresses)?.oft, + }, +}; + const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { const mToken = getMTokenOrThrow(hre); @@ -27,35 +69,32 @@ const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { continue; } - let address = typeof value === 'string' ? value : undefined; - let contractName = ''; - let contractTag: string | undefined; - - if (key.startsWith('redemptionVault')) { - contractName = 'Redemption Vault'; - } else if (key.startsWith('depositVault')) { - contractName = 'Minter Vault'; - } else if (key.startsWith('customFeed')) { - contractName = 'Oracle'; - } else if (key.startsWith('token')) { - contractName = mToken; - } else if (key.startsWith('dataFeed')) { - contractName = 'Oracle'; - contractTag = 'datafeed'; - } else if (key.startsWith('layerZero')) { - contractName = 'OFT Adapter'; - address = (value as LayerZeroTokenAddresses).oft; + const config = ADDRESS_BOOK_MAPPING[key as keyof TokenAddresses]; + + if (!config) { + continue; } - if (!contractName || !address) { + const address = config.extractAddress + ? config.extractAddress(value) + : typeof value === 'string' + ? value + : undefined; + + if (!address) { continue; } + const contractName = + typeof config.contractName === 'function' + ? config.contractName(mToken) + : config.contractName; + const customSigner = await hre.getCustomSigner(); const result = await customSigner.createAddressBookContract({ address, contractName, - contractTag, + contractTag: config.contractTag, }); console.log('Successfully added to address book', result); diff --git a/test/common/token.tests.ts b/test/common/token.tests.ts index 1fe3f2d7..acd1b0a5 100644 --- a/test/common/token.tests.ts +++ b/test/common/token.tests.ts @@ -117,6 +117,15 @@ export const tokenContractsTests = (token: MTokenName) => { fixture.accessControl.address, )) as MTBILL; + if (mTokensMetadata[token]?.isPermissioned) { + const greenlistedRole = tokenRoles.greenlisted; + for (const account of fixture.regularAccounts) { + await fixture.accessControl + .connect(fixture.owner) + .grantRole(greenlistedRole, account.address); + } + } + return { tokenContract, ...fixture }; }; @@ -164,7 +173,7 @@ export const tokenContractsTests = (token: MTokenName) => { parseUnits('10000', 8), ); - const depositVault = await deployProxyContract( + const depositVault = await deployProxyContractIfExists( 'dv', undefined, fixture.accessControl.address, diff --git a/test/integration/fixtures/mtoken.fixture.ts b/test/integration/fixtures/mtoken.fixture.ts index 151ca528..329aa6f9 100644 --- a/test/integration/fixtures/mtoken.fixture.ts +++ b/test/integration/fixtures/mtoken.fixture.ts @@ -250,6 +250,11 @@ export async function mTokenDepositFixture() { depositVaultWithMToken.address, ); + // Waive fees on target DV for the product DV (required for _autoInvest) + await targetDepositVault + .connect(owner) + .addWaivedFeeAccount(depositVaultWithMToken.address); + // Add USDC as payment token on product DV await depositVaultWithMToken .connect(owner)