目前,我正在学习稳健性,在尝试使用MockV3Aggregator时,我面临一个错误:
ImportError: cannot import name 'MockV3Aggregator' from 'brownie'
这是我的支气管-config.yaml:
dependencies:
- smartcontractkit/chainlink-brownie-contracts@1.1.1
- OpenZeppelin/openzeppelin-contracts@3.4.0
compiler:
solc:
remappings:
- "@chainlink=smartcontractkit/chainlink-brownie-contracts@1.1.1"
- "@openzeppelin=OpenZeppelin/openzeppelin-contracts@3.4.0"
networks:
default: development
development:
keyhash: "0xd89b2bf150e3b9e13446986e571fb9cab24b13cea0a43ea20a6049a85cc807cc"
fee: 100000000000000000
mainnet-fork:
eth_usd_price_feed: "0x5f4ec3df9cbd43714fe2740f5e3616155c5b8419"
rinkeby:
vrf_coordinator: "0x6168499c0cFfCaCD319c818142124B7A15E857ab"
eth_usd_price_feed: "0x8A753747A1Fa494EC906cE90E9f37563A8AF630e"
link_token: "0x01BE23585060835E02B77ef475b0Cc51aA1e0709"
keyhash: "0xd89b2bf150e3b9e13446986e571fb9cab24b13cea0a43ea20a6049a85cc807cc"
fee: 100000000000000000
verify:
wallets:
from_key: ${PRIVATE_KEY}
这里是我试图访问MockV3Aggregator的地方:
from brownie import (
Contract,
network,
config,
accounts,
MockV3Aggregator,
VRFCoordinatorMock,
LinkToken,
)
FORKED_LOCAL_ENVIRONMENTS = ["mainnet-fork"]
LOCAL_BLOCKCHAIN_ENVIRONMENTS = ["development", "ganache-local"]
DECIMALS = 8
STARTING_PRICE = 200000000000
def get_accounts(index=None, id=None):
if index:
return accounts[index]
if id:
return accounts.load(id)
if (
network.show_active() in LOCAL_BLOCKCHAIN_ENVIRONMENTS
or network.show_active() in FORKED_LOCAL_ENVIRONMENTS
):
return accounts[0]
return accounts.add(config["wallets"]["from_key"])
contract_to_mock = {
"eth_usd_price_feed": MockV3Aggregator,
"v3_aggregator": VRFCoordinatorMock,
"link_token": LinkToken,
}
def get_contract(contract_name):
"""
This function will grab the contract addresses from the brownie
config if defined, otherwise it will deploy a mock version of
that contract and return that mock contract.
Args:
contract_name (string)
Returns:
brownie.network.contract.projectContract: The most recently
deployed version of this contract.
MockV3Aggregator[-1]
"""
contract_type = contract_to_mock[contract_name]
if network.show_active() in LOCAL_BLOCKCHAIN_ENVIRONMENTS:
if len(contract_type <= 0):
deploy_mocks()
contract = contract_type[-1]
else:
contract_address = config["networks"][network.show_active()][contract_name]
# address
# ABI
contract = Contract.from_abi(
contract_type._name, contract_address, contract_type.abi
)
return contract
def deploy_mocks():
account = get_accounts()
MockV3Aggregator.deploy(DECIMALS, STARTING_PRICE, {"from": account})
link_token = LinkToken.deploy({"from": account})
VRFCoordinatorMock.deploy(link_token.address, {"from": account})
print("Mocks deployed...")
如有任何帮助,将不胜感激。
发布于 2022-05-02 14:26:36
您需要将该合同添加到您的contracts
文件夹中。有关参考,请参阅chainlink-mix
。
只需在contracts文件夹中创建一个合同,如下所示:
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV2V3Interface.sol";
/**
* @title MockV3Aggregator
* @notice Based on the FluxAggregator contract
* @notice Use this contract when you need to test
* other contract's ability to read data from an
* aggregator contract, but how the aggregator got
* its answer is unimportant
*/
contract MockV3Aggregator is AggregatorV2V3Interface {
uint256 constant public override version = 0;
uint8 public override decimals;
int256 public override latestAnswer;
uint256 public override latestTimestamp;
uint256 public override latestRound;
mapping(uint256 => int256) public override getAnswer;
mapping(uint256 => uint256) public override getTimestamp;
mapping(uint256 => uint256) private getStartedAt;
constructor(
uint8 _decimals,
int256 _initialAnswer
) public {
decimals = _decimals;
updateAnswer(_initialAnswer);
}
function updateAnswer(
int256 _answer
) public {
latestAnswer = _answer;
latestTimestamp = block.timestamp;
latestRound++;
getAnswer[latestRound] = _answer;
getTimestamp[latestRound] = block.timestamp;
getStartedAt[latestRound] = block.timestamp;
}
function updateRoundData(
uint80 _roundId,
int256 _answer,
uint256 _timestamp,
uint256 _startedAt
) public {
latestRound = _roundId;
latestAnswer = _answer;
latestTimestamp = _timestamp;
getAnswer[latestRound] = _answer;
getTimestamp[latestRound] = _timestamp;
getStartedAt[latestRound] = _startedAt;
}
function getRoundData(uint80 _roundId)
external
view
override
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
)
{
return (
_roundId,
getAnswer[_roundId],
getStartedAt[_roundId],
getTimestamp[_roundId],
_roundId
);
}
function latestRoundData()
external
view
override
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
)
{
return (
uint80(latestRound),
getAnswer[latestRound],
getStartedAt[latestRound],
getTimestamp[latestRound],
uint80(latestRound)
);
}
function description()
external
view
override
returns (string memory)
{
return "v0.6/tests/MockV3Aggregator.sol";
}
}
https://ethereum.stackexchange.com/questions/127178
复制相似问题