Skip to content
This repository has been archived by the owner on Nov 17, 2023. It is now read-only.

Commit

Permalink
Merge pull request #19 from ourzora/first-minter
Browse files Browse the repository at this point in the history
refactor: add first minter param to abstract handlers
  • Loading branch information
kulkarohan authored Aug 21, 2023
2 parents 352643a + e133c8e commit 67dd248
Show file tree
Hide file tree
Showing 8 changed files with 50 additions and 21 deletions.
7 changes: 4 additions & 3 deletions src/abstract/ERC1155/ERC1155Rewards.sol
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,19 @@ abstract contract ERC1155Rewards is RewardSplits {
uint256 numTokens,
address creator,
address createReferral,
address mintReferral
address mintReferral,
address firstMinter
) internal returns (uint256) {
uint256 totalReward = computeTotalReward(numTokens);

if (msgValue < totalReward) {
revert INVALID_ETH_AMOUNT();
} else if (msgValue == totalReward) {
_depositFreeMintRewards(totalReward, numTokens, creator, createReferral, mintReferral);
_depositFreeMintRewards(totalReward, numTokens, creator, createReferral, mintReferral, firstMinter);

return 0;
} else {
_depositPaidMintRewards(totalReward, numTokens, creator, createReferral, mintReferral);
_depositPaidMintRewards(totalReward, numTokens, createReferral, mintReferral, firstMinter);

unchecked {
return msgValue - totalReward;
Expand Down
2 changes: 2 additions & 0 deletions src/abstract/ERC1155/ERC1155RewardsStorageV1.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,6 @@ pragma solidity 0.8.17;

contract ERC1155RewardsStorageV1 {
mapping(uint256 => address) public createReferrals;

mapping(uint256 => address) public firstMinters;
}
14 changes: 11 additions & 3 deletions src/abstract/ERC721/ERC721Rewards.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,31 @@ import {RewardSplits} from "../RewardSplits.sol";
abstract contract ERC721Rewards is RewardSplits {
constructor(address _protocolRewards, address _zoraRewardRecipient) payable RewardSplits(_protocolRewards, _zoraRewardRecipient) {}

function _handleRewards(uint256 msgValue, uint256 numTokens, uint256 salePrice, address creator, address createReferral, address mintReferral) internal {
function _handleRewards(
uint256 msgValue,
uint256 numTokens,
uint256 salePrice,
address creator,
address createReferral,
address mintReferral,
address firstMinter
) internal {
uint256 totalReward = computeTotalReward(numTokens);

if (salePrice == 0) {
if (msgValue != totalReward) {
revert INVALID_ETH_AMOUNT();
}

_depositFreeMintRewards(totalReward, numTokens, creator, createReferral, mintReferral);
_depositFreeMintRewards(totalReward, numTokens, creator, createReferral, mintReferral, firstMinter);
} else {
uint256 totalSale = numTokens * salePrice;

if (msgValue != (totalReward + totalSale)) {
revert INVALID_ETH_AMOUNT();
}

_depositPaidMintRewards(totalReward, numTokens, creator, createReferral, mintReferral);
_depositPaidMintRewards(totalReward, numTokens, createReferral, mintReferral, firstMinter);
}
}
}
2 changes: 2 additions & 0 deletions src/abstract/ERC721/ERC721RewardsStorageV1.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,6 @@ pragma solidity 0.8.17;

abstract contract ERC721RewardsStorageV1 {
address public createReferral;

address public firstMinter;
}
15 changes: 11 additions & 4 deletions src/abstract/RewardSplits.sol
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,14 @@ abstract contract RewardSplits {
});
}

function _depositFreeMintRewards(uint256 totalReward, uint256 numTokens, address creator, address createReferral, address mintReferral) internal {
function _depositFreeMintRewards(
uint256 totalReward,
uint256 numTokens,
address creator,
address createReferral,
address mintReferral,
address firstMinter
) internal {
RewardsSettings memory settings = computeFreeMintRewards(numTokens);

if (createReferral == address(0)) {
Expand All @@ -87,14 +94,14 @@ abstract contract RewardSplits {
settings.createReferralReward,
mintReferral,
settings.mintReferralReward,
creator,
firstMinter,
settings.firstMinterReward,
zoraRewardRecipient,
settings.zoraReward
);
}

function _depositPaidMintRewards(uint256 totalReward, uint256 numTokens, address creator, address createReferral, address mintReferral) internal {
function _depositPaidMintRewards(uint256 totalReward, uint256 numTokens, address createReferral, address mintReferral, address firstMinter) internal {
RewardsSettings memory settings = computePaidMintRewards(numTokens);

if (createReferral == address(0)) {
Expand All @@ -112,7 +119,7 @@ abstract contract RewardSplits {
settings.createReferralReward,
mintReferral,
settings.mintReferralReward,
creator,
firstMinter,
settings.firstMinterReward,
zoraRewardRecipient,
settings.zoraReward
Expand Down
10 changes: 6 additions & 4 deletions test/unit/ERC1155Rewards.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,10 @@ contract ERC1155RewardsTest is ProtocolRewardsTest {
RewardsSettings memory settings = mockERC1155.computeFreeMintRewards(numTokens);

assertEq(protocolRewards.totalSupply(), totalReward);
assertEq(protocolRewards.balanceOf(creator), settings.creatorReward + settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(creator), settings.creatorReward);
assertEq(protocolRewards.balanceOf(createReferral), settings.createReferralReward);
assertEq(protocolRewards.balanceOf(mintReferral), settings.mintReferralReward);
assertEq(protocolRewards.balanceOf(collector), settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(zora), settings.zoraReward);
}

Expand All @@ -52,9 +53,9 @@ contract ERC1155RewardsTest is ProtocolRewardsTest {
RewardsSettings memory settings = mockERC1155.computePaidMintRewards(numTokens);

assertEq(protocolRewards.totalSupply(), totalReward);
assertEq(protocolRewards.balanceOf(creator), settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(createReferral), settings.createReferralReward);
assertEq(protocolRewards.balanceOf(mintReferral), settings.mintReferralReward);
assertEq(protocolRewards.balanceOf(collector), settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(zora), settings.zoraReward);
}

Expand All @@ -73,7 +74,8 @@ contract ERC1155RewardsTest is ProtocolRewardsTest {
RewardsSettings memory settings = mockERC1155.computeFreeMintRewards(numTokens);

assertEq(protocolRewards.totalSupply(), totalReward);
assertEq(protocolRewards.balanceOf(creator), settings.creatorReward + settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(creator), settings.creatorReward);
assertEq(protocolRewards.balanceOf(collector), settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(zora), settings.zoraReward + settings.mintReferralReward + settings.createReferralReward);
}

Expand All @@ -97,7 +99,7 @@ contract ERC1155RewardsTest is ProtocolRewardsTest {
RewardsSettings memory settings = mockERC1155.computePaidMintRewards(numTokens);

assertEq(protocolRewards.totalSupply(), totalReward);
assertEq(protocolRewards.balanceOf(creator), settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(collector), settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(zora), settings.zoraReward + settings.mintReferralReward + settings.createReferralReward);
}

Expand Down
13 changes: 8 additions & 5 deletions test/unit/ERC721Rewards.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,10 @@ contract ERC721RewardsTest is ProtocolRewardsTest {
RewardsSettings memory settings = mockERC721.computeFreeMintRewards(numTokens);

assertEq(protocolRewards.totalSupply(), totalReward);
assertEq(protocolRewards.balanceOf(creator), settings.creatorReward + settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(creator), settings.creatorReward);
assertEq(protocolRewards.balanceOf(createReferral), settings.createReferralReward);
assertEq(protocolRewards.balanceOf(mintReferral), settings.mintReferralReward);
assertEq(protocolRewards.balanceOf(collector), settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(zora), settings.zoraReward);
}

Expand All @@ -76,9 +77,9 @@ contract ERC721RewardsTest is ProtocolRewardsTest {
RewardsSettings memory settings = mockERC721.computePaidMintRewards(numTokens);

assertEq(protocolRewards.totalSupply(), totalReward);
assertEq(protocolRewards.balanceOf(creator), settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(createReferral), settings.createReferralReward);
assertEq(protocolRewards.balanceOf(mintReferral), settings.mintReferralReward);
assertEq(protocolRewards.balanceOf(collector), settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(zora), settings.zoraReward);
}

Expand All @@ -97,7 +98,8 @@ contract ERC721RewardsTest is ProtocolRewardsTest {
RewardsSettings memory settings = mockERC721.computeFreeMintRewards(numTokens);

assertEq(protocolRewards.totalSupply(), totalReward);
assertEq(protocolRewards.balanceOf(creator), settings.creatorReward + settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(creator), settings.creatorReward);
assertEq(protocolRewards.balanceOf(collector), settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(zora), settings.zoraReward + settings.mintReferralReward + settings.createReferralReward);
}

Expand All @@ -121,7 +123,7 @@ contract ERC721RewardsTest is ProtocolRewardsTest {
RewardsSettings memory settings = mockERC721.computePaidMintRewards(numTokens);

assertEq(protocolRewards.totalSupply(), totalReward);
assertEq(protocolRewards.balanceOf(creator), settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(collector), settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(zora), settings.zoraReward + settings.mintReferralReward + settings.createReferralReward);
}

Expand All @@ -136,7 +138,8 @@ contract ERC721RewardsTest is ProtocolRewardsTest {

mockERC721.mintWithRewards{value: totalValue}(collector, numTokens, mintReferral);

assertEq(protocolRewards.balanceOf(address(mockERC721)), settings.creatorReward + settings.firstMinterReward);
assertEq(protocolRewards.balanceOf(address(mockERC721)), settings.creatorReward);
assertEq(protocolRewards.balanceOf(collector), settings.firstMinterReward);
}

function testRevert721FreeMintInvalidEth(uint16 numTokens) public {
Expand Down
8 changes: 6 additions & 2 deletions test/utils/MockNFTs.sol
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ contract MockERC721 is ERC721, ERC721Rewards, ERC721RewardsStorageV1 {
}

function mintWithRewards(address to, uint256 numTokens, address mintReferral) external payable {
_handleRewards(msg.value, numTokens, salePrice, creator != address(0) ? creator : address(this), createReferral, mintReferral);
if (firstMinter == address(0)) firstMinter = to;

_handleRewards(msg.value, numTokens, salePrice, creator != address(0) ? creator : address(this), createReferral, mintReferral, firstMinter);

for (uint256 i; i < numTokens; ++i) {
_mint(to, currentTokenId++);
Expand Down Expand Up @@ -58,7 +60,9 @@ contract MockERC1155 is ERC1155, ERC1155Rewards, ERC1155RewardsStorageV1 {
}

function mintWithRewards(address to, uint256 tokenId, uint256 numTokens, address mintReferral) external payable {
uint256 remainingValue = _handleRewardsAndGetValueSent(msg.value, numTokens, creator, createReferrals[tokenId], mintReferral);
if (firstMinters[tokenId] == address(0)) firstMinters[tokenId] = to;

uint256 remainingValue = _handleRewardsAndGetValueSent(msg.value, numTokens, creator, createReferrals[tokenId], mintReferral, firstMinters[tokenId]);

uint256 expectedRemainingValue = salePrice * numTokens;

Expand Down

0 comments on commit 67dd248

Please sign in to comment.