deploy_mocks()
When deploying to local blockchain environments that are not forks (ganache-cli, ganacheUI), we need to deploy mock contracts of external contracts we import .
When deploying to Forked environments, no need for mocks. We will refer to existing deployments via their addresses on the respective chain we are forking.
Iteration 1
from brownie import FundMe
from brownie import network, config
from scripts.helpful_scripts import *
from scripts.helpful_scripts import LOCAL_BLOCKCHAIN_ENV
def deploy_fund_me():
account = get_account()
print(f"Deploying on ....{network.show_active()}")
if network.show_active() not in LOCAL_BLOCKCHAIN_ENV:
price_feed_address = config["networks"][network.show_active()]["eth_usd_price_feed"]
else: #deploy mock of price feed on internal chain: development
deploy_mocks()
price_feed_address = MockV3Aggregator[-1].address Here the external contract we need is the chainlink ETH/USD price feed contract to pass into AggregatorV3Interface.
from brownie import MockV3Aggregator
DECIMAL_PLACES = 8 #to resemble eth/usd price feed on mainnet aggregator
STARTING_PRICE = (2000*10**8)
def deploy_mocks():
print(f"The active network is {network.show_active()}")
print("Deploying.....")
if len(MockV3Aggregator) <= 0:
MockV3Aggregator.deploy(DECIMAL_PLACES,STARTING_PRICE,{"from":get_account()}) #contract object
print(f"Mocks Deployed at: {MockV3Aggregator[-1].address}")If deploying to live chain (mainnet, rinkeby), price_feed_address will reference the chainlink ethusd contract address on the corresponding deployed.
We store chainlink's pricefeed contract's corresponding address for each live chain in brownie-config.yaml, under the variable: eth_usd_price_feed.
If we are deploying to rinkeby, price_feed_address == eth_usd_price_feed == 0x8A753747A1Fa494EC906cE90E9f37563A8AF630e
If deploying to internal chain, like development
deploymocks() is called -> stored in helpful_scripts.py
checks if a prior instance exists
if there are not prior deployments, it will deploy a fresh mock contract.
if a prior deployment exists, nothing is done within deploy_mocks(),
execution goes back deploy.py line15: price_feed_address = MockV3Aggregator[-1].address
Iteration 2: get_contract() + deploy_mocks()
Explanation
Create a dictionary contract_to_mock, which stores the actual contract names as values, and our reference names as keys.
"eth_usd_price_feed": MockV3Aggregator
contract_type = MockV3Aggregator
getcontract takes a parameter, contract_name, which is passed into the dictionary to obtain the true name of the contract.
if deploying to LOCAL_BLOCKCHAIN_ENV
mocks will be required. check if prior mock exists, if it does not, deploy_mocks() is ran.
contract = contract_type[-1] -> contract = MockV3Aggregator[-1]
This creates a Contract container called contract which holds the mock contracts. To access their address: contract.address
Else: no mocks needed
Access deployed contracts via their livenet addresses and abi.
contract address is obtained from brownie-config.yaml contract_address = config["networks"][network.show_active()][contract_name]
Beyond the address, we will need the contract's ABI to know how to interact with it.
Together, we will create a brownie Contract container object:
The ABI is accessed via contract_type.abi -> MockV3Aggregator.abi
The ABI is generated and stored in build/contracts/dependencies as part of our import statement setup.
Last updated