Skip to content

Commit e8eefac

Browse files
authored
♻️ Custom base ERC20 owner function selector (#151)
1 parent 250724d commit e8eefac

File tree

2 files changed

+54
-48
lines changed

2 files changed

+54
-48
lines changed

.gas-snapshot

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -67,108 +67,108 @@ BenchTest:testMintDN420_13() (gas: 111184)
6767
BenchTest:testMintDN420_14() (gas: 112569)
6868
BenchTest:testMintDN420_15() (gas: 114041)
6969
BenchTest:testMintDN420_16() (gas: 115447)
70-
BenchTest:test__codesize() (gas: 28114)
70+
BenchTest:test__codesize() (gas: 28118)
7171
DN404CustomUnitTest:testInitializeCorrectUnitSuccess() (gas: 130120)
7272
DN404CustomUnitTest:testInitializeWithUnitTooLargeReverts() (gas: 33791)
7373
DN404CustomUnitTest:testInitializeWithZeroUnitReverts() (gas: 13864)
7474
DN404CustomUnitTest:testMint() (gas: 163237)
75-
DN404CustomUnitTest:testMintWithoutNFTs(uint256,uint256,uint256) (runs: 276, μ: 160424, ~: 162733)
75+
DN404CustomUnitTest:testMintWithoutNFTs(uint256,uint256,uint256) (runs: 276, μ: 160268, ~: 162733)
7676
DN404CustomUnitTest:testNFTMint() (gas: 64873666)
77-
DN404CustomUnitTest:testNFTMintAndBurn(uint256,uint256,uint256) (runs: 276, μ: 203500, ~: 159083)
78-
DN404CustomUnitTest:testNFTMintViaTransfer(uint256,uint256,uint256) (runs: 276, μ: 232805, ~: 250925)
79-
DN404CustomUnitTest:testTotalSupplyOverflowsTrick(uint256,uint256) (runs: 276, μ: 603, ~: 664)
80-
DN404CustomUnitTest:testTotalSupplyOverflowsTrick(uint256,uint256,uint256) (runs: 276, μ: 776, ~: 746)
77+
DN404CustomUnitTest:testNFTMintAndBurn(uint256,uint256,uint256) (runs: 276, μ: 208680, ~: 159100)
78+
DN404CustomUnitTest:testNFTMintViaTransfer(uint256,uint256,uint256) (runs: 276, μ: 233979, ~: 250925)
79+
DN404CustomUnitTest:testTotalSupplyOverflowsTrick(uint256,uint256) (runs: 276, μ: 604, ~: 664)
80+
DN404CustomUnitTest:testTotalSupplyOverflowsTrick(uint256,uint256,uint256) (runs: 276, μ: 775, ~: 746)
8181
DN404CustomUnitTest:testUnitInvalidCheckTrick(uint256) (runs: 276, μ: 526, ~: 527)
82-
DN404CustomUnitTest:test__codesize() (gas: 28643)
83-
DN404MirrorTest:testAutomaticPullOwnerWithOwnable() (gas: 3664602)
84-
DN404MirrorTest:testAutomaticPullOwnerWithOwnable2() (gas: 3652679)
82+
DN404CustomUnitTest:test__codesize() (gas: 28647)
83+
DN404MirrorTest:testAutomaticPullOwnerWithOwnable() (gas: 3664644)
84+
DN404MirrorTest:testAutomaticPullOwnerWithOwnable2() (gas: 3652693)
8585
DN404MirrorTest:testBaseERC20() (gas: 114787)
8686
DN404MirrorTest:testFnSelectorNotRecognized() (gas: 6247)
8787
DN404MirrorTest:testLinkMirrorContract() (gas: 39410)
8888
DN404MirrorTest:testLogDirectTransfers() (gas: 395961)
8989
DN404MirrorTest:testLogTransfer() (gas: 120943)
9090
DN404MirrorTest:testNameAndSymbol(string,string) (runs: 276, μ: 203835, ~: 207144)
9191
DN404MirrorTest:testNotLinked() (gas: 12794)
92-
DN404MirrorTest:testPullOwner() (gas: 112833)
93-
DN404MirrorTest:testSafeTransferFrom(uint32,bytes) (runs: 276, μ: 533926, ~: 502002)
92+
DN404MirrorTest:testPullOwner() (gas: 112847)
93+
DN404MirrorTest:testSafeTransferFrom(uint32,bytes) (runs: 276, μ: 533930, ~: 502002)
9494
DN404MirrorTest:testSetAndGetApprovalForAll() (gas: 331059)
9595
DN404MirrorTest:testSetAndGetApproved() (gas: 328139)
9696
DN404MirrorTest:testSupportsInterface() (gas: 7544)
97-
DN404MirrorTest:testTokenURI(string,uint256) (runs: 276, μ: 261981, ~: 266295)
98-
DN404MirrorTest:testTransferFrom(uint32) (runs: 276, μ: 379975, ~: 379913)
99-
DN404MirrorTest:testTransferFromMixed(uint256) (runs: 276, μ: 765680, ~: 687875)
100-
DN404MirrorTest:test__codesize() (gas: 61980)
97+
DN404MirrorTest:testTokenURI(string,uint256) (runs: 276, μ: 261207, ~: 266295)
98+
DN404MirrorTest:testTransferFrom(uint32) (runs: 276, μ: 379976, ~: 379913)
99+
DN404MirrorTest:testTransferFromMixed(uint256) (runs: 276, μ: 756888, ~: 694884)
100+
DN404MirrorTest:test__codesize() (gas: 61984)
101101
DN404OnlyERC20Test:testApprove() (gas: 35902)
102102
DN404OnlyERC20Test:testApprove(address,uint256) (runs: 276, μ: 31380, ~: 31453)
103103
DN404OnlyERC20Test:testBurn() (gas: 48166)
104-
DN404OnlyERC20Test:testBurn(address,uint256,uint256) (runs: 276, μ: 49020, ~: 49345)
105-
DN404OnlyERC20Test:testBurnInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 42238, ~: 42379)
104+
DN404OnlyERC20Test:testBurn(address,uint256,uint256) (runs: 276, μ: 49116, ~: 49345)
105+
DN404OnlyERC20Test:testBurnInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 42313, ~: 42379)
106106
DN404OnlyERC20Test:testInfiniteApproveTransferFrom() (gas: 82978)
107107
DN404OnlyERC20Test:testMaxSupplyTrick(uint256) (runs: 276, μ: 541, ~: 541)
108108
DN404OnlyERC20Test:testMetadata() (gas: 8962)
109109
DN404OnlyERC20Test:testMint() (gas: 44065)
110110
DN404OnlyERC20Test:testMintOverMaxLimitReverts() (gas: 42035)
111-
DN404OnlyERC20Test:testMintz(address,uint256) (runs: 276, μ: 44640, ~: 44487)
111+
DN404OnlyERC20Test:testMintz(address,uint256) (runs: 276, μ: 44477, ~: 44487)
112112
DN404OnlyERC20Test:testTransfer() (gas: 58082)
113-
DN404OnlyERC20Test:testTransfer(address,uint256) (runs: 276, μ: 58644, ~: 58491)
113+
DN404OnlyERC20Test:testTransfer(address,uint256) (runs: 276, μ: 58481, ~: 58491)
114114
DN404OnlyERC20Test:testTransferFrom() (gas: 79976)
115-
DN404OnlyERC20Test:testTransferFrom(address,address,address,uint256,uint256) (runs: 276, μ: 87062, ~: 88405)
115+
DN404OnlyERC20Test:testTransferFrom(address,address,address,uint256,uint256) (runs: 276, μ: 86957, ~: 88405)
116116
DN404OnlyERC20Test:testTransferFromInsufficientAllowanceReverts() (gas: 66880)
117-
DN404OnlyERC20Test:testTransferFromInsufficientAllowanceReverts(address,uint256,uint256) (runs: 276, μ: 67858, ~: 67959)
117+
DN404OnlyERC20Test:testTransferFromInsufficientAllowanceReverts(address,uint256,uint256) (runs: 276, μ: 67932, ~: 67959)
118118
DN404OnlyERC20Test:testTransferFromInsufficientBalanceReverts() (gas: 51747)
119-
DN404OnlyERC20Test:testTransferFromInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 52385, ~: 52534)
119+
DN404OnlyERC20Test:testTransferFromInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 52455, ~: 52518)
120120
DN404OnlyERC20Test:testTransferInsufficientBalanceReverts() (gas: 43948)
121-
DN404OnlyERC20Test:testTransferInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 44936, ~: 45057)
122-
DN404OnlyERC20Test:test__codesize() (gas: 28063)
121+
DN404OnlyERC20Test:testTransferInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 45010, ~: 45057)
122+
DN404OnlyERC20Test:test__codesize() (gas: 28067)
123123
DN404Test:testBatchNFTLog() (gas: 327308)
124124
DN404Test:testBurnOnTransfer(uint32,address) (runs: 274, μ: 275863, ~: 275863)
125125
DN404Test:testFnSelectorNotRecognized() (gas: 6256)
126-
DN404Test:testInitialize(uint32,address) (runs: 276, μ: 112465, ~: 113808)
126+
DN404Test:testInitialize(uint32,address) (runs: 276, μ: 112338, ~: 113808)
127127
DN404Test:testMintAndBurn() (gas: 346843)
128128
DN404Test:testMintAndBurn2() (gas: 283400)
129129
DN404Test:testMintNext() (gas: 707821)
130-
DN404Test:testMintNextContiguous(uint256) (runs: 276, μ: 580234, ~: 530149)
130+
DN404Test:testMintNextContiguous(uint256) (runs: 276, μ: 580056, ~: 524910)
131131
DN404Test:testMintOnTransfer(uint32,address) (runs: 274, μ: 290438, ~: 290438)
132-
DN404Test:testMixed(bytes32) (runs: 276, μ: 535439, ~: 477565)
132+
DN404Test:testMixed(bytes32) (runs: 276, μ: 552934, ~: 487468)
133133
DN404Test:testNameAndSymbol(string,string) (runs: 276, μ: 203567, ~: 206876)
134134
DN404Test:testNumAliasesOverflowReverts() (gas: 40944)
135135
DN404Test:testOwnedIds() (gas: 361141)
136-
DN404Test:testOwnedIds(uint256) (runs: 276, μ: 270712, ~: 285417)
136+
DN404Test:testOwnedIds(uint256) (runs: 276, μ: 267777, ~: 284922)
137137
DN404Test:testPermit2() (gas: 456313)
138138
DN404Test:testRegisterAndResolveAlias(address,address) (runs: 276, μ: 120191, ~: 120191)
139-
DN404Test:testSetAndGetAux(address,uint88) (runs: 276, μ: 22056, ~: 22274)
139+
DN404Test:testSetAndGetAux(address,uint88) (runs: 276, μ: 22057, ~: 22274)
140140
DN404Test:testSetAndGetOperatorApprovals(address,address,bool) (runs: 276, μ: 130345, ~: 120540)
141141
DN404Test:testSetAndGetSkipNFT() (gas: 708368)
142142
DN404Test:testTokenURI(string,uint256) (runs: 276, μ: 12997903, ~: 12975480)
143143
DN404Test:testTransferWithMirrorEvent() (gas: 411009)
144144
DN404Test:testTransfersAndBurns() (gas: 488426)
145-
DN404Test:testWrapAround(uint32,uint256) (runs: 276, μ: 392860, ~: 389199)
146-
DN404Test:test__codesize() (gas: 60928)
145+
DN404Test:testWrapAround(uint32,uint256) (runs: 276, μ: 392569, ~: 389217)
146+
DN404Test:test__codesize() (gas: 60932)
147147
DN404ZeroIndexedTest:testBatchNFTLog() (gas: 326747)
148148
DN404ZeroIndexedTest:testBurnOnTransfer(uint32,address) (runs: 274, μ: 255783, ~: 255783)
149149
DN404ZeroIndexedTest:testFnSelectorNotRecognized() (gas: 6256)
150-
DN404ZeroIndexedTest:testInitialize(uint32,address) (runs: 276, μ: 111178, ~: 113802)
150+
DN404ZeroIndexedTest:testInitialize(uint32,address) (runs: 276, μ: 111499, ~: 113802)
151151
DN404ZeroIndexedTest:testMintAndBurn() (gas: 343724)
152152
DN404ZeroIndexedTest:testMintAndBurn2() (gas: 280984)
153153
DN404ZeroIndexedTest:testMintNext() (gas: 704822)
154-
DN404ZeroIndexedTest:testMintNextContiguous(uint256) (runs: 276, μ: 573892, ~: 527005)
154+
DN404ZeroIndexedTest:testMintNextContiguous(uint256) (runs: 276, μ: 582208, ~: 533217)
155155
DN404ZeroIndexedTest:testMintOnTransfer(uint32,address) (runs: 274, μ: 270404, ~: 270404)
156-
DN404ZeroIndexedTest:testMixed(bytes32) (runs: 276, μ: 541159, ~: 483085)
156+
DN404ZeroIndexedTest:testMixed(bytes32) (runs: 276, μ: 549795, ~: 468990)
157157
DN404ZeroIndexedTest:testNameAndSymbol(string,string) (runs: 276, μ: 203516, ~: 206825)
158158
DN404ZeroIndexedTest:testNumAliasesOverflowReverts() (gas: 40944)
159159
DN404ZeroIndexedTest:testOwnedIds() (gas: 348030)
160-
DN404ZeroIndexedTest:testOwnedIds(uint256) (runs: 276, μ: 270873, ~: 287994)
160+
DN404ZeroIndexedTest:testOwnedIds(uint256) (runs: 276, μ: 265976, ~: 284351)
161161
DN404ZeroIndexedTest:testPermit2() (gas: 455948)
162-
DN404ZeroIndexedTest:testRegisterAndResolveAlias(address,address) (runs: 276, μ: 120118, ~: 120191)
162+
DN404ZeroIndexedTest:testRegisterAndResolveAlias(address,address) (runs: 276, μ: 120191, ~: 120191)
163163
DN404ZeroIndexedTest:testSetAndGetAux(address,uint88) (runs: 276, μ: 22074, ~: 22292)
164164
DN404ZeroIndexedTest:testSetAndGetOperatorApprovals(address,address,bool) (runs: 276, μ: 130339, ~: 120534)
165165
DN404ZeroIndexedTest:testSetAndGetSkipNFT() (gas: 708390)
166166
DN404ZeroIndexedTest:testTokenURI(string,uint256) (runs: 276, μ: 157093, ~: 134670)
167167
DN404ZeroIndexedTest:testTransferWithMirrorEvent() (gas: 410515)
168168
DN404ZeroIndexedTest:testTransfersAndBurns() (gas: 486461)
169-
DN404ZeroIndexedTest:testWrapAround(uint32,uint256) (runs: 276, μ: 376766, ~: 383784)
170-
DN404ZeroIndexedTest:testWrapNFTIdEquivalence(uint256,uint256,bool) (runs: 276, μ: 1382, ~: 1440)
171-
DN404ZeroIndexedTest:test__codesize() (gas: 60723)
169+
DN404ZeroIndexedTest:testWrapAround(uint32,uint256) (runs: 276, μ: 378030, ~: 383784)
170+
DN404ZeroIndexedTest:testWrapNFTIdEquivalence(uint256,uint256,bool) (runs: 276, μ: 1381, ~: 1418)
171+
DN404ZeroIndexedTest:test__codesize() (gas: 60727)
172172
DN420OnlyERC20Test:testApprove() (gas: 35869)
173173
DN420OnlyERC20Test:testApprove(address,uint256) (runs: 276, μ: 31347, ~: 31420)
174174
DN420OnlyERC20Test:testBurn() (gas: 49038)
@@ -223,16 +223,16 @@ MaxUnitInvariant:invariantMirrorAndBaseRemainImmutable() (runs: 10, calls: 150,
223223
MaxUnitInvariant:invariantNoUserOwnsInvalidToken() (runs: 10, calls: 150, reverts: 0)
224224
MaxUnitInvariant:invariantTotalReflectionIsValid() (runs: 10, calls: 150, reverts: 0)
225225
MaxUnitInvariant:invariantUserReflectionIsValid() (runs: 10, calls: 150, reverts: 0)
226-
MintTests:test_WhenAmountIsGreaterThan_MAX_SUPPLYOrMintMakesNFTTotalSupplyExceed_MAX_SUPPLY(uint256) (runs: 276, μ: 60713, ~: 61594)
227-
MintTests:test_WhenRecipientAddressHasSkipNFTEnabled(uint256) (runs: 276, μ: 85951, ~: 85935)
228-
MintTests:test_WhenRecipientIsAddress0(uint256) (runs: 276, μ: 31047, ~: 30966)
229-
MintTests:test_WhenRecipientsBalanceDifferenceIsNotUpTo1e18(uint256) (runs: 276, μ: 82981, ~: 83100)
230-
MintTests:test_WhenRecipientsBalanceDifferenceIsUpTo1e18OrAbove(uint256) (runs: 276, μ: 89511, ~: 89631)
231-
MintTests:test__codesize() (gas: 27240)
226+
MintTests:test_WhenAmountIsGreaterThan_MAX_SUPPLYOrMintMakesNFTTotalSupplyExceed_MAX_SUPPLY(uint256) (runs: 276, μ: 60712, ~: 61591)
227+
MintTests:test_WhenRecipientAddressHasSkipNFTEnabled(uint256) (runs: 276, μ: 85925, ~: 85935)
228+
MintTests:test_WhenRecipientIsAddress0(uint256) (runs: 276, μ: 31041, ~: 30966)
229+
MintTests:test_WhenRecipientsBalanceDifferenceIsNotUpTo1e18(uint256) (runs: 276, μ: 82990, ~: 83101)
230+
MintTests:test_WhenRecipientsBalanceDifferenceIsUpTo1e18OrAbove(uint256) (runs: 276, μ: 89437, ~: 89631)
231+
MintTests:test__codesize() (gas: 27244)
232232
NFTMintDN404Test:testAllowlistMint() (gas: 258872)
233233
NFTMintDN404Test:testMint() (gas: 231574)
234234
NFTMintDN404Test:testTotalSupplyReached() (gas: 628086918)
235-
NFTMintDN404Test:test__codesize() (gas: 22299)
235+
NFTMintDN404Test:test__codesize() (gas: 22303)
236236
NonMultipleUnitInvariant:invariantBurnedPoolLengthIsTailMinusHead() (runs: 10, calls: 150, reverts: 0)
237237
NonMultipleUnitInvariant:invariantDN404BalanceSum() (runs: 10, calls: 150, reverts: 0)
238238
NonMultipleUnitInvariant:invariantMirror721BalanceSum() (runs: 10, calls: 150, reverts: 0)
@@ -244,7 +244,7 @@ SimpleDN404Test:testMint() (gas: 49579)
244244
SimpleDN404Test:testName() (gas: 9134)
245245
SimpleDN404Test:testSymbol() (gas: 9132)
246246
SimpleDN404Test:testWithdraw() (gas: 20732)
247-
SimpleDN404Test:test__codesize() (gas: 18221)
247+
SimpleDN404Test:test__codesize() (gas: 18225)
248248
SoladyTest:test__codesize() (gas: 840)
249249
TestPlus:test__codesize() (gas: 406)
250250
WADUnitInvariant:invariantBurnedPoolLengthIsTailMinusHead() (runs: 10, calls: 150, reverts: 0)

src/DN404Mirror.sol

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,9 +362,10 @@ contract DN404Mirror {
362362
function pullOwner() public virtual returns (bool) {
363363
address newOwner;
364364
address base = baseERC20();
365+
uint32 baseOwnerFunctionSelector = uint32(_baseOwnerFunctionSelector());
365366
/// @solidity memory-safe-assembly
366367
assembly {
367-
mstore(0x00, 0x8da5cb5b) // `owner()`.
368+
mstore(0x00, baseOwnerFunctionSelector)
368369
let success := staticcall(gas(), base, 0x1c, 0x04, 0x00, 0x20)
369370
newOwner := mul(shr(96, mload(0x0c)), and(gt(returndatasize(), 0x1f), success))
370371
}
@@ -377,6 +378,11 @@ contract DN404Mirror {
377378
return true;
378379
}
379380

381+
/// @dev Override to allow for a different function selector on `baseERC20`.
382+
function _baseOwnerFunctionSelector() internal view virtual returns (bytes4) {
383+
return 0x8da5cb5b; // `owner()`.
384+
}
385+
380386
/*«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-*/
381387
/* MIRROR OPERATIONS */
382388
/*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/

0 commit comments

Comments
 (0)