@d8x/perpetuals-sdk 1.3.7 → 2.0.1-alpha

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 (286) hide show
  1. package/dist/cjs/accountTrade.d.ts +9 -9
  2. package/dist/cjs/accountTrade.js +19 -17
  3. package/dist/cjs/accountTrade.js.map +1 -1
  4. package/dist/cjs/brokerTool.d.ts +11 -12
  5. package/dist/cjs/brokerTool.js +7 -8
  6. package/dist/cjs/brokerTool.js.map +1 -1
  7. package/dist/cjs/config/priceFeedConfig.json +16 -2
  8. package/dist/cjs/config/symbolList.json +2 -1
  9. package/dist/cjs/constants.d.ts +12 -12
  10. package/dist/cjs/constants.js +14 -14
  11. package/dist/cjs/constants.js.map +1 -1
  12. package/dist/cjs/contracts/ERC20.d.ts +146 -171
  13. package/dist/cjs/contracts/IPerpetualManager.d.ts +2534 -2225
  14. package/dist/cjs/contracts/IPyth.d.ts +181 -184
  15. package/dist/cjs/contracts/LimitOrderBook.d.ts +373 -401
  16. package/dist/cjs/contracts/LimitOrderBookBeacon.d.ts +53 -104
  17. package/dist/cjs/contracts/LimitOrderBookFactory.d.ts +129 -185
  18. package/dist/cjs/contracts/MockTokenSwap.d.ts +109 -169
  19. package/dist/cjs/contracts/Multicall3.d.ts +147 -211
  20. package/dist/cjs/contracts/OnDemandOracleUpgradeable.d.ts +342 -399
  21. package/dist/cjs/contracts/OracleFactory.d.ts +258 -238
  22. package/dist/cjs/contracts/PerpetualManagerProxy.d.ts +1099 -891
  23. package/dist/cjs/contracts/RedStoneAbi.d.ts +369 -488
  24. package/dist/cjs/contracts/ShareToken.d.ts +232 -285
  25. package/dist/cjs/contracts/common.d.ts +40 -11
  26. package/dist/cjs/contracts/factories/ERC20__factory.d.ts +2 -3
  27. package/dist/cjs/contracts/factories/ERC20__factory.js +3 -3
  28. package/dist/cjs/contracts/factories/ERC20__factory.js.map +1 -1
  29. package/dist/cjs/contracts/factories/IPerpetualManager__factory.d.ts +2 -3
  30. package/dist/cjs/contracts/factories/IPerpetualManager__factory.js +3 -3
  31. package/dist/cjs/contracts/factories/IPerpetualManager__factory.js.map +1 -1
  32. package/dist/cjs/contracts/factories/IPyth__factory.d.ts +2 -3
  33. package/dist/cjs/contracts/factories/IPyth__factory.js +3 -3
  34. package/dist/cjs/contracts/factories/IPyth__factory.js.map +1 -1
  35. package/dist/cjs/contracts/factories/LimitOrderBookBeacon__factory.d.ts +2 -3
  36. package/dist/cjs/contracts/factories/LimitOrderBookBeacon__factory.js +3 -3
  37. package/dist/cjs/contracts/factories/LimitOrderBookBeacon__factory.js.map +1 -1
  38. package/dist/cjs/contracts/factories/LimitOrderBookFactory__factory.d.ts +2 -3
  39. package/dist/cjs/contracts/factories/LimitOrderBookFactory__factory.js +3 -3
  40. package/dist/cjs/contracts/factories/LimitOrderBookFactory__factory.js.map +1 -1
  41. package/dist/cjs/contracts/factories/LimitOrderBook__factory.d.ts +2 -3
  42. package/dist/cjs/contracts/factories/LimitOrderBook__factory.js +3 -3
  43. package/dist/cjs/contracts/factories/LimitOrderBook__factory.js.map +1 -1
  44. package/dist/cjs/contracts/factories/MockTokenSwap__factory.d.ts +2 -3
  45. package/dist/cjs/contracts/factories/MockTokenSwap__factory.js +3 -3
  46. package/dist/cjs/contracts/factories/MockTokenSwap__factory.js.map +1 -1
  47. package/dist/cjs/contracts/factories/Multicall3__factory.d.ts +11 -9
  48. package/dist/cjs/contracts/factories/Multicall3__factory.js +7 -10
  49. package/dist/cjs/contracts/factories/Multicall3__factory.js.map +1 -1
  50. package/dist/cjs/contracts/factories/OnDemandOracleUpgradeable__factory.d.ts +2 -3
  51. package/dist/cjs/contracts/factories/OnDemandOracleUpgradeable__factory.js +3 -3
  52. package/dist/cjs/contracts/factories/OnDemandOracleUpgradeable__factory.js.map +1 -1
  53. package/dist/cjs/contracts/factories/OracleFactory__factory.d.ts +2 -3
  54. package/dist/cjs/contracts/factories/OracleFactory__factory.js +3 -3
  55. package/dist/cjs/contracts/factories/OracleFactory__factory.js.map +1 -1
  56. package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.d.ts +2 -3
  57. package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js +3 -3
  58. package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
  59. package/dist/cjs/contracts/factories/RedStoneAbi__factory.d.ts +2 -3
  60. package/dist/cjs/contracts/factories/RedStoneAbi__factory.js +3 -3
  61. package/dist/cjs/contracts/factories/RedStoneAbi__factory.js.map +1 -1
  62. package/dist/cjs/contracts/factories/ShareToken__factory.d.ts +2 -3
  63. package/dist/cjs/contracts/factories/ShareToken__factory.js +3 -3
  64. package/dist/cjs/contracts/factories/ShareToken__factory.js.map +1 -1
  65. package/dist/cjs/d8XMath.d.ts +28 -16
  66. package/dist/cjs/d8XMath.js +70 -50
  67. package/dist/cjs/d8XMath.js.map +1 -1
  68. package/dist/cjs/liquidatorTool.d.ts +8 -8
  69. package/dist/cjs/liquidatorTool.js +5 -7
  70. package/dist/cjs/liquidatorTool.js.map +1 -1
  71. package/dist/cjs/liquidityProviderTool.d.ts +4 -5
  72. package/dist/cjs/liquidityProviderTool.js.map +1 -1
  73. package/dist/cjs/marketData.d.ts +27 -28
  74. package/dist/cjs/marketData.js +65 -69
  75. package/dist/cjs/marketData.js.map +1 -1
  76. package/dist/cjs/nodeSDKTypes.d.ts +35 -37
  77. package/dist/cjs/onChainPxFeed.d.ts +2 -2
  78. package/dist/cjs/onChainPxFeed.js +3 -3
  79. package/dist/cjs/onChainPxFeed.js.map +1 -1
  80. package/dist/cjs/onChainPxFeedAngle.d.ts +2 -2
  81. package/dist/cjs/onChainPxFeedAngle.js +4 -5
  82. package/dist/cjs/onChainPxFeedAngle.js.map +1 -1
  83. package/dist/cjs/onChainPxFeedRedStone.js +2 -2
  84. package/dist/cjs/onChainPxFeedRedStone.js.map +1 -1
  85. package/dist/cjs/orderExecutorTool.d.ts +7 -9
  86. package/dist/cjs/orderExecutorTool.js +52 -62
  87. package/dist/cjs/orderExecutorTool.js.map +1 -1
  88. package/dist/cjs/perpetualDataHandler.d.ts +44 -35
  89. package/dist/cjs/perpetualDataHandler.js +194 -170
  90. package/dist/cjs/perpetualDataHandler.js.map +1 -1
  91. package/dist/cjs/perpetualEventHandler.d.ts +4 -5
  92. package/dist/cjs/perpetualEventHandler.js +2 -2
  93. package/dist/cjs/perpetualEventHandler.js.map +1 -1
  94. package/dist/cjs/polyMktsPxFeed.d.ts +14 -0
  95. package/dist/cjs/polyMktsPxFeed.js +59 -0
  96. package/dist/cjs/polyMktsPxFeed.js.map +1 -0
  97. package/dist/cjs/priceFeeds.d.ts +2 -0
  98. package/dist/cjs/priceFeeds.js +44 -9
  99. package/dist/cjs/priceFeeds.js.map +1 -1
  100. package/dist/cjs/referralCodeSigner.d.ts +1 -1
  101. package/dist/cjs/referralCodeSigner.js +12 -16
  102. package/dist/cjs/referralCodeSigner.js.map +1 -1
  103. package/dist/cjs/traderDigests.d.ts +2 -1
  104. package/dist/cjs/traderDigests.js +9 -11
  105. package/dist/cjs/traderDigests.js.map +1 -1
  106. package/dist/cjs/traderInterface.d.ts +8 -9
  107. package/dist/cjs/traderInterface.js +40 -23
  108. package/dist/cjs/traderInterface.js.map +1 -1
  109. package/dist/cjs/utils.d.ts +2 -3
  110. package/dist/cjs/utils.js +1 -2
  111. package/dist/cjs/utils.js.map +1 -1
  112. package/dist/cjs/version.d.ts +1 -1
  113. package/dist/cjs/version.js +1 -1
  114. package/dist/cjs/version.js.map +1 -1
  115. package/dist/cjs/writeAccessHandler.d.ts +7 -9
  116. package/dist/cjs/writeAccessHandler.js +13 -16
  117. package/dist/cjs/writeAccessHandler.js.map +1 -1
  118. package/dist/esm/accountTrade.d.ts +9 -9
  119. package/dist/esm/accountTrade.js +19 -17
  120. package/dist/esm/accountTrade.js.map +1 -1
  121. package/dist/esm/brokerTool.d.ts +11 -12
  122. package/dist/esm/brokerTool.js +2 -3
  123. package/dist/esm/brokerTool.js.map +1 -1
  124. package/dist/esm/config/priceFeedConfig.json +16 -2
  125. package/dist/esm/config/symbolList.json +2 -1
  126. package/dist/esm/constants.d.ts +12 -12
  127. package/dist/esm/constants.js +13 -13
  128. package/dist/esm/constants.js.map +1 -1
  129. package/dist/esm/contracts/ERC20.d.ts +146 -171
  130. package/dist/esm/contracts/IPerpetualManager.d.ts +2534 -2225
  131. package/dist/esm/contracts/IPyth.d.ts +181 -184
  132. package/dist/esm/contracts/LimitOrderBook.d.ts +373 -401
  133. package/dist/esm/contracts/LimitOrderBookBeacon.d.ts +53 -104
  134. package/dist/esm/contracts/LimitOrderBookFactory.d.ts +129 -185
  135. package/dist/esm/contracts/MockTokenSwap.d.ts +109 -169
  136. package/dist/esm/contracts/Multicall3.d.ts +147 -211
  137. package/dist/esm/contracts/OnDemandOracleUpgradeable.d.ts +342 -399
  138. package/dist/esm/contracts/OracleFactory.d.ts +258 -238
  139. package/dist/esm/contracts/PerpetualManagerProxy.d.ts +1099 -891
  140. package/dist/esm/contracts/RedStoneAbi.d.ts +369 -488
  141. package/dist/esm/contracts/ShareToken.d.ts +232 -285
  142. package/dist/esm/contracts/common.d.ts +40 -11
  143. package/dist/esm/contracts/factories/ERC20__factory.d.ts +2 -3
  144. package/dist/esm/contracts/factories/ERC20__factory.js +4 -4
  145. package/dist/esm/contracts/factories/ERC20__factory.js.map +1 -1
  146. package/dist/esm/contracts/factories/IPerpetualManager__factory.d.ts +2 -3
  147. package/dist/esm/contracts/factories/IPerpetualManager__factory.js +4 -4
  148. package/dist/esm/contracts/factories/IPerpetualManager__factory.js.map +1 -1
  149. package/dist/esm/contracts/factories/IPyth__factory.d.ts +2 -3
  150. package/dist/esm/contracts/factories/IPyth__factory.js +4 -4
  151. package/dist/esm/contracts/factories/IPyth__factory.js.map +1 -1
  152. package/dist/esm/contracts/factories/LimitOrderBookBeacon__factory.d.ts +2 -3
  153. package/dist/esm/contracts/factories/LimitOrderBookBeacon__factory.js +4 -4
  154. package/dist/esm/contracts/factories/LimitOrderBookBeacon__factory.js.map +1 -1
  155. package/dist/esm/contracts/factories/LimitOrderBookFactory__factory.d.ts +2 -3
  156. package/dist/esm/contracts/factories/LimitOrderBookFactory__factory.js +4 -4
  157. package/dist/esm/contracts/factories/LimitOrderBookFactory__factory.js.map +1 -1
  158. package/dist/esm/contracts/factories/LimitOrderBook__factory.d.ts +2 -3
  159. package/dist/esm/contracts/factories/LimitOrderBook__factory.js +4 -4
  160. package/dist/esm/contracts/factories/LimitOrderBook__factory.js.map +1 -1
  161. package/dist/esm/contracts/factories/MockTokenSwap__factory.d.ts +2 -3
  162. package/dist/esm/contracts/factories/MockTokenSwap__factory.js +4 -4
  163. package/dist/esm/contracts/factories/MockTokenSwap__factory.js.map +1 -1
  164. package/dist/esm/contracts/factories/Multicall3__factory.d.ts +11 -9
  165. package/dist/esm/contracts/factories/Multicall3__factory.js +8 -11
  166. package/dist/esm/contracts/factories/Multicall3__factory.js.map +1 -1
  167. package/dist/esm/contracts/factories/OnDemandOracleUpgradeable__factory.d.ts +2 -3
  168. package/dist/esm/contracts/factories/OnDemandOracleUpgradeable__factory.js +4 -4
  169. package/dist/esm/contracts/factories/OnDemandOracleUpgradeable__factory.js.map +1 -1
  170. package/dist/esm/contracts/factories/OracleFactory__factory.d.ts +2 -3
  171. package/dist/esm/contracts/factories/OracleFactory__factory.js +4 -4
  172. package/dist/esm/contracts/factories/OracleFactory__factory.js.map +1 -1
  173. package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.d.ts +2 -3
  174. package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js +4 -4
  175. package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
  176. package/dist/esm/contracts/factories/RedStoneAbi__factory.d.ts +2 -3
  177. package/dist/esm/contracts/factories/RedStoneAbi__factory.js +4 -4
  178. package/dist/esm/contracts/factories/RedStoneAbi__factory.js.map +1 -1
  179. package/dist/esm/contracts/factories/ShareToken__factory.d.ts +2 -3
  180. package/dist/esm/contracts/factories/ShareToken__factory.js +4 -4
  181. package/dist/esm/contracts/factories/ShareToken__factory.js.map +1 -1
  182. package/dist/esm/d8XMath.d.ts +28 -16
  183. package/dist/esm/d8XMath.js +67 -49
  184. package/dist/esm/d8XMath.js.map +1 -1
  185. package/dist/esm/liquidatorTool.d.ts +8 -8
  186. package/dist/esm/liquidatorTool.js +5 -7
  187. package/dist/esm/liquidatorTool.js.map +1 -1
  188. package/dist/esm/liquidityProviderTool.d.ts +4 -5
  189. package/dist/esm/liquidityProviderTool.js.map +1 -1
  190. package/dist/esm/marketData.d.ts +27 -28
  191. package/dist/esm/marketData.js +55 -59
  192. package/dist/esm/marketData.js.map +1 -1
  193. package/dist/esm/nodeSDKTypes.d.ts +35 -37
  194. package/dist/esm/onChainPxFeed.d.ts +2 -2
  195. package/dist/esm/onChainPxFeed.js +3 -3
  196. package/dist/esm/onChainPxFeed.js.map +1 -1
  197. package/dist/esm/onChainPxFeedAngle.d.ts +2 -2
  198. package/dist/esm/onChainPxFeedAngle.js +2 -3
  199. package/dist/esm/onChainPxFeedAngle.js.map +1 -1
  200. package/dist/esm/onChainPxFeedRedStone.js +1 -1
  201. package/dist/esm/onChainPxFeedRedStone.js.map +1 -1
  202. package/dist/esm/orderExecutorTool.d.ts +7 -9
  203. package/dist/esm/orderExecutorTool.js +38 -48
  204. package/dist/esm/orderExecutorTool.js.map +1 -1
  205. package/dist/esm/perpetualDataHandler.d.ts +44 -35
  206. package/dist/esm/perpetualDataHandler.js +137 -113
  207. package/dist/esm/perpetualDataHandler.js.map +1 -1
  208. package/dist/esm/perpetualEventHandler.d.ts +4 -5
  209. package/dist/esm/perpetualEventHandler.js +2 -2
  210. package/dist/esm/perpetualEventHandler.js.map +1 -1
  211. package/dist/esm/polyMktsPxFeed.d.ts +14 -0
  212. package/dist/esm/polyMktsPxFeed.js +56 -0
  213. package/dist/esm/polyMktsPxFeed.js.map +1 -0
  214. package/dist/esm/priceFeeds.d.ts +2 -0
  215. package/dist/esm/priceFeeds.js +44 -9
  216. package/dist/esm/priceFeeds.js.map +1 -1
  217. package/dist/esm/referralCodeSigner.d.ts +1 -1
  218. package/dist/esm/referralCodeSigner.js +6 -10
  219. package/dist/esm/referralCodeSigner.js.map +1 -1
  220. package/dist/esm/traderDigests.d.ts +2 -1
  221. package/dist/esm/traderDigests.js +2 -4
  222. package/dist/esm/traderDigests.js.map +1 -1
  223. package/dist/esm/traderInterface.d.ts +8 -9
  224. package/dist/esm/traderInterface.js +42 -25
  225. package/dist/esm/traderInterface.js.map +1 -1
  226. package/dist/esm/utils.d.ts +2 -3
  227. package/dist/esm/utils.js +1 -2
  228. package/dist/esm/utils.js.map +1 -1
  229. package/dist/esm/version.d.ts +1 -1
  230. package/dist/esm/version.js +1 -1
  231. package/dist/esm/version.js.map +1 -1
  232. package/dist/esm/writeAccessHandler.d.ts +7 -9
  233. package/dist/esm/writeAccessHandler.js +5 -8
  234. package/dist/esm/writeAccessHandler.js.map +1 -1
  235. package/package.json +7 -17
  236. package/src/accountTrade.ts +32 -34
  237. package/src/brokerTool.ts +17 -20
  238. package/src/config/priceFeedConfig.json +16 -2
  239. package/src/config/symbolList.json +2 -1
  240. package/src/constants.ts +13 -13
  241. package/src/contracts/ERC20.ts +236 -350
  242. package/src/contracts/IPerpetualManager.ts +3359 -5050
  243. package/src/contracts/IPyth.ts +272 -409
  244. package/src/contracts/LimitOrderBook.ts +503 -779
  245. package/src/contracts/LimitOrderBookBeacon.ts +123 -171
  246. package/src/contracts/LimitOrderBookFactory.ts +263 -332
  247. package/src/contracts/MockTokenSwap.ts +237 -275
  248. package/src/contracts/Multicall3.ts +208 -374
  249. package/src/contracts/OnDemandOracleUpgradeable.ts +569 -782
  250. package/src/contracts/OracleFactory.ts +410 -538
  251. package/src/contracts/PerpetualManagerProxy.ts +1898 -1426
  252. package/src/contracts/RedStoneAbi.ts +486 -986
  253. package/src/contracts/ShareToken.ts +376 -557
  254. package/src/contracts/common.ts +108 -21
  255. package/src/contracts/factories/ERC20__factory.ts +4 -5
  256. package/src/contracts/factories/IPerpetualManager__factory.ts +4 -5
  257. package/src/contracts/factories/IPyth__factory.ts +4 -5
  258. package/src/contracts/factories/LimitOrderBookBeacon__factory.ts +5 -6
  259. package/src/contracts/factories/LimitOrderBookFactory__factory.ts +5 -6
  260. package/src/contracts/factories/LimitOrderBook__factory.ts +4 -5
  261. package/src/contracts/factories/MockTokenSwap__factory.ts +4 -5
  262. package/src/contracts/factories/Multicall3__factory.ts +21 -19
  263. package/src/contracts/factories/OnDemandOracleUpgradeable__factory.ts +5 -6
  264. package/src/contracts/factories/OracleFactory__factory.ts +4 -5
  265. package/src/contracts/factories/PerpetualManagerProxy__factory.ts +5 -6
  266. package/src/contracts/factories/RedStoneAbi__factory.ts +4 -8
  267. package/src/contracts/factories/ShareToken__factory.ts +4 -8
  268. package/src/d8XMath.ts +78 -57
  269. package/src/liquidatorTool.ts +12 -15
  270. package/src/liquidityProviderTool.ts +7 -5
  271. package/src/marketData.ts +110 -121
  272. package/src/nodeSDKTypes.ts +51 -38
  273. package/src/onChainPxFeed.ts +4 -4
  274. package/src/onChainPxFeedAngle.ts +5 -7
  275. package/src/onChainPxFeedRedStone.ts +1 -3
  276. package/src/orderExecutorTool.ts +100 -108
  277. package/src/perpetualDataHandler.ts +209 -172
  278. package/src/perpetualEventHandler.ts +16 -17
  279. package/src/polyMktsPxFeed.ts +71 -0
  280. package/src/priceFeeds.ts +46 -10
  281. package/src/referralCodeSigner.ts +6 -10
  282. package/src/traderDigests.ts +8 -5
  283. package/src/traderInterface.ts +61 -33
  284. package/src/utils.ts +3 -4
  285. package/src/version.ts +1 -1
  286. package/src/writeAccessHandler.ts +26 -17
@@ -1,10 +1,14 @@
1
- import { FormatTypes, Interface } from "@ethersproject/abi";
2
- import { Signer } from "@ethersproject/abstract-signer";
3
- import { BigNumber } from "@ethersproject/bignumber";
4
- import { AddressZero } from "@ethersproject/constants";
5
- import { CallOverrides, Contract, ContractInterface } from "@ethersproject/contracts";
6
- import { Provider, StaticJsonRpcProvider, type Network } from "@ethersproject/providers";
7
- import { parseBytes32String } from "@ethersproject/strings";
1
+ import {
2
+ BaseContract,
3
+ Contract,
4
+ Interface,
5
+ JsonRpcProvider,
6
+ Network,
7
+ Overrides,
8
+ Provider,
9
+ Signer,
10
+ ZeroAddress,
11
+ } from "ethers";
8
12
  import {
9
13
  BUY_SIDE,
10
14
  CLOSED_SIDE,
@@ -12,11 +16,11 @@ import {
12
16
  COLLATERAL_CURRENCY_QUOTE,
13
17
  CollaterlCCY,
14
18
  DEFAULT_CONFIG,
15
- ERC20_ABI,
16
19
  MASK_CLOSE_ONLY,
17
20
  MASK_KEEP_POS_LEVERAGE,
18
21
  MASK_LIMIT_ORDER,
19
22
  MASK_MARKET_ORDER,
23
+ MASK_PREDICTIVE_MARKET,
20
24
  MASK_STOP_ORDER,
21
25
  MAX_64x64,
22
26
  MULTICALL_ADDRESS,
@@ -32,17 +36,18 @@ import {
32
36
  ZERO_ORDER_ID,
33
37
  } from "./constants";
34
38
  import {
39
+ ERC20__factory,
40
+ LimitOrderBook,
41
+ LimitOrderBookFactory,
35
42
  LimitOrderBookFactory__factory,
36
43
  LimitOrderBook__factory,
44
+ Multicall3,
37
45
  Multicall3__factory,
38
46
  OracleFactory__factory,
39
- type LimitOrderBook,
40
- type LimitOrderBookFactory,
41
- type Multicall3,
42
47
  } from "./contracts";
43
- import { type ERC20Interface } from "./contracts/ERC20";
44
- import { type IPerpetualOrder, type PerpStorage } from "./contracts/IPerpetualManager";
45
- import { type IClientOrder } from "./contracts/LimitOrderBook";
48
+ import { IPerpetualInfo } from "./contracts/IPerpetualManager";
49
+ import { IClientOrder, IPerpetualOrder } from "./contracts/LimitOrderBook";
50
+
46
51
  import {
47
52
  ABDK29ToFloat,
48
53
  ABK64x64ToFloat,
@@ -52,6 +57,8 @@ import {
52
57
  div64x64,
53
58
  floatToABK64x64,
54
59
  dec18ToFloat,
60
+ priceToProb,
61
+ probToPrice,
55
62
  } from "./d8XMath";
56
63
  import {
57
64
  TokenOverride,
@@ -99,19 +106,20 @@ export default class PerpetualDataHandler {
99
106
  //map margin token of the form MATIC or ETH or USDC into
100
107
  //the address of the margin token
101
108
  protected symbolToTokenAddrMap: Map<string, string>;
102
- public chainId: number;
109
+ public chainId: bigint;
110
+ public network: Network;
103
111
  protected proxyContract: Contract | null = null;
104
- protected proxyABI: ContractInterface;
112
+ protected proxyABI: Interface;
105
113
  protected proxyAddr: string;
106
114
  // oracle
107
115
  protected oraclefactoryAddr: string | undefined;
108
116
  // limit order book
109
117
  protected lobFactoryContract: LimitOrderBookFactory | null = null;
110
- protected lobFactoryABI: ContractInterface;
118
+ protected lobFactoryABI: Interface;
111
119
  protected lobFactoryAddr: string | undefined;
112
- protected lobABI: ContractInterface;
120
+ protected lobABI: Interface;
113
121
  // share token
114
- protected shareTokenABI: ContractInterface;
122
+ protected shareTokenABI: Interface;
115
123
  // multicall
116
124
  protected multicall: Multicall3 | null = null;
117
125
  // provider
@@ -141,7 +149,8 @@ export default class PerpetualDataHandler {
141
149
  this.symbolToTokenAddrMap = new Map<string, string>();
142
150
  this.perpetualIdToSymbol = new Map<number, string>();
143
151
  this.nestedPerpetualIDs = new Array<Array<number>>();
144
- this.chainId = config.chainId;
152
+ this.chainId = BigInt(config.chainId);
153
+ this.network = new Network(config.name || "", this.chainId);
145
154
  this.proxyAddr = config.proxyAddr;
146
155
  this.nodeURL = config.nodeURL;
147
156
  this.proxyABI = config.proxyABI!;
@@ -152,15 +161,15 @@ export default class PerpetualDataHandler {
152
161
  this.priceFeedGetter = new PriceFeeds(this, config.priceFeedConfigNetwork);
153
162
  }
154
163
 
155
- protected async initContractsAndData(signerOrProvider: Signer | Provider, overrides?: CallOverrides) {
164
+ protected async initContractsAndData(signerOrProvider: Signer | Provider, overrides?: Overrides) {
156
165
  this.signerOrProvider = signerOrProvider;
157
166
  // check network
158
167
  let network: Network;
159
168
  try {
160
- if (signerOrProvider instanceof Signer) {
161
- network = await signerOrProvider.provider!.getNetwork();
169
+ if (signerOrProvider.provider) {
170
+ network = await signerOrProvider.provider.getNetwork();
162
171
  } else {
163
- network = await signerOrProvider.getNetwork();
172
+ throw new Error("Signer has no provider"); // TODO: check
164
173
  }
165
174
  } catch (error: any) {
166
175
  console.error(error);
@@ -179,22 +188,31 @@ export default class PerpetualDataHandler {
179
188
  * @param symbol symbol of the form ETH-USD-MATIC
180
189
  * @returns order book contract for the perpetual
181
190
  */
182
- public getOrderBookContract(symbol: string, provider?: Provider): Contract & LimitOrderBook {
191
+ public getOrderBookContract(symbol: string, signerOrProvider?: Signer | Provider): LimitOrderBook {
183
192
  let orderBookAddr = this.symbolToPerpStaticInfo.get(symbol)?.limitOrderBookAddr;
184
- if (orderBookAddr == "" || orderBookAddr == undefined || this.signerOrProvider == null) {
193
+ if (orderBookAddr == "" || orderBookAddr == undefined) {
185
194
  throw Error(`no limit order book found for ${symbol} or no signer`);
186
195
  }
187
- let lobContract = LimitOrderBook__factory.connect(orderBookAddr, provider ?? this.signerOrProvider);
196
+ let lobContract = LimitOrderBook__factory.connect(orderBookAddr, signerOrProvider ?? this.signerOrProvider);
188
197
  return lobContract;
189
198
  }
190
199
 
200
+ /**
201
+ * Returns the order-book contract for the symbol if found or fails
202
+ * @param symbol symbol of the form ETH-USD-MATIC
203
+ * @returns order book contract for the perpetual
204
+ */
205
+ public getOrderBookAddress(symbol: string): string | undefined {
206
+ return this.symbolToPerpStaticInfo.get(symbol)?.limitOrderBookAddr;
207
+ }
208
+
191
209
  /**
192
210
  * Get perpetuals for the given ids from onchain
193
211
  * @param ids perpetual ids
194
212
  * @param overrides optional
195
213
  * @returns array of PerpetualData converted into decimals
196
214
  */
197
- public async getPerpetuals(ids: number[], overrides?: CallOverrides): Promise<PerpetualData[]> {
215
+ public async getPerpetuals(ids: number[], overrides?: Overrides): Promise<PerpetualData[]> {
198
216
  if (this.proxyContract == null) {
199
217
  throw new Error("proxy not defined");
200
218
  }
@@ -208,11 +226,7 @@ export default class PerpetualDataHandler {
208
226
  * @param overrides optional
209
227
  * @returns array of LiquidityPoolData converted into decimals
210
228
  */
211
- public async getLiquidityPools(
212
- fromIdx: number,
213
- toIdx: number,
214
- overrides?: CallOverrides
215
- ): Promise<LiquidityPoolData[]> {
229
+ public async getLiquidityPools(fromIdx: number, toIdx: number, overrides?: Overrides): Promise<LiquidityPoolData[]> {
216
230
  if (this.proxyContract == null) {
217
231
  throw new Error("proxy not defined");
218
232
  }
@@ -230,16 +244,15 @@ export default class PerpetualDataHandler {
230
244
  * and this.nestedPerpetualIDs and this.symbolToPerpStaticInfo
231
245
  *
232
246
  */
233
- protected async _fillSymbolMaps(overrides?: CallOverrides) {
247
+ protected async _fillSymbolMaps(overrides?: Overrides) {
234
248
  if (this.proxyContract == null || this.multicall == null || this.signerOrProvider == null) {
235
249
  throw new Error("proxy or multicall not defined");
236
250
  }
237
251
  const tokenOverrides = require("./config/tokenOverrides.json") as TokenOverride[];
238
252
  let poolInfo = await PerpetualDataHandler.getPoolStaticInfo(this.proxyContract, overrides);
239
-
240
253
  this.nestedPerpetualIDs = poolInfo.nestedPerpetualIDs;
241
254
 
242
- const IERC20 = new Interface(ERC20_ABI) as ERC20Interface;
255
+ const IERC20 = ERC20__factory.createInterface();
243
256
 
244
257
  const proxyCalls: Multicall3.Call3Struct[] = poolInfo.poolMarginTokenAddr.map((tokenAddr) => ({
245
258
  target: tokenAddr,
@@ -258,22 +271,22 @@ export default class PerpetualDataHandler {
258
271
  });
259
272
 
260
273
  // multicall
261
- const encodedResults = await this.multicall.callStatic.aggregate3(proxyCalls, overrides || {});
274
+ const encodedResults = await this.multicall.aggregate3.staticCall(proxyCalls, overrides || {});
262
275
 
263
276
  // decimals
264
277
  for (let j = 0; j < poolInfo.nestedPerpetualIDs.length; j++) {
265
- const decimals = IERC20.decodeFunctionResult("decimals", encodedResults[j].returnData)[0] as number;
278
+ const decimals = IERC20.decodeFunctionResult("decimals", encodedResults[j].returnData)[0] as bigint;
266
279
  let info: PoolStaticInfo = {
267
280
  poolId: j + 1,
268
281
  poolMarginSymbol: "", //fill later
269
282
  poolMarginTokenAddr: poolInfo.poolMarginTokenAddr[j],
270
- poolMarginTokenDecimals: decimals,
283
+ poolMarginTokenDecimals: Number(decimals),
271
284
  poolSettleSymbol: "", //fill later
272
285
  poolSettleTokenAddr: poolInfo.poolMarginTokenAddr[j], //correct later
273
- poolSettleTokenDecimals: decimals, //correct later
286
+ poolSettleTokenDecimals: Number(decimals), //correct later
274
287
  shareTokenAddr: poolInfo.poolShareTokenAddr[j],
275
288
  oracleFactoryAddr: poolInfo.oracleFactory,
276
- isRunning: poolInfo.poolShareTokenAddr[j] != AddressZero,
289
+ isRunning: poolInfo.poolShareTokenAddr[j] != ZeroAddress,
277
290
  MgnToSettleTriangulation: ["*", "1"], // correct later
278
291
  };
279
292
  this.poolStaticInfos.push(info);
@@ -385,15 +398,12 @@ export default class PerpetualDataHandler {
385
398
  currPoolId = poolId;
386
399
  // We only assume the flag to be correct
387
400
  // in the first perpetual of the pool
388
- const flag =
389
- perpStaticInfos[j].perpFlags == undefined
390
- ? BigNumber.from(0)
391
- : BigNumber.from(perpStaticInfos[j].perpFlags.toString());
401
+ const flag = perpStaticInfos[j].perpFlags == undefined ? 0n : BigInt(perpStaticInfos[j].perpFlags.toString());
392
402
  // find settlement setting for this flag
393
403
  let s: SettlementCcyItem | undefined = undefined;
394
404
  for (let j = 0; j < this.settlementConfig.length; j++) {
395
- const masked = flag.and(BigNumber.from(this.settlementConfig[j].perpFlags.toString()));
396
- if (!masked.isZero()) {
405
+ const masked = flag & BigInt(this.settlementConfig[j].perpFlags.toString());
406
+ if (masked != 0n) {
397
407
  s = this.settlementConfig[j];
398
408
  break;
399
409
  }
@@ -606,7 +616,7 @@ export default class PerpetualDataHandler {
606
616
  _proxyContract: Contract,
607
617
  nestedPerpetualIDs: Array<Array<number>>,
608
618
  symbolList: Map<string, string>,
609
- overrides?: CallOverrides
619
+ overrides?: Overrides
610
620
  ): Promise<Array<PerpetualStaticInfo>> {
611
621
  // flatten perpetual ids into chunks
612
622
  const chunkSize = 10;
@@ -614,7 +624,10 @@ export default class PerpetualDataHandler {
614
624
  // query blockchain in chunks
615
625
  const infoArr = new Array<PerpetualStaticInfo>();
616
626
  for (let k = 0; k < ids.length; k++) {
617
- let perpInfos = await _proxyContract.getPerpetualStaticInfo(ids[k], overrides || {});
627
+ let perpInfos = (await _proxyContract.getPerpetualStaticInfo(
628
+ ids[k],
629
+ overrides || {}
630
+ )) as IPerpetualInfo.PerpetualStaticInfoStructOutput[];
618
631
  for (let j = 0; j < perpInfos.length; j++) {
619
632
  let base = contractSymbolToSymbol(perpInfos[j].S2BaseCCY, symbolList);
620
633
  let quote = contractSymbolToSymbol(perpInfos[j].S2QuoteCCY, symbolList);
@@ -623,19 +636,19 @@ export default class PerpetualDataHandler {
623
636
  let sym2 = base + "-" + quote;
624
637
  let sym3 = base3 == "" ? "" : base3 + "-" + quote3;
625
638
  let info: PerpetualStaticInfo = {
626
- id: perpInfos[j].id,
627
- poolId: Math.floor(perpInfos[j].id / 100_000), //uint24(_iPoolId) * 100_000 + iPerpetualIndex;
639
+ id: Number(perpInfos[j].id),
640
+ poolId: Math.floor(Number(perpInfos[j].id) / 100_000), //uint24(_iPoolId) * 100_000 + iPerpetualIndex;
628
641
  limitOrderBookAddr: perpInfos[j].limitOrderBookAddr,
629
642
  initialMarginRate: ABDK29ToFloat(perpInfos[j].fInitialMarginRate),
630
643
  maintenanceMarginRate: ABDK29ToFloat(perpInfos[j].fMaintenanceMarginRate),
631
- collateralCurrencyType: perpInfos[j].collCurrencyType,
644
+ collateralCurrencyType: Number(perpInfos[j].collCurrencyType),
632
645
  S2Symbol: sym2,
633
646
  S3Symbol: sym3,
634
647
  lotSizeBC: ABK64x64ToFloat(perpInfos[j].fLotSizeBC),
635
648
  referralRebate: ABK64x64ToFloat(perpInfos[j].fReferralRebateCC),
636
649
  priceIds: perpInfos[j].priceIds,
637
650
  isPyth: perpInfos[j].isPyth,
638
- perpFlags: perpInfos[j].perpFlags,
651
+ perpFlags: BigInt(perpInfos[j].perpFlags.toString()),
639
652
  };
640
653
  infoArr.push(info);
641
654
  }
@@ -681,16 +694,12 @@ export default class PerpetualDataHandler {
681
694
  toIdx: number,
682
695
  _proxyContract: Contract,
683
696
  _symbolList: Map<string, string>,
684
- overrides?: CallOverrides
697
+ overrides?: Overrides
685
698
  ): Promise<LiquidityPoolData[]> {
686
699
  if (fromIdx < 1) {
687
700
  throw Error("_getLiquidityPools: indices start at 1");
688
701
  }
689
- const rawPools: PerpStorage.LiquidityPoolDataStruct[] = await _proxyContract.getLiquidityPools(
690
- fromIdx,
691
- toIdx,
692
- overrides || {}
693
- );
702
+ const rawPools = await _proxyContract.getLiquidityPools(fromIdx, toIdx, overrides || {});
694
703
  let p = new Array<LiquidityPoolData>();
695
704
  for (let k = 0; k < rawPools.length; k++) {
696
705
  let orig = rawPools[k];
@@ -698,22 +707,22 @@ export default class PerpetualDataHandler {
698
707
  isRunning: orig.isRunning, // state
699
708
  iPerpetualCount: Number(orig.iPerpetualCount), // state
700
709
  id: Number(orig.id), // parameter: index, starts from 1
701
- fCeilPnLShare: ABK64x64ToFloat(BigNumber.from(orig.fCeilPnLShare)), // parameter: cap on the share of PnL allocated to liquidity providers
710
+ fCeilPnLShare: ABK64x64ToFloat(BigInt(orig.fCeilPnLShare)), // parameter: cap on the share of PnL allocated to liquidity providers
702
711
  marginTokenDecimals: Number(orig.marginTokenDecimals), // parameter: decimals of margin token, inferred from token contract
703
712
  iTargetPoolSizeUpdateTime: Number(orig.iTargetPoolSizeUpdateTime), //parameter: timestamp in seconds. How often we update the pool's target size
704
713
  marginTokenAddress: orig.marginTokenAddress, //parameter: address of the margin token
705
714
  prevAnchor: Number(orig.prevAnchor), // state: keep track of timestamp since last withdrawal was initiated
706
- fRedemptionRate: ABK64x64ToFloat(BigNumber.from(orig.fRedemptionRate)), // state: used for settlement in case of AMM default
715
+ fRedemptionRate: ABK64x64ToFloat(BigInt(orig.fRedemptionRate)), // state: used for settlement in case of AMM default
707
716
  shareTokenAddress: orig.shareTokenAddress, // parameter
708
- fPnLparticipantsCashCC: ABK64x64ToFloat(BigNumber.from(orig.fPnLparticipantsCashCC)), // state: addLiquidity/withdrawLiquidity + profit/loss - rebalance
709
- fTargetAMMFundSize: ABK64x64ToFloat(BigNumber.from(orig.fTargetAMMFundSize)), // state: target liquidity for all perpetuals in pool (sum)
710
- fDefaultFundCashCC: ABK64x64ToFloat(BigNumber.from(orig.fDefaultFundCashCC)), // state: profit/loss
711
- fTargetDFSize: ABK64x64ToFloat(BigNumber.from(orig.fTargetDFSize)), // state: target default fund size for all perpetuals in pool
712
- fBrokerCollateralLotSize: ABK64x64ToFloat(BigNumber.from(orig.fBrokerCollateralLotSize)), // param:how much collateral do brokers deposit when providing "1 lot" (not trading lot)
713
- prevTokenAmount: dec18ToFloat(BigNumber.from(orig.prevTokenAmount)), // state
714
- nextTokenAmount: dec18ToFloat(BigNumber.from(orig.nextTokenAmount)), // state
715
- totalSupplyShareToken: dec18ToFloat(BigNumber.from(orig.totalSupplyShareToken)), // state
716
- fBrokerFundCashCC: ABK64x64ToFloat(BigNumber.from(orig.fBrokerFundCashCC)), // state: amount of cash in broker fund
717
+ fPnLparticipantsCashCC: ABK64x64ToFloat(BigInt(orig.fPnLparticipantsCashCC)), // state: addLiquidity/withdrawLiquidity + profit/loss - rebalance
718
+ fTargetAMMFundSize: ABK64x64ToFloat(BigInt(orig.fTargetAMMFundSize)), // state: target liquidity for all perpetuals in pool (sum)
719
+ fDefaultFundCashCC: ABK64x64ToFloat(BigInt(orig.fDefaultFundCashCC)), // state: profit/loss
720
+ fTargetDFSize: ABK64x64ToFloat(BigInt(orig.fTargetDFSize)), // state: target default fund size for all perpetuals in pool
721
+ fBrokerCollateralLotSize: ABK64x64ToFloat(BigInt(orig.fBrokerCollateralLotSize)), // param:how much collateral do brokers deposit when providing "1 lot" (not trading lot)
722
+ prevTokenAmount: dec18ToFloat(BigInt(orig.prevTokenAmount)), // state
723
+ nextTokenAmount: dec18ToFloat(BigInt(orig.nextTokenAmount)), // state
724
+ totalSupplyShareToken: dec18ToFloat(BigInt(orig.totalSupplyShareToken)), // state
725
+ fBrokerFundCashCC: ABK64x64ToFloat(BigInt(orig.fBrokerFundCashCC)), // state: amount of cash in broker fund
717
726
  };
718
727
  p.push(v);
719
728
  }
@@ -732,12 +741,10 @@ export default class PerpetualDataHandler {
732
741
  ids: number[],
733
742
  _proxyContract: Contract,
734
743
  _symbolList: Map<string, string>,
735
- overrides?: CallOverrides
744
+ overrides?: Overrides
736
745
  ): Promise<PerpetualData[]> {
737
- const rawPerps: Partial<PerpStorage.PerpetualDataStruct>[] = await _proxyContract.getPerpetuals(
738
- ids,
739
- overrides || {}
740
- );
746
+ // TODO: can't be type safe here because proxyContract's abi is not static across chains (zkevm is the exception)
747
+ const rawPerps = await _proxyContract.getPerpetuals(ids, overrides || {});
741
748
  let p = new Array<PerpetualData>();
742
749
  for (let k = 0; k < rawPerps.length; k++) {
743
750
  let orig = rawPerps[k];
@@ -760,44 +767,41 @@ export default class PerpetualDataHandler {
760
767
  fSigma3: ABDK29ToFloat(Number(orig.fSigma3)), // parameter: volatility of quanto-quote pair
761
768
  fRho23: ABDK29ToFloat(Number(orig.fRho23)), // parameter: correlation of quanto/base returns
762
769
  liquidationPenaltyRateBps: Number(orig.liquidationPenaltyRateTbps) / 10, //parameter: penalty if AMM closes the position and not the trader
763
- currentMarkPremiumRatePrice: ABK64x64ToFloat(BigNumber.from(orig.currentMarkPremiumRate!.fPrice)), //relative diff to index price EMA, used for markprice.
770
+ currentMarkPremiumRatePrice: ABK64x64ToFloat(BigInt(orig.currentMarkPremiumRate!.fPrice)), //relative diff to index price EMA, used for markprice.
764
771
  currentMarkPremiumRateTime: Number(orig.currentMarkPremiumRate!.time), //relative diff to index price EMA, used for markprice.
765
- premiumRatesEMA: ABK64x64ToFloat(BigNumber.from(orig.premiumRatesEMA)), // EMA of premium rate
766
- fUnitAccumulatedFunding: ABK64x64ToFloat(BigNumber.from(orig.fUnitAccumulatedFunding)), //accumulated funding in collateral currency
767
- fOpenInterest: ABK64x64ToFloat(BigNumber.from(orig.fOpenInterest)), //open interest is the larger of the amount of long and short positions in base currency
768
- fTargetAMMFundSize: ABK64x64ToFloat(BigNumber.from(orig.fTargetAMMFundSize)), //target liquidity pool funds to allocate to the AMM
769
- fCurrentTraderExposureEMA: ABK64x64ToFloat(BigNumber.from(orig.fCurrentTraderExposureEMA)), // trade amounts (storing absolute value)
770
- fCurrentFundingRate: ABK64x64ToFloat(BigNumber.from(orig.fCurrentFundingRate)), // current instantaneous funding rate
771
- fLotSizeBC: ABK64x64ToFloat(BigNumber.from(orig.fLotSizeBC)), //parameter: minimal trade unit (in base currency) to avoid dust positions
772
- fReferralRebateCC: ABK64x64ToFloat(BigNumber.from(orig.fReferralRebateCC)), //parameter: referall rebate in collateral currency
773
- fTargetDFSize: ABK64x64ToFloat(BigNumber.from(orig.fTargetDFSize)), // target default fund size
774
- fkStar: ABK64x64ToFloat(BigNumber.from(orig.fkStar)), // signed trade size that minimizes the AMM risk
775
- fAMMTargetDD: ABK64x64ToFloat(BigNumber.from(orig.fAMMTargetDD)), // parameter: target distance to default (=inverse of default probability)
772
+ premiumRatesEMA: ABK64x64ToFloat(BigInt(orig.premiumRatesEMA)), // EMA of premium rate
773
+ fUnitAccumulatedFunding: ABK64x64ToFloat(BigInt(orig.fUnitAccumulatedFunding)), //accumulated funding in collateral currency
774
+ fOpenInterest: ABK64x64ToFloat(BigInt(orig.fOpenInterest)), //open interest is the larger of the amount of long and short positions in base currency
775
+ fTargetAMMFundSize: ABK64x64ToFloat(BigInt(orig.fTargetAMMFundSize)), //target liquidity pool funds to allocate to the AMM
776
+ fCurrentTraderExposureEMA: ABK64x64ToFloat(BigInt(orig.fCurrentTraderExposureEMA)), // trade amounts (storing absolute value)
777
+ fCurrentFundingRate: ABK64x64ToFloat(BigInt(orig.fCurrentFundingRate)), // current instantaneous funding rate
778
+ fLotSizeBC: ABK64x64ToFloat(BigInt(orig.fLotSizeBC)), //parameter: minimal trade unit (in base currency) to avoid dust positions
779
+ fReferralRebateCC: ABK64x64ToFloat(BigInt(orig.fReferralRebateCC)), //parameter: referall rebate in collateral currency
780
+ fTargetDFSize: ABK64x64ToFloat(BigInt(orig.fTargetDFSize)), // target default fund size
781
+ fkStar: ABK64x64ToFloat(BigInt(orig.fkStar)), // signed trade size that minimizes the AMM risk
782
+ fAMMTargetDD: ABK64x64ToFloat(BigInt(orig.fAMMTargetDD)), // parameter: target distance to default (=inverse of default probability)
776
783
  perpFlags: Number(orig.perpFlags?.toString()), // flags for perpetual
777
- fMinimalTraderExposureEMA: ABK64x64ToFloat(BigNumber.from(orig.fMinimalTraderExposureEMA)), // parameter: minimal value for fCurrentTraderExposureEMA that we don't want to undershoot
778
- fMinimalAMMExposureEMA: ABK64x64ToFloat(BigNumber.from(orig.fMinimalAMMExposureEMA)), // parameter: minimal abs value for fCurrentAMMExposureEMA that we don't want to undershoot
779
- fSettlementS3PriceData: ABK64x64ToFloat(BigNumber.from(orig.fSettlementS3PriceData)), //quanto index
780
- fSettlementS2PriceData: ABK64x64ToFloat(BigNumber.from(orig.fSettlementS2PriceData)), //base-quote pair. Used as last price in normal state.
781
- fTotalMarginBalance: ABK64x64ToFloat(BigNumber.from(orig.fTotalMarginBalance)), //calculated for settlement, in collateral currency
784
+ fMinimalTraderExposureEMA: ABK64x64ToFloat(BigInt(orig.fMinimalTraderExposureEMA)), // parameter: minimal value for fCurrentTraderExposureEMA that we don't want to undershoot
785
+ fMinimalAMMExposureEMA: ABK64x64ToFloat(BigInt(orig.fMinimalAMMExposureEMA)), // parameter: minimal abs value for fCurrentAMMExposureEMA that we don't want to undershoot
786
+ fSettlementS3PriceData: ABK64x64ToFloat(BigInt(orig.fSettlementS3PriceData)), //quanto index
787
+ fSettlementS2PriceData: ABK64x64ToFloat(BigInt(orig.fSettlementS2PriceData)), //base-quote pair. Used as last price in normal state.
788
+ fTotalMarginBalance: ABK64x64ToFloat(BigInt(orig.fTotalMarginBalance)), //calculated for settlement, in collateral currency
782
789
  fMarkPriceEMALambda: ABK64x64ToFloat(Number(orig.fMarkPriceEMALambda)), // parameter: Lambda parameter for EMA used in mark-price for funding rates
783
790
  fFundingRateClamp: ABK64x64ToFloat(Number(orig.fFundingRateClamp)), // parameter: funding rate clamp between which we charge 1bps
784
791
  fMaximalTradeSizeBumpUp: ABK64x64ToFloat(Number(orig.fMaximalTradeSizeBumpUp)), // parameter: >1, users can create a maximal position of size fMaximalTradeSizeBumpUp*fCurrentAMMExposureEMA
785
792
  iLastTargetPoolSizeTime: Number(orig.iLastTargetPoolSizeTime), //timestamp (seconds) since last update of fTargetDFSize and fTargetAMMFundSize
786
793
  fStressReturnS3: [
787
- ABK64x64ToFloat(BigNumber.from(orig.fStressReturnS3![0])),
788
- ABK64x64ToFloat(BigNumber.from(orig.fStressReturnS3![1])),
794
+ ABK64x64ToFloat(BigInt(orig.fStressReturnS3![0])),
795
+ ABK64x64ToFloat(BigInt(orig.fStressReturnS3![1])),
789
796
  ], // parameter: negative and positive stress returns for quanto-quote asset
790
- fDFLambda: [
791
- ABK64x64ToFloat(BigNumber.from(orig.fDFLambda![0])),
792
- ABK64x64ToFloat(BigNumber.from(orig.fDFLambda![1])),
793
- ], // parameter: EMA lambda for AMM and trader exposure K,k: EMA*lambda + (1-lambda)*K. 0 regular lambda, 1 if current value exceeds past
797
+ fDFLambda: [ABK64x64ToFloat(BigInt(orig.fDFLambda![0])), ABK64x64ToFloat(BigInt(orig.fDFLambda![1]))], // parameter: EMA lambda for AMM and trader exposure K,k: EMA*lambda + (1-lambda)*K. 0 regular lambda, 1 if current value exceeds past
794
798
  fCurrentAMMExposureEMA: [
795
- ABK64x64ToFloat(BigNumber.from(orig.fCurrentAMMExposureEMA![0])),
796
- ABK64x64ToFloat(BigNumber.from(orig.fCurrentAMMExposureEMA![1])),
799
+ ABK64x64ToFloat(BigInt(orig.fCurrentAMMExposureEMA![0])),
800
+ ABK64x64ToFloat(BigInt(orig.fCurrentAMMExposureEMA![1])),
797
801
  ], // 0: negative aggregated exposure (storing negative value), 1: positive
798
802
  fStressReturnS2: [
799
- ABK64x64ToFloat(BigNumber.from(orig.fStressReturnS2![0])),
800
- ABK64x64ToFloat(BigNumber.from(orig.fStressReturnS2![1])),
803
+ ABK64x64ToFloat(BigInt(orig.fStressReturnS2![0])),
804
+ ABK64x64ToFloat(BigInt(orig.fStressReturnS2![1])),
801
805
  ], // parameter: negative and positive stress returns for base-quote asset
802
806
  };
803
807
  p.push(v);
@@ -807,7 +811,7 @@ export default class PerpetualDataHandler {
807
811
 
808
812
  public static async getPoolStaticInfo(
809
813
  _proxyContract: Contract,
810
- overrides?: CallOverrides
814
+ overrides?: Overrides
811
815
  ): Promise<{
812
816
  nestedPerpetualIDs: Array<Array<number>>;
813
817
  poolShareTokenAddr: Array<string>;
@@ -822,9 +826,18 @@ export default class PerpetualDataHandler {
822
826
  let poolMarginTokenAddr: Array<string> = [];
823
827
  let oracleFactory: string = "";
824
828
  while (lenReceived == len) {
825
- let res = await _proxyContract.getPoolStaticInfo(idxFrom, idxFrom + len - 1, overrides || {});
829
+ const res = (await _proxyContract.getPoolStaticInfo(idxFrom, idxFrom + len - 1, overrides || {})) as [
830
+ bigint[][],
831
+ string[],
832
+ string[],
833
+ string
834
+ ] & {
835
+ _oracleFactoryAddress: string;
836
+ };
826
837
  lenReceived = res.length;
827
- nestedPerpetualIDs = nestedPerpetualIDs.concat(res[0]);
838
+ const nestedIds = res[0].map((ids) => ids.map((id) => Number(id)));
839
+ nestedPerpetualIDs = nestedPerpetualIDs.concat(nestedIds);
840
+ // TODO: this looks like a bug if num pools > 10 --- concat?
828
841
  poolShareTokenAddr = res[1];
829
842
  poolMarginTokenAddr = res[2];
830
843
  oracleFactory = res[3];
@@ -840,7 +853,7 @@ export default class PerpetualDataHandler {
840
853
 
841
854
  public static buildMarginAccountFromState(
842
855
  symbol: string,
843
- traderState: BigNumber[],
856
+ traderState: bigint[],
844
857
  symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
845
858
  _pxS2S3: [number, number]
846
859
  ): MarginAccount {
@@ -850,14 +863,14 @@ export default class PerpetualDataHandler {
850
863
  const idx_mark_price = 8;
851
864
  const idx_lvg = 7;
852
865
  const idx_s3 = 9;
853
- let isEmpty = traderState[idx_notional].eq(0);
866
+ let isEmpty = traderState[idx_notional] == 0n;
854
867
  let cash = ABK64x64ToFloat(traderState[idx_cash]);
855
868
  let S2Liq = 0,
856
869
  S3Liq = 0,
857
870
  tau = Infinity,
858
871
  pnl = 0,
859
872
  unpaidFundingCC = 0,
860
- fLockedIn = BigNumber.from(0),
873
+ fLockedIn = BigInt(0),
861
874
  side = CLOSED_SIDE,
862
875
  entryPrice = 0;
863
876
  if (!isEmpty) {
@@ -868,16 +881,16 @@ export default class PerpetualDataHandler {
868
881
  symbolToPerpStaticInfo
869
882
  );
870
883
  fLockedIn = traderState[idx_locked_in];
871
- side = traderState[idx_notional].gt(0) ? BUY_SIDE : SELL_SIDE;
872
- entryPrice = ABK64x64ToFloat(div64x64(fLockedIn, traderState[idx_notional]).abs());
884
+ side = traderState[idx_notional] > 0n ? BUY_SIDE : SELL_SIDE;
885
+ entryPrice = Math.abs(ABK64x64ToFloat(div64x64(fLockedIn, traderState[idx_notional])));
873
886
  }
874
887
  let mgn: MarginAccount = {
875
888
  symbol: symbol,
876
- positionNotionalBaseCCY: isEmpty ? 0 : ABK64x64ToFloat(traderState[idx_notional].abs()),
889
+ positionNotionalBaseCCY: isEmpty ? 0 : Math.abs(ABK64x64ToFloat(traderState[idx_notional])),
877
890
  side: isEmpty ? CLOSED_SIDE : side,
878
891
  entryPrice: isEmpty ? 0 : entryPrice,
879
892
  leverage: isEmpty ? 0 : ABK64x64ToFloat(traderState[idx_lvg]),
880
- markPrice: ABK64x64ToFloat(traderState[idx_mark_price].abs()),
893
+ markPrice: Math.abs(ABK64x64ToFloat(traderState[idx_mark_price])),
881
894
  unrealizedPnlQuoteCCY: isEmpty ? 0 : pnl,
882
895
  unrealizedFundingCollateralCCY: isEmpty ? 0 : unpaidFundingCC,
883
896
  collateralCC: cash,
@@ -904,7 +917,7 @@ export default class PerpetualDataHandler {
904
917
  symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
905
918
  _proxyContract: Contract,
906
919
  _pxS2S3: [number, number],
907
- overrides?: CallOverrides
920
+ overrides?: Overrides
908
921
  ): Promise<MarginAccount> {
909
922
  let perpId = Number(symbol);
910
923
  if (isNaN(perpId)) {
@@ -913,7 +926,7 @@ export default class PerpetualDataHandler {
913
926
  let traderState = await _proxyContract.getTraderState(
914
927
  perpId,
915
928
  traderAddr,
916
- _pxS2S3.map((x) => floatToABK64x64(x)) as [BigNumber, BigNumber],
929
+ _pxS2S3.map((x) => floatToABK64x64(x)) as [bigint, bigint],
917
930
  overrides || {}
918
931
  );
919
932
  return PerpetualDataHandler.buildMarginAccountFromState(symbol, traderState, symbolToPerpStaticInfo, _pxS2S3);
@@ -939,7 +952,7 @@ export default class PerpetualDataHandler {
939
952
  *
940
953
  * @returns Array with all open orders and their IDs.
941
954
  */
942
- public async getAllOpenOrders(symbol: string, overrides?: CallOverrides): Promise<[Order[], string[], string[]]> {
955
+ public async getAllOpenOrders(symbol: string, overrides?: Overrides): Promise<[Order[], string[], string[]]> {
943
956
  const MAX_ORDERS_POLLED = 500;
944
957
  let totalOrders = await this.numberOfOpenOrders(symbol, overrides);
945
958
  let orderBundles: [Order[], string[], string[]] = [[], [], []];
@@ -984,7 +997,7 @@ export default class PerpetualDataHandler {
984
997
  *
985
998
  * @returns {number} Number of open orders.
986
999
  */
987
- public async numberOfOpenOrders(symbol: string, overrides?: CallOverrides & { rpcURL?: string }): Promise<number> {
1000
+ public async numberOfOpenOrders(symbol: string, overrides?: Overrides & { rpcURL?: string }): Promise<number> {
988
1001
  if (this.proxyContract == null) {
989
1002
  throw Error("no proxy contract initialized. Use createProxyInstance().");
990
1003
  }
@@ -992,7 +1005,7 @@ export default class PerpetualDataHandler {
992
1005
  if (overrides) {
993
1006
  ({ rpcURL, ...overrides } = overrides);
994
1007
  }
995
- const provider = new StaticJsonRpcProvider(rpcURL ?? this.nodeURL);
1008
+ const provider = new JsonRpcProvider(rpcURL ?? this.nodeURL, this.network, {});
996
1009
  const orderBookSC = this.getOrderBookContract(symbol).connect(provider);
997
1010
  let numOrders = await orderBookSC.orderCount(overrides || {});
998
1011
  return Number(numOrders);
@@ -1025,7 +1038,7 @@ export default class PerpetualDataHandler {
1025
1038
  symbol: string,
1026
1039
  numElements: number,
1027
1040
  startAfter?: string | number,
1028
- overrides?: CallOverrides & { rpcURL?: string }
1041
+ overrides?: Overrides & { rpcURL?: string }
1029
1042
  ): Promise<[Order[], string[], string[]]> {
1030
1043
  if (this.proxyContract == null) {
1031
1044
  throw Error("no proxy contract initialized. Use createProxyInstance().");
@@ -1034,17 +1047,17 @@ export default class PerpetualDataHandler {
1034
1047
  if (overrides) {
1035
1048
  ({ rpcURL, ...overrides } = overrides);
1036
1049
  }
1037
- const provider = new StaticJsonRpcProvider(rpcURL ?? this.nodeURL);
1050
+ const provider = new JsonRpcProvider(rpcURL ?? this.nodeURL, this.network, { staticNetwork: true });
1038
1051
  const orderBookSC = this.getOrderBookContract(symbol).connect(provider) as LimitOrderBook;
1039
1052
  const multicall = Multicall3__factory.connect(this.config.multicall ?? MULTICALL_ADDRESS, provider);
1040
1053
 
1041
- if (typeof startAfter === "undefined") {
1054
+ if (startAfter == undefined) {
1042
1055
  startAfter = ZERO_ORDER_ID;
1043
1056
  } else if (typeof startAfter === "string") {
1044
1057
  startAfter = 0; // TODO: fix
1045
1058
  }
1046
1059
  // first get client orders (incl. dependency info)
1047
- let [orders, orderIds] = await orderBookSC.pollRange(startAfter, BigNumber.from(numElements), overrides || {});
1060
+ let [orders, orderIds] = await orderBookSC.pollRange(startAfter!, numElements, overrides || {});
1048
1061
  let userFriendlyOrders: Order[] = new Array<Order>();
1049
1062
  let traderAddr: string[] = [];
1050
1063
  let orderIdsOut: string[] = [];
@@ -1057,11 +1070,11 @@ export default class PerpetualDataHandler {
1057
1070
  }
1058
1071
  // then get perp orders (incl. submitted ts info)
1059
1072
  const multicalls: Multicall3.Call3Struct[] = orderIdsOut.map((id) => ({
1060
- target: orderBookSC.address,
1073
+ target: orderBookSC.target,
1061
1074
  allowFailure: true,
1062
1075
  callData: orderBookSC.interface.encodeFunctionData("orderOfDigest", [id]),
1063
1076
  }));
1064
- const encodedResults = await multicall.callStatic.aggregate3(multicalls, overrides || {});
1077
+ const encodedResults = await multicall.aggregate3.staticCall(multicalls, overrides || {});
1065
1078
 
1066
1079
  // order status
1067
1080
  encodedResults.map((res, k) => {
@@ -1091,7 +1104,7 @@ export default class PerpetualDataHandler {
1091
1104
  _multicall: Multicall3,
1092
1105
  _proxyContract: Contract,
1093
1106
  _pxS2S3s: number[][],
1094
- overrides?: CallOverrides
1107
+ overrides?: Overrides
1095
1108
  ): Promise<MarginAccount[]> {
1096
1109
  if (
1097
1110
  traderAddrs.length != symbols.length ||
@@ -1101,16 +1114,16 @@ export default class PerpetualDataHandler {
1101
1114
  throw new Error("traderAddr, symbol and pxS2S3 should all have the same length");
1102
1115
  }
1103
1116
  const proxyCalls: Multicall3.Call3Struct[] = traderAddrs.map((_addr, i) => ({
1104
- target: _proxyContract.address,
1117
+ target: _proxyContract.target,
1105
1118
  allowFailure: true,
1106
1119
  callData: _proxyContract.interface.encodeFunctionData("getTraderState", [
1107
1120
  PerpetualDataHandler.symbolToPerpetualId(symbols[i], symbolToPerpStaticInfo),
1108
1121
  _addr,
1109
- _pxS2S3s[i].map((x) => floatToABK64x64(x)) as [BigNumber, BigNumber],
1122
+ _pxS2S3s[i].map((x) => floatToABK64x64(x)) as [bigint, bigint],
1110
1123
  ]),
1111
1124
  }));
1112
- const encodedResults = await _multicall.callStatic.aggregate3(proxyCalls, overrides || {});
1113
- const traderStates: BigNumber[][] = encodedResults.map(({ success, returnData }, i) => {
1125
+ const encodedResults = await _multicall.aggregate3.staticCall(proxyCalls, overrides || {});
1126
+ const traderStates: bigint[][] = encodedResults.map(({ success, returnData }, i) => {
1114
1127
  if (!success) throw new Error(`Failed to get perp info for ${symbols[i]}`);
1115
1128
  return _proxyContract.interface.decodeFunctionResult("getTraderState", returnData)[0];
1116
1129
  });
@@ -1128,14 +1141,14 @@ export default class PerpetualDataHandler {
1128
1141
  symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
1129
1142
  _proxyContract: Contract,
1130
1143
  indexPrices: [number, number],
1131
- overrides?: CallOverrides
1144
+ overrides?: Overrides
1132
1145
  ): Promise<number> {
1133
1146
  let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
1134
1147
  let fIndexPrices = indexPrices.map((x) => floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x));
1135
1148
  let fPrice = await _proxyContract.queryPerpetualPrice(
1136
1149
  perpId,
1137
1150
  floatToABK64x64(tradeAmount),
1138
- fIndexPrices as [BigNumber, BigNumber],
1151
+ fIndexPrices as [bigint, bigint],
1139
1152
  overrides || {}
1140
1153
  );
1141
1154
  return ABK64x64ToFloat(fPrice);
@@ -1146,7 +1159,7 @@ export default class PerpetualDataHandler {
1146
1159
  symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
1147
1160
  _proxyContract: Contract,
1148
1161
  indexPrices: [number, number],
1149
- overrides?: CallOverrides
1162
+ overrides?: Overrides
1150
1163
  ): Promise<number> {
1151
1164
  let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
1152
1165
  let [S2, S3] = indexPrices.map((x) => floatToABK64x64(x == undefined || Number.isNaN(x) ? 0 : x));
@@ -1160,7 +1173,7 @@ export default class PerpetualDataHandler {
1160
1173
  symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>,
1161
1174
  _proxyContract: Contract,
1162
1175
  indexPrices: [number, number, boolean, boolean],
1163
- overrides?: CallOverrides
1176
+ overrides?: Overrides
1164
1177
  ): Promise<PerpetualState> {
1165
1178
  let perpId = PerpetualDataHandler.symbolToPerpetualId(symbol, symbolToPerpStaticInfo);
1166
1179
  let staticInfo = symbolToPerpStaticInfo.get(symbol)!;
@@ -1172,7 +1185,7 @@ export default class PerpetualDataHandler {
1172
1185
  }
1173
1186
  let ammState = await _proxyContract.getAMMState(
1174
1187
  perpId,
1175
- [S2, S3].map(floatToABK64x64) as [BigNumber, BigNumber],
1188
+ [S2, S3].map(floatToABK64x64) as [bigint, bigint],
1176
1189
  overrides || {}
1177
1190
  );
1178
1191
  return PerpetualDataHandler._parseAMMState(symbol, ammState, indexPrices, symbolToPerpStaticInfo);
@@ -1180,7 +1193,7 @@ export default class PerpetualDataHandler {
1180
1193
 
1181
1194
  protected static _parseAMMState(
1182
1195
  symbol: string,
1183
- ammState: BigNumber[],
1196
+ ammState: bigint[],
1184
1197
  indexPrices: [number, number, boolean, boolean],
1185
1198
  symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>
1186
1199
  ) {
@@ -1196,7 +1209,7 @@ export default class PerpetualDataHandler {
1196
1209
  let markPrice = S2 * (1 + ABK64x64ToFloat(ammState[8]));
1197
1210
  let state: PerpetualState = {
1198
1211
  id: perpId,
1199
- state: PERP_STATE_STR[ammState[13].toNumber()],
1212
+ state: PERP_STATE_STR[Number(ammState[13])],
1200
1213
  baseCurrency: ccy[0],
1201
1214
  quoteCurrency: ccy[1],
1202
1215
  indexPrice: S2,
@@ -1220,7 +1233,7 @@ export default class PerpetualDataHandler {
1220
1233
  */
1221
1234
  protected static _calculateLiquidationPrice(
1222
1235
  symbol: string,
1223
- traderState: BigNumber[],
1236
+ traderState: bigint[],
1224
1237
  S2: number,
1225
1238
  symbolToPerpStaticInfo: Map<string, PerpetualStaticInfo>
1226
1239
  ): [number, number, number, number, number] {
@@ -1242,7 +1255,7 @@ export default class PerpetualDataHandler {
1242
1255
  let position = ABK64x64ToFloat(traderState[idx_notional]);
1243
1256
  let cashCC = ABK64x64ToFloat(traderState[idx_availableCashCC]);
1244
1257
  let Sm = ABK64x64ToFloat(traderState[idx_mark_price]);
1245
- let unpaidFundingCC = ABK64x64ToFloat(traderState[idx_availableCashCC].sub(traderState[idx_cash]));
1258
+ let unpaidFundingCC = ABK64x64ToFloat(traderState[idx_availableCashCC] - traderState[idx_cash]);
1246
1259
  let unpaidFunding = unpaidFundingCC;
1247
1260
 
1248
1261
  if (perpInfo.collateralCurrencyType == CollaterlCCY.BASE) {
@@ -1320,36 +1333,42 @@ export default class PerpetualDataHandler {
1320
1333
  symbolToPerpInfoMap: Map<string, PerpetualStaticInfo>
1321
1334
  ): Order {
1322
1335
  // find symbol of perpetual id
1323
- let symbol = PerpetualDataHandler._getByValue(symbolToPerpInfoMap, order.iPerpetualId, "id");
1336
+ const symbol = PerpetualDataHandler._getByValue(symbolToPerpInfoMap, Number(order.iPerpetualId), "id");
1324
1337
  if (symbol == undefined) {
1325
- throw Error(`Perpetual id ${order.iPerpetualId} not found. Check with marketData.exchangeInfo().`);
1338
+ throw new Error(`Perpetual id ${order.iPerpetualId} not found. Check with marketData.exchangeInfo().`);
1326
1339
  }
1327
- let side = order.fAmount > BigNumber.from(0) ? BUY_SIDE : SELL_SIDE;
1328
- let limitPrice, stopPrice;
1329
- let fLimitPrice: BigNumber | undefined = BigNumber.from(order.fLimitPrice);
1330
- if (fLimitPrice.eq(0)) {
1340
+ const side = BigInt(order.fAmount.toString()) > BigInt(0) ? BUY_SIDE : SELL_SIDE;
1341
+ let limitPrice: number | undefined, stopPrice: number | undefined;
1342
+ const fLimitPrice = BigInt(order.fLimitPrice);
1343
+ if (fLimitPrice == 0n) {
1331
1344
  limitPrice = side == BUY_SIDE ? undefined : 0;
1332
- } else if (fLimitPrice.eq(MAX_64x64)) {
1345
+ } else if (fLimitPrice == MAX_64x64) {
1333
1346
  limitPrice = side == BUY_SIDE ? Infinity : undefined;
1334
1347
  } else {
1335
1348
  limitPrice = ABK64x64ToFloat(fLimitPrice);
1336
1349
  }
1337
- let fStopPrice: BigNumber | undefined = BigNumber.from(order.fTriggerPrice);
1338
- if (fStopPrice.eq(0) || fStopPrice.eq(MAX_64x64)) {
1350
+ const fStopPrice: bigint = BigInt(order.fTriggerPrice);
1351
+ if (fStopPrice == 0n || fStopPrice == MAX_64x64) {
1339
1352
  stopPrice = undefined;
1340
1353
  } else {
1341
1354
  stopPrice = ABK64x64ToFloat(fStopPrice);
1342
1355
  }
1356
+ // adjust prices for market type
1357
+ const sInfo = symbolToPerpInfoMap.get(symbol)!;
1358
+ if (PerpetualDataHandler.isPredictiveMarket(sInfo)) {
1359
+ limitPrice = limitPrice !== undefined && limitPrice !== 0 ? priceToProb(limitPrice) : limitPrice;
1360
+ stopPrice = stopPrice !== undefined && stopPrice !== 0 ? priceToProb(stopPrice) : stopPrice;
1361
+ }
1343
1362
  let userOrder: Order = {
1344
1363
  symbol: symbol!,
1345
1364
  side: side,
1346
- type: PerpetualDataHandler._flagToOrderType(BigNumber.from(order.flags), BigNumber.from(order.fLimitPrice)),
1347
- quantity: Math.abs(ABK64x64ToFloat(BigNumber.from(order.fAmount))),
1348
- reduceOnly: containsFlag(BigNumber.from(order.flags), MASK_CLOSE_ONLY),
1365
+ type: PerpetualDataHandler._flagToOrderType(BigInt(order.flags), BigInt(order.fLimitPrice)),
1366
+ quantity: Math.abs(ABK64x64ToFloat(BigInt(order.fAmount))),
1367
+ reduceOnly: containsFlag(BigInt(order.flags), MASK_CLOSE_ONLY),
1349
1368
  limitPrice: limitPrice,
1350
- keepPositionLvg: containsFlag(BigNumber.from(order.flags), MASK_KEEP_POS_LEVERAGE),
1369
+ keepPositionLvg: containsFlag(BigInt(order.flags), MASK_KEEP_POS_LEVERAGE),
1351
1370
  brokerFeeTbps: order.brokerFeeTbps == 0 ? undefined : Number(order.brokerFeeTbps),
1352
- brokerAddr: order.brokerAddr == ZERO_ADDRESS ? undefined : order.brokerAddr,
1371
+ brokerAddr: order.brokerAddr == ZERO_ADDRESS ? undefined : order.brokerAddr.toString(),
1353
1372
  brokerSignature: order.brokerSignature == "0x" ? undefined : order.brokerSignature,
1354
1373
  stopPrice: stopPrice,
1355
1374
  leverage: Number(order.leverageTDR) / 100,
@@ -1379,9 +1398,9 @@ export default class PerpetualDataHandler {
1379
1398
  PerpetualDataHandler.checkOrder(order, perpStaticInfo);
1380
1399
  // translate order
1381
1400
  let flags = PerpetualDataHandler._orderTypeToFlag(order);
1382
- let brokerSig = order.brokerSignature == undefined ? [] : order.brokerSignature;
1401
+ let brokerSig = order.brokerSignature == undefined ? "0x" : order.brokerSignature;
1383
1402
  let perpetualId = PerpetualDataHandler.symbolToPerpetualId(order.symbol, perpStaticInfo);
1384
- let fAmount: BigNumber;
1403
+ let fAmount: bigint;
1385
1404
  if (order.side == BUY_SIDE) {
1386
1405
  fAmount = floatToABK64x64(Math.abs(order.quantity));
1387
1406
  } else if (order.side == SELL_SIDE) {
@@ -1389,21 +1408,25 @@ export default class PerpetualDataHandler {
1389
1408
  } else {
1390
1409
  throw Error(`invalid side in order spec, use ${BUY_SIDE} or ${SELL_SIDE}`);
1391
1410
  }
1392
- let fLimitPrice: BigNumber;
1411
+ const isPred = PerpetualDataHandler.isPredictiveMarket(perpStaticInfo.get(order.symbol)!);
1412
+ let fLimitPrice: bigint;
1393
1413
  if (order.limitPrice == undefined) {
1394
1414
  // we need to set the limit price to infinity or zero for
1395
1415
  // the trade to go through
1396
1416
  // Also: stop orders always have limits set, so even for this case
1397
1417
  // we set the limit to 0 or infinity
1398
- fLimitPrice = order.side == BUY_SIDE ? MAX_64x64 : BigNumber.from(0);
1418
+ fLimitPrice = order.side == BUY_SIDE ? MAX_64x64 : BigInt(0);
1399
1419
  } else {
1400
- fLimitPrice = floatToABK64x64(order.limitPrice);
1420
+ fLimitPrice = floatToABK64x64(isPred ? probToPrice(order.limitPrice) : order.limitPrice);
1401
1421
  }
1402
1422
 
1403
- let iDeadline = order.deadline == undefined ? Date.now() / 1000 + ORDER_MAX_DURATION_SEC : order.deadline;
1404
- let fTriggerPrice = order.stopPrice == undefined ? BigNumber.from(0) : floatToABK64x64(order.stopPrice);
1423
+ const iDeadline = order.deadline == undefined ? Date.now() / 1000 + ORDER_MAX_DURATION_SEC : order.deadline;
1424
+ const fTriggerPrice =
1425
+ order.stopPrice == undefined
1426
+ ? BigInt(0)
1427
+ : floatToABK64x64(isPred ? probToPrice(order.stopPrice) : order.stopPrice);
1405
1428
 
1406
- let smOrder: SmartContractOrder = {
1429
+ const smOrder: SmartContractOrder = {
1407
1430
  flags: flags,
1408
1431
  iPerpetualId: perpetualId,
1409
1432
  brokerFeeTbps: order.brokerFeeTbps == undefined ? 0 : order.brokerFeeTbps,
@@ -1501,10 +1524,11 @@ export default class PerpetualDataHandler {
1501
1524
  return order;
1502
1525
  }
1503
1526
 
1504
- private static _flagToOrderType(orderFlags: BigNumber, orderLimitPrice: BigNumber): string {
1505
- let flag = BigNumber.from(orderFlags);
1527
+ private static _flagToOrderType(orderFlags: bigint, orderLimitPrice: bigint): string {
1528
+ // TODO: check
1529
+ let flag = BigInt(orderFlags);
1506
1530
  let isLimit = containsFlag(flag, MASK_LIMIT_ORDER);
1507
- let hasLimit = !BigNumber.from(orderLimitPrice).eq(0) || !BigNumber.from(orderLimitPrice).eq(MAX_64x64);
1531
+ let hasLimit = BigInt(orderLimitPrice) != 0n || BigInt(orderLimitPrice) != MAX_64x64;
1508
1532
  let isStop = containsFlag(flag, MASK_STOP_ORDER);
1509
1533
 
1510
1534
  if (isStop && hasLimit) {
@@ -1524,8 +1548,8 @@ export default class PerpetualDataHandler {
1524
1548
  * @param order order type
1525
1549
  * @returns BigNumber flags
1526
1550
  */
1527
- private static _orderTypeToFlag(order: Order): BigNumber {
1528
- let flag: BigNumber;
1551
+ private static _orderTypeToFlag(order: Order): bigint {
1552
+ let flag: bigint;
1529
1553
  order.type = order.type.toUpperCase();
1530
1554
  switch (order.type) {
1531
1555
  case ORDER_TYPE_LIMIT:
@@ -1695,13 +1719,13 @@ export default class PerpetualDataHandler {
1695
1719
  }
1696
1720
 
1697
1721
  /**
1698
- * Get the ABI of a function in a given contract
1722
+ * Get the ABI of a function in a given contract. Undefined if it doesn't exist.
1699
1723
  * @param contract A contract instance, e.g. this.proxyContract
1700
1724
  * @param functionName Name of the function whose ABI we want
1701
1725
  * @returns Function ABI as a single JSON string
1702
1726
  */
1703
- protected static _getABIFromContract(contract: Contract, functionName: string): string {
1704
- return contract.interface.getFunction(functionName).format(FormatTypes.full);
1727
+ protected static _getABIFromContract(contract: BaseContract, functionName: string): string | undefined {
1728
+ return contract.interface.getFunction(functionName)?.format("full");
1705
1729
  }
1706
1730
 
1707
1731
  /**
@@ -1804,7 +1828,7 @@ export default class PerpetualDataHandler {
1804
1828
  * @param contract name of contract: proxy|lob|sharetoken
1805
1829
  * @returns ABI for the requested contract
1806
1830
  */
1807
- public getABI(contract: string): ContractInterface | undefined {
1831
+ public getABI(contract: string): Interface | undefined {
1808
1832
  switch (contract) {
1809
1833
  case "proxy":
1810
1834
  return this.proxyABI;
@@ -1828,6 +1852,9 @@ export default class PerpetualDataHandler {
1828
1852
  // traderAccount: MarginAccount,
1829
1853
  perpStaticInfo: Map<string, PerpetualStaticInfo>
1830
1854
  ) {
1855
+ if (!perpStaticInfo.has(order.symbol)) {
1856
+ throw new Error(`Perpetual not found for symbol ${order.symbol}`);
1857
+ }
1831
1858
  // check side
1832
1859
  if (order.side != BUY_SIDE && order.side != SELL_SIDE) {
1833
1860
  throw Error(`order side must be ${BUY_SIDE} or ${SELL_SIDE}`);
@@ -1869,14 +1896,14 @@ export default class PerpetualDataHandler {
1869
1896
  public static fromClientOrderToTypeSafeOrder(order: ClientOrder): TypeSafeOrder {
1870
1897
  return {
1871
1898
  iPerpetualId: +order.iPerpetualId.toString(),
1872
- fLimitPrice: BigInt(BigNumber.from(order.fLimitPrice).toString()),
1899
+ fLimitPrice: order.fLimitPrice,
1873
1900
  leverageTDR: +order.leverageTDR.toString(),
1874
1901
  executionTimestamp: +order.executionTimestamp.toString(),
1875
- flags: BigInt(BigNumber.from(order.flags).toString()),
1902
+ flags: BigInt(order.flags),
1876
1903
  iDeadline: +order.iDeadline.toString(),
1877
1904
  brokerAddr: order.brokerAddr,
1878
- fTriggerPrice: BigInt(BigNumber.from(order.fTriggerPrice).toString()),
1879
- fAmount: BigInt(BigNumber.from(order.fAmount).toString()),
1905
+ fTriggerPrice: order.fTriggerPrice,
1906
+ fAmount: order.fAmount,
1880
1907
  parentChildDigest1: order.parentChildDigest1,
1881
1908
  traderAddr: order.traderAddr,
1882
1909
  parentChildDigest2: order.parentChildDigest2,
@@ -1885,4 +1912,14 @@ export default class PerpetualDataHandler {
1885
1912
  callbackTarget: order.callbackTarget,
1886
1913
  };
1887
1914
  }
1915
+
1916
+ /**
1917
+ * Determines whether a given perpetual represents a predictive market
1918
+ * @param staticInfo Perpetual static info
1919
+ * @returns True if this is a predictive market
1920
+ */
1921
+ public static isPredictiveMarket(staticInfo: PerpetualStaticInfo) {
1922
+ // return true; // for testing
1923
+ return containsFlag(staticInfo.perpFlags, MASK_PREDICTIVE_MARKET);
1924
+ }
1888
1925
  }