aftermath-ts-sdk
Version:
Aftermath TypeScript SDK
442 lines (441 loc) • 21.6 kB
JavaScript
"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,
};
};