openfin-troubleshooting
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseOpenFinance Troubleshooting
OpenFinance故障排查
Error → diagnosis → fix. Check here before assuming an issue is a server-side
bug: most failures are known and have been hit before.
错误→诊断→修复。在假设问题是服务器端bug之前,请先查看此处:大多数故障都是已知问题,且之前已出现过。
Polymarket
Polymarket
POST /agent/polymarket/approvals
shows max but CLOB returns allowance: 0
POST /agent/polymarket/approvalsallowance: 0POST /agent/polymarket/approvals
显示额度已达上限,但CLOB返回allowance: 0
POST /agent/polymarket/approvalsallowance: 0Root cause: approval targeted the wrong USDC contract or wrong exchange spender.
Polymarket on Polygon enforces allowance against USDC.e
(), not pUSD or native USDC. And
orders settle on the V1 exchange (),
not V2 — even though the SDK is . The CLOB's
returns .
0x2791Bca1f2de4661ED88A30C99A7a9449Aa841740x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982Eclob-client-v2GET /version1Fix: Call with if the
market is neg-risk. The server approves USDC.e on V1 spenders. If you
previously approved a different token manually, those allowances are stuck
against the wrong token.
POST /agent/polymarket/approvals{negRisk: true}根本原因: 授权指向了错误的USDC合约或错误的交易所支出方。
Polygon上的Polymarket要求针对USDC.e()设置额度,而非pUSD或原生USDC。此外,订单在V1交易所()结算,而非V2——尽管使用的SDK是。CLOB的接口返回值为。
0x2791Bca1f2de4661ED88A30C99A7a9449Aa841740x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982Eclob-client-v2GET /version1修复方案: 如果市场为负风险类型,调用时传入。服务器将针对V1支出方授权USDC.e。如果之前手动授权过其他代币,这些额度会绑定在错误的代币上无法使用。
POST /agent/polymarket/approvals{negRisk: true}POST /agent/polymarket/order/market
returns 404 upstream
(limit orders work)
POST /agent/polymarket/order/market404 upstreamPOST /agent/polymarket/order/market
返回404 upstream
(限价单可正常工作)
POST /agent/polymarket/order/market404 upstreamRoot cause: SDK's calls
which does unauthenticated . That endpoint
404s until Polymarket's fee service has the builder code onboarded.
createMarketOrderensureBuilderFeeRateCachedGET /fees/builder-fees/<code>Fix: Already patched — the backend catches the 404 and caches a zero-rate
entry. If you still see this, the deployment is behind. Retry passes through
after the patch is live.
根本原因: SDK的方法会调用,该方法会发起未认证的请求。在Polymarket的手续费服务完成构建者代码接入前,该接口会返回404。
createMarketOrderensureBuilderFeeRateCachedGET /fees/builder-fees/<code>修复方案: 该问题已修复——后端会捕获404错误并缓存一个零费率条目。如果仍遇到此问题,说明部署版本落后。补丁上线后重试即可正常通过。
Order failed: tick size
on a price that looks right
Order failed: tick size价格看似正确但仍提示Order failed: tick size
Order failed: tick sizeRoot cause: Market's minimum tick size is smaller than (the default).
Passing when the market needs or rejects.
0.010.010.0010.0001Fix: Pass or explicitly in the request body.
Read the market's min tick from .
tickSize: "0.001""0.0001"GET /agent/polymarket/markets/cid/:conditionId根本原因: 市场的最小价格变动单位小于默认值。当市场需要或时传入会被拒绝。
0.010.0010.00010.01修复方案: 在请求体中显式传入或。可通过接口读取市场的最小价格变动单位。
tickSize: "0.001""0.0001"GET /agent/polymarket/markets/cid/:conditionIdOrder size below minimum
Order size below minimumOrder size below minimum
Order size below minimumPolymarket requires ~$1 USDC minimum notional. = $0.50
notional → rejected.
price=0.05, size=10Fix: Increase size so .
price * size >= 1Polymarket要求名义价值至少约1美元USDC。例如的名义价值为0.5美元→会被拒绝。
price=0.05, size=10修复方案: 增加订单规模,确保。
price * size >= 1Relay
Relay
InstructionFallbackNotFound (Custom:101)
on Solana-origin execute
InstructionFallbackNotFound (Custom:101)Solana发起的执行请求出现InstructionFallbackNotFound (Custom:101)
InstructionFallbackNotFound (Custom:101)Root cause: Instruction data decoded with wrong encoding. Relay returns
Solana instruction as hex (no prefix), not base64. Early
backend versions decoded as base64 → garbage bytes → depository rejected.
data0xFix: Already patched. First 8 bytes of a correctly-decoded instruction
should match Relay's discriminator (e.g. ).
0b9c60da27a3b413根本原因: 指令数据使用了错误的编码方式。Relay返回的Solana指令为十六进制格式(无前缀),而非base64格式。早期后端版本按base64解码→生成无效字节→存储库拒绝请求。
data0x修复方案: 该问题已修复。正确解码后的指令前8字节应与Relay的鉴别符匹配(例如)。
0b9c60da27a3b413Blockhash not found
repeatedly on Solana execute
Blockhash not foundSolana执行请求反复出现Blockhash not found
Blockhash not foundRoot cause: Privy's uses a different RPC than
the one that issued the blockhash. Cross-RPC divergence — no retry fixes it.
signAndSendTransactionFix: Already patched — backend now uses Privy's (sign
only) and broadcasts via our own RPC with . If you still
see it, set to a dedicated provider (Helius/Triton/QuickNode)
— the public is heavily throttled.
signTransactionskipPreflight: trueSOLANA_RPC_URLapi.mainnet-beta.solana.com根本原因: Privy的方法使用的RPC与生成区块哈希的RPC不同。跨RPC节点数据不一致——重试无法解决此问题。
signAndSendTransaction修复方案: 该问题已修复——后端现在使用Privy的(仅签名)方法,并通过自有RPC节点以参数广播交易。如果仍遇到此问题,将设置为专用服务商(Helius/Triton/QuickNode)——公共节点限流严重。
signTransactionskipPreflight: trueSOLANA_RPC_URLapi.mainnet-beta.solana.com401 No valid authorization signatures were provided
on Solana execute
401 No valid authorization signatures were providedSolana执行请求出现401 No valid authorization signatures were provided
401 No valid authorization signatures were providedRoot cause: User's Solana wallet isn't delegated to the app. EVM
delegation doesn't transfer.
Fix: See step 2 — frontend must call
.
Server catches this now and returns 412 with a clearer message.
openfin-setupuseDelegatedActions().delegateWallet({ address: solanaAddress, chainType: 'solana' })根本原因: 用户的Solana钱包未授权给应用。EVM授权不会自动迁移到Solana。
修复方案: 查看步骤2——前端必须调用。服务器现在会捕获此情况,并返回412状态码及更清晰的提示信息。
openfin-setupuseDelegatedActions().delegateWallet({ address: solanaAddress, chainType: 'solana' })POST /agent/relay/execute
says "User has no Solana wallet provisioned"
POST /agent/relay/executePOST /agent/relay/execute
提示"User has no Solana wallet provisioned"
POST /agent/relay/executeRoot cause: Privy app isn't configured to create Solana embedded wallets,
or the specific user logged in before Solana was enabled.
Fix: Enable Solana in Privy dashboard; existing users may need to trigger
wallet creation.
根本原因: Privy应用未配置创建Solana嵌入式钱包,或特定用户在Solana功能启用前已登录。
修复方案: 在Privy控制台启用Solana功能;现有用户可能需要触发钱包创建流程。
Gas topup forced off unexpectedly
Gas充值被意外强制关闭
Expected behavior, not a bug. When either origin or destination chain ID
is Solana (), is forced to server-side. Topup
doesn't work cleanly for EVM↔SVM routes.
792703809topupGasfalse这是预期行为,并非bug。 当源链或目标链ID为Solana()时,服务器端会强制将设为。Gas充值在EVM↔SVM路由中无法正常工作。
792703809topupGasfalseHyperliquid
Hyperliquid
Insufficient perp account value
Insufficient perp account valueInsufficient perp account value
Insufficient perp account valueRoot cause: Perp trading requires margin. USDC on Hyperliquid isn't
automatically available for perp trading.
Fix: to move USDC between spot and perp
accounts, or deposit first via .
POST /agent/trading/transferGET /agent/trading/deposit-address根本原因: 永续合约交易需要保证金。Hyperliquid上的USDC不会自动用于永续合约交易。
修复方案: 调用将USDC在现货账户与永续合约账户间划转,或先通过接口存入资金。
POST /agent/trading/transferGET /agent/trading/deposit-addressWebSocket data is stale
WebSocket数据过期
Root cause: The backend maintains one shared connection to
and caches per-channel. If the connection dropped
and reconnected, the first few messages after reconnect may be missing.
wss://api.hyperliquid.xyz/wsFix: The backend auto-reconnects after 3s. Retry the read; cache fills
within a few seconds. If persistent, something is wrong with outbound WS from
the server host.
根本原因: 后端维护一个与的共享连接,并按频道缓存数据。如果连接断开后重新连接,重连后的前几条消息可能丢失。
wss://api.hyperliquid.xyz/ws修复方案: 后端会在3秒后自动重连。重试读取操作;缓存会在几秒内填充完成。如果问题持续,说明服务器主机的出站WebSocket连接存在异常。
Order rejected: price out of bounds
Order rejected: price out of boundsOrder rejected: price out of bounds
Order rejected: price out of boundsRoot cause: Hyperliquid rejects prices too far from the current mid (price
bands). Typically ±5-10% depending on asset.
Fix: Read mid via and set price within
bounds. For aggressive fills, use limit orders crossing the book but within
the band.
GET /agent/trading/market/mids根本原因: Hyperliquid会拒绝与当前中间价偏离过大的价格(价格区间限制)。通常偏离范围为±5-10%,具体取决于资产类型。
修复方案: 通过接口读取中间价,并将订单价格设置在允许范围内。如需激进成交,可使用跨越订单簿但仍在价格区间内的限价单。
GET /agent/trading/market/midsGeneral principles
通用原则
- Check first when anything auth-related fails. It tells you if delegation is in place and which chains are provisioned.
GET /agent/wallets - On-chain state != CLOB/Relay state. Approvals can show on-chain but still report 0 upstream because of token/contract mismatches. Don't trust "on-chain says X" without also checking the service's view.
- When in doubt, read the error string verbatim — don't paraphrase. Many
errors have specific signatures (vs
Custom:101) that map to exactly one fix.Custom:6000
- 任何授权相关问题先检查。该接口会告知你授权是否生效,以及哪些链已配置。
GET /agent/wallets - 链上状态≠CLOB/Relay状态。授权可能在链上已显示成功,但因代币/合约不匹配,上游仍报告额度为0。不要仅凭"链上显示X"就轻信,需同时查看服务端的状态。
- 如有疑问,直接读取错误字符串原文——不要转述。许多错误具有特定签名(如与
Custom:101),每个签名对应唯一的修复方案。",Custom:6000