@clober/v2-sdk 0.0.3 → 0.0.4-6.dev

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 (236) hide show
  1. package/README.md +12 -4
  2. package/dist/cjs/abis/core/book-manager-abi.js +112 -0
  3. package/dist/cjs/abis/core/book-manager-abi.js.map +1 -0
  4. package/dist/cjs/abis/core/book-viewer-abi.js +321 -0
  5. package/dist/cjs/abis/core/book-viewer-abi.js.map +1 -0
  6. package/dist/cjs/abis/core/controller-abi.js +29 -24
  7. package/dist/cjs/abis/core/controller-abi.js.map +1 -1
  8. package/dist/cjs/apis/chart-logs.js +154 -0
  9. package/dist/cjs/apis/chart-logs.js.map +1 -0
  10. package/dist/cjs/apis/market.js +63 -34
  11. package/dist/cjs/apis/market.js.map +1 -1
  12. package/dist/cjs/apis/open-order.js +60 -25
  13. package/dist/cjs/apis/open-order.js.map +1 -1
  14. package/dist/cjs/approval.js +79 -32
  15. package/dist/cjs/approval.js.map +1 -1
  16. package/dist/cjs/call.js +346 -245
  17. package/dist/cjs/call.js.map +1 -1
  18. package/dist/cjs/constants/addresses.js +26 -1
  19. package/dist/cjs/constants/addresses.js.map +1 -1
  20. package/dist/cjs/constants/chain.js +19 -1
  21. package/dist/cjs/constants/chain.js.map +1 -1
  22. package/dist/cjs/constants/client.js +18 -0
  23. package/dist/cjs/constants/client.js.map +1 -0
  24. package/dist/cjs/constants/currency.js +28 -2
  25. package/dist/cjs/constants/currency.js.map +1 -1
  26. package/dist/cjs/constants/fee.js +17 -2
  27. package/dist/cjs/constants/fee.js.map +1 -1
  28. package/dist/cjs/constants/subgraph.js +57 -0
  29. package/dist/cjs/constants/subgraph.js.map +1 -0
  30. package/dist/cjs/constants/test-chain.js +27 -0
  31. package/dist/cjs/constants/test-chain.js.map +1 -0
  32. package/dist/cjs/index.js +20 -6
  33. package/dist/cjs/index.js.map +1 -1
  34. package/dist/cjs/model/book.js +47 -29
  35. package/dist/cjs/model/book.js.map +1 -1
  36. package/dist/cjs/model/chart-log.js +3 -0
  37. package/dist/cjs/model/chart-log.js.map +1 -0
  38. package/dist/cjs/model/market.js +43 -182
  39. package/dist/cjs/model/market.js.map +1 -1
  40. package/dist/cjs/signature.js +25 -25
  41. package/dist/cjs/signature.js.map +1 -1
  42. package/dist/cjs/type.js +16 -1
  43. package/dist/cjs/type.js.map +1 -1
  44. package/dist/cjs/utils/allowance.js +40 -0
  45. package/dist/cjs/utils/allowance.js.map +1 -0
  46. package/dist/cjs/utils/approval.js +3 -8
  47. package/dist/cjs/utils/approval.js.map +1 -1
  48. package/dist/cjs/utils/bigint.js +9 -0
  49. package/dist/cjs/utils/bigint.js.map +1 -0
  50. package/dist/cjs/utils/book-id.js +7 -7
  51. package/dist/cjs/utils/book-id.js.map +1 -1
  52. package/dist/cjs/utils/build-transaction.js +10 -13
  53. package/dist/cjs/utils/build-transaction.js.map +1 -1
  54. package/dist/cjs/utils/currency.js +166 -0
  55. package/dist/cjs/utils/currency.js.map +1 -0
  56. package/dist/cjs/utils/decorator.js +15 -0
  57. package/dist/cjs/utils/decorator.js.map +1 -0
  58. package/dist/cjs/utils/open.js +36 -0
  59. package/dist/cjs/utils/open.js.map +1 -0
  60. package/dist/cjs/utils/order.js +102 -0
  61. package/dist/cjs/utils/order.js.map +1 -0
  62. package/dist/cjs/utils/prices.js +1 -1
  63. package/dist/cjs/utils/unit-size.js +49 -0
  64. package/dist/cjs/utils/unit-size.js.map +1 -0
  65. package/dist/cjs/utils.js +14 -0
  66. package/dist/cjs/utils.js.map +1 -0
  67. package/dist/cjs/view.js +64 -49
  68. package/dist/cjs/view.js.map +1 -1
  69. package/dist/esm/abis/core/book-manager-abi.js +109 -0
  70. package/dist/esm/abis/core/book-manager-abi.js.map +1 -0
  71. package/dist/esm/abis/core/book-viewer-abi.js +318 -0
  72. package/dist/esm/abis/core/book-viewer-abi.js.map +1 -0
  73. package/dist/esm/abis/core/controller-abi.js +29 -24
  74. package/dist/esm/abis/core/controller-abi.js.map +1 -1
  75. package/dist/esm/apis/chart-logs.js +150 -0
  76. package/dist/esm/apis/chart-logs.js.map +1 -0
  77. package/dist/esm/apis/market.js +63 -34
  78. package/dist/esm/apis/market.js.map +1 -1
  79. package/dist/esm/apis/open-order.js +61 -25
  80. package/dist/esm/apis/open-order.js.map +1 -1
  81. package/dist/esm/approval.js +118 -45
  82. package/dist/esm/approval.js.map +1 -1
  83. package/dist/esm/call.js +464 -342
  84. package/dist/esm/call.js.map +1 -1
  85. package/dist/esm/constants/addresses.js +26 -1
  86. package/dist/esm/constants/addresses.js.map +1 -1
  87. package/dist/esm/constants/chain.js +20 -2
  88. package/dist/esm/constants/chain.js.map +1 -1
  89. package/dist/esm/constants/client.js +14 -0
  90. package/dist/esm/constants/client.js.map +1 -0
  91. package/dist/esm/constants/currency.js +28 -2
  92. package/dist/esm/constants/currency.js.map +1 -1
  93. package/dist/esm/constants/fee.js +17 -2
  94. package/dist/esm/constants/fee.js.map +1 -1
  95. package/dist/esm/constants/subgraph.js +53 -0
  96. package/dist/esm/constants/subgraph.js.map +1 -0
  97. package/dist/esm/constants/test-chain.js +24 -0
  98. package/dist/esm/constants/test-chain.js.map +1 -0
  99. package/dist/esm/index.js +1 -0
  100. package/dist/esm/index.js.map +1 -1
  101. package/dist/esm/model/book.js +47 -29
  102. package/dist/esm/model/book.js.map +1 -1
  103. package/dist/esm/model/chart-log.js +2 -0
  104. package/dist/esm/model/chart-log.js.map +1 -0
  105. package/dist/esm/model/market.js +44 -187
  106. package/dist/esm/model/market.js.map +1 -1
  107. package/dist/esm/signature.js +40 -45
  108. package/dist/esm/signature.js.map +1 -1
  109. package/dist/esm/type.js +15 -0
  110. package/dist/esm/type.js.map +1 -1
  111. package/dist/esm/utils/allowance.js +36 -0
  112. package/dist/esm/utils/allowance.js.map +1 -0
  113. package/dist/esm/utils/approval.js +3 -8
  114. package/dist/esm/utils/approval.js.map +1 -1
  115. package/dist/esm/utils/bigint.js +5 -0
  116. package/dist/esm/utils/bigint.js.map +1 -0
  117. package/dist/esm/utils/book-id.js +7 -7
  118. package/dist/esm/utils/book-id.js.map +1 -1
  119. package/dist/esm/utils/build-transaction.js +11 -14
  120. package/dist/esm/utils/build-transaction.js.map +1 -1
  121. package/dist/esm/utils/currency.js +161 -0
  122. package/dist/esm/utils/currency.js.map +1 -0
  123. package/dist/esm/utils/decorator.js +11 -0
  124. package/dist/esm/utils/decorator.js.map +1 -0
  125. package/dist/esm/utils/open.js +32 -0
  126. package/dist/esm/utils/open.js.map +1 -0
  127. package/dist/esm/utils/order.js +98 -0
  128. package/dist/esm/utils/order.js.map +1 -0
  129. package/dist/esm/utils/prices.js +1 -1
  130. package/dist/esm/utils/unit-size.js +45 -0
  131. package/dist/esm/utils/unit-size.js.map +1 -0
  132. package/dist/esm/utils.js +4 -0
  133. package/dist/esm/utils.js.map +1 -0
  134. package/dist/esm/view.js +164 -71
  135. package/dist/esm/view.js.map +1 -1
  136. package/dist/tsconfig.build.tsbuildinfo +1 -1
  137. package/dist/types/abis/core/book-manager-abi.d.ts +82 -0
  138. package/dist/types/abis/core/book-manager-abi.d.ts.map +1 -0
  139. package/dist/types/abis/core/book-viewer-abi.d.ts +243 -0
  140. package/dist/types/abis/core/book-viewer-abi.d.ts.map +1 -0
  141. package/dist/types/abis/core/controller-abi.d.ts +23 -19
  142. package/dist/types/abis/core/controller-abi.d.ts.map +1 -1
  143. package/dist/types/apis/chart-logs.d.ts +5 -0
  144. package/dist/types/apis/chart-logs.d.ts.map +1 -0
  145. package/dist/types/apis/market.d.ts +1 -1
  146. package/dist/types/apis/market.d.ts.map +1 -1
  147. package/dist/types/apis/open-order.d.ts +4 -3
  148. package/dist/types/apis/open-order.d.ts.map +1 -1
  149. package/dist/types/approval.d.ts +50 -15
  150. package/dist/types/approval.d.ts.map +1 -1
  151. package/dist/types/call.d.ts +191 -123
  152. package/dist/types/call.d.ts.map +1 -1
  153. package/dist/types/constants/addresses.d.ts.map +1 -1
  154. package/dist/types/constants/chain.d.ts +6 -2
  155. package/dist/types/constants/chain.d.ts.map +1 -1
  156. package/dist/types/constants/client.d.ts +5 -0
  157. package/dist/types/constants/client.d.ts.map +1 -0
  158. package/dist/types/constants/currency.d.ts.map +1 -1
  159. package/dist/types/constants/fee.d.ts +7 -2
  160. package/dist/types/constants/fee.d.ts.map +1 -1
  161. package/dist/types/constants/subgraph.d.ts +10 -0
  162. package/dist/types/constants/subgraph.d.ts.map +1 -0
  163. package/dist/types/constants/test-chain.d.ts +3 -0
  164. package/dist/types/constants/test-chain.d.ts.map +1 -0
  165. package/dist/types/index.d.ts +1 -0
  166. package/dist/types/index.d.ts.map +1 -1
  167. package/dist/types/model/book.d.ts +13 -29
  168. package/dist/types/model/book.d.ts.map +1 -1
  169. package/dist/types/model/chart-log.d.ts +9 -0
  170. package/dist/types/model/chart-log.d.ts.map +1 -0
  171. package/dist/types/model/depth.d.ts +3 -5
  172. package/dist/types/model/depth.d.ts.map +1 -1
  173. package/dist/types/model/market.d.ts +15 -19
  174. package/dist/types/model/market.d.ts.map +1 -1
  175. package/dist/types/model/open-order.d.ts +16 -8
  176. package/dist/types/model/open-order.d.ts.map +1 -1
  177. package/dist/types/signature.d.ts +23 -25
  178. package/dist/types/signature.d.ts.map +1 -1
  179. package/dist/types/type.d.ts +54 -8
  180. package/dist/types/type.d.ts.map +1 -1
  181. package/dist/types/utils/allowance.d.ts +3 -0
  182. package/dist/types/utils/allowance.d.ts.map +1 -0
  183. package/dist/types/utils/approval.d.ts +1 -1
  184. package/dist/types/utils/approval.d.ts.map +1 -1
  185. package/dist/types/utils/bigint.d.ts +2 -0
  186. package/dist/types/utils/bigint.d.ts.map +1 -0
  187. package/dist/types/utils/book-id.d.ts +2 -1
  188. package/dist/types/utils/book-id.d.ts.map +1 -1
  189. package/dist/types/utils/build-transaction.d.ts +3 -4
  190. package/dist/types/utils/build-transaction.d.ts.map +1 -1
  191. package/dist/types/utils/currency.d.ts +7 -0
  192. package/dist/types/utils/currency.d.ts.map +1 -0
  193. package/dist/types/utils/decorator.d.ts +6 -0
  194. package/dist/types/utils/decorator.d.ts.map +1 -0
  195. package/dist/types/utils/open.d.ts +3 -0
  196. package/dist/types/utils/open.d.ts.map +1 -0
  197. package/dist/types/utils/order.d.ts +8 -0
  198. package/dist/types/utils/order.d.ts.map +1 -0
  199. package/dist/types/utils/prices.d.ts +1 -1
  200. package/dist/types/utils/unit-size.d.ts +4 -0
  201. package/dist/types/utils/unit-size.d.ts.map +1 -0
  202. package/dist/types/utils.d.ts +4 -0
  203. package/dist/types/utils.d.ts.map +1 -0
  204. package/dist/types/view.d.ts +164 -52
  205. package/dist/types/view.d.ts.map +1 -1
  206. package/package.json +1 -8
  207. package/dist/cjs/abis/core/params-abi.js +0 -62
  208. package/dist/cjs/abis/core/params-abi.js.map +0 -1
  209. package/dist/cjs/apis/currency.js +0 -87
  210. package/dist/cjs/apis/currency.js.map +0 -1
  211. package/dist/cjs/apis/subgraph.js +0 -26
  212. package/dist/cjs/apis/subgraph.js.map +0 -1
  213. package/dist/cjs/constants/subgraph-url.js +0 -8
  214. package/dist/cjs/constants/subgraph-url.js.map +0 -1
  215. package/dist/cjs/utils/unit.js +0 -38
  216. package/dist/cjs/utils/unit.js.map +0 -1
  217. package/dist/esm/abis/core/params-abi.js +0 -59
  218. package/dist/esm/abis/core/params-abi.js.map +0 -1
  219. package/dist/esm/apis/currency.js +0 -83
  220. package/dist/esm/apis/currency.js.map +0 -1
  221. package/dist/esm/apis/subgraph.js +0 -22
  222. package/dist/esm/apis/subgraph.js.map +0 -1
  223. package/dist/esm/constants/subgraph-url.js +0 -5
  224. package/dist/esm/constants/subgraph-url.js.map +0 -1
  225. package/dist/esm/utils/unit.js +0 -34
  226. package/dist/esm/utils/unit.js.map +0 -1
  227. package/dist/types/abis/core/params-abi.d.ts +0 -21
  228. package/dist/types/abis/core/params-abi.d.ts.map +0 -1
  229. package/dist/types/apis/currency.d.ts +0 -4
  230. package/dist/types/apis/currency.d.ts.map +0 -1
  231. package/dist/types/apis/subgraph.d.ts +0 -3
  232. package/dist/types/apis/subgraph.d.ts.map +0 -1
  233. package/dist/types/constants/subgraph-url.d.ts +0 -5
  234. package/dist/types/constants/subgraph-url.d.ts.map +0 -1
  235. package/dist/types/utils/unit.d.ts +0 -4
  236. package/dist/types/utils/unit.d.ts.map +0 -1
package/dist/cjs/call.js CHANGED
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.cancelOrders = exports.cancelOrder = exports.claimOrders = exports.claimOrder = exports.marketOrder = exports.limitOrder = exports.openMarket = void 0;
4
4
  const viem_1 = require("viem");
5
5
  const chain_1 = require("./constants/chain");
6
- const unit_1 = require("./utils/unit");
6
+ const unit_size_1 = require("./utils/unit-size");
7
7
  const controller_abi_1 = require("./abis/core/controller-abi");
8
8
  const time_1 = require("./utils/time");
9
9
  const build_transaction_1 = require("./utils/build-transaction");
@@ -14,185 +14,182 @@ const prices_1 = require("./utils/prices");
14
14
  const tick_1 = require("./utils/tick");
15
15
  const view_1 = require("./view");
16
16
  const book_id_1 = require("./utils/book-id");
17
- const params_abi_1 = require("./abis/core/params-abi");
18
- const action_1 = require("./constants/action");
19
17
  const approval_1 = require("./utils/approval");
20
- const openMarket = async (chainId, inputToken, outputToken, options) => {
21
- const market = await (0, market_1.fetchMarket)(chainId, [inputToken, outputToken], options?.rpcUrl);
18
+ const decorator_1 = require("./utils/decorator");
19
+ const order_1 = require("./utils/order");
20
+ const bigint_1 = require("./utils/bigint");
21
+ exports.openMarket = (0, decorator_1.decorator)(async ({ chainId, userAddress, inputToken, outputToken, options, }) => {
22
+ const market = await (0, market_1.fetchMarket)(chainId, [inputToken, outputToken]);
22
23
  const isBid = (0, viem_1.isAddressEqual)(market.quote.address, inputToken);
23
- if ((isBid && !market.bidBookOpen) || (!isBid && !market.askBookOpen)) {
24
- const unit = await (0, unit_1.calculateUnit)(chainId, isBid ? market.quote : market.base, options?.rpcUrl);
24
+ if ((isBid && !market.bidBook.isOpened) ||
25
+ (!isBid && !market.askBook.isOpened)) {
26
+ const unitSize = await (0, unit_size_1.calculateUnitSize)(chainId, isBid ? market.quote : market.base);
25
27
  return (0, build_transaction_1.buildTransaction)(chainId, {
28
+ chain: chain_1.CHAIN_MAP[chainId],
26
29
  address: addresses_1.CONTRACT_ADDRESSES[chainId].Controller,
30
+ account: userAddress,
27
31
  abi: controller_abi_1.CONTROLLER_ABI,
28
32
  functionName: 'open',
29
33
  args: [
30
34
  [
31
35
  {
32
36
  key: {
33
- base: inputToken,
34
- unit,
35
- quote: outputToken,
36
- makerPolicy: fee_1.MAKER_DEFAULT_POLICY.value,
37
+ base: outputToken,
38
+ unitSize,
39
+ quote: inputToken,
40
+ makerPolicy: fee_1.MAKER_DEFAULT_POLICY[chainId].value,
37
41
  hooks: viem_1.zeroAddress,
38
- takerPolicy: fee_1.TAKER_DEFAULT_POLICY.value,
42
+ takerPolicy: fee_1.TAKER_DEFAULT_POLICY[chainId].value,
39
43
  },
40
44
  hookData: viem_1.zeroHash,
41
45
  },
42
46
  ],
43
47
  (0, time_1.getDeadlineTimestampInSeconds)(),
44
48
  ],
45
- }, options?.rpcUrl);
49
+ }, options?.gasLimit);
46
50
  }
47
51
  return undefined;
48
- };
49
- exports.openMarket = openMarket;
50
- const limitOrder = async (chainId, userAddress, inputToken, outputToken, amount, price, options) => {
51
- const { signature, postOnly, rpcUrl } = options || {
52
- signature: undefined,
53
- postOnly: false,
54
- rpcUrl: undefined,
55
- };
56
- const market = await (0, market_1.fetchMarket)(chainId, [inputToken, outputToken], rpcUrl);
52
+ });
53
+ exports.limitOrder = (0, decorator_1.decorator)(async ({ chainId, userAddress, inputToken, outputToken, amount, price, options, }) => {
54
+ const market = await (0, market_1.fetchMarket)(chainId, [inputToken, outputToken]);
57
55
  const isBid = (0, viem_1.isAddressEqual)(market.quote.address, inputToken);
58
- if ((isBid && !market.bidBookOpen) || (!isBid && !market.askBookOpen)) {
56
+ const [inputCurrency, outputCurrency] = isBid
57
+ ? [market.quote, market.base]
58
+ : [market.base, market.quote];
59
+ if ((isBid && !market.bidBook.isOpened) ||
60
+ (!isBid && !market.askBook.isOpened)) {
59
61
  throw new Error(`
62
+ Open the market before placing a limit order.
60
63
  import { openMarket } from '@clober/v2-sdk'
61
64
 
62
- const transaction = await openMarket(
63
- ${chainId},
64
- '${inputToken}',
65
- '${outputToken}',
66
- )
65
+ const transaction = await openMarket({
66
+ chainId: ${chainId},
67
+ inputToken: '${inputToken}',
68
+ outputToken: '${outputToken}',
69
+ })
67
70
  `);
68
71
  }
69
72
  const rawPrice = (0, prices_1.parsePrice)(Number(price), market.quote.decimals, market.base.decimals);
70
73
  const tick = isBid ? (0, tick_1.fromPrice)(rawPrice) : (0, tick_1.fromPrice)((0, tick_1.invertPrice)(rawPrice));
71
74
  const tokensToSettle = [inputToken, outputToken].filter((address) => !(0, viem_1.isAddressEqual)(address, viem_1.zeroAddress));
72
- const quoteAmount = (0, viem_1.parseUnits)(amount, isBid ? market.quote.decimals : market.base.decimals);
73
- const [unit, { result }] = await Promise.all([
74
- (0, unit_1.calculateUnit)(chainId, isBid ? market.quote : market.base, rpcUrl),
75
- (0, view_1.getExpectedOutput)(chainId, inputToken, outputToken, amount, rpcUrl
76
- ? {
77
- limitPrice: price,
78
- rpcUrl,
79
- }
80
- : {
75
+ const quoteAmount = (0, viem_1.parseUnits)(amount, inputCurrency.decimals);
76
+ const [unitSize, { takenAmount, spentAmount, bookId }] = await Promise.all([
77
+ (0, unit_size_1.calculateUnitSize)(chainId, inputCurrency),
78
+ (0, view_1.getExpectedOutput)({
79
+ chainId,
80
+ inputToken,
81
+ outputToken,
82
+ amountIn: amount,
83
+ options: {
84
+ ...options,
81
85
  limitPrice: price,
82
- }),
86
+ },
87
+ }),
83
88
  ]);
84
89
  const isETH = (0, viem_1.isAddressEqual)(inputToken, viem_1.zeroAddress);
85
- const permitParamsList = signature && !isETH
86
- ? [
87
- {
88
- token: inputToken,
89
- permitAmount: quoteAmount,
90
- signature,
91
- },
92
- ]
93
- : [];
94
90
  const makeParam = {
95
- id: (0, book_id_1.toBookId)(inputToken, outputToken, unit),
91
+ id: (0, book_id_1.toBookId)(chainId, inputToken, outputToken, unitSize),
96
92
  tick: Number(tick),
97
93
  quoteAmount,
98
94
  hookData: viem_1.zeroHash,
99
95
  };
100
- if (postOnly === true || result.length === 0) {
101
- return (0, build_transaction_1.buildTransaction)(chainId, {
102
- chain: chain_1.CHAIN_MAP[chainId],
103
- account: userAddress,
104
- address: addresses_1.CONTRACT_ADDRESSES[chainId].Controller,
105
- abi: controller_abi_1.CONTROLLER_ABI,
106
- functionName: 'make',
107
- args: [
108
- [makeParam],
109
- tokensToSettle,
110
- permitParamsList,
111
- (0, time_1.getDeadlineTimestampInSeconds)(),
112
- ],
113
- value: isETH ? quoteAmount : 0n,
114
- }, options?.rpcUrl);
115
- }
116
- else if (result.length === 1) {
117
- return (0, build_transaction_1.buildTransaction)(chainId, {
118
- chain: chain_1.CHAIN_MAP[chainId],
119
- account: userAddress,
120
- address: addresses_1.CONTRACT_ADDRESSES[chainId].Controller,
121
- abi: controller_abi_1.CONTROLLER_ABI,
122
- functionName: 'limit',
123
- args: [
124
- [
125
- {
126
- takeBookId: result[0].bookId,
127
- makeBookId: makeParam.id,
128
- limitPrice: rawPrice,
129
- tick: makeParam.tick,
130
- quoteAmount,
131
- takeHookData: viem_1.zeroHash,
132
- makeHookData: makeParam.hookData,
133
- },
96
+ if (options?.postOnly === true || spentAmount === '0') {
97
+ return {
98
+ transaction: await (0, build_transaction_1.buildTransaction)(chainId, {
99
+ chain: chain_1.CHAIN_MAP[chainId],
100
+ account: userAddress,
101
+ address: addresses_1.CONTRACT_ADDRESSES[chainId].Controller,
102
+ abi: controller_abi_1.CONTROLLER_ABI,
103
+ functionName: 'make',
104
+ args: [
105
+ [makeParam],
106
+ tokensToSettle,
107
+ options?.erc20PermitParam ? [options.erc20PermitParam] : [],
108
+ (0, time_1.getDeadlineTimestampInSeconds)(),
134
109
  ],
135
- tokensToSettle,
136
- permitParamsList,
137
- (0, time_1.getDeadlineTimestampInSeconds)(),
138
- ],
139
- value: isETH ? quoteAmount : 0n,
140
- }, options?.rpcUrl);
110
+ value: isETH ? quoteAmount : 0n,
111
+ }, options?.gasLimit),
112
+ result: {
113
+ make: {
114
+ amount: (0, viem_1.formatUnits)(quoteAmount, inputCurrency.decimals),
115
+ currency: inputCurrency,
116
+ direction: 'in',
117
+ },
118
+ spent: {
119
+ amount: '0',
120
+ currency: inputCurrency,
121
+ direction: 'in',
122
+ },
123
+ taken: {
124
+ amount: '0',
125
+ currency: outputCurrency,
126
+ direction: 'out',
127
+ },
128
+ },
129
+ };
141
130
  }
142
131
  else {
143
- const makeAmount = quoteAmount -
144
- result.reduce((acc, { spendAmount }) => acc + spendAmount, 0n);
145
- return (0, build_transaction_1.buildTransaction)(chainId, {
146
- chain: chain_1.CHAIN_MAP[chainId],
147
- account: userAddress,
148
- address: addresses_1.CONTRACT_ADDRESSES[chainId].Controller,
149
- abi: controller_abi_1.CONTROLLER_ABI,
150
- functionName: 'execute',
151
- args: [
152
- [
153
- ...result.map(() => action_1.Action.TAKE),
154
- ...(makeAmount > 0n ? [action_1.Action.MAKE] : []),
155
- ],
156
- [
157
- ...result.map(({ bookId, takenAmount }) => (0, viem_1.encodeAbiParameters)(params_abi_1.TAKE_ORDER_PARAMS_ABI, [
132
+ return {
133
+ transaction: await (0, build_transaction_1.buildTransaction)(chainId, {
134
+ chain: chain_1.CHAIN_MAP[chainId],
135
+ account: userAddress,
136
+ address: addresses_1.CONTRACT_ADDRESSES[chainId].Controller,
137
+ abi: controller_abi_1.CONTROLLER_ABI,
138
+ functionName: 'limit',
139
+ args: [
140
+ [
158
141
  {
159
- id: bookId,
160
- limitPrice: rawPrice,
161
- quoteAmount: takenAmount,
162
- hookData: viem_1.zeroHash,
142
+ takeBookId: bookId,
143
+ makeBookId: makeParam.id,
144
+ limitPrice: isBid ? (0, tick_1.invertPrice)(rawPrice) : rawPrice,
145
+ tick: makeParam.tick,
146
+ quoteAmount,
147
+ takeHookData: viem_1.zeroHash,
148
+ makeHookData: makeParam.hookData,
163
149
  },
164
- ])),
165
- ...(makeAmount > 0n
166
- ? [
167
- (0, viem_1.encodeAbiParameters)(params_abi_1.MAKE_ORDER_PARAMS_ABI, [
168
- {
169
- ...makeParam,
170
- quoteAmount: makeAmount,
171
- },
172
- ]),
173
- ]
174
- : []),
150
+ ],
151
+ tokensToSettle,
152
+ options?.erc20PermitParam ? [options.erc20PermitParam] : [],
153
+ (0, time_1.getDeadlineTimestampInSeconds)(),
175
154
  ],
176
- tokensToSettle,
177
- permitParamsList,
178
- [],
179
- (0, time_1.getDeadlineTimestampInSeconds)(),
180
- ],
181
- value: isETH ? quoteAmount : 0n,
182
- }, options?.rpcUrl);
155
+ value: isETH ? quoteAmount : 0n,
156
+ }, options?.gasLimit),
157
+ result: {
158
+ make: {
159
+ amount: (0, viem_1.formatUnits)(quoteAmount - (0, viem_1.parseUnits)(spentAmount, inputCurrency.decimals), inputCurrency.decimals),
160
+ currency: inputCurrency,
161
+ direction: 'in',
162
+ },
163
+ spent: {
164
+ amount: spentAmount,
165
+ currency: inputCurrency,
166
+ direction: 'in',
167
+ },
168
+ taken: {
169
+ amount: takenAmount,
170
+ currency: outputCurrency,
171
+ direction: 'out',
172
+ },
173
+ },
174
+ };
183
175
  }
184
- };
185
- exports.limitOrder = limitOrder;
186
- const marketOrder = async (chainId, userAddress, inputToken, outputToken, amount, options) => {
187
- const { signature, rpcUrl, limitPrice } = options || {
188
- signature: undefined,
189
- rpcUrl: undefined,
190
- limitPrice: undefined,
191
- };
192
- const market = await (0, market_1.fetchMarket)(chainId, [inputToken, outputToken], rpcUrl);
193
- const isBid = (0, viem_1.isAddressEqual)(market.quote.address, inputToken);
194
- if ((isBid && !market.bidBookOpen) || (!isBid && !market.askBookOpen)) {
176
+ });
177
+ exports.marketOrder = (0, decorator_1.decorator)(async ({ chainId, userAddress, inputToken, outputToken, amountIn, amountOut, options, }) => {
178
+ if (!amountIn && !amountOut) {
179
+ throw new Error('Either amountIn or amountOut must be provided');
180
+ }
181
+ else if (amountIn && amountOut) {
182
+ throw new Error('Only one of amountIn or amountOut can be provided');
183
+ }
184
+ const market = await (0, market_1.fetchMarket)(chainId, [inputToken, outputToken]);
185
+ const isTakingBid = (0, viem_1.isAddressEqual)(market.base.address, inputToken);
186
+ const [inputCurrency, outputCurrency] = isTakingBid
187
+ ? [market.base, market.quote]
188
+ : [market.quote, market.base];
189
+ if ((isTakingBid && !market.bidBook.isOpened) ||
190
+ (!isTakingBid && !market.askBook.isOpened)) {
195
191
  throw new Error(`
192
+ Open the market before placing a market order.
196
193
  import { openMarket } from '@clober/v2-sdk'
197
194
 
198
195
  const transaction = await openMarket(
@@ -202,136 +199,240 @@ const marketOrder = async (chainId, userAddress, inputToken, outputToken, amount
202
199
  )
203
200
  `);
204
201
  }
205
- const rawLimitPrice = (0, prices_1.parsePrice)(Number(limitPrice ?? '0'), market.quote.decimals, market.base.decimals);
206
202
  const tokensToSettle = [inputToken, outputToken].filter((address) => !(0, viem_1.isAddressEqual)(address, viem_1.zeroAddress));
207
- const quoteAmount = (0, viem_1.parseUnits)(amount, isBid ? market.quote.decimals : market.base.decimals);
208
- const { result } = await (0, view_1.getExpectedOutput)(chainId, inputToken, outputToken, amount, rpcUrl
209
- ? {
210
- rpcUrl,
211
- }
212
- : {});
213
203
  const isETH = (0, viem_1.isAddressEqual)(inputToken, viem_1.zeroAddress);
214
- const permitParamsList = signature && !isETH
215
- ? [
216
- {
217
- token: inputToken,
218
- permitAmount: quoteAmount,
219
- signature,
204
+ if (amountIn && !amountOut) {
205
+ const { bookId, takenAmount, spentAmount } = await (0, view_1.getExpectedOutput)({
206
+ chainId,
207
+ inputToken,
208
+ outputToken,
209
+ amountIn,
210
+ options: {
211
+ ...options,
212
+ },
213
+ });
214
+ const baseAmount = (0, viem_1.parseUnits)(amountIn, inputCurrency.decimals);
215
+ return {
216
+ transaction: await (0, build_transaction_1.buildTransaction)(chainId, {
217
+ chain: chain_1.CHAIN_MAP[chainId],
218
+ account: userAddress,
219
+ address: addresses_1.CONTRACT_ADDRESSES[chainId].Controller,
220
+ abi: controller_abi_1.CONTROLLER_ABI,
221
+ functionName: 'spend',
222
+ args: [
223
+ [
224
+ {
225
+ id: bookId,
226
+ limitPrice: 0n,
227
+ baseAmount,
228
+ minQuoteAmount: options?.slippage
229
+ ? (0, bigint_1.applyPercent)((0, viem_1.parseUnits)(takenAmount, outputCurrency.decimals), 100 - options.slippage)
230
+ : 0n,
231
+ hookData: viem_1.zeroHash,
232
+ },
233
+ ],
234
+ tokensToSettle,
235
+ options?.erc20PermitParam ? [options.erc20PermitParam] : [],
236
+ (0, time_1.getDeadlineTimestampInSeconds)(),
237
+ ],
238
+ value: isETH ? baseAmount : 0n,
239
+ }, options?.gasLimit),
240
+ result: {
241
+ spent: {
242
+ amount: spentAmount,
243
+ currency: inputCurrency,
244
+ direction: 'in',
245
+ },
246
+ taken: {
247
+ amount: takenAmount,
248
+ currency: outputCurrency,
249
+ direction: 'out',
250
+ },
251
+ },
252
+ };
253
+ }
254
+ else if (!amountIn && amountOut) {
255
+ const { bookId, spentAmount, takenAmount } = await (0, view_1.getExpectedInput)({
256
+ chainId,
257
+ inputToken,
258
+ outputToken,
259
+ amountOut,
260
+ options: {
261
+ ...options,
220
262
  },
221
- ]
222
- : [];
223
- return (0, build_transaction_1.buildTransaction)(chainId, {
224
- chain: chain_1.CHAIN_MAP[chainId],
225
- account: userAddress,
226
- address: addresses_1.CONTRACT_ADDRESSES[chainId].Controller,
227
- abi: controller_abi_1.CONTROLLER_ABI,
228
- functionName: 'take',
229
- args: [
230
- result.map(({ bookId, takenAmount }) => ({
231
- id: bookId,
232
- limitPrice: isBid ? (0, tick_1.invertPrice)(rawLimitPrice) : rawLimitPrice,
233
- quoteAmount: takenAmount,
234
- hookData: viem_1.zeroHash,
235
- })),
236
- tokensToSettle,
237
- permitParamsList,
238
- (0, time_1.getDeadlineTimestampInSeconds)(),
239
- ],
240
- value: isETH ? quoteAmount : 0n,
241
- }, options?.rpcUrl);
242
- };
243
- exports.marketOrder = marketOrder;
244
- const claimOrder = async (chainId, userAddress, id, options) => {
245
- return (0, exports.claimOrders)(chainId, userAddress, [id], options);
246
- };
247
- exports.claimOrder = claimOrder;
248
- const claimOrders = async (chainId, userAddress, ids, options) => {
249
- const { rpcUrl } = options || {
250
- rpcUrl: undefined,
263
+ });
264
+ const quoteAmount = (0, viem_1.parseUnits)(amountOut, outputCurrency.decimals);
265
+ const baseAmount = (0, viem_1.parseUnits)(spentAmount, inputCurrency.decimals);
266
+ const maxBaseAmount = options?.erc20PermitParam?.permitAmount ??
267
+ (options?.slippage
268
+ ? (0, bigint_1.applyPercent)(baseAmount, 100 + options.slippage)
269
+ : isETH
270
+ ? baseAmount
271
+ : 2n ** 256n - 1n);
272
+ return {
273
+ transaction: await (0, build_transaction_1.buildTransaction)(chainId, {
274
+ chain: chain_1.CHAIN_MAP[chainId],
275
+ account: userAddress,
276
+ address: addresses_1.CONTRACT_ADDRESSES[chainId].Controller,
277
+ abi: controller_abi_1.CONTROLLER_ABI,
278
+ functionName: 'take',
279
+ args: [
280
+ [
281
+ {
282
+ id: bookId,
283
+ limitPrice: 0n,
284
+ quoteAmount,
285
+ maxBaseAmount,
286
+ hookData: viem_1.zeroHash,
287
+ },
288
+ ],
289
+ tokensToSettle,
290
+ options?.erc20PermitParam ? [options.erc20PermitParam] : [],
291
+ (0, time_1.getDeadlineTimestampInSeconds)(),
292
+ ],
293
+ value: isETH ? maxBaseAmount : 0n,
294
+ }, options?.gasLimit),
295
+ result: {
296
+ spent: {
297
+ amount: spentAmount,
298
+ currency: inputCurrency,
299
+ direction: 'in',
300
+ },
301
+ taken: {
302
+ amount: takenAmount,
303
+ currency: outputCurrency,
304
+ direction: 'out',
305
+ },
306
+ },
307
+ };
308
+ }
309
+ else {
310
+ throw new Error('Either amountIn or amountOut must be provided');
311
+ }
312
+ });
313
+ exports.claimOrder = (0, decorator_1.decorator)(async ({ chainId, userAddress, id, options, }) => {
314
+ const { transaction, result } = await (0, exports.claimOrders)({
315
+ chainId,
316
+ userAddress,
317
+ ids: [id],
318
+ options: { ...options },
319
+ });
320
+ return {
321
+ transaction,
322
+ result: result[0],
251
323
  };
252
- const isApprovedForAll = await (0, approval_1.fetchIsApprovedForAll)(chainId, userAddress, options?.rpcUrl);
324
+ });
325
+ exports.claimOrders = (0, decorator_1.decorator)(async ({ chainId, userAddress, ids, options, }) => {
326
+ const isApprovedForAll = await (0, approval_1.fetchIsApprovedForAll)(chainId, userAddress);
253
327
  if (!isApprovedForAll) {
254
328
  throw new Error(`
329
+ Set ApprovalForAll before calling this function.
255
330
  import { setApprovalOfOpenOrdersForAll } from '@clober/v2-sdk'
256
331
 
257
- const hash = await setApprovalOfOpenOrdersForAll(
258
- ${chainId},
259
- privateKeyToAccount('0x...')
260
- )
332
+ const hash = await setApprovalOfOpenOrdersForAll({
333
+ chainId: ${chainId},
334
+ walletClient, // use viem
335
+ })
261
336
  `);
262
337
  }
263
- const openOrders = (await (0, view_1.getOpenOrders)(chainId, userAddress, rpcUrl ? { rpcUrl } : {})).filter((order) => ids.includes(order.id));
264
- if (openOrders.length === 0) {
265
- throw new Error(`No claimable open orders found for ${userAddress}`);
266
- }
267
- const tokensToSettle = openOrders
268
- .map((order) => [order.outputCurrency.address, order.inputCurrency.address])
338
+ const orders = (await (0, order_1.fetchOrders)(chainId, ids.map((id) => BigInt(id)))).filter((order) => (0, viem_1.isAddressEqual)(order.user, userAddress) &&
339
+ order.claimable.value !== '0');
340
+ const tokensToSettle = orders
341
+ .map((order) => [
342
+ order.inputCurrency.address,
343
+ order.outputCurrency.address,
344
+ ])
269
345
  .flat()
270
346
  .filter((address, index, self) => self.findIndex((c) => (0, viem_1.isAddressEqual)(c, address)) === index)
271
347
  .filter((address) => !(0, viem_1.isAddressEqual)(address, viem_1.zeroAddress));
272
- return (0, build_transaction_1.buildTransaction)(chainId, {
273
- chain: chain_1.CHAIN_MAP[chainId],
274
- account: userAddress,
275
- address: addresses_1.CONTRACT_ADDRESSES[chainId].Controller,
276
- abi: controller_abi_1.CONTROLLER_ABI,
277
- functionName: 'claim',
278
- args: [
279
- openOrders.map((order) => ({
280
- id: BigInt(order.id),
281
- hookData: viem_1.zeroHash,
282
- })),
283
- tokensToSettle,
284
- [],
285
- (0, time_1.getDeadlineTimestampInSeconds)(),
286
- ],
287
- }, options?.rpcUrl);
288
- };
289
- exports.claimOrders = claimOrders;
290
- const cancelOrder = async (chainId, userAddress, id, options) => {
291
- return (0, exports.cancelOrders)(chainId, userAddress, [id], options);
292
- };
293
- exports.cancelOrder = cancelOrder;
294
- const cancelOrders = async (chainId, userAddress, ids, options) => {
295
- const { rpcUrl } = options || {
296
- rpcUrl: undefined,
348
+ return {
349
+ transaction: await (0, build_transaction_1.buildTransaction)(chainId, {
350
+ chain: chain_1.CHAIN_MAP[chainId],
351
+ account: userAddress,
352
+ address: addresses_1.CONTRACT_ADDRESSES[chainId].Controller,
353
+ abi: controller_abi_1.CONTROLLER_ABI,
354
+ functionName: 'claim',
355
+ args: [
356
+ orders.map(({ id }) => ({
357
+ id,
358
+ hookData: viem_1.zeroHash,
359
+ })),
360
+ tokensToSettle,
361
+ [],
362
+ (0, time_1.getDeadlineTimestampInSeconds)(),
363
+ ],
364
+ }, options?.gasLimit),
365
+ result: orders.reduce((acc, { claimable: { currency, value } }) => {
366
+ const index = acc.findIndex((c) => (0, viem_1.isAddressEqual)(c.currency.address, currency.address));
367
+ if (index === -1) {
368
+ return [...acc, { currency, amount: value, direction: 'out' }];
369
+ }
370
+ acc[index].amount = (Number(acc[index].amount) + Number(value)).toString();
371
+ return acc;
372
+ }, []),
297
373
  };
298
- const isApprovedForAll = await (0, approval_1.fetchIsApprovedForAll)(chainId, userAddress, options?.rpcUrl);
374
+ });
375
+ exports.cancelOrder = (0, decorator_1.decorator)(async ({ chainId, userAddress, id, options, }) => {
376
+ const { transaction, result } = await (0, exports.cancelOrders)({
377
+ chainId,
378
+ userAddress,
379
+ ids: [id],
380
+ options: { ...options },
381
+ });
382
+ return {
383
+ transaction,
384
+ result: result[0],
385
+ };
386
+ });
387
+ exports.cancelOrders = (0, decorator_1.decorator)(async ({ chainId, userAddress, ids, options, }) => {
388
+ const isApprovedForAll = await (0, approval_1.fetchIsApprovedForAll)(chainId, userAddress);
299
389
  if (!isApprovedForAll) {
300
390
  throw new Error(`
391
+ Set ApprovalForAll before calling this function.
301
392
  import { setApprovalOfOpenOrdersForAll } from '@clober/v2-sdk'
302
393
 
303
- const hash = await setApprovalOfOpenOrdersForAll(
304
- ${chainId},
305
- privateKeyToAccount('0x...')
306
- )
394
+ const hash = await setApprovalOfOpenOrdersForAll({
395
+ chainId: ${chainId},
396
+ walletClient, // use viem
397
+ })
307
398
  `);
308
399
  }
309
- const openOrders = (await (0, view_1.getOpenOrders)(chainId, userAddress, rpcUrl ? { rpcUrl } : {})).filter((order) => ids.includes(order.id) && order.cancelable);
310
- if (openOrders.length === 0) {
311
- throw new Error(`No cancelable open orders found for ${userAddress}`);
312
- }
313
- const tokensToSettle = openOrders
314
- .map((order) => [order.outputCurrency.address, order.inputCurrency.address])
400
+ const orders = (await (0, order_1.fetchOrders)(chainId, ids.map((id) => BigInt(id)))).filter((order) => (0, viem_1.isAddressEqual)(order.user, userAddress) &&
401
+ order.cancelable.value !== '0');
402
+ const tokensToSettle = orders
403
+ .map((order) => [
404
+ order.inputCurrency.address,
405
+ order.outputCurrency.address,
406
+ ])
315
407
  .flat()
316
408
  .filter((address, index, self) => self.findIndex((c) => (0, viem_1.isAddressEqual)(c, address)) === index)
317
409
  .filter((address) => !(0, viem_1.isAddressEqual)(address, viem_1.zeroAddress));
318
- return (0, build_transaction_1.buildTransaction)(chainId, {
319
- chain: chain_1.CHAIN_MAP[chainId],
320
- account: userAddress,
321
- address: addresses_1.CONTRACT_ADDRESSES[chainId].Controller,
322
- abi: controller_abi_1.CONTROLLER_ABI,
323
- functionName: 'cancel',
324
- args: [
325
- openOrders.map((order) => ({
326
- id: BigInt(order.id),
327
- leftQuoteAmount: 0n,
328
- hookData: viem_1.zeroHash,
329
- })),
330
- tokensToSettle,
331
- [],
332
- (0, time_1.getDeadlineTimestampInSeconds)(),
333
- ],
334
- }, options?.rpcUrl);
335
- };
336
- exports.cancelOrders = cancelOrders;
410
+ return {
411
+ transaction: await (0, build_transaction_1.buildTransaction)(chainId, {
412
+ chain: chain_1.CHAIN_MAP[chainId],
413
+ account: userAddress,
414
+ address: addresses_1.CONTRACT_ADDRESSES[chainId].Controller,
415
+ abi: controller_abi_1.CONTROLLER_ABI,
416
+ functionName: 'cancel',
417
+ args: [
418
+ orders.map(({ id }) => ({
419
+ id,
420
+ leftQuoteAmount: 0n,
421
+ hookData: viem_1.zeroHash,
422
+ })),
423
+ tokensToSettle,
424
+ [],
425
+ (0, time_1.getDeadlineTimestampInSeconds)(),
426
+ ],
427
+ }, options?.gasLimit),
428
+ result: orders.reduce((acc, { cancelable: { currency, value } }) => {
429
+ const index = acc.findIndex((c) => (0, viem_1.isAddressEqual)(c.currency.address, currency.address));
430
+ if (index === -1) {
431
+ return [...acc, { currency, amount: value, direction: 'out' }];
432
+ }
433
+ acc[index].amount = (Number(acc[index].amount) + Number(value)).toString();
434
+ return acc;
435
+ }, []),
436
+ };
437
+ });
337
438
  //# sourceMappingURL=call.js.map