Example #1
0
def test_create_post_vs_banner(wallet_3hf: Wallet, post_budget, banner_budget):
    new_budget = copy(post_budget)
    update_budget_time(wallet_3hf, post_budget)
    validate_response(wallet_3hf.create_budget(**post_budget), wallet_3hf.create_budget.__name__)

    update_budget_time(wallet_3hf, banner_budget)
    validate_response(wallet_3hf.create_budget(**banner_budget), wallet_3hf.create_budget.__name__)

    update_budget_balance(wallet_3hf, post_budget)  # update budget params / set budget id
    update_budget_balance(wallet_3hf, banner_budget)  # update budget params / set budget id
    assert post_budget["id"] == banner_budget["id"]  # both = 0
    assert len(wallet_3hf.get_budgets([post_budget['owner']], post_budget['type'])) == 1
    assert len(wallet_3hf.get_budgets([banner_budget['owner']], banner_budget['type'])) == 1

    budgets_summary = wallet_3hf.get_dynamic_global_properties()['advertising']
    assert all(
        Amount(budgets_summary[DGP_BUDGETS[b['type']]][k]) == Amount(b[v])
        for k, v in DGP_PARAMS_MAP.items()
        for b in [banner_budget, post_budget]
    )

    update_budget_time(wallet_3hf, new_budget)
    new_budget.update({'uuid': gen_uid()})
    validate_response(wallet_3hf.create_budget(**new_budget), wallet_3hf.create_budget.__name__)
    assert len(wallet_3hf.get_budgets([post_budget['owner']], post_budget['type'])) == 2
def test_close_before_starttime(wallet_3hf: Wallet, budget, moderator):
    update_budget_time(wallet_3hf, budget, start=30,
                       deadline=60)  # to delay opening time for budget
    budget_balance = Amount(budget["balance"])
    balance_before = wallet_3hf.get_account_scr_balance(budget["owner"])

    wallet_3hf.create_budget(**budget)
    update_budget_balance(wallet_3hf,
                          budget)  # update budget params / set budget id

    balance_after_create = wallet_3hf.get_account_scr_balance(budget["owner"])

    assert balance_before - balance_after_create == budget_balance

    empower_advertising_moderator(wallet_3hf, moderator)
    response = wallet_3hf.close_budget_by_advertising_moderator(
        budget["uuid"], moderator, budget["type"])
    validate_response(
        response, wallet_3hf.close_budget_by_advertising_moderator.__name__)

    balance_after_close = wallet_3hf.get_account_scr_balance(budget["owner"])
    assert balance_after_close == balance_after_create + budget_balance

    check_virt_ops(
        wallet_3hf, response['block_num'], response['block_num'], {
            'close_budget_by_advertising_moderator', 'budget_closing',
            'budget_owner_income'
        })
    assert len(wallet_3hf.get_budgets([budget['owner']], budget['type'])) == 0
    assert len(wallet_3hf.list_buddget_owners(budget_type=budget['type'])) == 0
Example #3
0
def test_update_budget_invalid_meta(wallet_3hf: Wallet, budget, json_metadata):
    update_budget_time(wallet_3hf, budget)
    wallet_3hf.create_budget(**budget)
    update_budget_balance(wallet_3hf, budget)
    response = wallet_3hf.update_budget(budget['uuid'], budget['owner'],
                                        json_metadata, budget['type'])
    validate_error_response(response, wallet_3hf.update_budget.__name__,
                            RE_PARSE_ERROR)
    budget_obj = wallet_3hf.get_budget(budget['uuid'], budget['type'])
    assert budget_obj['json_metadata'] == budget["json_metadata"]
Example #4
0
def test_budget_impact_on_rewards(wallet: Wallet, genesis: Genesis):
    def get_reward_per_block():
        last_confirmed_block = wallet.get_witness(
            DEFAULT_WITNESS)['last_confirmed_block_num']
        sp_balance_before_block_confirm = wallet.get_account_sp_balance(
            DEFAULT_WITNESS)
        circulating_capital_before = wallet.get_circulating_capital()

        new_confirmed_block = last_confirmed_block
        while new_confirmed_block == last_confirmed_block:
            new_confirmed_block = wallet.get_witness(
                DEFAULT_WITNESS)['last_confirmed_block_num']

        witness_reward = wallet.get_account_sp_balance(
            DEFAULT_WITNESS) - sp_balance_before_block_confirm
        full_content_reward = wallet.get_circulating_capital(
        ) - circulating_capital_before

        activity_content_reward = full_content_reward * 95 / 100
        assert witness_reward == full_content_reward - activity_content_reward, 'witness reward per block != expected'
        return full_content_reward

    def calculate_rewards_from_genesis():
        blocks_per_month = 864000
        days_in_month = 30
        days_in_2_years = 730
        rewards_supply = Amount(genesis['rewards_supply'])
        rewards_per_block = rewards_supply * days_in_month / days_in_2_years / blocks_per_month
        return rewards_per_block

    '''
    content reward before balancer decrease it
    '''
    expected_content_reward_on_start = calculate_rewards_from_genesis()
    content_reward_on_start = get_reward_per_block()
    assert expected_content_reward_on_start == content_reward_on_start, 'content reward on start != expected'
    '''
    wait for balancer decrease content reward
    '''
    wallet.get_block(25, wait_for_block=True, time_to_wait=60)

    content_reward_after_balancer_decrease = get_reward_per_block()
    assert content_reward_after_balancer_decrease < content_reward_on_start, 'content reward not decreased by balancer'
    '''
    open budget with large amount and short lifetime to instantly increase reward pool which enforce balancer to
    increase content reward
    '''
    wallet.create_budget(DEFAULT_WITNESS, Amount("10000.000000000 SCR"),
                         fmt_time_from_now(), fmt_time_from_now(30))

    content_reward_after_budget_open = get_reward_per_block()
    assert content_reward_after_budget_open > content_reward_after_balancer_decrease, \
        'content reward not increased after budget open'
Example #5
0
def test_close_before_starttime(wallet_3hf: Wallet, budget):
    update_budget_time(wallet_3hf, budget, start=30, deadline=60)  # to delay opening time for budget
    balance_before = wallet_3hf.get_account_scr_balance(budget["owner"])
    wallet_3hf.create_budget(**budget)
    update_budget_balance(wallet_3hf, budget)  # update budget params / set budget id
    response = wallet_3hf.close_budget(budget['uuid'], budget["owner"], budget["type"])
    validate_response(response, wallet_3hf.close_budget.__name__)
    balance_after = wallet_3hf.get_account_scr_balance(budget["owner"])
    assert balance_after == balance_before
    check_virt_ops(
        wallet_3hf, response['block_num'], response['block_num'],
        {'close_budget', 'budget_closing', 'budget_owner_income'}
    )
    assert len(wallet_3hf.get_budgets([budget['owner']], budget['type'])) == 0
    assert len(wallet_3hf.list_buddget_owners(budget_type=budget['type'])) == 0
Example #6
0
def test_budget_creation_influence_on_pending(wallet_3hf: Wallet, budget, count):
    coeffs = wallet_3hf.get_auction_coefficients()
    budgets = []
    for i in range(1, count + 1):
        budgets_before = get_sorted_budgets(wallet_3hf, budgets)
        budget_cp = copy(budget)
        update_budget_time(wallet_3hf, budget_cp, start=1, deadline=300)
        budget_cp.update({
            "owner": "test.test%d" % i,
            'balance': str(Amount(budget['balance']) * i),
            'uuid': gen_uid()
        })
        wallet_3hf.create_budget(**budget_cp)
        budgets.append(budget_cp)
        budgets_after = get_sorted_budgets(wallet_3hf, budgets)
        check_budgets_delta_pending_calc(get_pending_delta(budgets_before, budgets_after), coeffs)
Example #7
0
def test_cashout_scr_rewards(wallet_3hf: Wallet, budget, post):
    balancer_delay = 7  # blocks to wait until SCR will be in each required pool
    cfg = wallet_3hf.get_config()
    # Advertising cashout_blocks count
    adv_cash_blocks = int(cfg["SCORUM_ADVERTISING_CASHOUT_PERIOD_SEC"] / cfg["SCORUM_BLOCK_INTERVAL"])
    # Post / comment cashout blocks count
    # post_cash_blocks = int(cfg["SCORUM_CASHOUT_WINDOW_SECONDS"] / cfg["SCORUM_BLOCK_INTERVAL"])
    # Active SP holders cashout blocks count
    asph_cash_blocks = int(cfg["SCORUM_ACTIVE_SP_HOLDERS_REWARD_PERIOD"] / 1000000 / cfg["SCORUM_BLOCK_INTERVAL"]) - 1

    update_budget_time(wallet_3hf, budget, deadline=300)
    response = wallet_3hf.create_budget(**budget)
    budget_cashout_block = response['block_num'] + adv_cash_blocks + balancer_delay

    wallet_3hf.get_block(response['block_num'] + balancer_delay, wait_for_block=True)

    wallet_3hf.post_comment(**post)
    # post_cashout_block = response['block_num'] + post_cash_blocks

    response = wallet_3hf.vote(DEFAULT_WITNESS, post['author'], post['permlink'])
    active_sph_cashout_block = response['block_num'] + asph_cash_blocks

    blocks_ops = [
        (budget_cashout_block, 'producer_reward'),
        (active_sph_cashout_block, 'active_sp_holders_reward'),
        # (post_cashout_block, 'author_reward'),
        # (post_cashout_block, 'curator_reward')
    ]
    for cashout_block, op in blocks_ops:
        wallet_3hf.get_block(cashout_block, wait_for_block=True)
        ops = check_virt_ops(wallet_3hf, cashout_block, cashout_block, {op})
        assert any(Amount(data['reward']) > 0 and 'SCR' in data['reward'] for name, data in ops if name == op)
def test_close_after_starttime(wallet_3hf: Wallet, budget, moderator):
    update_budget_time(wallet_3hf, budget)
    budget_balance = Amount(budget["balance"])
    balance_before = wallet_3hf.get_account_scr_balance(budget["owner"])

    response = wallet_3hf.create_budget(**budget)
    create_block = response["block_num"]
    update_budget_balance(wallet_3hf,
                          budget)  # update budget params / set budget id
    per_block = Amount(budget["per_block"])

    balance_after_create = wallet_3hf.get_account_scr_balance(budget["owner"])

    assert balance_before - balance_after_create == budget_balance

    empower_advertising_moderator(wallet_3hf, moderator)
    response = wallet_3hf.close_budget_by_advertising_moderator(
        budget["uuid"], moderator, budget["type"])
    validate_response(
        response, wallet_3hf.close_budget_by_advertising_moderator.__name__)
    close_block = response["block_num"]

    balance_after_close = wallet_3hf.get_account_scr_balance(budget["owner"])
    assert balance_after_close == balance_after_create + budget_balance - per_block * (
        close_block - create_block)

    check_virt_ops(
        wallet_3hf, close_block, close_block, {
            'close_budget_by_advertising_moderator', 'budget_closing',
            'budget_owner_income', 'budget_outgo'
        })
    assert len(wallet_3hf.get_budgets([budget['owner']], budget['type'])) == 0
    assert len(wallet_3hf.list_buddget_owners(budget_type=budget['type'])) == 0
Example #9
0
def test_update_budget(wallet_3hf: Wallet, budget, json_metadata):
    update_budget_time(wallet_3hf, budget)
    wallet_3hf.create_budget(**budget)
    update_budget_balance(wallet_3hf, budget)
    response = wallet_3hf.update_budget(budget['uuid'], budget['owner'],
                                        json_metadata, budget['type'])
    validate_response(response, wallet_3hf.update_budget.__name__,
                      [('block_num', int)])
    check_virt_ops(wallet_3hf, response["block_num"], response["block_num"],
                   {'update_budget'})
    budget_obj = wallet_3hf.get_budget(budget['uuid'], budget['type'])
    assert budget_obj['json_metadata'] == json_metadata
    assert Amount(budget_obj['balance']) == Amount(budget['balance']) - Amount(
        budget['per_block'])
    assert Amount(budget_obj['budget_pending_outgo']) == Amount(budget['budget_pending_outgo']) + \
        Amount(budget['per_block'])
    changed = {"json_metadata", 'balance', 'budget_pending_outgo'}
    assert all(budget[k] == budget_obj[k] for k in set(budget.keys()).difference(changed)), \
        'Not only budget metadata changed after update\n' \
        'before: {}\n' \
        'after: {}'.format(budget, budget_obj)
Example #10
0
def test_create_max_budgets(wallet_3hf: Wallet, budget):
    re_budgets_limit = r"Can't create more then .* budgets per owner."
    limit = wallet_3hf.get_config()["SCORUM_BUDGETS_LIMIT_PER_OWNER"]
    balance = "0.000000001 SCR"
    update_budget_time(wallet_3hf, budget, start=5, deadline=300)
    budgets = []
    for i in range(1, limit + 1):
        budget_cp = copy(budget)
        budget_cp.update({'uuid': gen_uid(), 'balance': balance})
        budgets.append(budget_cp)
    validate_response(
        wallet_3hf.broadcast_multiple_ops('create_budget_operation', budgets, {budget['owner']}),
        'create_budget_operation'
    )
    update_budget_time(wallet_3hf, budget, start=5, deadline=300)
    validate_error_response(
        wallet_3hf.create_budget(**budget),
        wallet_3hf.create_budget.__name__,
        re_budgets_limit
    )
    wallet_3hf.close_budget(str(budgets[0]['uuid']), budget['owner'], budget['type'])
    update_budget_time(wallet_3hf, budget, start=5, deadline=300)
    validate_response(wallet_3hf.create_budget(**budget), wallet_3hf.create_budget.__name__)
def test_close_post_vs_banner(wallet_3hf: Wallet, moderator, post_budget,
                              banner_budget):
    new_budget = copy(post_budget)
    update_budget_time(wallet_3hf, post_budget)
    wallet_3hf.create_budget(**post_budget)
    update_budget_balance(wallet_3hf,
                          post_budget)  # update budget params / set budget id

    update_budget_time(wallet_3hf, banner_budget)
    wallet_3hf.create_budget(**banner_budget)
    update_budget_balance(
        wallet_3hf, banner_budget)  # update budget params / set budget id

    assert post_budget["id"] == banner_budget["id"]  # both = 0

    empower_advertising_moderator(wallet_3hf, moderator)
    response = wallet_3hf.close_budget_by_advertising_moderator(
        post_budget["uuid"], moderator, post_budget["type"])
    validate_response(
        response, wallet_3hf.close_budget_by_advertising_moderator.__name__)

    post_budgets = wallet_3hf.get_budgets([post_budget['owner']],
                                          post_budget['type'])
    assert len(post_budgets) == 0
    banner_budgets = wallet_3hf.get_budgets([banner_budget['owner']],
                                            banner_budget['type'])
    assert len(banner_budgets) == 1

    update_budget_time(wallet_3hf, new_budget)
    new_budget.update({'uuid': gen_uid()})
    validate_response(wallet_3hf.create_budget(**new_budget),
                      wallet_3hf.create_budget.__name__)
    update_budget_balance(wallet_3hf,
                          new_budget)  # update budget params / set budget id
    assert new_budget["id"] > banner_budget[
        "id"], "Newly created budget should have incremented index"
Example #12
0
def test_close_post_vs_banner(wallet_3hf: Wallet, post_budget, banner_budget):
    new_budget = copy(post_budget)
    update_budget_time(wallet_3hf, post_budget)
    wallet_3hf.create_budget(**post_budget)
    update_budget_balance(wallet_3hf, post_budget)  # update budget params / set budget id

    update_budget_time(wallet_3hf, banner_budget)
    wallet_3hf.create_budget(**banner_budget)
    update_budget_balance(wallet_3hf, banner_budget)  # update budget params / set budget id

    assert post_budget["id"] == banner_budget["id"]  # both = 0

    response = wallet_3hf.close_budget(post_budget['uuid'], post_budget["owner"], post_budget["type"])
    validate_response(response, wallet_3hf.close_budget.__name__)

    post_budgets = wallet_3hf.get_budgets([post_budget['owner']], post_budget['type'])
    assert len(post_budgets) == 0
    banner_budgets = wallet_3hf.get_budgets([banner_budget['owner']], banner_budget['type'])
    assert len(banner_budgets) == 1

    update_budget_time(wallet_3hf, new_budget)
    validate_response(wallet_3hf.create_budget(**new_budget), wallet_3hf.create_budget.__name__)
    update_budget_balance(wallet_3hf, new_budget)  # update budget params / set budget id
    assert new_budget["id"] > banner_budget["id"], "Newly created budget should have incremented index"
Example #13
0
def test_create_budget(wallet: Wallet):
    owner = DEFAULT_WITNESS
    response = wallet.create_budget(owner, Amount("10.000000000 SCR"),
                                    fmt_time_from_now(10),
                                    fmt_time_from_now(40))
    validate_response(response, wallet.create_budget.__name__)

    budget = wallet.get_budgets(owner)[0]
    print(budget)

    per_block_for_10_blocks_budget = Amount('1.000000000 SCR')
    per_block_for_9_blocks_budget = Amount('1.034482758 SCR')

    assert owner in wallet.list_buddget_owners()
    assert Amount(budget['per_block']) in (per_block_for_10_blocks_budget,
                                           per_block_for_9_blocks_budget)
    assert budget['owner'] == owner
Example #14
0
def test_create_budget(wallet_3hf: Wallet, node, budget, start, deadline):
    update_budget_time(wallet_3hf, budget, start=start, deadline=deadline + start)
    budget_balance = Amount(budget["balance"])
    balance_before = wallet_3hf.get_account_scr_balance(budget["owner"])
    response = wallet_3hf.create_budget(**budget)
    validate_response(response, wallet_3hf.create_budget.__name__)
    check_virt_ops(wallet_3hf, response["block_num"], response["block_num"], {'create_budget'})
    balance_after = wallet_3hf.get_account_scr_balance(budget["owner"])
    assert balance_before == balance_after + budget_balance

    update_budget_balance(wallet_3hf, budget)
    assert budget_balance == Amount(budget['balance']) + Amount(budget['owner_pending_income']) + \
        Amount(budget['budget_pending_outgo'])

    per_block, _ = calc_per_block(get_per_blocks_count(start, deadline), budget_balance)
    assert per_block == Amount(budget['per_block'])

    budgets_summary = wallet_3hf.get_dynamic_global_properties()['advertising'][DGP_BUDGETS[budget['type']]]
    assert all(budgets_summary[k] == budget[v] for k, v in DGP_PARAMS_MAP.items())
Example #15
0
def test_close_after_starttime(wallet_3hf: Wallet, budget):
    update_budget_time(wallet_3hf, budget)
    balance_before = wallet_3hf.get_account_scr_balance(budget["owner"])
    response = wallet_3hf.create_budget(**budget)
    create_block = response["block_num"]
    update_budget_balance(wallet_3hf, budget)  # update budget params / set budget id
    per_block = Amount(budget["per_block"])

    response = wallet_3hf.close_budget(budget['uuid'], budget["owner"], budget["type"])
    validate_response(response, wallet_3hf.close_budget.__name__)
    close_block = response["block_num"]
    balance_after = wallet_3hf.get_account_scr_balance(budget["owner"])
    assert balance_before == balance_after + per_block * (close_block - create_block)
    check_virt_ops(
        wallet_3hf, close_block, close_block,
        {'close_budget', 'budget_closing', 'budget_outgo', 'budget_owner_income'}
    )
    assert len(wallet_3hf.get_budgets([budget['owner']], budget['type'])) == 0
    assert len(wallet_3hf.list_buddget_owners(budget_type=budget['type'])) == 0
Example #16
0
def test_deadline_close_budget(wallet_3hf: Wallet, budget, start, deadline, node, balance):
    acc_balance_before = wallet_3hf.get_account_scr_balance(budget['owner'])
    update_budget_time(wallet_3hf, budget, start=start, deadline=deadline + start)
    budget.update({"balance": balance})
    response = wallet_3hf.create_budget(**budget)
    update_budget_balance(wallet_3hf, budget)

    per_blocks_cnt = get_per_blocks_count(start, deadline)
    per_block, reminder = calc_per_block(per_blocks_cnt, Amount(balance))
    assert per_block == Amount(budget['per_block'])

    last_block = response['block_num']
    blocks_wait = last_block + per_blocks_cnt
    wallet_3hf.get_block(blocks_wait + 1, wait_for_block=True)
    budgets = wallet_3hf.get_user_budgets(budget['owner'])
    assert 0 == len(budgets), "All budgets should be closed. %s" % fmt_time_from_now()

    virt_ops = {'budget_closing', 'budget_outgo'}
    if reminder.amount:
        virt_ops.add('budget_owner_income')
    check_virt_ops(wallet_3hf, blocks_wait - 1, blocks_wait + 1, virt_ops)

    acc_balance_after = wallet_3hf.get_account_scr_balance(budget['owner'])
    assert acc_balance_before - Amount(balance) + reminder == acc_balance_after
Example #17
0
def test_create_budget_invalid_params(wallet_3hf: Wallet, budget, params, err_response_code):
    update_budget_time(wallet_3hf, budget)
    budget.update(params)
    response = wallet_3hf.create_budget(**budget)
    validate_error_response(response, wallet_3hf.create_budget.__name__, err_response_code)
Example #18
0
def test_create_budget_locked(wallet: Wallet, budget):
    response = wallet.create_budget(**budget)
    validate_error_response(response, wallet.create_budget.__name__,
                            RE_OP_IS_LOCKED)