解决 Hardhat 本地部署 Uniswap V2 时出现 “function call to a non-contract account“ 错误的方法

引言

在使用 Hardhat 本地节点进行 Uniswap V2 部署和交互时,可能会遇到 function call to a non-contract account 的错误提示。该错误通常源于 Router 合约在调用 pairFor() 函数时,计算出的交易对合约地址(Pair 地址)与实际部署的 Pair 合约地址不一致,导致调用失败。此问题的根本原因在于 INIT_CODE_PAIR_HASH 的不匹配。

解决报错 function call to a non-contract account 表示在调用的合约地址上,其实并不存在已部署的合约(或初始化 codeHash 不匹配,导致 Router 在 _addLiquidity() 里调用计算得到的 Pair 地址并没有部署合约)

在这里插入图片描述

原因分析

Router 使用的 pairFor() 逻辑(或 UniswapV2Library)计算出来的合约地址

pairFor() 内部通过 factory, tokenA, tokenB 以及一个固定的 INIT_CODE_PAIR_HASH(即 Pair contract 的 bytecode 哈希)来计算 Pair 合约的地址。

如果这个 INIT_CODE_PAIR_HASH 是 hardcoded 的 主网默认值,而本地环境部署的是自定义(重新编译)的 Pair 合约,那么这个值就不匹配,也就算不出正确地址,Router 计算后会调用一个空地址,就出现你看到的“非合约账户”错误 。

Factor

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yoona1020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值