import { createPublicClient, http, encodeFunctionData, formatUnits } from 'viem' import { arbitrumSepolia } from 'viem/chains' const client = createPublicClient({ chain: arbitrumSepolia, transport: http() }) const LENDING_PROXY = '0xCb4E7B1069F6C26A1c27523ce4c8dfD884552d1D' const YT_A = '0x97204190B35D9895a7a47aa7BaC61ac08De3cF05' const USER = '0xa013422a5918cd099c63c8cc35283eaca99a705d' const CONFIGURATOR = '0x488409CE9A3Fcd8EbD373dCb7e025cF8AB96fcdc' const LENDING_ABI = [ { inputs: [ { internalType: 'address', name: '_collateralAsset', type: 'address' }, { internalType: 'uint256', name: '_amount', type: 'uint256' } ], name: 'deposit', outputs: [], stateMutability: 'nonpayable', type: 'function' } ] const CONFIGURATOR_ABI = [ { inputs: [{ internalType: 'address', name: '_asset', type: 'address' }], name: 'getCollateralConfig', outputs: [ { internalType: 'bool', name: 'isActive', type: 'bool' }, { internalType: 'uint256', name: 'collateralFactor', type: 'uint256' }, { internalType: 'uint256', name: 'liquidationThreshold', type: 'uint256' }, { internalType: 'uint256', name: 'liquidationBonus', type: 'uint256' } ], stateMutability: 'view', type: 'function' }, { inputs: [{ internalType: 'address', name: '', type: 'address' }], name: 'collateralConfigs', outputs: [ { internalType: 'bool', name: 'isActive', type: 'bool' }, { internalType: 'uint256', name: 'collateralFactor', type: 'uint256' }, { internalType: 'uint256', name: 'liquidationThreshold', type: 'uint256' }, { internalType: 'uint256', name: 'liquidationBonus', type: 'uint256' } ], stateMutability: 'view', type: 'function' } ] async function simulateDeposit() { console.log('🔍 模拟存款操作...\n') console.log('合约地址:', LENDING_PROXY) console.log('抵押品地址:', YT_A) console.log('用户地址:', USER) console.log('存款金额: 10 YT-A\n') // 1. 检查 Configurator 中的配置 console.log('=== 检查 Configurator 配置 ===') try { const config = await client.readContract({ address: CONFIGURATOR, abi: CONFIGURATOR_ABI, functionName: 'getCollateralConfig', args: [YT_A] }) console.log('✅ 通过 getCollateralConfig 读取:') console.log(' - 是否激活:', config[0]) console.log(' - 抵押率:', Number(config[1]) / 100 + '%') console.log(' - 清算阈值:', Number(config[2]) / 100 + '%') console.log(' - 清算奖励:', Number(config[3]) / 100 + '%') } catch (error) { console.log('❌ getCollateralConfig 失败:', error.message.split('\n')[0]) // 尝试直接读取mapping try { const config = await client.readContract({ address: CONFIGURATOR, abi: CONFIGURATOR_ABI, functionName: 'collateralConfigs', args: [YT_A] }) console.log('✅ 通过 collateralConfigs mapping 读取:') console.log(' - 是否激活:', config[0]) console.log(' - 抵押率:', Number(config[1]) / 100 + '%') console.log(' - 清算阈值:', Number(config[2]) / 100 + '%') console.log(' - 清算奖励:', Number(config[3]) / 100 + '%') if (!config[0]) { console.log('\n⚠️ 警告: 抵押品未激活!这就是存款失败的原因。') } } catch (error2) { console.log('❌ collateralConfigs mapping 也失败:', error2.message.split('\n')[0]) } } // 2. 模拟调用 deposit console.log('\n=== 模拟存款调用 ===') const depositAmount = 10n * 10n ** 18n // 10 YT-A try { await client.simulateContract({ address: LENDING_PROXY, abi: LENDING_ABI, functionName: 'deposit', args: [YT_A, depositAmount], account: USER }) console.log('✅ 模拟存款成功!交易应该可以执行。') } catch (error) { console.log('❌ 模拟存款失败') console.log('\n详细错误信息:') console.log(error.message) // 尝试解析错误原因 if (error.message.includes('Collateral not active')) { console.log('\n💡 原因: 抵押品未激活') console.log(' 需要管理员通过 Configurator 激活此抵押品') } else if (error.message.includes('insufficient')) { console.log('\n💡 原因: 余额或授权不足') } else if (error.message.includes('paused')) { console.log('\n💡 原因: 合约已暂停') } else { console.log('\n💡 这可能是由于抵押品未在借贷合约中配置') } } console.log('\n=== 诊断完成 ===\n') } simulateDeposit().catch(console.error)