Skip to content

Commit b5715fe

Browse files
committed
Scaffold util functionos + better handling of buying nft with eth
1 parent 21b1630 commit b5715fe

File tree

1 file changed

+71
-7
lines changed

1 file changed

+71
-7
lines changed

src/sdk/v4/NftSwapV4.ts

Lines changed: 71 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ import {
5757
import { DIRECTION_MAPPING, OrderStatusV4, TradeDirection } from './enums';
5858
import { CONTRACT_ORDER_VALIDATOR } from './properties';
5959
import { getWrappedNativeToken } from '../../utils/addresses';
60+
import { ETH_ADDRESS_AS_ERC20 } from './constants';
6061

6162
export 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

689753
export { NftSwapV4 };

0 commit comments

Comments
 (0)