math_test.go 6.68 KiB
package keeper
import (
	"testing"
	sdk "github.com/cosmos/cosmos-sdk/types"
	"github.com/stretchr/testify/require"
func TestCalcSpotPrice(t *testing.T) {
	// TODO: Change test to be table driven
	tokenBalanceIn, err := sdk.NewDecFromStr("100")
	require.NoError(t, err)
	tokenWeightIn, err := sdk.NewDecFromStr("0.1")
	require.NoError(t, err)
	tokenBalanceOut, err := sdk.NewDecFromStr("200")
	require.NoError(t, err)
	tokenWeightOut, err := sdk.NewDecFromStr("0.3")
	require.NoError(t, err)
	actual_spot_price := calcSpotPrice(tokenBalanceIn, tokenWeightIn, tokenBalanceOut, tokenWeightOut)
	// s = (100/.1) / (200 / .3) = (1000) / (2000 / 3) = 1.5
	expected_spot_price, err := sdk.NewDecFromStr("1.5")
	require.NoError(t, err)
	// assert that the spot prices are within the error margin from one another.
	require.True(
		expected_spot_price.Sub(actual_spot_price).Abs().LTE(powPrecision),
		"expected value & actual value's difference should less than precision",
// TODO: Create test vectors with balancer contract
func TestCalcSpotPriceWithSwapFee(t *testing.T) {
	tokenBalanceIn, err := sdk.NewDecFromStr("100")
	require.NoError(t, err)
	tokenWeightIn, err := sdk.NewDecFromStr("0.1")
	require.NoError(t, err)
	tokenBalanceOut, err := sdk.NewDecFromStr("200")
	require.NoError(t, err)
	tokenWeightOut, err := sdk.NewDecFromStr("0.3")
	require.NoError(t, err)
	swapFee, err := sdk.NewDecFromStr("0.01")
	require.NoError(t, err)
	s := calcSpotPriceWithSwapFee(tokenBalanceIn, tokenWeightIn, tokenBalanceOut, tokenWeightOut, swapFee)
	expectedDec, err := sdk.NewDecFromStr("1.51515151")
	require.NoError(t, err)
	require.True(
		expectedDec.Sub(s).Abs().LTE(powPrecision),
		"expected value & actual value's difference should less than precision",
func TestCalcOutGivenIn(t *testing.T) {
	tokenBalanceIn, err := sdk.NewDecFromStr("100")
	require.NoError(t, err)
	tokenWeightIn, err := sdk.NewDecFromStr("0.1")
	require.NoError(t, err)
	tokenBalanceOut, err := sdk.NewDecFromStr("200")
	require.NoError(t, err)
	tokenWeightOut, err := sdk.NewDecFromStr("0.3")
7172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
require.NoError(t, err) tokenAmountIn, err := sdk.NewDecFromStr("40") require.NoError(t, err) swapFee, err := sdk.NewDecFromStr("0.01") require.NoError(t, err) s := calcOutGivenIn(tokenBalanceIn, tokenWeightIn, tokenBalanceOut, tokenWeightOut, tokenAmountIn, swapFee) expectedDec, err := sdk.NewDecFromStr("21.0487006") require.NoError(t, err) require.True( t, expectedDec.Sub(s).Abs().LTE(powPrecision.MulInt64(10000)), "expected value & actual value's difference should less than precision*10000", ) } func TestCalcInGivenOut(t *testing.T) { tokenBalanceIn, err := sdk.NewDecFromStr("100") require.NoError(t, err) tokenWeightIn, err := sdk.NewDecFromStr("0.1") require.NoError(t, err) tokenBalanceOut, err := sdk.NewDecFromStr("200") require.NoError(t, err) tokenWeightOut, err := sdk.NewDecFromStr("0.3") require.NoError(t, err) tokenAmountOut, err := sdk.NewDecFromStr("70") require.NoError(t, err) swapFee, err := sdk.NewDecFromStr("0.01") require.NoError(t, err) s := calcInGivenOut(tokenBalanceIn, tokenWeightIn, tokenBalanceOut, tokenWeightOut, tokenAmountOut, swapFee) expectedDec, err := sdk.NewDecFromStr("266.8009177") require.NoError(t, err) require.True( t, expectedDec.Sub(s).Abs().LTE(powPrecision.MulInt64(10)), "expected value & actual value's difference should less than precision*10", ) } func TestCalcPoolOutGivenSingleIn(t *testing.T) { tokenBalanceIn, err := sdk.NewDecFromStr("100") require.NoError(t, err) tokenWeightIn, err := sdk.NewDecFromStr("0.2") require.NoError(t, err) poolSupply, err := sdk.NewDecFromStr("300") require.NoError(t, err) totalWeight, err := sdk.NewDecFromStr("1") require.NoError(t, err) tokenAmountIn, err := sdk.NewDecFromStr("40") require.NoError(t, err) swapFee, err := sdk.NewDecFromStr("0.15") require.NoError(t, err) s := calcPoolOutGivenSingleIn(tokenBalanceIn, tokenWeightIn, poolSupply, totalWeight, tokenAmountIn, swapFee) expectedDec, err := sdk.NewDecFromStr("18.6519592") require.NoError(t, err) require.True( t, expectedDec.Sub(s).Abs().LTE(powPrecision.MulInt64(10000)), "expected value & actual value's difference should less than precision*10000",
141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
) } /* func TestCalcSingleInGivenPoolOut(t *testing.T) { tokenBalanceIn, err := sdk.NewDecFromStr("100") require.NoError(t, err) tokenWeightIn, err := sdk.NewDecFromStr("0.2") require.NoError(t, err) poolSupply, err := sdk.NewDecFromStr("300") require.NoError(t, err) totalWeight, err := sdk.NewDecFromStr("1") require.NoError(t, err) poolAmountOut, err := sdk.NewDecFromStr("70") require.NoError(t, err) swapFee, err := sdk.NewDecFromStr("0.15") require.NoError(t, err) s := calcSingleInGivenPoolOut(tokenBalanceIn, tokenWeightIn, poolSupply, totalWeight, poolAmountOut, swapFee) expectedDec, err := sdk.NewDecFromStr(".") require.NoError(t, err) require.True( t, expectedDec.Sub(s).Abs().LTE(powPrecision.MulInt64(10000)), "expected value & actual value's difference should less than precision*10000", ) } */ func TestCalcSingleOutGivenPoolIn(t *testing.T) { tokenBalanceOut, err := sdk.NewDecFromStr("200") require.NoError(t, err) tokenWeightOut, err := sdk.NewDecFromStr("0.8") require.NoError(t, err) poolSupply, err := sdk.NewDecFromStr("300") require.NoError(t, err) totalWeight, err := sdk.NewDecFromStr("1") require.NoError(t, err) poolAmountIn, err := sdk.NewDecFromStr("40") require.NoError(t, err) swapFee, err := sdk.NewDecFromStr("0.15") require.NoError(t, err) s := calcSingleOutGivenPoolIn(tokenBalanceOut, tokenWeightOut, poolSupply, totalWeight, poolAmountIn, swapFee, sdk.ZeroDec()) expectedDec, err := sdk.NewDecFromStr("31.77534976") require.NoError(t, err) require.True( t, expectedDec.Sub(s).Abs().LTE(powPrecision.MulInt64(10000)), "expected value & actual value's difference should less than precision*10000", ) } func TestCalcPoolInGivenSingleOut(t *testing.T) { tokenBalanceOut, err := sdk.NewDecFromStr("200") require.NoError(t, err) tokenWeightOut, err := sdk.NewDecFromStr("0.8") require.NoError(t, err) poolSupply, err := sdk.NewDecFromStr("300") require.NoError(t, err) totalWeight, err := sdk.NewDecFromStr("1") require.NoError(t, err) tokenAmountOut, err := sdk.NewDecFromStr("70")
211212213214215216217218219220221222223224225226
require.NoError(t, err) swapFee, err := sdk.NewDecFromStr("0.15") require.NoError(t, err) s := calcPoolInGivenSingleOut(tokenBalanceOut, tokenWeightOut, poolSupply, totalWeight, tokenAmountOut, swapFee, sdk.ZeroDec()) expectedDec, err := sdk.NewDecFromStr("90.29092777") require.NoError(t, err) require.True( t, expectedDec.Sub(s).Abs().LTE(powPrecision.MulInt64(10000)), "expected value & actual value's difference should less than precision*10000", ) }