@velora-dex/sdk 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +7 -0
- package/README.md +494 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/examples/customFetcher.d.ts +3 -0
- package/dist/examples/customFetcher.d.ts.map +1 -0
- package/dist/examples/delta.d.ts +2 -0
- package/dist/examples/delta.d.ts.map +1 -0
- package/dist/examples/ethersV6.d.ts +2 -0
- package/dist/examples/ethersV6.d.ts.map +1 -0
- package/dist/examples/limitOrders_all.d.ts +2 -0
- package/dist/examples/limitOrders_all.d.ts.map +1 -0
- package/dist/examples/limitOrders_partial.d.ts +2 -0
- package/dist/examples/limitOrders_partial.d.ts.map +1 -0
- package/dist/examples/limitOrders_postOrder.d.ts +2 -0
- package/dist/examples/limitOrders_postOrder.d.ts.map +1 -0
- package/dist/examples/partial.d.ts +2 -0
- package/dist/examples/partial.d.ts.map +1 -0
- package/dist/examples/quote.d.ts +2 -0
- package/dist/examples/quote.d.ts.map +1 -0
- package/dist/examples/sdk.d.ts +2 -0
- package/dist/examples/sdk.d.ts.map +1 -0
- package/dist/examples/simple.d.ts +2 -0
- package/dist/examples/simple.d.ts.map +1 -0
- package/dist/examples/simpleQuote.d.ts +2 -0
- package/dist/examples/simpleQuote.d.ts.map +1 -0
- package/dist/examples/viem.d.ts +2 -0
- package/dist/examples/viem.d.ts.map +1 -0
- package/dist/examples/wagmi.d.ts +43 -0
- package/dist/examples/wagmi.d.ts.map +1 -0
- package/dist/examples/web3.d.ts +2 -0
- package/dist/examples/web3.d.ts.map +1 -0
- package/dist/gas.d.ts +8 -0
- package/dist/gas.d.ts.map +1 -0
- package/dist/helpers/approve.d.ts +8 -0
- package/dist/helpers/approve.d.ts.map +1 -0
- package/dist/helpers/fetchers/axios.d.ts +5 -0
- package/dist/helpers/fetchers/axios.d.ts.map +1 -0
- package/dist/helpers/fetchers/fetch.d.ts +5 -0
- package/dist/helpers/fetchers/fetch.d.ts.map +1 -0
- package/dist/helpers/index.d.ts +13 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/misc.d.ts +48 -0
- package/dist/helpers/misc.d.ts.map +1 -0
- package/dist/helpers/providers/ethers.d.ts +10 -0
- package/dist/helpers/providers/ethers.d.ts.map +1 -0
- package/dist/helpers/providers/ethersV6.d.ts +8 -0
- package/dist/helpers/providers/ethersV6.d.ts.map +1 -0
- package/dist/helpers/providers/helpers.d.ts +3 -0
- package/dist/helpers/providers/helpers.d.ts.map +1 -0
- package/dist/helpers/providers/viem.d.ts +23 -0
- package/dist/helpers/providers/viem.d.ts.map +1 -0
- package/dist/helpers/providers/web3.d.ts +9 -0
- package/dist/helpers/providers/web3.d.ts.map +1 -0
- package/dist/helpers/token.d.ts +38 -0
- package/dist/helpers/token.d.ts.map +1 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/methods/common/orders/buildOrderData.d.ts +27 -0
- package/dist/methods/common/orders/buildOrderData.d.ts.map +1 -0
- package/dist/methods/common/orders/encoding.d.ts +23 -0
- package/dist/methods/common/orders/encoding.d.ts.map +1 -0
- package/dist/methods/common/orders/misc.d.ts +27 -0
- package/dist/methods/common/orders/misc.d.ts.map +1 -0
- package/dist/methods/common/orders/signature.d.ts +9 -0
- package/dist/methods/common/orders/signature.d.ts.map +1 -0
- package/dist/methods/common/orders/types.d.ts +8 -0
- package/dist/methods/common/orders/types.d.ts.map +1 -0
- package/dist/methods/delta/approveForDelta.d.ts +8 -0
- package/dist/methods/delta/approveForDelta.d.ts.map +1 -0
- package/dist/methods/delta/buildCrosschainOrderBridge.d.ts +23 -0
- package/dist/methods/delta/buildCrosschainOrderBridge.d.ts.map +1 -0
- package/dist/methods/delta/buildDeltaOrder.d.ts +49 -0
- package/dist/methods/delta/buildDeltaOrder.d.ts.map +1 -0
- package/dist/methods/delta/getBridgeInfo.d.ts +9 -0
- package/dist/methods/delta/getBridgeInfo.d.ts.map +1 -0
- package/dist/methods/delta/getDeltaContract.d.ts +9 -0
- package/dist/methods/delta/getDeltaContract.d.ts.map +1 -0
- package/dist/methods/delta/getDeltaOrders.d.ts +22 -0
- package/dist/methods/delta/getDeltaOrders.d.ts.map +1 -0
- package/dist/methods/delta/getDeltaPrice.d.ts +58 -0
- package/dist/methods/delta/getDeltaPrice.d.ts.map +1 -0
- package/dist/methods/delta/getMulticallHandlers.d.ts +9 -0
- package/dist/methods/delta/getMulticallHandlers.d.ts.map +1 -0
- package/dist/methods/delta/getPartnerFee.d.ts +16 -0
- package/dist/methods/delta/getPartnerFee.d.ts.map +1 -0
- package/dist/methods/delta/helpers/across.d.ts +22 -0
- package/dist/methods/delta/helpers/across.d.ts.map +1 -0
- package/dist/methods/delta/helpers/buildDeltaOrderData.d.ts +35 -0
- package/dist/methods/delta/helpers/buildDeltaOrderData.d.ts.map +1 -0
- package/dist/methods/delta/helpers/composePermit.d.ts +5 -0
- package/dist/methods/delta/helpers/composePermit.d.ts.map +1 -0
- package/dist/methods/delta/helpers/misc.d.ts +3 -0
- package/dist/methods/delta/helpers/misc.d.ts.map +1 -0
- package/dist/methods/delta/helpers/types.d.ts +96 -0
- package/dist/methods/delta/helpers/types.d.ts.map +1 -0
- package/dist/methods/delta/index.d.ts +28 -0
- package/dist/methods/delta/index.d.ts.map +1 -0
- package/dist/methods/delta/isTokenSupportedInDelta.d.ts +8 -0
- package/dist/methods/delta/isTokenSupportedInDelta.d.ts.map +1 -0
- package/dist/methods/delta/postDeltaOrder.d.ts +23 -0
- package/dist/methods/delta/postDeltaOrder.d.ts.map +1 -0
- package/dist/methods/delta/signDeltaOrder.d.ts +12 -0
- package/dist/methods/delta/signDeltaOrder.d.ts.map +1 -0
- package/dist/methods/limitOrders/approveForOrder.d.ts +12 -0
- package/dist/methods/limitOrders/approveForOrder.d.ts.map +1 -0
- package/dist/methods/limitOrders/buildOrder.d.ts +11 -0
- package/dist/methods/limitOrders/buildOrder.d.ts.map +1 -0
- package/dist/methods/limitOrders/cancelOrder.d.ts +9 -0
- package/dist/methods/limitOrders/cancelOrder.d.ts.map +1 -0
- package/dist/methods/limitOrders/fillOrderDirectly.d.ts +30 -0
- package/dist/methods/limitOrders/fillOrderDirectly.d.ts.map +1 -0
- package/dist/methods/limitOrders/getOrders.d.ts +39 -0
- package/dist/methods/limitOrders/getOrders.d.ts.map +1 -0
- package/dist/methods/limitOrders/getOrdersContract.d.ts +8 -0
- package/dist/methods/limitOrders/getOrdersContract.d.ts.map +1 -0
- package/dist/methods/limitOrders/helpers/buildOrderData.d.ts +43 -0
- package/dist/methods/limitOrders/helpers/buildOrderData.d.ts.map +1 -0
- package/dist/methods/limitOrders/helpers/misc.d.ts +9 -0
- package/dist/methods/limitOrders/helpers/misc.d.ts.map +1 -0
- package/dist/methods/limitOrders/helpers/types.d.ts +49 -0
- package/dist/methods/limitOrders/helpers/types.d.ts.map +1 -0
- package/dist/methods/limitOrders/index.d.ts +30 -0
- package/dist/methods/limitOrders/index.d.ts.map +1 -0
- package/dist/methods/limitOrders/postOrder.d.ts +10 -0
- package/dist/methods/limitOrders/postOrder.d.ts.map +1 -0
- package/dist/methods/limitOrders/signOrder.d.ts +7 -0
- package/dist/methods/limitOrders/signOrder.d.ts.map +1 -0
- package/dist/methods/limitOrders/transaction.d.ts +23 -0
- package/dist/methods/limitOrders/transaction.d.ts.map +1 -0
- package/dist/methods/nftOrders/approveForOrder.d.ts +12 -0
- package/dist/methods/nftOrders/approveForOrder.d.ts.map +1 -0
- package/dist/methods/nftOrders/buildOrder.d.ts +11 -0
- package/dist/methods/nftOrders/buildOrder.d.ts.map +1 -0
- package/dist/methods/nftOrders/cancelOrder.d.ts +8 -0
- package/dist/methods/nftOrders/cancelOrder.d.ts.map +1 -0
- package/dist/methods/nftOrders/getOrders.d.ts +18 -0
- package/dist/methods/nftOrders/getOrders.d.ts.map +1 -0
- package/dist/methods/nftOrders/getOrdersContract.d.ts +8 -0
- package/dist/methods/nftOrders/getOrdersContract.d.ts.map +1 -0
- package/dist/methods/nftOrders/helpers/buildOrderData.d.ts +52 -0
- package/dist/methods/nftOrders/helpers/buildOrderData.d.ts.map +1 -0
- package/dist/methods/nftOrders/helpers/misc.d.ts +13 -0
- package/dist/methods/nftOrders/helpers/misc.d.ts.map +1 -0
- package/dist/methods/nftOrders/helpers/types.d.ts +39 -0
- package/dist/methods/nftOrders/helpers/types.d.ts.map +1 -0
- package/dist/methods/nftOrders/index.d.ts +23 -0
- package/dist/methods/nftOrders/index.d.ts.map +1 -0
- package/dist/methods/nftOrders/postOrder.d.ts +10 -0
- package/dist/methods/nftOrders/postOrder.d.ts.map +1 -0
- package/dist/methods/nftOrders/signOrder.d.ts +7 -0
- package/dist/methods/nftOrders/signOrder.d.ts.map +1 -0
- package/dist/methods/nftOrders/transaction.d.ts +23 -0
- package/dist/methods/nftOrders/transaction.d.ts.map +1 -0
- package/dist/methods/quote/getQuote.d.ts +51 -0
- package/dist/methods/quote/getQuote.d.ts.map +1 -0
- package/dist/methods/swap/adapters.d.ts +8 -0
- package/dist/methods/swap/adapters.d.ts.map +1 -0
- package/dist/methods/swap/approve.d.ts +10 -0
- package/dist/methods/swap/approve.d.ts.map +1 -0
- package/dist/methods/swap/balance.d.ts +23 -0
- package/dist/methods/swap/balance.d.ts.map +1 -0
- package/dist/methods/swap/helpers/normalizeRateOptions.d.ts +12 -0
- package/dist/methods/swap/helpers/normalizeRateOptions.d.ts.map +1 -0
- package/dist/methods/swap/index.d.ts +13 -0
- package/dist/methods/swap/index.d.ts.map +1 -0
- package/dist/methods/swap/rates.d.ts +52 -0
- package/dist/methods/swap/rates.d.ts.map +1 -0
- package/dist/methods/swap/spender.d.ts +21 -0
- package/dist/methods/swap/spender.d.ts.map +1 -0
- package/dist/methods/swap/swapTx.d.ts +158 -0
- package/dist/methods/swap/swapTx.d.ts.map +1 -0
- package/dist/methods/swap/token.d.ts +8 -0
- package/dist/methods/swap/token.d.ts.map +1 -0
- package/dist/methods/swap/transaction.d.ts +115 -0
- package/dist/methods/swap/transaction.d.ts.map +1 -0
- package/dist/sdk/full.d.ts +17 -0
- package/dist/sdk/full.d.ts.map +1 -0
- package/dist/sdk/partial.d.ts +31 -0
- package/dist/sdk/partial.d.ts.map +1 -0
- package/dist/sdk/simple.d.ts +75 -0
- package/dist/sdk/simple.d.ts.map +1 -0
- package/dist/sdk.cjs.development.js +5182 -0
- package/dist/sdk.cjs.development.js.map +1 -0
- package/dist/sdk.cjs.production.min.js +2 -0
- package/dist/sdk.cjs.production.min.js.map +1 -0
- package/dist/sdk.esm.js +5102 -0
- package/dist/sdk.esm.js.map +1 -0
- package/dist/types.d.ts +161 -0
- package/dist/types.d.ts.map +1 -0
- package/docs/DELTA.md +207 -0
- package/package.json +126 -0
- package/src/constants.ts +16 -0
- package/src/examples/customFetcher.ts +44 -0
- package/src/examples/delta.ts +127 -0
- package/src/examples/ethersV6.ts +38 -0
- package/src/examples/limitOrders_all.ts +135 -0
- package/src/examples/limitOrders_partial.ts +171 -0
- package/src/examples/limitOrders_postOrder.ts +77 -0
- package/src/examples/partial.ts +34 -0
- package/src/examples/quote.ts +205 -0
- package/src/examples/sdk.ts +39 -0
- package/src/examples/simple.ts +44 -0
- package/src/examples/simpleQuote.ts +98 -0
- package/src/examples/viem.ts +120 -0
- package/src/examples/wagmi.ts +68 -0
- package/src/examples/web3.ts +32 -0
- package/src/gas.ts +7 -0
- package/src/helpers/approve.ts +60 -0
- package/src/helpers/fetchers/axios.ts +34 -0
- package/src/helpers/fetchers/fetch.ts +67 -0
- package/src/helpers/index.ts +27 -0
- package/src/helpers/misc.ts +160 -0
- package/src/helpers/providers/ethers.ts +192 -0
- package/src/helpers/providers/ethersV6.ts +121 -0
- package/src/helpers/providers/helpers.ts +36 -0
- package/src/helpers/providers/viem.ts +205 -0
- package/src/helpers/providers/web3.ts +154 -0
- package/src/helpers/token.ts +75 -0
- package/src/index.ts +425 -0
- package/src/methods/common/orders/buildOrderData.ts +29 -0
- package/src/methods/common/orders/encoding.ts +216 -0
- package/src/methods/common/orders/misc.ts +86 -0
- package/src/methods/common/orders/signature.ts +68 -0
- package/src/methods/common/orders/types.ts +13 -0
- package/src/methods/delta/approveForDelta.ts +38 -0
- package/src/methods/delta/buildCrosschainOrderBridge.ts +84 -0
- package/src/methods/delta/buildDeltaOrder.ts +192 -0
- package/src/methods/delta/getBridgeInfo.ts +38 -0
- package/src/methods/delta/getDeltaContract.ts +29 -0
- package/src/methods/delta/getDeltaOrders.ts +102 -0
- package/src/methods/delta/getDeltaPrice.ts +122 -0
- package/src/methods/delta/getMulticallHandlers.ts +44 -0
- package/src/methods/delta/getPartnerFee.ts +58 -0
- package/src/methods/delta/helpers/across.ts +255 -0
- package/src/methods/delta/helpers/buildDeltaOrderData.ts +153 -0
- package/src/methods/delta/helpers/composePermit.ts +76 -0
- package/src/methods/delta/helpers/misc.ts +32 -0
- package/src/methods/delta/helpers/types.ts +110 -0
- package/src/methods/delta/index.ts +146 -0
- package/src/methods/delta/isTokenSupportedInDelta.ts +54 -0
- package/src/methods/delta/postDeltaOrder.ts +50 -0
- package/src/methods/delta/signDeltaOrder.ts +41 -0
- package/src/methods/limitOrders/approveForOrder.ts +36 -0
- package/src/methods/limitOrders/buildOrder.ts +56 -0
- package/src/methods/limitOrders/cancelOrder.ts +111 -0
- package/src/methods/limitOrders/fillOrderDirectly.ts +277 -0
- package/src/methods/limitOrders/getOrders.ts +151 -0
- package/src/methods/limitOrders/getOrdersContract.ts +20 -0
- package/src/methods/limitOrders/helpers/buildOrderData.ts +121 -0
- package/src/methods/limitOrders/helpers/misc.ts +64 -0
- package/src/methods/limitOrders/helpers/types.ts +70 -0
- package/src/methods/limitOrders/index.ts +154 -0
- package/src/methods/limitOrders/postOrder.ts +74 -0
- package/src/methods/limitOrders/signOrder.ts +29 -0
- package/src/methods/limitOrders/transaction.ts +231 -0
- package/src/methods/nftOrders/approveForOrder.ts +79 -0
- package/src/methods/nftOrders/buildOrder.ts +52 -0
- package/src/methods/nftOrders/cancelOrder.ts +23 -0
- package/src/methods/nftOrders/getOrders.ts +84 -0
- package/src/methods/nftOrders/getOrdersContract.ts +24 -0
- package/src/methods/nftOrders/helpers/buildOrderData.ts +131 -0
- package/src/methods/nftOrders/helpers/misc.ts +92 -0
- package/src/methods/nftOrders/helpers/types.ts +50 -0
- package/src/methods/nftOrders/index.ts +139 -0
- package/src/methods/nftOrders/postOrder.ts +71 -0
- package/src/methods/nftOrders/signOrder.ts +29 -0
- package/src/methods/nftOrders/transaction.ts +234 -0
- package/src/methods/quote/getQuote.ts +131 -0
- package/src/methods/swap/adapters.ts +49 -0
- package/src/methods/swap/approve.ts +51 -0
- package/src/methods/swap/balance.ts +147 -0
- package/src/methods/swap/helpers/normalizeRateOptions.ts +55 -0
- package/src/methods/swap/index.ts +38 -0
- package/src/methods/swap/rates.ts +276 -0
- package/src/methods/swap/spender.ts +76 -0
- package/src/methods/swap/swapTx.ts +266 -0
- package/src/methods/swap/token.ts +35 -0
- package/src/methods/swap/transaction.ts +310 -0
- package/src/sdk/full.ts +54 -0
- package/src/sdk/partial.ts +107 -0
- package/src/sdk/simple.ts +429 -0
- package/src/types.ts +240 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BaseFetchUrl,
|
|
3
|
+
baseFetchUrlGetterFactory,
|
|
4
|
+
BaseFetchUrlInputConstructor,
|
|
5
|
+
MinFetchUrl,
|
|
6
|
+
} from '../../common/orders/misc';
|
|
7
|
+
import {
|
|
8
|
+
assetAddressToUint,
|
|
9
|
+
BuildNFTOrderDataInput,
|
|
10
|
+
NFTOrderData,
|
|
11
|
+
} from './buildOrderData';
|
|
12
|
+
|
|
13
|
+
// any number can be assigned to AssetType enum
|
|
14
|
+
// https://github.com/Microsoft/TypeScript/issues/22311
|
|
15
|
+
// export enum AssetType {
|
|
16
|
+
// ERC20 = 0,
|
|
17
|
+
// ERC1155 = 1,
|
|
18
|
+
// ERC721 = 2,
|
|
19
|
+
// }
|
|
20
|
+
|
|
21
|
+
export const AssetType = {
|
|
22
|
+
ERC20: 0,
|
|
23
|
+
ERC1155: 1,
|
|
24
|
+
ERC721: 2,
|
|
25
|
+
} as const;
|
|
26
|
+
|
|
27
|
+
export function sanitizeOrderData({
|
|
28
|
+
nonceAndMeta,
|
|
29
|
+
expiry,
|
|
30
|
+
makerAsset: _makerAsset,
|
|
31
|
+
takerAsset: _takerAsset,
|
|
32
|
+
maker,
|
|
33
|
+
taker,
|
|
34
|
+
makerAmount,
|
|
35
|
+
takerAmount,
|
|
36
|
+
makerAssetId,
|
|
37
|
+
takerAssetId,
|
|
38
|
+
// asset types provided when Order has them ,e.g. got Order by hash from API
|
|
39
|
+
makerAssetType,
|
|
40
|
+
takerAssetType,
|
|
41
|
+
}: NFTOrderData &
|
|
42
|
+
Partial<Pick<BuildNFTOrderDataInput, 'makerAssetType' | 'takerAssetType'>> &
|
|
43
|
+
Record<string, any>): NFTOrderData {
|
|
44
|
+
const makerAsset =
|
|
45
|
+
makerAssetType !== undefined && _makerAsset.startsWith('0x')
|
|
46
|
+
? assetAddressToUint(_makerAsset, makerAssetType)
|
|
47
|
+
: _makerAsset;
|
|
48
|
+
const takerAsset =
|
|
49
|
+
takerAssetType !== undefined && _takerAsset.startsWith('0x')
|
|
50
|
+
? assetAddressToUint(_takerAsset, takerAssetType)
|
|
51
|
+
: _takerAsset;
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
nonceAndMeta,
|
|
55
|
+
expiry,
|
|
56
|
+
makerAsset,
|
|
57
|
+
takerAsset,
|
|
58
|
+
maker,
|
|
59
|
+
taker,
|
|
60
|
+
makerAmount,
|
|
61
|
+
takerAmount,
|
|
62
|
+
makerAssetId,
|
|
63
|
+
takerAssetId,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/*
|
|
68
|
+
GET
|
|
69
|
+
/nft/orders/:chainId/maker/:walletAddress
|
|
70
|
+
/nft/orders/:chainId/taker/:walletAddress
|
|
71
|
+
/nft/p2p/:chainId/maker/:walletAddress
|
|
72
|
+
/nft/p2p/:chainId/taker/:walletAddress
|
|
73
|
+
*/
|
|
74
|
+
export type GetOrdersURLs = `${BaseFetchUrl<'nft'>}/${
|
|
75
|
+
| 'taker'
|
|
76
|
+
| 'maker'}/${string}`;
|
|
77
|
+
|
|
78
|
+
/*
|
|
79
|
+
GET
|
|
80
|
+
/nft/order/:orderHash (get you p2p or orders)
|
|
81
|
+
*/
|
|
82
|
+
export type GetOrderURL = `${MinFetchUrl<'nft'>}/${string}`;
|
|
83
|
+
|
|
84
|
+
/*
|
|
85
|
+
POST create order
|
|
86
|
+
/nft/orders/:chainId/
|
|
87
|
+
/nft/p2p/:chainId/
|
|
88
|
+
*/
|
|
89
|
+
export type PostOrderURLs = BaseFetchUrl<'nft'>;
|
|
90
|
+
|
|
91
|
+
export const constructBaseFetchUrlGetter: BaseFetchUrlInputConstructor<'nft'> =
|
|
92
|
+
baseFetchUrlGetterFactory('nft');
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Address } from '../../../types';
|
|
2
|
+
import type { NFTOrderData } from './buildOrderData';
|
|
3
|
+
import type { AssetType } from './misc';
|
|
4
|
+
|
|
5
|
+
export type NFTOrderTransaction = {
|
|
6
|
+
hash: string;
|
|
7
|
+
event_type: 'OrderFilled' | 'OrderCancelled';
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export type NFTOrderType = 'LIMIT' | 'P2P';
|
|
11
|
+
|
|
12
|
+
export type NFTOrderToSend = NFTOrderData & {
|
|
13
|
+
signature: string;
|
|
14
|
+
permitMakerAsset?: string;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// display states such as EXPIRED and PARTIALLY_FILLLED derived on client side
|
|
18
|
+
// returned by API but can be calculated too, EXPIRED == order.expiry < Date.now()/1000
|
|
19
|
+
// PARTIALLY_FILLED == order.fillableBalance < order.makerAmount && order.fillableBalance !== '0'
|
|
20
|
+
export type NFTOrderState = 'PENDING' | 'FULFILLED' | 'CANCELLED' | 'EXPIRED';
|
|
21
|
+
|
|
22
|
+
export type NFTOrderFromAPI = NFTOrderToSend & {
|
|
23
|
+
chainId: number;
|
|
24
|
+
makerAsset: Address;
|
|
25
|
+
takerAsset: Address;
|
|
26
|
+
createdAt: number; // timestamp
|
|
27
|
+
updatedAt: number; // timestamp
|
|
28
|
+
makerAssetType: AssetTypeVariant;
|
|
29
|
+
takerAssetType: AssetTypeVariant;
|
|
30
|
+
makerBalance: string; // min(fillableBalance, allowance(maker), balance(maker)]
|
|
31
|
+
fillableBalance: string; // amount that remains to be filled
|
|
32
|
+
orderHash: string;
|
|
33
|
+
permitMakerAsset: null | string;
|
|
34
|
+
state: NFTOrderState;
|
|
35
|
+
takerFromMeta: string; // the intended receiver, eg receiving address of p2p order where `taker` would be augustus
|
|
36
|
+
type: NFTOrderType;
|
|
37
|
+
/** @description transaction with the last event pertaining to the order: OrderFilled or OrderCancelled */
|
|
38
|
+
transactionHash: null | string;
|
|
39
|
+
// not yet returned
|
|
40
|
+
// transactions: NftOrderTransaction[];
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export type NFTOrdersApiResponse = {
|
|
44
|
+
orders: NFTOrderFromAPI[];
|
|
45
|
+
};
|
|
46
|
+
export type NFTOrderApiResponse = {
|
|
47
|
+
order: NFTOrderFromAPI;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export type AssetTypeVariant = (typeof AssetType)[keyof typeof AssetType];
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ConstructProviderFetchInput,
|
|
3
|
+
RequestParameters,
|
|
4
|
+
} from '../../types';
|
|
5
|
+
import type { NFTOrderToSend, NFTOrderFromAPI } from './helpers/types';
|
|
6
|
+
import {
|
|
7
|
+
BuildNFTOrderFunctions,
|
|
8
|
+
BuildNFTOrderInput,
|
|
9
|
+
constructBuildNFTOrder,
|
|
10
|
+
} from './buildOrder';
|
|
11
|
+
import {
|
|
12
|
+
CancelNFTOrderFunctions,
|
|
13
|
+
constructCancelNFTOrder,
|
|
14
|
+
} from './cancelOrder';
|
|
15
|
+
import { constructGetNFTOrders, GetNFTOrdersFunctions } from './getOrders';
|
|
16
|
+
import { constructPostNFTOrder, PostNFTOrderFunctions } from './postOrder';
|
|
17
|
+
import { constructSignNFTOrder, SignNFTOrderFunctions } from './signOrder';
|
|
18
|
+
import {
|
|
19
|
+
constructApproveTokenForNFTOrder,
|
|
20
|
+
ApproveTokenForNFTOrderFunctions,
|
|
21
|
+
} from './approveForOrder';
|
|
22
|
+
import {
|
|
23
|
+
GetNFTOrdersContractFunctions,
|
|
24
|
+
constructGetNFTOrdersContract,
|
|
25
|
+
} from './getOrdersContract';
|
|
26
|
+
import {
|
|
27
|
+
BuildNFTOrdersTxFunctions,
|
|
28
|
+
constructBuildNFTOrderTx,
|
|
29
|
+
} from './transaction';
|
|
30
|
+
|
|
31
|
+
type SubmitNFTOrder = (
|
|
32
|
+
buildNFTOrderParams: BuildNFTOrderInput,
|
|
33
|
+
extra?: { permitMakerAsset?: string },
|
|
34
|
+
requestParams?: RequestParameters
|
|
35
|
+
) => Promise<NFTOrderFromAPI>;
|
|
36
|
+
|
|
37
|
+
export type SubmitNFTOrderFuncs = {
|
|
38
|
+
submitNFTOrder: SubmitNFTOrder;
|
|
39
|
+
submitP2POrder: SubmitNFTOrder;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const constructSubmitNFTOrder = (
|
|
43
|
+
options: ConstructProviderFetchInput<any, 'signTypedDataCall'>
|
|
44
|
+
): SubmitNFTOrderFuncs => {
|
|
45
|
+
const { buildNFTOrder } = constructBuildNFTOrder(options);
|
|
46
|
+
const { signNFTOrder } = constructSignNFTOrder(options);
|
|
47
|
+
const { postNFTLimitOrder, postNFTP2POrder } = constructPostNFTOrder(options);
|
|
48
|
+
|
|
49
|
+
const prepareNFTOrder = async (
|
|
50
|
+
buildNFTOrderParams: BuildNFTOrderInput,
|
|
51
|
+
extra?: { permitMakerAsset?: string }
|
|
52
|
+
): Promise<NFTOrderToSend> => {
|
|
53
|
+
const orderData = await buildNFTOrder(buildNFTOrderParams);
|
|
54
|
+
const signature = await signNFTOrder(orderData);
|
|
55
|
+
|
|
56
|
+
const orderWithSignature: NFTOrderToSend = {
|
|
57
|
+
...orderData.data,
|
|
58
|
+
...extra,
|
|
59
|
+
signature,
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
return orderWithSignature;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const submitNFTOrder: SubmitNFTOrder = async (
|
|
66
|
+
buildNFTOrderParams,
|
|
67
|
+
extra = {},
|
|
68
|
+
requestParams
|
|
69
|
+
) => {
|
|
70
|
+
const orderWithSignature: NFTOrderToSend = await prepareNFTOrder(
|
|
71
|
+
buildNFTOrderParams,
|
|
72
|
+
extra
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
const newOrder = await postNFTLimitOrder(orderWithSignature, requestParams);
|
|
76
|
+
|
|
77
|
+
return newOrder;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const submitP2POrder: SubmitNFTOrder = async (
|
|
81
|
+
buildNFTOrderParams,
|
|
82
|
+
extra = {},
|
|
83
|
+
requestParams
|
|
84
|
+
) => {
|
|
85
|
+
const orderWithSignature: NFTOrderToSend = await prepareNFTOrder(
|
|
86
|
+
buildNFTOrderParams,
|
|
87
|
+
extra
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
const newOrder = await postNFTP2POrder(orderWithSignature, requestParams);
|
|
91
|
+
|
|
92
|
+
return newOrder;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
return { submitNFTOrder, submitP2POrder };
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export type NFTOrderHandlers<T> = SubmitNFTOrderFuncs &
|
|
99
|
+
BuildNFTOrderFunctions &
|
|
100
|
+
SignNFTOrderFunctions &
|
|
101
|
+
PostNFTOrderFunctions &
|
|
102
|
+
GetNFTOrdersFunctions &
|
|
103
|
+
GetNFTOrdersContractFunctions &
|
|
104
|
+
BuildNFTOrdersTxFunctions &
|
|
105
|
+
CancelNFTOrderFunctions<T> &
|
|
106
|
+
ApproveTokenForNFTOrderFunctions<T>;
|
|
107
|
+
|
|
108
|
+
/** @description construct SDK with every NFTOrders-related method, fetching from API and contract calls */
|
|
109
|
+
export const constructAllNFTOrdersHandlers = <TxResponse>(
|
|
110
|
+
options: ConstructProviderFetchInput<
|
|
111
|
+
TxResponse,
|
|
112
|
+
'signTypedDataCall' | 'transactCall' | 'staticCall'
|
|
113
|
+
>
|
|
114
|
+
): NFTOrderHandlers<TxResponse> => {
|
|
115
|
+
const NFTOrdersGetters = constructGetNFTOrders(options);
|
|
116
|
+
const NFTOrdersContractGetter = constructGetNFTOrdersContract(options);
|
|
117
|
+
|
|
118
|
+
const NFTOrdersSubmit = constructSubmitNFTOrder(options);
|
|
119
|
+
const NFTOrdersBuild = constructBuildNFTOrder(options);
|
|
120
|
+
const NFTOrdersSign = constructSignNFTOrder(options);
|
|
121
|
+
const NFTOrdersPost = constructPostNFTOrder(options);
|
|
122
|
+
|
|
123
|
+
const NFTOrdersCancel = constructCancelNFTOrder(options);
|
|
124
|
+
const NFTOrdersApproveToken = constructApproveTokenForNFTOrder(options);
|
|
125
|
+
|
|
126
|
+
const NFTOrdersBuildTx = constructBuildNFTOrderTx(options);
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
...NFTOrdersGetters,
|
|
130
|
+
...NFTOrdersContractGetter,
|
|
131
|
+
...NFTOrdersSubmit,
|
|
132
|
+
...NFTOrdersBuild,
|
|
133
|
+
...NFTOrdersSign,
|
|
134
|
+
...NFTOrdersPost,
|
|
135
|
+
...NFTOrdersCancel,
|
|
136
|
+
...NFTOrdersApproveToken,
|
|
137
|
+
...NFTOrdersBuildTx,
|
|
138
|
+
};
|
|
139
|
+
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { API_URL } from '../../constants';
|
|
2
|
+
import type { ConstructFetchInput, RequestParameters } from '../../types';
|
|
3
|
+
import { constructBaseFetchUrlGetter, PostOrderURLs } from './helpers/misc';
|
|
4
|
+
import type {
|
|
5
|
+
NFTOrderToSend,
|
|
6
|
+
NFTOrderType,
|
|
7
|
+
NFTOrderFromAPI,
|
|
8
|
+
NFTOrderApiResponse,
|
|
9
|
+
} from './helpers/types';
|
|
10
|
+
|
|
11
|
+
type PostNFTOrder = (
|
|
12
|
+
NFTOrderWithSignatureAndPermit: NFTOrderToSend,
|
|
13
|
+
requestParams?: RequestParameters
|
|
14
|
+
) => Promise<NFTOrderFromAPI>;
|
|
15
|
+
|
|
16
|
+
export type PostNFTOrderFunctions = {
|
|
17
|
+
postNFTLimitOrder: PostNFTOrder;
|
|
18
|
+
postNFTP2POrder: PostNFTOrder;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const constructPostNFTOrder = ({
|
|
22
|
+
apiURL = API_URL,
|
|
23
|
+
chainId,
|
|
24
|
+
fetcher,
|
|
25
|
+
}: ConstructFetchInput): PostNFTOrderFunctions => {
|
|
26
|
+
const getBaseFetchURLByOrderType = constructBaseFetchUrlGetter({
|
|
27
|
+
apiURL,
|
|
28
|
+
chainId,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const postTypedOrder = async (
|
|
32
|
+
NFTOrderWithSignatureAndPermit: NFTOrderToSend,
|
|
33
|
+
type: NFTOrderType,
|
|
34
|
+
requestParams?: RequestParameters
|
|
35
|
+
): Promise<NFTOrderFromAPI> => {
|
|
36
|
+
const fetchURL = getBaseFetchURLByOrderType(type);
|
|
37
|
+
|
|
38
|
+
// @TODO check API return matches
|
|
39
|
+
const { order: newOrder } = await fetcher<
|
|
40
|
+
NFTOrderApiResponse,
|
|
41
|
+
PostOrderURLs
|
|
42
|
+
>({
|
|
43
|
+
url: fetchURL,
|
|
44
|
+
method: 'POST',
|
|
45
|
+
data: NFTOrderWithSignatureAndPermit,
|
|
46
|
+
requestParams,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
return { ...newOrder };
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const postNFTLimitOrder: PostNFTOrder = (
|
|
53
|
+
NFTOrderWithSignatureAndPermit,
|
|
54
|
+
requestParams
|
|
55
|
+
) => {
|
|
56
|
+
return postTypedOrder(
|
|
57
|
+
NFTOrderWithSignatureAndPermit,
|
|
58
|
+
'LIMIT',
|
|
59
|
+
requestParams
|
|
60
|
+
);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const postNFTP2POrder: PostNFTOrder = (
|
|
64
|
+
NFTOrderWithSignatureAndPermit,
|
|
65
|
+
requestParams
|
|
66
|
+
) => {
|
|
67
|
+
return postTypedOrder(NFTOrderWithSignatureAndPermit, 'P2P', requestParams);
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
return { postNFTLimitOrder, postNFTP2POrder };
|
|
71
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ConstructProviderFetchInput } from '../../types';
|
|
2
|
+
import type { SignableNFTOrderData } from './buildOrder';
|
|
3
|
+
import { sanitizeOrderData } from './helpers/misc';
|
|
4
|
+
|
|
5
|
+
export type SignNFTOrderFunctions = {
|
|
6
|
+
signNFTOrder: (signableOrderData: SignableNFTOrderData) => Promise<string>;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
// returns whatever `contractCaller` returns
|
|
10
|
+
// to allow for better versatility
|
|
11
|
+
export const constructSignNFTOrder = (
|
|
12
|
+
options: Pick<
|
|
13
|
+
ConstructProviderFetchInput<any, 'signTypedDataCall'>,
|
|
14
|
+
'contractCaller'
|
|
15
|
+
>
|
|
16
|
+
): SignNFTOrderFunctions => {
|
|
17
|
+
const signNFTOrder: SignNFTOrderFunctions['signNFTOrder'] = (typedData) => {
|
|
18
|
+
// types allow to pass OrderData & extra_stuff, but tx will break like that
|
|
19
|
+
const typedDataOnly: SignableNFTOrderData = {
|
|
20
|
+
...typedData,
|
|
21
|
+
// here assetType isn't provided, SignableData must already have corrent BigIntAsString
|
|
22
|
+
// @TODO consider using `template_${types}` for Address, likely bad idea when considering 3rd-party code
|
|
23
|
+
data: sanitizeOrderData(typedData.data),
|
|
24
|
+
};
|
|
25
|
+
return options.contractCaller.signTypedDataCall(typedDataOnly);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
return { signNFTOrder };
|
|
29
|
+
};
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import type { Address, ConstructFetchInput, OptimalRate } from '../../types';
|
|
2
|
+
|
|
3
|
+
import { assert } from 'ts-essentials';
|
|
4
|
+
import {
|
|
5
|
+
API_URL,
|
|
6
|
+
SwapSide,
|
|
7
|
+
ContractMethod,
|
|
8
|
+
DEFAULT_VERSION,
|
|
9
|
+
} from '../../constants';
|
|
10
|
+
import {
|
|
11
|
+
BuildNFTOrderTxInput,
|
|
12
|
+
BuildOptions,
|
|
13
|
+
BuildSwapAndNFTOrderTxInput,
|
|
14
|
+
TransactionParams,
|
|
15
|
+
constructBuildTx,
|
|
16
|
+
} from '../swap/transaction';
|
|
17
|
+
import { constructGetRate, GetRateInput, RateOptions } from '../swap/rates';
|
|
18
|
+
import type { BigIntAsString, NFTOrderData } from './buildOrder';
|
|
19
|
+
import { isFilledArray } from '../../helpers/misc';
|
|
20
|
+
import type { RequestParameters } from '../../types';
|
|
21
|
+
type MinBuildSwapAndNFTOrderTxInput = Omit<
|
|
22
|
+
// these are derived from `orders`
|
|
23
|
+
BuildSwapAndNFTOrderTxInput,
|
|
24
|
+
'srcToken' | 'srcAmount' | 'destToken' | 'destDecimals'
|
|
25
|
+
>;
|
|
26
|
+
|
|
27
|
+
type BuildSwapAndNFTOrdersTx = (
|
|
28
|
+
params: MinBuildSwapAndNFTOrderTxInput,
|
|
29
|
+
options?: BuildOptions,
|
|
30
|
+
requestParams?: RequestParameters
|
|
31
|
+
) => Promise<TransactionParams>;
|
|
32
|
+
|
|
33
|
+
type MinBuildNFTOrderTxInput = Omit<
|
|
34
|
+
BuildNFTOrderTxInput,
|
|
35
|
+
// these are derived from `orders`
|
|
36
|
+
'srcToken' | 'srcAmount' | 'destToken' | 'slippage'
|
|
37
|
+
// `slippage` doesn't participate as we derive `srcAmount` already
|
|
38
|
+
>;
|
|
39
|
+
|
|
40
|
+
type BuildNFTOrdersTx = (
|
|
41
|
+
params: MinBuildNFTOrderTxInput,
|
|
42
|
+
options?: BuildOptions,
|
|
43
|
+
requestParams?: RequestParameters
|
|
44
|
+
) => Promise<TransactionParams>;
|
|
45
|
+
|
|
46
|
+
export type BuildNFTOrdersTxFunctions = {
|
|
47
|
+
getNFTOrdersRate: GetNFTOrdersRate;
|
|
48
|
+
buildNFTOrderTx: BuildNFTOrdersTx;
|
|
49
|
+
buildSwapAndNFTOrderTx: BuildSwapAndNFTOrdersTx;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
type GetNFTOrdersRate = (
|
|
53
|
+
// `amount`, if given, must equal the total of the orders' `takerAmounts`
|
|
54
|
+
options: Omit<GetRateInput, 'amount' | 'side'> & { amount?: string },
|
|
55
|
+
orders: CheckableOrderData[],
|
|
56
|
+
requestParams?: RequestParameters
|
|
57
|
+
) => Promise<OptimalRate>;
|
|
58
|
+
|
|
59
|
+
export const constructBuildNFTOrderTx = ({
|
|
60
|
+
apiURL = API_URL,
|
|
61
|
+
version = DEFAULT_VERSION,
|
|
62
|
+
chainId,
|
|
63
|
+
fetcher,
|
|
64
|
+
}: ConstructFetchInput): BuildNFTOrdersTxFunctions => {
|
|
65
|
+
const { buildTx: buildSwapTx } = constructBuildTx({
|
|
66
|
+
apiURL,
|
|
67
|
+
version,
|
|
68
|
+
chainId,
|
|
69
|
+
fetcher,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
const { getRate: getSwapAndNFTOrderRate } = constructGetRate({
|
|
73
|
+
apiURL,
|
|
74
|
+
version,
|
|
75
|
+
chainId,
|
|
76
|
+
fetcher,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// returns priceRoute that would allow from swap from srcToken to destToken(=order.takerAsset) followed by filling NFT orders
|
|
80
|
+
const getNFTOrdersRate: GetNFTOrdersRate = async (
|
|
81
|
+
{ srcToken, destToken, amount, options: _options = {}, ...rest },
|
|
82
|
+
orders,
|
|
83
|
+
requestParams
|
|
84
|
+
) => {
|
|
85
|
+
assert(orders.length > 0, 'must pass at least 1 order');
|
|
86
|
+
|
|
87
|
+
const { totalTakerAmount, takerAsset } = checkAndParseOrders(orders);
|
|
88
|
+
|
|
89
|
+
assert(
|
|
90
|
+
takerAsset.toLowerCase() === destToken.toLowerCase(),
|
|
91
|
+
'All orders must have the same takerAsset as destToken'
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
const takerAmountString = totalTakerAmount.toString(10);
|
|
95
|
+
|
|
96
|
+
if (amount) {
|
|
97
|
+
assert(
|
|
98
|
+
amount === takerAmountString,
|
|
99
|
+
"`amount` must equal the total of the orders' `takerAmounts`"
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// The pricing must use includeContractMethods=simpleBuy and side=BUY
|
|
104
|
+
const options: RateOptions = {
|
|
105
|
+
..._options,
|
|
106
|
+
includeContractMethods: [ContractMethod.simpleBuy],
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const side = SwapSide.BUY;
|
|
110
|
+
|
|
111
|
+
const rateInput: GetRateInput = {
|
|
112
|
+
...rest,
|
|
113
|
+
srcToken,
|
|
114
|
+
destToken,
|
|
115
|
+
amount: takerAmountString,
|
|
116
|
+
side,
|
|
117
|
+
options,
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// priceRoute
|
|
121
|
+
const optimalRate = await getSwapAndNFTOrderRate(rateInput, requestParams);
|
|
122
|
+
return optimalRate;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
// derive srcToken, destToken and srcAmount from orders[]
|
|
126
|
+
const buildNFTOrderTx: BuildNFTOrdersTx = (
|
|
127
|
+
params,
|
|
128
|
+
options,
|
|
129
|
+
requestParams
|
|
130
|
+
) => {
|
|
131
|
+
const { takerAsset, totalTakerAmount } = checkAndParseOrders(params.orders);
|
|
132
|
+
|
|
133
|
+
const fillParams: BuildNFTOrderTxInput = {
|
|
134
|
+
...params,
|
|
135
|
+
// taker supplies takerAsset
|
|
136
|
+
srcToken: takerAsset,
|
|
137
|
+
srcAmount: totalTakerAmount.toString(10),
|
|
138
|
+
// taker gets makerAsset in the end
|
|
139
|
+
destToken: 'NFT', // support any NFT
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
return buildSwapTx(fillParams, options, requestParams);
|
|
143
|
+
};
|
|
144
|
+
const buildSwapAndNFTOrderTx: BuildSwapAndNFTOrdersTx = (
|
|
145
|
+
params,
|
|
146
|
+
options,
|
|
147
|
+
requestParams
|
|
148
|
+
) => {
|
|
149
|
+
checkAndParseOrders(params.orders);
|
|
150
|
+
|
|
151
|
+
const fillParams: BuildSwapAndNFTOrderTxInput = {
|
|
152
|
+
...params,
|
|
153
|
+
// taker supplies srcToken
|
|
154
|
+
srcToken: params.priceRoute.srcToken,
|
|
155
|
+
// one or the other
|
|
156
|
+
...(params.slippage
|
|
157
|
+
? { slippage: params.slippage }
|
|
158
|
+
: // may sneak in as part of `params`
|
|
159
|
+
{ srcAmount: params.priceRoute.srcAmount, slippage: undefined }),
|
|
160
|
+
destToken: 'NFT', // support any NFT,
|
|
161
|
+
destDecimals: params.priceRoute.destDecimals,
|
|
162
|
+
};
|
|
163
|
+
return buildSwapTx(fillParams, options, requestParams);
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
return {
|
|
167
|
+
getNFTOrdersRate,
|
|
168
|
+
buildNFTOrderTx,
|
|
169
|
+
buildSwapAndNFTOrderTx,
|
|
170
|
+
};
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
type CheckAndParseOrdersResult = Omit<CheckableOrderData, 'takerAmount'> & {
|
|
174
|
+
totalTakerAmount: bigint;
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
type CheckableOrderData = Pick<
|
|
178
|
+
NFTOrderData,
|
|
179
|
+
'takerAsset' | 'makerAsset' | 'takerAmount' | 'maker'
|
|
180
|
+
> & { taker?: NFTOrderData['taker'] };
|
|
181
|
+
|
|
182
|
+
function checkAndParseOrders(
|
|
183
|
+
orders: CheckableOrderData[]
|
|
184
|
+
): CheckAndParseOrdersResult {
|
|
185
|
+
assert(isFilledArray(orders), 'must pass at least 1 order');
|
|
186
|
+
|
|
187
|
+
const { takerAssetsSet, makerAssetsSet, totalTakerAmount } = orders.reduce<
|
|
188
|
+
Record<'takerAssetsSet' | 'makerAssetsSet', Set<string>> & {
|
|
189
|
+
totalTakerAmount: bigint;
|
|
190
|
+
}
|
|
191
|
+
>(
|
|
192
|
+
(accum, order) => {
|
|
193
|
+
accum.takerAssetsSet.add(order.takerAsset.toLowerCase());
|
|
194
|
+
accum.makerAssetsSet.add(order.makerAsset.toLowerCase());
|
|
195
|
+
|
|
196
|
+
accum.totalTakerAmount =
|
|
197
|
+
accum.totalTakerAmount + BigInt(order.takerAmount);
|
|
198
|
+
return accum;
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
takerAssetsSet: new Set(),
|
|
202
|
+
makerAssetsSet: new Set(),
|
|
203
|
+
totalTakerAmount: BigInt(0),
|
|
204
|
+
}
|
|
205
|
+
);
|
|
206
|
+
|
|
207
|
+
assert(
|
|
208
|
+
takerAssetsSet.size === 1,
|
|
209
|
+
'All orders must have the same takerAsset as destToken'
|
|
210
|
+
);
|
|
211
|
+
assert(makerAssetsSet.size === 1, 'All orders must have the same makerAsset');
|
|
212
|
+
|
|
213
|
+
const [{ maker, taker, makerAsset, takerAsset }] = orders;
|
|
214
|
+
|
|
215
|
+
return {
|
|
216
|
+
totalTakerAmount,
|
|
217
|
+
maker,
|
|
218
|
+
taker,
|
|
219
|
+
makerAsset: makerAsset.startsWith('0x')
|
|
220
|
+
? makerAsset
|
|
221
|
+
: uintToAssetAddress(makerAsset),
|
|
222
|
+
takerAsset: takerAsset.startsWith('0x')
|
|
223
|
+
? takerAsset
|
|
224
|
+
: uintToAssetAddress(takerAsset),
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// extract asset address from makerAsset or takerAsset packed number encoded to contain AssetType
|
|
229
|
+
function uintToAssetAddress(assetUint: BigIntAsString): Address {
|
|
230
|
+
return (
|
|
231
|
+
'0x' +
|
|
232
|
+
(BigInt(assetUint) & ((BigInt(1) << BigInt(160)) - BigInt(1))).toString(16)
|
|
233
|
+
);
|
|
234
|
+
}
|