Skip to content

Commit

Permalink
Add ability to batch multiple frame mints into one transaction
Browse files Browse the repository at this point in the history
  • Loading branch information
wwhchung committed Jan 31, 2024
1 parent a28391c commit c56d6de
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -116,15 +116,18 @@ contract ERC1155FrameLazyClaim is IERC165, IERC1155FrameLazyClaim, ICreatorExten
}

/**
* See {ILazyPayableClaim-mint}.
* See {IFrameLazyClaim-mint}.
*/
function mint(address creatorContractAddress, uint256 instanceId, Recipient[] calldata recipients) external override {
Claim storage claim = _getClaim(creatorContractAddress, instanceId);
function mint(Mint[] calldata mints) external override {
_validateMint();
// Do mint
_mintClaim(creatorContractAddress, claim, recipients);
for (uint256 i; i < mints.length;) {
Mint calldata mintData = mints[i];
Claim storage claim = _getClaim(mintData.creatorContractAddress, mintData.instanceId);
_mintClaim(mintData.creatorContractAddress, claim, mintData.recipients);
emit FrameClaimMint(mintData.creatorContractAddress, mintData.instanceId);
unchecked{ ++i; }
}

emit FrameClaimMint(creatorContractAddress, instanceId);
}

/**
Expand Down
12 changes: 8 additions & 4 deletions packages/manifold/contracts/frameclaims/IFrameLazyClaim.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ interface IFrameLazyClaim {
event FrameClaimUpdated(address indexed creatorContract, uint256 indexed instanceId);
event FrameClaimMint(address indexed creatorContract, uint256 indexed instanceId);

struct Mint {
address creatorContractAddress;
uint256 instanceId;
Recipient[] recipients;
}

struct Recipient {
address receiver;
uint256 amount;
Expand All @@ -29,10 +35,8 @@ interface IFrameLazyClaim {

/**
* @notice allowlist minting based on signatures
* @param creatorContractAddress the creator contract address
* @param instanceId the claim instanceId for the creator contract
* @param recipients the recipients to mint to
* @param mints the mint instructions
*/
function mint(address creatorContractAddress, uint256 instanceId, Recipient[] calldata recipients) external;
function mint(Mint[] calldata mints) external;

}
67 changes: 65 additions & 2 deletions packages/manifold/test/frameclaims/ERC1155FrameLazyClaim.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,14 @@ contract ERC1155FrameLazyClaimTest is Test {
receiver: other,
amount: 1
});
IFrameLazyClaim.Mint[] memory mints = new IFrameLazyClaim.Mint[](1);
mints[0] = IFrameLazyClaim.Mint({
creatorContractAddress: address(creatorCore),
instanceId: 1,
recipients: recipients
});
vm.expectRevert(IFrameLazyClaim.InvalidSignature.selector);
example.mint(address(creatorCore), 1, recipients);
example.mint(mints);
vm.stopPrank();
}

Expand All @@ -155,10 +161,67 @@ contract ERC1155FrameLazyClaimTest is Test {
receiver: owner,
amount: 1
});
example.mint(address(creatorCore), 1, recipients);
IFrameLazyClaim.Mint[] memory mints = new IFrameLazyClaim.Mint[](1);
mints[0] = IFrameLazyClaim.Mint({
creatorContractAddress: address(creatorCore),
instanceId: 1,
recipients: recipients
});
example.mint(mints);
vm.stopPrank();

assertEq(2, creatorCore.balanceOf(other, 1));
assertEq(1, creatorCore.balanceOf(owner, 1));
}

function testMultipleMint() public {
vm.startPrank(creator);
IERC1155FrameLazyClaim.ClaimParameters memory claimP1 = IERC1155FrameLazyClaim.ClaimParameters({
location: "arweaveHash1",
storageProtocol: IFrameLazyClaim.StorageProtocol.ARWEAVE
});

example.initializeClaim(address(creatorCore), 1, claimP1);
IERC1155FrameLazyClaim.ClaimParameters memory claimP2 = IERC1155FrameLazyClaim.ClaimParameters({
location: "arweaveHash2",
storageProtocol: IFrameLazyClaim.StorageProtocol.ARWEAVE
});

example.initializeClaim(address(creatorCore), 2, claimP2);

vm.stopPrank();

vm.startPrank(signer);
IFrameLazyClaim.Recipient[] memory recipients1 = new IFrameLazyClaim.Recipient[](2);
recipients1[0] = IFrameLazyClaim.Recipient({
receiver: other,
amount: 2
});
recipients1[1] = IFrameLazyClaim.Recipient({
receiver: owner,
amount: 1
});
IFrameLazyClaim.Recipient[] memory recipients2 = new IFrameLazyClaim.Recipient[](1);
recipients2[0] = IFrameLazyClaim.Recipient({
receiver: other,
amount: 3
});
IFrameLazyClaim.Mint[] memory mints = new IFrameLazyClaim.Mint[](2);
mints[0] = IFrameLazyClaim.Mint({
creatorContractAddress: address(creatorCore),
instanceId: 1,
recipients: recipients1
});
mints[1] = IFrameLazyClaim.Mint({
creatorContractAddress: address(creatorCore),
instanceId: 2,
recipients: recipients2
});
example.mint(mints);
vm.stopPrank();

assertEq(2, creatorCore.balanceOf(other, 1));
assertEq(1, creatorCore.balanceOf(owner, 1));
assertEq(3, creatorCore.balanceOf(other, 2));
}
}

0 comments on commit c56d6de

Please sign in to comment.