aftermath-ts-sdk 1.1.76 → 1.1.77
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/general/apiHelpers/transactionsApiHelpers.d.ts +8 -0
- package/dist/general/apiHelpers/transactionsApiHelpers.d.ts.map +1 -1
- package/dist/general/apiHelpers/transactionsApiHelpers.js +73 -0
- package/dist/general/providers/aftermath.d.ts +6 -0
- package/dist/general/providers/aftermath.d.ts.map +1 -1
- package/dist/general/providers/aftermath.js +8 -0
- package/dist/general/providers/aftermathApi.d.ts +2 -0
- package/dist/general/providers/aftermathApi.d.ts.map +1 -1
- package/dist/general/providers/aftermathApi.js +4 -0
- package/dist/general/types/castingTypes.d.ts +1 -0
- package/dist/general/types/castingTypes.d.ts.map +1 -1
- package/dist/general/types/configTypes.d.ts +13 -0
- package/dist/general/types/configTypes.d.ts.map +1 -1
- package/dist/general/types/generalTypes.d.ts +1 -0
- package/dist/general/types/generalTypes.d.ts.map +1 -1
- package/dist/general/utils/casting.d.ts +2 -0
- package/dist/general/utils/casting.d.ts.map +1 -1
- package/dist/general/utils/casting.js +2 -0
- package/dist/packages/dca/api/dcaApi.d.ts +44 -0
- package/dist/packages/dca/api/dcaApi.d.ts.map +1 -0
- package/dist/packages/dca/api/dcaApi.js +215 -0
- package/dist/packages/dca/api/dcaApiCasting.d.ts +11 -0
- package/dist/packages/dca/api/dcaApiCasting.d.ts.map +1 -0
- package/dist/packages/dca/api/dcaApiCasting.js +170 -0
- package/dist/packages/dca/api/dcaApiCastingTypes.d.ts +132 -0
- package/dist/packages/dca/api/dcaApiCastingTypes.d.ts.map +1 -0
- package/dist/packages/dca/api/dcaApiCastingTypes.js +2 -0
- package/dist/packages/dca/dca.d.ts +87 -0
- package/dist/packages/dca/dca.d.ts.map +1 -0
- package/dist/packages/dca/dca.js +138 -0
- package/dist/packages/dca/dcaTypes.d.ts +130 -0
- package/dist/packages/dca/dcaTypes.d.ts.map +1 -0
- package/dist/packages/dca/dcaTypes.js +2 -0
- package/dist/packages/dca/index.d.ts +2 -0
- package/dist/packages/dca/index.d.ts.map +1 -0
- package/dist/packages/dca/index.js +17 -0
- package/dist/packages/multisig/api/multisigApi.d.ts +2 -0
- package/dist/packages/multisig/api/multisigApi.d.ts.map +1 -0
- package/dist/packages/multisig/api/multisigApi.js +49 -0
- package/dist/packages/multisig/index.d.ts +2 -0
- package/dist/packages/multisig/index.d.ts.map +1 -0
- package/dist/packages/multisig/index.js +3 -0
- package/dist/packages/multisig/multisig.d.ts +2 -0
- package/dist/packages/multisig/multisig.d.ts.map +1 -0
- package/dist/packages/multisig/multisig.js +37 -0
- package/dist/packages/multisig/multisigTypes.d.ts +2 -0
- package/dist/packages/multisig/multisigTypes.d.ts.map +1 -0
- package/dist/packages/multisig/multisigTypes.js +13 -0
- package/dist/packages/perpetuals/api/perpetualsApi.d.ts +19 -14
- package/dist/packages/perpetuals/api/perpetualsApi.d.ts.map +1 -1
- package/dist/packages/perpetuals/api/perpetualsApi.js +403 -362
- package/dist/packages/perpetuals/api/perpetualsApiCasting.d.ts +1 -0
- package/dist/packages/perpetuals/api/perpetualsApiCasting.d.ts.map +1 -1
- package/dist/packages/perpetuals/api/perpetualsApiCasting.js +5 -3
- package/dist/packages/perpetuals/perpetuals.d.ts.map +1 -1
- package/dist/packages/perpetuals/perpetualsAccount.d.ts +16 -4
- package/dist/packages/perpetuals/perpetualsAccount.d.ts.map +1 -1
- package/dist/packages/perpetuals/perpetualsAccount.js +50 -22
- package/dist/packages/perpetuals/perpetualsCastingTypes.d.ts +7 -6
- package/dist/packages/perpetuals/perpetualsCastingTypes.d.ts.map +1 -1
- package/dist/packages/perpetuals/perpetualsMarket.d.ts +3 -33
- package/dist/packages/perpetuals/perpetualsMarket.d.ts.map +1 -1
- package/dist/packages/perpetuals/perpetualsMarket.js +8 -184
- package/dist/packages/perpetuals/perpetualsTypes.d.ts +65 -16
- package/dist/packages/perpetuals/perpetualsTypes.d.ts.map +1 -1
- package/dist/packages/router/api/routerApi.d.ts +0 -2
- package/dist/packages/router/api/routerApi.d.ts.map +1 -1
- package/dist/packages/router/api/routerApi.js +7 -48
- package/package.json +1 -1
|
@@ -68,64 +68,73 @@ class PerpetualsApi {
|
|
|
68
68
|
return utils_1.Casting.perpetuals.accountObjectFromIndexerResponse(response, inputs.collateralCoinType);
|
|
69
69
|
});
|
|
70
70
|
this.fetchAccountOrderDatas = (inputs) => __awaiter(this, void 0, void 0, function* () {
|
|
71
|
-
const {
|
|
72
|
-
const
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
71
|
+
const { accountCapId, orderDatas } = inputs;
|
|
72
|
+
const orders = yield this.Provider.indexerCaller.fetchIndexer(`perpetuals/accounts/orders`, {
|
|
73
|
+
account_id: utils_1.Helpers.addLeadingZeroesToType(accountCapId),
|
|
74
|
+
order_ids: orderDatas.map((orderData) => String(orderData.orderId).replaceAll("n", "")),
|
|
75
|
+
}, undefined, undefined, undefined, true);
|
|
76
|
+
if (orders.length !== orderDatas.length)
|
|
76
77
|
throw new Error("unable to find all orders");
|
|
77
|
-
return
|
|
78
|
-
const
|
|
79
|
-
const
|
|
78
|
+
return orders.map((order) => {
|
|
79
|
+
const orderId = BigInt(order.order_id);
|
|
80
|
+
const initialSize = BigInt(order.initial_size);
|
|
81
|
+
const orderData = orderDatas.find((orderData) => orderData.orderId === orderId);
|
|
80
82
|
if (!orderData)
|
|
81
83
|
throw new Error("unable to find all orders");
|
|
82
|
-
return
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
// MoveModule: {
|
|
90
|
-
// module: PerpetualsApi.constants.moduleNames.events,
|
|
91
|
-
// package: this.addresses.perpetuals.packages.perpetuals,
|
|
92
|
-
// },
|
|
93
|
-
// },
|
|
94
|
-
// filter: {
|
|
95
|
-
// MoveEventModule: {
|
|
96
|
-
// module: PerpetualsApi.constants.moduleNames.events,
|
|
97
|
-
// package: this.addresses.perpetuals.packages.events,
|
|
98
|
-
// },
|
|
99
|
-
// },
|
|
100
|
-
filter: {
|
|
101
|
-
MoveEventModule: {
|
|
102
|
-
module: "interface",
|
|
103
|
-
package: this.addresses.perpetuals.packages.events,
|
|
104
|
-
},
|
|
105
|
-
},
|
|
106
|
-
onMessage: onEvent,
|
|
84
|
+
return {
|
|
85
|
+
marketId: utils_1.Helpers.addLeadingZeroesToType(order.ch_id),
|
|
86
|
+
side: perpetuals_1.Perpetuals.orderIdToSide(orderId),
|
|
87
|
+
filledSize: initialSize - orderData.currentSize,
|
|
88
|
+
initialSize,
|
|
89
|
+
orderId,
|
|
90
|
+
};
|
|
107
91
|
});
|
|
108
|
-
return unsubscribe;
|
|
109
92
|
});
|
|
110
93
|
this.fetchHistoricalMarketData = (inputs) => __awaiter(this, void 0, void 0, function* () {
|
|
111
94
|
const { marketId, fromTimestamp, toTimestamp, intervalMs } = inputs;
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
95
|
+
const response = yield this.Provider.indexerCaller.fetchIndexer(`perpetuals/markets/candle-history`, {
|
|
96
|
+
ch_id: utils_1.Helpers.addLeadingZeroesToType(marketId),
|
|
97
|
+
timestamp_ms_from: fromTimestamp,
|
|
98
|
+
timestamp_ms_to: toTimestamp,
|
|
99
|
+
resolution_ms: intervalMs,
|
|
100
|
+
}, undefined, undefined, undefined, true);
|
|
101
|
+
return response.map((data) => ({
|
|
102
|
+
timestamp: data.timestamp_ms,
|
|
103
|
+
open: data.open,
|
|
104
|
+
close: data.close,
|
|
105
|
+
high: data.high,
|
|
106
|
+
low: data.low,
|
|
107
|
+
volume: data.volume,
|
|
108
|
+
}));
|
|
125
109
|
});
|
|
126
110
|
// =========================================================================
|
|
127
111
|
// Inspections
|
|
128
112
|
// =========================================================================
|
|
113
|
+
this.setPositionLeverage = (inputs) => __awaiter(this, void 0, void 0, function* () {
|
|
114
|
+
return this.Provider.indexerCaller.fetchIndexer(`perpetuals/account/set-position-leverage`, {
|
|
115
|
+
wallet_address: utils_1.Helpers.addLeadingZeroesToType(inputs.walletAddress),
|
|
116
|
+
signature: inputs.signature,
|
|
117
|
+
bytes: inputs.bytes,
|
|
118
|
+
}, undefined, undefined, undefined, true);
|
|
119
|
+
});
|
|
120
|
+
this.fetchAllPositionLeverages = (inputs) => __awaiter(this, void 0, void 0, function* () {
|
|
121
|
+
return (yield this.Provider.indexerCaller.fetchIndexer(`perpetuals/accounts/${inputs.accountId}/position-leverages`, undefined, undefined, undefined, undefined, true)).map((data) => ({
|
|
122
|
+
marketId: data.market_id,
|
|
123
|
+
leverage: data.leverage,
|
|
124
|
+
}));
|
|
125
|
+
});
|
|
126
|
+
this.fetchPositionLeverages = (inputs) => __awaiter(this, void 0, void 0, function* () {
|
|
127
|
+
const marketIds = inputs.marketIds.map((objectId) => utils_1.Helpers.addLeadingZeroesToType(objectId));
|
|
128
|
+
const leverages = yield this.Provider.indexerCaller.fetchIndexer(`perpetuals/accounts/${inputs.accountId}/position-leverages`, undefined, {
|
|
129
|
+
market_ids: marketIds,
|
|
130
|
+
}, undefined, undefined, true);
|
|
131
|
+
return marketIds.map((objectId) => {
|
|
132
|
+
var _a;
|
|
133
|
+
return ((_a = leverages.find((leverage) => leverage.market_id === objectId)) !== null && _a !== void 0 ? _a : {
|
|
134
|
+
leverage: 1,
|
|
135
|
+
}).leverage;
|
|
136
|
+
});
|
|
137
|
+
});
|
|
129
138
|
this.fetchPreviewOrder = (
|
|
130
139
|
// TODO: remove unused inputs
|
|
131
140
|
inputs) => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -160,6 +169,7 @@ class PerpetualsApi {
|
|
|
160
169
|
position: response.position,
|
|
161
170
|
collateralCoinType: inputs.collateralCoinType,
|
|
162
171
|
marketId: inputs.marketId,
|
|
172
|
+
leverage,
|
|
163
173
|
});
|
|
164
174
|
return {
|
|
165
175
|
postedSize,
|
|
@@ -873,207 +883,6 @@ class PerpetualsApi {
|
|
|
873
883
|
.parse(new Uint8Array(bytes));
|
|
874
884
|
return orderInfos.map((orderInfo) => utils_1.Casting.perpetuals.orderInfoFromRaw(orderInfo));
|
|
875
885
|
});
|
|
876
|
-
// public fetchExecutionPrice = async (
|
|
877
|
-
// inputs: ApiPerpetualsExecutionPriceBody & {
|
|
878
|
-
// collateralCoinType: CoinType;
|
|
879
|
-
// marketId: PerpetualsMarketId;
|
|
880
|
-
// }
|
|
881
|
-
// ): Promise<ApiPerpetualsExecutionPriceResponse> => {
|
|
882
|
-
// const {
|
|
883
|
-
// // collateral,
|
|
884
|
-
// collateralCoinType,
|
|
885
|
-
// marketId,
|
|
886
|
-
// side,
|
|
887
|
-
// size,
|
|
888
|
-
// price,
|
|
889
|
-
// lotSize,
|
|
890
|
-
// basePriceFeedId,
|
|
891
|
-
// collateralPriceFeedId,
|
|
892
|
-
// } = inputs;
|
|
893
|
-
// // TODO: change this
|
|
894
|
-
// const collateral = BigInt(1000000000000000);
|
|
895
|
-
// // const accountCapId = perpetualsBcsRegistry
|
|
896
|
-
// // .ser(`Account<${collateralCoinType}>`, {
|
|
897
|
-
// // id: {
|
|
898
|
-
// // id: {
|
|
899
|
-
// // bytes: "0x0000000000000000000000000000000000000000000000000000000000000321",
|
|
900
|
-
// // },
|
|
901
|
-
// // },
|
|
902
|
-
// // accountId: 0,
|
|
903
|
-
// // collateral,
|
|
904
|
-
// // })
|
|
905
|
-
// // .toBytes();
|
|
906
|
-
// const depositCoinBytes = perpetualsRegistry.Coin.serialize({
|
|
907
|
-
// id: "0x0000000000000000000000000000000000000000000000000000000000000123",
|
|
908
|
-
// balance: {
|
|
909
|
-
// value: BigInt(1000000000000000),
|
|
910
|
-
// },
|
|
911
|
-
// }).toBytes();
|
|
912
|
-
// const walletAddress = InspectionsApiHelpers.constants.devInspectSigner;
|
|
913
|
-
// const tx = new Transaction();
|
|
914
|
-
// tx.setSender(walletAddress);
|
|
915
|
-
// const accountCapId = this.createAccountTx({
|
|
916
|
-
// ...inputs,
|
|
917
|
-
// tx,
|
|
918
|
-
// });
|
|
919
|
-
// this.depositCollateralTx({
|
|
920
|
-
// tx,
|
|
921
|
-
// collateralCoinType,
|
|
922
|
-
// accountCapId,
|
|
923
|
-
// coinBytes: depositCoinBytes,
|
|
924
|
-
// });
|
|
925
|
-
// const { sessionPotatoId } = this.createTxAndStartSession({
|
|
926
|
-
// tx,
|
|
927
|
-
// accountCapId,
|
|
928
|
-
// collateralCoinType,
|
|
929
|
-
// marketId,
|
|
930
|
-
// walletAddress,
|
|
931
|
-
// basePriceFeedId,
|
|
932
|
-
// collateralPriceFeedId,
|
|
933
|
-
// collateralChange: collateral,
|
|
934
|
-
// hasPosition: false,
|
|
935
|
-
// });
|
|
936
|
-
// this.placeLimitOrderTx({
|
|
937
|
-
// tx,
|
|
938
|
-
// side,
|
|
939
|
-
// size,
|
|
940
|
-
// collateralCoinType,
|
|
941
|
-
// sessionPotatoId,
|
|
942
|
-
// orderType: PerpetualsOrderType.Standard,
|
|
943
|
-
// price:
|
|
944
|
-
// price ??
|
|
945
|
-
// (side === PerpetualsOrderSide.Bid
|
|
946
|
-
// ? BigInt("0x7FFFFFFFFFFFFFFF") // 2^63 - 1
|
|
947
|
-
// : BigInt(1)),
|
|
948
|
-
// });
|
|
949
|
-
// this.getHotPotatoFieldsTx({
|
|
950
|
-
// tx,
|
|
951
|
-
// collateralCoinType,
|
|
952
|
-
// sessionPotatoId,
|
|
953
|
-
// });
|
|
954
|
-
// this.endSessionAndTransferAccount({
|
|
955
|
-
// ...inputs,
|
|
956
|
-
// tx,
|
|
957
|
-
// sessionPotatoId,
|
|
958
|
-
// walletAddress,
|
|
959
|
-
// collateralChange: BigInt(0),
|
|
960
|
-
// });
|
|
961
|
-
// const { events } =
|
|
962
|
-
// await this.Provider.Inspections().fetchAllBytesFromTx({
|
|
963
|
-
// tx,
|
|
964
|
-
// });
|
|
965
|
-
// const filledTakerEvent = EventsApiHelpers.findCastEventOrUndefined({
|
|
966
|
-
// events,
|
|
967
|
-
// eventType: this.eventTypes.filledTakerOrder,
|
|
968
|
-
// castFunction: Casting.perpetuals.filledTakerOrderEventFromOnChain,
|
|
969
|
-
// });
|
|
970
|
-
// const sizeNum = lotSize * Math.abs(Number(size));
|
|
971
|
-
// if (!filledTakerEvent) {
|
|
972
|
-
// return {
|
|
973
|
-
// executionPrice: 0,
|
|
974
|
-
// sizeFilled: 0,
|
|
975
|
-
// sizePosted: sizeNum,
|
|
976
|
-
// fills: [],
|
|
977
|
-
// };
|
|
978
|
-
// }
|
|
979
|
-
// const filledOrderEvents =
|
|
980
|
-
// Aftermath.helpers.events.findCastEventsOrUndefined({
|
|
981
|
-
// events,
|
|
982
|
-
// eventType: this.eventTypes.filledTakerOrder,
|
|
983
|
-
// castFunction:
|
|
984
|
-
// Casting.perpetuals.filledTakerOrderEventFromOnChain,
|
|
985
|
-
// });
|
|
986
|
-
// const fills: PerpetualsFilledOrderData[] = filledOrderEvents.map(
|
|
987
|
-
// (event) => {
|
|
988
|
-
// const size = Math.abs(
|
|
989
|
-
// Casting.IFixed.numberFromIFixed(event.baseAssetDelta)
|
|
990
|
-
// );
|
|
991
|
-
// const sizeUsd = Math.abs(
|
|
992
|
-
// Casting.IFixed.numberFromIFixed(event.quoteAssetDelta)
|
|
993
|
-
// );
|
|
994
|
-
// const price = sizeUsd / size;
|
|
995
|
-
// return {
|
|
996
|
-
// size,
|
|
997
|
-
// price,
|
|
998
|
-
// };
|
|
999
|
-
// }
|
|
1000
|
-
// );
|
|
1001
|
-
// const executionPrice = Perpetuals.calcEntryPrice(filledTakerEvent);
|
|
1002
|
-
// const sizeFilled = Math.abs(
|
|
1003
|
-
// Casting.IFixed.numberFromIFixed(filledTakerEvent.baseAssetDelta)
|
|
1004
|
-
// );
|
|
1005
|
-
// const sizePosted = sizeNum - sizeFilled;
|
|
1006
|
-
// return {
|
|
1007
|
-
// executionPrice,
|
|
1008
|
-
// sizeFilled,
|
|
1009
|
-
// sizePosted,
|
|
1010
|
-
// fills,
|
|
1011
|
-
// };
|
|
1012
|
-
// // const { fillReceipts, postReceipt } =
|
|
1013
|
-
// // await this.fetchMarketOrderReceipts(inputs);
|
|
1014
|
-
// // const sizePosted = postReceipt !== undefined ? postReceipt.size : 0;
|
|
1015
|
-
// // if (fillReceipts.length <= 0)
|
|
1016
|
-
// // return price !== undefined
|
|
1017
|
-
// // ? // simulating limit order
|
|
1018
|
-
// // {
|
|
1019
|
-
// // executionPrice: Perpetuals.orderPriceToPrice({
|
|
1020
|
-
// // orderPrice: price,
|
|
1021
|
-
// // lotSize,
|
|
1022
|
-
// // tickSize,
|
|
1023
|
-
// // }),
|
|
1024
|
-
// // sizeFilled: 0,
|
|
1025
|
-
// // sizePosted: Number(sizePosted),
|
|
1026
|
-
// // }
|
|
1027
|
-
// // : // simulating market order
|
|
1028
|
-
// // {
|
|
1029
|
-
// // executionPrice: 0,
|
|
1030
|
-
// // sizeFilled: 0,
|
|
1031
|
-
// // sizePosted: 0,
|
|
1032
|
-
// // };
|
|
1033
|
-
// // const sizeFilled = Helpers.sumBigInt(
|
|
1034
|
-
// // fillReceipts.map((receipt) => receipt.size)
|
|
1035
|
-
// // );
|
|
1036
|
-
// // const executionPrice = fillReceipts.reduce((acc, receipt) => {
|
|
1037
|
-
// // const orderPrice = PerpetualsOrderUtils.price(
|
|
1038
|
-
// // receipt.orderId,
|
|
1039
|
-
// // inputs.side === PerpetualsOrderSide.Ask
|
|
1040
|
-
// // ? PerpetualsOrderSide.Bid
|
|
1041
|
-
// // : PerpetualsOrderSide.Ask
|
|
1042
|
-
// // );
|
|
1043
|
-
// // const orderPriceNum = Perpetuals.orderPriceToPrice({
|
|
1044
|
-
// // orderPrice,
|
|
1045
|
-
// // lotSize,
|
|
1046
|
-
// // tickSize,
|
|
1047
|
-
// // });
|
|
1048
|
-
// // return (
|
|
1049
|
-
// // acc +
|
|
1050
|
-
// // orderPriceNum * (Number(receipt.size) / Number(sizeFilled))
|
|
1051
|
-
// // );
|
|
1052
|
-
// // }, 0);
|
|
1053
|
-
// // return {
|
|
1054
|
-
// // executionPrice,
|
|
1055
|
-
// // sizeFilled: Number(sizeFilled),
|
|
1056
|
-
// // sizePosted: Number(sizePosted),
|
|
1057
|
-
// // };
|
|
1058
|
-
// };
|
|
1059
|
-
this.createTxAndStartSession = (inputs) => {
|
|
1060
|
-
const { collateralChange, walletAddress, hasPosition } = inputs;
|
|
1061
|
-
const { tx: inputsTx } = inputs, nonTxInputs = __rest(inputs, ["tx"]);
|
|
1062
|
-
const tx = inputsTx !== null && inputsTx !== void 0 ? inputsTx : new transactions_1.Transaction();
|
|
1063
|
-
tx.setSender(walletAddress);
|
|
1064
|
-
if (!hasPosition) {
|
|
1065
|
-
this.createMarketPositionTx(Object.assign(Object.assign({}, nonTxInputs), { tx }));
|
|
1066
|
-
}
|
|
1067
|
-
if (collateralChange > BigInt(0)) {
|
|
1068
|
-
this.allocateCollateralTx(Object.assign(Object.assign({}, nonTxInputs), { tx, amount: collateralChange }));
|
|
1069
|
-
}
|
|
1070
|
-
const sessionPotatoId = this.startSessionTx(Object.assign(Object.assign({}, nonTxInputs), { tx }));
|
|
1071
|
-
return { tx, sessionPotatoId };
|
|
1072
|
-
};
|
|
1073
|
-
this.endSessionAndShareMarket = (inputs) => {
|
|
1074
|
-
const marketId = this.endSessionTx(inputs);
|
|
1075
|
-
this.shareClearingHouseTx(Object.assign(Object.assign({}, inputs), { marketId }));
|
|
1076
|
-
};
|
|
1077
886
|
// =========================================================================
|
|
1078
887
|
// Event Types
|
|
1079
888
|
// =========================================================================
|
|
@@ -1210,83 +1019,92 @@ class PerpetualsApi {
|
|
|
1210
1019
|
// =========================================================================
|
|
1211
1020
|
// Events
|
|
1212
1021
|
// =========================================================================
|
|
1213
|
-
|
|
1022
|
+
fetchAccountCollateralHistory(inputs) {
|
|
1214
1023
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1215
|
-
const {
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
// for (const [index, event] of eventsData.events.entries()) {
|
|
1239
|
-
// if (index >= eventsData.events.length - 1) {
|
|
1240
|
-
// eventsData.events[index].collateralDelta = event.collateral;
|
|
1241
|
-
// continue;
|
|
1242
|
-
// }
|
|
1243
|
-
// const previousEvent = eventsData.events[index + 1];
|
|
1244
|
-
// eventsData.events[index].collateralDelta =
|
|
1245
|
-
// Casting.IFixed.iFixedFromNumber(
|
|
1246
|
-
// Math.abs(
|
|
1247
|
-
// Casting.IFixed.numberFromIFixed(event.collateral)
|
|
1248
|
-
// ) -
|
|
1249
|
-
// Math.abs(
|
|
1250
|
-
// Casting.IFixed.numberFromIFixed(
|
|
1251
|
-
// previousEvent.collateral
|
|
1252
|
-
// )
|
|
1253
|
-
// )
|
|
1254
|
-
// );
|
|
1255
|
-
// }
|
|
1256
|
-
// // if more events exist then remove last event since unable to calculate collateral delta
|
|
1257
|
-
// if (cursor !== undefined) {
|
|
1258
|
-
// eventsData.events = eventsData.events.slice(0, -1);
|
|
1259
|
-
// }
|
|
1260
|
-
// return eventsData;
|
|
1024
|
+
const { accountCapId, cursor, limit } = inputs;
|
|
1025
|
+
const response = yield this.Provider.indexerCaller.fetchIndexer(`perpetuals/accounts/collateral-history`, {
|
|
1026
|
+
account_id: utils_1.Helpers.addLeadingZeroesToType(accountCapId),
|
|
1027
|
+
timestamp_before_ms: cursor !== null && cursor !== void 0 ? cursor : new Date().valueOf(),
|
|
1028
|
+
limit: limit !== null && limit !== void 0 ? limit : PerpetualsApi.constants.defaultLimitStepSize,
|
|
1029
|
+
}, undefined, undefined, undefined, true);
|
|
1030
|
+
const collateralChanges = response.map((data) => (Object.assign({ eventName: data.event_type, timestamp: data.timestamp, txDigest: data.tx_digest }, (data.event_type === "Deposit" ||
|
|
1031
|
+
data.event_type === "Withdraw" ||
|
|
1032
|
+
data.event_type === "Allocate" ||
|
|
1033
|
+
data.event_type === "Deallocate"
|
|
1034
|
+
? {
|
|
1035
|
+
collateralChange: BigInt(data.collateral_change),
|
|
1036
|
+
}
|
|
1037
|
+
: {
|
|
1038
|
+
collateralChangeUsd: Number(data.collateral_change_usd),
|
|
1039
|
+
}))));
|
|
1040
|
+
return {
|
|
1041
|
+
collateralChanges,
|
|
1042
|
+
// TODO: move `nextCursor` finding pattern to helper ?
|
|
1043
|
+
nextCursor: collateralChanges.length > 0
|
|
1044
|
+
? collateralChanges[collateralChanges.length - 1].timestamp
|
|
1045
|
+
: undefined,
|
|
1046
|
+
};
|
|
1261
1047
|
});
|
|
1262
1048
|
}
|
|
1263
|
-
|
|
1049
|
+
fetchAccountOrderHistory(inputs) {
|
|
1264
1050
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1265
|
-
const {
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
?
|
|
1273
|
-
:
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1051
|
+
const { accountCapId, cursor, limit } = inputs;
|
|
1052
|
+
const response = yield this.Provider.indexerCaller.fetchIndexer(`perpetuals/accounts/trade-history`, {
|
|
1053
|
+
account_id: utils_1.Helpers.addLeadingZeroesToType(accountCapId),
|
|
1054
|
+
timestamp_before_ms: cursor !== null && cursor !== void 0 ? cursor : new Date().valueOf(),
|
|
1055
|
+
limit: limit !== null && limit !== void 0 ? limit : PerpetualsApi.constants.defaultLimitStepSize,
|
|
1056
|
+
}, undefined, undefined, undefined, true);
|
|
1057
|
+
const trades = response.map((data) => (Object.assign(Object.assign({ eventName: data.event_type, timestamp: data.timestamp, txDigest: data.tx_digest, marketId: utils_1.Helpers.addLeadingZeroesToType(data.ch_id), side: data.is_ask
|
|
1058
|
+
? perpetualsTypes_1.PerpetualsOrderSide.Ask
|
|
1059
|
+
: perpetualsTypes_1.PerpetualsOrderSide.Bid }, (data.event_type === "Canceled" ||
|
|
1060
|
+
data.event_type === "Posted" ||
|
|
1061
|
+
data.event_type === "FilledMaker"
|
|
1062
|
+
? {
|
|
1063
|
+
sizeLots: BigInt(data.size),
|
|
1064
|
+
}
|
|
1065
|
+
: {
|
|
1066
|
+
size: Number(data.size),
|
|
1067
|
+
})), (data.event_type === "Canceled" ||
|
|
1068
|
+
data.event_type === "Posted" ||
|
|
1069
|
+
data.event_type === "FilledMaker"
|
|
1070
|
+
? {
|
|
1071
|
+
orderPrice: BigInt(data.price),
|
|
1072
|
+
}
|
|
1073
|
+
: {
|
|
1074
|
+
price: Number(data.price),
|
|
1075
|
+
}))));
|
|
1076
|
+
return {
|
|
1077
|
+
trades,
|
|
1078
|
+
// TODO: move `nextCursor` finding pattern to helper ?
|
|
1079
|
+
nextCursor: trades.length > 0
|
|
1080
|
+
? trades[trades.length - 1].timestamp
|
|
1081
|
+
: undefined,
|
|
1082
|
+
};
|
|
1281
1083
|
});
|
|
1282
1084
|
}
|
|
1283
|
-
|
|
1085
|
+
fetchMarketTradeHistory(inputs) {
|
|
1284
1086
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1285
1087
|
const { marketId, cursor, limit } = inputs;
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1088
|
+
const response = yield this.Provider.indexerCaller.fetchIndexer(`perpetuals/markets/trade-history`, {
|
|
1089
|
+
ch_id: utils_1.Helpers.addLeadingZeroesToType(marketId),
|
|
1090
|
+
timestamp_before_ms: cursor !== null && cursor !== void 0 ? cursor : new Date().valueOf(),
|
|
1091
|
+
limit: limit !== null && limit !== void 0 ? limit : PerpetualsApi.constants.defaultLimitStepSize,
|
|
1092
|
+
}, undefined, undefined, undefined, true);
|
|
1093
|
+
const trades = response.map((data) => ({
|
|
1094
|
+
timestamp: data.timestamp,
|
|
1095
|
+
txDigest: data.tx_digest,
|
|
1096
|
+
side: data.is_ask
|
|
1097
|
+
? perpetualsTypes_1.PerpetualsOrderSide.Ask
|
|
1098
|
+
: perpetualsTypes_1.PerpetualsOrderSide.Bid,
|
|
1099
|
+
sizeFilled: data.size_filled,
|
|
1100
|
+
orderPrice: data.order_price,
|
|
1101
|
+
}));
|
|
1102
|
+
return {
|
|
1103
|
+
trades,
|
|
1104
|
+
nextCursor: trades.length > 0
|
|
1105
|
+
? trades[trades.length - 1].timestamp
|
|
1106
|
+
: undefined,
|
|
1107
|
+
};
|
|
1290
1108
|
});
|
|
1291
1109
|
}
|
|
1292
1110
|
// =========================================================================
|
|
@@ -1295,15 +1113,10 @@ class PerpetualsApi {
|
|
|
1295
1113
|
fetchMarket24hrVolume(inputs) {
|
|
1296
1114
|
return __awaiter(this, void 0, void 0, function* () {
|
|
1297
1115
|
const { marketId } = inputs;
|
|
1298
|
-
const response = yield this.Provider.indexerCaller.fetchIndexer(`perpetuals/markets/${marketId}/24hr-volume
|
|
1299
|
-
if (response.length === 0)
|
|
1300
|
-
return {
|
|
1301
|
-
volumeUsd: 0,
|
|
1302
|
-
volumeBaseAssetAmount: 0,
|
|
1303
|
-
};
|
|
1116
|
+
const response = yield this.Provider.indexerCaller.fetchIndexer(`perpetuals/markets/${marketId}/24hr-volume`, undefined, undefined, undefined, undefined, true);
|
|
1304
1117
|
return {
|
|
1305
|
-
|
|
1306
|
-
|
|
1118
|
+
volumeBaseAssetAmount: response.market_volume,
|
|
1119
|
+
volumeUsd: response.market_volume_usd,
|
|
1307
1120
|
};
|
|
1308
1121
|
});
|
|
1309
1122
|
}
|
|
@@ -1333,69 +1146,297 @@ PerpetualsApi.constants = {
|
|
|
1333
1146
|
clearingHouse: "clearing_house",
|
|
1334
1147
|
account: "account",
|
|
1335
1148
|
},
|
|
1149
|
+
defaultLimitStepSize: 256,
|
|
1336
1150
|
};
|
|
1151
|
+
// public fetchExecutionPrice = async (
|
|
1152
|
+
// inputs: ApiPerpetualsExecutionPriceBody & {
|
|
1153
|
+
// collateralCoinType: CoinType;
|
|
1154
|
+
// marketId: PerpetualsMarketId;
|
|
1155
|
+
// }
|
|
1156
|
+
// ): Promise<ApiPerpetualsExecutionPriceResponse> => {
|
|
1157
|
+
// const {
|
|
1158
|
+
// // collateral,
|
|
1159
|
+
// collateralCoinType,
|
|
1160
|
+
// marketId,
|
|
1161
|
+
// side,
|
|
1162
|
+
// size,
|
|
1163
|
+
// price,
|
|
1164
|
+
// lotSize,
|
|
1165
|
+
// basePriceFeedId,
|
|
1166
|
+
// collateralPriceFeedId,
|
|
1167
|
+
// } = inputs;
|
|
1168
|
+
// // TODO: change this
|
|
1169
|
+
// const collateral = BigInt(1000000000000000);
|
|
1170
|
+
// // const accountCapId = perpetualsBcsRegistry
|
|
1171
|
+
// // .ser(`Account<${collateralCoinType}>`, {
|
|
1172
|
+
// // id: {
|
|
1173
|
+
// // id: {
|
|
1174
|
+
// // bytes: "0x0000000000000000000000000000000000000000000000000000000000000321",
|
|
1175
|
+
// // },
|
|
1176
|
+
// // },
|
|
1177
|
+
// // accountId: 0,
|
|
1178
|
+
// // collateral,
|
|
1179
|
+
// // })
|
|
1180
|
+
// // .toBytes();
|
|
1181
|
+
// const depositCoinBytes = perpetualsRegistry.Coin.serialize({
|
|
1182
|
+
// id: "0x0000000000000000000000000000000000000000000000000000000000000123",
|
|
1183
|
+
// balance: {
|
|
1184
|
+
// value: BigInt(1000000000000000),
|
|
1185
|
+
// },
|
|
1186
|
+
// }).toBytes();
|
|
1187
|
+
// const walletAddress = InspectionsApiHelpers.constants.devInspectSigner;
|
|
1188
|
+
// const tx = new Transaction();
|
|
1189
|
+
// tx.setSender(walletAddress);
|
|
1190
|
+
// const accountCapId = this.createAccountTx({
|
|
1191
|
+
// ...inputs,
|
|
1192
|
+
// tx,
|
|
1193
|
+
// });
|
|
1194
|
+
// this.depositCollateralTx({
|
|
1195
|
+
// tx,
|
|
1196
|
+
// collateralCoinType,
|
|
1197
|
+
// accountCapId,
|
|
1198
|
+
// coinBytes: depositCoinBytes,
|
|
1199
|
+
// });
|
|
1200
|
+
// const { sessionPotatoId } = this.createTxAndStartSession({
|
|
1201
|
+
// tx,
|
|
1202
|
+
// accountCapId,
|
|
1203
|
+
// collateralCoinType,
|
|
1204
|
+
// marketId,
|
|
1205
|
+
// walletAddress,
|
|
1206
|
+
// basePriceFeedId,
|
|
1207
|
+
// collateralPriceFeedId,
|
|
1208
|
+
// collateralChange: collateral,
|
|
1209
|
+
// hasPosition: false,
|
|
1210
|
+
// });
|
|
1211
|
+
// this.placeLimitOrderTx({
|
|
1212
|
+
// tx,
|
|
1213
|
+
// side,
|
|
1214
|
+
// size,
|
|
1215
|
+
// collateralCoinType,
|
|
1216
|
+
// sessionPotatoId,
|
|
1217
|
+
// orderType: PerpetualsOrderType.Standard,
|
|
1218
|
+
// price:
|
|
1219
|
+
// price ??
|
|
1220
|
+
// (side === PerpetualsOrderSide.Bid
|
|
1221
|
+
// ? BigInt("0x7FFFFFFFFFFFFFFF") // 2^63 - 1
|
|
1222
|
+
// : BigInt(1)),
|
|
1223
|
+
// });
|
|
1224
|
+
// this.getHotPotatoFieldsTx({
|
|
1225
|
+
// tx,
|
|
1226
|
+
// collateralCoinType,
|
|
1227
|
+
// sessionPotatoId,
|
|
1228
|
+
// });
|
|
1229
|
+
// this.endSessionAndTransferAccount({
|
|
1230
|
+
// ...inputs,
|
|
1231
|
+
// tx,
|
|
1232
|
+
// sessionPotatoId,
|
|
1233
|
+
// walletAddress,
|
|
1234
|
+
// collateralChange: BigInt(0),
|
|
1235
|
+
// });
|
|
1236
|
+
// const { events } =
|
|
1237
|
+
// await this.Provider.Inspections().fetchAllBytesFromTx({
|
|
1238
|
+
// tx,
|
|
1239
|
+
// });
|
|
1240
|
+
// const filledTakerEvent = EventsApiHelpers.findCastEventOrUndefined({
|
|
1241
|
+
// events,
|
|
1242
|
+
// eventType: this.eventTypes.filledTakerOrder,
|
|
1243
|
+
// castFunction: Casting.perpetuals.filledTakerOrderEventFromOnChain,
|
|
1244
|
+
// });
|
|
1245
|
+
// const sizeNum = lotSize * Math.abs(Number(size));
|
|
1246
|
+
// if (!filledTakerEvent) {
|
|
1247
|
+
// return {
|
|
1248
|
+
// executionPrice: 0,
|
|
1249
|
+
// sizeFilled: 0,
|
|
1250
|
+
// sizePosted: sizeNum,
|
|
1251
|
+
// fills: [],
|
|
1252
|
+
// };
|
|
1253
|
+
// }
|
|
1254
|
+
// const filledOrderEvents =
|
|
1255
|
+
// Aftermath.helpers.events.findCastEventsOrUndefined({
|
|
1256
|
+
// events,
|
|
1257
|
+
// eventType: this.eventTypes.filledTakerOrder,
|
|
1258
|
+
// castFunction:
|
|
1259
|
+
// Casting.perpetuals.filledTakerOrderEventFromOnChain,
|
|
1260
|
+
// });
|
|
1261
|
+
// const fills: PerpetualsFilledOrderData[] = filledOrderEvents.map(
|
|
1262
|
+
// (event) => {
|
|
1263
|
+
// const size = Math.abs(
|
|
1264
|
+
// Casting.IFixed.numberFromIFixed(event.baseAssetDelta)
|
|
1265
|
+
// );
|
|
1266
|
+
// const sizeUsd = Math.abs(
|
|
1267
|
+
// Casting.IFixed.numberFromIFixed(event.quoteAssetDelta)
|
|
1268
|
+
// );
|
|
1269
|
+
// const price = sizeUsd / size;
|
|
1270
|
+
// return {
|
|
1271
|
+
// size,
|
|
1272
|
+
// price,
|
|
1273
|
+
// };
|
|
1274
|
+
// }
|
|
1275
|
+
// );
|
|
1276
|
+
// const executionPrice = Perpetuals.calcEntryPrice(filledTakerEvent);
|
|
1277
|
+
// const sizeFilled = Math.abs(
|
|
1278
|
+
// Casting.IFixed.numberFromIFixed(filledTakerEvent.baseAssetDelta)
|
|
1279
|
+
// );
|
|
1280
|
+
// const sizePosted = sizeNum - sizeFilled;
|
|
1281
|
+
// return {
|
|
1282
|
+
// executionPrice,
|
|
1283
|
+
// sizeFilled,
|
|
1284
|
+
// sizePosted,
|
|
1285
|
+
// fills,
|
|
1286
|
+
// };
|
|
1287
|
+
// // const { fillReceipts, postReceipt } =
|
|
1288
|
+
// // await this.fetchMarketOrderReceipts(inputs);
|
|
1289
|
+
// // const sizePosted = postReceipt !== undefined ? postReceipt.size : 0;
|
|
1290
|
+
// // if (fillReceipts.length <= 0)
|
|
1291
|
+
// // return price !== undefined
|
|
1292
|
+
// // ? // simulating limit order
|
|
1293
|
+
// // {
|
|
1294
|
+
// // executionPrice: Perpetuals.orderPriceToPrice({
|
|
1295
|
+
// // orderPrice: price,
|
|
1296
|
+
// // lotSize,
|
|
1297
|
+
// // tickSize,
|
|
1298
|
+
// // }),
|
|
1299
|
+
// // sizeFilled: 0,
|
|
1300
|
+
// // sizePosted: Number(sizePosted),
|
|
1301
|
+
// // }
|
|
1302
|
+
// // : // simulating market order
|
|
1303
|
+
// // {
|
|
1304
|
+
// // executionPrice: 0,
|
|
1305
|
+
// // sizeFilled: 0,
|
|
1306
|
+
// // sizePosted: 0,
|
|
1307
|
+
// // };
|
|
1308
|
+
// // const sizeFilled = Helpers.sumBigInt(
|
|
1309
|
+
// // fillReceipts.map((receipt) => receipt.size)
|
|
1310
|
+
// // );
|
|
1311
|
+
// // const executionPrice = fillReceipts.reduce((acc, receipt) => {
|
|
1312
|
+
// // const orderPrice = PerpetualsOrderUtils.price(
|
|
1313
|
+
// // receipt.orderId,
|
|
1314
|
+
// // inputs.side === PerpetualsOrderSide.Ask
|
|
1315
|
+
// // ? PerpetualsOrderSide.Bid
|
|
1316
|
+
// // : PerpetualsOrderSide.Ask
|
|
1317
|
+
// // );
|
|
1318
|
+
// // const orderPriceNum = Perpetuals.orderPriceToPrice({
|
|
1319
|
+
// // orderPrice,
|
|
1320
|
+
// // lotSize,
|
|
1321
|
+
// // tickSize,
|
|
1322
|
+
// // });
|
|
1323
|
+
// // return (
|
|
1324
|
+
// // acc +
|
|
1325
|
+
// // orderPriceNum * (Number(receipt.size) / Number(sizeFilled))
|
|
1326
|
+
// // );
|
|
1327
|
+
// // }, 0);
|
|
1328
|
+
// // return {
|
|
1329
|
+
// // executionPrice,
|
|
1330
|
+
// // sizeFilled: Number(sizeFilled),
|
|
1331
|
+
// // sizePosted: Number(sizePosted),
|
|
1332
|
+
// // };
|
|
1333
|
+
// };
|
|
1334
|
+
// private createTxAndStartSession = (inputs: {
|
|
1335
|
+
// tx?: Transaction;
|
|
1336
|
+
// collateralCoinType: CoinType;
|
|
1337
|
+
// accountCapId: ObjectId | TransactionArgument;
|
|
1338
|
+
// marketId: PerpetualsMarketId;
|
|
1339
|
+
// marketInitialSharedVersion: ObjectVersion;
|
|
1340
|
+
// basePriceFeedId: ObjectId;
|
|
1341
|
+
// collateralPriceFeedId: ObjectId;
|
|
1342
|
+
// walletAddress: SuiAddress;
|
|
1343
|
+
// collateralChange: Balance;
|
|
1344
|
+
// hasPosition: boolean;
|
|
1345
|
+
// }) => {
|
|
1346
|
+
// const { collateralChange, walletAddress, hasPosition } = inputs;
|
|
1347
|
+
// const { tx: inputsTx, ...nonTxInputs } = inputs;
|
|
1348
|
+
// const tx = inputsTx ?? new Transaction();
|
|
1349
|
+
// tx.setSender(walletAddress);
|
|
1350
|
+
// if (!hasPosition) {
|
|
1351
|
+
// this.createMarketPositionTx({
|
|
1352
|
+
// ...nonTxInputs,
|
|
1353
|
+
// tx,
|
|
1354
|
+
// });
|
|
1355
|
+
// }
|
|
1356
|
+
// if (collateralChange > BigInt(0)) {
|
|
1357
|
+
// this.allocateCollateralTx({
|
|
1358
|
+
// ...nonTxInputs,
|
|
1359
|
+
// tx,
|
|
1360
|
+
// amount: collateralChange,
|
|
1361
|
+
// });
|
|
1362
|
+
// }
|
|
1363
|
+
// const sessionPotatoId = this.startSessionTx({
|
|
1364
|
+
// ...nonTxInputs,
|
|
1365
|
+
// tx,
|
|
1366
|
+
// });
|
|
1367
|
+
// return { tx, sessionPotatoId };
|
|
1368
|
+
// };
|
|
1369
|
+
// private endSessionAndShareMarket = (inputs: {
|
|
1370
|
+
// tx: Transaction;
|
|
1371
|
+
// collateralCoinType: CoinType;
|
|
1372
|
+
// sessionPotatoId: ObjectId | TransactionArgument;
|
|
1373
|
+
// }) => {
|
|
1374
|
+
// const marketId = this.endSessionTx(inputs);
|
|
1375
|
+
// this.shareClearingHouseTx({
|
|
1376
|
+
// ...inputs,
|
|
1377
|
+
// marketId,
|
|
1378
|
+
// });
|
|
1379
|
+
// };
|
|
1337
1380
|
// =========================================================================
|
|
1338
1381
|
// Public Static Helpers
|
|
1339
1382
|
// =========================================================================
|
|
1340
1383
|
PerpetualsApi.bucketOrders = (inputs) => {
|
|
1341
1384
|
const { orders, side, lotSize, tickSize, priceBucketSize, initialBucketedOrders, } = inputs;
|
|
1342
|
-
let dataPoints =
|
|
1385
|
+
let dataPoints = initialBucketedOrders !== null && initialBucketedOrders !== void 0 ? initialBucketedOrders : [];
|
|
1386
|
+
const roundPrice = (price, bucketSize) => {
|
|
1387
|
+
return Math.round(price / bucketSize) * bucketSize;
|
|
1388
|
+
};
|
|
1389
|
+
const comparePrices = (price1, price2, bucketSize) => {
|
|
1390
|
+
return Math.abs(price1 - price2) < bucketSize / 2;
|
|
1391
|
+
};
|
|
1392
|
+
orders.forEach((order) => {
|
|
1343
1393
|
const actualPrice = perpetuals_1.Perpetuals.orderPriceToPrice({
|
|
1344
1394
|
lotSize,
|
|
1345
1395
|
tickSize: Math.abs(tickSize),
|
|
1346
1396
|
orderPrice: order.price,
|
|
1347
1397
|
});
|
|
1348
|
-
const roundedPrice =
|
|
1349
|
-
// negative tick size means order filled
|
|
1398
|
+
const roundedPrice = roundPrice(actualPrice, priceBucketSize);
|
|
1350
1399
|
const size = lotSize * Number(order.size) * (tickSize < 0 ? -1 : 1);
|
|
1351
1400
|
const sizeUsd = size * actualPrice;
|
|
1352
|
-
const placementIndex =
|
|
1353
|
-
? roundedPrice <= dataPoint.price &&
|
|
1354
|
-
roundedPrice > dataPoint.price - priceBucketSize
|
|
1355
|
-
: roundedPrice >= dataPoint.price &&
|
|
1356
|
-
roundedPrice < dataPoint.price + priceBucketSize);
|
|
1401
|
+
const placementIndex = dataPoints.findIndex((dataPoint) => comparePrices(roundedPrice, dataPoint.price, priceBucketSize));
|
|
1357
1402
|
if (placementIndex < 0) {
|
|
1358
|
-
// no bucket exists; create bucket
|
|
1359
|
-
const insertIndex = acc.findIndex((dataPoint) => side === perpetualsTypes_1.PerpetualsOrderSide.Ask
|
|
1360
|
-
? roundedPrice <= dataPoint.price
|
|
1361
|
-
: roundedPrice >= dataPoint.price);
|
|
1362
1403
|
const newDataPoint = {
|
|
1363
1404
|
size,
|
|
1364
1405
|
sizeUsd,
|
|
1365
|
-
totalSize:
|
|
1366
|
-
totalSizeUsd:
|
|
1406
|
+
totalSize: size,
|
|
1407
|
+
totalSizeUsd: sizeUsd,
|
|
1367
1408
|
price: roundedPrice,
|
|
1368
1409
|
};
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1410
|
+
const insertIndex = dataPoints.findIndex((dataPoint) => side === perpetualsTypes_1.PerpetualsOrderSide.Ask
|
|
1411
|
+
? roundedPrice <= dataPoint.price
|
|
1412
|
+
: roundedPrice >= dataPoint.price);
|
|
1413
|
+
if (insertIndex < 0) {
|
|
1414
|
+
dataPoints.push(newDataPoint);
|
|
1374
1415
|
}
|
|
1375
1416
|
else {
|
|
1376
|
-
|
|
1377
|
-
...acc.slice(0, insertIndex),
|
|
1378
|
-
newDataPoint,
|
|
1379
|
-
...acc.slice(insertIndex + 1),
|
|
1380
|
-
];
|
|
1417
|
+
dataPoints.splice(insertIndex, 0, newDataPoint);
|
|
1381
1418
|
}
|
|
1382
1419
|
}
|
|
1383
1420
|
else {
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1421
|
+
dataPoints[placementIndex].size += size;
|
|
1422
|
+
dataPoints[placementIndex].sizeUsd += sizeUsd;
|
|
1423
|
+
dataPoints[placementIndex].totalSize += size;
|
|
1424
|
+
dataPoints[placementIndex].totalSizeUsd += sizeUsd;
|
|
1388
1425
|
}
|
|
1389
|
-
}
|
|
1390
|
-
// remove 0 size buckets
|
|
1426
|
+
});
|
|
1391
1427
|
dataPoints = dataPoints.filter((data) => data.size > 0 && data.sizeUsd > 0);
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1428
|
+
for (let index = 0; index < dataPoints.length; index++) {
|
|
1429
|
+
if (index > 0) {
|
|
1430
|
+
dataPoints[index].totalSize =
|
|
1431
|
+
dataPoints[index - 1].totalSize + dataPoints[index].size;
|
|
1432
|
+
dataPoints[index].totalSizeUsd =
|
|
1433
|
+
dataPoints[index - 1].totalSizeUsd +
|
|
1434
|
+
dataPoints[index].sizeUsd;
|
|
1435
|
+
}
|
|
1436
|
+
else {
|
|
1437
|
+
dataPoints[index].totalSize = dataPoints[index].size;
|
|
1438
|
+
dataPoints[index].totalSizeUsd = dataPoints[index].sizeUsd;
|
|
1439
|
+
}
|
|
1399
1440
|
}
|
|
1400
1441
|
if (side === perpetualsTypes_1.PerpetualsOrderSide.Ask) {
|
|
1401
1442
|
dataPoints.reverse();
|