def test_collecting_token_reward(click_runner, surrogate_staker, mock_staking_agent, mocker): mock_mintable_periods = mocker.spy(Staker, 'mintable_periods') # Collect some reward reward = NU(1, 'NU') staked = NU(100, 'NU') mock_staking_agent.calculate_staking_reward.return_value = reward.to_nunits( ) mock_staking_agent.non_withdrawable_stake.return_value = staked.to_nunits() collection_args = ('collect-reward', '--no-policy-fee', '--staking-reward', '--provider', MOCK_PROVIDER_URI, '--network', TEMPORARY_DOMAIN, '--staking-address', surrogate_staker.checksum_address) user_input = INSECURE_DEVELOPMENT_PASSWORD result = click_runner.invoke(stake, collection_args, input=user_input, catch_exceptions=False) assert result.exit_code == 0 assert COLLECTING_TOKEN_REWARD.format( reward_amount=reward) in result.output mock_staking_agent.calculate_staking_reward.assert_called_once_with( staker_address=surrogate_staker.checksum_address) mock_staking_agent.collect_staking_reward.assert_called_once_with( staker_address=surrogate_staker.checksum_address) mock_staking_agent.non_withdrawable_stake.assert_called_once_with( staker_address=surrogate_staker.checksum_address) mock_mintable_periods.assert_not_called() mock_staking_agent.assert_only_transactions( [mock_staking_agent.collect_staking_reward])
def collect_reward(general_config, transacting_staker_options, config_file, staking_reward, policy_fee, withdraw_address, force): """Withdraw staking reward.""" # Setup emitter = setup_emitter(general_config) STAKEHOLDER = transacting_staker_options.create_character( emitter, config_file) blockchain = transacting_staker_options.get_blockchain() if not staking_reward and not policy_fee: raise click.BadArgumentUsage( f"Either --staking-reward or --policy-fee must be True to collect rewards." ) client_account, staking_address = select_client_account_for_staking( emitter=emitter, stakeholder=STAKEHOLDER, staking_address=transacting_staker_options.staker_options. staking_address, individual_allocation=STAKEHOLDER.individual_allocation, force=force) password = transacting_staker_options.get_password(blockchain, client_account) STAKEHOLDER.assimilate(checksum_address=client_account, password=password) if staking_reward: # Note: Sending staking / inflation rewards to another account is not allowed. reward_amount = NU.from_nunits(STAKEHOLDER.calculate_staking_reward()) emitter.echo(message=COLLECTING_TOKEN_REWARD.format( reward_amount=reward_amount)) staking_receipt = STAKEHOLDER.collect_staking_reward() paint_receipt_summary( receipt=staking_receipt, chain_name=STAKEHOLDER.wallet.blockchain.client.chain_name, emitter=emitter) if policy_fee: fee_amount = Web3.fromWei(STAKEHOLDER.calculate_policy_fee(), 'ether') emitter.echo(message=COLLECTING_ETH_REWARD.format( reward_amount=fee_amount)) policy_receipt = STAKEHOLDER.collect_policy_fee( collector_address=withdraw_address) paint_receipt_summary( receipt=policy_receipt, chain_name=STAKEHOLDER.wallet.blockchain.client.chain_name, emitter=emitter)
def test_collecting_whole_reward_with_warning(click_runner, surrogate_staker, mock_staking_agent, mocker): mock_mintable_periods = mocker.spy(Staker, 'mintable_periods') # Collect last portion of NU with warning about periods to mint reward = NU(1, 'NU') mock_staking_agent.calculate_staking_reward.return_value = reward.to_nunits( ) mock_staking_agent.non_withdrawable_stake.return_value = 0 mock_staking_agent.get_current_period.return_value = 10 mock_staking_agent.get_current_committed_period.return_value = 8 mock_staking_agent.get_next_committed_period.return_value = 9 collection_args = ('collect-reward', '--no-policy-fee', '--staking-reward', '--provider', MOCK_PROVIDER_URI, '--network', TEMPORARY_DOMAIN, '--staking-address', surrogate_staker.checksum_address) user_input = '\n'.join((INSECURE_DEVELOPMENT_PASSWORD, YES)) result = click_runner.invoke(stake, collection_args, input=user_input, catch_exceptions=False) assert result.exit_code == 0 assert COLLECTING_TOKEN_REWARD.format( reward_amount=reward) in result.output assert CONFIRM_COLLECTING_WITHOUT_MINTING in result.output mock_staking_agent.calculate_staking_reward.assert_called_once_with( staker_address=surrogate_staker.checksum_address) mock_staking_agent.collect_staking_reward.assert_called_once_with( staker_address=surrogate_staker.checksum_address) mock_staking_agent.non_withdrawable_stake.assert_called_once_with( staker_address=surrogate_staker.checksum_address) mock_staking_agent.get_current_period.assert_called() mock_staking_agent.get_current_committed_period.assert_called_once_with( staker_address=surrogate_staker.checksum_address) mock_staking_agent.get_next_committed_period.assert_called_once_with( staker_address=surrogate_staker.checksum_address) mock_mintable_periods.assert_called_once() mock_staking_agent.assert_only_transactions( [mock_staking_agent.collect_staking_reward])
def collect_reward(general_config, transacting_staker_options, config_file, staking_reward, policy_fee, withdraw_address, force): """Withdraw staking reward.""" # Setup emitter = setup_emitter(general_config) STAKEHOLDER = transacting_staker_options.create_character( emitter, config_file) blockchain = transacting_staker_options.get_blockchain() if not staking_reward and not policy_fee: raise click.BadArgumentUsage( f"Either --staking-reward or --policy-fee must be True to collect rewards." ) client_account, staking_address = select_client_account_for_staking( emitter=emitter, stakeholder=STAKEHOLDER, staking_address=transacting_staker_options.staker_options. staking_address, individual_allocation=STAKEHOLDER.individual_allocation, force=force) password = None if staking_reward: # Note: Sending staking / inflation rewards to another account is not allowed. reward_amount = NU.from_nunits(STAKEHOLDER.calculate_staking_reward()) if reward_amount == 0: emitter.echo(NO_TOKENS_TO_WITHDRAW, color='red') raise click.Abort emitter.echo(message=COLLECTING_TOKEN_REWARD.format( reward_amount=reward_amount)) withdrawing_last_portion = STAKEHOLDER.non_withdrawable_stake() == 0 if not force and withdrawing_last_portion and STAKEHOLDER.mintable_periods( ) > 0: click.confirm(CONFIRM_COLLECTING_WITHOUT_MINTING, abort=True) # Authenticate and Execute password = transacting_staker_options.get_password( blockchain, client_account) STAKEHOLDER.assimilate(password=password) staking_receipt = STAKEHOLDER.collect_staking_reward() paint_receipt_summary( receipt=staking_receipt, chain_name=STAKEHOLDER.wallet.blockchain.client.chain_name, emitter=emitter) if policy_fee: fee_amount = Web3.fromWei(STAKEHOLDER.calculate_policy_fee(), 'ether') if fee_amount == 0: emitter.echo(NO_FEE_TO_WITHDRAW, color='red') raise click.Abort emitter.echo(message=COLLECTING_ETH_FEE.format(fee_amount=fee_amount)) if password is None: # Authenticate and Execute password = transacting_staker_options.get_password( blockchain, client_account) STAKEHOLDER.assimilate(password=password) policy_receipt = STAKEHOLDER.collect_policy_fee( collector_address=withdraw_address) paint_receipt_summary( receipt=policy_receipt, chain_name=STAKEHOLDER.wallet.blockchain.client.chain_name, emitter=emitter)