@d8x/perpetuals-sdk 0.1.12 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/dist/cjs/abi/testnet/IPerpetualManager.json +5215 -0
  2. package/dist/cjs/abi/testnet/LimitOrderBook.json +1075 -0
  3. package/dist/cjs/abi/zkevmTestnet/IPerpetualManager.json +5215 -0
  4. package/dist/cjs/abi/zkevmTestnet/LimitOrderBook.json +1075 -0
  5. package/dist/cjs/abi/zkevmTestnet/LimitOrderBookFactory.json +135 -0
  6. package/dist/cjs/accountTrade.js +441 -0
  7. package/dist/cjs/accountTrade.js.map +1 -0
  8. package/dist/{src → cjs}/brokerTool.js +31 -84
  9. package/dist/cjs/brokerTool.js.map +1 -0
  10. package/dist/cjs/config/defaultConfig.json +47 -0
  11. package/dist/cjs/config/mockSwap.json +4 -0
  12. package/dist/cjs/config/priceFeedConfig.json +104 -0
  13. package/dist/cjs/config/symbolList.json +13 -0
  14. package/dist/cjs/d8XMath.js.map +1 -0
  15. package/dist/cjs/index.js +29 -0
  16. package/dist/cjs/index.js.map +1 -0
  17. package/dist/cjs/liquidatorTool.js +287 -0
  18. package/dist/cjs/liquidatorTool.js.map +1 -0
  19. package/dist/{src → cjs}/liquidityProviderTool.js +12 -65
  20. package/dist/cjs/liquidityProviderTool.js.map +1 -0
  21. package/dist/{src → cjs}/marketData.js +52 -134
  22. package/dist/cjs/marketData.js.map +1 -0
  23. package/dist/{src → cjs}/nodeSDKTypes.d.ts +5 -5
  24. package/dist/cjs/nodeSDKTypes.js +64 -0
  25. package/dist/cjs/nodeSDKTypes.js.map +1 -0
  26. package/dist/{src → cjs}/orderReferrerTool.d.ts +12 -5
  27. package/dist/{src → cjs}/orderReferrerTool.js +114 -112
  28. package/dist/cjs/orderReferrerTool.js.map +1 -0
  29. package/dist/{src → cjs}/perpetualDataHandler.d.ts +1 -1
  30. package/dist/{src → cjs}/perpetualDataHandler.js +47 -109
  31. package/dist/cjs/perpetualDataHandler.js.map +1 -0
  32. package/dist/{src → cjs}/perpetualEventHandler.d.ts +3 -3
  33. package/dist/{src → cjs}/perpetualEventHandler.js +12 -74
  34. package/dist/cjs/perpetualEventHandler.js.map +1 -0
  35. package/dist/cjs/priceFeeds.js +466 -0
  36. package/dist/cjs/priceFeeds.js.map +1 -0
  37. package/dist/{src → cjs}/traderDigests.js +7 -43
  38. package/dist/cjs/traderDigests.js.map +1 -0
  39. package/dist/{src → cjs}/traderInterface.js +13 -66
  40. package/dist/cjs/traderInterface.js.map +1 -0
  41. package/dist/{src → cjs}/triangulator.js +2 -17
  42. package/dist/cjs/triangulator.js.map +1 -0
  43. package/dist/{src → cjs}/utils.js +3 -29
  44. package/dist/cjs/utils.js.map +1 -0
  45. package/dist/cjs/version.d.ts +1 -0
  46. package/dist/{src → cjs}/version.js +1 -1
  47. package/dist/cjs/version.js.map +1 -0
  48. package/dist/{src → cjs}/writeAccessHandler.js +12 -65
  49. package/dist/cjs/writeAccessHandler.js.map +1 -0
  50. package/dist/esm/abi/ERC20.json +288 -0
  51. package/dist/esm/abi/MockTokenSwap.json +186 -0
  52. package/dist/{abi/testnet → esm/abi/central-park}/IPerpetualManager.json +404 -214
  53. package/dist/{abi/testnet → esm/abi/central-park}/LimitOrderBook.json +197 -15
  54. package/dist/esm/abi/central-park/LimitOrderBookFactory.json +135 -0
  55. package/dist/esm/abi/testnet/IPerpetualManager.json +5215 -0
  56. package/dist/esm/abi/testnet/LimitOrderBook.json +1075 -0
  57. package/dist/esm/abi/testnet/LimitOrderBookFactory.json +135 -0
  58. package/dist/esm/abi/zkevmTestnet/IPerpetualManager.json +5215 -0
  59. package/dist/esm/abi/zkevmTestnet/LimitOrderBook.json +1075 -0
  60. package/dist/esm/abi/zkevmTestnet/LimitOrderBookFactory.json +135 -0
  61. package/dist/esm/accountTrade.d.ts +221 -0
  62. package/dist/{src → esm}/accountTrade.js +22 -93
  63. package/dist/esm/accountTrade.js.map +1 -0
  64. package/dist/esm/brokerTool.d.ts +318 -0
  65. package/dist/esm/brokerTool.js +572 -0
  66. package/dist/esm/brokerTool.js.map +1 -0
  67. package/dist/esm/config/defaultConfig.json +47 -0
  68. package/dist/esm/config/mockSwap.json +4 -0
  69. package/dist/esm/config/priceFeedConfig.json +104 -0
  70. package/dist/esm/config/symbolList.json +13 -0
  71. package/dist/esm/d8XMath.d.ts +122 -0
  72. package/dist/esm/d8XMath.js +247 -0
  73. package/dist/esm/d8XMath.js.map +1 -0
  74. package/{src/index.ts → dist/esm/index.d.ts} +1 -15
  75. package/dist/esm/index.js +16 -0
  76. package/dist/esm/index.js.map +1 -0
  77. package/dist/esm/liquidatorTool.d.ts +158 -0
  78. package/dist/{src → esm}/liquidatorTool.js +10 -65
  79. package/dist/esm/liquidatorTool.js.map +1 -0
  80. package/dist/esm/liquidityProviderTool.d.ts +126 -0
  81. package/dist/esm/liquidityProviderTool.js +218 -0
  82. package/dist/esm/liquidityProviderTool.js.map +1 -0
  83. package/dist/esm/marketData.d.ts +309 -0
  84. package/dist/esm/marketData.js +1007 -0
  85. package/dist/esm/marketData.js.map +1 -0
  86. package/dist/esm/nodeSDKTypes.d.ts +266 -0
  87. package/dist/esm/nodeSDKTypes.js +60 -0
  88. package/dist/esm/nodeSDKTypes.js.map +1 -0
  89. package/dist/esm/orderReferrerTool.d.ts +196 -0
  90. package/dist/esm/orderReferrerTool.js +491 -0
  91. package/dist/esm/orderReferrerTool.js.map +1 -0
  92. package/dist/esm/perpetualDataHandler.d.ts +220 -0
  93. package/dist/esm/perpetualDataHandler.js +1060 -0
  94. package/dist/esm/perpetualDataHandler.js.map +1 -0
  95. package/dist/esm/perpetualEventHandler.d.ts +179 -0
  96. package/dist/esm/perpetualEventHandler.js +435 -0
  97. package/dist/esm/perpetualEventHandler.js.map +1 -0
  98. package/dist/esm/priceFeeds.d.ts +115 -0
  99. package/dist/{src → esm}/priceFeeds.js +16 -83
  100. package/dist/esm/priceFeeds.js.map +1 -0
  101. package/dist/esm/traderDigests.d.ts +21 -0
  102. package/dist/esm/traderDigests.js +80 -0
  103. package/dist/esm/traderDigests.js.map +1 -0
  104. package/dist/esm/traderInterface.d.ts +79 -0
  105. package/dist/esm/traderInterface.js +196 -0
  106. package/dist/esm/traderInterface.js.map +1 -0
  107. package/dist/esm/triangulator.d.ts +27 -0
  108. package/dist/esm/triangulator.js +110 -0
  109. package/dist/esm/triangulator.js.map +1 -0
  110. package/dist/esm/utils.d.ts +59 -0
  111. package/dist/esm/utils.js +138 -0
  112. package/dist/esm/utils.js.map +1 -0
  113. package/dist/esm/version.d.ts +1 -0
  114. package/dist/esm/version.js +2 -0
  115. package/dist/esm/version.js.map +1 -0
  116. package/dist/esm/writeAccessHandler.d.ts +50 -0
  117. package/dist/esm/writeAccessHandler.js +157 -0
  118. package/dist/esm/writeAccessHandler.js.map +1 -0
  119. package/package.json +16 -26
  120. package/dist/bundle.js +0 -36793
  121. package/dist/config/defaultConfig.json +0 -47
  122. package/dist/config/mockSwap.json +0 -4
  123. package/dist/config/priceFeedConfig.json +0 -104
  124. package/dist/config/symbolList.json +0 -13
  125. package/dist/src/index.js +0 -45
  126. package/dist/src/nodeSDKTypes.js +0 -115
  127. package/dist/src/version.d.ts +0 -1
  128. package/module.d.ts +0 -1
  129. package/src/accountTrade.ts +0 -392
  130. package/src/brokerTool.ts +0 -507
  131. package/src/d8XMath.ts +0 -319
  132. package/src/liquidatorTool.ts +0 -258
  133. package/src/liquidityProviderTool.ts +0 -186
  134. package/src/marketData.ts +0 -946
  135. package/src/nodeSDKTypes.ts +0 -293
  136. package/src/orderReferrerTool.ts +0 -389
  137. package/src/perpetualDataHandler.ts +0 -1061
  138. package/src/perpetualEventHandler.ts +0 -455
  139. package/src/priceFeeds.ts +0 -381
  140. package/src/traderDigests.ts +0 -91
  141. package/src/traderInterface.ts +0 -159
  142. package/src/triangulator.ts +0 -105
  143. package/src/utils.ts +0 -134
  144. package/src/version.ts +0 -1
  145. package/src/writeAccessHandler.ts +0 -127
  146. /package/dist/{abi → cjs/abi}/ERC20.json +0 -0
  147. /package/dist/{abi → cjs/abi}/MockTokenSwap.json +0 -0
  148. /package/dist/{abi → cjs/abi}/central-park/IPerpetualManager.json +0 -0
  149. /package/dist/{abi → cjs/abi}/central-park/LimitOrderBook.json +0 -0
  150. /package/dist/{abi → cjs/abi}/central-park/LimitOrderBookFactory.json +0 -0
  151. /package/dist/{abi → cjs/abi}/testnet/LimitOrderBookFactory.json +0 -0
  152. /package/dist/{src → cjs}/accountTrade.d.ts +0 -0
  153. /package/dist/{src → cjs}/brokerTool.d.ts +0 -0
  154. /package/dist/{src → cjs}/d8XMath.d.ts +0 -0
  155. /package/dist/{src → cjs}/d8XMath.js +0 -0
  156. /package/dist/{src → cjs}/index.d.ts +0 -0
  157. /package/dist/{src → cjs}/liquidatorTool.d.ts +0 -0
  158. /package/dist/{src → cjs}/liquidityProviderTool.d.ts +0 -0
  159. /package/dist/{src → cjs}/marketData.d.ts +0 -0
  160. /package/dist/{src → cjs}/priceFeeds.d.ts +0 -0
  161. /package/dist/{src → cjs}/traderDigests.d.ts +0 -0
  162. /package/dist/{src → cjs}/traderInterface.d.ts +0 -0
  163. /package/dist/{src → cjs}/triangulator.d.ts +0 -0
  164. /package/dist/{src → cjs}/utils.d.ts +0 -0
  165. /package/dist/{src → cjs}/writeAccessHandler.d.ts +0 -0
@@ -1,293 +0,0 @@
1
- import { BigNumber, BigNumberish, BytesLike, constants, ContractTransaction, ContractInterface, Bytes } from "ethers";
2
-
3
- export const ERC20_ABI = require("../abi/ERC20.json");
4
- export const MOCK_TOKEN_SWAP_ABI = require("../abi/MockTokenSwap.json");
5
- export const SYMBOL_LIST = new Map<string, string>(Object.entries(require(`../config/symbolList.json`)));
6
- export const COLLATERAL_CURRENCY_QUOTE = 0;
7
- export const COLLATERAL_CURRENCY_BASE = 1;
8
- export const COLLATERAL_CURRENCY_QUANTO = 2;
9
- export const PERP_STATE_STR = ["INVALID", "INITIALIZING", "NORMAL", "EMERGENCY", "CLEARED"];
10
- export const ZERO_ADDRESS = constants.AddressZero;
11
- export const ZERO_ORDER_ID = constants.HashZero;
12
-
13
- export const ONE_64x64 = BigNumber.from("0x010000000000000000");
14
- export const MAX_64x64 = BigNumber.from("0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
15
- export const MAX_UINT_256 = BigNumber.from(2).pow(256).sub(BigNumber.from(1));
16
- export const DECIMALS = BigNumber.from(10).pow(BigNumber.from(18));
17
-
18
- export const ORDER_MAX_DURATION_SEC = 60 * 60 * 24 * 30 * 4;
19
-
20
- export const MASK_CLOSE_ONLY = BigNumber.from("0x80000000");
21
- export const MASK_LIMIT_ORDER = BigNumber.from("0x04000000");
22
- export const MASK_MARKET_ORDER = BigNumber.from("0x40000000");
23
- export const MASK_STOP_ORDER = BigNumber.from("0x20000000");
24
- export const MASK_KEEP_POS_LEVERAGE = BigNumber.from("0x08000000");
25
-
26
- export const ORDER_TYPE_LIMIT = "LIMIT";
27
- export const ORDER_TYPE_MARKET = "MARKET";
28
- export const ORDER_TYPE_STOP_MARKET = "STOP_MARKET";
29
- export const ORDER_TYPE_STOP_LIMIT = "STOP_LIMIT";
30
- export const BUY_SIDE = "BUY";
31
- export const SELL_SIDE = "SELL";
32
- export const CLOSED_SIDE = "CLOSED";
33
- export interface NodeSDKConfig {
34
- name: string | undefined;
35
- chainId: number;
36
- version: number;
37
- nodeURL: string;
38
- proxyAddr: string;
39
- proxyABILocation: string;
40
- limitOrderBookABILocation: string;
41
- limitOrderBookFactoryABILocation: string;
42
- symbolListLocation: string;
43
- priceFeedConfigNetwork: string;
44
- gasLimit?: number | undefined;
45
- proxyABI?: ContractInterface | undefined;
46
- lobFactoryABI?: ContractInterface | undefined;
47
- lobABI?: ContractInterface | undefined;
48
- }
49
-
50
- export interface MarginAccount {
51
- symbol: string;
52
- positionNotionalBaseCCY: number;
53
- side: string;
54
- entryPrice: number;
55
- leverage: number;
56
- markPrice: number;
57
- unrealizedPnlQuoteCCY: number;
58
- unrealizedFundingCollateralCCY: number;
59
- collateralCC: number;
60
- liquidationPrice: [number, number | undefined];
61
- liquidationLvg: number;
62
- collToQuoteConversion: number;
63
- }
64
-
65
- export enum CollaterlCCY {
66
- QUOTE = 0,
67
- BASE,
68
- QUANTO,
69
- }
70
-
71
- export interface PoolStaticInfo {
72
- poolId: number;
73
- poolMarginSymbol: string;
74
- poolMarginTokenAddr: string;
75
- shareTokenAddr: string;
76
- oracleFactoryAddr: string;
77
- }
78
-
79
- export interface PerpetualStaticInfo {
80
- id: number;
81
- limitOrderBookAddr: string;
82
- initialMarginRate: number;
83
- maintenanceMarginRate: number;
84
- collateralCurrencyType: CollaterlCCY;
85
- S2Symbol: string;
86
- S3Symbol: string;
87
- lotSizeBC: number;
88
- referralRebate: number;
89
- priceIds: string[];
90
- }
91
-
92
- /**
93
- * @global
94
- * @typedef {Object} ExchangeInfo
95
- * @property {PoolState[]} pools Array of state objects for all pools in the exchange.
96
- * @property {string} oracleFactoryAddr Address of the oracle factory used by the pools in the exchange.
97
- */
98
- export interface ExchangeInfo {
99
- pools: PoolState[];
100
- oracleFactoryAddr: string;
101
- proxyAddr: string;
102
- }
103
-
104
- /**
105
- * @global
106
- * @typedef {Object} PoolState
107
- * @property {boolean} isRunning True if the pool is running.
108
- * @property {string} marginTokenAddr Address of the token used by the pool.
109
- * This is the token used for margin deposits, liquidity provision, and trading fees.
110
- * @property {string} poolShareTokenAddr Address of the pool share token.
111
- * This is the token issued to external liquidity providers.
112
- * @property {number} defaultFundCashCC Amount of cash in the default fund of this pool, denominated in margin tokens.
113
- * @property {number} pnlParticipantCashCC Amount of cash in the PnL participation pool, i.e. cash deposited by external liquidity providers.
114
- * @property {number} totalAMMFundCashCC Amount of cash aggregated across all perpetual AMM funds in this pool.
115
- * @property {number} totalTargetAMMFundSizeCC Target AMM funds aggregated across all perpetuals in this pool.
116
- * @property {number} brokerCollateralLotSize Price of one lot for brokers who wish to participate in this pool. Denominated in margin tokens.
117
- * @property {PerpetualState[]} perpetuals Array of all perpetuals in this pool.
118
- */
119
- export interface PoolState {
120
- isRunning: boolean;
121
- poolSymbol: string;
122
- marginTokenAddr: string;
123
- poolShareTokenAddr: string;
124
- defaultFundCashCC: number;
125
- pnlParticipantCashCC: number;
126
- totalAMMFundCashCC: number;
127
- totalTargetAMMFundSizeCC: number;
128
- brokerCollateralLotSize: number;
129
- perpetuals: PerpetualState[];
130
- }
131
-
132
- export interface PerpetualState {
133
- id: number;
134
- state: string;
135
- baseCurrency: string;
136
- quoteCurrency: string;
137
- indexPrice: number;
138
- collToQuoteIndexPrice: number;
139
- markPrice: number;
140
- midPrice: number;
141
- currentFundingRateBps: number;
142
- openInterestBC: number;
143
- isMarketClosed: boolean;
144
- }
145
-
146
- export interface OrderResponse {
147
- tx: ContractTransaction;
148
- orderId: string;
149
- }
150
-
151
- export interface OrderStruct {
152
- orders: Order[];
153
- orderIds: string[];
154
- }
155
-
156
- export interface Order {
157
- symbol: string; //symbol of the form ETH-USD-MATIC
158
- side: string;
159
- type: string;
160
- quantity: number;
161
- reduceOnly?: boolean | undefined;
162
- limitPrice?: number | undefined;
163
- keepPositionLvg?: boolean | undefined;
164
- brokerFeeTbps?: number | undefined;
165
- brokerAddr?: string | undefined;
166
- brokerSignature?: BytesLike | undefined;
167
- stopPrice?: number | undefined;
168
- leverage?: number | undefined;
169
- deadline?: number | undefined;
170
- timestamp: number;
171
- submittedBlock?: number;
172
- parentChildOrderIds?: [string, string];
173
- }
174
-
175
- export interface TradeEvent {
176
- perpetualId: number;
177
- positionId: string;
178
- orderId: string;
179
- newPositionSizeBC: number;
180
- executionPrice: number;
181
- }
182
-
183
- /**
184
- * struct Order {
185
- uint32 flags;
186
- uint24 iPerpetualId;
187
- uint16 brokerFeeTbps;
188
- address traderAddr;
189
- address brokerAddr;
190
- address referrerAddr;
191
- bytes brokerSignature;
192
- int128 fAmount;
193
- int128 fLimitPrice;
194
- int128 fTriggerPrice;
195
- int128 fLeverage; // 0 if deposit and trade separate
196
- uint64 iDeadline;
197
- uint64 createdTimestamp;
198
- uint64 submittedBlock;
199
- }
200
- */
201
- export interface SmartContractOrder {
202
- flags: BigNumberish;
203
- iPerpetualId: BigNumberish;
204
- brokerFeeTbps: BigNumberish;
205
- traderAddr: string;
206
- brokerAddr: string;
207
- referrerAddr: string;
208
- brokerSignature: BytesLike;
209
- fAmount: BigNumberish;
210
- fLimitPrice: BigNumberish;
211
- fTriggerPrice: BigNumberish;
212
- fLeverage: BigNumberish;
213
- iDeadline: BigNumberish;
214
- createdTimestamp: BigNumberish;
215
- submittedBlock: BigNumberish;
216
- }
217
-
218
- /**
219
- * struct ClientOrder {
220
- uint32 flags;
221
- uint24 iPerpetualId;
222
- uint16 brokerFeeTbps;
223
- address traderAddr;
224
- address brokerAddr;
225
- address referrerAddr;
226
- bytes brokerSignature;
227
- int128 fAmount;
228
- int128 fLimitPrice;
229
- int128 fTriggerPrice;
230
- int128 fLeverage; // 0 if deposit and trade separate
231
- uint64 iDeadline;
232
- uint64 createdTimestamp;
233
- //uint64 submittedBlock <- will be set by LimitOrderBook
234
- bytes32 parentChildDigest1;
235
- bytes32 parentChildDigest2;
236
- }
237
- */
238
- export interface ClientOrder {
239
- flags: BigNumberish;
240
- iPerpetualId: BigNumberish;
241
- brokerFeeTbps: BigNumberish;
242
- traderAddr: string;
243
- brokerAddr: string;
244
- referrerAddr: string;
245
- brokerSignature: BytesLike;
246
- fAmount: BigNumberish;
247
- fLimitPrice: BigNumberish;
248
- fTriggerPrice: BigNumberish;
249
- fLeverage: BigNumberish;
250
- iDeadline: BigNumberish;
251
- createdTimestamp: BigNumberish;
252
- parentChildDigest1: string;
253
- parentChildDigest2: string;
254
- }
255
-
256
- export interface PriceFeedConfig {
257
- network: string;
258
- ids: Array<{ symbol: string; id: string; type: string; origin: string }>;
259
- endpoints: Array<{ type: string; endpoint: string }>;
260
- }
261
-
262
- export interface PriceFeedSubmission {
263
- symbols: string[];
264
- priceFeedVaas: string[];
265
- prices: number[];
266
- isMarketClosed: boolean[];
267
- timestamps: number[];
268
- }
269
-
270
- export interface PriceFeedFormat {
271
- conf: BigNumber;
272
- expo: number;
273
- price: BigNumber;
274
- publish_time: number;
275
- }
276
-
277
- export const DEFAULT_CONFIG_MAINNET_NAME = "mainnet";
278
- export const DEFAULT_CONFIG_TESTNET_NAME = "central-park";
279
-
280
- export async function loadABIs(config: NodeSDKConfig) {
281
- if (config.proxyABILocation.length > 0) {
282
- config.proxyABI = require(`../abi/${config.proxyABILocation}`);
283
- config.lobFactoryABI = require(`../abi/${config.limitOrderBookFactoryABILocation}`);
284
- config.lobABI = require(`../abi/${config.limitOrderBookABILocation}`);
285
- }
286
- }
287
-
288
- const constConfig = require("../config/defaultConfig.json");
289
- for (let config of constConfig) {
290
- loadABIs(config);
291
- }
292
-
293
- export const DEFAULT_CONFIG: NodeSDKConfig[] = constConfig;
@@ -1,389 +0,0 @@
1
- import { BigNumber, ethers } from "ethers";
2
- import {
3
- BUY_SIDE,
4
- NodeSDKConfig,
5
- Order,
6
- PerpetualStaticInfo,
7
- SELL_SIDE,
8
- ZERO_ADDRESS,
9
- ZERO_ORDER_ID,
10
- PriceFeedSubmission,
11
- ClientOrder,
12
- SmartContractOrder,
13
- } from "./nodeSDKTypes";
14
- import PerpetualDataHandler from "./perpetualDataHandler";
15
- import WriteAccessHandler from "./writeAccessHandler";
16
-
17
- /**
18
- * Functions to execute existing conditional orders from the limit order book. This class
19
- * requires a private key and executes smart-contract interactions that require
20
- * gas-payments.
21
- * @extends WriteAccessHandler
22
- */
23
- export default class OrderReferrerTool extends WriteAccessHandler {
24
- static BLOCK_DELAY = 2;
25
- /**
26
- * Constructor.
27
- * @param {NodeSDKConfig} config Configuration object, see PerpetualDataHandler.readSDKConfig.
28
- * @example
29
- * import { OrderReferrerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
30
- * async function main() {
31
- * console.log(OrderReferrerTool);
32
- * // load configuration for testnet
33
- * const config = PerpetualDataHandler.readSDKConfig("testnet");
34
- * // OrderReferrerTool (authentication required, PK is an environment variable with a private key)
35
- * const pk: string = <string>process.env.PK;
36
- * let orderTool = new OrderReferrerTool(config, pk);
37
- * // Create a proxy instance to access the blockchain
38
- * await orderTool.createProxyInstance();
39
- * }
40
- * main();
41
- *
42
- * @param {string} privateKey Private key of the wallet that executes the conditional orders.
43
- */
44
- public constructor(config: NodeSDKConfig, privateKey: string) {
45
- super(config, privateKey);
46
- }
47
-
48
- /**
49
- * Executes an order by symbol and ID. This action interacts with the blockchain and incurs gas costs.
50
- * @param {string} symbol Symbol of the form ETH-USD-MATIC.
51
- * @param {string} orderId ID of the order to be executed.
52
- * @param {string=} referrerAddr optional address of the wallet to be credited for executing the order, if different from the one submitting this transaction.
53
- * @param {number=} nonce optional nonce
54
- * @param {PriceFeedSubmission=} submission optional signed prices obtained via PriceFeeds::fetchLatestFeedPriceInfoForPerpetual
55
- * @example
56
- * import { OrderReferrerTool, PerpetualDataHandler, Order } from "@d8x/perpetuals-sdk";
57
- * async function main() {
58
- * console.log(OrderReferrerTool);
59
- * // Setup (authentication required, PK is an environment variable with a private key)
60
- * const config = PerpetualDataHandler.readSDKConfig("testnet");
61
- * const pk: string = <string>process.env.PK;
62
- * const symbol = "ETH-USD-MATIC";
63
- * let orderTool = new OrderReferrerTool(config, pk);
64
- * await orderTool.createProxyInstance();
65
- * // get some open orders
66
- * const maxOrdersToGet = 5;
67
- * let [orders, ids]: [Order[], string[]] = await orderTool.pollLimitOrders(symbol, maxOrdersToGet);
68
- * console.log(`Got ${ids.length} orders`);
69
- * for (let k = 0; k < ids.length; k++) {
70
- * // check whether order meets conditions
71
- * let doExecute = await orderTool.isTradeable(orders[k]);
72
- * if (doExecute) {
73
- * // execute
74
- * let tx = await orderTool.executeOrder(symbol, ids[k]);
75
- * console.log(`Sent order id ${ids[k]} for execution, tx hash = ${tx.hash}`);
76
- * }
77
- * }
78
- * }
79
- * main();
80
- * @returns Transaction object.
81
- */
82
- public async executeOrder(
83
- symbol: string,
84
- orderId: string,
85
- referrerAddr?: string,
86
- nonce?: number,
87
- submission?: PriceFeedSubmission
88
- ): Promise<ethers.ContractTransaction> {
89
- if (this.proxyContract == null || this.signer == null) {
90
- throw Error("no proxy contract or wallet initialized. Use createProxyInstance().");
91
- }
92
- const orderBookSC = this.getOrderBookContract(symbol);
93
- if (typeof referrerAddr == "undefined") {
94
- referrerAddr = this.traderAddr;
95
- }
96
- if (submission == undefined) {
97
- submission = await this.priceFeedGetter.fetchLatestFeedPriceInfoForPerpetual(symbol);
98
- }
99
- const options = {
100
- gasLimit: this.gasLimit,
101
- nonce: nonce,
102
- value: this.PRICE_UPDATE_FEE_GWEI * submission?.priceFeedVaas.length,
103
- };
104
- return await orderBookSC.executeOrder(
105
- orderId,
106
- referrerAddr,
107
- submission?.priceFeedVaas,
108
- submission?.timestamps,
109
- options
110
- );
111
- }
112
-
113
- /**
114
- * All the orders in the order book for a given symbol that are currently open.
115
- * @param {string} symbol Symbol of the form ETH-USD-MATIC.
116
- * @example
117
- * import { OrderReferrerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
118
- * async function main() {
119
- * console.log(OrderReferrerTool);
120
- * // setup (authentication required, PK is an environment variable with a private key)
121
- * const config = PerpetualDataHandler.readSDKConfig("testnet");
122
- * const pk: string = <string>process.env.PK;
123
- * let orderTool = new OrderReferrerTool(config, pk);
124
- * await orderTool.createProxyInstance();
125
- * // get all open orders
126
- * let openOrders = await orderTool.getAllOpenOrders("ETH-USD-MATIC");
127
- * console.log(openOrders);
128
- * }
129
- * main();
130
- *
131
- * @returns Array with all open orders and their IDs.
132
- */
133
- public async getAllOpenOrders(symbol: string): Promise<[Order[], string[]]> {
134
- let totalOrders = await this.numberOfOpenOrders(symbol);
135
- return await this.pollLimitOrders(symbol, totalOrders);
136
- }
137
-
138
- /**
139
- * Total number of limit orders for this symbol, excluding those that have been cancelled/removed.
140
- * @param {string} symbol Symbol of the form ETH-USD-MATIC.
141
- * @example
142
- * import { OrderReferrerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
143
- * async function main() {
144
- * console.log(OrderReferrerTool);
145
- * // setup (authentication required, PK is an environment variable with a private key)
146
- * const config = PerpetualDataHandler.readSDKConfig("testnet");
147
- * const pk: string = <string>process.env.PK;
148
- * let orderTool = new OrderReferrerTool(config, pk);
149
- * await orderTool.createProxyInstance();
150
- * // get all open orders
151
- * let numberOfOrders = await orderTool.numberOfOpenOrders("ETH-USD-MATIC");
152
- * console.log(numberOfOrders);
153
- * }
154
- * main();
155
- *
156
- * @returns {number} Number of open orders.
157
- */
158
- public async numberOfOpenOrders(symbol: string): Promise<number> {
159
- if (this.proxyContract == null) {
160
- throw Error("no proxy contract initialized. Use createProxyInstance().");
161
- }
162
- const orderBookSC = this.getOrderBookContract(symbol);
163
- let numOrders = await orderBookSC.numberOfOrderBookDigests();
164
- return Number(numOrders);
165
- }
166
-
167
- /**
168
- * Get order from the digest (=id)
169
- * @param symbol symbol of order book, e.g. ETH-USD-MATIC
170
- * @param digest digest of the order (=order ID)
171
- * @example
172
- * import { OrderReferrerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
173
- * async function main() {
174
- * console.log(OrderReferrerTool);
175
- * // setup (authentication required, PK is an environment variable with a private key)
176
- * const config = PerpetualDataHandler.readSDKConfig("testnet");
177
- * const pk: string = <string>process.env.PK;
178
- * let orderTool = new OrderReferrerTool(config, pk);
179
- * await orderTool.createProxyInstance();
180
- * // get order by ID
181
- * let myorder = await orderTool.getOrderById("MATIC-USD-MATIC",
182
- * "0x0091a1d878491479afd09448966c1403e9d8753122e25260d3b2b9688d946eae");
183
- * console.log(myorder);
184
- * }
185
- * main();
186
- *
187
- * @returns order or undefined
188
- */
189
- public async getOrderById(symbol: string, id: string): Promise<Order | undefined> {
190
- let ob = await this.getOrderBookContract(symbol);
191
- let smartContractOrder: SmartContractOrder = await ob.orderOfDigest(id);
192
- if (smartContractOrder.traderAddr == ZERO_ADDRESS) {
193
- return undefined;
194
- }
195
- let order = OrderReferrerTool.fromSmartContractOrder(smartContractOrder, this.symbolToPerpStaticInfo);
196
- return order;
197
- }
198
-
199
- /**
200
- * Get a list of active conditional orders in the order book.
201
- * This a read-only action and does not incur in gas costs.
202
- * @param {string} symbol Symbol of the form ETH-USD-MATIC.
203
- * @param {number} numElements Maximum number of orders to poll.
204
- * @param {string=} startAfter Optional order ID from where to start polling. Defaults to the first order.
205
- * @example
206
- * import { OrderReferrerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
207
- * async function main() {
208
- * console.log(OrderReferrerTool);
209
- * // setup (authentication required, PK is an environment variable with a private key)
210
- * const config = PerpetualDataHandler.readSDKConfig("testnet");
211
- * const pk: string = <string>process.env.PK;
212
- * let orderTool = new OrderReferrerTool(config, pk);
213
- * await orderTool.createProxyInstance();
214
- * // get all open orders
215
- * let activeOrders = await orderTool.pollLimitOrders("ETH-USD-MATIC", 2);
216
- * console.log(activeOrders);
217
- * }
218
- * main();
219
- *
220
- * @returns Array of orders and corresponding order IDs
221
- */
222
- public async pollLimitOrders(symbol: string, numElements: number, startAfter?: string): Promise<[Order[], string[]]> {
223
- if (this.proxyContract == null) {
224
- throw Error("no proxy contract initialized. Use createProxyInstance().");
225
- }
226
- const orderBookSC = this.getOrderBookContract(symbol);
227
- if (typeof startAfter == "undefined") {
228
- startAfter = ZERO_ORDER_ID;
229
- }
230
- let orders: ClientOrder[];
231
- let orderIds: string[];
232
- [orders, orderIds] = await orderBookSC.pollLimitOrders(startAfter, BigNumber.from(numElements));
233
- let userFriendlyOrders: Order[] = new Array<Order>();
234
- let orderIdsOut = [];
235
- let k = 0;
236
- while (k < orders.length && orders[k].traderAddr != ZERO_ADDRESS) {
237
- userFriendlyOrders.push(WriteAccessHandler.fromClientOrder(orders[k], this.symbolToPerpStaticInfo));
238
- orderIdsOut.push(orderIds[k]);
239
- k++;
240
- }
241
- return [userFriendlyOrders, orderIdsOut];
242
- }
243
-
244
- /**
245
- * Check if a conditional order can be executed
246
- * @param order order structure
247
- * @param indexPrices pair of index prices S2 and S3. S3 set to zero if not required. If undefined
248
- * the function will fetch the latest prices from the REST API
249
- * @example
250
- * import { OrderReferrerTool, PerpetualDataHandler } from '@d8x/perpetuals-sdk';
251
- * async function main() {
252
- * console.log(OrderReferrerTool);
253
- * // setup (authentication required, PK is an environment variable with a private key)
254
- * const config = PerpetualDataHandler.readSDKConfig("testnet");
255
- * const pk: string = <string>process.env.PK;
256
- * let orderTool = new OrderReferrerTool(config, pk);
257
- * await orderTool.createProxyInstance();
258
- * // check if tradeable
259
- * let openOrders = await orderTool.getAllOpenOrders("MATIC-USD-MATIC");
260
- * let check = await orderTool.isTradeable(openOrders[0][0]);
261
- * console.log(check);
262
- * }
263
- * main();
264
- * @returns true if order can be executed for the current state of the perpetuals
265
- */
266
- public async isTradeable(order: Order, indexPrices?: [number, number]): Promise<boolean> {
267
- if (this.proxyContract == null) {
268
- throw Error("no proxy contract initialized. Use createProxyInstance().");
269
- }
270
- if (indexPrices == undefined) {
271
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(order.symbol);
272
- indexPrices = [obj.idxPrices[0], obj.idxPrices[1]];
273
- }
274
- let orderPrice = await PerpetualDataHandler._queryPerpetualPrice(
275
- order.symbol,
276
- order.quantity,
277
- this.symbolToPerpStaticInfo,
278
- this.proxyContract,
279
- indexPrices
280
- );
281
- let markPrice = await PerpetualDataHandler._queryPerpetualMarkPrice(
282
- order.symbol,
283
- this.symbolToPerpStaticInfo,
284
- this.proxyContract,
285
- indexPrices
286
- );
287
- let block = await this.provider!.getBlockNumber();
288
- return OrderReferrerTool._isTradeable(order, orderPrice, markPrice, block, this.symbolToPerpStaticInfo);
289
- }
290
-
291
- /**
292
- * Check for a batch of orders on the same perpetual whether they can be traded
293
- * @param orders orders belonging to 1 perpetual
294
- * @param indexPrice S2,S3-index prices for the given perpetual. Will fetch prices from REST API
295
- * if not defined.
296
- * @returns array of tradeable boolean
297
- */
298
- public async isTradeableBatch(orders: Order[], indexPrices?: [number, number, boolean, boolean]): Promise<boolean[]> {
299
- if (orders.length == 0) {
300
- return [];
301
- }
302
- if (this.proxyContract == null) {
303
- throw Error("no proxy contract initialized. Use createProxyInstance().");
304
- }
305
- if (orders.filter((o) => o.symbol == orders[0].symbol).length < orders.length) {
306
- throw Error("all orders in a batch must have the same symbol");
307
- }
308
- if (indexPrices == undefined) {
309
- let obj = await this.priceFeedGetter.fetchPricesForPerpetual(orders[0].symbol);
310
- indexPrices = [obj.idxPrices[0], obj.idxPrices[1], obj.mktClosed[0], obj.mktClosed[1]];
311
- }
312
- if (indexPrices[2] || indexPrices[3]) {
313
- // market closed
314
- return orders.map((o) => false);
315
- }
316
-
317
- let orderPrice = await Promise.all(
318
- orders.map((o) =>
319
- PerpetualDataHandler._queryPerpetualPrice(
320
- o.symbol,
321
- o.quantity,
322
- this.symbolToPerpStaticInfo,
323
- this.proxyContract!,
324
- [indexPrices![0], indexPrices![1]]
325
- )
326
- )
327
- );
328
- let markPrice = await PerpetualDataHandler._queryPerpetualMarkPrice(
329
- orders[0].symbol,
330
- this.symbolToPerpStaticInfo,
331
- this.proxyContract,
332
- [indexPrices![0], indexPrices![1]]
333
- );
334
- let block = await this.provider!.getBlockNumber();
335
- return orders.map((o, idx) =>
336
- OrderReferrerTool._isTradeable(o, orderPrice[idx], markPrice, block, this.symbolToPerpStaticInfo)
337
- );
338
- }
339
-
340
- public static _isTradeable(
341
- order: Order,
342
- tradePrice: number,
343
- markPrice: number,
344
- block: number,
345
- symbolToPerpInfoMap: Map<string, PerpetualStaticInfo>
346
- ): boolean {
347
- // check expiration date
348
- if (order.deadline != undefined && order.deadline < Date.now() / 1000) {
349
- return false;
350
- }
351
-
352
- if (order.submittedBlock == undefined || order.submittedBlock + this.BLOCK_DELAY > block) {
353
- return false;
354
- }
355
-
356
- // check order size
357
- if (order.quantity < PerpetualDataHandler._getLotSize(order.symbol, symbolToPerpInfoMap)) {
358
- return false;
359
- }
360
- // check limit price: fromSmartContractOrder will set it to undefined when not tradeable
361
- if (order.limitPrice == undefined) {
362
- return false;
363
- }
364
- let limitPrice = order.limitPrice!;
365
- if ((order.side == BUY_SIDE && tradePrice > limitPrice) || (order.side == SELL_SIDE && tradePrice < limitPrice)) {
366
- return false;
367
- }
368
- // do we need to check trigger/stop?
369
- if (order.stopPrice == undefined) {
370
- // nothing to check, order is tradeable
371
- return true;
372
- }
373
- if (
374
- (order.side == BUY_SIDE && markPrice < order.stopPrice) ||
375
- (order.side == SELL_SIDE && markPrice > order.stopPrice)
376
- ) {
377
- return false;
378
- }
379
- // all checks passed -> order is tradeable
380
- return true;
381
- }
382
-
383
- public async getTransactionCount(blockTag?: ethers.providers.BlockTag): Promise<number> {
384
- if (this.signer == null) {
385
- throw Error("no wallet initialized. Use createProxyInstance().");
386
- }
387
- return await this.signer.getTransactionCount(blockTag);
388
- }
389
- }