@clober/v2-sdk 0.0.1-b → 0.0.1-d

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 (297) hide show
  1. package/dist/cjs/.graphclient/index.js +243 -0
  2. package/dist/cjs/.graphclient/index.js.map +1 -0
  3. package/dist/cjs/.graphclient/sources/clober-v2/introspectionSchema.js +14482 -0
  4. package/dist/cjs/.graphclient/sources/clober-v2/introspectionSchema.js.map +1 -0
  5. package/dist/cjs/.graphclient/sources/clober-v2/types.js +4 -0
  6. package/dist/cjs/.graphclient/sources/clober-v2/types.js.map +1 -0
  7. package/dist/cjs/abis/core/controller-abi.js +989 -0
  8. package/dist/cjs/abis/core/controller-abi.js.map +1 -0
  9. package/dist/cjs/abis/core/params-abi.js +62 -0
  10. package/dist/cjs/abis/core/params-abi.js.map +1 -0
  11. package/dist/cjs/apis/currency.js +87 -0
  12. package/dist/cjs/apis/currency.js.map +1 -0
  13. package/dist/cjs/apis/market.js +63 -0
  14. package/dist/cjs/apis/market.js.map +1 -0
  15. package/dist/cjs/apis/open-order.js +90 -0
  16. package/dist/cjs/apis/open-order.js.map +1 -0
  17. package/dist/cjs/approval.js +74 -0
  18. package/dist/cjs/approval.js.map +1 -0
  19. package/dist/cjs/call.js +545 -0
  20. package/dist/cjs/call.js.map +1 -0
  21. package/dist/cjs/constants/action.js +14 -0
  22. package/dist/cjs/constants/action.js.map +1 -0
  23. package/dist/cjs/constants/addresses.js +13 -0
  24. package/dist/cjs/constants/addresses.js.map +1 -0
  25. package/dist/cjs/constants/chain.js +13 -0
  26. package/dist/cjs/constants/chain.js.map +1 -0
  27. package/dist/cjs/constants/currency.js +12 -0
  28. package/dist/cjs/constants/currency.js.map +1 -0
  29. package/dist/cjs/constants/fee.js +7 -0
  30. package/dist/cjs/constants/fee.js.map +1 -0
  31. package/dist/cjs/constants/price.js +6 -0
  32. package/dist/cjs/constants/price.js.map +1 -0
  33. package/dist/cjs/constants/subgraph-url.js +8 -0
  34. package/dist/cjs/constants/subgraph-url.js.map +1 -0
  35. package/dist/cjs/index.js +22 -0
  36. package/dist/cjs/index.js.map +1 -0
  37. package/dist/cjs/model/book.js +130 -0
  38. package/dist/cjs/model/book.js.map +1 -0
  39. package/dist/cjs/model/currency.js +3 -0
  40. package/dist/cjs/model/currency.js.map +1 -0
  41. package/dist/cjs/model/depth.js +3 -0
  42. package/dist/cjs/model/depth.js.map +1 -0
  43. package/dist/cjs/model/fee-policy.js +42 -0
  44. package/dist/cjs/model/fee-policy.js.map +1 -0
  45. package/dist/cjs/model/market.js +215 -0
  46. package/dist/cjs/model/market.js.map +1 -0
  47. package/dist/cjs/model/open-order.js +3 -0
  48. package/dist/cjs/model/open-order.js.map +1 -0
  49. package/dist/cjs/package.json +1 -0
  50. package/dist/cjs/signature.js +178 -0
  51. package/dist/cjs/signature.js.map +1 -0
  52. package/dist/cjs/tsconfig.build.tsbuildinfo +1 -0
  53. package/dist/cjs/type.js +6 -0
  54. package/dist/cjs/type.js.map +1 -0
  55. package/dist/cjs/utils/approval.js +46 -0
  56. package/dist/cjs/utils/approval.js.map +1 -0
  57. package/dist/cjs/utils/book-id.js +25 -0
  58. package/dist/cjs/utils/book-id.js.map +1 -0
  59. package/dist/cjs/utils/build-transaction.js +31 -0
  60. package/dist/cjs/utils/build-transaction.js.map +1 -0
  61. package/dist/cjs/utils/decimals.js +17 -0
  62. package/dist/cjs/utils/decimals.js.map +1 -0
  63. package/dist/cjs/utils/market.js +53 -0
  64. package/dist/cjs/utils/market.js.map +1 -0
  65. package/dist/cjs/utils/math.js +83 -0
  66. package/dist/cjs/utils/math.js.map +1 -0
  67. package/dist/cjs/utils/prices.js +22 -0
  68. package/dist/cjs/utils/prices.js.map +1 -0
  69. package/dist/cjs/utils/tick.js +106 -0
  70. package/dist/cjs/utils/tick.js.map +1 -0
  71. package/dist/cjs/utils/time.js +9 -0
  72. package/dist/cjs/utils/time.js.map +1 -0
  73. package/dist/cjs/utils/unit.js +38 -0
  74. package/dist/cjs/utils/unit.js.map +1 -0
  75. package/dist/cjs/view.js +185 -0
  76. package/dist/cjs/view.js.map +1 -0
  77. package/dist/esm/.graphclient/index.js +233 -0
  78. package/dist/esm/.graphclient/index.js.map +1 -0
  79. package/dist/esm/.graphclient/sources/clober-v2/introspectionSchema.js +14480 -0
  80. package/dist/esm/.graphclient/sources/clober-v2/introspectionSchema.js.map +1 -0
  81. package/dist/esm/.graphclient/sources/clober-v2/types.js +3 -0
  82. package/dist/esm/.graphclient/sources/clober-v2/types.js.map +1 -0
  83. package/dist/esm/abis/core/controller-abi.js +986 -0
  84. package/dist/esm/abis/core/controller-abi.js.map +1 -0
  85. package/dist/esm/abis/core/params-abi.js +59 -0
  86. package/dist/esm/abis/core/params-abi.js.map +1 -0
  87. package/dist/esm/apis/currency.js +83 -0
  88. package/dist/esm/apis/currency.js.map +1 -0
  89. package/dist/esm/apis/market.js +59 -0
  90. package/dist/esm/apis/market.js.map +1 -0
  91. package/dist/esm/apis/open-order.js +85 -0
  92. package/dist/esm/apis/open-order.js.map +1 -0
  93. package/dist/esm/approval.js +70 -0
  94. package/dist/esm/approval.js.map +1 -0
  95. package/dist/esm/call.js +535 -0
  96. package/dist/esm/call.js.map +1 -0
  97. package/dist/esm/constants/action.js +11 -0
  98. package/dist/esm/constants/action.js.map +1 -0
  99. package/dist/esm/constants/addresses.js +10 -0
  100. package/dist/esm/constants/addresses.js.map +1 -0
  101. package/dist/esm/constants/chain.js +10 -0
  102. package/dist/esm/constants/chain.js.map +1 -0
  103. package/dist/esm/constants/currency.js +9 -0
  104. package/dist/esm/constants/currency.js.map +1 -0
  105. package/dist/esm/constants/fee.js +4 -0
  106. package/dist/esm/constants/fee.js.map +1 -0
  107. package/dist/esm/constants/price.js +3 -0
  108. package/dist/esm/constants/price.js.map +1 -0
  109. package/dist/esm/constants/subgraph-url.js +5 -0
  110. package/dist/esm/constants/subgraph-url.js.map +1 -0
  111. package/dist/esm/index.js +6 -0
  112. package/dist/esm/index.js.map +1 -0
  113. package/dist/esm/model/book.js +126 -0
  114. package/dist/esm/model/book.js.map +1 -0
  115. package/dist/esm/model/currency.js +2 -0
  116. package/dist/esm/model/currency.js.map +1 -0
  117. package/dist/esm/model/depth.js +2 -0
  118. package/dist/esm/model/depth.js.map +1 -0
  119. package/dist/esm/model/fee-policy.js +38 -0
  120. package/dist/esm/model/fee-policy.js.map +1 -0
  121. package/dist/esm/model/market.js +211 -0
  122. package/dist/esm/model/market.js.map +1 -0
  123. package/dist/esm/model/open-order.js +2 -0
  124. package/dist/esm/model/open-order.js.map +1 -0
  125. package/dist/esm/package.json +1 -0
  126. package/dist/esm/signature.js +174 -0
  127. package/dist/esm/signature.js.map +1 -0
  128. package/dist/esm/tsconfig.build.tsbuildinfo +1 -0
  129. package/dist/esm/type.js +2 -0
  130. package/dist/esm/type.js.map +1 -0
  131. package/dist/esm/utils/approval.js +42 -0
  132. package/dist/esm/utils/approval.js.map +1 -0
  133. package/{src/utils/book-id.ts → dist/esm/utils/book-id.js} +9 -19
  134. package/dist/esm/utils/book-id.js.map +1 -0
  135. package/dist/esm/utils/build-transaction.js +27 -0
  136. package/dist/esm/utils/build-transaction.js.map +1 -0
  137. package/dist/esm/utils/decimals.js +12 -0
  138. package/dist/esm/utils/decimals.js.map +1 -0
  139. package/dist/esm/utils/market.js +49 -0
  140. package/dist/esm/utils/market.js.map +1 -0
  141. package/dist/esm/utils/math.js +78 -0
  142. package/dist/esm/utils/math.js.map +1 -0
  143. package/dist/esm/utils/prices.js +17 -0
  144. package/dist/esm/utils/prices.js.map +1 -0
  145. package/dist/esm/utils/tick.js +100 -0
  146. package/dist/esm/utils/tick.js.map +1 -0
  147. package/dist/esm/utils/time.js +5 -0
  148. package/dist/esm/utils/time.js.map +1 -0
  149. package/dist/esm/utils/unit.js +34 -0
  150. package/dist/esm/utils/unit.js.map +1 -0
  151. package/dist/esm/view.js +177 -0
  152. package/dist/esm/view.js.map +1 -0
  153. package/dist/types/.graphclient/index.d.ts +1281 -0
  154. package/dist/types/.graphclient/index.d.ts.map +1 -0
  155. package/dist/types/.graphclient/sources/clober-v2/introspectionSchema.d.ts +3 -0
  156. package/dist/types/.graphclient/sources/clober-v2/introspectionSchema.d.ts.map +1 -0
  157. package/dist/types/.graphclient/sources/clober-v2/types.d.ts +984 -0
  158. package/dist/types/.graphclient/sources/clober-v2/types.d.ts.map +1 -0
  159. package/dist/types/abis/core/controller-abi.d.ts +757 -0
  160. package/dist/types/abis/core/controller-abi.d.ts.map +1 -0
  161. package/dist/types/abis/core/params-abi.d.ts +21 -0
  162. package/dist/types/abis/core/params-abi.d.ts.map +1 -0
  163. package/dist/types/apis/currency.d.ts +4 -0
  164. package/dist/types/apis/currency.d.ts.map +1 -0
  165. package/dist/types/apis/market.d.ts +4 -0
  166. package/dist/types/apis/market.d.ts.map +1 -0
  167. package/dist/types/apis/open-order.d.ts +5 -0
  168. package/dist/types/apis/open-order.d.ts.map +1 -0
  169. package/dist/types/approval.d.ts +32 -0
  170. package/dist/types/approval.d.ts.map +1 -0
  171. package/dist/types/call.d.ts +234 -0
  172. package/dist/types/call.d.ts.map +1 -0
  173. package/dist/types/constants/action.d.ts +10 -0
  174. package/dist/types/constants/action.d.ts.map +1 -0
  175. package/dist/types/constants/addresses.d.ts +9 -0
  176. package/dist/types/constants/addresses.d.ts.map +1 -0
  177. package/dist/types/constants/chain.d.ts +9 -0
  178. package/dist/types/constants/chain.d.ts.map +1 -0
  179. package/dist/types/constants/currency.d.ts +8 -0
  180. package/dist/types/constants/currency.d.ts.map +1 -0
  181. package/dist/types/constants/fee.d.ts +4 -0
  182. package/dist/types/constants/fee.d.ts.map +1 -0
  183. package/dist/types/constants/price.d.ts +3 -0
  184. package/dist/types/constants/price.d.ts.map +1 -0
  185. package/dist/types/constants/subgraph-url.d.ts +5 -0
  186. package/dist/types/constants/subgraph-url.d.ts.map +1 -0
  187. package/dist/types/index.d.ts +6 -0
  188. package/dist/types/index.d.ts.map +1 -0
  189. package/dist/types/model/book.d.ts +31 -0
  190. package/dist/types/model/book.d.ts.map +1 -0
  191. package/dist/types/model/currency.d.ts +7 -0
  192. package/dist/types/model/currency.d.ts.map +1 -0
  193. package/dist/types/model/depth.d.ts +11 -0
  194. package/dist/types/model/depth.d.ts.map +1 -0
  195. package/dist/types/model/fee-policy.d.ts +15 -0
  196. package/dist/types/model/fee-policy.d.ts.map +1 -0
  197. package/dist/types/model/market.d.ts +44 -0
  198. package/dist/types/model/market.d.ts.map +1 -0
  199. package/dist/types/model/open-order.d.ts +28 -0
  200. package/dist/types/model/open-order.d.ts.map +1 -0
  201. package/dist/types/signature.d.ts +40 -0
  202. package/dist/types/signature.d.ts.map +1 -0
  203. package/dist/types/type.d.ts +34 -0
  204. package/dist/types/type.d.ts.map +1 -0
  205. package/dist/types/utils/approval.d.ts +3 -0
  206. package/dist/types/utils/approval.d.ts.map +1 -0
  207. package/dist/types/utils/book-id.d.ts +2 -0
  208. package/dist/types/utils/book-id.d.ts.map +1 -0
  209. package/dist/types/utils/build-transaction.d.ts +5 -0
  210. package/dist/types/utils/build-transaction.d.ts.map +1 -0
  211. package/dist/types/utils/decimals.d.ts +3 -0
  212. package/dist/types/utils/decimals.d.ts.map +1 -0
  213. package/dist/types/utils/market.d.ts +7 -0
  214. package/dist/types/utils/market.d.ts.map +1 -0
  215. package/dist/types/utils/math.d.ts +3 -0
  216. package/dist/types/utils/math.d.ts.map +1 -0
  217. package/dist/types/utils/prices.d.ts +3 -0
  218. package/dist/types/utils/prices.d.ts.map +1 -0
  219. package/dist/types/utils/tick.d.ts +4 -0
  220. package/dist/types/utils/tick.d.ts.map +1 -0
  221. package/dist/types/utils/time.d.ts +2 -0
  222. package/dist/types/utils/time.d.ts.map +1 -0
  223. package/dist/types/utils/unit.d.ts +4 -0
  224. package/dist/types/utils/unit.d.ts.map +1 -0
  225. package/dist/types/view.d.ts +129 -0
  226. package/dist/types/view.d.ts.map +1 -0
  227. package/package.json +14 -6
  228. package/.eslintignore +0 -1
  229. package/.eslintrc.yaml +0 -34
  230. package/.github/workflows/ci.yaml +0 -88
  231. package/.github/workflows/deployer.yaml +0 -19
  232. package/.nvmrc +0 -1
  233. package/.prettierignore +0 -6
  234. package/.prettierrc +0 -7
  235. package/src/.graphclient/index.ts +0 -1695
  236. package/src/.graphclient/schema.graphql +0 -1116
  237. package/src/.graphclient/sources/clober-v2/introspectionSchema.ts +0 -14481
  238. package/src/.graphclient/sources/clober-v2/schema.graphql +0 -1116
  239. package/src/.graphclient/sources/clober-v2/types.ts +0 -1133
  240. package/src/.graphclientrc.yml +0 -12
  241. package/src/abis/core/controller-abi.ts +0 -985
  242. package/src/abis/core/params-abi.ts +0 -59
  243. package/src/apis/currency.ts +0 -92
  244. package/src/apis/graphql/books.graphql +0 -25
  245. package/src/apis/graphql/open-order.graphql +0 -29
  246. package/src/apis/graphql/open-orders.graphql +0 -29
  247. package/src/apis/market.ts +0 -85
  248. package/src/apis/open-order.ts +0 -145
  249. package/src/approval.ts +0 -82
  250. package/src/call.ts +0 -705
  251. package/src/constants/action.ts +0 -9
  252. package/src/constants/addresses.ts +0 -17
  253. package/src/constants/chain.ts +0 -12
  254. package/src/constants/currency.ts +0 -15
  255. package/src/constants/fee.ts +0 -4
  256. package/src/constants/price.ts +0 -3
  257. package/src/constants/subgraph-url.ts +0 -8
  258. package/src/index.ts +0 -5
  259. package/src/model/book.ts +0 -166
  260. package/src/model/currency.ts +0 -6
  261. package/src/model/depth.ts +0 -11
  262. package/src/model/fee-policy.ts +0 -51
  263. package/src/model/market.ts +0 -320
  264. package/src/model/open-order.ts +0 -16
  265. package/src/signature.ts +0 -196
  266. package/src/type.ts +0 -38
  267. package/src/utils/approval.ts +0 -48
  268. package/src/utils/build-transaction.ts +0 -39
  269. package/src/utils/decimals.ts +0 -22
  270. package/src/utils/market.ts +0 -74
  271. package/src/utils/math.ts +0 -117
  272. package/src/utils/prices.ts +0 -29
  273. package/src/utils/tick.ts +0 -104
  274. package/src/utils/time.ts +0 -6
  275. package/src/utils/unit.ts +0 -43
  276. package/src/view.ts +0 -258
  277. package/test/book-id.test.ts +0 -101
  278. package/test/fee-policy.test.ts +0 -228
  279. package/test/get-expected-input.test.ts +0 -206
  280. package/test/get-expected-output.test.ts +0 -206
  281. package/test/limit-order.test.ts +0 -279
  282. package/test/market-order.test.ts +0 -245
  283. package/test/market.test.ts +0 -68
  284. package/test/math.test.ts +0 -91
  285. package/test/open-order.test.ts +0 -112
  286. package/test/open.test.ts +0 -15
  287. package/test/tick.test.ts +0 -230
  288. package/test/tsconfig.json +0 -12
  289. package/test/utils/chain.ts +0 -12
  290. package/test/utils/constants.ts +0 -25
  291. package/test/utils/currency.ts +0 -44
  292. package/test/utils/depth.ts +0 -148
  293. package/test/utils/test-chain.ts +0 -26
  294. package/test/vitest.config.ts +0 -15
  295. package/tsconfig.base.json +0 -37
  296. package/tsconfig.build.json +0 -9
  297. package/tsconfig.json +0 -9
package/src/call.ts DELETED
@@ -1,705 +0,0 @@
1
- import {
2
- encodeAbiParameters,
3
- isAddressEqual,
4
- parseUnits,
5
- zeroAddress,
6
- zeroHash,
7
- } from 'viem'
8
-
9
- import { CHAIN_IDS, CHAIN_MAP } from './constants/chain'
10
- import { PermitSignature, Transaction } from './type'
11
- import { calculateUnit } from './utils/unit'
12
- import { CONTROLLER_ABI } from './abis/core/controller-abi'
13
- import { getDeadlineTimestampInSeconds } from './utils/time'
14
- import { buildTransaction } from './utils/build-transaction'
15
- import { CONTRACT_ADDRESSES } from './constants/addresses'
16
- import { MAKER_DEFAULT_POLICY, TAKER_DEFAULT_POLICY } from './constants/fee'
17
- import { fetchMarket } from './apis/market'
18
- import { parsePrice } from './utils/prices'
19
- import { fromPrice, invertPrice } from './utils/tick'
20
- import { getExpectedOutput, getOpenOrders } from './view'
21
- import { toBookId } from './utils/book-id'
22
- import {
23
- MAKE_ORDER_PARAMS_ABI,
24
- TAKE_ORDER_PARAMS_ABI,
25
- } from './abis/core/params-abi'
26
- import { Action } from './constants/action'
27
- import { fetchIsApprovedForAll } from './utils/approval'
28
-
29
- /**
30
- * Build a transaction to open a market.
31
- *
32
- * @param chainId The chain ID of the blockchain.
33
- * @param inputToken The address of the input token.
34
- * @param outputToken The address of the output token.
35
- * @param options
36
- * @param options.rpcUrl The RPC URL of the blockchain.
37
- * @returns A Promise resolving to a transaction object. If the market is already open, returns undefined.
38
- * @example
39
- * import { openMarket } from '@clober/v2-sdk'
40
- *
41
- * const transaction = await openMarket(
42
- * 421614,
43
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
44
- * '0x0000000000000000000000000000000000000000'
45
- * )
46
- */
47
- export const openMarket = async (
48
- chainId: CHAIN_IDS,
49
- inputToken: `0x${string}`,
50
- outputToken: `0x${string}`,
51
- options?: {
52
- rpcUrl?: string
53
- },
54
- ): Promise<Transaction | undefined> => {
55
- const market = await fetchMarket(
56
- chainId,
57
- [inputToken, outputToken],
58
- options?.rpcUrl,
59
- )
60
- const isBid = isAddressEqual(market.quote.address, inputToken)
61
- if ((isBid && !market.bidBookOpen) || (!isBid && !market.askBookOpen)) {
62
- const unit = await calculateUnit(
63
- chainId,
64
- isBid ? market.quote : market.base,
65
- options?.rpcUrl,
66
- )
67
- return buildTransaction(
68
- chainId,
69
- {
70
- address: CONTRACT_ADDRESSES[chainId]!.Controller,
71
- abi: CONTROLLER_ABI,
72
- functionName: 'open',
73
- args: [
74
- [
75
- {
76
- key: {
77
- base: inputToken,
78
- unit,
79
- quote: outputToken,
80
- makerPolicy: MAKER_DEFAULT_POLICY.value,
81
- hooks: zeroAddress,
82
- takerPolicy: TAKER_DEFAULT_POLICY.value,
83
- },
84
- hookData: zeroHash,
85
- },
86
- ],
87
- getDeadlineTimestampInSeconds(),
88
- ],
89
- },
90
- options?.rpcUrl,
91
- )
92
- }
93
- return undefined
94
- }
95
-
96
- /**
97
- * Places a limit order on the specified chain for trading tokens.
98
- *
99
- * @param {CHAIN_IDS} chainId The chain ID.
100
- * @param {`0x${string}`} userAddress The Ethereum address of the user placing the order.
101
- * @param {`0x${string}`} inputToken The address of the token to be used as input.
102
- * @param {`0x${string}`} outputToken The address of the token to be received as output.
103
- * @param {string} amount The amount of input tokens for the order.
104
- * @param {string} price The price at which the order should be executed.
105
- * @param {Object} [options] Optional parameters for the limit order.
106
- * @param {PermitSignature} [options.signature] The permit signature for token approval.
107
- * @param {boolean} [options.postOnly] A boolean indicating whether the order is only to be made not taken.
108
- * @param {string} [options.rpcUrl] The RPC URL of the blockchain.
109
- * @returns {Promise<Transaction>} Promise resolving to the transaction object representing the limit order.
110
- * @example
111
- * import { signERC20Permit, limitOrder } from '@clober/v2-sdk'
112
- * import { privateKeyToAccount } from 'viem/accounts'
113
- *
114
- * const signature = await signERC20Permit(
115
- * 421614,
116
- * privateKeyToAccount('0x...'),
117
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
118
- * '100.123'
119
- * )
120
- *
121
- * const transaction = await limitOrder(
122
- * 421614,
123
- * '0xF8c1869Ecd4df136693C45EcE1b67f85B6bDaE69
124
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
125
- * '0x0000000000000000000000000000000000000000',
126
- * '100.123', // 100.123 USDC
127
- * '4000.01', // price at 4000.01 (ETH/USDC)
128
- * { signature }
129
- * )
130
- *
131
- * @example
132
- * import { limitOrder } from '@clober/v2-sdk'
133
- *
134
- * const transaction = await limitOrder(
135
- * 421614,
136
- * '0xF8c1869Ecd4df136693C45EcE1b67f85B6bDaE69
137
- * '0x0000000000000000000000000000000000000000',
138
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
139
- * '0.13', // 0.13 ETH
140
- * '4000.01', // price at 4000.01 (ETH/USDC)
141
- * )
142
- */
143
- export const limitOrder = async (
144
- chainId: CHAIN_IDS,
145
- userAddress: `0x${string}`,
146
- inputToken: `0x${string}`,
147
- outputToken: `0x${string}`,
148
- amount: string,
149
- price: string,
150
- options?: {
151
- signature?: PermitSignature
152
- postOnly?: boolean
153
- rpcUrl?: string
154
- },
155
- ): Promise<Transaction> => {
156
- const { signature, postOnly, rpcUrl } = options || {
157
- signature: undefined,
158
- postOnly: false,
159
- rpcUrl: undefined,
160
- }
161
- const market = await fetchMarket(chainId, [inputToken, outputToken], rpcUrl)
162
- const isBid = isAddressEqual(market.quote.address, inputToken)
163
- if ((isBid && !market.bidBookOpen) || (!isBid && !market.askBookOpen)) {
164
- throw new Error(`
165
- import { openMarket } from '@clober/v2-sdk'
166
-
167
- const transaction = await openMarket(
168
- ${chainId},
169
- '${inputToken}',
170
- '${outputToken}',
171
- )
172
- `)
173
- }
174
-
175
- const rawPrice = parsePrice(
176
- Number(price),
177
- market.quote.decimals,
178
- market.base.decimals,
179
- )
180
- const tick = isBid ? fromPrice(rawPrice) : fromPrice(invertPrice(rawPrice))
181
- const tokensToSettle = [inputToken, outputToken].filter(
182
- (address) => !isAddressEqual(address, zeroAddress),
183
- )
184
- const quoteAmount = parseUnits(
185
- amount,
186
- isBid ? market.quote.decimals : market.base.decimals,
187
- )
188
- const [unit, { result }] = await Promise.all([
189
- calculateUnit(chainId, isBid ? market.quote : market.base, rpcUrl),
190
- getExpectedOutput(
191
- chainId,
192
- inputToken,
193
- outputToken,
194
- amount,
195
- rpcUrl
196
- ? {
197
- limitPrice: price,
198
- rpcUrl,
199
- }
200
- : {
201
- limitPrice: price,
202
- },
203
- ),
204
- ])
205
- const isETH = isAddressEqual(inputToken, zeroAddress)
206
- const permitParamsList =
207
- signature && !isETH
208
- ? [
209
- {
210
- token: inputToken,
211
- permitAmount: quoteAmount,
212
- signature,
213
- },
214
- ]
215
- : []
216
-
217
- const makeParam = {
218
- id: toBookId(inputToken, outputToken, unit),
219
- tick: Number(tick),
220
- quoteAmount,
221
- hookData: zeroHash,
222
- }
223
- if (postOnly === true || result.length === 0) {
224
- return buildTransaction(
225
- chainId,
226
- {
227
- chain: CHAIN_MAP[chainId],
228
- account: userAddress,
229
- address: CONTRACT_ADDRESSES[chainId]!.Controller,
230
- abi: CONTROLLER_ABI,
231
- functionName: 'make',
232
- args: [
233
- [makeParam],
234
- tokensToSettle,
235
- permitParamsList,
236
- getDeadlineTimestampInSeconds(),
237
- ],
238
- value: isETH ? quoteAmount : 0n,
239
- },
240
- options?.rpcUrl,
241
- )
242
- } else if (result.length === 1) {
243
- // take and make
244
- return buildTransaction(
245
- chainId,
246
- {
247
- chain: CHAIN_MAP[chainId],
248
- account: userAddress,
249
- address: CONTRACT_ADDRESSES[chainId]!.Controller,
250
- abi: CONTROLLER_ABI,
251
- functionName: 'limit',
252
- args: [
253
- [
254
- {
255
- takeBookId: result[0]!.bookId,
256
- makeBookId: makeParam.id,
257
- limitPrice: rawPrice,
258
- tick: makeParam.tick,
259
- quoteAmount,
260
- takeHookData: zeroHash,
261
- makeHookData: makeParam.hookData,
262
- },
263
- ],
264
- tokensToSettle,
265
- permitParamsList,
266
- getDeadlineTimestampInSeconds(),
267
- ],
268
- value: isETH ? quoteAmount : 0n,
269
- },
270
- options?.rpcUrl,
271
- )
272
- } else {
273
- // take x n and make
274
- const makeAmount =
275
- quoteAmount -
276
- result.reduce((acc, { spendAmount }) => acc + spendAmount, 0n)
277
- return buildTransaction(
278
- chainId,
279
- {
280
- chain: CHAIN_MAP[chainId],
281
- account: userAddress,
282
- address: CONTRACT_ADDRESSES[chainId]!.Controller,
283
- abi: CONTROLLER_ABI,
284
- functionName: 'execute',
285
- args: [
286
- [
287
- ...result.map(() => Action.TAKE),
288
- ...(makeAmount > 0n ? [Action.MAKE] : []),
289
- ],
290
- [
291
- ...result.map(({ bookId, takenAmount }) =>
292
- encodeAbiParameters(TAKE_ORDER_PARAMS_ABI, [
293
- {
294
- id: bookId,
295
- limitPrice: rawPrice,
296
- quoteAmount: takenAmount,
297
- hookData: zeroHash,
298
- },
299
- ]),
300
- ),
301
- ...(makeAmount > 0n
302
- ? [
303
- encodeAbiParameters(MAKE_ORDER_PARAMS_ABI, [
304
- {
305
- ...makeParam,
306
- quoteAmount: makeAmount,
307
- },
308
- ]),
309
- ]
310
- : []),
311
- ],
312
- tokensToSettle,
313
- permitParamsList,
314
- [],
315
- getDeadlineTimestampInSeconds(),
316
- ],
317
- value: isETH ? quoteAmount : 0n,
318
- },
319
- options?.rpcUrl,
320
- )
321
- }
322
- }
323
-
324
- /**
325
- * Executes a market order on the specified chain for trading tokens.
326
- *
327
- * @param {CHAIN_IDS} chainId The chain ID.
328
- * @param {`0x${string}`} userAddress The Ethereum address of the user placing the order.
329
- * @param {`0x${string}`} inputToken The address of the token to be used as input.
330
- * @param {`0x${string}`} outputToken The address of the token to be received as output.
331
- * @param {string} amount The amount of input tokens for the order.
332
- * @param {Object} [options] Optional parameters for the limit order.
333
- * @param {PermitSignature} [options.signature] The permit signature for token approval.
334
- * @param {string} [options.rpcUrl] The RPC URL of the blockchain.
335
- * @param {string} [options.limitPrice] The upper bound price to tolerate for the market bid, or the lower bound price to tolerate for the market ask.
336
- * if the limit price is not provided, unlimited slippage is allowed.
337
- * @returns {Promise<Transaction>} Promise resolving to the transaction object representing the limit order.
338
- * @example
339
- * import { signERC20Permit, marketOrder } from '@clober/v2-sdk'
340
- * import { privateKeyToAccount } from 'viem/accounts'
341
- *
342
- * const signature = await signERC20Permit(
343
- * 421614,
344
- * privateKeyToAccount('0x...'),
345
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
346
- * '100.123'
347
- * )
348
- *
349
- * const transaction = await marketOrder(
350
- * 421614,
351
- * '0xF8c1869Ecd4df136693C45EcE1b67f85B6bDaE69
352
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
353
- * '0x0000000000000000000000000000000000000000',
354
- * '100.123', // 100.123 USDC
355
- * { signature }
356
- * )
357
- *
358
- * @example
359
- * import { marketOrder } from '@clober/v2-sdk'
360
- *
361
- * const transaction = await limitOrder(
362
- * 421614,
363
- * '0xF8c1869Ecd4df136693C45EcE1b67f85B6bDaE69
364
- * '0x0000000000000000000000000000000000000000',
365
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
366
- * '0.13', // 0.13 ETH
367
- * )
368
- */
369
- export const marketOrder = async (
370
- chainId: CHAIN_IDS,
371
- userAddress: `0x${string}`,
372
- inputToken: `0x${string}`,
373
- outputToken: `0x${string}`,
374
- amount: string,
375
- options?: {
376
- signature?: PermitSignature
377
- rpcUrl?: string
378
- limitPrice?: string
379
- },
380
- ): Promise<Transaction> => {
381
- const { signature, rpcUrl, limitPrice } = options || {
382
- signature: undefined,
383
- rpcUrl: undefined,
384
- limitPrice: undefined,
385
- }
386
- const market = await fetchMarket(chainId, [inputToken, outputToken], rpcUrl)
387
- const isBid = isAddressEqual(market.quote.address, inputToken)
388
- if ((isBid && !market.bidBookOpen) || (!isBid && !market.askBookOpen)) {
389
- throw new Error(`
390
- import { openMarket } from '@clober/v2-sdk'
391
-
392
- const transaction = await openMarket(
393
- ${chainId},
394
- '${inputToken}',
395
- '${outputToken}',
396
- )
397
- `)
398
- }
399
-
400
- const rawLimitPrice = parsePrice(
401
- Number(limitPrice ?? '0'),
402
- market.quote.decimals,
403
- market.base.decimals,
404
- )
405
- const tokensToSettle = [inputToken, outputToken].filter(
406
- (address) => !isAddressEqual(address, zeroAddress),
407
- )
408
- const quoteAmount = parseUnits(
409
- amount,
410
- isBid ? market.quote.decimals : market.base.decimals,
411
- )
412
- const { result } = await getExpectedOutput(
413
- chainId,
414
- inputToken,
415
- outputToken,
416
- amount,
417
- rpcUrl
418
- ? {
419
- rpcUrl,
420
- }
421
- : {},
422
- )
423
- const isETH = isAddressEqual(inputToken, zeroAddress)
424
- const permitParamsList =
425
- signature && !isETH
426
- ? [
427
- {
428
- token: inputToken,
429
- permitAmount: quoteAmount,
430
- signature,
431
- },
432
- ]
433
- : []
434
-
435
- return buildTransaction(
436
- chainId,
437
- {
438
- chain: CHAIN_MAP[chainId],
439
- account: userAddress,
440
- address: CONTRACT_ADDRESSES[chainId]!.Controller,
441
- abi: CONTROLLER_ABI,
442
- functionName: 'take',
443
- args: [
444
- result.map(({ bookId, takenAmount }) => ({
445
- id: bookId,
446
- limitPrice: isBid ? invertPrice(rawLimitPrice) : rawLimitPrice,
447
- quoteAmount: takenAmount,
448
- hookData: zeroHash,
449
- })),
450
- tokensToSettle,
451
- permitParamsList,
452
- getDeadlineTimestampInSeconds(),
453
- ],
454
- value: isETH ? quoteAmount : 0n,
455
- },
456
- options?.rpcUrl,
457
- )
458
- }
459
-
460
- /**
461
- * Claims specified open order for settlement.
462
- * [IMPORTANT] Set ApprovalForAll before calling this function.
463
- *
464
- * @param {CHAIN_IDS} chainId The chain ID.
465
- * @param {`0x${string}`} userAddress The Ethereum address of the user.
466
- * @param {string} id An ID representing the open order to be claimed.
467
- * @param {Object} [options] Optional parameters for claiming orders.
468
- * @param {string} [options.rpcUrl] The RPC URL to use for executing the transaction.
469
- * @returns {Promise<Transaction>} Promise resolving to the transaction object representing the claim action.
470
- * @throws {Error} Throws an error if no open orders are found for the specified user.
471
- * @example
472
- * import { getOpenOrders, claimOrders } from '@clober/v2-sdk'
473
- *
474
- * const openOrders = await getOpenOrders(
475
- * 421614,
476
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0'
477
- * )
478
- * const transaction = await claimOrders(
479
- * 421614,
480
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
481
- * openOrders.map((order) => order.id)
482
- * )
483
- */
484
- export const claimOrder = async (
485
- chainId: CHAIN_IDS,
486
- userAddress: `0x${string}`,
487
- id: string,
488
- options?: {
489
- rpcUrl?: string
490
- },
491
- ): Promise<Transaction> => {
492
- return claimOrders(chainId, userAddress, [id], options)
493
- }
494
-
495
- /**
496
- * Claims specified open orders for settlement.
497
- * [IMPORTANT] Set ApprovalForAll before calling this function.
498
- *
499
- * @param {CHAIN_IDS} chainId The chain ID.
500
- * @param {`0x${string}`} userAddress The Ethereum address of the user.
501
- * @param {string[]} ids An array of IDs representing the open orders to be claimed.
502
- * @param {Object} [options] Optional parameters for claiming orders.
503
- * @param {string} [options.rpcUrl] The RPC URL to use for executing the transaction.
504
- * @returns {Promise<Transaction>} Promise resolving to the transaction object representing the claim action.
505
- * @throws {Error} Throws an error if no open orders are found for the specified user.
506
- * @example
507
- * import { getOpenOrders, claimOrders } from '@clober/v2-sdk'
508
- *
509
- * const openOrders = await getOpenOrders(
510
- * 421614,
511
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0'
512
- * )
513
- * const transaction = await claimOrders(
514
- * 421614,
515
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
516
- * openOrders.map((order) => order.id)
517
- * )
518
- */
519
- export const claimOrders = async (
520
- chainId: CHAIN_IDS,
521
- userAddress: `0x${string}`,
522
- ids: string[],
523
- options?: {
524
- rpcUrl?: string
525
- },
526
- ): Promise<Transaction> => {
527
- const { rpcUrl } = options || {
528
- rpcUrl: undefined,
529
- }
530
- const isApprovedForAll = await fetchIsApprovedForAll(
531
- chainId,
532
- userAddress,
533
- options?.rpcUrl,
534
- )
535
- if (!isApprovedForAll) {
536
- throw new Error(`
537
- import { setApprovalOfOpenOrdersForAll } from '@clober/v2-sdk'
538
-
539
- const hash = await setApprovalOfOpenOrdersForAll(
540
- ${chainId},
541
- privateKeyToAccount('0x...')
542
- )
543
- `)
544
- }
545
-
546
- const openOrders = (
547
- await getOpenOrders(chainId, userAddress, rpcUrl ? { rpcUrl } : {})
548
- ).filter((order) => ids.includes(order.id))
549
- if (openOrders.length === 0) {
550
- throw new Error(`No claimable open orders found for ${userAddress}`)
551
- }
552
- const tokensToSettle = openOrders
553
- .map((order) => [order.outputCurrency.address, order.inputCurrency.address])
554
- .flat()
555
- .filter(
556
- (address, index, self) =>
557
- self.findIndex((c) => isAddressEqual(c, address)) === index,
558
- )
559
- .filter((address) => !isAddressEqual(address, zeroAddress))
560
-
561
- return buildTransaction(
562
- chainId,
563
- {
564
- chain: CHAIN_MAP[chainId],
565
- account: userAddress,
566
- address: CONTRACT_ADDRESSES[chainId]!.Controller,
567
- abi: CONTROLLER_ABI,
568
- functionName: 'claim',
569
- args: [
570
- openOrders.map((order) => ({
571
- id: BigInt(order.id),
572
- hookData: zeroHash,
573
- })),
574
- tokensToSettle,
575
- [],
576
- getDeadlineTimestampInSeconds(),
577
- ],
578
- },
579
- options?.rpcUrl,
580
- )
581
- }
582
-
583
- /**
584
- * Cancels specified open order if the order is not fully filled.
585
- * [IMPORTANT] Set ApprovalForAll before calling this function.
586
- *
587
- * @param {CHAIN_IDS} chainId The chain ID.
588
- * @param {`0x${string}`} userAddress The Ethereum address of the user.
589
- * @param {string} id An ID representing the open order to be canceled
590
- * @param {Object} [options] Optional parameters for canceling orders.
591
- * @param {string} [options.rpcUrl] The RPC URL to use for executing the transaction.
592
- * @returns {Promise<Transaction>} Promise resolving to the transaction object representing the cancel action.
593
- * @throws {Error} Throws an error if no open orders are found for the specified user.
594
- * @example
595
- * import { getOpenOrders, cancelOrders } from '@clober/v2-sdk'
596
- *
597
- * const openOrders = await getOpenOrders(
598
- * 421614,
599
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0'
600
- * )
601
- * const transaction = await cancelOrders(
602
- * 421614,
603
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
604
- * openOrders.map((order) => order.id)
605
- * )
606
- */
607
- export const cancelOrder = async (
608
- chainId: CHAIN_IDS,
609
- userAddress: `0x${string}`,
610
- id: string,
611
- options?: {
612
- rpcUrl?: string
613
- },
614
- ): Promise<Transaction> => {
615
- return cancelOrders(chainId, userAddress, [id], options)
616
- }
617
-
618
- /**
619
- * Cancels specified open orders if orders are not fully filled.
620
- * [IMPORTANT] Set ApprovalForAll before calling this function.
621
- *
622
- * @param {CHAIN_IDS} chainId The chain ID.
623
- * @param {`0x${string}`} userAddress The Ethereum address of the user.
624
- * @param {string[]} ids An array of IDs representing the open orders to be canceled.
625
- * @param {Object} [options] Optional parameters for canceling orders.
626
- * @param {string} [options.rpcUrl] The RPC URL to use for executing the transaction.
627
- * @returns {Promise<Transaction>} Promise resolving to the transaction object representing the cancel action.
628
- * @throws {Error} Throws an error if no open orders are found for the specified user.
629
- * @example
630
- * import { getOpenOrders, cancelOrders } from '@clober/v2-sdk'
631
- *
632
- * const openOrders = await getOpenOrders(
633
- * 421614,
634
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0'
635
- * )
636
- * const transaction = await cancelOrders(
637
- * 421614,
638
- * '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
639
- * openOrders.map((order) => order.id)
640
- * )
641
- */
642
- export const cancelOrders = async (
643
- chainId: CHAIN_IDS,
644
- userAddress: `0x${string}`,
645
- ids: string[],
646
- options?: {
647
- rpcUrl?: string
648
- },
649
- ): Promise<Transaction> => {
650
- const { rpcUrl } = options || {
651
- rpcUrl: undefined,
652
- }
653
- const isApprovedForAll = await fetchIsApprovedForAll(
654
- chainId,
655
- userAddress,
656
- options?.rpcUrl,
657
- )
658
- if (!isApprovedForAll) {
659
- throw new Error(`
660
- import { setApprovalOfOpenOrdersForAll } from '@clober/v2-sdk'
661
-
662
- const hash = await setApprovalOfOpenOrdersForAll(
663
- ${chainId},
664
- privateKeyToAccount('0x...')
665
- )
666
- `)
667
- }
668
-
669
- const openOrders = (
670
- await getOpenOrders(chainId, userAddress, rpcUrl ? { rpcUrl } : {})
671
- ).filter((order) => ids.includes(order.id) && order.cancelable)
672
- if (openOrders.length === 0) {
673
- throw new Error(`No cancelable open orders found for ${userAddress}`)
674
- }
675
- const tokensToSettle = openOrders
676
- .map((order) => [order.outputCurrency.address, order.inputCurrency.address])
677
- .flat()
678
- .filter(
679
- (address, index, self) =>
680
- self.findIndex((c) => isAddressEqual(c, address)) === index,
681
- )
682
- .filter((address) => !isAddressEqual(address, zeroAddress))
683
-
684
- return buildTransaction(
685
- chainId,
686
- {
687
- chain: CHAIN_MAP[chainId],
688
- account: userAddress,
689
- address: CONTRACT_ADDRESSES[chainId]!.Controller,
690
- abi: CONTROLLER_ABI,
691
- functionName: 'cancel',
692
- args: [
693
- openOrders.map((order) => ({
694
- id: BigInt(order.id),
695
- leftQuoteAmount: 0n,
696
- hookData: zeroHash,
697
- })),
698
- tokensToSettle,
699
- [],
700
- getDeadlineTimestampInSeconds(),
701
- ],
702
- },
703
- options?.rpcUrl,
704
- )
705
- }
@@ -1,9 +0,0 @@
1
- export enum Action {
2
- OPEN,
3
- MAKE,
4
- LIMIT,
5
- TAKE,
6
- SPEND,
7
- CLAIM,
8
- CANCEL,
9
- }