Skip to content
This repository was archived by the owner on Aug 20, 2025. It is now read-only.

Commit 52dcff9

Browse files
authored
Merge pull request #18 from ProjectOpenSea/ryan/add-burn
add burn fns to shipyard redeemable
2 parents 0aaf396 + e13d712 commit 52dcff9

File tree

5 files changed

+106
-1
lines changed

5 files changed

+106
-1
lines changed

src/ERC1155ShipyardRedeemable.sol

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ contract ERC1155ShipyardRedeemable is ERC1155ShipyardContractMetadata, ERC7498NF
2323
DynamicTraits.setTrait(tokenId, traitKey, value);
2424
}
2525

26+
function burn(address from, uint256 id, uint256 amount) public {
27+
_burn(msg.sender, from, id, amount);
28+
}
29+
30+
function batchBurn(address from, uint256[] calldata ids, uint256[] calldata amounts) public {
31+
_batchBurn(msg.sender, from, ids, amounts);
32+
}
33+
2634
function _useInternalBurn() internal pure virtual override returns (bool) {
2735
return true;
2836
}

src/ERC721ShipyardRedeemable.sol

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ contract ERC721ShipyardRedeemable is ERC721ShipyardContractMetadata, ERC7498NFTR
4848
traitValues = DynamicTraits.getTraitValues(tokenId, traitKeys);
4949
}
5050

51+
function burn(uint256 tokenId) public {
52+
_burn(msg.sender, tokenId);
53+
}
54+
5155
function _useInternalBurn() internal pure virtual override returns (bool) {
5256
return true;
5357
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.19;
3+
4+
import {Solarray} from "solarray/Solarray.sol";
5+
import {BaseRedeemablesTest} from "./utils/BaseRedeemablesTest.sol";
6+
import {ERC1155} from "solady/src/tokens/ERC1155.sol";
7+
import {ERC1155ShipyardRedeemableOwnerMintable} from "../src/test/ERC1155ShipyardRedeemableOwnerMintable.sol";
8+
9+
contract TestERC1155ShipyardRedeemable is BaseRedeemablesTest {
10+
event TransferBatch(
11+
address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] amounts
12+
);
13+
14+
function testBurn() public {
15+
uint256 tokenId = 1;
16+
ERC1155ShipyardRedeemableOwnerMintable token = new ERC1155ShipyardRedeemableOwnerMintable("Test", "TEST");
17+
address fred = makeAddr("fred");
18+
_mintToken(address(token), tokenId, fred);
19+
20+
vm.expectRevert(ERC1155.InsufficientBalance.selector);
21+
token.burn(address(this), tokenId, 1);
22+
23+
vm.expectEmit(true, true, true, true);
24+
emit TransferSingle(fred, fred, address(0), tokenId, 1);
25+
vm.prank(fred);
26+
token.burn(fred, tokenId, 1);
27+
28+
vm.prank(fred);
29+
vm.expectRevert(ERC1155.InsufficientBalance.selector);
30+
token.burn(fred, tokenId + 1, 1);
31+
32+
_mintToken(address(token), tokenId + 1, fred);
33+
_mintToken(address(token), tokenId + 2, fred);
34+
35+
uint256[] memory ids = Solarray.uint256s(tokenId + 1, tokenId + 2);
36+
uint256[] memory amounts = Solarray.uint256s(1, 1);
37+
vm.expectRevert(ERC1155.NotOwnerNorApproved.selector);
38+
token.batchBurn(fred, ids, amounts);
39+
40+
vm.prank(fred);
41+
token.setApprovalForAll(address(this), true);
42+
43+
vm.expectEmit(true, true, true, true);
44+
emit TransferBatch(address(this), fred, address(0), ids, amounts);
45+
token.batchBurn(fred, ids, amounts);
46+
}
47+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.19;
3+
4+
import {Test} from "forge-std/Test.sol";
5+
import {ERC721} from "solady/src/tokens/ERC721.sol";
6+
import {ERC721ShipyardRedeemableOwnerMintable} from "../src/test/ERC721ShipyardRedeemableOwnerMintable.sol";
7+
8+
contract TestERC721ShipyardRedeemable is Test {
9+
// This Transfer event is different than the one in BaseOrderTest, since `id` is indexed.
10+
// We don't inherit BaseRedeemablesTest to avoid this conflict.
11+
// For more details see https://github.com/ethereum/solidity/issues/4168#issuecomment-1819912098
12+
event Transfer(address indexed from, address indexed to, uint256 indexed id);
13+
14+
function testBurn() public {
15+
uint256 tokenId = 1;
16+
ERC721ShipyardRedeemableOwnerMintable token = new ERC721ShipyardRedeemableOwnerMintable("Test", "TEST");
17+
address fred = makeAddr("fred");
18+
_mintToken(address(token), tokenId, fred);
19+
20+
vm.expectRevert(ERC721.NotOwnerNorApproved.selector);
21+
token.burn(tokenId);
22+
23+
vm.expectEmit(true, true, false, false);
24+
emit Transfer(fred, address(0), tokenId);
25+
vm.prank(fred);
26+
token.burn(tokenId);
27+
28+
vm.expectRevert(ERC721.TokenDoesNotExist.selector);
29+
token.burn(tokenId + 1);
30+
31+
_mintToken(address(token), tokenId + 1, fred);
32+
vm.expectRevert(ERC721.NotOwnerNorApproved.selector);
33+
token.burn(tokenId + 1);
34+
35+
vm.prank(fred);
36+
token.setApprovalForAll(address(this), true);
37+
38+
vm.expectEmit(true, true, false, false);
39+
emit Transfer(fred, address(0), tokenId + 1);
40+
token.burn(tokenId + 1);
41+
}
42+
43+
function _mintToken(address token, uint256 tokenId, address recipient) internal {
44+
ERC721ShipyardRedeemableOwnerMintable(address(token)).mint(recipient, tokenId);
45+
}
46+
}

test/ERC7498-MultiRedeem.t.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ contract ERC7498_MultiRedeem is BaseRedeemablesTest {
9191
context.erc7498Token.redeem(tokenIds, address(this), extraData);
9292

9393
_checkTokenDoesNotExist(address(context.erc7498Token), tokenId);
94-
_checkTokenSentToBurnAddress(secondRedeemTokenAddress, tokenId);
94+
_checkTokenDoesNotExist(secondRedeemTokenAddress, tokenId);
9595
assertEq(receiveToken.ownerOf(1), address(this));
9696
assertEq(receiveToken.balanceOf(address(this)), 1);
9797
}

0 commit comments

Comments
 (0)