@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.
- package/dist/cjs/accountTrade.d.ts +9 -9
- package/dist/cjs/accountTrade.js +19 -17
- package/dist/cjs/accountTrade.js.map +1 -1
- package/dist/cjs/brokerTool.d.ts +11 -12
- package/dist/cjs/brokerTool.js +7 -8
- package/dist/cjs/brokerTool.js.map +1 -1
- package/dist/cjs/config/priceFeedConfig.json +16 -2
- package/dist/cjs/config/symbolList.json +2 -1
- package/dist/cjs/constants.d.ts +12 -12
- package/dist/cjs/constants.js +14 -14
- package/dist/cjs/constants.js.map +1 -1
- package/dist/cjs/contracts/ERC20.d.ts +146 -171
- package/dist/cjs/contracts/IPerpetualManager.d.ts +2534 -2225
- package/dist/cjs/contracts/IPyth.d.ts +181 -184
- package/dist/cjs/contracts/LimitOrderBook.d.ts +373 -401
- package/dist/cjs/contracts/LimitOrderBookBeacon.d.ts +53 -104
- package/dist/cjs/contracts/LimitOrderBookFactory.d.ts +129 -185
- package/dist/cjs/contracts/MockTokenSwap.d.ts +109 -169
- package/dist/cjs/contracts/Multicall3.d.ts +147 -211
- package/dist/cjs/contracts/OnDemandOracleUpgradeable.d.ts +342 -399
- package/dist/cjs/contracts/OracleFactory.d.ts +258 -238
- package/dist/cjs/contracts/PerpetualManagerProxy.d.ts +1099 -891
- package/dist/cjs/contracts/RedStoneAbi.d.ts +369 -488
- package/dist/cjs/contracts/ShareToken.d.ts +232 -285
- package/dist/cjs/contracts/common.d.ts +40 -11
- package/dist/cjs/contracts/factories/ERC20__factory.d.ts +2 -3
- package/dist/cjs/contracts/factories/ERC20__factory.js +3 -3
- package/dist/cjs/contracts/factories/ERC20__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.d.ts +2 -3
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js +3 -3
- package/dist/cjs/contracts/factories/IPerpetualManager__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/IPyth__factory.d.ts +2 -3
- package/dist/cjs/contracts/factories/IPyth__factory.js +3 -3
- package/dist/cjs/contracts/factories/IPyth__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/LimitOrderBookBeacon__factory.d.ts +2 -3
- package/dist/cjs/contracts/factories/LimitOrderBookBeacon__factory.js +3 -3
- package/dist/cjs/contracts/factories/LimitOrderBookBeacon__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/LimitOrderBookFactory__factory.d.ts +2 -3
- package/dist/cjs/contracts/factories/LimitOrderBookFactory__factory.js +3 -3
- package/dist/cjs/contracts/factories/LimitOrderBookFactory__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/LimitOrderBook__factory.d.ts +2 -3
- package/dist/cjs/contracts/factories/LimitOrderBook__factory.js +3 -3
- package/dist/cjs/contracts/factories/LimitOrderBook__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/MockTokenSwap__factory.d.ts +2 -3
- package/dist/cjs/contracts/factories/MockTokenSwap__factory.js +3 -3
- package/dist/cjs/contracts/factories/MockTokenSwap__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/Multicall3__factory.d.ts +11 -9
- package/dist/cjs/contracts/factories/Multicall3__factory.js +7 -10
- package/dist/cjs/contracts/factories/Multicall3__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/OnDemandOracleUpgradeable__factory.d.ts +2 -3
- package/dist/cjs/contracts/factories/OnDemandOracleUpgradeable__factory.js +3 -3
- package/dist/cjs/contracts/factories/OnDemandOracleUpgradeable__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/OracleFactory__factory.d.ts +2 -3
- package/dist/cjs/contracts/factories/OracleFactory__factory.js +3 -3
- package/dist/cjs/contracts/factories/OracleFactory__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.d.ts +2 -3
- package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js +3 -3
- package/dist/cjs/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/RedStoneAbi__factory.d.ts +2 -3
- package/dist/cjs/contracts/factories/RedStoneAbi__factory.js +3 -3
- package/dist/cjs/contracts/factories/RedStoneAbi__factory.js.map +1 -1
- package/dist/cjs/contracts/factories/ShareToken__factory.d.ts +2 -3
- package/dist/cjs/contracts/factories/ShareToken__factory.js +3 -3
- package/dist/cjs/contracts/factories/ShareToken__factory.js.map +1 -1
- package/dist/cjs/d8XMath.d.ts +28 -16
- package/dist/cjs/d8XMath.js +70 -50
- package/dist/cjs/d8XMath.js.map +1 -1
- package/dist/cjs/liquidatorTool.d.ts +8 -8
- package/dist/cjs/liquidatorTool.js +5 -7
- package/dist/cjs/liquidatorTool.js.map +1 -1
- package/dist/cjs/liquidityProviderTool.d.ts +4 -5
- package/dist/cjs/liquidityProviderTool.js.map +1 -1
- package/dist/cjs/marketData.d.ts +27 -28
- package/dist/cjs/marketData.js +65 -69
- package/dist/cjs/marketData.js.map +1 -1
- package/dist/cjs/nodeSDKTypes.d.ts +35 -37
- package/dist/cjs/onChainPxFeed.d.ts +2 -2
- package/dist/cjs/onChainPxFeed.js +3 -3
- package/dist/cjs/onChainPxFeed.js.map +1 -1
- package/dist/cjs/onChainPxFeedAngle.d.ts +2 -2
- package/dist/cjs/onChainPxFeedAngle.js +4 -5
- package/dist/cjs/onChainPxFeedAngle.js.map +1 -1
- package/dist/cjs/onChainPxFeedRedStone.js +2 -2
- package/dist/cjs/onChainPxFeedRedStone.js.map +1 -1
- package/dist/cjs/orderExecutorTool.d.ts +7 -9
- package/dist/cjs/orderExecutorTool.js +52 -62
- package/dist/cjs/orderExecutorTool.js.map +1 -1
- package/dist/cjs/perpetualDataHandler.d.ts +44 -35
- package/dist/cjs/perpetualDataHandler.js +194 -170
- package/dist/cjs/perpetualDataHandler.js.map +1 -1
- package/dist/cjs/perpetualEventHandler.d.ts +4 -5
- package/dist/cjs/perpetualEventHandler.js +2 -2
- package/dist/cjs/perpetualEventHandler.js.map +1 -1
- package/dist/cjs/polyMktsPxFeed.d.ts +14 -0
- package/dist/cjs/polyMktsPxFeed.js +59 -0
- package/dist/cjs/polyMktsPxFeed.js.map +1 -0
- package/dist/cjs/priceFeeds.d.ts +2 -0
- package/dist/cjs/priceFeeds.js +44 -9
- package/dist/cjs/priceFeeds.js.map +1 -1
- package/dist/cjs/referralCodeSigner.d.ts +1 -1
- package/dist/cjs/referralCodeSigner.js +12 -16
- package/dist/cjs/referralCodeSigner.js.map +1 -1
- package/dist/cjs/traderDigests.d.ts +2 -1
- package/dist/cjs/traderDigests.js +9 -11
- package/dist/cjs/traderDigests.js.map +1 -1
- package/dist/cjs/traderInterface.d.ts +8 -9
- package/dist/cjs/traderInterface.js +40 -23
- package/dist/cjs/traderInterface.js.map +1 -1
- package/dist/cjs/utils.d.ts +2 -3
- package/dist/cjs/utils.js +1 -2
- package/dist/cjs/utils.js.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/version.js.map +1 -1
- package/dist/cjs/writeAccessHandler.d.ts +7 -9
- package/dist/cjs/writeAccessHandler.js +13 -16
- package/dist/cjs/writeAccessHandler.js.map +1 -1
- package/dist/esm/accountTrade.d.ts +9 -9
- package/dist/esm/accountTrade.js +19 -17
- package/dist/esm/accountTrade.js.map +1 -1
- package/dist/esm/brokerTool.d.ts +11 -12
- package/dist/esm/brokerTool.js +2 -3
- package/dist/esm/brokerTool.js.map +1 -1
- package/dist/esm/config/priceFeedConfig.json +16 -2
- package/dist/esm/config/symbolList.json +2 -1
- package/dist/esm/constants.d.ts +12 -12
- package/dist/esm/constants.js +13 -13
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/contracts/ERC20.d.ts +146 -171
- package/dist/esm/contracts/IPerpetualManager.d.ts +2534 -2225
- package/dist/esm/contracts/IPyth.d.ts +181 -184
- package/dist/esm/contracts/LimitOrderBook.d.ts +373 -401
- package/dist/esm/contracts/LimitOrderBookBeacon.d.ts +53 -104
- package/dist/esm/contracts/LimitOrderBookFactory.d.ts +129 -185
- package/dist/esm/contracts/MockTokenSwap.d.ts +109 -169
- package/dist/esm/contracts/Multicall3.d.ts +147 -211
- package/dist/esm/contracts/OnDemandOracleUpgradeable.d.ts +342 -399
- package/dist/esm/contracts/OracleFactory.d.ts +258 -238
- package/dist/esm/contracts/PerpetualManagerProxy.d.ts +1099 -891
- package/dist/esm/contracts/RedStoneAbi.d.ts +369 -488
- package/dist/esm/contracts/ShareToken.d.ts +232 -285
- package/dist/esm/contracts/common.d.ts +40 -11
- package/dist/esm/contracts/factories/ERC20__factory.d.ts +2 -3
- package/dist/esm/contracts/factories/ERC20__factory.js +4 -4
- package/dist/esm/contracts/factories/ERC20__factory.js.map +1 -1
- package/dist/esm/contracts/factories/IPerpetualManager__factory.d.ts +2 -3
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js +4 -4
- package/dist/esm/contracts/factories/IPerpetualManager__factory.js.map +1 -1
- package/dist/esm/contracts/factories/IPyth__factory.d.ts +2 -3
- package/dist/esm/contracts/factories/IPyth__factory.js +4 -4
- package/dist/esm/contracts/factories/IPyth__factory.js.map +1 -1
- package/dist/esm/contracts/factories/LimitOrderBookBeacon__factory.d.ts +2 -3
- package/dist/esm/contracts/factories/LimitOrderBookBeacon__factory.js +4 -4
- package/dist/esm/contracts/factories/LimitOrderBookBeacon__factory.js.map +1 -1
- package/dist/esm/contracts/factories/LimitOrderBookFactory__factory.d.ts +2 -3
- package/dist/esm/contracts/factories/LimitOrderBookFactory__factory.js +4 -4
- package/dist/esm/contracts/factories/LimitOrderBookFactory__factory.js.map +1 -1
- package/dist/esm/contracts/factories/LimitOrderBook__factory.d.ts +2 -3
- package/dist/esm/contracts/factories/LimitOrderBook__factory.js +4 -4
- package/dist/esm/contracts/factories/LimitOrderBook__factory.js.map +1 -1
- package/dist/esm/contracts/factories/MockTokenSwap__factory.d.ts +2 -3
- package/dist/esm/contracts/factories/MockTokenSwap__factory.js +4 -4
- package/dist/esm/contracts/factories/MockTokenSwap__factory.js.map +1 -1
- package/dist/esm/contracts/factories/Multicall3__factory.d.ts +11 -9
- package/dist/esm/contracts/factories/Multicall3__factory.js +8 -11
- package/dist/esm/contracts/factories/Multicall3__factory.js.map +1 -1
- package/dist/esm/contracts/factories/OnDemandOracleUpgradeable__factory.d.ts +2 -3
- package/dist/esm/contracts/factories/OnDemandOracleUpgradeable__factory.js +4 -4
- package/dist/esm/contracts/factories/OnDemandOracleUpgradeable__factory.js.map +1 -1
- package/dist/esm/contracts/factories/OracleFactory__factory.d.ts +2 -3
- package/dist/esm/contracts/factories/OracleFactory__factory.js +4 -4
- package/dist/esm/contracts/factories/OracleFactory__factory.js.map +1 -1
- package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.d.ts +2 -3
- package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js +4 -4
- package/dist/esm/contracts/factories/PerpetualManagerProxy__factory.js.map +1 -1
- package/dist/esm/contracts/factories/RedStoneAbi__factory.d.ts +2 -3
- package/dist/esm/contracts/factories/RedStoneAbi__factory.js +4 -4
- package/dist/esm/contracts/factories/RedStoneAbi__factory.js.map +1 -1
- package/dist/esm/contracts/factories/ShareToken__factory.d.ts +2 -3
- package/dist/esm/contracts/factories/ShareToken__factory.js +4 -4
- package/dist/esm/contracts/factories/ShareToken__factory.js.map +1 -1
- package/dist/esm/d8XMath.d.ts +28 -16
- package/dist/esm/d8XMath.js +67 -49
- package/dist/esm/d8XMath.js.map +1 -1
- package/dist/esm/liquidatorTool.d.ts +8 -8
- package/dist/esm/liquidatorTool.js +5 -7
- package/dist/esm/liquidatorTool.js.map +1 -1
- package/dist/esm/liquidityProviderTool.d.ts +4 -5
- package/dist/esm/liquidityProviderTool.js.map +1 -1
- package/dist/esm/marketData.d.ts +27 -28
- package/dist/esm/marketData.js +55 -59
- package/dist/esm/marketData.js.map +1 -1
- package/dist/esm/nodeSDKTypes.d.ts +35 -37
- package/dist/esm/onChainPxFeed.d.ts +2 -2
- package/dist/esm/onChainPxFeed.js +3 -3
- package/dist/esm/onChainPxFeed.js.map +1 -1
- package/dist/esm/onChainPxFeedAngle.d.ts +2 -2
- package/dist/esm/onChainPxFeedAngle.js +2 -3
- package/dist/esm/onChainPxFeedAngle.js.map +1 -1
- package/dist/esm/onChainPxFeedRedStone.js +1 -1
- package/dist/esm/onChainPxFeedRedStone.js.map +1 -1
- package/dist/esm/orderExecutorTool.d.ts +7 -9
- package/dist/esm/orderExecutorTool.js +38 -48
- package/dist/esm/orderExecutorTool.js.map +1 -1
- package/dist/esm/perpetualDataHandler.d.ts +44 -35
- package/dist/esm/perpetualDataHandler.js +137 -113
- package/dist/esm/perpetualDataHandler.js.map +1 -1
- package/dist/esm/perpetualEventHandler.d.ts +4 -5
- package/dist/esm/perpetualEventHandler.js +2 -2
- package/dist/esm/perpetualEventHandler.js.map +1 -1
- package/dist/esm/polyMktsPxFeed.d.ts +14 -0
- package/dist/esm/polyMktsPxFeed.js +56 -0
- package/dist/esm/polyMktsPxFeed.js.map +1 -0
- package/dist/esm/priceFeeds.d.ts +2 -0
- package/dist/esm/priceFeeds.js +44 -9
- package/dist/esm/priceFeeds.js.map +1 -1
- package/dist/esm/referralCodeSigner.d.ts +1 -1
- package/dist/esm/referralCodeSigner.js +6 -10
- package/dist/esm/referralCodeSigner.js.map +1 -1
- package/dist/esm/traderDigests.d.ts +2 -1
- package/dist/esm/traderDigests.js +2 -4
- package/dist/esm/traderDigests.js.map +1 -1
- package/dist/esm/traderInterface.d.ts +8 -9
- package/dist/esm/traderInterface.js +42 -25
- package/dist/esm/traderInterface.js.map +1 -1
- package/dist/esm/utils.d.ts +2 -3
- package/dist/esm/utils.js +1 -2
- package/dist/esm/utils.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- package/dist/esm/writeAccessHandler.d.ts +7 -9
- package/dist/esm/writeAccessHandler.js +5 -8
- package/dist/esm/writeAccessHandler.js.map +1 -1
- package/package.json +7 -17
- package/src/accountTrade.ts +32 -34
- package/src/brokerTool.ts +17 -20
- package/src/config/priceFeedConfig.json +16 -2
- package/src/config/symbolList.json +2 -1
- package/src/constants.ts +13 -13
- package/src/contracts/ERC20.ts +236 -350
- package/src/contracts/IPerpetualManager.ts +3359 -5050
- package/src/contracts/IPyth.ts +272 -409
- package/src/contracts/LimitOrderBook.ts +503 -779
- package/src/contracts/LimitOrderBookBeacon.ts +123 -171
- package/src/contracts/LimitOrderBookFactory.ts +263 -332
- package/src/contracts/MockTokenSwap.ts +237 -275
- package/src/contracts/Multicall3.ts +208 -374
- package/src/contracts/OnDemandOracleUpgradeable.ts +569 -782
- package/src/contracts/OracleFactory.ts +410 -538
- package/src/contracts/PerpetualManagerProxy.ts +1898 -1426
- package/src/contracts/RedStoneAbi.ts +486 -986
- package/src/contracts/ShareToken.ts +376 -557
- package/src/contracts/common.ts +108 -21
- package/src/contracts/factories/ERC20__factory.ts +4 -5
- package/src/contracts/factories/IPerpetualManager__factory.ts +4 -5
- package/src/contracts/factories/IPyth__factory.ts +4 -5
- package/src/contracts/factories/LimitOrderBookBeacon__factory.ts +5 -6
- package/src/contracts/factories/LimitOrderBookFactory__factory.ts +5 -6
- package/src/contracts/factories/LimitOrderBook__factory.ts +4 -5
- package/src/contracts/factories/MockTokenSwap__factory.ts +4 -5
- package/src/contracts/factories/Multicall3__factory.ts +21 -19
- package/src/contracts/factories/OnDemandOracleUpgradeable__factory.ts +5 -6
- package/src/contracts/factories/OracleFactory__factory.ts +4 -5
- package/src/contracts/factories/PerpetualManagerProxy__factory.ts +5 -6
- package/src/contracts/factories/RedStoneAbi__factory.ts +4 -8
- package/src/contracts/factories/ShareToken__factory.ts +4 -8
- package/src/d8XMath.ts +78 -57
- package/src/liquidatorTool.ts +12 -15
- package/src/liquidityProviderTool.ts +7 -5
- package/src/marketData.ts +110 -121
- package/src/nodeSDKTypes.ts +51 -38
- package/src/onChainPxFeed.ts +4 -4
- package/src/onChainPxFeedAngle.ts +5 -7
- package/src/onChainPxFeedRedStone.ts +1 -3
- package/src/orderExecutorTool.ts +100 -108
- package/src/perpetualDataHandler.ts +209 -172
- package/src/perpetualEventHandler.ts +16 -17
- package/src/polyMktsPxFeed.ts +71 -0
- package/src/priceFeeds.ts +46 -10
- package/src/referralCodeSigner.ts +6 -10
- package/src/traderDigests.ts +8 -5
- package/src/traderInterface.ts +61 -33
- package/src/utils.ts +3 -4
- package/src/version.ts +1 -1
- package/src/writeAccessHandler.ts +26 -17
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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 {
|
|
44
|
-
import {
|
|
45
|
-
|
|
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:
|
|
109
|
+
public chainId: bigint;
|
|
110
|
+
public network: Network;
|
|
103
111
|
protected proxyContract: Contract | null = null;
|
|
104
|
-
protected proxyABI:
|
|
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:
|
|
118
|
+
protected lobFactoryABI: Interface;
|
|
111
119
|
protected lobFactoryAddr: string | undefined;
|
|
112
|
-
protected lobABI:
|
|
120
|
+
protected lobABI: Interface;
|
|
113
121
|
// share token
|
|
114
|
-
protected shareTokenABI:
|
|
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?:
|
|
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
|
|
161
|
-
network = await signerOrProvider.provider
|
|
169
|
+
if (signerOrProvider.provider) {
|
|
170
|
+
network = await signerOrProvider.provider.getNetwork();
|
|
162
171
|
} else {
|
|
163
|
-
|
|
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,
|
|
191
|
+
public getOrderBookContract(symbol: string, signerOrProvider?: Signer | Provider): LimitOrderBook {
|
|
183
192
|
let orderBookAddr = this.symbolToPerpStaticInfo.get(symbol)?.limitOrderBookAddr;
|
|
184
|
-
if (orderBookAddr == "" || orderBookAddr == undefined
|
|
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,
|
|
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?:
|
|
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?:
|
|
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 =
|
|
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.
|
|
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
|
|
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] !=
|
|
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
|
|
396
|
-
if (
|
|
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?:
|
|
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(
|
|
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?:
|
|
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
|
|
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(
|
|
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(
|
|
715
|
+
fRedemptionRate: ABK64x64ToFloat(BigInt(orig.fRedemptionRate)), // state: used for settlement in case of AMM default
|
|
707
716
|
shareTokenAddress: orig.shareTokenAddress, // parameter
|
|
708
|
-
fPnLparticipantsCashCC: ABK64x64ToFloat(
|
|
709
|
-
fTargetAMMFundSize: ABK64x64ToFloat(
|
|
710
|
-
fDefaultFundCashCC: ABK64x64ToFloat(
|
|
711
|
-
fTargetDFSize: ABK64x64ToFloat(
|
|
712
|
-
fBrokerCollateralLotSize: ABK64x64ToFloat(
|
|
713
|
-
prevTokenAmount: dec18ToFloat(
|
|
714
|
-
nextTokenAmount: dec18ToFloat(
|
|
715
|
-
totalSupplyShareToken: dec18ToFloat(
|
|
716
|
-
fBrokerFundCashCC: ABK64x64ToFloat(
|
|
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?:
|
|
744
|
+
overrides?: Overrides
|
|
736
745
|
): Promise<PerpetualData[]> {
|
|
737
|
-
|
|
738
|
-
|
|
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(
|
|
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(
|
|
766
|
-
fUnitAccumulatedFunding: ABK64x64ToFloat(
|
|
767
|
-
fOpenInterest: ABK64x64ToFloat(
|
|
768
|
-
fTargetAMMFundSize: ABK64x64ToFloat(
|
|
769
|
-
fCurrentTraderExposureEMA: ABK64x64ToFloat(
|
|
770
|
-
fCurrentFundingRate: ABK64x64ToFloat(
|
|
771
|
-
fLotSizeBC: ABK64x64ToFloat(
|
|
772
|
-
fReferralRebateCC: ABK64x64ToFloat(
|
|
773
|
-
fTargetDFSize: ABK64x64ToFloat(
|
|
774
|
-
fkStar: ABK64x64ToFloat(
|
|
775
|
-
fAMMTargetDD: ABK64x64ToFloat(
|
|
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(
|
|
778
|
-
fMinimalAMMExposureEMA: ABK64x64ToFloat(
|
|
779
|
-
fSettlementS3PriceData: ABK64x64ToFloat(
|
|
780
|
-
fSettlementS2PriceData: ABK64x64ToFloat(
|
|
781
|
-
fTotalMarginBalance: ABK64x64ToFloat(
|
|
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(
|
|
788
|
-
ABK64x64ToFloat(
|
|
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(
|
|
796
|
-
ABK64x64ToFloat(
|
|
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(
|
|
800
|
-
ABK64x64ToFloat(
|
|
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?:
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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]
|
|
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 =
|
|
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]
|
|
872
|
-
entryPrice = ABK64x64ToFloat(div64x64(fLockedIn, traderState[idx_notional])
|
|
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]
|
|
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]
|
|
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?:
|
|
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 [
|
|
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?:
|
|
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?:
|
|
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
|
|
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?:
|
|
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
|
|
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 (
|
|
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
|
|
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.
|
|
1073
|
+
target: orderBookSC.target,
|
|
1061
1074
|
allowFailure: true,
|
|
1062
1075
|
callData: orderBookSC.interface.encodeFunctionData("orderOfDigest", [id]),
|
|
1063
1076
|
}));
|
|
1064
|
-
const encodedResults = await multicall.
|
|
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?:
|
|
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.
|
|
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 [
|
|
1122
|
+
_pxS2S3s[i].map((x) => floatToABK64x64(x)) as [bigint, bigint],
|
|
1110
1123
|
]),
|
|
1111
1124
|
}));
|
|
1112
|
-
const encodedResults = await _multicall.
|
|
1113
|
-
const traderStates:
|
|
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?:
|
|
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 [
|
|
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?:
|
|
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?:
|
|
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 [
|
|
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:
|
|
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]
|
|
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:
|
|
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]
|
|
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
|
-
|
|
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
|
-
|
|
1328
|
-
let limitPrice, stopPrice;
|
|
1329
|
-
|
|
1330
|
-
if (fLimitPrice
|
|
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
|
|
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
|
-
|
|
1338
|
-
if (fStopPrice
|
|
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(
|
|
1347
|
-
quantity: Math.abs(ABK64x64ToFloat(
|
|
1348
|
-
reduceOnly: containsFlag(
|
|
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(
|
|
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 ?
|
|
1401
|
+
let brokerSig = order.brokerSignature == undefined ? "0x" : order.brokerSignature;
|
|
1383
1402
|
let perpetualId = PerpetualDataHandler.symbolToPerpetualId(order.symbol, perpStaticInfo);
|
|
1384
|
-
let fAmount:
|
|
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
|
-
|
|
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 :
|
|
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
|
-
|
|
1404
|
-
|
|
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
|
-
|
|
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:
|
|
1505
|
-
|
|
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 =
|
|
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):
|
|
1528
|
-
let flag:
|
|
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:
|
|
1704
|
-
return contract.interface.getFunction(functionName)
|
|
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):
|
|
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:
|
|
1899
|
+
fLimitPrice: order.fLimitPrice,
|
|
1873
1900
|
leverageTDR: +order.leverageTDR.toString(),
|
|
1874
1901
|
executionTimestamp: +order.executionTimestamp.toString(),
|
|
1875
|
-
flags: BigInt(
|
|
1902
|
+
flags: BigInt(order.flags),
|
|
1876
1903
|
iDeadline: +order.iDeadline.toString(),
|
|
1877
1904
|
brokerAddr: order.brokerAddr,
|
|
1878
|
-
fTriggerPrice:
|
|
1879
|
-
fAmount:
|
|
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
|
}
|