コード例 #1
0
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])
コード例 #2
0
ファイル: stake.py プロジェクト: kkc90/nucypher
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)
コード例 #3
0
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])
コード例 #4
0
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)