diff --git a/x/gamm/keeper/pool/math_test.go b/x/gamm/keeper/pool/math_test.go index d938cdda8bd..6d5b6e0975c 100644 --- a/x/gamm/keeper/pool/math_test.go +++ b/x/gamm/keeper/pool/math_test.go @@ -8,33 +8,45 @@ import ( "github.com/stretchr/testify/require" ) -func TestPowApprox(t *testing.T) { - base, err := sdk.NewDecFromStr("1.5") +func TestSubSign(t *testing.T) { + decA, err := sdk.NewDecFromStr("3.2") + require.NoError(t, err) + decB, err := sdk.NewDecFromStr("4.3432389") + require.NoError(t, err) + + s, b := subSign(decA, decB) + require.True(t, b) + + expectedDec, err := sdk.NewDecFromStr("1.1432389") require.NoError(t, err) - exp, err := sdk.NewDecFromStr("0.4") + require.Equal(t, expectedDec, s) +} + +func TestPowApprox(t *testing.T) { + base, err := sdk.NewDecFromStr("0.8") require.NoError(t, err) - precision, err := sdk.NewDecFromStr("0.00000001") + exp, err := sdk.NewDecFromStr("0.32") require.NoError(t, err) - s := powApprox(base, exp, precision) - expectedDec, err := sdk.NewDecFromStr("1.17607902") + s := powApprox(base, exp, powPrecision) + expectedDec, err := sdk.NewDecFromStr("0.93108385") require.NoError(t, err) require.True( t, - expectedDec.Sub(s).Abs().LTE(precision), + expectedDec.Sub(s).Abs().LTE(powPrecision), "expected value & actual value's difference should less than precision", ) } func TestPow(t *testing.T) { - base, err := sdk.NewDecFromStr("1.4") + base, err := sdk.NewDecFromStr("1.68") require.NoError(t, err) - exp, err := sdk.NewDecFromStr("3.2") + exp, err := sdk.NewDecFromStr("0.32") require.NoError(t, err) s := pow(base, exp) - expectedDec, err := sdk.NewDecFromStr("2.93501087") + expectedDec, err := sdk.NewDecFromStr("1.18058965") require.NoError(t, err) require.True( @@ -43,3 +55,194 @@ func TestPow(t *testing.T) { "expected value & actual value's difference should less than precision", ) } + +func TestCalcSpotPrice(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 := calcSpotPrice(tokenBalanceIn, tokenWeightIn, tokenBalanceOut, tokenWeightOut, swapFee) + + expectedDec, err := sdk.NewDecFromStr("1.51515151") + require.NoError(t, err) + + require.True( + t, + 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") + 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", + ) +} + +/* +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) + + fmt.Println(s) + 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) + + 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") + require.NoError(t, err) + swapFee, err := sdk.NewDecFromStr("0.15") + require.NoError(t, err) + + s := calcPoolInGivenSingleOut(tokenBalanceOut, tokenWeightOut, poolSupply, totalWeight, tokenAmountOut, swapFee) + + 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", + ) +}