Brownie运行脚本实例化外部合约时报错Unknown contract address问题咨询
问题成因
- Brownie交互环境(
brownie console)默认开启了从对应网络区块浏览器自动拉取外部合约ABI的逻辑,因此直接传入外部合约地址即可完成实例化。 - 脚本运行模式下,默认禁用了自动拉取外部合约ABI的逻辑,当传入的合约地址不在当前Brownie项目的已部署合约缓存、也没有提前导入对应ABI时,就会触发
Unknown contract address报错。 - 你当前使用的v1.16.4版本本身也存在脚本模式与交互模式默认ABI拉取行为不统一的问题,进一步放大了该异常。
解决方案
方法1:使用Contract.from_explorer显式拉取ABI
这是适配性最高的解决方法,显式调用接口从区块浏览器拉取对应地址的已验证合约ABI来完成实例化,代码修改如下:
from brownie import Contract # 替换原有的Contract(地址)写法 addr_provider = Contract.from_explorer("0x79447c97b6543F6eFBC91613C655977806CB18b0")
方法2:手动指定ABI实例化
如果你已经持有对应合约的ABI文件,可以直接通过from_abi方法实例化,不需要调用区块浏览器接口:
from brownie import Contract # 替换为实际的合约ABI custom_abi = [{"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}] addr_provider = Contract.from_abi( "CustomContract", "0x79447c97b6543F6eFBC91613C655977806CB18b0", custom_abi )
方法3:修改项目配置统一脚本与交互模式行为
在项目根目录的brownie-config.yaml中添加如下配置,开启脚本模式下的自动ABI拉取能力:
networks: mainnet: explorer: https://api.etherscan.io/api auto_fetch_abi: True
配置完成后原来的Contract(地址)写法即可在脚本中正常运行。
注意:所有需要调用区块浏览器拉取ABI的方法,都需要先配置对应浏览器的API密钥,主网对应Etherscan的API密钥可在Etherscan官网注册后免费获取,配置方式为运行脚本前执行命令:
export ETHERSCAN_TOKEN=你的Etherscan API密钥
内容的提问来源于stack exchange,提问作者Patrick Collins
相关产品推荐
相关产品推荐

