Skip to content

Commit

Permalink
Seaport v1.5 tests (Uniswap#285)
Browse files Browse the repository at this point in the history
* tests (not yet correct)

* All tests passing

* update router tests

* update forge std

* rename seaport api
  • Loading branch information
hensha256 authored May 5, 2023
1 parent 257ae4d commit 8461713
Show file tree
Hide file tree
Showing 20 changed files with 1,213 additions and 3,989 deletions.
164 changes: 102 additions & 62 deletions test/integration-tests/CheckOwnership.test.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import { CommandType, RoutePlanner } from './shared/planner'
import { expect } from './shared/expect'
import { ERC721, Permit2, UniversalRouter } from '../../typechain'
import { ERC1155, ERC721, Permit2, UniversalRouter } from '../../typechain'
import {
seaportOrders,
seaportV1_4Orders,
seaportInterface,
getAdvancedOrderParams,
purchaseDataForTwoCovensSeaport,
purchaseDataForTwoTownstarsSeaport,
AdvancedOrder,
} from './shared/protocolHelpers/seaport'
import { resetFork, COVEN_721, USDC } from './shared/mainnetForkHelpers'
import { ALICE_ADDRESS, COVEN_ADDRESS, DEADLINE, OPENSEA_CONDUIT_KEY } from './shared/constants'
import { resetFork, COVEN_721, USDC, TOWNSTAR_1155 } from './shared/mainnetForkHelpers'
import { ALICE_ADDRESS, COVEN_ADDRESS, DEADLINE, OPENSEA_CONDUIT_KEY, TOWNSTAR_ADDRESS } from './shared/constants'
import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'
import hre from 'hardhat'
import deployUniversalRouter, { deployPermit2 } from './shared/deployUniversalRouter'
Expand All @@ -23,23 +24,24 @@ describe('Check Ownership', () => {
let permit2: Permit2
let planner: RoutePlanner
let cryptoCovens: ERC721
let townStarNFT: ERC1155

beforeEach(async () => {
await resetFork()
await hre.network.provider.request({
method: 'hardhat_impersonateAccount',
params: [ALICE_ADDRESS],
describe('checks ownership ERC721', () => {
beforeEach(async () => {
await resetFork(16784175)
await hre.network.provider.request({
method: 'hardhat_impersonateAccount',
params: [ALICE_ADDRESS],
})
alice = await ethers.getSigner(ALICE_ADDRESS)
permit2 = (await deployPermit2()).connect(alice) as Permit2
router = (await deployUniversalRouter(permit2)).connect(alice) as UniversalRouter
planner = new RoutePlanner()
cryptoCovens = COVEN_721.connect(alice) as ERC721
})
alice = await ethers.getSigner(ALICE_ADDRESS)
permit2 = (await deployPermit2()).connect(alice) as Permit2
router = (await deployUniversalRouter(permit2)).connect(alice) as UniversalRouter
planner = new RoutePlanner()
cryptoCovens = COVEN_721.connect(alice)
})

describe('checks ownership ERC721', () => {
it('passes with valid owner', async () => {
const { advancedOrder } = getAdvancedOrderParams(seaportOrders[0])
const { advancedOrder } = getAdvancedOrderParams(seaportV1_4Orders[0])
const params = advancedOrder.parameters
planner.addCommand(CommandType.OWNER_CHECK_721, [
params.offerer,
Expand All @@ -52,7 +54,7 @@ describe('Check Ownership', () => {
})

it('reverts for invalid ownership', async () => {
const { advancedOrder } = getAdvancedOrderParams(seaportOrders[0])
const { advancedOrder } = getAdvancedOrderParams(seaportV1_4Orders[0])
const params = advancedOrder.parameters
planner.addCommand(CommandType.OWNER_CHECK_721, [
alice.address,
Expand All @@ -69,7 +71,7 @@ describe('Check Ownership', () => {
})

it('checks ownership after a seaport trade for one ERC721', async () => {
const { advancedOrder, value } = getAdvancedOrderParams(seaportOrders[0])
const { advancedOrder, value } = getAdvancedOrderParams(seaportV1_4Orders[0])
const params = advancedOrder.parameters
const calldata = seaportInterface.encodeFunctionData('fulfillAdvancedOrder', [
advancedOrder,
Expand All @@ -78,7 +80,7 @@ describe('Check Ownership', () => {
alice.address,
])

planner.addCommand(CommandType.SEAPORT_V1_5, [value.toString(), calldata])
planner.addCommand(CommandType.SEAPORT_V1_4, [value.toString(), calldata])
planner.addCommand(CommandType.OWNER_CHECK_721, [
alice.address,
COVEN_ADDRESS,
Expand All @@ -93,76 +95,113 @@ describe('Check Ownership', () => {
).to.changeEtherBalance(alice, value.mul(-1))
const ownerAfter = await cryptoCovens.ownerOf(params.offer[0].identifierOrCriteria)

expect(ownerBefore.toLowerCase()).to.eq(params.offerer)
expect(ownerAfter).to.eq(alice.address)
expect(ownerBefore.toLowerCase()).to.eq(params.offerer.toLowerCase())
expect(ownerAfter.toLowerCase()).to.eq(alice.address.toLowerCase())
})
})

describe('checks ownership ERC1155', () => {
let calldata: string
let advancedOrder0: AdvancedOrder
let advancedOrder1: AdvancedOrder
let value: BigNumber

beforeEach(async () => {
await resetFork(17179617)
await hre.network.provider.request({
method: 'hardhat_impersonateAccount',
params: [ALICE_ADDRESS],
})
alice = await ethers.getSigner(ALICE_ADDRESS)
permit2 = (await deployPermit2()).connect(alice) as Permit2
router = (await deployUniversalRouter(permit2)).connect(alice) as UniversalRouter
planner = new RoutePlanner()
townStarNFT = TOWNSTAR_1155.connect(alice) as ERC1155
;({ calldata, advancedOrder0, advancedOrder1, value } = purchaseDataForTwoTownstarsSeaport(alice.address))
})

it('passes with valid ownership', async () => {
const params0 = advancedOrder0.parameters

planner.addCommand(CommandType.OWNER_CHECK_1155, [
params0.offerer,
TOWNSTAR_ADDRESS,
params0.offer[0].identifierOrCriteria,
1,
])

const { commands, inputs } = planner
await expect(router['execute(bytes,bytes[],uint256)'](commands, inputs, DEADLINE)).to.not.be.reverted
})

it('reverts for invalid ownership', async () => {
const params0 = advancedOrder0.parameters

planner.addCommand(CommandType.OWNER_CHECK_1155, [
alice.address,
TOWNSTAR_ADDRESS,
params0.offer[0].identifierOrCriteria,
1,
])

const { commands, inputs } = planner
const customErrorSelector = findCustomErrorSelector(router.interface, 'InvalidOwnerERC1155')
await expect(router['execute(bytes,bytes[],uint256)'](commands, inputs, DEADLINE))
.to.be.revertedWithCustomError(router, 'ExecutionFailed')
.withArgs(0, customErrorSelector)
})

it('checks ownership after a seaport trade for two ERC721s', async () => {
const { calldata, advancedOrder0, advancedOrder1, value } = purchaseDataForTwoCovensSeaport(alice.address)
it('checks ownership after a seaport trade for two ERC1155s', async () => {
const params0 = advancedOrder0.parameters
const params1 = advancedOrder1.parameters

planner.addCommand(CommandType.SEAPORT_V1_5, [value.toString(), calldata])
planner.addCommand(CommandType.OWNER_CHECK_721, [
planner.addCommand(CommandType.OWNER_CHECK_1155, [
alice.address,
COVEN_ADDRESS,
TOWNSTAR_ADDRESS,
params0.offer[0].identifierOrCriteria,
1,
])
planner.addCommand(CommandType.OWNER_CHECK_721, [
planner.addCommand(CommandType.OWNER_CHECK_1155, [
alice.address,
COVEN_ADDRESS,
TOWNSTAR_ADDRESS,
params1.offer[0].identifierOrCriteria,
1,
])

const { commands, inputs } = planner

const owner0Before = await cryptoCovens.ownerOf(params0.offer[0].identifierOrCriteria)
const owner1Before = await cryptoCovens.ownerOf(params1.offer[0].identifierOrCriteria)
const balance0Before = await townStarNFT.balanceOf(alice.address, params0.offer[0].identifierOrCriteria)
const balance1Before = await townStarNFT.balanceOf(alice.address, params1.offer[0].identifierOrCriteria)

await expect(
router['execute(bytes,bytes[],uint256)'](commands, inputs, DEADLINE, { value })
).to.changeEtherBalance(alice, value.mul(-1))

const owner0After = await cryptoCovens.ownerOf(params0.offer[0].identifierOrCriteria)
const owner1After = await cryptoCovens.ownerOf(params1.offer[0].identifierOrCriteria)

expect(owner0Before.toLowerCase()).to.eq(params0.offerer)
expect(owner1Before.toLowerCase()).to.eq(params1.offerer)
expect(owner0After).to.eq(alice.address)
expect(owner1After).to.eq(alice.address)
})
})

describe('checks ownership ERC1155', () => {
const tokenOwner = '0x8246137C39BB05261972655186A868bdC8a9Eb11'
const tokenAddress = '0xf4680c917A873E2dd6eAd72f9f433e74EB9c623C'
const tokenId = 40
const balance0After = await townStarNFT.balanceOf(alice.address, params0.offer[0].identifierOrCriteria)
const balance1After = await townStarNFT.balanceOf(alice.address, params1.offer[0].identifierOrCriteria)

it('passes with valid ownership', async () => {
planner.addCommand(CommandType.OWNER_CHECK_1155, [tokenOwner, tokenAddress, tokenId, 1])

const { commands, inputs } = planner
await expect(router['execute(bytes,bytes[],uint256)'](commands, inputs, DEADLINE)).to.not.be.reverted
})

it('reverts for invalid ownership', async () => {
planner.addCommand(CommandType.OWNER_CHECK_1155, [alice.address, tokenAddress, tokenId, 1])

const { commands, inputs } = planner
const customErrorSelector = findCustomErrorSelector(router.interface, 'InvalidOwnerERC1155')
await expect(router['execute(bytes,bytes[],uint256)'](commands, inputs, DEADLINE))
.to.be.revertedWithCustomError(router, 'ExecutionFailed')
.withArgs(0, customErrorSelector)
expect(balance0After.sub(balance0Before)).to.eq(1)
expect(balance1After.sub(balance1Before)).to.eq(1)
})
})

describe('checks balance ERC20', () => {
let aliceUSDCBalance: BigNumber
let usdcContract: Contract

before(async () => {
beforeEach(async () => {
await resetFork()
await hre.network.provider.request({
method: 'hardhat_impersonateAccount',
params: [ALICE_ADDRESS],
})
alice = await ethers.getSigner(ALICE_ADDRESS)
permit2 = (await deployPermit2()).connect(alice) as Permit2
router = (await deployUniversalRouter(permit2)).connect(alice) as UniversalRouter
usdcContract = new ethers.Contract(USDC.address, TOKEN_ABI, alice)
aliceUSDCBalance = await usdcContract.balanceOf(ALICE_ADDRESS)
planner = new RoutePlanner()
})

it('passes with sufficient balance', async () => {
Expand All @@ -173,7 +212,8 @@ describe('Check Ownership', () => {
})

it('reverts for insufficient balance', async () => {
planner.addCommand(CommandType.BALANCE_CHECK_ERC20, [ALICE_ADDRESS, USDC.address, aliceUSDCBalance.add(1)])
const invalidBalance = aliceUSDCBalance.add(1)
planner.addCommand(CommandType.BALANCE_CHECK_ERC20, [ALICE_ADDRESS, USDC.address, invalidBalance])

const { commands, inputs } = planner
const customErrorSelector = findCustomErrorSelector(router.interface, 'BalanceTooLow')
Expand Down
Loading

0 comments on commit 8461713

Please sign in to comment.