-
mconcat authoredUnverified73794bd9
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(
t,
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(
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")
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",
)
}