@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.
Files changed (284) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +494 -0
  3. package/dist/constants.d.ts +7 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/examples/customFetcher.d.ts +3 -0
  6. package/dist/examples/customFetcher.d.ts.map +1 -0
  7. package/dist/examples/delta.d.ts +2 -0
  8. package/dist/examples/delta.d.ts.map +1 -0
  9. package/dist/examples/ethersV6.d.ts +2 -0
  10. package/dist/examples/ethersV6.d.ts.map +1 -0
  11. package/dist/examples/limitOrders_all.d.ts +2 -0
  12. package/dist/examples/limitOrders_all.d.ts.map +1 -0
  13. package/dist/examples/limitOrders_partial.d.ts +2 -0
  14. package/dist/examples/limitOrders_partial.d.ts.map +1 -0
  15. package/dist/examples/limitOrders_postOrder.d.ts +2 -0
  16. package/dist/examples/limitOrders_postOrder.d.ts.map +1 -0
  17. package/dist/examples/partial.d.ts +2 -0
  18. package/dist/examples/partial.d.ts.map +1 -0
  19. package/dist/examples/quote.d.ts +2 -0
  20. package/dist/examples/quote.d.ts.map +1 -0
  21. package/dist/examples/sdk.d.ts +2 -0
  22. package/dist/examples/sdk.d.ts.map +1 -0
  23. package/dist/examples/simple.d.ts +2 -0
  24. package/dist/examples/simple.d.ts.map +1 -0
  25. package/dist/examples/simpleQuote.d.ts +2 -0
  26. package/dist/examples/simpleQuote.d.ts.map +1 -0
  27. package/dist/examples/viem.d.ts +2 -0
  28. package/dist/examples/viem.d.ts.map +1 -0
  29. package/dist/examples/wagmi.d.ts +43 -0
  30. package/dist/examples/wagmi.d.ts.map +1 -0
  31. package/dist/examples/web3.d.ts +2 -0
  32. package/dist/examples/web3.d.ts.map +1 -0
  33. package/dist/gas.d.ts +8 -0
  34. package/dist/gas.d.ts.map +1 -0
  35. package/dist/helpers/approve.d.ts +8 -0
  36. package/dist/helpers/approve.d.ts.map +1 -0
  37. package/dist/helpers/fetchers/axios.d.ts +5 -0
  38. package/dist/helpers/fetchers/axios.d.ts.map +1 -0
  39. package/dist/helpers/fetchers/fetch.d.ts +5 -0
  40. package/dist/helpers/fetchers/fetch.d.ts.map +1 -0
  41. package/dist/helpers/index.d.ts +13 -0
  42. package/dist/helpers/index.d.ts.map +1 -0
  43. package/dist/helpers/misc.d.ts +48 -0
  44. package/dist/helpers/misc.d.ts.map +1 -0
  45. package/dist/helpers/providers/ethers.d.ts +10 -0
  46. package/dist/helpers/providers/ethers.d.ts.map +1 -0
  47. package/dist/helpers/providers/ethersV6.d.ts +8 -0
  48. package/dist/helpers/providers/ethersV6.d.ts.map +1 -0
  49. package/dist/helpers/providers/helpers.d.ts +3 -0
  50. package/dist/helpers/providers/helpers.d.ts.map +1 -0
  51. package/dist/helpers/providers/viem.d.ts +23 -0
  52. package/dist/helpers/providers/viem.d.ts.map +1 -0
  53. package/dist/helpers/providers/web3.d.ts +9 -0
  54. package/dist/helpers/providers/web3.d.ts.map +1 -0
  55. package/dist/helpers/token.d.ts +38 -0
  56. package/dist/helpers/token.d.ts.map +1 -0
  57. package/dist/index.d.ts +64 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +8 -0
  60. package/dist/methods/common/orders/buildOrderData.d.ts +27 -0
  61. package/dist/methods/common/orders/buildOrderData.d.ts.map +1 -0
  62. package/dist/methods/common/orders/encoding.d.ts +23 -0
  63. package/dist/methods/common/orders/encoding.d.ts.map +1 -0
  64. package/dist/methods/common/orders/misc.d.ts +27 -0
  65. package/dist/methods/common/orders/misc.d.ts.map +1 -0
  66. package/dist/methods/common/orders/signature.d.ts +9 -0
  67. package/dist/methods/common/orders/signature.d.ts.map +1 -0
  68. package/dist/methods/common/orders/types.d.ts +8 -0
  69. package/dist/methods/common/orders/types.d.ts.map +1 -0
  70. package/dist/methods/delta/approveForDelta.d.ts +8 -0
  71. package/dist/methods/delta/approveForDelta.d.ts.map +1 -0
  72. package/dist/methods/delta/buildCrosschainOrderBridge.d.ts +23 -0
  73. package/dist/methods/delta/buildCrosschainOrderBridge.d.ts.map +1 -0
  74. package/dist/methods/delta/buildDeltaOrder.d.ts +49 -0
  75. package/dist/methods/delta/buildDeltaOrder.d.ts.map +1 -0
  76. package/dist/methods/delta/getBridgeInfo.d.ts +9 -0
  77. package/dist/methods/delta/getBridgeInfo.d.ts.map +1 -0
  78. package/dist/methods/delta/getDeltaContract.d.ts +9 -0
  79. package/dist/methods/delta/getDeltaContract.d.ts.map +1 -0
  80. package/dist/methods/delta/getDeltaOrders.d.ts +22 -0
  81. package/dist/methods/delta/getDeltaOrders.d.ts.map +1 -0
  82. package/dist/methods/delta/getDeltaPrice.d.ts +58 -0
  83. package/dist/methods/delta/getDeltaPrice.d.ts.map +1 -0
  84. package/dist/methods/delta/getMulticallHandlers.d.ts +9 -0
  85. package/dist/methods/delta/getMulticallHandlers.d.ts.map +1 -0
  86. package/dist/methods/delta/getPartnerFee.d.ts +16 -0
  87. package/dist/methods/delta/getPartnerFee.d.ts.map +1 -0
  88. package/dist/methods/delta/helpers/across.d.ts +22 -0
  89. package/dist/methods/delta/helpers/across.d.ts.map +1 -0
  90. package/dist/methods/delta/helpers/buildDeltaOrderData.d.ts +35 -0
  91. package/dist/methods/delta/helpers/buildDeltaOrderData.d.ts.map +1 -0
  92. package/dist/methods/delta/helpers/composePermit.d.ts +5 -0
  93. package/dist/methods/delta/helpers/composePermit.d.ts.map +1 -0
  94. package/dist/methods/delta/helpers/misc.d.ts +3 -0
  95. package/dist/methods/delta/helpers/misc.d.ts.map +1 -0
  96. package/dist/methods/delta/helpers/types.d.ts +96 -0
  97. package/dist/methods/delta/helpers/types.d.ts.map +1 -0
  98. package/dist/methods/delta/index.d.ts +28 -0
  99. package/dist/methods/delta/index.d.ts.map +1 -0
  100. package/dist/methods/delta/isTokenSupportedInDelta.d.ts +8 -0
  101. package/dist/methods/delta/isTokenSupportedInDelta.d.ts.map +1 -0
  102. package/dist/methods/delta/postDeltaOrder.d.ts +23 -0
  103. package/dist/methods/delta/postDeltaOrder.d.ts.map +1 -0
  104. package/dist/methods/delta/signDeltaOrder.d.ts +12 -0
  105. package/dist/methods/delta/signDeltaOrder.d.ts.map +1 -0
  106. package/dist/methods/limitOrders/approveForOrder.d.ts +12 -0
  107. package/dist/methods/limitOrders/approveForOrder.d.ts.map +1 -0
  108. package/dist/methods/limitOrders/buildOrder.d.ts +11 -0
  109. package/dist/methods/limitOrders/buildOrder.d.ts.map +1 -0
  110. package/dist/methods/limitOrders/cancelOrder.d.ts +9 -0
  111. package/dist/methods/limitOrders/cancelOrder.d.ts.map +1 -0
  112. package/dist/methods/limitOrders/fillOrderDirectly.d.ts +30 -0
  113. package/dist/methods/limitOrders/fillOrderDirectly.d.ts.map +1 -0
  114. package/dist/methods/limitOrders/getOrders.d.ts +39 -0
  115. package/dist/methods/limitOrders/getOrders.d.ts.map +1 -0
  116. package/dist/methods/limitOrders/getOrdersContract.d.ts +8 -0
  117. package/dist/methods/limitOrders/getOrdersContract.d.ts.map +1 -0
  118. package/dist/methods/limitOrders/helpers/buildOrderData.d.ts +43 -0
  119. package/dist/methods/limitOrders/helpers/buildOrderData.d.ts.map +1 -0
  120. package/dist/methods/limitOrders/helpers/misc.d.ts +9 -0
  121. package/dist/methods/limitOrders/helpers/misc.d.ts.map +1 -0
  122. package/dist/methods/limitOrders/helpers/types.d.ts +49 -0
  123. package/dist/methods/limitOrders/helpers/types.d.ts.map +1 -0
  124. package/dist/methods/limitOrders/index.d.ts +30 -0
  125. package/dist/methods/limitOrders/index.d.ts.map +1 -0
  126. package/dist/methods/limitOrders/postOrder.d.ts +10 -0
  127. package/dist/methods/limitOrders/postOrder.d.ts.map +1 -0
  128. package/dist/methods/limitOrders/signOrder.d.ts +7 -0
  129. package/dist/methods/limitOrders/signOrder.d.ts.map +1 -0
  130. package/dist/methods/limitOrders/transaction.d.ts +23 -0
  131. package/dist/methods/limitOrders/transaction.d.ts.map +1 -0
  132. package/dist/methods/nftOrders/approveForOrder.d.ts +12 -0
  133. package/dist/methods/nftOrders/approveForOrder.d.ts.map +1 -0
  134. package/dist/methods/nftOrders/buildOrder.d.ts +11 -0
  135. package/dist/methods/nftOrders/buildOrder.d.ts.map +1 -0
  136. package/dist/methods/nftOrders/cancelOrder.d.ts +8 -0
  137. package/dist/methods/nftOrders/cancelOrder.d.ts.map +1 -0
  138. package/dist/methods/nftOrders/getOrders.d.ts +18 -0
  139. package/dist/methods/nftOrders/getOrders.d.ts.map +1 -0
  140. package/dist/methods/nftOrders/getOrdersContract.d.ts +8 -0
  141. package/dist/methods/nftOrders/getOrdersContract.d.ts.map +1 -0
  142. package/dist/methods/nftOrders/helpers/buildOrderData.d.ts +52 -0
  143. package/dist/methods/nftOrders/helpers/buildOrderData.d.ts.map +1 -0
  144. package/dist/methods/nftOrders/helpers/misc.d.ts +13 -0
  145. package/dist/methods/nftOrders/helpers/misc.d.ts.map +1 -0
  146. package/dist/methods/nftOrders/helpers/types.d.ts +39 -0
  147. package/dist/methods/nftOrders/helpers/types.d.ts.map +1 -0
  148. package/dist/methods/nftOrders/index.d.ts +23 -0
  149. package/dist/methods/nftOrders/index.d.ts.map +1 -0
  150. package/dist/methods/nftOrders/postOrder.d.ts +10 -0
  151. package/dist/methods/nftOrders/postOrder.d.ts.map +1 -0
  152. package/dist/methods/nftOrders/signOrder.d.ts +7 -0
  153. package/dist/methods/nftOrders/signOrder.d.ts.map +1 -0
  154. package/dist/methods/nftOrders/transaction.d.ts +23 -0
  155. package/dist/methods/nftOrders/transaction.d.ts.map +1 -0
  156. package/dist/methods/quote/getQuote.d.ts +51 -0
  157. package/dist/methods/quote/getQuote.d.ts.map +1 -0
  158. package/dist/methods/swap/adapters.d.ts +8 -0
  159. package/dist/methods/swap/adapters.d.ts.map +1 -0
  160. package/dist/methods/swap/approve.d.ts +10 -0
  161. package/dist/methods/swap/approve.d.ts.map +1 -0
  162. package/dist/methods/swap/balance.d.ts +23 -0
  163. package/dist/methods/swap/balance.d.ts.map +1 -0
  164. package/dist/methods/swap/helpers/normalizeRateOptions.d.ts +12 -0
  165. package/dist/methods/swap/helpers/normalizeRateOptions.d.ts.map +1 -0
  166. package/dist/methods/swap/index.d.ts +13 -0
  167. package/dist/methods/swap/index.d.ts.map +1 -0
  168. package/dist/methods/swap/rates.d.ts +52 -0
  169. package/dist/methods/swap/rates.d.ts.map +1 -0
  170. package/dist/methods/swap/spender.d.ts +21 -0
  171. package/dist/methods/swap/spender.d.ts.map +1 -0
  172. package/dist/methods/swap/swapTx.d.ts +158 -0
  173. package/dist/methods/swap/swapTx.d.ts.map +1 -0
  174. package/dist/methods/swap/token.d.ts +8 -0
  175. package/dist/methods/swap/token.d.ts.map +1 -0
  176. package/dist/methods/swap/transaction.d.ts +115 -0
  177. package/dist/methods/swap/transaction.d.ts.map +1 -0
  178. package/dist/sdk/full.d.ts +17 -0
  179. package/dist/sdk/full.d.ts.map +1 -0
  180. package/dist/sdk/partial.d.ts +31 -0
  181. package/dist/sdk/partial.d.ts.map +1 -0
  182. package/dist/sdk/simple.d.ts +75 -0
  183. package/dist/sdk/simple.d.ts.map +1 -0
  184. package/dist/sdk.cjs.development.js +5182 -0
  185. package/dist/sdk.cjs.development.js.map +1 -0
  186. package/dist/sdk.cjs.production.min.js +2 -0
  187. package/dist/sdk.cjs.production.min.js.map +1 -0
  188. package/dist/sdk.esm.js +5102 -0
  189. package/dist/sdk.esm.js.map +1 -0
  190. package/dist/types.d.ts +161 -0
  191. package/dist/types.d.ts.map +1 -0
  192. package/docs/DELTA.md +207 -0
  193. package/package.json +126 -0
  194. package/src/constants.ts +16 -0
  195. package/src/examples/customFetcher.ts +44 -0
  196. package/src/examples/delta.ts +127 -0
  197. package/src/examples/ethersV6.ts +38 -0
  198. package/src/examples/limitOrders_all.ts +135 -0
  199. package/src/examples/limitOrders_partial.ts +171 -0
  200. package/src/examples/limitOrders_postOrder.ts +77 -0
  201. package/src/examples/partial.ts +34 -0
  202. package/src/examples/quote.ts +205 -0
  203. package/src/examples/sdk.ts +39 -0
  204. package/src/examples/simple.ts +44 -0
  205. package/src/examples/simpleQuote.ts +98 -0
  206. package/src/examples/viem.ts +120 -0
  207. package/src/examples/wagmi.ts +68 -0
  208. package/src/examples/web3.ts +32 -0
  209. package/src/gas.ts +7 -0
  210. package/src/helpers/approve.ts +60 -0
  211. package/src/helpers/fetchers/axios.ts +34 -0
  212. package/src/helpers/fetchers/fetch.ts +67 -0
  213. package/src/helpers/index.ts +27 -0
  214. package/src/helpers/misc.ts +160 -0
  215. package/src/helpers/providers/ethers.ts +192 -0
  216. package/src/helpers/providers/ethersV6.ts +121 -0
  217. package/src/helpers/providers/helpers.ts +36 -0
  218. package/src/helpers/providers/viem.ts +205 -0
  219. package/src/helpers/providers/web3.ts +154 -0
  220. package/src/helpers/token.ts +75 -0
  221. package/src/index.ts +425 -0
  222. package/src/methods/common/orders/buildOrderData.ts +29 -0
  223. package/src/methods/common/orders/encoding.ts +216 -0
  224. package/src/methods/common/orders/misc.ts +86 -0
  225. package/src/methods/common/orders/signature.ts +68 -0
  226. package/src/methods/common/orders/types.ts +13 -0
  227. package/src/methods/delta/approveForDelta.ts +38 -0
  228. package/src/methods/delta/buildCrosschainOrderBridge.ts +84 -0
  229. package/src/methods/delta/buildDeltaOrder.ts +192 -0
  230. package/src/methods/delta/getBridgeInfo.ts +38 -0
  231. package/src/methods/delta/getDeltaContract.ts +29 -0
  232. package/src/methods/delta/getDeltaOrders.ts +102 -0
  233. package/src/methods/delta/getDeltaPrice.ts +122 -0
  234. package/src/methods/delta/getMulticallHandlers.ts +44 -0
  235. package/src/methods/delta/getPartnerFee.ts +58 -0
  236. package/src/methods/delta/helpers/across.ts +255 -0
  237. package/src/methods/delta/helpers/buildDeltaOrderData.ts +153 -0
  238. package/src/methods/delta/helpers/composePermit.ts +76 -0
  239. package/src/methods/delta/helpers/misc.ts +32 -0
  240. package/src/methods/delta/helpers/types.ts +110 -0
  241. package/src/methods/delta/index.ts +146 -0
  242. package/src/methods/delta/isTokenSupportedInDelta.ts +54 -0
  243. package/src/methods/delta/postDeltaOrder.ts +50 -0
  244. package/src/methods/delta/signDeltaOrder.ts +41 -0
  245. package/src/methods/limitOrders/approveForOrder.ts +36 -0
  246. package/src/methods/limitOrders/buildOrder.ts +56 -0
  247. package/src/methods/limitOrders/cancelOrder.ts +111 -0
  248. package/src/methods/limitOrders/fillOrderDirectly.ts +277 -0
  249. package/src/methods/limitOrders/getOrders.ts +151 -0
  250. package/src/methods/limitOrders/getOrdersContract.ts +20 -0
  251. package/src/methods/limitOrders/helpers/buildOrderData.ts +121 -0
  252. package/src/methods/limitOrders/helpers/misc.ts +64 -0
  253. package/src/methods/limitOrders/helpers/types.ts +70 -0
  254. package/src/methods/limitOrders/index.ts +154 -0
  255. package/src/methods/limitOrders/postOrder.ts +74 -0
  256. package/src/methods/limitOrders/signOrder.ts +29 -0
  257. package/src/methods/limitOrders/transaction.ts +231 -0
  258. package/src/methods/nftOrders/approveForOrder.ts +79 -0
  259. package/src/methods/nftOrders/buildOrder.ts +52 -0
  260. package/src/methods/nftOrders/cancelOrder.ts +23 -0
  261. package/src/methods/nftOrders/getOrders.ts +84 -0
  262. package/src/methods/nftOrders/getOrdersContract.ts +24 -0
  263. package/src/methods/nftOrders/helpers/buildOrderData.ts +131 -0
  264. package/src/methods/nftOrders/helpers/misc.ts +92 -0
  265. package/src/methods/nftOrders/helpers/types.ts +50 -0
  266. package/src/methods/nftOrders/index.ts +139 -0
  267. package/src/methods/nftOrders/postOrder.ts +71 -0
  268. package/src/methods/nftOrders/signOrder.ts +29 -0
  269. package/src/methods/nftOrders/transaction.ts +234 -0
  270. package/src/methods/quote/getQuote.ts +131 -0
  271. package/src/methods/swap/adapters.ts +49 -0
  272. package/src/methods/swap/approve.ts +51 -0
  273. package/src/methods/swap/balance.ts +147 -0
  274. package/src/methods/swap/helpers/normalizeRateOptions.ts +55 -0
  275. package/src/methods/swap/index.ts +38 -0
  276. package/src/methods/swap/rates.ts +276 -0
  277. package/src/methods/swap/spender.ts +76 -0
  278. package/src/methods/swap/swapTx.ts +266 -0
  279. package/src/methods/swap/token.ts +35 -0
  280. package/src/methods/swap/transaction.ts +310 -0
  281. package/src/sdk/full.ts +54 -0
  282. package/src/sdk/partial.ts +107 -0
  283. package/src/sdk/simple.ts +429 -0
  284. package/src/types.ts +240 -0
@@ -0,0 +1,231 @@
1
+ import type { 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
+ BuildLimitOrderTxInput,
12
+ BuildOptions,
13
+ BuildSwapAndLimitOrderTxInput,
14
+ TransactionParams,
15
+ constructBuildTx,
16
+ } from '../swap/transaction';
17
+ import { constructGetRate, GetRateInput, RateOptions } from '../swap/rates';
18
+ import type { OrderData } from './buildOrder';
19
+ import { isFilledArray } from '../../helpers/misc';
20
+ import type { RequestParameters } from '../../types';
21
+
22
+ type MinBuildSwapAndLimitOrderTxInput = Omit<
23
+ // these are derived from `orders`
24
+ BuildSwapAndLimitOrderTxInput,
25
+ 'srcToken' | 'srcAmount' | 'destToken' | 'destDecimals'
26
+ >;
27
+
28
+ type BuildSwapAndLimitOrdersTx = (
29
+ params: MinBuildSwapAndLimitOrderTxInput,
30
+ options?: BuildOptions,
31
+ requestParams?: RequestParameters
32
+ ) => Promise<TransactionParams>;
33
+
34
+ type MinBuildLimitOrderTxInput = Omit<
35
+ BuildLimitOrderTxInput,
36
+ // these are derived from `orders`
37
+ 'srcToken' | 'srcAmount' | 'destToken' | 'slippage'
38
+ // `slippage` doesn't participate as we derive `srcAmount` already
39
+ >;
40
+
41
+ type BuildLimitOrdersTx = (
42
+ params: MinBuildLimitOrderTxInput,
43
+ options?: BuildOptions,
44
+ requestParams?: RequestParameters
45
+ ) => Promise<TransactionParams>;
46
+
47
+ export type BuildLimitOrdersTxFunctions = {
48
+ getLimitOrdersRate: GetLimitOrdersRate;
49
+ buildLimitOrderTx: BuildLimitOrdersTx;
50
+ buildSwapAndLimitOrderTx: BuildSwapAndLimitOrdersTx;
51
+ };
52
+
53
+ type GetLimitOrdersRate = (
54
+ // `amount`, if given, must equal the total of the orders' `takerAmounts`
55
+ options: Omit<GetRateInput, 'amount' | 'side'> & { amount?: string },
56
+ orders: CheckableOrderData[],
57
+ requestParams?: RequestParameters
58
+ ) => Promise<OptimalRate>;
59
+
60
+ export const constructBuildLimitOrderTx = ({
61
+ apiURL = API_URL,
62
+ version = DEFAULT_VERSION,
63
+ chainId,
64
+ fetcher,
65
+ }: ConstructFetchInput): BuildLimitOrdersTxFunctions => {
66
+ const { buildTx: buildSwapTx } = constructBuildTx({
67
+ apiURL,
68
+ chainId,
69
+ fetcher,
70
+ version,
71
+ });
72
+
73
+ const { getRate: getSwapAndLimitOrderRate } = constructGetRate({
74
+ apiURL,
75
+ version,
76
+ chainId,
77
+ fetcher,
78
+ });
79
+
80
+ // returns priceRoute that would allow to swap from srcToken to destToken(=order.takerAsset) followed by filling limit orders
81
+ const getLimitOrdersRate: GetLimitOrdersRate = async (
82
+ { srcToken, destToken, amount, options: _options = {}, ...rest },
83
+ orders,
84
+ requestParams
85
+ ) => {
86
+ assert(orders.length > 0, 'must pass at least 1 order');
87
+
88
+ const { totalTakerAmount, takerAsset } = checkAndParseOrders(orders);
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 getSwapAndLimitOrderRate(
122
+ rateInput,
123
+ requestParams
124
+ );
125
+ return optimalRate;
126
+ };
127
+
128
+ // derive srcToken, destToken and srcAmount from orders[]
129
+ const buildLimitOrderTx: BuildLimitOrdersTx = (
130
+ params,
131
+ options,
132
+ requestParams
133
+ ) => {
134
+ const { makerAsset, takerAsset, totalTakerAmount } = checkAndParseOrders(
135
+ params.orders
136
+ );
137
+
138
+ const fillParams: BuildLimitOrderTxInput = {
139
+ ...params,
140
+ // taker supplies takerAsset
141
+ srcToken: takerAsset,
142
+ // no `slippage` in `params`
143
+ srcAmount: totalTakerAmount.toString(10),
144
+ // taker gets makerAsset in the end
145
+ destToken: makerAsset,
146
+ };
147
+
148
+ return buildSwapTx(fillParams, options, requestParams);
149
+ };
150
+
151
+ const buildSwapAndLimitOrderTx: BuildSwapAndLimitOrdersTx = (
152
+ params,
153
+ options,
154
+ requestParams
155
+ ) => {
156
+ const { makerAsset } = checkAndParseOrders(params.orders);
157
+
158
+ const fillParams: BuildSwapAndLimitOrderTxInput = {
159
+ ...params,
160
+ // taker supplies srcToken
161
+ srcToken: params.priceRoute.srcToken,
162
+ // which is swapped for makerAsset, that would go towards filling the orders
163
+ destToken: makerAsset,
164
+ destDecimals: params.priceRoute.destDecimals,
165
+ // one or the other
166
+ ...(params.slippage
167
+ ? { slippage: params.slippage }
168
+ : // may sneak in as part of `params`
169
+ { srcAmount: params.priceRoute.srcAmount, slippage: undefined }),
170
+ };
171
+
172
+ return buildSwapTx(fillParams, options, requestParams);
173
+ };
174
+
175
+ return {
176
+ getLimitOrdersRate,
177
+ buildLimitOrderTx,
178
+ buildSwapAndLimitOrderTx,
179
+ };
180
+ };
181
+
182
+ type CheckAndParseOrdersResult = Omit<CheckableOrderData, 'takerAmount'> & {
183
+ totalTakerAmount: bigint;
184
+ };
185
+
186
+ type CheckableOrderData = Pick<
187
+ OrderData,
188
+ 'takerAsset' | 'makerAsset' | 'takerAmount' | 'maker'
189
+ > & { taker?: OrderData['taker'] };
190
+
191
+ function checkAndParseOrders(
192
+ orders: CheckableOrderData[]
193
+ ): CheckAndParseOrdersResult {
194
+ assert(isFilledArray(orders), 'must pass at least 1 order');
195
+
196
+ const { takerAssetsSet, makerAssetsSet, totalTakerAmount } = orders.reduce<
197
+ Record<'takerAssetsSet' | 'makerAssetsSet', Set<string>> & {
198
+ totalTakerAmount: bigint;
199
+ }
200
+ >(
201
+ (accum, order) => {
202
+ accum.takerAssetsSet.add(order.takerAsset.toLowerCase());
203
+ accum.makerAssetsSet.add(order.makerAsset.toLowerCase());
204
+
205
+ accum.totalTakerAmount =
206
+ accum.totalTakerAmount + BigInt(order.takerAmount);
207
+ return accum;
208
+ },
209
+ {
210
+ takerAssetsSet: new Set(),
211
+ makerAssetsSet: new Set(),
212
+ totalTakerAmount: BigInt(0),
213
+ }
214
+ );
215
+
216
+ assert(
217
+ takerAssetsSet.size === 1,
218
+ 'All orders must have the same takerAsset as destToken'
219
+ );
220
+ assert(makerAssetsSet.size === 1, 'All orders must have the same makerAsset');
221
+
222
+ const [{ maker, taker, makerAsset, takerAsset }] = orders;
223
+
224
+ return {
225
+ totalTakerAmount,
226
+ maker,
227
+ taker,
228
+ makerAsset,
229
+ takerAsset,
230
+ };
231
+ }
@@ -0,0 +1,79 @@
1
+ import type { ApproveToken } from '../../helpers/approve';
2
+ import type { ExtractAbiMethodNames } from '../../helpers/misc';
3
+ import type {
4
+ Address,
5
+ ConstructProviderFetchInput,
6
+ RequestParameters,
7
+ TxSendOverrides,
8
+ } from '../../types';
9
+ import { constructApproveToken } from '../swap/approve';
10
+ import { constructGetNFTOrdersContract } from './getOrdersContract';
11
+
12
+ type ApproveNFT<T> = (
13
+ tokenAddress: Address,
14
+ overrides?: TxSendOverrides,
15
+ requestParams?: RequestParameters
16
+ ) => Promise<T>;
17
+
18
+ export type ApproveTokenForNFTOrderFunctions<T> = {
19
+ /** @description approving AugustusSwapper as spender for takerAsset (ERC20) for Limit Orders that will be executed through it */
20
+ approveERC20ForNFTOrder: ApproveToken<T>;
21
+ /** @description approving AugustusRFQ as spender for makerAsset (NFT) */
22
+ approveNFTForNFTOrder: ApproveNFT<T>;
23
+ };
24
+
25
+ const MinNFTAbi = [
26
+ {
27
+ constant: false,
28
+ inputs: [
29
+ {
30
+ name: '_operator',
31
+ type: 'address',
32
+ },
33
+ {
34
+ name: '_approved',
35
+ type: 'bool',
36
+ },
37
+ ],
38
+ name: 'setApprovalForAll',
39
+ outputs: [],
40
+ payable: false,
41
+ stateMutability: 'nonpayable',
42
+ type: 'function',
43
+ },
44
+ ] as const;
45
+
46
+ type ApprovalMethods = ExtractAbiMethodNames<typeof MinNFTAbi>;
47
+
48
+ // returns whatever `contractCaller` returns
49
+ // to allow for better versatility
50
+ export const constructApproveTokenForNFTOrder = <T>(
51
+ options: ConstructProviderFetchInput<T, 'transactCall'>
52
+ ): ApproveTokenForNFTOrderFunctions<T> => {
53
+ // approving TokenTransaferProxy as for the swap
54
+ const { approveToken: approveERC20ForNFTOrder } =
55
+ constructApproveToken(options);
56
+
57
+ const { getNFTOrdersContract } = constructGetNFTOrdersContract(options);
58
+
59
+ const approveNFTForNFTOrder: ApproveNFT<T> = async (
60
+ tokenAddress,
61
+ overrides = {},
62
+ requestParams
63
+ ) => {
64
+ // @TODO add approvetakerAssetForNFTOrder to use AugustusSwapper as spender if we ever have SELL NFT swaps
65
+ const AugustusRFQ = await getNFTOrdersContract(requestParams);
66
+
67
+ const res = await options.contractCaller.transactCall<ApprovalMethods>({
68
+ address: tokenAddress,
69
+ abi: MinNFTAbi,
70
+ contractMethod: 'setApprovalForAll',
71
+ args: [AugustusRFQ, true],
72
+ overrides,
73
+ });
74
+
75
+ return res;
76
+ };
77
+
78
+ return { approveERC20ForNFTOrder, approveNFTForNFTOrder };
79
+ };
@@ -0,0 +1,52 @@
1
+ import type { ConstructFetchInput, RequestParameters } from '../../types';
2
+ import { constructGetSpender } from '../swap/spender';
3
+ import {
4
+ buildOrderData,
5
+ BuildNFTOrderDataInput,
6
+ SignableNFTOrderData,
7
+ } from './helpers/buildOrderData';
8
+ export * from './helpers/buildOrderData';
9
+
10
+ export type BuildNFTOrderInput = Omit<
11
+ BuildNFTOrderDataInput,
12
+ 'chainId' | 'verifyingContract' | 'AugustusAddress'
13
+ >;
14
+
15
+ type BuildNFTOrder = (
16
+ buildNFTOrderParams: BuildNFTOrderInput,
17
+ requestParams?: RequestParameters
18
+ ) => Promise<SignableNFTOrderData>;
19
+
20
+ export type BuildNFTOrderFunctions = {
21
+ /** @description Build Orders that will be excuted through AugustusSwapper */
22
+ buildNFTOrder: BuildNFTOrder;
23
+ };
24
+
25
+ export const constructBuildNFTOrder = (
26
+ options: ConstructFetchInput
27
+ ): BuildNFTOrderFunctions => {
28
+ const { chainId } = options;
29
+
30
+ // getContracts is cached internally for the same instance of SDK
31
+ // so should persist across same apiUrl & network
32
+ const { getContracts } = constructGetSpender(options);
33
+
34
+ const buildNFTOrder: BuildNFTOrder = async (
35
+ buildNFTOrderParams,
36
+ requestParams
37
+ ) => {
38
+ const { AugustusSwapper: AugustusAddress, AugustusRFQ: verifyingContract } =
39
+ await getContracts(requestParams);
40
+
41
+ return buildOrderData({
42
+ ...buildNFTOrderParams,
43
+ chainId,
44
+ verifyingContract,
45
+ AugustusAddress,
46
+ });
47
+ };
48
+
49
+ return {
50
+ buildNFTOrder,
51
+ };
52
+ };
@@ -0,0 +1,23 @@
1
+ import type { ConstructProviderFetchInput } from '../../types';
2
+ import {
3
+ CancelOrder,
4
+ CancelOrderBulk,
5
+ constructCancelLimitOrder,
6
+ } from '../limitOrders/cancelOrder';
7
+
8
+ export type CancelNFTOrderFunctions<T> = {
9
+ cancelNFTOrder: CancelOrder<T>;
10
+ cancelNFTOrderBulk: CancelOrderBulk<T>;
11
+ };
12
+
13
+ // should work the same as for LimitOrders
14
+ export const constructCancelNFTOrder = <T>(
15
+ options: ConstructProviderFetchInput<T, 'transactCall'>
16
+ ): CancelNFTOrderFunctions<T> => {
17
+ const { cancelLimitOrder, cancelLimitOrderBulk } =
18
+ constructCancelLimitOrder(options);
19
+ return {
20
+ cancelNFTOrder: cancelLimitOrder,
21
+ cancelNFTOrderBulk: cancelLimitOrderBulk,
22
+ };
23
+ };
@@ -0,0 +1,84 @@
1
+ import { API_URL } from '../../constants';
2
+ import type {
3
+ Address,
4
+ ConstructFetchInput,
5
+ RequestParameters,
6
+ } from '../../types';
7
+ import {
8
+ constructBaseFetchUrlGetter,
9
+ GetOrdersURLs,
10
+ GetOrderURL,
11
+ } from './helpers/misc';
12
+ import type {
13
+ NFTOrderFromAPI,
14
+ NFTOrdersApiResponse,
15
+ NFTOrderType,
16
+ } from './helpers/types';
17
+
18
+ // get orders by `maker` or `taker`
19
+ export type NFTOrdersUserParams =
20
+ | { maker: Address; type: NFTOrderType }
21
+ | { taker: Address; type: NFTOrderType };
22
+ type GetNFTOrderByHash = (
23
+ orderHash: string,
24
+ requestParams?: RequestParameters
25
+ ) => Promise<NFTOrderFromAPI>;
26
+ type GetNFTOrders = (
27
+ userParams: NFTOrdersUserParams,
28
+ requestParams?: RequestParameters
29
+ ) => Promise<NFTOrdersApiResponse>;
30
+
31
+ export type GetNFTOrdersFunctions = {
32
+ getNFTOrders: GetNFTOrders;
33
+ getNFTOrderByHash: GetNFTOrderByHash;
34
+ };
35
+
36
+ export const constructGetNFTOrders = ({
37
+ apiURL = API_URL,
38
+ chainId,
39
+ fetcher,
40
+ }: ConstructFetchInput): GetNFTOrdersFunctions => {
41
+ const getBaseFetchURLByOrderType = constructBaseFetchUrlGetter({
42
+ apiURL,
43
+ chainId,
44
+ });
45
+
46
+ const getNFTOrders: GetNFTOrders = async (userParams, requestParams) => {
47
+ const baseFetchURL = getBaseFetchURLByOrderType(userParams.type);
48
+ const userURL =
49
+ 'maker' in userParams
50
+ ? (`maker/${userParams.maker}` as const)
51
+ : (`taker/${userParams.taker}` as const);
52
+ const fetchURL = `${baseFetchURL}/${userURL}` as const;
53
+
54
+ const response = await fetcher<NFTOrdersApiResponse, GetOrdersURLs>({
55
+ url: fetchURL,
56
+ method: 'GET',
57
+ requestParams,
58
+ });
59
+
60
+ // without any extra calls, return what API returns
61
+ return response;
62
+ };
63
+
64
+ const getNFTOrderByHash: GetNFTOrderByHash = async (
65
+ orderHash,
66
+ requestParams
67
+ ) => {
68
+ const baseFetchURL = getBaseFetchURLByOrderType();
69
+ const fetchURL = `${baseFetchURL}/${orderHash}` as const;
70
+
71
+ const order = await fetcher<NFTOrderFromAPI, GetOrderURL>({
72
+ url: fetchURL,
73
+ method: 'GET',
74
+ requestParams,
75
+ });
76
+
77
+ return order;
78
+ };
79
+
80
+ return {
81
+ getNFTOrders,
82
+ getNFTOrderByHash,
83
+ };
84
+ };
@@ -0,0 +1,24 @@
1
+ import type { ConstructFetchInput } from '../../types';
2
+ import { constructGetSpender, GetSpender } from '../swap/spender';
3
+
4
+ export type GetNFTOrdersContractFunctions = {
5
+ getNFTOrdersContract: GetSpender;
6
+ getTokenTransferProxy: GetSpender;
7
+ };
8
+
9
+ // should work the same as LimitOrders
10
+ export const constructGetNFTOrdersContract = (
11
+ options: ConstructFetchInput
12
+ ): GetNFTOrdersContractFunctions => {
13
+ // analogous to getSpender() but for Limit Orders Contract = AugustusRFQ
14
+
15
+ const {
16
+ getSpender: getTokenTransferProxy,
17
+ getAugustusRFQ: getNFTOrdersContract,
18
+ } = constructGetSpender(options);
19
+
20
+ return {
21
+ getNFTOrdersContract,
22
+ getTokenTransferProxy,
23
+ };
24
+ };
@@ -0,0 +1,131 @@
1
+ import type { Address } from '../../../types';
2
+ import type { AssetTypeVariant } from './types';
3
+ import {
4
+ Domain,
5
+ name,
6
+ version,
7
+ ZERO_ADDRESS,
8
+ } from '../../common/orders/buildOrderData';
9
+ import { getRandomInt } from '../../../helpers/misc';
10
+
11
+ const OrderNFT = [
12
+ { name: 'nonceAndMeta', type: 'uint256' },
13
+ { name: 'expiry', type: 'uint128' },
14
+ { name: 'makerAsset', type: 'uint256' },
15
+ { name: 'makerAssetId', type: 'uint256' },
16
+ { name: 'takerAsset', type: 'uint256' },
17
+ { name: 'takerAssetId', type: 'uint256' },
18
+ { name: 'maker', type: 'address' },
19
+ { name: 'taker', type: 'address' },
20
+ { name: 'makerAmount', type: 'uint256' },
21
+ { name: 'takerAmount', type: 'uint256' },
22
+ ];
23
+
24
+ export interface BuildNFTOrderDataInput {
25
+ chainId: number;
26
+ verifyingContract: Address;
27
+ nonce?: number;
28
+ expiry: number;
29
+ makerAsset: Address;
30
+ takerAsset: Address;
31
+ makerAmount: string;
32
+ takerAmount: string;
33
+ /** @description NFT Token id, will default to 0 (ERC20), provide for NFT */
34
+ makerAssetId: string; // required when BUYing NFT
35
+ /** @description NFT Token id, will default to 0 (ERC20), provide for NFT */
36
+ takerAssetId?: string;
37
+ /** @description Token type: ERC20 = 0, ERC1155 = 1, ERC721 = 2 */
38
+ makerAssetType: AssetTypeVariant;
39
+ /** @description Token type: ERC20 = 0, ERC1155 = 1, ERC721 = 2 */
40
+ takerAssetType: AssetTypeVariant;
41
+ maker: Address;
42
+ // OrderData.taker must be Augustus for p2p limitOrders to involve swap through Augustus
43
+ // this is the actual user taker which will go into nonceAndMeta
44
+ taker?: Address;
45
+ AugustusAddress: Address;
46
+ }
47
+
48
+ export type SignableNFTOrderData = {
49
+ types: { OrderNFT: typeof OrderNFT };
50
+ domain: Domain;
51
+ data: NFTOrderData;
52
+ };
53
+
54
+ export type BigIntAsString = string;
55
+
56
+ export type NFTOrderData = {
57
+ expiry: number;
58
+ // '1' when trading 1 NFT token
59
+ makerAmount: BigIntAsString;
60
+ makerAsset: BigIntAsString;
61
+ // '0' indicates ERC20
62
+ makerAssetId: BigIntAsString;
63
+ // '1' when trading 1 NFT token
64
+ takerAmount: BigIntAsString;
65
+ takerAsset: BigIntAsString;
66
+ // '0' indicates ERC20
67
+ takerAssetId: BigIntAsString;
68
+ nonceAndMeta: BigIntAsString;
69
+ maker: Address;
70
+ taker: Address;
71
+ };
72
+
73
+ export function buildOrderData({
74
+ chainId,
75
+ verifyingContract,
76
+ nonce = getRandomInt(),
77
+ expiry,
78
+ makerAsset: _makerAssetAddress,
79
+ takerAsset: _takerAssetAddress,
80
+ makerAmount,
81
+ takerAmount,
82
+ makerAssetId,
83
+ takerAssetId = '0',
84
+ makerAssetType,
85
+ takerAssetType,
86
+ maker,
87
+ AugustusAddress,
88
+ // if taker is specified -- p2p order for that taker only to fill through Augustus -- taker = Augustus, takerInNonce = _taker
89
+ // if taker is not specified -- limitOrder for anyone to fill through Augustus -- taker = Augustus, takerInNonce = Zero
90
+ taker: takerInNonce = ZERO_ADDRESS, //@TODO allow Orders outside of AugustusRFQ
91
+ }: BuildNFTOrderDataInput): SignableNFTOrderData {
92
+ // first 160 bits is taker address (for p2p orders),
93
+ // or 0 for limitOrders, so that anyone can be the taker of the Order
94
+ const nonceAndMeta = (
95
+ BigInt(takerInNonce) +
96
+ (BigInt(nonce) << BigInt(160))
97
+ ).toString(10);
98
+
99
+ const makerAsset = assetAddressToUint(_makerAssetAddress, makerAssetType);
100
+
101
+ const takerAsset = assetAddressToUint(_takerAssetAddress, takerAssetType);
102
+
103
+ const orderNFT: NFTOrderData = {
104
+ nonceAndMeta,
105
+ expiry,
106
+ makerAsset,
107
+ takerAsset,
108
+ maker,
109
+ taker: AugustusAddress,
110
+ makerAmount,
111
+ takerAmount,
112
+ makerAssetId,
113
+ takerAssetId,
114
+ };
115
+
116
+ return {
117
+ types: { OrderNFT },
118
+ domain: { name, version, chainId, verifyingContract },
119
+ data: orderNFT,
120
+ };
121
+ }
122
+
123
+ // create a packed number that contains assetAddress and AssetType
124
+ export function assetAddressToUint(
125
+ assetAddress: Address,
126
+ assetType: AssetTypeVariant
127
+ ): BigIntAsString {
128
+ return (BigInt(assetAddress) + (BigInt(assetType) << BigInt(160))).toString(
129
+ 10
130
+ );
131
+ }