diff --git a/contracts/terminus/TerminusFacet.sol b/contracts/terminus/TerminusFacet.sol index 9c1247c..b0c49c5 100644 --- a/contracts/terminus/TerminusFacet.sol +++ b/contracts/terminus/TerminusFacet.sol @@ -203,17 +203,23 @@ contract TerminusFacet is ERC1155WithTerminusStorage { LibTerminus.enforceIsController(); LibTerminus.TerminusStorage storage ts = LibTerminus.terminusStorage(); uint256 requiredPayment = ts.poolBasePrice; - IERC20 paymentTokenContract = _paymentTokenContract(); - require( - paymentTokenContract.allowance(_msgSender(), address(this)) >= - requiredPayment, - "TerminusFacet: createSimplePool -- Insufficient allowance on payment token" - ); - paymentTokenContract.transferFrom( - msg.sender, - address(this), - requiredPayment - ); + + if (requiredPayment > 0) { + IERC20 paymentTokenContract = _paymentTokenContract(); + require( + paymentTokenContract.allowance(_msgSender(), address(this)) >= + requiredPayment, + "TerminusFacet: createSimplePool -- Insufficient allowance on payment token" + ); + require( + paymentTokenContract.transferFrom( + msg.sender, + address(this), + requiredPayment + ), + "TerminusFacet: createSimplePool -- Transfer of payment token was unsuccessful" + ); + } return LibTerminus.createSimplePool(_capacity); } @@ -224,19 +230,23 @@ contract TerminusFacet is ERC1155WithTerminusStorage { ) external returns (uint256) { LibTerminus.enforceIsController(); LibTerminus.TerminusStorage storage ts = LibTerminus.terminusStorage(); - // TODO(zomglings): Implement requiredPayment update based on pool features. uint256 requiredPayment = ts.poolBasePrice; - IERC20 paymentTokenContract = _paymentTokenContract(); - require( - paymentTokenContract.allowance(_msgSender(), address(this)) >= - requiredPayment, - "TerminusFacet: createPoolV1 -- Insufficient allowance on payment token" - ); - paymentTokenContract.transferFrom( - msg.sender, - address(this), - requiredPayment - ); + if (requiredPayment > 0) { + IERC20 paymentTokenContract = _paymentTokenContract(); + require( + paymentTokenContract.allowance(_msgSender(), address(this)) >= + requiredPayment, + "TerminusFacet: createPoolV1 -- Insufficient allowance on payment token" + ); + require( + paymentTokenContract.transferFrom( + msg.sender, + address(this), + requiredPayment + ), + "TerminusFacet: createPoolV1 -- Transfer of payment token was unsuccessful" + ); + } uint256 poolID = LibTerminus.createSimplePool(_capacity); if (!_transferable) { ts.poolNotTransferable[poolID] = true; @@ -247,6 +257,42 @@ contract TerminusFacet is ERC1155WithTerminusStorage { return poolID; } + function createPoolV2( + uint256 _capacity, + bool _transferable, + bool _burnable, + string memory poolURI + ) external returns (uint256) { + LibTerminus.enforceIsController(); + LibTerminus.TerminusStorage storage ts = LibTerminus.terminusStorage(); + uint256 requiredPayment = ts.poolBasePrice; + if (requiredPayment > 0) { + IERC20 paymentTokenContract = _paymentTokenContract(); + require( + paymentTokenContract.allowance(_msgSender(), address(this)) >= + requiredPayment, + "TerminusFacet: createPoolV2 -- Insufficient allowance on payment token" + ); + require( + paymentTokenContract.transferFrom( + msg.sender, + address(this), + requiredPayment + ), + "TerminusFacet: createPoolV2 -- Transfer of payment token was unsuccessful" + ); + } + uint256 poolID = LibTerminus.createSimplePool(_capacity); + if (!_transferable) { + ts.poolNotTransferable[poolID] = true; + } + if (_burnable) { + ts.poolBurnable[poolID] = true; + } + ts.poolURI[poolID] = poolURI; + return poolID; + } + function mint( address to, uint256 poolID, diff --git a/dao/TerminusFacet.py b/dao/TerminusFacet.py index ba36f2a..9ba0d84 100644 --- a/dao/TerminusFacet.py +++ b/dao/TerminusFacet.py @@ -1,5 +1,5 @@ # Code generated by moonworm : https://github.com/bugout-dev/moonworm -# Moonworm version : 0.2.4 +# Moonworm version : 0.6.0 import argparse import json @@ -140,6 +140,19 @@ class TerminusFacet: _capacity, _transferable, _burnable, transaction_config ) + def create_pool_v2( + self, + _capacity: int, + _transferable: bool, + _burnable: bool, + pool_uri: str, + transaction_config, + ) -> Any: + self.assert_contract_is_instantiated() + return self.contract.createPoolV2( + _capacity, _transferable, _burnable, pool_uri, transaction_config + ) + def create_simple_pool(self, _capacity: int, transaction_config) -> Any: self.assert_contract_is_instantiated() return self.contract.createSimplePool(_capacity, transaction_config) @@ -514,6 +527,22 @@ def handle_create_pool_v1(args: argparse.Namespace) -> None: print(result.info()) +def handle_create_pool_v2(args: argparse.Namespace) -> None: + network.connect(args.network) + contract = TerminusFacet(args.address) + transaction_config = get_transaction_config(args) + result = contract.create_pool_v2( + _capacity=args.capacity_arg, + _transferable=args.transferable_arg, + _burnable=args.burnable_arg, + pool_uri=args.pool_uri, + transaction_config=transaction_config, + ) + print(result) + if args.verbose: + print(result.info()) + + def handle_create_simple_pool(args: argparse.Namespace) -> None: network.connect(args.network) contract = TerminusFacet(args.address) @@ -928,6 +957,25 @@ def generate_cli() -> argparse.ArgumentParser: ) create_pool_v1_parser.set_defaults(func=handle_create_pool_v1) + create_pool_v2_parser = subcommands.add_parser("create-pool-v2") + add_default_arguments(create_pool_v2_parser, True) + create_pool_v2_parser.add_argument( + "--capacity-arg", required=True, help="Type: uint256", type=int + ) + create_pool_v2_parser.add_argument( + "--transferable-arg", + required=True, + help="Type: bool", + type=boolean_argument_type, + ) + create_pool_v2_parser.add_argument( + "--burnable-arg", required=True, help="Type: bool", type=boolean_argument_type + ) + create_pool_v2_parser.add_argument( + "--pool-uri", required=True, help="Type: string", type=str + ) + create_pool_v2_parser.set_defaults(func=handle_create_pool_v2) + create_simple_pool_parser = subcommands.add_parser("create-simple-pool") add_default_arguments(create_simple_pool_parser, True) create_simple_pool_parser.add_argument( diff --git a/dao/test_terminus.py b/dao/test_terminus.py index bd12432..b420cc5 100644 --- a/dao/test_terminus.py +++ b/dao/test_terminus.py @@ -1093,7 +1093,7 @@ class TestPoolOperations(TerminusTestCase): self.assertEqual(user_balance_6, user_balance_5) -class TestCreatePoolV1(TestPoolOperations): +class TestPoolCreation(TestPoolOperations): def setUp(self): self.diamond_terminus.create_pool_v1(10, True, False, {"from": accounts[1]}) @@ -1130,7 +1130,14 @@ class TestCreatePoolV1(TestPoolOperations): self.assertEqual(final_receiver_balance, initial_receiver_balance) def test_pool_state_view_methods(self): - self.diamond_terminus.create_pool_v1(10, False, False, {"from": accounts[1]}) + nontransferable_nonburnable_pool_uri = "https://example.com/ff.json" + self.diamond_terminus.create_pool_v2( + 10, + False, + False, + nontransferable_nonburnable_pool_uri, + {"from": accounts[1]}, + ) nontransferable_nonburnable_pool_id = self.diamond_terminus.total_pools() self.assertFalse( self.diamond_terminus.pool_is_transferable( @@ -1140,8 +1147,15 @@ class TestCreatePoolV1(TestPoolOperations): self.assertFalse( self.diamond_terminus.pool_is_burnable(nontransferable_nonburnable_pool_id) ) + self.assertEqual( + self.diamond_terminus.uri(nontransferable_nonburnable_pool_id), + nontransferable_nonburnable_pool_uri, + ) - self.diamond_terminus.create_pool_v1(10, True, False, {"from": accounts[1]}) + transferable_nonburnable_pool_uri = "https://example.com/tf.json" + self.diamond_terminus.create_pool_v2( + 10, True, False, transferable_nonburnable_pool_uri, {"from": accounts[1]} + ) transferable_nonburnable_pool_id = self.diamond_terminus.total_pools() self.assertTrue( self.diamond_terminus.pool_is_transferable(transferable_nonburnable_pool_id) @@ -1149,8 +1163,15 @@ class TestCreatePoolV1(TestPoolOperations): self.assertFalse( self.diamond_terminus.pool_is_burnable(transferable_nonburnable_pool_id) ) + self.assertEqual( + self.diamond_terminus.uri(transferable_nonburnable_pool_id), + transferable_nonburnable_pool_uri, + ) - self.diamond_terminus.create_pool_v1(10, True, True, {"from": accounts[1]}) + transferable_burnable_pool_uri = "https://example.com/tt.json" + self.diamond_terminus.create_pool_v2( + 10, True, True, transferable_burnable_pool_uri, {"from": accounts[1]} + ) transferable_burnable_pool_id = self.diamond_terminus.total_pools() self.assertTrue( self.diamond_terminus.pool_is_transferable(transferable_burnable_pool_id) @@ -1158,8 +1179,15 @@ class TestCreatePoolV1(TestPoolOperations): self.assertTrue( self.diamond_terminus.pool_is_burnable(transferable_burnable_pool_id) ) + self.assertEqual( + self.diamond_terminus.uri(transferable_burnable_pool_id), + transferable_burnable_pool_uri, + ) - self.diamond_terminus.create_pool_v1(10, False, True, {"from": accounts[1]}) + nontransferable_burnable_pool_uri = "https://example.com/ft.json" + self.diamond_terminus.create_pool_v2( + 10, False, True, nontransferable_burnable_pool_uri, {"from": accounts[1]} + ) nontransferable_burnable_pool_id = self.diamond_terminus.total_pools() self.assertFalse( self.diamond_terminus.pool_is_transferable(nontransferable_burnable_pool_id) @@ -1167,6 +1195,10 @@ class TestCreatePoolV1(TestPoolOperations): self.assertTrue( self.diamond_terminus.pool_is_burnable(nontransferable_burnable_pool_id) ) + self.assertEqual( + self.diamond_terminus.uri(nontransferable_burnable_pool_id), + nontransferable_burnable_pool_uri, + ) def test_pool_state_setters(self): self.diamond_terminus.create_pool_v1(10, False, False, {"from": accounts[1]}) diff --git a/setup.py b/setup.py index 0f2de67..abad25d 100644 --- a/setup.py +++ b/setup.py @@ -6,13 +6,13 @@ with open("README.md") as ifp: setup( name="moonstream-dao", - version="0.0.7", + version="0.0.8", packages=find_packages(), install_requires=["eth-brownie", "tqdm"], extras_require={ "dev": [ "black", - "moonworm >= 0.1.9", + "moonworm >= 0.6.0", ], "distribute": ["setuptools", "twine", "wheel"], },