@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.
- 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/constants.d.ts +11 -12
- package/dist/cjs/constants.js +12 -13
- 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 +16 -16
- package/dist/cjs/d8XMath.js +48 -49
- 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 +54 -63
- package/dist/cjs/orderExecutorTool.js.map +1 -1
- package/dist/cjs/perpetualDataHandler.d.ts +38 -35
- package/dist/cjs/perpetualDataHandler.js +173 -167
- 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/priceFeeds.js +2 -3
- 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 +26 -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/constants.d.ts +11 -12
- package/dist/esm/constants.js +12 -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 +16 -16
- package/dist/esm/d8XMath.js +48 -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 +40 -49
- package/dist/esm/orderExecutorTool.js.map +1 -1
- package/dist/esm/perpetualDataHandler.d.ts +38 -35
- package/dist/esm/perpetualDataHandler.js +114 -108
- 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/priceFeeds.js +2 -3
- 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 +26 -23
- 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/constants.ts +12 -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 +57 -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 +102 -109
- package/src/perpetualDataHandler.ts +181 -167
- package/src/perpetualEventHandler.ts +16 -17
- package/src/priceFeeds.ts +2 -3
- package/src/referralCodeSigner.ts +6 -10
- package/src/traderDigests.ts +8 -5
- package/src/traderInterface.ts +45 -31
- 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,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 {
|
|
44
|
-
import {
|
|
45
|
-
|
|
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:
|
|
106
|
+
public chainId: bigint;
|
|
107
|
+
public network: Network;
|
|
103
108
|
protected proxyContract: Contract | null = null;
|
|
104
|
-
protected proxyABI:
|
|
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:
|
|
115
|
+
protected lobFactoryABI: Interface;
|
|
111
116
|
protected lobFactoryAddr: string | undefined;
|
|
112
|
-
protected lobABI:
|
|
117
|
+
protected lobABI: Interface;
|
|
113
118
|
// share token
|
|
114
|
-
protected shareTokenABI:
|
|
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?:
|
|
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
|
|
161
|
-
network = await signerOrProvider.provider
|
|
166
|
+
if (signerOrProvider.provider) {
|
|
167
|
+
network = await signerOrProvider.provider.getNetwork();
|
|
162
168
|
} else {
|
|
163
|
-
|
|
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,
|
|
188
|
+
public getOrderBookContract(symbol: string, signerOrProvider?: Signer | Provider): LimitOrderBook {
|
|
183
189
|
let orderBookAddr = this.symbolToPerpStaticInfo.get(symbol)?.limitOrderBookAddr;
|
|
184
|
-
if (orderBookAddr == "" || orderBookAddr == undefined
|
|
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,
|
|
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?:
|
|
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?:
|
|
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 =
|
|
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.
|
|
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
|
|
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] !=
|
|
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
|
|
396
|
-
if (
|
|
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?:
|
|
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(
|
|
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?:
|
|
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
|
|
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(
|
|
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(
|
|
712
|
+
fRedemptionRate: ABK64x64ToFloat(BigInt(orig.fRedemptionRate)), // state: used for settlement in case of AMM default
|
|
707
713
|
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(
|
|
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?:
|
|
741
|
+
overrides?: Overrides
|
|
736
742
|
): Promise<PerpetualData[]> {
|
|
737
|
-
|
|
738
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
778
|
-
fMinimalAMMExposureEMA: ABK64x64ToFloat(
|
|
779
|
-
fSettlementS3PriceData: ABK64x64ToFloat(
|
|
780
|
-
fSettlementS2PriceData: ABK64x64ToFloat(
|
|
781
|
-
fTotalMarginBalance: ABK64x64ToFloat(
|
|
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(
|
|
788
|
-
ABK64x64ToFloat(
|
|
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(
|
|
796
|
-
ABK64x64ToFloat(
|
|
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(
|
|
800
|
-
ABK64x64ToFloat(
|
|
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?:
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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]
|
|
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 =
|
|
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]
|
|
872
|
-
entryPrice = ABK64x64ToFloat(div64x64(fLockedIn, traderState[idx_notional])
|
|
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]
|
|
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]
|
|
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?:
|
|
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 [
|
|
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?:
|
|
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?:
|
|
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
|
|
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?:
|
|
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
|
|
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 (
|
|
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
|
|
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.
|
|
1070
|
+
target: orderBookSC.target,
|
|
1061
1071
|
allowFailure: true,
|
|
1062
1072
|
callData: orderBookSC.interface.encodeFunctionData("orderOfDigest", [id]),
|
|
1063
1073
|
}));
|
|
1064
|
-
const encodedResults = await multicall.
|
|
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?:
|
|
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.
|
|
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 [
|
|
1119
|
+
_pxS2S3s[i].map((x) => floatToABK64x64(x)) as [bigint, bigint],
|
|
1110
1120
|
]),
|
|
1111
1121
|
}));
|
|
1112
|
-
const encodedResults = await _multicall.
|
|
1113
|
-
const traderStates:
|
|
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?:
|
|
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 [
|
|
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?:
|
|
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?:
|
|
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 [
|
|
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:
|
|
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]
|
|
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:
|
|
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]
|
|
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 >
|
|
1337
|
+
let side = order.fAmount > BigInt(0) ? BUY_SIDE : SELL_SIDE;
|
|
1328
1338
|
let limitPrice, stopPrice;
|
|
1329
|
-
let fLimitPrice:
|
|
1330
|
-
if (fLimitPrice
|
|
1339
|
+
let fLimitPrice: bigint | undefined = BigInt(order.fLimitPrice);
|
|
1340
|
+
if (fLimitPrice == 0n) {
|
|
1331
1341
|
limitPrice = side == BUY_SIDE ? undefined : 0;
|
|
1332
|
-
} else if (fLimitPrice
|
|
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:
|
|
1338
|
-
if (fStopPrice
|
|
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(
|
|
1347
|
-
quantity: Math.abs(ABK64x64ToFloat(
|
|
1348
|
-
reduceOnly: containsFlag(
|
|
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(
|
|
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 ?
|
|
1392
|
+
let brokerSig = order.brokerSignature == undefined ? "0x" : order.brokerSignature;
|
|
1383
1393
|
let perpetualId = PerpetualDataHandler.symbolToPerpetualId(order.symbol, perpStaticInfo);
|
|
1384
|
-
let fAmount:
|
|
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:
|
|
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 :
|
|
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 ?
|
|
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:
|
|
1505
|
-
|
|
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 =
|
|
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):
|
|
1528
|
-
let flag:
|
|
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:
|
|
1704
|
-
return contract.interface.getFunction(functionName)
|
|
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):
|
|
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:
|
|
1886
|
+
fLimitPrice: order.fLimitPrice,
|
|
1873
1887
|
leverageTDR: +order.leverageTDR.toString(),
|
|
1874
1888
|
executionTimestamp: +order.executionTimestamp.toString(),
|
|
1875
|
-
flags: BigInt(
|
|
1889
|
+
flags: BigInt(order.flags),
|
|
1876
1890
|
iDeadline: +order.iDeadline.toString(),
|
|
1877
1891
|
brokerAddr: order.brokerAddr,
|
|
1878
|
-
fTriggerPrice:
|
|
1879
|
-
fAmount:
|
|
1892
|
+
fTriggerPrice: order.fTriggerPrice,
|
|
1893
|
+
fAmount: order.fAmount,
|
|
1880
1894
|
parentChildDigest1: order.parentChildDigest1,
|
|
1881
1895
|
traderAddr: order.traderAddr,
|
|
1882
1896
|
parentChildDigest2: order.parentChildDigest2,
|