fix(mining-blockchain): 移除旧的 MARKET_MAKER_* 变量名引用

- main.ts: 使用 EUSDT/FUSDT_MARKET_MAKER_* 验证配置
- blockchain.config.ts: 使用 eusdtMarketMaker/fusdtMarketMaker 配置
- market-maker-deposit-detection.service.ts: 每种代币使用独立的做市商钱包地址

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-01-28 19:20:48 -08:00
parent 3b95a8a332
commit 219fb7bb69
3 changed files with 69 additions and 54 deletions

View File

@ -23,6 +23,7 @@ import { MarketMakerDepositConfirmedEvent } from '@/domain/events';
interface TokenConfig {
assetType: MarketMakerAssetType;
contract: string;
walletAddress: string;
name: string;
}
@ -36,7 +37,6 @@ interface TokenConfig {
export class MarketMakerDepositDetectionService implements OnModuleInit {
private readonly logger = new Logger(MarketMakerDepositDetectionService.name);
private readonly scanBatchSize: number;
private readonly marketMakerWallet: string;
private readonly tokenConfigs: TokenConfig[];
private isEnabled: boolean = false;
@ -54,49 +54,57 @@ export class MarketMakerDepositDetectionService implements OnModuleInit {
private readonly outboxRepo: IOutboxEventRepository,
) {
this.scanBatchSize = this.configService.get<number>('blockchain.scanBatchSize', 100);
this.marketMakerWallet = this.configService.get<string>('blockchain.marketMaker.walletAddress', '');
// 配置代币信息
// 配置代币信息和对应的做市商钱包
const eUsdtContract = this.configService.get<string>('blockchain.kava.eUsdtContract', '');
const fUsdtContract = this.configService.get<string>('blockchain.kava.fUsdtContract', '');
const eusdtMarketMakerAddress = this.configService.get<string>('blockchain.eusdtMarketMaker.walletAddress', '');
const fusdtMarketMakerAddress = this.configService.get<string>('blockchain.fusdtMarketMaker.walletAddress', '');
this.tokenConfigs = [
{
assetType: MarketMakerAssetType.EUSDT,
contract: eUsdtContract,
walletAddress: eusdtMarketMakerAddress,
name: '积分股 (eUSDT)',
},
{
assetType: MarketMakerAssetType.FUSDT,
contract: fUsdtContract,
walletAddress: fusdtMarketMakerAddress,
name: '积分值 (fUSDT)',
},
];
}
async onModuleInit() {
// 验证配置
if (!this.marketMakerWallet) {
// 验证配置:检查每种代币的做市商钱包地址
const validConfigs = this.tokenConfigs.filter((t) => t.contract && t.walletAddress);
if (validConfigs.length === 0) {
this.logger.warn(
'[INIT] 做市商钱包地址未配置 (MARKET_MAKER_WALLET_ADDRESS),做市商充值监控功能已禁用',
'[INIT] 没有有效的做市商钱包配置,做市商充值监控功能已禁用',
);
this.isEnabled = false;
return;
}
// 验证代币合约配置
const missingContracts = this.tokenConfigs.filter((t) => !t.contract);
if (missingContracts.length > 0) {
this.logger.warn(
`[INIT] 以下代币合约未配置: ${missingContracts.map((t) => t.name).join(', ')}`,
);
}
// 验证代币合约和钱包配置
this.tokenConfigs.forEach((t) => {
if (!t.walletAddress) {
this.logger.warn(`[INIT] ${t.name} 做市商钱包地址未配置,该代币充值监控已禁用`);
}
if (!t.contract) {
this.logger.warn(`[INIT] ${t.name} 代币合约未配置`);
}
});
this.isEnabled = true;
this.logger.log(`[INIT] MarketMakerDepositDetectionService initialized`);
this.logger.log(`[INIT] 做市商钱包地址: ${this.marketMakerWallet}`);
this.tokenConfigs.forEach((t) => {
this.logger.log(`[INIT] ${t.name}: ${t.contract || '未配置'}`);
if (t.contract && t.walletAddress) {
this.logger.log(`[INIT] ${t.name}: 合约=${t.contract}, 钱包=${t.walletAddress}`);
}
});
}
@ -111,7 +119,8 @@ export class MarketMakerDepositDetectionService implements OnModuleInit {
// 扫描每种代币
for (const tokenConfig of this.tokenConfigs) {
if (!tokenConfig.contract) continue;
// 跳过没有合约或钱包地址的代币
if (!tokenConfig.contract || !tokenConfig.walletAddress) continue;
try {
await this.scanTokenDeposits(chainType, tokenConfig);
@ -169,9 +178,9 @@ export class MarketMakerDepositDetectionService implements OnModuleInit {
tokenConfig.contract,
);
// 过滤出充值到做市商钱包的交易
// 过滤出充值到对应做市商钱包的交易
const deposits = events.filter(
(e) => e.to.toLowerCase() === this.marketMakerWallet.toLowerCase(),
(e) => e.to.toLowerCase() === tokenConfig.walletAddress.toLowerCase(),
);
// 处理充值
@ -233,7 +242,7 @@ export class MarketMakerDepositDetectionService implements OnModuleInit {
await this.depositRepo.save(deposit);
this.logger.log(
`[DEPOSIT] ${tokenConfig.name} deposit detected: ${event.txHash.slice(0, 10)}... -> ${this.marketMakerWallet.slice(0, 10)}... (${amountFormatted})`,
`[DEPOSIT] ${tokenConfig.name} deposit detected: ${event.txHash.slice(0, 10)}... -> ${tokenConfig.walletAddress.slice(0, 10)}... (${amountFormatted})`,
);
}

View File

@ -75,12 +75,16 @@ export default registerAs('blockchain', () => {
confirmations: parseInt(process.env.BSC_CONFIRMATIONS || '15', 10),
},
// 做市商 MPC 钱包配置
marketMaker: {
// 做市商 MPC 钱包地址(用于充值监控和提现)
walletAddress: process.env.MARKET_MAKER_WALLET_ADDRESS || '',
// MPC 用户名(用于签名)
mpcUsername: process.env.MARKET_MAKER_MPC_USERNAME || '',
// eUSDT (积分股) 做市商 MPC 钱包配置
eusdtMarketMaker: {
walletAddress: process.env.EUSDT_MARKET_MAKER_ADDRESS || '',
mpcUsername: process.env.EUSDT_MARKET_MAKER_USERNAME || '',
},
// fUSDT (积分值) 做市商 MPC 钱包配置
fusdtMarketMaker: {
walletAddress: process.env.FUSDT_MARKET_MAKER_ADDRESS || '',
mpcUsername: process.env.FUSDT_MARKET_MAKER_USERNAME || '',
},
};
});

View File

@ -77,43 +77,48 @@ async function bootstrap() {
*
*/
function validateBlockchainConfig(configService: ConfigService, logger: Logger) {
const errors: string[] = [];
const warnings: string[] = [];
// 做市商钱包配置验证
const marketMakerWallet = configService.get<string>('blockchain.marketMaker.walletAddress');
const marketMakerMpcUsername = configService.get<string>('blockchain.marketMaker.mpcUsername');
// eUSDT (积分股) 做市商钱包配置验证
const eusdtMarketMakerAddress = configService.get<string>('blockchain.eusdtMarketMaker.walletAddress');
const eusdtMarketMakerUsername = configService.get<string>('blockchain.eusdtMarketMaker.mpcUsername');
if (!marketMakerWallet) {
errors.push(
'[CONFIG ERROR] MARKET_MAKER_WALLET_ADDRESS 未配置!做市商充值监控功能将不可用。' +
'请在 .env 中配置: MARKET_MAKER_WALLET_ADDRESS=0x...'
);
logger.log(`[CONFIG] eUSDT (积分股) 做市商钱包配置:`);
if (eusdtMarketMakerAddress) {
logger.log(` - 地址: ${eusdtMarketMakerAddress}`);
} else {
logger.log(`[CONFIG] 做市商钱包地址: ${marketMakerWallet}`);
warnings.push('[CONFIG WARNING] EUSDT_MARKET_MAKER_ADDRESS 未配置eUSDT 充值监控功能将不可用。');
}
if (!eusdtMarketMakerUsername) {
warnings.push('[CONFIG WARNING] EUSDT_MARKET_MAKER_USERNAME 未配置eUSDT 转账功能将不可用。');
}
if (!marketMakerMpcUsername) {
warnings.push(
'[CONFIG WARNING] MARKET_MAKER_MPC_USERNAME 未配置!做市商提现功能将不可用。' +
'请在 .env 中配置: MARKET_MAKER_MPC_USERNAME=your_mpc_username'
);
// fUSDT (积分值) 做市商钱包配置验证
const fusdtMarketMakerAddress = configService.get<string>('blockchain.fusdtMarketMaker.walletAddress');
const fusdtMarketMakerUsername = configService.get<string>('blockchain.fusdtMarketMaker.mpcUsername');
logger.log(`[CONFIG] fUSDT (积分值) 做市商钱包配置:`);
if (fusdtMarketMakerAddress) {
logger.log(` - 地址: ${fusdtMarketMakerAddress}`);
} else {
warnings.push('[CONFIG WARNING] FUSDT_MARKET_MAKER_ADDRESS 未配置fUSDT 充值监控功能将不可用。');
}
if (!fusdtMarketMakerUsername) {
warnings.push('[CONFIG WARNING] FUSDT_MARKET_MAKER_USERNAME 未配置fUSDT 转账功能将不可用。');
}
// 热钱包配置验证
// C2C Bot 热钱包配置验证
const hotWalletAddress = configService.get<string>('HOT_WALLET_ADDRESS');
const hotWalletUsername = configService.get<string>('HOT_WALLET_USERNAME');
if (!hotWalletAddress) {
warnings.push(
'[CONFIG WARNING] HOT_WALLET_ADDRESS 未配置!普通用户的转账功能将不可用。'
);
logger.log(`[CONFIG] C2C Bot 热钱包配置:`);
if (hotWalletAddress) {
logger.log(` - 地址: ${hotWalletAddress}`);
} else {
warnings.push('[CONFIG WARNING] HOT_WALLET_ADDRESS 未配置C2C Bot 转账功能将不可用。');
}
if (!hotWalletUsername) {
warnings.push(
'[CONFIG WARNING] HOT_WALLET_USERNAME 未配置MPC 签名功能将不可用。'
);
warnings.push('[CONFIG WARNING] HOT_WALLET_USERNAME 未配置C2C Bot MPC 签名功能将不可用。');
}
// KAVA 代币合约配置日志
@ -129,11 +134,8 @@ function validateBlockchainConfig(configService: ConfigService, logger: Logger)
// 输出所有警告
warnings.forEach(warning => logger.warn(warning));
// 输出所有错误
errors.forEach(error => logger.error(error));
if (errors.length > 0) {
logger.error(`[CONFIG] 发现 ${errors.length} 个配置错误,部分功能将不可用!`);
if (warnings.length > 0) {
logger.warn(`[CONFIG] 发现 ${warnings.length} 个配置警告,部分功能将不可用!`);
}
}