新增:充值弹窗展示并校验最小到账金额,读取后台系统参数配置。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
马丁 2026-08-05 22:45:13 +08:00
parent 1c64d3a834
commit 19e4322abd
7 changed files with 72 additions and 10 deletions

View File

@ -199,3 +199,24 @@ export async function getWithdrawConfig(
return get<WithdrawConfigResponse>('/pmset/getWithdrawConfig', undefined, config)
}
/** 充值配置(GET /pmset/getDepositConfig) */
export interface DepositConfig {
/** 最小到账金额,最小精度整数(1U=1e6;系统参数配置口径 1=1U,默认 10) */
minDepositAmount: number
}
export interface DepositConfigResponse extends ApiResponse<DepositConfig> {
code: number
data?: DepositConfig
msg: string
}
/**
* GET /pmset/getDepositConfig
* 获取最小到账金额(系统参数 minDepositAmount,配置 1=1U,默认 10;缺失自动插入)
*/
export async function getDepositConfig(
config?: { headers?: Record<string, string> },
): Promise<DepositConfigResponse> {
return get<DepositConfigResponse>('/pmset/getDepositConfig', undefined, config)
}

View File

@ -126,6 +126,7 @@
@update:model-value="onDepositNetworkChange"
/>
<p class="crypto-support-tip">{{ t('deposit.supportedTip') }}</p>
<p class="crypto-min-amount-tip">{{ t('deposit.minArrivalAmount', { amount: minDepositDisplay }) }}</p>
<div class="crypto-addr-head">
<span class="crypto-addr-title">{{ t('deposit.depositAddress') }}</span>
<v-btn color="primary" variant="text" class="crypto-copy-btn" :disabled="!depositAddress" @click="copyAddress">
@ -214,6 +215,7 @@
@update:model-value="onDepositNetworkChange"
/>
<p class="crypto-support-tip exchange-mm-hint">{{ t('deposit.metamaskSendHint') }}</p>
<p class="crypto-min-amount-tip">{{ t('deposit.minArrivalAmount', { amount: minDepositDisplay }) }}</p>
<v-text-field
v-model="depositAmountStr"
:label="t('deposit.amountUsdc')"
@ -317,7 +319,7 @@ import { getDepositAddress, collectDeposit } from '@/api/wallet'
import { useUserStore } from '@/stores/user'
import { useToastStore } from '@/stores/toast'
import { ethers } from 'ethers'
import { USDC_ADDRESS_BY_CHAIN } from '@/api/pmset'
import { USDC_ADDRESS_BY_CHAIN, getDepositConfig, amountToUsdcDisplay } from '@/api/pmset'
import {
WALLET_PRIMARY_NETWORK_ID,
useWalletNetworkGuard,
@ -353,6 +355,23 @@ const connecting = ref(false)
const depositAmountStr = ref('')
const metamaskSendLoading = ref(false)
const metamaskSendError = ref('')
/** 最小到账金额(最小精度,默认 10U = 10_000_000) */
const minDepositRaw = ref(10_000_000)
const minDepositDisplay = computed(() => amountToUsdcDisplay(minDepositRaw.value))
async function loadDepositConfig() {
try {
const res = await getDepositConfig()
if (res.code === 0 || res.code === 200) {
const raw = Number(res.data?.minDepositAmount ?? 0)
minDepositRaw.value = Number.isFinite(raw) && raw > 0 ? raw : 10_000_000
return
}
} catch (e) {
console.error('[loadDepositConfig]', e)
}
minDepositRaw.value = 10_000_000
}
const depositFooterWalletBtnRef = ref<ComponentPublicInstance | null>(null)
const depositFooterCollectBtnRef = ref<ComponentPublicInstance | null>(null)
@ -926,6 +945,10 @@ async function sendUsdcViaMetaMask() {
metamaskSendError.value = t('deposit.invalidAmount')
return
}
if (amountWei < BigInt(minDepositRaw.value)) {
metamaskSendError.value = t('deposit.belowMinArrivalAmount', { amount: minDepositDisplay.value })
return
}
if (!USDC_ADDRESS_BY_CHAIN[selectedNetwork.value]) {
metamaskSendError.value = t('deposit.networkConfigError')
return
@ -1005,6 +1028,7 @@ watch(
metamaskSendError.value = ''
stopDepositCheck()
} else {
void loadDepositConfig()
if (step.value === 'crypto') fetchAddress()
}
},
@ -1127,6 +1151,13 @@ onUnmounted(() => {
padding-bottom: 0;
align-items: center;
}
.crypto-min-amount-tip {
margin: 0 0 12px;
font-size: 0.8125rem;
font-weight: 500;
color: #374151;
line-height: 1.4;
}
.crypto-support-tip {
font-size: 0.75rem;
font-weight: 500;

View File

@ -494,7 +494,9 @@
"txConfirmTimeout": "Transaction was submitted but not confirmed in time. Check it in your wallet or a block explorer.",
"walletRpcIncomplete": "Your wallet returned incomplete transaction data. If issues persist, update MetaMask or change the RPC.",
"depositHistory": "Deposit History",
"depositStatusAll": "All"
"depositStatusAll": "All",
"minArrivalAmount": "Minimum credit amount: {amount} USDC",
"belowMinArrivalAmount": "Deposit amount must be at least {amount} USDC"
},
"withdraw": {
"title": "Withdraw",

View File

@ -494,7 +494,9 @@
"txConfirmTimeout": "トランザクションは送信されましたが、一定時間内に確認されませんでした。ウォレットまたはブロックエクスプローラーでご確認ください。",
"walletRpcIncomplete": "ウォレットから返ったトランザクション情報が不完全です。MetaMask の更新や RPC の変更をお試しください。",
"depositHistory": "入金履歴",
"depositStatusAll": "すべて"
"depositStatusAll": "すべて",
"minArrivalAmount": "最小着金金額:{amount} USDC",
"belowMinArrivalAmount": "入金額は {amount} USDC 以上である必要があります"
},
"withdraw": {
"title": "出金",

View File

@ -494,7 +494,9 @@
"txConfirmTimeout": "거래는 제출되었지만 제한 시간 안에 확인되지 않았습니다. 지갑이나 블록 탐색기에서 확인해 주세요.",
"walletRpcIncomplete": "지갑에서 반환된 거래 데이터가 불완전합니다. MetaMask를 업데이트하거나 RPC를 변경해 보세요.",
"depositHistory": "입금 내역",
"depositStatusAll": "전체"
"depositStatusAll": "전체",
"minArrivalAmount": "최소 입금 금액: {amount} USDC",
"belowMinArrivalAmount": "입금 금액은 최소 {amount} USDC 이상이어야 합니다"
},
"withdraw": {
"title": "출금",

View File

@ -494,7 +494,9 @@
"txConfirmTimeout": "交易已提交,但长时间未在链上确认,请在浏览器钱包或区块浏览器中查看该笔交易。",
"walletRpcIncomplete": "钱包返回的交易数据不完整。已改为直连接口发交易;若仍失败请更新 MetaMask 或更换 RPC。",
"depositHistory": "充值历史",
"depositStatusAll": "全部"
"depositStatusAll": "全部",
"minArrivalAmount": "最小到账金额:{amount} USDC",
"belowMinArrivalAmount": "充值金额不能低于 {amount} USDC"
},
"withdraw": {
"title": "提现",

View File

@ -494,7 +494,9 @@
"txConfirmTimeout": "交易已提交,但長時間未在鏈上確認,請在瀏覽器錢包或區塊瀏覽器中查看該筆交易。",
"walletRpcIncomplete": "錢包回傳的交易資料不完整。已改為直接介面發送;若仍失敗請更新 MetaMask 或更換 RPC。",
"depositHistory": "充值歷史",
"depositStatusAll": "全部"
"depositStatusAll": "全部",
"minArrivalAmount": "最小到帳金額:{amount} USDC",
"belowMinArrivalAmount": "充值金額不能低於 {amount} USDC"
},
"withdraw": {
"title": "提現",