Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

♻️ Custom base ERC20 owner function selector #151

Merged
merged 2 commits into from
Jan 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 47 additions & 47 deletions .gas-snapshot
Original file line number Diff line number Diff line change
Expand Up @@ -67,108 +67,108 @@ 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)
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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down
8 changes: 7 additions & 1 deletion src/DN404Mirror.sol
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
Expand All @@ -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 */
/*-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»-»*/
Expand Down
Loading