Skip to content
This repository was archived by the owner on Nov 15, 2021. It is now read-only.

[refactor-prompt] add token register #775

Merged
merged 1 commit into from
Dec 25, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 48 additions & 36 deletions neo/Prompt/Commands/Tokens.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ def __init__(self):
self.register_sub_command(CommandTokenApprove())
self.register_sub_command(CommandTokenAllowance())
self.register_sub_command(CommandTokenMint())
self.register_sub_command(CommandTokenRegister())

def command_desc(self):
return CommandDesc('token', 'various token operations')
Expand Down Expand Up @@ -457,6 +458,53 @@ def command_desc(self):
return CommandDesc('mint', 'mint tokens from a contract', [p1, p2, p3, p4, p5])


class CommandTokenRegister(CommandBase):
def __init__(self):
super().__init__()

def execute(self, arguments):
wallet = PromptData.Wallet

if len(arguments) < 2:
print("Please specify the required parameters")
return False

token_str = arguments[0]
try:
token = PromptUtils.get_token(wallet, token_str)
except ValueError as e:
print(str(e))
return False

register_addr = arguments[1:]
addr_list = []
for addr in register_addr:
if isValidPublicAddress(addr):
addr_list.append(addr)
else:
print(f"{addr} is not a valid address")
return False

tx, fee, results = token.CrowdsaleRegister(wallet, addr_list)

if tx and results:
if results[0].GetBigInteger() > 0:
print("\n-----------------------------------------------------------")
print("[%s] Will register addresses for crowdsale: %s " % (token.symbol, register_addr))
print("Fee: %s " % (fee.value / Fixed8.D))
print("-------------------------------------------------------------\n")

return InvokeContract(wallet, tx, fee)

print("Could not register address(es)")
return False

def command_desc(self):
p1 = ParameterDesc('symbol', 'token symbol')
p2 = ParameterDesc('addresses', 'space seperated list of addresses')
return CommandDesc('register', 'register for a crowdsale', [p1, p2])


def _validate_nep5_args(wallet, token_str, from_addr, to_addr, amount):
"""
A helper function to validate common arguments used in NEP-5 functions
Expand Down Expand Up @@ -647,42 +695,6 @@ def token_mint(wallet, args, prompt_passwd=True):
return False


def token_crowdsale_register(wallet, args, prompt_passwd=True):
token = PromptUtils.get_asset_id(wallet, args[0])
if not isinstance(token, NEP5Token):
print("The given symbol does not represent a loaded NEP5 token")
return False

args, from_addr = PromptUtils.get_from_addr(args)

if len(args) < 2:
print("Specify addr to register for crowdsale")
return False

register_addr = args[1:]

tx, fee, results = token.CrowdsaleRegister(wallet, register_addr)

if tx is not None and results is not None and len(results) > 0:
if results[0].GetBigInteger() > 0:
print("\n-----------------------------------------------------------")
print("[%s] Will register addresses for crowdsale: %s " % (token.symbol, register_addr))
print("Fee: %s " % (fee.value / Fixed8.D))
print("-------------------------------------------------------------\n")

if prompt_passwd:
passwd = prompt("[Password]> ", is_password=True)

if not wallet.ValidatePassword(passwd):
print("incorrect password")
return False

return InvokeContract(wallet, tx, fee, from_addr)

print("Could not register address(es)")
return False


def do_token_transfer(token, wallet, from_address, to_address, amount, prompt_passwd=True, tx_attributes=None):
if not tx_attributes:
tx_attributes = []
Expand Down
98 changes: 47 additions & 51 deletions neo/Prompt/Commands/tests/test_token_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from neo.Implementations.Wallets.peewee.UserWallet import UserWallet
from neo.Core.Blockchain import Blockchain
from neo.Prompt.Commands.Wallet import ImportToken, CommandWallet
from neo.Prompt.Commands.Tokens import token_get_allowance, token_send, token_history, token_mint, token_crowdsale_register, amount_from_string
from neo.Prompt.Commands.Tokens import token_get_allowance, token_send, token_history, token_mint, amount_from_string
import shutil
from neocore.IO.BinaryWriter import BinaryWriter
from neo.IO.MemoryStream import StreamManager
Expand Down Expand Up @@ -295,56 +295,6 @@ def test_token_mint_bad_password(self):

self.assertFalse(mint)

def test_token_register_good(self):
with patch('neo.Prompt.Commands.Tokens.prompt', side_effect=[UserWalletTestCase.wallet_1_pass()]):
wallet = self.GetWallet1(recreate=True)
token = self.get_token(wallet)

args = [token.symbol, self.wallet_3_addr, self.watch_addr_str, "--from-addr=AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc3"]
register = token_crowdsale_register(wallet, args, prompt_passwd=True)

self.assertTrue(register)
res = register.ToJson()
self.assertEqual(res['vout'][0]['address'], "AJQ6FoaSXDFzA6wLnyZ1nFN7SGSN2oNTc3")
self.assertEqual(res['net_fee'], "0.0001")

def test_token_register_bad_args(self): # too few args
wallet = self.GetWallet1(recreate=True)
token = self.get_token(wallet)

args = [token.symbol]
register = token_crowdsale_register(wallet, args, prompt_passwd=False)

self.assertFalse(register)

def test_token_register_bad_token(self):
wallet = self.GetWallet1(recreate=True)

args = ["Blah"]
register = token_crowdsale_register(wallet, args, prompt_passwd=False)

self.assertFalse(register)

def test_token_register_no_tx(self):
with patch('neo.Wallets.NEP5Token.NEP5Token.CrowdsaleRegister', return_value=(None, 0, None)):
wallet = self.GetWallet1(recreate=True)
token = self.get_token(wallet)

args = [token.symbol, self.wallet_3_addr]
register = token_crowdsale_register(wallet, args, prompt_passwd=False)

self.assertFalse(register)

def test_token_register_bad_password(self):
with patch('neo.Prompt.Commands.Tokens.prompt', side_effect=["blah"]):
wallet = self.GetWallet1(recreate=True)
token = self.get_token(wallet)

args = [token.symbol, self.wallet_3_addr]
register = token_crowdsale_register(wallet, args, prompt_passwd=True)

self.assertFalse(register)

def test_token_history_correct(self):
# test Send event history
wallet = self.GetWallet1(recreate=True)
Expand Down Expand Up @@ -761,6 +711,52 @@ def test_token_mint(self):
self.assertTrue(res)
self.assertIn("[NXT4] Will mint tokens to address", mock_print.getvalue())

def test_token_register(self):
with self.OpenWallet1():
# test token delete with no parameter
with patch('sys.stdout', new=StringIO()) as mock_print:
args = ['token', 'register']
res = CommandWallet().execute(args)
self.assertFalse(res)
self.assertIn("specify the required parameter", mock_print.getvalue())

# test token delete with insufficient parameters
with patch('sys.stdout', new=StringIO()) as mock_print:
args = ['token', 'register', 'arg1']
res = CommandWallet().execute(args)
self.assertFalse(res)
self.assertIn("specify the required parameter", mock_print.getvalue())

# test with invalid token argument
with patch('sys.stdout', new=StringIO()) as mock_print:
args = ['token', 'register', 'invalid_token_name', 'arg2']
res = CommandWallet().execute(args)
self.assertFalse(res)
self.assertIn("does not represent a known NEP5 token", mock_print.getvalue())

# test with invalid address
with patch('sys.stdout', new=StringIO()) as mock_print:
args = ['token', 'register', 'NXT4', 'bad_addr']
res = CommandWallet().execute(args)
self.assertFalse(res)
self.assertIn("is not a valid address", mock_print.getvalue())

# test with some exception in NEP5Token.CrowdsaleRegister
with patch('neo.Wallets.NEP5Token.NEP5Token.CrowdsaleRegister') as mocked_register:
with patch('sys.stdout', new=StringIO()) as mock_print:
mocked_register.return_value = (object(), 0, []) # tx, fee, results
args = ['token', 'register', 'NXT4', 'AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y']
res = CommandWallet().execute(args)
self.assertFalse(res)
self.assertIn("Could not register address(es)", mock_print.getvalue())

# test with valid address
with patch('sys.stdout', new=StringIO()) as mock_print:
args = ['token', 'register', 'NXT4', 'AK2nJJpJr6o664CWJKi1QRXjqeic2zRp8y']
res = CommandWallet().execute(args)
self.assertTrue(res)
self.assertIn("[NXT4] Will register addresses", mock_print.getvalue())

# utility function
def Approve_Allowance(self):
wallet = self.GetWallet1(recreate=True)
Expand Down
2 changes: 1 addition & 1 deletion neo/Wallets/NEP5Token.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ def CrowdsaleRegister(self, wallet, register_addresses, from_addr=None):

Args:
wallet (neo.Wallets.Wallet): a wallet instance.
register_addresses (str): public address of the account that wants to register for the sale.
register_addresses (list): list of public addresses to register for the sale.

Returns:
tuple:
Expand Down