Approve token allowances with `nucypher-deploy transfer-tokens --approve`

pull/2149/head
David Núñez 2020-07-20 01:50:19 +02:00
parent e83a815e47
commit bd8692d6a4
3 changed files with 42 additions and 12 deletions

View File

@ -50,6 +50,7 @@ from nucypher.cli.literature import (
CONFIRM_NETWORK_ACTIVATION,
CONFIRM_RETARGET,
CONFIRM_SELECTED_ACCOUNT,
CONFIRM_TOKEN_ALLOWANCE,
CONFIRM_TOKEN_TRANSFER,
CONTRACT_DEPLOYMENT_SERIES_BEGIN_ADVISORY,
CONTRACT_IS_NOT_OWNABLE,
@ -529,7 +530,8 @@ def allocations(general_config, actor_options, allocation_infile, gas):
@group_actor_options
@option_target_address
@click.option('--value', help="Amount of tokens to transfer in the smallest denomination", type=click.INT)
def transfer_tokens(general_config, actor_options, target_address, value):
@click.option('--approve', help="Approve token allowance, instead of transfer", is_flag=True, default=False)
def transfer_tokens(general_config, actor_options, target_address, value, approve):
"""Transfer tokens from contract's owner address to another address"""
emitter = general_config.emitter
@ -544,13 +546,23 @@ def transfer_tokens(general_config, actor_options, target_address, value):
stake_value_range = click.FloatRange(min=0, clamp=False)
value = NU.from_tokens(click.prompt(PROMPT_TOKEN_VALUE, type=stake_value_range))
confirmation = CONFIRM_TOKEN_TRANSFER.format(value=value,
deployer_address=deployer_address,
target_address=target_address)
value = NuNits(int(value))
if approve:
confirmation = CONFIRM_TOKEN_ALLOWANCE.format(value=value,
deployer_address=deployer_address,
spender_address=target_address)
else:
confirmation = CONFIRM_TOKEN_TRANSFER.format(value=value,
deployer_address=deployer_address,
target_address=target_address)
click.confirm(confirmation, abort=True)
receipt = token_agent.transfer(amount=NuNits(int(value)),
sender_address=deployer_address,
target_address=target_address)
if approve:
receipt = token_agent.approve_transfer(amount=value,
sender_address=deployer_address,
spender_address=target_address)
else:
receipt = token_agent.transfer(amount=value, sender_address=deployer_address, target_address=target_address)
paint_receipt_summary(emitter=emitter, receipt=receipt)

View File

@ -358,6 +358,8 @@ The staker's fee rate was set to the default value {default} such that it falls
CONTRACT_IS_NOT_OWNABLE = "Contract {contract_name} is not ownable."
CONFIRM_TOKEN_ALLOWANCE = "Approve allowance of {value} from {deployer_address} to {spender_address}?"
CONFIRM_TOKEN_TRANSFER = "Transfer {value} from {deployer_address} to {target_address}?"
PROMPT_TOKEN_VALUE = "Enter value in NU"

View File

@ -128,13 +128,10 @@ def test_deploy_single_contract(click_runner, tempfile_path):
assert result.exit_code == 0
def test_transfer_tokens(click_runner, registry_filepath):
#
# Setup
#
def test_transfer_tokens(click_runner, registry_filepath, get_random_checksum_address, testerchain):
# Let's transfer some NU to a random stranger
recipient_address = to_checksum_address(os.urandom(20))
recipient_address = get_random_checksum_address()
registry = LocalContractRegistry(filepath=registry_filepath)
token_agent = NucypherTokenAgent(registry=registry)
@ -153,6 +150,25 @@ def test_transfer_tokens(click_runner, registry_filepath):
# Check that the NU has arrived to the recipient
assert token_agent.get_balance(address=recipient_address) == 42
# Let's approve an allowance to a random spender
spender_address = get_random_checksum_address()
owner_address = testerchain.client.accounts[0]
assert token_agent.get_allowance(spender=spender_address, owner=owner_address) == 0
command = ['transfer-tokens',
'--target-address', spender_address,
'--value', 42,
'--approve',
'--registry-infile', registry_filepath,
'--provider', TEST_PROVIDER_URI]
user_input = '0\n' + 'Y\n' + 'Y\n'
result = click_runner.invoke(deploy, command, input=user_input, catch_exceptions=False)
assert result.exit_code == 0
# Check that the NU was approved for the spender
assert token_agent.get_allowance(spender=spender_address, owner=owner_address) == 42
def test_upgrade_contracts(click_runner, registry_filepath, testerchain):