@@ -57,6 +57,7 @@ import {
5757import { DIRECTION_MAPPING , OrderStatusV4 , TradeDirection } from './enums' ;
5858import { CONTRACT_ORDER_VALIDATOR } from './properties' ;
5959import { getWrappedNativeToken } from '../../utils/addresses' ;
60+ import { ETH_ADDRESS_AS_ERC20 } from './constants' ;
6061
6162export enum SupportedChainIdsV4 {
6263 Mainnet = 1 ,
@@ -199,19 +200,19 @@ class NftSwapV4 implements INftSwapV4 {
199200 ) ;
200201 }
201202
202- loadApprovalStatus = (
203+ loadApprovalStatus (
203204 asset : SwappableAssetV4 ,
204205 walletAddress : string ,
205206 approvalOverrides ?: Partial < ApprovalOverrides > | undefined
206- ) = > {
207+ ) : Promise < ApprovalStatus > {
207208 // TODO(johnrjj) - Fix to pass thru more args...
208209 return getApprovalStatus (
209210 walletAddress ,
210211 approvalOverrides ?. exchangeContractAddress ?? this . exchangeProxy . address ,
211212 asset ,
212213 this . provider
213214 ) ;
214- } ;
215+ }
215216
216217 awaitTransactionHash = async ( txHash : string ) => {
217218 return this . provider . waitForTransaction ( txHash ) ;
@@ -562,12 +563,18 @@ class NftSwapV4 implements INftSwapV4 {
562563 if ( 'erc1155Token' in signedOrder ) {
563564 // If maker is selling an NFT, taker wants to 'buy' nft
564565 if ( signedOrder . direction === TradeDirection . SellNFT ) {
566+ const needsEthAttached =
567+ signedOrder . erc20Token . toLowerCase ( ) === ETH_ADDRESS_AS_ERC20 ;
568+
565569 return this . exchangeProxy . buyERC1155 (
566570 signedOrder ,
567571 signedOrder . signature ,
568572 signedOrder . erc1155TokenAmount ,
569573 '0x' ,
570- transactionOverrides ?? { }
574+ {
575+ value : needsEthAttached ? signedOrder . erc20TokenAmount : undefined ,
576+ ...transactionOverrides ,
577+ }
571578 ) ;
572579 } else {
573580 // TODO(detect if erc20 token is wrapped token, then switch true. if true when not wrapped token, tx will fail)
@@ -595,17 +602,26 @@ class NftSwapV4 implements INftSwapV4 {
595602 signedOrder . erc1155TokenAmount ,
596603 unwrapNativeToken ,
597604 '0x' ,
598- transactionOverrides ?? { }
605+ {
606+ ...transactionOverrides ,
607+ }
599608 ) ;
600609 }
601610 } else if ( 'erc721Token' in signedOrder ) {
602611 // If maker is selling an NFT, taker wants to 'buy' nft
612+
603613 if ( signedOrder . direction === TradeDirection . SellNFT ) {
614+ const needsEthAttached =
615+ signedOrder . erc20Token . toLowerCase ( ) === ETH_ADDRESS_AS_ERC20 ;
616+
604617 return this . exchangeProxy . buyERC721 (
605618 signedOrder ,
606619 signedOrder . signature ,
607620 '0x' ,
608- transactionOverrides ?? { }
621+ {
622+ value : needsEthAttached ? signedOrder . erc20TokenAmount : undefined ,
623+ ...transactionOverrides ,
624+ }
609625 ) ;
610626 } else {
611627 // TODO(detect if erc20 token is wrapped token, then switch true. if true when not wrapped token, tx will fail)
@@ -631,7 +647,10 @@ class NftSwapV4 implements INftSwapV4 {
631647 fillOrderOverrides ?. tokenIdToSellForCollectionOrder ??
632648 signedOrder . erc721TokenId ,
633649 unwrapNativeToken ,
634- '0x'
650+ '0x' ,
651+ {
652+ ...transactionOverrides ,
653+ }
635654 ) ;
636655 }
637656 }
@@ -684,6 +703,51 @@ class NftSwapV4 implements INftSwapV4 {
684703 'Only ERC721 Orders are currently supported for matching. Please ensure both the sellOrder and buyOrder are ERC721 orders'
685704 ) ;
686705 } ;
706+
707+ getTakerAsset = ( order : NftOrderV4 ) : SwappableAssetV4 => {
708+ // return {
709+ // tokenAddress: '',
710+ // tokenId: ''
711+ // }
712+ } ;
713+
714+ getMakerAsset = ( order : NftOrderV4 ) : SwappableAssetV4 => {
715+ // return {
716+ // tokenAddress: '',
717+ // tokenId: ''
718+ // }
719+ } ;
720+
721+ // todo: consolidate
722+ // todo: use these to power validation for the api
723+ checkOrderCanBeFilledMakerSide = ( order : NftOrderV4 ) => { } ;
724+
725+ checkOrderCanBeFilledTakerSide = (
726+ order : NftOrderV4 ,
727+ override ?: VerifyOrderOptionsOverrides
728+ ) => {
729+ const shouldLoadApprovalStatus = override ?. verifyApproval ?? true ;
730+ const shouldLoadBalance = override ?. verifyBalance ?? true ;
731+
732+ const direction = parseInt ( order . direction . toString ( 10 ) ) ;
733+ if ( direction === TradeDirection . SellNFT ) {
734+ if ( 'erc721Token' in order ) {
735+ this . loadApprovalStatus ( ) ;
736+
737+ const { erc721Token, erc721TokenId } = order ;
738+
739+ // TODO(johnrjj) - More validation here before we match on-chain
740+ } else if ( 'erc1155Token' in order ) {
741+ const { erc1155TokenAmount, erc1155Token, erc1155TokenId } = order ;
742+ }
743+ } else if ( direction === TradeDirection . BuyNFT ) {
744+ }
745+ } ;
746+ }
747+
748+ interface VerifyOrderOptionsOverrides {
749+ verifyApproval ?: boolean ;
750+ verifyBalance : boolean ;
687751}
688752
689753export { NftSwapV4 } ;
0 commit comments