From 2ccf55247a7c99c795d2e51cf6ac806709401e33 Mon Sep 17 00:00:00 2001 From: Andrey Dolgolev Date: Wed, 9 Feb 2022 18:35:35 +0200 Subject: [PATCH 1/2] Add batchMint. --- contracts/moonstream/ERC20Facet.sol | 5 +++ .../moonstream/ERC20WithCommonStorage.sol | 9 ++++++ dao/ERC20Facet.py | 31 ++++++++++++++++++- dao/test_moonstream.py | 20 +++++++++--- 4 files changed, 60 insertions(+), 5 deletions(-) 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 ffd8a2e..fb1ee81 100644 --- a/contracts/moonstream/ERC20WithCommonStorage.sol +++ b/contracts/moonstream/ERC20WithCommonStorage.sol @@ -304,6 +304,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 fb0d6f4..904294c 100644 --- a/dao/test_moonstream.py +++ b/dao/test_moonstream.py @@ -133,6 +133,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) @@ -227,10 +242,7 @@ class TestERC20(MoonstreamTokenTestCase): with self.assertRaises(Exception): diamond.transfer_from( - accounts[1].address, - accounts[2].address, - 501, - {"from": accounts[2]}, + accounts[1].address, accounts[2].address, 501, {"from": accounts[2]}, ) final_sender_balance = diamond.balance_of(accounts[1].address) From 7d2b069d8f6c3778bbf6fa97f872d0dded73bc16 Mon Sep 17 00:00:00 2001 From: Andrey Dolgolev Date: Wed, 9 Feb 2022 21:18:29 +0200 Subject: [PATCH 2/2] black formating. --- dao/test_moonstream.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dao/test_moonstream.py b/dao/test_moonstream.py index 904294c..2bd72fa 100644 --- a/dao/test_moonstream.py +++ b/dao/test_moonstream.py @@ -242,7 +242,10 @@ class TestERC20(MoonstreamTokenTestCase): with self.assertRaises(Exception): diamond.transfer_from( - accounts[1].address, accounts[2].address, 501, {"from": accounts[2]}, + accounts[1].address, + accounts[2].address, + 501, + {"from": accounts[2]}, ) final_sender_balance = diamond.balance_of(accounts[1].address)