Skip to content

Commit

Permalink
feat(ECO-2876): add arena candlesticks to SDK
Browse files Browse the repository at this point in the history
  • Loading branch information
CRBl69 committed Feb 24, 2025
1 parent e04400c commit d18fe88
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 2 deletions.
2 changes: 2 additions & 0 deletions src/typescript/sdk/src/const.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion src/typescript/sdk/src/indexer-v2/json-bigint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
21 changes: 20 additions & 1 deletion src/typescript/sdk/src/indexer-v2/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down Expand Up @@ -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"] => ({
Expand Down Expand Up @@ -491,6 +506,7 @@ export type ArenaPositionModel = ReturnType<typeof toArenaPositionModel>;
export type ArenaLeaderboardModel = ReturnType<typeof toArenaLeaderboardModel>;
export type ArenaLeaderboardHistoryModel = ReturnType<typeof toArenaLeaderboardHistoryModel>;
export type ArenaInfoModel = ReturnType<typeof toArenaInfoModel>;
export type ArenaCandlestickModel = ReturnType<typeof toArenaCandlestickModel>;
export type UserPoolsRPCModel = ReturnType<typeof toUserPoolsRPCResponse>;
export type AggregateMarketStateModel = ReturnType<typeof toAggregateMarketState>;
export type ArenaLeaderboardHistoryWithArenaInfoModel = ReturnType<
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand Down
21 changes: 21 additions & 0 deletions src/typescript/sdk/src/indexer-v2/types/json-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import type {
import { type JsonTypes, type Flatten } from "../../types";

export type PeriodTypeFromDatabase =
| "period_15s"
| "period_1m"
| "period_5m"
| "period_15m"
Expand All @@ -20,6 +21,7 @@ export type PeriodTypeFromDatabase =
| "period_1d";

export type PeriodTypeFromBroker =
| "FifteenSeconds"
| "OneMinute"
| "FiveMinutes"
| "FifteenMinutes"
Expand Down Expand Up @@ -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;
Expand All @@ -374,6 +391,7 @@ export type DatabaseStructType = {
ArenaLeaderboard: ArenaLeaderboardData;
ArenaLeaderboardHistory: ArenaLeaderboardHistoryData;
ArenaInfo: ArenaInfoData;
ArenaCandlestick: ArenaCandlestickData;
};

export type BrokerJsonTypes =
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -513,6 +532,7 @@ export type DatabaseJsonType = {
>;
[TableName.ArenaPosition]: ArenaPositionData;
[TableName.ArenaInfo]: ArenaInfoData;
[TableName.ArenaCandlestick]: ArenaCandlestickData;

[TableName.ArenaLeaderboard]: ArenaLeaderboardData;
[TableName.ArenaLeaderboardHistory]: ArenaLeaderboardHistoryData;
Expand Down Expand Up @@ -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] &
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,10 @@ export const floatColumns: Set<AnyColumnName> = new Set([
"emojicoin_0_locked",
"emojicoin_1_locked",
"apt_proceeds",
"open_price",
"close_price",
"high_price",
"low_price",
]);

/**
Expand Down
16 changes: 16 additions & 0 deletions src/typescript/sdk/src/types/arena-types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { Period } from "../const";
import { type SymbolEmoji } from "../emoji_data";
import { type AccountAddressString } from "../emojicoin_dot_fun";
import {
Expand Down Expand Up @@ -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"]) => ({
Expand Down

0 comments on commit d18fe88

Please sign in to comment.