def test_calculate_interests_delta_time_out_of_bounds(): with pytest.raises(ValueError): calculate_interests( balance=1000000000, internal_interest_rate=1000, delta_time_in_seconds=DELTA_TIME_MINIMAL_ALLOWED_VALUE - 1, )
def test_interests_calculation_returns_integer(): assert isinstance( calculate_interests( balance=1000, internal_interest_rate=100, delta_time_in_seconds=SECONDS_PER_YEAR, ), int, )
def test_get_interests_paid_during_opening_of_trustline( ethindex_db_for_currency_network_with_trustlines_and_interests, currency_network_with_trustlines_and_interests_session, web3, chain, accounts, wait_for_ethindex_to_sync, ): """Test that opening a trustline with balance and interests will allow us to get resulting paid interests""" currency_network = currency_network_with_trustlines_and_interests_session initial_transfer = -100 interest_rate = 2000 currency_network.close_trustline(accounts[1], accounts[2]) currency_network.update_trustline_with_accept( accounts[1], accounts[2], 12345, 12345, interest_rate, 1000, False, initial_transfer, ) path = [accounts[0], accounts[1], accounts[2], accounts[3]] timestamp = web3.eth.getBlock("latest").timestamp timestamp += ONE_YEAR_IN_SECONDS + 1 chain.time_travel(timestamp) currency_network.transfer(path[0], 9, 1000, path, b"") wait_for_ethindex_to_sync() accrued_interests = EventsInformationFetcher( ethindex_db_for_currency_network_with_trustlines_and_interests ).get_list_of_paid_interests_for_trustline(currency_network.address, accounts[2], accounts[1]) assert len(accrued_interests) == 1 assert accrued_interests[0].value == calculate_interests( initial_transfer, interest_rate, ONE_YEAR_IN_SECONDS) assert accrued_interests[0].interest_rate == interest_rate assert accrued_interests[0].timestamp == web3.eth.getBlock( "latest").timestamp
def get_accrued_interests_from_events(balance_update_events, trustline_update_events): accrued_interests = [] for (pre_balance_event, post_balance_event) in toolz.itertoolz.sliding_window( 2, balance_update_events): balance = balance_viewed_from_user(pre_balance_event) interest_rate = get_interests_rates_of_trustline_for_user_before_timestamp( trustline_update_events, balance, post_balance_event.timestamp) interest_value = calculate_interests( balance, interest_rate, post_balance_event.timestamp - pre_balance_event.timestamp, ) accrued_interests.append( InterestAccrued(interest_value, interest_rate, post_balance_event.timestamp)) return accrued_interests
def test_interests_calculation_negative_balance(): assert (calculate_interests( balance=-1000, internal_interest_rate=100, delta_time_in_seconds=SECONDS_PER_YEAR, ) == -10)
def tests_interests_calculation_no_time(): assert (calculate_interests(balance=1000, internal_interest_rate=100, delta_time_in_seconds=0) == 0)
def test_interests_calculation_gives_same_result_as_smart_contracts(): assert (calculate_interests( balance=1000000000000000000, internal_interest_rate=2000, delta_time_in_seconds=SECONDS_PER_YEAR, ) == 221402758160169828) # taken from contract calculation
def test_interests_calculation_high_interest_rate(): assert calculate_interests( balance=1000000000000000000, internal_interest_rate=2000, delta_time_in_seconds=SECONDS_PER_YEAR, ) == pytest.approx(1000000000000000000 * (math.exp(0.20) - 1), rel=0.01)
def test_interests_calculation_zero_interest_rate(): assert (calculate_interests( balance=1000, internal_interest_rate=0, delta_time_in_seconds=SECONDS_PER_YEAR, ) == 0)
def test_calculate_interests_time_glitch(small_non_positive_delta_time): calculate_interests( balance=1000000000, internal_interest_rate=1000, delta_time_in_seconds=small_non_positive_delta_time, ) == 0