diff --git a/.openzeppelin/mainnet.json b/.openzeppelin/mainnet.json index 6f340106..31b56381 100644 --- a/.openzeppelin/mainnet.json +++ b/.openzeppelin/mainnet.json @@ -1379,6 +1379,21 @@ "address": "0xFc05B888B19f1cCf8aa87ad8fc28A9d5643E65f8", "txHash": "0x655d652e44f56d3b7c2258884b35649d6b2dc1cd6b24e2eb08403223306d4e1d", "kind": "transparent" + }, + { + "address": "0x6dfD4f744273142AcdAaFd96E3A194D604a14Db3", + "txHash": "0x714b82e609d94df295b52c3974762e0481aa8d0ae0ee7ccf0b506f90e0eecc20", + "kind": "transparent" + }, + { + "address": "0x24dF63499E8116724E8189aFa7e9a1F812e62Cca", + "txHash": "0x429638ad4e8b86f17b63966749d5eb9776c601a0f44a30bf973bb36aa313f390", + "kind": "transparent" + }, + { + "address": "0x375ea756418fe30Eea21E1189104974c185aBB48", + "txHash": "0x8fbb55ff3822ffefe50831ca70bbceed4c547f4dbcb4795763d48faa7cdd9be8", + "kind": "transparent" } ], "impls": { @@ -74054,6 +74069,829 @@ } } } + }, + "6a55f60b2b529cfbec8170f8f173f026b25d6b1d1e5f88b12a7c05be58eda607": { + "address": "0xF832b399531A30Cc8a0c04011a2F351Be5d3964D", + "txHash": "0x0373a8667eb3bf3d48476c34d223c2570e3d63b6b3b7cdf695c4c5815e399063", + "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)10707", + "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": "CustomAggregatorV3CompatibleFeed", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeed.sol:31" + }, + { + "label": "latestRound", + "offset": 0, + "slot": "52", + "type": "t_uint80", + "contract": "CustomAggregatorV3CompatibleFeed", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeed.sol:36" + }, + { + "label": "maxAnswerDeviation", + "offset": 0, + "slot": "53", + "type": "t_uint256", + "contract": "CustomAggregatorV3CompatibleFeed", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeed.sol:42" + }, + { + "label": "minAnswer", + "offset": 0, + "slot": "54", + "type": "t_int192", + "contract": "CustomAggregatorV3CompatibleFeed", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeed.sol:47" + }, + { + "label": "maxAnswer", + "offset": 0, + "slot": "55", + "type": "t_int192", + "contract": "CustomAggregatorV3CompatibleFeed", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeed.sol:52" + }, + { + "label": "_roundData", + "offset": 0, + "slot": "56", + "type": "t_mapping(t_uint80,t_struct(RoundData)11032_storage)", + "contract": "CustomAggregatorV3CompatibleFeed", + "src": "contracts/feeds/CustomAggregatorV3CompatibleFeed.sol:57" + }, + { + "label": "__gap", + "offset": 0, + "slot": "57", + "type": "t_array(t_uint256)50_storage", + "contract": "MFOneCustomAggregatorFeed", + "src": "contracts/products/mFONE/MFOneCustomAggregatorFeed.sol:20" + } + ], + "types": { + "t_array(t_uint256)50_storage": { + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(MidasAccessControl)10707": { + "label": "contract MidasAccessControl", + "numberOfBytes": "20" + }, + "t_int192": { + "label": "int192", + "numberOfBytes": "24" + }, + "t_int256": { + "label": "int256", + "numberOfBytes": "32" + }, + "t_mapping(t_uint80,t_struct(RoundData)11032_storage)": { + "label": "mapping(uint80 => struct CustomAggregatorV3CompatibleFeed.RoundData)", + "numberOfBytes": "32" + }, + "t_string_storage": { + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(RoundData)11032_storage": { + "label": "struct CustomAggregatorV3CompatibleFeed.RoundData", + "members": [ + { + "label": "roundId", + "type": "t_uint80", + "offset": 0, + "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" + }, + { + "label": "answeredInRound", + "type": "t_uint80", + "offset": 0, + "slot": "4" + } + ], + "numberOfBytes": "160" + }, + "t_uint256": { + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "label": "uint8", + "numberOfBytes": "1" + }, + "t_uint80": { + "label": "uint80", + "numberOfBytes": "10" + } + } + } + }, + "da77e0f8e7345d7286624913b5af7ecdd041e31fdaa4c333a61f80171407f441": { + "address": "0x4fdf5A9b1984c3954A410e2b43B318Af79BdD5C8", + "txHash": "0x91ef55faf705d972aafc938f40fd269949b13c6545c8b3713b86824f2d51f645", + "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": "MFOneDataFeed", + "src": "contracts/products/mFONE/MFOneDataFeed.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" + } + } + } + }, + "32d2bfbec0f244f9923d9e56192802e03bc377df02c1c4867d8d438b7af698a8": { + "address": "0xf5a51bc23dB02b18988a1fC694e520ac973C8856", + "txHash": "0xebbd55a193cb553699acdd305db6042c3dd2d81be58af6f262f58090dcc33363", + "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": "MFOneRedemptionVaultWithSwapper", + "src": "contracts/products/mFONE/MFOneRedemptionVaultWithSwapper.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/config/constants/addresses.ts b/config/constants/addresses.ts index ffd0230c..2d6f9af2 100644 --- a/config/constants/addresses.ts +++ b/config/constants/addresses.ts @@ -30,7 +30,7 @@ type AxelarTokenAddresses = { executables?: Partial>; }; -type TokenFeedAddresses = { +export type TokenFeedAddresses = { customFeed?: string; customFeedGrowth?: string; @@ -43,10 +43,14 @@ type TokenFeedAddresses = { dataFeedRv?: string; }; +export type AddressProfileTokenAddresses = TokenFeedAddresses & + Partial>; + export type TokenAddresses = TokenFeedAddresses & { token?: string; layerZero?: LayerZeroTokenAddresses; axelar?: AxelarTokenAddresses; + addressProfiles?: Partial>; } & Partial>; export type VaultType = RedemptionVaultType | DepositVaultType; @@ -295,6 +299,13 @@ export const midasAddressesPerNetwork: ConfigPerNetwork< dataFeed: '0xCF4e49f5e750Af8F2f9Aa1642B68E5839D9c1C00', depositVault: '0x41438435c20B1C2f1fcA702d387889F346A0C3DE', redemptionVaultSwapper: '0x44b0440e35c596e858cEA433D0d82F5a985fD19C', + addressProfiles: { + mFONEUnloop: { + customFeed: '0x6dfD4f744273142AcdAaFd96E3A194D604a14Db3', + dataFeed: '0x24dF63499E8116724E8189aFa7e9a1F812e62Cca', + redemptionVaultSwapper: '0x375ea756418fe30Eea21E1189104974c185aBB48', + }, + }, }, mHYPER: { token: '0x9b5528528656DBC094765E2abB79F293c21191B9', diff --git a/scripts/deploy/common/common-vault.ts b/scripts/deploy/common/common-vault.ts index 464a5118..9c0e1c19 100644 --- a/scripts/deploy/common/common-vault.ts +++ b/scripts/deploy/common/common-vault.ts @@ -19,6 +19,7 @@ import { ManageableVault, RedemptionVaultWithAave, } from '../../../typechain-types'; +import { getDeploymentTokenAddresses } from '../configs/deployment-profiles'; export type AddPaymentTokensConfig = { vaults: { @@ -266,8 +267,15 @@ const getVaultContract = async ( vaultType: VaultType, ) => { const addresses = getCurrentAddresses(hre); - - const vaultAddress = addresses?.[mToken]?.[vaultType]; + const tokenAddresses = addresses?.[mToken] + ? getDeploymentTokenAddresses( + addresses[mToken]!, + mToken, + hre.deploymentConfig, + ) + : undefined; + + const vaultAddress = tokenAddresses?.[vaultType]; if (!vaultAddress) { throw new Error('Vault address is not found'); diff --git a/scripts/deploy/common/data-feed.ts b/scripts/deploy/common/data-feed.ts index 636e97e9..f312b130 100644 --- a/scripts/deploy/common/data-feed.ts +++ b/scripts/deploy/common/data-feed.ts @@ -26,6 +26,7 @@ import { CustomAggregatorV3CompatibleFeed, CustomAggregatorV3CompatibleFeedGrowth, } from '../../../typechain-types'; +import { getDeploymentTokenAddresses } from '../configs/deployment-profiles'; import { paymentTokenDeploymentConfigs } from '../configs/payment-tokens'; export type DeployDataFeedConfigCommon = { @@ -159,7 +160,13 @@ export const setRoundDataMToken = async ( } const addresses = getCurrentAddresses(hre); - const tokenAddresses = addresses?.[token]; + const tokenAddresses = addresses?.[token] + ? getDeploymentTokenAddresses( + addresses[token]!, + token, + hre.deploymentConfig, + ) + : undefined; const customFeed = tokenAddresses?.customFeedGrowth ?? tokenAddresses?.customFeed; @@ -224,6 +231,7 @@ const setRoundData = async ( const txRes = await sendAndWaitForCustomTxSign(hre, tx, { action: isMToken ? 'update-feed-mtoken' : 'update-feed-ptoken', comment: log, + ...(isMToken ? { mToken: token as MTokenName } : {}), }); console.log(log, txRes); @@ -393,7 +401,13 @@ export const deployMTokenDataFeed = async ( token: MTokenName, ) => { const addresses = getCurrentAddresses(hre); - const tokenAddresses = addresses?.[token]; + const tokenAddresses = addresses?.[token] + ? getDeploymentTokenAddresses( + addresses[token]!, + token, + hre.deploymentConfig, + ) + : undefined; const aggregator = tokenAddresses?.customFeedAdjusted ?? diff --git a/scripts/deploy/common/roles.ts b/scripts/deploy/common/roles.ts index 388c88d6..907e4b7c 100644 --- a/scripts/deploy/common/roles.ts +++ b/scripts/deploy/common/roles.ts @@ -2,11 +2,7 @@ import { Provider } from '@ethersproject/providers'; import { Signer } from 'ethers'; import { HardhatRuntimeEnvironment } from 'hardhat/types'; -import { - getDeployer, - getNetworkConfig, - sendAndWaitForCustomTxSign, -} from './utils'; +import { getDeployer, sendAndWaitForCustomTxSign } from './utils'; import { defaultDepositVaultPriority, resolveAllVaultAddresses, @@ -16,8 +12,10 @@ import { import { MTokenName } from '../../../config'; import { getCurrentAddresses } from '../../../config/constants/addresses'; import { getCommonContractNames } from '../../../helpers/contracts'; -import { getAllRoles } from '../../../helpers/roles'; +import { getAllRoles, getRolesForToken } from '../../../helpers/roles'; import { MidasAccessControl } from '../../../typechain-types'; +import { getDeploymentTokenAddresses } from '../configs/deployment-profiles'; +import { getDeploymentConfigForToken } from '../configs/index'; import { networkDeploymentConfigs } from '../configs/network-configs'; type Address = `0x${string}`; @@ -34,25 +32,27 @@ export const grantAllProductRoles = async ( hre: HardhatRuntimeEnvironment, token: MTokenName, ) => { - const { grantRoles: networkConfig } = getNetworkConfig( - hre, + const chainId = hre.network.config.chainId!; + const managerGrantConfig = getDeploymentConfigForToken( token, - 'postDeploy', - ); - - if (!networkConfig) { - throw new Error('Network config is not found'); - } + hre.deploymentConfig, + )?.networkConfigs?.[chainId]?.postDeploy?.grantRoles; const addresses = getCurrentAddresses(hre); - const tokenAddresses = addresses?.[token]; + const tokenAddresses = addresses?.[token] + ? getDeploymentTokenAddresses( + addresses[token]!, + token, + hre.deploymentConfig, + ) + : undefined; if (!tokenAddresses) { throw new Error(`Token addresses are not found for ${token}`); } const allRoles = getAllRoles(); - const tokenRoles = allRoles.tokenRoles[token]; + const tokenRoles = getRolesForToken(token); const provider = await getDeployer(hre); @@ -75,9 +75,6 @@ export const grantAllProductRoles = async ( const defaultManager = provider.address; - const contractsRoles: string[] = []; - const contractsAddresses: string[] = []; - const depositVaults = resolveAllVaultAddresses( tokenAddresses, defaultDepositVaultPriority, @@ -87,45 +84,50 @@ export const grantAllProductRoles = async ( roleGrantRedemptionVaultPriority, ); + const roleBatch: string[] = []; + const addressBatch: string[] = []; + + // Token / vault / oracle managers + if (managerGrantConfig) { + roleBatch.push( + ...tokenManagerRoles, + ...vaultManagerRoles, + ...oracleManagerRoles, + ); + addressBatch.push( + ...tokenManagerRoles.map(() => managerGrantConfig.tokenManagerAddress), + ...vaultManagerRoles.map( + () => managerGrantConfig.vaultsManagerAddress ?? defaultManager, + ), + ...oracleManagerRoles.map(() => managerGrantConfig.oracleManagerAddress), + ); + } + for (const dv of depositVaults) { - contractsRoles.push(tokenRoles.minter); - contractsAddresses.push(dv); + roleBatch.push(tokenRoles.minter); + addressBatch.push(dv); } + for (const rv of redemptionVaults) { - contractsRoles.push(tokenRoles.burner); - contractsAddresses.push(rv); + roleBatch.push(tokenRoles.burner); + addressBatch.push(rv); } - const grantRoles = [ - ...tokenManagerRoles, - ...vaultManagerRoles, - ...oracleManagerRoles, - ...contractsRoles, - ]; - const grantAddresses = [ - ...tokenManagerRoles.map(() => networkConfig.tokenManagerAddress), - ...vaultManagerRoles.map( - () => networkConfig.vaultsManagerAddress ?? defaultManager, - ), - ...oracleManagerRoles.map(() => networkConfig.oracleManagerAddress), - ...contractsAddresses, - ]; - const present = await Promise.all( - grantRoles.map((role, i) => accessControl.hasRole(role, grantAddresses[i])), + roleBatch.map((role, i) => accessControl.hasRole(role, addressBatch[i])), ); - const rolesToGrant = grantRoles.filter((_, i) => !present[i]); - const addressesToGrant = grantAddresses.filter((_, i) => !present[i]); + const rolesToGrant = roleBatch.filter((_, i) => !present[i]); + const addressesToGrant = addressBatch.filter((_, i) => !present[i]); if (rolesToGrant.length === 0) { console.log(`${token}: all product roles already granted — skip`); return; } - const alreadyHeld = grantRoles.length - rolesToGrant.length; + const alreadyHeld = roleBatch.length - rolesToGrant.length; console.log( alreadyHeld > 0 - ? `${token}: grant ${rolesToGrant.length} missing (${alreadyHeld}/${grantRoles.length} already held)` + ? `${token}: grant ${rolesToGrant.length} missing (${alreadyHeld}/${roleBatch.length} already held)` : `${token}: grant ${rolesToGrant.length} missing`, ); diff --git a/scripts/deploy/common/rv.ts b/scripts/deploy/common/rv.ts index 2f8de38a..0cf4ac43 100644 --- a/scripts/deploy/common/rv.ts +++ b/scripts/deploy/common/rv.ts @@ -17,6 +17,7 @@ import { RedemptionVaultWithMToken, RedemptionVaultWIthBUIDL, } from '../../../typechain-types'; +import { getDeploymentTokenAddresses } from '../configs/deployment-profiles'; export type DeployRvConfigCommon = { feeReceiver?: string; @@ -98,7 +99,13 @@ export const deployRedemptionVault = async ( ) => { const addresses = getCurrentAddresses(hre); const deployer = await getDeployer(hre); - const tokenAddresses = addresses?.[token]; + const tokenAddresses = addresses?.[token] + ? getDeploymentTokenAddresses( + addresses[token]!, + token, + hre.deploymentConfig, + ) + : undefined; const networkConfig = getNetworkConfig(hre, token, type); @@ -129,7 +136,7 @@ export const deployRedemptionVault = async ( swapperVaultAddress = DUMMY_ADDRESS; } else { swapperVaultAddress = - addresses[swapperVault.mToken]?.[swapperVault.redemptionVaultType]; + addresses?.[swapperVault.mToken]?.[swapperVault.redemptionVaultType]; } if (!swapperVaultAddress) { diff --git a/scripts/deploy/common/utils.ts b/scripts/deploy/common/utils.ts index 020c073c..25229a1e 100644 --- a/scripts/deploy/common/utils.ts +++ b/scripts/deploy/common/utils.ts @@ -12,7 +12,7 @@ import { logDeployProxy, tryEtherscanVerifyImplementation, } from '../../../helpers/utils'; -import { configsPerToken } from '../configs'; +import { getDeploymentConfigForToken } from '../configs'; const safeAbi = [ { @@ -211,7 +211,8 @@ export const getDeploymentGenericConfig = < token: MTokenName, configKey: TConfigKey, ) => { - const config = configsPerToken[token]?.genericConfigs?.[configKey] as TConfig; + const config = getDeploymentConfigForToken(token, hre.deploymentConfig) + ?.genericConfigs?.[configKey] as TConfig; if (!config) { throw new Error('Deployment config is not found'); @@ -228,9 +229,8 @@ export const getNetworkConfig = < token: MTokenName, configKey: TConfigKey, ) => { - const config = configsPerToken[token]?.networkConfigs?.[ - hre.network.config.chainId! - ]?.[configKey] as TConfig; + const config = getDeploymentConfigForToken(token, hre.deploymentConfig) + ?.networkConfigs?.[hre.network.config.chainId!]?.[configKey] as TConfig; if (!config) { throw new Error('Deployment config is not found'); diff --git a/scripts/deploy/configs/deployment-profiles.ts b/scripts/deploy/configs/deployment-profiles.ts new file mode 100644 index 00000000..a998245a --- /dev/null +++ b/scripts/deploy/configs/deployment-profiles.ts @@ -0,0 +1,126 @@ +import { + AddressProfileTokenAddresses, + TokenAddresses, +} from '../../../config/constants/addresses'; +import { MTokenName } from '../../../config/types'; + +export const deploymentConfigNames = ['mfone-unloop'] as const; + +export type DeploymentConfigName = + | 'default' + | (typeof deploymentConfigNames)[number]; + +type AddressBookEntryConfig = { + contractName: string | ((mToken: string) => string); + contractTag?: string; + extractAddress?: (value: unknown) => string | undefined; +}; + +type DeploymentAddressProfileConfig = { + addressProfileKey: string; + addressBook?: Partial< + Record + >; +}; + +const deploymentConfigAddressProfiles: Record< + (typeof deploymentConfigNames)[number], + Partial> +> = { + 'mfone-unloop': { + mFONE: { + addressProfileKey: 'mFONEUnloop', + addressBook: { + customFeed: { contractName: 'Oracle (Unloop)' }, + dataFeed: { + contractName: 'Oracle (Unloop)', + contractTag: 'datafeed', + }, + redemptionVaultSwapper: { + contractName: 'Redemption Vault (Unloop)', + }, + }, + }, + }, +}; + +const getDeploymentAddressProfileConfig = ( + token: MTokenName, + deploymentConfigName?: string, +): DeploymentAddressProfileConfig | undefined => { + if (!deploymentConfigName || deploymentConfigName === 'default') { + return undefined; + } + + return deploymentConfigAddressProfiles[ + deploymentConfigName as (typeof deploymentConfigNames)[number] + ]?.[token]; +}; + +const getAddressProfileTokenAddresses = ( + tokenAddresses: TokenAddresses, + token: MTokenName, + deploymentConfigName?: string, +): AddressProfileTokenAddresses | undefined => { + const addressProfileConfig = getDeploymentAddressProfileConfig( + token, + deploymentConfigName, + ); + + if (!addressProfileConfig) { + return undefined; + } + + const profileAddresses = + tokenAddresses.addressProfiles?.[addressProfileConfig.addressProfileKey]; + + if (!profileAddresses) { + throw new Error( + `Address profile "${addressProfileConfig.addressProfileKey}" is not configured for ${token}`, + ); + } + + return profileAddresses; +}; + +export const getDeploymentTokenAddresses = ( + tokenAddresses: TokenAddresses, + token: MTokenName, + deploymentConfigName?: string, +): TokenAddresses => { + const profileAddresses = getAddressProfileTokenAddresses( + tokenAddresses, + token, + deploymentConfigName, + ); + + return profileAddresses + ? { + ...tokenAddresses, + ...profileAddresses, + } + : tokenAddresses; +}; + +export const getDeploymentAddressBookTokenAddresses = ( + tokenAddresses: TokenAddresses, + token: MTokenName, + deploymentConfigName?: string, +): AddressProfileTokenAddresses | TokenAddresses => { + return ( + getAddressProfileTokenAddresses( + tokenAddresses, + token, + deploymentConfigName, + ) ?? tokenAddresses + ); +}; + +export const getDeploymentAddressBookEntryConfig = ( + token: MTokenName, + addressKey: string, + deploymentConfigName?: string, +): AddressBookEntryConfig | undefined => { + return getDeploymentAddressProfileConfig(token, deploymentConfigName) + ?.addressBook?.[addressKey as keyof AddressProfileTokenAddresses]; +}; diff --git a/scripts/deploy/configs/index.ts b/scripts/deploy/configs/index.ts index 04a06170..b273e2a8 100644 --- a/scripts/deploy/configs/index.ts +++ b/scripts/deploy/configs/index.ts @@ -3,6 +3,7 @@ import { bondBTCDeploymentConfig } from './bondBTC'; import { bondETHDeploymentConfig } from './bondETH'; import { bondUSDDeploymentConfig } from './bondUSD'; import { cUSDODeploymentConfig } from './cUSDO'; +import { deploymentConfigNames } from './deployment-profiles'; import { dnETHDeploymentConfig } from './dnETH'; import { dnFARTDeploymentConfig } from './dnFART'; import { dnHYPEDeploymentConfig } from './dnHYPE'; @@ -29,7 +30,7 @@ import { mEDGEDeploymentConfig } from './mEDGE'; import { mevBTCDeploymentConfig } from './mevBTC'; import { mEVUSDDeploymentConfig } from './mEVUSD'; import { mFARMDeploymentConfig } from './mFARM'; -import { mFONEDeploymentConfig } from './mFONE'; +import { mFONEDeploymentConfig, mFONEUnloopDeploymentConfig } from './mFONE'; import { mGLOBALDeploymentConfig } from './mGLOBAL'; import { mHYPERDeploymentConfig } from './mHYPER'; import { mHyperBTCDeploymentConfig } from './mHyperBTC'; @@ -146,3 +147,60 @@ export const configsPerToken: Record = { bondBTC: bondBTCDeploymentConfig, mTEST: mTESTDeploymentConfig, }; + +type NamedDeploymentConfig = { + configsPerToken: Partial>; +}; + +const namedDeploymentConfigs: Record< + (typeof deploymentConfigNames)[number], + NamedDeploymentConfig +> = { + 'mfone-unloop': { + configsPerToken: { + mFONE: mFONEUnloopDeploymentConfig, + }, + }, +}; + +const getNamedDeploymentConfig = (deploymentConfigName?: string) => { + if (!deploymentConfigName || deploymentConfigName === 'default') { + return undefined; + } + + const namedDeploymentConfig = + namedDeploymentConfigs[ + deploymentConfigName as (typeof deploymentConfigNames)[number] + ]; + + if (!namedDeploymentConfig) { + throw new Error( + `Unknown deployment config "${deploymentConfigName}". Available configs: default, ${deploymentConfigNames.join( + ', ', + )}`, + ); + } + + return namedDeploymentConfig; +}; + +export const getDeploymentConfigForToken = ( + token: MTokenName, + deploymentConfigName?: string, +): DeploymentConfig => { + const namedDeploymentConfig = getNamedDeploymentConfig(deploymentConfigName); + + if (!namedDeploymentConfig) { + return configsPerToken[token]; + } + + const config = namedDeploymentConfig.configsPerToken[token]; + + if (!config) { + throw new Error( + `Deployment config "${deploymentConfigName}" is not available for ${token}`, + ); + } + + return config; +}; diff --git a/scripts/deploy/configs/mFONE.ts b/scripts/deploy/configs/mFONE.ts index 23695d4a..8c6230b7 100644 --- a/scripts/deploy/configs/mFONE.ts +++ b/scripts/deploy/configs/mFONE.ts @@ -12,8 +12,8 @@ export const mFONEDeploymentConfig: DeploymentConfig = { maxAnswerDeviation: parseUnits('0.4', 8), description: 'mF-ONE/USD', }, - customAggregatorDiscounted: { - discountPercentage: parseUnits('7.7', 8), + customAggregatorAdjusted: { + adjustmentPercentage: parseUnits('7.7', 8), underlyingFeed: 'customFeed', }, dataFeed: { @@ -51,9 +51,6 @@ export const mFONEDeploymentConfig: DeploymentConfig = { redemptionVaultType: 'redemptionVaultBuidl', }, }, - postDeploy: { - grantRoles: {}, - }, }, [chainIds.main]: { dv: { @@ -88,3 +85,68 @@ export const mFONEDeploymentConfig: DeploymentConfig = { }, }, }; + +// Select with `--deployment-config mfone-unloop`; store deployed addresses under +// `addressProfiles.mFONEUnloop` using the standard feed/vault keys. +export const mFONEUnloopDeploymentConfig: DeploymentConfig = { + genericConfigs: { + customAggregator: { + minAnswer: parseUnits('0.1', 8), + maxAnswer: parseUnits('1000', 8), + maxAnswerDeviation: parseUnits('0.4', 8), + description: 'mF-ONE/USD', + }, + dataFeed: { + minAnswer: parseUnits('0.1', 8), + maxAnswer: parseUnits('1000', 8), + healthyDiff: 2592000, + }, + }, + networkConfigs: { + [chainIds.main]: { + rvSwapper: { + type: 'SWAPPER', + feeReceiver: '0x0ff15C0555Add64e53E8c738176D896D489F1F6D', + tokensReceiver: '0x86B16681E21E857A9a71a8FDfC33AB1eB8213b74', + instantDailyLimit: constants.MaxUint256, + instantFee: parseUnits('1', 2), + minAmount: parseUnits('1'), + variationTolerance: parseUnits('0.6', 2), + fiatAdditionalFee: parseUnits('0.1', 2), + fiatFlatFee: parseUnits('30'), + minFiatRedeemAmount: parseUnits('1000'), + requestRedeemer: '0x82FB69DD7f31eD9FF8A44579D674e5032A4adc9C', + liquidityProvider: 'dummy', + swapperVault: 'dummy', + enableSanctionsList: true, + }, + postDeploy: { + addPaymentTokens: { + vaults: [ + { + type: 'redemptionVaultSwapper', + paymentTokens: [ + { + token: 'usdc', + fee: 10000, + allowance: parseUnits('1000000000', 18), + isStable: true, + }, + ], + }, + ], + }, + setRoundData: { + data: parseUnits('1.06913749', 8), + }, + pauseFunctions: { + redemptionVaultSwapper: [ + 'redeemFiatRequest', + 'redeemRequest', + 'redeemRequestWithCustomRecipient', + ], + }, + }, + }, + }, +}; diff --git a/scripts/deploy/post-deploy/add_ToAddressBook.ts b/scripts/deploy/post-deploy/add_ToAddressBook.ts index 4c69c4e0..eac88c09 100644 --- a/scripts/deploy/post-deploy/add_ToAddressBook.ts +++ b/scripts/deploy/post-deploy/add_ToAddressBook.ts @@ -7,6 +7,10 @@ import { } from '../../../config/constants/addresses'; import { getMTokenOrThrow } from '../../../helpers/utils'; import { DeployFunction } from '../common/types'; +import { + getDeploymentAddressBookEntryConfig, + getDeploymentAddressBookTokenAddresses, +} from '../configs/deployment-profiles'; type AddressBookEntryConfig = { contractName: string | ((mToken: string) => string); @@ -64,9 +68,15 @@ const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { throw new Error('Token addresses not found'); } + const addressBookTokenAddresses = getDeploymentAddressBookTokenAddresses( + tokenAddresses, + mToken, + hre.deploymentConfig, + ); + const allowedKeys = hre.addressBookKeys; - for (const [key, value] of Object.entries(tokenAddresses)) { + for (const [key, value] of Object.entries(addressBookTokenAddresses)) { if (!value) { continue; } @@ -75,7 +85,13 @@ const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { continue; } - const config = ADDRESS_BOOK_MAPPING[key as keyof TokenAddresses]; + const addressKey = key as keyof TokenAddresses; + const config = + getDeploymentAddressBookEntryConfig( + mToken, + addressKey, + hre.deploymentConfig, + ) ?? ADDRESS_BOOK_MAPPING[addressKey]; if (!config) { continue; diff --git a/scripts/deploy/post-deploy/pause_Functions.ts b/scripts/deploy/post-deploy/pause_Functions.ts index 5bb0ef96..4c0a23aa 100644 --- a/scripts/deploy/post-deploy/pause_Functions.ts +++ b/scripts/deploy/post-deploy/pause_Functions.ts @@ -1,12 +1,10 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; -import { - getCurrentAddresses, - VaultType, -} from '../../../config/constants/addresses'; +import { getCurrentAddresses } from '../../../config/constants/addresses'; import { getChainOrThrow, getMTokenOrThrow } from '../../../helpers/utils'; import { DeployFunction, VAULT_FUNCTION_SELECTORS } from '../common/types'; import { sendAndWaitForCustomTxSign, getNetworkConfig } from '../common/utils'; +import { getDeploymentTokenAddresses } from '../configs/deployment-profiles'; const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { const { networkName } = getChainOrThrow(hre); @@ -24,10 +22,22 @@ const func: DeployFunction = async (hre: HardhatRuntimeEnvironment) => { } const addresses = getCurrentAddresses(hre); + const tokenAddresses = addresses?.[mToken]; + + if (!tokenAddresses) { + throw new Error(`Token addresses not found for ${mToken}`); + } + + const mergedTokenAddresses = getDeploymentTokenAddresses( + tokenAddresses, + mToken, + hre.deploymentConfig, + ); for (const [vaultType, functions] of Object.entries(pauseFunctions)) { - const vaultAddress = addresses?.[mToken]?.[vaultType as VaultType]; - if (!vaultAddress) continue; + const vaultAddress = + mergedTokenAddresses[vaultType as keyof typeof mergedTokenAddresses]; + if (!vaultAddress || typeof vaultAddress !== 'string') continue; const vault = await hre.ethers.getContractAt( 'ManageableVault', diff --git a/tasks/index.ts b/tasks/index.ts index 8b42a3ed..da03fe9b 100644 --- a/tasks/index.ts +++ b/tasks/index.ts @@ -19,6 +19,10 @@ task('runscript', 'Runs a user-defined script') .addOptionalParam('logToFile', 'Log to file') .addOptionalParam('logsFolderPath', 'Logs folder path') .addOptionalParam('originalNetwork', 'Original Network') + .addOptionalParam( + 'deploymentConfig', + 'Named deployment config profile (for example: mfone-unloop)', + ) .addOptionalParam( 'keys', 'Comma-separated list of address book keys to include (e.g. layerZero)', @@ -28,6 +32,7 @@ task('runscript', 'Runs a user-defined script') const ptoken = taskArgs.ptoken; const action = taskArgs.action; const originalNetwork = taskArgs.originalNetwork; + const deploymentConfig = taskArgs.deploymentConfig; const keys = taskArgs.keys; const scriptPath = taskArgs.path; @@ -44,6 +49,7 @@ task('runscript', 'Runs a user-defined script') } hre.action = action; + hre.deploymentConfig = deploymentConfig; if (action) { extendWithContext(hre, `${action}-${new Date().toISOString()}`); diff --git a/types/hardhat.d.ts b/types/hardhat.d.ts index d5207c57..98ca7a8a 100644 --- a/types/hardhat.d.ts +++ b/types/hardhat.d.ts @@ -19,6 +19,7 @@ declare module 'hardhat/types/runtime' { }; paymentToken?: PaymentTokenName; action?: string; + deploymentConfig?: string; skipValidation?: boolean; aggregatorType?: 'numerator' | 'denominator'; addressBookKeys?: string[];