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:
parent
3b95a8a332
commit
219fb7bb69
|
|
@ -23,6 +23,7 @@ import { MarketMakerDepositConfirmedEvent } from '@/domain/events';
|
||||||
interface TokenConfig {
|
interface TokenConfig {
|
||||||
assetType: MarketMakerAssetType;
|
assetType: MarketMakerAssetType;
|
||||||
contract: string;
|
contract: string;
|
||||||
|
walletAddress: string;
|
||||||
name: string;
|
name: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -36,7 +37,6 @@ interface TokenConfig {
|
||||||
export class MarketMakerDepositDetectionService implements OnModuleInit {
|
export class MarketMakerDepositDetectionService implements OnModuleInit {
|
||||||
private readonly logger = new Logger(MarketMakerDepositDetectionService.name);
|
private readonly logger = new Logger(MarketMakerDepositDetectionService.name);
|
||||||
private readonly scanBatchSize: number;
|
private readonly scanBatchSize: number;
|
||||||
private readonly marketMakerWallet: string;
|
|
||||||
private readonly tokenConfigs: TokenConfig[];
|
private readonly tokenConfigs: TokenConfig[];
|
||||||
private isEnabled: boolean = false;
|
private isEnabled: boolean = false;
|
||||||
|
|
||||||
|
|
@ -54,49 +54,57 @@ export class MarketMakerDepositDetectionService implements OnModuleInit {
|
||||||
private readonly outboxRepo: IOutboxEventRepository,
|
private readonly outboxRepo: IOutboxEventRepository,
|
||||||
) {
|
) {
|
||||||
this.scanBatchSize = this.configService.get<number>('blockchain.scanBatchSize', 100);
|
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 eUsdtContract = this.configService.get<string>('blockchain.kava.eUsdtContract', '');
|
||||||
const fUsdtContract = this.configService.get<string>('blockchain.kava.fUsdtContract', '');
|
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 = [
|
this.tokenConfigs = [
|
||||||
{
|
{
|
||||||
assetType: MarketMakerAssetType.EUSDT,
|
assetType: MarketMakerAssetType.EUSDT,
|
||||||
contract: eUsdtContract,
|
contract: eUsdtContract,
|
||||||
|
walletAddress: eusdtMarketMakerAddress,
|
||||||
name: '积分股 (eUSDT)',
|
name: '积分股 (eUSDT)',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
assetType: MarketMakerAssetType.FUSDT,
|
assetType: MarketMakerAssetType.FUSDT,
|
||||||
contract: fUsdtContract,
|
contract: fUsdtContract,
|
||||||
|
walletAddress: fusdtMarketMakerAddress,
|
||||||
name: '积分值 (fUSDT)',
|
name: '积分值 (fUSDT)',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
async onModuleInit() {
|
async onModuleInit() {
|
||||||
// 验证配置
|
// 验证配置:检查每种代币的做市商钱包地址
|
||||||
if (!this.marketMakerWallet) {
|
const validConfigs = this.tokenConfigs.filter((t) => t.contract && t.walletAddress);
|
||||||
|
|
||||||
|
if (validConfigs.length === 0) {
|
||||||
this.logger.warn(
|
this.logger.warn(
|
||||||
'[INIT] 做市商钱包地址未配置 (MARKET_MAKER_WALLET_ADDRESS),做市商充值监控功能已禁用',
|
'[INIT] 没有有效的做市商钱包配置,做市商充值监控功能已禁用',
|
||||||
);
|
);
|
||||||
this.isEnabled = false;
|
this.isEnabled = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 验证代币合约配置
|
// 验证代币合约和钱包配置
|
||||||
const missingContracts = this.tokenConfigs.filter((t) => !t.contract);
|
this.tokenConfigs.forEach((t) => {
|
||||||
if (missingContracts.length > 0) {
|
if (!t.walletAddress) {
|
||||||
this.logger.warn(
|
this.logger.warn(`[INIT] ${t.name} 做市商钱包地址未配置,该代币充值监控已禁用`);
|
||||||
`[INIT] 以下代币合约未配置: ${missingContracts.map((t) => t.name).join(', ')}`,
|
}
|
||||||
);
|
if (!t.contract) {
|
||||||
}
|
this.logger.warn(`[INIT] ${t.name} 代币合约未配置`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
this.isEnabled = true;
|
this.isEnabled = true;
|
||||||
this.logger.log(`[INIT] MarketMakerDepositDetectionService initialized`);
|
this.logger.log(`[INIT] MarketMakerDepositDetectionService initialized`);
|
||||||
this.logger.log(`[INIT] 做市商钱包地址: ${this.marketMakerWallet}`);
|
|
||||||
this.tokenConfigs.forEach((t) => {
|
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) {
|
for (const tokenConfig of this.tokenConfigs) {
|
||||||
if (!tokenConfig.contract) continue;
|
// 跳过没有合约或钱包地址的代币
|
||||||
|
if (!tokenConfig.contract || !tokenConfig.walletAddress) continue;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await this.scanTokenDeposits(chainType, tokenConfig);
|
await this.scanTokenDeposits(chainType, tokenConfig);
|
||||||
|
|
@ -169,9 +178,9 @@ export class MarketMakerDepositDetectionService implements OnModuleInit {
|
||||||
tokenConfig.contract,
|
tokenConfig.contract,
|
||||||
);
|
);
|
||||||
|
|
||||||
// 过滤出充值到做市商钱包的交易
|
// 过滤出充值到对应做市商钱包的交易
|
||||||
const deposits = events.filter(
|
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);
|
await this.depositRepo.save(deposit);
|
||||||
|
|
||||||
this.logger.log(
|
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})`,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -75,12 +75,16 @@ export default registerAs('blockchain', () => {
|
||||||
confirmations: parseInt(process.env.BSC_CONFIRMATIONS || '15', 10),
|
confirmations: parseInt(process.env.BSC_CONFIRMATIONS || '15', 10),
|
||||||
},
|
},
|
||||||
|
|
||||||
// 做市商 MPC 钱包配置
|
// eUSDT (积分股) 做市商 MPC 钱包配置
|
||||||
marketMaker: {
|
eusdtMarketMaker: {
|
||||||
// 做市商 MPC 钱包地址(用于充值监控和提现)
|
walletAddress: process.env.EUSDT_MARKET_MAKER_ADDRESS || '',
|
||||||
walletAddress: process.env.MARKET_MAKER_WALLET_ADDRESS || '',
|
mpcUsername: process.env.EUSDT_MARKET_MAKER_USERNAME || '',
|
||||||
// MPC 用户名(用于签名)
|
},
|
||||||
mpcUsername: process.env.MARKET_MAKER_MPC_USERNAME || '',
|
|
||||||
|
// fUSDT (积分值) 做市商 MPC 钱包配置
|
||||||
|
fusdtMarketMaker: {
|
||||||
|
walletAddress: process.env.FUSDT_MARKET_MAKER_ADDRESS || '',
|
||||||
|
mpcUsername: process.env.FUSDT_MARKET_MAKER_USERNAME || '',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -77,43 +77,48 @@ async function bootstrap() {
|
||||||
* 如果缺少必要配置,输出明确的错误日志
|
* 如果缺少必要配置,输出明确的错误日志
|
||||||
*/
|
*/
|
||||||
function validateBlockchainConfig(configService: ConfigService, logger: Logger) {
|
function validateBlockchainConfig(configService: ConfigService, logger: Logger) {
|
||||||
const errors: string[] = [];
|
|
||||||
const warnings: string[] = [];
|
const warnings: string[] = [];
|
||||||
|
|
||||||
// 做市商钱包配置验证
|
// eUSDT (积分股) 做市商钱包配置验证
|
||||||
const marketMakerWallet = configService.get<string>('blockchain.marketMaker.walletAddress');
|
const eusdtMarketMakerAddress = configService.get<string>('blockchain.eusdtMarketMaker.walletAddress');
|
||||||
const marketMakerMpcUsername = configService.get<string>('blockchain.marketMaker.mpcUsername');
|
const eusdtMarketMakerUsername = configService.get<string>('blockchain.eusdtMarketMaker.mpcUsername');
|
||||||
|
|
||||||
if (!marketMakerWallet) {
|
logger.log(`[CONFIG] eUSDT (积分股) 做市商钱包配置:`);
|
||||||
errors.push(
|
if (eusdtMarketMakerAddress) {
|
||||||
'[CONFIG ERROR] MARKET_MAKER_WALLET_ADDRESS 未配置!做市商充值监控功能将不可用。' +
|
logger.log(` - 地址: ${eusdtMarketMakerAddress}`);
|
||||||
'请在 .env 中配置: MARKET_MAKER_WALLET_ADDRESS=0x...'
|
|
||||||
);
|
|
||||||
} else {
|
} 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) {
|
// fUSDT (积分值) 做市商钱包配置验证
|
||||||
warnings.push(
|
const fusdtMarketMakerAddress = configService.get<string>('blockchain.fusdtMarketMaker.walletAddress');
|
||||||
'[CONFIG WARNING] MARKET_MAKER_MPC_USERNAME 未配置!做市商提现功能将不可用。' +
|
const fusdtMarketMakerUsername = configService.get<string>('blockchain.fusdtMarketMaker.mpcUsername');
|
||||||
'请在 .env 中配置: MARKET_MAKER_MPC_USERNAME=your_mpc_username'
|
|
||||||
);
|
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 hotWalletAddress = configService.get<string>('HOT_WALLET_ADDRESS');
|
||||||
const hotWalletUsername = configService.get<string>('HOT_WALLET_USERNAME');
|
const hotWalletUsername = configService.get<string>('HOT_WALLET_USERNAME');
|
||||||
|
|
||||||
if (!hotWalletAddress) {
|
logger.log(`[CONFIG] C2C Bot 热钱包配置:`);
|
||||||
warnings.push(
|
if (hotWalletAddress) {
|
||||||
'[CONFIG WARNING] HOT_WALLET_ADDRESS 未配置!普通用户的转账功能将不可用。'
|
logger.log(` - 地址: ${hotWalletAddress}`);
|
||||||
);
|
} else {
|
||||||
|
warnings.push('[CONFIG WARNING] HOT_WALLET_ADDRESS 未配置!C2C Bot 转账功能将不可用。');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hotWalletUsername) {
|
if (!hotWalletUsername) {
|
||||||
warnings.push(
|
warnings.push('[CONFIG WARNING] HOT_WALLET_USERNAME 未配置!C2C Bot MPC 签名功能将不可用。');
|
||||||
'[CONFIG WARNING] HOT_WALLET_USERNAME 未配置!MPC 签名功能将不可用。'
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// KAVA 代币合约配置日志
|
// KAVA 代币合约配置日志
|
||||||
|
|
@ -129,11 +134,8 @@ function validateBlockchainConfig(configService: ConfigService, logger: Logger)
|
||||||
// 输出所有警告
|
// 输出所有警告
|
||||||
warnings.forEach(warning => logger.warn(warning));
|
warnings.forEach(warning => logger.warn(warning));
|
||||||
|
|
||||||
// 输出所有错误
|
if (warnings.length > 0) {
|
||||||
errors.forEach(error => logger.error(error));
|
logger.warn(`[CONFIG] 发现 ${warnings.length} 个配置警告,部分功能将不可用!`);
|
||||||
|
|
||||||
if (errors.length > 0) {
|
|
||||||
logger.error(`[CONFIG] 发现 ${errors.length} 个配置错误,部分功能将不可用!`);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue