diff --git a/contracts/moonstream/ERC20Facet.sol b/contracts/moonstream/ERC20Facet.sol index 3651559..16debe1 100644 --- a/contracts/moonstream/ERC20Facet.sol +++ b/contracts/moonstream/ERC20Facet.sol @@ -24,4 +24,9 @@ contract ERC20Facet is ERC20WithCommonStorage { LibERC20.enforceIsController(); _mint(account, amount); } + + function batchMint(address[] calldata accounts, uint256 amount) external { + LibERC20.enforceIsController(); + _batchMint(accounts, amount); + } } diff --git a/contracts/moonstream/ERC20WithCommonStorage.sol b/contracts/moonstream/ERC20WithCommonStorage.sol index f931d61..5315bf9 100644 --- a/contracts/moonstream/ERC20WithCommonStorage.sol +++ b/contracts/moonstream/ERC20WithCommonStorage.sol @@ -286,6 +286,15 @@ contract ERC20WithCommonStorage is Context, IERC20, IERC20Metadata { _afterTokenTransfer(address(0), account, amount); } + function _batchMint(address[] calldata accounts, uint256 amount) + internal + virtual + { + for (uint256 i = 0; i < accounts.length; i++) { + _mint(accounts[i], amount); + } + } + /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. diff --git a/dao/ERC20Facet.py b/dao/ERC20Facet.py index f6225ec..15f233b 100644 --- a/dao/ERC20Facet.py +++ b/dao/ERC20Facet.py @@ -1,5 +1,5 @@ # Code generated by moonworm : https://github.com/bugout-dev/moonworm -# Moonworm version : 0.1.14 +# Moonworm version : 0.1.16 import argparse import json @@ -107,6 +107,10 @@ class ERC20Facet: self.assert_contract_is_instantiated() return self.contract.balanceOf.call(account) + def batch_mint(self, accounts: List, amount: int, transaction_config) -> Any: + self.assert_contract_is_instantiated() + return self.contract.batchMint(accounts, amount, transaction_config) + def decimals(self) -> Any: self.assert_contract_is_instantiated() return self.contract.decimals.call() @@ -221,6 +225,9 @@ def add_default_arguments(parser: argparse.ArgumentParser, transact: bool) -> No parser.add_argument( "--nonce", type=int, default=None, help="Nonce for the transaction (optional)" ) + parser.add_argument( + "--value", default=None, help="Value of the transaction in wei(optional)" + ) def handle_deploy(args: argparse.Namespace) -> None: @@ -262,6 +269,18 @@ def handle_balance_of(args: argparse.Namespace) -> None: print(result) +def handle_batch_mint(args: argparse.Namespace) -> None: + network.connect(args.network) + contract = ERC20Facet(args.address) + transaction_config = get_transaction_config(args) + result = contract.batch_mint( + accounts=args.accounts, + amount=args.amount, + transaction_config=transaction_config, + ) + print(result) + + def handle_decimals(args: argparse.Namespace) -> None: network.connect(args.network) contract = ERC20Facet(args.address) @@ -400,6 +419,16 @@ def generate_cli() -> argparse.ArgumentParser: balance_of_parser.add_argument("--account", required=True, help="Type: address") balance_of_parser.set_defaults(func=handle_balance_of) + batch_mint_parser = subcommands.add_parser("batch-mint") + add_default_arguments(batch_mint_parser, True) + batch_mint_parser.add_argument( + "--accounts", required=True, help="Type: address[]", nargs="+" + ) + batch_mint_parser.add_argument( + "--amount", required=True, help="Type: uint256", type=int + ) + batch_mint_parser.set_defaults(func=handle_batch_mint) + decimals_parser = subcommands.add_parser("decimals") add_default_arguments(decimals_parser, False) decimals_parser.set_defaults(func=handle_decimals) diff --git a/dao/test_moonstream.py b/dao/test_moonstream.py index 3fa1adb..06c8255 100644 --- a/dao/test_moonstream.py +++ b/dao/test_moonstream.py @@ -123,6 +123,21 @@ class TestERC20(MoonstreamTokenTestCase): final_balance = diamond.balance_of(accounts[1].address) self.assertEqual(final_balance, initial_balance + 1000) + def test_mint_batch_to_another_addresses(self): + diamond_address = self.contracts["Diamond"] + diamond = ERC20Facet.ERC20Facet(diamond_address) + initials = [] + for account in accounts[1:]: + initials.append(diamond.balance_of(account.address)) + + diamond.batch_mint(accounts[1:], 1000, {"from": accounts[0]}) + for index, account in enumerate(accounts[1:]): + initial_balance = initials[index] + final_balance = diamond.balance_of(account.address) + self.assertEqual( + final_balance, initial_balance + accounts[1:].count(account) * 1000 + ) + def test_transfer(self): diamond_address = self.contracts["Diamond"] diamond = ERC20Facet.ERC20Facet(diamond_address)