diff --git a/src/typescript/sdk/src/const.ts b/src/typescript/sdk/src/const.ts index 792adb6a6..e06ac14d0 100644 --- a/src/typescript/sdk/src/const.ts +++ b/src/typescript/sdk/src/const.ts @@ -156,6 +156,7 @@ export const INITIAL_REAL_RESERVES: Types["Reserves"] = { /// As defined in the database, aka the enum string. export enum Period { + Period15S = "period_15s", Period1M = "period_1m", Period5M = "period_5m", Period15M = "period_15m", @@ -179,6 +180,7 @@ export enum Trigger { export const toPeriod = (s: DatabaseStructType["PeriodicStateMetadata"]["period"]) => ({ // From the database. + period_15s: Period.Period15S, period_1m: Period.Period1M, period_5m: Period.Period5M, period_15m: Period.Period15M, diff --git a/src/typescript/sdk/src/indexer-v2/json-bigint.ts b/src/typescript/sdk/src/indexer-v2/json-bigint.ts index b3edc85a6..affbf371d 100644 --- a/src/typescript/sdk/src/indexer-v2/json-bigint.ts +++ b/src/typescript/sdk/src/indexer-v2/json-bigint.ts @@ -25,7 +25,7 @@ const tryWithFallbackParse = (parser: (v: any) => any) => (v: any) => { return v; } }; -const parseFloat = (v: any) => Big(v).toString(); +const parseFloat = (v: any) => (v === null ? null : Big(v).toString()); const parseBigInt = (v: any) => BigInt(v); const parseInteger = (v: any) => Number(v); const parseDefault = (v: any) => v; diff --git a/src/typescript/sdk/src/indexer-v2/types/index.ts b/src/typescript/sdk/src/indexer-v2/types/index.ts index 6272438e9..63b0886ec 100644 --- a/src/typescript/sdk/src/indexer-v2/types/index.ts +++ b/src/typescript/sdk/src/indexer-v2/types/index.ts @@ -29,7 +29,7 @@ import { toPeriod, toTrigger, type Period, type Trigger } from "../../const"; import { toAccountAddressString } from "../../utils"; import Big from "big.js"; import { q64ToBig } from "../../utils/nominal-price"; -import { type AnyArenaEvent } from "../../types/arena-types"; +import { safeParseBigIntOrPostgresTimestamp, type AnyArenaEvent } from "../../types/arena-types"; import { calculateCurvePrice, type ReservesAndBondingCurveState } from "../../markets"; export type TransactionMetadata = { @@ -248,6 +248,21 @@ const toArenaInfoFromDatabase = (data: DatabaseStructType["ArenaInfo"]): Types[" maxMatchAmount: BigInt(data.max_match_amount), }); +const toArenaCandlestickFromDatabase = ( + data: DatabaseStructType["ArenaCandlestick"] +): Types["ArenaCandlestick"] => ({ + meleeID: BigInt(data.melee_id), + volume: BigInt(data.volume), + period: toPeriod(data.period), + startTime: safeParseBigIntOrPostgresTimestamp(data.start_time), + openPrice: data.open_price === null ? null : Number(data.open_price), + closePrice: data.close_price === null ? null : Number(data.close_price), + highPrice: data.high_price === null ? null : Number(data.high_price), + lowPrice: data.low_price === null ? null : Number(data.low_price), + integratorFees: BigInt(data.integrator_fees), + nSwaps: BigInt(data.n_swaps), +}); + const toArenaLeaderboardHistoryFromDatabase = ( data: DatabaseStructType["ArenaLeaderboardHistory"] ): Types["ArenaLeaderboardHistory"] => ({ @@ -491,6 +506,7 @@ export type ArenaPositionModel = ReturnType; export type ArenaLeaderboardModel = ReturnType; export type ArenaLeaderboardHistoryModel = ReturnType; export type ArenaInfoModel = ReturnType; +export type ArenaCandlestickModel = ReturnType; export type UserPoolsRPCModel = ReturnType; export type AggregateMarketStateModel = ReturnType; export type ArenaLeaderboardHistoryWithArenaInfoModel = ReturnType< @@ -897,6 +913,7 @@ export const toArenaPositionModel = toArenaPositionFromDatabase; export const toArenaLeaderboardModel = toArenaLeaderboardFromDatabase; export const toArenaLeaderboardHistoryModel = toArenaLeaderboardHistoryFromDatabase; export const toArenaInfoModel = toArenaInfoFromDatabase; +export const toArenaCandlestickModel = toArenaCandlestickFromDatabase; export const calculateDeltaPercentageForQ64s = (open: AnyNumberString, close: AnyNumberString) => q64ToBig(close.toString()).div(q64ToBig(open.toString())).mul(100).sub(100).toNumber(); @@ -951,6 +968,7 @@ export const DatabaseTypeConverter = { [TableName.ArenaExitEvents]: toArenaExitModel, [TableName.ArenaSwapEvents]: toArenaSwapModel, [TableName.ArenaInfo]: toArenaInfoModel, + [TableName.ArenaCandlestick]: toArenaCandlestickModel, [TableName.ArenaPosition]: toArenaPositionModel, [TableName.ArenaVaultBalanceUpdateEvents]: toArenaVaultBalanceUpdateModel, [TableName.ArenaLeaderboard]: toArenaLeaderboardModel, @@ -981,6 +999,7 @@ export type DatabaseModels = { [TableName.ArenaVaultBalanceUpdateEvents]: ArenaVaultBalanceUpdateModel; [TableName.ArenaPosition]: ArenaPositionModel; [TableName.ArenaInfo]: ArenaInfoModel; + [TableName.ArenaCandlestick]: ArenaCandlestickModel; [TableName.ArenaLeaderboard]: ArenaLeaderboardModel; [TableName.ArenaLeaderboardHistory]: ArenaLeaderboardHistoryModel; [TableName.ArenaLeaderboardHistoryWithArenaInfo]: ArenaLeaderboardHistoryWithArenaInfoModel; diff --git a/src/typescript/sdk/src/indexer-v2/types/json-types.ts b/src/typescript/sdk/src/indexer-v2/types/json-types.ts index 9b89b87e3..b9f539ade 100644 --- a/src/typescript/sdk/src/indexer-v2/types/json-types.ts +++ b/src/typescript/sdk/src/indexer-v2/types/json-types.ts @@ -11,6 +11,7 @@ import type { import { type JsonTypes, type Flatten } from "../../types"; export type PeriodTypeFromDatabase = + | "period_15s" | "period_1m" | "period_5m" | "period_15m" @@ -20,6 +21,7 @@ export type PeriodTypeFromDatabase = | "period_1d"; export type PeriodTypeFromBroker = + | "FifteenSeconds" | "OneMinute" | "FiveMinutes" | "FifteenMinutes" @@ -353,6 +355,21 @@ type ArenaLeaderboardData = { withdrawals: Uint64String; }; +type ArenaCandlestickData = { + melee_id: Uint64String; + period: PeriodTypeFromDatabase | PeriodTypeFromBroker; + start_time: PostgresTimestamp; + + open_price: number | null; + close_price: number | null; + high_price: number | null; + low_price: number | null; + + volume: Uint64String; + integrator_fees: Uint64String; + n_swaps: Uint64String; +}; + export type DatabaseStructType = { TransactionMetadata: TransactionMetadata; MarketAndStateMetadata: MarketAndStateMetadata; @@ -374,6 +391,7 @@ export type DatabaseStructType = { ArenaLeaderboard: ArenaLeaderboardData; ArenaLeaderboardHistory: ArenaLeaderboardHistoryData; ArenaInfo: ArenaInfoData; + ArenaCandlestick: ArenaCandlestickData; }; export type BrokerJsonTypes = @@ -412,6 +430,7 @@ export enum TableName { ArenaVaultBalanceUpdateEvents = "arena_vault_balance_update_events", ArenaPosition = "arena_position", ArenaInfo = "arena_info", + ArenaCandlestick = "arena_candlestick", // The view for the current arena leaderboard, all users. ArenaLeaderboard = "arena_leaderboard", // The table for a user's historic arena pnl. @@ -513,6 +532,7 @@ export type DatabaseJsonType = { >; [TableName.ArenaPosition]: ArenaPositionData; [TableName.ArenaInfo]: ArenaInfoData; + [TableName.ArenaCandlestick]: ArenaCandlestickData; [TableName.ArenaLeaderboard]: ArenaLeaderboardData; [TableName.ArenaLeaderboardHistory]: ArenaLeaderboardHistoryData; @@ -567,6 +587,7 @@ type Columns = DatabaseJsonType[TableName.GlobalStateEvents] & DatabaseJsonType[TableName.ArenaVaultBalanceUpdateEvents] & DatabaseJsonType[TableName.ArenaPosition] & DatabaseJsonType[TableName.ArenaInfo] & + DatabaseJsonType[TableName.ArenaCandlestick] & DatabaseJsonType[TableName.ArenaLeaderboard] & DatabaseJsonType[TableName.ArenaLeaderboardHistory] & DatabaseJsonType[DatabaseRpc.UserPools] & diff --git a/src/typescript/sdk/src/indexer-v2/types/postgres-numeric-types.ts b/src/typescript/sdk/src/indexer-v2/types/postgres-numeric-types.ts index db30d0da2..b5f5f1057 100644 --- a/src/typescript/sdk/src/indexer-v2/types/postgres-numeric-types.ts +++ b/src/typescript/sdk/src/indexer-v2/types/postgres-numeric-types.ts @@ -122,6 +122,10 @@ export const floatColumns: Set = new Set([ "emojicoin_0_locked", "emojicoin_1_locked", "apt_proceeds", + "open_price", + "close_price", + "high_price", + "low_price", ]); /** diff --git a/src/typescript/sdk/src/types/arena-types.ts b/src/typescript/sdk/src/types/arena-types.ts index 59f432335..3e9b1920c 100644 --- a/src/typescript/sdk/src/types/arena-types.ts +++ b/src/typescript/sdk/src/types/arena-types.ts @@ -1,3 +1,4 @@ +import type { Period } from "../const"; import { type SymbolEmoji } from "../emoji_data"; import { type AccountAddressString } from "../emojicoin_dot_fun"; import { @@ -154,6 +155,21 @@ export type ArenaTypes = { maxMatchPercentage: bigint; maxMatchAmount: bigint; }; + + ArenaCandlestick: { + meleeID: bigint; + period: Period; + startTime: Date; + + openPrice: number | null; + closePrice: number | null; + highPrice: number | null; + lowPrice: number | null; + + volume: bigint; + integratorFees: bigint; + nSwaps: bigint; + }; }; const toExchangeRate = (data: JsonTypes["BothEmojicoinExchangeRates"]) => ({