diff --git a/src/Managing.Application/Bots/TradingBot.cs b/src/Managing.Application/Bots/TradingBot.cs index 27fb440..0373da8 100644 --- a/src/Managing.Application/Bots/TradingBot.cs +++ b/src/Managing.Application/Bots/TradingBot.cs @@ -727,7 +727,8 @@ public class TradingBot : Bot, ITradingBot { await LogInformation($"Position {signalIdentifier} is now {positionStatus}"); Positions.First(p => p.SignalIdentifier == signalIdentifier).Status = positionStatus; - SetSignalStatus(signalIdentifier, SignalStatus.Expired); + SetSignalStatus(signalIdentifier, + positionStatus == PositionStatus.Filled ? SignalStatus.PositionOpen : SignalStatus.Expired); } private void SetSignalStatus(string signalIdentifier, SignalStatus signalStatus) diff --git a/src/Managing.Web3Proxy/src/plugins/custom/privy.ts b/src/Managing.Web3Proxy/src/plugins/custom/privy.ts index 586c448..139d7a4 100644 --- a/src/Managing.Web3Proxy/src/plugins/custom/privy.ts +++ b/src/Managing.Web3Proxy/src/plugins/custom/privy.ts @@ -1,23 +1,22 @@ import fp from 'fastify-plugin' -import {FastifyReply, FastifyRequest, FastifyInstance} from 'fastify' +import {FastifyInstance, FastifyReply, FastifyRequest} from 'fastify' import {z} from 'zod' import canonicalize from 'canonicalize' import crypto from 'crypto' import {PrivyClient} from '@privy-io/server-auth' import {ethers} from 'ethers' import dotenv from 'dotenv' +import Token from '../../generated/gmxsdk/abis/Token.json' with {type: 'json'} +import {ARBITRUM} from '../../generated/gmxsdk/configs/chains.js' +import {TOKENS} from '../../generated/gmxsdk/configs/tokens.js' +import {CONTRACTS} from '../../generated/gmxsdk/configs/contracts.js' +import {getClientForAddress, getTokenDataFromTicker} from './gmx.js' +import {Ticker} from '../../generated/ManagingApiTypes.js' +import {Address} from 'viem' // Load environment variables dotenv.config() -import Token from '../../generated/gmxsdk/abis/Token.json' with { type: 'json' } -import { ARBITRUM } from '../../generated/gmxsdk/configs/chains.js' -import { TOKENS } from '../../generated/gmxsdk/configs/tokens.js' -import { CONTRACTS } from '../../generated/gmxsdk/configs/contracts.js' -import { getClientForAddress, getTokenDataFromTicker } from './gmx.js' -import { Ticker } from '../../generated/ManagingApiTypes.js' -import { Address } from 'viem' - /** * Privy Plugin * @@ -72,7 +71,7 @@ export const getPrivyClient = (fastify?: FastifyInstance): PrivyClient => { walletApi: { authorizationPrivateKey: authKey } - } + }, ); }; diff --git a/src/Managing.WebApp/src/components/organism/Trading/Summary.tsx b/src/Managing.WebApp/src/components/organism/Trading/Summary.tsx index 021531d..6242c01 100644 --- a/src/Managing.WebApp/src/components/organism/Trading/Summary.tsx +++ b/src/Managing.WebApp/src/components/organism/Trading/Summary.tsx @@ -1,9 +1,13 @@ -import { ArrowDownIcon, ArrowUpIcon } from '@heroicons/react/solid' -import React, { useEffect, useState } from 'react' +import {ArrowDownIcon, ArrowUpIcon} from '@heroicons/react/solid' +import React, {useEffect, useState} from 'react' -import type { TradingBot } from '../../../generated/ManagingApi' -import { PositionStatus, TradeDirection } from '../../../generated/ManagingApi' -import type { IAccountBalanceProps } from '../../../global/type' +import useApiUrlStore from '../../../app/store/apiStore' +import type {PlatformSummaryViewModel, TradingBot} from '../../../generated/ManagingApi' +import {DataClient, PositionStatus, TradeDirection} from '../../../generated/ManagingApi' +import type {IAccountBalanceProps} from '../../../global/type' + +// Time filter options matching backend +const TIME_FILTERS = ['24H', '3D', '1W', '1M', '1Y', 'Total'] function GetGlobalWinrate(bots: TradingBot[]) { if (bots == null || bots == undefined || bots.length == 0) { @@ -55,6 +59,9 @@ function GetPositionCount( const Summary: React.FC = ({ bots }) => { const [globalPnl, setGlobalPnl] = useState(0) const [globalWinrate, setGlobalWinrate] = useState(0) + const [selectedTimeFilter, setSelectedTimeFilter] = useState('Total') + const [platformStats, setPlatformStats] = useState(null) + const [isLoading, setIsLoading] = useState(false) const [openLong, setLong] = useState(0) const [openShort, setShort] = useState(0) @@ -62,6 +69,8 @@ const Summary: React.FC = ({ bots }) => { const [closedLong, setClosedLong] = useState(0) const [closedShort, setClosedShort] = useState(0) + const { apiUrl } = useApiUrlStore() + useEffect(() => { if (bots) { const pnl = bots.reduce((acc, bot) => { @@ -86,9 +95,67 @@ const Summary: React.FC = ({ bots }) => { } }, [bots]) + // Fetch platform summary data + useEffect(() => { + const fetchPlatformStats = async () => { + setIsLoading(true) + try { + const dataClient = new DataClient({}, apiUrl) + const data = await dataClient.data_GetPlatformSummary(selectedTimeFilter) + setPlatformStats(data) + } catch (error) { + console.error('Error fetching platform stats:', error) + } finally { + setIsLoading(false) + } + } + + fetchPlatformStats() + }, [apiUrl, selectedTimeFilter]) + return (
-
+
+

Platform Overview

+
+ {TIME_FILTERS.map((filter) => ( + + ))} +
+
+ +
+
+
Total Agents
+
{platformStats?.totalAgents ?? 0}
+
+ +
+
Active Strategies
+
{platformStats?.totalActiveStrategies ?? 0}
+
+ +
+
Total Platform PnL
+
{(platformStats?.totalPlatformPnL ?? 0).toFixed(2)} $
+
+ +
+
Volume (Total)
+
{(platformStats?.totalPlatformVolume ?? 0).toFixed(2)} $
+
+ +
+
Volume (24h)
+
{(platformStats?.totalPlatformVolumeLast24h ?? 0).toFixed(2)} $
+
+