Esempio n. 1
0
	def test_calc_due_token_protocol_swap_fee_amount_two_tokens(weightedmath_test):
		# Returns protocl swap fees
		normalized_weights = [Decimal(0.3), Decimal(0.7)]
		balances = [Decimal(10), Decimal(11)]
		last_invariant = Decimal(10)
		token_index = 1
		current_invariant = Decimal(10.689930449163329926)
		protocol_swap_fee_percentage = Decimal(0.1)
		result = WeightedMath.calc_due_token_protocol_swap_fee_amount(balances[token_index], normalized_weights[token_index], last_invariant, current_invariant, protocol_swap_fee_percentage)
		assert isinstance(result, Decimal)
		expected = Decimal(0.099999999999999999933)
		assert expectEqualWithError(result,expected)

		# With large accumulated fees, caps the invariant growth
		normalized_weights = [Decimal(0.3), Decimal(0.7)]
		balances = [Decimal(10), Decimal(11)]
		token_index = 1
		current_invariant = Decimal(10.689930449163329926)
		last_invariant = current_invariant/Decimal(2)
		protocol_swap_fee_percentage = Decimal(0.1)
		result = WeightedMath.calc_due_token_protocol_swap_fee_amount(balances[token_index], normalized_weights[token_index], last_invariant, current_invariant, protocol_swap_fee_percentage)
		
		assert isinstance(result, Decimal)
		expected = Decimal(0.439148057504926669190)
		assert expectEqualWithError(result,expected)
Esempio n. 2
0
    def swap(self,
             token_in: str,
             token_out: str,
             amount: Decimal,
             given_in: bool = True):
        assert len(self._weights) == len(self._balances)
        if (isinstance(amount, int) or isinstance(amount, float)):
            amount = Decimal(amount)
        elif (not isinstance(amount, Decimal)):
            raise Exception("INCORRECT_TYPE")
        factory_fee = amount * self._swap_fee
        swap_amount = amount - factory_fee
        self.factory_fees += factory_fee
        balances = [self._balances[token_in], self._balances[token_out]]
        weights = [self._weights[token_in], self._weights[token_out]]

        if (given_in):
            amount_out = WeightedMath.calc_out_given_in(
                balances[0], weights[0], balances[1], weights[1], amount)
        else:
            WeightedMath.calc_in_given_out(balances[0], weights[0],
                                           balances[1], weights[1], amount)

        self._balances[token_out] -= amount_out
        self._balances[token_in] += swap_amount
        return amount_out
Esempio n. 3
0
	def test_calculate_invariant_three_tokens(weightedmath_test):
		#Test three tokens
		normalized_weight = [Decimal(0.3), Decimal(0.2), Decimal(0.5)]
		balances = [Decimal(10), Decimal(12), Decimal(14)]
		result = WeightedMath.calculate_invariant(normalized_weight, balances)
		expected = Decimal(12.271573899486561654)
		assert expectEqualWithError(result, expected)
Esempio n. 4
0
	def test_calculate_invariant_two_tokens(weightedmath_test):
		#Test two tokens
		normalized_weight = [Decimal(0.3), Decimal(0.7)]
		balances = [Decimal(10), Decimal(12)]
		result = WeightedMath.calculate_invariant(normalized_weight, balances)
		expected = Decimal(11.361269771988886911)
		assert expectEqualWithError(result, expected)
Esempio n. 5
0
	def test_calc_tokens_out_given_exact_bpt_in(weightedmath_test):
		#Test instance of Decimal
		balance = Decimal(10)
		normalized_weight = Decimal(1)
		bpt_amount_in = Decimal(2)
		bpt_total_supply = Decimal(1)
		swap_fee = Decimal(1)
		result = WeightedMath.calc_token_out_given_exact_bpt_in(balance, normalized_weight, bpt_amount_in, bpt_total_supply, swap_fee )
		assert isinstance(result, Decimal)
Esempio n. 6
0
	def test_calc_bpt_in_given_exact_tokens_out(weightedmath_test):
		#Test instance of Decimal
		balances = [Decimal(10), Decimal(12), Decimal(14)]
		normalized_weights = [Decimal(10), Decimal(12), Decimal(14)]
		bpt_amount_out = [Decimal(10), Decimal(12), Decimal(14)]
		bpt_total_supply = Decimal(1)
		swap_fee = Decimal(1)
		result = WeightedMath.calc_bpt_in_given_exact_tokens_out(balances, normalized_weights, bpt_amount_out, bpt_total_supply, swap_fee)
		assert isinstance(result, Decimal)
Esempio n. 7
0
	def test_in_given_out_single_swap(weightedmath_test):
		#Test instance of Decimal
		balance_in = Decimal(100)
		weight_in = Decimal(50)
		balance_out = Decimal(100)
		weight_out = Decimal(40)
		amount_out = Decimal(15)
		result = WeightedMath.calc_in_given_out(balance_in, weight_in, balance_out, weight_out, amount_out)
		assert isinstance(result, Decimal)
		
		expected = Decimal(1388456294146839515)/Decimal(1e17)
		assert expectEqualWithError(result, expected)
Esempio n. 8
0
	def test_out_given_in_single_swap(weightedmath_test):
		#Test instance of Decimal
		token_balance_in = Decimal(100)
		token_weight_in = Decimal(50)
		token_balance_out = Decimal(100)
		token_weight_out = Decimal(40)
		token_amount_out = Decimal(15)
		result = WeightedMath.calc_out_given_in(token_balance_in, token_weight_in, token_balance_out, token_weight_out, token_amount_out)
		assert isinstance(result, Decimal)

		#Test out given in 
		expected = Decimal(1602931431298673722)/Decimal(1e17)
		assert expectEqualWithError(result, expected)
Esempio n. 9
0
	def test_calc_due_token_protocol_swap_fee_amount_three_tokens(weightedmath_test):
		normalized_weights = [Decimal(0.3), Decimal(0.2), Decimal(0.5)]
		balances = [Decimal(10), Decimal(11), Decimal(12)]
		last_invariant = Decimal(10)

		token_index = 2
		current_invariant = Decimal(11.1652682095187556376)
		
		protocol_swap_fee_percentage = Decimal(0.1)
		result = WeightedMath.calc_due_token_protocol_swap_fee_amount(balances[token_index], normalized_weights[token_index], last_invariant, current_invariant, protocol_swap_fee_percentage)
		
		assert isinstance(result, Decimal)
		expected = Decimal(0.23740649734383223657)
		assert expectEqualWithError(result,expected)
Esempio n. 10
0
	def test_in_given_out_extreme_amounts(weightedmath_test):
		#Test instance of Decimal
		token_balance_in = Decimal(100)
		token_weight_in = Decimal(50)
		token_balance_out = Decimal(100)
		token_weight_out = Decimal(40)
		token_amount_out = Decimal(0.00000000001)
		result = WeightedMath.calc_in_given_out(token_balance_in, token_weight_in, token_balance_out, token_weight_out, token_amount_out)

		assert isinstance(result, Decimal)

		# Test In given in 
		# min amount out
		expected = Decimal(8000000)/Decimal(1e18)
		assert expectEqualWithError(result, expected)
Esempio n. 11
0
	def test_in_given_out_extreme_weights(weightedmath_test):
		# Min weights relation
		# Weight relation = 0.00769
		token_balance_in = Decimal(100)
		token_weight_in = Decimal(0.00769)
		token_balance_out = Decimal(100)
		token_weight_out = Decimal(1)
		token_amount_out = Decimal(15)
		result = WeightedMath.calc_out_given_in(token_balance_in, token_weight_in, token_balance_out, token_weight_out, token_amount_out)

		assert isinstance(result, Decimal)

		#Test out given in 
		expected = Decimal(0.107419197916188066)
		assert expectEqualWithError(result, expected)
Esempio n. 12
0
	def test_out_given_in_extreme_weights(weightedmath_test):
		# Max weights relation
		# Weight relation = 130.07
		token_balance_in = Decimal(100)
		token_weight_in = Decimal(130.7)
		token_balance_out = Decimal(100)
		token_weight_out = Decimal(1)
		token_amount_out = Decimal(15)
		result = WeightedMath.calc_out_given_in(token_balance_in, token_weight_in, token_balance_out, token_weight_out, token_amount_out)

		assert isinstance(result, Decimal)

		#Test out given in 
		expected = Decimal(9999999883374836452)/Decimal(1e17)
		assert expectEqualWithError(result, expected)
Esempio n. 13
0
	def test_calculate_invariant_zero_invariant(weightedmath_test):
		#Tests zero Invariant
		result = WeightedMath.calculate_invariant([Decimal(1)], [Decimal(0)])
		assert result == Decimal(0)
Esempio n. 14
0
	def test_calculate_invariant(weightedmath_test):
		#Test instance of Decimal
		normalized_weight = [Decimal(0.3), Decimal(0.2), Decimal(0.5)]
		balances = [Decimal(10), Decimal(12), Decimal(14)]
		result = WeightedMath.calculate_invariant(normalized_weight, balances)
		assert isinstance(result, Decimal)