diff --git a/packages/indexer-nibi/src/defaultObjects.ts b/packages/indexer-nibi/src/defaultObjects.ts index dc379984..dbff153d 100644 --- a/packages/indexer-nibi/src/defaultObjects.ts +++ b/packages/indexer-nibi/src/defaultObjects.ts @@ -1,16 +1,31 @@ import { Block, + Delegation, + DistributionCommission, GovDeposit, GovProposal, GovVote, + Governance, MarkPriceCandle, + OracleEntry, + OraclePrice, + PerpLeaderboard, PerpMarket, PerpPosition, + PerpPositionChange, + Redelegation, + SpotLpPosition, SpotPool, - SpotPoolCreated, - SpotPoolExited, - SpotPoolJoined, + SpotPoolSwap, + StatsFees, + StatsPerpOpenInterest, + StatsPerpPnl, + StatsTotals, + StatsTvl, + StatsUsers, + StatsVolume, Token, + Unbonding, User, Validator, ValidatorStatus, @@ -154,7 +169,7 @@ export const defaultGovVote: GovVote = { sender: defaultUser, } -export const defaultMarkPriceCandlesObject: MarkPriceCandle = { +export const defaultMarkPriceCandles: MarkPriceCandle = { close: 0, high: 0, low: 0, @@ -163,3 +178,180 @@ export const defaultMarkPriceCandlesObject: MarkPriceCandle = { period: 0, periodStartTs: "", } + +export const defaultPerpPositionChanges: PerpPositionChange = { + badDebt: defaultToken, + block: defaultBlock, + changeReason: "", + eventSeqNo: 0, + exchangedNotional: 0, + exchangedSize: 0, + fundingPayment: 0, + latestCumulativePremiumFraction: 0, + margin: 0, + marginToUser: 0, + openNotional: 0, + pair: "", + positionNotional: 0, + realizedPnl: 0, + size: 0, + traderAddress: "", + transactionFee: defaultToken, + txSeqNo: 0, +} + +export const defaultPerpLeaderboard: PerpLeaderboard = { + avg_pct_pnl_rank: 0, + avg_pct_pnl: 0, + input_margin: 0, + raw_pnl: 0, + raw_pnl_with_unrealized: 0, + trader_address: "", +} + +export const defaultGovernance: Governance = { + govDeposits: [defaultGovDeposit], + govProposals: [defaultGovProposal], + govVotes: [defaultGovVote], +} + +export const defaultDistributionCommission: DistributionCommission = { + commission: [defaultToken], + validator: defaultValidator, +} + +export const defaultDelegations: Delegation = { + amount: 0, + delegator: defaultUser, + validator: defaultValidator, +} + +export const defaultRedelegations: Redelegation = { + amount: 0, + delegator: defaultUser, + source_validator: defaultValidator, + destination_validator: defaultValidator, + completion_time: "", + creation_block: defaultBlock, +} + +export const defaultSpotLpPosition: SpotLpPosition = { + created_block: defaultBlock, + pool: defaultPool, + pool_shares: defaultToken, + user: defaultUser, +} + +export const defaultSpotPoolSwap: SpotPoolSwap = { + block: defaultBlock, + pool: defaultPool, + token_in: defaultToken, + token_out: defaultToken, + user: defaultUser, +} + +export const defaultStatsFees: StatsFees = { + feesLiquidations: 0, + feesLiquidationsCumulative: 0, + feesPerp: 0, + feesPerpCumulative: 0, + feesSwap: 0, + feesSwapCumulative: 0, + feesTotal: 0, + feesTotalCumulative: 0, + period: 0, + periodStartTs: "", +} + +export const defaultPerpOpenInterest: StatsPerpOpenInterest = { + openInterestLong: 0, + openInterestShort: 0, + openInterestTotal: 0, + period: 0, + periodStartTs: "", +} + +export const defaultPerpPnl: StatsPerpPnl = { + loss: 0, + lossCumulative: 0, + netPnl: 0, + netPnlCumulative: 0, + period: 0, + periodStartTs: "", + profit: 0, + profitCumulative: 0, +} + +export const defaultTotals: StatsTotals = { + period: 0, + periodStartTs: "", + totalPerp: 0, + totalFeesPerp: 0, + totalFeesLiquidations: 0, + totalOpenInterest: 0, + totalSwap: 0, + totalTvl: 0, +} + +export const defaultTvl: StatsTvl = { + period: 0, + periodStartTs: "", + tvlPerp: 0, + tvlStablecoin: 0, + tvlStaking: 0, + tvlSwap: 0, + tvlTotal: 0, +} + +export const defaultUsers: StatsUsers = { + newUsersLp: 0, + newUsersLpCumulative: 0, + newUsersPerp: 0, + newUsersPerpCumulative: 0, + newUsersSwap: 0, + newUsersSwapCumulative: 0, + newUsersTotal: 0, + newUsersTotalCumulative: 0, + period: 0, + periodStartTs: "", + userActionsPerp: 0, + uniqueUsersLp: 0, + uniqueUsersPerp: 0, + uniqueUsersSwap: 0, + uniqueUsersTotal: 0, + userActionsLp: 0, + userActionsSwap: 0, + userActionsTotal: 0, +} + +export const defaultVolume: StatsVolume = { + volumePerp: 0, + volumePerpCumulative: 0, + volumeSwap: 0, + volumeSwapCumulative: 0, + volumeTotal: 0, + volumeTotalCumulative: 0, + period: 0, + periodStartTs: "", +} + +export const defaultUnbondings: Unbonding = { + amount: 0, + completion_time: "", + creation_block: defaultBlock, + delegator: defaultUser, + validator: defaultValidator, +} + +export const defaultOraclePrice: OraclePrice = { + block: defaultBlock, + eventSeqNo: 0, + pair: "", + price: 0, + txSeqNo: 0, +} + +export const defaultOracleEntry: OracleEntry = { + numVotes: 0, + validator: defaultValidator, +} diff --git a/packages/indexer-nibi/src/gql/generated.ts b/packages/indexer-nibi/src/gql/generated.ts index 748ccf09..e451baa1 100644 --- a/packages/indexer-nibi/src/gql/generated.ts +++ b/packages/indexer-nibi/src/gql/generated.ts @@ -75,6 +75,14 @@ export enum DistributionCommissionOrder { ValidatorAddress = "validator_address", } +export type FloatFilter = { + readonly eq?: InputMaybe + readonly gt?: InputMaybe + readonly gte?: InputMaybe + readonly lt?: InputMaybe + readonly lte?: InputMaybe +} + export type GovDeposit = { readonly __typename?: "GovDeposit" readonly amount: ReadonlyArray @@ -233,6 +241,64 @@ export enum MarkPriceCandlesOrder { PeriodStartTs = "period_start_ts", } +export type Oracle = { + readonly __typename?: "Oracle" + readonly oraclePrices: ReadonlyArray + readonly oracles: ReadonlyArray +} + +export type OracleOraclePricesArgs = { + limit?: InputMaybe + offset?: InputMaybe + order_by?: InputMaybe + order_desc?: InputMaybe + where?: InputMaybe +} + +export type OracleOraclesArgs = { + limit?: InputMaybe + order_by?: InputMaybe + order_desc?: InputMaybe + where?: InputMaybe +} + +export type OracleEntry = { + readonly __typename?: "OracleEntry" + readonly numVotes: Scalars["Int"]["output"] + readonly validator: Validator +} + +export type OraclePrice = { + readonly __typename?: "OraclePrice" + readonly block: Block + readonly eventSeqNo: Scalars["Int"]["output"] + readonly pair: Scalars["String"]["output"] + readonly price: Scalars["Float"]["output"] + readonly txSeqNo: Scalars["Int"]["output"] +} + +export type OraclePricesFilter = { + readonly block?: InputMaybe + readonly blockTs?: InputMaybe + readonly pair?: InputMaybe +} + +export enum OraclePricesOrder { + Pair = "pair", + Price = "price", + Sequence = "sequence", +} + +export type OraclesFilter = { + readonly numVotes?: InputMaybe + readonly validatorAddressEq?: InputMaybe +} + +export enum OraclesOrder { + NumVotes = "num_votes", + ValidatorAddress = "validator_address", +} + export type PeriodFilter = { readonly periodEq?: InputMaybe readonly periodGt?: InputMaybe @@ -246,6 +312,53 @@ export type PeriodFilter = { readonly periodStartTsLte?: InputMaybe } +export type Perp = { + readonly __typename?: "Perp" + readonly leaderboard: ReadonlyArray + readonly market?: Maybe + readonly markets: ReadonlyArray + readonly position?: Maybe + readonly positionChanges: ReadonlyArray + readonly positions: ReadonlyArray +} + +export type PerpLeaderboardArgs = { + limit?: InputMaybe + order_by?: InputMaybe + order_desc?: InputMaybe + where?: InputMaybe +} + +export type PerpMarketArgs = { + where: PerpMarketFilter +} + +export type PerpMarketsArgs = { + limit?: InputMaybe + order_by?: InputMaybe + order_desc?: InputMaybe + where?: InputMaybe +} + +export type PerpPositionArgs = { + where: PerpPositionFilter +} + +export type PerpPositionChangesArgs = { + limit?: InputMaybe + offset?: InputMaybe + order_by?: InputMaybe + order_desc?: InputMaybe + where: PerpPositionChangeFilter +} + +export type PerpPositionsArgs = { + limit?: InputMaybe + order_by?: InputMaybe + order_desc?: InputMaybe + where?: InputMaybe +} + export type PerpLeaderboard = { readonly __typename?: "PerpLeaderboard" readonly avg_pct_pnl: Scalars["Float"]["output"] @@ -282,7 +395,7 @@ export type PerpMarket = { readonly maintenance_margin_ratio: Scalars["Float"]["output"] readonly mark_price: Scalars["Float"]["output"] readonly mark_price_twap: Scalars["Float"]["output"] - readonly max_funding_rate: Scalars["Float"]["output"] + readonly max_funding_rate?: Maybe readonly max_leverage: Scalars["Float"]["output"] readonly pair: Scalars["String"]["output"] readonly partial_liquidation_ratio: Scalars["Float"]["output"] @@ -296,14 +409,18 @@ export type PerpMarket = { } export type PerpMarketFilter = { - readonly is_deleted?: InputMaybe - readonly pair?: InputMaybe + readonly pair: Scalars["String"]["input"] } export enum PerpMarketOrder { Pair = "pair", } +export type PerpMarketsFilter = { + readonly is_deleted?: InputMaybe + readonly pair?: InputMaybe +} + export type PerpPosition = { readonly __typename?: "PerpPosition" readonly bad_debt: Scalars["Float"]["output"] @@ -321,10 +438,49 @@ export type PerpPosition = { readonly unrealized_pnl: Scalars["Float"]["output"] } +export type PerpPositionChange = { + readonly __typename?: "PerpPositionChange" + readonly badDebt?: Maybe + readonly block: Block + readonly changeReason: Scalars["String"]["output"] + readonly eventSeqNo: Scalars["Int"]["output"] + readonly exchangedNotional: Scalars["Float"]["output"] + readonly exchangedSize: Scalars["Float"]["output"] + readonly fundingPayment?: Maybe + readonly latestCumulativePremiumFraction?: Maybe + readonly margin: Scalars["Float"]["output"] + readonly marginToUser?: Maybe + readonly openNotional: Scalars["Float"]["output"] + readonly pair: Scalars["String"]["output"] + readonly positionNotional: Scalars["Float"]["output"] + readonly realizedPnl?: Maybe + readonly size: Scalars["Float"]["output"] + readonly traderAddress: Scalars["String"]["output"] + readonly transactionFee?: Maybe + readonly txSeqNo: Scalars["Int"]["output"] +} + +export type PerpPositionChangeFilter = { + readonly block?: InputMaybe + readonly blockTs?: InputMaybe + readonly pair?: InputMaybe + readonly traderAddressEq: Scalars["String"]["input"] +} + +export enum PerpPositionChangeOrder { + ExchangedNotional = "exchanged_notional", + ExchangedSize = "exchanged_size", + Margin = "margin", + OpenNotional = "open_notional", + Pair = "pair", + PositionNotional = "position_notional", + Sequence = "sequence", + Size = "size", +} + export type PerpPositionFilter = { - readonly include_closed?: InputMaybe - readonly pair?: InputMaybe - readonly trader_address?: InputMaybe + readonly pair: Scalars["String"]["input"] + readonly trader_address: Scalars["String"]["input"] } export enum PerpPositionOrder { @@ -333,6 +489,12 @@ export enum PerpPositionOrder { TraderAddress = "trader_address", } +export type PerpPositionsFilter = { + readonly include_closed?: InputMaybe + readonly pair?: InputMaybe + readonly trader_address?: InputMaybe +} + export type Query = { readonly __typename?: "Query" readonly communityPool: ReadonlyArray @@ -340,10 +502,17 @@ export type Query = { readonly distributionCommissions: ReadonlyArray readonly governance: Governance readonly markPriceCandles: ReadonlyArray + readonly oracle: Oracle + readonly perp: Perp + /** @deprecated Moved to perp sub schema */ readonly perpLeaderboard: ReadonlyArray + /** @deprecated Moved to perp sub schema */ readonly perpMarket?: Maybe + /** @deprecated Moved to perp sub schema */ readonly perpMarkets: ReadonlyArray + /** @deprecated Moved to perp sub schema */ readonly perpPosition?: Maybe + /** @deprecated Moved to perp sub schema */ readonly perpPositions: ReadonlyArray readonly redelegations: ReadonlyArray readonly spotLpPositions: ReadonlyArray @@ -394,25 +563,25 @@ export type QueryPerpLeaderboardArgs = { } export type QueryPerpMarketArgs = { - where?: InputMaybe + where: PerpMarketFilter } export type QueryPerpMarketsArgs = { limit?: InputMaybe order_by?: InputMaybe order_desc?: InputMaybe - where?: InputMaybe + where?: InputMaybe } export type QueryPerpPositionArgs = { - where?: InputMaybe + where: PerpPositionFilter } export type QueryPerpPositionsArgs = { limit?: InputMaybe order_by?: InputMaybe order_desc?: InputMaybe - where?: InputMaybe + where?: InputMaybe } export type QueryRedelegationsArgs = { @@ -870,6 +1039,10 @@ export type StringFilter = { readonly like?: InputMaybe } +export type SubOraclePricesFilter = { + readonly pair: Scalars["String"]["input"] +} + export type SubPerpMarketFilter = { readonly pair: Scalars["String"]["input"] } @@ -882,6 +1055,7 @@ export type SubPerpPositionFilter = { export type Subscription = { readonly __typename?: "Subscription" readonly markPriceCandles: ReadonlyArray + readonly oraclePrices: ReadonlyArray readonly perpMarket: PerpMarket readonly perpPositions: ReadonlyArray } @@ -891,6 +1065,10 @@ export type SubscriptionMarkPriceCandlesArgs = { where?: InputMaybe } +export type SubscriptionOraclePricesArgs = { + where?: InputMaybe +} + export type SubscriptionPerpMarketArgs = { where: SubPerpMarketFilter } diff --git a/packages/indexer-nibi/src/gql/schema.graphql b/packages/indexer-nibi/src/gql/schema.graphql index e3fd2be6..82368c8d 100644 --- a/packages/indexer-nibi/src/gql/schema.graphql +++ b/packages/indexer-nibi/src/gql/schema.graphql @@ -47,6 +47,14 @@ enum DistributionCommissionOrder { validator_address } +input FloatFilter { + eq: Float + gt: Float + gte: Float + lt: Float + lte: Float +} + type GovDeposit { amount: [Token!]! block: Block! @@ -194,6 +202,57 @@ enum MarkPriceCandlesOrder { period_start_ts } +type Oracle { + oraclePrices( + limit: Int + offset: Int + order_by: OraclePricesOrder + order_desc: Boolean + where: OraclePricesFilter + ): [OraclePrice!]! + oracles( + limit: Int + order_by: OraclesOrder + order_desc: Boolean + where: OraclesFilter + ): [OracleEntry!]! +} + +type OracleEntry { + numVotes: Int! + validator: Validator! +} + +type OraclePrice { + block: Block! + eventSeqNo: Int! + pair: String! + price: Float! + txSeqNo: Int! +} + +input OraclePricesFilter { + block: IntFilter + blockTs: TimeFilter + pair: StringFilter +} + +enum OraclePricesOrder { + pair + price + sequence +} + +input OraclesFilter { + numVotes: IntFilter + validatorAddressEq: String +} + +enum OraclesOrder { + num_votes + validator_address +} + input PeriodFilter { periodEq: Int periodGt: Int @@ -207,6 +266,36 @@ input PeriodFilter { periodStartTsLte: Time } +type Perp { + leaderboard( + limit: Int + order_by: PerpLeaderboardOrder + order_desc: Boolean + where: PerpLeaderboardFilter + ): [PerpLeaderboard!]! + market(where: PerpMarketFilter!): PerpMarket + markets( + limit: Int + order_by: PerpMarketOrder + order_desc: Boolean + where: PerpMarketsFilter + ): [PerpMarket!]! + position(where: PerpPositionFilter!): PerpPosition + positionChanges( + limit: Int + offset: Int + order_by: PerpPositionChangeOrder + order_desc: Boolean + where: PerpPositionChangeFilter! + ): [PerpPositionChange!]! + positions( + limit: Int + order_by: PerpPositionOrder + order_desc: Boolean + where: PerpPositionsFilter + ): [PerpPosition!]! +} + type PerpLeaderboard { avg_pct_pnl: Float! avg_pct_pnl_rank: Int! @@ -241,7 +330,7 @@ type PerpMarket { maintenance_margin_ratio: Float! mark_price: Float! mark_price_twap: Float! - max_funding_rate: Float! + max_funding_rate: Float max_leverage: Float! pair: String! partial_liquidation_ratio: Float! @@ -255,14 +344,18 @@ type PerpMarket { } input PerpMarketFilter { - is_deleted: Boolean - pair: String + pair: String! } enum PerpMarketOrder { pair } +input PerpMarketsFilter { + is_deleted: Boolean + pair: String +} + type PerpPosition { bad_debt: Float! last_updated_block: Block! @@ -279,10 +372,48 @@ type PerpPosition { unrealized_pnl: Float! } +type PerpPositionChange { + badDebt: Token + block: Block! + changeReason: String! + eventSeqNo: Int! + exchangedNotional: Float! + exchangedSize: Float! + fundingPayment: Float + latestCumulativePremiumFraction: Float + margin: Float! + marginToUser: Int + openNotional: Float! + pair: String! + positionNotional: Float! + realizedPnl: Float + size: Float! + traderAddress: String! + transactionFee: Token + txSeqNo: Int! +} + +input PerpPositionChangeFilter { + block: IntFilter + blockTs: TimeFilter + pair: StringFilter + traderAddressEq: String! +} + +enum PerpPositionChangeOrder { + exchanged_notional + exchanged_size + margin + open_notional + pair + position_notional + sequence + size +} + input PerpPositionFilter { - include_closed: Boolean - pair: String - trader_address: String + pair: String! + trader_address: String! } enum PerpPositionOrder { @@ -291,6 +422,12 @@ enum PerpPositionOrder { trader_address } +input PerpPositionsFilter { + include_closed: Boolean + pair: String + trader_address: String +} + type Query { communityPool( limit: Int @@ -317,26 +454,30 @@ type Query { order_desc: Boolean where: MarkPriceCandlesFilter ): [MarkPriceCandle!]! + oracle: Oracle! + perp: Perp! perpLeaderboard( limit: Int order_by: PerpLeaderboardOrder order_desc: Boolean where: PerpLeaderboardFilter - ): [PerpLeaderboard!]! - perpMarket(where: PerpMarketFilter): PerpMarket + ): [PerpLeaderboard!]! @deprecated(reason: "Moved to perp sub schema") + perpMarket(where: PerpMarketFilter!): PerpMarket + @deprecated(reason: "Moved to perp sub schema") perpMarkets( limit: Int order_by: PerpMarketOrder order_desc: Boolean - where: PerpMarketFilter - ): [PerpMarket!]! - perpPosition(where: PerpPositionFilter): PerpPosition + where: PerpMarketsFilter + ): [PerpMarket!]! @deprecated(reason: "Moved to perp sub schema") + perpPosition(where: PerpPositionFilter!): PerpPosition + @deprecated(reason: "Moved to perp sub schema") perpPositions( limit: Int order_by: PerpPositionOrder order_desc: Boolean - where: PerpPositionFilter - ): [PerpPosition!]! + where: PerpPositionsFilter + ): [PerpPosition!]! @deprecated(reason: "Moved to perp sub schema") redelegations( limit: Int order_by: RedelegationOrder @@ -754,6 +895,10 @@ input StringFilter { like: String } +input SubOraclePricesFilter { + pair: String! +} + input SubPerpMarketFilter { pair: String! } @@ -768,6 +913,7 @@ type Subscription { limit: Int where: MarkPriceCandlesFilter ): [MarkPriceCandle!]! + oraclePrices(where: SubOraclePricesFilter): [OraclePrice!]! perpMarket(where: SubPerpMarketFilter!): PerpMarket! perpPositions(where: SubPerpPositionFilter!): [PerpPosition!]! } diff --git a/packages/indexer-nibi/src/graphql-codegen/codegen-loader.js b/packages/indexer-nibi/src/graphql-codegen/codegen-loader.js index 9dd17b59..fbae80b2 100644 --- a/packages/indexer-nibi/src/graphql-codegen/codegen-loader.js +++ b/packages/indexer-nibi/src/graphql-codegen/codegen-loader.js @@ -4,13 +4,16 @@ const { getIntrospectionQuery, buildClientSchema } = require("graphql") module.exports = async () => { // Logic for loading the GraphQLSchema try { - const response = await fetch("https://hm-graphql.itn-2.nibiru.fi/query", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ query: getIntrospectionQuery() }), - }) + const response = await fetch( + "https://hm-graphql.devnet-2.nibiru.fi/query", + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ query: getIntrospectionQuery() }), + } + ) const { data } = await response.json() return buildClientSchema(data) diff --git a/packages/indexer-nibi/src/heart-monitor.test.ts b/packages/indexer-nibi/src/heart-monitor.test.ts index bca0125e..3f2bff9b 100644 --- a/packages/indexer-nibi/src/heart-monitor.test.ts +++ b/packages/indexer-nibi/src/heart-monitor.test.ts @@ -1,17 +1,17 @@ import { HeartMonitor } from "./heart-monitor" import { cleanResponse, gqlEndptFromTmRpc } from "./gql" +import { communityPoolQueryString, delegationsQueryString } from "./query" import { - communityPoolQueryString, - defaultPerpPositionsObject, - delegationsQueryString, -} from "./query" -import { - defaultMarkPriceCandlesObject, + defaultMarkPriceCandles, + defaultOraclePrice, defaultPerpMarket, + defaultPerpPosition, } from "./defaultObjects" +const nibiruUrl = "itn-3" + const heartMonitor = new HeartMonitor({ - endptTm: "https://hm-graphql.itn-2.nibiru.fi", + endptTm: `https://hm-graphql.${nibiruUrl}.nibiru.fi`, }) describe("Heart Monitor constructor", () => { @@ -28,8 +28,8 @@ describe("Heart Monitor constructor", () => { { name: "valid string", in: "abc123", expected: "abc123" }, { name: "chain", - in: { endptTm: "https://rpc.itn-1.nibiru.fi" }, - expected: "https://hm-graphql.itn-1.nibiru.fi/graphql", + in: { endptTm: `https://rpc.${nibiruUrl}.nibiru.fi` }, + expected: `https://hm-graphql.${nibiruUrl}.nibiru.fi/graphql`, }, { name: "empty chain string", @@ -57,12 +57,12 @@ describe("gqlEndptFromTmRpc", () => { const tests: TestCase[] = [ { - in: "https://rpc.itn-2.nibiru.fi", - want: "https://hm-graphql.itn-2.nibiru.fi/graphql", + in: `https://rpc.${nibiruUrl}.nibiru.fi`, + want: `https://hm-graphql.${nibiruUrl}.nibiru.fi/graphql`, }, { - in: "----rpc.itn-1.-----", - want: "https://hm-graphql.itn-1.nibiru.fi/graphql", + in: `----rpc.${nibiruUrl}.-----`, + want: `https://hm-graphql.${nibiruUrl}.nibiru.fi/graphql`, }, { in: "", want: null }, { in: "rpctestnet-nodots", want: null }, @@ -173,7 +173,7 @@ test("markPriceCandlesSubscription", async () => { next: async () => ({ value: { data: { - markPriceCandles: defaultMarkPriceCandlesObject, + markPriceCandles: defaultMarkPriceCandles, }, }, }), @@ -205,60 +205,97 @@ test("markPriceCandlesSubscription", async () => { } }) -test("perpLeaderboard", async () => { - const resp = await heartMonitor.perpLeaderboard({ - limit: 1, +test("oracle", async () => { + const resp = await heartMonitor.oracle({ + oraclePrices: { + limit: 1, + }, + oracles: { + limit: 1, + }, }) - expect(resp).toHaveProperty("perpLeaderboard") + expect(resp).toHaveProperty("oracle") - if ((resp.perpLeaderboard?.length ?? 0) > 0) { - const [perpLeaderboard] = resp.perpLeaderboard ?? [] - const fields = [ - "avg_pct_pnl", - "input_margin", - "raw_pnl", - "raw_pnl_with_unrealized", - "trader_address", - ] + if (resp.oracle) { + const { oracle } = resp + const fields = ["oraclePrices", "oracles"] fields.forEach((field: string) => { - expect(perpLeaderboard).toHaveProperty(field) + expect(oracle).toHaveProperty(field) }) } }) -test("perpMarket", async () => { - const resp = await heartMonitor.perpMarket({ where: { pair: "" } }) - expect(resp).toHaveProperty("perpMarket") +test("oraclePricesSubscription", async () => { + const hm = { + oraclePricesSubscription: jest.fn().mockResolvedValue({ + next: async () => ({ + value: { + data: { + oraclePrices: [defaultOraclePrice], + }, + }, + }), + }), + } + + const resp = await hm.oraclePricesSubscription({ + where: { pair: "ubtc:unusd" }, + }) + + const event = await resp.next() + + expect(event.value.data).toHaveProperty("oraclePrices") - if (resp.perpMarket) { - const { perpMarket } = resp + if ((event.value.data.oraclePrices.length ?? 0) > 0) { + const [oraclePrices] = event.value.data.oraclePrices ?? [] + const fields = ["block", "eventSeqNo", "pair", "price", "txSeqNo"] + fields.forEach((field: string) => { + expect(oraclePrices).toHaveProperty(field) + }) + } +}) + +test("perp", async () => { + const resp = await heartMonitor.perp({ + leaderboard: { + limit: 1, + }, + market: { + where: { + pair: "ubtc:unusd", + }, + }, + markets: { + limit: 1, + }, + position: { + where: { + pair: "ubtc:unusd", + trader_address: "nibi1judn9xtel563nmq0ghpvmkqvyd5wnkm30mvkk3", + }, + }, + positionChanges: { + limit: 1, + where: { traderAddressEq: "nibi1judn9xtel563nmq0ghpvmkqvyd5wnkm30mvkk3" }, + }, + positions: { + limit: 1, + }, + }) + expect(resp).toHaveProperty("perp") + + if (resp.perp) { + const { perp } = resp const fields = [ - "pair", - "enabled", - "maintenance_margin_ratio", - "max_leverage", - "latest_cumulative_premium_fraction", - "exchange_fee_ratio", - "ecosystem_fund_fee_ratio", - "max_funding_rate", - "liquidation_fee_ratio", - "partial_liquidation_ratio", - "funding_rate_epoch_id", - "twap_lookback_window", - "prepaid_bad_debt", - "base_reserve", - "quote_reserve", - "sqrt_depth", - "price_multiplier", - "total_long", - "total_short", - "mark_price", - "mark_price_twap", - "index_price_twap", - "is_deleted", + "leaderboard", + "market", + "markets", + "position", + "positionChanges", + "positions", ] fields.forEach((field: string) => { - expect(perpMarket).toHaveProperty(field) + expect(perp).toHaveProperty(field) }) } }) @@ -316,111 +353,13 @@ test("perpMarketSubscription", async () => { } }) -test("perpMarkets", async () => { - const resp = await heartMonitor.perpMarkets({ - limit: 1, - }) - expect(resp).toHaveProperty("perpMarkets") - - if (resp.perpMarkets) { - const [perpMarkets] = resp.perpMarkets - const fields = [ - "pair", - "enabled", - "maintenance_margin_ratio", - "max_leverage", - "latest_cumulative_premium_fraction", - "exchange_fee_ratio", - "ecosystem_fund_fee_ratio", - "max_funding_rate", - "liquidation_fee_ratio", - "partial_liquidation_ratio", - "funding_rate_epoch_id", - "twap_lookback_window", - "prepaid_bad_debt", - "base_reserve", - "quote_reserve", - "sqrt_depth", - "price_multiplier", - "total_long", - "total_short", - "mark_price", - "mark_price_twap", - "index_price_twap", - "is_deleted", - ] - fields.forEach((field: string) => { - expect(perpMarkets).toHaveProperty(field) - }) - } -}) - -test("perpPosition", async () => { - const resp = await heartMonitor.perpPosition({ - where: { - pair: "ubtc:unusd", - trader_address: "nibi14garegtvsx3zcku4esd30xd2pze7ck44ysxeg3", - }, - }) - expect(resp).toHaveProperty("perpPosition") - - if (resp.perpPosition) { - const { perpPosition } = resp - const fields = [ - "pair", - "trader_address", - "size", - "margin", - "open_notional", - "position_notional", - "latest_cumulative_premium_fraction", - "unrealized_pnl", - "unrealized_funding_payment", - "margin_ratio", - "bad_debt", - "last_updated_block", - ] - fields.forEach((field: string) => { - expect(perpPosition).toHaveProperty(field) - }) - } -}) - -test("perpPositions", async () => { - const resp = await heartMonitor.perpPositions({ - limit: 1, - }) - expect(resp).toHaveProperty("perpPositions") - - if ((resp.perpPositions?.length ?? 0) > 0) { - const [perpPositions] = resp.perpPositions ?? [] - const fields = [ - "pair", - "trader_address", - "size", - "margin", - "open_notional", - "position_notional", - "latest_cumulative_premium_fraction", - "unrealized_pnl", - "unrealized_funding_payment", - "margin_ratio", - "bad_debt", - "last_updated_block", - ] - fields.forEach((field: string) => { - expect(perpPositions).toHaveProperty(field) - }) - } -}) - test("perpPositionsSubscription", async () => { const hm = { perpPositionsSubscription: jest.fn().mockResolvedValue({ next: async () => ({ value: { data: { - perpPositions: defaultPerpPositionsObject, + perpPositions: defaultPerpPosition, }, }, }), diff --git a/packages/indexer-nibi/src/heart-monitor.ts b/packages/indexer-nibi/src/heart-monitor.ts index f3ec0de4..b90d5ccc 100644 --- a/packages/indexer-nibi/src/heart-monitor.ts +++ b/packages/indexer-nibi/src/heart-monitor.ts @@ -6,18 +6,13 @@ import { DistributionCommission, Governance, MarkPriceCandle, - PerpLeaderboard, + OraclePrice, PerpMarket, PerpPosition, QueryCommunityPoolArgs, QueryDelegationsArgs, QueryDistributionCommissionsArgs, QueryMarkPriceCandlesArgs, - QueryPerpLeaderboardArgs, - QueryPerpMarketArgs, - QueryPerpMarketsArgs, - QueryPerpPositionArgs, - QueryPerpPositionsArgs, QueryRedelegationsArgs, QuerySpotLpPositionsArgs, QuerySpotPoolCreatedArgs, @@ -36,6 +31,7 @@ import { SpotPoolJoined, SpotPoolSwap, SubscriptionMarkPriceCandlesArgs, + SubscriptionOraclePricesArgs, SubscriptionPerpMarketArgs, SubscriptionPerpPositionsArgs, Token, @@ -47,10 +43,6 @@ import { GqlOutCommunityPool, GqlOutDelegations, GqlOutDistributionCommissions, - GqlOutPerpMarket, - GqlOutPerpMarkets, - GqlOutPerpPosition, - GqlOutPerpPositions, GqlOutRedelegations, GqlOutSpotLpPositions, GqlOutSpotPoolCreated, @@ -64,10 +56,6 @@ import { communityPool, delegations, distributionCommissions, - perpMarket, - perpMarkets, - perpPosition, - perpPositions, redelegations, spotLpPositions, spotPoolCreated, @@ -78,21 +66,32 @@ import { unbondings, users, validators, -} from "./query" -import { + GqlOutPerp, + PerpFields, + QueryPerpArgs, + perp, + GqlOutStats, + QueryStatsArgs, + StatsFields, + stats, GqlOutGovernance, QueryGovernanceArgs, governance, -} from "./query/governance" -import { GqlOutMarkPriceCandles, markPriceCandles, -} from "./query/markPriceCandles" -import { GqlOutPerpLeaderboard, perpLeaderboard } from "./query/perpLeaderboard" -import { GqlOutStats, QueryStatsArgs, StatsFields, stats } from "./query/stats" -import { markPriceCandlesSubscription } from "./subscription/markPriceCandlesSubscription" -import { perpMarketSubscription } from "./subscription/perpMarketSubscription" -import { perpPositionsSubscription } from "./subscription/perpPositionsSubscription" + QueryOracleArgs, + OracleFields, + GqlOutOracle, + oracle, +} from "./query" +import { + markPriceCandlesSubscription, + GqlOutPerpMarket, + perpMarketSubscription, + perpPositionsSubscription, + oraclePricesSubscription, + GqlOutOraclePrices, +} from "./subscription" import { queryBatchHandler } from "./batchHandlers/queryBatchHandler" /** IHeartMonitor is an interface for a Heart Monitor GraphQL API. @@ -128,41 +127,26 @@ export interface IHeartMonitor { fields?: Partial ) => Promise>> - readonly perpLeaderboard: ( - args: QueryPerpLeaderboardArgs, - fields?: Partial - ) => Promise + readonly oracle: ( + args: QueryOracleArgs, + fields?: OracleFields + ) => Promise - readonly perpMarket: ( - args: QueryPerpMarketArgs, - fields?: Partial - ) => Promise + readonly oraclePricesSubscription: ( + args: SubscriptionOraclePricesArgs, + fields?: Partial + ) => Promise>> + + readonly perp: ( + args: QueryPerpArgs, + fields?: PerpFields + ) => Promise readonly perpMarketSubscription: ( args: SubscriptionPerpMarketArgs, fields?: Partial ) => Promise>> - readonly perpMarkets: ( - args: QueryPerpMarketsArgs, - fields?: Partial - ) => Promise - - readonly perpPosition: ( - args: QueryPerpPositionArgs, - fields?: Partial - ) => Promise - - readonly perpPositions: ( - args: QueryPerpPositionsArgs, - fields?: Partial - ) => Promise - - readonly perpPositionsSubscription: ( - args: SubscriptionPerpPositionsArgs, - fields?: Partial - ) => Promise>> - readonly queryBatchHandler: (queryQueryString: string[]) => Promise readonly redelegations: ( @@ -226,7 +210,7 @@ export interface IHeartMonitor { * corresponds to a query function. */ export class HeartMonitor implements IHeartMonitor { gqlEndpt: string - defaultGqlEndpt = "https://hm-graphql.itn-2.nibiru.fi/query" + defaultGqlEndpt = "https://hm-graphql.devnet-2.nibiru.fi/query" subscriptionClient: Client constructor(gqlEndpt?: string | { endptTm: string }) { @@ -278,36 +262,22 @@ export class HeartMonitor implements IHeartMonitor { fields?: Partial ) => markPriceCandlesSubscription(args, this.subscriptionClient, fields) - perpLeaderboard = async ( - args: QueryPerpLeaderboardArgs, - fields?: Partial - ) => perpLeaderboard(args, this.gqlEndpt, fields) + oracle = async (args: QueryOracleArgs, fields?: OracleFields) => + oracle(args, this.gqlEndpt, fields) - perpMarket = async ( - args: QueryPerpMarketArgs, - fields?: Partial - ) => perpMarket(args, this.gqlEndpt, fields) + oraclePricesSubscription = async ( + args: SubscriptionOraclePricesArgs, + fields?: Partial + ) => oraclePricesSubscription(args, this.subscriptionClient, fields) + + perp = async (args: QueryPerpArgs, fields?: PerpFields) => + perp(args, this.gqlEndpt, fields) perpMarketSubscription = async ( args: SubscriptionPerpMarketArgs, fields?: Partial ) => perpMarketSubscription(args, this.subscriptionClient, fields) - perpMarkets = async ( - args: QueryPerpMarketsArgs, - fields?: Partial - ) => perpMarkets(args, this.gqlEndpt, fields) - - perpPosition = async ( - args: QueryPerpPositionArgs, - fields?: Partial - ) => perpPosition(args, this.gqlEndpt, fields) - - perpPositions = async ( - args: QueryPerpPositionsArgs, - fields?: Partial - ) => perpPositions(args, this.gqlEndpt, fields) - perpPositionsSubscription = async ( args: SubscriptionPerpPositionsArgs, fields?: Partial diff --git a/packages/indexer-nibi/src/query/communityPool.ts b/packages/indexer-nibi/src/query/communityPool.ts index b8a5dacb..6c245814 100644 --- a/packages/indexer-nibi/src/query/communityPool.ts +++ b/packages/indexer-nibi/src/query/communityPool.ts @@ -2,8 +2,6 @@ import { defaultToken } from "../defaultObjects" import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" import { QueryCommunityPoolArgs, Query, Token } from "../gql/generated" -export const defaultCommunityPoolObject: Token = defaultToken - export interface GqlOutCommunityPool { communityPool?: Query["communityPool"] } @@ -18,7 +16,7 @@ export const communityPoolQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultCommunityPoolObject), + : convertObjectToPropertiesString(defaultToken), excludeParentObject ) diff --git a/packages/indexer-nibi/src/query/delegations.ts b/packages/indexer-nibi/src/query/delegations.ts index 08b401e5..caab8035 100644 --- a/packages/indexer-nibi/src/query/delegations.ts +++ b/packages/indexer-nibi/src/query/delegations.ts @@ -1,4 +1,4 @@ -import { defaultUser, defaultValidator } from "../defaultObjects" +import { defaultDelegations } from "../defaultObjects" import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" import { Query, @@ -7,12 +7,6 @@ import { Delegation, } from "../gql/generated" -export const defaultDelegationsObject: Delegation = { - amount: 0, - delegator: defaultUser, - validator: defaultValidator, -} - export interface GqlOutDelegations { delegations?: Query["delegations"] } @@ -31,7 +25,7 @@ export const delegationsQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultDelegationsObject), + : convertObjectToPropertiesString(defaultDelegations), excludeParentObject ) } diff --git a/packages/indexer-nibi/src/query/distributionCommissions.ts b/packages/indexer-nibi/src/query/distributionCommissions.ts index 2ac188c9..4e97ca9c 100644 --- a/packages/indexer-nibi/src/query/distributionCommissions.ts +++ b/packages/indexer-nibi/src/query/distributionCommissions.ts @@ -1,4 +1,4 @@ -import { defaultToken, defaultValidator } from "../defaultObjects" +import { defaultDistributionCommission } from "../defaultObjects" import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" import { Query, @@ -7,11 +7,6 @@ import { DistributionCommission, } from "../gql/generated" -export const defaultDistributionCommissionObject: DistributionCommission = { - commission: [defaultToken], - validator: defaultValidator, -} - export interface GqlOutDistributionCommissions { distributionCommissions?: Query["distributionCommissions"] } @@ -31,7 +26,7 @@ export const distributionCommissionsQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultDistributionCommissionObject), + : convertObjectToPropertiesString(defaultDistributionCommission), excludeParentObject ) } diff --git a/packages/indexer-nibi/src/query/governance.ts b/packages/indexer-nibi/src/query/governance.ts index 4c805211..82983c14 100644 --- a/packages/indexer-nibi/src/query/governance.ts +++ b/packages/indexer-nibi/src/query/governance.ts @@ -1,8 +1,4 @@ -import { - defaultGovDeposit, - defaultGovProposal, - defaultGovVote, -} from "../defaultObjects" +import { defaultGovernance } from "../defaultObjects" import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" import { Query, @@ -18,12 +14,6 @@ export type QueryGovernanceArgs = { govVotes: GovernanceGovVotesArgs } -export const defaultGovernanceObject: Governance = { - govDeposits: [defaultGovDeposit], - govProposals: [defaultGovProposal], - govVotes: [defaultGovVote], -} - export interface GqlOutGovernance { governance?: Query["governance"] } @@ -72,7 +62,7 @@ export const governanceQueryString = ( gqlQuery( "govDeposits", args.govDeposits, - convertObjectToPropertiesString(defaultGovernanceObject.govDeposits[0]), + convertObjectToPropertiesString(defaultGovernance.govDeposits[0]), true ) ) @@ -81,9 +71,7 @@ export const governanceQueryString = ( gqlQuery( "govProposals", args.govProposals, - convertObjectToPropertiesString( - defaultGovernanceObject.govProposals[0] - ), + convertObjectToPropertiesString(defaultGovernance.govProposals[0]), true ) ) @@ -92,7 +80,7 @@ export const governanceQueryString = ( gqlQuery( "govVotes", args.govVotes, - convertObjectToPropertiesString(defaultGovernanceObject.govVotes[0]), + convertObjectToPropertiesString(defaultGovernance.govVotes[0]), true ) ) diff --git a/packages/indexer-nibi/src/query/index.ts b/packages/indexer-nibi/src/query/index.ts index 036aef1d..1aa78ae0 100644 --- a/packages/indexer-nibi/src/query/index.ts +++ b/packages/indexer-nibi/src/query/index.ts @@ -1,10 +1,9 @@ export * from "./communityPool" export * from "./delegations" export * from "./distributionCommissions" -export * from "./perpMarket" -export * from "./perpMarkets" -export * from "./perpPosition" -export * from "./perpPositions" +export * from "./governance" +export * from "./markPriceCandles" +export * from "./perp" export * from "./redelegations" export * from "./spotLpPositions" export * from "./spotPoolCreated" @@ -12,6 +11,8 @@ export * from "./spotPoolExited" export * from "./spotPoolJoined" export * from "./spotPools" export * from "./spotPoolSwap" +export * from "./stats" export * from "./unbondings" export * from "./users" export * from "./validators" +export * from "./oracle" diff --git a/packages/indexer-nibi/src/query/markPriceCandles.ts b/packages/indexer-nibi/src/query/markPriceCandles.ts index d8e47c10..6484037e 100644 --- a/packages/indexer-nibi/src/query/markPriceCandles.ts +++ b/packages/indexer-nibi/src/query/markPriceCandles.ts @@ -1,4 +1,4 @@ -import { defaultMarkPriceCandlesObject } from "../defaultObjects" +import { defaultMarkPriceCandles } from "../defaultObjects" import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" import { QueryMarkPriceCandlesArgs, @@ -20,7 +20,7 @@ export const markPriceCandlesQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultMarkPriceCandlesObject), + : convertObjectToPropertiesString(defaultMarkPriceCandles), excludeParentObject ) diff --git a/packages/indexer-nibi/src/query/oracle.ts b/packages/indexer-nibi/src/query/oracle.ts new file mode 100644 index 00000000..3e32ca70 --- /dev/null +++ b/packages/indexer-nibi/src/query/oracle.ts @@ -0,0 +1,90 @@ +import { defaultOracleEntry, defaultOraclePrice } from "../defaultObjects" +import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" +import { + OracleEntry, + OracleOraclePricesArgs, + OracleOraclesArgs, + OraclePrice, + Query, +} from "../gql/generated" + +export type QueryOracleArgs = { + oraclePrices?: OracleOraclePricesArgs + oracles?: OracleOraclesArgs +} + +export interface GqlOutOracle { + oracle?: Query["oracle"] +} + +export type OracleFields = Partial<{ + oraclePrices?: Partial + oracles?: Partial +}> + +export const oracleQueryString = ( + args: QueryOracleArgs, + fields?: OracleFields +) => { + const oracleQuery: string[] = [] + + if (fields) { + if (fields?.oraclePrices) { + oracleQuery.push( + gqlQuery( + "oraclePrices", + args?.oraclePrices ?? {}, + convertObjectToPropertiesString(fields.oraclePrices), + true + ) + ) + } + + if (fields?.oracles) { + oracleQuery.push( + gqlQuery( + "oracles", + args?.oracles ?? {}, + convertObjectToPropertiesString(fields.oracles), + true + ) + ) + } + } else { + oracleQuery.push( + gqlQuery( + "oraclePrices", + args?.oraclePrices ?? {}, + convertObjectToPropertiesString(defaultOraclePrice), + true + ) + ) + + oracleQuery.push( + gqlQuery( + "oracles", + args?.oracles ?? {}, + convertObjectToPropertiesString(defaultOracleEntry), + true + ) + ) + } + + return ` + oracle { + ${oracleQuery.join("\n")} + } + ` +} + +export const oracle = async ( + args: QueryOracleArgs, + endpt: string, + fields?: OracleFields +): Promise => + doGqlQuery( + `{ + ${oracleQueryString(args, fields)} + }`, + endpt + ) diff --git a/packages/indexer-nibi/src/query/perp.ts b/packages/indexer-nibi/src/query/perp.ts new file mode 100644 index 00000000..76a975f6 --- /dev/null +++ b/packages/indexer-nibi/src/query/perp.ts @@ -0,0 +1,186 @@ +import { + defaultPerpLeaderboard, + defaultPerpMarket, + defaultPerpPosition, + defaultPerpPositionChanges, +} from "../defaultObjects" +import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" +import { + Query, + PerpLeaderboard, + PerpMarket, + PerpPosition, + PerpPositionChange, + PerpLeaderboardArgs, + PerpMarketArgs, + PerpMarketsArgs, + PerpPositionArgs, + PerpPositionsArgs, + PerpPositionChangesArgs, +} from "../gql/generated" + +export type QueryPerpArgs = { + leaderboard?: PerpLeaderboardArgs + market?: PerpMarketArgs + markets?: PerpMarketsArgs + position?: PerpPositionArgs + positionChanges?: PerpPositionChangesArgs + positions?: PerpPositionsArgs +} + +export interface GqlOutPerp { + perp?: Query["perp"] +} + +export type PerpFields = Partial<{ + leaderboard?: Partial + market?: Partial + markets?: Partial + position?: Partial + positionChanges?: Partial + positions?: Partial +}> + +export const perpQueryString = (args: QueryPerpArgs, fields?: PerpFields) => { + const perpQuery: string[] = [] + + if (fields) { + if (fields?.leaderboard) { + perpQuery.push( + gqlQuery( + "leaderboard", + args?.leaderboard ?? {}, + convertObjectToPropertiesString(fields.leaderboard), + true + ) + ) + } + + if (fields?.market) { + perpQuery.push( + gqlQuery( + "market", + args?.market ?? {}, + convertObjectToPropertiesString(fields.market), + true + ) + ) + } + + if (fields?.markets) { + perpQuery.push( + gqlQuery( + "markets", + args?.markets ?? {}, + convertObjectToPropertiesString(fields.markets), + true + ) + ) + } + + if (fields?.position) { + perpQuery.push( + gqlQuery( + "position", + args?.position ?? {}, + convertObjectToPropertiesString(fields.position), + true + ) + ) + } + + if (fields?.positionChanges) { + perpQuery.push( + gqlQuery( + "positionChanges", + args?.positionChanges ?? {}, + convertObjectToPropertiesString(fields.positionChanges), + true + ) + ) + } + + if (fields?.positions) { + perpQuery.push( + gqlQuery( + "positions", + args?.positions ?? {}, + convertObjectToPropertiesString(fields.positions), + true + ) + ) + } + } else { + perpQuery.push( + gqlQuery( + "leaderboard", + args?.leaderboard ?? {}, + convertObjectToPropertiesString(defaultPerpLeaderboard), + true + ) + ) + + perpQuery.push( + gqlQuery( + "market", + args?.market ?? {}, + convertObjectToPropertiesString(defaultPerpMarket), + true + ) + ) + + perpQuery.push( + gqlQuery( + "markets", + args?.markets ?? {}, + convertObjectToPropertiesString(defaultPerpMarket), + true + ) + ) + + perpQuery.push( + gqlQuery( + "position", + args?.position ?? {}, + convertObjectToPropertiesString(defaultPerpPosition), + true + ) + ) + + perpQuery.push( + gqlQuery( + "positionChanges", + args?.positionChanges ?? {}, + convertObjectToPropertiesString(defaultPerpPositionChanges), + true + ) + ) + + perpQuery.push( + gqlQuery( + "positions", + args?.positions ?? {}, + convertObjectToPropertiesString(defaultPerpPosition), + true + ) + ) + } + + return ` + perp { + ${perpQuery.join("\n")} + } + ` +} + +export const perp = async ( + args: QueryPerpArgs, + endpt: string, + fields?: PerpFields +): Promise => + doGqlQuery( + `{ + ${perpQueryString(args, fields)} + }`, + endpt + ) diff --git a/packages/indexer-nibi/src/query/perpLeaderboard.ts b/packages/indexer-nibi/src/query/perpLeaderboard.ts deleted file mode 100644 index ec12d8b1..00000000 --- a/packages/indexer-nibi/src/query/perpLeaderboard.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" -import { - QueryPerpLeaderboardArgs, - Query, - PerpLeaderboard, -} from "../gql/generated" - -export const defaultPerpLeaderboardObject: PerpLeaderboard = { - avg_pct_pnl_rank: 0, - avg_pct_pnl: 0, - input_margin: 0, - raw_pnl: 0, - raw_pnl_with_unrealized: 0, - trader_address: "", -} - -export interface GqlOutPerpLeaderboard { - perpLeaderboard?: Query["perpLeaderboard"] -} - -export const perpLeaderboardQueryString = ( - args: QueryPerpLeaderboardArgs, - excludeParentObject: boolean, - fields?: Partial -) => - gqlQuery( - "perpLeaderboard", - args, - fields - ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultPerpLeaderboardObject), - excludeParentObject - ) - -export const perpLeaderboard = async ( - args: QueryPerpLeaderboardArgs, - endpt: string, - fields?: Partial -): Promise => - doGqlQuery(perpLeaderboardQueryString(args, false, fields), endpt) diff --git a/packages/indexer-nibi/src/query/perpMarket.ts b/packages/indexer-nibi/src/query/perpMarket.ts deleted file mode 100644 index 8dbf3048..00000000 --- a/packages/indexer-nibi/src/query/perpMarket.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { defaultPerpMarket } from "../defaultObjects" -import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" -import { QueryPerpMarketArgs, Query, PerpMarket } from "../gql/generated" - -export const defaultPerpMarketObject: PerpMarket = defaultPerpMarket - -export interface GqlOutPerpMarket { - perpMarket?: Query["perpMarket"] -} - -export const perpMarketQueryString = ( - args: QueryPerpMarketArgs, - excludeParentObject: boolean, - fields?: Partial -) => - gqlQuery( - "perpMarket", - args, - fields - ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultPerpMarketObject), - excludeParentObject - ) - -export const perpMarket = async ( - args: QueryPerpMarketArgs, - endpt: string, - fields?: Partial -): Promise => - doGqlQuery(perpMarketQueryString(args, false, fields), endpt) diff --git a/packages/indexer-nibi/src/query/perpMarkets.ts b/packages/indexer-nibi/src/query/perpMarkets.ts deleted file mode 100644 index cf52645f..00000000 --- a/packages/indexer-nibi/src/query/perpMarkets.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { defaultPerpMarket } from "../defaultObjects" -import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" -import { - QueryPerpMarketsArgs, - Query, - PerpMarket, - PerpMarketOrder, -} from "../gql/generated" - -export const defaultPerpMarketsObject: PerpMarket = defaultPerpMarket - -export interface GqlOutPerpMarkets { - perpMarkets?: Query["perpMarkets"] -} - -export const perpMarketsQueryString = ( - args: QueryPerpMarketsArgs, - excludeParentObject: boolean, - fields?: Partial -) => { - if (!args.limit) args.limit = 100 - if (args.order_desc === undefined) args.order_desc = true - if (!args.order_by) args.order_by = PerpMarketOrder.Pair - - return gqlQuery( - "perpMarkets", - args, - fields - ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultPerpMarketsObject), - excludeParentObject - ) -} - -export const perpMarkets = async ( - args: QueryPerpMarketsArgs, - endpt: string, - fields?: Partial -): Promise => - doGqlQuery(perpMarketsQueryString(args, false, fields), endpt) diff --git a/packages/indexer-nibi/src/query/perpPosition.ts b/packages/indexer-nibi/src/query/perpPosition.ts deleted file mode 100644 index f6567399..00000000 --- a/packages/indexer-nibi/src/query/perpPosition.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { defaultPerpPosition } from "../defaultObjects" -import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" -import { Query, PerpPosition, QueryPerpPositionArgs } from "../gql/generated" - -export const defaultPerpPositionObject: PerpPosition = defaultPerpPosition - -export interface GqlOutPerpPosition { - perpPosition?: Query["perpPosition"] -} - -export const perpPositionQueryString = ( - args: QueryPerpPositionArgs, - excludeParentObject: boolean, - fields?: Partial -) => - gqlQuery( - "perpPosition", - args, - fields - ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultPerpPositionObject), - excludeParentObject - ) - -export const perpPosition = async ( - args: QueryPerpPositionArgs, - endpt: string, - fields?: Partial -): Promise => - doGqlQuery(perpPositionQueryString(args, false, fields), endpt) diff --git a/packages/indexer-nibi/src/query/perpPositions.ts b/packages/indexer-nibi/src/query/perpPositions.ts deleted file mode 100644 index 9e14de77..00000000 --- a/packages/indexer-nibi/src/query/perpPositions.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { defaultPerpPosition } from "../defaultObjects" -import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" -import { - Query, - PerpPosition, - QueryPerpPositionsArgs, - PerpPositionOrder, -} from "../gql/generated" - -export const defaultPerpPositionsObject: PerpPosition = defaultPerpPosition - -export interface GqlOutPerpPositions { - perpPositions?: Query["perpPositions"] -} - -export const perpPositionsQueryString = ( - args: QueryPerpPositionsArgs, - excludeParentObject: boolean, - fields?: Partial -) => { - if (!args.limit) args.limit = 100 - if (args.order_desc === undefined) args.order_desc = true - if (!args.order_by) args.order_by = PerpPositionOrder.CreatedBlock - - return gqlQuery( - "perpPositions", - args, - fields - ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultPerpPositionsObject), - excludeParentObject - ) -} - -export const perpPositions = async ( - args: QueryPerpPositionsArgs, - endpt: string, - fields?: Partial -): Promise => - doGqlQuery(perpPositionsQueryString(args, false, fields), endpt) diff --git a/packages/indexer-nibi/src/query/redelegations.ts b/packages/indexer-nibi/src/query/redelegations.ts index b3f2cb77..eca31dac 100644 --- a/packages/indexer-nibi/src/query/redelegations.ts +++ b/packages/indexer-nibi/src/query/redelegations.ts @@ -1,4 +1,4 @@ -import { defaultBlock, defaultUser, defaultValidator } from "../defaultObjects" +import { defaultRedelegations } from "../defaultObjects" import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" import { Query, @@ -7,15 +7,6 @@ import { RedelegationOrder, } from "../gql/generated" -export const defaultRedelegationsObject: Redelegation = { - amount: 0, - delegator: defaultUser, - source_validator: defaultValidator, - destination_validator: defaultValidator, - completion_time: "", - creation_block: defaultBlock, -} - export interface GqlOutRedelegations { redelegations?: Query["redelegations"] } @@ -34,7 +25,7 @@ export const redelegationsQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultRedelegationsObject), + : convertObjectToPropertiesString(defaultRedelegations), excludeParentObject ) } diff --git a/packages/indexer-nibi/src/query/spotLpPositions.ts b/packages/indexer-nibi/src/query/spotLpPositions.ts index a34a6c64..fed7b4bb 100644 --- a/packages/indexer-nibi/src/query/spotLpPositions.ts +++ b/packages/indexer-nibi/src/query/spotLpPositions.ts @@ -1,9 +1,4 @@ -import { - defaultBlock, - defaultPool, - defaultToken, - defaultUser, -} from "../defaultObjects" +import { defaultSpotLpPosition } from "../defaultObjects" import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" import { Query, @@ -12,13 +7,6 @@ import { SpotLpPositionOrder, } from "../gql/generated" -export const defaultSpotLpPositionObject: SpotLpPosition = { - created_block: defaultBlock, - pool: defaultPool, - pool_shares: defaultToken, - user: defaultUser, -} - export interface GqlOutSpotLpPositions { spotLpPositions?: Query["spotLpPositions"] } @@ -37,7 +25,7 @@ export const spotLpPositionsQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultSpotLpPositionObject), + : convertObjectToPropertiesString(defaultSpotLpPosition), excludeParentObject ) } diff --git a/packages/indexer-nibi/src/query/spotPoolCreated.ts b/packages/indexer-nibi/src/query/spotPoolCreated.ts index 9d9d0fe6..e9a4f409 100644 --- a/packages/indexer-nibi/src/query/spotPoolCreated.ts +++ b/packages/indexer-nibi/src/query/spotPoolCreated.ts @@ -7,8 +7,6 @@ import { SpotPoolCreatedOrder, } from "../gql/generated" -export const defaultSpotPoolCreatedObject: SpotPoolCreated = defaultSpotPool - export interface GqlOutSpotPoolCreated { spotPoolCreated?: Query["spotPoolCreated"] } @@ -27,7 +25,7 @@ export const spotPoolCreatedQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultSpotPoolCreatedObject), + : convertObjectToPropertiesString(defaultSpotPool), excludeParentObject ) } diff --git a/packages/indexer-nibi/src/query/spotPoolExited.ts b/packages/indexer-nibi/src/query/spotPoolExited.ts index a0820a4d..cc51c45b 100644 --- a/packages/indexer-nibi/src/query/spotPoolExited.ts +++ b/packages/indexer-nibi/src/query/spotPoolExited.ts @@ -7,8 +7,6 @@ import { SpotPoolExitedOrder, } from "../gql/generated" -export const defaultSpotPoolExitedObject: SpotPoolExited = defaultSpotPool - export interface GqlOutSpotPoolExited { spotPoolExited?: Query["spotPoolExited"] } @@ -27,7 +25,7 @@ export const spotPoolExitedQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultSpotPoolExitedObject), + : convertObjectToPropertiesString(defaultSpotPool), excludeParentObject ) } diff --git a/packages/indexer-nibi/src/query/spotPoolJoined.ts b/packages/indexer-nibi/src/query/spotPoolJoined.ts index 7d9709f0..cddb8812 100644 --- a/packages/indexer-nibi/src/query/spotPoolJoined.ts +++ b/packages/indexer-nibi/src/query/spotPoolJoined.ts @@ -7,8 +7,6 @@ import { SpotPoolJoinedOrder, } from "../gql/generated" -export const defaultSpotPoolJoinedObject: SpotPoolJoined = defaultSpotPool - export interface GqlOutSpotPoolJoined { spotPoolJoined?: Query["spotPoolJoined"] } @@ -27,7 +25,7 @@ export const spotPoolJoinedQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultSpotPoolJoinedObject), + : convertObjectToPropertiesString(defaultSpotPool), excludeParentObject ) } diff --git a/packages/indexer-nibi/src/query/spotPoolSwap.ts b/packages/indexer-nibi/src/query/spotPoolSwap.ts index 3775cb0d..894a736e 100644 --- a/packages/indexer-nibi/src/query/spotPoolSwap.ts +++ b/packages/indexer-nibi/src/query/spotPoolSwap.ts @@ -1,9 +1,4 @@ -import { - defaultBlock, - defaultPool, - defaultToken, - defaultUser, -} from "../defaultObjects" +import { defaultSpotPoolSwap } from "../defaultObjects" import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" import { Query, @@ -12,14 +7,6 @@ import { SpotPoolSwapOrder, } from "../gql/generated" -export const defaultSpotPoolSwapObject: SpotPoolSwap = { - block: defaultBlock, - pool: defaultPool, - token_in: defaultToken, - token_out: defaultToken, - user: defaultUser, -} - export interface GqlOutSpotPoolSwap { spotPoolSwap?: Query["spotPoolSwap"] } @@ -38,7 +25,7 @@ export const spotPoolSwapQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultSpotPoolSwapObject), + : convertObjectToPropertiesString(defaultSpotPoolSwap), excludeParentObject ) } diff --git a/packages/indexer-nibi/src/query/spotPools.ts b/packages/indexer-nibi/src/query/spotPools.ts index 5ae80914..d9e80504 100644 --- a/packages/indexer-nibi/src/query/spotPools.ts +++ b/packages/indexer-nibi/src/query/spotPools.ts @@ -7,8 +7,6 @@ import { SpotPoolOrder, } from "../gql/generated" -export const defaultSpotPoolObject: SpotPool = defaultPool - export interface GqlOutSpotPools { spotPools?: Query["spotPools"] } @@ -27,7 +25,7 @@ export const spotPoolsQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultSpotPoolObject), + : convertObjectToPropertiesString(defaultPool), excludeParentObject ) } diff --git a/packages/indexer-nibi/src/query/stats.ts b/packages/indexer-nibi/src/query/stats.ts index bd49b77f..7f40ee73 100644 --- a/packages/indexer-nibi/src/query/stats.ts +++ b/packages/indexer-nibi/src/query/stats.ts @@ -1,3 +1,12 @@ +import { + defaultStatsFees, + defaultPerpOpenInterest, + defaultPerpPnl, + defaultTotals, + defaultTvl, + defaultUsers, + defaultVolume, +} from "../defaultObjects" import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" import { Query, @@ -27,91 +36,6 @@ export type QueryStatsArgs = { volume?: StatsVolumeArgs } -export const defaultStatsFeesObject: StatsFees = { - feesLiquidations: 0, - feesLiquidationsCumulative: 0, - feesPerp: 0, - feesPerpCumulative: 0, - feesSwap: 0, - feesSwapCumulative: 0, - feesTotal: 0, - feesTotalCumulative: 0, - period: 0, - periodStartTs: "", -} - -export const defaultPerpOpenInterestObject: StatsPerpOpenInterest = { - openInterestLong: 0, - openInterestShort: 0, - openInterestTotal: 0, - period: 0, - periodStartTs: "", -} - -export const defaultPerpPnlObject: StatsPerpPnl = { - loss: 0, - lossCumulative: 0, - netPnl: 0, - netPnlCumulative: 0, - period: 0, - periodStartTs: "", - profit: 0, - profitCumulative: 0, -} - -export const defaultTotalsObject: StatsTotals = { - period: 0, - periodStartTs: "", - totalPerp: 0, - totalFeesPerp: 0, - totalFeesLiquidations: 0, - totalOpenInterest: 0, - totalSwap: 0, - totalTvl: 0, -} - -export const defaultTvlObject: StatsTvl = { - period: 0, - periodStartTs: "", - tvlPerp: 0, - tvlStablecoin: 0, - tvlStaking: 0, - tvlSwap: 0, - tvlTotal: 0, -} - -export const defaultUsersObject: StatsUsers = { - newUsersLp: 0, - newUsersLpCumulative: 0, - newUsersPerp: 0, - newUsersPerpCumulative: 0, - newUsersSwap: 0, - newUsersSwapCumulative: 0, - newUsersTotal: 0, - newUsersTotalCumulative: 0, - period: 0, - periodStartTs: "", - userActionsPerp: 0, - uniqueUsersLp: 0, - uniqueUsersPerp: 0, - uniqueUsersSwap: 0, - uniqueUsersTotal: 0, - userActionsLp: 0, - userActionsSwap: 0, - userActionsTotal: 0, -} - -export const defaultVolumeObject: StatsVolume = { - volumePerp: 0, - volumePerpCumulative: 0, - volumeSwap: 0, - volumeSwapCumulative: 0, - volumeTotal: 0, - volumeTotalCumulative: 0, - period: 0, - periodStartTs: "", -} - export interface GqlOutStats { stats?: Query["stats"] } @@ -214,7 +138,7 @@ export const statsQueryString = ( gqlQuery( "fees", args?.fees ?? {}, - convertObjectToPropertiesString(defaultStatsFeesObject), + convertObjectToPropertiesString(defaultStatsFees), true ) ) @@ -223,7 +147,7 @@ export const statsQueryString = ( gqlQuery( "perpOpenInterest", args?.perpOpenInterest ?? {}, - convertObjectToPropertiesString(defaultPerpOpenInterestObject), + convertObjectToPropertiesString(defaultPerpOpenInterest), true ) ) @@ -232,7 +156,7 @@ export const statsQueryString = ( gqlQuery( "perpPnl", args?.perpPnl ?? {}, - convertObjectToPropertiesString(defaultPerpPnlObject), + convertObjectToPropertiesString(defaultPerpPnl), true ) ) @@ -241,7 +165,7 @@ export const statsQueryString = ( gqlQuery( "totals", args?.totals ?? {}, - convertObjectToPropertiesString(defaultTotalsObject), + convertObjectToPropertiesString(defaultTotals), true ) ) @@ -250,7 +174,7 @@ export const statsQueryString = ( gqlQuery( "tvl", args?.tvl ?? {}, - convertObjectToPropertiesString(defaultTvlObject), + convertObjectToPropertiesString(defaultTvl), true ) ) @@ -259,7 +183,7 @@ export const statsQueryString = ( gqlQuery( "users", args?.users ?? {}, - convertObjectToPropertiesString(defaultUsersObject), + convertObjectToPropertiesString(defaultUsers), true ) ) @@ -268,7 +192,7 @@ export const statsQueryString = ( gqlQuery( "volume", args?.volume ?? {}, - convertObjectToPropertiesString(defaultVolumeObject), + convertObjectToPropertiesString(defaultVolume), true ) ) diff --git a/packages/indexer-nibi/src/query/unbondings.ts b/packages/indexer-nibi/src/query/unbondings.ts index 9b72a41e..3930cf1b 100644 --- a/packages/indexer-nibi/src/query/unbondings.ts +++ b/packages/indexer-nibi/src/query/unbondings.ts @@ -1,4 +1,4 @@ -import { defaultBlock, defaultUser, defaultValidator } from "../defaultObjects" +import { defaultUnbondings } from "../defaultObjects" import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" import { Query, @@ -7,14 +7,6 @@ import { UnbondingOrder, } from "../gql/generated" -export const defaultUnbondingsObject: Unbonding = { - amount: 0, - completion_time: "", - creation_block: defaultBlock, - delegator: defaultUser, - validator: defaultValidator, -} - export interface GqlOutUnbondings { unbondings?: Query["unbondings"] } @@ -33,7 +25,7 @@ export const unbondingsQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultUnbondingsObject), + : convertObjectToPropertiesString(defaultUnbondings), excludeParentObject ) } diff --git a/packages/indexer-nibi/src/query/users.ts b/packages/indexer-nibi/src/query/users.ts index 0efdac94..074d71e1 100644 --- a/packages/indexer-nibi/src/query/users.ts +++ b/packages/indexer-nibi/src/query/users.ts @@ -2,8 +2,6 @@ import { defaultUser } from "../defaultObjects" import { convertObjectToPropertiesString, doGqlQuery, gqlQuery } from "../gql" import { Query, QueryUsersArgs, User, UserOrder } from "../gql/generated" -export const defaultUserObject: User = defaultUser - export interface GqlOutUsers { users?: Query["users"] } @@ -22,7 +20,7 @@ export const usersQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultUserObject), + : convertObjectToPropertiesString(defaultUser), excludeParentObject ) } diff --git a/packages/indexer-nibi/src/query/validators.ts b/packages/indexer-nibi/src/query/validators.ts index a76cdddc..a45ab115 100644 --- a/packages/indexer-nibi/src/query/validators.ts +++ b/packages/indexer-nibi/src/query/validators.ts @@ -7,8 +7,6 @@ import { ValidatorOrder, } from "../gql/generated" -export const defaultValidatorsObject: Validator = defaultValidator - export interface GqlOutValidators { validators?: Query["validators"] } @@ -27,7 +25,7 @@ export const validatorsQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultValidatorsObject), + : convertObjectToPropertiesString(defaultValidator), excludeParentObject ) } diff --git a/packages/indexer-nibi/src/subscription/index.ts b/packages/indexer-nibi/src/subscription/index.ts new file mode 100644 index 00000000..589d9b9f --- /dev/null +++ b/packages/indexer-nibi/src/subscription/index.ts @@ -0,0 +1,4 @@ +export * from "./markPriceCandlesSubscription" +export * from "./oraclePricesSubscription" +export * from "./perpMarketSubscription" +export * from "./perpPositionsSubscription" diff --git a/packages/indexer-nibi/src/subscription/markPriceCandlesSubscription.ts b/packages/indexer-nibi/src/subscription/markPriceCandlesSubscription.ts index fb4f5227..93ad7d85 100644 --- a/packages/indexer-nibi/src/subscription/markPriceCandlesSubscription.ts +++ b/packages/indexer-nibi/src/subscription/markPriceCandlesSubscription.ts @@ -4,17 +4,8 @@ import { SubscriptionMarkPriceCandlesArgs, } from "../gql/generated" import { gqlQuery, convertObjectToPropertiesString } from "../gql" -import { GqlOutMarkPriceCandles } from "../query/markPriceCandles" - -export const defaultMarkPriceCandlesObject: MarkPriceCandle = { - close: 0, - high: 0, - low: 0, - open: 0, - pair: "", - period: 0, - periodStartTs: "", -} +import { GqlOutMarkPriceCandles } from "../query" +import { defaultMarkPriceCandles } from "../defaultObjects" export const markPriceCandlesSubscriptionQueryString = ( args: SubscriptionMarkPriceCandlesArgs, @@ -26,7 +17,7 @@ export const markPriceCandlesSubscriptionQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultMarkPriceCandlesObject), + : convertObjectToPropertiesString(defaultMarkPriceCandles), true )} }` diff --git a/packages/indexer-nibi/src/subscription/oraclePricesSubscription.ts b/packages/indexer-nibi/src/subscription/oraclePricesSubscription.ts new file mode 100644 index 00000000..ac855baa --- /dev/null +++ b/packages/indexer-nibi/src/subscription/oraclePricesSubscription.ts @@ -0,0 +1,36 @@ +import { Client, ExecutionResult } from "graphql-ws" +import { + SubscriptionOraclePricesArgs, + OraclePrice, + Subscription, +} from "../gql/generated" +import { defaultOraclePrice } from "../defaultObjects" +import { gqlQuery, convertObjectToPropertiesString } from "../gql" + +export interface GqlOutOraclePrices { + oraclePrices?: Subscription["oraclePrices"] +} + +export const oraclePricesSubscriptionQueryString = ( + args: SubscriptionOraclePricesArgs, + fields?: Partial +) => + `subscription { + ${gqlQuery( + "oraclePrices", + args, + fields + ? convertObjectToPropertiesString(fields) + : convertObjectToPropertiesString(defaultOraclePrice), + true + )} + }` + +export const oraclePricesSubscription = async ( + args: SubscriptionOraclePricesArgs, + client: Client, + fields?: Partial +): Promise>> => + client.iterate({ + query: oraclePricesSubscriptionQueryString(args, fields), + }) diff --git a/packages/indexer-nibi/src/subscription/perpMarketSubscription.ts b/packages/indexer-nibi/src/subscription/perpMarketSubscription.ts index 55eb4ab5..08f18b6e 100644 --- a/packages/indexer-nibi/src/subscription/perpMarketSubscription.ts +++ b/packages/indexer-nibi/src/subscription/perpMarketSubscription.ts @@ -1,10 +1,15 @@ import { Client, ExecutionResult } from "graphql-ws" -import { SubscriptionPerpMarketArgs, PerpMarket } from "../gql/generated" +import { + SubscriptionPerpMarketArgs, + PerpMarket, + Subscription, +} from "../gql/generated" import { defaultPerpMarket } from "../defaultObjects" import { gqlQuery, convertObjectToPropertiesString } from "../gql" -import { GqlOutPerpMarket } from "../query" -export const defaultPerpMarketObject: PerpMarket = defaultPerpMarket +export interface GqlOutPerpMarket { + perpMarket?: Subscription["perpMarket"] +} export const perpMarketSubscriptionQueryString = ( args: SubscriptionPerpMarketArgs, @@ -16,7 +21,7 @@ export const perpMarketSubscriptionQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultPerpMarketObject), + : convertObjectToPropertiesString(defaultPerpMarket), true )} }` diff --git a/packages/indexer-nibi/src/subscription/perpPositionsSubscription.ts b/packages/indexer-nibi/src/subscription/perpPositionsSubscription.ts index 10031e14..ee519a29 100644 --- a/packages/indexer-nibi/src/subscription/perpPositionsSubscription.ts +++ b/packages/indexer-nibi/src/subscription/perpPositionsSubscription.ts @@ -1,10 +1,15 @@ import { Client, ExecutionResult } from "graphql-ws" import { defaultPerpPosition } from "../defaultObjects" -import { SubscriptionPerpPositionsArgs, PerpPosition } from "../gql/generated" +import { + SubscriptionPerpPositionsArgs, + PerpPosition, + Subscription, +} from "../gql/generated" import { gqlQuery, convertObjectToPropertiesString } from "../gql" -import { GqlOutPerpPositions } from "../query" -export const defaultPerpPositionsObject: PerpPosition = defaultPerpPosition +export interface GqlOutPerpPositions { + perpPositions?: Subscription["perpPositions"] +} export const perpPositionsSubscriptionQueryString = ( args: SubscriptionPerpPositionsArgs, @@ -15,7 +20,7 @@ export const perpPositionsSubscriptionQueryString = ( args, fields ? convertObjectToPropertiesString(fields) - : convertObjectToPropertiesString(defaultPerpPositionsObject), + : convertObjectToPropertiesString(defaultPerpPosition), true ) diff --git a/packages/nibijs/docs/classes/StableSwap.md b/packages/nibijs/docs/classes/StableSwap.md index cda28920..df6a2ba2 100644 --- a/packages/nibijs/docs/classes/StableSwap.md +++ b/packages/nibijs/docs/classes/StableSwap.md @@ -178,8 +178,8 @@ y() Calculate x[j] if one makes x[i] = x Done by solving quadratic equation iteratively. -x_1**2 + x1 * (sum' - (A*n**n - 1) _ D / (A _ n**n)) = D ** (n+1)/(n ** (2 _ n) _ prod' \* A) -x_1**2 + b\*x_1 = c +x*1\*\*2 + x1 * (sum' - (A*n\*\*n - 1) * D / (A _ n**n)) = D ** (n+1)/(n \*\* (2 _ n) \_ prod' \* A) +x_1\*\*2 + b\*x_1 = c x_1 = (x_1\**2 + c) / (2*x_1 + b) diff --git a/packages/nibijs/src/chain/useFaucet.ts b/packages/nibijs/src/chain/useFaucet.ts index 063b5c83..aa46e20b 100644 --- a/packages/nibijs/src/chain/useFaucet.ts +++ b/packages/nibijs/src/chain/useFaucet.ts @@ -59,6 +59,6 @@ export async function useFaucet({ */ export const faucetUrlFromChain = (chain: Chain) => { const parts = chainToParts(chain) - // e.g. https://faucet.itn-1.nibiru.fi/ + // e.g. https://faucet.itn-X.nibiru.fi/ where X is the number return `https://faucet.${parts.shortName}-${parts.number}.nibiru.fi/` }