orderly-sdk-wallet-connection
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseOrderly Network: SDK Wallet Connection
Orderly Network: SDK Wallet Connection
A comprehensive guide to integrating wallet connection in Orderly Network DEX applications, supporting both EVM (Ethereum, Arbitrum, etc.) and Solana wallets.
Orderly Network DEX应用钱包连接集成完整指南,支持EVM(以太坊、Arbitrum等)和Solana钱包。
When to Use
适用场景
- Setting up wallet connection for a new DEX
- Supporting multiple wallet types (MetaMask, Phantom, etc.)
- Implementing chain switching
- Managing authentication state
- 为新的DEX搭建钱包连接功能
- 支持多种钱包类型(MetaMask、Phantom等)
- 实现链切换功能
- 管理认证状态
Prerequisites
前置条件
- Orderly SDK packages installed
- Providers configured (see )
orderly-sdk-dex-architecture - Wallet packages installed (,
@web3-onboard/*)@solana/wallet-adapter-*
- 已安装Orderly SDK包
- 已配置Providers(参考)
orderly-sdk-dex-architecture - 已安装钱包包(、
@web3-onboard/*)@solana/wallet-adapter-*
Overview
概述
Orderly Network supports omnichain trading, meaning users can connect wallets from multiple blockchain ecosystems:
- EVM Chains: Ethereum, Arbitrum, Optimism, Base, Polygon, BSC, Avalanche, etc.
- Solana: Mainnet and Devnet
The SDK provides a unified wallet connection layer that abstracts the differences between these ecosystems.
Orderly Network支持跨链交易,用户可连接来自多个区块链生态的钱包:
- EVM链:以太坊、Arbitrum、Optimism、Base、Polygon、BSC、Avalanche等
- Solana:主网和测试网
SDK提供统一的钱包连接层,抽象了不同生态系统之间的差异。
Wallet Connector Package
钱包连接器包
Note: Thepackage works out of the box with sensible defaults. Both@orderly.network/wallet-connectorandsolanaInitialprops are optional.evmInitial
bash
undefined注意:包默认配置即可直接使用,@orderly.network/wallet-connector和solanaInitial属性均为可选。evmInitial
bash
undefinedMain connector package
核心连接器包
npm install @orderly.network/wallet-connector
npm install @orderly.network/wallet-connector
Optional: EVM wallet packages (for custom wallet config like WalletConnect)
可选:EVM钱包包(用于自定义钱包配置,如WalletConnect)
npm install @web3-onboard/injected-wallets @web3-onboard/walletconnect
npm install @web3-onboard/injected-wallets @web3-onboard/walletconnect
Optional: Solana wallet packages (for custom Solana wallet config)
可选:Solana钱包包(用于自定义Solana钱包配置)
npm install @solana/wallet-adapter-base @solana/wallet-adapter-wallets
undefinednpm install @solana/wallet-adapter-base @solana/wallet-adapter-wallets
undefinedRequired Dependencies Summary
依赖包汇总
| Package | Purpose | Required For |
|---|---|---|
| MetaMask, Coinbase Wallet, Rabby, etc. | EVM wallet connection |
| WalletConnect protocol | Mobile & multi-platform wallets |
| Solana wallet adapter base | All Solana wallets |
| Phantom, Solflare, Ledger adapters | Solana wallet connection |
| Package | 用途 | 适用场景 |
|---|---|---|
| 支持MetaMask、Coinbase Wallet、Rabby等 | EVM钱包连接 |
| 提供WalletConnect协议支持 | 移动端及跨平台钱包连接 |
| Solana钱包适配器基础组件 | 所有Solana钱包连接 |
| 提供Phantom、Solflare、Ledger适配器 | Solana钱包连接 |
Architecture
架构
┌──────────────────────────────────────────────────────────────┐
│ WalletConnectorProvider │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ SolanaProvider │ │
│ │ (ConnectionProvider + WalletProvider + ModalProvider)│ │
│ │ ┌───────────────────────────────────────────────┐ │ │
│ │ │ InitEvm │ │ │
│ │ │ (Web3OnboardProvider for EVM wallets) │ │ │
│ │ │ ┌─────────────────────────────────────────┐ │ │ │
│ │ │ │ Main │ │ │ │
│ │ │ │ (WalletConnectorContext - unified API) │ │ │ │
│ │ │ │ ┌─────────────────────────────────┐ │ │ │ │
│ │ │ │ │ Your App │ │ │ │ │
│ │ │ │ └─────────────────────────────────┘ │ │ │ │
│ │ │ └─────────────────────────────────────────┘ │ │ │
│ │ └───────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘┌──────────────────────────────────────────────────────────────┐
│ WalletConnectorProvider │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ SolanaProvider │ │
│ │ (ConnectionProvider + WalletProvider + ModalProvider)│ │
│ │ ┌───────────────────────────────────────────────┐ │ │
│ │ │ InitEvm │ │ │
│ │ │ (Web3OnboardProvider for EVM wallets) │ │ │
│ │ │ ┌─────────────────────────────────────────┐ │ │ │
│ │ │ │ Main │ │ │ │
│ │ │ │ (WalletConnectorContext - unified API) │ │ │ │
│ │ │ │ ┌─────────────────────────────────┐ │ │ │ │
│ │ │ │ │ Your App │ │ │ │ │
│ │ │ │ └─────────────────────────────────┘ │ │ │ │
│ │ │ └─────────────────────────────────────────┘ │ │ │
│ │ └───────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘Basic Setup
基础配置
IMPORTANT: The must be consistent between (Solana network) and .
networkIdWalletConnectorProviderOrderlyAppProvider重要提示:(Solana网络)和的必须保持一致。
WalletConnectorProviderOrderlyAppProvidernetworkId1. WalletConnectorProvider
1. WalletConnectorProvider
Wrap your app with the .
WalletConnectorProviderMinimal Setup (uses defaults):
tsx
import { WalletConnectorProvider } from '@orderly.network/wallet-connector';
import { OrderlyAppProvider } from '@orderly.network/react-app';
import type { NetworkId } from '@orderly.network/types';
function App() {
const networkId: NetworkId = 'mainnet';
return (
<WalletConnectorProvider>
<OrderlyAppProvider
brokerId="your_broker_id"
brokerName="Your DEX Name"
networkId={networkId}
>
<YourApp />
</OrderlyAppProvider>
</WalletConnectorProvider>
);
}Custom Setup (explicit wallet configuration):
tsx
import { WalletConnectorProvider } from '@orderly.network/wallet-connector';
import { WalletAdapterNetwork } from '@solana/wallet-adapter-base';
import { OrderlyAppProvider } from '@orderly.network/react-app';
import type { NetworkId } from '@orderly.network/types';
function App() {
const networkId: NetworkId = 'mainnet';
return (
<WalletConnectorProvider
solanaInitial={{
network:
networkId === 'mainnet' ? WalletAdapterNetwork.Mainnet : WalletAdapterNetwork.Devnet,
wallets: getSolanaWallets(),
}}
evmInitial={{
options: {
wallets: getEvmWallets(),
appMetadata: {
name: 'My DEX',
description: 'Decentralized Exchange',
},
},
}}
>
<OrderlyAppProvider
brokerId="your_broker_id"
brokerName="Your DEX Name"
networkId={networkId}
>
<YourApp />
</OrderlyAppProvider>
</WalletConnectorProvider>
);
}使用包裹你的应用。
WalletConnectorProvider极简配置(使用默认值):
tsx
import { WalletConnectorProvider } from '@orderly.network/wallet-connector';
import { OrderlyAppProvider } from '@orderly.network/react-app';
import type { NetworkId } from '@orderly.network/types';
function App() {
const networkId: NetworkId = 'mainnet';
return (
<WalletConnectorProvider>
<OrderlyAppProvider
brokerId="your_broker_id"
brokerName="Your DEX Name"
networkId={networkId}
>
<YourApp />
</OrderlyAppProvider>
</WalletConnectorProvider>
);
}自定义配置(显式钱包配置):
tsx
import { WalletConnectorProvider } from '@orderly.network/wallet-connector';
import { WalletAdapterNetwork } from '@solana/wallet-adapter-base';
import { OrderlyAppProvider } from '@orderly.network/react-app';
import type { NetworkId } from '@orderly.network/types';
function App() {
const networkId: NetworkId = 'mainnet';
return (
<WalletConnectorProvider
solanaInitial={{
network:
networkId === 'mainnet' ? WalletAdapterNetwork.Mainnet : WalletAdapterNetwork.Devnet,
wallets: getSolanaWallets(),
}}
evmInitial={{
options: {
wallets: getEvmWallets(),
appMetadata: {
name: 'My DEX',
description: 'Decentralized Exchange',
},
},
}}
>
<OrderlyAppProvider
brokerId="your_broker_id"
brokerName="Your DEX Name"
networkId={networkId}
>
<YourApp />
</OrderlyAppProvider>
</WalletConnectorProvider>
);
}2. Configure EVM Wallets
2. 配置EVM钱包
tsx
import injectedOnboard from '@web3-onboard/injected-wallets';
import walletConnectOnboard from '@web3-onboard/walletconnect';
import binanceWallet from '@binance/w3w-blocknative-connector';
export function getEvmWallets() {
const walletConnectProjectId = 'YOUR_WALLETCONNECT_PROJECT_ID';
return [
// Injected wallets (MetaMask, Rabby, Coinbase, etc.)
injectedOnboard(),
// Binance Web3 Wallet
binanceWallet({ options: { lng: 'en' } }),
// WalletConnect (for mobile wallets)
walletConnectOnboard({
projectId: walletConnectProjectId,
qrModalOptions: { themeMode: 'dark' },
dappUrl: window.location.origin,
}),
];
}tsx
import injectedOnboard from '@web3-onboard/injected-wallets';
import walletConnectOnboard from '@web3-onboard/walletconnect';
import binanceWallet from '@binance/w3w-blocknative-connector';
export function getEvmWallets() {
const walletConnectProjectId = 'YOUR_WALLETCONNECT_PROJECT_ID';
return [
// 注入式钱包(MetaMask、Rabby、Coinbase等)
injectedOnboard(),
// Binance Web3 Wallet
binanceWallet({ options: { lng: 'en' } }),
// WalletConnect(支持移动端钱包)
walletConnectOnboard({
projectId: walletConnectProjectId,
qrModalOptions: { themeMode: 'dark' },
dappUrl: window.location.origin,
}),
];
}3. Configure Solana Wallets
3. 配置Solana钱包
tsx
import { WalletAdapterNetwork } from '@solana/wallet-adapter-base';
import {
PhantomWalletAdapter,
SolflareWalletAdapter,
LedgerWalletAdapter,
} from '@solana/wallet-adapter-wallets';
export function getSolanaWallets(networkId: 'mainnet' | 'testnet') {
return [new PhantomWalletAdapter(), new SolflareWalletAdapter(), new LedgerWalletAdapter()];
}tsx
import { WalletAdapterNetwork } from '@solana/wallet-adapter-base';
import {
PhantomWalletAdapter,
SolflareWalletAdapter,
LedgerWalletAdapter,
} from '@solana/wallet-adapter-wallets';
export function getSolanaWallets(networkId: 'mainnet' | 'testnet') {
return [new PhantomWalletAdapter(), new SolflareWalletAdapter(), new LedgerWalletAdapter()];
}Using Wallet Connection
使用钱包连接
Access Wallet Context
访问钱包上下文
The SDK provides a unified :
WalletConnectorContexttsx
import { useContext } from 'react';
import { WalletConnectorContext } from '@orderly.network/hooks';
function WalletStatus() {
const {
connect, // Connect wallet function
disconnect, // Disconnect wallet function
connecting, // Boolean: connection in progress
wallet, // Connected wallet info
connectedChain, // Current chain info
setChain, // Switch chain function
namespace, // "evm" | "solana" | null
} = useContext(WalletConnectorContext);
return (
<div>
{wallet ? (
<>
<p>Connected: {wallet.accounts[0].address}</p>
<p>Chain: {connectedChain?.id}</p>
<button onClick={disconnect}>Disconnect</button>
</>
) : (
<button onClick={() => connect({ chainId: 42161 })}>Connect Wallet</button>
)}
</div>
);
}SDK提供统一的:
WalletConnectorContexttsx
import { useContext } from 'react';
import { WalletConnectorContext } from '@orderly.network/hooks';
function WalletStatus() {
const {
connect, // 连接钱包函数
disconnect, // 断开钱包函数
connecting, // 连接状态:是否正在连接
wallet, // 已连接钱包信息
connectedChain, // 当前链信息
setChain, // 切换链函数
namespace, // "evm" | "solana" | null
} = useContext(WalletConnectorContext);
return (
<div>
{wallet ? (
<>
<p>已连接:{wallet.accounts[0].address}</p>
<p>当前链:{connectedChain?.id}</p>
<button onClick={disconnect}>断开连接</button>
</>
) : (
<button onClick={() => connect({ chainId: 42161 })}>连接钱包</button>
)}
</div>
);
}Connect to Specific Chain
连接指定链
tsx
const { connect } = useContext(WalletConnectorContext);
// Connect to EVM chain (Arbitrum)
await connect({ chainId: 42161 });
// Connect to Solana
await connect({ chainId: 900900900 }); // Solana mainnettsx
const { connect } = useContext(WalletConnectorContext);
// 连接EVM链(Arbitrum)
await connect({ chainId: 42161 });
// 连接Solana
await connect({ chainId: 900900900 }); // Solana主网Switch Chains
切换链
tsx
const { setChain, connectedChain } = useContext(WalletConnectorContext);
// Switch to Optimism
await setChain({ chainId: '0xa' }); // Hex format for EVM
// Switch to Base
await setChain({ chainId: '0x2105' });tsx
const { setChain, connectedChain } = useContext(WalletConnectorContext);
// 切换到Optimism
await setChain({ chainId: '0xa' }); // EVM使用十六进制格式
// 切换到Base
await setChain({ chainId: '0x2105' });Account State Machine
账户状态机
After wallet connection, users need to complete Orderly account setup:
NotConnected (0) → Connected (1) → NotSignedIn (2) → SignedIn (3)
↓
EnableTrading (5)钱包连接后,用户需要完成Orderly账户设置:
NotConnected (0) → Connected (1) → NotSignedIn (2) → SignedIn (3)
↓
EnableTrading (5)Using useAccount Hook
使用useAccount Hook
tsx
import { useAccount, AccountStatusEnum } from '@orderly.network/hooks';
function AccountStatus() {
const { account, state, createOrderlyKey, createAccount, disconnect } = useAccount();
switch (state.status) {
case AccountStatusEnum.NotConnected:
return <ConnectWalletButton />;
case AccountStatusEnum.Connected:
return <button onClick={() => createAccount()}>Create Orderly Account</button>;
case AccountStatusEnum.NotSignedIn:
return <button onClick={() => createOrderlyKey()}>Enable Trading</button>;
case AccountStatusEnum.SignedIn:
return <TradingInterface />;
}
}tsx
import { useAccount, AccountStatusEnum } from '@orderly.network/hooks';
function AccountStatus() {
const { account, state, createOrderlyKey, createAccount, disconnect } = useAccount();
switch (state.status) {
case AccountStatusEnum.NotConnected:
return <ConnectWalletButton />;
case AccountStatusEnum.Connected:
return <button onClick={() => createAccount()}>创建Orderly账户</button>;
case AccountStatusEnum.NotSignedIn:
return <button onClick={() => createOrderlyKey()}>启用交易</button>;
case AccountStatusEnum.SignedIn:
return <TradingInterface />;
}
}UI Components for Wallet Connection
钱包连接UI组件
WalletConnectorWidget
WalletConnectorWidget
Pre-built wallet connection UI:
tsx
import { WalletConnectorWidget, WalletConnectorModalId } from '@orderly.network/ui-connector';
import { modal } from '@orderly.network/ui';
// Show wallet connect modal
function ConnectButton() {
return <button onClick={() => modal.show(WalletConnectorModalId)}>Connect Wallet</button>;
}预构建的钱包连接UI:
tsx
import { WalletConnectorWidget, WalletConnectorModalId } from '@orderly.network/ui-connector';
import { modal } from '@orderly.network/ui';
// 显示钱包连接弹窗
function ConnectButton() {
return <button onClick={() => modal.show(WalletConnectorModalId)}>连接钱包</button>;
}AuthGuard
AuthGuard
Wrap content that requires authentication:
tsx
import { AuthGuard } from '@orderly.network/ui-connector';
function TradingPage() {
return (
<AuthGuard fallback={<ConnectPrompt />}>
<OrderEntry symbol="PERP_ETH_USDC" />
</AuthGuard>
);
}包裹需要认证的内容:
tsx
import { AuthGuard } from '@orderly.network/ui-connector';
function TradingPage() {
return (
<AuthGuard fallback={<ConnectPrompt />}>
<OrderEntry symbol="PERP_ETH_USDC" />
</AuthGuard>
);
}useAuthGuard Hook
useAuthGuard Hook
tsx
import { useAuthGuard } from '@orderly.network/ui-connector';
function TradeButton() {
const { isAuthenticated, triggerAuth } = useAuthGuard();
const handleClick = () => {
if (!isAuthenticated) {
triggerAuth();
return;
}
// Proceed with trade
};
return <button onClick={handleClick}>Trade</button>;
}tsx
import { useAuthGuard } from '@orderly.network/ui-connector';
function TradeButton() {
const { isAuthenticated, triggerAuth } = useAuthGuard();
const handleClick = () => {
if (!isAuthenticated) {
triggerAuth();
return;
}
// 继续交易流程
};
return <button onClick={handleClick}>交易</button>;
}Supported Chains
支持的链
EVM Mainnet Chains
EVM主网链
| Chain | Chain ID | Network |
|---|---|---|
| Ethereum | 1 | mainnet |
| Arbitrum | 42161 | mainnet |
| Optimism | 10 | mainnet |
| Base | 8453 | mainnet |
| Polygon | 137 | mainnet |
| BSC | 56 | mainnet |
| Avalanche | 43114 | mainnet |
| Mantle | 5000 | mainnet |
| SEI | 1329 | mainnet |
| 链名称 | 链ID | 网络 |
|---|---|---|
| Ethereum | 1 | mainnet |
| Arbitrum | 42161 | mainnet |
| Optimism | 10 | mainnet |
| Base | 8453 | mainnet |
| Polygon | 137 | mainnet |
| BSC | 56 | mainnet |
| Avalanche | 43114 | mainnet |
| Mantle | 5000 | mainnet |
| SEI | 1329 | mainnet |
EVM Testnet Chains
EVM测试网链
| Chain | Chain ID | Network |
|---|---|---|
| Arbitrum Sepolia | 421614 | testnet |
| BSC Testnet | 97 | testnet |
| Monad Testnet | 10143 | testnet |
| 链名称 | 链ID | 网络 |
|---|---|---|
| Arbitrum Sepolia | 421614 | testnet |
| BSC Testnet | 97 | testnet |
| Monad Testnet | 10143 | testnet |
Solana
Solana
| Network | Chain ID (Internal) |
|---|---|
| Mainnet | 900900900 |
| Devnet | 901901901 |
| 网络 | 内部链ID |
|---|---|
| Mainnet | 900900900 |
| Devnet | 901901901 |
Chain Filtering
链过滤
Restrict which chains users can connect to:
tsx
<OrderlyAppProvider
brokerId="your_broker_id"
networkId="mainnet"
chainFilter={{
mainnet: [
{ id: 42161 }, // Arbitrum only
{ id: 10 }, // Optimism
],
testnet: [
{ id: 421614 }, // Arbitrum Sepolia
],
}}
>限制用户可连接的链:
tsx
<OrderlyAppProvider
brokerId="your_broker_id"
networkId="mainnet"
chainFilter={{
mainnet: [
{ id: 42161 }, // 仅支持Arbitrum
{ id: 10 }, // 支持Optimism
],
testnet: [
{ id: 421614 }, // 支持Arbitrum Sepolia
],
}}
>Handling Chain Changes
处理链变更
tsx
<OrderlyAppProvider
brokerId="your_broker_id"
networkId="mainnet"
onChainChanged={(chainId, { isTestnet }) => {
console.log(`Switched to chain ${chainId}`);
// Reload if switching between mainnet/testnet
if (isTestnet && networkId === "mainnet") {
localStorage.setItem("network", "testnet");
window.location.reload();
}
}}
>tsx
<OrderlyAppProvider
brokerId="your_broker_id"
networkId="mainnet"
onChainChanged={(chainId, { isTestnet }) => {
console.log(`切换到链 ${chainId}`);
// 若在主网和测试网之间切换则重载页面
if (isTestnet && networkId === "mainnet") {
localStorage.setItem("network", "testnet");
window.location.reload();
}
}}
>Privy Integration (Alternative)
Privy集成(替代方案)
For social login support, use Privy:
bash
npm install @orderly.network/wallet-connector-privytsx
import { WalletConnectorPrivy } from "@orderly.network/wallet-connector-privy";
<WalletConnectorPrivy
appId="YOUR_PRIVY_APP_ID"
loginMethods={["email", "google", "twitter"]}
>
<OrderlyAppProvider ...>
<App />
</OrderlyAppProvider>
</WalletConnectorPrivy>如需支持社交登录,可使用Privy:
bash
npm install @orderly.network/wallet-connector-privytsx
import { WalletConnectorPrivy } from "@orderly.network/wallet-connector-privy";
<WalletConnectorPrivy
appId="YOUR_PRIVY_APP_ID"
loginMethods={["email", "google", "twitter"]}
>
<OrderlyAppProvider ...>
<App />
</OrderlyAppProvider>
</WalletConnectorPrivy>Error Handling
错误处理
tsx
import { useEventEmitter } from '@orderly.network/hooks';
function WalletErrorHandler() {
const ee = useEventEmitter();
useEffect(() => {
const handleError = (error: { message: string }) => {
toast.error(error.message);
};
ee.on('wallet:connect-error', handleError);
return () => {
ee.off('wallet:connect-error', handleError);
};
}, [ee]);
return null;
}tsx
import { useEventEmitter } from '@orderly.network/hooks';
function WalletErrorHandler() {
const ee = useEventEmitter();
useEffect(() => {
const handleError = (error: { message: string }) => {
toast.error(error.message);
};
ee.on('wallet:connect-error', handleError);
return () => {
ee.off('wallet:connect-error', handleError);
};
}, [ee]);
return null;
}Best Practices
最佳实践
1. Check Wallet Connection Before Actions
1. 操作前检查钱包连接状态
tsx
const { wallet } = useContext(WalletConnectorContext);
if (!wallet) {
modal.show(WalletConnectorModalId);
return;
}tsx
const { wallet } = useContext(WalletConnectorContext);
if (!wallet) {
modal.show(WalletConnectorModalId);
return;
}2. Use AuthGuard for Protected Content
2. 使用AuthGuard保护内容
tsx
<AuthGuard>
<ProtectedTradingUI />
</AuthGuard>tsx
<AuthGuard>
<ProtectedTradingUI />
</AuthGuard>3. Handle Network Mismatches
3. 处理网络不匹配
tsx
const { connectedChain } = useContext(WalletConnectorContext);
const expectedChainId = networkId === 'mainnet' ? 42161 : 421614;
if (connectedChain?.id !== expectedChainId) {
return <SwitchNetworkPrompt />;
}tsx
const { connectedChain } = useContext(WalletConnectorContext);
const expectedChainId = networkId === 'mainnet' ? 42161 : 421614;
if (connectedChain?.id !== expectedChainId) {
return <SwitchNetworkPrompt />;
}4. Persist Network Selection
4. 持久化网络选择
tsx
const NETWORK_KEY = 'orderly_network_id';
function getNetworkId(): NetworkId {
return (localStorage.getItem(NETWORK_KEY) as NetworkId) || 'mainnet';
}tsx
const NETWORK_KEY = 'orderly_network_id';
function getNetworkId(): NetworkId {
return (localStorage.getItem(NETWORK_KEY) as NetworkId) || 'mainnet';
}Related Skills
相关技能
- orderly-sdk-dex-architecture - Provider setup and configuration
- orderly-sdk-install-dependency - Installing wallet packages
- orderly-sdk-trading-workflows - Trading implementation
- orderly-sdk-debugging - Troubleshooting wallet issues
- orderly-api-authentication - Understanding the auth flow
- orderly-sdk-dex-architecture - Provider配置与设置
- orderly-sdk-install-dependency - 钱包包安装
- orderly-sdk-trading-workflows - 交易流程实现
- orderly-sdk-debugging - 钱包问题排查
- orderly-api-authentication - 认证流程理解