使用Maticjs通过POS Bridge跨链ERC20代币时触发零地址授权错误
ERC20跨链approve报错:"execution reverted: ERC20: approve to the zero address" 解决方案
核心原因
调用erc20.approve()时,maticjs需要将代币授权给根链POS Portal合约作为跨链中转方,但当前代码未指定该合约地址,导致默认传入零地址触发ERC20安全校验。
修复步骤
- 确认Portal合约地址:Goerli测试网的ERC20 POS Portal合约地址为
0x2890bA17EfE978480615e330ecB6533b880928e7(主网需替换为对应官方地址)。 - 修改approve调用逻辑:在
approve方法中明确传入Portal合约地址作为授权对象,同时可配置gas参数。修改后的代码如下:
async function approveToken() { const posClient = await getPOSClient(); const erc20Token = posClient.erc20(process.env.ROOT_TOKEN, true); // 指定Goerli测试网的ERC20 POS Portal地址 const portalAddress = '0x2890bA17EfE978480615e330ecB6533b880928e7'; const result = await erc20Token.approve('1000', { to: portalAddress, gasLimit: '300000' // 可根据实际情况调整gas上限 }); const txHash = await result.getTransactionHash(); console.log('txHash', txHash); const receipt = await result.getReceipt(); console.log('receipt', receipt); }
- 验证环境变量:
- 确保
process.env.ROOT_TOKEN是**根链(Goerli)**上已完成映射的ERC20代币地址,而非Polygon侧的代币地址。 - 确认
FROM_ADDRESS与私钥对应,且账户持有足够的Goerli ETH用于支付gas费用。
- 确保
额外排查建议
- 确认代币在Polygon映射门户的映射状态正常,无映射失败记录。
- 若代码修改后仍报错,可通过MetaMask手动调用根链代币合约的
approve方法,授权给Portal合约,再执行跨链操作,排除代码逻辑外的问题。
内容的提问来源于stack exchange,提问作者Ankit Pareek
相关产品推荐
相关产品推荐

