feat: introduce custom `StatusMint()` events (#18)

This commit is contained in:
r4bbit 2023-10-06 10:21:27 +02:00 committed by GitHub
parent ff01f8e818
commit ea7ef0ef61
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 59 additions and 10 deletions

View File

@ -5,8 +5,8 @@ AddEntryTest:test_RevertWhen_SenderIsNotTokenDeployer() (gas: 14827)
CollectibleV1Test:test_Deployment() (gas: 36386) CollectibleV1Test:test_Deployment() (gas: 36386)
CommunityERC20Test:test_Deployment() (gas: 27659) CommunityERC20Test:test_Deployment() (gas: 27659)
CommunityTokenDeployerTest:test_Deployment() (gas: 14805) CommunityTokenDeployerTest:test_Deployment() (gas: 14805)
CreateTest:test_Create() (gas: 2251272) CreateTest:test_Create() (gas: 2269916)
CreateTest:test_Create() (gas: 2548179) CreateTest:test_Create() (gas: 2568994)
CreateTest:test_RevertWhen_InvalidOwnerTokenAddress() (gas: 15523) CreateTest:test_RevertWhen_InvalidOwnerTokenAddress() (gas: 15523)
CreateTest:test_RevertWhen_InvalidReceiverAddress() (gas: 15656) CreateTest:test_RevertWhen_InvalidReceiverAddress() (gas: 15656)
CreateTest:test_RevertWhen_InvalidSignerPublicKey() (gas: 17057) CreateTest:test_RevertWhen_InvalidSignerPublicKey() (gas: 17057)
@ -16,14 +16,14 @@ CreateTest:test_RevertWhen_SenderIsNotTokenDeployer() (gas: 16421)
CreateTest:test_RevertWhen_SenderIsNotTokenDeployer() (gas: 16524) CreateTest:test_RevertWhen_SenderIsNotTokenDeployer() (gas: 16524)
DeployContracts:test() (gas: 120) DeployContracts:test() (gas: 120)
DeployOwnerAndMasterToken:test() (gas: 120) DeployOwnerAndMasterToken:test() (gas: 120)
DeployTest:test_Deploy() (gas: 4872105) DeployTest:test_Deploy() (gas: 4911563)
DeployTest:test_Deployment() (gas: 14947) DeployTest:test_Deployment() (gas: 14947)
DeployTest:test_RevertWhen_AlreadyDeployed() (gas: 4868335) DeployTest:test_RevertWhen_AlreadyDeployed() (gas: 4907793)
DeployTest:test_RevertWhen_InvalidCommunityAddress() (gas: 51385) DeployTest:test_RevertWhen_InvalidCommunityAddress() (gas: 51385)
DeployTest:test_RevertWhen_InvalidDeployerAddress() (gas: 55272) DeployTest:test_RevertWhen_InvalidDeployerAddress() (gas: 55272)
DeployTest:test_RevertWhen_InvalidDeploymentSignature() (gas: 65617) DeployTest:test_RevertWhen_InvalidDeploymentSignature() (gas: 65617)
DeployTest:test_RevertWhen_InvalidSignerPublicKey() (gas: 53433) DeployTest:test_RevertWhen_InvalidSignerPublicKey() (gas: 53433)
DeployTest:test_RevertWhen_InvalidTokenMetadata() (gas: 2671695) DeployTest:test_RevertWhen_InvalidTokenMetadata() (gas: 2692510)
DeploymentTest:test_Deployment() (gas: 14671) DeploymentTest:test_Deployment() (gas: 14671)
DeploymentTest:test_Deployment() (gas: 14671) DeploymentTest:test_Deployment() (gas: 14671)
DeploymentTest:test_Deployment() (gas: 17295) DeploymentTest:test_Deployment() (gas: 17295)
@ -31,16 +31,17 @@ GetEntryTest:test_ReturnZeroAddressIfEntryDoesNotExist() (gas: 11906)
MintToTest:test_Deployment() (gas: 27681) MintToTest:test_Deployment() (gas: 27681)
MintToTest:test_Deployment() (gas: 36386) MintToTest:test_Deployment() (gas: 36386)
MintToTest:test_Deployment() (gas: 83220) MintToTest:test_Deployment() (gas: 83220)
MintToTest:test_MintTo() (gas: 506888) MintToTest:test_MintTo() (gas: 178173)
MintToTest:test_MintTo() (gas: 526242)
MintToTest:test_RevertWhen_AddressesAndAmountsAreNotEqualLength() (gas: 29695) MintToTest:test_RevertWhen_AddressesAndAmountsAreNotEqualLength() (gas: 29695)
MintToTest:test_RevertWhen_MaxSupplyIsReached() (gas: 20653) MintToTest:test_RevertWhen_MaxSupplyIsReached() (gas: 20653)
MintToTest:test_RevertWhen_MaxSupplyIsReached() (gas: 502655) MintToTest:test_RevertWhen_MaxSupplyIsReached() (gas: 511039)
MintToTest:test_RevertWhen_MaxSupplyReached() (gas: 128905) MintToTest:test_RevertWhen_MaxSupplyReached() (gas: 134821)
MintToTest:test_RevertWhen_SenderIsNotOwner() (gas: 31544) MintToTest:test_RevertWhen_SenderIsNotOwner() (gas: 31544)
OwnerTokenTest:test_Deployment() (gas: 83220) OwnerTokenTest:test_Deployment() (gas: 83220)
RemoteBurnTest:test_Deployment() (gas: 36386) RemoteBurnTest:test_Deployment() (gas: 36386)
RemoteBurnTest:test_Deployment() (gas: 83242) RemoteBurnTest:test_Deployment() (gas: 83242)
RemoteBurnTest:test_RemoteBurn() (gas: 450780) RemoteBurnTest:test_RemoteBurn() (gas: 459164)
RemoteBurnTest:test_RevertWhen_RemoteBurn() (gas: 14768) RemoteBurnTest:test_RevertWhen_RemoteBurn() (gas: 14768)
RemoteBurnTest:test_RevertWhen_SenderIsNotOwner() (gas: 20379) RemoteBurnTest:test_RevertWhen_SenderIsNotOwner() (gas: 20379)
SetCommunityTokenDeployerAddressTest:test_RevertWhen_InvalidTokenDeployerAddress() (gas: 12941) SetCommunityTokenDeployerAddressTest:test_RevertWhen_InvalidTokenDeployerAddress() (gas: 12941)
@ -57,7 +58,7 @@ SetMasterTokenFactoryAddressTest:test_SetOwnerTokenFactoryAddress() (gas: 22861)
SetMaxSupplyTest:test_Deployment() (gas: 27659) SetMaxSupplyTest:test_Deployment() (gas: 27659)
SetMaxSupplyTest:test_Deployment() (gas: 83242) SetMaxSupplyTest:test_Deployment() (gas: 83242)
SetMaxSupplyTest:test_RevertWhen_CalledBecauseMaxSupplyIsLocked() (gas: 14327) SetMaxSupplyTest:test_RevertWhen_CalledBecauseMaxSupplyIsLocked() (gas: 14327)
SetMaxSupplyTest:test_RevertWhen_MaxSupplyLowerThanTotalSupply() (gas: 155732) SetMaxSupplyTest:test_RevertWhen_MaxSupplyLowerThanTotalSupply() (gas: 163620)
SetMaxSupplyTest:test_RevertWhen_SenderIsNotOwner() (gas: 12527) SetMaxSupplyTest:test_RevertWhen_SenderIsNotOwner() (gas: 12527)
SetMaxSupplyTest:test_RevertWhen_SenderIsNotOwner() (gas: 21402) SetMaxSupplyTest:test_RevertWhen_SenderIsNotOwner() (gas: 21402)
SetMaxSupplyTest:test_SetMaxSupply() (gas: 23955) SetMaxSupplyTest:test_SetMaxSupply() (gas: 23955)

View File

@ -16,6 +16,15 @@ abstract contract BaseToken is Context, ERC721Enumerable, CommunityOwnable {
error BaseToken_NotRemoteBurnable(); error BaseToken_NotRemoteBurnable();
error BaseToken_NotTransferable(); error BaseToken_NotTransferable();
/// @notice Emits a custom mint event for Status applications to listen to
/// @dev This is doubling the {Transfer} event from ERC721 but we need to emit this
/// so Status applications have a way to easily distinguish between transactions that have
/// a similar event footprint but are semantically different.
/// @param from The address that minted the token
/// @param to The address that received the token
/// @param tokenId The token ID that was minted
event StatusMint(address indexed from, address indexed to, uint256 indexed tokenId);
// State variables // State variables
Counters.Counter private _tokenIdTracker; Counters.Counter private _tokenIdTracker;
@ -119,6 +128,7 @@ abstract contract BaseToken is Context, ERC721Enumerable, CommunityOwnable {
// can be burned so we use a separate counter. // can be burned so we use a separate counter.
for (uint256 i = 0; i < addresses.length; i++) { for (uint256 i = 0; i < addresses.length; i++) {
_safeMint(addresses[i], _tokenIdTracker.current(), ""); _safeMint(addresses[i], _tokenIdTracker.current(), "");
emit StatusMint(address(0), addresses[i], _tokenIdTracker.current());
_tokenIdTracker.increment(); _tokenIdTracker.increment();
} }
} }

View File

@ -11,6 +11,15 @@ contract CommunityERC20 is Context, Ownable, ERC20, CommunityOwnable {
error CommunityERC20_MaxSupplyReached(); error CommunityERC20_MaxSupplyReached();
error CommunityERC20_MismatchingAddressesAndAmountsLengths(); error CommunityERC20_MismatchingAddressesAndAmountsLengths();
/// @notice Emits a custom mint event for Status applications to listen to
/// @dev This is doubling the {Transfer} event from ERC20 but we need to emit this
/// so Status applications have a way to easily distinguish between transactions that have
/// a similar event footprint but are semantically different.
/// @param from The address that minted the token
/// @param to The address that received the token
/// @param amount The amount that was minted
event StatusMint(address indexed from, address indexed to, uint256 indexed amount);
/** /**
* If we want unlimited total supply we should set maxSupply to 2^256-1. * If we want unlimited total supply we should set maxSupply to 2^256-1.
*/ */
@ -60,6 +69,7 @@ contract CommunityERC20 is Context, Ownable, ERC20, CommunityOwnable {
revert CommunityERC20_MaxSupplyReached(); revert CommunityERC20_MaxSupplyReached();
} }
_mint(addresses[i], amount); _mint(addresses[i], amount);
emit StatusMint(address(0), addresses[i], amount);
} }
} }

View File

@ -56,6 +56,8 @@ contract CollectibleV1Test is Test {
} }
contract MintToTest is CollectibleV1Test { contract MintToTest is CollectibleV1Test {
event StatusMint(address indexed from, address indexed to, uint256 indexed tokenId);
function setUp() public virtual override { function setUp() public virtual override {
CollectibleV1Test.setUp(); CollectibleV1Test.setUp();
} }
@ -84,6 +86,10 @@ contract MintToTest is CollectibleV1Test {
assertEq(collectibleV1.balanceOf(accounts[i]), 0); assertEq(collectibleV1.balanceOf(accounts[i]), 0);
} }
vm.prank(deployer); vm.prank(deployer);
for (uint8 i = 0; i < length; i++) {
vm.expectEmit(true, true, true, true);
emit StatusMint(address(0), accounts[i], i);
}
collectibleV1.mintTo(accounts); collectibleV1.mintTo(accounts);
for (uint8 i = 0; i < length; i++) { for (uint8 i = 0; i < length; i++) {
assertEq(collectibleV1.balanceOf(accounts[i]), 1); assertEq(collectibleV1.balanceOf(accounts[i]), 1);

View File

@ -84,6 +84,8 @@ contract SetMaxSupplyTest is CommunityERC20Test {
} }
contract MintToTest is CommunityERC20Test { contract MintToTest is CommunityERC20Test {
event StatusMint(address indexed from, address indexed to, uint256 indexed amount);
function setUp() public virtual override { function setUp() public virtual override {
CommunityERC20Test.setUp(); CommunityERC20Test.setUp();
} }
@ -110,4 +112,24 @@ contract MintToTest is CommunityERC20Test {
vm.prank(deployer); vm.prank(deployer);
communityToken.mintTo(accounts, amounts); communityToken.mintTo(accounts, amounts);
} }
function test_MintTo() public {
uint256[] memory amounts = new uint256[](4);
amounts[0] = 50;
amounts[1] = 25;
amounts[2] = 20;
amounts[3] = 5;
vm.startPrank(deployer);
for (uint8 i = 0; i < accounts.length; i++) {
vm.expectEmit(true, true, true, true);
emit StatusMint(address(0), accounts[i], amounts[i]);
}
communityToken.mintTo(accounts, amounts);
assertEq(communityToken.balanceOf(accounts[0]), 50);
assertEq(communityToken.balanceOf(accounts[1]), 25);
assertEq(communityToken.balanceOf(accounts[2]), 20);
assertEq(communityToken.balanceOf(accounts[3]), 5);
}
} }