diff --git a/backend/services/docker-compose.2.0.yml b/backend/services/docker-compose.2.0.yml index a41f3438..c2b7cffa 100644 --- a/backend/services/docker-compose.2.0.yml +++ b/backend/services/docker-compose.2.0.yml @@ -282,9 +282,12 @@ services: # C2C Bot 热钱包 (MPC) HOT_WALLET_USERNAME: ${HOT_WALLET_USERNAME:-} HOT_WALLET_ADDRESS: ${HOT_WALLET_ADDRESS:-} - # 做市商钱包 (MPC) - 用于 eUSDT/fUSDT 转账 - MARKET_MAKER_MPC_USERNAME: ${MARKET_MAKER_MPC_USERNAME:-} - MARKET_MAKER_WALLET_ADDRESS: ${MARKET_MAKER_WALLET_ADDRESS:-} + # eUSDT (积分股) 做市商钱包 (MPC) + EUSDT_MARKET_MAKER_USERNAME: ${EUSDT_MARKET_MAKER_USERNAME:-} + EUSDT_MARKET_MAKER_ADDRESS: ${EUSDT_MARKET_MAKER_ADDRESS:-} + # fUSDT (积分值) 做市商钱包 (MPC) + FUSDT_MARKET_MAKER_USERNAME: ${FUSDT_MARKET_MAKER_USERNAME:-} + FUSDT_MARKET_MAKER_ADDRESS: ${FUSDT_MARKET_MAKER_ADDRESS:-} # 区块扫描配置 BLOCK_SCAN_INTERVAL_MS: ${BLOCK_SCAN_INTERVAL_MS:-5000} BLOCK_CONFIRMATIONS_REQUIRED: ${BLOCK_CONFIRMATIONS_REQUIRED:-12} diff --git a/backend/services/mining-blockchain-service/.env.example b/backend/services/mining-blockchain-service/.env.example index c80c9f5c..21538162 100644 --- a/backend/services/mining-blockchain-service/.env.example +++ b/backend/services/mining-blockchain-service/.env.example @@ -77,13 +77,20 @@ HOT_WALLET_USERNAME=c2c-bot-wallet HOT_WALLET_ADDRESS= # ============================================================================= -# 做市商 MPC 钱包(用于 eUSDT/fUSDT 转账) +# eUSDT (积分股) 做市商 MPC 钱包 # ============================================================================= -# 做市商 MPC 用户名(用于签名转账交易) -MARKET_MAKER_MPC_USERNAME= +# MPC 用户名(用于签名转账交易) +EUSDT_MARKET_MAKER_USERNAME= +# 钱包地址(EVM 地址) +EUSDT_MARKET_MAKER_ADDRESS= -# 做市商钱包地址(EVM 地址) -MARKET_MAKER_WALLET_ADDRESS= +# ============================================================================= +# fUSDT (积分值) 做市商 MPC 钱包 +# ============================================================================= +# MPC 用户名(用于签名转账交易) +FUSDT_MARKET_MAKER_USERNAME= +# 钱包地址(EVM 地址) +FUSDT_MARKET_MAKER_ADDRESS= # ============================================================================= # 区块扫描配置 diff --git a/backend/services/mining-blockchain-service/src/api/controllers/transfer.controller.ts b/backend/services/mining-blockchain-service/src/api/controllers/transfer.controller.ts index d226e4b8..555f8c21 100644 --- a/backend/services/mining-blockchain-service/src/api/controllers/transfer.controller.ts +++ b/backend/services/mining-blockchain-service/src/api/controllers/transfer.controller.ts @@ -138,11 +138,11 @@ export class TransferController { } @Get('eusdt/balance') - @ApiOperation({ summary: '查询做市商钱包 eUSDT(积分股)余额' }) + @ApiOperation({ summary: '查询 eUSDT 做市商钱包余额' }) @ApiResponse({ status: 200, description: '余额信息', type: BalanceResponseDto }) async getEusdtBalance(): Promise { - const address = this.erc20TransferService.getMarketMakerAddress(ChainTypeEnum.KAVA); - const balance = await this.erc20TransferService.getMarketMakerTokenBalance(ChainTypeEnum.KAVA, 'EUSDT'); + const address = this.erc20TransferService.getEusdtMarketMakerAddress(ChainTypeEnum.KAVA); + const balance = await this.erc20TransferService.getEusdtMarketMakerTokenBalance(ChainTypeEnum.KAVA); return { address: address || '', @@ -177,11 +177,11 @@ export class TransferController { } @Get('fusdt/balance') - @ApiOperation({ summary: '查询做市商钱包 fUSDT(积分值)余额' }) + @ApiOperation({ summary: '查询 fUSDT 做市商钱包余额' }) @ApiResponse({ status: 200, description: '余额信息', type: BalanceResponseDto }) async getFusdtBalance(): Promise { - const address = this.erc20TransferService.getMarketMakerAddress(ChainTypeEnum.KAVA); - const balance = await this.erc20TransferService.getMarketMakerTokenBalance(ChainTypeEnum.KAVA, 'FUSDT'); + const address = this.erc20TransferService.getFusdtMarketMakerAddress(ChainTypeEnum.KAVA); + const balance = await this.erc20TransferService.getFusdtMarketMakerTokenBalance(ChainTypeEnum.KAVA); return { address: address || '', @@ -195,13 +195,19 @@ export class TransferController { @Get('market-maker/status') @ApiOperation({ summary: '检查做市商转账服务状态' }) @ApiResponse({ status: 200, description: '服务状态' }) - async getMarketMakerStatus(): Promise<{ configured: boolean; marketMakerAddress: string | null }> { - const configured = this.erc20TransferService.isMarketMakerConfigured(ChainTypeEnum.KAVA); - const marketMakerAddress = this.erc20TransferService.getMarketMakerAddress(ChainTypeEnum.KAVA); - + async getMarketMakerStatus(): Promise<{ + eusdt: { configured: boolean; address: string | null }; + fusdt: { configured: boolean; address: string | null }; + }> { return { - configured, - marketMakerAddress, + eusdt: { + configured: this.erc20TransferService.isEusdtMarketMakerConfigured(ChainTypeEnum.KAVA), + address: this.erc20TransferService.getEusdtMarketMakerAddress(ChainTypeEnum.KAVA), + }, + fusdt: { + configured: this.erc20TransferService.isFusdtMarketMakerConfigured(ChainTypeEnum.KAVA), + address: this.erc20TransferService.getFusdtMarketMakerAddress(ChainTypeEnum.KAVA), + }, }; } } diff --git a/backend/services/mining-blockchain-service/src/domain/services/erc20-transfer.service.ts b/backend/services/mining-blockchain-service/src/domain/services/erc20-transfer.service.ts index 1a8455cc..5f88a8d9 100644 --- a/backend/services/mining-blockchain-service/src/domain/services/erc20-transfer.service.ts +++ b/backend/services/mining-blockchain-service/src/domain/services/erc20-transfer.service.ts @@ -38,10 +38,14 @@ export interface IMpcSigningClient { isConfigured(): boolean; getHotWalletAddress(): string; signMessage(messageHash: string): Promise; - // 做市商钱包 - isMarketMakerConfigured(): boolean; - getMarketMakerAddress(): string; - signMessageAsMarketMaker(messageHash: string): Promise; + // eUSDT (积分股) 做市商钱包 + isEusdtMarketMakerConfigured(): boolean; + getEusdtMarketMakerAddress(): string; + signMessageAsEusdtMarketMaker(messageHash: string): Promise; + // fUSDT (积分值) 做市商钱包 + isFusdtMarketMakerConfigured(): boolean; + getFusdtMarketMakerAddress(): string; + signMessageAsFusdtMarketMaker(messageHash: string): Promise; } export const MPC_SIGNING_CLIENT = Symbol('MPC_SIGNING_CLIENT'); @@ -58,8 +62,10 @@ export class Erc20TransferService { private readonly providers: Map = new Map(); // C2C Bot 热钱包地址 private readonly hotWalletAddress: string; - // 做市商钱包地址 - private readonly marketMakerAddress: string; + // eUSDT (积分股) 做市商钱包地址 + private readonly eusdtMarketMakerAddress: string; + // fUSDT (积分值) 做市商钱包地址 + private readonly fusdtMarketMakerAddress: string; private mpcSigningClient: IMpcSigningClient | null = null; constructor( @@ -67,7 +73,8 @@ export class Erc20TransferService { private readonly chainConfig: ChainConfigService, ) { this.hotWalletAddress = this.configService.get('HOT_WALLET_ADDRESS', ''); - this.marketMakerAddress = this.configService.get('MARKET_MAKER_WALLET_ADDRESS', ''); + this.eusdtMarketMakerAddress = this.configService.get('EUSDT_MARKET_MAKER_ADDRESS', ''); + this.fusdtMarketMakerAddress = this.configService.get('FUSDT_MARKET_MAKER_ADDRESS', ''); this.initializeProviders(); } @@ -99,11 +106,18 @@ export class Erc20TransferService { this.logger.warn('[INIT] HOT_WALLET_ADDRESS not configured, C2C transfers will fail'); } - // 检查做市商钱包地址配置 - if (this.marketMakerAddress) { - this.logger.log(`[INIT] Market Maker wallet address configured: ${this.marketMakerAddress}`); + // 检查 eUSDT 做市商钱包地址配置 + if (this.eusdtMarketMakerAddress) { + this.logger.log(`[INIT] eUSDT Market Maker address configured: ${this.eusdtMarketMakerAddress}`); } else { - this.logger.warn('[INIT] MARKET_MAKER_WALLET_ADDRESS not configured, Market Maker transfers will fail'); + this.logger.warn('[INIT] EUSDT_MARKET_MAKER_ADDRESS not configured'); + } + + // 检查 fUSDT 做市商钱包地址配置 + if (this.fusdtMarketMakerAddress) { + this.logger.log(`[INIT] fUSDT Market Maker address configured: ${this.fusdtMarketMakerAddress}`); + } else { + this.logger.warn('[INIT] FUSDT_MARKET_MAKER_ADDRESS not configured'); } } @@ -116,10 +130,17 @@ export class Erc20TransferService { } /** - * 获取做市商钱包地址 + * 获取 eUSDT 做市商钱包地址 */ - getMarketMakerAddress(chainType: ChainTypeEnum): string | null { - return this.marketMakerAddress || null; + getEusdtMarketMakerAddress(chainType: ChainTypeEnum): string | null { + return this.eusdtMarketMakerAddress || null; + } + + /** + * 获取 fUSDT 做市商钱包地址 + */ + getFusdtMarketMakerAddress(chainType: ChainTypeEnum): string | null { + return this.fusdtMarketMakerAddress || null; } /** @@ -585,12 +606,21 @@ export class Erc20TransferService { } /** - * 检查做市商钱包是否已配置 + * 检查 eUSDT 做市商钱包是否已配置 */ - isMarketMakerConfigured(chainType: ChainTypeEnum): boolean { + isEusdtMarketMakerConfigured(chainType: ChainTypeEnum): boolean { return this.providers.has(chainType) && - !!this.marketMakerAddress && - !!this.mpcSigningClient?.isMarketMakerConfigured(); + !!this.eusdtMarketMakerAddress && + !!this.mpcSigningClient?.isEusdtMarketMakerConfigured(); + } + + /** + * 检查 fUSDT 做市商钱包是否已配置 + */ + isFusdtMarketMakerConfigured(chainType: ChainTypeEnum): boolean { + return this.providers.has(chainType) && + !!this.fusdtMarketMakerAddress && + !!this.mpcSigningClient?.isFusdtMarketMakerConfigured(); } /** @@ -608,10 +638,14 @@ export class Erc20TransferService { toAddress: string, amount: string, ): Promise { - const tokenName = tokenType === 'EUSDT' ? '积分股' : tokenType === 'FUSDT' ? '积分值' : 'dUSDT'; - this.logger.log(`[MM-TRANSFER] Starting Market Maker ${tokenType} (${tokenName}) transfer`); + // 根据代币类型选择对应的做市商钱包 + const isEusdt = tokenType === 'EUSDT'; + const marketMakerAddress = isEusdt ? this.eusdtMarketMakerAddress : this.fusdtMarketMakerAddress; + const tokenName = isEusdt ? '积分股' : '积分值'; + + this.logger.log(`[MM-TRANSFER] Starting ${tokenType} (${tokenName}) Market Maker transfer`); this.logger.log(`[MM-TRANSFER] Chain: ${chainType}`); - this.logger.log(`[MM-TRANSFER] From: ${this.marketMakerAddress}`); + this.logger.log(`[MM-TRANSFER] From: ${marketMakerAddress}`); this.logger.log(`[MM-TRANSFER] To: ${toAddress}`); this.logger.log(`[MM-TRANSFER] Amount: ${amount} ${tokenType}`); @@ -622,14 +656,23 @@ export class Erc20TransferService { return { success: false, error }; } - if (!this.mpcSigningClient || !this.mpcSigningClient.isMarketMakerConfigured()) { - const error = 'Market Maker MPC signing not configured'; - this.logger.error(`[MM-TRANSFER] ${error}`); - return { success: false, error }; + // 检查对应钱包是否配置 + if (isEusdt) { + if (!this.mpcSigningClient || !this.mpcSigningClient.isEusdtMarketMakerConfigured()) { + const error = 'eUSDT Market Maker MPC signing not configured'; + this.logger.error(`[MM-TRANSFER] ${error}`); + return { success: false, error }; + } + } else { + if (!this.mpcSigningClient || !this.mpcSigningClient.isFusdtMarketMakerConfigured()) { + const error = 'fUSDT Market Maker MPC signing not configured'; + this.logger.error(`[MM-TRANSFER] ${error}`); + return { success: false, error }; + } } - if (!this.marketMakerAddress) { - const error = 'Market Maker wallet address not configured'; + if (!marketMakerAddress) { + const error = `${tokenType} Market Maker wallet address not configured`; this.logger.error(`[MM-TRANSFER] ${error}`); return { success: false, error }; } @@ -655,7 +698,7 @@ export class Erc20TransferService { this.logger.log(`[MM-TRANSFER] Amount in wei: ${amountInWei.toString()}`); // 检查余额 - const balance = await contract.balanceOf(this.marketMakerAddress); + const balance = await contract.balanceOf(marketMakerAddress); this.logger.log(`[MM-TRANSFER] Market Maker balance: ${formatUnits(balance, decimals)} ${tokenType}`); if (balance < amountInWei) { @@ -666,7 +709,7 @@ export class Erc20TransferService { // 构建交易 this.logger.log(`[MM-TRANSFER] Building transaction...`); - const nonce = await provider.getTransactionCount(this.marketMakerAddress); + const nonce = await provider.getTransactionCount(marketMakerAddress); const feeData = await provider.getFeeData(); // ERC20 transfer 的 calldata @@ -674,7 +717,7 @@ export class Erc20TransferService { // 估算 gas const gasEstimate = await provider.estimateGas({ - from: this.marketMakerAddress, + from: marketMakerAddress, to: contractAddress, data: transferData, }); @@ -715,9 +758,11 @@ export class Erc20TransferService { const unsignedTxHash = tx.unsignedHash; this.logger.log(`[MM-TRANSFER] Unsigned tx hash: ${unsignedTxHash}`); - // 使用做市商 MPC 钱包签名 - this.logger.log(`[MM-TRANSFER] Requesting Market Maker MPC signature...`); - const signatureHex = await this.mpcSigningClient.signMessageAsMarketMaker(unsignedTxHash); + // 使用对应的做市商 MPC 钱包签名 + this.logger.log(`[MM-TRANSFER] Requesting ${tokenType} Market Maker MPC signature...`); + const signatureHex = isEusdt + ? await this.mpcSigningClient!.signMessageAsEusdtMarketMaker(unsignedTxHash) + : await this.mpcSigningClient!.signMessageAsFusdtMarketMaker(unsignedTxHash); this.logger.log(`[MM-TRANSFER] MPC signature obtained: ${signatureHex.slice(0, 20)}...`); // 解析签名 @@ -733,7 +778,7 @@ export class Erc20TransferService { const testSig = Signature.from({ r, s, yParity }); const recoveredAddress = recoverAddress(unsignedTxHash, testSig); - if (recoveredAddress.toLowerCase() === this.marketMakerAddress.toLowerCase()) { + if (recoveredAddress.toLowerCase() === marketMakerAddress.toLowerCase()) { this.logger.log(`[MM-TRANSFER] Found correct yParity: ${yParity}`); signature = testSig; break; @@ -786,25 +831,50 @@ export class Erc20TransferService { } /** - * 获取做市商指定代币余额 + * 获取 eUSDT 做市商代币余额 */ - async getMarketMakerTokenBalance(chainType: ChainTypeEnum, tokenType: TokenType): Promise { + async getEusdtMarketMakerTokenBalance(chainType: ChainTypeEnum): Promise { const provider = this.providers.get(chainType); if (!provider) { throw new Error(`Provider not configured for chain: ${chainType}`); } - if (!this.marketMakerAddress) { - throw new Error('Market Maker wallet address not configured'); + if (!this.eusdtMarketMakerAddress) { + throw new Error('eUSDT Market Maker wallet address not configured'); } - const contractAddress = this.getTokenContract(chainType, tokenType); + const contractAddress = this.getTokenContract(chainType, 'EUSDT'); if (!contractAddress) { - throw new Error(`Token ${tokenType} not configured for chain ${chainType}`); + throw new Error(`eUSDT not configured for chain ${chainType}`); } const contract = new Contract(contractAddress, ERC20_TRANSFER_ABI, provider); - const balance = await contract.balanceOf(this.marketMakerAddress); + const balance = await contract.balanceOf(this.eusdtMarketMakerAddress); + const decimals = await contract.decimals(); + + return formatUnits(balance, decimals); + } + + /** + * 获取 fUSDT 做市商代币余额 + */ + async getFusdtMarketMakerTokenBalance(chainType: ChainTypeEnum): Promise { + const provider = this.providers.get(chainType); + if (!provider) { + throw new Error(`Provider not configured for chain: ${chainType}`); + } + + if (!this.fusdtMarketMakerAddress) { + throw new Error('fUSDT Market Maker wallet address not configured'); + } + + const contractAddress = this.getTokenContract(chainType, 'FUSDT'); + if (!contractAddress) { + throw new Error(`fUSDT not configured for chain ${chainType}`); + } + + const contract = new Contract(contractAddress, ERC20_TRANSFER_ABI, provider); + const balance = await contract.balanceOf(this.fusdtMarketMakerAddress); const decimals = await contract.decimals(); return formatUnits(balance, decimals); diff --git a/backend/services/mining-blockchain-service/src/infrastructure/mpc/mpc-signing.client.ts b/backend/services/mining-blockchain-service/src/infrastructure/mpc/mpc-signing.client.ts index c77ae758..2f8f3e44 100644 --- a/backend/services/mining-blockchain-service/src/infrastructure/mpc/mpc-signing.client.ts +++ b/backend/services/mining-blockchain-service/src/infrastructure/mpc/mpc-signing.client.ts @@ -42,9 +42,12 @@ export class MpcSigningClient implements OnModuleInit { // C2C Bot 热钱包 private readonly hotWalletUsername: string; private readonly hotWalletAddress: string; - // 做市商 MPC 钱包 - private readonly marketMakerUsername: string; - private readonly marketMakerAddress: string; + // eUSDT (积分股) 做市商钱包 + private readonly eusdtMarketMakerUsername: string; + private readonly eusdtMarketMakerAddress: string; + // fUSDT (积分值) 做市商钱包 + private readonly fusdtMarketMakerUsername: string; + private readonly fusdtMarketMakerAddress: string; private readonly signingTimeoutMs: number = 300000; // 5 minutes // 待处理的签名请求回调 Map @@ -62,9 +65,12 @@ export class MpcSigningClient implements OnModuleInit { // C2C Bot 热钱包配置 this.hotWalletUsername = this.configService.get('HOT_WALLET_USERNAME', ''); this.hotWalletAddress = this.configService.get('HOT_WALLET_ADDRESS', ''); - // 做市商 MPC 钱包配置 - this.marketMakerUsername = this.configService.get('MARKET_MAKER_MPC_USERNAME', ''); - this.marketMakerAddress = this.configService.get('MARKET_MAKER_WALLET_ADDRESS', ''); + // eUSDT (积分股) 做市商钱包配置 + this.eusdtMarketMakerUsername = this.configService.get('EUSDT_MARKET_MAKER_USERNAME', ''); + this.eusdtMarketMakerAddress = this.configService.get('EUSDT_MARKET_MAKER_ADDRESS', ''); + // fUSDT (积分值) 做市商钱包配置 + this.fusdtMarketMakerUsername = this.configService.get('FUSDT_MARKET_MAKER_USERNAME', ''); + this.fusdtMarketMakerAddress = this.configService.get('FUSDT_MARKET_MAKER_ADDRESS', ''); if (!this.hotWalletUsername) { this.logger.warn('[INIT] HOT_WALLET_USERNAME not configured (C2C Bot disabled)'); @@ -72,15 +78,16 @@ export class MpcSigningClient implements OnModuleInit { if (!this.hotWalletAddress) { this.logger.warn('[INIT] HOT_WALLET_ADDRESS not configured (C2C Bot disabled)'); } - if (!this.marketMakerUsername) { - this.logger.warn('[INIT] MARKET_MAKER_MPC_USERNAME not configured (Market Maker signing disabled)'); + if (!this.eusdtMarketMakerUsername || !this.eusdtMarketMakerAddress) { + this.logger.warn('[INIT] eUSDT Market Maker not configured'); } - if (!this.marketMakerAddress) { - this.logger.warn('[INIT] MARKET_MAKER_WALLET_ADDRESS not configured (Market Maker disabled)'); + if (!this.fusdtMarketMakerUsername || !this.fusdtMarketMakerAddress) { + this.logger.warn('[INIT] fUSDT Market Maker not configured'); } this.logger.log(`[INIT] C2C Bot Wallet: ${this.hotWalletAddress || '(not configured)'}`); - this.logger.log(`[INIT] Market Maker Wallet: ${this.marketMakerAddress || '(not configured)'}`); + this.logger.log(`[INIT] eUSDT Market Maker: ${this.eusdtMarketMakerAddress || '(not configured)'}`); + this.logger.log(`[INIT] fUSDT Market Maker: ${this.fusdtMarketMakerAddress || '(not configured)'}`); this.logger.log(`[INIT] Using Kafka event-driven signing`); } @@ -99,10 +106,17 @@ export class MpcSigningClient implements OnModuleInit { } /** - * 检查做市商钱包是否已配置 + * 检查 eUSDT 做市商钱包是否已配置 */ - isMarketMakerConfigured(): boolean { - return !!this.marketMakerUsername && !!this.marketMakerAddress; + isEusdtMarketMakerConfigured(): boolean { + return !!this.eusdtMarketMakerUsername && !!this.eusdtMarketMakerAddress; + } + + /** + * 检查 fUSDT 做市商钱包是否已配置 + */ + isFusdtMarketMakerConfigured(): boolean { + return !!this.fusdtMarketMakerUsername && !!this.fusdtMarketMakerAddress; } /** @@ -120,17 +134,31 @@ export class MpcSigningClient implements OnModuleInit { } /** - * 获取做市商钱包地址 + * 获取 eUSDT 做市商钱包地址 */ - getMarketMakerAddress(): string { - return this.marketMakerAddress; + getEusdtMarketMakerAddress(): string { + return this.eusdtMarketMakerAddress; } /** - * 获取做市商 MPC 用户名 + * 获取 eUSDT 做市商 MPC 用户名 */ - getMarketMakerUsername(): string { - return this.marketMakerUsername; + getEusdtMarketMakerUsername(): string { + return this.eusdtMarketMakerUsername; + } + + /** + * 获取 fUSDT 做市商钱包地址 + */ + getFusdtMarketMakerAddress(): string { + return this.fusdtMarketMakerAddress; + } + + /** + * 获取 fUSDT 做市商 MPC 用户名 + */ + getFusdtMarketMakerUsername(): string { + return this.fusdtMarketMakerUsername; } /** @@ -147,16 +175,29 @@ export class MpcSigningClient implements OnModuleInit { } /** - * 使用做市商钱包签名消息 + * 使用 eUSDT 做市商钱包签名消息 * * @param messageHash 要签名的消息哈希 (hex string with 0x prefix) * @returns 签名结果 (hex string) */ - async signMessageAsMarketMaker(messageHash: string): Promise { - if (!this.marketMakerUsername) { - throw new Error('Market maker MPC username not configured'); + async signMessageAsEusdtMarketMaker(messageHash: string): Promise { + if (!this.eusdtMarketMakerUsername) { + throw new Error('eUSDT Market Maker MPC username not configured'); } - return this.signMessageWithUsername(this.marketMakerUsername, messageHash); + return this.signMessageWithUsername(this.eusdtMarketMakerUsername, messageHash); + } + + /** + * 使用 fUSDT 做市商钱包签名消息 + * + * @param messageHash 要签名的消息哈希 (hex string with 0x prefix) + * @returns 签名结果 (hex string) + */ + async signMessageAsFusdtMarketMaker(messageHash: string): Promise { + if (!this.fusdtMarketMakerUsername) { + throw new Error('fUSDT Market Maker MPC username not configured'); + } + return this.signMessageWithUsername(this.fusdtMarketMakerUsername, messageHash); } /**