get_accounts

Account types

  1. accounts[0] -- dummy ganache accounts

  2. accounts.add("env") -- private key from env file

    1. -> accounts.add(config["wallets"]["wallet1"])

  3. accounts.load("id") -- load from brownie accounts list

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 

    fund_me = FundMe.deploy(price_feed_address,
    {"from": account}, 
    publish_source=config["networks"][network.show_active()].get("verify"))

    print(f"Contract deployed to: {fund_me.address}")
    return fund_me

def main():
    deploy_fund_me() 
    #Python will automatically run main() on execution.

Account

account = get_account()

  • get_account is defined in helpful_scripts

  • Function will check which network we are deploying to. If it is in LOCAL_BLOCKCHAIN_ENV / FORKED_LOCAL_ENV, a dummy ganache account is used.

forking mainnet into a private env, so can use dummy accounts.

  • Else, (i.e. live chains: mainnet, testnet), MetaMask wallet is used.

    • pulls private key from wallet1 defined in brownie-config.yaml

    • which in turn references the PK stored in the .env file

    • we do this, as opposed to hardcoding into the yaml file, so that on a git push, the .env is not uploaded to github, thereby exposing our private key.

In this version of get_accounts(), we only utilized dummy accounts and adding accounts from Private Key. We shall see the third method in the next interation.

Iteration 2

from brownie import network, accounts,config, Contract
from brownie import MockV3Aggregator

DECIMAL_PLACES = 8          #to resemble eth/usd price feed on mainnet aggregator
STARTING_PRICE = (2000*10**8)

LOCAL_BLOCKCHAIN_ENV = ["development", "ganache-local"]
FORKED_LOCAL_ENV = ["mainnet-fork", "mainnet-fork-dev"]

def get_account(index=None,id=None):
    if index:
        #if index was passed return ganache account
        return accounts[index]
    
    if id:
        return accounts.load(id)

    if network.show_active() in LOCAL_BLOCKCHAIN_ENV or network.show_active() in FORKED_LOCAL_ENV:
        return accounts[0]          #use ganache generated account.  
      
    else: #look in config.yaml
        return accounts.add(config["wallets"]["wallet1"])  

def get_account(index=None,id=None):

both parameters, index and id are optional, as their default value is set to None.

  • if index parameter is passed, function will return a dummy ganache account based on the parameter

    • account[index]

  • if id is passed, for example, get_account(id=freecodecamp)

    • function will reference stored accounts in brownie of the id name

    • can store an account by: brownie accounts new <id>

      • pass the private key, add 0x before it.

      • brownie will request for a password to hash it.

If neither index nor id are passed,

  • and deployment into LOCAL_BLOCKCHAIN_ENV / FORKED_LOCAL_ENV -> account[0]

  • else (live chains: mainnet/rinkeby), -> use PK from config.yaml file

In summary,

  1. if index specified -> use ganache account

  2. if id specified -> use id, stored account

  3. none specified -> if local/forked env, use dummy, else use PK from config.yaml

Last updated