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