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

Commit 1bd3b93

Browse files
authored
Merge pull request #16 from ProjectOpenSea/ryan/coverage
Coverage and misc updates
2 parents 22e1e6b + f20a066 commit 1bd3b93

File tree

45 files changed

+1584
-999
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1584
-999
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Compiler files
22
cache/
33
out/
4+
coverage/
5+
lcov.info
46

57
# Ignores broadcast logs
68
/broadcast

script/DeployAndConfigure1155Receive.s.sol

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@ import {Script} from "forge-std/Script.sol";
55
import {Test} from "forge-std/Test.sol";
66
import {ItemType} from "seaport-types/src/lib/ConsiderationEnums.sol";
77
import {OfferItem, ConsiderationItem} from "seaport-types/src/lib/ConsiderationStructs.sol";
8-
import {CampaignParams, CampaignRequirements} from "../src/lib/RedeemablesStructs.sol";
8+
import {Campaign, CampaignParams, CampaignRequirements} from "../src/lib/RedeemablesStructs.sol";
99
import {BURN_ADDRESS} from "../src/lib/RedeemablesConstants.sol";
10-
import {ERC721RedemptionMintable} from "../src/extensions/ERC721RedemptionMintable.sol";
11-
import {ERC721OwnerMintable} from "../src/test/ERC721OwnerMintable.sol";
10+
import {ERC721ShipyardRedeemableMintable} from "../src/extensions/ERC721ShipyardRedeemableMintable.sol";
1211
import {ERC1155ShipyardRedeemableMintable} from "../src/extensions/ERC1155ShipyardRedeemableMintable.sol";
1312

1413
contract DeployAndConfigure1155Receive is Script, Test {
@@ -60,18 +59,18 @@ contract DeployAndConfigure1155Receive is Script, Test {
6059
requirements[0].consideration = consideration;
6160

6261
CampaignParams memory params = CampaignParams({
63-
requirements: requirements,
64-
signer: address(0),
6562
startTime: 0,
6663
endTime: 0,
6764
maxCampaignRedemptions: 1_000,
68-
manager: msg.sender
65+
manager: msg.sender,
66+
signer: address(0)
6967
});
70-
receiveToken.createCampaign(params, "ipfs://QmQjubc6guHReNW5Es5ZrgDtJRwXk2Aia7BkVoLJGaCRqP");
68+
Campaign memory campaign = Campaign({params: params, requirements: requirements});
69+
receiveToken.createCampaign(campaign, "ipfs://QmQjubc6guHReNW5Es5ZrgDtJRwXk2Aia7BkVoLJGaCRqP");
7170

7271
// To test updateCampaign, update to proper start/end times.
73-
params.startTime = uint32(block.timestamp);
74-
params.endTime = uint32(block.timestamp + 1_000_000);
75-
receiveToken.updateCampaign(1, params, "");
72+
campaign.params.startTime = uint32(block.timestamp);
73+
campaign.params.endTime = uint32(block.timestamp + 1_000_000);
74+
receiveToken.updateCampaign(1, campaign, "");
7675
}
7776
}

script/DeployAndConfigureExampleCampaign.s.sol.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {OfferItem, ConsiderationItem} from "seaport-types/src/lib/ConsiderationS
88
import {RedeemableContractOfferer} from "../src/RedeemableContractOfferer.sol";
99
import {CampaignParams} from "../src/lib/RedeemablesStructs.sol";
1010
import {BURN_ADDRESS} from "../src/lib/RedeemablesConstants.sol";
11-
import {ERC721RedemptionMintable} from "../src/extensions/ERC721RedemptionMintable.sol";
11+
import {ERC721ShipyardRedeemableMintable} from "../src/extensions/ERC721ShipyardRedeemableMintable.sol";
1212
import {TestERC721} from "../test/utils/mocks/TestERC721.sol";
1313

1414
contract DeployAndConfigureExampleCampaign is Script {
@@ -26,7 +26,7 @@ contract DeployAndConfigureExampleCampaign is Script {
2626
seaport
2727
);
2828
TestERC721 redeemableToken = new TestERC721();
29-
ERC721RedemptionMintable redemptionToken = new ERC721RedemptionMintable(
29+
ERC721ShipyardRedeemableMintable redemptionToken = new ERC721ShipyardRedeemableMintable(
3030
address(offerer),
3131
address(redeemableToken)
3232
);

script/DeployAndRedeemTokens-CampaignOnReceiveToken.s.sol

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@ import {Script} from "forge-std/Script.sol";
55
import {Test} from "forge-std/Test.sol";
66
import {ItemType} from "seaport-types/src/lib/ConsiderationEnums.sol";
77
import {OfferItem, ConsiderationItem} from "seaport-types/src/lib/ConsiderationStructs.sol";
8-
import {CampaignParams, CampaignRequirements} from "../src/lib/RedeemablesStructs.sol";
8+
import {Campaign, CampaignParams, CampaignRequirements} from "../src/lib/RedeemablesStructs.sol";
99
import {BURN_ADDRESS} from "../src/lib/RedeemablesConstants.sol";
10-
import {ERC721RedemptionMintable} from "../src/extensions/ERC721RedemptionMintable.sol";
11-
import {ERC721OwnerMintable} from "../src/test/ERC721OwnerMintable.sol";
1210
import {ERC721ShipyardRedeemableMintable} from "../src/extensions/ERC721ShipyardRedeemableMintable.sol";
11+
import {ERC721ShipyardRedeemableOwnerMintable} from "../src/test/ERC721ShipyardRedeemableOwnerMintable.sol";
1312

1413
contract DeployAndRedeemTokens_CampaignOnReceiveToken is Script, Test {
1514
function run() external {
1615
vm.startBroadcast();
1716

18-
ERC721OwnerMintable redeemToken = new ERC721OwnerMintable();
17+
ERC721ShipyardRedeemableOwnerMintable redeemToken =
18+
new ERC721ShipyardRedeemableOwnerMintable("TestRedeemablesRedeemToken", "TEST-RDM");
1919
ERC721ShipyardRedeemableMintable receiveToken =
20-
new ERC721ShipyardRedeemableMintable("TestRedeemablesReceiveToken", "TEST");
20+
new ERC721ShipyardRedeemableMintable("TestRedeemablesReceiveToken", "TEST-RCV");
2121

2222
// Configure the campaign.
2323
OfferItem[] memory offer = new OfferItem[](1);
@@ -46,25 +46,32 @@ contract DeployAndRedeemTokens_CampaignOnReceiveToken is Script, Test {
4646
requirements[0].consideration = consideration;
4747

4848
CampaignParams memory params = CampaignParams({
49-
requirements: requirements,
50-
signer: address(0),
5149
startTime: uint32(block.timestamp),
5250
endTime: uint32(block.timestamp + 1_000_000),
5351
maxCampaignRedemptions: 1_000,
54-
manager: msg.sender
52+
manager: msg.sender,
53+
signer: address(0)
5554
});
55+
Campaign memory campaign = Campaign({params: params, requirements: requirements});
5656
uint256 campaignId =
57-
receiveToken.createCampaign(params, "ipfs://QmQKc93y2Ev5k9Kz54mCw48ZM487bwGDktZYPLtrjJ3r1d");
57+
receiveToken.createCampaign(campaign, "ipfs://QmbFxYgQMoBSUNFyW7WRWGaAWwJiRPM6HbK86aFkSJSq5N");
5858

5959
// Mint token 1 to redeem for token 1.
6060
redeemToken.mint(msg.sender, 1);
61+
redeemToken.mint(msg.sender, 2);
62+
redeemToken.mint(msg.sender, 3);
63+
redeemToken.mint(msg.sender, 4);
6164

6265
// Let's redeem them!
63-
uint256 requirementsIndex = 0;
64-
bytes32 redemptionHash;
65-
uint256 salt;
66-
bytes memory signature;
67-
bytes memory data = abi.encode(campaignId, requirementsIndex, redemptionHash, salt, signature);
66+
uint256[] memory traitRedemptionTokenIds;
67+
bytes memory data = abi.encode(
68+
campaignId,
69+
0, // requirementsIndex
70+
bytes32(0), // redemptionHash
71+
traitRedemptionTokenIds,
72+
uint256(0), // salt
73+
bytes("") // signature
74+
);
6875

6976
uint256[] memory tokenIds = new uint256[](1);
7077
tokenIds[0] = 1;

script/DeployAndRedeemTokens.s.sol

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import {Script} from "forge-std/Script.sol";
55
import {Test} from "forge-std/Test.sol";
66
import {ItemType} from "seaport-types/src/lib/ConsiderationEnums.sol";
77
import {OfferItem, ConsiderationItem} from "seaport-types/src/lib/ConsiderationStructs.sol";
8-
import {CampaignParams, CampaignRequirements} from "../src/lib/RedeemablesStructs.sol";
8+
import {Campaign, CampaignParams, CampaignRequirements} from "../src/lib/RedeemablesStructs.sol";
99
import {BURN_ADDRESS} from "../src/lib/RedeemablesConstants.sol";
10-
import {ERC721RedemptionMintable} from "../src/extensions/ERC721RedemptionMintable.sol";
10+
import {ERC721ShipyardRedeemableMintable} from "../src/extensions/ERC721ShipyardRedeemableMintable.sol";
1111
import {ERC721ShipyardRedeemableOwnerMintable} from "../src/test/ERC721ShipyardRedeemableOwnerMintable.sol";
1212

1313
contract DeployAndRedeemTokens is Script, Test {
@@ -20,11 +20,11 @@ contract DeployAndRedeemTokens is Script, Test {
2020
);
2121
address[] memory redeemTokens = new address[](1);
2222
redeemTokens[0] = address(redeemToken);
23-
ERC721RedemptionMintable receiveToken = new ERC721RedemptionMintable(
23+
ERC721ShipyardRedeemableMintable receiveToken = new ERC721ShipyardRedeemableMintable(
2424
"TestRedeemablesRecieveToken",
25-
"TEST",
26-
redeemTokens
25+
"TEST"
2726
);
27+
receiveToken.setRedeemablesContracts(redeemTokens);
2828

2929
// Configure the campaign.
3030
OfferItem[] memory offer = new OfferItem[](1);
@@ -53,25 +53,28 @@ contract DeployAndRedeemTokens is Script, Test {
5353
requirements[0].consideration = consideration;
5454

5555
CampaignParams memory params = CampaignParams({
56-
requirements: requirements,
57-
signer: address(0),
5856
startTime: uint32(block.timestamp),
5957
endTime: uint32(block.timestamp + 1_000_000),
6058
maxCampaignRedemptions: 1_000,
61-
manager: msg.sender
59+
manager: msg.sender,
60+
signer: address(0)
6261
});
63-
redeemToken.createCampaign(params, "");
62+
Campaign memory campaign = Campaign({params: params, requirements: requirements});
63+
redeemToken.createCampaign(campaign, "");
6464

6565
// Mint token 1 to redeem for token 1.
6666
redeemToken.mint(msg.sender, 1);
6767

6868
// Let's redeem them!
69-
uint256 campaignId = 1;
70-
uint256 requirementsIndex = 0;
71-
bytes32 redemptionHash;
72-
uint256 salt;
73-
bytes memory signature;
74-
bytes memory data = abi.encode(campaignId, requirementsIndex, redemptionHash, salt, signature);
69+
uint256[] memory traitRedemptionTokenIds;
70+
bytes memory data = abi.encode(
71+
1, // campaignId
72+
0, // requirementsIndex
73+
bytes32(0), // redemptionHash
74+
traitRedemptionTokenIds,
75+
uint256(0), // salt
76+
bytes("") // signature
77+
);
7578

7679
uint256[] memory tokenIds = new uint256[](1);
7780
tokenIds[0] = 1;

script/DeployAndRedeemTrait.s.sol

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@ import {Test} from "forge-std/Test.sol";
66
import {ItemType} from "seaport-types/src/lib/ConsiderationEnums.sol";
77
import {OfferItem, ConsiderationItem} from "seaport-types/src/lib/ConsiderationStructs.sol";
88
import {IERC7496} from "shipyard-core/src/dynamic-traits/interfaces/IERC7496.sol";
9-
import {CampaignParams, CampaignRequirements, TraitRedemption} from "../src/lib/RedeemablesStructs.sol";
10-
import {ERC721RedemptionMintable} from "../src/extensions/ERC721RedemptionMintable.sol";
9+
import {Campaign, CampaignParams, CampaignRequirements, TraitRedemption} from "../src/lib/RedeemablesStructs.sol";
1110
import {ERC721ShipyardRedeemableMintable} from "../src/extensions/ERC721ShipyardRedeemableMintable.sol";
12-
import {ERC721ShipyardRedeemablePreapprovedTraitSetters} from
13-
"../src/test/ERC721ShipyardRedeemablePreapprovedTraitSetters.sol";
11+
import {ERC721ShipyardRedeemableTraitSetters} from "../src/test/ERC721ShipyardRedeemableTraitSetters.sol";
1412

1513
contract DeployAndRedeemTrait is Script, Test {
1614
function run() external {
@@ -26,13 +24,13 @@ contract DeployAndRedeemTrait is Script, Test {
2624
address[] memory allowedTraitSetters = new address[](1);
2725
allowedTraitSetters[0] = address(receiveToken);
2826

29-
// deploy the redeem token with the receive token as an allowed trait setter
30-
ERC721ShipyardRedeemablePreapprovedTraitSetters redeemToken =
31-
new ERC721ShipyardRedeemablePreapprovedTraitSetters(
27+
// deploy the redeem token
28+
ERC721ShipyardRedeemableTraitSetters redeemToken = new ERC721ShipyardRedeemableTraitSetters(
3229
"DynamicTraitsRedeemToken",
33-
"TEST",
34-
allowedTraitSetters
30+
"TEST"
3531
);
32+
// set the receive token as an allowed trait setter
33+
redeemToken.setAllowedTraitSetters(allowedTraitSetters);
3634

3735
// configure the campaign.
3836
OfferItem[] memory offer = new OfferItem[](1);
@@ -76,14 +74,14 @@ contract DeployAndRedeemTrait is Script, Test {
7674
requirements[0].traitRedemptions = traitRedemptions;
7775

7876
CampaignParams memory params = CampaignParams({
79-
requirements: requirements,
80-
signer: address(0),
8177
startTime: uint32(block.timestamp),
8278
endTime: uint32(block.timestamp + 1_000_000),
8379
maxCampaignRedemptions: 1_000,
84-
manager: msg.sender
80+
manager: msg.sender,
81+
signer: address(0)
8582
});
86-
receiveToken.createCampaign(params, "");
83+
Campaign memory campaign = Campaign({params: params, requirements: requirements});
84+
receiveToken.createCampaign(campaign, "");
8785

8886
// Mint token 1 to redeem for token 1.
8987
redeemToken.mint(msg.sender, 1);

script/DeployERC721ReceiveTokenWithPredeployedSeadropRedeemToken.s.sol

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ import {Script} from "forge-std/Script.sol";
55
import {Test} from "forge-std/Test.sol";
66
import {ItemType} from "seaport-types/src/lib/ConsiderationEnums.sol";
77
import {OfferItem, ConsiderationItem} from "seaport-types/src/lib/ConsiderationStructs.sol";
8-
import {CampaignParams, CampaignRequirements} from "../src/lib/RedeemablesStructs.sol";
8+
import {Campaign, CampaignParams, CampaignRequirements} from "../src/lib/RedeemablesStructs.sol";
99
import {BURN_ADDRESS} from "../src/lib/RedeemablesConstants.sol";
10-
import {ERC721RedemptionMintable} from "../src/extensions/ERC721RedemptionMintable.sol";
11-
import {ERC721OwnerMintable} from "../src/test/ERC721OwnerMintable.sol";
1210
import {ERC721ShipyardRedeemableMintable} from "../src/extensions/ERC721ShipyardRedeemableMintable.sol";
11+
import {ERC721ShipyardRedeemableOwnerMintable} from "../src/test/ERC721ShipyardRedeemableOwnerMintable.sol";
1312

1413
contract DeployERC721ReceiveTokenWithPredeployedSeaDropRedeemToken is Script, Test {
1514
function run() external {
@@ -47,15 +46,15 @@ contract DeployERC721ReceiveTokenWithPredeployedSeaDropRedeemToken is Script, Te
4746
requirements[0].consideration = consideration;
4847

4948
CampaignParams memory params = CampaignParams({
50-
requirements: requirements,
51-
signer: address(0),
5249
startTime: uint32(block.timestamp),
5350
endTime: uint32(block.timestamp + 1_000_000),
5451
maxCampaignRedemptions: 1_000,
55-
manager: msg.sender
52+
manager: msg.sender,
53+
signer: address(0)
5654
});
55+
Campaign memory campaign = Campaign({params: params, requirements: requirements});
5756
uint256 campaignId =
58-
receiveToken.createCampaign(params, "ipfs://QmQKc93y2Ev5k9Kz54mCw48ZM487bwGDktZYPLtrjJ3r1d");
57+
receiveToken.createCampaign(campaign, "ipfs://QmQKc93y2Ev5k9Kz54mCw48ZM487bwGDktZYPLtrjJ3r1d");
5958

6059
// redeemToken.setBaseURI(
6160
// "ipfs://QmYTSupCtriDLBHgPBBhZ98wYdp6N9S8jTL5sKSZwbASeT"

script/RedeemTokens.s.sol

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import {Test} from "forge-std/Test.sol";
66
import {ItemType} from "seaport-types/src/lib/ConsiderationEnums.sol";
77
import {OfferItem, ConsiderationItem} from "seaport-types/src/lib/ConsiderationStructs.sol";
88
import {CampaignParams, CampaignRequirements} from "../src/lib/RedeemablesStructs.sol";
9-
import {ERC721RedemptionMintable} from "../src/extensions/ERC721RedemptionMintable.sol";
10-
import {ERC721OwnerMintable} from "../src/test/ERC721OwnerMintable.sol";
9+
import {ERC721ShipyardRedeemableMintable} from "../src/extensions/ERC721ShipyardRedeemableMintable.sol";
10+
import {ERC721ShipyardRedeemableOwnerMintable} from "../src/test/ERC721ShipyardRedeemableOwnerMintable.sol";
1111
import {ERC1155ShipyardRedeemableMintable} from "../src/extensions/ERC1155ShipyardRedeemableMintable.sol";
1212

1313
contract RedeemTokens is Script, Test {
@@ -19,12 +19,15 @@ contract RedeemTokens is Script, Test {
1919
ERC1155ShipyardRedeemableMintable(0x3D0fa2a8D07dfe357905a4cB4ed51b0Aea8385B9);
2020

2121
// Let's redeem them!
22-
uint256 campaignId = 1;
23-
uint256 requirementsIndex = 0;
24-
bytes32 redemptionHash;
25-
uint256 salt;
26-
bytes memory signature;
27-
bytes memory data = abi.encode(campaignId, requirementsIndex, redemptionHash, salt, signature);
22+
uint256[] memory traitRedemptionTokenIds;
23+
bytes memory data = abi.encode(
24+
1, // campaignId
25+
0, // requirementsIndex
26+
bytes32(0), // redemptionHash
27+
traitRedemptionTokenIds,
28+
uint256(0), // salt
29+
bytes("") // signature
30+
);
2831

2932
uint256[] memory redeemTokenIds = new uint256[](1);
3033
redeemTokenIds[0] = 1;

src/ERC1155SeaDropRedeemable.sol

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,26 @@ import {ERC1155SeaDropContractOfferer} from "seadrop/src/lib/ERC1155SeaDropContr
66
import {IERC7498} from "./interfaces/IERC7498.sol";
77
import {ERC7498NFTRedeemables} from "./lib/ERC7498NFTRedeemables.sol";
88
import {DynamicTraits} from "shipyard-core/src/dynamic-traits/DynamicTraits.sol";
9-
import {CampaignParams} from "./lib/RedeemablesStructs.sol";
9+
import {Campaign} from "./lib/RedeemablesStructs.sol";
1010

1111
contract ERC1155SeaDropRedeemable is ERC1155SeaDrop, ERC7498NFTRedeemables {
1212
constructor(address allowedConfigurer, address allowedSeaport, string memory _name, string memory _symbol)
1313
ERC1155SeaDrop(allowedConfigurer, allowedSeaport, _name, _symbol)
1414
{}
1515

16-
function createCampaign(CampaignParams calldata params, string calldata uri)
16+
function createCampaign(Campaign calldata campaign, string calldata metadataURI)
1717
public
1818
override
1919
onlyOwner
2020
returns (uint256 campaignId)
2121
{
22-
campaignId = ERC7498NFTRedeemables.createCampaign(params, uri);
22+
campaignId = ERC7498NFTRedeemables.createCampaign(campaign, metadataURI);
2323
}
2424

2525
function setTrait(uint256 tokenId, bytes32 traitKey, bytes32 value) public virtual override onlyOwner {
2626
DynamicTraits.setTrait(tokenId, traitKey, value);
2727
}
2828

29-
function getTraitValue(uint256 tokenId, bytes32 traitKey)
30-
public
31-
view
32-
virtual
33-
override
34-
returns (bytes32 traitValue)
35-
{
36-
traitValue = DynamicTraits.getTraitValue(tokenId, traitKey);
37-
}
38-
3929
function _useInternalBurn() internal pure virtual override returns (bool) {
4030
return true;
4131
}

src/ERC1155ShipyardRedeemable.sol

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,24 @@ import {ERC1155ShipyardContractMetadata} from "./lib/ERC1155ShipyardContractMeta
55
import {Ownable} from "solady/src/auth/Ownable.sol";
66
import {ERC7498NFTRedeemables} from "./lib/ERC7498NFTRedeemables.sol";
77
import {DynamicTraits} from "shipyard-core/src/dynamic-traits/DynamicTraits.sol";
8-
import {CampaignParams} from "./lib/RedeemablesStructs.sol";
8+
import {Campaign} from "./lib/RedeemablesStructs.sol";
99

1010
contract ERC1155ShipyardRedeemable is ERC1155ShipyardContractMetadata, ERC7498NFTRedeemables {
1111
constructor(string memory name_, string memory symbol_) ERC1155ShipyardContractMetadata(name_, symbol_) {}
1212

13-
function createCampaign(CampaignParams calldata params, string calldata uri_)
13+
function createCampaign(Campaign calldata campaign, string calldata metadataURI)
1414
public
1515
override
1616
onlyOwner
1717
returns (uint256 campaignId)
1818
{
19-
campaignId = ERC7498NFTRedeemables.createCampaign(params, uri_);
19+
campaignId = ERC7498NFTRedeemables.createCampaign(campaign, metadataURI);
2020
}
2121

2222
function setTrait(uint256 tokenId, bytes32 traitKey, bytes32 value) public virtual override onlyOwner {
2323
DynamicTraits.setTrait(tokenId, traitKey, value);
2424
}
2525

26-
function getTraitValue(uint256 tokenId, bytes32 traitKey)
27-
public
28-
view
29-
virtual
30-
override
31-
returns (bytes32 traitValue)
32-
{
33-
traitValue = DynamicTraits.getTraitValue(tokenId, traitKey);
34-
}
35-
3626
function _useInternalBurn() internal pure virtual override returns (bool) {
3727
return true;
3828
}

0 commit comments

Comments
 (0)