Solidity

如何在布朗尼腳本中使用來自項目依賴項的契約?

  • October 6, 2021

我想部署一個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

重新映射時不要使用整個文件路徑。

引用自:https://ethereum.stackexchange.com/questions/104219