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

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/.eslintignore +1 -0
  2. package/.eslintrc.yaml +34 -0
  3. package/.github/workflows/ci.yaml +88 -0
  4. package/.github/workflows/deployer.yaml +19 -0
  5. package/.nvmrc +1 -0
  6. package/.prettierignore +6 -0
  7. package/.prettierrc +7 -0
  8. package/package.json +8 -4
  9. package/src/.graphclient/index.ts +1695 -0
  10. package/src/.graphclient/schema.graphql +1116 -0
  11. package/src/.graphclient/sources/clober-v2/introspectionSchema.ts +14481 -0
  12. package/src/.graphclient/sources/clober-v2/schema.graphql +1116 -0
  13. package/src/.graphclient/sources/clober-v2/types.ts +1133 -0
  14. package/src/.graphclientrc.yml +12 -0
  15. package/src/abis/core/controller-abi.ts +985 -0
  16. package/src/abis/core/params-abi.ts +59 -0
  17. package/src/apis/currency.ts +92 -0
  18. package/src/apis/graphql/books.graphql +25 -0
  19. package/src/apis/graphql/open-order.graphql +29 -0
  20. package/src/apis/graphql/open-orders.graphql +29 -0
  21. package/src/apis/market.ts +85 -0
  22. package/src/apis/open-order.ts +145 -0
  23. package/src/approval.ts +82 -0
  24. package/src/call.ts +705 -0
  25. package/src/constants/action.ts +9 -0
  26. package/src/constants/addresses.ts +17 -0
  27. package/src/constants/chain.ts +12 -0
  28. package/src/constants/currency.ts +15 -0
  29. package/src/constants/fee.ts +4 -0
  30. package/src/constants/price.ts +3 -0
  31. package/src/constants/subgraph-url.ts +8 -0
  32. package/src/index.ts +5 -0
  33. package/src/model/book.ts +166 -0
  34. package/src/model/currency.ts +6 -0
  35. package/src/model/depth.ts +11 -0
  36. package/src/model/fee-policy.ts +51 -0
  37. package/src/model/market.ts +320 -0
  38. package/src/model/open-order.ts +16 -0
  39. package/src/signature.ts +196 -0
  40. package/src/type.ts +38 -0
  41. package/src/utils/approval.ts +48 -0
  42. package/{dist/esm/utils/book-id.js → src/utils/book-id.ts} +19 -9
  43. package/src/utils/build-transaction.ts +39 -0
  44. package/src/utils/decimals.ts +22 -0
  45. package/src/utils/market.ts +74 -0
  46. package/src/utils/math.ts +117 -0
  47. package/src/utils/prices.ts +29 -0
  48. package/src/utils/tick.ts +104 -0
  49. package/src/utils/time.ts +6 -0
  50. package/src/utils/unit.ts +43 -0
  51. package/src/view.ts +258 -0
  52. package/test/book-id.test.ts +101 -0
  53. package/test/fee-policy.test.ts +228 -0
  54. package/test/get-expected-input.test.ts +206 -0
  55. package/test/get-expected-output.test.ts +206 -0
  56. package/test/limit-order.test.ts +279 -0
  57. package/test/market-order.test.ts +245 -0
  58. package/test/market.test.ts +68 -0
  59. package/test/math.test.ts +91 -0
  60. package/test/open-order.test.ts +112 -0
  61. package/test/open.test.ts +15 -0
  62. package/test/tick.test.ts +230 -0
  63. package/test/tsconfig.json +12 -0
  64. package/test/utils/chain.ts +12 -0
  65. package/test/utils/constants.ts +25 -0
  66. package/test/utils/currency.ts +44 -0
  67. package/test/utils/depth.ts +148 -0
  68. package/test/utils/test-chain.ts +26 -0
  69. package/test/vitest.config.ts +15 -0
  70. package/tsconfig.base.json +37 -0
  71. package/tsconfig.build.json +9 -0
  72. package/tsconfig.json +9 -0
  73. package/dist/cjs/.graphclient/index.js +0 -243
  74. package/dist/cjs/.graphclient/index.js.map +0 -1
  75. package/dist/cjs/.graphclient/sources/clober-v2/introspectionSchema.js +0 -14482
  76. package/dist/cjs/.graphclient/sources/clober-v2/introspectionSchema.js.map +0 -1
  77. package/dist/cjs/.graphclient/sources/clober-v2/types.js +0 -4
  78. package/dist/cjs/.graphclient/sources/clober-v2/types.js.map +0 -1
  79. package/dist/cjs/abis/core/controller-abi.js +0 -989
  80. package/dist/cjs/abis/core/controller-abi.js.map +0 -1
  81. package/dist/cjs/abis/core/params-abi.js +0 -62
  82. package/dist/cjs/abis/core/params-abi.js.map +0 -1
  83. package/dist/cjs/apis/currency.js +0 -87
  84. package/dist/cjs/apis/currency.js.map +0 -1
  85. package/dist/cjs/apis/market.js +0 -63
  86. package/dist/cjs/apis/market.js.map +0 -1
  87. package/dist/cjs/apis/open-order.js +0 -90
  88. package/dist/cjs/apis/open-order.js.map +0 -1
  89. package/dist/cjs/approval.js +0 -74
  90. package/dist/cjs/approval.js.map +0 -1
  91. package/dist/cjs/call.js +0 -545
  92. package/dist/cjs/call.js.map +0 -1
  93. package/dist/cjs/constants/action.js +0 -14
  94. package/dist/cjs/constants/action.js.map +0 -1
  95. package/dist/cjs/constants/addresses.js +0 -13
  96. package/dist/cjs/constants/addresses.js.map +0 -1
  97. package/dist/cjs/constants/chain.js +0 -13
  98. package/dist/cjs/constants/chain.js.map +0 -1
  99. package/dist/cjs/constants/currency.js +0 -12
  100. package/dist/cjs/constants/currency.js.map +0 -1
  101. package/dist/cjs/constants/fee.js +0 -7
  102. package/dist/cjs/constants/fee.js.map +0 -1
  103. package/dist/cjs/constants/price.js +0 -6
  104. package/dist/cjs/constants/price.js.map +0 -1
  105. package/dist/cjs/constants/subgraph-url.js +0 -8
  106. package/dist/cjs/constants/subgraph-url.js.map +0 -1
  107. package/dist/cjs/index.js +0 -22
  108. package/dist/cjs/index.js.map +0 -1
  109. package/dist/cjs/model/book.js +0 -130
  110. package/dist/cjs/model/book.js.map +0 -1
  111. package/dist/cjs/model/currency.js +0 -3
  112. package/dist/cjs/model/currency.js.map +0 -1
  113. package/dist/cjs/model/depth.js +0 -3
  114. package/dist/cjs/model/depth.js.map +0 -1
  115. package/dist/cjs/model/fee-policy.js +0 -42
  116. package/dist/cjs/model/fee-policy.js.map +0 -1
  117. package/dist/cjs/model/market.js +0 -215
  118. package/dist/cjs/model/market.js.map +0 -1
  119. package/dist/cjs/model/open-order.js +0 -3
  120. package/dist/cjs/model/open-order.js.map +0 -1
  121. package/dist/cjs/package.json +0 -1
  122. package/dist/cjs/signature.js +0 -178
  123. package/dist/cjs/signature.js.map +0 -1
  124. package/dist/cjs/tsconfig.build.tsbuildinfo +0 -1
  125. package/dist/cjs/type.js +0 -6
  126. package/dist/cjs/type.js.map +0 -1
  127. package/dist/cjs/utils/approval.js +0 -46
  128. package/dist/cjs/utils/approval.js.map +0 -1
  129. package/dist/cjs/utils/book-id.js +0 -25
  130. package/dist/cjs/utils/book-id.js.map +0 -1
  131. package/dist/cjs/utils/build-transaction.js +0 -31
  132. package/dist/cjs/utils/build-transaction.js.map +0 -1
  133. package/dist/cjs/utils/decimals.js +0 -17
  134. package/dist/cjs/utils/decimals.js.map +0 -1
  135. package/dist/cjs/utils/market.js +0 -53
  136. package/dist/cjs/utils/market.js.map +0 -1
  137. package/dist/cjs/utils/math.js +0 -83
  138. package/dist/cjs/utils/math.js.map +0 -1
  139. package/dist/cjs/utils/prices.js +0 -22
  140. package/dist/cjs/utils/prices.js.map +0 -1
  141. package/dist/cjs/utils/tick.js +0 -106
  142. package/dist/cjs/utils/tick.js.map +0 -1
  143. package/dist/cjs/utils/time.js +0 -9
  144. package/dist/cjs/utils/time.js.map +0 -1
  145. package/dist/cjs/utils/unit.js +0 -38
  146. package/dist/cjs/utils/unit.js.map +0 -1
  147. package/dist/cjs/view.js +0 -185
  148. package/dist/cjs/view.js.map +0 -1
  149. package/dist/esm/.graphclient/index.js +0 -233
  150. package/dist/esm/.graphclient/index.js.map +0 -1
  151. package/dist/esm/.graphclient/sources/clober-v2/introspectionSchema.js +0 -14480
  152. package/dist/esm/.graphclient/sources/clober-v2/introspectionSchema.js.map +0 -1
  153. package/dist/esm/.graphclient/sources/clober-v2/types.js +0 -3
  154. package/dist/esm/.graphclient/sources/clober-v2/types.js.map +0 -1
  155. package/dist/esm/abis/core/controller-abi.js +0 -986
  156. package/dist/esm/abis/core/controller-abi.js.map +0 -1
  157. package/dist/esm/abis/core/params-abi.js +0 -59
  158. package/dist/esm/abis/core/params-abi.js.map +0 -1
  159. package/dist/esm/apis/currency.js +0 -83
  160. package/dist/esm/apis/currency.js.map +0 -1
  161. package/dist/esm/apis/market.js +0 -59
  162. package/dist/esm/apis/market.js.map +0 -1
  163. package/dist/esm/apis/open-order.js +0 -85
  164. package/dist/esm/apis/open-order.js.map +0 -1
  165. package/dist/esm/approval.js +0 -70
  166. package/dist/esm/approval.js.map +0 -1
  167. package/dist/esm/call.js +0 -535
  168. package/dist/esm/call.js.map +0 -1
  169. package/dist/esm/constants/action.js +0 -11
  170. package/dist/esm/constants/action.js.map +0 -1
  171. package/dist/esm/constants/addresses.js +0 -10
  172. package/dist/esm/constants/addresses.js.map +0 -1
  173. package/dist/esm/constants/chain.js +0 -10
  174. package/dist/esm/constants/chain.js.map +0 -1
  175. package/dist/esm/constants/currency.js +0 -9
  176. package/dist/esm/constants/currency.js.map +0 -1
  177. package/dist/esm/constants/fee.js +0 -4
  178. package/dist/esm/constants/fee.js.map +0 -1
  179. package/dist/esm/constants/price.js +0 -3
  180. package/dist/esm/constants/price.js.map +0 -1
  181. package/dist/esm/constants/subgraph-url.js +0 -5
  182. package/dist/esm/constants/subgraph-url.js.map +0 -1
  183. package/dist/esm/index.js +0 -6
  184. package/dist/esm/index.js.map +0 -1
  185. package/dist/esm/model/book.js +0 -126
  186. package/dist/esm/model/book.js.map +0 -1
  187. package/dist/esm/model/currency.js +0 -2
  188. package/dist/esm/model/currency.js.map +0 -1
  189. package/dist/esm/model/depth.js +0 -2
  190. package/dist/esm/model/depth.js.map +0 -1
  191. package/dist/esm/model/fee-policy.js +0 -38
  192. package/dist/esm/model/fee-policy.js.map +0 -1
  193. package/dist/esm/model/market.js +0 -211
  194. package/dist/esm/model/market.js.map +0 -1
  195. package/dist/esm/model/open-order.js +0 -2
  196. package/dist/esm/model/open-order.js.map +0 -1
  197. package/dist/esm/package.json +0 -1
  198. package/dist/esm/signature.js +0 -174
  199. package/dist/esm/signature.js.map +0 -1
  200. package/dist/esm/tsconfig.build.tsbuildinfo +0 -1
  201. package/dist/esm/type.js +0 -2
  202. package/dist/esm/type.js.map +0 -1
  203. package/dist/esm/utils/approval.js +0 -42
  204. package/dist/esm/utils/approval.js.map +0 -1
  205. package/dist/esm/utils/book-id.js.map +0 -1
  206. package/dist/esm/utils/build-transaction.js +0 -27
  207. package/dist/esm/utils/build-transaction.js.map +0 -1
  208. package/dist/esm/utils/decimals.js +0 -12
  209. package/dist/esm/utils/decimals.js.map +0 -1
  210. package/dist/esm/utils/market.js +0 -49
  211. package/dist/esm/utils/market.js.map +0 -1
  212. package/dist/esm/utils/math.js +0 -78
  213. package/dist/esm/utils/math.js.map +0 -1
  214. package/dist/esm/utils/prices.js +0 -17
  215. package/dist/esm/utils/prices.js.map +0 -1
  216. package/dist/esm/utils/tick.js +0 -100
  217. package/dist/esm/utils/tick.js.map +0 -1
  218. package/dist/esm/utils/time.js +0 -5
  219. package/dist/esm/utils/time.js.map +0 -1
  220. package/dist/esm/utils/unit.js +0 -34
  221. package/dist/esm/utils/unit.js.map +0 -1
  222. package/dist/esm/view.js +0 -177
  223. package/dist/esm/view.js.map +0 -1
  224. package/dist/types/.graphclient/index.d.ts +0 -1281
  225. package/dist/types/.graphclient/index.d.ts.map +0 -1
  226. package/dist/types/.graphclient/sources/clober-v2/introspectionSchema.d.ts +0 -3
  227. package/dist/types/.graphclient/sources/clober-v2/introspectionSchema.d.ts.map +0 -1
  228. package/dist/types/.graphclient/sources/clober-v2/types.d.ts +0 -984
  229. package/dist/types/.graphclient/sources/clober-v2/types.d.ts.map +0 -1
  230. package/dist/types/abis/core/controller-abi.d.ts +0 -757
  231. package/dist/types/abis/core/controller-abi.d.ts.map +0 -1
  232. package/dist/types/abis/core/params-abi.d.ts +0 -21
  233. package/dist/types/abis/core/params-abi.d.ts.map +0 -1
  234. package/dist/types/apis/currency.d.ts +0 -4
  235. package/dist/types/apis/currency.d.ts.map +0 -1
  236. package/dist/types/apis/market.d.ts +0 -4
  237. package/dist/types/apis/market.d.ts.map +0 -1
  238. package/dist/types/apis/open-order.d.ts +0 -5
  239. package/dist/types/apis/open-order.d.ts.map +0 -1
  240. package/dist/types/approval.d.ts +0 -32
  241. package/dist/types/approval.d.ts.map +0 -1
  242. package/dist/types/call.d.ts +0 -234
  243. package/dist/types/call.d.ts.map +0 -1
  244. package/dist/types/constants/action.d.ts +0 -10
  245. package/dist/types/constants/action.d.ts.map +0 -1
  246. package/dist/types/constants/addresses.d.ts +0 -9
  247. package/dist/types/constants/addresses.d.ts.map +0 -1
  248. package/dist/types/constants/chain.d.ts +0 -9
  249. package/dist/types/constants/chain.d.ts.map +0 -1
  250. package/dist/types/constants/currency.d.ts +0 -8
  251. package/dist/types/constants/currency.d.ts.map +0 -1
  252. package/dist/types/constants/fee.d.ts +0 -4
  253. package/dist/types/constants/fee.d.ts.map +0 -1
  254. package/dist/types/constants/price.d.ts +0 -3
  255. package/dist/types/constants/price.d.ts.map +0 -1
  256. package/dist/types/constants/subgraph-url.d.ts +0 -5
  257. package/dist/types/constants/subgraph-url.d.ts.map +0 -1
  258. package/dist/types/index.d.ts +0 -6
  259. package/dist/types/index.d.ts.map +0 -1
  260. package/dist/types/model/book.d.ts +0 -31
  261. package/dist/types/model/book.d.ts.map +0 -1
  262. package/dist/types/model/currency.d.ts +0 -7
  263. package/dist/types/model/currency.d.ts.map +0 -1
  264. package/dist/types/model/depth.d.ts +0 -11
  265. package/dist/types/model/depth.d.ts.map +0 -1
  266. package/dist/types/model/fee-policy.d.ts +0 -15
  267. package/dist/types/model/fee-policy.d.ts.map +0 -1
  268. package/dist/types/model/market.d.ts +0 -44
  269. package/dist/types/model/market.d.ts.map +0 -1
  270. package/dist/types/model/open-order.d.ts +0 -28
  271. package/dist/types/model/open-order.d.ts.map +0 -1
  272. package/dist/types/signature.d.ts +0 -40
  273. package/dist/types/signature.d.ts.map +0 -1
  274. package/dist/types/type.d.ts +0 -34
  275. package/dist/types/type.d.ts.map +0 -1
  276. package/dist/types/utils/approval.d.ts +0 -3
  277. package/dist/types/utils/approval.d.ts.map +0 -1
  278. package/dist/types/utils/book-id.d.ts +0 -2
  279. package/dist/types/utils/book-id.d.ts.map +0 -1
  280. package/dist/types/utils/build-transaction.d.ts +0 -5
  281. package/dist/types/utils/build-transaction.d.ts.map +0 -1
  282. package/dist/types/utils/decimals.d.ts +0 -3
  283. package/dist/types/utils/decimals.d.ts.map +0 -1
  284. package/dist/types/utils/market.d.ts +0 -7
  285. package/dist/types/utils/market.d.ts.map +0 -1
  286. package/dist/types/utils/math.d.ts +0 -3
  287. package/dist/types/utils/math.d.ts.map +0 -1
  288. package/dist/types/utils/prices.d.ts +0 -3
  289. package/dist/types/utils/prices.d.ts.map +0 -1
  290. package/dist/types/utils/tick.d.ts +0 -4
  291. package/dist/types/utils/tick.d.ts.map +0 -1
  292. package/dist/types/utils/time.d.ts +0 -2
  293. package/dist/types/utils/time.d.ts.map +0 -1
  294. package/dist/types/utils/unit.d.ts +0 -4
  295. package/dist/types/utils/unit.d.ts.map +0 -1
  296. package/dist/types/view.d.ts +0 -129
  297. package/dist/types/view.d.ts.map +0 -1
@@ -0,0 +1,228 @@
1
+ import { expect, test } from 'vitest'
2
+
3
+ import { FeePolicy } from '../src/model/fee-policy'
4
+ import {
5
+ MAKER_DEFAULT_POLICY,
6
+ TAKER_DEFAULT_POLICY,
7
+ } from '../src/constants/fee'
8
+
9
+ import { publicClient } from './utils/constants'
10
+
11
+ const _abi = [
12
+ {
13
+ inputs: [],
14
+ name: 'InvalidFeePolicy',
15
+ type: 'error',
16
+ },
17
+ {
18
+ inputs: [
19
+ {
20
+ internalType: 'FeePolicy',
21
+ name: 'self',
22
+ type: 'uint24',
23
+ },
24
+ {
25
+ internalType: 'uint256',
26
+ name: 'amount',
27
+ type: 'uint256',
28
+ },
29
+ {
30
+ internalType: 'bool',
31
+ name: 'reverseRounding',
32
+ type: 'bool',
33
+ },
34
+ ],
35
+ name: 'calculateFee',
36
+ outputs: [
37
+ {
38
+ internalType: 'int256',
39
+ name: 'fee',
40
+ type: 'int256',
41
+ },
42
+ ],
43
+ stateMutability: 'pure',
44
+ type: 'function',
45
+ },
46
+ {
47
+ inputs: [
48
+ {
49
+ internalType: 'FeePolicy',
50
+ name: 'self',
51
+ type: 'uint24',
52
+ },
53
+ {
54
+ internalType: 'uint256',
55
+ name: 'amount',
56
+ type: 'uint256',
57
+ },
58
+ {
59
+ internalType: 'bool',
60
+ name: 'reverseFee',
61
+ type: 'bool',
62
+ },
63
+ ],
64
+ name: 'calculateOriginalAmount',
65
+ outputs: [
66
+ {
67
+ internalType: 'uint256',
68
+ name: 'originalAmount',
69
+ type: 'uint256',
70
+ },
71
+ ],
72
+ stateMutability: 'pure',
73
+ type: 'function',
74
+ },
75
+ {
76
+ inputs: [
77
+ {
78
+ internalType: 'bool',
79
+ name: 'usesQuote_',
80
+ type: 'bool',
81
+ },
82
+ {
83
+ internalType: 'int24',
84
+ name: 'rate_',
85
+ type: 'int24',
86
+ },
87
+ ],
88
+ name: 'encode',
89
+ outputs: [
90
+ {
91
+ internalType: 'FeePolicy',
92
+ name: 'feePolicy',
93
+ type: 'uint24',
94
+ },
95
+ ],
96
+ stateMutability: 'pure',
97
+ type: 'function',
98
+ },
99
+ {
100
+ inputs: [
101
+ {
102
+ internalType: 'FeePolicy',
103
+ name: 'self',
104
+ type: 'uint24',
105
+ },
106
+ ],
107
+ name: 'usesQuote',
108
+ outputs: [
109
+ {
110
+ internalType: 'bool',
111
+ name: 'f',
112
+ type: 'bool',
113
+ },
114
+ ],
115
+ stateMutability: 'pure',
116
+ type: 'function',
117
+ },
118
+ ] as const
119
+
120
+ const FEE_POLICY_WRAPPER_ADDRESS = '0x226Dad19a0C0E0faEB488601B61B1B67E434db6a'
121
+
122
+ const encode = async (usesQuote: boolean, rate: number) => {
123
+ const mockPolicy = new FeePolicy(usesQuote, BigInt(rate))
124
+ const policy = await publicClient.readContract({
125
+ address: FEE_POLICY_WRAPPER_ADDRESS,
126
+ abi: _abi,
127
+ functionName: 'encode',
128
+ args: [usesQuote, rate],
129
+ })
130
+ expect(policy).toEqual(Number(mockPolicy.value))
131
+ expect(
132
+ await publicClient.readContract({
133
+ address: FEE_POLICY_WRAPPER_ADDRESS,
134
+ abi: _abi,
135
+ functionName: 'usesQuote',
136
+ args: [policy],
137
+ }),
138
+ ).toEqual(mockPolicy.usesQuote)
139
+ }
140
+
141
+ const checkCalculateFee = async (
142
+ policy: FeePolicy,
143
+ amount: bigint,
144
+ reverseRounding: boolean,
145
+ ) => {
146
+ expect(
147
+ await publicClient.readContract({
148
+ address: FEE_POLICY_WRAPPER_ADDRESS,
149
+ abi: _abi,
150
+ functionName: 'calculateFee',
151
+ args: [Number(policy.value), amount, reverseRounding],
152
+ }),
153
+ ).toEqual(policy.calculateFee(amount, reverseRounding))
154
+ }
155
+
156
+ const checkCalculateOriginalAmount = async (
157
+ policy: FeePolicy,
158
+ amount: bigint,
159
+ reverseFee: boolean,
160
+ ) => {
161
+ expect(
162
+ await publicClient.readContract({
163
+ address: FEE_POLICY_WRAPPER_ADDRESS,
164
+ abi: _abi,
165
+ functionName: 'calculateOriginalAmount',
166
+ args: [Number(policy.value), amount, reverseFee],
167
+ }),
168
+ ).toEqual(policy.calculateOriginalAmount(amount, reverseFee))
169
+ }
170
+
171
+ const checkFrom = async (policy: FeePolicy) => {
172
+ const _feePolicy = FeePolicy.from(policy.value)
173
+ expect(policy.usesQuote).toEqual(_feePolicy.usesQuote)
174
+ expect(policy.value).toEqual(_feePolicy.value)
175
+ }
176
+
177
+ test('check encode function', async () => {
178
+ await encode(true, 0)
179
+ await encode(true, 1)
180
+ await encode(true, Number(MAKER_DEFAULT_POLICY.rate))
181
+ await encode(true, Number(TAKER_DEFAULT_POLICY.rate))
182
+ await encode(true, 500000)
183
+ await encode(true, -500000)
184
+ await encode(false, 0)
185
+ await encode(false, 1)
186
+ await encode(false, 500000)
187
+ await encode(false, -500000)
188
+ await encode(false, Number(MAKER_DEFAULT_POLICY.rate))
189
+ await encode(false, Number(TAKER_DEFAULT_POLICY.rate))
190
+ })
191
+
192
+ test('check calculateFee function', async () => {
193
+ await checkCalculateFee(new FeePolicy(true, 0n), 1000000n, false)
194
+ await checkCalculateFee(new FeePolicy(true, 1n), 1000000n, false)
195
+ await checkCalculateFee(MAKER_DEFAULT_POLICY, 1000000n, false)
196
+ await checkCalculateFee(TAKER_DEFAULT_POLICY, 1000000n, false)
197
+ await checkCalculateFee(new FeePolicy(true, 500000n), 1000000n, false)
198
+ await checkCalculateFee(new FeePolicy(true, -500000n), 1000000n, false)
199
+ })
200
+
201
+ test('check calculateOriginalAmount function', async () => {
202
+ await checkCalculateOriginalAmount(new FeePolicy(true, 0n), 1000000n, false)
203
+ await checkCalculateOriginalAmount(new FeePolicy(true, 1n), 1000000n, false)
204
+ await checkCalculateOriginalAmount(MAKER_DEFAULT_POLICY, 1000000n, false)
205
+ await checkCalculateOriginalAmount(TAKER_DEFAULT_POLICY, 1000000n, false)
206
+ await checkCalculateOriginalAmount(
207
+ new FeePolicy(true, 500000n),
208
+ 1000000n,
209
+ false,
210
+ )
211
+ await checkCalculateOriginalAmount(
212
+ new FeePolicy(true, -500000n),
213
+ 1000000n,
214
+ false,
215
+ )
216
+ })
217
+
218
+ test('check static object', async () => {
219
+ checkFrom(new FeePolicy(true, 0n))
220
+ checkFrom(new FeePolicy(true, 1n))
221
+ checkFrom(MAKER_DEFAULT_POLICY)
222
+ checkFrom(TAKER_DEFAULT_POLICY)
223
+
224
+ checkFrom(new FeePolicy(false, 0n))
225
+ checkFrom(new FeePolicy(false, 1n))
226
+ checkFrom(MAKER_DEFAULT_POLICY)
227
+ checkFrom(TAKER_DEFAULT_POLICY)
228
+ })
@@ -0,0 +1,206 @@
1
+ import { expect, test } from 'vitest'
2
+ import { getExpectedInput } from '@clober/v2-sdk'
3
+ import { arbitrumSepolia } from 'viem/chains'
4
+ import { formatUnits, isAddressEqual, parseUnits, zeroHash } from 'viem'
5
+
6
+ import { fetchMarket } from '../src/apis/market'
7
+ import { parsePrice } from '../src/utils/prices'
8
+ import { invertPrice } from '../src/utils/tick'
9
+ import { CONTRACT_ADDRESSES } from '../src/constants/addresses'
10
+
11
+ import { publicClient } from './utils/constants'
12
+
13
+ const _ABI = [
14
+ {
15
+ inputs: [
16
+ {
17
+ components: [
18
+ {
19
+ internalType: 'BookId',
20
+ name: 'id',
21
+ type: 'uint192',
22
+ },
23
+ {
24
+ internalType: 'uint256',
25
+ name: 'limitPrice',
26
+ type: 'uint256',
27
+ },
28
+ {
29
+ internalType: 'uint256',
30
+ name: 'quoteAmount',
31
+ type: 'uint256',
32
+ },
33
+ {
34
+ internalType: 'uint256',
35
+ name: 'maxBaseAmount',
36
+ type: 'uint256',
37
+ },
38
+ {
39
+ internalType: 'bytes',
40
+ name: 'hookData',
41
+ type: 'bytes',
42
+ },
43
+ ],
44
+ internalType: 'struct IController.TakeOrderParams',
45
+ name: 'params',
46
+ type: 'tuple',
47
+ },
48
+ ],
49
+ name: 'getExpectedInput',
50
+ outputs: [
51
+ {
52
+ internalType: 'uint256',
53
+ name: 'takenQuoteAmount',
54
+ type: 'uint256',
55
+ },
56
+ {
57
+ internalType: 'uint256',
58
+ name: 'spendBaseAmount',
59
+ type: 'uint256',
60
+ },
61
+ ],
62
+ stateMutability: 'view',
63
+ type: 'function',
64
+ },
65
+ ] as const
66
+
67
+ const isTakeResultEqual = async (
68
+ inputToken: `0x${string}`,
69
+ outputToken: `0x${string}`,
70
+ amountOut: string,
71
+ limitPrice: string,
72
+ ) => {
73
+ const market = await fetchMarket(arbitrumSepolia.id, [
74
+ inputToken,
75
+ outputToken,
76
+ ])
77
+
78
+ const isBid = isAddressEqual(market.quote.address, inputToken)
79
+ const outputCurrency = isBid ? market.base : market.quote
80
+ const [takenQuoteAmount, spendBaseAmount] = await publicClient.readContract({
81
+ address: CONTRACT_ADDRESSES[arbitrumSepolia.id]!.BookViewer,
82
+ abi: _ABI,
83
+ functionName: 'getExpectedInput',
84
+ args: [
85
+ {
86
+ id: isBid
87
+ ? 2753017174304248252793812478093441832431186343406437115611n
88
+ : 2505799676027433010421416925405481572661563164234992034276n,
89
+ limitPrice: isBid
90
+ ? invertPrice(
91
+ parsePrice(
92
+ Number(limitPrice),
93
+ market.quote.decimals,
94
+ market.base.decimals,
95
+ ),
96
+ )
97
+ : parsePrice(
98
+ Number(limitPrice),
99
+ market.quote.decimals,
100
+ market.base.decimals,
101
+ ),
102
+ quoteAmount: parseUnits(amountOut, outputCurrency.decimals),
103
+ maxBaseAmount: 0n,
104
+ hookData: zeroHash,
105
+ },
106
+ ],
107
+ })
108
+
109
+ const { takenAmount, spendAmount } = await getExpectedInput(
110
+ arbitrumSepolia.id,
111
+ inputToken,
112
+ outputToken,
113
+ amountOut,
114
+ { limitPrice, rpcUrl: publicClient.transport.url! },
115
+ )
116
+
117
+ expect(takenAmount).toBe(
118
+ formatUnits(
119
+ takenQuoteAmount,
120
+ isBid ? market.base.decimals : market.quote.decimals,
121
+ ),
122
+ )
123
+ expect(spendAmount).toBe(
124
+ formatUnits(
125
+ spendBaseAmount,
126
+ isBid ? market.quote.decimals : market.base.decimals,
127
+ ),
128
+ )
129
+ return {
130
+ takenAmount,
131
+ spendAmount,
132
+ }
133
+ }
134
+
135
+ test('get expected input ask', async () => {
136
+ await isTakeResultEqual(
137
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
138
+ '0x0000000000000000000000000000000000000000',
139
+ '0.1',
140
+ '100.01',
141
+ )
142
+
143
+ await isTakeResultEqual(
144
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
145
+ '0x0000000000000000000000000000000000000000',
146
+ '0.2',
147
+ '4005.01',
148
+ )
149
+
150
+ await isTakeResultEqual(
151
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
152
+ '0x0000000000000000000000000000000000000000',
153
+ '0.23',
154
+ '10000.01',
155
+ )
156
+
157
+ await isTakeResultEqual(
158
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
159
+ '0x0000000000000000000000000000000000000000',
160
+ '10',
161
+ (Math.pow(2, 256) - 1).toFixed(0),
162
+ )
163
+ })
164
+
165
+ test('get expected input bid', async () => {
166
+ await isTakeResultEqual(
167
+ '0x0000000000000000000000000000000000000000',
168
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
169
+ '100000',
170
+ '4010.01',
171
+ )
172
+
173
+ await isTakeResultEqual(
174
+ '0x0000000000000000000000000000000000000000',
175
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
176
+ '100000',
177
+ '4005.16',
178
+ )
179
+
180
+ await isTakeResultEqual(
181
+ '0x0000000000000000000000000000000000000000',
182
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
183
+ '100000',
184
+ '200.12',
185
+ )
186
+
187
+ await isTakeResultEqual(
188
+ '0x0000000000000000000000000000000000000000',
189
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
190
+ '200000',
191
+ '0',
192
+ )
193
+ })
194
+
195
+ // @dev: this test will be fail when the market is open
196
+ test('get expected input in not open book', async () => {
197
+ const { takenAmount, spendAmount } = await getExpectedInput(
198
+ arbitrumSepolia.id,
199
+ '0xf18Be2a91cF31Fc3f8D828b6c714e1806a75e0AA',
200
+ '0x0000000000000000000000000000000000000000',
201
+ '0.1',
202
+ { rpcUrl: publicClient.transport.url! },
203
+ )
204
+ expect(takenAmount).toBe('0')
205
+ expect(spendAmount).toBe('0')
206
+ })
@@ -0,0 +1,206 @@
1
+ import { expect, test } from 'vitest'
2
+ import { getExpectedOutput } from '@clober/v2-sdk'
3
+ import { arbitrumSepolia } from 'viem/chains'
4
+ import { formatUnits, isAddressEqual, parseUnits, zeroHash } from 'viem'
5
+
6
+ import { fetchMarket } from '../src/apis/market'
7
+ import { parsePrice } from '../src/utils/prices'
8
+ import { invertPrice } from '../src/utils/tick'
9
+ import { CONTRACT_ADDRESSES } from '../src/constants/addresses'
10
+
11
+ import { publicClient } from './utils/constants'
12
+
13
+ const _ABI = [
14
+ {
15
+ inputs: [
16
+ {
17
+ components: [
18
+ {
19
+ internalType: 'BookId',
20
+ name: 'id',
21
+ type: 'uint192',
22
+ },
23
+ {
24
+ internalType: 'uint256',
25
+ name: 'limitPrice',
26
+ type: 'uint256',
27
+ },
28
+ {
29
+ internalType: 'uint256',
30
+ name: 'baseAmount',
31
+ type: 'uint256',
32
+ },
33
+ {
34
+ internalType: 'uint256',
35
+ name: 'minQuoteAmount',
36
+ type: 'uint256',
37
+ },
38
+ {
39
+ internalType: 'bytes',
40
+ name: 'hookData',
41
+ type: 'bytes',
42
+ },
43
+ ],
44
+ internalType: 'struct IController.SpendOrderParams',
45
+ name: 'params',
46
+ type: 'tuple',
47
+ },
48
+ ],
49
+ name: 'getExpectedOutput',
50
+ outputs: [
51
+ {
52
+ internalType: 'uint256',
53
+ name: 'takenQuoteAmount',
54
+ type: 'uint256',
55
+ },
56
+ {
57
+ internalType: 'uint256',
58
+ name: 'spendBaseAmount',
59
+ type: 'uint256',
60
+ },
61
+ ],
62
+ stateMutability: 'view',
63
+ type: 'function',
64
+ },
65
+ ] as const
66
+
67
+ const isSpendResultEqual = async (
68
+ inputToken: `0x${string}`,
69
+ outputToken: `0x${string}`,
70
+ amountIn: string,
71
+ limitPrice: string,
72
+ ) => {
73
+ const market = await fetchMarket(arbitrumSepolia.id, [
74
+ inputToken,
75
+ outputToken,
76
+ ])
77
+
78
+ const isBid = isAddressEqual(market.quote.address, inputToken)
79
+ const inputCurrency = isBid ? market.quote : market.base
80
+ const [takenQuoteAmount, spendBaseAmount] = await publicClient.readContract({
81
+ address: CONTRACT_ADDRESSES[arbitrumSepolia.id]!.BookViewer,
82
+ abi: _ABI,
83
+ functionName: 'getExpectedOutput',
84
+ args: [
85
+ {
86
+ id: isBid
87
+ ? 2753017174304248252793812478093441832431186343406437115611n
88
+ : 2505799676027433010421416925405481572661563164234992034276n,
89
+ limitPrice: isBid
90
+ ? invertPrice(
91
+ parsePrice(
92
+ Number(limitPrice),
93
+ market.quote.decimals,
94
+ market.base.decimals,
95
+ ),
96
+ )
97
+ : parsePrice(
98
+ Number(limitPrice),
99
+ market.quote.decimals,
100
+ market.base.decimals,
101
+ ),
102
+ baseAmount: parseUnits(amountIn, inputCurrency.decimals),
103
+ minQuoteAmount: 0n,
104
+ hookData: zeroHash,
105
+ },
106
+ ],
107
+ })
108
+
109
+ const { takenAmount, spendAmount } = await getExpectedOutput(
110
+ arbitrumSepolia.id,
111
+ inputToken,
112
+ outputToken,
113
+ amountIn,
114
+ { limitPrice, rpcUrl: publicClient.transport.url! },
115
+ )
116
+
117
+ expect(takenAmount).toBe(
118
+ formatUnits(
119
+ takenQuoteAmount,
120
+ isBid ? market.base.decimals : market.quote.decimals,
121
+ ),
122
+ )
123
+ expect(spendAmount).toBe(
124
+ formatUnits(
125
+ spendBaseAmount,
126
+ isBid ? market.quote.decimals : market.base.decimals,
127
+ ),
128
+ )
129
+ return {
130
+ takenAmount,
131
+ spendAmount,
132
+ }
133
+ }
134
+
135
+ test('get expected output ask', async () => {
136
+ await isSpendResultEqual(
137
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
138
+ '0x0000000000000000000000000000000000000000',
139
+ '1000.123',
140
+ '100.01',
141
+ )
142
+
143
+ await isSpendResultEqual(
144
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
145
+ '0x0000000000000000000000000000000000000000',
146
+ '1000000',
147
+ '4005.01',
148
+ )
149
+
150
+ await isSpendResultEqual(
151
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
152
+ '0x0000000000000000000000000000000000000000',
153
+ '1000.123',
154
+ '10000.01',
155
+ )
156
+
157
+ await isSpendResultEqual(
158
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
159
+ '0x0000000000000000000000000000000000000000',
160
+ '1000000',
161
+ (Math.pow(2, 256) - 1).toFixed(0),
162
+ )
163
+ })
164
+
165
+ test('get expected output bid', async () => {
166
+ await isSpendResultEqual(
167
+ '0x0000000000000000000000000000000000000000',
168
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
169
+ '0.01',
170
+ '4010.01',
171
+ )
172
+
173
+ await isSpendResultEqual(
174
+ '0x0000000000000000000000000000000000000000',
175
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
176
+ '0.1',
177
+ '4005.01',
178
+ )
179
+
180
+ await isSpendResultEqual(
181
+ '0x0000000000000000000000000000000000000000',
182
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
183
+ '1.1234',
184
+ '200.01',
185
+ )
186
+
187
+ await isSpendResultEqual(
188
+ '0x0000000000000000000000000000000000000000',
189
+ '0x00bfd44e79fb7f6dd5887a9426c8ef85a0cd23e0',
190
+ '3.14',
191
+ '0',
192
+ )
193
+ })
194
+
195
+ // @dev: this test will be fail when the market is open
196
+ test('get expected output in not open book', async () => {
197
+ const { takenAmount, spendAmount } = await getExpectedOutput(
198
+ arbitrumSepolia.id,
199
+ '0xf18Be2a91cF31Fc3f8D828b6c714e1806a75e0AA',
200
+ '0x0000000000000000000000000000000000000000',
201
+ '10000',
202
+ { rpcUrl: publicClient.transport.url! },
203
+ )
204
+ expect(takenAmount).toBe('0')
205
+ expect(spendAmount).toBe('0')
206
+ })