Solidity
如何在布朗尼腳本中使用來自項目依賴項的契約?
我想部署一個
OpenZeppelin/openzeppelin-contracts@4.2.0
無需更改即可直接在 Brownie 包中訪問的合約,即ERC1967Proxy 和來自 Brownie 控制台的其他非抽象合約。如何在 Brownie 腳本或控制台中導入它?
我的
brownie-config.yaml
:compiler: solc: version: 0.8.2 remappings: - "@openzeppelin/contracts-upgradeable=~/.brownie/packages/OpenZeppelin/openzeppelin-contracts-upgradeable@4.2.0/contracts" - "@openzeppelin-upgradeable=/home/etsvigun/.brownie/packages/OpenZeppelin/openzeppelin-contracts-upgradeable@4.2.0" - "@openzeppelin=OpenZeppelin/openzeppelin-contracts@4.2.0" dependencies: - OpenZeppelin/openzeppelin-contracts@4.2.0 - OpenZeppelin/openzeppelin-contracts-upgradeable@4.2.0
導入在 Solidity 程式碼中都可以正常工作,來自兩個重新映射,例如
import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
嘗試僅按名稱從包中導入契約會導致錯誤:
>>> from brownie import Proxy File "<console>", line 1, in <module> ImportError: cannot import name 'Proxy' from 'brownie' (~/.local/pipx/venvs/eth-brownie/lib/python3.9/site-packages/brownie/__init__.py)
在一個嚮往的回購中發現了這種模式,也許這就是你要找的?
from brownie import project Vault = project.load( Path.home() / ".brownie" / "packages" / config["dependencies"][0] ).Vault
你很近。
該
dependencies
部分標識您要下載的位置。您已經使用 github 語法正確放置了該部分。您想OpenZeppelin
使用 repo下載組織openzeppelin-contracts
。然後,您要做的是“重新映射”您的導入,以便您定義的關鍵字與該包對齊。
您正在“重新映射”
"@openzeppelin/contracts-upgradeable
到/home/etsvigun/.brownie/packages/OpenZeppelin/openzeppelin-contracts-upgradeable@4.2.0/contracts
. 相反,試試這個:compiler: solc: version: 0.8.2 remappings: - "@openzeppelin-upgradeable=OpenZeppelin/openzeppelin-contracts-upgradeable@4.2.0" - "@openzeppelin=OpenZeppelin/openzeppelin-contracts@4.2.0" dependencies: - OpenZeppelin/openzeppelin-contracts@4.2.0 - OpenZeppelin/openzeppelin-contracts-upgradeable@4.2.0
重新映射時不要使用整個文件路徑。