Commit 3d8a5ed6 authored by Charles Bachmeier's avatar Charles Bachmeier Committed by GitHub

feat: Support listing to Seaport v1.4 (#6094)

* upgrade seaport

* working 1.4 listing

* update OS fee to 0%

* update zone to null addr

* update var name

* rounding bug

* unused exports

---------
Co-authored-by: default avatarCharles Bachmeier <charlie@genie.xyz>
parent c3d2c438
...@@ -239,7 +239,7 @@ export const MarketplaceRow = ({ ...@@ -239,7 +239,7 @@ export const MarketplaceRow = ({
> >
<FeeWrapper> <FeeWrapper>
<ThemedText.BodyPrimary color="textSecondary"> <ThemedText.BodyPrimary color="textSecondary">
{fees > 0 ? `${fees}${selectedMarkets.length > 1 ? t`% max` : '%'}` : '--%'} {fees > 0 ? `${fees.toFixed(2)}${selectedMarkets.length > 1 ? t`% max` : '%'}` : '--%'}
</ThemedText.BodyPrimary> </ThemedText.BodyPrimary>
</FeeWrapper> </FeeWrapper>
</MouseoverTooltip> </MouseoverTooltip>
......
export const OPENSEA_FEE_ADDRESS = '0x0000a26b00c1F0DF003000390027140000fAa719'
export const OPENSEA_DEFAULT_ZONE = '0x004c00500000ad104d7dbd00e3ae0a5c00560c00'
export const OPENSEA_DEFAULT_CROSS_CHAIN_CONDUIT_KEY = export const OPENSEA_DEFAULT_CROSS_CHAIN_CONDUIT_KEY =
'0x0000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000' '0x0000007b02230091a7ed01230072f7006a004d60a8d4e71d599b8104250f0000'
export const OPENSEA_CROSS_CHAIN_CONDUIT = '0x1e0049783f008a0085193e00003d00cd54003c71' export const OPENSEA_CROSS_CHAIN_CONDUIT = '0x1e0049783f008a0085193e00003d00cd54003c71'
export const OPENSEA_SEAPORT_V1_4_CONTRACT = '0x00000000000001ad428e4906ae43d8f9852d0dd6'
export const OPENSEA_KEY_TO_CONDUIT = { [OPENSEA_DEFAULT_CROSS_CHAIN_CONDUIT_KEY]: OPENSEA_CROSS_CHAIN_CONDUIT } export const OPENSEA_KEY_TO_CONDUIT = { [OPENSEA_DEFAULT_CROSS_CHAIN_CONDUIT_KEY]: OPENSEA_CROSS_CHAIN_CONDUIT }
export const OPENSEA_DEFAULT_FEE = 0.025
export const INVERSE_BASIS_POINTS = 10000 export const INVERSE_BASIS_POINTS = 10000
...@@ -7,10 +7,11 @@ import { addressesByNetwork, MakerOrder, signMakerOrder, SupportedChainId } from ...@@ -7,10 +7,11 @@ import { addressesByNetwork, MakerOrder, signMakerOrder, SupportedChainId } from
import { Seaport } from '@opensea/seaport-js' import { Seaport } from '@opensea/seaport-js'
import { ItemType } from '@opensea/seaport-js/lib/constants' import { ItemType } from '@opensea/seaport-js/lib/constants'
import { ConsiderationInputItem } from '@opensea/seaport-js/lib/types' import { ConsiderationInputItem } from '@opensea/seaport-js/lib/types'
import { ZERO_ADDRESS } from 'constants/misc'
import { import {
OPENSEA_DEFAULT_CROSS_CHAIN_CONDUIT_KEY, OPENSEA_DEFAULT_CROSS_CHAIN_CONDUIT_KEY,
OPENSEA_DEFAULT_ZONE,
OPENSEA_KEY_TO_CONDUIT, OPENSEA_KEY_TO_CONDUIT,
OPENSEA_SEAPORT_V1_4_CONTRACT,
} from 'nft/queries/openSea' } from 'nft/queries/openSea'
import ERC721 from '../../abis/erc721.json' import ERC721 from '../../abis/erc721.json'
...@@ -21,7 +22,7 @@ import { ...@@ -21,7 +22,7 @@ import {
newX2Y2Order, newX2Y2Order,
PostOpenSeaSellOrder, PostOpenSeaSellOrder,
} from '../queries' } from '../queries'
import { INVERSE_BASIS_POINTS, OPENSEA_DEFAULT_FEE, OPENSEA_FEE_ADDRESS } from '../queries/openSea' import { INVERSE_BASIS_POINTS } from '../queries/openSea'
import { ListingMarket, ListingStatus, WalletAsset } from '../types' import { ListingMarket, ListingStatus, WalletAsset } from '../types'
import { createSellOrder, encodeOrder, OfferItem, OrderPayload, signOrderData } from './x2y2' import { createSellOrder, encodeOrder, OfferItem, OrderPayload, signOrderData } from './x2y2'
...@@ -40,7 +41,7 @@ export const ListingMarkets: ListingMarket[] = [ ...@@ -40,7 +41,7 @@ export const ListingMarkets: ListingMarket[] = [
}, },
{ {
name: 'OpenSea', name: 'OpenSea',
fee: 2.5, fee: 0,
icon: '/nft/svgs/marketplaces/opensea.svg', icon: '/nft/svgs/marketplaces/opensea.svg',
}, },
] ]
...@@ -58,14 +59,11 @@ const getConsiderationItems = ( ...@@ -58,14 +59,11 @@ const getConsiderationItems = (
signerAddress: string signerAddress: string
): { ): {
sellerFee: ConsiderationInputItem sellerFee: ConsiderationInputItem
openseaFee: ConsiderationInputItem
creatorFee?: ConsiderationInputItem creatorFee?: ConsiderationInputItem
} => { } => {
const openSeaBasisPoints = OPENSEA_DEFAULT_FEE * INVERSE_BASIS_POINTS
const creatorFeeBasisPoints = asset?.basisPoints ?? 0 const creatorFeeBasisPoints = asset?.basisPoints ?? 0
const sellerBasisPoints = INVERSE_BASIS_POINTS - openSeaBasisPoints - creatorFeeBasisPoints const sellerBasisPoints = INVERSE_BASIS_POINTS - creatorFeeBasisPoints
const openseaFee = price.mul(BigNumber.from(openSeaBasisPoints)).div(BigNumber.from(INVERSE_BASIS_POINTS)).toString()
const creatorFee = price const creatorFee = price
.mul(BigNumber.from(creatorFeeBasisPoints)) .mul(BigNumber.from(creatorFeeBasisPoints))
.div(BigNumber.from(INVERSE_BASIS_POINTS)) .div(BigNumber.from(INVERSE_BASIS_POINTS))
...@@ -74,7 +72,6 @@ const getConsiderationItems = ( ...@@ -74,7 +72,6 @@ const getConsiderationItems = (
return { return {
sellerFee: createConsiderationItem(sellerFee, signerAddress), sellerFee: createConsiderationItem(sellerFee, signerAddress),
openseaFee: createConsiderationItem(openseaFee, OPENSEA_FEE_ADDRESS),
creatorFee: creatorFee:
creatorFeeBasisPoints > 0 creatorFeeBasisPoints > 0
? createConsiderationItem(creatorFee, asset?.asset_contract?.payout_address ?? '') ? createConsiderationItem(creatorFee, asset?.asset_contract?.payout_address ?? '')
...@@ -126,6 +123,7 @@ export async function signListing( ...@@ -126,6 +123,7 @@ export async function signListing(
overrides: { overrides: {
defaultConduitKey: OPENSEA_DEFAULT_CROSS_CHAIN_CONDUIT_KEY, defaultConduitKey: OPENSEA_DEFAULT_CROSS_CHAIN_CONDUIT_KEY,
}, },
seaportVersion: '1.4',
}) })
const signerAddress = await signer.getAddress() const signerAddress = await signer.getAddress()
...@@ -135,8 +133,8 @@ export async function signListing( ...@@ -135,8 +133,8 @@ export async function signListing(
case 'OpenSea': case 'OpenSea':
try { try {
const listingInWei = parseEther(`${listingPrice}`) const listingInWei = parseEther(`${listingPrice}`)
const { sellerFee, openseaFee, creatorFee } = getConsiderationItems(asset, listingInWei, signerAddress) const { sellerFee, creatorFee } = getConsiderationItems(asset, listingInWei, signerAddress)
const considerationItems = [sellerFee, openseaFee, creatorFee].filter( const considerationItems = [sellerFee, creatorFee].filter(
(item): item is ConsiderationInputItem => item !== undefined (item): item is ConsiderationInputItem => item !== undefined
) )
...@@ -147,21 +145,20 @@ export async function signListing( ...@@ -147,21 +145,20 @@ export async function signListing(
itemType: ItemType.ERC721, itemType: ItemType.ERC721,
token: asset.asset_contract.address, token: asset.asset_contract.address,
identifier: asset.tokenId, identifier: asset.tokenId,
amount: '1',
}, },
], ],
consideration: considerationItems, consideration: considerationItems,
endTime: asset.expirationTime.toString(), endTime: asset.expirationTime.toString(),
zone: OPENSEA_DEFAULT_ZONE, zone: ZERO_ADDRESS,
restrictedByZone: true,
allowPartialFills: true, allowPartialFills: true,
}, },
signerAddress signerAddress
) )
const order = await executeAllActions() const order = await executeAllActions()
const seaportV14Order = { ...order, protocol_address: OPENSEA_SEAPORT_V1_4_CONTRACT }
setStatus(ListingStatus.PENDING) setStatus(ListingStatus.PENDING)
const res = await PostOpenSeaSellOrder(order) const res = await PostOpenSeaSellOrder(seaportV14Order)
res ? setStatus(ListingStatus.APPROVED) : setStatus(ListingStatus.FAILED) res ? setStatus(ListingStatus.APPROVED) : setStatus(ListingStatus.FAILED)
return res return res
} catch (error) { } catch (error) {
......
...@@ -3274,14 +3274,14 @@ ...@@ -3274,14 +3274,14 @@
mkdirp "^1.0.4" mkdirp "^1.0.4"
rimraf "^3.0.2" rimraf "^3.0.2"
"@opensea/seaport-js@^1.0.2": "@opensea/seaport-js@^1.0.10":
version "1.0.5" version "1.0.10"
resolved "https://registry.yarnpkg.com/@opensea/seaport-js/-/seaport-js-1.0.5.tgz#f48ebf5e3bc6ff5627502616598b401c6eaf352a" resolved "https://registry.yarnpkg.com/@opensea/seaport-js/-/seaport-js-1.0.10.tgz#538eed1316a99d2cf06a57fd874b719efad9c22e"
integrity sha512-WgK3Grdqf5PEQWMlSFiSFaL/j8vlJ3feSjn+frFEO0QH2MuqwlFBRUGwqK4l09o5ZtZDRRTMafgrYC6BOgBY4A== integrity sha512-k4kBmkCNYxAuB6DYRqwcGXik/8x80cHQ4r4bWWFyB0v4AxGNsqMGOwdeDiP1ajxbg4NnmdEpyA8b2p73GiaK7Q==
dependencies: dependencies:
"@0xsequence/multicall" "^0.39.0" "@0xsequence/multicall" "^0.39.0"
ethers "^5.6.7" ethers "^5.6.7"
merkletreejs "^0.2.31" merkletreejs "^0.3.9"
"@openzeppelin/contracts@3.4.1-solc-0.7-2": "@openzeppelin/contracts@3.4.1-solc-0.7-2":
version "3.4.1-solc-0.7-2" version "3.4.1-solc-0.7-2"
...@@ -13962,10 +13962,10 @@ merge@2.1.0: ...@@ -13962,10 +13962,10 @@ merge@2.1.0:
resolved "https://registry.npmjs.org/merge/-/merge-2.1.0.tgz" resolved "https://registry.npmjs.org/merge/-/merge-2.1.0.tgz"
integrity sha512-TcuhVDV+e6X457MQAm7xIb19rWhZuEDEho7RrwxMpQ/3GhD5sDlnP188gjQQuweXHy9igdke5oUtVOXX1X8Sxg== integrity sha512-TcuhVDV+e6X457MQAm7xIb19rWhZuEDEho7RrwxMpQ/3GhD5sDlnP188gjQQuweXHy9igdke5oUtVOXX1X8Sxg==
merkletreejs@^0.2.31: merkletreejs@^0.3.9:
version "0.2.32" version "0.3.9"
resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.2.32.tgz#cf1c0760e2904e4a1cc269108d6009459fd06223" resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.3.9.tgz#cdb364a3b974a44f4eff3446522d7066e0cf95de"
integrity sha512-TostQBiwYRIwSE5++jGmacu3ODcKAgqb0Y/pnIohXS7sWxh1gCkSptbmF1a43faehRDpcHf7J/kv0Ml2D/zblQ== integrity sha512-NjlATjJr4NEn9s8v/VEHhgwRWaE1eA/Une07d9SEqKzULJi1Wsh0Y3svwJdP2bYLMmgSBHzOrNydMWM1NN9VeQ==
dependencies: dependencies:
bignumber.js "^9.0.1" bignumber.js "^9.0.1"
buffer-reverse "^1.0.1" buffer-reverse "^1.0.1"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment