def test_success_non_activated(state):
    transfer = get_valid_transfer(state)
    # un-activate so validator can transfer
    state.validator_registry[
        transfer.sender].activation_eligibility_epoch = spec.FAR_FUTURE_EPOCH

    pre_state, post_state = run_transfer_processing(state, transfer)

    return pre_state, transfer, post_state
def test_incorrect_slot(state):
    transfer = get_valid_transfer(state, slot=state.slot + 1)
    # un-activate so validator can transfer
    state.validator_registry[
        transfer.sender].activation_epoch = spec.FAR_FUTURE_EPOCH

    pre_state, post_state = run_transfer_processing(state, transfer, False)

    return pre_state, transfer, post_state
def test_success_withdrawable(state):
    next_epoch(state)

    transfer = get_valid_transfer(state)

    # withdrawable_epoch in past so can transfer
    state.validator_registry[
        transfer.sender].withdrawable_epoch = get_current_epoch(state) - 1

    pre_state, post_state = run_transfer_processing(state, transfer)

    return pre_state, transfer, post_state
def test_invalid_pubkey(state):
    transfer = get_valid_transfer(state)
    state.validator_registry[
        transfer.sender].withdrawal_credentials = spec.ZERO_HASH

    # un-activate so validator can transfer
    state.validator_registry[
        transfer.sender].activation_epoch = spec.FAR_FUTURE_EPOCH

    pre_state, post_state = run_transfer_processing(state, transfer, False)

    return pre_state, transfer, post_state
def test_active_but_transfer_past_effective_balance(state):
    sender_index = get_active_validator_indices(state,
                                                get_current_epoch(state))[-1]
    amount = spec.MAX_EFFECTIVE_BALANCE // 32
    state.balances[sender_index] = spec.MAX_EFFECTIVE_BALANCE
    transfer = get_valid_transfer(state,
                                  sender_index=sender_index,
                                  amount=amount,
                                  fee=0)

    pre_state, post_state = run_transfer_processing(state, transfer, False)

    return pre_state, transfer, post_state
def test_no_dust(state):
    sender_index = get_active_validator_indices(state,
                                                get_current_epoch(state))[-1]
    balance = state.balances[sender_index]
    transfer = get_valid_transfer(state,
                                  sender_index=sender_index,
                                  amount=balance - spec.MIN_DEPOSIT_AMOUNT + 1,
                                  fee=0)

    # un-activate so validator can transfer
    state.validator_registry[
        transfer.sender].activation_epoch = spec.FAR_FUTURE_EPOCH

    pre_state, post_state = run_transfer_processing(state, transfer, False)

    return pre_state, transfer, post_state
def test_insufficient_balance(state):
    sender_index = get_active_validator_indices(state,
                                                get_current_epoch(state))[-1]
    amount = spec.MAX_EFFECTIVE_BALANCE
    state.balances[sender_index] = spec.MAX_EFFECTIVE_BALANCE
    transfer = get_valid_transfer(state,
                                  sender_index=sender_index,
                                  amount=amount + 1,
                                  fee=0)

    # un-activate so validator can transfer
    state.validator_registry[
        transfer.sender].activation_epoch = spec.FAR_FUTURE_EPOCH

    pre_state, post_state = run_transfer_processing(state, transfer, False)

    return pre_state, transfer, post_state