From 4dffd571fb7f9f32774fab598563a047c889f031 Mon Sep 17 00:00:00 2001 From: Peter Robinson Date: Thu, 3 Apr 2025 16:51:01 +1000 Subject: [PATCH] Added changing royalty information perf test --- perfTest/token/erc721/ERC721Perf.t.sol | 94 +++++++++++++++++++ .../erc721/ImmutableERC721ByIdPerf.t.sol | 2 +- .../ImmutableERC721ByQuantityPerf.t.sol | 2 +- .../ImmutableERC721V2ByQuantityPerf.t.sol | 2 +- 4 files changed, 97 insertions(+), 3 deletions(-) diff --git a/perfTest/token/erc721/ERC721Perf.t.sol b/perfTest/token/erc721/ERC721Perf.t.sol index f646dab1..47fc059a 100644 --- a/perfTest/token/erc721/ERC721Perf.t.sol +++ b/perfTest/token/erc721/ERC721Perf.t.sol @@ -320,6 +320,100 @@ abstract contract ERC721PerfTest is ERC721BaseTest { emit log_named_uint("totalSupply gas", gasStart - gasEnd); } + + function testSetNFTRoyaltyReceiverBatch1() public { + emit log("Scenario: NFTs 10, different receiver and fee"); + uint256 scenarioCount = 10; + uint96 newFeeNumerator = 100; + address newRoyaltyReceiver = makeAddr("newRoyaltyReceiver"); + + // Have a new fee receiver and different feeNumerator + assertNotEq(newFeeNumerator, feeNumerator, "Fee numerator should be different"); + assertNotEq(newRoyaltyReceiver, feeReceiver, "newRoyaltyReceiver should be different"); + + checkSetNFTRoyaltyReceiverBatch(newRoyaltyReceiver, newFeeNumerator, scenarioCount); + } + + function testSetNFTRoyaltyReceiverBatch2() public { + emit log("Scenario: NFTs 100, different receiver and fee"); + uint256 scenarioCount = 100; + uint96 newFeeNumerator = 100; + address newRoyaltyReceiver = makeAddr("newRoyaltyReceiver"); + + // Have a new fee receiver and different feeNumerator + assertNotEq(newFeeNumerator, feeNumerator, "Fee numerator should be different"); + assertNotEq(newRoyaltyReceiver, feeReceiver, "newRoyaltyReceiver should be different"); + + checkSetNFTRoyaltyReceiverBatch(newRoyaltyReceiver, newFeeNumerator, scenarioCount); + } + + function testSetNFTRoyaltyReceiverBatch3() public { + emit log("Scenario: NFTs 1000, different receiver and fee"); + uint256 scenarioCount = 1000; + uint96 newFeeNumerator = 100; + address newRoyaltyReceiver = makeAddr("newRoyaltyReceiver"); + + // Have a new fee receiver and different feeNumerator + assertNotEq(newFeeNumerator, feeNumerator, "Fee numerator should be different"); + assertNotEq(newRoyaltyReceiver, feeReceiver, "newRoyaltyReceiver should be different"); + + checkSetNFTRoyaltyReceiverBatch(newRoyaltyReceiver, newFeeNumerator, scenarioCount); + } + + function testSetNFTRoyaltyReceiverBatch4() public { + emit log("Scenario: NFTs 10000, different receiver and fee"); + uint256 scenarioCount = 10000; + uint96 newFeeNumerator = 100; + address newRoyaltyReceiver = makeAddr("newRoyaltyReceiver"); + + // Have a new fee receiver and different feeNumerator + assertNotEq(newFeeNumerator, feeNumerator, "Fee numerator should be different"); + assertNotEq(newRoyaltyReceiver, feeReceiver, "newRoyaltyReceiver should be different"); + + checkSetNFTRoyaltyReceiverBatch(newRoyaltyReceiver, newFeeNumerator, scenarioCount); + } + + function testSetNFTRoyaltyReceiverBatch5() public { + emit log("Scenario: NFTs 1000, different fee"); + uint256 scenarioCount = 1000; + uint96 newFeeNumerator = 100; + + // Have a new fee receiver and different feeNumerator + assertNotEq(newFeeNumerator, feeNumerator, "Fee numerator should be different"); + + checkSetNFTRoyaltyReceiverBatch(feeReceiver, newFeeNumerator, scenarioCount); + } + + function testSetNFTRoyaltyReceiverBatch6() public { + emit log("Scenario: NFTs 1000, different receiver"); + uint256 scenarioCount = 1000; + address newRoyaltyReceiver = makeAddr("newRoyaltyReceiver"); + + // Have a new fee receiver and different feeNumerator + assertNotEq(newRoyaltyReceiver, feeReceiver, "newRoyaltyReceiver should be different"); + + checkSetNFTRoyaltyReceiverBatch(newRoyaltyReceiver, feeNumerator, scenarioCount); + } + + + function checkSetNFTRoyaltyReceiverBatch(address newRoyaltyReceiver, uint96 newFeeNumerator, uint256 scenarioCount) private { + // Mint tokens. + uint256 first = mintLots(user3, 100000, scenarioCount); + + uint256[] memory nfts = new uint256[](scenarioCount); + for (uint256 i = 0; i < nfts.length; i++) { + nfts[i] = first + i; + } + + uint256 gasStart = gasleft(); + vm.prank(minter); + erc721.setNFTRoyaltyReceiverBatch(nfts, newRoyaltyReceiver, newFeeNumerator); + uint256 gasEnd = gasleft(); + emit log_named_uint("setNFTRoyaltyReceiverBatch gas", gasStart - gasEnd); + } + + + function mintLots(address _recipient, uint256 _start, uint256 _quantity) public virtual returns (uint256) { uint256[] memory ids = new uint256[](_quantity); for (uint256 i = 0; i < _quantity; i++) { diff --git a/perfTest/token/erc721/ImmutableERC721ByIdPerf.t.sol b/perfTest/token/erc721/ImmutableERC721ByIdPerf.t.sol index 991917ac..0ebdcce0 100644 --- a/perfTest/token/erc721/ImmutableERC721ByIdPerf.t.sol +++ b/perfTest/token/erc721/ImmutableERC721ByIdPerf.t.sol @@ -18,7 +18,7 @@ contract ImmutableERC721ByIdPerfTest is ERC721PerfTest { super.setUpStart(); ImmutableERC721MintByID immutableERC721 = new ImmutableERC721MintByID( - owner, name, symbol, baseURI, contractURI, address(allowlist), feeReceiver, 300 + owner, name, symbol, baseURI, contractURI, address(allowlist), feeReceiver, feeNumerator ); // ImmutableERC721 does not implement the interface, and hence must be cast to the diff --git a/perfTest/token/erc721/ImmutableERC721ByQuantityPerf.t.sol b/perfTest/token/erc721/ImmutableERC721ByQuantityPerf.t.sol index 06139104..f808aa57 100644 --- a/perfTest/token/erc721/ImmutableERC721ByQuantityPerf.t.sol +++ b/perfTest/token/erc721/ImmutableERC721ByQuantityPerf.t.sol @@ -17,7 +17,7 @@ contract ImmutableERC721ByQuantityPerfTest is ERC721ByQuantityPerfTest { super.setUpStart(); ImmutableERC721 immutableERC721 = new ImmutableERC721( - owner, name, symbol, baseURI, contractURI, address(allowlist), feeReceiver, 300 + owner, name, symbol, baseURI, contractURI, address(allowlist), feeReceiver, feeNumerator ); // ImmutableERC721 does not implement the interface, and hence must be cast to the diff --git a/perfTest/token/erc721/ImmutableERC721V2ByQuantityPerf.t.sol b/perfTest/token/erc721/ImmutableERC721V2ByQuantityPerf.t.sol index 2589b262..38af3611 100644 --- a/perfTest/token/erc721/ImmutableERC721V2ByQuantityPerf.t.sol +++ b/perfTest/token/erc721/ImmutableERC721V2ByQuantityPerf.t.sol @@ -17,7 +17,7 @@ contract ImmutableERC721V2ByQuantityPerfTest is ERC721ByQuantityPerfTest { super.setUpStart(); ImmutableERC721V2 immutableERC721 = new ImmutableERC721V2( - owner, name, symbol, baseURI, contractURI, address(allowlist), feeReceiver, 300 + owner, name, symbol, baseURI, contractURI, address(allowlist), feeReceiver, feeNumerator ); // ImmutableERC721 does not implement the interface, and hence must be cast to the