Agent skill
gdex-portfolio
Cross-chain portfolio overview, chain-specific token balances, and paginated trade history
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/other/other/gdex-portfolio
SKILL.md
GDEX: Portfolio & Balances
Query cross-chain portfolio summaries, chain-specific balances, and trade history.
When to Use
- Getting a user's total portfolio value across all chains
- Checking token balances on a specific chain
- Retrieving trade history with pagination and filters
Prerequisites
@gdexsdk/gdex-skillinstalled- Authenticated via
loginWithApiKey()— see gdex-authentication
Cross-Chain Portfolio
WARNING (Live-Tested): The high-level
getPortfolio()andgetBalances()methods sendwalletAddress+chainto the backend, but the backend expectsuserId+chainId+data(encrypted session key). These methods return empty or incorrect results. Use the raw client workaround below.
Correct Way — Raw Client (Live-Tested, Works)
import { GdexSkill, GDEX_API_KEY_PRIMARY, buildGdexUserSessionData } from '@gdexsdk/gdex-skill';
const skill = new GdexSkill();
skill.loginWithApiKey(GDEX_API_KEY_PRIMARY);
// Build encrypted session data
const data = buildGdexUserSessionData(sessionKey, GDEX_API_KEY_PRIMARY);
// Portfolio — use raw client with correct params
const portfolio = await skill.client.get('/v1/portfolio', {
params: {
userId: controlAddress, // control wallet, NOT managed
chainId: 622112261, // numeric Solana chain ID
data, // encrypted session key
}
});
Incorrect Way — High-Level Methods (SDK Bug)
// ❌ These send wrong params to backend — DO NOT USE for managed custody
const portfolio = await skill.getPortfolio({ walletAddress: '0x...', chain: 'solana' });
const balances = await skill.getBalances({ walletAddress: '0x...', chain: 8453 });
Portfolio Response
interface Portfolio {
totalValueUsd: number;
balances: Balance[];
perpPositions?: PerpPosition[];
realizedPnl?: number;
unrealizedPnl?: number;
totalPnl?: number;
}
interface Balance {
tokenAddress: string;
symbol: string;
name: string;
decimals: number;
rawBalance: string;
balance: string; // human-readable
usdValue: number;
priceUsd: number;
change24h?: number;
chain: string | number;
}
Chain-Specific Balances
WARNING (Live-Tested): Same issue as portfolio — use raw client:
const balances = await skill.client.get('/v1/balances', {
params: {
userId: controlAddress,
chainId: 622112261, // numeric chain ID
data, // encrypted session key
}
});
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
walletAddress |
string |
Yes | Wallet address to query |
chain |
string | ChainId |
Yes | Chain to query balances on |
tokenAddress |
string |
No | Filter to a specific token |
Trade History
WARNING (Live-Tested): The backend expects param
user(NOTuserId), and managed Solana chainId for trade history is900(NOT622112261). Use the raw client:
const history = await skill.client.get('/v1/user_trade_history', {
params: {
user: controlAddress, // NOTE: "user", not "userId"
chainId: 900, // NOTE: 900 for Solana trade history, not 622112261
data, // encrypted session key
page: 1,
limit: 20,
}
});
The high-level
getTradeHistory()sends wrong param names. Use raw client above.
Trade Record
interface TradeRecord {
id: string;
type: string; // 'buy' | 'sell'
inputToken: string;
outputToken: string;
amountIn: string;
amountOut: string;
usdValue?: number;
chain: string | number;
dex?: string;
txHash: string;
timestamp: number;
status: string;
}
Example: Portfolio Dashboard (Autonomous Agent — Live-Tested)
import { GdexSkill, GDEX_API_KEY_PRIMARY, buildGdexUserSessionData } from '@gdexsdk/gdex-skill';
const skill = new GdexSkill();
skill.loginWithApiKey(GDEX_API_KEY_PRIMARY);
// Build encrypted session data (required for all portfolio/balance/history queries)
const data = buildGdexUserSessionData(sessionKey, GDEX_API_KEY_PRIMARY);
const userId = controlAddress; // control wallet, NOT managed
// 1. Get portfolio (raw client — high-level method has wrong params)
const portfolio = await skill.client.get('/v1/portfolio', {
params: { userId, chainId: 622112261, data }
});
// 2. Get balances
const balances = await skill.client.get('/v1/balances', {
params: { userId, chainId: 622112261, data }
});
// 3. Get trade history (use "user" param, chainId 900 for Solana)
const history = await skill.client.get('/v1/user_trade_history', {
params: { user: userId, chainId: 900, data, page: 1, limit: 20 }
});
Autonomous Agent Notes
- Always use raw client for portfolio, balances, and trade history. The high-level SDK methods send incorrect parameter names.
- Portfolio/balances chainId: Use
622112261for Solana, standard EVM chain IDs for others. - Trade history chainId: Use
900for Solana (not622112261). This is a backend quirk. - Trade history param: Use
user(notuserId) — backend expects different param name for this endpoint. - Data param: Always pass the encrypted session key from
buildGdexUserSessionData(). - userId: Always use the control wallet address, never the managed address.
Related Skills
- gdex-authentication — Auth setup required for portfolio queries
- gdex-spot-trading — Execute trades based on portfolio analysis
- gdex-perp-trading — View perp positions in portfolio
- gdex-token-discovery — Research tokens found in portfolio
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
Didn't find tool you were looking for?