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
- Oracle ERC20代币:
- 核心代码片段:
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, },
排查建议
- RPC节点排查
- 更换Songbird网络的RPC节点,比如第三方节点服务的Songbird节点,避免官方节点限流或不稳定
- 给请求添加重试机制,用重试库包裹
approve调用,规避单次请求失败
- Gas参数调整
- 当前
gasPrice设为900000000(0.9Gwei),可适当提高至1.2Gwei左右,避免因gas不足被节点拒绝 - 手动指定
gasLimit,比如在approve调用时添加{ gasLimit: 100000 }参数(ERC20 approve的gasLimit通常在5-10万区间)
- 当前
- 参数格式校验
- 确认
oracleBalance是ethers支持的BigNumber类型,避免传入普通数字导致格式错误 - 若需无限授权,直接使用
ethers.constants.MaxUint256替代oracleBalance
- 确认
- ABI正确性验证
- 检查
oracleAbi是否包含正确的approve方法签名:function approve(address spender, uint256 amount) external returns (bool),ABI错误会直接导致调用失败
- 检查
- 离线签名测试
- 尝试离线签名
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
相关产品推荐
相关产品推荐

