Skip to content

Commit

Permalink
Merge pull request ProjectOpenSea#504 from ProjectOpenSea/test-native…
Browse files Browse the repository at this point in the history
…-offer-fulfill-reverts

Test that "fulfill" methods revert on Orders with Native offer items
  • Loading branch information
0age authored Jun 11, 2022
2 parents 06bf918 + ebee871 commit 57baf77
Show file tree
Hide file tree
Showing 4 changed files with 294 additions and 0 deletions.
58 changes: 58 additions & 0 deletions test/foundry/FulfillAdvancedOrder.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,64 @@ contract FulfillAdvancedOrder is BaseOrderTest {
}
}

function testNoNativeOffersFulfillAdvanced(uint8[8] memory itemTypes)
public
{
uint256 tokenId;
for (uint256 i; i < 8; i++) {
ItemType itemType = ItemType(itemTypes[i] % 4);
if (itemType == ItemType.NATIVE) {
addEthOfferItem(1);
} else if (itemType == ItemType.ERC20) {
addErc20OfferItem(1);
} else if (itemType == ItemType.ERC1155) {
test1155_1.mint(alice, tokenId, 1);
addErc1155OfferItem(tokenId, 1);
} else {
test721_1.mint(alice, tokenId);
addErc721OfferItem(tokenId);
}
tokenId++;
}
addEthOfferItem(1);

addEthConsiderationItem(alice, 1);

test(
this.noNativeOfferItemsFulfillAdvanced,
Context(consideration, empty, 0, 0)
);
test(
this.noNativeOfferItemsFulfillAdvanced,
Context(referenceConsideration, empty, 0, 0)
);
}

function noNativeOfferItemsFulfillAdvanced(Context memory context)
external
stateless
{
configureOrderParameters(alice);
uint256 counter = context.consideration.getCounter(alice);
_configureOrderComponents(counter);
bytes32 orderHash = context.consideration.getOrderHash(
baseOrderComponents
);
bytes memory signature = signOrder(
context.consideration,
alicePk,
orderHash
);

vm.expectRevert(abi.encodeWithSignature("InvalidNativeOfferItem()"));
context.consideration.fulfillAdvancedOrder(
AdvancedOrder(baseOrderParameters, 1, 1, signature, ""),
new CriteriaResolver[](0),
bytes32(0),
address(0)
);
}

function testAdvancedPartialAscendingOfferAmount1155(
FuzzInputs memory args,
uint128 tokenAmount,
Expand Down
94 changes: 94 additions & 0 deletions test/foundry/FulfillAvailableAdvancedOrder.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,100 @@ contract FulfillAvailableAdvancedOrder is BaseOrderTest {
}
}

function testNoNativeOffersFulfillAvailableAdvanced(
uint8[8] memory itemTypes
) public {
uint256 tokenId;
for (uint256 i; i < 8; i++) {
ItemType itemType = ItemType(itemTypes[i] % 4);
if (itemType == ItemType.NATIVE) {
addEthOfferItem(1);
} else if (itemType == ItemType.ERC20) {
addErc20OfferItem(1);
} else if (itemType == ItemType.ERC1155) {
test1155_1.mint(alice, tokenId, 1);
addErc1155OfferItem(tokenId, 1);
} else {
test721_1.mint(alice, tokenId);
addErc721OfferItem(tokenId);
}
tokenId++;
offerComponents.push(FulfillmentComponent(1, i));
}
addEthOfferItem(1);

addEthConsiderationItem(alice, 1);
considerationComponents.push(FulfillmentComponent(1, 0));

test(
this.noNativeOfferItemsFulfillAvailableAdvanced,
Context(consideration, empty, ItemType(0))
);
test(
this.noNativeOfferItemsFulfillAvailableAdvanced,
Context(referenceConsideration, empty, ItemType(0))
);
}

function noNativeOfferItemsFulfillAvailableAdvanced(Context memory context)
external
stateless
{
configureOrderParameters(alice);
uint256 counter = context.consideration.getCounter(alice);
_configureOrderComponents(counter);
bytes32 orderHash = context.consideration.getOrderHash(
baseOrderComponents
);
bytes memory signature = signOrder(
context.consideration,
alicePk,
orderHash
);

AdvancedOrder[] memory orders = new AdvancedOrder[](2);
orders[1] = AdvancedOrder(baseOrderParameters, 1, 1, signature, "");
offerComponentsArray.push(offerComponents);
considerationComponentsArray.push(considerationComponents);

delete offerItems;
delete considerationItems;
delete offerComponents;
delete considerationComponents;

token1.mint(alice, 100);
addErc20OfferItem(100);
addEthConsiderationItem(alice, 1);
configureOrderParameters(alice);
counter = context.consideration.getCounter(alice);
_configureOrderComponents(counter);
bytes32 orderHash2 = context.consideration.getOrderHash(
baseOrderComponents
);
bytes memory signature2 = signOrder(
context.consideration,
alicePk,
orderHash2
);
offerComponents.push(FulfillmentComponent(0, 0));
considerationComponents.push(FulfillmentComponent(0, 0));
offerComponentsArray.push(offerComponents);
considerationComponentsArray.push(considerationComponents);

orders[0] = AdvancedOrder(baseOrderParameters, 1, 1, signature2, "");

vm.expectRevert(abi.encodeWithSignature("InvalidNativeOfferItem()"));
context.consideration.fulfillAvailableAdvancedOrders{ value: 2 }(
orders,
new CriteriaResolver[](0),
offerComponentsArray,
considerationComponentsArray,
bytes32(0),
address(0),
2
);
}

function testFulfillAvailableAdvancedOrderOverflow() public {
for (uint256 i; i < 4; ++i) {
// skip 721s
Expand Down
50 changes: 50 additions & 0 deletions test/foundry/FulfillOrderTest.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,55 @@ contract FulfillOrderTest is BaseOrderTest {
_;
}

function testNoNativeOffers(uint8[8] memory itemTypes) public {
uint256 tokenId;
for (uint256 i; i < 8; i++) {
ItemType itemType = ItemType(itemTypes[i] % 4);
if (itemType == ItemType.NATIVE) {
addEthOfferItem(1);
} else if (itemType == ItemType.ERC20) {
addErc20OfferItem(1);
} else if (itemType == ItemType.ERC1155) {
test1155_1.mint(alice, tokenId, 1);
addErc1155OfferItem(tokenId, 1);
} else {
test721_1.mint(alice, tokenId);
addErc721OfferItem(tokenId);
}
tokenId++;
}
addEthOfferItem(1);

addEthConsiderationItem(alice, 1);

test(this.noNativeOfferItems, Context(consideration, empty, 0, 0, 0));
test(
this.noNativeOfferItems,
Context(referenceConsideration, empty, 0, 0, 0)
);
}

function noNativeOfferItems(Context memory context) external stateless {
configureOrderParameters(alice);
uint256 counter = context.consideration.getCounter(alice);
_configureOrderComponents(counter);
bytes32 orderHash = context.consideration.getOrderHash(
baseOrderComponents
);
bytes memory signature = signOrder(
context.consideration,
alicePk,
orderHash
);

vm.expectRevert(abi.encodeWithSignature("InvalidNativeOfferItem()"));

context.consideration.fulfillOrder(
Order(baseOrderParameters, signature),
bytes32(0)
);
}

function testNullAddressSpendReverts() public {
// mint token to null address
preapproved721.mint(address(0), 1);
Expand Down Expand Up @@ -142,6 +191,7 @@ contract FulfillOrderTest is BaseOrderTest {
);
// test that signature is recognized as invalid even though signer recovered is null address
vm.expectRevert(abi.encodeWithSignature("InvalidSigner()"));

context.consideration.fulfillOrder(
Order(baseOrderParameters, signature),
bytes32(0)
Expand Down
92 changes: 92 additions & 0 deletions test/foundry/FullfillAvailableOrder.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,98 @@ contract FulfillAvailableOrder is BaseOrderTest {
}
}

function testNoNativeOffersFulfillAvailable(uint8[8] memory itemTypes)
public
{
uint256 tokenId;
for (uint256 i; i < 8; i++) {
ItemType itemType = ItemType(itemTypes[i] % 4);
if (itemType == ItemType.NATIVE) {
addEthOfferItem(1);
} else if (itemType == ItemType.ERC20) {
addErc20OfferItem(1);
} else if (itemType == ItemType.ERC1155) {
test1155_1.mint(alice, tokenId, 1);
addErc1155OfferItem(tokenId, 1);
} else {
test721_1.mint(alice, tokenId);
addErc721OfferItem(tokenId);
}
tokenId++;
offerComponents.push(FulfillmentComponent(1, i));
}
addEthOfferItem(1);

addEthConsiderationItem(alice, 1);
considerationComponents.push(FulfillmentComponent(1, 0));

test(
this.noNativeOfferItemsFulfillAvailable,
Context(consideration, empty, ItemType(0))
);
test(
this.noNativeOfferItemsFulfillAvailable,
Context(referenceConsideration, empty, ItemType(0))
);
}

function noNativeOfferItemsFulfillAvailable(Context memory context)
external
stateless
{
configureOrderParameters(alice);
uint256 counter = context.consideration.getCounter(alice);
_configureOrderComponents(counter);
bytes32 orderHash = context.consideration.getOrderHash(
baseOrderComponents
);
bytes memory signature = signOrder(
context.consideration,
alicePk,
orderHash
);

Order[] memory orders = new Order[](2);
orders[1] = Order(baseOrderParameters, signature);
offerComponentsArray.push(offerComponents);
considerationComponentsArray.push(considerationComponents);

delete offerItems;
delete considerationItems;
delete offerComponents;
delete considerationComponents;

token1.mint(alice, 100);
addErc20OfferItem(100);
addEthConsiderationItem(alice, 1);
configureOrderParameters(alice);
counter = context.consideration.getCounter(alice);
_configureOrderComponents(counter);
bytes32 orderHash2 = context.consideration.getOrderHash(
baseOrderComponents
);
bytes memory signature2 = signOrder(
context.consideration,
alicePk,
orderHash2
);
offerComponents.push(FulfillmentComponent(0, 0));
considerationComponents.push(FulfillmentComponent(0, 0));
offerComponentsArray.push(offerComponents);
considerationComponentsArray.push(considerationComponents);

orders[0] = Order(baseOrderParameters, signature2);

vm.expectRevert(abi.encodeWithSignature("InvalidNativeOfferItem()"));
context.consideration.fulfillAvailableOrders{ value: 2 }(
orders,
offerComponentsArray,
considerationComponentsArray,
bytes32(0),
2
);
}

function testFulfillAvailableOrdersOverflowOfferSide() public {
// skip eth
for (uint256 i = 1; i < 4; ++i) {
Expand Down

0 comments on commit 57baf77

Please sign in to comment.