diff --git a/.gas-snapshot b/.gas-snapshot index 9b8783b..6082148 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,207 +1,209 @@ -ArrayOpsTest:testConcat(uint256) (runs: 276, μ: 392279, ~: 62913) -ArrayOpsTest:testFilled(uint256) (runs: 276, μ: 260423, ~: 38526) -ArrayOpsTest:testZeroAddresses(uint256) (runs: 276, μ: 160090, ~: 27938) -ArrayOpsTest:test__codesize() (gas: 4268) -BenchTest:testMintAndTransferDN404_01() (gas: 208773) -BenchTest:testMintAndTransferDN404_02() (gas: 214974) -BenchTest:testMintAndTransferDN404_03() (gas: 221152) -BenchTest:testMintAndTransferDN404_04() (gas: 227330) -BenchTest:testMintAndTransferDN404_05() (gas: 255431) -BenchTest:testMintAndTransferDN404_06() (gas: 261607) -BenchTest:testMintAndTransferDN404_07() (gas: 267755) -BenchTest:testMintAndTransferDN404_08() (gas: 273941) -BenchTest:testMintAndTransferDN404_09() (gas: 345799) -BenchTest:testMintAndTransferDN404_10() (gas: 351957) -BenchTest:testMintAndTransferDN404_11() (gas: 358200) -BenchTest:testMintAndTransferDN404_12() (gas: 364334) -BenchTest:testMintAndTransferDN404_13() (gas: 392412) -BenchTest:testMintAndTransferDN404_14() (gas: 398569) -BenchTest:testMintAndTransferDN404_15() (gas: 404813) -BenchTest:testMintAndTransferDN404_16() (gas: 410925) -BenchTest:testMintAndTransferDN420_01() (gas: 134881) -BenchTest:testMintAndTransferDN420_02() (gas: 137941) -BenchTest:testMintAndTransferDN420_03() (gas: 141002) -BenchTest:testMintAndTransferDN420_04() (gas: 144082) -BenchTest:testMintAndTransferDN420_05() (gas: 147211) -BenchTest:testMintAndTransferDN420_06() (gas: 150248) -BenchTest:testMintAndTransferDN420_07() (gas: 153332) -BenchTest:testMintAndTransferDN420_08() (gas: 156415) -BenchTest:testMintAndTransferDN420_09() (gas: 159477) -BenchTest:testMintAndTransferDN420_10() (gas: 162604) -BenchTest:testMintAndTransferDN420_11() (gas: 165688) -BenchTest:testMintAndTransferDN420_12() (gas: 168747) -BenchTest:testMintAndTransferDN420_13() (gas: 171809) -BenchTest:testMintAndTransferDN420_14() (gas: 174914) -BenchTest:testMintAndTransferDN420_15() (gas: 178043) -BenchTest:testMintAndTransferDN420_16() (gas: 181103) -BenchTest:testMintDN404_01() (gas: 123089) -BenchTest:testMintDN404_02() (gas: 126185) -BenchTest:testMintDN404_03() (gas: 129300) -BenchTest:testMintDN404_04() (gas: 132397) -BenchTest:testMintDN404_05() (gas: 157390) -BenchTest:testMintDN404_06() (gas: 160574) -BenchTest:testMintDN404_07() (gas: 163690) -BenchTest:testMintDN404_08() (gas: 166809) -BenchTest:testMintDN404_09() (gas: 213704) -BenchTest:testMintDN404_10() (gas: 216801) -BenchTest:testMintDN404_11() (gas: 219916) -BenchTest:testMintDN404_12() (gas: 223034) -BenchTest:testMintDN404_13() (gas: 248051) -BenchTest:testMintDN404_14() (gas: 251167) -BenchTest:testMintDN404_15() (gas: 254326) -BenchTest:testMintDN404_16() (gas: 257445) -BenchTest:testMintDN420_01() (gas: 94039) -BenchTest:testMintDN420_02() (gas: 95488) -BenchTest:testMintDN420_03() (gas: 96871) -BenchTest:testMintDN420_04() (gas: 98342) -BenchTest:testMintDN420_05() (gas: 99697) -BenchTest:testMintDN420_06() (gas: 101179) -BenchTest:testMintDN420_07() (gas: 102607) -BenchTest:testMintDN420_08() (gas: 103992) -BenchTest:testMintDN420_09() (gas: 105443) -BenchTest:testMintDN420_10() (gas: 106893) -BenchTest:testMintDN420_11() (gas: 108319) -BenchTest:testMintDN420_12() (gas: 109748) -BenchTest:testMintDN420_13() (gas: 111178) -BenchTest:testMintDN420_14() (gas: 112563) -BenchTest:testMintDN420_15() (gas: 114035) -BenchTest:testMintDN420_16() (gas: 115441) -BenchTest:test__codesize() (gas: 28596) -DN404CustomUnitTest:testInitializeCorrectUnitSuccess() (gas: 129447) -DN404CustomUnitTest:testInitializeWithUnitTooLargeReverts() (gas: 33803) -DN404CustomUnitTest:testInitializeWithZeroUnitReverts() (gas: 13876) -DN404CustomUnitTest:testMint() (gas: 162564) -DN404CustomUnitTest:testMintWithoutNFTs(uint256,uint256,uint256) (runs: 276, μ: 159607, ~: 162075) -DN404CustomUnitTest:testNFTMint() (gas: 64872993) -DN404CustomUnitTest:testNFTMintAndBurn(uint256,uint256,uint256) (runs: 276, μ: 204015, ~: 158436) -DN404CustomUnitTest:testNFTMintViaTransfer(uint256,uint256,uint256) (runs: 276, μ: 234977, ~: 250252) -DN404CustomUnitTest:testTotalSupplyOverflowsTrick(uint256,uint256) (runs: 276, μ: 605, ~: 664) +ArrayOpsTest:testConcat(uint256) (runs: 276, μ: 464607, ~: 63451) +ArrayOpsTest:testERC721ReceiverCheckCopy(bytes) (runs: 276, μ: 922, ~: 877) +ArrayOpsTest:testFilled(uint256) (runs: 276, μ: 269253, ~: 37965) +ArrayOpsTest:testZeroAddresses(uint256) (runs: 276, μ: 159112, ~: 28114) +ArrayOpsTest:test__codesize() (gas: 4656) +BenchTest:testMintAndTransferDN404_01() (gas: 208785) +BenchTest:testMintAndTransferDN404_02() (gas: 214986) +BenchTest:testMintAndTransferDN404_03() (gas: 221164) +BenchTest:testMintAndTransferDN404_04() (gas: 227342) +BenchTest:testMintAndTransferDN404_05() (gas: 255443) +BenchTest:testMintAndTransferDN404_06() (gas: 261619) +BenchTest:testMintAndTransferDN404_07() (gas: 267767) +BenchTest:testMintAndTransferDN404_08() (gas: 273953) +BenchTest:testMintAndTransferDN404_09() (gas: 345811) +BenchTest:testMintAndTransferDN404_10() (gas: 351969) +BenchTest:testMintAndTransferDN404_11() (gas: 358212) +BenchTest:testMintAndTransferDN404_12() (gas: 364346) +BenchTest:testMintAndTransferDN404_13() (gas: 392424) +BenchTest:testMintAndTransferDN404_14() (gas: 398581) +BenchTest:testMintAndTransferDN404_15() (gas: 404825) +BenchTest:testMintAndTransferDN404_16() (gas: 410937) +BenchTest:testMintAndTransferDN420_01() (gas: 134893) +BenchTest:testMintAndTransferDN420_02() (gas: 137953) +BenchTest:testMintAndTransferDN420_03() (gas: 141014) +BenchTest:testMintAndTransferDN420_04() (gas: 144094) +BenchTest:testMintAndTransferDN420_05() (gas: 147223) +BenchTest:testMintAndTransferDN420_06() (gas: 150260) +BenchTest:testMintAndTransferDN420_07() (gas: 153344) +BenchTest:testMintAndTransferDN420_08() (gas: 156427) +BenchTest:testMintAndTransferDN420_09() (gas: 159489) +BenchTest:testMintAndTransferDN420_10() (gas: 162616) +BenchTest:testMintAndTransferDN420_11() (gas: 165700) +BenchTest:testMintAndTransferDN420_12() (gas: 168759) +BenchTest:testMintAndTransferDN420_13() (gas: 171821) +BenchTest:testMintAndTransferDN420_14() (gas: 174926) +BenchTest:testMintAndTransferDN420_15() (gas: 178055) +BenchTest:testMintAndTransferDN420_16() (gas: 181115) +BenchTest:testMintDN404_01() (gas: 123095) +BenchTest:testMintDN404_02() (gas: 126191) +BenchTest:testMintDN404_03() (gas: 129306) +BenchTest:testMintDN404_04() (gas: 132403) +BenchTest:testMintDN404_05() (gas: 157396) +BenchTest:testMintDN404_06() (gas: 160580) +BenchTest:testMintDN404_07() (gas: 163696) +BenchTest:testMintDN404_08() (gas: 166815) +BenchTest:testMintDN404_09() (gas: 213710) +BenchTest:testMintDN404_10() (gas: 216807) +BenchTest:testMintDN404_11() (gas: 219922) +BenchTest:testMintDN404_12() (gas: 223040) +BenchTest:testMintDN404_13() (gas: 248057) +BenchTest:testMintDN404_14() (gas: 251173) +BenchTest:testMintDN404_15() (gas: 254332) +BenchTest:testMintDN404_16() (gas: 257451) +BenchTest:testMintDN420_01() (gas: 94045) +BenchTest:testMintDN420_02() (gas: 95494) +BenchTest:testMintDN420_03() (gas: 96877) +BenchTest:testMintDN420_04() (gas: 98348) +BenchTest:testMintDN420_05() (gas: 99703) +BenchTest:testMintDN420_06() (gas: 101185) +BenchTest:testMintDN420_07() (gas: 102613) +BenchTest:testMintDN420_08() (gas: 103998) +BenchTest:testMintDN420_09() (gas: 105449) +BenchTest:testMintDN420_10() (gas: 106899) +BenchTest:testMintDN420_11() (gas: 108325) +BenchTest:testMintDN420_12() (gas: 109754) +BenchTest:testMintDN420_13() (gas: 111184) +BenchTest:testMintDN420_14() (gas: 112569) +BenchTest:testMintDN420_15() (gas: 114041) +BenchTest:testMintDN420_16() (gas: 115447) +BenchTest:test__codesize() (gas: 28252) +DN404CustomUnitTest:testInitializeCorrectUnitSuccess() (gas: 130120) +DN404CustomUnitTest:testInitializeWithUnitTooLargeReverts() (gas: 33791) +DN404CustomUnitTest:testInitializeWithZeroUnitReverts() (gas: 13864) +DN404CustomUnitTest:testMint() (gas: 163237) +DN404CustomUnitTest:testMintWithoutNFTs(uint256,uint256,uint256) (runs: 276, μ: 160409, ~: 162733) +DN404CustomUnitTest:testNFTMint() (gas: 64873666) +DN404CustomUnitTest:testNFTMintAndBurn(uint256,uint256,uint256) (runs: 276, μ: 207856, ~: 159094) +DN404CustomUnitTest:testNFTMintViaTransfer(uint256,uint256,uint256) (runs: 276, μ: 235488, ~: 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: 29420) -DN404MirrorTest:testBaseERC20() (gas: 114127) -DN404MirrorTest:testFnSelectorNotRecognized() (gas: 6236) -DN404MirrorTest:testLinkMirrorContract() (gas: 39444) -DN404MirrorTest:testLogDirectTransfers() (gas: 395289) -DN404MirrorTest:testLogTransfer() (gas: 120205) -DN404MirrorTest:testNameAndSymbol(string,string) (runs: 276, μ: 203093, ~: 206402) -DN404MirrorTest:testNotLinked() (gas: 12777) -DN404MirrorTest:testPullOwner() (gas: 112107) -DN404MirrorTest:testPullOwnerWithOwnable() (gas: 3720734) -DN404MirrorTest:testSafeTransferFrom(uint32) (runs: 276, μ: 478042, ~: 477986) -DN404MirrorTest:testSetAndGetApprovalForAll() (gas: 330334) -DN404MirrorTest:testSetAndGetApproved() (gas: 327479) -DN404MirrorTest:testSupportsInterface() (gas: 7544) -DN404MirrorTest:testTokenURI(string,uint256) (runs: 276, μ: 260276, ~: 265606) -DN404MirrorTest:testTransferFrom(uint32) (runs: 276, μ: 379240, ~: 379184) -DN404MirrorTest:testTransferFromMixed(uint256) (runs: 276, μ: 747704, ~: 675595) -DN404MirrorTest:test__codesize() (gas: 59911) -DN404OnlyERC20Test:testApprove() (gas: 35803) -DN404OnlyERC20Test:testApprove(address,uint256) (runs: 276, μ: 31281, ~: 31354) +DN404CustomUnitTest:test__codesize() (gas: 28781) +DN404MirrorTest:testAutomaticPullOwnerWithOwnable() (gas: 3664602) +DN404MirrorTest:testAutomaticPullOwnerWithOwnable2() (gas: 3652679) +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, μ: 203765, ~: 207074) +DN404MirrorTest:testNotLinked() (gas: 12794) +DN404MirrorTest:testPullOwner() (gas: 112833) +DN404MirrorTest:testSafeTransferFrom(uint32) (runs: 276, μ: 478719, ~: 478658) +DN404MirrorTest:testSetAndGetApprovalForAll() (gas: 331059) +DN404MirrorTest:testSetAndGetApproved() (gas: 328139) +DN404MirrorTest:testSupportsInterface() (gas: 7567) +DN404MirrorTest:testTokenURI(string,uint256) (runs: 276, μ: 261507, ~: 266260) +DN404MirrorTest:testTransferFrom(uint32) (runs: 276, μ: 379939, ~: 379878) +DN404MirrorTest:testTransferFromMixed(uint256) (runs: 276, μ: 785229, ~: 716434) +DN404MirrorTest:test__codesize() (gas: 60249) +DN404OnlyERC20Test:testApprove() (gas: 35902) +DN404OnlyERC20Test:testApprove(address,uint256) (runs: 276, μ: 31380, ~: 31453) DN404OnlyERC20Test:testBurn() (gas: 48166) -DN404OnlyERC20Test:testBurn(address,uint256,uint256) (runs: 276, μ: 49028, ~: 49345) -DN404OnlyERC20Test:testBurnInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 42244, ~: 42394) -DN404OnlyERC20Test:testInfiniteApproveTransferFrom() (gas: 82824) +DN404OnlyERC20Test:testBurn(address,uint256,uint256) (runs: 276, μ: 49031, ~: 49345) +DN404OnlyERC20Test:testBurnInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 42229, ~: 42379) +DN404OnlyERC20Test:testInfiniteApproveTransferFrom() (gas: 82978) DN404OnlyERC20Test:testMaxSupplyTrick(uint256) (runs: 276, μ: 541, ~: 541) DN404OnlyERC20Test:testMetadata() (gas: 8962) DN404OnlyERC20Test:testMint() (gas: 44065) -DN404OnlyERC20Test:testMintOverMaxLimitReverts() (gas: 42044) -DN404OnlyERC20Test:testMintz(address,uint256) (runs: 276, μ: 44560, ~: 44487) +DN404OnlyERC20Test:testMintOverMaxLimitReverts() (gas: 42035) +DN404OnlyERC20Test:testMintz(address,uint256) (runs: 276, μ: 44725, ~: 44487) DN404OnlyERC20Test:testTransfer() (gas: 58082) -DN404OnlyERC20Test:testTransfer(address,uint256) (runs: 276, μ: 58564, ~: 58491) -DN404OnlyERC20Test:testTransferFrom() (gas: 79853) -DN404OnlyERC20Test:testTransferFrom(address,address,address,uint256,uint256) (runs: 276, μ: 86827, ~: 88251) -DN404OnlyERC20Test:testTransferFromInsufficientAllowanceReverts() (gas: 66796) -DN404OnlyERC20Test:testTransferFromInsufficientAllowanceReverts(address,uint256,uint256) (runs: 276, μ: 67765, ~: 67875) -DN404OnlyERC20Test:testTransferFromInsufficientBalanceReverts() (gas: 51682) -DN404OnlyERC20Test:testTransferFromInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 52313, ~: 52459) -DN404OnlyERC20Test:testTransferInsufficientBalanceReverts() (gas: 43963) -DN404OnlyERC20Test:testTransferInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 44942, ~: 45072) -DN404OnlyERC20Test:test__codesize() (gas: 28456) -DN404Test:testBatchNFTLog() (gas: 326614) -DN404Test:testBurnOnTransfer(uint32,address) (runs: 274, μ: 275195, ~: 275205) -DN404Test:testFnSelectorNotRecognized() (gas: 6268) -DN404Test:testInitialize(uint32,address) (runs: 276, μ: 111752, ~: 113114) -DN404Test:testMintAndBurn() (gas: 346149) -DN404Test:testMintAndBurn2() (gas: 282706) -DN404Test:testMintNext() (gas: 707127) -DN404Test:testMintNextContiguous(uint256) (runs: 276, μ: 592236, ~: 535367) -DN404Test:testMintOnTransfer(uint32,address) (runs: 274, μ: 289752, ~: 289762) -DN404Test:testMixed(bytes32) (runs: 276, μ: 560104, ~: 502215) -DN404Test:testNameAndSymbol(string,string) (runs: 276, μ: 202873, ~: 206182) +DN404OnlyERC20Test:testTransfer(address,uint256) (runs: 276, μ: 58729, ~: 58491) +DN404OnlyERC20Test:testTransferFrom() (gas: 79976) +DN404OnlyERC20Test:testTransferFrom(address,address,address,uint256,uint256) (runs: 276, μ: 87059, ~: 88405) +DN404OnlyERC20Test:testTransferFromInsufficientAllowanceReverts() (gas: 66880) +DN404OnlyERC20Test:testTransferFromInsufficientAllowanceReverts(address,uint256,uint256) (runs: 276, μ: 67849, ~: 67959) +DN404OnlyERC20Test:testTransferFromInsufficientBalanceReverts() (gas: 51747) +DN404OnlyERC20Test:testTransferFromInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 52378, ~: 52524) +DN404OnlyERC20Test:testTransferInsufficientBalanceReverts() (gas: 43948) +DN404OnlyERC20Test:testTransferInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 44927, ~: 45057) +DN404OnlyERC20Test:test__codesize() (gas: 28201) +DN404Test:testBatchNFTLog() (gas: 327308) +DN404Test:testBurnOnTransfer(uint32,address) (runs: 274, μ: 275863, ~: 275863) +DN404Test:testFnSelectorNotRecognized() (gas: 6256) +DN404Test:testInitialize(uint32,address) (runs: 276, μ: 112730, ~: 113808) +DN404Test:testMintAndBurn() (gas: 346843) +DN404Test:testMintAndBurn2() (gas: 283400) +DN404Test:testMintNext() (gas: 707821) +DN404Test:testMintNextContiguous(uint256) (runs: 276, μ: 588301, ~: 538017) +DN404Test:testMintOnTransfer(uint32,address) (runs: 274, μ: 290438, ~: 290438) +DN404Test:testMixed(bytes32) (runs: 276, μ: 530506, ~: 477345) +DN404Test:testNameAndSymbol(string,string) (runs: 276, μ: 203567, ~: 206876) DN404Test:testNumAliasesOverflowReverts() (gas: 40944) -DN404Test:testOwnedIds() (gas: 360447) -DN404Test:testOwnedIds(uint256) (runs: 276, μ: 270710, ~: 284723) -DN404Test:testPermit2() (gas: 455655) -DN404Test:testRegisterAndResolveAlias(address,address) (runs: 276, μ: 120046, ~: 120191) -DN404Test:testSetAndGetAux(address,uint88) (runs: 276, μ: 22024, ~: 22274) -DN404Test:testSetAndGetOperatorApprovals(address,address,bool) (runs: 276, μ: 129651, ~: 119846) +DN404Test:testOwnedIds() (gas: 361141) +DN404Test:testOwnedIds(uint256) (runs: 276, μ: 268325, ~: 284584) +DN404Test:testPermit2() (gas: 456313) +DN404Test:testRegisterAndResolveAlias(address,address) (runs: 276, μ: 120191, ~: 120191) +DN404Test:testSetAndGetAux(address,uint88) (runs: 276, μ: 22056, ~: 22274) +DN404Test:testSetAndGetOperatorApprovals(address,address,bool) (runs: 276, μ: 130345, ~: 120540) DN404Test:testSetAndGetSkipNFT() (gas: 708368) -DN404Test:testTokenURI(string,uint256) (runs: 276, μ: 12997209, ~: 12974786) -DN404Test:testTransferWithMirrorEvent() (gas: 410315) -DN404Test:testTransfersAndBurns() (gas: 487732) -DN404Test:testWrapAround(uint32,uint256) (runs: 276, μ: 392587, ~: 388779) -DN404Test:test__codesize() (gas: 61668) -DN404ZeroIndexedTest:testBatchNFTLog() (gas: 326053) -DN404ZeroIndexedTest:testBurnOnTransfer(uint32,address) (runs: 274, μ: 255125, ~: 255125) -DN404ZeroIndexedTest:testFnSelectorNotRecognized() (gas: 6268) -DN404ZeroIndexedTest:testInitialize(uint32,address) (runs: 276, μ: 111004, ~: 113108) -DN404ZeroIndexedTest:testMintAndBurn() (gas: 343030) -DN404ZeroIndexedTest:testMintAndBurn2() (gas: 280290) -DN404ZeroIndexedTest:testMintNext() (gas: 704128) -DN404ZeroIndexedTest:testMintNextContiguous(uint256) (runs: 276, μ: 565562, ~: 498537) -DN404ZeroIndexedTest:testMintOnTransfer(uint32,address) (runs: 274, μ: 269728, ~: 269728) -DN404ZeroIndexedTest:testMixed(bytes32) (runs: 276, μ: 528496, ~: 448826) -DN404ZeroIndexedTest:testNameAndSymbol(string,string) (runs: 276, μ: 202822, ~: 206131) +DN404Test:testTokenURI(string,uint256) (runs: 276, μ: 12997903, ~: 12975480) +DN404Test:testTransferWithMirrorEvent() (gas: 411009) +DN404Test:testTransfersAndBurns() (gas: 488426) +DN404Test:testWrapAround(uint32,uint256) (runs: 276, μ: 392580, ~: 389199) +DN404Test:test__codesize() (gas: 61066) +DN404ZeroIndexedTest:testBatchNFTLog() (gas: 326747) +DN404ZeroIndexedTest:testBurnOnTransfer(uint32,address) (runs: 274, μ: 255773, ~: 255783) +DN404ZeroIndexedTest:testFnSelectorNotRecognized() (gas: 6256) +DN404ZeroIndexedTest:testInitialize(uint32,address) (runs: 276, μ: 111139, ~: 113802) +DN404ZeroIndexedTest:testMintAndBurn() (gas: 343724) +DN404ZeroIndexedTest:testMintAndBurn2() (gas: 280984) +DN404ZeroIndexedTest:testMintNext() (gas: 704822) +DN404ZeroIndexedTest:testMintNextContiguous(uint256) (runs: 276, μ: 574967, ~: 529585) +DN404ZeroIndexedTest:testMintOnTransfer(uint32,address) (runs: 274, μ: 270394, ~: 270404) +DN404ZeroIndexedTest:testMixed(bytes32) (runs: 276, μ: 517435, ~: 451049) +DN404ZeroIndexedTest:testNameAndSymbol(string,string) (runs: 276, μ: 203516, ~: 206825) DN404ZeroIndexedTest:testNumAliasesOverflowReverts() (gas: 40944) -DN404ZeroIndexedTest:testOwnedIds() (gas: 347336) -DN404ZeroIndexedTest:testOwnedIds(uint256) (runs: 276, μ: 266517, ~: 284119) -DN404ZeroIndexedTest:testPermit2() (gas: 455290) +DN404ZeroIndexedTest:testOwnedIds() (gas: 348030) +DN404ZeroIndexedTest:testOwnedIds(uint256) (runs: 276, μ: 268702, ~: 285180) +DN404ZeroIndexedTest:testPermit2() (gas: 455948) DN404ZeroIndexedTest:testRegisterAndResolveAlias(address,address) (runs: 276, μ: 120118, ~: 120191) DN404ZeroIndexedTest:testSetAndGetAux(address,uint88) (runs: 276, μ: 22074, ~: 22290) -DN404ZeroIndexedTest:testSetAndGetOperatorApprovals(address,address,bool) (runs: 276, μ: 129645, ~: 119840) +DN404ZeroIndexedTest:testSetAndGetOperatorApprovals(address,address,bool) (runs: 276, μ: 130339, ~: 120534) DN404ZeroIndexedTest:testSetAndGetSkipNFT() (gas: 708390) -DN404ZeroIndexedTest:testTokenURI(string,uint256) (runs: 276, μ: 156399, ~: 133976) -DN404ZeroIndexedTest:testTransferWithMirrorEvent() (gas: 409821) -DN404ZeroIndexedTest:testTransfersAndBurns() (gas: 485767) -DN404ZeroIndexedTest:testWrapAround(uint32,uint256) (runs: 276, μ: 375791, ~: 383090) -DN404ZeroIndexedTest:testWrapNFTIdEquivalence(uint256,uint256,bool) (runs: 276, μ: 1376, ~: 1418) -DN404ZeroIndexedTest:test__codesize() (gas: 61463) -DN420OnlyERC20Test:testApprove() (gas: 35770) -DN420OnlyERC20Test:testApprove(address,uint256) (runs: 276, μ: 31248, ~: 31321) -DN420OnlyERC20Test:testBurn() (gas: 49034) -DN420OnlyERC20Test:testBurn(address,uint256,uint256) (runs: 276, μ: 49974, ~: 50213) -DN420OnlyERC20Test:testBurnInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 43198, ~: 43257) -DN420OnlyERC20Test:testInfiniteApproveTransferFrom() (gas: 80265) +DN404ZeroIndexedTest:testTokenURI(string,uint256) (runs: 276, μ: 157093, ~: 134670) +DN404ZeroIndexedTest:testTransferWithMirrorEvent() (gas: 410515) +DN404ZeroIndexedTest:testTransfersAndBurns() (gas: 486461) +DN404ZeroIndexedTest:testWrapAround(uint32,uint256) (runs: 276, μ: 378032, ~: 383784) +DN404ZeroIndexedTest:testWrapNFTIdEquivalence(uint256,uint256,bool) (runs: 276, μ: 1379, ~: 1418) +DN404ZeroIndexedTest:test__codesize() (gas: 60861) +DN420OnlyERC20Test:testApprove() (gas: 35869) +DN420OnlyERC20Test:testApprove(address,uint256) (runs: 276, μ: 31347, ~: 31420) +DN420OnlyERC20Test:testBurn() (gas: 49038) +DN420OnlyERC20Test:testBurn(address,uint256,uint256) (runs: 276, μ: 49979, ~: 50217) +DN420OnlyERC20Test:testBurnInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 43176, ~: 43239) +DN420OnlyERC20Test:testInfiniteApproveTransferFrom() (gas: 80431) DN420OnlyERC20Test:testMaxSupplyTrick(uint256) (runs: 276, μ: 541, ~: 541) DN420OnlyERC20Test:testMetadata() (gas: 9030) -DN420OnlyERC20Test:testMint() (gas: 45003) -DN420OnlyERC20Test:testMintOverMaxLimitReverts() (gas: 40544) -DN420OnlyERC20Test:testMintz(address,uint256) (runs: 276, μ: 45418, ~: 45425) -DN420OnlyERC20Test:testTransfer() (gas: 54107) -DN420OnlyERC20Test:testTransfer(address,uint256) (runs: 276, μ: 54387, ~: 54464) -DN420OnlyERC20Test:testTransferFrom() (gas: 77806) -DN420OnlyERC20Test:testTransferFrom(address,address,address,uint256,uint256) (runs: 276, μ: 84152, ~: 85693) -DN420OnlyERC20Test:testTransferFromInsufficientAllowanceReverts() (gas: 67729) -DN420OnlyERC20Test:testTransferFromInsufficientAllowanceReverts(address,uint256,uint256) (runs: 276, μ: 68788, ~: 68808) -DN420OnlyERC20Test:testTransferFromInsufficientBalanceReverts() (gas: 52389) -DN420OnlyERC20Test:testTransferFromInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 53102, ~: 53176) -DN420OnlyERC20Test:testTransferInsufficientBalanceReverts() (gas: 42411) -DN420OnlyERC20Test:testTransferInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 43480, ~: 43520) -DN420OnlyERC20Test:test__codesize() (gas: 25183) -DN420Test:testERC1155Methods(uint256) (runs: 276, μ: 4405953, ~: 4144225) -DN420Test:testERC1155MethodsSelfTransfers(uint256) (runs: 276, μ: 2487686, ~: 2120228) -DN420Test:testFindOwnedIds() (gas: 2710082) -DN420Test:testMintNext() (gas: 2241678) -DN420Test:testMintToNonERC155RecipientReverts(uint256) (runs: 276, μ: 857655, ~: 815190) -DN420Test:testMintToRevertingERC155RecipientReverts(uint256) (runs: 276, μ: 1466844, ~: 1007800) -DN420Test:testMintToZeroReverts(uint256) (runs: 276, μ: 773452, ~: 678527) -DN420Test:testMixed(uint256) (runs: 276, μ: 6049045, ~: 4073905) -DN420Test:testSafeBatchTransferFromToERC1155Recipient(uint256) (runs: 276, μ: 2297704, ~: 2216420) -DN420Test:testSafeTransferFromToERC1155Recipient(uint256) (runs: 276, μ: 1785357, ~: 1509121) -DN420Test:testTransferFromToERC1155Recipient(uint256) (runs: 276, μ: 2923825, ~: 2910911) -DN420Test:testTransferMixedReverts(uint256) (runs: 276, μ: 4148865, ~: 3421880) -DN420Test:test__codesize() (gas: 66586) +DN420OnlyERC20Test:testMint() (gas: 45007) +DN420OnlyERC20Test:testMintOverMaxLimitReverts() (gas: 40535) +DN420OnlyERC20Test:testMintz(address,uint256) (runs: 276, μ: 45575, ~: 45429) +DN420OnlyERC20Test:testTransfer() (gas: 54113) +DN420OnlyERC20Test:testTransfer(address,uint256) (runs: 276, μ: 54549, ~: 54471) +DN420OnlyERC20Test:testTransferFrom() (gas: 77939) +DN420OnlyERC20Test:testTransferFrom(address,address,address,uint256,uint256) (runs: 276, μ: 84669, ~: 85863) +DN420OnlyERC20Test:testTransferFromInsufficientAllowanceReverts() (gas: 67813) +DN420OnlyERC20Test:testTransferFromInsufficientAllowanceReverts(address,uint256,uint256) (runs: 276, μ: 68869, ~: 68892) +DN420OnlyERC20Test:testTransferFromInsufficientBalanceReverts() (gas: 52454) +DN420OnlyERC20Test:testTransferFromInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 53167, ~: 53240) +DN420OnlyERC20Test:testTransferInsufficientBalanceReverts() (gas: 42396) +DN420OnlyERC20Test:testTransferInsufficientBalanceReverts(address,uint256,uint256) (runs: 276, μ: 43462, ~: 43505) +DN420OnlyERC20Test:test__codesize() (gas: 25098) +DN420Test:testERC1155Methods(uint256) (runs: 276, μ: 4464943, ~: 4198183) +DN420Test:testERC1155MethodsSelfTransfers(uint256) (runs: 276, μ: 2550293, ~: 2747966) +DN420Test:testFindOwnedIds() (gas: 2674735) +DN420Test:testMintNext() (gas: 2197082) +DN420Test:testMintToNonERC155RecipientReverts(uint256) (runs: 276, μ: 858894, ~: 814940) +DN420Test:testMintToRevertingERC155RecipientReverts(uint256) (runs: 276, μ: 1368888, ~: 1015414) +DN420Test:testMintToZeroReverts(uint256) (runs: 276, μ: 733468, ~: 686855) +DN420Test:testMixed(uint256) (runs: 276, μ: 5550311, ~: 4014525) +DN420Test:testSafeBatchTransferFromToERC1155Recipient(uint256) (runs: 276, μ: 2325505, ~: 2232825) +DN420Test:testSafeTransferFromToERC1155Recipient(uint256) (runs: 276, μ: 1764404, ~: 1517896) +DN420Test:testTransferFromToERC1155Recipient(uint256) (runs: 276, μ: 2904883, ~: 2893111) +DN420Test:testTransferMixedReverts(uint256) (runs: 276, μ: 4179109, ~: 3817014) +DN420Test:test__codesize() (gas: 66187) MappingsTest:testAddressPairMapSetAndGet(address[2],address[2],uint256,uint256) (runs: 276, μ: 47728, ~: 48233) MappingsTest:testBitmapSetAndGet(uint256) (runs: 276, μ: 510379, ~: 502124) MappingsTest:testBitmapSetAndGet(uint256,uint256,bool,bool) (runs: 276, μ: 25431, ~: 26337) @@ -221,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, μ: 60639, ~: 61606) -MintTests:test_WhenRecipientAddressHasSkipNFTEnabled(uint256) (runs: 276, μ: 85946, ~: 85935) -MintTests:test_WhenRecipientIsAddress0(uint256) (runs: 276, μ: 31069, ~: 31139) -MintTests:test_WhenRecipientsBalanceDifferenceIsNotUpTo1e18(uint256) (runs: 276, μ: 82946, ~: 83100) -MintTests:test_WhenRecipientsBalanceDifferenceIsUpTo1e18OrAbove(uint256) (runs: 276, μ: 89452, ~: 89631) -MintTests:test__codesize() (gas: 27980) -NFTMintDN404Test:testAllowlistMint() (gas: 258866) -NFTMintDN404Test:testMint() (gas: 231562) -NFTMintDN404Test:testTotalSupplyReached() (gas: 628056918) -NFTMintDN404Test:test__codesize() (gas: 22676) +MintTests:test_WhenAmountIsGreaterThan_MAX_SUPPLYOrMintMakesNFTTotalSupplyExceed_MAX_SUPPLY(uint256) (runs: 276, μ: 60470, ~: 61591) +MintTests:test_WhenRecipientAddressHasSkipNFTEnabled(uint256) (runs: 276, μ: 85931, ~: 85934) +MintTests:test_WhenRecipientIsAddress0(uint256) (runs: 276, μ: 31043, ~: 30966) +MintTests:test_WhenRecipientsBalanceDifferenceIsNotUpTo1e18(uint256) (runs: 276, μ: 82999, ~: 83101) +MintTests:test_WhenRecipientsBalanceDifferenceIsUpTo1e18OrAbove(uint256) (runs: 276, μ: 89519, ~: 89631) +MintTests:test__codesize() (gas: 27378) +NFTMintDN404Test:testAllowlistMint() (gas: 258872) +NFTMintDN404Test:testMint() (gas: 231574) +NFTMintDN404Test:testTotalSupplyReached() (gas: 628086918) +NFTMintDN404Test:test__codesize() (gas: 22437) NonMultipleUnitInvariant:invariantBurnedPoolLengthIsTailMinusHead() (runs: 10, calls: 150, reverts: 0) NonMultipleUnitInvariant:invariantDN404BalanceSum() (runs: 10, calls: 150, reverts: 0) NonMultipleUnitInvariant:invariantMirror721BalanceSum() (runs: 10, calls: 150, reverts: 0) @@ -238,11 +240,11 @@ NonMultipleUnitInvariant:invariantMirrorAndBaseRemainImmutable() (runs: 10, call NonMultipleUnitInvariant:invariantNoUserOwnsInvalidToken() (runs: 10, calls: 150, reverts: 0) NonMultipleUnitInvariant:invariantTotalReflectionIsValid() (runs: 10, calls: 150, reverts: 0) NonMultipleUnitInvariant:invariantUserReflectionIsValid() (runs: 10, calls: 150, reverts: 0) -SimpleDN404Test:testMint() (gas: 49573) +SimpleDN404Test:testMint() (gas: 49579) SimpleDN404Test:testName() (gas: 9134) SimpleDN404Test:testSymbol() (gas: 9132) SimpleDN404Test:testWithdraw() (gas: 20732) -SimpleDN404Test:test__codesize() (gas: 18598) +SimpleDN404Test:test__codesize() (gas: 18359) SoladyTest:test__codesize() (gas: 840) TestPlus:test__codesize() (gas: 406) WADUnitInvariant:invariantBurnedPoolLengthIsTailMinusHead() (runs: 10, calls: 150, reverts: 0) diff --git a/src/DN404.sol b/src/DN404.sol index a92b98f..9297dc9 100644 --- a/src/DN404.sol +++ b/src/DN404.sol @@ -251,10 +251,10 @@ abstract contract DN404 { DN404Storage storage $ = _getDN404Storage(); unchecked { - if (_unit() - 1 >= 2 ** 96 - 1) revert InvalidUnit(); + if (_unit() - 1 >= 2 ** 96 - 1) _rv(uint32(InvalidUnit.selector)); } - if ($.mirrorERC721 != address(0)) revert DNAlreadyInitialized(); - if (mirror == address(0)) revert MirrorAddressIsZero(); + if ($.mirrorERC721 != address(0)) _rv(uint32(DNAlreadyInitialized.selector)); + if (mirror == address(0)) _rv(uint32(MirrorAddressIsZero.selector)); /// @solidity memory-safe-assembly assembly { @@ -278,8 +278,10 @@ abstract contract DN404 { $.mirrorERC721 = mirror; if (initialTokenSupply != 0) { - if (initialSupplyOwner == address(0)) revert TransferToZeroAddress(); - if (_totalSupplyOverflows(initialTokenSupply)) revert TotalSupplyOverflow(); + if (initialSupplyOwner == address(0)) _rv(uint32(TransferToZeroAddress.selector)); + if (_totalSupplyOverflows(initialTokenSupply)) { + _rv(uint32(TotalSupplyOverflow.selector)); + } $.totalSupply = uint96(initialTokenSupply); AddressData storage initialOwnerAddressData = $.addressData[initialSupplyOwner]; @@ -456,7 +458,7 @@ abstract contract DN404 { == uint256(0) ? type(uint256).max : a.value; if (allowed != type(uint256).max) { - if (amount > allowed) revert InsufficientAllowance(); + if (amount > allowed) _rv(uint32(InsufficientAllowance.selector)); unchecked { a.value = allowed - amount; } @@ -502,10 +504,10 @@ abstract contract DN404 { /// /// Emits a {Transfer} event. function _mint(address to, uint256 amount) internal virtual { - if (to == address(0)) revert TransferToZeroAddress(); + if (to == address(0)) _rv(uint32(TransferToZeroAddress.selector)); DN404Storage storage $ = _getDN404Storage(); - if ($.mirrorERC721 == address(0)) revert DNNotInitialized(); + if ($.mirrorERC721 == address(0)) _rv(uint32(DNNotInitialized.selector)); AddressData storage toAddressData = $.addressData[to]; _DNMintTemps memory t; @@ -520,7 +522,9 @@ abstract contract DN404 { uint256 newTotalSupply = uint256($.totalSupply) + amount; $.totalSupply = uint96(newTotalSupply); uint256 overflows = _toUint(_totalSupplyOverflows(newTotalSupply)); - if (overflows | _toUint(newTotalSupply < amount) != 0) revert TotalSupplyOverflow(); + if (overflows | _toUint(newTotalSupply < amount) != 0) { + _rv(uint32(TotalSupplyOverflow.selector)); + } idLimit = newTotalSupply / _unit(); } while (!getSkipNFT(to)) { @@ -594,10 +598,10 @@ abstract contract DN404 { /// /// Emits a {Transfer} event. function _mintNext(address to, uint256 amount) internal virtual { - if (to == address(0)) revert TransferToZeroAddress(); + if (to == address(0)) _rv(uint32(TransferToZeroAddress.selector)); DN404Storage storage $ = _getDN404Storage(); - if ($.mirrorERC721 == address(0)) revert DNNotInitialized(); + if ($.mirrorERC721 == address(0)) _rv(uint32(DNNotInitialized.selector)); AddressData storage toAddressData = $.addressData[to]; _DNMintTemps memory t; @@ -614,7 +618,9 @@ abstract contract DN404 { uint256 newTotalSupply = uint256(preTotalSupply) + amount; $.totalSupply = uint96(newTotalSupply); uint256 overflows = _toUint(_totalSupplyOverflows(newTotalSupply)); - if (overflows | _toUint(newTotalSupply < amount) != 0) revert TotalSupplyOverflow(); + if (overflows | _toUint(newTotalSupply < amount) != 0) { + _rv(uint32(TotalSupplyOverflow.selector)); + } idLimit = newTotalSupply / _unit(); id = _wrapNFTId(preTotalSupply / _unit() + _toUint(_useOneIndexed()), idLimit); } @@ -677,14 +683,14 @@ abstract contract DN404 { /// Emits a {Transfer} event. function _burn(address from, uint256 amount) internal virtual { DN404Storage storage $ = _getDN404Storage(); - if ($.mirrorERC721 == address(0)) revert DNNotInitialized(); + if ($.mirrorERC721 == address(0)) _rv(uint32(DNNotInitialized.selector)); AddressData storage fromAddressData = $.addressData[from]; _DNBurnTemps memory t; unchecked { t.fromBalance = fromAddressData.balance; - if (amount > t.fromBalance) revert InsufficientBalance(); + if (amount > t.fromBalance) _rv(uint32(InsufficientBalance.selector)); fromAddressData.balance = uint96(t.fromBalance -= amount); t.totalSupply = uint256($.totalSupply) - amount; @@ -755,12 +761,12 @@ abstract contract DN404 { /// /// Emits a {Transfer} event. function _transfer(address from, address to, uint256 amount) internal virtual { - if (to == address(0)) revert TransferToZeroAddress(); + if (to == address(0)) _rv(uint32(TransferToZeroAddress.selector)); DN404Storage storage $ = _getDN404Storage(); AddressData storage fromAddressData = $.addressData[from]; AddressData storage toAddressData = $.addressData[to]; - if ($.mirrorERC721 == address(0)) revert DNNotInitialized(); + if ($.mirrorERC721 == address(0)) _rv(uint32(DNNotInitialized.selector)); _DNTransferTemps memory t; t.fromOwnedLength = fromAddressData.ownedLength; @@ -769,7 +775,7 @@ abstract contract DN404 { unchecked { { uint256 fromBalance = fromAddressData.balance; - if (amount > fromBalance) revert InsufficientBalance(); + if (amount > fromBalance) _rv(uint32(InsufficientBalance.selector)); fromAddressData.balance = uint96(fromBalance -= amount); uint256 toBalance = uint256(toAddressData.balance) + amount; @@ -947,21 +953,21 @@ abstract contract DN404 { internal virtual { - if (to == address(0)) revert TransferToZeroAddress(); + if (to == address(0)) _rv(uint32(TransferToZeroAddress.selector)); DN404Storage storage $ = _getDN404Storage(); - if ($.mirrorERC721 == address(0)) revert DNNotInitialized(); + if ($.mirrorERC721 == address(0)) _rv(uint32(DNNotInitialized.selector)); Uint32Map storage oo = $.oo; if (from != $.aliasToAddress[_get(oo, _ownershipIndex(_restrictNFTId(id)))]) { - revert TransferFromIncorrectOwner(); + _rv(uint32(TransferFromIncorrectOwner.selector)); } if (msgSender != from) { if (!_isApprovedForAll(from, msgSender)) { if (_getApproved(id) != msgSender) { - revert TransferCallerNotOwnerNorApproved(); + _rv(uint32(TransferCallerNotOwnerNorApproved.selector)); } } } @@ -974,7 +980,7 @@ abstract contract DN404 { unchecked { uint256 fromBalance = fromAddressData.balance; - if (unit > fromBalance) revert InsufficientBalance(); + if (unit > fromBalance) _rv(uint32(InsufficientBalance.selector)); fromAddressData.balance = uint96(fromBalance - unit); toAddressData.balance += uint96(unit); } @@ -1144,7 +1150,7 @@ abstract contract DN404 { /// Requirements: /// - Token `id` must exist. function _ownerOf(uint256 id) internal view virtual returns (address) { - if (!_exists(id)) revert TokenDoesNotExist(); + if (!_exists(id)) _rv(uint32(TokenDoesNotExist.selector)); return _ownerAt(id); } @@ -1168,7 +1174,7 @@ abstract contract DN404 { /// Requirements: /// - Token `id` must exist. function _getApproved(uint256 id) internal view virtual returns (address) { - if (!_exists(id)) revert TokenDoesNotExist(); + if (!_exists(id)) _rv(uint32(TokenDoesNotExist.selector)); return _getDN404Storage().nftApprovals[id]; } @@ -1187,7 +1193,7 @@ abstract contract DN404 { if (msgSender != owner) { if (!_isApprovedForAll(owner, msgSender)) { - revert ApprovalCallerNotOwnerNorApproved(); + _rv(uint32(ApprovalCallerNotOwnerNorApproved.selector)); } } @@ -1240,7 +1246,7 @@ abstract contract DN404 { // `transferFromNFT(address,address,uint256,address)`. if (fnSelector == 0xe5eb36c8) { - if (msg.sender != $.mirrorERC721) revert SenderNotMirror(); + if (msg.sender != $.mirrorERC721) _rv(uint32(SenderNotMirror.selector)); _transferFromNFT( address(uint160(_calldataload(0x04))), // `from`. address(uint160(_calldataload(0x24))), // `to`. @@ -1251,7 +1257,7 @@ abstract contract DN404 { } // `setApprovalForAllNFT(address,bool,address)`. if (fnSelector == 0xf6916ddd) { - if (msg.sender != $.mirrorERC721) revert SenderNotMirror(); + if (msg.sender != $.mirrorERC721) _rv(uint32(SenderNotMirror.selector)); _setApprovalForAll( address(uint160(_calldataload(0x04))), // `spender`. _calldataload(0x24) != 0, // `status`. @@ -1277,7 +1283,7 @@ abstract contract DN404 { } // `approveNFT(address,uint256,address)`. if (fnSelector == 0xd10b6e0c) { - if (msg.sender != $.mirrorERC721) revert SenderNotMirror(); + if (msg.sender != $.mirrorERC721) _rv(uint32(SenderNotMirror.selector)); address owner = _approveNFT( address(uint160(_calldataload(0x04))), // `spender`. _calldataload(0x24), // `id`. @@ -1326,7 +1332,7 @@ abstract contract DN404 { /// fallback with utilities like Solady's `LibZip.cdFallback()`. /// And always remember to always wrap the fallback with `dn404Fallback`. fallback() external payable virtual dn404Fallback { - revert FnSelectorNotRecognized(); // Not mandatory. Just for quality of life. + _rv(uint32(FnSelectorNotRecognized.selector)); // Not mandatory. Just for quality of life. } /// @dev This is to silence the compiler warning. @@ -1787,4 +1793,13 @@ abstract contract DN404 { return(0x00, 0x20) } } + + /// @dev More bytecode-efficient way to revert. + function _rv(uint32 s) private pure { + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, s) + revert(0x1c, 0x04) + } + } } diff --git a/src/DN404Mirror.sol b/src/DN404Mirror.sol index ddb1569..7a204ba 100644 --- a/src/DN404Mirror.sol +++ b/src/DN404Mirror.sol @@ -353,7 +353,7 @@ contract DN404Mirror { /// @dev Returns the address of the base DN404 contract. function baseERC20() public view virtual returns (address base) { base = _getDN404NFTStorage().baseERC20; - if (base == address(0)) revert NotLinked(); + if (base == address(0)) _rv(uint32(NotLinked.selector)); } /// @dev Fallback modifier to execute calls from the base DN404 contract. @@ -364,7 +364,7 @@ contract DN404Mirror { // `logTransfer(uint256[])`. if (fnSelector == 0x263c69d6) { - if (msg.sender != $.baseERC20) revert SenderNotBase(); + if (msg.sender != $.baseERC20) _rv(uint32(SenderNotBase.selector)); /// @solidity memory-safe-assembly assembly { let o := add(0x24, calldataload(0x04)) // Packed logs offset. @@ -388,7 +388,7 @@ contract DN404Mirror { } // `logDirectTransfer(address,address,uint256[])`. if (fnSelector == 0x144027d3) { - if (msg.sender != $.baseERC20) revert SenderNotBase(); + if (msg.sender != $.baseERC20) _rv(uint32(SenderNotBase.selector)); /// @solidity memory-safe-assembly assembly { let from := calldataload(0x04) @@ -406,10 +406,10 @@ contract DN404Mirror { if (fnSelector == 0x0f4599e5) { if ($.deployer != address(0)) { if (address(uint160(_calldataload(0x04))) != $.deployer) { - revert SenderNotDeployer(); + _rv(uint32(SenderNotDeployer.selector)); } } - if ($.baseERC20 != address(0)) revert AlreadyLinked(); + if ($.baseERC20 != address(0)) _rv(uint32(AlreadyLinked.selector)); $.baseERC20 = msg.sender; /// @solidity memory-safe-assembly assembly { @@ -425,7 +425,7 @@ contract DN404Mirror { /// fallback with utilities like Solady's `LibZip.cdFallback()`. /// And always remember to always wrap the fallback with `dn404NFTFallback`. fallback() external payable virtual dn404NFTFallback { - revert FnSelectorNotRecognized(); // Not mandatory. Just for quality of life. + _rv(uint32(FnSelectorNotRecognized.selector)); // Not mandatory. Just for quality of life. } /// @dev This is to silence the compiler warning. @@ -506,6 +506,15 @@ contract DN404Mirror { } } + /// @dev More bytecode-efficient way to revert. + function _rv(uint32 s) private pure { + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, s) + revert(0x1c, 0x04) + } + } + /// @dev Perform a call to invoke {IERC721Receiver-onERC721Received} on `to`. /// Reverts if the target does not support the function correctly. function _checkOnERC721Received(address from, address to, uint256 id, bytes memory data) diff --git a/src/DN420.sol b/src/DN420.sol index b72aed4..550c4f6 100644 --- a/src/DN420.sol +++ b/src/DN420.sol @@ -275,16 +275,18 @@ abstract contract DN420 { { DN420Storage storage $ = _getDN420Storage(); - if ($.tokenIdUpTo != 0) revert DNAlreadyInitialized(); + if ($.tokenIdUpTo != 0) _rv(uint32(DNAlreadyInitialized.selector)); unchecked { $.tokenIdUpTo = uint32((initialTokenSupply / _unit()) | 1); - if (_unit() - 1 >= 2 ** 96 - 1) revert InvalidUnit(); + if (_unit() - 1 >= 2 ** 96 - 1) _rv(uint32(InvalidUnit.selector)); } $.nextTokenId = 1; if (initialTokenSupply != 0) { - if (initialSupplyOwner == address(0)) revert TransferToZeroAddress(); - if (_totalSupplyOverflows(initialTokenSupply)) revert TotalSupplyOverflow(); + if (initialSupplyOwner == address(0)) _rv(uint32(TransferToZeroAddress.selector)); + if (_totalSupplyOverflows(initialTokenSupply)) { + _rv(uint32(TotalSupplyOverflow.selector)); + } $.totalSupply = uint96(initialTokenSupply); @@ -441,7 +443,7 @@ abstract contract DN420 { == uint256(0) ? type(uint256).max : a.value; if (allowed != type(uint256).max) { - if (amount > allowed) revert InsufficientAllowance(); + if (amount > allowed) _rv(uint32(InsufficientAllowance.selector)); unchecked { a.value = allowed - amount; } @@ -483,10 +485,10 @@ abstract contract DN420 { /// Emits an ERC1155 {TransferBatch} event for mints (if any). /// Emits an ERC20 {Transfer} event. function _mint(address to, uint256 amount, bytes memory data) internal virtual { - if (to == address(0)) revert TransferToZeroAddress(); + if (to == address(0)) _rv(uint32(TransferToZeroAddress.selector)); DN420Storage storage $ = _getDN420Storage(); - if ($.tokenIdUpTo == uint256(0)) revert DNNotInitialized(); + if ($.tokenIdUpTo == uint256(0)) _rv(uint32(DNNotInitialized.selector)); AddressData storage toAddressData = $.addressData[to]; _DNMintTemps memory t; @@ -501,7 +503,9 @@ abstract contract DN420 { uint256 totalSupply_ = uint256($.totalSupply) + amount; $.totalSupply = uint96(totalSupply_); uint256 overflows = _toUint(_totalSupplyOverflows(totalSupply_)); - if (overflows | _toUint(totalSupply_ < amount) != 0) revert TotalSupplyOverflow(); + if (overflows | _toUint(totalSupply_ < amount) != 0) { + _rv(uint32(TotalSupplyOverflow.selector)); + } maxId = totalSupply_ / _unit(); $.tokenIdUpTo = uint32(_max($.tokenIdUpTo, maxId)); } @@ -559,10 +563,10 @@ abstract contract DN420 { /// Emits an ERC1155 {TransferBatch} event for mints (if any). /// Emits an ERC20 {Transfer} event. function _mintNext(address to, uint256 amount, bytes memory data) internal virtual { - if (to == address(0)) revert TransferToZeroAddress(); + if (to == address(0)) _rv(uint32(TransferToZeroAddress.selector)); DN420Storage storage $ = _getDN420Storage(); - if ($.tokenIdUpTo == uint256(0)) revert DNNotInitialized(); + if ($.tokenIdUpTo == uint256(0)) _rv(uint32(DNNotInitialized.selector)); AddressData storage toAddressData = $.addressData[to]; _DNMintTemps memory t; @@ -579,7 +583,9 @@ abstract contract DN420 { uint256 newTotalSupply = uint256(preTotalSupply) + amount; $.totalSupply = uint96(newTotalSupply); uint256 overflows = _toUint(_totalSupplyOverflows(newTotalSupply)); - if (overflows | _toUint(newTotalSupply < amount) != 0) revert TotalSupplyOverflow(); + if (overflows | _toUint(newTotalSupply < amount) != 0) { + _rv(uint32(TotalSupplyOverflow.selector)); + } maxId = newTotalSupply / _unit(); id = _wrapNFTId(preTotalSupply / _unit() + 1, maxId); $.tokenIdUpTo = uint32(_max($.tokenIdUpTo, maxId)); @@ -634,13 +640,13 @@ abstract contract DN420 { /// Emits an ERC20 {Transfer} event. function _burn(address from, uint256 amount) internal virtual { DN420Storage storage $ = _getDN420Storage(); - if ($.tokenIdUpTo == uint256(0)) revert DNNotInitialized(); + if ($.tokenIdUpTo == uint256(0)) _rv(uint32(DNNotInitialized.selector)); AddressData storage fromAddressData = $.addressData[from]; uint256[] memory ids; unchecked { uint256 fromBalance = fromAddressData.balance; - if (amount > fromBalance) revert InsufficientBalance(); + if (amount > fromBalance) _rv(uint32(InsufficientBalance.selector)); fromAddressData.balance = uint96(fromBalance -= amount); $.totalSupply -= uint96(amount); @@ -698,10 +704,10 @@ abstract contract DN420 { internal virtual { - if (to == address(0)) revert TransferToZeroAddress(); + if (to == address(0)) _rv(uint32(TransferToZeroAddress.selector)); DN420Storage storage $ = _getDN420Storage(); - if ($.tokenIdUpTo == uint256(0)) revert DNNotInitialized(); + if ($.tokenIdUpTo == uint256(0)) _rv(uint32(DNNotInitialized.selector)); AddressData storage fromAddressData = $.addressData[from]; AddressData storage toAddressData = $.addressData[to]; @@ -712,7 +718,7 @@ abstract contract DN420 { unchecked { uint256 toBalance; uint256 fromBalance = fromAddressData.balance; - if (amount > fromBalance) revert InsufficientBalance(); + if (amount > fromBalance) _rv(uint32(InsufficientBalance.selector)); fromAddressData.balance = uint96(fromBalance -= amount); toAddressData.balance = uint96(toBalance = uint256(toAddressData.balance) + amount); @@ -845,17 +851,17 @@ abstract contract DN420 { internal virtual { - if (to == address(0)) revert TransferToZeroAddress(); + if (to == address(0)) _rv(uint32(TransferToZeroAddress.selector)); DN420Storage storage $ = _getDN420Storage(); - if ($.tokenIdUpTo == uint256(0)) revert DNNotInitialized(); + if ($.tokenIdUpTo == uint256(0)) _rv(uint32(DNNotInitialized.selector)); if (_toUint(by == address(0)) | _toUint(by == from) == uint256(0)) { - if (!isApprovedForAll(from, by)) revert NotOwnerNorApproved(); + if (!isApprovedForAll(from, by)) _rv(uint32(NotOwnerNorApproved.selector)); } Bitmap storage fromOwned = $.owned[from]; - if (!_owns(fromOwned, id)) revert TransferFromIncorrectOwner(); + if (!_owns(fromOwned, id)) _rv(uint32(TransferFromIncorrectOwner.selector)); _set(fromOwned, id, false); _set($.owned[to], id, true); @@ -909,13 +915,13 @@ abstract contract DN420 { uint256[] memory ids, bytes memory data ) internal virtual { - if (to == address(0)) revert TransferToZeroAddress(); + if (to == address(0)) _rv(uint32(TransferToZeroAddress.selector)); DN420Storage storage $ = _getDN420Storage(); - if ($.tokenIdUpTo == uint256(0)) revert DNNotInitialized(); + if ($.tokenIdUpTo == uint256(0)) _rv(uint32(DNNotInitialized.selector)); if (_toUint(by == address(0)) | _toUint(by == from) == uint256(0)) { - if (!isApprovedForAll(from, by)) revert NotOwnerNorApproved(); + if (!isApprovedForAll(from, by)) _rv(uint32(NotOwnerNorApproved.selector)); } uint256 amount; @@ -929,7 +935,7 @@ abstract contract DN420 { Bitmap storage toOwned = $.owned[to]; while (n != 0) { uint256 id = _get(ids, --n); - if (!_owns(fromOwned, id)) revert TransferFromIncorrectOwner(); + if (!_owns(fromOwned, id)) _rv(uint32(TransferFromIncorrectOwner.selector)); _set(fromOwned, id, false); _set(toOwned, id, true); upTo = _max(upTo, id); @@ -1193,7 +1199,7 @@ abstract contract DN420 { // `safeTransferFrom(address,address,uint256,uint256,bytes)`. if (fnSelector == 0xf242432a) { - if (_calldataload(0x64) != 1) revert InvalidNFTAmount(); + if (_calldataload(0x64) != 1) _rv(uint32(InvalidNFTAmount.selector)); _safeTransferNFT( msg.sender, // `by`. address(uint160(_calldataload(0x04))), // `from`. @@ -1209,8 +1215,8 @@ abstract contract DN420 { unchecked { uint256[] memory amounts = _calldataUint256Array(0x64); uint256 n = ids.length; - if (n != amounts.length) revert ArrayLengthsMismatch(); - while (n-- != 0) if (_get(amounts, n) != 1) revert InvalidNFTAmount(); + if (n != amounts.length) _rv(uint32(ArrayLengthsMismatch.selector)); + while (n-- != 0) if (_get(amounts, n) != 1) _rv(uint32(InvalidNFTAmount.selector)); } _safeBatchTransferNFTs( msg.sender, @@ -1227,7 +1233,7 @@ abstract contract DN420 { uint256[] memory ids = _calldataUint256Array(0x24); unchecked { uint256 n = ids.length; - if (owners.length != n) revert ArrayLengthsMismatch(); + if (owners.length != n) _rv(uint32(ArrayLengthsMismatch.selector)); uint256[] memory result = _idsMalloc(n); while (n-- != 0) { address owner = address(uint160(_get(owners, n))); @@ -1260,7 +1266,7 @@ abstract contract DN420 { /// fallback with utilities like Solady's `LibZip.cdFallback()`. /// And always remember to always wrap the fallback with `dn420Fallback`. fallback() external payable virtual dn420Fallback { - revert FnSelectorNotRecognized(); // Not mandatory. Just for quality of life. + _rv(uint32(FnSelectorNotRecognized.selector)); // Not mandatory. Just for quality of life. } /// @dev This is to silence the compiler warning. @@ -1755,4 +1761,13 @@ abstract contract DN420 { return(0x00, 0x20) } } + + /// @dev More bytecode-efficient way to revert. + function _rv(uint32 s) private pure { + /// @solidity memory-safe-assembly + assembly { + mstore(0x00, s) + revert(0x1c, 0x04) + } + } }