错误排查

错误代码

为了减少gas使用和代码大小,Aave合约返回数字错误代码。如果您调用协议时收到数字错误,可以使用下方的参考来了解错误的含义。或者,您也可以查看Errors.sol来了解这些数字代表的内容。

参考指南

ValidationLogicLendingPoolCollateralManager 返回一些与抵押品相关的错误。返回类型为 uint

错误代码 (uint) 错误描述
0 无错误
1 无可用抵押品
2 抵押品无法被清算
3 未借入货币
4 健康因子高于阈值
5 资金不足
6 健康因子低于清算阈值
7 交换的资产相等无效
8 资金池被冻结

其他返回为字符串的错误代码:

错误代码 (string) 来源 错误描述
1 ValidationLogic 金额必须大于0
2 ValidationLogic 操作需要一个活跃的资金池
3 ValidationLogic 操作无法执行,因为资金池已被冻结
4 ValidationLogic 当前流动性不足
5 ValidationLogic 用户无法提取超过可用余额的金额
6 ValidationLogic 转账不被允许
7 ValidationLogic 借贷功能未启用
8 ValidationLogic 选择了无效的利率模式
9 ValidationLogic 抵押品余额为0
10 ValidationLogic 健康因子低于清算阈值
11 ValidationLogic 没有足够的抵押品来支持新的借贷
12 ValidationLogic 稳定借贷未启用
13 ValidationLogic 抵押品与所借货币相同
14 ValidationLogic 请求的金额超过了稳定利率模式下的最大贷款金额
15 ValidationLogic 没有选择的债务类型
16 ValidationLogic 代表用户偿还时需要明确偿还金额
17 ValidationLogic 用户在该资金池中没有稳定利率贷款
18 ValidationLogic 用户在该资金池中没有可变利率贷款
19 ValidationLogic 基础余额必须大于0
20 ValidationLogic 用户的存款已被用作抵押品
21 LendingPool 稳定利率借贷余额不足
22 LendingPool 利率再平衡条件不满足
23 LendingPool 清算调用失败
24 LendingPool 流动性不足以借款
25 LendingPool 请求的金额对于闪电贷而言过小
26 LendingPool 协议的实际余额不一致
27 LendingPool 函数的调用者不是资金池配置器
28 LendingPool 闪电贷参数不一致
29 aToken/debtToken 调用者必须是资金池
30 aToken/debtToken 用户不能给自己授权
31 aToken/debtToken 转账金额必须大于0
32 ReserveLogic 资金池已经初始化
33 调用者不是资金池管理员
34 LendingPoolConfigurator 资金池流动性必须为0
35 LendingPoolConfigurator 无效的aToken资金池地址
36 LendingPoolConfigurator 无效的稳定债务代币资金池地址
37 LendingPoolConfigurator 无效的可变债务代币资金池地址
38 LendingPoolConfigurator 稳定债务代币的基础资产地址无效
39 LendingPoolConfigurator 可变债务代币的基础资产地址无效
40 LendingPoolConfigurator 无效的地址提供者ID
41 LendingPoolAddressesProviderRegistry 提供者未注册
42 LendingPoolCollateralManager 健康因子不低于阈值
43 LendingPoolCollateralManager 抵押品无法被清算
44 LendingPoolCollateralManager 用户未借入指定的货币
45 LendingPoolCollateralManager 流动性不足以进行清算
46 LendingPoolCollateralManager 无错误
47 LiquidityProvider 无效的闪电贷模式
48 Math 乘法溢出
49 Math 加法溢出
50 Math 除以0
51 ReserveLogic 流动性指数溢出
52 ReserveLogic 可变借贷指数溢出
53 ReserveLogic 流动性利率溢出
54 ReserveLogic 可变借贷利率溢出
55 ReserveLogic 稳定借贷利率溢出
56 aToken/debtToken 铸造金额无效
57 LendingPool 使用抵押品偿还失败
58 aToken/debtToken 销毁金额无效
59 借贷授权不足
60 LendingPool 抵押品交换失败
61 LendingPool 无效的相同资产交换
62 LendingPool 不允许重入
63 LendingPool 调用者必须是aToken
64 LendingPool 资金池已暂停
65 LendingPool 不允许再有新的资金池
66 LendingPool 闪电贷执行者返回的金额无效
67 ReserveConfiguration 锁定总价值无效
68 ReserveConfiguration 流动性阈值无效
69 ReserveConfiguration 流动性奖励无效
70 ReserveConfiguration 小数位数无效
71 ReserveConfiguration 资金池因子无效
72 LendingPoolAddressesProviderRegistry 地址提供者ID无效
73 ValidationLogic 闪电贷参数不一致
74 LendingPool 参数长度不一致
75 LendingPoolConfigurator 无效的配置
76 LendingPoolConfigurator 调用者不是紧急管理员
77 UserConfiguration 索引无效
78 LendingPool 不是合约
79 稳定债务代币 稳定债务溢出
80 稳定债务代币 销毁超过余额

在主网或Kovan上调试交易

如果您的合约已成功部署到公共网络上,您可以使用Tenderly服务进行调试。

Tenderly允许您像在本地实例中一样调试交易,使用其强大的工具。如果您的交易失败,可以尝试使用其调试器找到交易失败的代码行。

在Truffle中调试交易

如果您运行了Truffle实例(例如consoledevelop),则可以通过在Truffle实例中输入 debug YOUR_TX_HASH 来调试特定交易。有关更多信息,请参见ez-flashloan starter template README.MD

EVM复原错误 SafeERC20:低级调用失败

此错误表示对SafeERC20实现的函数调用失败。在生产环境中,您应继续使用这些SafeERC20实现。

但在测试中,您可能希望通过去除SafeERC20实现来获得更精确的EVM错误消息。可以通过将SafeERC20调用替换为标准ERC20调用来实现。例如,在ez-flashloan starter template中,将以下代码:

IERC20(_reserve).safeTransfer(_destination, _amount);

替换为:

IERC20(_reserve).transfer(_destination, _amount);

如果此行代码回退,您将收到标准EVM错误消息,这有时对调试更有帮助。

Web3错误:nonce过低

此错误通常是由于您的Web3钱包在创建交易时使用的nonce不正确,意味着所使用的nonce不是正确的,因为与钱包通信的以太坊节点表明存在更高nonce的最近交易。这里有一个关于以太坊交易中nonce的好概述

一些可能的解决方案:

  • 如果使用的是MetaMask等Web3钱包:进入MetaMask设置 —> 高级 —> 重置账户。这将重置本地浏览器缓存中的交易历史,包括nonce计数。您发送的下一笔交易将使用与钱包连接的以太坊节点的最新nonce。
  • 如果错误不是来自您的Web3钱包,则可能是由于其连接的以太坊节点的原因。对于如Infura等服务,其网络由许多服务器组成,其中某个先前提交的交易可能在您当前连接的服务器上不可见。在这种情况下,等待几分钟后重试。