Files
Heyue_test/frontend/scripts/configure-collateral.js

170 lines
4.9 KiB
JavaScript
Raw Normal View History

import { createWalletClient, http, createPublicClient } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'
import { arbitrumSepolia } from 'viem/chains'
// 从环境变量或命令行参数获取私钥
const PRIVATE_KEY = process.env.PRIVATE_KEY || process.argv[2]
if (!PRIVATE_KEY || !PRIVATE_KEY.startsWith('0x')) {
console.error('❌ 请提供私钥:')
console.error(' 方式1: export PRIVATE_KEY=0x...')
console.error(' 方式2: node configure-collateral.js 0x...')
process.exit(1)
}
const account = privateKeyToAccount(PRIVATE_KEY)
const publicClient = createPublicClient({
chain: arbitrumSepolia,
transport: http()
})
const walletClient = createWalletClient({
account,
chain: arbitrumSepolia,
transport: http()
})
const CONFIGURATOR = '0x488409CE9A3Fcd8EbD373dCb7e025cF8AB96fcdc'
const LENDING_PROXY = '0xCb4E7B1069F6C26A1c27523ce4c8dfD884552d1D'
const COLLATERAL_ASSETS = [
{
name: 'YT-A',
address: '0x97204190B35D9895a7a47aa7BaC61ac08De3cF05',
collateralFactor: 7500, // 75%
liquidationThreshold: 8500, // 85%
liquidationBonus: 1000 // 10%
},
{
name: 'YT-B',
address: '0x181ef4011c35C4a2Fda08eBC5Cf509Ef58E553fF',
collateralFactor: 7500,
liquidationThreshold: 8500,
liquidationBonus: 1000
},
{
name: 'YT-C',
address: '0xE9A5b9f3a2Eda4358f81d4E2eF4f3280A664e5B0',
collateralFactor: 7500,
liquidationThreshold: 8500,
liquidationBonus: 1000
}
]
// Configurator ABI
const CONFIGURATOR_ABI = [
{
inputs: [
{ internalType: 'address', name: '_asset', type: 'address' },
{ internalType: 'uint256', name: '_collateralFactor', type: 'uint256' },
{ internalType: 'uint256', name: '_liquidationThreshold', type: 'uint256' },
{ internalType: 'uint256', name: '_liquidationBonus', type: 'uint256' }
],
name: 'setCollateralConfig',
outputs: [],
stateMutability: 'nonpayable',
type: 'function'
},
{
inputs: [
{ internalType: 'address', name: '_asset', type: 'address' },
{ internalType: 'bool', name: '_isActive', type: 'bool' }
],
name: 'setCollateralActive',
outputs: [],
stateMutability: 'nonpayable',
type: 'function'
},
{
inputs: [],
name: 'owner',
outputs: [{ internalType: 'address', name: '', type: 'address' }],
stateMutability: 'view',
type: 'function'
}
]
async function configureCollateral() {
console.log('\n🔧 配置借贷抵押品\n')
console.log('Configurator:', CONFIGURATOR)
console.log('操作者:', account.address)
console.log('')
// 检查权限
try {
const owner = await publicClient.readContract({
address: CONFIGURATOR,
abi: CONFIGURATOR_ABI,
functionName: 'owner'
})
console.log('Configurator Owner:', owner)
if (owner.toLowerCase() !== account.address.toLowerCase()) {
console.error('\n❌ 错误: 当前账户不是 Configurator 的 owner')
console.error(' 需要使用 owner 账户的私钥')
process.exit(1)
}
} catch (error) {
console.warn('⚠️ 无法检查owner继续尝试配置...\n')
}
// 配置每个抵押品
for (const asset of COLLATERAL_ASSETS) {
console.log(`\n📝 配置 ${asset.name} (${asset.address})`)
console.log(` - 抵押率: ${asset.collateralFactor / 100}%`)
console.log(` - 清算阈值: ${asset.liquidationThreshold / 100}%`)
console.log(` - 清算奖励: ${asset.liquidationBonus / 100}%`)
try {
// 1. 设置抵押品参数
console.log(' → 设置参数...')
const hash1 = await walletClient.writeContract({
address: CONFIGURATOR,
abi: CONFIGURATOR_ABI,
functionName: 'setCollateralConfig',
args: [
asset.address,
asset.collateralFactor,
asset.liquidationThreshold,
asset.liquidationBonus
]
})
console.log(' ✅ 参数设置交易:', hash1)
// 等待确认
await publicClient.waitForTransactionReceipt({ hash: hash1 })
console.log(' ✅ 交易已确认')
// 2. 激活抵押品
console.log(' → 激活抵押品...')
const hash2 = await walletClient.writeContract({
address: CONFIGURATOR,
abi: CONFIGURATOR_ABI,
functionName: 'setCollateralActive',
args: [asset.address, true]
})
console.log(' ✅ 激活交易:', hash2)
// 等待确认
await publicClient.waitForTransactionReceipt({ hash: hash2 })
console.log(' ✅ 交易已确认')
console.log(`${asset.name} 配置完成!`)
} catch (error) {
console.error(` ❌ 配置失败:`, error.message.split('\n')[0])
// 继续处理下一个
continue
}
}
console.log('\n✅ 所有抵押品配置完成!\n')
console.log('现在可以尝试存入抵押品了。')
}
configureCollateral().catch((error) => {
console.error('\n❌ 配置过程出错:', error.message)
process.exit(1)
})