{"openapi":"3.0.0","paths":{"/":{"get":{"operationId":"AppController_getWelcome","parameters":[],"responses":{"200":{"description":""}},"summary":"Welcome message","tags":["general"]}},"/health":{"get":{"operationId":"AppController_getHealth","parameters":[],"responses":{"200":{"description":""}},"summary":"Health check endpoint","tags":["general"]}},"/aggregator/quote":{"get":{"description":"Returns a single-source quote by default. If multiple sources are provided, returns aggregated multi-source results.","operationId":"AggregatorController_getQuote","parameters":[{"name":"admin","required":false,"in":"query","description":"EVM only. Spread fee recipient address. Ignored for Solana.","schema":{}},{"name":"spreadDirection","required":false,"in":"query","description":"EVM only. Spread direction: input or output. Ignored for Solana.","schema":{"enum":["input","output"],"type":"string"}},{"name":"spread","required":false,"in":"query","description":"EVM only. Aggregator fee in BIPS passed upstream. Ignored for Solana.","schema":{}},{"name":"slippage","required":false,"in":"query","description":"Slippage in BIPS.","schema":{}},{"name":"taker","required":false,"in":"query","description":"Wallet address. Required by some providers such as OKX.","schema":{}},{"name":"amount","required":true,"in":"query","description":"Input amount in base units.","schema":{}},{"name":"toTokenAddress","required":true,"in":"query","description":"Output token contract address.","schema":{}},{"name":"fromTokenAddress","required":true,"in":"query","description":"Input token contract address.","schema":{}},{"name":"chainId","required":false,"in":"query","description":"Chain: Base `8453` / `base`, or Solana `solana` (JUPITER, RAYDIUM, OKX).","schema":{}},{"name":"aggregators","required":false,"in":"query","description":"Alias for source.","schema":{}},{"name":"services","required":false,"in":"query","description":"Alias for source.","schema":{}},{"name":"service","required":false,"in":"query","description":"Alias for source.","schema":{}},{"name":"source","required":false,"in":"query","description":"Source filter. Single or comma-separated (e.g. ZEROX,OPENOCEAN,JUPITER,RAYDIUM,OKX).","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get quote from one or many aggregators","tags":["aggregator"]}},"/aggregator/quote/all":{"get":{"description":"Queries all enabled sources in parallel. Optional source filters can restrict the queried set.","operationId":"AggregatorController_getAllQuotes","parameters":[{"name":"admin","required":false,"in":"query","description":"EVM only. Spread fee recipient address. Ignored for Solana.","schema":{}},{"name":"spreadDirection","required":false,"in":"query","description":"EVM only. Spread direction: input or output. Ignored for Solana.","schema":{"enum":["input","output"],"type":"string"}},{"name":"spread","required":false,"in":"query","description":"EVM only. Aggregator fee in BIPS passed upstream. Ignored for Solana.","schema":{}},{"name":"slippage","required":false,"in":"query","description":"Slippage in BIPS.","schema":{}},{"name":"taker","required":false,"in":"query","description":"Wallet address. Required by some providers such as OKX.","schema":{}},{"name":"amount","required":true,"in":"query","description":"Input amount in base units.","schema":{}},{"name":"toTokenAddress","required":true,"in":"query","description":"Output token contract address.","schema":{}},{"name":"fromTokenAddress","required":true,"in":"query","description":"Input token contract address.","schema":{}},{"name":"chainId","required":false,"in":"query","description":"Chain: Base `8453` / `base`, or Solana `solana` (JUPITER, RAYDIUM, OKX).","schema":{}},{"name":"aggregators","required":false,"in":"query","description":"Alias for source.","schema":{}},{"name":"services","required":false,"in":"query","description":"Alias for source.","schema":{}},{"name":"service","required":false,"in":"query","description":"Alias for source.","schema":{}},{"name":"source","required":false,"in":"query","description":"Optional source filter. Single or comma-separated (ZEROX,OPENOCEAN,JUPITER,RAYDIUM,OKX).","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get aggregated quotes from all enabled aggregators","tags":["aggregator"]}},"/dca/orders":{"get":{"operationId":"DcaController_getAllOrders","parameters":[],"responses":{"200":{"description":"Returns all DCA orders from the contract"}},"summary":"Get all DCA orders","tags":["dca"]}},"/dca/orders/user/{address}":{"get":{"operationId":"DcaController_getOrdersByUser","parameters":[{"name":"address","required":true,"in":"path","description":"User wallet address","schema":{"example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb3","type":"string"}}],"responses":{"200":{"description":"Returns all orders for the specified user address"}},"summary":"Get orders for a specific user","tags":["dca"]}},"/token/overview":{"get":{"description":"Fetches a simplified token overview from Birdeye for a single token address.","operationId":"TokenOverviewController_getOverview","parameters":[{"name":"enhanced","required":false,"in":"query","description":"When `true` (default for the single endpoint), Birdeye is queried and the result is enhanced with DexScreener data. When `false`, the response is built from DexScreener only (faster, no Birdeye CU cost).","schema":{"type":"boolean","default":true}},{"name":"chain","required":false,"in":"query","description":"Alias for chainId. Same inference when both are omitted.","schema":{"type":"string","enum":["base","solana"]}},{"name":"chainId","required":false,"in":"query","description":"Birdeye chain (e.g. base, solana, 8453, 501474; legacy 101 → solana). Preferred over `chain`. When both are omitted, inferred from `address` for EVM vs Solana when recognizable; otherwise base.","schema":{"type":"string","enum":["base","solana"]}},{"name":"address","required":true,"in":"query","description":"Token contract address","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get token overview","tags":["token"]}},"/token/overview/batch":{"post":{"description":"Returns token overviews for the given addresses. Uses cache when available; only calls upstream providers for uncached or expired entries. Order of response matches input (after deduplication). Max 50 addresses. When `chainId`/`chain` are omitted, chain is inferred from the first address; remaining addresses must match that network or the request fails. By default the batch endpoint uses DexScreener only (cheap/fast); set `enhanced=true` to query Birdeye and merge DexScreener on top.","operationId":"TokenOverviewController_getOverviewsBatch","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenOverviewBatchDto"}}}},"responses":{"201":{"description":""}},"summary":"Get multiple token overviews","tags":["token"]}},"/token/chart":{"get":{"description":"Fetches token OHLCV chart data, registers the token with the watcher when the candle type supports live overlay, and overlays the watcher spot onto the latest candle close only when timeTo is within 60s of now (historic/pagination ranges keep Birdeye close). Applies preset defaults only when explicit query values are missing.","operationId":"TokenChartController_getChart","parameters":[{"name":"outlier","required":false,"in":"query","description":"Birdeye V3 outlier flag.","schema":{}},{"name":"padding","required":false,"in":"query","description":"Pad missing candles locally before returning the response. Defaults to true.","schema":{}},{"name":"uiAmountMode","required":false,"in":"query","description":"Birdeye V3 scaled UI amount mode: raw, scaled, or both.","schema":{}},{"name":"countLimit","required":false,"in":"query","description":"Only for mode=count. Maximum number of candles to return, up to 5000.","schema":{}},{"name":"mode","required":false,"in":"query","description":"Birdeye V3 mode. Use count to request candles around exactly one anchor timestamp.","schema":{}},{"name":"currency","required":false,"in":"query","description":"Quote currency. One of: usd, native. Defaults to usd.","schema":{}},{"name":"timeTo","required":false,"in":"query","description":"End time as unix timestamp in seconds. For custom range only (omit to use interval).","schema":{}},{"name":"timeFrom","required":false,"in":"query","description":"Start time as unix timestamp in seconds. For custom range only (omit to use interval).","schema":{}},{"name":"type","required":false,"in":"query","description":"Birdeye V3 candle size, including 1s. Optional for preset ranges, required for explicit ranges and count mode.","schema":{"type":"string","enum":["1s","15s","30s","1m","3m","5m","15m","30m","1H","2H","4H","6H","8H","12H","1D","3D","1W","1M"]}},{"name":"interval","required":false,"in":"query","description":"Preset range from current time. One of: 1h, 4h, 8h, 12h, 24h, 1w, 7d, 30d, 90d, 1y. Defaults to 24h only when no explicit time range is provided.","schema":{"type":"string","enum":["1h","4h","8h","12h","24h","1w","7d","30d","90d","1y"],"default":"24h"}},{"name":"pairAddress","required":false,"in":"query","description":"Pair contract address. When present, historical data is fetched from Birdeye OHLCV V3 Pair and mapped to the same response shape. If omitted, token overrides may provide pairAddressOverride automatically.","schema":{}},{"name":"chain","required":false,"in":"query","description":"Alias for chainId. Same fallbacks as chainId.","schema":{"type":"string","enum":["base","solana"]}},{"name":"chainId","required":false,"in":"query","description":"Birdeye chain (e.g. base, solana, 8453, 501474; legacy 101 → solana). Preferred over `chain`. When both chain fields are omitted, inferred from `address` for clear EVM (0x…) or Solana (base58 mint) shapes; otherwise defaults to base.","schema":{"type":"string","enum":["base","solana"]}},{"name":"address","required":true,"in":"query","description":"Token contract address","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get token chart","tags":["token"]}},"/token/marketcap":{"get":{"description":"Returns OHLC market cap candles by multiplying Birdeye price OHLC by cached current circulating supply resolved from Alchemy market data or on-chain ERC-20 totalSupply.","operationId":"TokenMarketcapController_getMarketcap","parameters":[{"name":"padding","required":false,"in":"query","description":"Passed through to /token/chart before market cap OHLC is derived. Defaults to true.","schema":{}},{"name":"timeTo","required":false,"in":"query","description":"End time as unix timestamp in seconds. For custom range only (omit to use interval).","schema":{}},{"name":"timeFrom","required":false,"in":"query","description":"Start time as unix timestamp in seconds. For custom range only (omit to use interval).","schema":{}},{"name":"alchemyInterval","required":false,"in":"query","description":"Optional Alchemy historical point interval override used only when deriving supply from Alchemy market data. One of: 5m, 1h, 1d.","schema":{"type":"string","enum":["5m","1h","1d"]}},{"name":"type","required":false,"in":"query","description":"Chart-compatible candle type accepted for query parity. Required for explicit timeFrom/timeTo ranges, same as /token/chart.","schema":{}},{"name":"interval","required":false,"in":"query","description":"Preset range from current time. Same values as /token/chart. Defaults to 24h only when no explicit time range is provided.","schema":{"type":"string","enum":["1h","4h","8h","12h","24h","1w","7d","30d","90d","1y"],"default":"24h"}},{"name":"chain","required":false,"in":"query","description":"Alias for chainId. Same fallbacks as chainId.","schema":{"type":"string","enum":["base","solana"]}},{"name":"chainId","required":false,"in":"query","description":"Token chain (e.g. base, solana, 8453, 501474; legacy 101 → solana). Preferred over `chain`. When omitted, inferred from `address` where possible; otherwise defaults to base.","schema":{"type":"string","enum":["base","solana"]}},{"name":"address","required":true,"in":"query","description":"Token contract address","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get token market cap chart","tags":["token"]}},"/token/list":{"get":{"description":"Fetches a paginated Birdeye token list using broad filters, plus 24h sort metrics, and registers returned token addresses with the in-memory watcher. Each item includes `chainId` (`8453` Base, `501474` Solana) and native `address`/`decimals` for that chain. **Solana**: when the deterministic Base wrapper is derivable offline, `hydrexSynth` carries the EVM `targetToken` (Base `8453`, decimals matching the Solana mint), name/symbol/logo mirrors, hub, and numeric `sourceChainId` (`501474` for Solana). **Solana memes:** `sort_by=memes` with `chainId=solana` ([Birdeye meme list](https://docs.birdeye.so/reference/get-defi-v3-token-meme-list)); use `meme_sort_by` for Birdeye meme sort fields (default `market_cap`).","operationId":"TokenListController_getList","parameters":[{"name":"limit","required":false,"in":"query","description":"Page size. Defaults to 20.","schema":{"type":"integer","default":20,"minimum":1,"maximum":100}},{"name":"offset","required":false,"in":"query","description":"Pagination offset. Defaults to 0.","schema":{"type":"integer","default":0,"minimum":0,"maximum":9999}},{"name":"min_holder","required":false,"in":"query","description":"Minimum holder count filter.","schema":{}},{"name":"max_last_trade_unix_time","required":false,"in":"query","description":"Maximum last trade unix timestamp.","schema":{}},{"name":"min_last_trade_unix_time","required":false,"in":"query","description":"Minimum last trade unix timestamp.","schema":{}},{"name":"max_recent_listing_time","required":false,"in":"query","description":"Maximum recent listing unix timestamp.","schema":{}},{"name":"min_recent_listing_time","required":false,"in":"query","description":"Minimum recent listing unix timestamp.","schema":{}},{"name":"max_fdv","required":false,"in":"query","description":"Maximum fully diluted valuation filter.","schema":{}},{"name":"min_fdv","required":false,"in":"query","description":"Minimum fully diluted valuation filter.","schema":{}},{"name":"max_market_cap","required":false,"in":"query","description":"Maximum market cap filter.","schema":{}},{"name":"min_market_cap","required":false,"in":"query","description":"Minimum market cap filter.","schema":{}},{"name":"max_liquidity","required":false,"in":"query","description":"Maximum liquidity filter.","schema":{}},{"name":"min_liquidity","required":false,"in":"query","description":"Minimum liquidity filter.","schema":{}},{"name":"max_volume_24h_usd","required":false,"in":"query","description":"Optional maximum 24h trading volume in USD. No default.","schema":{"type":"number","minimum":0}},{"name":"min_volume_24h_usd","required":false,"in":"query","description":"Minimum 24h trading volume in USD.","schema":{"type":"number","example":50000,"minimum":0}},{"name":"hide_stables","required":false,"in":"query","description":"When sort_by=hydrex-assets, popular, verified, or new, hides stable launchpad assets. Defaults to true.","schema":{"type":"boolean","default":true}},{"name":"rank","required":false,"in":"query","description":"When sort_by=rank, filter to only the token at this rank (e.g. 1 for #1 trending).","schema":{"type":"integer","minimum":1}},{"name":"sort_type","required":false,"in":"query","description":"Sort direction.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"meme_sort_by","required":false,"in":"query","description":"When `sort_by=memes`, passed to Birdeye as meme list `sort_by`. Defaults to `market_cap`.","schema":{"type":"string","enum":["progress_percent","graduated_time","creation_time","liquidity","market_cap","fdv","recent_listing_time","last_trade_unix_time","holder","volume_1m_usd","volume_5m_usd","volume_30m_usd","volume_1h_usd","volume_2h_usd","volume_4h_usd","volume_8h_usd","volume_24h_usd","volume_7d_usd","volume_30d_usd","volume_1m_change_percent","volume_5m_change_percent","volume_30m_change_percent","volume_1h_change_percent","volume_2h_change_percent","volume_4h_change_percent","volume_8h_change_percent","volume_24h_change_percent","volume_7d_change_percent","volume_30d_change_percent","price_change_1m_percent","price_change_5m_percent","price_change_30m_percent","price_change_1h_percent","price_change_2h_percent","price_change_4h_percent","price_change_8h_percent","price_change_24h_percent","price_change_7d_percent","price_change_30d_percent","trade_1m_count","trade_5m_count","trade_30m_count","trade_1h_count","trade_2h_count","trade_4h_count","trade_8h_count","trade_24h_count","trade_7d_count"]}},{"name":"sort_by","required":false,"in":"query","description":"Sort field for the token list. Send-backed selectors: `new` (`/assets/verified`, same as `verified` but **API order**, no MC sort), `popular` or legacy `hydrex-assets` (`/assets/popular`, API order), `verified` (`/assets/verified`, sorted by market cap desc), `bankr`, `ecosystem`, `clanker`, `rwas`, `solanaSynths` (`/synths/tokens`, API order; requires `chainId=solana`). Birdeye Solana memes: `memes` (requires `chainId=solana`).","schema":{"type":"string","enum":["liquidity","market_cap","fdv","recent_listing_time","last_trade_unix_time","holder","volume_24h_usd","volume_24h_change_percent","price_change_24h_percent","trade_24h_count","rank","new","hydrex-assets","popular","bankr","ecosystem","clanker","memes","rwas","verified","solanaSynths"]}},{"name":"chainId","required":false,"in":"query","description":"Target chain for the list (`base`, `solana`, or numeric `8453` / `501474`; legacy `101` still accepted). Defaults to base if omitted. Legacy clients may send the same value as `chain` instead; when both are present, `chainId` wins.","schema":{"type":"string","enum":["base","solana"]}}],"responses":{"200":{"description":""}},"summary":"Get token list","tags":["token"]}},"/token/watcher/price":{"get":{"description":"Registers tokens with the price watcher and returns flattened OHLCV fields (o, h, l, c, v, price) from Birdeye SUBSCRIBE_PRICE. Tokens are kept alive as long as they are requested within the last 30 seconds.","operationId":"TokenWatcherController_getWatchedPrices","parameters":[{"name":"chartType","required":false,"in":"query","description":"Optional Birdeye chart type for all requested tokens (for example 1m, 5m, 15m, 1H, 1D). Defaults to 5m.","schema":{}},{"name":"addresses","required":true,"in":"query","description":"Comma-separated token addresses.","schema":{}},{"name":"chain","required":false,"in":"query","description":"Birdeye chain. Defaults to the app default chain.","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get watched token OHLCV (price watcher)","tags":["token-watcher"]}},"/token/watcher/price/current":{"get":{"description":"Returns currently tracked tokens from the price watcher (SUBSCRIBE_PRICE) without refreshing subscriptions.","operationId":"TokenWatcherController_getWatcherState","parameters":[{"name":"chain","required":false,"in":"query","description":"Optional chain filter. If omitted, returns tracked tokens for all chains.","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get current price watcher state","tags":["token-watcher"]}},"/token/watcher/price/debug":{"get":{"description":"Returns per-socket and per-token price watcher internals, including subscription payloads, socket lifecycle timestamps, and websocket event activity.","operationId":"TokenWatcherController_getWatcherDebugState","parameters":[{"name":"chain","required":false,"in":"query","description":"Optional chain filter. If omitted, returns debug state for all tracked chains.","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get price watcher debug state","tags":["token-watcher"]}},"/token/watcher/trades/current":{"get":{"description":"Returns currently tracked token/pair targets from the trade watcher (SUBSCRIBE_TXS) without refreshing subscriptions.","operationId":"TokenWatcherController_getTradeWatcherState","parameters":[{"name":"chain","required":false,"in":"query","description":"Optional chain filter. If omitted, returns tracked targets for all chains.","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get current trade watcher state","tags":["token-watcher"]}},"/token/watcher/trades/debug":{"get":{"description":"Returns per-socket trade watcher internals: subscription payloads, socket status, message/trade counts, last event and errors.","operationId":"TokenWatcherController_getTradeWatcherDebugState","parameters":[{"name":"chain","required":false,"in":"query","description":"Optional chain filter. If omitted, returns debug state for all tracked chains.","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get trade watcher debug state","tags":["token-watcher"]}},"/token/trades":{"get":{"description":"Fetches swap trades for a token from Birdeye v3, registers the token in the trade watcher, and overlays the latest websocket swaps when available. Defaults to offset 0 and limit 20.","operationId":"TokenTradesController_getTrades","parameters":[{"name":"owner","required":false,"in":"query","description":"Filter by wallet address","schema":{}},{"name":"limit","required":false,"in":"query","description":"Page size. Defaults to 20.","schema":{"type":"integer","default":20,"minimum":1,"maximum":100}},{"name":"offset","required":false,"in":"query","description":"Pagination offset. Defaults to 0.","schema":{"type":"integer","default":0,"minimum":0,"maximum":9999}},{"name":"chain","required":false,"in":"query","description":"Alias for chainId. Same inference when both are omitted.","schema":{"type":"string","enum":["base","solana"]}},{"name":"chainId","required":false,"in":"query","description":"Birdeye chain (e.g. base, solana, 8453, 501474; legacy 101 → solana). Preferred over `chain`. When both are omitted, inferred from `address` when clearly EVM or Solana; otherwise base.","schema":{"type":"string","enum":["base","solana"]}},{"name":"address","required":true,"in":"query","description":"Token contract address","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get token trades","tags":["token"]}},"/token/search":{"get":{"description":"Matches mints via CDP `cdp_listSwapAssets` on Base (page 1 also merges matching Send Solana synths), or searches Send synth tokens when `chain=solana`. Metadata is filled with Birdeye (same path as enhanced overview, including DexScreener on top). Fallback: DexScreener-only if Birdeye fails. Verified (Send) first, then market cap descending. Chains: base, solana.","operationId":"TokenSearchController_search","parameters":[{"name":"search","required":true,"in":"query","description":"Substring to match against token name/symbol/address. Sent to CDP `cdp_listSwapAssets`.","schema":{"example":"so","type":"string"}},{"name":"chain","required":false,"in":"query","description":"Chain slug. `base` searches CDP swap assets and merges matching Send Solana synths. `solana` searches Send synth tokens only.","schema":{"default":"base","type":"string","enum":["base","solana"]}},{"name":"limit","required":false,"in":"query","description":"Page size (1–50). Defaults to 50.","schema":{"minimum":1,"maximum":50,"default":50,"type":"number"}},{"name":"page","required":false,"in":"query","description":"1-based page number. Defaults to 1.","schema":{"minimum":1,"default":1,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"Real-time token search","tags":["token"]}},"/token/token-security":{"get":{"description":"Proxy to Birdeye [token security](https://docs.birdeye.so/reference/get-defi-token_security). Binary flags are returned as booleans. `findings` is a severity-sorted list of issues for UI (use instead of reading every raw field).","operationId":"TokenSecurityController_getSecurity","parameters":[{"name":"address","required":true,"in":"query","description":"Token contract address","schema":{}}],"responses":{"200":{"description":""}},"summary":"Token security (Birdeye)","tags":["token"]}},"/token/holders":{"get":{"description":"Fetches Base ERC-20 holders from Moralis. Defaults to 20 holders; max 100. Use `cursor` for the next page.","operationId":"TokenHoldersController_getHolders","parameters":[{"name":"source","required":false,"in":"query","description":"Holder source. Defaults to moralis.","schema":{"type":"string","enum":["moralis"]}},{"name":"cursor","required":false,"in":"query","description":"Moralis pagination cursor from the previous response.","schema":{}},{"name":"limit","required":false,"in":"query","description":"Number of top holders to return. Defaults to 20.","schema":{"type":"integer","default":20,"minimum":1,"maximum":100}},{"name":"chain","required":false,"in":"query","description":"Alias for chainId. Only Base is currently supported.","schema":{"type":"string","enum":["base","solana"]}},{"name":"chainId","required":false,"in":"query","description":"Target chain. Only Base (`base` or `8453`) is supported for the current Moralis source.","schema":{"type":"string","enum":["base","solana"]}},{"name":"address","required":true,"in":"query","description":"Token contract address","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get token holders","tags":["token"]}},"/token/cache":{"get":{"operationId":"TokenCacheController_getCacheSnapshot","parameters":[{"name":"prefix","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["TokenCache"]}},"/token/cache/items":{"get":{"operationId":"TokenCacheController_getCacheItems","parameters":[{"name":"prefix","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["TokenCache"]}},"/token/cache/chart":{"get":{"operationId":"TokenCacheController_getChartCacheSnapshot","parameters":[],"responses":{"200":{"description":""}},"tags":["TokenCache"]}},"/multichain-auction/intent/buy":{"get":{"description":"**Settlement is entirely on Base.** `inputToken` = whitelisted symbol you lock on Base (`USDC`, …). `targetToken` = SPL mint you want to acquire. Solana is used only for the reference quote. Optional `wrappedOutputToken` overrides the hub-derived wrapped ERC-20.","operationId":"MultichainAuctionController_buildBuyIntent","parameters":[{"name":"quoteChainId","required":false,"in":"query","description":"Venue for `getQuote` only (Solana today). Does **not** change where the auction executes—always Base.","schema":{"type":"string","enum":["solana"],"default":"solana"}},{"name":"inputToken","required":true,"in":"query","description":"Whitelisted stable you lock on Base: symbol (`USDC`) or Base ERC-20 from the table. Backend resolves the Solana mint for the quote `fromToken`.","schema":{"type":"string","enum":["USDC","0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],"default":"USDC"}},{"name":"targetToken","required":true,"in":"query","description":"SPL mint (base58) of the asset you acquire — Solana quote `toToken`; determines the Hydrex wrapped ERC-20 `outputToken`.","schema":{"type":"string"}},{"name":"amount","required":true,"in":"query","description":"`inputToken` amount in its own base units (6 decimals for USDC).","schema":{"type":"string"}},{"name":"wrappedOutputToken","required":false,"in":"query","description":"Optional Base Hydrex-wrapped ERC-20 for router `outputToken`. Omit → `computeWrappedTokenAddress(targetToken)`.","schema":{"type":"string"}},{"name":"recipient","required":false,"in":"query","description":"Address on Base receiving wrapped SPL; omit or `0x0` to use the transaction sender.","schema":{"type":"string"}},{"name":"slippage","required":false,"in":"query","description":"Execution slippage in BIPS. Default is 50 (0.5%). Used to compute minOutputAmount (same as `/quote`).","schema":{"type":"string"}},{"name":"gasPrice","required":false,"in":"query","description":"Optional gas price hint in wei for upstream quote providers that support it.","schema":{"type":"string"}},{"name":"spreadDirection","required":false,"in":"query","description":"Aggregator fee direction for spread: `input` or `output` (passed through `/quote` normalization; some venues ignore on Solana).","schema":{"enum":["input","output"],"type":"string"}},{"name":"spread","required":false,"in":"query","description":"Aggregator fee in BIPS (mapped via `/quote` `normalizeQueryParams`; venue-dependent).","schema":{"type":"string"}},{"name":"admin","required":false,"in":"query","description":"Address that receives aggregator spread fees when used with `spread` (`normalizeQueryParams` → feeRecipient).","schema":{"type":"string"}},{"name":"origin","required":false,"in":"query","description":"Forwarded into `/quote` (Hydrex swap `origin`). Encoded as on-chain `createIntent(..., source)` on the auction router (default `hydrex`).","schema":{"type":"string"}},{"name":"reflectToken","required":false,"in":"query","description":"Forwarded into `/quote` Solana aggregator params (same as `/quote`; Kyber reflect bypass applies only on EVM there).","schema":{"type":"string"}},{"name":"source","required":false,"in":"query","description":"Filter quote sources (alias comma-separated ok); same semantics as `/quote`.","schema":{"type":"string"}},{"name":"service","required":false,"in":"query","description":"Alias for `source`.","schema":{"type":"string"}},{"name":"services","required":false,"in":"query","description":"Alias for `source`.","schema":{"type":"string"}},{"name":"aggregators","required":false,"in":"query","description":"Alias for `source`.","schema":{"type":"string"}},{"name":"auctionSeconds","required":false,"in":"query","description":"Dutch auction length in seconds (default 15, max 900).","schema":{"type":"string"}},{"name":"referral","required":false,"in":"query","description":"Partner/referral address used by Hydrex router for attribution (same normalization as `/quote`). Defaults to zero address.","schema":{"type":"string"}},{"name":"referralFeeBps","required":false,"in":"query","description":"Referral fee in BIPS: applied in the Solana quote leg (`DEFAULT_ROUTER_FEE_BPS` + this) and encoded on `createIntent`. Default 0.","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Buy intent: Base `createIntent` (lock USDC, receive wrapped SPL)","tags":["multichain-auction"]}},"/multichain-auction/intent/sell":{"get":{"description":"**Settlement is on Base** (you lock Hydrex-wrapped synthetic, filler sends the stable). **Solana** is only used for `getQuote` against the real SPL. `inputToken` = SPL mint you’re selling. `targetToken` = stable you receive: symbol (`USDC`) or Base ERC-20 (e.g. `0x833589...`). `amount` = wrapped lock size in the synthetic token’s base units, matching the SPL mint decimals.","operationId":"MultichainAuctionController_buildSellIntent","parameters":[{"name":"quoteChainId","required":false,"in":"query","description":"Venue for `getQuote` only (Solana today). Execution remains Base.","schema":{"type":"string","enum":["solana"],"default":"solana"}},{"name":"targetToken","required":false,"in":"query","description":"Stable you receive on Base: symbol (`USDC`) or matching Base ERC-20; Solana quote `toToken`.","schema":{"type":"string","enum":["USDC","0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],"default":"USDC"}},{"name":"amount","required":true,"in":"query","description":"Hydrex wrapped amount to lock: **integer string** in base units. Wrapped SPL decimals match the Solana mint decimals.","schema":{"type":"string"}},{"name":"wrappedInputToken","required":false,"in":"query","description":"Optional Base Hydrex-wrapped ERC-20 for router `inputToken`. Omit → `computeWrappedTokenAddress(inputToken)`","schema":{"type":"string"}},{"name":"recipient","required":false,"in":"query","description":"Address on Base receiving `targetToken`; omit or `0x0` to use the transaction sender.","schema":{"type":"string"}},{"name":"inputToken","required":true,"in":"query","description":"SPL mint (base58) of the asset you sell — Solana quote `fromToken`.","schema":{"type":"string"}},{"name":"slippage","required":false,"in":"query","description":"Execution slippage in BIPS. Default is 50 (0.5%). Used to compute minOutputAmount (same as `/quote`).","schema":{"type":"string"}},{"name":"gasPrice","required":false,"in":"query","description":"Optional gas price hint in wei for upstream quote providers that support it.","schema":{"type":"string"}},{"name":"spreadDirection","required":false,"in":"query","description":"Aggregator fee direction for spread: `input` or `output` (passed through `/quote` normalization; some venues ignore on Solana).","schema":{"enum":["input","output"],"type":"string"}},{"name":"spread","required":false,"in":"query","description":"Aggregator fee in BIPS (mapped via `/quote` `normalizeQueryParams`; venue-dependent).","schema":{"type":"string"}},{"name":"admin","required":false,"in":"query","description":"Address that receives aggregator spread fees when used with `spread` (`normalizeQueryParams` → feeRecipient).","schema":{"type":"string"}},{"name":"origin","required":false,"in":"query","description":"Forwarded into `/quote` (Hydrex swap `origin`). Encoded as on-chain `createIntent(..., source)` on the auction router (default `hydrex`).","schema":{"type":"string"}},{"name":"reflectToken","required":false,"in":"query","description":"Forwarded into `/quote` Solana aggregator params (same as `/quote`; Kyber reflect bypass applies only on EVM there).","schema":{"type":"string"}},{"name":"source","required":false,"in":"query","description":"Filter quote sources (alias comma-separated ok); same semantics as `/quote`.","schema":{"type":"string"}},{"name":"service","required":false,"in":"query","description":"Alias for `source`.","schema":{"type":"string"}},{"name":"services","required":false,"in":"query","description":"Alias for `source`.","schema":{"type":"string"}},{"name":"aggregators","required":false,"in":"query","description":"Alias for `source`.","schema":{"type":"string"}},{"name":"auctionSeconds","required":false,"in":"query","description":"Dutch auction length in seconds (default 15, max 900).","schema":{"type":"string"}},{"name":"referral","required":false,"in":"query","description":"Partner/referral address used by Hydrex router for attribution (same normalization as `/quote`). Defaults to zero address.","schema":{"type":"string"}},{"name":"referralFeeBps","required":false,"in":"query","description":"Referral fee in BIPS: applied in the Solana quote leg (`DEFAULT_ROUTER_FEE_BPS` + this) and encoded on `createIntent`. Default 0.","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Sell intent: Base `createIntent` (lock wrapped SPL, receive USDC)","tags":["multichain-auction"]}},"/multichain-auction/intent/cancel":{"get":{"description":"Returns an unsigned transaction (`to` = multichain auction router on Base, `data` = `cancel` calldata). Submit from the wallet that owns the intent. `intentId` is the bytes32 from `createIntent` / indexer (`IntentCreated.intentId`).","operationId":"MultichainAuctionController_buildCancelIntent","parameters":[{"name":"intentId","required":true,"in":"query","description":"Intent id as bytes32 (`0x` + 64 hex, same as on-chain / subgraph).","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Cancel intent: Base `cancel(bytes32 intentId)`","tags":["multichain-auction"]}},"/multichain-auction/wrapped-token-address":{"get":{"description":"Deterministic CREATE2 for Solana mints uses `sourceChainId` 501474 and `_tokenKey(501474, mintBytes32)` (see `SOLANA_SOURCE_CHAIN_ID`). Local math for the default hub (baked-in wrapper bytecode) or when `HYDREX_WRAPPED_SOLANA_TOKEN_CREATION_CODE` is set; otherwise `eth_call` `computeWrappedTokenAddress`. One `wrappedTokens(tokenKey)` read for `isDeployed`. Default hub: `0x06F57053638546A0E6cc94A6986bf61F35524278` (`HYDREX_WRAPPED_SOLANA_HUB_BASE`).","operationId":"MultichainAuctionController_getWrappedTokenAddress","parameters":[{"name":"solanaMint","required":true,"in":"query","description":"SPL token mint on Solana (base58 pubkey, e.g. wrapped SOL or a memecoin).","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Solana mint → Base wrapped ERC-20 address","tags":["multichain-auction"]}},"/multichain-auction/intents":{"get":{"description":"Read-only: configured GraphQL indexer (default Goldsky). `user` is the on-chain `user` field (EVM address).","operationId":"MultichainAuctionController_listIntentCreatedForUser","parameters":[{"name":"user","required":true,"in":"query","description":"EVM address of the intent creator / party indexed as `user`.","schema":{"type":"string"}},{"name":"first","required":false,"in":"query","description":"Page size (default 100, max 500).","schema":{"type":"number"}},{"name":"skip","required":false,"in":"query","description":"Offset for pagination.","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"summary":"List `IntentCreated` rows for a user (auction data / indexer)","tags":["multichain-auction"]}},"/multichain-auction/status":{"get":{"description":"Provide **either** `user` (EVM address on `IntentCreated.user`) **or** `transactionHash` (the Base tx that emitted `IntentCreated`), not both. Same slim row: `side`, `status`, timing, legs, amounts, optional fill/cancel. `first` / `skip` apply only to `user` scans. Uses server clock for expiry.","operationId":"MultichainAuctionController_listIntentsWithStatus","parameters":[{"name":"user","required":false,"in":"query","description":"EVM address of the party indexed as `user`.","schema":{"type":"string"}},{"name":"transactionHash","required":false,"in":"query","description":"Create-intent tx hash (0x + 64 hex). Ignores `first` / `skip`; returns all creations in that tx (usually one).","schema":{"type":"string"}},{"name":"first","required":false,"in":"query","description":"Page size when using `user` (default 100, max 500).","schema":{"type":"number"}},{"name":"skip","required":false,"in":"query","description":"Offset when using `user`.","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"summary":"Intent status (by user or by create tx hash)","tags":["multichain-auction"]}},"/quote":{"get":{"description":"EVM (e.g. Base): Hydrex router calldata. Solana: best enabled route (OpenOcean / Jupiter Ultra / Raydium / OKX) serialized transaction. Same response shape.","operationId":"QuoteController_getQuote","parameters":[{"name":"reflectToken","required":false,"in":"query","description":"If \"true\", bypass the Hydrex router and return a KyberSwap transaction directly. Required for reflect/fee-on-transfer tokens.","schema":{}},{"name":"referralFeeBps","required":false,"in":"query","description":"Referral fee in BIPS applied by Hydrex router. Used for amountOut/minOutput estimation. Default is 0.","schema":{}},{"name":"referral","required":false,"in":"query","description":"Partner/referral address used by Hydrex router for referral attribution. Defaults to zero address.","schema":{}},{"name":"origin","required":false,"in":"query","description":"Origin label for tracking where the trade comes from (e.g. hydrex, mobile-app, partner-xyz). Default: hydrex","schema":{}},{"name":"admin","required":false,"in":"query","description":"EVM only. Address that receives aggregator spread fees (used with spread). Ignored for Solana.","schema":{}},{"name":"spread","required":false,"in":"query","description":"EVM only. Aggregator fee in BIPS passed to external aggregators. Ignored for Solana.","schema":{}},{"name":"spreadDirection","required":false,"in":"query","description":"EVM only. Aggregator fee direction for spread: \"input\" charges input token, \"output\" charges output token. Ignored for Solana.","schema":{"enum":["input","output"],"type":"string"}},{"name":"gasPrice","required":false,"in":"query","description":"Optional gas price hint in wei for upstream quote providers that support it.","schema":{}},{"name":"slippage","required":false,"in":"query","description":"Execution slippage in BIPS. Default is 50 (0.5%). Used to compute minOutputAmount.","schema":{}},{"name":"taker","required":true,"in":"query","description":"Final wallet receiving output tokens. Also used as recipient in router calldata.","schema":{}},{"name":"amount","required":true,"in":"query","description":"Input amount in base units (wei/smallest token unit).","schema":{}},{"name":"toTokenAddress","required":true,"in":"query","description":"Output token contract address.","schema":{}},{"name":"fromTokenAddress","required":true,"in":"query","description":"Input token contract address.","schema":{}},{"name":"chainId","required":true,"in":"query","description":"Chain: EVM numeric id (e.g. 8453) or `base`; Solana `solana` / `mainnet-beta` / `501474` (legacy `101` accepted where token routing applies).","schema":{}},{"name":"aggregators","required":false,"in":"query","description":"Alias for source (comma-separated ok; Solana: OPENOCEAN,JUPITER,RAYDIUM,OKX).","schema":{}},{"name":"services","required":false,"in":"query","description":"Alias for source (comma-separated ok; Solana: OPENOCEAN,JUPITER,RAYDIUM,OKX).","schema":{}},{"name":"service","required":false,"in":"query","description":"Alias for source (comma-separated ok; Solana: OPENOCEAN,JUPITER,RAYDIUM,OKX).","schema":{}},{"name":"source","required":false,"in":"query","description":"Filter sources. One value or comma-separated (e.g. ZEROX,OPENOCEAN,JUPITER,RAYDIUM,OKX). Omit for all enabled.","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get quote and executable transaction payload","tags":["quote"]}},"/quote/multi":{"post":{"description":"Fetches the best route for each swap leg in parallel and returns a single executeSwaps transaction that batches all legs.","operationId":"MultiQuoteController_getMultiQuote","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiQuoteBodyDto"}}}},"responses":{"201":{"description":""}},"summary":"Multi-swap quote","tags":["quote"]}},"/websocket/connections":{"get":{"description":"Returns how many clients are currently connected to the Birdeye fan-out WebSocket at `/ws`.","operationId":"WebSocketController_getConnections","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebSocketConnectionsResponseDto"}}}}},"summary":"Active WebSocket client count","tags":["websocket"]}},"/transactions":{"get":{"description":"Fetches Base wallet transfers from Alchemy alchemy_getAssetTransfers. Defaults to inbound and outbound external/ERC-20 transfers, newest first.","operationId":"TokenTransactionController_getTransactions","parameters":[{"name":"pageKey","required":false,"in":"query","description":"Alchemy pageKey for direction=in/out, or the merged cursor returned by direction=all.","schema":{}},{"name":"limit","required":false,"in":"query","description":"Alchemy maxCount per direction. Defaults to 100, max 1000. direction=all can return up to 2x before dedupe.","schema":{"type":"integer","default":100,"minimum":1,"maximum":1000}},{"name":"order","required":false,"in":"query","description":"Sort order by block. Defaults to desc.","schema":{"type":"string","enum":["asc","desc"],"default":"desc"}},{"name":"toBlock","required":false,"in":"query","description":"Hex block number or latest. Defaults to latest.","schema":{}},{"name":"fromBlock","required":false,"in":"query","description":"Hex block number. Defaults to 0x0.","schema":{}},{"name":"contractAddresses","required":false,"in":"query","description":"Comma-separated contract addresses to filter for.","schema":{}},{"name":"categories","required":false,"in":"query","description":"Comma-separated Alchemy transfer categories. Defaults to external,erc20.","schema":{"type":"string","enum":["external","internal","erc20","erc721","erc1155","specialnft"],"default":"external,erc20"}},{"name":"direction","required":false,"in":"query","description":"Transfer direction relative to the wallet. Defaults to all.","schema":{"type":"string","enum":["in","out","all"],"default":"all"}},{"name":"chain","required":false,"in":"query","description":"Alias for chainId. Only Base is currently supported.","schema":{"type":"string","enum":["base","solana"]}},{"name":"chainId","required":false,"in":"query","description":"Target chain. Only Base is supported for Alchemy transfers.","schema":{"type":"string","enum":["base","solana"]}},{"name":"address","required":true,"in":"query","description":"Wallet address to track","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get wallet token transactions","tags":["transactions"]}},"/transactions/trade-history":{"get":{"description":"Default response is **simple** (compact rows): `side` (`buy`|`sell`), `targetToken` (`amount`, `rawAmount`, USD `value`), and top-level `value` (same as the target leg when priced). Pass `simple=false` for full `sent` / `received` legs, router info, and chain on each trade.","operationId":"TokenTradeHistoryController_getTradeHistory","parameters":[{"name":"enhanceUsd","required":false,"in":"query","description":"Deprecated alias for `enhanceValues`.","schema":{"type":"boolean","default":false}},{"name":"enhance","required":false,"in":"query","description":"Deprecated alias that enables both `enhanceValues` and `enhanceTokenMetadata`.","schema":{"type":"boolean","default":false}},{"name":"enhanceTokenMetadata","required":false,"in":"query","description":"When true, simple rows include `targetToken.token` with the normalized token object.","schema":{"type":"boolean","default":false}},{"name":"enhanceValues","required":false,"in":"query","description":"When true, simple rows include heavier value context like `marketCap` for the target token at the trade timestamp. USD `value` is still returned in simple mode.","schema":{"type":"boolean","default":false}},{"name":"includeIncomplete","required":false,"in":"query","description":"When true, includes swaps where only one transfer side was observed for the transaction (e.g. missing receive leg). Simple rows only include **observed** legs (plus WETH from receipt or native from `tx.value` where applicable); no synthetic counter-token.","schema":{"type":"boolean","default":false}},{"name":"pageKey","required":false,"in":"query","description":"Merged cursor returned by the underlying transaction page.","schema":{}},{"name":"limit","required":false,"in":"query","description":"Optional requested page size. Omit to scan all available pages. Pass a value to keep the request bounded.","schema":{"type":"integer","default":100,"minimum":1,"maximum":1000}},{"name":"order","required":false,"in":"query","description":"Sort order by block. Defaults to desc.","schema":{"type":"string","enum":["asc","desc"],"default":"desc"}},{"name":"toBlock","required":false,"in":"query","description":"Hex block number or latest. Defaults to latest.","schema":{}},{"name":"to","required":false,"in":"query","description":"Optional ISO date/datetime or unix timestamp. Filters reconstructed trades by blockTimestamp.","schema":{}},{"name":"from","required":false,"in":"query","description":"Optional ISO date/datetime or unix timestamp. Filters reconstructed trades by blockTimestamp, e.g. 2025-03-01.","schema":{}},{"name":"fromBlock","required":false,"in":"query","description":"Hex block number. Defaults to 0x0.","schema":{}},{"name":"chain","required":false,"in":"query","description":"Alias for chainId. Only Base is supported right now.","schema":{"type":"string","enum":["base","solana"]}},{"name":"chainId","required":false,"in":"query","description":"Target chain. Only Base is supported right now.","schema":{"type":"string","enum":["base","solana"]}},{"name":"simple","required":false,"in":"query","description":"**Default true**: compact trades (`timestamp`, `side`, `targetToken`, USD `value`). Set `simple=false` for detailed trades (`sent` / `received`, `routerSources`, etc.).","schema":{"type":"boolean","default":true}},{"name":"tokenAddresses","required":false,"in":"query","description":"Optional comma-separated token contract addresses. Filters grouped trades after reconstruction so both sides remain in the response.","schema":{}},{"name":"tokenAddress","required":false,"in":"query","description":"Optional single token contract address. Alias for tokenAddresses with one item.","schema":{}},{"name":"address","required":true,"in":"query","description":"Wallet address to build trade history for","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get wallet trade history","tags":["transactions"]}},"/transactions/trade-history/batch":{"post":{"description":"Fetches **simple** or **detailed** trade history for up to **50 unique** wallet addresses with the same filters. `limit` is the **total trades returned across the batch** (default 100, max 1000). The upstream per-wallet page size auto-shrinks from `limit / walletCount` for speed; pass `perAccountLimit` to override when one watched wallet may dominate results. Unbounded full scans are not supported. **No `pageKey`** — use the single-wallet `GET /transactions/trade-history` when you need pagination cursors. **Simple rows** de-prioritize USDC, USDbC, WETH, and native ETH as `targetToken` when the other leg is a long-tail token (so “sold USDC for X” reads as a **buy** of X). Pass `enhanceValues=true` for at-trade value context and `enhanceTokenMetadata=true` for the normalized token object. Results align to the input order: duplicate addresses are omitted after the first; invalid addresses return `ok: false` for that row; upstream failures are isolated per wallet.","operationId":"TokenTradeHistoryController_postTradeHistoryBatch","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenTradeHistoryBatchDto"}}}},"responses":{"201":{"description":""}},"summary":"Batch wallet trade history (watchlist)","tags":["transactions"]}},"/transactions/account-breakdown":{"get":{"description":"Same compact row shape as simple **trade-history**: `timestamp`, `type` (`buy`|`sell`|`transferIn`|`transferOut`), `targetToken` (with optional `marketCap` / `token` when enhanced), USD `value`, `completeness`. **`counterpartyAddress`**: sender for `transferIn`, recipient for `transferOut`; null for `buy`/`sell`. Reconstructs swaps like trade history, then attaches remaining transfer legs. Defaults to a bounded page without USD enrichment. **`enhanceUsd=true`**: historical USD on `value` / `targetToken.value`. **`enhanceValues=true`**: `targetToken.marketCap` at row time (same as trade-history). **`enhanceTokenMetadata=true`**: `targetToken.token` overview. **`enhance=true`**: both values + metadata (not USD). Alchemy transfer `value` is the token/native amount and is exposed as `targetToken.amount`.","operationId":"TokenTradeHistoryController_getAccountBreakdown","parameters":[{"name":"pageKey","required":false,"in":"query","description":"Merged cursor from the underlying transfer fetch.","schema":{}},{"name":"limit","required":false,"in":"query","description":"Requested page size. Defaults to 100; unlike trade-history, omitting this does not scan all available pages.","schema":{"type":"integer","default":100,"minimum":1,"maximum":1000}},{"name":"order","required":false,"in":"query","description":"Sort order by block for each list. Defaults to desc.","schema":{"type":"string","enum":["asc","desc"],"default":"desc"}},{"name":"toBlock","required":false,"in":"query","description":"Hex block number or latest. Defaults to latest.","schema":{}},{"name":"to","required":false,"in":"query","description":"Optional ISO date/datetime or unix timestamp. Filters by transfer blockTimestamp.","schema":{}},{"name":"from","required":false,"in":"query","description":"Optional ISO date/datetime or unix timestamp. Filters by transfer blockTimestamp.","schema":{}},{"name":"fromBlock","required":false,"in":"query","description":"Hex block number. Defaults to 0x0.","schema":{}},{"name":"chain","required":false,"in":"query","description":"Alias for chainId. Only Base is supported right now.","schema":{"type":"string","enum":["base","solana"]}},{"name":"chainId","required":false,"in":"query","description":"Target chain. Only Base is supported right now.","schema":{"type":"string","enum":["base","solana"]}},{"name":"enhance","required":false,"in":"query","description":"When true, enables both `enhanceValues` and `enhanceTokenMetadata` (does not enable `enhanceUsd`).","schema":{"type":"boolean","default":false}},{"name":"enhanceTokenMetadata","required":false,"in":"query","description":"When true, rows include `targetToken.token` (same as trade-history `enhanceTokenMetadata`). Default false.","schema":{"type":"boolean","default":false}},{"name":"enhanceValues","required":false,"in":"query","description":"When true, rows include `targetToken.marketCap` at row time (same as `GET trade-history` `enhanceValues`). Default false.","schema":{"type":"boolean","default":false}},{"name":"enhanceUsd","required":false,"in":"query","description":"When true, fills USD `value` using historical pricing near the row timestamp. Default false.","schema":{"type":"boolean","default":false}},{"name":"includeIncomplete","required":false,"in":"query","description":"When true, includes partial swaps when reconstructing trades (same as trade history). Transfer rows are always individual observed legs.","schema":{"type":"boolean","default":false}},{"name":"tokenAddresses","required":false,"in":"query","description":"Optional comma-separated token contracts (same semantics as trade history).","schema":{}},{"name":"tokenAddress","required":false,"in":"query","description":"Optional single token contract. Alias for tokenAddresses with one item.","schema":{}},{"name":"address","required":true,"in":"query","description":"Wallet address","schema":{}}],"responses":{"200":{"description":""}},"summary":"Wallet activity (trades + transfers)","tags":["transactions"]}},"/transactions/trade-history/breakdown":{"get":{"description":"Returns per-token summaries with all reconstructed trades involving each token.","operationId":"TokenTradeHistoryController_getTradeBreakdown","parameters":[{"name":"tokenAddresses","required":false,"in":"query","description":"Optional comma-separated token contract addresses. Filters grouped trades before building token summaries.","schema":{}},{"name":"tokenAddress","required":false,"in":"query","description":"Optional single token contract address. Alias for tokenAddresses with one item.","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get wallet trade history grouped by token","tags":["transactions"]}},"/transactions/trade-history/tokens":{"get":{"description":"Wallet-first token view: pass a wallet address and receive each token the wallet traded with every reconstructed trade involving that token nested underneath.","operationId":"TokenTradeHistoryController_getTradeTokens","parameters":[{"name":"includeIncomplete","required":false,"in":"query","description":"When true, includes swaps where only one transfer side was observed for the transaction (e.g. missing receive leg). Simple rows only include **observed** legs (plus WETH from receipt or native from `tx.value` where applicable); no synthetic counter-token.","schema":{"type":"boolean","default":false}},{"name":"pageKey","required":false,"in":"query","description":"Merged cursor returned by the underlying transaction page.","schema":{}},{"name":"limit","required":false,"in":"query","description":"Underlying Alchemy maxCount per direction. Defaults to 100, max 1000.","schema":{"type":"integer","default":100,"minimum":1,"maximum":1000}},{"name":"order","required":false,"in":"query","description":"Sort order by block. Defaults to desc.","schema":{"type":"string","enum":["asc","desc"],"default":"desc"}},{"name":"toBlock","required":false,"in":"query","description":"Hex block number or latest. Defaults to latest.","schema":{}},{"name":"fromBlock","required":false,"in":"query","description":"Hex block number. Defaults to 0x0.","schema":{}},{"name":"chain","required":false,"in":"query","description":"Alias for chainId. Only Base is supported right now.","schema":{"type":"string","enum":["base","solana"]}},{"name":"chainId","required":false,"in":"query","description":"Target chain. Only Base is supported right now.","schema":{"type":"string","enum":["base","solana"]}},{"name":"address","required":true,"in":"query","description":"Wallet address to build token-grouped trade history for","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get wallet trade history nested under tokens","tags":["transactions"]}},"/transactions/top-traders":{"get":{"description":"Fetches top profitable wallets for a Base ERC-20 token from Moralis. Defaults to all-time profitability (`days=all`).","operationId":"TokenTopTradersController_getTopTraders","parameters":[{"name":"days","required":false,"in":"query","description":"Profitability timeframe in days. Defaults to all-time (`all`).","schema":{"type":"string","enum":["all","7","30"],"default":"all"}},{"name":"chain","required":false,"in":"query","description":"Alias for chainId. Only Base is currently supported.","schema":{"type":"string","enum":["base","solana"]}},{"name":"chainId","required":false,"in":"query","description":"Target chain. Only Base (`base` or `8453`) is supported for the current Moralis source.","schema":{"type":"string","enum":["base","solana"]}},{"name":"address","required":true,"in":"query","description":"Token contract address","schema":{}}],"responses":{"200":{"description":""}},"summary":"Get top traders for a token","tags":["transactions"]}},"/portfolio/address/{address}":{"get":{"description":"Default: Alchemy **Data API** [Tokens by wallet](https://api.g.alchemy.com/data/v1) (`/data/v1/.../assets/tokens/by-address`) for balances, metadata, and USD on Base (`base-mainnet`) **only** (no CDP). Always applies fast fiat/metadata sanity (drops unverified rows with implausible USD from bad oracles). Set `filterSpam=true` to additionally load token transfer history and strip scam-airdrop ERC-20s (same heuristics as historic). Default: no transfer reads. Gas ETH is never dropped. DexScreener/Birdeye display enrichment runs only for tokens missing logo or labels. Set `portfolioSource=coinbase` for Coinbase `cdp_getTokensForAddresses` (OnchainKit-style). On **`network=base`**, also loads Hydrex synthetics: Base ERC-20s in both the primary source and synthetics are **replaced** by the synthetic row (`TokenOverviewService` batch pricing, `solana`, `balance` + `rawBalance`); extra synthetics are **appended**. `portfolioBalanceInUsd` is always **Σ per-token `fiatBalance`**, not a pre-aggregated upstream total. Requires `ALCHEMY_API_KEY` for the default source; for `portfolioSource=coinbase` use CDP keys `CDP_DEVELOPER_RPC_KEY` or `CDP_CLIENT_API_KEY`. [Alchemy Tokens by wallet](https://www.alchemy.com/docs/data/portfolio-apis/portfolio-api-endpoints/portfolio-api-endpoints/get-tokens-by-address), [Client API keys](https://docs.cdp.coinbase.com/get-started/authentication/cdp-api-keys#client-api-key).","operationId":"PortfolioController_getPortfolioByAddress","parameters":[{"name":"address","required":true,"in":"path","description":"EVM wallet address (0x…).","schema":{"example":"0xc9e4ca1c37ace1ab312ee18108ea39c8ad2577ec","type":"string"}},{"name":"network","required":false,"in":"query","description":"RPC network slug. Default: `base`.","schema":{"enum":["base"],"type":"string"}},{"name":"portfolioSource","required":false,"in":"query","schema":{"type":"string","enum":["alchemy","coinbase"],"default":"alchemy"},"description":"Data source. Default: `alchemy` (Alchemy only). `coinbase`: CDP `cdp_getTokensForAddresses`."},{"name":"filterSpam","required":false,"in":"query","schema":{"type":"boolean","default":false},"description":"Opt-in (`alchemy` only): when `true`, loads transfer history and applies transfer-pattern spam heuristics. Omitted or `false`: skip transfer reads; return Alchemy portfolio rows as-is. Ignored for `coinbase`."}],"responses":{"200":{"description":""}},"summary":"Portfolio for one address (default: Alchemy Data API; opt-in Coinbase CDP)","tags":["portfolio"]}},"/portfolio/synthetics/address/{address}":{"get":{"description":"Same JSON shape as `GET /portfolio/address/:address`: `address`, `portfolioBalanceInUsd`, `tokenBalances`. Discovers candidate ERC-20s from this user’s `IntentCreated` rows on the auction subgraph (non–stable `inputToken` / `outputToken`), then reads live `balanceOf` on Base. Each `tokenBalances[].rawBalance` is the **raw base-unit integer as a string**; `tokenBalances[].balance` is the human amount (`formatUnits`). Hydrex wrapped ERC-20s include `solana` (`isSolana`, SPL `address`, `decimals`) from hub `registeredTokens` with Solana RPC fallback. `fiatBalance`, `portfolioBalanceInUsd`, and `image` use {@link TokenOverviewService.getOverviews} (`enhanced: true`) batched over SPL mints. Fiat uses overview `price` × on-chain wrapped balance (human units via ERC-20 `decimals` on Base).","operationId":"PortfolioController_getSyntheticPortfolioByAddress","parameters":[{"name":"address","required":true,"in":"path","description":"EVM wallet on Base (same `user` field as auction intents).","schema":{"example":"0xc9e4ca1c37ace1ab312ee18108ea39c8ad2577ec","type":"string"}}],"responses":{"200":{"description":""}},"summary":"Hydrex synthetic (wrapped SPL) balances on Base","tags":["portfolio"]}},"/portfolio/historic/address/{address}":{"get":{"description":"Reconstructs balances by replaying shared token transaction transfer history from genesis up to each snapshot boundary, then values each point in time via Alchemy Prices API (`/prices/v1/{apiKey}/tokens/historical`). Spam tokens are filtered via per-token heuristics (symbol 2–10 chars, decimals present, non-airdrop-round values). The **final** snapshot is anchored to the live `GET /portfolio/address/:address` result (same `portfolioSource` as this route: default Alchemy, CDP when `portfolioSource=coinbase`) so \"now\" is exact. Set `detailed=true` to receive per-token breakdown at every snapshot. Requires `ALCHEMY_API_KEY` (optional demo in defaults).","operationId":"PortfolioController_getHistoricPortfolioByAddress","parameters":[{"name":"address","required":true,"in":"path","description":"EVM wallet address (0x…).","schema":{"example":"0xc9e4ca1c37ace1ab312ee18108ea39c8ad2577ec","type":"string"}},{"name":"timeframe","required":false,"in":"query","description":"Rolling window. Default: `24h`. Default `snapshots` per timeframe: 24h=24, 7d=7, 30d=30, 60d=60, 90d=90, 180d=180.","schema":{"enum":["24h","7d","30d","60d","90d","180d"],"type":"string"}},{"name":"snapshots","required":false,"in":"query","description":"Number of evenly-spaced snapshot buckets (min 2, max 180). Final bucket is always \"now\".","schema":{"type":"number"}},{"name":"detailed","required":false,"in":"query","description":"When `true`, each snapshot includes `tokenBalances` (per-token `balance`, `rawBalance`, `fiatBalance`). Default: `false`.","schema":{"type":"boolean"}},{"name":"portfolioSource","required":false,"in":"query","schema":{"type":"string","enum":["alchemy","coinbase"],"default":"alchemy"},"description":"Live anchor uses `GET /portfolio/address/...` with the same source. Default: `alchemy`."}],"responses":{"200":{"description":""}},"summary":"Historic portfolio value over a rolling timeframe","tags":["portfolio"]}}},"info":{"title":"Hydrex Routing API","description":"DEX aggregator routing service - Get the best swap rates across 0x, OpenOcean, and OKX","version":"1.0","contact":{}},"tags":[{"name":"quote","description":"DEX quote aggregation endpoints"},{"name":"multichain-auction","description":"Multichain auction router on Base: intent build, cancel, indexer-backed status and history"},{"name":"token","description":"Token data endpoints"},{"name":"websocket","description":"Inbound WebSocket stats and related HTTP helpers"},{"name":"portfolio","description":"Wallet/portfolio data (Coinbase CDP and related pass-throughs)"}],"servers":[],"components":{"securitySchemes":{"DomainBypassKey":{"type":"apiKey","in":"header","name":"X-Domain-Bypass-Key","description":"Optional. Bypass domain allow-list for /token endpoints (e.g. for debugging from Swagger on PR deploys). Set DOMAIN_BYPASS_KEY in env."}},"schemas":{"TokenOverviewBatchDto":{"type":"object","properties":{"addresses":{"description":"Token contract addresses to fetch overviews for","example":["0x1234...","0xabcd..."],"maxItems":50,"type":"array","items":{"type":"string"}},"chainId":{"type":"object","description":"Birdeye chain (e.g. base, solana, 8453, 501474; legacy 101 → solana). Preferred over `chain`. When omitted, inferred from the first address when clearly EVM or Solana; otherwise base. If chain is omitted and addresses mix networks, the request is rejected."},"chain":{"type":"string","description":"Alias for chainId. Same inference rules as chainId when both are omitted."},"enhanced":{"type":"boolean","description":"When `true`, Birdeye is queried and results are enhanced with DexScreener data. When omitted or `false` (default for batch), responses are built from DexScreener only (faster, no Birdeye CU cost).","default":false}},"required":["addresses"]},"MultiSwapItemDto":{"type":"object","properties":{"fromTokenAddress":{"type":"string","description":"Input token contract address."},"toTokenAddress":{"type":"string","description":"Output token contract address."},"amount":{"type":"string","description":"Input amount in base units (wei)."}},"required":["fromTokenAddress","toTokenAddress","amount"]},"MultiQuoteBodyDto":{"type":"object","properties":{"taker":{"type":"string","description":"Final wallet receiving output tokens."},"chainId":{"type":"string","description":"EVM chain ID (example: 8453 for Base)."},"slippage":{"type":"string","description":"Execution slippage in BIPS. Default 50 (0.5%)."},"origin":{"type":"string","description":"Origin label for tracking. Default: hydrex"},"referral":{"type":"string","description":"Referral address for Hydrex router attribution."},"referralFeeBps":{"type":"string","description":"Referral fee in BIPS applied by Hydrex router. Default 0."},"spread":{"type":"string","description":"Aggregator fee in BIPS passed to upstream aggregators."},"spreadDirection":{"type":"string","description":"Aggregator fee direction: \"input\" or \"output\"."},"admin":{"type":"string","description":"Address that receives aggregator spread fees."},"source":{"type":"string","description":"Filter sources. Comma-separated (ZEROX,OPENOCEAN). Omit for all."},"service":{"type":"string","description":"Alias for source. Comma-separated (ZEROX,OPENOCEAN). Omit for all."},"services":{"type":"string","description":"Alias for source. Comma-separated (ZEROX,OPENOCEAN). Omit for all."},"aggregators":{"type":"string","description":"Alias for source. Comma-separated (ZEROX,OPENOCEAN). Omit for all."},"swaps":{"description":"Array of swap legs to execute in a single transaction.","type":"array","items":{"$ref":"#/components/schemas/MultiSwapItemDto"}}},"required":["taker","swaps"]},"WebSocketConnectionsResponseDto":{"type":"object","properties":{"connections":{"type":"number","example":4,"description":"Number of active inbound WebSocket client connections to `/ws`."}},"required":["connections"]},"TokenTradeHistoryBatchDto":{"type":"object","properties":{"addresses":{"description":"Wallet addresses (EVM). Duplicates are skipped (first occurrence wins). At most 50 unique addresses.","example":["0x1111111111111111111111111111111111111111","0x2222222222222222222222222222222222222222"],"maxItems":50,"type":"array","items":{"type":"string"}},"tokenAddress":{"type":"string","description":"Optional single token contract. Same semantics as `GET /transactions/trade-history`."},"tokenAddresses":{"description":"Optional list or comma-separated token contracts. Same semantics as trade-history.","type":"array","items":{"type":"string"}},"chainId":{"type":"object","description":"Target chain. Only Base is supported right now."},"chain":{"type":"string","description":"Alias for chainId."},"from":{"type":"object","description":"ISO date/datetime or unix seconds/ms. Filters reconstructed trades by blockTimestamp."},"fromDate":{"type":"object","description":"Alias for `from`."},"to":{"type":"object","description":"ISO date/datetime or unix seconds/ms. Filters reconstructed trades by blockTimestamp."},"toDate":{"type":"object","description":"Alias for `to`."},"fromBlock":{"type":"string","description":"Hex block number. Defaults to 0x0."},"toBlock":{"type":"string","description":"Hex block number or latest. Defaults to latest."},"order":{"type":"string","description":"Sort order by block. Defaults to desc."},"limit":{"type":"object","description":"Max trades returned across the whole batch response. Defaults to 100; max 1000. Unlike single trade-history, batch never performs an unbounded full-wallet scan."},"perAccountLimit":{"type":"object","description":"Optional upstream page size per wallet. Defaults to an auto-sized small value based on `limit / walletCount` for speed. Increase it when one watched wallet may dominate the latest results."},"includeIncomplete":{"type":"object","description":"When true, includes partial swaps. Same as trade-history. Defaults false."},"enhanceValues":{"type":"object","description":"When true, simple rows include heavier value context like target token market cap at the trade timestamp."},"enhanceTokenMetadata":{"type":"object","description":"When true, simple rows include `targetToken.token` with the project-normalized token object."},"enhance":{"type":"object","description":"Deprecated alias that enables both `enhanceValues` and `enhanceTokenMetadata`."},"enhanceUsd":{"type":"object","description":"Deprecated alias for `enhanceValues`."},"simple":{"type":"object","description":"Compact trade shape (default true). Pass false for full legs per trade (heavier at scale)."}},"required":["addresses"]}}},"security":[{"DomainBypassKey":[]}]}