Aave FlashLiquidationAdapter参数编码后abi.decode回滚问题求助
Aave FlashLiquidationAdapter合约参数解码回滚问题修复方案
错误根因定位
回滚由3个核心问题共同导致:
- 参数编码格式错误:你传入的
params是ASCII编码的十六进制字符串,不是Solidityabi.decode要求的原生二进制bytes数据。你使用的b"0000..."实际是把字符'0'的ASCII值(0x30)作为bytes内容,和合约期望的ABI编码二进制完全不匹配,直接触发解码失败回滚。 debtToCover参数类型不匹配:原始参数里你传了-1,但合约要求该字段是uint256无符号整数,负数无法被正确解码为uint256,就算编码正确也会触发回滚。useEthPath参数值编码错误:原始参数里你传了0(对应bool值false),但你手动拼接的编码末尾是0x01,对应bool值true,参数值不一致。
正确修复步骤
1. 用标准ABI编码生成params
不要手动拼接十六进制字符串,使用开发框架自带的ABI编码方法,以Python的web3.py为例,正确编码代码如下:
from web3 import Web3 import eth_abi # 替换为实际有效参数,注意debtToCover要传正整数,useEthPath对应实际需求的bool值 collateral_asset = "0xb7c325266ec274feb1354021d27fa3e3379d840d" borrowed_asset = "0xff682ff79feb2c057ec3ff1e083efdc66f9b37fb" user = "0x1ea0B089673720e210552c624aFff9d67F8b1535" debt_to_cover = Web3.to_wei(1.4, 'ether') # 替换为实际要覆盖的债务金额,必须为正整数 use_eth_path = False # 对应原始参数的0,改为True则对应1 # 正确编码params params = eth_abi.encode(['address', 'address', 'address', 'uint256', 'bool'], [collateral_asset, borrowed_asset, user, debt_to_cover, use_eth_path])
2. 替换交易构造中的params字段
把原来硬编码的十六进制字符串替换为上面生成的params变量即可,修改后的交易代码示例:
tx = flash_loan.requestFlashLoan( ["0xb7c325266ec274feb1354021d27fa3e3379d840d"], [(2.8134148508367174 / 2) * 1e18], [0], params, # 替换为上面生成的编码后数据 {"gas_limit": "200000", "gas_price": Wei('4 gwei'), "from": account1, "allow_revert": True, "nonce": 46} )
3. 额外注意事项
debtToCover的数值不能超过用户实际的未偿还债务金额,否则后续清算逻辑也会触发回滚。- 如果债务资产精度不是18位,需要对应调整
debt_to_cover的数值单位,不要直接用ether单位转换。 - 0.6.x版本的Solidity ABI编码规则和后续版本兼容,不需要额外处理编码版本差异。
内容的提问来源于stack exchange,提问作者pygeek
相关产品推荐
相关产品推荐

