Helper objects for generating ERC20s while testing a Brownie project.
- python3 version 3.6 or greater, python3-dev
- brownie version 1.11.6 or greater
- ganache-cli version 6.11.0 or greater
If you have installed Brownie using pipx
, you need to add brownie-token-tester
into the same virtual environment:
pipx inject eth-brownie brownie-token-tester
You can install the latest release via pip
:
pip install brownie-token-tester
You can clone the repository and use setuptools
for the most up-to-date version:
git clone https://github.com/iamdefinitelyahuman/brownie-token-tester.git
cd brownie-token-tester
python3 setup.py install
Import the library from within a Brownie test, script or console:
from brownie_tokens import ERC20, MintableForkToken
You can then make use of the following functionality:
Deploys a generic ERC20 contract for testing purposes.
def ERC20(
name: str = "Test Token",
symbol: str = "TST",
decimals: int = 18,
success: Union[bool, None] = True,
fail: Union[bool, str, None] = "revert",
) -> Contract:
- The
success
kwarg is used to set the token's return value upon a successful call toapprove
,transfer
ortransferFrom
. Valid values areTrue
,False
, andNone
. - The
fail
kwarg sets the token's behaviour upon failed calls to the above methods. Use"revert"
if the transaction should revert, orTrue
,False
, andNone
to return a value without reverting.
The resulting deployment adheres to the ERC20 Token Standard and additionally implements one non-standard method:
def _mint_for_testing(target: address, amount: uint256): nonpayable
This method increases the balance of target
by amount
. It may be called by any account.
MintableForkToken
is used to standardize the process of minting tokens when working in a forked mainnet environment. The MintableForkToken
class inherits from and may be used interchangeably with the Contract
class. It exposes one additional method, _mint_for_testing
, with the same API as given above.
For tokens where custom logic is implemented, this is an actual minting event. For most tokens, the "minting" process involves a query to the Ethplorer API to get a list of top token holders, and then transferring their balances to target
. If you want to exclude some holders from this process use skip_holders(*addresses)
. If you have too many requests at a time set $ETHPLORER_API_KEY
(see ethplorer.io) as environment variable.
Tokens for which custom logic is currently implemented:
- Aave tokens
- DAI
- EURS
- LinkUSD
- pBTC
- Synthetix synths
- renBTC
- renZEC
- rETH
- RSV
- USDC
- USDN
- USDT
- tBTC
- wBTC
- wZEC
This project is still in early development and should be considered an alpha. Comments, questions, criticisms and pull requests are welcomed.
This project is licensed under the MIT license.