feat(trading-service, mining-admin-web): 支持在管理后台配置做市商钱包地址
- 后端: 在 UpdateConfigDto 和 updateConfig 方法中添加 kavaWalletAddress 字段 - 前端: 在充值对话框中添加钱包地址配置输入框 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
6bcfa18b01
commit
40389fcfc7
|
|
@ -78,6 +78,10 @@ class UpdateConfigDto {
|
||||||
@IsOptional()
|
@IsOptional()
|
||||||
@IsNumber()
|
@IsNumber()
|
||||||
discountRate?: number;
|
discountRate?: number;
|
||||||
|
|
||||||
|
@IsOptional()
|
||||||
|
@IsString()
|
||||||
|
kavaWalletAddress?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
class UpdateMakerConfigDto {
|
class UpdateMakerConfigDto {
|
||||||
|
|
|
||||||
|
|
@ -760,6 +760,7 @@ export class MarketMakerService {
|
||||||
maxIntervalMs?: number;
|
maxIntervalMs?: number;
|
||||||
priceStrategy?: string;
|
priceStrategy?: string;
|
||||||
discountRate?: number;
|
discountRate?: number;
|
||||||
|
kavaWalletAddress?: string;
|
||||||
},
|
},
|
||||||
): Promise<MarketMakerConfig | null> {
|
): Promise<MarketMakerConfig | null> {
|
||||||
const config = await this.getConfig(name);
|
const config = await this.getConfig(name);
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import { PageHeader } from '@/components/layout/page-header';
|
||||||
import {
|
import {
|
||||||
useMarketMakerConfig,
|
useMarketMakerConfig,
|
||||||
useInitializeMarketMaker,
|
useInitializeMarketMaker,
|
||||||
|
useUpdateMarketMakerConfig,
|
||||||
useDepositCash,
|
useDepositCash,
|
||||||
useWithdrawCash,
|
useWithdrawCash,
|
||||||
useDepositShares,
|
useDepositShares,
|
||||||
|
|
@ -80,8 +81,10 @@ export default function MarketMakerPage() {
|
||||||
const refreshOrdersMutation = useRefreshOrders();
|
const refreshOrdersMutation = useRefreshOrders();
|
||||||
const cancelAllOrdersMutation = useCancelAllOrders();
|
const cancelAllOrdersMutation = useCancelAllOrders();
|
||||||
const setDepthEnabledMutation = useSetDepthEnabled();
|
const setDepthEnabledMutation = useSetDepthEnabled();
|
||||||
|
const updateConfigMutation = useUpdateMarketMakerConfig();
|
||||||
|
|
||||||
const [initAccountSeq, setInitAccountSeq] = useState('MM001');
|
const [initAccountSeq, setInitAccountSeq] = useState('MM001');
|
||||||
|
const [walletAddressInput, setWalletAddressInput] = useState('');
|
||||||
const [depositCashAmount, setDepositCashAmount] = useState('');
|
const [depositCashAmount, setDepositCashAmount] = useState('');
|
||||||
const [withdrawCashAmount, setWithdrawCashAmount] = useState('');
|
const [withdrawCashAmount, setWithdrawCashAmount] = useState('');
|
||||||
const [depositSharesAmount, setDepositSharesAmount] = useState('');
|
const [depositSharesAmount, setDepositSharesAmount] = useState('');
|
||||||
|
|
@ -253,9 +256,30 @@ export default function MarketMakerPage() {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="text-center text-muted-foreground py-4">
|
<div className="space-y-4">
|
||||||
<AlertCircle className="h-8 w-8 mx-auto mb-2 text-yellow-500" />
|
<div className="text-center text-muted-foreground py-2">
|
||||||
<p>做市商钱包地址未配置</p>
|
<AlertCircle className="h-6 w-6 mx-auto mb-2 text-yellow-500" />
|
||||||
|
<p className="text-sm">做市商钱包地址未配置</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<Label className="text-xs">配置钱包地址 (Kava EVM)</Label>
|
||||||
|
<Input
|
||||||
|
value={walletAddressInput}
|
||||||
|
onChange={(e) => setWalletAddressInput(e.target.value)}
|
||||||
|
placeholder="0x..."
|
||||||
|
className="mt-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<Button
|
||||||
|
className="w-full"
|
||||||
|
onClick={() => {
|
||||||
|
updateConfigMutation.mutate({ kavaWalletAddress: walletAddressInput });
|
||||||
|
setWalletAddressInput('');
|
||||||
|
}}
|
||||||
|
disabled={updateConfigMutation.isPending || !walletAddressInput || !walletAddressInput.startsWith('0x')}
|
||||||
|
>
|
||||||
|
{updateConfigMutation.isPending ? '保存中...' : '保存钱包地址'}
|
||||||
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
|
|
@ -449,9 +473,30 @@ export default function MarketMakerPage() {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<div className="text-center text-muted-foreground py-4">
|
<div className="space-y-4">
|
||||||
<AlertCircle className="h-8 w-8 mx-auto mb-2 text-yellow-500" />
|
<div className="text-center text-muted-foreground py-2">
|
||||||
<p>做市商钱包地址未配置</p>
|
<AlertCircle className="h-6 w-6 mx-auto mb-2 text-yellow-500" />
|
||||||
|
<p className="text-sm">做市商钱包地址未配置</p>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<Label className="text-xs">配置钱包地址 (Kava EVM)</Label>
|
||||||
|
<Input
|
||||||
|
value={walletAddressInput}
|
||||||
|
onChange={(e) => setWalletAddressInput(e.target.value)}
|
||||||
|
placeholder="0x..."
|
||||||
|
className="mt-1"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<Button
|
||||||
|
className="w-full"
|
||||||
|
onClick={() => {
|
||||||
|
updateConfigMutation.mutate({ kavaWalletAddress: walletAddressInput });
|
||||||
|
setWalletAddressInput('');
|
||||||
|
}}
|
||||||
|
disabled={updateConfigMutation.isPending || !walletAddressInput || !walletAddressInput.startsWith('0x')}
|
||||||
|
>
|
||||||
|
{updateConfigMutation.isPending ? '保存中...' : '保存钱包地址'}
|
||||||
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
|
|
|
||||||
|
|
@ -142,6 +142,7 @@ export const marketMakerApi = {
|
||||||
maxIntervalMs?: number;
|
maxIntervalMs?: number;
|
||||||
priceStrategy?: string;
|
priceStrategy?: string;
|
||||||
discountRate?: number;
|
discountRate?: number;
|
||||||
|
kavaWalletAddress?: string;
|
||||||
}): Promise<{ success: boolean; message: string }> => {
|
}): Promise<{ success: boolean; message: string }> => {
|
||||||
const response = await tradingClient.post(`/admin/market-maker/${name}/config`, data);
|
const response = await tradingClient.post(`/admin/market-maker/${name}/config`, data);
|
||||||
return response.data;
|
return response.data;
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ export function useUpdateMarketMakerConfig() {
|
||||||
maxIntervalMs?: number;
|
maxIntervalMs?: number;
|
||||||
priceStrategy?: string;
|
priceStrategy?: string;
|
||||||
discountRate?: number;
|
discountRate?: number;
|
||||||
|
kavaWalletAddress?: string;
|
||||||
}) => marketMakerApi.updateConfig(MARKET_MAKER_NAME, data),
|
}) => marketMakerApi.updateConfig(MARKET_MAKER_NAME, data),
|
||||||
onSuccess: (data) => {
|
onSuccess: (data) => {
|
||||||
toast({ title: '成功', description: data.message });
|
toast({ title: '成功', description: data.message });
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue