Skip to content

Commit

Permalink
Merge pull request #691 from NexusMutual/fix/migration-v2-stakingpool…
Browse files Browse the repository at this point in the history
…-pricing-asserts

Migration: LegacyPooledStaking changes & asserts in migration.js & scripts
  • Loading branch information
shark0der committed Mar 3, 2023
2 parents 5dbbbc8 + 1797f20 commit 6b0fbb4
Show file tree
Hide file tree
Showing 55 changed files with 1,941 additions and 9,054 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ node_modules/
coverage/
coverage.json
tenderly.yaml
scripts/v2-migration/output/
14 changes: 9 additions & 5 deletions contracts/interfaces/IMasterAwareV2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,18 @@ interface IMasterAwareV2 {
MC, // MCR.sol
CO, // Cover.sol
SP, // StakingProducts.sol
AS, // Assessment.sol
TK, // NXMToken.sol
PS, // LegacyPooledStaking.sol
GV, // Governance.sol
IC, // IndividualClaims.sol
GW, // LegacyGateway.sol
QD, // LegacyQuotationData.sol
CL // CoverMigrator.sol
CL, // CoverMigrator.sol
AS, // Assessment.sol
CI, // IndividualClaims.sol - Claims for Individuals
CG, // YieldTokenIncidents.sol - Claims for Groups
// TODO: 1) if you update this enum, update lib/constants.js as well
// TODO: 2) TK is not an internal contract!
// If you want to add a new contract below TK, remove TK and make it immutable in all
// contracts that are using it (currently LegacyGateway and LegacyPooledStaking).
TK // NXMToken.sol
}

function changeMasterAddress(address masterAddress) external;
Expand Down
2 changes: 1 addition & 1 deletion contracts/interfaces/IProductsV1.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
pragma solidity >=0.5.0;

interface IProductsV1 {
function getNewProductId(address legacyProductId) external returns (uint);
function getNewProductId(address legacyProductId) external pure returns (uint);
}
2 changes: 2 additions & 0 deletions contracts/mocks/Disposables/DisposableGateway.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import "../../modules/legacy/LegacyGateway.sol";

contract DisposableGateway is LegacyGateway {

constructor(address _quotationData) LegacyGateway(_quotationData) {}

function initialize(address masterAddress, address daiAddress) external {
master = INXMMaster(masterAddress);
DAI = daiAddress;
Expand Down
1 change: 1 addition & 0 deletions contracts/mocks/Disposables/DisposablePooledStaking.sol
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ contract DisposablePooledStaking is LegacyPooledStaking {
}

constructor() LegacyPooledStaking(
0x0000000000000000000000000000000000000000,
0x0000000000000000000000000000000000000000,
0x0000000000000000000000000000000000000000
) {
Expand Down
11 changes: 10 additions & 1 deletion contracts/modules/cover/Cover.sol
Original file line number Diff line number Diff line change
Expand Up @@ -495,10 +495,19 @@ contract Cover is ICover, MasterAwareV2, IStakingPoolBeacon, ReentrancyGuard {
uint maxPoolFee,
ProductInitializationParams[] memory productInitParams,
string calldata ipfsDescriptionHash
) external whenNotPaused onlyMember returns (uint /*poolId*/, address /*stakingPoolAddress*/) {
) external whenNotPaused returns (uint /*poolId*/, address /*stakingPoolAddress*/) {

if (msg.sender != master.getLatestAddress("PS")) {

// TODO: replace this with onlyMember modifier after the v2 release
require(
IMemberRoles(internalContracts[uint(ID.MR)]).checkRole(
msg.sender,
uint(IMemberRoles.Role.Member)
),
"Caller is not a member"
);

// override with initial price
for (uint i = 0; i < productInitParams.length; i++) {

Expand Down
4 changes: 2 additions & 2 deletions contracts/modules/cover/CoverMigrator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -148,14 +148,14 @@ contract CoverMigrator is MasterAwareV2 {
}

function individualClaims() internal view returns (IIndividualClaims) {
return IIndividualClaims(getInternalContractAddress(ID.IC));
return IIndividualClaims(getInternalContractAddress(ID.CI));
}

/// @dev Updates internal contract addresses to the ones stored in master. This function is
/// automatically called by the master contract when a contract is added or upgraded.
function changeDependentContractAddress() external override {
internalContracts[uint(ID.CO)] = master.getLatestAddress("CO");
internalContracts[uint(ID.TC)] = master.getLatestAddress("TC");
internalContracts[uint(ID.IC)] = master.getLatestAddress("IC");
internalContracts[uint(ID.CI)] = master.getLatestAddress("CI");
}
}
9 changes: 6 additions & 3 deletions contracts/modules/governance/NXMaster.sol
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ contract NXMaster is INXMMaster {
for (uint i = 0; i < newContractCodes.length; i++) {
addNewInternalContract(newContractCodes[i], newAddresses[i], _types[i]);
}

updateAllDependencies();
}

/// @dev Adds new internal contract
Expand Down Expand Up @@ -123,7 +125,6 @@ contract NXMaster is INXMMaster {

IMasterAwareV2 up = IMasterAwareV2(newInternalContract);
up.changeMasterAddress(address(this));
up.changeDependentContractAddress();

emit InternalContractAdded(contractCode, contractAddress, ContractType(contractType));
}
Expand Down Expand Up @@ -202,14 +203,16 @@ contract NXMaster is INXMMaster {
}

// delete elements from contractCodes
for (uint i = 0; i < contractCodes.length; i++) {
for (uint i = 0; i < contractCodes.length;) {
for (uint j = 0; j < contractCodesToRemove.length; j++) {
if (contractCodes[i] == contractCodesToRemove[j]) {
contractCodes[i] = contractCodes[contractCodes.length - 1];
contractCodes.pop();
i = i == 0 ? 0 : i - 1;
unchecked { i--; }
break;
}
}
unchecked { i++; }
}

updateAllDependencies();
Expand Down
20 changes: 10 additions & 10 deletions contracts/modules/legacy/LegacyClaimsReward.sol
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ contract LegacyClaimsReward is ILegacyClaimsReward, LegacyMasterAware {

function transferRewards() override external {
// REWARD_TRANSFERS_HELPER_BEGIN
tk.transfer(0x8D38C81B7bE9Dbe7440D66B92d4EF529806baAE7, 44711571167651250552);
tk.transfer(0x87B2a7559d85f4653f13E6546A14189cd5455d45, 129028627954719654319);
tk.transfer(0x8D38C81B7bE9Dbe7440D66B92d4EF529806baAE7, 48923438859450649911);
tk.transfer(0x87B2a7559d85f4653f13E6546A14189cd5455d45, 296963732400452825081);
tk.transfer(0xb7FeE4f0e877A348481355FFf757D8A079A2A48b, 833640762734095);
tk.transfer(0xe5DD78C224F26E306c84A9B1aa2DEF30bdf15835, 4244323033916347);
tk.transfer(0xF9fA438fE4723C9B2096868F892c1C5F14bb2cAa, 255737891525236889);
Expand All @@ -59,6 +59,7 @@ contract LegacyClaimsReward is ILegacyClaimsReward, LegacyMasterAware {
tk.transfer(0x927165752a4dDF685F9D6eF21Fd180b0f9Bc7E03, 269639440705719);
tk.transfer(0x21Cf5649ee1a9362202EBfF266Ef7BBC8c26A917, 116286322435811720);
tk.transfer(0x76FE8E056230344B65104ca3c96FF062bFAf9cf7, 292661475471199774);
tk.transfer(0x138Dd537D56F2F2761a6fC0A2A0AcE67D55480FE, 17731572052578005);
tk.transfer(0x57F589DcBd0fd14b4528018f8Ba6777696D38ECD, 195857733291784);
tk.transfer(0xCb95cAB0D557808491A0d498aCaE4fb37277da00, 797989782506267);
tk.transfer(0xB791CE850C29732D7F8116d813457c840040102b, 151075450744570);
Expand All @@ -76,26 +77,25 @@ contract LegacyClaimsReward is ILegacyClaimsReward, LegacyMasterAware {
tk.transfer(0x7f8069Dfdd61f3AaAbDFf9F6D7257496733D340d, 2474823651144190);
tk.transfer(0xbee0889F9f74090889C3AD5fDf174b6Af6480607, 31441756391679);
tk.transfer(0x4c262bA680b20640a51d00a7D2D3115a54A04108, 5242073859524);
tk.transfer(0xF99b3a13d46A04735BF3828eB3030cfED5Ea0087, 4752837513833318820);
tk.transfer(0x07cD0dffB4ca317c56c232A8130a7c3f07BF207A, 2303627828572588927);
tk.transfer(0xe497145776d5A8d8fD101aBc070371a4eaDcdD1a, 52704844647291947);
tk.transfer(0xa7009b120eb1016A91a9aCEC52D243BEf01de74e, 10651502465310038504);
tk.transfer(0xf76e252e3c40EEF8A90a4fcD1a34ee8209115074, 210504943489815226);
tk.transfer(0x2255B4523939045C6F4C42fD0b6d945C52bE98A8, 102063437327263615);
tk.transfer(0xF7e5Ac6564105980d1c1ECd7a3b4C5a8bAe9982E, 446637592594148042);
tk.transfer(0x585013080dc32E4a3790aaA95702619eC5eB6C07, 27225854970139123);
tk.transfer(0xD816a5Fb7c78282f7880173d1bb8A18EF00E5D0D, 945086714857539398);
tk.transfer(0x53e60bb4603950377Ea15b268b5741143369952F, 88259315016974844);
tk.transfer(0x10cCD4136471c7c266a9Fc4569622989Fb4caB99, 30734263435297258);
tk.transfer(0xa50Ec178Bd0B184A890AB6d2e7a757a01Db3a702, 3807970421905454832);
tk.transfer(0x3fb751Cbc56275AE92288D758750493c9159a070, 257096803157521);
tk.transfer(0xF1f756AafaB77Ef2fec51b567Df1e23332F4ac78, 5919598866587998699);
tk.transfer(0x4334703B0B74E2045926f82F4158A103fCE1Df4f, 2236979868823378247);
tk.transfer(0x5fA07227d05774C2ff11c2425919d14225a38DBB, 63405006681877230);
tk.transfer(0x6852C2Ac09CcB4B7Cd39BAB7e5427f48d8265da0, 5547886985344996295);
tk.transfer(0x5929cC4D10b6a1acc5bF5D221889f10251C628A1, 24072809369912029);
tk.transfer(0x6852C2Ac09CcB4B7Cd39BAB7e5427f48d8265da0, 9419826361537362003);
tk.transfer(0x5929cC4D10b6a1acc5bF5D221889f10251C628A1, 145138914461297244);
tk.transfer(0xaA0D63A8303873Bc4569F810aFc1C3475279739A, 2036528796472687);
tk.transfer(0x546a0cB802377153B4fEAe052a5ed14C98B3CC9C, 100206484380862328);
tk.transfer(0x546a0cB802377153B4fEAe052a5ed14C98B3CC9C, 154602667581333126);
tk.transfer(0xC3774aF3452628636D031544D1e8893c3D8701AB, 2043870268022841232);
tk.transfer(0xe201fC1Da79E71b953C07a1A24F5Ad3c974F2813, 865876463648643);
tk.transfer(0xa759997AC89A1ab156f2b17093d4FDdC9f0db1AF, 438241573161450741);
tk.transfer(0xA6bbD8dcAE61129f7DadD8a77834681453D8A69A, 55442967910420174);
// REWARD_TRANSFERS_HELPER_END

uint remainderNMX = tk.balanceOf(address(this));
Expand Down
20 changes: 7 additions & 13 deletions contracts/modules/legacy/LegacyGateway.sol
Original file line number Diff line number Diff line change
Expand Up @@ -38,19 +38,14 @@ contract LegacyGateway is IGateway, MasterAwareV2 {
address public _unused_incidents;
address public _unused_coverMigrator;

event ClaimSubmitted(
uint indexed claimId,
uint indexed coverId,
address indexed submitter,
bytes data
);
IQuotationData public immutable quotationData;

function nxmToken() internal view returns (INXMToken) {
return INXMToken(internalContracts[uint(ID.TK)]);
constructor(address _quotationData) {
quotationData = IQuotationData(_quotationData);
}

function quotationData() internal view returns (IQuotationData) {
return IQuotationData(internalContracts[uint(ID.QD)]);
function nxmToken() internal view returns (INXMToken) {
return INXMToken(internalContracts[uint(ID.TK)]);
}

function memberRoles() internal view returns (IMemberRoles) {
Expand All @@ -63,7 +58,6 @@ contract LegacyGateway is IGateway, MasterAwareV2 {

function changeDependentContractAddress() external {
internalContracts[uint(ID.TK)] = payable(master.tokenAddress());
internalContracts[uint(ID.QD)] = master.getLatestAddress("QD");
internalContracts[uint(ID.MR)] = master.getLatestAddress("MR");
internalContracts[uint(ID.CL)] = master.getLatestAddress("CL");
}
Expand All @@ -79,8 +73,8 @@ contract LegacyGateway is IGateway, MasterAwareV2 {
address memberAddress
) {
bytes4 currency;
(/*cid*/, memberAddress, contractAddress, currency, /*sumAssured*/, premiumInNXM) = quotationData().getCoverDetailsByCoverID1(coverId);
(/*cid*/, status, sumAssured, coverPeriod, validUntil) = quotationData().getCoverDetailsByCoverID2(coverId);
(/*cid*/, memberAddress, contractAddress, currency, /*sumAssured*/, premiumInNXM) = quotationData.getCoverDetailsByCoverID1(coverId);
(/*cid*/, status, sumAssured, coverPeriod, validUntil) = quotationData.getCoverDetailsByCoverID2(coverId);

coverAsset = getCurrencyAssetAddress(currency);
sumAssured = sumAssured * 10 ** assetDecimals(coverAsset);
Expand Down
Loading

0 comments on commit 6b0fbb4

Please sign in to comment.