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

Songbird网络ERC-20授权OracleSwapRouter遇ProviderError求助

Songbird网络OracleSwap授权ERC20代币时出现ProviderError问题排查

我在Songbird(兼容EVM)网络的OracleSwap(基于Uniswap分叉的DEX)农场添加流动性,按照Uniswap V2文档要求,需要先授权OracleSwapRouter合约使用我的ERC-20代币,但执行approve操作时抛出以下错误:

ProviderError: HttpProviderError
    at HttpProvider.request (<path>/node_modules/hardhat/src/internal/core/providers/http.ts:78:19)
    at LocalAccountsProvider.request (<path>/node_modules/hardhat/src/internal/core/providers/accounts.ts:181:36)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async EthersProviderWrapper.send (<path>/node_modules/@nomiclabs/hardhat-ethers/src/internal/ethers-provider-wrapper.ts:13:20)

已知信息

  • ERC20合约实例正常:通过balanceOf方法可正常获取账户余额
  • 相关合约地址:
    • Oracle ERC20代币:0xD7565b16b65376e2Ddb6c71E7971c7185A7Ff3Ff
    • OracleSwapRouter合约:0x73E93D9657E6f32203f900fe1BD81179a5bf6Ce4
  • 核心代码片段:
const OracleSwapRouterContract = await ethers.getContractAt(OracleSwapRouterAbi.default, "0x73E93D9657E6f32203f900fe1BD81179a5bf6Ce4");

const oracleContract = await ethers.getContractAt(oracleAbi.default,  "0xd7565b16b65376e2ddb6c71e7971c7185a7ff3ff");

await oracleContract.approve(
    "0x73E93D9657E6f32203f900fe1BD81179a5bf6Ce4",
    oracleBalance
);
  • Hardhat网络配置:
songbird: {
    url: "https://songbird-api.flare.network/ext/C/rpc",
    chainId: 19,
    accounts:
        SONGBIRD_PRIVATE_KEY !== undefined ? [SONGBIRD_PRIVATE_KEY] : [],
    gasPrice: 900000000,
},

排查建议

  1. RPC节点排查
    • 更换Songbird网络的RPC节点,比如第三方节点服务的Songbird节点,避免官方节点限流或不稳定
    • 给请求添加重试机制,用重试库包裹approve调用,规避单次请求失败
  2. Gas参数调整
    • 当前gasPrice设为900000000(0.9Gwei),可适当提高至1.2Gwei左右,避免因gas不足被节点拒绝
    • 手动指定gasLimit,比如在approve调用时添加{ gasLimit: 100000 }参数(ERC20 approve的gasLimit通常在5-10万区间)
  3. 参数格式校验
    • 确认oracleBalance是ethers支持的BigNumber类型,避免传入普通数字导致格式错误
    • 若需无限授权,直接使用ethers.constants.MaxUint256替代oracleBalance
  4. ABI正确性验证
    • 检查oracleAbi是否包含正确的approve方法签名:function approve(address spender, uint256 amount) external returns (bool),ABI错误会直接导致调用失败
  5. 离线签名测试
    • 尝试离线签名approve交易再手动广播,排除Hardhat Provider内部问题:
      const tx = await oracleContract.populateTransaction.approve(
          "0x73E93D9657E6f32203f900fe1BD81179a5bf6Ce4",
          oracleBalance
      );
      const signedTx = await wallet.signTransaction(tx);
      const txResponse = await ethers.provider.sendTransaction(signedTx);
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:40:44