@reyaxyz/api-sdk 0.104.0 → 0.104.1
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/clients/modules/conditional-orders/index.js +90 -30
- package/dist/clients/modules/conditional-orders/index.js.map +1 -1
- package/dist/clients/modules/conditional-orders/types.js.map +1 -1
- package/dist/types/clients/modules/conditional-orders/index.d.ts +3 -1
- package/dist/types/clients/modules/conditional-orders/index.d.ts.map +1 -1
- package/dist/types/clients/modules/conditional-orders/types.d.ts +13 -7
- package/dist/types/clients/modules/conditional-orders/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/clients/modules/conditional-orders/index.ts +114 -45
- package/src/clients/modules/conditional-orders/types.ts +15 -7
|
@@ -61,6 +61,23 @@ var ConditionalOrdersClient = /** @class */ (function (_super) {
|
|
|
61
61
|
_this.reyaChainId = reyaChainId;
|
|
62
62
|
return _this;
|
|
63
63
|
}
|
|
64
|
+
ConditionalOrdersClient.prototype.alreadyGaveTradePermissions = function (params) {
|
|
65
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
66
|
+
var uri, response;
|
|
67
|
+
return __generator(this, function (_a) {
|
|
68
|
+
switch (_a.label) {
|
|
69
|
+
case 0:
|
|
70
|
+
uri = "/api/conditional-orders/gave-trade-permission/".concat(params.accountId);
|
|
71
|
+
return [4 /*yield*/, this.get(uri)];
|
|
72
|
+
case 1:
|
|
73
|
+
response = _a.sent();
|
|
74
|
+
return [2 /*return*/, {
|
|
75
|
+
permissionGiven: response,
|
|
76
|
+
}];
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
};
|
|
64
81
|
ConditionalOrdersClient.prototype.getPendingSLOrder = function (params) {
|
|
65
82
|
return __awaiter(this, void 0, void 0, function () {
|
|
66
83
|
var uri, response;
|
|
@@ -100,44 +117,32 @@ var ConditionalOrdersClient = /** @class */ (function (_super) {
|
|
|
100
117
|
};
|
|
101
118
|
ConditionalOrdersClient.prototype.registerSLOrder = function (params) {
|
|
102
119
|
return __awaiter(this, void 0, void 0, function () {
|
|
103
|
-
var
|
|
120
|
+
var inputs, uri, _a, _b;
|
|
104
121
|
var _c;
|
|
105
122
|
return __generator(this, function (_d) {
|
|
106
123
|
switch (_d.label) {
|
|
107
|
-
case 0: return [4 /*yield*/, this.
|
|
124
|
+
case 0: return [4 /*yield*/, this.parseSlOrderInputs(params.signer, params.marginAccountId, params.marketId, params.stopLossPrice, params.supportingParams.exchangeId, params.supportingParams.counterpartyAccountIds)];
|
|
108
125
|
case 1:
|
|
109
|
-
|
|
110
|
-
positionBase = position.base;
|
|
111
|
-
if (positionBase === 0) {
|
|
112
|
-
throw new Error('Position with no exposure');
|
|
113
|
-
}
|
|
114
|
-
orderPriceLimit = Number((0, common_1.calculateMaxPriceLimit)(positionBase < 0));
|
|
115
|
-
inputs = ethers_1.AbiCoder.defaultAbiCoder().encode(['uint256', 'uint256'], [(0, common_1.scale)(18)(params.stopLossPrice), orderPriceLimit]);
|
|
116
|
-
creationTimestampMs = Date.now();
|
|
117
|
-
nonce = this.createNonce(params.marginAccountId, params.market.id, creationTimestampMs);
|
|
118
|
-
deadline = Math.pow(10, 18);
|
|
119
|
-
return [4 /*yield*/, (0, common_1.signConditionalOrder)(params.signer, this.reyaChainId, params.marginAccountId, params.market.id, params.market.exchangeId, params.market.counterpartyAccountIds, types_1.ConditionalOrderType.StopLoss, inputs, nonce, deadline)];
|
|
120
|
-
case 2:
|
|
121
|
-
signature = _d.sent();
|
|
126
|
+
inputs = _d.sent();
|
|
122
127
|
uri = "/api/conditional-orders/sl/create-order";
|
|
123
128
|
_a = this.post;
|
|
124
129
|
_b = [uri,
|
|
125
130
|
{}];
|
|
126
131
|
_c = {
|
|
127
132
|
accountId: params.marginAccountId,
|
|
128
|
-
marketId: params.
|
|
129
|
-
isLong: positionBase > 0,
|
|
133
|
+
marketId: params.marketId,
|
|
134
|
+
isLong: inputs.positionBase > 0,
|
|
130
135
|
stopPrice: params.stopLossPrice
|
|
131
136
|
};
|
|
132
137
|
return [4 /*yield*/, params.signer.getAddress()];
|
|
133
|
-
case
|
|
134
|
-
_c.nonce = nonce,
|
|
135
|
-
_c.signature = signature,
|
|
136
|
-
_c.deadline = deadline,
|
|
137
|
-
_c.orderPriceLimit = orderPriceLimit,
|
|
138
|
-
_c.exchangeId = params.
|
|
139
|
-
_c.poolId = params.
|
|
140
|
-
_c.timestampMs = creationTimestampMs,
|
|
138
|
+
case 2: return [2 /*return*/, _a.apply(this, _b.concat([(_c.signerWallet = _d.sent(),
|
|
139
|
+
_c.nonce = inputs.nonce.toString(),
|
|
140
|
+
_c.signature = inputs.signature,
|
|
141
|
+
_c.deadline = inputs.deadline,
|
|
142
|
+
_c.orderPriceLimit = inputs.orderPriceLimit,
|
|
143
|
+
_c.exchangeId = params.supportingParams.exchangeId,
|
|
144
|
+
_c.poolId = params.supportingParams.counterpartyAccountIds[0],
|
|
145
|
+
_c.timestampMs = inputs.creationTimestampMs,
|
|
141
146
|
_c)]))];
|
|
142
147
|
}
|
|
143
148
|
});
|
|
@@ -145,10 +150,33 @@ var ConditionalOrdersClient = /** @class */ (function (_super) {
|
|
|
145
150
|
};
|
|
146
151
|
ConditionalOrdersClient.prototype.updateSLOrder = function (params) {
|
|
147
152
|
return __awaiter(this, void 0, void 0, function () {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
153
|
+
var inputs, uri, _a, _b;
|
|
154
|
+
var _c;
|
|
155
|
+
return __generator(this, function (_d) {
|
|
156
|
+
switch (_d.label) {
|
|
157
|
+
case 0: return [4 /*yield*/, this.parseSlOrderInputs(params.signer, params.marginAccountId, params.marketId, params.stopLossPrice, params.supportingParams.exchangeId, params.supportingParams.counterpartyAccountIds)];
|
|
158
|
+
case 1:
|
|
159
|
+
inputs = _d.sent();
|
|
160
|
+
uri = "/api/conditional-orders/sl/update-order";
|
|
161
|
+
_a = this.post;
|
|
162
|
+
_b = [uri,
|
|
163
|
+
{}];
|
|
164
|
+
_c = {
|
|
165
|
+
accountId: params.marginAccountId,
|
|
166
|
+
marketId: params.marketId,
|
|
167
|
+
isLong: inputs.positionBase > 0,
|
|
168
|
+
stopPrice: params.stopLossPrice
|
|
169
|
+
};
|
|
170
|
+
return [4 /*yield*/, params.signer.getAddress()];
|
|
171
|
+
case 2: return [2 /*return*/, _a.apply(this, _b.concat([(_c.signerWallet = _d.sent(),
|
|
172
|
+
_c.nonce = inputs.nonce.toString(),
|
|
173
|
+
_c.signature = inputs.signature,
|
|
174
|
+
_c.deadline = inputs.deadline,
|
|
175
|
+
_c.orderPriceLimit = inputs.orderPriceLimit,
|
|
176
|
+
_c.exchangeId = params.supportingParams.exchangeId,
|
|
177
|
+
_c.poolId = params.supportingParams.counterpartyAccountIds[0],
|
|
178
|
+
_c.timestampMs = inputs.creationTimestampMs,
|
|
179
|
+
_c)]))];
|
|
152
180
|
}
|
|
153
181
|
});
|
|
154
182
|
});
|
|
@@ -173,7 +201,39 @@ var ConditionalOrdersClient = /** @class */ (function (_super) {
|
|
|
173
201
|
var hashUint256 = (BigInt(accountId) << BigInt(98)) |
|
|
174
202
|
(BigInt(timestampMs) << BigInt(32)) |
|
|
175
203
|
BigInt(marketId);
|
|
176
|
-
return hashUint256
|
|
204
|
+
return hashUint256;
|
|
205
|
+
};
|
|
206
|
+
ConditionalOrdersClient.prototype.parseSlOrderInputs = function (signer, accountId, marketId, stopLossPrice, exchangeId, counterpartyAccountIds) {
|
|
207
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
208
|
+
var position, positionBase, orderPriceLimit, inputs, creationTimestampMs, nonce, deadline, signature;
|
|
209
|
+
return __generator(this, function (_a) {
|
|
210
|
+
switch (_a.label) {
|
|
211
|
+
case 0: return [4 /*yield*/, this.getPosition(accountId, marketId)];
|
|
212
|
+
case 1:
|
|
213
|
+
position = _a.sent();
|
|
214
|
+
positionBase = position.base;
|
|
215
|
+
if (positionBase === 0) {
|
|
216
|
+
throw new Error('Position with no exposure');
|
|
217
|
+
}
|
|
218
|
+
orderPriceLimit = Number((0, common_1.calculateMaxPriceLimit)(positionBase < 0));
|
|
219
|
+
inputs = ethers_1.AbiCoder.defaultAbiCoder().encode(['uint256', 'uint256'], [(0, common_1.scale)(18)(stopLossPrice), orderPriceLimit]);
|
|
220
|
+
creationTimestampMs = Date.now();
|
|
221
|
+
nonce = this.createNonce(accountId, marketId, creationTimestampMs);
|
|
222
|
+
deadline = Math.pow(10, 18);
|
|
223
|
+
return [4 /*yield*/, (0, common_1.signConditionalOrder)(signer, this.reyaChainId, accountId, marketId, exchangeId, counterpartyAccountIds, types_1.ConditionalOrderType.StopLoss, inputs, nonce, deadline)];
|
|
224
|
+
case 2:
|
|
225
|
+
signature = _a.sent();
|
|
226
|
+
return [2 /*return*/, {
|
|
227
|
+
signature: signature,
|
|
228
|
+
positionBase: positionBase,
|
|
229
|
+
orderPriceLimit: orderPriceLimit,
|
|
230
|
+
nonce: nonce,
|
|
231
|
+
deadline: deadline,
|
|
232
|
+
creationTimestampMs: creationTimestampMs,
|
|
233
|
+
}];
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
});
|
|
177
237
|
};
|
|
178
238
|
return ConditionalOrdersClient;
|
|
179
239
|
}(common_1.RestClient));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["clients/modules/conditional-orders/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,0CAUyB;AACzB,iCAAkC;AAClC,iCAUiB;AAEjB;IAAqD,2CAAU;IAG7D,iCAAY,WAAwB,EAAE,IAAY;QAChD,YAAA,MAAK,YAAC,IAAI,CAAC,SAAC;QACZ,KAAI,CAAC,WAAW,GAAG,WAAW,CAAC;;IACjC,CAAC;IAEK,mDAAiB,GAAvB,UACE,MAA+B;;;;;;wBAEzB,GAAG,GAAG,4DAAqD,4BAAmB,CAAC,OAAO,cAAI,MAAM,CAAC,QAAQ,cAAI,MAAM,CAAC,SAAS,CAAE,CAAC;wBACrH,qBAAM,IAAI,CAAC,GAAG,CAA4B,GAAG,CAAC,EAAA;;wBAAzD,QAAQ,GAAG,SAA8C;wBAE/D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BACxB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;wBACrE,CAAC;wBAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;4BAAE,sBAAO,IAAI,EAAC;wBAEvC,sBAAO,QAAQ,CAAC,CAAC,CAAC,EAAC;;;;KACpB;IAEK,+CAAa,GAAnB,UACE,MAA2B;;;;;4BAET,qBAAM,IAAA,mCAA0B,EAChD,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,OAAO,CACf,EAAA;;wBAHK,SAAS,GAAG,SAGjB;wBAEK,GAAG,GAAG,yCAAyC,CAAC;wBACtD,sBAAO,IAAI,CAAC,GAAG,CACb,GAAG,EACH,EAAE,EACF;gCACE,OAAO,EAAE,MAAM,CAAC,OAAO;gCACvB,aAAa,EAAE,SAAS;6BACzB,CACF,EAAC;;;;KACH;IAEK,iDAAe,GAArB,UACE,MAA6B;;;;;;4BAEZ,qBAAM,IAAI,CAAC,WAAW,CACrC,MAAM,CAAC,eAAe,EACtB,MAAM,CAAC,MAAM,CAAC,EAAE,CACjB,EAAA;;wBAHK,QAAQ,GAAG,SAGhB;wBACK,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC;wBAEnC,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;4BACvB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;wBAC/C,CAAC;wBAEK,eAAe,GAAG,MAAM,CAAC,IAAA,+BAAsB,EAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;wBAEnE,MAAM,GAAG,iBAAQ,CAAC,eAAe,EAAE,CAAC,MAAM,CAC9C,CAAC,SAAS,EAAE,SAAS,CAAC,EACtB,CAAC,IAAA,cAAK,EAAC,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,eAAe,CAAC,CACnD,CAAC;wBACI,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;wBACjC,KAAK,GAAG,IAAI,CAAC,WAAW,CAC5B,MAAM,CAAC,eAAe,EACtB,MAAM,CAAC,MAAM,CAAC,EAAE,EAChB,mBAAmB,CACpB,CAAC;wBACI,QAAQ,GAAG,SAAA,EAAE,EAAI,EAAE,CAAA,CAAC;wBAER,qBAAM,IAAA,6BAAoB,EAC1C,MAAM,CAAC,MAAM,EACb,IAAI,CAAC,WAAW,EAChB,MAAM,CAAC,eAAe,EACtB,MAAM,CAAC,MAAM,CAAC,EAAE,EAChB,MAAM,CAAC,MAAM,CAAC,UAAU,EACxB,MAAM,CAAC,MAAM,CAAC,sBAAsB,EACpC,4BAAoB,CAAC,QAAQ,EAC7B,MAAM,EACN,KAAK,EACL,QAAQ,CACT,EAAA;;wBAXK,SAAS,GAAG,SAWjB;wBAGK,GAAG,GAAG,yCAAyC,CAAC;wBAC/C,KAAA,IAAI,CAAC,IAAI,CAAA;8BACd,GAAG;4BACH,EAAE;;4BAEA,SAAS,EAAE,MAAM,CAAC,eAAe;4BACjC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE;4BAC1B,MAAM,EAAE,YAAY,GAAG,CAAC;4BACxB,SAAS,EAAE,MAAM,CAAC,aAAa;;wBACjB,qBAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,EAAA;4BARlD,sBAAO,SAAA,IAAI,cAQP,eAAY,GAAE,SAAgC;gCAC9C,QAAK,GAAE,KAAK;gCACZ,YAAS,GAAE,SAAS;gCACpB,WAAQ,GAAE,QAAQ;gCAClB,kBAAe,GAAE,eAAe;gCAChC,aAAU,GAAE,MAAM,CAAC,MAAM,CAAC,UAAU;gCACpC,SAAM,GAAE,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;gCAC/C,cAAW,GAAE,mBAAmB;sCAEnC,EAAC;;;;KACH;IAEK,+CAAa,GAAnB,UACE,MAA2B;;;;4BAEpB,qBAAM,IAAI,CAAC,eAAe,CAAC,MAA+B,CAAC,EAAA;4BAAlE,sBAAO,SAA2D,EAAC;;;;KACpE;IAEa,6CAAW,GAAzB,UACE,SAAiB,EACjB,QAAgB;;;;gBAEV,GAAG,GAAG,8CAAuC,SAAS,cAAI,QAAQ,CAAE,CAAC;gBAC3E,sBAAO,IAAI,CAAC,GAAG,CAAiB,GAAG,CAAC,EAAC;;;KACtC;IAEO,6CAAW,GAAnB,UACE,SAAiB,EACjB,QAAgB,EAChB,WAAmB;QAEnB,4BAA4B;QAC5B,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,IAAI,SAAA,CAAC,EAAI,EAAE,CAAA;YACrC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,IAAI,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,SAAS,IAAI,SAAA,CAAC,EAAI,GAAG,CAAA;YAChD,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,SAAA,CAAC,EAAI,EAAE,CAAA;YAC3C,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAE/C,IAAM,WAAW,GACf,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC;YACjC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEnB,OAAO,WAAW,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IACH,8BAAC;AAAD,CAAC,AA1ID,CAAqD,mBAAU,GA0I9D","sourcesContent":["import {\n calculateMaxPriceLimit,\n PositionEntity,\n RestClient,\n ReyaChainId,\n signConditionalOrder,\n signCancelConditionalOrder,\n StopLossOrder,\n StopLossOrderStatus,\n scale,\n} from '@reyaxyz/common';\nimport { AbiCoder } from 'ethers';\nimport {\n CancelSLOrderParams,\n CancelSLOrderResult,\n ConditionalOrderType,\n GetPendingSLOrderParams,\n GetPendingSLOrderResult,\n RegisterSLOrderParams,\n RegisterSLOrderResult,\n UpdateSLOrderParams,\n UpdateSLOrderResult,\n} from './types';\n\nexport default class ConditionalOrdersClient extends RestClient {\n private reyaChainId: ReyaChainId;\n\n constructor(reyaChainId: ReyaChainId, host: string) {\n super(host);\n this.reyaChainId = reyaChainId;\n }\n\n async getPendingSLOrder(\n params: GetPendingSLOrderParams,\n ): Promise<GetPendingSLOrderResult> {\n const uri = `/api/conditional-orders/sl/get-orders-by-position/${StopLossOrderStatus.PENDING}/${params.marketId}/${params.accountId}`;\n const response = await this.get<GetPendingSLOrderResult[]>(uri);\n\n if (response.length > 1) {\n throw new Error('Multiple SL pending orders on a single position');\n }\n\n if (response.length === 0) return null;\n\n return response[0];\n }\n\n async cancelSLOrder(\n params: CancelSLOrderParams,\n ): Promise<CancelSLOrderResult> {\n const signature = await signCancelConditionalOrder(\n params.signer,\n params.orderId,\n );\n\n const uri = `/api/conditional-orders/sl/cancel-order`;\n return this.put<StopLossOrder>(\n uri,\n {},\n {\n orderId: params.orderId,\n userSignature: signature,\n },\n );\n }\n\n async registerSLOrder(\n params: RegisterSLOrderParams,\n ): Promise<RegisterSLOrderResult> {\n const position = await this.getPosition(\n params.marginAccountId,\n params.market.id,\n );\n const positionBase = position.base;\n\n if (positionBase === 0) {\n throw new Error('Position with no exposure');\n }\n\n const orderPriceLimit = Number(calculateMaxPriceLimit(positionBase < 0));\n\n const inputs = AbiCoder.defaultAbiCoder().encode(\n ['uint256', 'uint256'],\n [scale(18)(params.stopLossPrice), orderPriceLimit],\n );\n const creationTimestampMs = Date.now();\n const nonce = this.createNonce(\n params.marginAccountId,\n params.market.id,\n creationTimestampMs,\n );\n const deadline = 10 ** 18; // very big number for timestamp in seconds - infinite deadline\n\n const signature = await signConditionalOrder(\n params.signer,\n this.reyaChainId,\n params.marginAccountId,\n params.market.id,\n params.market.exchangeId,\n params.market.counterpartyAccountIds,\n ConditionalOrderType.StopLoss,\n inputs,\n nonce,\n deadline,\n );\n\n // create new entry\n const uri = `/api/conditional-orders/sl/create-order`;\n return this.post<StopLossOrder>(\n uri,\n {},\n {\n accountId: params.marginAccountId,\n marketId: params.market.id,\n isLong: positionBase > 0,\n stopPrice: params.stopLossPrice,\n signerWallet: await params.signer.getAddress(),\n nonce: nonce,\n signature: signature,\n deadline: deadline,\n orderPriceLimit: orderPriceLimit,\n exchangeId: params.market.exchangeId,\n poolId: params.market.counterpartyAccountIds[0],\n timestampMs: creationTimestampMs,\n },\n );\n }\n\n async updateSLOrder(\n params: UpdateSLOrderParams,\n ): Promise<UpdateSLOrderResult> {\n return await this.registerSLOrder(params as RegisterSLOrderParams);\n }\n\n private async getPosition(\n accountId: number,\n marketId: number,\n ): Promise<PositionEntity> {\n const uri = `/api/account/marginAccount/position/${accountId}/${marketId}`;\n return this.get<PositionEntity>(uri);\n }\n\n private createNonce(\n accountId: number,\n marketId: number,\n timestampMs: number,\n ): string {\n // Validate the input ranges\n if (marketId < 0 || marketId >= 2 ** 32)\n throw new Error('marketId is out of range');\n if (accountId < BigInt(0) || accountId >= 2 ** 128)\n throw new Error('accountId is out of range');\n if (timestampMs < 0 || timestampMs >= 2 ** 64)\n throw new Error('timestamp is out of range');\n\n const hashUint256 =\n (BigInt(accountId) << BigInt(98)) |\n (BigInt(timestampMs) << BigInt(32)) |\n BigInt(marketId);\n\n return hashUint256.toString();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["clients/modules/conditional-orders/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n calculateMaxPriceLimit,\n PositionEntity,\n RestClient,\n ReyaChainId,\n signConditionalOrder,\n signCancelConditionalOrder,\n StopLossOrder,\n StopLossOrderStatus,\n scale,\n} from '@reyaxyz/common';\nimport { AbiCoder } from 'ethers';\nimport { Signer, JsonRpcSigner } from 'ethers';\nimport {\n AlreadyGaveTradePermissionParams,\n AlreadyGaveTradePermissionResult,\n CancelSLOrderParams,\n CancelSLOrderResult,\n ConditionalOrderType,\n GetPendingSLOrderParams,\n GetPendingSLOrderResult,\n RegisterSLOrderParams,\n RegisterSLOrderResult,\n UpdateSLOrderParams,\n UpdateSLOrderResult,\n} from './types';\n\nexport default class ConditionalOrdersClient extends RestClient {\n private reyaChainId: ReyaChainId;\n\n constructor(reyaChainId: ReyaChainId, host: string) {\n super(host);\n this.reyaChainId = reyaChainId;\n }\n\n async alreadyGaveTradePermissions(\n params: AlreadyGaveTradePermissionParams,\n ): Promise<AlreadyGaveTradePermissionResult> {\n const uri = `/api/conditional-orders/gave-trade-permission/${params.accountId}`;\n const response = await this.get<boolean>(uri);\n\n return {\n permissionGiven: response,\n };\n }\n\n async getPendingSLOrder(\n params: GetPendingSLOrderParams,\n ): Promise<GetPendingSLOrderResult> {\n const uri = `/api/conditional-orders/sl/get-orders-by-position/${StopLossOrderStatus.PENDING}/${params.marketId}/${params.accountId}`;\n const response = await this.get<GetPendingSLOrderResult[]>(uri);\n\n if (response.length > 1) {\n throw new Error('Multiple SL pending orders on a single position');\n }\n\n if (response.length === 0) return null;\n\n return response[0];\n }\n\n async cancelSLOrder(\n params: CancelSLOrderParams,\n ): Promise<CancelSLOrderResult> {\n const signature = await signCancelConditionalOrder(\n params.signer,\n params.orderId,\n );\n\n const uri = `/api/conditional-orders/sl/cancel-order`;\n return this.put<StopLossOrder>(\n uri,\n {},\n {\n orderId: params.orderId,\n userSignature: signature,\n },\n );\n }\n\n async registerSLOrder(\n params: RegisterSLOrderParams,\n ): Promise<RegisterSLOrderResult> {\n const inputs = await this.parseSlOrderInputs(\n params.signer,\n params.marginAccountId,\n params.marketId,\n params.stopLossPrice,\n params.supportingParams.exchangeId,\n params.supportingParams.counterpartyAccountIds,\n );\n\n // create new entry\n const uri = `/api/conditional-orders/sl/create-order`;\n return this.post<StopLossOrder>(\n uri,\n {},\n {\n accountId: params.marginAccountId,\n marketId: params.marketId,\n isLong: inputs.positionBase > 0,\n stopPrice: params.stopLossPrice,\n signerWallet: await params.signer.getAddress(),\n nonce: inputs.nonce.toString(),\n signature: inputs.signature,\n deadline: inputs.deadline,\n orderPriceLimit: inputs.orderPriceLimit,\n exchangeId: params.supportingParams.exchangeId,\n poolId: params.supportingParams.counterpartyAccountIds[0],\n timestampMs: inputs.creationTimestampMs,\n },\n );\n }\n\n async updateSLOrder(\n params: UpdateSLOrderParams,\n ): Promise<UpdateSLOrderResult> {\n const inputs = await this.parseSlOrderInputs(\n params.signer,\n params.marginAccountId,\n params.marketId,\n params.stopLossPrice,\n params.supportingParams.exchangeId,\n params.supportingParams.counterpartyAccountIds,\n );\n\n // create new entry\n const uri = `/api/conditional-orders/sl/update-order`;\n return this.post<StopLossOrder>(\n uri,\n {},\n {\n accountId: params.marginAccountId,\n marketId: params.marketId,\n isLong: inputs.positionBase > 0,\n stopPrice: params.stopLossPrice,\n signerWallet: await params.signer.getAddress(),\n nonce: inputs.nonce.toString(),\n signature: inputs.signature,\n deadline: inputs.deadline,\n orderPriceLimit: inputs.orderPriceLimit,\n exchangeId: params.supportingParams.exchangeId,\n poolId: params.supportingParams.counterpartyAccountIds[0],\n timestampMs: inputs.creationTimestampMs,\n },\n );\n }\n\n private async getPosition(\n accountId: number,\n marketId: number,\n ): Promise<PositionEntity> {\n const uri = `/api/account/marginAccount/position/${accountId}/${marketId}`;\n return this.get<PositionEntity>(uri);\n }\n\n private createNonce(\n accountId: number,\n marketId: number,\n timestampMs: number,\n ): bigint {\n // Validate the input ranges\n if (marketId < 0 || marketId >= 2 ** 32)\n throw new Error('marketId is out of range');\n if (accountId < BigInt(0) || accountId >= 2 ** 128)\n throw new Error('accountId is out of range');\n if (timestampMs < 0 || timestampMs >= 2 ** 64)\n throw new Error('timestamp is out of range');\n\n const hashUint256 =\n (BigInt(accountId) << BigInt(98)) |\n (BigInt(timestampMs) << BigInt(32)) |\n BigInt(marketId);\n\n return hashUint256;\n }\n\n private async parseSlOrderInputs(\n signer: Signer | JsonRpcSigner,\n accountId: number,\n marketId: number,\n stopLossPrice: number,\n exchangeId: number,\n counterpartyAccountIds: number[],\n ): Promise<{\n signature: string;\n positionBase: number;\n orderPriceLimit: number;\n nonce: bigint;\n deadline: number;\n creationTimestampMs: number;\n }> {\n const position = await this.getPosition(accountId, marketId);\n const positionBase = position.base;\n\n if (positionBase === 0) {\n throw new Error('Position with no exposure');\n }\n\n const orderPriceLimit = Number(calculateMaxPriceLimit(positionBase < 0));\n\n const inputs = AbiCoder.defaultAbiCoder().encode(\n ['uint256', 'uint256'],\n [scale(18)(stopLossPrice), orderPriceLimit],\n );\n const creationTimestampMs = Date.now();\n const nonce = this.createNonce(accountId, marketId, creationTimestampMs);\n const deadline = 10 ** 18; // very big number for timestamp in seconds - infinite deadline\n\n const signature = await signConditionalOrder(\n signer,\n this.reyaChainId,\n accountId,\n marketId,\n exchangeId,\n counterpartyAccountIds,\n ConditionalOrderType.StopLoss,\n inputs,\n nonce,\n deadline,\n );\n\n return {\n signature,\n positionBase,\n orderPriceLimit,\n nonce,\n deadline,\n creationTimestampMs,\n };\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"/","sources":["clients/modules/conditional-orders/types.ts"],"names":[],"mappings":";;;AAkBA,IAAY,oBAEX;AAFD,WAAY,oBAAoB;IAC9B,uEAAc,CAAA;AAChB,CAAC,EAFW,oBAAoB,oCAApB,oBAAoB,QAE/B","sourcesContent":["import { StopLossOrder } from '@reyaxyz/common';\nimport { Signer, JsonRpcSigner } from 'ethers';\nimport { MarginAccountEntity, MarketEntity } from '@reyaxyz/common';\n\nexport type CancelSLOrderParams = {\n signer: Signer | JsonRpcSigner;\n orderId:
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"/","sources":["clients/modules/conditional-orders/types.ts"],"names":[],"mappings":";;;AAkBA,IAAY,oBAEX;AAFD,WAAY,oBAAoB;IAC9B,uEAAc,CAAA;AAChB,CAAC,EAFW,oBAAoB,oCAApB,oBAAoB,QAE/B","sourcesContent":["import { StopLossOrder } from '@reyaxyz/common';\nimport { Signer, JsonRpcSigner } from 'ethers';\nimport { MarginAccountEntity, MarketEntity } from '@reyaxyz/common';\n\nexport type CancelSLOrderParams = {\n signer: Signer | JsonRpcSigner;\n orderId: string;\n};\n\nexport type CancelSLOrderResult = StopLossOrder;\n\nexport type GetPendingSLOrderParams = {\n accountId: number;\n marketId: number;\n};\n\nexport type GetPendingSLOrderResult = StopLossOrder | null;\n\nexport enum ConditionalOrderType {\n 'StopLoss' = 0,\n}\n\nexport type ConditionalOrderDetails = {\n accountId: number;\n marketId: number;\n exchangeId: number;\n counterpartyAccountIds: number[];\n orderType: number;\n inputs: string;\n signer: string;\n nonce: bigint;\n};\n\nexport type OrderSupportingParams = {\n exchangeId: MarketEntity['orderInfo']['exchangeId'];\n counterpartyAccountIds: MarketEntity['orderInfo']['counterpartyAccountIds'];\n currentPrice: number;\n};\n\nexport type RegisterSLOrderParams = {\n signer: Signer | JsonRpcSigner;\n marginAccountId: MarginAccountEntity['id'];\n stopLossPrice: number;\n marketId: number;\n supportingParams: OrderSupportingParams;\n};\n\nexport type UpdateSLOrderParams = {\n signer: Signer | JsonRpcSigner;\n marginAccountId: MarginAccountEntity['id'];\n stopLossPrice: number;\n marketId: number;\n supportingParams: OrderSupportingParams;\n};\n\nexport type RegisterSLOrderResult = StopLossOrder;\nexport type UpdateSLOrderResult = StopLossOrder;\n\nexport type AlreadyGaveTradePermissionParams = {\n accountId: number;\n};\n\nexport type AlreadyGaveTradePermissionResult = {\n permissionGiven: boolean;\n};\n"]}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { RestClient, ReyaChainId } from '@reyaxyz/common';
|
|
2
|
-
import { CancelSLOrderParams, CancelSLOrderResult, GetPendingSLOrderParams, GetPendingSLOrderResult, RegisterSLOrderParams, RegisterSLOrderResult, UpdateSLOrderParams, UpdateSLOrderResult } from './types';
|
|
2
|
+
import { AlreadyGaveTradePermissionParams, AlreadyGaveTradePermissionResult, CancelSLOrderParams, CancelSLOrderResult, GetPendingSLOrderParams, GetPendingSLOrderResult, RegisterSLOrderParams, RegisterSLOrderResult, UpdateSLOrderParams, UpdateSLOrderResult } from './types';
|
|
3
3
|
export default class ConditionalOrdersClient extends RestClient {
|
|
4
4
|
private reyaChainId;
|
|
5
5
|
constructor(reyaChainId: ReyaChainId, host: string);
|
|
6
|
+
alreadyGaveTradePermissions(params: AlreadyGaveTradePermissionParams): Promise<AlreadyGaveTradePermissionResult>;
|
|
6
7
|
getPendingSLOrder(params: GetPendingSLOrderParams): Promise<GetPendingSLOrderResult>;
|
|
7
8
|
cancelSLOrder(params: CancelSLOrderParams): Promise<CancelSLOrderResult>;
|
|
8
9
|
registerSLOrder(params: RegisterSLOrderParams): Promise<RegisterSLOrderResult>;
|
|
9
10
|
updateSLOrder(params: UpdateSLOrderParams): Promise<UpdateSLOrderResult>;
|
|
10
11
|
private getPosition;
|
|
11
12
|
private createNonce;
|
|
13
|
+
private parseSlOrderInputs;
|
|
12
14
|
}
|
|
13
15
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"/","sources":["clients/modules/conditional-orders/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EACV,WAAW,EAMZ,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"/","sources":["clients/modules/conditional-orders/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EACV,WAAW,EAMZ,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,gCAAgC,EAChC,gCAAgC,EAChC,mBAAmB,EACnB,mBAAmB,EAEnB,uBAAuB,EACvB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAEjB,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,UAAU;IAC7D,OAAO,CAAC,WAAW,CAAc;gBAErB,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM;IAK5C,2BAA2B,CAC/B,MAAM,EAAE,gCAAgC,GACvC,OAAO,CAAC,gCAAgC,CAAC;IAStC,iBAAiB,CACrB,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC,uBAAuB,CAAC;IAa7B,aAAa,CACjB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;IAiBzB,eAAe,CACnB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IAgC3B,aAAa,CACjB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;YAgCjB,WAAW;IAQzB,OAAO,CAAC,WAAW;YAqBL,kBAAkB;CAsDjC"}
|
|
@@ -3,7 +3,7 @@ import { Signer, JsonRpcSigner } from 'ethers';
|
|
|
3
3
|
import { MarginAccountEntity, MarketEntity } from '@reyaxyz/common';
|
|
4
4
|
export type CancelSLOrderParams = {
|
|
5
5
|
signer: Signer | JsonRpcSigner;
|
|
6
|
-
orderId:
|
|
6
|
+
orderId: string;
|
|
7
7
|
};
|
|
8
8
|
export type CancelSLOrderResult = StopLossOrder;
|
|
9
9
|
export type GetPendingSLOrderParams = {
|
|
@@ -22,10 +22,9 @@ export type ConditionalOrderDetails = {
|
|
|
22
22
|
orderType: number;
|
|
23
23
|
inputs: string;
|
|
24
24
|
signer: string;
|
|
25
|
-
nonce:
|
|
25
|
+
nonce: bigint;
|
|
26
26
|
};
|
|
27
|
-
export type
|
|
28
|
-
id: MarketEntity['id'];
|
|
27
|
+
export type OrderSupportingParams = {
|
|
29
28
|
exchangeId: MarketEntity['orderInfo']['exchangeId'];
|
|
30
29
|
counterpartyAccountIds: MarketEntity['orderInfo']['counterpartyAccountIds'];
|
|
31
30
|
currentPrice: number;
|
|
@@ -34,15 +33,22 @@ export type RegisterSLOrderParams = {
|
|
|
34
33
|
signer: Signer | JsonRpcSigner;
|
|
35
34
|
marginAccountId: MarginAccountEntity['id'];
|
|
36
35
|
stopLossPrice: number;
|
|
37
|
-
|
|
36
|
+
marketId: number;
|
|
37
|
+
supportingParams: OrderSupportingParams;
|
|
38
38
|
};
|
|
39
39
|
export type UpdateSLOrderParams = {
|
|
40
40
|
signer: Signer | JsonRpcSigner;
|
|
41
|
-
orderId: number;
|
|
42
41
|
marginAccountId: MarginAccountEntity['id'];
|
|
43
42
|
stopLossPrice: number;
|
|
44
|
-
|
|
43
|
+
marketId: number;
|
|
44
|
+
supportingParams: OrderSupportingParams;
|
|
45
45
|
};
|
|
46
46
|
export type RegisterSLOrderResult = StopLossOrder;
|
|
47
47
|
export type UpdateSLOrderResult = StopLossOrder;
|
|
48
|
+
export type AlreadyGaveTradePermissionParams = {
|
|
49
|
+
accountId: number;
|
|
50
|
+
};
|
|
51
|
+
export type AlreadyGaveTradePermissionResult = {
|
|
52
|
+
permissionGiven: boolean;
|
|
53
|
+
};
|
|
48
54
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"/","sources":["clients/modules/conditional-orders/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,aAAa,CAAC;AAEhD,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,aAAa,GAAG,IAAI,CAAC;AAE3D,oBAAY,oBAAoB;IAC9B,UAAU,IAAI;CACf;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"/","sources":["clients/modules/conditional-orders/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,aAAa,CAAC;AAEhD,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG,aAAa,GAAG,IAAI,CAAC;AAE3D,oBAAY,oBAAoB;IAC9B,UAAU,IAAI;CACf;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC;IACpD,sBAAsB,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC,wBAAwB,CAAC,CAAC;IAC5E,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC;IAC/B,eAAe,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,qBAAqB,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC;IAC/B,eAAe,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,qBAAqB,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,aAAa,CAAC;AAClD,MAAM,MAAM,mBAAmB,GAAG,aAAa,CAAC;AAEhD,MAAM,MAAM,gCAAgC,GAAG;IAC7C,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,eAAe,EAAE,OAAO,CAAC;CAC1B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reyaxyz/api-sdk",
|
|
3
|
-
"version": "0.104.
|
|
3
|
+
"version": "0.104.1",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"registry": "https://registry.npmjs.org"
|
|
@@ -33,14 +33,14 @@
|
|
|
33
33
|
"generate:coverage-badges": "npx istanbul-badges-readme --silent"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@reyaxyz/common": "0.155.
|
|
36
|
+
"@reyaxyz/common": "0.155.4",
|
|
37
37
|
"bignumber.js": "^9.1.2",
|
|
38
38
|
"ethers": "6.9.0",
|
|
39
39
|
"isomorphic-ws": "^5.0.0",
|
|
40
40
|
"ws": "^8.16.0"
|
|
41
41
|
},
|
|
42
42
|
"packageManager": "pnpm@8.3.1",
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "4e75716af3de0ca01c4619535861e7353e783a73",
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"@types/ws": "8.5.10"
|
|
46
46
|
}
|
|
@@ -10,7 +10,10 @@ import {
|
|
|
10
10
|
scale,
|
|
11
11
|
} from '@reyaxyz/common';
|
|
12
12
|
import { AbiCoder } from 'ethers';
|
|
13
|
+
import { Signer, JsonRpcSigner } from 'ethers';
|
|
13
14
|
import {
|
|
15
|
+
AlreadyGaveTradePermissionParams,
|
|
16
|
+
AlreadyGaveTradePermissionResult,
|
|
14
17
|
CancelSLOrderParams,
|
|
15
18
|
CancelSLOrderResult,
|
|
16
19
|
ConditionalOrderType,
|
|
@@ -30,6 +33,17 @@ export default class ConditionalOrdersClient extends RestClient {
|
|
|
30
33
|
this.reyaChainId = reyaChainId;
|
|
31
34
|
}
|
|
32
35
|
|
|
36
|
+
async alreadyGaveTradePermissions(
|
|
37
|
+
params: AlreadyGaveTradePermissionParams,
|
|
38
|
+
): Promise<AlreadyGaveTradePermissionResult> {
|
|
39
|
+
const uri = `/api/conditional-orders/gave-trade-permission/${params.accountId}`;
|
|
40
|
+
const response = await this.get<boolean>(uri);
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
permissionGiven: response,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
33
47
|
async getPendingSLOrder(
|
|
34
48
|
params: GetPendingSLOrderParams,
|
|
35
49
|
): Promise<GetPendingSLOrderResult> {
|
|
@@ -67,41 +81,13 @@ export default class ConditionalOrdersClient extends RestClient {
|
|
|
67
81
|
async registerSLOrder(
|
|
68
82
|
params: RegisterSLOrderParams,
|
|
69
83
|
): Promise<RegisterSLOrderResult> {
|
|
70
|
-
const
|
|
71
|
-
params.marginAccountId,
|
|
72
|
-
params.market.id,
|
|
73
|
-
);
|
|
74
|
-
const positionBase = position.base;
|
|
75
|
-
|
|
76
|
-
if (positionBase === 0) {
|
|
77
|
-
throw new Error('Position with no exposure');
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const orderPriceLimit = Number(calculateMaxPriceLimit(positionBase < 0));
|
|
81
|
-
|
|
82
|
-
const inputs = AbiCoder.defaultAbiCoder().encode(
|
|
83
|
-
['uint256', 'uint256'],
|
|
84
|
-
[scale(18)(params.stopLossPrice), orderPriceLimit],
|
|
85
|
-
);
|
|
86
|
-
const creationTimestampMs = Date.now();
|
|
87
|
-
const nonce = this.createNonce(
|
|
88
|
-
params.marginAccountId,
|
|
89
|
-
params.market.id,
|
|
90
|
-
creationTimestampMs,
|
|
91
|
-
);
|
|
92
|
-
const deadline = 10 ** 18; // very big number for timestamp in seconds - infinite deadline
|
|
93
|
-
|
|
94
|
-
const signature = await signConditionalOrder(
|
|
84
|
+
const inputs = await this.parseSlOrderInputs(
|
|
95
85
|
params.signer,
|
|
96
|
-
this.reyaChainId,
|
|
97
86
|
params.marginAccountId,
|
|
98
|
-
params.
|
|
99
|
-
params.
|
|
100
|
-
params.
|
|
101
|
-
|
|
102
|
-
inputs,
|
|
103
|
-
nonce,
|
|
104
|
-
deadline,
|
|
87
|
+
params.marketId,
|
|
88
|
+
params.stopLossPrice,
|
|
89
|
+
params.supportingParams.exchangeId,
|
|
90
|
+
params.supportingParams.counterpartyAccountIds,
|
|
105
91
|
);
|
|
106
92
|
|
|
107
93
|
// create new entry
|
|
@@ -111,17 +97,17 @@ export default class ConditionalOrdersClient extends RestClient {
|
|
|
111
97
|
{},
|
|
112
98
|
{
|
|
113
99
|
accountId: params.marginAccountId,
|
|
114
|
-
marketId: params.
|
|
115
|
-
isLong: positionBase > 0,
|
|
100
|
+
marketId: params.marketId,
|
|
101
|
+
isLong: inputs.positionBase > 0,
|
|
116
102
|
stopPrice: params.stopLossPrice,
|
|
117
103
|
signerWallet: await params.signer.getAddress(),
|
|
118
|
-
nonce: nonce,
|
|
119
|
-
signature: signature,
|
|
120
|
-
deadline: deadline,
|
|
121
|
-
orderPriceLimit: orderPriceLimit,
|
|
122
|
-
exchangeId: params.
|
|
123
|
-
poolId: params.
|
|
124
|
-
timestampMs: creationTimestampMs,
|
|
104
|
+
nonce: inputs.nonce.toString(),
|
|
105
|
+
signature: inputs.signature,
|
|
106
|
+
deadline: inputs.deadline,
|
|
107
|
+
orderPriceLimit: inputs.orderPriceLimit,
|
|
108
|
+
exchangeId: params.supportingParams.exchangeId,
|
|
109
|
+
poolId: params.supportingParams.counterpartyAccountIds[0],
|
|
110
|
+
timestampMs: inputs.creationTimestampMs,
|
|
125
111
|
},
|
|
126
112
|
);
|
|
127
113
|
}
|
|
@@ -129,7 +115,35 @@ export default class ConditionalOrdersClient extends RestClient {
|
|
|
129
115
|
async updateSLOrder(
|
|
130
116
|
params: UpdateSLOrderParams,
|
|
131
117
|
): Promise<UpdateSLOrderResult> {
|
|
132
|
-
|
|
118
|
+
const inputs = await this.parseSlOrderInputs(
|
|
119
|
+
params.signer,
|
|
120
|
+
params.marginAccountId,
|
|
121
|
+
params.marketId,
|
|
122
|
+
params.stopLossPrice,
|
|
123
|
+
params.supportingParams.exchangeId,
|
|
124
|
+
params.supportingParams.counterpartyAccountIds,
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
// create new entry
|
|
128
|
+
const uri = `/api/conditional-orders/sl/update-order`;
|
|
129
|
+
return this.post<StopLossOrder>(
|
|
130
|
+
uri,
|
|
131
|
+
{},
|
|
132
|
+
{
|
|
133
|
+
accountId: params.marginAccountId,
|
|
134
|
+
marketId: params.marketId,
|
|
135
|
+
isLong: inputs.positionBase > 0,
|
|
136
|
+
stopPrice: params.stopLossPrice,
|
|
137
|
+
signerWallet: await params.signer.getAddress(),
|
|
138
|
+
nonce: inputs.nonce.toString(),
|
|
139
|
+
signature: inputs.signature,
|
|
140
|
+
deadline: inputs.deadline,
|
|
141
|
+
orderPriceLimit: inputs.orderPriceLimit,
|
|
142
|
+
exchangeId: params.supportingParams.exchangeId,
|
|
143
|
+
poolId: params.supportingParams.counterpartyAccountIds[0],
|
|
144
|
+
timestampMs: inputs.creationTimestampMs,
|
|
145
|
+
},
|
|
146
|
+
);
|
|
133
147
|
}
|
|
134
148
|
|
|
135
149
|
private async getPosition(
|
|
@@ -144,7 +158,7 @@ export default class ConditionalOrdersClient extends RestClient {
|
|
|
144
158
|
accountId: number,
|
|
145
159
|
marketId: number,
|
|
146
160
|
timestampMs: number,
|
|
147
|
-
):
|
|
161
|
+
): bigint {
|
|
148
162
|
// Validate the input ranges
|
|
149
163
|
if (marketId < 0 || marketId >= 2 ** 32)
|
|
150
164
|
throw new Error('marketId is out of range');
|
|
@@ -158,6 +172,61 @@ export default class ConditionalOrdersClient extends RestClient {
|
|
|
158
172
|
(BigInt(timestampMs) << BigInt(32)) |
|
|
159
173
|
BigInt(marketId);
|
|
160
174
|
|
|
161
|
-
return hashUint256
|
|
175
|
+
return hashUint256;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
private async parseSlOrderInputs(
|
|
179
|
+
signer: Signer | JsonRpcSigner,
|
|
180
|
+
accountId: number,
|
|
181
|
+
marketId: number,
|
|
182
|
+
stopLossPrice: number,
|
|
183
|
+
exchangeId: number,
|
|
184
|
+
counterpartyAccountIds: number[],
|
|
185
|
+
): Promise<{
|
|
186
|
+
signature: string;
|
|
187
|
+
positionBase: number;
|
|
188
|
+
orderPriceLimit: number;
|
|
189
|
+
nonce: bigint;
|
|
190
|
+
deadline: number;
|
|
191
|
+
creationTimestampMs: number;
|
|
192
|
+
}> {
|
|
193
|
+
const position = await this.getPosition(accountId, marketId);
|
|
194
|
+
const positionBase = position.base;
|
|
195
|
+
|
|
196
|
+
if (positionBase === 0) {
|
|
197
|
+
throw new Error('Position with no exposure');
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const orderPriceLimit = Number(calculateMaxPriceLimit(positionBase < 0));
|
|
201
|
+
|
|
202
|
+
const inputs = AbiCoder.defaultAbiCoder().encode(
|
|
203
|
+
['uint256', 'uint256'],
|
|
204
|
+
[scale(18)(stopLossPrice), orderPriceLimit],
|
|
205
|
+
);
|
|
206
|
+
const creationTimestampMs = Date.now();
|
|
207
|
+
const nonce = this.createNonce(accountId, marketId, creationTimestampMs);
|
|
208
|
+
const deadline = 10 ** 18; // very big number for timestamp in seconds - infinite deadline
|
|
209
|
+
|
|
210
|
+
const signature = await signConditionalOrder(
|
|
211
|
+
signer,
|
|
212
|
+
this.reyaChainId,
|
|
213
|
+
accountId,
|
|
214
|
+
marketId,
|
|
215
|
+
exchangeId,
|
|
216
|
+
counterpartyAccountIds,
|
|
217
|
+
ConditionalOrderType.StopLoss,
|
|
218
|
+
inputs,
|
|
219
|
+
nonce,
|
|
220
|
+
deadline,
|
|
221
|
+
);
|
|
222
|
+
|
|
223
|
+
return {
|
|
224
|
+
signature,
|
|
225
|
+
positionBase,
|
|
226
|
+
orderPriceLimit,
|
|
227
|
+
nonce,
|
|
228
|
+
deadline,
|
|
229
|
+
creationTimestampMs,
|
|
230
|
+
};
|
|
162
231
|
}
|
|
163
232
|
}
|
|
@@ -4,7 +4,7 @@ import { MarginAccountEntity, MarketEntity } from '@reyaxyz/common';
|
|
|
4
4
|
|
|
5
5
|
export type CancelSLOrderParams = {
|
|
6
6
|
signer: Signer | JsonRpcSigner;
|
|
7
|
-
orderId:
|
|
7
|
+
orderId: string;
|
|
8
8
|
};
|
|
9
9
|
|
|
10
10
|
export type CancelSLOrderResult = StopLossOrder;
|
|
@@ -28,11 +28,10 @@ export type ConditionalOrderDetails = {
|
|
|
28
28
|
orderType: number;
|
|
29
29
|
inputs: string;
|
|
30
30
|
signer: string;
|
|
31
|
-
nonce:
|
|
31
|
+
nonce: bigint;
|
|
32
32
|
};
|
|
33
33
|
|
|
34
|
-
export type
|
|
35
|
-
id: MarketEntity['id'];
|
|
34
|
+
export type OrderSupportingParams = {
|
|
36
35
|
exchangeId: MarketEntity['orderInfo']['exchangeId'];
|
|
37
36
|
counterpartyAccountIds: MarketEntity['orderInfo']['counterpartyAccountIds'];
|
|
38
37
|
currentPrice: number;
|
|
@@ -42,16 +41,25 @@ export type RegisterSLOrderParams = {
|
|
|
42
41
|
signer: Signer | JsonRpcSigner;
|
|
43
42
|
marginAccountId: MarginAccountEntity['id'];
|
|
44
43
|
stopLossPrice: number;
|
|
45
|
-
|
|
44
|
+
marketId: number;
|
|
45
|
+
supportingParams: OrderSupportingParams;
|
|
46
46
|
};
|
|
47
47
|
|
|
48
48
|
export type UpdateSLOrderParams = {
|
|
49
49
|
signer: Signer | JsonRpcSigner;
|
|
50
|
-
orderId: number;
|
|
51
50
|
marginAccountId: MarginAccountEntity['id'];
|
|
52
51
|
stopLossPrice: number;
|
|
53
|
-
|
|
52
|
+
marketId: number;
|
|
53
|
+
supportingParams: OrderSupportingParams;
|
|
54
54
|
};
|
|
55
55
|
|
|
56
56
|
export type RegisterSLOrderResult = StopLossOrder;
|
|
57
57
|
export type UpdateSLOrderResult = StopLossOrder;
|
|
58
|
+
|
|
59
|
+
export type AlreadyGaveTradePermissionParams = {
|
|
60
|
+
accountId: number;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export type AlreadyGaveTradePermissionResult = {
|
|
64
|
+
permissionGiven: boolean;
|
|
65
|
+
};
|