From fbe6633a3cff502356409b093771de9e5f4f0b2a Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Mon, 23 Jan 2023 18:24:28 +0100 Subject: [PATCH 1/4] add checks --- .../core/contracts/test/RenamedRetyped.sol | 43 ++++++++++++++++++- .../src/storage/report-rename-retype.test.ts | 12 ++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/packages/core/contracts/test/RenamedRetyped.sol b/packages/core/contracts/test/RenamedRetyped.sol index 402454a0a..7f4c9bcfb 100644 --- a/packages/core/contracts/test/RenamedRetyped.sol +++ b/packages/core/contracts/test/RenamedRetyped.sol @@ -61,4 +61,45 @@ contract LayoutChangeV2 { /// @custom:oz-retyped-from bool uint8 b; -} \ No newline at end of file +} + + +contract RenameStructV1 { + struct History { + Checkpoint[] _checkpoints; + } + + struct Checkpoint { + uint32 _blockNumber; + uint224 _value; + } + + History history; +} + +contract RenameStructV2a { + struct Trace224 { + Checkpoint224[] _checkpoints; + } + + struct Checkpoint224 { + uint32 _blockNumber; + uint224 _value; + } + + Trace224 history; +} + +contract RenameStructV2b { + struct Trace224 { + Checkpoint224[] _checkpoints; + } + + struct Checkpoint224 { + /// @custom:oz-renamed-from _blockNumber + uint32 _key; + uint224 _value; + } + + Trace224 history; +} diff --git a/packages/core/src/storage/report-rename-retype.test.ts b/packages/core/src/storage/report-rename-retype.test.ts index 143cd3e09..3d0e09427 100644 --- a/packages/core/src/storage/report-rename-retype.test.ts +++ b/packages/core/src/storage/report-rename-retype.test.ts @@ -28,6 +28,9 @@ const testContracts = [ 'contracts/test/RenamedRetyped.sol:NonHardcodedRetypeV2', 'contracts/test/RenamedRetyped.sol:LayoutChangeV1', 'contracts/test/RenamedRetyped.sol:LayoutChangeV2', + 'contracts/test/RenamedRetyped.sol:RenameStructV1', + 'contracts/test/RenamedRetyped.sol:RenameStructV2a', + 'contracts/test/RenamedRetyped.sol:RenameStructV2b', ]; test.before(async t => { @@ -131,3 +134,12 @@ test('retype with layout change', t => { t.false(report.ok); t.snapshot(report.explain()); }); + +test('storage upgrade with struct renaming/replacing', t => { + const v1 = t.context.extractStorageLayout('RenameStructV1'); + const v2a = t.context.extractStorageLayout('RenameStructV2a'); + const v2b = t.context.extractStorageLayout('RenameStructV2b'); + + t.deepEqual(getStorageUpgradeErrors(v1, v2a), []); + t.deepEqual(getStorageUpgradeErrors(v1, v2b), []); +}); From 0b026a9e47a70d6ca3da0a3476df7d8aa3e142e7 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Mon, 23 Jan 2023 18:31:29 +0100 Subject: [PATCH 2/4] lint --- packages/core/contracts/test/RenamedRetyped.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/contracts/test/RenamedRetyped.sol b/packages/core/contracts/test/RenamedRetyped.sol index 7f4c9bcfb..daddb595f 100644 --- a/packages/core/contracts/test/RenamedRetyped.sol +++ b/packages/core/contracts/test/RenamedRetyped.sol @@ -63,7 +63,6 @@ contract LayoutChangeV2 { uint8 b; } - contract RenameStructV1 { struct History { Checkpoint[] _checkpoints; From 6404e5fbc97af64a2ca368c30a4a84b80fb29e1d Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Tue, 24 Jan 2023 20:55:24 -0300 Subject: [PATCH 3/4] add tests for other case --- .../core/contracts/test/RenamedRetyped.sol | 35 +++++++++++++++++++ .../src/storage/report-rename-retype.test.ts | 15 ++++++++ 2 files changed, 50 insertions(+) diff --git a/packages/core/contracts/test/RenamedRetyped.sol b/packages/core/contracts/test/RenamedRetyped.sol index daddb595f..77102748f 100644 --- a/packages/core/contracts/test/RenamedRetyped.sol +++ b/packages/core/contracts/test/RenamedRetyped.sol @@ -102,3 +102,38 @@ contract RenameStructV2b { Trace224 history; } + +contract InnerRetypeV1 { + struct ProposalCore { + BlockNumber key; + bool flag; + } + + struct BlockNumber { + uint32 blockNumber; + } + + ProposalCore core; +} + +contract InnerRetypeV2Good { + struct ProposalCore { + uint256 blockNumber; + bool flag; + } + + /// @custom:oz-retyped-from InnerRetypeV1.ProposalCore + ProposalCore core; +} + +contract InnerRetypeV2Bad { + struct ProposalCore { + uint16 a; + uint224 b; + uint16 c; + bool flag; + } + + /// @custom:oz-retyped-from InnerRetypeV1.ProposalCore + ProposalCore core; +} diff --git a/packages/core/src/storage/report-rename-retype.test.ts b/packages/core/src/storage/report-rename-retype.test.ts index 3d0e09427..844befc6c 100644 --- a/packages/core/src/storage/report-rename-retype.test.ts +++ b/packages/core/src/storage/report-rename-retype.test.ts @@ -31,6 +31,9 @@ const testContracts = [ 'contracts/test/RenamedRetyped.sol:RenameStructV1', 'contracts/test/RenamedRetyped.sol:RenameStructV2a', 'contracts/test/RenamedRetyped.sol:RenameStructV2b', + 'contracts/test/RenamedRetyped.sol:InnerRetypeV1', + 'contracts/test/RenamedRetyped.sol:InnerRetypeV2Good', + 'contracts/test/RenamedRetyped.sol:InnerRetypeV2Bad', ]; test.before(async t => { @@ -143,3 +146,15 @@ test('storage upgrade with struct renaming/replacing', t => { t.deepEqual(getStorageUpgradeErrors(v1, v2a), []); t.deepEqual(getStorageUpgradeErrors(v1, v2b), []); }); + +test('storage upgrade with internal struct changes', t => { + const v1 = t.context.extractStorageLayout('InnerRetypeV1'); + const v2Good = t.context.extractStorageLayout('InnerRetypeV2Good'); + const v2Bad = t.context.extractStorageLayout('InnerRetypeV2Bad'); + + t.deepEqual(getStorageUpgradeErrors(v1, v2Good), []); + + t.like(getStorageUpgradeErrors(v1, v2Bad), { + length: 1, + }); +}); From 384b064d6117afff5df49ce9d2cb20acccd947ae Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Tue, 24 Jan 2023 20:55:42 -0300 Subject: [PATCH 4/4] fix RenameStructV2b --- packages/core/contracts/test/RenamedRetyped.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/contracts/test/RenamedRetyped.sol b/packages/core/contracts/test/RenamedRetyped.sol index 77102748f..96f4a05a6 100644 --- a/packages/core/contracts/test/RenamedRetyped.sol +++ b/packages/core/contracts/test/RenamedRetyped.sol @@ -95,11 +95,11 @@ contract RenameStructV2b { } struct Checkpoint224 { - /// @custom:oz-renamed-from _blockNumber uint32 _key; uint224 _value; } + /// @custom:oz-retyped-from RenameStructV1.History Trace224 history; }