From 5e670e64b39073676d6497a8087b7dad68cf9238 Mon Sep 17 00:00:00 2001 From: hailin Date: Wed, 10 Dec 2025 11:57:34 -0800 Subject: [PATCH] fix(blockchain): read token decimals from contract for deposit detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously decimals were hardcoded to 18, causing incorrect amount parsing for USDT which uses 6 decimals. Now reads decimals() from ERC20 contract when processing deposits. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../application/services/deposit-detection.service.ts | 5 ++++- .../infrastructure/blockchain/evm-provider.adapter.ts | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/backend/services/blockchain-service/src/application/services/deposit-detection.service.ts b/backend/services/blockchain-service/src/application/services/deposit-detection.service.ts index 2b5b4152..9417faaf 100644 --- a/backend/services/blockchain-service/src/application/services/deposit-detection.service.ts +++ b/backend/services/blockchain-service/src/application/services/deposit-detection.service.ts @@ -143,6 +143,9 @@ export class DepositDetectionService implements OnModuleInit { return; } + // 获取代币的实际 decimals(USDT 通常是 6 位,而不是 18 位) + const tokenDecimals = await this.evmProvider.getTokenDecimals(chainType, event.tokenContract); + // 创建充值记录 - 用户地址 const deposit = DepositTransaction.create({ chainType, @@ -150,7 +153,7 @@ export class DepositDetectionService implements OnModuleInit { fromAddress: EvmAddress.fromUnchecked(event.from), toAddress: EvmAddress.fromUnchecked(event.to), tokenContract: EvmAddress.fromUnchecked(event.tokenContract), - amount: TokenAmount.fromRaw(event.value, 18), + amount: TokenAmount.fromRaw(event.value, tokenDecimals), blockNumber: BlockNumber.create(event.blockNumber), blockTimestamp: event.blockTimestamp, logIndex: event.logIndex, diff --git a/backend/services/blockchain-service/src/infrastructure/blockchain/evm-provider.adapter.ts b/backend/services/blockchain-service/src/infrastructure/blockchain/evm-provider.adapter.ts index 90becf86..4d247786 100644 --- a/backend/services/blockchain-service/src/infrastructure/blockchain/evm-provider.adapter.ts +++ b/backend/services/blockchain-service/src/infrastructure/blockchain/evm-provider.adapter.ts @@ -137,6 +137,16 @@ export class EvmProviderAdapter { return TokenAmount.fromRaw(balance, Number(decimals)); } + /** + * 查询 ERC20 代币的 decimals + */ + async getTokenDecimals(chainType: ChainType, tokenContract: string): Promise { + const provider = this.getProvider(chainType); + const contract = new Contract(tokenContract, ERC20_BALANCE_ABI, provider); + const decimals = await contract.decimals(); + return Number(decimals); + } + /** * 查询原生代币余额 */