diff --git a/.gas-snapshot b/.gas-snapshot index 2d2a678..5524a29 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -67,21 +67,21 @@ BenchTest:testMintDN420_13() (gas: 111184) BenchTest:testMintDN420_14() (gas: 112569) BenchTest:testMintDN420_15() (gas: 114041) BenchTest:testMintDN420_16() (gas: 115447) -BenchTest:test__codesize() (gas: 28114) +BenchTest:test__codesize() (gas: 28118) DN404CustomUnitTest:testInitializeCorrectUnitSuccess() (gas: 130120) DN404CustomUnitTest:testInitializeWithUnitTooLargeReverts() (gas: 33791) DN404CustomUnitTest:testInitializeWithZeroUnitReverts() (gas: 13864) DN404CustomUnitTest:testMint() (gas: 163237) -DN404CustomUnitTest:testMintWithoutNFTs(uint256,uint256,uint256) (runs: 276, μ: 160424, ~: 162733) +DN404CustomUnitTest:testMintWithoutNFTs(uint256,uint256,uint256) (runs: 276, μ: 160268, ~: 162733) DN404CustomUnitTest:testNFTMint() (gas: 64873666) -DN404CustomUnitTest:testNFTMintAndBurn(uint256,uint256,uint256) (runs: 276, μ: 203500, ~: 159083) -DN404CustomUnitTest:testNFTMintViaTransfer(uint256,uint256,uint256) (runs: 276, μ: 232805, ~: 250925) -DN404CustomUnitTest:testTotalSupplyOverflowsTrick(uint256,uint256) (runs: 276, μ: 603, ~: 664) -DN404CustomUnitTest:testTotalSupplyOverflowsTrick(uint256,uint256,uint256) (runs: 276, μ: 776, ~: 746) +DN404CustomUnitTest:testNFTMintAndBurn(uint256,uint256,uint256) (runs: 276, μ: 208680, ~: 159100) +DN404CustomUnitTest:testNFTMintViaTransfer(uint256,uint256,uint256) (runs: 276, μ: 233979, ~: 250925) +DN404CustomUnitTest:testTotalSupplyOverflowsTrick(uint256,uint256) (runs: 276, μ: 604, ~: 664) +DN404CustomUnitTest:testTotalSupplyOverflowsTrick(uint256,uint256,uint256) (runs: 276, μ: 775, ~: 746) DN404CustomUnitTest:testUnitInvalidCheckTrick(uint256) (runs: 276, μ: 526, ~: 527) -DN404CustomUnitTest:test__codesize() (gas: 28643) -DN404MirrorTest:testAutomaticPullOwnerWithOwnable() (gas: 3664602) -DN404MirrorTest:testAutomaticPullOwnerWithOwnable2() (gas: 3652679) +DN404CustomUnitTest:test__codesize() (gas: 28647) +DN404MirrorTest:testAutomaticPullOwnerWithOwnable() (gas: 3664644) +DN404MirrorTest:testAutomaticPullOwnerWithOwnable2() (gas: 3652693) DN404MirrorTest:testBaseERC20() (gas: 114787) DN404MirrorTest:testFnSelectorNotRecognized() (gas: 6247) DN404MirrorTest:testLinkMirrorContract() (gas: 39410) @@ -89,86 +89,86 @@ DN404MirrorTest:testLogDirectTransfers() (gas: 395961) DN404MirrorTest:testLogTransfer() (gas: 120943) DN404MirrorTest:testNameAndSymbol(string,string) (runs: 276, μ: 203835, ~: 207144) DN404MirrorTest:testNotLinked() (gas: 12794) -DN404MirrorTest:testPullOwner() (gas: 112833) -DN404MirrorTest:testSafeTransferFrom(uint32,bytes) (runs: 276, μ: 533926, ~: 502002) +DN404MirrorTest:testPullOwner() (gas: 112847) +DN404MirrorTest:testSafeTransferFrom(uint32,bytes) (runs: 276, μ: 533930, ~: 502002) DN404MirrorTest:testSetAndGetApprovalForAll() (gas: 331059) DN404MirrorTest:testSetAndGetApproved() (gas: 328139) DN404MirrorTest:testSupportsInterface() (gas: 7544) -DN404MirrorTest:testTokenURI(string,uint256) (runs: 276, μ: 261981, ~: 266295) -DN404MirrorTest:testTransferFrom(uint32) (runs: 276, μ: 379975, ~: 379913) -DN404MirrorTest:testTransferFromMixed(uint256) (runs: 276, μ: 765680, ~: 687875) -DN404MirrorTest:test__codesize() (gas: 61980) +DN404MirrorTest:testTokenURI(string,uint256) (runs: 276, μ: 261207, ~: 266295) +DN404MirrorTest:testTransferFrom(uint32) (runs: 276, μ: 379976, ~: 379913) +DN404MirrorTest:testTransferFromMixed(uint256) (runs: 276, μ: 756888, ~: 694884) +DN404MirrorTest:test__codesize() (gas: 61984) DN404OnlyERC20Test:testApprove() (gas: 35902) DN404OnlyERC20Test:testApprove(address,uint256) (runs: 276, μ: 31380, ~: 31453) DN404OnlyERC20Test:testBurn() (gas: 48166) -DN404OnlyERC20Test:testBurn(address,uint256,uint256) (runs: 276, μ: 49020, ~: 49345) -DN404OnlyERC20Test:testBurnInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 42238, ~: 42379) +DN404OnlyERC20Test:testBurn(address,uint256,uint256) (runs: 276, μ: 49116, ~: 49345) +DN404OnlyERC20Test:testBurnInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 42313, ~: 42379) DN404OnlyERC20Test:testInfiniteApproveTransferFrom() (gas: 82978) DN404OnlyERC20Test:testMaxSupplyTrick(uint256) (runs: 276, μ: 541, ~: 541) DN404OnlyERC20Test:testMetadata() (gas: 8962) DN404OnlyERC20Test:testMint() (gas: 44065) DN404OnlyERC20Test:testMintOverMaxLimitReverts() (gas: 42035) -DN404OnlyERC20Test:testMintz(address,uint256) (runs: 276, μ: 44640, ~: 44487) +DN404OnlyERC20Test:testMintz(address,uint256) (runs: 276, μ: 44477, ~: 44487) DN404OnlyERC20Test:testTransfer() (gas: 58082) -DN404OnlyERC20Test:testTransfer(address,uint256) (runs: 276, μ: 58644, ~: 58491) +DN404OnlyERC20Test:testTransfer(address,uint256) (runs: 276, μ: 58481, ~: 58491) DN404OnlyERC20Test:testTransferFrom() (gas: 79976) -DN404OnlyERC20Test:testTransferFrom(address,address,address,uint256,uint256) (runs: 276, μ: 87062, ~: 88405) +DN404OnlyERC20Test:testTransferFrom(address,address,address,uint256,uint256) (runs: 276, μ: 86957, ~: 88405) DN404OnlyERC20Test:testTransferFromInsufficientAllowanceReverts() (gas: 66880) -DN404OnlyERC20Test:testTransferFromInsufficientAllowanceReverts(address,uint256,uint256) (runs: 276, μ: 67858, ~: 67959) +DN404OnlyERC20Test:testTransferFromInsufficientAllowanceReverts(address,uint256,uint256) (runs: 276, μ: 67932, ~: 67959) DN404OnlyERC20Test:testTransferFromInsufficientBalanceReverts() (gas: 51747) -DN404OnlyERC20Test:testTransferFromInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 52385, ~: 52534) +DN404OnlyERC20Test:testTransferFromInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 52455, ~: 52518) DN404OnlyERC20Test:testTransferInsufficientBalanceReverts() (gas: 43948) -DN404OnlyERC20Test:testTransferInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 44936, ~: 45057) -DN404OnlyERC20Test:test__codesize() (gas: 28063) +DN404OnlyERC20Test:testTransferInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 45010, ~: 45057) +DN404OnlyERC20Test:test__codesize() (gas: 28067) DN404Test:testBatchNFTLog() (gas: 327308) DN404Test:testBurnOnTransfer(uint32,address) (runs: 274, μ: 275863, ~: 275863) DN404Test:testFnSelectorNotRecognized() (gas: 6256) -DN404Test:testInitialize(uint32,address) (runs: 276, μ: 112465, ~: 113808) +DN404Test:testInitialize(uint32,address) (runs: 276, μ: 112338, ~: 113808) DN404Test:testMintAndBurn() (gas: 346843) DN404Test:testMintAndBurn2() (gas: 283400) DN404Test:testMintNext() (gas: 707821) -DN404Test:testMintNextContiguous(uint256) (runs: 276, μ: 580234, ~: 530149) +DN404Test:testMintNextContiguous(uint256) (runs: 276, μ: 580056, ~: 524910) DN404Test:testMintOnTransfer(uint32,address) (runs: 274, μ: 290438, ~: 290438) -DN404Test:testMixed(bytes32) (runs: 276, μ: 535439, ~: 477565) +DN404Test:testMixed(bytes32) (runs: 276, μ: 552934, ~: 487468) DN404Test:testNameAndSymbol(string,string) (runs: 276, μ: 203567, ~: 206876) DN404Test:testNumAliasesOverflowReverts() (gas: 40944) DN404Test:testOwnedIds() (gas: 361141) -DN404Test:testOwnedIds(uint256) (runs: 276, μ: 270712, ~: 285417) +DN404Test:testOwnedIds(uint256) (runs: 276, μ: 267777, ~: 284922) DN404Test:testPermit2() (gas: 456313) DN404Test:testRegisterAndResolveAlias(address,address) (runs: 276, μ: 120191, ~: 120191) -DN404Test:testSetAndGetAux(address,uint88) (runs: 276, μ: 22056, ~: 22274) +DN404Test:testSetAndGetAux(address,uint88) (runs: 276, μ: 22057, ~: 22274) DN404Test:testSetAndGetOperatorApprovals(address,address,bool) (runs: 276, μ: 130345, ~: 120540) DN404Test:testSetAndGetSkipNFT() (gas: 708368) DN404Test:testTokenURI(string,uint256) (runs: 276, μ: 12997903, ~: 12975480) DN404Test:testTransferWithMirrorEvent() (gas: 411009) DN404Test:testTransfersAndBurns() (gas: 488426) -DN404Test:testWrapAround(uint32,uint256) (runs: 276, μ: 392860, ~: 389199) -DN404Test:test__codesize() (gas: 60928) +DN404Test:testWrapAround(uint32,uint256) (runs: 276, μ: 392569, ~: 389217) +DN404Test:test__codesize() (gas: 60932) DN404ZeroIndexedTest:testBatchNFTLog() (gas: 326747) DN404ZeroIndexedTest:testBurnOnTransfer(uint32,address) (runs: 274, μ: 255783, ~: 255783) DN404ZeroIndexedTest:testFnSelectorNotRecognized() (gas: 6256) -DN404ZeroIndexedTest:testInitialize(uint32,address) (runs: 276, μ: 111178, ~: 113802) +DN404ZeroIndexedTest:testInitialize(uint32,address) (runs: 276, μ: 111499, ~: 113802) DN404ZeroIndexedTest:testMintAndBurn() (gas: 343724) DN404ZeroIndexedTest:testMintAndBurn2() (gas: 280984) DN404ZeroIndexedTest:testMintNext() (gas: 704822) -DN404ZeroIndexedTest:testMintNextContiguous(uint256) (runs: 276, μ: 573892, ~: 527005) +DN404ZeroIndexedTest:testMintNextContiguous(uint256) (runs: 276, μ: 582208, ~: 533217) DN404ZeroIndexedTest:testMintOnTransfer(uint32,address) (runs: 274, μ: 270404, ~: 270404) -DN404ZeroIndexedTest:testMixed(bytes32) (runs: 276, μ: 541159, ~: 483085) +DN404ZeroIndexedTest:testMixed(bytes32) (runs: 276, μ: 549795, ~: 468990) DN404ZeroIndexedTest:testNameAndSymbol(string,string) (runs: 276, μ: 203516, ~: 206825) DN404ZeroIndexedTest:testNumAliasesOverflowReverts() (gas: 40944) DN404ZeroIndexedTest:testOwnedIds() (gas: 348030) -DN404ZeroIndexedTest:testOwnedIds(uint256) (runs: 276, μ: 270873, ~: 287994) +DN404ZeroIndexedTest:testOwnedIds(uint256) (runs: 276, μ: 265976, ~: 284351) DN404ZeroIndexedTest:testPermit2() (gas: 455948) -DN404ZeroIndexedTest:testRegisterAndResolveAlias(address,address) (runs: 276, μ: 120118, ~: 120191) +DN404ZeroIndexedTest:testRegisterAndResolveAlias(address,address) (runs: 276, μ: 120191, ~: 120191) DN404ZeroIndexedTest:testSetAndGetAux(address,uint88) (runs: 276, μ: 22074, ~: 22292) DN404ZeroIndexedTest:testSetAndGetOperatorApprovals(address,address,bool) (runs: 276, μ: 130339, ~: 120534) DN404ZeroIndexedTest:testSetAndGetSkipNFT() (gas: 708390) DN404ZeroIndexedTest:testTokenURI(string,uint256) (runs: 276, μ: 157093, ~: 134670) DN404ZeroIndexedTest:testTransferWithMirrorEvent() (gas: 410515) DN404ZeroIndexedTest:testTransfersAndBurns() (gas: 486461) -DN404ZeroIndexedTest:testWrapAround(uint32,uint256) (runs: 276, μ: 376766, ~: 383784) -DN404ZeroIndexedTest:testWrapNFTIdEquivalence(uint256,uint256,bool) (runs: 276, μ: 1382, ~: 1440) -DN404ZeroIndexedTest:test__codesize() (gas: 60723) +DN404ZeroIndexedTest:testWrapAround(uint32,uint256) (runs: 276, μ: 378030, ~: 383784) +DN404ZeroIndexedTest:testWrapNFTIdEquivalence(uint256,uint256,bool) (runs: 276, μ: 1381, ~: 1418) +DN404ZeroIndexedTest:test__codesize() (gas: 60727) DN420OnlyERC20Test:testApprove() (gas: 35869) DN420OnlyERC20Test:testApprove(address,uint256) (runs: 276, μ: 31347, ~: 31420) DN420OnlyERC20Test:testBurn() (gas: 49038) @@ -223,16 +223,16 @@ MaxUnitInvariant:invariantMirrorAndBaseRemainImmutable() (runs: 10, calls: 150, MaxUnitInvariant:invariantNoUserOwnsInvalidToken() (runs: 10, calls: 150, reverts: 0) MaxUnitInvariant:invariantTotalReflectionIsValid() (runs: 10, calls: 150, reverts: 0) MaxUnitInvariant:invariantUserReflectionIsValid() (runs: 10, calls: 150, reverts: 0) -MintTests:test_WhenAmountIsGreaterThan_MAX_SUPPLYOrMintMakesNFTTotalSupplyExceed_MAX_SUPPLY(uint256) (runs: 276, μ: 60713, ~: 61594) -MintTests:test_WhenRecipientAddressHasSkipNFTEnabled(uint256) (runs: 276, μ: 85951, ~: 85935) -MintTests:test_WhenRecipientIsAddress0(uint256) (runs: 276, μ: 31047, ~: 30966) -MintTests:test_WhenRecipientsBalanceDifferenceIsNotUpTo1e18(uint256) (runs: 276, μ: 82981, ~: 83100) -MintTests:test_WhenRecipientsBalanceDifferenceIsUpTo1e18OrAbove(uint256) (runs: 276, μ: 89511, ~: 89631) -MintTests:test__codesize() (gas: 27240) +MintTests:test_WhenAmountIsGreaterThan_MAX_SUPPLYOrMintMakesNFTTotalSupplyExceed_MAX_SUPPLY(uint256) (runs: 276, μ: 60712, ~: 61591) +MintTests:test_WhenRecipientAddressHasSkipNFTEnabled(uint256) (runs: 276, μ: 85925, ~: 85935) +MintTests:test_WhenRecipientIsAddress0(uint256) (runs: 276, μ: 31041, ~: 30966) +MintTests:test_WhenRecipientsBalanceDifferenceIsNotUpTo1e18(uint256) (runs: 276, μ: 82990, ~: 83101) +MintTests:test_WhenRecipientsBalanceDifferenceIsUpTo1e18OrAbove(uint256) (runs: 276, μ: 89437, ~: 89631) +MintTests:test__codesize() (gas: 27244) NFTMintDN404Test:testAllowlistMint() (gas: 258872) NFTMintDN404Test:testMint() (gas: 231574) NFTMintDN404Test:testTotalSupplyReached() (gas: 628086918) -NFTMintDN404Test:test__codesize() (gas: 22299) +NFTMintDN404Test:test__codesize() (gas: 22303) NonMultipleUnitInvariant:invariantBurnedPoolLengthIsTailMinusHead() (runs: 10, calls: 150, reverts: 0) NonMultipleUnitInvariant:invariantDN404BalanceSum() (runs: 10, calls: 150, reverts: 0) NonMultipleUnitInvariant:invariantMirror721BalanceSum() (runs: 10, calls: 150, reverts: 0) @@ -244,7 +244,7 @@ SimpleDN404Test:testMint() (gas: 49579) SimpleDN404Test:testName() (gas: 9134) SimpleDN404Test:testSymbol() (gas: 9132) SimpleDN404Test:testWithdraw() (gas: 20732) -SimpleDN404Test:test__codesize() (gas: 18221) +SimpleDN404Test:test__codesize() (gas: 18225) SoladyTest:test__codesize() (gas: 840) TestPlus:test__codesize() (gas: 406) WADUnitInvariant:invariantBurnedPoolLengthIsTailMinusHead() (runs: 10, calls: 150, reverts: 0) diff --git a/src/DN404Mirror.sol b/src/DN404Mirror.sol index 8f196e8..852bbdf 100644 --- a/src/DN404Mirror.sol +++ b/src/DN404Mirror.sol @@ -362,9 +362,10 @@ contract DN404Mirror { function pullOwner() public virtual returns (bool) { address newOwner; address base = baseERC20(); + uint32 baseOwnerFunctionSelector = uint32(_baseOwnerFunctionSelector()); /// @solidity memory-safe-assembly assembly { - mstore(0x00, 0x8da5cb5b) // `owner()`. + mstore(0x00, baseOwnerFunctionSelector) let success := staticcall(gas(), base, 0x1c, 0x04, 0x00, 0x20) newOwner := mul(shr(96, mload(0x0c)), and(gt(returndatasize(), 0x1f), success)) } @@ -377,6 +378,11 @@ contract DN404Mirror { return true; } + /// @dev Override to allow for a different function selector on `baseERC20`. + function _baseOwnerFunctionSelector() internal view virtual returns (bytes4) { + return 0x8da5cb5b; // `owner()`. + } + /*«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-«-*/ /* MIRROR OPERATIONS */ /*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/