From 96829f26bd6962971c25dfc5b81c52927dc91701 Mon Sep 17 00:00:00 2001 From: Neeraj Kashyap Date: Sun, 19 Dec 2021 04:47:24 -0800 Subject: [PATCH] Added payment token functionality to TerminusFacet --- contracts/terminus/LibTerminus.sol | 4 +- contracts/terminus/TerminusFacet.sol | 39 +++++++++++++++++- dao/TerminusFacet.py | 59 ++++++++++++++++++++++++---- setup.py | 2 +- 4 files changed, 92 insertions(+), 12 deletions(-) diff --git a/contracts/terminus/LibTerminus.sol b/contracts/terminus/LibTerminus.sol index f468a4d..7862522 100644 --- a/contracts/terminus/LibTerminus.sol +++ b/contracts/terminus/LibTerminus.sol @@ -23,6 +23,8 @@ library LibTerminus { address controller; bool isTerminusActive; uint256 currentPoolID; + address paymentToken; + uint256 poolBasePrice; // Terminus pools mapping(uint256 => address) poolController; mapping(uint256 => bool) poolActive; @@ -79,7 +81,7 @@ library LibTerminus { emit PoolControlTransferred(poolID, previousController, newController); } - function createPool() internal returns (uint256) { + function createSimplePool() internal returns (uint256) { TerminusStorage storage ts = terminusStorage(); uint256 poolID = ts.currentPoolID + 1; setPoolController(poolID, msg.sender); diff --git a/contracts/terminus/TerminusFacet.sol b/contracts/terminus/TerminusFacet.sol index 3dd01c8..eee9dc8 100644 --- a/contracts/terminus/TerminusFacet.sol +++ b/contracts/terminus/TerminusFacet.sol @@ -9,6 +9,7 @@ pragma solidity ^0.8.0; +import "@openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; import "./ERC1155WithTerminusStorage.sol"; import "./LibTerminus.sol"; import "../diamond/libraries/LibDiamond.sol"; @@ -20,6 +21,27 @@ contract TerminusFacet is ERC1155WithTerminusStorage { return LibTerminus.terminusStorage().controller; } + function paymentToken() external view returns (address) { + return LibTerminus.terminusStorage().paymentToken; + } + + function setPaymentToken(address newPaymentToken) external { + LibTerminus.enforceIsController(); + LibTerminus.TerminusStorage storage ts = LibTerminus.terminusStorage(); + ts.paymentToken = newPaymentToken; + } + + function _paymentTokenContract() internal view returns (IERC20) { + address paymentTokenAddress = LibTerminus + .terminusStorage() + .paymentToken; + require( + paymentTokenAddress != address(0), + "TerminusFacet: Payment token has not been set" + ); + return IERC20(paymentTokenAddress); + } + function setURI(uint256 poolID, string memory poolURI) external { LibTerminus.enforcePoolIsController(poolID, _msgSender()); LibTerminus.TerminusStorage storage ts = LibTerminus.terminusStorage(); @@ -30,8 +52,21 @@ contract TerminusFacet is ERC1155WithTerminusStorage { return LibTerminus.terminusStorage().currentPoolID; } - function createPool() external returns (uint256) { - return LibTerminus.createPool(); + function createSimplePool() external returns (uint256) { + 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 + ); + return LibTerminus.createSimplePool(); } function terminusPoolController(uint256 poolID) diff --git a/dao/TerminusFacet.py b/dao/TerminusFacet.py index 0c0e94b..8eb56fa 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.1.8 +# Moonworm version : 0.1.9 import argparse import json @@ -98,9 +98,9 @@ class TerminusFacet: self.assert_contract_is_instantiated() return self.contract.balanceOfBatch.call(accounts, ids) - def create_pool(self, transaction_config) -> Any: + def create_simple_pool(self, transaction_config) -> Any: self.assert_contract_is_instantiated() - return self.contract.createPool(transaction_config) + return self.contract.createSimplePool(transaction_config) def is_approved_for_all( self, account: ChecksumAddress, operator: ChecksumAddress @@ -130,6 +130,10 @@ class TerminusFacet: self.assert_contract_is_instantiated() return self.contract.mintBatch(to, pool_i_ds, amounts, data, transaction_config) + def payment_token(self) -> Any: + self.assert_contract_is_instantiated() + return self.contract.paymentToken.call() + def safe_batch_transfer_from( self, from_: ChecksumAddress, @@ -164,6 +168,12 @@ class TerminusFacet: self.assert_contract_is_instantiated() return self.contract.setApprovalForAll(operator, approved, transaction_config) + def set_payment_token( + self, new_payment_token: ChecksumAddress, transaction_config + ) -> Any: + self.assert_contract_is_instantiated() + return self.contract.setPaymentToken(new_payment_token, transaction_config) + def set_uri(self, pool_id: int, pool_uri: str, transaction_config) -> Any: self.assert_contract_is_instantiated() return self.contract.setURI(pool_id, pool_uri, transaction_config) @@ -196,6 +206,8 @@ def get_transaction_config(args: argparse.Namespace) -> Dict[str, Any]: transaction_config["gas_price"] = args.gas_price if args.confirmations is not None: transaction_config["required_confs"] = args.confirmations + if args.nonce is not None: + transaction_config["nonce"] = args.nonce return transaction_config @@ -225,6 +237,9 @@ def add_default_arguments(parser: argparse.ArgumentParser, transact: bool) -> No default=None, help="Number of confirmations to await before considering a transaction completed", ) + parser.add_argument( + "--nonce", type=int, default=None, help="Nonce for the transaction (optional)" + ) def handle_deploy(args: argparse.Namespace) -> None: @@ -249,11 +264,11 @@ def handle_balance_of_batch(args: argparse.Namespace) -> None: print(result) -def handle_create_pool(args: argparse.Namespace) -> None: +def handle_create_simple_pool(args: argparse.Namespace) -> None: network.connect(args.network) contract = TerminusFacet(args.address) transaction_config = get_transaction_config(args) - result = contract.create_pool(transaction_config=transaction_config) + result = contract.create_simple_pool(transaction_config=transaction_config) print(result) @@ -292,6 +307,13 @@ def handle_mint_batch(args: argparse.Namespace) -> None: print(result) +def handle_payment_token(args: argparse.Namespace) -> None: + network.connect(args.network) + contract = TerminusFacet(args.address) + result = contract.payment_token() + print(result) + + def handle_safe_batch_transfer_from(args: argparse.Namespace) -> None: network.connect(args.network) contract = TerminusFacet(args.address) @@ -334,6 +356,16 @@ def handle_set_approval_for_all(args: argparse.Namespace) -> None: print(result) +def handle_set_payment_token(args: argparse.Namespace) -> None: + network.connect(args.network) + contract = TerminusFacet(args.address) + transaction_config = get_transaction_config(args) + result = contract.set_payment_token( + new_payment_token=args.new_payment_token, transaction_config=transaction_config + ) + print(result) + + def handle_set_uri(args: argparse.Namespace) -> None: network.connect(args.network) contract = TerminusFacet(args.address) @@ -408,9 +440,9 @@ def generate_cli() -> argparse.ArgumentParser: ) balance_of_batch_parser.set_defaults(func=handle_balance_of_batch) - create_pool_parser = subcommands.add_parser("create-pool") - add_default_arguments(create_pool_parser, True) - create_pool_parser.set_defaults(func=handle_create_pool) + create_simple_pool_parser = subcommands.add_parser("create-simple-pool") + add_default_arguments(create_simple_pool_parser, True) + create_simple_pool_parser.set_defaults(func=handle_create_simple_pool) is_approved_for_all_parser = subcommands.add_parser("is-approved-for-all") add_default_arguments(is_approved_for_all_parser, False) @@ -446,6 +478,10 @@ def generate_cli() -> argparse.ArgumentParser: ) mint_batch_parser.set_defaults(func=handle_mint_batch) + payment_token_parser = subcommands.add_parser("payment-token") + add_default_arguments(payment_token_parser, False) + payment_token_parser.set_defaults(func=handle_payment_token) + safe_batch_transfer_from_parser = subcommands.add_parser("safe-batch-transfer-from") add_default_arguments(safe_batch_transfer_from_parser, True) safe_batch_transfer_from_parser.add_argument( @@ -492,6 +528,13 @@ def generate_cli() -> argparse.ArgumentParser: ) set_approval_for_all_parser.set_defaults(func=handle_set_approval_for_all) + set_payment_token_parser = subcommands.add_parser("set-payment-token") + add_default_arguments(set_payment_token_parser, True) + set_payment_token_parser.add_argument( + "--new-payment-token", required=True, help="Type: address" + ) + set_payment_token_parser.set_defaults(func=handle_set_payment_token) + set_uri_parser = subcommands.add_parser("set-uri") add_default_arguments(set_uri_parser, True) set_uri_parser.add_argument( diff --git a/setup.py b/setup.py index 5214b31..66e1c61 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ setup( extras_require={ "dev": [ "black", - "moonworm", + "moonworm >= 0.1.9", ], "distribute": ["setuptools", "twine", "wheel"], },