一键导入
orderly-sdk-debugging
Debug and troubleshoot common issues with the Orderly SDK including errors, WebSocket issues, authentication problems, and trading failures.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Debug and troubleshoot common issues with the Orderly SDK including errors, WebSocket issues, authentication problems, and trading failures.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Agent onboarding for Orderly Network - omnichain perpetual futures infrastructure, MCP server, skills, and developer quickstart
Create and manage a custom white-label DEX using Orderly One - launch paths, deployment, custom domains, graduation, theming, and admin operations
Complete authentication guide for Orderly Network - EIP-712 wallet signatures for EVM accounts, Ed25519 message signing for Solana accounts, and Ed25519 signatures for API requests
Handle token deposits and withdrawals across chains, including allowance approval, vault interactions, and cross-chain operations
Monitor positions in real-time, configure Take-Profit/Stop-Loss orders, and manage risk with leverage settings
Place, manage, and cancel orders using REST API or SDK hooks. Covers market, limit, IOC, FOK, POST_ONLY order types and batch operations
| name | orderly-sdk-debugging |
| description | Debug and troubleshoot common issues with the Orderly SDK including errors, WebSocket issues, authentication problems, and trading failures. |
A comprehensive guide to debugging common issues, handling errors, and troubleshooting problems with the Orderly SDK.
Uncaught ReferenceError: Buffer is not defined
Cause: Wallet libraries use Node.js built-ins (Buffer, crypto) that don't exist in browsers.
Solution: Add vite-plugin-node-polyfills:
npm install -D vite-plugin-node-polyfills
// vite.config.ts
import { nodePolyfills } from 'vite-plugin-node-polyfills';
export default defineConfig({
plugins: [
react(),
nodePolyfills({
include: ['buffer', 'crypto', 'stream', 'util'],
globals: {
Buffer: true,
global: true,
process: true,
},
}),
],
});
ENOENT: no such file or directory, open '@orderly.network/trading/dist/styles.css'
Cause: Only @orderly.network/ui has a CSS file.
Solution: Only import from @orderly.network/ui:
/* Correct - only ui package has CSS */
@import '@orderly.network/ui/dist/styles.css';
/* Wrong - these don't exist */
/* @import '@orderly.network/trading/dist/styles.css'; */
/* @import '@orderly.network/portfolio/dist/styles.css'; */
| Code | Message | Cause | Solution |
|---|---|---|---|
-1000 | Unknown error | Server error | Retry request |
-1002 | Unauthorized | Invalid/expired key | Re-authenticate |
-1003 | Too many requests | Rate limit | Implement backoff |
-1102 | Invalid parameter | Wrong order params | Validate inputs |
| Code | Message | Cause | Solution |
|---|---|---|---|
-2001 | Insufficient balance | Not enough USDC | Deposit more funds |
-2002 | Order would trigger liquidation | Risk too high | Reduce position size |
-2004 | Price out of range | Price too far from mark | Adjust limit price |
-2005 | Order quantity too small | Below minimum | Increase quantity |
| Code | Message | Cause | Solution |
|---|---|---|---|
-3001 | Insufficient balance | Not enough available | Check unsettled PnL |
-3002 | Withdrawal amount too small | Below minimum | Increase amount |
import { useWsStatus, WsNetworkStatus } from '@orderly.network/hooks';
function ConnectionIndicator() {
const wsStatus = useWsStatus();
return (
<div className="connection-status">
{wsStatus === WsNetworkStatus.Connected && (
<span className="text-green-500">● Connected</span>
)}
{wsStatus === WsNetworkStatus.Unstable && (
<span className="text-yellow-500">● Reconnecting...</span>
)}
{wsStatus === WsNetworkStatus.Disconnected && (
<span className="text-red-500">● Disconnected</span>
)}
</div>
);
}
| Status | Description |
|---|---|
Connected | WebSocket is connected and working |
Unstable | Connection dropped, attempting reconnect |
Disconnected | Connection lost, not reconnecting |
import { useAccount, AccountStatusEnum } from '@orderly.network/hooks';
function AccountDebugger() {
const { state, account } = useAccount();
useEffect(() => {
console.log('Account State:', {
status: state.status,
address: state.address,
userId: state.userId,
accountId: state.accountId,
hasOrderlyKey: !!account?.keyStore?.getOrderlyKey(),
});
}, [state, account]);
// Common issues:
switch (state.status) {
case AccountStatusEnum.NotConnected:
return <p>Wallet not connected</p>;
case AccountStatusEnum.Connected:
return <p>Wallet connected, not signed in</p>;
case AccountStatusEnum.NotSignedIn:
return <p>Need to sign message to create Orderly key</p>;
case AccountStatusEnum.SignedIn:
return <p>Fully authenticated</p>;
}
}
| Issue | Cause | Solution |
|---|---|---|
| Stuck on "Connected" | User didn't sign | Prompt for signature |
| Key expired | 365-day expiry | Re-authenticate |
| Wrong network | Testnet vs mainnet | Check networkId |
| No user ID | Account not registered | Complete signup |
import { useOrderEntry } from '@orderly.network/hooks';
function OrderDebugger() {
const { formattedOrder, metaState, helper } = useOrderEntry('PERP_ETH_USDC');
// Check for validation errors
if (metaState.errors) {
console.log('Order Errors:', metaState.errors);
}
// Check order readiness
console.log('Order Ready:', {
canSubmit: !metaState.errors && formattedOrder,
maxQty: helper.maxQty,
estLiqPrice: helper.estLiqPrice,
});
}
async function submitOrderWithDebug(order) {
try {
const result = await submit();
console.log('Order submitted:', result);
} catch (error) {
console.error('Order failed:', {
code: error.code,
message: error.message,
});
if (error.code === -2001) {
console.log('Fix: Deposit more USDC or reduce order size');
} else if (error.code === -2002) {
console.log('Fix: Reduce leverage or position size');
}
throw error;
}
}
import { useDeposit } from '@orderly.network/hooks';
function DepositDebugger() {
const { deposit, balance, allowance, approve } = useDeposit();
const handleDeposit = async (amount) => {
console.log('Deposit Debug:', {
amount,
walletBalance: balance,
currentAllowance: allowance,
needsApproval: Number(amount) > Number(allowance),
});
try {
if (Number(amount) > Number(allowance)) {
console.log('Approving USDC...');
await approve(amount);
}
console.log('Depositing...');
const result = await deposit();
console.log('Deposit success:', result);
} catch (error) {
console.error('Deposit failed:', error);
if (error.message.includes('user rejected')) {
console.log('User rejected transaction');
} else if (error.message.includes('insufficient')) {
console.log('Insufficient balance or gas');
}
}
};
}
// Log all hook state changes
function useDebugHook(hookName, value) {
useEffect(() => {
console.log(`[${hookName}]`, value);
}, [value, hookName]);
return value;
}
// Usage
const positions = useDebugHook('positions', usePositionStream().positions);
Access to fetch at 'https://api.orderly.org/...' has been blocked by CORS
Solutions:
// Implement exponential backoff
async function withRetry(fn, maxRetries = 3, baseDelay = 1000) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return await fn();
} catch (error) {
if (error.code === -1003 && attempt < maxRetries - 1) {
const delay = baseDelay * Math.pow(2, attempt);
console.log(`Rate limited, retrying in ${delay}ms...`);
await new Promise((resolve) => setTimeout(resolve, delay));
} else {
throw error;
}
}
}
}
Wrap your app with an error boundary:
import { ErrorBoundary } from '@orderly.network/react-app';
// Or create custom:
class OrderlyErrorBoundary extends React.Component {
state = { hasError: false, error: undefined };
static getDerivedStateFromError(error) {
return { hasError: true, error };
}
componentDidCatch(error, errorInfo) {
console.error('Orderly Error:', error, errorInfo);
}
render() {
if (this.state.hasError) {
return (
<div className="error-fallback">
<h2>Something went wrong</h2>
<pre>{this.state.error?.message}</pre>
<button onClick={() => window.location.reload()}>Reload Page</button>
</div>
);
}
return this.props.children;
}
}
SignedIn?PERP_ETH_USDC)metaState.errors?function OrderlyDebugPanel() {
const { state } = useAccount();
const wsStatus = useWsStatus();
const { data: accountInfo } = useAccountInfo();
if (!import.meta.env.DEV) return null;
return (
<div className="fixed bottom-4 right-4 bg-black/80 text-white p-4 rounded-lg text-xs">
<h3 className="font-bold mb-2">Debug Panel</h3>
<div>Account: {state.status}</div>
<div>WS: {wsStatus}</div>
<div>Balance: {accountInfo?.freeCollateral?.toFixed(2)} USDC</div>
</div>
);
}