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.
Files changed (69) hide show
  1. package/dist/general/apiHelpers/transactionsApiHelpers.d.ts +8 -0
  2. package/dist/general/apiHelpers/transactionsApiHelpers.d.ts.map +1 -1
  3. package/dist/general/apiHelpers/transactionsApiHelpers.js +73 -0
  4. package/dist/general/providers/aftermath.d.ts +6 -0
  5. package/dist/general/providers/aftermath.d.ts.map +1 -1
  6. package/dist/general/providers/aftermath.js +8 -0
  7. package/dist/general/providers/aftermathApi.d.ts +2 -0
  8. package/dist/general/providers/aftermathApi.d.ts.map +1 -1
  9. package/dist/general/providers/aftermathApi.js +4 -0
  10. package/dist/general/types/castingTypes.d.ts +1 -0
  11. package/dist/general/types/castingTypes.d.ts.map +1 -1
  12. package/dist/general/types/configTypes.d.ts +13 -0
  13. package/dist/general/types/configTypes.d.ts.map +1 -1
  14. package/dist/general/types/generalTypes.d.ts +1 -0
  15. package/dist/general/types/generalTypes.d.ts.map +1 -1
  16. package/dist/general/utils/casting.d.ts +2 -0
  17. package/dist/general/utils/casting.d.ts.map +1 -1
  18. package/dist/general/utils/casting.js +2 -0
  19. package/dist/packages/dca/api/dcaApi.d.ts +44 -0
  20. package/dist/packages/dca/api/dcaApi.d.ts.map +1 -0
  21. package/dist/packages/dca/api/dcaApi.js +215 -0
  22. package/dist/packages/dca/api/dcaApiCasting.d.ts +11 -0
  23. package/dist/packages/dca/api/dcaApiCasting.d.ts.map +1 -0
  24. package/dist/packages/dca/api/dcaApiCasting.js +170 -0
  25. package/dist/packages/dca/api/dcaApiCastingTypes.d.ts +132 -0
  26. package/dist/packages/dca/api/dcaApiCastingTypes.d.ts.map +1 -0
  27. package/dist/packages/dca/api/dcaApiCastingTypes.js +2 -0
  28. package/dist/packages/dca/dca.d.ts +87 -0
  29. package/dist/packages/dca/dca.d.ts.map +1 -0
  30. package/dist/packages/dca/dca.js +138 -0
  31. package/dist/packages/dca/dcaTypes.d.ts +130 -0
  32. package/dist/packages/dca/dcaTypes.d.ts.map +1 -0
  33. package/dist/packages/dca/dcaTypes.js +2 -0
  34. package/dist/packages/dca/index.d.ts +2 -0
  35. package/dist/packages/dca/index.d.ts.map +1 -0
  36. package/dist/packages/dca/index.js +17 -0
  37. package/dist/packages/multisig/api/multisigApi.d.ts +2 -0
  38. package/dist/packages/multisig/api/multisigApi.d.ts.map +1 -0
  39. package/dist/packages/multisig/api/multisigApi.js +49 -0
  40. package/dist/packages/multisig/index.d.ts +2 -0
  41. package/dist/packages/multisig/index.d.ts.map +1 -0
  42. package/dist/packages/multisig/index.js +3 -0
  43. package/dist/packages/multisig/multisig.d.ts +2 -0
  44. package/dist/packages/multisig/multisig.d.ts.map +1 -0
  45. package/dist/packages/multisig/multisig.js +37 -0
  46. package/dist/packages/multisig/multisigTypes.d.ts +2 -0
  47. package/dist/packages/multisig/multisigTypes.d.ts.map +1 -0
  48. package/dist/packages/multisig/multisigTypes.js +13 -0
  49. package/dist/packages/perpetuals/api/perpetualsApi.d.ts +19 -14
  50. package/dist/packages/perpetuals/api/perpetualsApi.d.ts.map +1 -1
  51. package/dist/packages/perpetuals/api/perpetualsApi.js +403 -362
  52. package/dist/packages/perpetuals/api/perpetualsApiCasting.d.ts +1 -0
  53. package/dist/packages/perpetuals/api/perpetualsApiCasting.d.ts.map +1 -1
  54. package/dist/packages/perpetuals/api/perpetualsApiCasting.js +5 -3
  55. package/dist/packages/perpetuals/perpetuals.d.ts.map +1 -1
  56. package/dist/packages/perpetuals/perpetualsAccount.d.ts +16 -4
  57. package/dist/packages/perpetuals/perpetualsAccount.d.ts.map +1 -1
  58. package/dist/packages/perpetuals/perpetualsAccount.js +50 -22
  59. package/dist/packages/perpetuals/perpetualsCastingTypes.d.ts +7 -6
  60. package/dist/packages/perpetuals/perpetualsCastingTypes.d.ts.map +1 -1
  61. package/dist/packages/perpetuals/perpetualsMarket.d.ts +3 -33
  62. package/dist/packages/perpetuals/perpetualsMarket.d.ts.map +1 -1
  63. package/dist/packages/perpetuals/perpetualsMarket.js +8 -184
  64. package/dist/packages/perpetuals/perpetualsTypes.d.ts +65 -16
  65. package/dist/packages/perpetuals/perpetualsTypes.d.ts.map +1 -1
  66. package/dist/packages/router/api/routerApi.d.ts +0 -2
  67. package/dist/packages/router/api/routerApi.d.ts.map +1 -1
  68. package/dist/packages/router/api/routerApi.js +7 -48
  69. 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 { accountId, orderDatas } = inputs;
72
- const orderReceiptEvents = yield this.Provider.indexerCaller.fetchIndexer(`perpetuals/accounts/${accountId}/orders`, undefined, {
73
- order_ids: orderDatas.map((order) => String(order.orderId).replaceAll("n", "")),
74
- });
75
- if (orderReceiptEvents.length !== orderDatas.length)
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 orderReceiptEvents.map((event, index) => {
78
- const _a = utils_1.Casting.perpetuals.postedOrderReceiptEventFromOnChain(event), { size: initialSize } = _a, castEvent = __rest(_a, ["size"]);
79
- const orderData = orderDatas.find((orderData) => orderData.orderId === castEvent.orderId);
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 Object.assign(Object.assign({}, castEvent), { side: perpetuals_1.Perpetuals.orderIdToSide(castEvent.orderId), filledSize: initialSize - orderData.currentSize, initialSize });
83
- });
84
- });
85
- this.fetchSubscribeToAllEvents = (inputs) => __awaiter(this, void 0, void 0, function* () {
86
- const { onEvent } = inputs;
87
- const unsubscribe = yield this.Provider.provider.subscribeEvent({
88
- // filter: {
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 [prices, volumes] = (yield Promise.all([
113
- this.Provider.indexerCaller.fetchIndexer(`perpetuals/markets/${marketId}/historical-price`, undefined, {
114
- from: fromTimestamp,
115
- to: toTimestamp,
116
- interval: intervalMs,
117
- }),
118
- this.Provider.indexerCaller.fetchIndexer(`perpetuals/markets/${marketId}/historical-volume`, undefined, {
119
- from: fromTimestamp,
120
- to: toTimestamp,
121
- interval: intervalMs,
122
- }),
123
- ]));
124
- return { prices, volumes };
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
- fetchAccountCollateralEvents(inputs) {
1022
+ fetchAccountCollateralHistory(inputs) {
1214
1023
  return __awaiter(this, void 0, void 0, function* () {
1215
- const { accountId, cursor, limit } = inputs;
1216
- return this.Provider.indexerCaller.fetchIndexerEvents(`perpetuals/accounts/${accountId}/events/collateral`, {
1217
- cursor,
1218
- limit,
1219
- }, (event) => {
1220
- const eventType = event.type;
1221
- return eventType === this.eventTypes.withdrewCollateral
1222
- ? utils_1.Casting.perpetuals.withdrewCollateralEventFromOnChain(event)
1223
- : eventType === this.eventTypes.depositedCollateral
1224
- ? utils_1.Casting.perpetuals.depositedCollateralEventFromOnChain(event)
1225
- : eventType === this.eventTypes.settledFunding
1226
- ? utils_1.Casting.perpetuals.settledFundingEventFromOnChain(event)
1227
- : eventType === this.eventTypes.allocatedCollateral
1228
- ? utils_1.Casting.perpetuals.allocatedCollateralEventFromOnChain(event)
1229
- : eventType === this.eventTypes.deallocatedCollateral
1230
- ? utils_1.Casting.perpetuals.deallocatedCollateralEventFromOnChain(event)
1231
- : eventType === this.eventTypes.liquidated
1232
- ? utils_1.Casting.perpetuals.liquidatedEventFromOnChain(event)
1233
- : eventType === this.eventTypes.filledMakerOrder
1234
- ? utils_1.Casting.perpetuals.filledMakerOrderEventFromOnChain(event)
1235
- : utils_1.Casting.perpetuals.filledTakerOrderEventFromOnChain(event);
1236
- });
1237
- // // set collateral delta based off of previous event
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
- fetchAccountOrderEvents(inputs) {
1049
+ fetchAccountOrderHistory(inputs) {
1264
1050
  return __awaiter(this, void 0, void 0, function* () {
1265
- const { accountId, cursor, limit } = inputs;
1266
- return this.Provider.indexerCaller.fetchIndexerEvents(`perpetuals/accounts/${accountId}/events/order`, {
1267
- cursor,
1268
- limit,
1269
- }, (event) => {
1270
- const eventType = event.type;
1271
- return eventType === this.eventTypes.canceledOrder
1272
- ? utils_1.Casting.perpetuals.canceledOrderEventFromOnChain(event)
1273
- : eventType === this.eventTypes.postedOrderReceipt
1274
- ? utils_1.Casting.perpetuals.postedOrderReceiptEventFromOnChain(event)
1275
- : eventType === this.eventTypes.liquidated
1276
- ? utils_1.Casting.perpetuals.liquidatedEventFromOnChain(event)
1277
- : eventType === this.eventTypes.filledMakerOrder
1278
- ? utils_1.Casting.perpetuals.filledMakerOrderEventFromOnChain(event)
1279
- : utils_1.Casting.perpetuals.filledTakerOrderEventFromOnChain(event);
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
- fetchMarketFilledOrderEvents(inputs) {
1085
+ fetchMarketTradeHistory(inputs) {
1284
1086
  return __awaiter(this, void 0, void 0, function* () {
1285
1087
  const { marketId, cursor, limit } = inputs;
1286
- return this.Provider.indexerCaller.fetchIndexerEvents(`perpetuals/markets/${marketId}/events/filled-order`, {
1287
- cursor,
1288
- limit,
1289
- }, (event) => utils_1.Casting.perpetuals.filledTakerOrderEventFromOnChain(event));
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
- volumeUsd: response[0].volumeUsd,
1306
- volumeBaseAssetAmount: response[0].volume,
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 = orders.reduce((acc, order) => {
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 = Math.round(actualPrice / priceBucketSize) * priceBucketSize;
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 = acc.findIndex((dataPoint) => side === perpetualsTypes_1.PerpetualsOrderSide.Ask
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: 0,
1366
- totalSizeUsd: 0,
1406
+ totalSize: size,
1407
+ totalSizeUsd: sizeUsd,
1367
1408
  price: roundedPrice,
1368
1409
  };
1369
- if (insertIndex === 0) {
1370
- return [newDataPoint, ...acc];
1371
- }
1372
- else if (insertIndex < 0) {
1373
- return [...acc, newDataPoint];
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
- return [
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
- // bucket found
1385
- const newAcc = Array.from(acc);
1386
- newAcc[placementIndex] = Object.assign(Object.assign({}, newAcc[placementIndex]), { size: newAcc[placementIndex].size + size, totalSize: newAcc[placementIndex].totalSize + size, sizeUsd: newAcc[placementIndex].sizeUsd + sizeUsd, totalSizeUsd: newAcc[placementIndex].totalSizeUsd + sizeUsd });
1387
- return newAcc;
1421
+ dataPoints[placementIndex].size += size;
1422
+ dataPoints[placementIndex].sizeUsd += sizeUsd;
1423
+ dataPoints[placementIndex].totalSize += size;
1424
+ dataPoints[placementIndex].totalSizeUsd += sizeUsd;
1388
1425
  }
1389
- }, initialBucketedOrders !== null && initialBucketedOrders !== void 0 ? initialBucketedOrders : []);
1390
- // remove 0 size buckets
1426
+ });
1391
1427
  dataPoints = dataPoints.filter((data) => data.size > 0 && data.sizeUsd > 0);
1392
- // compute total sizes
1393
- for (const [index, data] of dataPoints.entries()) {
1394
- dataPoints[index] = Object.assign(Object.assign({}, data), { totalSize: index > 0
1395
- ? dataPoints[index - 1].totalSize + data.size
1396
- : data.size, totalSizeUsd: index > 0
1397
- ? dataPoints[index - 1].totalSizeUsd + data.sizeUsd
1398
- : data.sizeUsd });
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();