Skip to content

Commit 925da61

Browse files
committed
more configurability
1 parent 65e58f9 commit 925da61

File tree

3 files changed

+65
-77
lines changed

3 files changed

+65
-77
lines changed

src/sdk/v4/NftSwapV4.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,18 @@ import type {
4545
NftOrderV4Serialized,
4646
OrderStructOptionsCommonStrict,
4747
SignedNftOrderV4,
48+
SignedNftOrderV4Serialized,
4849
SigningOptions,
4950
} from './types';
5051
import {
5152
ERC1155_TRANSFER_FROM_DATA,
5253
ERC721_TRANSFER_FROM_DATA,
5354
} from './nft-safe-transfer-from-data';
5455
import addresses from './addresses.json';
56+
import {
57+
ORDERBOOK_API_ROOT_URL_PRODUCTION,
58+
postOrderToOrderbook,
59+
} from './orderbook';
5560

5661
export enum SupportedChainIdsV4 {
5762
Ropsten = 3,
@@ -121,6 +126,7 @@ export interface INftSwapV4 extends BaseNftSwap {
121126

122127
export interface AdditionalSdkConfig {
123128
zeroExExchangeProxyContractAddress: string;
129+
orderbookRootUrl: string;
124130
}
125131

126132
class NftSwapV4 implements INftSwapV4 {
@@ -130,6 +136,8 @@ class NftSwapV4 implements INftSwapV4 {
130136
public exchangeProxy: IZeroEx;
131137
public exchangeProxyContractAddress: string;
132138

139+
public orderbookRootUrl: string;
140+
133141
constructor(
134142
provider: BaseProvider,
135143
signer: Signer,
@@ -155,6 +163,9 @@ class NftSwapV4 implements INftSwapV4 {
155163

156164
this.exchangeProxyContractAddress = zeroExExchangeContractAddress;
157165

166+
this.orderbookRootUrl =
167+
additionalConfig?.orderbookRootUrl ?? ORDERBOOK_API_ROOT_URL_PRODUCTION;
168+
158169
this.exchangeProxy = IZeroEx__factory.connect(
159170
zeroExExchangeContractAddress,
160171
signer ?? provider
@@ -567,6 +578,18 @@ class NftSwapV4 implements INftSwapV4 {
567578
console.log('unsupported order', signedOrder);
568579
throw new Error('unsupport signedOrder type');
569580
};
581+
582+
postOrder = (
583+
signedOrder: SignedNftOrderV4 | SignedNftOrderV4Serialized,
584+
chainId: string,
585+
metadata?: Record<string, string>
586+
) => {
587+
postOrderToOrderbook(signedOrder, chainId, metadata, {
588+
rootUrl: this.orderbookRootUrl,
589+
});
590+
};
591+
592+
getOrdersByWallet = () => {};
570593
}
571594

572595
export { NftSwapV4 };

src/sdk/v4/orderbook.ts

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,40 +3,62 @@ import type { SignedNftOrderV4, SignedNftOrderV4Serialized } from './types';
33
import { stringify } from '../../utils/query-string';
44
import { serializeNftOrder } from './pure';
55

6-
const PRODUCTION_ORDERBOOK_API_ROOT_URL = 'https://api.trader.xyz';
6+
export const ORDERBOOK_API_ROOT_URL_PRODUCTION = 'https://api.trader.xyz';
77

88
interface OrderbookRequestOptions {
99
rootUrl: string;
1010
}
1111

1212
interface PostOrderRequestPayload {
1313
order: SignedNftOrderV4Serialized;
14-
chainId: number;
14+
chainId: string;
1515
metadata?: Record<string, string>;
1616
}
1717

18+
export interface OrderDataPayload {
19+
erc20Token: string;
20+
erc20TokenAmount: string;
21+
nftToken: string;
22+
nftTokenId: string;
23+
nftTokenAmount: string;
24+
nftType: string;
25+
sellOrBuyNft: 'buy' | 'sell';
26+
chainId: string;
27+
order: SignedNftOrderV4Serialized;
28+
metadata: Record<string, string> | null;
29+
}
30+
31+
type PostOrderResponsePayload = OrderDataPayload;
32+
33+
interface SearchOrdersResponsePayload {
34+
orders: Array<OrderDataPayload>;
35+
}
36+
1837
const postOrderToOrderbook = async (
1938
signedOrder: SignedNftOrderV4,
20-
chainId: number,
39+
chainId: string,
2140
metadata: Record<string, string> = {},
2241
requestOptions?: Partial<OrderbookRequestOptions>,
2342
fetchFn: typeof unfetch = unfetch
24-
) => {
43+
): Promise<PostOrderResponsePayload> => {
2544
const payload: PostOrderRequestPayload = {
2645
order: serializeNftOrder(signedOrder),
2746
chainId,
2847
metadata,
2948
};
3049

31-
let rootUrl = requestOptions?.rootUrl ?? PRODUCTION_ORDERBOOK_API_ROOT_URL;
50+
let rootUrl = requestOptions?.rootUrl ?? ORDERBOOK_API_ROOT_URL_PRODUCTION;
3251

33-
const orderPostResult = await fetchFn(`${rootUrl}/orderbook/order`, {
34-
method: 'post',
35-
headers: {
36-
'Content-Type': 'application/json',
37-
},
38-
body: JSON.stringify(payload),
39-
})
52+
const orderPostResult: PostOrderResponsePayload = await fetchFn(
53+
`${rootUrl}/orderbook/order`,
54+
{
55+
method: 'post',
56+
headers: {
57+
'Content-Type': 'application/json',
58+
},
59+
body: JSON.stringify(payload),
60+
}
61+
)
4062
.then(async (res) => {
4163
if (!res.ok) {
4264
throw await res.json();
@@ -62,10 +84,10 @@ const searchOrderbook = async (
6284
filters: Partial<SearchParams>,
6385
requestOptions?: Partial<OrderbookRequestOptions>,
6486
fetchFn: typeof unfetch = unfetch
65-
) => {
87+
): Promise<SearchOrdersResponsePayload> => {
6688
const stringifiedQueryParams = stringify(filters);
6789

68-
let rootUrl = requestOptions?.rootUrl ?? PRODUCTION_ORDERBOOK_API_ROOT_URL;
90+
let rootUrl = requestOptions?.rootUrl ?? ORDERBOOK_API_ROOT_URL_PRODUCTION;
6991

7092
const findOrdersResult = await fetchFn(
7193
`${rootUrl}/orderbook/orders?${stringifiedQueryParams}`

test/v4/orderbook.test.ts

Lines changed: 6 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,13 @@ const MAKER_ASSET: SwappableAsset = {
5151
};
5252

5353
describe('NFTSwapV4', () => {
54-
it('v4 erc721 test', async () => {
54+
it('v4 erc721 test with orderbook e2e', async () => {
5555
// NOTE(johnrjj) - Assumes USDC and DAI are already approved w/ the ExchangeProxy
5656

5757
const v4Erc721Order = nftSwapperMaker.buildOrder(
5858
MAKER_ASSET,
5959
TAKER_ASSET,
6060
MAKER_WALLET_ADDRESS
61-
// {
62-
// // Fix dates and salt so we have reproducible tests
63-
// expiration: new Date(3000, 10, 1),
64-
// }
6561
);
6662

6763
const signedOrder = await nftSwapperMaker.signOrder(v4Erc721Order);
@@ -70,76 +66,23 @@ describe('NFTSwapV4', () => {
7066

7167
const createdOrder = await postOrderToOrderbook(
7268
signedOrder,
73-
ROPSTEN_CHAIN_ID,
69+
ROPSTEN_CHAIN_ID.toString(10),
7470
testMetadata
7571
);
7672

77-
expect(createdOrder.nonce).toEqual(v4Erc721Order.nonce);
73+
expect(createdOrder.order.nonce).toEqual(v4Erc721Order.nonce);
7874

79-
const foundOrders = await searchOrderbook({
75+
const orderSearch = await searchOrderbook({
8076
nonce: signedOrder.nonce.toString(),
8177
});
82-
const maybeOrder = first(foundOrders);
78+
const maybeOrder = first(orderSearch.orders);
8379

8480
expect((maybeOrder as any).order.nonce).toEqual(signedOrder.nonce);
8581
expect((maybeOrder as any).metadata).toEqual(testMetadata);
8682

8783
// const orderTofill = (maybeOrder as any).order as SignedNftOrderV4Serialized
88-
8984
// const fillTx = await nftSwapperMaker.fillSignedOrder(orderTofill);
9085
// const txReceipt = await fillTx.wait();
91-
// console.log('erc721 fill tx round trip with api', txReceipt.transactionHash);
92-
93-
// console.log('v4Erc721Order.nonce', v4Erc721Order.nonce.toString());
94-
95-
// const makerapprovalTx = await nftSwapperMaker.approveTokenOrNftByAsset(
96-
// MAKER_ASSET,
97-
// MAKER_WALLET_ADDRESS,
98-
// )
99-
// const makerApprovalTxHash = await (await makerapprovalTx.wait()).transactionHash
100-
// console.log('maker approval tx hash', makerApprovalTxHash)
101-
102-
// const takerApprovalTx = await nftSwapperMaker.approveTokenOrNftByAsset(
103-
// TAKER_ASSET,
104-
// MAKER_WALLET_ADDRESS,
105-
// )
106-
107-
// const takerApprovalTxHash = await (await takerApprovalTx.wait()).transactionHash
108-
// console.log('taker approval tx hash', takerApprovalTxHash)
109-
110-
// const signedOrder = await nftSwapperMaker.signOrder(v4Erc721Order);
111-
// console.log('erc721 signatuee', signedOrder.signature);
112-
// expect(signedOrder.signature.signatureType.toString()).toEqual('2');
113-
114-
// const fillTx = await nftSwapperMaker.fillSignedOrder(signedOrder);
115-
// const txReceipt = await fillTx.wait();
116-
// console.log('erc721 fill tx', txReceipt.transactionHash);
117-
118-
// expect(txReceipt.transactionHash).toBeTruthy();
119-
120-
// const normalizedOrder = normalizeOrder(order);
121-
// const signedOrder = await nftSwapperMaker.signOrder(
122-
// normalizedOrder,
123-
// );
124-
125-
// const normalizedSignedOrder = normalizeOrder(signedOrder);
126-
127-
// expect(normalizedSignedOrder.makerAddress.toLowerCase()).toBe(
128-
// MAKER_WALLET_ADDRESS.toLowerCase()
129-
// );
130-
131-
// Uncomment to actually fill order
132-
// const tx = await nftSwapperMaker.fillSignedOrder(signedOrder, undefined, {
133-
// gasPrice,
134-
// gasLimit: '500000',
135-
// // HACK(johnnrjj) - Rinkeby still has protocol fees, so we give it a little bit of ETH so its happy.
136-
// value: parseEther('0.01'),
137-
// });
138-
139-
// const txReceipt = await tx.wait();
140-
// expect(txReceipt.transactionHash).toBeTruthy();
141-
// console.log(`Swapped on Rinkeby (txHAsh: ${txReceipt.transactionIndex})`);
86+
// console.log(`Swapped on Ropsten (txHAsh: ${txReceipt.transactionIndex})`);
14287
});
14388
});
144-
145-
// https://polygon-mumbai.g.alchemy.com/v2/VMBpFqjMYv2w-MWnc9df92w3R2TpMvSG

0 commit comments

Comments
 (0)