You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用revm模拟Uniswap V2时遇LackOfFundForMaxFee问题求助

解决revm模拟Uniswap V2创建Pair时的「LackOfFundForMaxFee」错误

问题核心分析

错误提示LackOfFundForMaxFee { fee: 500000000000000000, balance: 0 }说明revm判定调用者账户余额为0,但你明明设置了10ETH,核心原因是账户余额未被revm的EVM实例正确识别,大概率出在账户配置逻辑或AlloyDB交互环节。

具体修复步骤

1. 验证账户地址一致性

确认account变量的地址与后续交易中tx.caller的地址完全一致,避免因地址拼写/赋值错误导致余额设置到了错误账户。可在插入账户后添加调试代码验证:

// 插入账户后立即校验
if let Some(info) = db.basic(account).unwrap() {
    println!("账户地址: {:?}, 余额: {:?}", account, info.balance);
} else {
    println!("账户未找到: {:?}", account);
}

2. 改用set_balance单独设置余额

直接插入AccountInfo可能与AlloyDB底层的账户信息冲突,改用revm提供的set_balance方法单独设置余额,确保余额被正确写入:

// 替换原有的insert_account_info逻辑
let ten_eth: Uint<256, 4> = parse_ether("10")?;
db.set_balance(account, ten_eth);
// 如需设置nonce,单独调用set_nonce
db.set_nonce(account, 0);

3. 适配optional_no_base_fee特性的交易参数

启用optional_no_base_fee后,建议显式设置交易的max_fee_per_gas和max_priority_fee_per_gas(而非仅设置gas_price),避免手续费计算逻辑异常:

let tx = evm.tx_mut();
tx.caller = account;
tx.gas_limit = 5_000_000;
// 显式设置手续费参数
tx.max_fee_per_gas = Some(gas_price);
tx.max_priority_fee_per_gas = Some(Uint::from(10 * 10u128.pow(9))); // 10gwei优先级手续费
tx.transact_to = TransactTo::Call(factory);
tx.data = calldata.into();
// 启用no_base_fee特性
tx.no_base_fee = true;

4. 调整账户配置顺序

你从AlloyDB读取Factory/代币账户信息后插入revm DB,可能覆盖了之前设置的用户账户。将用户账户的余额设置放在所有AlloyDB账户读取插入之后执行:

// 先插入从AlloyDB获取的合约账户
db.insert_account_info(factory, factory_acc_info);
db.insert_account_info(input_token, input_token_acc_info);
db.insert_account_info(output_token, output_token_acc_info);

// 再设置用户账户余额(放在最后避免被覆盖)
let ten_eth: Uint<256, 4> = parse_ether("10")?;
db.set_balance(account, ten_eth);
db.set_nonce(account, 0);

调试建议

在evm.transact_commit()前添加代码,打印调用者账户余额和交易所需手续费,确认数值匹配:

let required_fee = tx.gas_limit * tx.gas_price;
if let Some(info) = db.basic(account).unwrap() {
    println!("调用者余额: {:?}, 所需手续费: {:?}", info.balance, required_fee);
}

内容的提问来源于stack exchange,提问作者mykox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:12:39