UNPKG

aftermath-ts-sdk

Version:
442 lines (441 loc) 21.6 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.PerpetualsApiCasting = void 0; const perpetualsTypes_1 = require("../perpetualsTypes"); const utils_1 = require("../../../general/utils"); const __1 = require("../.."); const fixedUtils_1 = require("../../../general/utils/fixedUtils"); const bcs_1 = require("@mysten/sui/bcs"); // TODO: handle 0xs and leading 0s everywhere class PerpetualsApiCasting { // ========================================================================= // Objects // ========================================================================= // ========================================================================= // Account // ========================================================================= static rawAccountCapFromRaw(data, collateralCoinType, version, digest) { return { collateralCoinType, objectId: utils_1.Helpers.addLeadingZeroesToType(data.id), objectType: data.objectType, // use Helpers.addLeadingZeroesToType ? objectVersion: version, objectDigest: digest, accountId: BigInt(data.accountId), collateral: BigInt(data.collateral.value), }; } // ========================================================================= // Clearing House // ========================================================================= static marketDataFromIndexerResponse(data, collateralCoinType, baseAssetSymbol) { return { packageId: utils_1.Casting.addressFromStringBytes(data.pkg_id), objectId: utils_1.Casting.addressFromStringBytes(data.object.id.id), initialSharedVersion: Number(data.initial_shared_version), collateralCoinType, marketParams: this.marketParamsFromIndexerResponse(data.object.market_params, baseAssetSymbol), marketState: this.marketStateFromIndexerResponse(data.object.market_state), }; } // ========================================================================= // Orderbook // ========================================================================= static orderbookFromIndexerResponse(data, lotSize, tickSize) { const partialOrderbook = { asks: Object.entries(data.asks).reduce((acc, [orderId, order]) => (Object.assign(Object.assign({}, acc), { [orderId]: { accountId: BigInt(order.account_id), size: Number(order.size) * __1.Perpetuals.lotOrTickSizeToNumber(lotSize), price: __1.Perpetuals.orderPriceToPrice({ orderPrice: __1.Perpetuals.OrderUtils.price(BigInt(orderId)), lotSize, tickSize, }), } })), {}), bids: Object.entries(data.bids).reduce((acc, [orderId, order]) => (Object.assign(Object.assign({}, acc), { [orderId]: { accountId: BigInt(order.account_id), size: Number(order.size) * __1.Perpetuals.lotOrTickSizeToNumber(lotSize), price: __1.Perpetuals.orderPriceToPrice({ orderPrice: __1.Perpetuals.OrderUtils.price(BigInt(orderId)), lotSize, tickSize, }), } })), {}), asksTotalSize: Number(data.asks_size) * __1.Perpetuals.lotOrTickSizeToNumber(lotSize), bidsTotalSize: Number(data.bids_size) * __1.Perpetuals.lotOrTickSizeToNumber(lotSize), }; const bids = Object.values(partialOrderbook.bids); const asks = Object.values(partialOrderbook.asks); const bestBidPrice = bids.length <= 0 ? undefined : Math.max(...bids.map((order) => order.price)); const bestAskPrice = asks.length <= 0 ? undefined : Math.min(...asks.map((order) => order.price)); const midPrice = bestBidPrice === undefined || bestAskPrice === undefined ? undefined : (bestBidPrice + bestAskPrice) / 2; return Object.assign(Object.assign({}, partialOrderbook), { bestBidPrice, bestAskPrice, midPrice }); } } exports.PerpetualsApiCasting = PerpetualsApiCasting; _a = PerpetualsApiCasting; // public static partialPositionFromRaw = ( // data: any // ): Omit<PerpetualsPosition, "collateralCoinType" | "marketId"> => { // return { // collateral: BigInt(data.collateral), // baseAssetAmount: BigInt(data.baseAssetAmount), // quoteAssetNotionalAmount: BigInt(data.quoteAssetNotionalAmount), // cumFundingRateLong: BigInt(data.cumFundingRateLong), // cumFundingRateShort: BigInt(data.cumFundingRateShort), // asksQuantity: BigInt(data.asksQuantity), // bidsQuantity: BigInt(data.bidsQuantity), // pendingOrders: BigInt(data.pendingOrders), // makerFee: BigInt(data.makerFee), // takerFee: BigInt(data.takerFee), // }; // }; PerpetualsApiCasting.positionFromIndexerReponse = (inputs) => { const { position, collateralCoinType, marketId, leverage } = inputs; return { collateralCoinType, leverage, collateral: utils_1.Casting.IFixed.iFixedFromStringBytes(position.position.collateral), baseAssetAmount: utils_1.Casting.IFixed.iFixedFromStringBytes(position.position.base_asset_amount), quoteAssetNotionalAmount: utils_1.Casting.IFixed.iFixedFromStringBytes(position.position.quote_asset_notional_amount), cumFundingRateLong: utils_1.Casting.IFixed.iFixedFromStringBytes(position.position.cum_funding_rate_long), cumFundingRateShort: utils_1.Casting.IFixed.iFixedFromStringBytes(position.position.cum_funding_rate_short), asksQuantity: utils_1.Casting.IFixed.iFixedFromStringBytes(position.position.asks_quantity), bidsQuantity: utils_1.Casting.IFixed.iFixedFromStringBytes(position.position.bids_quantity), marketId: utils_1.Helpers.addLeadingZeroesToType(marketId), // NOTE: do we want to store all pending order data here as well ? pendingOrders: [ ...Object.entries(position.pending_orders.bids).map(([orderId, size]) => ({ size: BigInt(size), orderId: BigInt(orderId), side: perpetualsTypes_1.PerpetualsOrderSide.Bid, })), ...Object.entries(position.pending_orders.asks).map(([orderId, size]) => ({ size: BigInt(size), orderId: BigInt(orderId), side: perpetualsTypes_1.PerpetualsOrderSide.Ask, })), ], makerFee: utils_1.Casting.IFixed.iFixedFromStringBytes(position.position.maker_fee), takerFee: utils_1.Casting.IFixed.iFixedFromStringBytes(position.position.taker_fee), }; }; PerpetualsApiCasting.accountObjectFromIndexerResponse = (response, collateralCoinType) => { return { positions: response.map(([marketIdAsStringBytes, position, leverageAsStringBytes]) => _a.positionFromIndexerReponse({ position, collateralCoinType, leverage: utils_1.Casting.IFixed.numberFromIFixed(utils_1.Casting.IFixed.iFixedFromStringBytes(leverageAsStringBytes)) || 1, marketId: utils_1.Casting.addressFromStringBytes(marketIdAsStringBytes), })), }; }; PerpetualsApiCasting.marketParamsFromIndexerResponse = (data, baseAssetSymbol) => { return { baseAssetSymbol, basePriceFeedId: utils_1.Casting.addressFromStringBytes(data.base_pfs_id), collateralPriceFeedId: utils_1.Casting.addressFromStringBytes(data.collateral_pfs_id), marginRatioInitial: utils_1.Casting.IFixed.iFixedFromStringBytes(data.margin_ratio_initial), marginRatioMaintenance: utils_1.Casting.IFixed.iFixedFromStringBytes(data.margin_ratio_maintenance), fundingFrequencyMs: BigInt(data.funding_frequency_ms), fundingPeriodMs: BigInt(data.funding_period_ms), premiumTwapFrequencyMs: BigInt(data.premium_twap_frequency_ms), premiumTwapPeriodMs: BigInt(data.premium_twap_period_ms), spreadTwapFrequencyMs: BigInt(data.spread_twap_frequency_ms), spreadTwapPeriodMs: BigInt(data.spread_twap_period_ms), makerFee: utils_1.Casting.IFixed.iFixedFromStringBytes(data.maker_fee), takerFee: utils_1.Casting.IFixed.iFixedFromStringBytes(data.taker_fee), liquidationFee: utils_1.Casting.IFixed.iFixedFromStringBytes(data.liquidation_fee), forceCancelFee: utils_1.Casting.IFixed.iFixedFromStringBytes(data.force_cancel_fee), insuranceFundFee: utils_1.Casting.IFixed.iFixedFromStringBytes(data.insurance_fund_fee), lotSize: BigInt(data.lot_size), tickSize: BigInt(data.tick_size), liquidationTolerance: BigInt(data.liquidation_tolerance), maxPendingOrders: BigInt(data.max_pending_orders), minOrderUsdValue: utils_1.Casting.IFixed.iFixedFromStringBytes(data.min_order_usd_value), oracleTolerance: BigInt(data.oracle_tolerance), }; }; PerpetualsApiCasting.marketStateFromIndexerResponse = (data) => { return { cumFundingRateLong: utils_1.Casting.IFixed.iFixedFromStringBytes(data.cum_funding_rate_long), cumFundingRateShort: utils_1.Casting.IFixed.iFixedFromStringBytes(data.cum_funding_rate_short), fundingLastUpdateMs: Number(data.funding_last_upd_ms), premiumTwap: utils_1.Casting.IFixed.iFixedFromStringBytes(data.premium_twap), premiumTwapLastUpdateMs: Number(data.premium_twap_last_upd_ms), spreadTwap: utils_1.Casting.IFixed.iFixedFromStringBytes(data.spread_twap), spreadTwapLastUpdateMs: Number(data.spread_twap_last_upd_ms), openInterest: utils_1.Casting.IFixed.iFixedFromStringBytes(data.open_interest), feesAccrued: utils_1.Casting.IFixed.iFixedFromStringBytes(data.fees_accrued), }; }; PerpetualsApiCasting.orderbookPriceFromBytes = (bytes) => { const unwrapped = bcs_1.bcs.option(bcs_1.bcs.u256()).parse(new Uint8Array(bytes)); return fixedUtils_1.FixedUtils.directCast(unwrapped != null ? BigInt(unwrapped) : BigInt(0)); }; PerpetualsApiCasting.orderInfoFromRaw = (data) => { return { price: BigInt(data.price), size: BigInt(data.size), }; }; // ========================================================================= // Events // ========================================================================= // ========================================================================= // Updated Version // ========================================================================= PerpetualsApiCasting.UpdatedMarketVersionEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { marketId: utils_1.Helpers.addLeadingZeroesToType(fields.ch_id), version: BigInt(fields.version), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; // ========================================================================= // Collateral // ========================================================================= PerpetualsApiCasting.withdrewCollateralEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { accountId: BigInt(fields.account_id), collateralDelta: BigInt(fields.collateral), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; PerpetualsApiCasting.depositedCollateralEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { accountId: BigInt(fields.account_id), collateralDelta: BigInt(fields.collateral), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; PerpetualsApiCasting.settledFundingEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { accountId: BigInt(fields.account_id), collateralDeltaUsd: BigInt(fields.collateral_change_usd), marketId: utils_1.Helpers.addLeadingZeroesToType(fields.ch_id), marketFundingRateLong: BigInt(fields.mkt_funding_rate_long), marketFundingRateShort: BigInt(fields.mkt_funding_rate_short), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; PerpetualsApiCasting.allocatedCollateralEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { accountId: BigInt(fields.account_id), collateralDelta: BigInt(fields.collateral), positionCollateralAfter: BigInt(fields.position_collateral_after), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; PerpetualsApiCasting.deallocatedCollateralEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { accountId: BigInt(fields.account_id), collateralDelta: BigInt(fields.collateral), positionCollateralAfter: BigInt(fields.position_collateral_after), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; // ========================================================================= // Liquidation // ========================================================================= PerpetualsApiCasting.liquidatedEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { accountId: BigInt(fields.liqee_account_id), collateralDeltaUsd: BigInt(fields.liqee_collateral_change_usd), liqorAccountId: BigInt(fields.liqor_account_id), marketId: utils_1.Helpers.addLeadingZeroesToType(fields.ch_id), markPrice: BigInt(fields.mark_price), size: BigInt(fields.size_liquidated), side: fields.is_liqee_long ? perpetualsTypes_1.PerpetualsOrderSide.Bid : perpetualsTypes_1.PerpetualsOrderSide.Ask, timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; // ========================================================================= // Account // ========================================================================= PerpetualsApiCasting.createdAccountEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { user: utils_1.Helpers.addLeadingZeroesToType(fields.user), accountId: BigInt(fields.account_id), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; // ========================================================================= // Order // ========================================================================= PerpetualsApiCasting.canceledOrderEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { accountId: BigInt(fields.account_id), marketId: utils_1.Helpers.addLeadingZeroesToType(fields.ch_id), side: __1.Perpetuals.orderIdToSide(BigInt(fields.order_id)), size: BigInt(fields.size), orderId: BigInt(fields.order_id), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; PerpetualsApiCasting.postedOrderEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { accountId: BigInt(fields.account_id), marketId: utils_1.Helpers.addLeadingZeroesToType(fields.ch_id), side: BigInt(fields.posted_base_ask) > BigInt(fields.posted_base_bid) ? perpetualsTypes_1.PerpetualsOrderSide.Ask : perpetualsTypes_1.PerpetualsOrderSide.Bid, size: BigInt(fields.posted_base_ask + fields.posted_base_bid), asksQuantity: BigInt(fields.pending_asks), bidsQuantity: BigInt(fields.pending_bids), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; PerpetualsApiCasting.filledMakerOrderEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { baseAssetAmount: BigInt(fields.maker_base_amount), accountId: BigInt(fields.maker_account_id), collateralDeltaUsd: BigInt(fields.collateral_change_usd), marketId: utils_1.Helpers.addLeadingZeroesToType(fields.ch_id), orderId: BigInt(fields.order_id), side: __1.Perpetuals.orderIdToSide(BigInt(fields.order_id)), size: BigInt(fields.maker_size), dropped: BigInt(fields.maker_final_size) === BigInt(0), quoteAssetNotionalAmount: BigInt(fields.maker_quote_amount), asksQuantity: BigInt(fields.maker_pending_asks_quantity), bidsQuantity: BigInt(fields.maker_pending_bids_quantity), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; PerpetualsApiCasting.filledTakerOrderEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; const baseAssetDelta = utils_1.Casting.IFixed.iFixedFromNumber(utils_1.Casting.IFixed.numberFromIFixed(BigInt(fields.base_asset_delta_bid)) - utils_1.Casting.IFixed.numberFromIFixed(BigInt(fields.base_asset_delta_ask))); return { baseAssetDelta, accountId: BigInt(fields.taker_account_id), collateralDeltaUsd: BigInt(fields.collateral_change_usd), marketId: utils_1.Helpers.addLeadingZeroesToType(fields.ch_id), baseAssetAmount: BigInt(fields.taker_base_amount), quoteAssetNotionalAmount: BigInt(fields.taker_quote_amount), side: __1.Perpetuals.positionSide({ baseAssetAmount: baseAssetDelta }), quoteAssetDelta: utils_1.Casting.IFixed.iFixedFromNumber(utils_1.Casting.IFixed.numberFromIFixed(BigInt(fields.quote_asset_delta_bid)) - utils_1.Casting.IFixed.numberFromIFixed(BigInt(fields.quote_asset_delta_ask))), liquidatedVolume: BigInt(fields.liquidated_volume), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; PerpetualsApiCasting.postedOrderReceiptEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { accountId: BigInt(fields.account_id), marketId: utils_1.Helpers.addLeadingZeroesToType(fields.ch_id), size: BigInt(fields.order_size), orderId: BigInt(fields.order_id), side: __1.Perpetuals.orderIdToSide(BigInt(fields.order_id)), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; PerpetualsApiCasting.reducedOrderEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { accountId: BigInt(fields.account_id), marketId: utils_1.Helpers.addLeadingZeroesToType(fields.ch_id), sizeChange: BigInt(fields.size_change), orderId: BigInt(fields.order_id), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; // ========================================================================= // Twap // ========================================================================= PerpetualsApiCasting.updatedPremiumTwapEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { marketId: utils_1.Helpers.addLeadingZeroesToType(fields.ch_id), indexPrice: BigInt(fields.index_price), bookPrice: BigInt(fields.book_price), premiumTwap: BigInt(fields.premium_twap), premiumTwapLastUpdateMs: Number(fields.premium_twap_last_upd_ms), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; PerpetualsApiCasting.updatedSpreadTwapEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { marketId: utils_1.Helpers.addLeadingZeroesToType(fields.ch_id), bookPrice: BigInt(fields.book_price), indexPrice: BigInt(fields.index_price), spreadTwap: BigInt(fields.spread_twap), spreadTwapLastUpdateMs: Number(fields.spread_twap_last_upd_ms), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; }; // ========================================================================= // Funding // ========================================================================= PerpetualsApiCasting.updatedFundingEventFromOnChain = (eventOnChain) => { const fields = eventOnChain.parsedJson; return { marketId: utils_1.Helpers.addLeadingZeroesToType(fields.ch_id), cumFundingRateLong: BigInt(fields.cum_funding_rate_long), cumFundingRateShort: BigInt(fields.cum_funding_rate_short), fundingLastUpdateMs: Number(fields.funding_last_upd_ms), timestamp: eventOnChain.timestampMs, txnDigest: eventOnChain.id.txDigest, type: eventOnChain.type, }; };