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
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"]
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'
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
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)
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
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)
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"
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"
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
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())
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
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
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)
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)