目录
引言
在使用 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

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



