From 1e2e7c5883965d51ceb5702bdb7168a80ee51649 Mon Sep 17 00:00:00 2001 From: akiraonstarknet Date: Thu, 9 Apr 2026 18:38:58 +0530 Subject: [PATCH 1/2] add vesu-extended indexing config, add poll extended trades script --- .env.sample | 16 + indexers/drizzle/schema.ts | 214 ++- indexers/utils/common_transform.ts | 56 +- indexers/utils/config.ts | 5 + .../utils/configs/vesu_extended_vault_ops.ts | 714 ++++++++ package.json | 3 +- pnpm-lock.yaml | 1455 +---------------- prisma/drizzle/schema.ts | 137 +- .../migration.sql | 101 ++ .../migration.sql | 52 + prisma/schema.prisma | 142 ++ .../customResolvers/vesuExtendedVaultOps.ts | 677 ++++++++ src/graphql/index.ts | 2 + .../poll-extended-trades.ts | 237 +++ ...ate-env-mainnet-block-and-extended-time.ts | 66 + 15 files changed, 2361 insertions(+), 1516 deletions(-) create mode 100644 indexers/utils/configs/vesu_extended_vault_ops.ts create mode 100644 prisma/migrations/20260329224513_vesu_extended/migration.sql create mode 100644 prisma/migrations/20260405180000_vesu_extended_multiply_ekubo/migration.sql create mode 100644 src/graphql/customResolvers/vesuExtendedVaultOps.ts create mode 100644 src/standalone-scripts/poll-extended-trades.ts create mode 100644 src/standalone-scripts/update-env-mainnet-block-and-extended-time.ts diff --git a/.env.sample b/.env.sample index 6400c61..7ef642f 100644 --- a/.env.sample +++ b/.env.sample @@ -23,3 +23,19 @@ RPC_URL= STARTING_BLOCK_LST=1359445 # Number of batches of 1000 you wanna process NUM_BATCHES=2 + +# --- Vesu Extended GraphQL: optional capital baselines (not indexed; added to aggregates in vesuExtendedUsdcSummary) --- +# Per-strategy JSON (keys = strategy_id). Overrides globals below when set for that strategy. +# Amounts: vaUsdcRaw / walletUsdcRaw = USDC raw integer (6 decimals, same units as on-chain Transfer amount). +# extendedFreeQuantized = Extended core deposit quanta (same unit as indexed quantized_amount). +# VESU_EXTENDED_CAPITAL_BASELINES={"extended_usdc_test":{"vaUsdcRaw":"1000000","walletUsdcRaw":"500000","extendedFreeQuantized":"0"}} +# Globals (single-strategy deploys) if JSON key missing: +# VESU_EXTENDED_INITIAL_VA_USDC_RAW=0 +# VESU_EXTENDED_INITIAL_WALLET_USDC_RAW=0 +# VESU_EXTENDED_INITIAL_EXTENDED_FREE_QUANTIZED=0 +# Optional GraphQL args on vesuExtendedUsdcSummary override env for that request: initial_va_usdc_raw, initial_wallet_usdc_raw, initial_extended_free_quantized + +# --- poll-extended-trades (npm run poll-extended-trades) --- +# EXTENDED_BACKEND_URL_READ= +# EXTENDED_TRADES_START_TIME=2025-03-01T00:00:00.000Z +# Or unix seconds / ms; or EXTENDED_TRADES_START_TIME_MS=1740787200000 — trades strictly before cutoff are not upserted diff --git a/indexers/drizzle/schema.ts b/indexers/drizzle/schema.ts index e33c278..b5d71ae 100644 --- a/indexers/drizzle/schema.ts +++ b/indexers/drizzle/schema.ts @@ -88,16 +88,6 @@ export const position_updated = pgTable('position_updated', { .on(position_updated.block_number, position_updated.tx_index, position_updated.event_index) })); -export const strategy_metadata = pgTable('strategy_metadata', { - id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), - strategy_address: text('strategy_address').notNull().unique(), - strategy_name: text('strategy_name').notNull(), - quote_asset: text('quote_asset').notNull() -}, (strategy_metadata) => ({ - 'strategy_metadata_id': uniqueIndex('strategy_metadata_id') - .on(strategy_metadata.strategy_address) -})); - export const raw_price_events = pgTable('raw_price_events', { id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), block_number: integer('block_number').notNull(), @@ -115,31 +105,6 @@ export const raw_price_events = pgTable('raw_price_events', { .on(raw_price_events.block_number, raw_price_events.tx_index, raw_price_events.event_index) })); -export const prices = pgTable('prices', { - id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), - asset: text('asset').notNull(), - price: doublePrecision('price').notNull(), - timestamp: integer('timestamp').notNull(), - block_number: integer('block_number').notNull(), - cursor: bigint('_cursor', { mode: 'bigint' }) -}, (prices) => ({ - 'price_id': uniqueIndex('price_id') - .on(prices.asset, prices.timestamp) -})); - -export const token_metadata = pgTable('token_metadata', { - id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), - address: text('address').notNull().unique(), - name: text('name').notNull(), - symbol: text('symbol').notNull(), - decimals: integer('decimals').notNull(), - pragma_pair_id: text('pragma_pair_id').notNull(), - pragma_decimals: integer('pragma_decimals').notNull() -}, (token_metadata) => ({ - 'token_metadata_id': uniqueIndex('token_metadata_id') - .on(token_metadata.address) -})); - export const svk_alt_redemptions_subscribed = pgTable('svk_alt_redemptions_subscribed', { id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), block_number: integer('block_number').notNull(), @@ -147,8 +112,8 @@ export const svk_alt_redemptions_subscribed = pgTable('svk_alt_redemptions_subsc event_index: integer('event_index').notNull(), tx_hash: text('tx_hash').notNull(), contract_address: text('contract_address').notNull(), - new_nft_id: text('new_nft_id').notNull(), - old_nft_id: text('old_nft_id').notNull(), + new_nft_id: integer('new_nft_id').notNull(), + old_nft_id: integer('old_nft_id').notNull(), receiver: text('receiver').notNull(), timestamp: integer('timestamp').notNull(), cursor: bigint('_cursor', { mode: 'bigint' }) @@ -164,10 +129,10 @@ export const svk_alt_redemptions_claimed = pgTable('svk_alt_redemptions_claimed' event_index: integer('event_index').notNull(), tx_hash: text('tx_hash').notNull(), contract_address: text('contract_address').notNull(), - new_nft_id: text('new_nft_id').notNull(), - old_nft_id: text('old_nft_id').notNull(), + new_nft_id: integer('new_nft_id').notNull(), + old_nft_id: integer('old_nft_id').notNull(), receivable: text('receivable').notNull(), - swap_id: text('swap_id').notNull(), + swap_id: integer('swap_id').notNull(), timestamp: integer('timestamp').notNull(), cursor: bigint('_cursor', { mode: 'bigint' }) }, (svk_alt_redemptions_claimed) => ({ @@ -182,8 +147,8 @@ export const svk_alt_redemptions_unsubscribed = pgTable('svk_alt_redemptions_uns event_index: integer('event_index').notNull(), tx_hash: text('tx_hash').notNull(), contract_address: text('contract_address').notNull(), - new_nft_id: text('new_nft_id').notNull(), - old_nft_id: text('old_nft_id').notNull(), + new_nft_id: integer('new_nft_id').notNull(), + old_nft_id: integer('old_nft_id').notNull(), owner: text('owner').notNull(), is_old_nft_returned: boolean('is_old_nft_returned').notNull(), is_original_assets_returned: boolean('is_original_assets_returned').notNull(), @@ -195,6 +160,46 @@ export const svk_alt_redemptions_unsubscribed = pgTable('svk_alt_redemptions_uns .on(svk_alt_redemptions_unsubscribed.block_number, svk_alt_redemptions_unsubscribed.tx_index, svk_alt_redemptions_unsubscribed.event_index) })); +export const strategy_metadata = pgTable('strategy_metadata', { + id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), + strategy_address: text('strategy_address').notNull().unique(), + strategy_name: text('strategy_name').notNull(), + quote_asset: text('quote_asset').notNull() +}, (strategy_metadata) => ({ + 'strategy_metadata_id': uniqueIndex('strategy_metadata_id') + .on(strategy_metadata.strategy_address) +})); + +export const prices = pgTable('prices', { + id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), + asset: text('asset').notNull(), + price: doublePrecision('price').notNull(), + timestamp: integer('timestamp').notNull(), + block_number: integer('block_number').notNull(), + cursor: bigint('_cursor', { mode: 'bigint' }) +}, (prices) => ({ + 'price_id': uniqueIndex('price_id') + .on(prices.asset, prices.timestamp) +})); + +export const token_metadata = pgTable('token_metadata', { + id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), + address: text('address').notNull().unique(), + name: text('name').notNull(), + symbol: text('symbol').notNull(), + decimals: integer('decimals').notNull(), + pragma_pair_id: text('pragma_pair_id').notNull(), + pragma_decimals: integer('pragma_decimals').notNull() +}, (token_metadata) => ({ + 'token_metadata_id': uniqueIndex('token_metadata_id') + .on(token_metadata.address) +})); + +export const lst_price_sync_progress = pgTable('lst_price_sync_progress', { + id: text('id').notNull().primaryKey().default("lst_price_sync"), + last_processed_block: integer('last_processed_block') +}); + export const svk_alt_redemptions = pgTable('svk_alt_redemptions', { id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), block_number: integer('block_number').notNull(), @@ -218,4 +223,127 @@ export const svk_alt_redemptions = pgTable('svk_alt_redemptions', { }, (svk_alt_redemptions) => ({ 'redemption_unique': uniqueIndex('redemption_unique') .on(svk_alt_redemptions.contract_address, svk_alt_redemptions.old_nft_id) -})); \ No newline at end of file +})); + +export const strategy_apy = pgTable('strategy_apy', { + id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), + strategy_id: text('strategy_id').notNull(), + strategy_address: text('strategy_address').notNull(), + net_apy: doublePrecision('net_apy'), + timestamp: integer('timestamp').notNull(), + block_number: integer('block_number') +}, (strategy_apy) => ({ + 'strategy_apy_unique': uniqueIndex('strategy_apy_unique') + .on(strategy_apy.strategy_id, strategy_apy.timestamp) +})); + +export const vesu_extended_usdc_transfers = pgTable('vesu_extended_usdc_transfers', { + id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), + block_number: integer('block_number').notNull(), + tx_index: integer('tx_index').notNull(), + event_index: integer('event_index').notNull(), + tx_hash: text('tx_hash').notNull(), + strategy_id: text('strategy_id').notNull(), + flow_type: text('flow_type').notNull(), + from_address: text('from_address').notNull(), + to_address: text('to_address').notNull(), + amount: text('amount').notNull(), + timestamp: integer('timestamp').notNull(), + cursor: bigint('_cursor', { mode: 'bigint' }) +}, (vesu_extended_usdc_transfers) => ({ + 'vesu_ext_usdc_transfer_event_id': uniqueIndex('vesu_ext_usdc_transfer_event_id') + .on(vesu_extended_usdc_transfers.block_number, vesu_extended_usdc_transfers.tx_index, vesu_extended_usdc_transfers.event_index) +})); + +export const vesu_extended_modify_position = pgTable('vesu_extended_modify_position', { + id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), + block_number: integer('block_number').notNull(), + tx_index: integer('tx_index').notNull(), + event_index: integer('event_index').notNull(), + tx_hash: text('tx_hash').notNull(), + strategy_id: text('strategy_id').notNull(), + pool_contract: text('pool_contract').notNull(), + collateral_asset: text('collateral_asset').notNull(), + debt_asset: text('debt_asset').notNull(), + user_address: text('user_address').notNull(), + collateral_delta: text('collateral_delta').notNull(), + collateral_shares_delta: text('collateral_shares_delta').notNull(), + debt_delta: text('debt_delta').notNull(), + nominal_debt_delta: text('nominal_debt_delta').notNull(), + timestamp: integer('timestamp').notNull(), + cursor: bigint('_cursor', { mode: 'bigint' }) +}, (vesu_extended_modify_position) => ({ + 'vesu_ext_modify_event_id': uniqueIndex('vesu_ext_modify_event_id') + .on(vesu_extended_modify_position.block_number, vesu_extended_modify_position.tx_index, vesu_extended_modify_position.event_index) +})); + +export const vesu_extended_multiply_lever = pgTable('vesu_extended_multiply_lever', { + id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), + block_number: integer('block_number').notNull(), + tx_index: integer('tx_index').notNull(), + event_index: integer('event_index').notNull(), + tx_hash: text('tx_hash').notNull(), + strategy_id: text('strategy_id').notNull(), + lever_kind: text('lever_kind').notNull(), + pool_id: text('pool_id').notNull(), + collateral_asset: text('collateral_asset').notNull(), + debt_asset: text('debt_asset').notNull(), + user_address: text('user_address').notNull(), + margin: text('margin').notNull(), + collateral_delta: text('collateral_delta').notNull(), + debt_delta: text('debt_delta').notNull(), + timestamp: integer('timestamp').notNull(), + cursor: bigint('_cursor', { mode: 'bigint' }) +}, (t) => ({ + 'vesu_ext_multiply_lever_event_id': uniqueIndex('vesu_ext_multiply_lever_event_id') + .on(t.block_number, t.tx_index, t.event_index) +})); + +export const vesu_extended_ekubo_swapped = pgTable('vesu_extended_ekubo_swapped', { + id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), + block_number: integer('block_number').notNull(), + tx_index: integer('tx_index').notNull(), + event_index: integer('event_index').notNull(), + tx_hash: text('tx_hash').notNull(), + strategy_id: text('strategy_id').notNull(), + locker: text('locker').notNull(), + token0: text('token0').notNull(), + token1: text('token1').notNull(), + fee: text('fee').notNull(), + tick_spacing: text('tick_spacing').notNull(), + extension: text('extension').notNull(), + swap_amount_signed: text('swap_amount_signed').notNull(), + is_token1: text('is_token1').notNull(), + sqrt_ratio_limit: text('sqrt_ratio_limit').notNull(), + skip_ahead: text('skip_ahead').notNull(), + delta0_signed: text('delta0_signed').notNull(), + delta1_signed: text('delta1_signed').notNull(), + sqrt_ratio_after: text('sqrt_ratio_after').notNull(), + tick_after_signed: text('tick_after_signed').notNull(), + liquidity_after: text('liquidity_after').notNull(), + timestamp: integer('timestamp').notNull(), + cursor: bigint('_cursor', { mode: 'bigint' }) +}, (t) => ({ + 'vesu_ext_ekubo_swap_event_id': uniqueIndex('vesu_ext_ekubo_swap_event_id') + .on(t.block_number, t.tx_index, t.event_index) +})); + +export const vesu_extended_core_deposits = pgTable('vesu_extended_core_deposits', { + id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), + block_number: integer('block_number').notNull(), + tx_index: integer('tx_index').notNull(), + event_index: integer('event_index').notNull(), + tx_hash: text('tx_hash').notNull(), + strategy_id: text('strategy_id').notNull(), + vault_id_key: text('vault_id_key').notNull(), + va_address: text('va_address').notNull(), + collateral_id: text('collateral_id').notNull(), + quantized_amount: text('quantized_amount').notNull(), + unquantized_amount: text('unquantized_amount').notNull(), + salt: text('salt').notNull(), + timestamp: integer('timestamp').notNull(), + cursor: bigint('_cursor', { mode: 'bigint' }) +}, (vesu_extended_core_deposits) => ({ + 'vesu_ext_core_dep_event_id': uniqueIndex('vesu_ext_core_dep_event_id') + .on(vesu_extended_core_deposits.block_number, vesu_extended_core_deposits.tx_index, vesu_extended_core_deposits.event_index) +})); diff --git a/indexers/utils/common_transform.ts b/indexers/utils/common_transform.ts index b1ab6a8..247c901 100644 --- a/indexers/utils/common_transform.ts +++ b/indexers/utils/common_transform.ts @@ -206,27 +206,45 @@ export async function processEvent( } // Parse data - let indexAdjustment = 0; - for (let index = 0; index < event.data.length; index++) { - let dataField: any = event.data[index]; - const field = config.dataFields[index - indexAdjustment]; - if (config.dataFields[index - indexAdjustment].type == "u256") { - // if next event data is not 0, throw an error - dataField = uint256 - .uint256ToBN({ - low: event.data[index], - high: event.data[index + 1], - }) - .toString(); - // allows u to skip this index for the data type - indexAdjustment++; - index++; - } + if (!config.skipDataFieldParsing) { + let indexAdjustment = 0; + for (let index = 0; index < event.data.length; index++) { + let dataField: any = event.data[index]; + const field = config.dataFields[index - indexAdjustment]; + if (!field) { + throw new Error( + `${config.tableName}: event data length ${event.data.length} exceeds dataFields schema`, + ); + } + if (field.type === "i257") { + const low = BigInt(event.data[index]); + const high = BigInt(event.data[index + 1]); + const isNegative = BigInt(event.data[index + 2]) !== 0n; + const abs = low + (high << 128n); + const signed = isNegative ? -abs : abs; + if (field.sqlType !== "skip") { + result[field.name] = signed.toString(); + } + indexAdjustment += 2; + index += 2; + continue; + } + if (config.dataFields[index - indexAdjustment].type == "u256") { + dataField = uint256 + .uint256ToBN({ + low: event.data[index], + high: event.data[index + 1], + }) + .toString(); + indexAdjustment++; + index++; + } - if (field.sqlType == "skip") { - continue; + if (field.sqlType == "skip") { + continue; + } + result[field.name] = convertToSqlFormat(dataField, field); } - result[field.name] = convertToSqlFormat(dataField, field); } // Add additional fields diff --git a/indexers/utils/config.ts b/indexers/utils/config.ts index 4db85ec..edfaa07 100644 --- a/indexers/utils/config.ts +++ b/indexers/utils/config.ts @@ -9,9 +9,11 @@ import { onEventEkuboVault } from "./ekubo_vault"; import { CONFIG_INVESTMENT_FLOWS_ERC4626, EKUBO_VAULT_CONTRACTS } from "./configs/investment_flows_erc4626"; import { CONFIG_INVESTMENT_FLOWS_STARKNET_VAULT_KIT } from "./configs/investment_flows_starknet_vault_kit"; import { CONFIG_PRAGMA_PRICE } from "./configs/pragma_price"; +import { CONFIG_VESU_EXTENDED_VAULT_OPS } from "./configs/vesu_extended_vault_ops"; export interface EventField { name: string; + /** u256 = two felts (low, high); i257 = alexandria i257 (u256 abs low+high, then is_negative felt) */ type: string; sqlType: string; } @@ -51,6 +53,8 @@ export interface EventConfig { dataFields: EventField[]; additionalFields: AdditionalField[]; includeReceipt?: boolean; + /** When true, skip declarative data parsing; onEvent must populate from event.data. */ + skipDataFieldParsing?: boolean; onEvent?: OnEvent; } @@ -68,6 +72,7 @@ export const CONFIG: EventConfig[] = [ ...CONFIG_PRAGMA_PRICE, ...CONFIG_INVESTMENT_FLOWS_ERC4626, ...CONFIG_INVESTMENT_FLOWS_STARKNET_VAULT_KIT, + ...CONFIG_VESU_EXTENDED_VAULT_OPS, { tableName: "harvests", diff --git a/indexers/utils/configs/vesu_extended_vault_ops.ts b/indexers/utils/configs/vesu_extended_vault_ops.ts new file mode 100644 index 0000000..116170c --- /dev/null +++ b/indexers/utils/configs/vesu_extended_vault_ops.ts @@ -0,0 +1,714 @@ +import { + ExtendedAdapter, + EXTENDED_CONTRACT, + getVesuSingletonAddress, + type IStrategyMetadata, + VesuExtendedTestStrategies, + VesuModifyPositionAdapter, +} from "@strkfarm/sdk"; +import type { VesuExtendedStrategySettings } from "@strkfarm/sdk"; +import { useDrizzleStorage } from "@apibara/plugin-drizzle"; +import type { Block, Event } from "@apibara/starknet"; +import { hash, uint256 } from "starknet"; +import { standariseAddress } from "../../../src/utils"; +import type { AdditionalField, ContractConfig, EventConfig, OnEvent } from "../config"; +import * as schema from "../../drizzle/schema"; + +function eventKey(name: string): `0x${string}` { + const h = BigInt(hash.getSelectorFromName(name)); + return `0x${h.toString(16).padStart(64, "0")}`; +} + +type VesuExtMeta = IStrategyMetadata; + +/** Resolved per-strategy addresses for Vesu Extended vault ops indexing. */ +export interface VesuExtendedIndexerProfile { + strategyId: string; + vault: string; + va: string; + wallet: string; + usdc: string; + collateral: string; + debt: string; + collateralDecimals: number; + debtDecimals: number; + /** Vesu pool contract that emits ModifyPosition (singleton for pool id). */ + poolEmitter: string; + /** Vesu multiply contract (IncreaseLever / DecreaseLever + Ekubo locker). */ + multiplyContract: string; + vaultIdExtended: number; +} + +function readExtendedIndexerEnv() { + return { + extendedBackendReadUrl: + process.env.EXTENDED_BACKEND_URL_READ?.trim() || + process.env.VESU_EXTENDED_READ_URL?.trim() || + "https://api.starknet.extended.exchange", + extendedBackendWriteUrl: + process.env.EXTENDED_BACKEND_URL?.trim() || + process.env.EXTENDED_BACKEND_WRITE_URL?.trim() || + "https://api.starknet.extended.exchange", + vaultIdExtended: Number( + process.env.VAULT_ID_EXTENDED?.trim() || + process.env.VESU_EXTENDED_VAULT_ID?.trim() || + "0", + ), + minimumExtendedMovementAmount: Number( + process.env.MINIMUM_EXTENDED_AMOUNT ?? 5, + ), + minimumVesuMovementAmount: Number(process.env.MINIMUM_VESU_AMOUNT ?? 5), + minimumExtendedRetriesDelayForOrderStatus: Number( + process.env.RETRY_DELAY_FOR_ORDER_STATUS ?? 3000, + ), + minimumExtendedPriceDifferenceForSwapOpen: Number( + process.env.MIN_PRICE_DIFF_SWAP_OPEN ?? 300, + ), + maximumExtendedPriceDifferenceForSwapClosing: Number( + process.env.MAX_PRICE_DIFF_SWAP_CLOSE ?? 600, + ), + }; +} + +/** + * Build metadata list from SDK (same factory as risk-engine / troves-admin). + * Add more factories here when new Vesu Extended strategy registries exist. + */ +function loadAllVesuExtendedMetadata(): VesuExtMeta[] { + const e = readExtendedIndexerEnv(); + const fromTestStrategies = VesuExtendedTestStrategies( + e.extendedBackendReadUrl, + e.extendedBackendWriteUrl, + e.vaultIdExtended, + e.minimumExtendedMovementAmount, + e.minimumVesuMovementAmount, + e.minimumExtendedRetriesDelayForOrderStatus, + e.minimumExtendedPriceDifferenceForSwapOpen, + e.maximumExtendedPriceDifferenceForSwapClosing, + ).slice(1, 2); // ! only take first strategy + return [...fromTestStrategies]; +} + +function extractProfile(meta: VesuExtMeta): VesuExtendedIndexerProfile | null { + const info = meta.additionalInfo; + const adapters = info.adapters ?? []; + const vmpEntry = adapters.find( + (a: any) => a.adapter.name === VesuModifyPositionAdapter.name, + ); + const extEntry = adapters.find( + (a: any) => a.adapter.name === ExtendedAdapter.name, + ); + if (!vmpEntry || !extEntry) return null; + + const vmp = vmpEntry.adapter as InstanceType; + const ext = extEntry.adapter as InstanceType; + + const { addr: poolSingleton, isV2 } = getVesuSingletonAddress(vmp.config.poolId); + const multiplyRaw = isV2 + ? "0xd2b0006de39992e78d457b7607a606c00bd6b601e9d9a77a8e1870c5e19e73" + : "0x3630f1f8e5b8f5c4c4ae9b6620f8a570ae55cddebc0276c37550e7c118edf67"; + + return { + strategyId: meta.id, + vault: standariseAddress(info.vaultAddress.address), + va: standariseAddress(info.vaultAllocator.address), + wallet: standariseAddress(info.walletAddress), + usdc: standariseAddress(vmp.config.debt.address.address), + collateral: standariseAddress(vmp.config.collateral.address.address), + debt: standariseAddress(vmp.config.debt.address.address), + collateralDecimals: vmp.config.collateral.decimals, + debtDecimals: vmp.config.debt.decimals, + poolEmitter: standariseAddress(poolSingleton.address), + multiplyContract: standariseAddress(multiplyRaw), + vaultIdExtended: ext.config.vaultIdExtended, + }; +} + +function buildProfiles(): VesuExtendedIndexerProfile[] { + const metas = loadAllVesuExtendedMetadata(); + const out: VesuExtendedIndexerProfile[] = []; + for (const m of metas) { + const p = extractProfile(m); + if (p) out.push(p); + } + if (out.length === 0) { + console.warn( + "[vesu_extended_vault_ops] No Vesu Extended profiles from SDK; check adapters on metadata.", + ); + } + return out; +} + +const PROFILES: VesuExtendedIndexerProfile[] = buildProfiles(); + +const EXTENDED_CORE = standariseAddress(EXTENDED_CONTRACT.address); + +/** Ekubo core (mainnet). */ +const EKUBO_CORE = standariseAddress( + "0x00000005dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b", +); + +const LEVER_INCREASE_SEL = eventKey("IncreaseLever"); +const LEVER_DECREASE_SEL = eventKey("DecreaseLever"); +const SWAPPED_SEL = eventKey("Swapped"); +const MODIFY_POSITION_SEL = eventKey("ModifyPosition"); + +function i129FromMagSign(mag: bigint, signFelt: bigint): bigint { + const neg = signFelt !== 0n && mag !== 0n; + return neg ? -mag : mag; +} + +function feltToCanonAddress(f: bigint): string { + return standariseAddress(`0x${f.toString(16).padStart(64, "0")}`); +} + +/** + * Decode Ekubo core `Swapped` event `data` felts (see EkuboProtocol/starknet-contracts `core.cairo`). + * Layout: locker, PoolKey (5), SwapParameters (amount i129 + is_token1 + sqrt_limit u256 + skip), Delta (2× i129), sqrt_after u256, tick_after i129, liquidity_after u128. + */ +export function parseEkuboSwappedFelts( + data: readonly { toString(): string }[], +): Record | null { + if (data.length < 21) return null; + const d = data.map((x) => BigInt(x.toString())); + let i = 0; + const locker = feltToCanonAddress(d[i++]); + const token0 = feltToCanonAddress(d[i++]); + const token1 = feltToCanonAddress(d[i++]); + const fee = d[i++].toString(); + const tick_spacing = d[i++].toString(); + const extension = feltToCanonAddress(d[i++]); + const swapMag = d[i++]; + const swapSign = d[i++]; + const swap_amount_signed = i129FromMagSign(swapMag, swapSign).toString(); + const is_token1 = d[i++] !== 0n ? "true" : "false"; + const sqrtLow = d[i++]; + const sqrtHigh = d[i++]; + const sqrt_ratio_limit = (sqrtLow + (sqrtHigh << 128n)).toString(); + const skip_ahead = d[i++].toString(); + const d0mag = d[i++]; + const d0sign = d[i++]; + const delta0_signed = i129FromMagSign(d0mag, d0sign).toString(); + const d1mag = d[i++]; + const d1sign = d[i++]; + const delta1_signed = i129FromMagSign(d1mag, d1sign).toString(); + const saLow = d[i++]; + const saHigh = d[i++]; + const sqrt_ratio_after = (saLow + (saHigh << 128n)).toString(); + const tickMag = d[i++]; + const tickSign = d[i++]; + const tick_after_signed = i129FromMagSign(tickMag, tickSign).toString(); + const liquidity_after = d[i++].toString(); + return { + locker, + token0, + token1, + fee, + tick_spacing, + extension, + swap_amount_signed, + is_token1, + sqrt_ratio_limit, + skip_ahead, + delta0_signed, + delta1_signed, + sqrt_ratio_after, + tick_after_signed, + liquidity_after, + }; +} + +function poolTokensMatchProfile( + p: VesuExtendedIndexerProfile, + token0: string, + token1: string, +): boolean { + const a = standariseAddress(token0); + const b = standariseAddress(token1); + return ( + (a === p.collateral && b === p.debt) || (a === p.debt && b === p.collateral) + ); +} + +function vaultIdToFelt(vaultId: number): string { + return `0x${BigInt(vaultId).toString(16).padStart(64, "0")}`; +} + +/** DB / standariseAddress use short felts; vaultIdToFelt uses 64-char padding — compare numerically. */ +function depositVaultKeyMatchesVaultId( + canonVaultKey: string, + vaultIdExtended: number, +): boolean { + try { + return BigInt(canonVaultKey) === BigInt(vaultIdExtended); + } catch { + return false; + } +} + +function matchProfileByVa( + profiles: VesuExtendedIndexerProfile[], + va: string, +): VesuExtendedIndexerProfile | undefined { + const v = standariseAddress(va); + return profiles.find((p) => p.va === v); +} + +function matchProfileByTransfer( + profiles: VesuExtendedIndexerProfile[], + from: string, + to: string, +): VesuExtendedIndexerProfile | undefined { + const f = standariseAddress(from); + const t = standariseAddress(to); + return profiles.find( + (p) => + (f === p.va && t === p.wallet) || + (f === p.wallet && t === p.va) || + (f === p.vault && t === p.va) || + (f === p.va && t === p.vault) || + (f === EXTENDED_CORE && t === p.wallet), + ); +} + +function matchProfileByDeposit( + profiles: VesuExtendedIndexerProfile[], + vaultKey: string, + va: string, +): VesuExtendedIndexerProfile | undefined { + const vaN = standariseAddress(va); + const vk = standariseAddress(vaultKey); + const strict = profiles.find( + (p) => + p.va === vaN && + depositVaultKeyMatchesVaultId(vk, p.vaultIdExtended), + ); + if (strict) return strict; + + // Env/SDK vaultIdExtended can disagree with on-chain Deposit keys; transfers still + // classify via VA. If only one profile uses this VA, attribute the deposit to it. + const byVa = profiles.filter((p) => p.va === vaN); + if (byVa.length === 1) return byVa[0]; + + return undefined; +} + +function makeUsdcTransferOnEvent( + profiles: VesuExtendedIndexerProfile[], +): OnEvent { + return async (_event, record) => { + const from = standariseAddress(String(record.from_address ?? "")); + const to = standariseAddress(String(record.to_address ?? "")); + const p = matchProfileByTransfer(profiles, from, to); + + record.strategy_id = p?.strategyId ?? "unknown"; + + if (!p) { + record.flow_type = "other"; + return; + } + + let flow_type = "other"; + if (from === p.va && to === p.wallet) flow_type = "va_to_wallet"; + else if (from === p.wallet && to === p.va) flow_type = "wallet_to_va"; + else if (from === p.vault && to === p.va) flow_type = "vault_to_va"; + else if (from === p.va && to === p.vault) flow_type = "va_to_vault"; + else if (from === EXTENDED_CORE && to === p.wallet) { + flow_type = "extended_withdrawal"; + } + record.flow_type = flow_type; + }; +} + +function txEventOrder(e: Event): number { + return e.eventIndexInTransaction ?? e.eventIndex ?? 0; +} + +function isPoolModifyPosition(e: Event, poolContract: string): boolean { + if (standariseAddress(e.address) !== standariseAddress(poolContract)) + return false; + if (!e.keys?.length) return false; + return BigInt(e.keys[0]) === BigInt(MODIFY_POSITION_SEL); +} + +function readPairU256( + data: readonly unknown[], + offset: number, +): { value: string; next: number } { + const low = data[offset] as any; + const high = data[offset + 1] as any; + return { + value: uint256.uint256ToBN({ low, high }).toString(), + next: offset + 2, + }; +} + +/** Parse multiply Increase/Decrease lever event (caller decides tx ordering). */ +function tryMultiplyLeverInsert( + e: Event, + block: Block, + profile: VesuExtendedIndexerProfile, +): typeof schema.vesu_extended_multiply_lever.$inferInsert | null { + if (standariseAddress(e.address) !== profile.multiplyContract) return null; + if (e.keys.length < 5 || e.data.length < 6) return null; + + const sel = BigInt(e.keys[0]); + const inc = BigInt(LEVER_INCREASE_SEL); + const dec = BigInt(LEVER_DECREASE_SEL); + if (sel !== inc && sel !== dec) return null; + + const pool_id = feltToCanonAddress(BigInt(String(e.keys[1]))); + const collateral_asset = feltToCanonAddress(BigInt(String(e.keys[2]))); + const debt_asset = feltToCanonAddress(BigInt(String(e.keys[3]))); + const user_address = feltToCanonAddress(BigInt(String(e.keys[4]))); + + if ( + user_address !== profile.va || + collateral_asset !== profile.collateral || + debt_asset !== profile.debt + ) { + return null; + } + + const m0 = readPairU256(e.data, 0); + const m1 = readPairU256(e.data, m0.next); + const m2 = readPairU256(e.data, m1.next); + + const header = block.header; + if (!header?.blockNumber || !header.timestamp) return null; + const ts = Math.round(header.timestamp.getTime() / 1000); + const bn = Number(header.blockNumber); + + return { + block_number: bn, + tx_index: e.transactionIndex, + event_index: e.eventIndex ?? 0, + tx_hash: e.transactionHash, + strategy_id: profile.strategyId, + lever_kind: sel === inc ? "increase" : "decrease", + pool_id, + collateral_asset, + debt_asset, + user_address, + margin: m0.value, + collateral_delta: m1.value, + debt_delta: m2.value, + timestamp: ts, + cursor: BigInt(bn), + }; +} + +/** Parse Ekubo Swapped (caller restricts tx window; locker = multiply; pool = strategy tokens). */ +function tryEkuboSwappedInsert( + e: Event, + block: Block, + profile: VesuExtendedIndexerProfile, +): typeof schema.vesu_extended_ekubo_swapped.$inferInsert | null { + if (standariseAddress(e.address) !== EKUBO_CORE) return null; + if (BigInt(e.keys[0]) !== BigInt(SWAPPED_SEL)) return null; + + const parsed = parseEkuboSwappedFelts(e.data); + if (!parsed) return null; + if (standariseAddress(parsed.locker) !== profile.multiplyContract) + return null; + if (!poolTokensMatchProfile(profile, parsed.token0, parsed.token1)) + return null; + + const header = block.header; + if (!header?.blockNumber || !header.timestamp) return null; + const ts = Math.round(header.timestamp.getTime() / 1000); + const bn = Number(header.blockNumber); + + return { + block_number: bn, + tx_index: e.transactionIndex, + event_index: e.eventIndex ?? 0, + tx_hash: e.transactionHash, + strategy_id: profile.strategyId, + timestamp: ts, + cursor: BigInt(bn), + locker: parsed.locker, + token0: parsed.token0, + token1: parsed.token1, + fee: parsed.fee, + tick_spacing: parsed.tick_spacing, + extension: parsed.extension, + swap_amount_signed: parsed.swap_amount_signed, + is_token1: parsed.is_token1, + sqrt_ratio_limit: parsed.sqrt_ratio_limit, + skip_ahead: parsed.skip_ahead, + delta0_signed: parsed.delta0_signed, + delta1_signed: parsed.delta1_signed, + sqrt_ratio_after: parsed.sqrt_ratio_after, + tick_after_signed: parsed.tick_after_signed, + liquidity_after: parsed.liquidity_after, + }; +} + +function makeModifyOnEvent(profiles: VesuExtendedIndexerProfile[]): OnEvent { + return async (event, record, allEvents, block) => { + const ua = standariseAddress(String(record.user_address ?? "")); + const p = matchProfileByVa(profiles, ua); + record.strategy_id = p?.strategyId ?? "unknown"; + + if (!p || !allEvents?.length || !block?.header?.blockNumber) return; + + const modifyOrder = txEventOrder(event); + const txHash = event.transactionHash; + const poolContract = standariseAddress(event.address); + const sibs = allEvents.filter((e) => e.transactionHash === txHash); + const ordered = [...sibs].sort((a, b) => txEventOrder(a) - txEventOrder(b)); + + const prevModifyOrder = ordered + .filter( + (e) => + isPoolModifyPosition(e, poolContract) && + txEventOrder(e) < modifyOrder, + ) + .reduce((max, e) => Math.max(max, txEventOrder(e)), -1); + + const { db } = useDrizzleStorage(); + + for (const e of ordered) { + const o = txEventOrder(e); + if (o <= prevModifyOrder || o >= modifyOrder) continue; + if (isPoolModifyPosition(e, poolContract)) continue; + + const swapRow = tryEkuboSwappedInsert(e, block, p); + if (swapRow) { + await db + .insert(schema.vesu_extended_ekubo_swapped) + .values(swapRow) + .onConflictDoNothing({ + target: [ + schema.vesu_extended_ekubo_swapped.block_number, + schema.vesu_extended_ekubo_swapped.tx_index, + schema.vesu_extended_ekubo_swapped.event_index, + ], + }) + .execute(); + } + } + + for (const e of ordered) { + const o = txEventOrder(e); + if (o <= modifyOrder) continue; + if (isPoolModifyPosition(e, poolContract)) break; + + const leverRow = tryMultiplyLeverInsert(e, block, p); + if (leverRow) { + await db + .insert(schema.vesu_extended_multiply_lever) + .values(leverRow) + .onConflictDoNothing({ + target: [ + schema.vesu_extended_multiply_lever.block_number, + schema.vesu_extended_multiply_lever.tx_index, + schema.vesu_extended_multiply_lever.event_index, + ], + }) + .execute(); + break; + } + } + }; +} + +function makeDepositOnEvent(profiles: VesuExtendedIndexerProfile[]): OnEvent { + return async (_event, record) => { + const vk = standariseAddress(String(record.vault_id_key ?? "")); + const va = standariseAddress(String(record.va_address ?? "")); + const p = matchProfileByDeposit(profiles, vk, va); + record.strategy_id = p?.strategyId ?? "unknown"; + }; +} + +const strategyIdPlaceholder: AdditionalField[] = [ + { + name: "strategy_id", + source: "custom", + sqlType: "text", + customLogic: () => "", + }, + { + name: "flow_type", + source: "custom", + sqlType: "text", + customLogic: () => "", + }, +]; + +/** One config per debt (USDC) token so strategies can use different ERC20s. */ +function buildUsdcTransferConfigs( + profiles: VesuExtendedIndexerProfile[], +): EventConfig[] { + if (profiles.length === 0) return []; + + const byUsdc = new Map(); + for (const p of profiles) { + const list = byUsdc.get(p.usdc) ?? []; + list.push(p); + byUsdc.set(p.usdc, list); + } + + const out: EventConfig[] = []; + const transferSel = eventKey("Transfer"); + + for (const [usdc, plist] of byUsdc) { + const defaultKeys: `0x${string}`[][] = []; + for (const p of plist) { + defaultKeys.push( + [transferSel, p.va as `0x${string}`, p.wallet as `0x${string}`], + [transferSel, p.wallet as `0x${string}`, p.va as `0x${string}`], + [transferSel, p.vault as `0x${string}`, p.va as `0x${string}`], + [transferSel, p.va as `0x${string}`, p.vault as `0x${string}`], + [ + transferSel, + EXTENDED_CORE as `0x${string}`, + p.wallet as `0x${string}`, + ], + ); + } + out.push({ + tableName: "vesu_extended_usdc_transfers", + contracts: [{ address: usdc, asset: usdc, name: "USDC" }], + defaultKeys, + keyFields: [ + { name: "from_address", type: "ContractAddress", sqlType: "text" }, + { name: "to_address", type: "ContractAddress", sqlType: "text" }, + ], + dataFields: [{ name: "amount", type: "u256", sqlType: "numeric(78,0)" }], + additionalFields: [...strategyIdPlaceholder], + onEvent: makeUsdcTransferOnEvent(plist), + }); + } + return out; +} + +function buildModifyPositionConfig( + profiles: VesuExtendedIndexerProfile[], +): EventConfig | null { + if (profiles.length === 0) return null; + + const sel = eventKey("ModifyPosition"); + const poolSet = new Map(); + for (const p of profiles) { + const list = poolSet.get(p.poolEmitter) ?? []; + list.push(p); + poolSet.set(p.poolEmitter, list); + } + + const contracts: ContractConfig[] = [...poolSet.keys()].map((address) => ({ + address, + asset: "", + name: "vesu_pool", + })); + + const defaultKeys: `0x${string}`[][] = []; + for (const p of profiles) { + defaultKeys.push([ + sel, + p.collateral as `0x${string}`, + p.debt as `0x${string}`, + p.va as `0x${string}`, + ]); + } + + return { + tableName: "vesu_extended_modify_position", + contracts, + defaultKeys, + keyFields: [ + { name: "collateral_asset", type: "ContractAddress", sqlType: "text" }, + { name: "debt_asset", type: "ContractAddress", sqlType: "text" }, + { name: "user_address", type: "ContractAddress", sqlType: "text" }, + ], + dataFields: [ + { name: "collateral_delta", type: "i257", sqlType: "numeric(78,0)" }, + { name: "collateral_shares_delta", type: "i257", sqlType: "numeric(78,0)" }, + { name: "debt_delta", type: "i257", sqlType: "numeric(78,0)" }, + { name: "nominal_debt_delta", type: "i257", sqlType: "numeric(78,0)" }, + ], + additionalFields: [ + { + name: "strategy_id", + source: "custom", + sqlType: "text", + customLogic: () => "", + }, + { + name: "pool_contract", + source: "custom", + sqlType: "text", + customLogic: (event) => standariseAddress(event.address), + }, + ], + includeReceipt: true, + onEvent: makeModifyOnEvent(profiles), + }; +} + +function buildExtendedDepositConfig( + profiles: VesuExtendedIndexerProfile[], +): EventConfig | null { + const withVault = profiles.filter((p) => p.vaultIdExtended > 0); + if (withVault.length === 0) return null; + + const depositSel = eventKey("Deposit"); + const defaultKeys: `0x${string}`[][] = []; + for (const p of withVault) { + defaultKeys.push([ + depositSel, + vaultIdToFelt(p.vaultIdExtended) as `0x${string}`, + p.va as `0x${string}`, + ]); + } + + return { + tableName: "vesu_extended_core_deposits", + contracts: [ + { address: EXTENDED_CORE, asset: "", name: "extended_core" }, + ], + defaultKeys, + keyFields: [ + { name: "vault_id_key", type: "ContractAddress", sqlType: "text" }, + { name: "va_address", type: "ContractAddress", sqlType: "text" }, + ], + dataFields: [ + { name: "collateral_id", type: "u64", sqlType: "numeric(78,0)" }, + { name: "quantized_amount", type: "u64", sqlType: "numeric(78,0)" }, + { name: "unquantized_amount", type: "u64", sqlType: "numeric(78,0)" }, + { name: "salt", type: "u64", sqlType: "numeric(78,0)" }, + ], + additionalFields: [ + { + name: "strategy_id", + source: "custom", + sqlType: "text", + customLogic: () => "", + }, + ], + onEvent: makeDepositOnEvent(withVault), + }; +} + +/** + * Vesu Extended vault ops: USDC transfers, ModifyPosition (includeReceipt → same-tx siblings; + * onEvent indexes multiply lever + Ekubo swaps only for our VA), Extended deposit. + * No global Ekubo / multiply filters — avoids indexing unrelated Swapped events. + */ +export const CONFIG_VESU_EXTENDED_VAULT_OPS: EventConfig[] = (() => { + const profiles = PROFILES; + const out: EventConfig[] = []; + out.push(...buildUsdcTransferConfigs(profiles)); + const m = buildModifyPositionConfig(profiles); + if (m) out.push(m); + const d = buildExtendedDepositConfig(profiles); + if (d) out.push(d); + return out; +})(); + +/** Exposed for admin / debugging: strategy ids and addresses from SDK. */ +export function getVesuExtendedIndexerProfiles(): VesuExtendedIndexerProfile[] { + return [...PROFILES]; +} diff --git a/package.json b/package.json index 2d107be..e99ddac 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,8 @@ "db:migrate": "drizzle-kit migrate", "db:push": "drizzle-kit push", "fetch-lst-prices": "tsx src/standalone-scripts/fetch-lst-price.ts", - "fetch-apy": "tsx src/standalone-scripts/fetch-apy.ts" + "fetch-apy": "tsx src/standalone-scripts/fetch-apy.ts", + "poll-extended-trades": "tsx src/standalone-scripts/poll-extended-trades.ts" }, "author": "akiraonstarknet", "license": "ISC", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7176033..2022cf8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,8 +30,8 @@ importers: specifier: 5.18.0 version: 5.18.0(prisma@5.18.0) '@strkfarm/sdk': - specifier: 2.0.0-staging.42 - version: 2.0.0-staging.42(@types/react@19.1.13)(axios@1.12.2)(moment@2.30.1)(qs@6.14.0)(react@19.1.0)(request@2.88.2)(starknet@8.5.4) + specifier: link:../sdk-ts + version: link:../sdk-ts apibara: specifier: 2.1.0-beta.40 version: 2.1.0-beta.40(@babel/runtime@7.28.4)(rollup@4.51.0)(typescript@5.9.2)(vitest@1.6.1(@types/node@24.5.2)) @@ -147,9 +147,6 @@ importers: packages: - '@adraffy/ens-normalize@1.10.1': - resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} - '@adraffy/ens-normalize@1.11.1': resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==} @@ -181,24 +178,6 @@ packages: peerDependencies: graphql: 14.x || 15.x || 16.x - '@apollo/client@3.11.8': - resolution: {integrity: sha512-CgG1wbtMjsV2pRGe/eYITmV5B8lXUCYljB2gB/6jWTFQcrvirUVvKg7qtFdjYkQSFbIffU1IDyxgeaN81eTjbA==} - peerDependencies: - graphql: ^15.0.0 || ^16.0.0 - graphql-ws: ^5.5.5 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 - subscriptions-transport-ws: ^0.9.0 || ^0.11.0 - peerDependenciesMeta: - graphql-ws: - optional: true - react: - optional: true - react-dom: - optional: true - subscriptions-transport-ws: - optional: true - '@apollo/protobufjs@1.2.7': resolution: {integrity: sha512-Lahx5zntHPZia35myYDBRuF58tlwPskwHc5CWBZC/4bMKB6siTBWwtMrkqXcsNwQiFSzSx5hKdRPUmemrEp3Gg==} hasBin: true @@ -279,15 +258,6 @@ packages: resolution: {integrity: sha512-YBDiuAX9i1lLc6GeTy1m7DGLFn/gMnvXqlalOIMjM7DeOgIacEjjfwPqb0M1CQ2v11HhR15d1NmxJoRCfrNqcA==} engines: {node: '>=14'} - '@avnu/avnu-sdk@3.0.2': - resolution: {integrity: sha512-N8McoXYEcp1uhSZ4XlEi5BcTpvJDDhUw4kYnlYmPrd7fWezfGy4UHyoFT/A4gqEM4nL3vtENczDNFS1AVfdTnA==} - engines: {node: '>=18'} - peerDependencies: - ethers: ^6.13.0 - moment: ^2.30.1 - qs: ^6.13.0 - starknet: ^6.11.0 - '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -375,16 +345,6 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@cypress/request-promise@5.0.0': - resolution: {integrity: sha512-eKdYVpa9cBEw2kTBlHeu1PP16Blwtum6QHg/u9s/MoHkZfuo1pRGka1VlUHXF5kdew82BvOJVVGk0x8X0nbp+w==} - engines: {node: '>=0.10.0'} - peerDependencies: - '@cypress/request': ^3.0.0 - - '@cypress/request@3.0.9': - resolution: {integrity: sha512-I3l7FdGRXluAS44/0NguwWlO83J18p0vlr2FYHrJkWdNYhgVoiYo61IXPqaOsL+vNxU1ZqMACzItGK3/KKDsdw==} - engines: {node: '>= 6'} - '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} @@ -400,9 +360,6 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@ericnordelo/strk-merkle-tree@1.0.0': - resolution: {integrity: sha512-iKY8uZ84W6pOzUrq09QHb+jRU7LcB8b/h2kpmX1gEVVsGrQI84xqTjVQCyU2Pzl7h8loc3SL835yMUKdoXWjrQ==} - '@esbuild-kit/core-utils@3.3.2': resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} deprecated: 'Merged into tsx: https://tsx.is' @@ -975,60 +932,6 @@ packages: resolution: {integrity: sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ethersproject/abi@5.8.0': - resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} - - '@ethersproject/abstract-provider@5.8.0': - resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} - - '@ethersproject/abstract-signer@5.8.0': - resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} - - '@ethersproject/address@5.8.0': - resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} - - '@ethersproject/base64@5.8.0': - resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} - - '@ethersproject/bignumber@5.8.0': - resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} - - '@ethersproject/bytes@5.8.0': - resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} - - '@ethersproject/constants@5.8.0': - resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} - - '@ethersproject/hash@5.8.0': - resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} - - '@ethersproject/keccak256@5.8.0': - resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} - - '@ethersproject/logger@5.8.0': - resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} - - '@ethersproject/networks@5.8.0': - resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} - - '@ethersproject/properties@5.8.0': - resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} - - '@ethersproject/rlp@5.8.0': - resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} - - '@ethersproject/signing-key@5.8.0': - resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} - - '@ethersproject/strings@5.8.0': - resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} - - '@ethersproject/transactions@5.8.0': - resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} - - '@ethersproject/web@5.8.0': - resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} - '@graphql-tools/merge@8.4.2': resolution: {integrity: sha512-XbrHAaj8yDuINph+sAfuq3QCZ/tKblrTLOpirK0+CAgNlZUCHs0Fa+xtMUURgwCVThLle1AF7svJCxFizygLsw==} peerDependencies: @@ -1094,66 +997,6 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - '@inquirer/checkbox@2.5.0': - resolution: {integrity: sha512-sMgdETOfi2dUHT8r7TT1BTKOwNvdDGFDXYWtQ2J69SvlYNntk9I/gJe7r5yvMwwsuKnYbuRs3pNhx4tgNck5aA==} - engines: {node: '>=18'} - - '@inquirer/confirm@3.2.0': - resolution: {integrity: sha512-oOIwPs0Dvq5220Z8lGL/6LHRTEr9TgLHmiI99Rj1PJ1p1czTys+olrgBqZk4E2qC0YTzeHprxSQmoHioVdJ7Lw==} - engines: {node: '>=18'} - - '@inquirer/core@9.2.1': - resolution: {integrity: sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==} - engines: {node: '>=18'} - - '@inquirer/editor@2.2.0': - resolution: {integrity: sha512-9KHOpJ+dIL5SZli8lJ6xdaYLPPzB8xB9GZItg39MBybzhxA16vxmszmQFrRwbOA918WA2rvu8xhDEg/p6LXKbw==} - engines: {node: '>=18'} - - '@inquirer/expand@2.3.0': - resolution: {integrity: sha512-qnJsUcOGCSG1e5DTOErmv2BPQqrtT6uzqn1vI/aYGiPKq+FgslGZmtdnXbhuI7IlT7OByDoEEqdnhUnVR2hhLw==} - engines: {node: '>=18'} - - '@inquirer/figures@1.0.13': - resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} - engines: {node: '>=18'} - - '@inquirer/input@2.3.0': - resolution: {integrity: sha512-XfnpCStx2xgh1LIRqPXrTNEEByqQWoxsWYzNRSEUxJ5c6EQlhMogJ3vHKu8aXuTacebtaZzMAHwEL0kAflKOBw==} - engines: {node: '>=18'} - - '@inquirer/number@1.1.0': - resolution: {integrity: sha512-ilUnia/GZUtfSZy3YEErXLJ2Sljo/mf9fiKc08n18DdwdmDbOzRcTv65H1jjDvlsAuvdFXf4Sa/aL7iw/NanVA==} - engines: {node: '>=18'} - - '@inquirer/password@2.2.0': - resolution: {integrity: sha512-5otqIpgsPYIshqhgtEwSspBQE40etouR8VIxzpJkv9i0dVHIpyhiivbkH9/dGiMLdyamT54YRdGJLfl8TFnLHg==} - engines: {node: '>=18'} - - '@inquirer/prompts@5.5.0': - resolution: {integrity: sha512-BHDeL0catgHdcHbSFFUddNzvx/imzJMft+tWDPwTm3hfu8/tApk1HrooNngB2Mb4qY+KaRWF+iZqoVUPeslEog==} - engines: {node: '>=18'} - - '@inquirer/rawlist@2.3.0': - resolution: {integrity: sha512-zzfNuINhFF7OLAtGHfhwOW2TlYJyli7lOUoJUXw/uyklcwalV6WRXBXtFIicN8rTRK1XTiPWB4UY+YuW8dsnLQ==} - engines: {node: '>=18'} - - '@inquirer/search@1.1.0': - resolution: {integrity: sha512-h+/5LSj51dx7hp5xOn4QFnUaKeARwUCLs6mIhtkJ0JYPBLmEYjdHSYh7I6GrLg9LwpJ3xeX0FZgAG1q0QdCpVQ==} - engines: {node: '>=18'} - - '@inquirer/select@2.5.0': - resolution: {integrity: sha512-YmDobTItPP3WcEI86GvPo+T2sRHkxxOq/kXmsBjHS5BVXUgvgZ5AfJjkvQvZr03T81NnI3KrrRuMzeuYUQRFOA==} - engines: {node: '>=18'} - - '@inquirer/type@1.5.5': - resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} - engines: {node: '>=18'} - - '@inquirer/type@2.0.0': - resolution: {integrity: sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==} - engines: {node: '>=18'} - '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1301,9 +1144,6 @@ packages: resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@1.2.0': - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - '@noble/curves@1.7.0': resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} engines: {node: ^14.21.3 || >=16} @@ -1316,14 +1156,6 @@ packages: resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} engines: {node: ^14.21.3 || >=16} - '@noble/curves@2.0.1': - resolution: {integrity: sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw==} - engines: {node: '>= 20.19.0'} - - '@noble/hashes@1.3.2': - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} - '@noble/hashes@1.6.0': resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==} engines: {node: ^14.21.3 || >=16} @@ -1332,10 +1164,6 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} - '@noble/hashes@2.0.1': - resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} - engines: {node: '>= 20.19.0'} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1443,35 +1271,6 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@redis/bloom@1.2.0': - resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} - peerDependencies: - '@redis/client': ^1.0.0 - - '@redis/client@1.6.1': - resolution: {integrity: sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==} - engines: {node: '>=14'} - - '@redis/graph@1.1.1': - resolution: {integrity: sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==} - peerDependencies: - '@redis/client': ^1.0.0 - - '@redis/json@1.0.7': - resolution: {integrity: sha512-6UyXfjVaTBTJtKNG4/9Z8PSpKE6XgSyEb8iwaqDcy+uKrd/DGYHTWkUdnQDyzm727V7p21WUMhsqz5oy65kPcQ==} - peerDependencies: - '@redis/client': ^1.0.0 - - '@redis/search@1.2.0': - resolution: {integrity: sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==} - peerDependencies: - '@redis/client': ^1.0.0 - - '@redis/time-series@1.1.0': - resolution: {integrity: sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==} - peerDependencies: - '@redis/client': ^1.0.0 - '@repeaterjs/repeater@3.0.6': resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} @@ -1667,9 +1466,6 @@ packages: cpu: [x64] os: [win32] - '@scure/base@1.2.1': - resolution: {integrity: sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==} - '@scure/base@1.2.6': resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} @@ -1685,31 +1481,15 @@ packages: '@scure/starknet@1.1.2': resolution: {integrity: sha512-Qo2uNQJC/1IwfXC0f2BnDjtXnY1cVyfmK1WcGNFzfnktvlNmmmbjYeUNdYe3DBiDYyMzp1MhRUFllFW5moBaMg==} - '@scure/starknet@2.0.0': - resolution: {integrity: sha512-uDGDGleYeqsYQTpPU2IZdO7WeCeYO2sORIJdLnjX/vuENxnu8WRhabFKHjoQGQf0sPuMRD5nKyQBxKWy45W5cg==} - engines: {node: '>= 20.19.0'} - '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@starknet-io/types-js@0.7.10': - resolution: {integrity: sha512-1VtCqX4AHWJlRRSYGSn+4X1mqolI1Tdq62IwzoU2vUuEE72S1OlEeGhpvd6XsdqXcfHmVzYfj8k1XtKBQqwo9w==} - '@starknet-io/types-js@0.8.4': resolution: {integrity: sha512-0RZ3TZHcLsUTQaq1JhDSCM8chnzO4/XNsSCozwDET64JK5bjFDIf2ZUkta+tl5Nlbf4usoU7uZiDI/Q57kt2SQ==} '@starknet-io/types-js@0.9.2': resolution: {integrity: sha512-vWOc0FVSn+RmabozIEWcEny1I73nDGTvOrLYJsR1x7LGA3AZmqt4i/aW69o/3i2NN5CVP8Ok6G1ayRQJKye3Wg==} - '@strkfarm/sdk@2.0.0-staging.42': - resolution: {integrity: sha512-9s55uoJXumVIn5NHbya+7RU1Duxxg5/RbYyEqYs7wD8/QR3MtMrYvHM2/tCeqZKspJO77Mx89upghqgozejm+g==} - hasBin: true - peerDependencies: - '@types/react': ^19.1.2 - axios: ^1.7.2 - react: 19.1.2 - starknet: 9.2.1 - '@ts-morph/common@0.24.0': resolution: {integrity: sha512-c1xMmNHWpNselmpIqursHeOHHBTIsJLbB+NuovbTTRCNiTLEr/U9dbJ8qy0jd/O2x5pc3seWuOUN5R2IoOTp8A==} @@ -1764,18 +1544,9 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/mute-stream@0.0.4': - resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} - '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - '@types/node@22.18.6': - resolution: {integrity: sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==} - - '@types/node@22.7.5': - resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} - '@types/node@24.5.2': resolution: {integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==} @@ -1788,9 +1559,6 @@ packages: '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react@19.1.13': - resolution: {integrity: sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==} - '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -1806,9 +1574,6 @@ packages: '@types/triple-beam@1.3.5': resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - '@types/wrap-ansi@3.0.0': - resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} - '@typescript-eslint/eslint-plugin@7.6.0': resolution: {integrity: sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==} engines: {node: ^18.18.0 || >=20.0.0} @@ -1891,22 +1656,6 @@ packages: resolution: {integrity: sha512-ApcWxkrs1WmEMS2CaLLFUEem/49erT3sxIVjpzU5f6zmVcnijtDSrhoK2zVobOIikZJdH63jdAXOrvjf6eOUNQ==} engines: {node: '>=18.0.0'} - '@wry/caches@1.0.1': - resolution: {integrity: sha512-bXuaUNLVVkD20wcGBWRyo7j9N3TxePEWFZj2Y+r9OoUzfqmavM84+mFykRicNsBqatba5JLay1t48wxaXaWnlA==} - engines: {node: '>=8'} - - '@wry/context@0.7.4': - resolution: {integrity: sha512-jmT7Sb4ZQWI5iyu3lobQxICu2nC/vbUhP0vIdd6tHC9PTfenmRmuIFqktc6GH9cgi+ZHnsLWPvfSvc4DrYmKiQ==} - engines: {node: '>=8'} - - '@wry/equality@0.5.7': - resolution: {integrity: sha512-BRFORjsTuQv5gxcXsuDXx6oGRhuVsEGwZy6LOzRRfgu+eSfxbhUQ9L9YtSEIuIjY/o7g3iWFjrc5eSY1GXP2Dw==} - engines: {node: '>=8'} - - '@wry/trie@0.5.0': - resolution: {integrity: sha512-FNoYzHawTMk/6KMQoEG5O4PuioX19UbwdQKF44yw0nLfOypfQdjtfZzo/UIJWAJ23sNIFbD1Ug9lbaDGMwbqQA==} - engines: {node: '>=8'} - JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -1959,9 +1708,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - aes-js@4.0.0-beta.5: - resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} - ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -1976,10 +1722,6 @@ packages: ajv@8.10.0: resolution: {integrity: sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2042,10 +1784,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findindex@2.2.4: - resolution: {integrity: sha512-LLm4mhxa9v8j0A/RPnpQAP4svXToJFh+Hp1pNYl5ZD5qpB4zdx/D4YjpVcETkhFbUKWO3iGMVLvrOnnmkAJT6A==} - engines: {node: '>= 0.4'} - array.prototype.flat@1.3.3: resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} @@ -2061,13 +1799,6 @@ packages: asn1.js@4.10.1: resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - - assert-plus@1.0.0: - resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} - engines: {node: '>=0.8'} - assert@1.5.1: resolution: {integrity: sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==} @@ -2101,19 +1832,10 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - aws-sign2@0.7.0: - resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - - aws4@1.13.2: - resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} - axe-core@4.10.3: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} - axios@1.12.2: - resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} - axobject-query@2.2.0: resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==} @@ -2127,12 +1849,6 @@ packages: resolution: {integrity: sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==} hasBin: true - bcrypt-pbkdf@1.0.2: - resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} - - bignumber.js@4.0.4: - resolution: {integrity: sha512-LDXpJKVzEx2/OqNbG9mXBNvHuiRL4PzHCGfnANHMJ+fv68Ads3exDVJeGDJws+AoNEuca93bU3q+S0woeUaCdg==} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -2140,12 +1856,6 @@ packages: bintrees@1.0.2: resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} - bl@1.2.3: - resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} - - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - bn.js@4.12.2: resolution: {integrity: sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==} @@ -2169,9 +1879,6 @@ packages: brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - browser-assert@1.2.1: - resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==} - browser-pack@6.1.0: resolution: {integrity: sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==} hasBin: true @@ -2275,9 +1982,6 @@ packages: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} hasBin: true - caseless@0.12.0: - resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - chai@4.5.0: resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} engines: {node: '>=4'} @@ -2286,9 +1990,6 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} @@ -2311,18 +2012,10 @@ packages: citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.0'} - code-block-writer@13.0.3: resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} @@ -2355,10 +2048,6 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -2413,9 +2102,6 @@ packages: core-js-pure@3.45.1: resolution: {integrity: sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ==} - core-util-is@1.0.2: - resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -2446,19 +2132,12 @@ packages: resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==} engines: {node: '>= 0.10'} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dash-ast@1.0.0: resolution: {integrity: sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==} - dashdash@1.14.1: - resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} - engines: {node: '>=0.10'} - data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -2675,9 +2354,6 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ecc-jsbn@0.1.2: - resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -2700,9 +2376,6 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2710,9 +2383,6 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - es-abstract@1.24.0: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} @@ -2912,13 +2582,6 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - ethers@6.15.0: - resolution: {integrity: sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==} - engines: {node: '>=14.0.0'} - - eventemitter3@3.1.2: - resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==} - eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -2937,17 +2600,6 @@ packages: resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - - extsprintf@1.3.0: - resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} - engines: {'0': node >=0.6.0} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2970,17 +2622,10 @@ packages: fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} - fetch-cookie@3.0.1: - resolution: {integrity: sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q==} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - file-type@3.9.0: - resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==} - engines: {node: '>=0.10.0'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -3003,15 +2648,6 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -3020,13 +2656,6 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - forever-agent@0.6.1: - resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - - form-data@2.3.3: - resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} - engines: {node: '>= 0.12'} - form-data@4.0.4: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} @@ -3078,10 +2707,6 @@ packages: engines: {node: '>= 18.0.0'} hasBin: true - generic-pool@3.9.0: - resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} - engines: {node: '>= 4'} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -3115,9 +2740,6 @@ packages: get-tsconfig@4.10.1: resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} - getpass@0.1.7: - resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} - giget@1.2.5: resolution: {integrity: sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==} hasBin: true @@ -3174,25 +2796,10 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - graphql-tag@2.12.6: - resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} - engines: {node: '>=10'} - peerDependencies: - graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - graphql@16.9.0: resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - har-schema@2.0.0: - resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} - engines: {node: '>=4'} - - har-validator@5.1.5: - resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} - engines: {node: '>=6'} - deprecated: this library is no longer supported - has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -3237,9 +2844,6 @@ packages: hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} @@ -3251,14 +2855,6 @@ packages: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} - http-signature@1.2.0: - resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} - engines: {node: '>=0.8', npm: '>=1.3.7'} - - http-signature@1.4.0: - resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==} - engines: {node: '>=0.10'} - https-browserify@1.0.0: resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==} @@ -3298,10 +2894,6 @@ packages: inline-source-map@0.6.3: resolution: {integrity: sha512-1aVsPEsJWMJq/pdMU61CDlm1URcW702MTB4w9/zUjMus6H/Py8o7g68Pr9D4I6QluWGt/KdmswuRhaA05xVR1w==} - inquirer@10.2.2: - resolution: {integrity: sha512-tyao/4Vo36XnUItZ7DnUXX4f1jVao2mSrleV/5IPtW/XAEA26hRVsbc68nuTEKWcr5vMP/1mVoT2O7u8H4v1Vg==} - engines: {node: '>=18'} - insert-module-globals@7.2.1: resolution: {integrity: sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==} hasBin: true @@ -3438,9 +3030,6 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} @@ -3469,17 +3058,11 @@ packages: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} - isomorphic-fetch@3.0.0: - resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==} - isows@1.0.7: resolution: {integrity: sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg==} peerDependencies: ws: '*' - isstream@0.1.2: - resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -3491,9 +3074,6 @@ packages: resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true - js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3504,9 +3084,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsbn@0.1.1: - resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -3521,15 +3098,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-schema@0.4.0: - resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -3546,14 +3117,6 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} - jsprim@1.4.2: - resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} - engines: {node: '>=0.6.0'} - - jsprim@2.0.2: - resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} - engines: {'0': node >=0.6.0} - jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -3616,9 +3179,6 @@ packages: lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - logform@2.7.0: resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} engines: {node: '>= 12.0.0'} @@ -3762,19 +3322,12 @@ packages: engines: {node: '>= 0.8.0'} hasBin: true - moment@2.30.1: - resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} - ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -3821,10 +3374,6 @@ packages: node-releases@2.0.21: resolution: {integrity: sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==} - node-telegram-bot-api@0.66.0: - resolution: {integrity: sha512-s4Hrg5q+VPl4/tJVG++pImxF6eb8tNJNj4KnDqAOKL6zGU34lo9RXmyAN158njwGN+v8hdNf8s9fWIYW9hPb5A==} - engines: {node: '>=0.12'} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -3838,9 +3387,6 @@ packages: engines: {node: ^14.16.0 || >=16.10.0} hasBin: true - oauth-sign@0.9.0: - resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -3890,9 +3436,6 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - optimism@0.18.1: - resolution: {integrity: sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ==} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -3900,10 +3443,6 @@ packages: os-browserify@0.3.0: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -4021,9 +3560,6 @@ packages: perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - performance-now@2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - pg-cloudflare@1.2.7: resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} @@ -4155,18 +3691,12 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} public-encrypt@4.0.3: resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} - pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -4190,10 +3720,6 @@ packages: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} - qs@6.5.3: - resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} - engines: {node: '>=0.6'} - querystring-es3@0.2.1: resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==} engines: {node: '>=0.4.x'} @@ -4227,10 +3753,6 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} - engines: {node: '>=0.10.0'} - read-only-stream@2.0.0: resolution: {integrity: sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==} @@ -4248,9 +3770,6 @@ packages: redeyed@2.1.1: resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} - redis@4.7.1: - resolution: {integrity: sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ==} - reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} @@ -4262,28 +3781,6 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - rehackt@0.1.0: - resolution: {integrity: sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==} - peerDependencies: - '@types/react': '*' - react: '*' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - - request-promise-core@1.1.3: - resolution: {integrity: sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==} - engines: {node: '>=0.10.0'} - peerDependencies: - request: ^2.34 - - request@2.88.2: - resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} - engines: {node: '>= 6'} - deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -4311,10 +3808,6 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true - response-iterator@0.2.25: - resolution: {integrity: sha512-15K4tT8X35W0zJ5bv3fAf4eEKqOwS7yzd+Bg6YEE9NLltVbPbuTcYo3J2AP6AMQGMJmJkFCG421+kP2/iCBfDA==} - engines: {node: '>=0.8'} - retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -4343,10 +3836,6 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -4398,9 +3887,6 @@ packages: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} - set-cookie-parser@2.7.1: - resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} - set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -4484,10 +3970,6 @@ packages: source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - source-map@0.5.6: - resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} - engines: {node: '>=0.10.0'} - source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} @@ -4500,32 +3982,12 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - sshpk@1.18.0: - resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} - engines: {node: '>=0.10.0'} - hasBin: true - - stack-generator@2.0.10: - resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} - stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - - stacktrace-gps@3.1.2: - resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} - - stacktrace-js@2.0.2: - resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} - - starknet@6.24.1: - resolution: {integrity: sha512-g7tiCt73berhcNi41otlN3T3kxZnIvZhMi8WdC21Y6GC6zoQgbI2z1t7JAZF9c4xZiomlanwVnurcpyfEdyMpg==} - starknet@8.5.4: resolution: {integrity: sha512-nlD6C+98lxRdSPX9jT+Z+/Hw8o5IhBMCY2gauWjnvU/fd4Y9kWxfgIo2mRGCW1oq9aeQAJasoebbmXlKBhcOPA==} engines: {node: '>=22'} @@ -4537,10 +3999,6 @@ packages: std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} - stealthy-require@1.1.1: - resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} - engines: {node: '>=0.10.0'} - stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -4634,10 +4092,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - symbol-observable@4.0.0: - resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} - engines: {node: '>=0.10'} - syntax-error@1.4.0: resolution: {integrity: sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==} @@ -4689,17 +4143,6 @@ packages: resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} - tldts-core@6.1.86: - resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} - - tldts@6.1.86: - resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} - hasBin: true - - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - to-buffer@1.2.1: resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} engines: {node: '>= 0.4'} @@ -4716,18 +4159,10 @@ packages: resolution: {integrity: sha512-sMpZVcmFf6EYFHFFl+SYH4W1/OnXBYMGDsv2IlbQ2caHyFElW/UR/gpj/KYU1JwmP4dE9xqwv2+vWcmlXHojSw==} engines: {node: '>=6'} - tough-cookie@2.5.0: - resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} - engines: {node: '>=0.8'} - tough-cookie@4.1.4: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} - tough-cookie@5.1.2: - resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} - engines: {node: '>=16'} - tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -4747,10 +4182,6 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-invariant@0.10.3: - resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} - engines: {node: '>=8'} - ts-mixer@6.0.4: resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} @@ -4790,9 +4221,6 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -4804,12 +4232,6 @@ packages: tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - - tweetnacl@0.14.5: - resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -4818,10 +4240,6 @@ packages: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - type-graphql@2.0.0-rc.2: resolution: {integrity: sha512-DJ8erG1cmjteMrOhFIkBHOqRM+L+wCJxvNjbbj1Y+q2r4HZkB1qOSS4ZD4AaoAfRPAp1yU23gMtmzf0jen/FFA==} engines: {node: '>= 18.12.0'} @@ -4903,12 +4321,6 @@ packages: resolution: {integrity: sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==} hasBin: true - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.12.0: resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} @@ -4964,15 +4376,6 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@3.4.0: - resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} - deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true @@ -4999,10 +4402,6 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - verror@1.10.0: - resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - viem@2.37.6: resolution: {integrity: sha512-b+1IozQ8TciVQNdQUkOH5xtFR0z7ZxR8pyloENi/a+RA408lv4LoX12ofwoiT3ip0VRhO5ni1em//X0jn/eW0g==} peerDependencies: @@ -5081,9 +4480,6 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - whatwg-fetch@3.6.20: - resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} - whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} @@ -5137,10 +4533,6 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -5163,18 +4555,6 @@ packages: utf-8-validate: optional: true - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -5226,20 +4606,8 @@ packages: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} - yoctocolors-cjs@2.1.3: - resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} - engines: {node: '>=18'} - - zen-observable-ts@1.2.5: - resolution: {integrity: sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==} - - zen-observable@0.8.15: - resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} - snapshots: - '@adraffy/ens-normalize@1.10.1': {} - '@adraffy/ens-normalize@1.11.1': {} '@apibara/indexer@2.1.0-beta.40(typescript@5.9.2)(vitest@1.6.1(@types/node@24.5.2))': @@ -5306,28 +4674,6 @@ snapshots: dependencies: graphql: 16.9.0 - '@apollo/client@3.11.8(@types/react@19.1.13)(graphql@16.9.0)(react@19.1.0)': - dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) - '@wry/caches': 1.0.1 - '@wry/equality': 0.5.7 - '@wry/trie': 0.5.0 - graphql: 16.9.0 - graphql-tag: 2.12.6(graphql@16.9.0) - hoist-non-react-statics: 3.3.2 - optimism: 0.18.1 - prop-types: 15.8.1 - rehackt: 0.1.0(@types/react@19.1.13)(react@19.1.0) - response-iterator: 0.2.25 - symbol-observable: 4.0.0 - ts-invariant: 0.10.3 - tslib: 2.6.3 - zen-observable-ts: 1.2.5 - optionalDependencies: - react: 19.1.0 - transitivePeerDependencies: - - '@types/react' - '@apollo/protobufjs@1.2.7': dependencies: '@protobufjs/aspromise': 1.1.2 @@ -5435,13 +4781,6 @@ snapshots: '@apollo/utils.withrequired@2.0.1': {} - '@avnu/avnu-sdk@3.0.2(ethers@6.15.0)(moment@2.30.1)(qs@6.14.0)(starknet@8.5.4)': - dependencies: - ethers: 6.15.0 - moment: 2.30.1 - qs: 6.14.0 - starknet: 8.5.4 - '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -5556,37 +4895,6 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@cypress/request-promise@5.0.0(@cypress/request@3.0.9)(request@2.88.2)': - dependencies: - '@cypress/request': 3.0.9 - bluebird: 3.7.2 - request-promise-core: 1.1.3(request@2.88.2) - stealthy-require: 1.1.1 - tough-cookie: 4.1.4 - transitivePeerDependencies: - - request - - '@cypress/request@3.0.9': - dependencies: - aws-sign2: 0.7.0 - aws4: 1.13.2 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 4.0.4 - http-signature: 1.4.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - performance-now: 2.1.0 - qs: 6.14.0 - safe-buffer: 5.2.1 - tough-cookie: 5.1.2 - tunnel-agent: 0.6.0 - uuid: 8.3.2 - '@dabh/diagnostics@2.0.3': dependencies: colorspace: 1.1.4 @@ -5611,16 +4919,6 @@ snapshots: tslib: 2.6.3 optional: true - '@ericnordelo/strk-merkle-tree@1.0.0': - dependencies: - '@ethersproject/abi': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - starknet: 6.24.1 - transitivePeerDependencies: - - encoding - '@esbuild-kit/core-utils@3.3.2': dependencies: esbuild: 0.18.20 @@ -5927,129 +5225,6 @@ snapshots: '@eslint/js@9.0.0': {} - '@ethersproject/abi@5.8.0': - dependencies: - '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/hash': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 - - '@ethersproject/abstract-provider@5.8.0': - dependencies: - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/networks': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/transactions': 5.8.0 - '@ethersproject/web': 5.8.0 - - '@ethersproject/abstract-signer@5.8.0': - dependencies: - '@ethersproject/abstract-provider': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - - '@ethersproject/address@5.8.0': - dependencies: - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/rlp': 5.8.0 - - '@ethersproject/base64@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - - '@ethersproject/bignumber@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - bn.js: 5.2.2 - - '@ethersproject/bytes@5.8.0': - dependencies: - '@ethersproject/logger': 5.8.0 - - '@ethersproject/constants@5.8.0': - dependencies: - '@ethersproject/bignumber': 5.8.0 - - '@ethersproject/hash@5.8.0': - dependencies: - '@ethersproject/abstract-signer': 5.8.0 - '@ethersproject/address': 5.8.0 - '@ethersproject/base64': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 - - '@ethersproject/keccak256@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - js-sha3: 0.8.0 - - '@ethersproject/logger@5.8.0': {} - - '@ethersproject/networks@5.8.0': - dependencies: - '@ethersproject/logger': 5.8.0 - - '@ethersproject/properties@5.8.0': - dependencies: - '@ethersproject/logger': 5.8.0 - - '@ethersproject/rlp@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - - '@ethersproject/signing-key@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - bn.js: 5.2.2 - elliptic: 6.6.1 - hash.js: 1.1.7 - - '@ethersproject/strings@5.8.0': - dependencies: - '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/logger': 5.8.0 - - '@ethersproject/transactions@5.8.0': - dependencies: - '@ethersproject/address': 5.8.0 - '@ethersproject/bignumber': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/constants': 5.8.0 - '@ethersproject/keccak256': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/rlp': 5.8.0 - '@ethersproject/signing-key': 5.8.0 - - '@ethersproject/web@5.8.0': - dependencies: - '@ethersproject/base64': 5.8.0 - '@ethersproject/bytes': 5.8.0 - '@ethersproject/logger': 5.8.0 - '@ethersproject/properties': 5.8.0 - '@ethersproject/strings': 5.8.0 - '@graphql-tools/merge@8.4.2(graphql@16.9.0)': dependencies: '@graphql-tools/utils': 9.2.1(graphql@16.9.0) @@ -6121,106 +5296,6 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@inquirer/checkbox@2.5.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/figures': 1.0.13 - '@inquirer/type': 1.5.5 - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.3 - - '@inquirer/confirm@3.2.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - - '@inquirer/core@9.2.1': - dependencies: - '@inquirer/figures': 1.0.13 - '@inquirer/type': 2.0.0 - '@types/mute-stream': 0.0.4 - '@types/node': 22.18.6 - '@types/wrap-ansi': 3.0.0 - ansi-escapes: 4.3.2 - cli-width: 4.1.0 - mute-stream: 1.0.0 - signal-exit: 4.1.0 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.3 - - '@inquirer/editor@2.2.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - external-editor: 3.1.0 - - '@inquirer/expand@2.3.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - yoctocolors-cjs: 2.1.3 - - '@inquirer/figures@1.0.13': {} - - '@inquirer/input@2.3.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - - '@inquirer/number@1.1.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - - '@inquirer/password@2.2.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - ansi-escapes: 4.3.2 - - '@inquirer/prompts@5.5.0': - dependencies: - '@inquirer/checkbox': 2.5.0 - '@inquirer/confirm': 3.2.0 - '@inquirer/editor': 2.2.0 - '@inquirer/expand': 2.3.0 - '@inquirer/input': 2.3.0 - '@inquirer/number': 1.1.0 - '@inquirer/password': 2.2.0 - '@inquirer/rawlist': 2.3.0 - '@inquirer/search': 1.1.0 - '@inquirer/select': 2.5.0 - - '@inquirer/rawlist@2.3.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/type': 1.5.5 - yoctocolors-cjs: 2.1.3 - - '@inquirer/search@1.1.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/figures': 1.0.13 - '@inquirer/type': 1.5.5 - yoctocolors-cjs: 2.1.3 - - '@inquirer/select@2.5.0': - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/figures': 1.0.13 - '@inquirer/type': 1.5.5 - ansi-escapes: 4.3.2 - yoctocolors-cjs: 2.1.3 - - '@inquirer/type@1.5.5': - dependencies: - mute-stream: 1.0.0 - - '@inquirer/type@2.0.0': - dependencies: - mute-stream: 1.0.0 - '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -6332,10 +5407,6 @@ snapshots: '@noble/ciphers@1.3.0': {} - '@noble/curves@1.2.0': - dependencies: - '@noble/hashes': 1.3.2 - '@noble/curves@1.7.0': dependencies: '@noble/hashes': 1.6.0 @@ -6348,18 +5419,10 @@ snapshots: dependencies: '@noble/hashes': 1.8.0 - '@noble/curves@2.0.1': - dependencies: - '@noble/hashes': 2.0.1 - - '@noble/hashes@1.3.2': {} - '@noble/hashes@1.6.0': {} '@noble/hashes@1.8.0': {} - '@noble/hashes@2.0.1': {} - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6473,32 +5536,6 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@redis/bloom@1.2.0(@redis/client@1.6.1)': - dependencies: - '@redis/client': 1.6.1 - - '@redis/client@1.6.1': - dependencies: - cluster-key-slot: 1.1.2 - generic-pool: 3.9.0 - yallist: 4.0.0 - - '@redis/graph@1.1.1(@redis/client@1.6.1)': - dependencies: - '@redis/client': 1.6.1 - - '@redis/json@1.0.7(@redis/client@1.6.1)': - dependencies: - '@redis/client': 1.6.1 - - '@redis/search@1.2.0(@redis/client@1.6.1)': - dependencies: - '@redis/client': 1.6.1 - - '@redis/time-series@1.1.0(@redis/client@1.6.1)': - dependencies: - '@redis/client': 1.6.1 - '@repeaterjs/repeater@3.0.6': {} '@rolldown/binding-darwin-arm64@1.0.0-beta.3': @@ -6621,8 +5658,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.51.0': optional: true - '@scure/base@1.2.1': {} - '@scure/base@1.2.6': {} '@scure/bip32@1.7.0': @@ -6646,55 +5681,12 @@ snapshots: '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 - '@scure/starknet@2.0.0': - dependencies: - '@noble/curves': 2.0.1 - '@noble/hashes': 2.0.1 - '@sinclair/typebox@0.27.8': {} - '@starknet-io/types-js@0.7.10': {} - '@starknet-io/types-js@0.8.4': {} '@starknet-io/types-js@0.9.2': {} - '@strkfarm/sdk@2.0.0-staging.42(@types/react@19.1.13)(axios@1.12.2)(moment@2.30.1)(qs@6.14.0)(react@19.1.0)(request@2.88.2)(starknet@8.5.4)': - dependencies: - '@apollo/client': 3.11.8(@types/react@19.1.13)(graphql@16.9.0)(react@19.1.0) - '@avnu/avnu-sdk': 3.0.2(ethers@6.15.0)(moment@2.30.1)(qs@6.14.0)(starknet@8.5.4) - '@ericnordelo/strk-merkle-tree': 1.0.0 - '@noble/curves': 1.9.7 - '@noble/hashes': 2.0.1 - '@scure/starknet': 2.0.0 - '@types/react': 19.1.13 - axios: 1.12.2 - bignumber.js: 4.0.4 - browser-assert: 1.2.1 - chalk: 4.1.2 - commander: 12.1.0 - ethers: 6.15.0 - graphql: 16.9.0 - inquirer: 10.2.2 - node-telegram-bot-api: 0.66.0(request@2.88.2) - proxy-from-env: 1.1.0 - react: 19.1.0 - redis: 4.7.1 - stacktrace-js: 2.0.2 - starknet: 8.5.4 - winston: 3.17.0 - transitivePeerDependencies: - - bufferutil - - encoding - - graphql-ws - - moment - - qs - - react-dom - - request - - subscriptions-transport-ws - - supports-color - - utf-8-validate - '@ts-morph/common@0.24.0': dependencies: fast-glob: 3.3.3 @@ -6760,23 +5752,11 @@ snapshots: '@types/mime@1.3.5': {} - '@types/mute-stream@0.0.4': - dependencies: - '@types/node': 24.5.2 - '@types/node-fetch@2.6.13': dependencies: '@types/node': 24.5.2 form-data: 4.0.4 - '@types/node@22.18.6': - dependencies: - undici-types: 6.21.0 - - '@types/node@22.7.5': - dependencies: - undici-types: 6.19.8 - '@types/node@24.5.2': dependencies: undici-types: 7.12.0 @@ -6791,10 +5771,6 @@ snapshots: '@types/range-parser@1.2.7': {} - '@types/react@19.1.13': - dependencies: - csstype: 3.1.3 - '@types/semver@7.7.1': {} '@types/send@0.17.5': @@ -6812,8 +5788,6 @@ snapshots: '@types/triple-beam@1.3.5': {} - '@types/wrap-ansi@3.0.0': {} - '@typescript-eslint/eslint-plugin@7.6.0(@typescript-eslint/parser@7.6.0(eslint@9.0.0)(typescript@5.9.2))(eslint@9.0.0)(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -6937,22 +5911,6 @@ snapshots: dependencies: tslib: 2.6.3 - '@wry/caches@1.0.1': - dependencies: - tslib: 2.6.3 - - '@wry/context@0.7.4': - dependencies: - tslib: 2.6.3 - - '@wry/equality@0.5.7': - dependencies: - tslib: 2.6.3 - - '@wry/trie@0.5.0': - dependencies: - tslib: 2.6.3 - JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -6996,8 +5954,6 @@ snapshots: acorn@8.15.0: {} - aes-js@4.0.0-beta.5: {} - ajv-formats@2.1.1(ajv@8.10.0): optionalDependencies: ajv: 8.10.0 @@ -7016,10 +5972,6 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -7109,15 +6061,6 @@ snapshots: array-union@2.1.0: {} - array.prototype.findindex@2.2.4: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-abstract: 1.24.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.1.0 - array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 @@ -7148,12 +6091,6 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - - assert-plus@1.0.0: {} - assert@1.5.1: dependencies: object.assign: 4.1.7 @@ -7181,20 +6118,8 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - aws-sign2@0.7.0: {} - - aws4@1.13.2: {} - axe-core@4.10.3: {} - axios@1.12.2: - dependencies: - follow-redirects: 1.15.11 - form-data: 4.0.4 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - axobject-query@2.2.0: {} balanced-match@1.0.2: {} @@ -7203,23 +6128,10 @@ snapshots: baseline-browser-mapping@2.8.6: {} - bcrypt-pbkdf@1.0.2: - dependencies: - tweetnacl: 0.14.5 - - bignumber.js@4.0.4: {} - binary-extensions@2.3.0: {} bintrees@1.0.2: {} - bl@1.2.3: - dependencies: - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - - bluebird@3.7.2: {} - bn.js@4.12.2: {} bn.js@5.2.2: {} @@ -7256,8 +6168,6 @@ snapshots: brorand@1.1.0: {} - browser-assert@1.2.1: {} - browser-pack@6.1.0: dependencies: JSONStream: 1.3.5 @@ -7444,8 +6354,6 @@ snapshots: ansicolors: 0.3.2 redeyed: 2.1.1 - caseless@0.12.0: {} - chai@4.5.0: dependencies: assertion-error: 1.1.0 @@ -7461,8 +6369,6 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chardet@0.7.0: {} - check-error@1.0.3: dependencies: get-func-name: 2.0.2 @@ -7492,16 +6398,12 @@ snapshots: dependencies: consola: 3.4.2 - cli-width@4.1.0: {} - cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - cluster-key-slot@1.1.2: {} - code-block-writer@13.0.3: {} color-convert@1.9.3: @@ -7542,8 +6444,6 @@ snapshots: dependencies: delayed-stream: 1.0.0 - commander@12.1.0: {} - commander@4.1.1: {} concat-map@0.0.1: {} @@ -7583,8 +6483,6 @@ snapshots: core-js-pure@3.45.1: {} - core-util-is@1.0.2: {} - core-util-is@1.0.3: {} cors@2.8.5: @@ -7644,16 +6542,10 @@ snapshots: randombytes: 2.1.0 randomfill: 1.0.4 - csstype@3.1.3: {} - damerau-levenshtein@1.0.8: {} dash-ast@1.0.0: {} - dashdash@1.14.1: - dependencies: - assert-plus: 1.0.0 - data-view-buffer@1.0.2: dependencies: call-bound: 1.0.4 @@ -7789,11 +6681,6 @@ snapshots: eastasianwidth@0.2.0: {} - ecc-jsbn@0.1.2: - dependencies: - jsbn: 0.1.1 - safer-buffer: 2.1.2 - ee-first@1.1.1: {} electron-to-chromium@1.5.222: {} @@ -7816,20 +6703,12 @@ snapshots: encodeurl@1.0.2: {} - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - env-paths@3.0.0: {} error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 - error-stack-parser@2.1.4: - dependencies: - stackframe: 1.3.4 - es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 @@ -8212,21 +7091,6 @@ snapshots: etag@1.8.1: {} - ethers@6.15.0: - dependencies: - '@adraffy/ens-normalize': 1.10.1 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@types/node': 22.7.5 - aes-js: 4.0.0-beta.5 - tslib: 2.7.0 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - eventemitter3@3.1.2: {} - eventemitter3@5.0.1: {} events@3.3.0: {} @@ -8284,16 +7148,6 @@ snapshots: transitivePeerDependencies: - supports-color - extend@3.0.2: {} - - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - extsprintf@1.3.0: {} - fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -8316,17 +7170,10 @@ snapshots: fecha@4.2.3: {} - fetch-cookie@3.0.1: - dependencies: - set-cookie-parser: 2.7.1 - tough-cookie: 4.1.4 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - file-type@3.9.0: {} - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -8357,8 +7204,6 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.15.11: {} - for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -8368,14 +7213,6 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - forever-agent@0.6.1: {} - - form-data@2.3.3: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - form-data@4.0.4: dependencies: asynckit: 0.4.0 @@ -8439,8 +7276,6 @@ snapshots: transitivePeerDependencies: - supports-color - generic-pool@3.9.0: {} - gensync@1.0.0-beta.2: {} get-assigned-identifiers@1.2.0: {} @@ -8479,10 +7314,6 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - getpass@0.1.7: - dependencies: - assert-plus: 1.0.0 - giget@1.2.5: dependencies: citty: 0.1.6 @@ -8553,20 +7384,8 @@ snapshots: graphql: 16.9.0 tslib: 2.6.3 - graphql-tag@2.12.6(graphql@16.9.0): - dependencies: - graphql: 16.9.0 - tslib: 2.6.3 - graphql@16.9.0: {} - har-schema@2.0.0: {} - - har-validator@5.1.5: - dependencies: - ajv: 6.12.6 - har-schema: 2.0.0 - has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -8611,10 +7430,6 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - hoist-non-react-statics@3.3.2: - dependencies: - react-is: 16.13.1 - hookable@5.5.3: {} htmlescape@1.1.1: {} @@ -8627,18 +7442,6 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 - http-signature@1.2.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 1.4.2 - sshpk: 1.18.0 - - http-signature@1.4.0: - dependencies: - assert-plus: 1.0.0 - jsprim: 2.0.2 - sshpk: 1.18.0 - https-browserify@1.0.0: {} human-signals@5.0.0: {} @@ -8671,17 +7474,6 @@ snapshots: dependencies: source-map: 0.5.7 - inquirer@10.2.2: - dependencies: - '@inquirer/core': 9.2.1 - '@inquirer/prompts': 5.5.0 - '@inquirer/type': 1.5.5 - '@types/mute-stream': 0.0.4 - ansi-escapes: 4.3.2 - mute-stream: 1.0.0 - run-async: 3.0.0 - rxjs: 7.8.2 - insert-module-globals@7.2.1: dependencies: JSONStream: 1.3.5 @@ -8824,8 +7616,6 @@ snapshots: dependencies: which-typed-array: 1.1.19 - is-typedarray@1.0.0: {} - is-utf8@0.2.1: {} is-weakmap@2.0.2: {} @@ -8847,19 +7637,10 @@ snapshots: isexe@3.1.1: {} - isomorphic-fetch@3.0.0: - dependencies: - node-fetch: 2.7.0 - whatwg-fetch: 3.6.20 - transitivePeerDependencies: - - encoding - isows@1.0.7(ws@8.18.3): dependencies: ws: 8.18.3 - isstream@0.1.2: {} - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -8870,8 +7651,6 @@ snapshots: jiti@2.5.1: {} - js-sha3@0.8.0: {} - js-tokens@4.0.0: {} js-tokens@9.0.1: {} @@ -8880,8 +7659,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsbn@0.1.1: {} - jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -8890,12 +7667,8 @@ snapshots: json-schema-traverse@1.0.0: {} - json-schema@0.4.0: {} - json-stable-stringify-without-jsonify@1.0.1: {} - json-stringify-safe@5.0.1: {} - json5@1.0.2: dependencies: minimist: 1.2.8 @@ -8910,20 +7683,6 @@ snapshots: jsonparse@1.3.1: {} - jsprim@1.4.2: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - - jsprim@2.0.2: - dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - jsx-ast-utils@3.3.5: dependencies: array-includes: 3.1.9 @@ -8980,8 +7739,6 @@ snapshots: lodash.sortby@4.7.0: {} - lodash@4.17.21: {} - logform@2.7.0: dependencies: '@colors/colors': 1.6.0 @@ -9117,14 +7874,10 @@ snapshots: through2: 2.0.5 xtend: 4.0.2 - moment@2.30.1: {} - ms@2.0.0: {} ms@2.1.3: {} - mute-stream@1.0.0: {} - mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -9161,21 +7914,6 @@ snapshots: node-releases@2.0.21: {} - node-telegram-bot-api@0.66.0(request@2.88.2): - dependencies: - '@cypress/request': 3.0.9 - '@cypress/request-promise': 5.0.0(@cypress/request@3.0.9)(request@2.88.2) - array.prototype.findindex: 2.2.4 - bl: 1.2.3 - debug: 3.2.7 - eventemitter3: 3.1.2 - file-type: 3.9.0 - mime: 1.6.0 - pump: 2.0.1 - transitivePeerDependencies: - - request - - supports-color - normalize-path@3.0.0: {} npm-run-path@5.3.0: @@ -9191,8 +7929,6 @@ snapshots: tinyexec: 0.3.2 ufo: 1.6.1 - oauth-sign@0.9.0: {} - object-assign@4.1.1: {} object-inspect@1.13.4: {} @@ -9253,13 +7989,6 @@ snapshots: dependencies: mimic-fn: 4.0.0 - optimism@0.18.1: - dependencies: - '@wry/caches': 1.0.1 - '@wry/context': 0.7.4 - '@wry/trie': 0.5.0 - tslib: 2.6.3 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -9271,8 +8000,6 @@ snapshots: os-browserify@0.3.0: {} - os-tmpdir@1.0.2: {} - own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -9392,8 +8119,6 @@ snapshots: perfect-debounce@1.0.0: {} - performance-now@2.1.0: {} - pg-cloudflare@1.2.7: optional: true @@ -9521,8 +8246,6 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-from-env@1.1.0: {} - psl@1.15.0: dependencies: punycode: 2.3.1 @@ -9536,11 +8259,6 @@ snapshots: randombytes: 2.1.0 safe-buffer: 5.2.1 - pump@2.0.1: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - punycode@1.4.1: {} punycode@2.3.1: {} @@ -9555,8 +8273,6 @@ snapshots: dependencies: side-channel: 1.1.0 - qs@6.5.3: {} - querystring-es3@0.2.1: {} querystringify@2.2.0: {} @@ -9590,8 +8306,6 @@ snapshots: react-is@18.3.1: {} - react@19.1.0: {} - read-only-stream@2.0.0: dependencies: readable-stream: 2.3.8 @@ -9620,15 +8334,6 @@ snapshots: dependencies: esprima: 4.0.1 - redis@4.7.1: - dependencies: - '@redis/bloom': 1.2.0(@redis/client@1.6.1) - '@redis/client': 1.6.1 - '@redis/graph': 1.1.1(@redis/client@1.6.1) - '@redis/json': 1.0.7(@redis/client@1.6.1) - '@redis/search': 1.2.0(@redis/client@1.6.1) - '@redis/time-series': 1.1.0(@redis/client@1.6.1) - reflect-metadata@0.2.2: {} reflect.getprototypeof@1.0.10: @@ -9651,39 +8356,6 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - rehackt@0.1.0(@types/react@19.1.13)(react@19.1.0): - optionalDependencies: - '@types/react': 19.1.13 - react: 19.1.0 - - request-promise-core@1.1.3(request@2.88.2): - dependencies: - lodash: 4.17.21 - request: 2.88.2 - - request@2.88.2: - dependencies: - aws-sign2: 0.7.0 - aws4: 1.13.2 - caseless: 0.12.0 - combined-stream: 1.0.8 - extend: 3.0.2 - forever-agent: 0.6.1 - form-data: 2.3.3 - har-validator: 5.1.5 - http-signature: 1.2.0 - is-typedarray: 1.0.0 - isstream: 0.1.2 - json-stringify-safe: 5.0.1 - mime-types: 2.1.35 - oauth-sign: 0.9.0 - performance-now: 2.1.0 - qs: 6.5.3 - safe-buffer: 5.2.1 - tough-cookie: 2.5.0 - tunnel-agent: 0.6.0 - uuid: 3.4.0 - require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -9706,8 +8378,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - response-iterator@0.2.25: {} - retry@0.13.1: {} reusify@1.1.0: {} @@ -9771,8 +8441,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.51.0 fsevents: 2.3.3 - run-async@3.0.0: {} - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -9780,6 +8448,7 @@ snapshots: rxjs@7.8.2: dependencies: tslib: 2.6.3 + optional: true safe-array-concat@1.1.3: dependencies: @@ -9841,8 +8510,6 @@ snapshots: transitivePeerDependencies: - supports-color - set-cookie-parser@2.7.1: {} - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -9956,63 +8623,16 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 - source-map@0.5.6: {} - source-map@0.5.7: {} source-map@0.6.1: {} split2@4.2.0: {} - sshpk@1.18.0: - dependencies: - asn1: 0.2.6 - assert-plus: 1.0.0 - bcrypt-pbkdf: 1.0.2 - dashdash: 1.14.1 - ecc-jsbn: 0.1.2 - getpass: 0.1.7 - jsbn: 0.1.1 - safer-buffer: 2.1.2 - tweetnacl: 0.14.5 - - stack-generator@2.0.10: - dependencies: - stackframe: 1.3.4 - stack-trace@0.0.10: {} stackback@0.0.2: {} - stackframe@1.3.4: {} - - stacktrace-gps@3.1.2: - dependencies: - source-map: 0.5.6 - stackframe: 1.3.4 - - stacktrace-js@2.0.2: - dependencies: - error-stack-parser: 2.1.4 - stack-generator: 2.0.10 - stacktrace-gps: 3.1.2 - - starknet@6.24.1: - dependencies: - '@noble/curves': 1.7.0 - '@noble/hashes': 1.6.0 - '@scure/base': 1.2.1 - '@scure/starknet': 1.1.0 - abi-wan-kanabi: 2.2.4 - fetch-cookie: 3.0.1 - isomorphic-fetch: 3.0.0 - lossless-json: 4.2.0 - pako: 2.1.0 - starknet-types-07: '@starknet-io/types-js@0.7.10' - ts-mixer: 6.0.4 - transitivePeerDependencies: - - encoding - starknet@8.5.4: dependencies: '@noble/curves': 1.7.0 @@ -10030,8 +8650,6 @@ snapshots: std-env@3.9.0: {} - stealthy-require@1.1.1: {} - stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -10162,8 +8780,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - symbol-observable@4.0.0: {} - syntax-error@1.4.0: dependencies: acorn-node: 1.8.2 @@ -10221,16 +8837,6 @@ snapshots: tinyspy@2.2.1: {} - tldts-core@6.1.86: {} - - tldts@6.1.86: - dependencies: - tldts-core: 6.1.86 - - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 - to-buffer@1.2.1: dependencies: isarray: 2.0.5 @@ -10247,11 +8853,6 @@ snapshots: dependencies: tough-cookie: 4.1.4 - tough-cookie@2.5.0: - dependencies: - psl: 1.15.0 - punycode: 2.3.1 - tough-cookie@4.1.4: dependencies: psl: 1.15.0 @@ -10259,10 +8860,6 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 - tough-cookie@5.1.2: - dependencies: - tldts: 6.1.86 - tr46@0.0.3: {} triple-beam@1.4.1: {} @@ -10275,10 +8872,6 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-invariant@0.10.3: - dependencies: - tslib: 2.6.3 - ts-mixer@6.0.4: {} ts-morph@23.0.0: @@ -10336,8 +8929,6 @@ snapshots: tslib@2.6.3: {} - tslib@2.7.0: {} - tslib@2.8.1: {} tsx@4.9.1: @@ -10349,20 +8940,12 @@ snapshots: tty-browserify@0.0.1: {} - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - - tweetnacl@0.14.5: {} - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 type-detect@4.1.0: {} - type-fest@0.21.3: {} - type-graphql@2.0.0-rc.2(graphql-scalars@1.23.0(graphql@16.9.0))(graphql@16.9.0): dependencies: '@graphql-yoga/subscription': 5.0.5 @@ -10469,10 +9052,6 @@ snapshots: simple-concat: 1.0.1 xtend: 4.0.2 - undici-types@6.19.8: {} - - undici-types@6.21.0: {} - undici-types@7.12.0: {} universalify@0.2.0: {} @@ -10539,10 +9118,6 @@ snapshots: utils-merge@1.0.1: {} - uuid@3.4.0: {} - - uuid@8.3.2: {} - uuid@9.0.1: {} v8-compile-cache-lib@3.0.1: {} @@ -10557,12 +9132,6 @@ snapshots: vary@1.1.2: {} - verror@1.10.0: - dependencies: - assert-plus: 1.0.0 - core-util-is: 1.0.2 - extsprintf: 1.3.0 - viem@2.37.6(typescript@5.9.2): dependencies: '@noble/curves': 1.9.1 @@ -10647,8 +9216,6 @@ snapshots: webpack-virtual-modules@0.6.2: {} - whatwg-fetch@3.6.20: {} - whatwg-mimetype@3.0.0: {} whatwg-url@5.0.0: @@ -10742,12 +9309,6 @@ snapshots: word-wrap@1.2.5: {} - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -10766,8 +9327,6 @@ snapshots: dependencies: async-limiter: 1.0.1 - ws@8.17.1: {} - ws@8.18.3: {} xtend@4.0.2: {} @@ -10806,11 +9365,3 @@ snapshots: yocto-queue@0.1.0: {} yocto-queue@1.2.1: {} - - yoctocolors-cjs@2.1.3: {} - - zen-observable-ts@1.2.5: - dependencies: - zen-observable: 0.8.15 - - zen-observable@0.8.15: {} diff --git a/prisma/drizzle/schema.ts b/prisma/drizzle/schema.ts index aca79fe..3a2e414 100644 --- a/prisma/drizzle/schema.ts +++ b/prisma/drizzle/schema.ts @@ -235,4 +235,139 @@ export const strategy_apy = pgTable('strategy_apy', { }, (strategy_apy) => ({ 'strategy_apy_unique': uniqueIndex('strategy_apy_unique') .on(strategy_apy.strategy_id, strategy_apy.timestamp) -})); \ No newline at end of file +})); + +export const vesu_extended_usdc_transfers = pgTable('vesu_extended_usdc_transfers', { + id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), + block_number: integer('block_number').notNull(), + tx_index: integer('tx_index').notNull(), + event_index: integer('event_index').notNull(), + tx_hash: text('tx_hash').notNull(), + strategy_id: text('strategy_id').notNull(), + flow_type: text('flow_type').notNull(), + from_address: text('from_address').notNull(), + to_address: text('to_address').notNull(), + amount: text('amount').notNull(), + timestamp: integer('timestamp').notNull(), + cursor: bigint('_cursor', { mode: 'bigint' }) +}, (vesu_extended_usdc_transfers) => ({ + 'vesu_ext_usdc_transfer_event_id': uniqueIndex('vesu_ext_usdc_transfer_event_id') + .on(vesu_extended_usdc_transfers.block_number, vesu_extended_usdc_transfers.tx_index, vesu_extended_usdc_transfers.event_index) +})); + +export const vesu_extended_modify_position = pgTable('vesu_extended_modify_position', { + id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), + block_number: integer('block_number').notNull(), + tx_index: integer('tx_index').notNull(), + event_index: integer('event_index').notNull(), + tx_hash: text('tx_hash').notNull(), + strategy_id: text('strategy_id').notNull(), + pool_contract: text('pool_contract').notNull(), + collateral_asset: text('collateral_asset').notNull(), + debt_asset: text('debt_asset').notNull(), + user_address: text('user_address').notNull(), + collateral_delta: text('collateral_delta').notNull(), + collateral_shares_delta: text('collateral_shares_delta').notNull(), + debt_delta: text('debt_delta').notNull(), + nominal_debt_delta: text('nominal_debt_delta').notNull(), + timestamp: integer('timestamp').notNull(), + cursor: bigint('_cursor', { mode: 'bigint' }) +}, (vesu_extended_modify_position) => ({ + 'vesu_ext_modify_event_id': uniqueIndex('vesu_ext_modify_event_id') + .on(vesu_extended_modify_position.block_number, vesu_extended_modify_position.tx_index, vesu_extended_modify_position.event_index) +})); + +export const vesu_extended_multiply_lever = pgTable('vesu_extended_multiply_lever', { + id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), + block_number: integer('block_number').notNull(), + tx_index: integer('tx_index').notNull(), + event_index: integer('event_index').notNull(), + tx_hash: text('tx_hash').notNull(), + strategy_id: text('strategy_id').notNull(), + lever_kind: text('lever_kind').notNull(), + pool_id: text('pool_id').notNull(), + collateral_asset: text('collateral_asset').notNull(), + debt_asset: text('debt_asset').notNull(), + user_address: text('user_address').notNull(), + margin: text('margin').notNull(), + collateral_delta: text('collateral_delta').notNull(), + debt_delta: text('debt_delta').notNull(), + timestamp: integer('timestamp').notNull(), + cursor: bigint('_cursor', { mode: 'bigint' }) +}, (vesu_extended_multiply_lever) => ({ + 'vesu_ext_multiply_lever_event_id': uniqueIndex('vesu_ext_multiply_lever_event_id') + .on(vesu_extended_multiply_lever.block_number, vesu_extended_multiply_lever.tx_index, vesu_extended_multiply_lever.event_index) +})); + +export const vesu_extended_ekubo_swapped = pgTable('vesu_extended_ekubo_swapped', { + id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), + block_number: integer('block_number').notNull(), + tx_index: integer('tx_index').notNull(), + event_index: integer('event_index').notNull(), + tx_hash: text('tx_hash').notNull(), + strategy_id: text('strategy_id').notNull(), + locker: text('locker').notNull(), + token0: text('token0').notNull(), + token1: text('token1').notNull(), + fee: text('fee').notNull(), + tick_spacing: text('tick_spacing').notNull(), + extension: text('extension').notNull(), + swap_amount_signed: text('swap_amount_signed').notNull(), + is_token1: text('is_token1').notNull(), + sqrt_ratio_limit: text('sqrt_ratio_limit').notNull(), + skip_ahead: text('skip_ahead').notNull(), + delta0_signed: text('delta0_signed').notNull(), + delta1_signed: text('delta1_signed').notNull(), + sqrt_ratio_after: text('sqrt_ratio_after').notNull(), + tick_after_signed: text('tick_after_signed').notNull(), + liquidity_after: text('liquidity_after').notNull(), + timestamp: integer('timestamp').notNull(), + cursor: bigint('_cursor', { mode: 'bigint' }) +}, (vesu_extended_ekubo_swapped) => ({ + 'vesu_ext_ekubo_swap_event_id': uniqueIndex('vesu_ext_ekubo_swap_event_id') + .on(vesu_extended_ekubo_swapped.block_number, vesu_extended_ekubo_swapped.tx_index, vesu_extended_ekubo_swapped.event_index) +})); + +export const vesu_extended_core_deposits = pgTable('vesu_extended_core_deposits', { + id: text('id').notNull().primaryKey().default(sql`gen_random_uuid()`), + block_number: integer('block_number').notNull(), + tx_index: integer('tx_index').notNull(), + event_index: integer('event_index').notNull(), + tx_hash: text('tx_hash').notNull(), + strategy_id: text('strategy_id').notNull(), + vault_id_key: text('vault_id_key').notNull(), + va_address: text('va_address').notNull(), + collateral_id: text('collateral_id').notNull(), + quantized_amount: text('quantized_amount').notNull(), + unquantized_amount: text('unquantized_amount').notNull(), + salt: text('salt').notNull(), + timestamp: integer('timestamp').notNull(), + cursor: bigint('_cursor', { mode: 'bigint' }) +}, (vesu_extended_core_deposits) => ({ + 'vesu_ext_core_dep_event_id': uniqueIndex('vesu_ext_core_dep_event_id') + .on(vesu_extended_core_deposits.block_number, vesu_extended_core_deposits.tx_index, vesu_extended_core_deposits.event_index) +})); + +export const extended_trades = pgTable('extended_trades', { + trade_id: text('trade_id').notNull().primaryKey(), + strategy_id: text('strategy_id').notNull(), + account_id: text('account_id').notNull(), + market: text('market').notNull(), + order_id: text('order_id').notNull(), + external_id: text('external_id'), + side: text('side').notNull(), + price: text('price').notNull(), + qty: text('qty').notNull(), + value: text('value').notNull(), + fee: text('fee').notNull(), + trade_type: text('trade_type').notNull(), + created_time: text('created_time').notNull(), + is_taker: boolean('is_taker').notNull(), + synced_at: integer('synced_at').notNull() +}); + +export const extended_trades_poll_state = pgTable('extended_trades_poll_state', { + id: text('id').notNull().primaryKey(), + last_cursor: text('last_cursor'), + updated_at: integer('updated_at').notNull() +}); \ No newline at end of file diff --git a/prisma/migrations/20260329224513_vesu_extended/migration.sql b/prisma/migrations/20260329224513_vesu_extended/migration.sql new file mode 100644 index 0000000..8b59a96 --- /dev/null +++ b/prisma/migrations/20260329224513_vesu_extended/migration.sql @@ -0,0 +1,101 @@ +-- CreateTable +CREATE TABLE "public"."vesu_extended_usdc_transfers" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "block_number" INTEGER NOT NULL, + "tx_index" INTEGER NOT NULL, + "event_index" INTEGER NOT NULL, + "tx_hash" TEXT NOT NULL, + "strategy_id" TEXT NOT NULL, + "flow_type" TEXT NOT NULL, + "from_address" TEXT NOT NULL, + "to_address" TEXT NOT NULL, + "amount" TEXT NOT NULL, + "timestamp" INTEGER NOT NULL, + "_cursor" BIGINT, + + CONSTRAINT "vesu_extended_usdc_transfers_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."vesu_extended_modify_position" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "block_number" INTEGER NOT NULL, + "tx_index" INTEGER NOT NULL, + "event_index" INTEGER NOT NULL, + "tx_hash" TEXT NOT NULL, + "strategy_id" TEXT NOT NULL, + "pool_contract" TEXT NOT NULL, + "collateral_asset" TEXT NOT NULL, + "debt_asset" TEXT NOT NULL, + "user_address" TEXT NOT NULL, + "collateral_delta" TEXT NOT NULL, + "collateral_shares_delta" TEXT NOT NULL, + "debt_delta" TEXT NOT NULL, + "nominal_debt_delta" TEXT NOT NULL, + "timestamp" INTEGER NOT NULL, + "_cursor" BIGINT, + + CONSTRAINT "vesu_extended_modify_position_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."vesu_extended_core_deposits" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "block_number" INTEGER NOT NULL, + "tx_index" INTEGER NOT NULL, + "event_index" INTEGER NOT NULL, + "tx_hash" TEXT NOT NULL, + "strategy_id" TEXT NOT NULL, + "vault_id_key" TEXT NOT NULL, + "va_address" TEXT NOT NULL, + "collateral_id" TEXT NOT NULL, + "quantized_amount" TEXT NOT NULL, + "unquantized_amount" TEXT NOT NULL, + "salt" TEXT NOT NULL, + "timestamp" INTEGER NOT NULL, + "_cursor" BIGINT, + + CONSTRAINT "vesu_extended_core_deposits_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."extended_trades" ( + "trade_id" TEXT NOT NULL, + "strategy_id" TEXT NOT NULL, + "account_id" TEXT NOT NULL, + "market" TEXT NOT NULL, + "order_id" TEXT NOT NULL, + "external_id" TEXT, + "side" TEXT NOT NULL, + "price" TEXT NOT NULL, + "qty" TEXT NOT NULL, + "value" TEXT NOT NULL, + "fee" TEXT NOT NULL, + "trade_type" TEXT NOT NULL, + "created_time" TEXT NOT NULL, + "is_taker" BOOLEAN NOT NULL, + "synced_at" INTEGER NOT NULL, + + CONSTRAINT "extended_trades_pkey" PRIMARY KEY ("trade_id") +); + +-- CreateTable +CREATE TABLE "public"."extended_trades_poll_state" ( + "id" TEXT NOT NULL, + "last_cursor" TEXT, + "updated_at" INTEGER NOT NULL, + + CONSTRAINT "extended_trades_poll_state_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "vesu_extended_usdc_transfers_block_number_tx_index_event_in_key" ON "public"."vesu_extended_usdc_transfers"("block_number", "tx_index", "event_index"); + +-- CreateIndex +CREATE UNIQUE INDEX "vesu_extended_modify_position_block_number_tx_index_event_i_key" ON "public"."vesu_extended_modify_position"("block_number", "tx_index", "event_index"); + +-- CreateIndex +CREATE UNIQUE INDEX "vesu_extended_core_deposits_block_number_tx_index_event_ind_key" ON "public"."vesu_extended_core_deposits"("block_number", "tx_index", "event_index"); + +-- CreateIndex +CREATE INDEX "extended_trades_strategy_id_idx" ON "public"."extended_trades"("strategy_id"); diff --git a/prisma/migrations/20260405180000_vesu_extended_multiply_ekubo/migration.sql b/prisma/migrations/20260405180000_vesu_extended_multiply_ekubo/migration.sql new file mode 100644 index 0000000..768c50c --- /dev/null +++ b/prisma/migrations/20260405180000_vesu_extended_multiply_ekubo/migration.sql @@ -0,0 +1,52 @@ +-- Vesu multiply lever + Ekubo Swapped (vault ops enrichment) + +CREATE TABLE "public"."vesu_extended_multiply_lever" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "block_number" INTEGER NOT NULL, + "tx_index" INTEGER NOT NULL, + "event_index" INTEGER NOT NULL, + "tx_hash" TEXT NOT NULL, + "strategy_id" TEXT NOT NULL, + "lever_kind" TEXT NOT NULL, + "pool_id" TEXT NOT NULL, + "collateral_asset" TEXT NOT NULL, + "debt_asset" TEXT NOT NULL, + "user_address" TEXT NOT NULL, + "margin" TEXT NOT NULL, + "collateral_delta" TEXT NOT NULL, + "debt_delta" TEXT NOT NULL, + "timestamp" INTEGER NOT NULL, + "_cursor" BIGINT, + CONSTRAINT "vesu_extended_multiply_lever_pkey" PRIMARY KEY ("id") +); + +CREATE UNIQUE INDEX "vesu_ext_multiply_lever_event_id" ON "public"."vesu_extended_multiply_lever"("block_number", "tx_index", "event_index"); + +CREATE TABLE "public"."vesu_extended_ekubo_swapped" ( + "id" UUID NOT NULL DEFAULT gen_random_uuid(), + "block_number" INTEGER NOT NULL, + "tx_index" INTEGER NOT NULL, + "event_index" INTEGER NOT NULL, + "tx_hash" TEXT NOT NULL, + "strategy_id" TEXT NOT NULL, + "locker" TEXT NOT NULL, + "token0" TEXT NOT NULL, + "token1" TEXT NOT NULL, + "fee" TEXT NOT NULL, + "tick_spacing" TEXT NOT NULL, + "extension" TEXT NOT NULL, + "swap_amount_signed" TEXT NOT NULL, + "is_token1" TEXT NOT NULL, + "sqrt_ratio_limit" TEXT NOT NULL, + "skip_ahead" TEXT NOT NULL, + "delta0_signed" TEXT NOT NULL, + "delta1_signed" TEXT NOT NULL, + "sqrt_ratio_after" TEXT NOT NULL, + "tick_after_signed" TEXT NOT NULL, + "liquidity_after" TEXT NOT NULL, + "timestamp" INTEGER NOT NULL, + "_cursor" BIGINT, + CONSTRAINT "vesu_extended_ekubo_swapped_pkey" PRIMARY KEY ("id") +); + +CREATE UNIQUE INDEX "vesu_ext_ekubo_swap_event_id" ON "public"."vesu_extended_ekubo_swapped"("block_number", "tx_index", "event_index"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index fa201e2..d52dda3 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -308,3 +308,145 @@ model strategy_apy { @@index([timestamp], name: "strategy_apy_timestamp_idx") @@schema("public") } + +model vesu_extended_usdc_transfers { + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + block_number Int + tx_index Int + event_index Int + tx_hash String + strategy_id String + flow_type String + from_address String + to_address String + amount String + timestamp Int + cursor BigInt? @map("_cursor") + + @@unique([block_number, tx_index, event_index], name: "vesu_ext_usdc_transfer_event_id") + @@schema("public") +} + +model vesu_extended_modify_position { + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + block_number Int + tx_index Int + event_index Int + tx_hash String + strategy_id String + pool_contract String + collateral_asset String + debt_asset String + user_address String + collateral_delta String + collateral_shares_delta String + debt_delta String + nominal_debt_delta String + timestamp Int + cursor BigInt? @map("_cursor") + + @@unique([block_number, tx_index, event_index], name: "vesu_ext_modify_event_id") + @@schema("public") +} + +/// Vesu multiply IncreaseLever / DecreaseLever (sibling to ModifyPosition in same tx when indexed with includeReceipt). +model vesu_extended_multiply_lever { + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + block_number Int + tx_index Int + event_index Int + tx_hash String + strategy_id String + lever_kind String + pool_id String + collateral_asset String + debt_asset String + user_address String + margin String + collateral_delta String + debt_delta String + timestamp Int + cursor BigInt? @map("_cursor") + + @@unique([block_number, tx_index, event_index], name: "vesu_ext_multiply_lever_event_id") + @@schema("public") +} + +/// Ekubo core Swapped events where locker is Vesu multiply (execution prices for lever path). +model vesu_extended_ekubo_swapped { + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + block_number Int + tx_index Int + event_index Int + tx_hash String + strategy_id String + locker String + token0 String + token1 String + fee String + tick_spacing String + extension String + swap_amount_signed String + is_token1 String + sqrt_ratio_limit String + skip_ahead String + delta0_signed String + delta1_signed String + sqrt_ratio_after String + tick_after_signed String + liquidity_after String + timestamp Int + cursor BigInt? @map("_cursor") + + @@unique([block_number, tx_index, event_index], name: "vesu_ext_ekubo_swap_event_id") + @@schema("public") +} + +model vesu_extended_core_deposits { + id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid + block_number Int + tx_index Int + event_index Int + tx_hash String + strategy_id String + vault_id_key String + va_address String + collateral_id String + quantized_amount String + unquantized_amount String + salt String + timestamp Int + cursor BigInt? @map("_cursor") + + @@unique([block_number, tx_index, event_index], name: "vesu_ext_core_dep_event_id") + @@schema("public") +} + +model extended_trades { + trade_id String @id + strategy_id String + account_id String + market String + order_id String + external_id String? + side String + price String + qty String + value String + fee String + trade_type String + created_time String + is_taker Boolean + synced_at Int + + @@index([strategy_id], name: "extended_trades_strategy_id_idx") + @@schema("public") +} + +model extended_trades_poll_state { + id String @id + last_cursor String? + updated_at Int + + @@schema("public") +} diff --git a/src/graphql/customResolvers/vesuExtendedVaultOps.ts b/src/graphql/customResolvers/vesuExtendedVaultOps.ts new file mode 100644 index 0000000..a4f7743 --- /dev/null +++ b/src/graphql/customResolvers/vesuExtendedVaultOps.ts @@ -0,0 +1,677 @@ +import { Resolver, Query, Arg, Int, ObjectType, Field } from "type-graphql"; +import { PrismaClient } from "@prisma/client"; +import { standariseAddress } from "@/utils"; +import { + getVesuExtendedIndexerProfiles, + type VesuExtendedIndexerProfile, +} from "../../../indexers/utils/configs/vesu_extended_vault_ops"; + +const prisma = new PrismaClient(); + +function decimalsForToken( + profile: VesuExtendedIndexerProfile, + token: string, +): number { + const t = standariseAddress(token); + if (t === profile.collateral) return profile.collateralDecimals; + if (t === profile.debt) return profile.debtDecimals; + return 18; +} + +function isUsdcToken( + profile: VesuExtendedIndexerProfile, + token: string, +): boolean { + const t = standariseAddress(token); + return ( + t === standariseAddress(profile.usdc) || t === standariseAddress(profile.debt) + ); +} + +/** + * Execution price for display + UI PnL: + * - If one leg is USDC: USDC amount / other token amount (decimal-adjusted, absolute notion). + * - Else: token1/token0 (human, decimal-adjusted). + */ +function computeEkuboSwapExec( + profile: VesuExtendedIndexerProfile, + pathLabel: string, + token0: string, + token1: string, + d0s: string, + d1s: string, +): Record | null { + let d0: bigint; + let d1: bigint; + try { + d0 = BigInt(d0s); + d1 = BigInt(d1s); + } catch { + return null; + } + const dec0 = decimalsForToken(profile, token0); + const dec1 = decimalsForToken(profile, token1); + const h0 = Number(d0) / 10 ** dec0; + const h1 = Number(d1) / 10 ** dec1; + const a0 = Math.abs(h0); + const a1 = Math.abs(h1); + if (a0 < 1e-300 && a1 < 1e-300) return null; + + const u0 = isUsdcToken(profile, token0); + const u1 = isUsdcToken(profile, token1); + const coll = standariseAddress(profile.collateral); + + const fmtN = (n: number) => + n.toLocaleString(undefined, { maximumFractionDigits: 8 }); + + if (u0 && !u1) { + if (a1 < 1e-300) return null; + const usdcPerOther = a0 / a1; + const refTok = token1; + const refLabel = standariseAddress(refTok) === coll ? "collateral" : "token1"; + const wColl = standariseAddress(refTok) === coll ? a1.toString() : "0"; + return { + path: pathLabel, + token0, + token1, + delta0_signed: d0s, + delta1_signed: d1s, + usdc_per_reference_unit: usdcPerOther.toString(), + reference_token: refTok, + collateral_abs_human_for_weight: wColl, + token1_per_token0_human: "", + display: `${pathLabel}: ≈ ${fmtN(usdcPerOther)} USDC / 1 ${refLabel}`, + }; + } + if (u1 && !u0) { + if (a0 < 1e-300) return null; + const usdcPerOther = a1 / a0; + const refTok = token0; + const refLabel = standariseAddress(refTok) === coll ? "collateral" : "token0"; + const wColl = standariseAddress(refTok) === coll ? a0.toString() : "0"; + return { + path: pathLabel, + token0, + token1, + delta0_signed: d0s, + delta1_signed: d1s, + usdc_per_reference_unit: usdcPerOther.toString(), + reference_token: refTok, + collateral_abs_human_for_weight: wColl, + token1_per_token0_human: "", + display: `${pathLabel}: ≈ ${fmtN(usdcPerOther)} USDC / 1 ${refLabel}`, + }; + } + if (!u0 && !u1) { + if (a0 < 1e-300) return null; + const t1PerT0 = a1 / a0; + return { + path: pathLabel, + token0, + token1, + delta0_signed: d0s, + delta1_signed: d1s, + usdc_per_reference_unit: "", + reference_token: "", + collateral_abs_human_for_weight: "", + token1_per_token0_human: t1PerT0.toString(), + display: `${pathLabel}: token1/token0 ≈ ${fmtN(t1PerT0)}`, + }; + } + return null; +} + +function blendUsdcPerCollateral( + profile: VesuExtendedIndexerProfile, + execs: Record[], +): string | null { + const coll = standariseAddress(profile.collateral); + let sumW = 0; + let sumPxW = 0; + for (const e of execs) { + const ref = e.reference_token; + const pxS = e.usdc_per_reference_unit; + const wS = e.collateral_abs_human_for_weight; + if (!ref || !pxS || pxS === "") continue; + if (standariseAddress(ref) !== coll) continue; + const px = Number(pxS); + const w = Number(wS); + if (!Number.isFinite(px) || !Number.isFinite(w) || w <= 0 || px <= 0) + continue; + sumW += w; + sumPxW += px * w; + } + if (sumW <= 0) return null; + return (sumPxW / sumW).toString(); +} + +function buildVesuModifyDetailJson( + r: { + tx_hash: string; + event_index: number; + pool_contract: string; + collateral_asset: string; + debt_asset: string; + user_address: string; + collateral_delta: string; + debt_delta: string; + nominal_debt_delta: string; + }, + levers: Array<{ + tx_hash: string; + event_index: number; + user_address: string; + collateral_asset: string; + debt_asset: string; + lever_kind: string; + margin: string; + collateral_delta: string; + debt_delta: string; + }>, + swaps: Array<{ + tx_hash: string; + event_index: number; + token0: string; + token1: string; + delta0_signed: string; + delta1_signed: string; + }>, + profile: VesuExtendedIndexerProfile | undefined, + allModifies: Array<{ + tx_hash: string; + event_index: number; + pool_contract: string; + }>, +): Record { + const pool = standariseAddress(r.pool_contract); + const prevModifyIdx = allModifies + .filter( + (m) => + m.tx_hash === r.tx_hash && + standariseAddress(m.pool_contract) === pool && + m.event_index < r.event_index, + ) + .reduce((max, m) => Math.max(max, m.event_index), -1); + + const leverCandidates = levers + .filter( + (l) => + l.tx_hash === r.tx_hash && + standariseAddress(l.user_address) === + standariseAddress(r.user_address) && + standariseAddress(l.collateral_asset) === + standariseAddress(r.collateral_asset) && + standariseAddress(l.debt_asset) === standariseAddress(r.debt_asset) && + l.event_index > r.event_index, + ) + .sort((a, b) => a.event_index - b.event_index); + + let lever: (typeof leverCandidates)[0] | undefined; + for (const l of leverCandidates) { + const interveningPoolMod = allModifies.some( + (m) => + m.tx_hash === r.tx_hash && + standariseAddress(m.pool_contract) === pool && + m.event_index > r.event_index && + m.event_index < l.event_index, + ); + if (!interveningPoolMod) { + lever = l; + break; + } + } + + const swapsTx = swaps + .filter((s) => s.tx_hash === r.tx_hash) + .sort((a, b) => a.event_index - b.event_index); + + const ekuboInWindow = swapsTx.filter( + (s) => + s.event_index > prevModifyIdx && s.event_index < r.event_index, + ); + + const marginSwap = ekuboInWindow[0]; + const debtSwap = ekuboInWindow[1]; + const ekuboSwapExec: Record[] = []; + if (profile) { + if (marginSwap) { + const ex = computeEkuboSwapExec( + profile, + "Margin path", + marginSwap.token0, + marginSwap.token1, + marginSwap.delta0_signed, + marginSwap.delta1_signed, + ); + if (ex) ekuboSwapExec.push(ex); + } + if (debtSwap) { + const ex = computeEkuboSwapExec( + profile, + "Debt→coll path", + debtSwap.token0, + debtSwap.token1, + debtSwap.delta0_signed, + debtSwap.delta1_signed, + ); + if (ex) ekuboSwapExec.push(ex); + } + } + const executionUsdcPerCollateral = + profile && ekuboSwapExec.length + ? blendUsdcPerCollateral(profile, ekuboSwapExec) + : null; + + let leverSplit: Record | undefined; + if (lever && lever.lever_kind === "increase") { + try { + const m = BigInt(lever.margin); + const cd = BigInt(lever.collateral_delta); + const fromSwap = cd - m; + leverSplit = { + margin_collateral_raw: lever.margin, + collateral_from_swap_raw: fromSwap.toString(), + }; + } catch { + leverSplit = undefined; + } + } + + return { + pool_contract: r.pool_contract, + collateral_delta: r.collateral_delta, + debt_delta: r.debt_delta, + nominal_debt_delta: r.nominal_debt_delta, + multiply_lever: lever + ? { + lever_kind: lever.lever_kind, + margin: lever.margin, + collateral_delta: lever.collateral_delta, + debt_delta: lever.debt_delta, + } + : undefined, + lever_collateral_split: leverSplit, + ekubo_swap_exec: ekuboSwapExec, + execution_usdc_per_collateral: executionUsdcPerCollateral, + }; +} + +@ObjectType() +export class VesuExtendedTimelineEntry { + @Field(() => String) + source!: string; + + @Field(() => Int) + timestamp!: number; + + @Field(() => String, { nullable: true }) + tx_hash!: string | null; + + @Field(() => Int, { nullable: true }) + block_number!: number | null; + + @Field(() => String) + detail_json!: string; +} + +@ObjectType() +export class VesuExtendedUsdcSummary { + /** Net USDC (raw 6-decimal units) into VA minus out from VA for classified transfer flows (indexed only). */ + @Field(() => String) + net_usdc_transfers_raw!: string; + + /** Net USDC (raw 6-decimal units) into wallet minus out from wallet on the strategy wallet (indexed transfers only). */ + @Field(() => String) + net_wallet_usdc_transfers_raw!: string; + + @Field(() => String) + sum_extended_deposits_quantized!: string; + + @Field(() => String) + sum_extended_trades_value!: string; + + @Field(() => String) + sum_extended_trades_fee!: string; + + /** Baseline VA USDC in raw 6-decimal units (not indexed; from args or env). */ + @Field(() => String) + baseline_va_usdc_raw!: string; + + /** Baseline wallet USDC in raw 6-decimal units (not indexed). */ + @Field(() => String) + baseline_wallet_usdc_raw!: string; + + /** Baseline Extended “free” USDC in Extended deposit quanta (not indexed). */ + @Field(() => String) + baseline_extended_free_quantized!: string; + + /** baseline_va_usdc_raw + net_usdc_transfers_raw (estimated VA-side USDC). */ + @Field(() => String) + va_usdc_raw_estimated!: string; + + /** baseline_wallet_usdc_raw + net_wallet_usdc_transfers_raw. */ + @Field(() => String) + wallet_usdc_raw_estimated!: string; + + /** baseline_extended_free_quantized + sum_extended_deposits_quantized. */ + @Field(() => String) + extended_deposits_quantized_estimated!: string; +} + +type CapitalBaselineJsonEntry = { + vaUsdcRaw?: string; + walletUsdcRaw?: string; + extendedFreeQuantized?: string; +}; + +function loadCapitalBaselinesByStrategy(): Record | null { + const raw = process.env.VESU_EXTENDED_CAPITAL_BASELINES?.trim(); + if (!raw) return null; + try { + const o = JSON.parse(raw) as Record; + return o && typeof o === "object" ? o : null; + } catch { + return null; + } +} + +function parseBigintString(v: string | null | undefined): bigint | null { + if (v == null) return null; + const t = v.trim(); + if (t === "") return null; + try { + return BigInt(t); + } catch { + return null; + } +} + +/** + * Resolution order per field: non-empty GraphQL arg → VESU_EXTENDED_CAPITAL_BASELINES[strategy_id] → global env → 0. + */ +function resolveCapitalBaselines( + jsonRow: CapitalBaselineJsonEntry | undefined, + args: { + initial_va_usdc_raw?: string | null; + initial_wallet_usdc_raw?: string | null; + initial_extended_free_quantized?: string | null; + }, +): { va: bigint; wallet: bigint; extendedQ: bigint } { + const va = + parseBigintString(args.initial_va_usdc_raw) ?? + parseBigintString(jsonRow?.vaUsdcRaw) ?? + parseBigintString(process.env.VESU_EXTENDED_INITIAL_VA_USDC_RAW) ?? + 0n; + const wallet = + parseBigintString(args.initial_wallet_usdc_raw) ?? + parseBigintString(jsonRow?.walletUsdcRaw) ?? + parseBigintString(process.env.VESU_EXTENDED_INITIAL_WALLET_USDC_RAW) ?? + 0n; + const extendedQ = + parseBigintString(args.initial_extended_free_quantized) ?? + parseBigintString(jsonRow?.extendedFreeQuantized) ?? + parseBigintString( + process.env.VESU_EXTENDED_INITIAL_EXTENDED_FREE_QUANTIZED, + ) ?? + 0n; + return { va, wallet, extendedQ }; +} + +function sortKeyTs(ts: number, block: number, tx: number, ev: number): number { + if (ts > 0) return ts; + return block * 1_000_000 + tx * 1000 + ev; +} + +/** Parse API decimal string to micro-units (6 dp) for integer aggregation. */ +function decimalToMicros(s: string): bigint { + const t = s.trim(); + if (!t) return 0n; + const [whole, frac = ""] = t.split("."); + const w = BigInt(whole || "0"); + const f = (frac + "000000").slice(0, 6); + return w * 1_000_000n + BigInt(f || "0"); +} + +@Resolver() +export class VesuExtendedVaultOpsResolver { + @Query(() => [VesuExtendedTimelineEntry]) + async vesuExtendedVaultOpsTimeline( + @Arg("strategy_id", () => String) strategy_id: string, + @Arg("limit", () => Int, { defaultValue: 200 }) limit: number, + ): Promise { + const sid = strategy_id.trim(); + const profile = getVesuExtendedIndexerProfiles().find( + (p) => p.strategyId === sid, + ); + + const [ + transfers, + modifies, + deposits, + trades, + ] = await Promise.all([ + prisma.vesu_extended_usdc_transfers.findMany({ + where: { strategy_id: sid }, + orderBy: [ + { block_number: "desc" }, + { tx_index: "desc" }, + { event_index: "desc" }, + ], + take: limit, + }), + prisma.vesu_extended_modify_position.findMany({ + where: { strategy_id: sid }, + orderBy: [ + { block_number: "desc" }, + { tx_index: "desc" }, + { event_index: "desc" }, + ], + take: limit, + }), + prisma.vesu_extended_core_deposits.findMany({ + where: { strategy_id: sid }, + orderBy: [ + { block_number: "desc" }, + { tx_index: "desc" }, + { event_index: "desc" }, + ], + take: limit, + }), + prisma.extended_trades.findMany({ + where: { strategy_id: sid }, + orderBy: { created_time: "desc" }, + take: limit, + }), + ]); + + const modifyTxHashes = [...new Set(modifies.map((m) => m.tx_hash))]; + const [multiplyLevers, ekuboSwaps] = + modifyTxHashes.length === 0 + ? [[], []] + : await Promise.all([ + prisma.vesu_extended_multiply_lever.findMany({ + where: { + strategy_id: sid, + tx_hash: { in: modifyTxHashes }, + }, + }), + prisma.vesu_extended_ekubo_swapped.findMany({ + where: { + strategy_id: sid, + tx_hash: { in: modifyTxHashes }, + }, + }), + ]); + + const out: VesuExtendedTimelineEntry[] = []; + + for (const r of transfers) { + out.push({ + source: "usdc_transfer", + timestamp: r.timestamp, + tx_hash: r.tx_hash, + block_number: r.block_number, + detail_json: JSON.stringify({ + flow_type: r.flow_type, + from_address: r.from_address, + to_address: r.to_address, + amount: r.amount, + tx_hash: r.tx_hash, + block_number: r.block_number, + }), + }); + } + for (const r of modifies) { + out.push({ + source: "vesu_modify_position", + timestamp: r.timestamp, + tx_hash: r.tx_hash, + block_number: r.block_number, + detail_json: JSON.stringify( + buildVesuModifyDetailJson( + r, + multiplyLevers, + ekuboSwaps, + profile, + modifies, + ), + ), + }); + } + for (const r of deposits) { + out.push({ + source: "extended_deposit", + timestamp: r.timestamp, + tx_hash: r.tx_hash, + block_number: r.block_number, + detail_json: JSON.stringify({ + quantized_amount: r.quantized_amount, + collateral_id: r.collateral_id, + }), + }); + } + for (const r of trades) { + const ms = Number(r.created_time); + const tsSec = Number.isFinite(ms) ? Math.floor(ms / 1000) : 0; + out.push({ + source: "extended_trade", + timestamp: tsSec, + tx_hash: null, + block_number: null, + detail_json: JSON.stringify({ + trade_id: r.trade_id, + market: r.market, + side: r.side, + qty: r.qty, + value: r.value, + fee: r.fee, + price: r.price, + trade_type: r.trade_type, + created_time: r.created_time, + }), + }); + } + + out.sort((a, b) => { + const ka = sortKeyTs( + a.timestamp, + a.block_number ?? 0, + 0, + 0, + ); + const kb = sortKeyTs( + b.timestamp, + b.block_number ?? 0, + 0, + 0, + ); + return kb - ka; + }); + + return out.slice(0, limit); + } + + @Query(() => VesuExtendedUsdcSummary) + async vesuExtendedUsdcSummary( + @Arg("strategy_id", () => String) strategy_id: string, + @Arg("initial_va_usdc_raw", () => String, { nullable: true }) + initial_va_usdc_raw?: string | null, + @Arg("initial_wallet_usdc_raw", () => String, { nullable: true }) + initial_wallet_usdc_raw?: string | null, + @Arg("initial_extended_free_quantized", () => String, { nullable: true }) + initial_extended_free_quantized?: string | null, + ): Promise { + const sid = strategy_id.trim(); + const transfers = await prisma.vesu_extended_usdc_transfers.findMany({ + where: { strategy_id: sid }, + }); + + const profile = getVesuExtendedIndexerProfiles().find( + (p) => p.strategyId === sid, + ); + + const vaRaw = process.env.VESU_EXTENDED_VAULT_ALLOCATOR?.trim(); + const va = vaRaw + ? standariseAddress(vaRaw) + : profile?.va + ? standariseAddress(profile.va) + : ""; + + const wallet = profile?.wallet ? standariseAddress(profile.wallet) : ""; + + let net = 0n; + let netWallet = 0n; + for (const r of transfers) { + const amt = BigInt(r.amount || "0"); + const toVa = va && standariseAddress(r.to_address) === va; + const fromVa = va && standariseAddress(r.from_address) === va; + if (toVa && !fromVa) net += amt; + else if (fromVa && !toVa) net -= amt; + + const toW = wallet && standariseAddress(r.to_address) === wallet; + const fromW = wallet && standariseAddress(r.from_address) === wallet; + if (toW && !fromW) netWallet += amt; + else if (fromW && !toW) netWallet -= amt; + } + + const jsonMap = loadCapitalBaselinesByStrategy(); + const jsonRow = jsonMap?.[sid]; + const baseline = resolveCapitalBaselines(jsonRow, { + initial_va_usdc_raw, + initial_wallet_usdc_raw, + initial_extended_free_quantized, + }); + + const deposits = await prisma.vesu_extended_core_deposits.findMany({ + where: { strategy_id: sid }, + }); + let sumQ = 0n; + for (const d of deposits) { + sumQ += BigInt(d.quantized_amount || "0"); + } + + const trades = await prisma.extended_trades.findMany({ + where: { strategy_id: sid }, + }); + let sumVal = 0n; + let sumFee = 0n; + for (const t of trades) { + sumVal += decimalToMicros(t.value); + sumFee += decimalToMicros(t.fee); + } + + return { + net_usdc_transfers_raw: net.toString(), + net_wallet_usdc_transfers_raw: netWallet.toString(), + sum_extended_deposits_quantized: sumQ.toString(), + sum_extended_trades_value: sumVal.toString(), + sum_extended_trades_fee: sumFee.toString(), + baseline_va_usdc_raw: baseline.va.toString(), + baseline_wallet_usdc_raw: baseline.wallet.toString(), + baseline_extended_free_quantized: baseline.extendedQ.toString(), + va_usdc_raw_estimated: (baseline.va + net).toString(), + wallet_usdc_raw_estimated: (baseline.wallet + netWallet).toString(), + extended_deposits_quantized_estimated: (baseline.extendedQ + sumQ).toString(), + }; + } +} diff --git a/src/graphql/index.ts b/src/graphql/index.ts index b61bb4e..fb7dbf5 100644 --- a/src/graphql/index.ts +++ b/src/graphql/index.ts @@ -20,6 +20,7 @@ import { CustomHarvestsResolver } from "./customResolvers/harvestResolvers.ts"; import { CustomInvestmentFlowsResolver } from './customResolvers/customInvestmentsResolver.ts'; import { CustomPositionFeesResolver } from './customResolvers/last_24hr_fee_earned.ts'; import { EkuboVaultFlowsResolver } from './customResolvers/ekuboVaultFlows.ts'; +import { VesuExtendedVaultOpsResolver } from './customResolvers/vesuExtendedVaultOps.ts'; const prisma = new PrismaClient(); @@ -52,6 +53,7 @@ async function main() { CustomInvestmentFlowsResolver, CustomPositionFeesResolver, EkuboVaultFlowsResolver, + VesuExtendedVaultOpsResolver, FindFirstPricesResolver, FindFirstInvestment_flowsResolver, FindFirstSvk_alt_redemptionsResolver, diff --git a/src/standalone-scripts/poll-extended-trades.ts b/src/standalone-scripts/poll-extended-trades.ts new file mode 100644 index 0000000..93e1e06 --- /dev/null +++ b/src/standalone-scripts/poll-extended-trades.ts @@ -0,0 +1,237 @@ +/** + * Polls extended-server GET /api/v1/trades and upserts into extended_trades. + * Run with EXTENDED_BACKEND_URL_READ, optional INDEXER_API_KEY (matches server X-API-Key if set). + * Uses VESU_EXTENDED_STRATEGY_ID (default extended_usdc_test — matches VesuExtendedTestStrategies meta.id). Poll every 30s by default. + * Optional EXTENDED_TRADES_START_TIME: trades with createdTime before this are not saved (ISO-8601, unix seconds, or unix ms). + */ +import "dotenv/config"; +import { PrismaClient } from "@prisma/client"; + +const prisma = new PrismaClient(); +const POLL_MS = Number(process.env.EXTENDED_TRADES_POLL_MS ?? 30_000); +const LIMIT = Number(process.env.EXTENDED_TRADES_LIMIT ?? 50); +/** Set to "1" to page backward with pagination.cursor (historical backfill). Default: always fetch latest page. */ +const USE_CURSOR = process.env.EXTENDED_TRADES_USE_CURSOR === "1"; +const POLL_STATE_ID = "default"; +const STRATEGY_ID = + process.env.VESU_EXTENDED_STRATEGY_ID?.trim() || "extended_usdc_test_1"; + +/** + * Cutoff in epoch milliseconds (same unit as Extended trade createdTime). + * Unset = persist all trades returned by the API. + */ +function parseExtendedTradesStartTimeMs(): number | null { + const raw = + process.env.EXTENDED_TRADES_START_TIME_MS?.trim() || + process.env.EXTENDED_TRADES_START_TIME?.trim(); + if (!raw) return null; + if (/^\d{4}-\d{2}-\d{2}/.test(raw) || raw.includes("T")) { + const ms = Date.parse(raw); + return Number.isFinite(ms) ? ms : null; + } + const n = Number(raw); + if (!Number.isFinite(n)) return null; + // Heuristic: unix seconds are ~1e9–1e10; ms since 2001 are ~1e12+ + if (n > 0 && n < 1e12) return Math.trunc(n * 1000); + return Math.trunc(n); +} + +const TRADES_START_TIME_MS = parseExtendedTradesStartTimeMs(); + +type TradeRow = { + id: string; + accountId: string; + market: string; + orderId: string; + externalId?: string; + side: string; + price: string; + qty: string; + value: string; + fee: string; + tradeType: string; + createdTime: number; + isTaker: boolean; +}; + +type TradesResponse = { + status: string; + data?: TradeRow[]; + pagination?: { cursor?: number; count?: number }; +}; + +/** JSON.parse loses precision for uint64 ids; quote id / orderId before parse. */ +function parseTradesJson(text: string): TradesResponse { + const patched = text + .replace(/"id"\s*:\s*(\d+)(?=\s*[,}])/g, '"id":"$1"') + .replace(/"orderId"\s*:\s*(\d+)(?=\s*[,}])/g, '"orderId":"$1"') + .replace( + /"accountId"\s*:\s*(\d+)(?=\s*[,}])/g, + '"accountId":"$1"', + ); + return JSON.parse(patched) as TradesResponse; +} + +async function fetchTrades(cursor?: number): Promise { + const base = process.env.EXTENDED_BACKEND_URL_READ?.replace(/\/$/, ""); + if (!base) { + throw new Error("EXTENDED_BACKEND_URL_READ is required"); + } + const url = new URL(`${base}/api/v1/trades`); + url.searchParams.set("limit", String(LIMIT)); + if (cursor != null) url.searchParams.set("cursor", String(cursor)); + + const headers: Record = { + "User-Agent": "strkfarm-indexers-poll/1.0", + }; + const apiKey = + process.env.INDEXER_API_KEY?.trim() || + process.env.EXTENDED_SERVER_API_KEY?.trim(); + if (apiKey) { + headers["X-API-Key"] = apiKey; + headers["X-Api-Key"] = apiKey; + } + + const res = await fetch(url.toString(), { headers }); + const text = await res.text(); + if (!res.ok) { + throw new Error(`trades HTTP ${res.status}: ${text}`); + } + return parseTradesJson(text); +} + +function normalizeTrade(row: Record): TradeRow { + const r = row as Record; + return { + id: String(r.id), + accountId: String(r.accountId ?? r.account_id ?? ""), + market: String(r.market ?? ""), + orderId: String(r.orderId ?? r.order_id ?? ""), + externalId: r.externalId ?? r.external_id, + side: String(r.side ?? ""), + price: String(r.price ?? ""), + qty: String(r.qty ?? ""), + value: String(r.value ?? ""), + fee: String(r.fee ?? ""), + tradeType: String(r.tradeType ?? r.trade_type ?? ""), + createdTime: Number(r.createdTime ?? r.created_time ?? 0), + isTaker: Boolean(r.isTaker ?? r.is_taker), + }; +} + +async function upsertTrades(rows: TradeRow[]): Promise { + const now = Math.floor(Date.now() / 1000); + for (const t of rows) { + await prisma.extended_trades.upsert({ + where: { trade_id: t.id }, + create: { + trade_id: t.id, + strategy_id: STRATEGY_ID, + account_id: t.accountId, + market: t.market, + order_id: t.orderId, + external_id: t.externalId ?? null, + side: t.side, + price: String(t.price), + qty: String(t.qty), + value: String(t.value), + fee: String(t.fee), + trade_type: t.tradeType, + created_time: String(t.createdTime), + is_taker: t.isTaker, + synced_at: now, + }, + update: { + market: t.market, + order_id: t.orderId, + external_id: t.externalId ?? null, + side: t.side, + price: String(t.price), + qty: String(t.qty), + value: String(t.value), + fee: String(t.fee), + trade_type: t.tradeType, + created_time: String(t.createdTime), + is_taker: t.isTaker, + synced_at: now, + }, + }); + } +} + +async function pollOnce(): Promise { + let cursor: number | undefined; + if (USE_CURSOR) { + const state = await prisma.extended_trades_poll_state.findUnique({ + where: { id: POLL_STATE_ID }, + }); + cursor = state?.last_cursor ? Number(state.last_cursor) : undefined; + } + + const body = await fetchTrades(cursor); + if (body.status !== "OK" && body.status !== "ok") { + console.warn("[trades] non-OK status:", body); + } + const data = body.data ?? []; + if (data.length) { + const normalized = data.map(normalizeTrade); + const toSave = + TRADES_START_TIME_MS == null + ? normalized + : normalized.filter((t) => t.createdTime >= TRADES_START_TIME_MS); + const skipped = normalized.length - toSave.length; + if (skipped > 0 && TRADES_START_TIME_MS != null) { + console.log( + `[trades] skipped ${skipped} trade(s) before start cutoff (${new Date(TRADES_START_TIME_MS).toISOString()})`, + ); + } + if (toSave.length) { + await upsertTrades(toSave); + console.log(`[trades] upserted ${toSave.length} rows`); + } + } + const now = Math.floor(Date.now() / 1000); + if (USE_CURSOR) { + const next = body.pagination?.cursor; + const state = await prisma.extended_trades_poll_state.findUnique({ + where: { id: POLL_STATE_ID }, + }); + await prisma.extended_trades_poll_state.upsert({ + where: { id: POLL_STATE_ID }, + create: { + id: POLL_STATE_ID, + last_cursor: next != null ? String(next) : null, + updated_at: now, + }, + update: { + last_cursor: next != null ? String(next) : state?.last_cursor ?? null, + updated_at: now, + }, + }); + } +} + +async function main(): Promise { + console.log( + `[trades] polling ${process.env.EXTENDED_BACKEND_URL_READ} every ${POLL_MS}ms`, + ); + if (TRADES_START_TIME_MS != null) { + console.log( + `[trades] start cutoff: only saving trades with createdTime >= ${TRADES_START_TIME_MS} (${new Date(TRADES_START_TIME_MS).toISOString()})`, + ); + } + // eslint-disable-next-line no-constant-condition + while (true) { + try { + await pollOnce(); + } catch (e) { + console.error("[trades] poll error:", e); + } + await new Promise((r) => setTimeout(r, POLL_MS)); + } +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); diff --git a/src/standalone-scripts/update-env-mainnet-block-and-extended-time.ts b/src/standalone-scripts/update-env-mainnet-block-and-extended-time.ts new file mode 100644 index 0000000..2745956 --- /dev/null +++ b/src/standalone-scripts/update-env-mainnet-block-and-extended-time.ts @@ -0,0 +1,66 @@ +/** + * Sets STARTING_BLOCK to Starknet mainnet latest block_number and + * EXTENDED_TRADES_START_TIME to Date.now() (epoch ms) in .env. + * + * Run from repo root: pnpm exec tsx src/standalone-scripts/update-env-mainnet-block-and-extended-time.ts + * Uses RPC_URL from .env if set; otherwise a public mainnet JSON-RPC endpoint. + * + * Optional: ENV_FILE=/path/to/.env to target a file other than ./.env (cwd-relative). + */ +import * as dotenv from "dotenv"; +import fs from "fs"; +import path from "path"; +import { RpcProvider } from "starknet"; + +/** Used when RPC_URL is unset (Blast public RPC was retired). */ +const DEFAULT_MAINNET_RPC = "https://starknet-rpc.publicnode.com"; + +function upsertEnvLine(contents: string, key: string, value: string): string { + const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const re = new RegExp(`^${escaped}=.*$`, "m"); + const line = `${key}=${value}`; + if (re.test(contents)) { + return contents.replace(re, line); + } + const base = contents.replace(/\s*$/, ""); + return base.length ? `${base}\n${line}\n` : `${line}\n`; +} + +async function main() { + const envFile = + process.env.ENV_FILE?.trim() || path.join(process.cwd(), ".env"); + dotenv.config({ path: envFile }); + + const rpcUrl = process.env.RPC_URL?.trim() || DEFAULT_MAINNET_RPC; + const provider = new RpcProvider({ nodeUrl: rpcUrl }); + const block = await provider.getBlock("latest"); + const blockNumber = block.block_number; + if (typeof blockNumber !== "number" || !Number.isFinite(blockNumber)) { + throw new Error("getBlock(latest) returned invalid block_number"); + } + + const nowMs = Date.now(); + let raw = fs.existsSync(envFile) + ? fs.readFileSync(envFile, "utf8") + : ""; + + if (/^EXTENDED_TRADES_START_TIME_MS=/m.test(raw)) { + console.warn( + "[update-env] .env defines EXTENDED_TRADES_START_TIME_MS; it overrides EXTENDED_TRADES_START_TIME in poll-extended-trades. Remove _MS if you want the new EXTENDED_TRADES_START_TIME to apply.", + ); + } + + raw = upsertEnvLine(raw, "STARTING_BLOCK", String(blockNumber)); + raw = upsertEnvLine(raw, "EXTENDED_TRADES_START_TIME", String(nowMs)); + + fs.writeFileSync(envFile, raw, "utf8"); + const rpcLabel = rpcUrl === DEFAULT_MAINNET_RPC ? "default public" : "RPC_URL"; + console.log( + `[update-env] Wrote ${path.resolve(envFile)}: STARTING_BLOCK=${blockNumber} EXTENDED_TRADES_START_TIME=${nowMs} (rpc=${rpcLabel})`, + ); +} + +main().catch((e) => { + console.error(e); + process.exit(1); +}); From a7c4d476023e2d9cf3d5a46a1e21158145ed4986 Mon Sep 17 00:00:00 2001 From: akiraonstarknet Date: Tue, 26 May 2026 13:09:39 +0530 Subject: [PATCH 2/2] switch usdc<>uSDC.e in migsql --- .../migration.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/prisma/migrations/20250920141159_add_investment_info_in_quote_token/migration.sql b/prisma/migrations/20250920141159_add_investment_info_in_quote_token/migration.sql index ecb8323..e223813 100644 --- a/prisma/migrations/20250920141159_add_investment_info_in_quote_token/migration.sql +++ b/prisma/migrations/20250920141159_add_investment_info_in_quote_token/migration.sql @@ -36,13 +36,13 @@ BEGIN -- if v2 usdc, use price of v1 usdc -- ! to make it dynamic later - IF _quote_asset = '0x33068f6539f8e6e6b131e6b2b814e6c34a5224bc66947c47dab9dfee93b35fb' THEN - _quote_asset = '0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8'; + IF _quote_asset = '0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8' THEN + _quote_asset = '0x33068f6539f8e6e6b131e6b2b814e6c34a5224bc66947c47dab9dfee93b35fb'; END IF; -- if v2 usdc, use price of v1 usdc - IF _asset = '0x33068f6539f8e6e6b131e6b2b814e6c34a5224bc66947c47dab9dfee93b35fb' THEN - _asset = '0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8'; + IF _asset = '0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8' THEN + _asset = '0x33068f6539f8e6e6b131e6b2b814e6c34a5224bc66947c47dab9dfee93b35fb'; END IF; IF _asset = _quote_asset THEN