Unverified Commit 85049b09 authored by Dev Ojha's avatar Dev Ojha Committed by GitHub
Browse files

Move around pool setup logic to re-importable infra (#1156)

* Move around pool setup logic to re-importable infra

* Add spot price test cases

* Fix lint

* Fix imports
parent 6f790f9d
Showing with 178 additions and 64 deletions
+178 -64
package apptesting
import (
"github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1"
"github.com/cosmos/cosmos-sdk/simapp"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/osmosis-labs/osmosis/v7/x/gamm/pool-models/balancer"
)
var gammPoolMakerAcc = sdk.AccAddress(secp256k1.GenPrivKey().PubKey().Address().Bytes())
// Returns a Univ2 pool with the initial liquidity being the provided balances
func (suite *KeeperTestHelper) PrepareUni2PoolWithAssets(asset1, asset2 sdk.Coin) uint64 {
return suite.preparePool(
[]balancer.PoolAsset{
{
Weight: sdk.NewInt(1),
Token: asset1,
},
{
Weight: sdk.NewInt(1),
Token: asset2,
},
},
)
}
func (suite *KeeperTestHelper) preparePool(assets []balancer.PoolAsset) uint64 {
suite.Require().Len(assets, 2)
// Add coins for pool creation fee + coins needed to mint balances
fundCoins := sdk.Coins{sdk.NewCoin("uosmo", sdk.NewInt(10000000000))}
for _, a := range assets {
fundCoins = fundCoins.Add(a.Token)
}
err := simapp.FundAccount(suite.App.BankKeeper, suite.Ctx, gammPoolMakerAcc, fundCoins)
suite.Require().NoError(err)
msg := balancer.NewMsgCreateBalancerPool(gammPoolMakerAcc, balancer.PoolParams{
SwapFee: sdk.ZeroDec(),
ExitFee: sdk.ZeroDec(),
}, assets, "")
poolId, err := suite.App.GAMMKeeper.CreatePool(suite.Ctx, msg)
suite.NoError(err)
return poolId
}
package balancer_test
import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/osmosis-labs/osmosis/v7/x/gamm/pool-models/balancer"
)
// This test sets up 2 asset pools, and then checks the spot price on them.
// It uses the pools spot price method, rather than the Gamm keepers spot price method.
func (suite *KeeperTestSuite) TestBalancerSpotPrice() {
baseDenom := "uosmo"
quoteDenom := "uion"
tests := []struct {
name string
baseDenomPoolInput sdk.Coin
quoteDenomPoolInput sdk.Coin
expectError bool
expectedOutput sdk.Dec
}{
{
name: "equal value",
baseDenomPoolInput: sdk.NewInt64Coin(baseDenom, 100),
quoteDenomPoolInput: sdk.NewInt64Coin(quoteDenom, 100),
expectError: false,
expectedOutput: sdk.MustNewDecFromStr("1"),
},
{
name: "1:2 ratio",
baseDenomPoolInput: sdk.NewInt64Coin(baseDenom, 100),
quoteDenomPoolInput: sdk.NewInt64Coin("foo", 200),
expectError: false,
expectedOutput: sdk.MustNewDecFromStr("0.500000000002684355"),
},
{
name: "2:1 ratio",
baseDenomPoolInput: sdk.NewInt64Coin(baseDenom, 200),
quoteDenomPoolInput: sdk.NewInt64Coin("foo", 100),
expectError: false,
expectedOutput: sdk.MustNewDecFromStr("1.999999999989262582"),
},
}
for _, tc := range tests {
suite.SetupTest()
poolId := suite.PrepareUni2PoolWithAssets(
tc.baseDenomPoolInput,
tc.quoteDenomPoolInput,
)
pool, err := suite.App.GAMMKeeper.GetPool(suite.Ctx, poolId)
suite.Require().NoError(err, "test: %s", tc.name)
balancerPool, isPool := pool.(*balancer.Pool)
suite.Require().True(isPool, "test: %s", tc.name)
spotPrice, err := balancerPool.SpotPrice(
suite.Ctx,
tc.baseDenomPoolInput.Denom,
tc.quoteDenomPoolInput.Denom)
if tc.expectError {
suite.Require().Error(err, "test: %s", tc.name)
} else {
suite.Require().NoError(err, "test: %s", tc.name)
suite.Require().True(spotPrice.Equal(tc.expectedOutput),
"test: %s\nSpot price wrong, got %s, expected %s\n", tc.name,
spotPrice, tc.expectedOutput)
}
}
}
package balancer_test
import (
"testing"
"github.com/stretchr/testify/suite"
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
"github.com/cosmos/cosmos-sdk/baseapp"
"github.com/osmosis-labs/osmosis/v7/app"
"github.com/osmosis-labs/osmosis/v7/app/apptesting"
"github.com/osmosis-labs/osmosis/v7/x/gamm/types"
)
type KeeperTestSuite struct {
apptesting.KeeperTestHelper
queryClient types.QueryClient
}
func TestKeeperTestSuite(t *testing.T) {
suite.Run(t, new(KeeperTestSuite))
}
func (suite *KeeperTestSuite) SetupTest() {
suite.App = app.Setup(false)
suite.Ctx = suite.App.BaseApp.NewContext(false, tmproto.Header{})
queryHelper := baseapp.NewQueryServerTestHelper(suite.Ctx, suite.App.InterfaceRegistry())
types.RegisterQueryServer(queryHelper, suite.App.GAMMKeeper)
suite.queryClient = types.NewQueryClient(queryHelper)
}
......@@ -14,11 +14,11 @@ func (suite *KeeperTestSuite) TestFeeDecorator() {
mempoolFeeOpts := types.NewDefaultMempoolFeeOptions()
mempoolFeeOpts.MinGasPriceForHighGasTx = sdk.MustNewDecFromStr("0.0025")
baseDenom, _ := suite.app.TxFeesKeeper.GetBaseDenom(suite.ctx)
baseDenom, _ := suite.App.TxFeesKeeper.GetBaseDenom(suite.Ctx)
uion := "uion"
uionPoolId := suite.PreparePoolWithAssets(
uionPoolId := suite.PrepareUni2PoolWithAssets(
sdk.NewInt64Coin(sdk.DefaultBondDenom, 500),
sdk.NewInt64Coin(uion, 500),
)
......@@ -162,17 +162,17 @@ func (suite *KeeperTestSuite) TestFeeDecorator() {
for _, tc := range tests {
suite.ctx = suite.ctx.WithIsCheckTx(tc.isCheckTx)
suite.ctx = suite.ctx.WithMinGasPrices(tc.minGasPrices)
suite.Ctx = suite.Ctx.WithIsCheckTx(tc.isCheckTx)
suite.Ctx = suite.Ctx.WithMinGasPrices(tc.minGasPrices)
tx := legacytx.NewStdTx([]sdk.Msg{}, legacytx.NewStdFee(
tc.gasRequested,
tc.txFee,
), []legacytx.StdSignature{}, "")
mfd := keeper.NewMempoolFeeDecorator(*suite.app.TxFeesKeeper, mempoolFeeOpts)
mfd := keeper.NewMempoolFeeDecorator(*suite.App.TxFeesKeeper, mempoolFeeOpts)
antehandler := sdk.ChainAnteDecorators(mfd)
_, err := antehandler(suite.ctx, tx, false)
_, err := antehandler(suite.Ctx, tx, false)
if tc.expectPass {
suite.Require().NoError(err, "test: %s", tc.name)
} else {
......
......@@ -9,11 +9,11 @@ func (suite *KeeperTestSuite) TestBaseDenom() {
suite.SetupTest(false)
// Test getting basedenom (should be default from genesis)
baseDenom, err := suite.app.TxFeesKeeper.GetBaseDenom(suite.ctx)
baseDenom, err := suite.App.TxFeesKeeper.GetBaseDenom(suite.Ctx)
suite.Require().NoError(err)
suite.Require().Equal(sdk.DefaultBondDenom, baseDenom)
converted, err := suite.app.TxFeesKeeper.ConvertToBaseToken(suite.ctx, sdk.NewInt64Coin(sdk.DefaultBondDenom, 10))
converted, err := suite.App.TxFeesKeeper.ConvertToBaseToken(suite.Ctx, sdk.NewInt64Coin(sdk.DefaultBondDenom, 10))
suite.Require().True(converted.IsEqual(sdk.NewInt64Coin(sdk.DefaultBondDenom, 10)))
suite.Require().NoError(err)
}
......@@ -21,24 +21,24 @@ func (suite *KeeperTestSuite) TestBaseDenom() {
func (suite *KeeperTestSuite) TestUpgradeFeeTokenProposals() {
suite.SetupTest(false)
uionPoolId := suite.PreparePoolWithAssets(
uionPoolId := suite.PrepareUni2PoolWithAssets(
sdk.NewInt64Coin(sdk.DefaultBondDenom, 500),
sdk.NewInt64Coin("uion", 500),
)
uionPoolId2 := suite.PreparePoolWithAssets(
uionPoolId2 := suite.PrepareUni2PoolWithAssets(
sdk.NewInt64Coin(sdk.DefaultBondDenom, 500),
sdk.NewInt64Coin("uion", 500),
)
// Make pool with fee token but no OSMO and make sure governance proposal fails
noBasePoolId := suite.PreparePoolWithAssets(
noBasePoolId := suite.PrepareUni2PoolWithAssets(
sdk.NewInt64Coin("uion", 500),
sdk.NewInt64Coin("foo", 500),
)
// Create correct pool and governance proposal
fooPoolId := suite.PreparePoolWithAssets(
fooPoolId := suite.PrepareUni2PoolWithAssets(
sdk.NewInt64Coin(sdk.DefaultBondDenom, 500),
sdk.NewInt64Coin("foo", 1000),
)
......@@ -101,12 +101,12 @@ func (suite *KeeperTestSuite) TestUpgradeFeeTokenProposals() {
for _, tc := range tests {
feeTokensBefore := suite.app.TxFeesKeeper.GetFeeTokens(suite.ctx)
feeTokensBefore := suite.App.TxFeesKeeper.GetFeeTokens(suite.Ctx)
// Add a new whitelisted fee token via a governance proposal
err := suite.ExecuteUpgradeFeeTokenProposal(tc.feeToken, tc.poolId)
feeTokensAfter := suite.app.TxFeesKeeper.GetFeeTokens(suite.ctx)
feeTokensAfter := suite.App.TxFeesKeeper.GetFeeTokens(suite.Ctx)
if tc.expectPass {
// Make sure no error during setting of proposal
......@@ -117,10 +117,10 @@ func (suite *KeeperTestSuite) TestUpgradeFeeTokenProposals() {
// Make sure the length of fee tokens is >= before
suite.Require().GreaterOrEqual(len(feeTokensAfter), len(feeTokensBefore), "test: %s", tc.name)
// Ensure that the fee token is convertable to base token
_, err := suite.app.TxFeesKeeper.ConvertToBaseToken(suite.ctx, sdk.NewInt64Coin(tc.feeToken, 10))
_, err := suite.App.TxFeesKeeper.ConvertToBaseToken(suite.Ctx, sdk.NewInt64Coin(tc.feeToken, 10))
suite.Require().NoError(err, "test: %s", tc.name)
// make sure the queried poolId is the same as expected
queriedPoolId, err := suite.queryClient.DenomPoolId(suite.ctx.Context(),
queriedPoolId, err := suite.queryClient.DenomPoolId(suite.Ctx.Context(),
&types.QueryDenomPoolIdRequest{
Denom: tc.feeToken,
},
......@@ -132,10 +132,10 @@ func (suite *KeeperTestSuite) TestUpgradeFeeTokenProposals() {
// ensure that the length of fee tokens is <= to before
suite.Require().LessOrEqual(len(feeTokensAfter), len(feeTokensBefore), "test: %s", tc.name)
// Ensure that the fee token is not convertable to base token
_, err := suite.app.TxFeesKeeper.ConvertToBaseToken(suite.ctx, sdk.NewInt64Coin(tc.feeToken, 10))
_, err := suite.App.TxFeesKeeper.ConvertToBaseToken(suite.Ctx, sdk.NewInt64Coin(tc.feeToken, 10))
suite.Require().Error(err, "test: %s", tc.name)
// make sure the queried poolId errors
_, err = suite.queryClient.DenomPoolId(suite.ctx.Context(),
_, err = suite.queryClient.DenomPoolId(suite.Ctx.Context(),
&types.QueryDenomPoolIdRequest{
Denom: tc.feeToken,
},
......@@ -154,7 +154,7 @@ func (suite *KeeperTestSuite) TestUpgradeFeeTokenProposals() {
func (suite *KeeperTestSuite) TestFeeTokenConversions() {
suite.SetupTest(false)
baseDenom, _ := suite.app.TxFeesKeeper.GetBaseDenom(suite.ctx)
baseDenom, _ := suite.App.TxFeesKeeper.GetBaseDenom(suite.Ctx)
tests := []struct {
name string
......@@ -202,14 +202,14 @@ func (suite *KeeperTestSuite) TestFeeTokenConversions() {
for _, tc := range tests {
suite.SetupTest(false)
poolId := suite.PreparePoolWithAssets(
poolId := suite.PrepareUni2PoolWithAssets(
tc.baseDenomPoolInput,
tc.feeTokenPoolInput,
)
suite.ExecuteUpgradeFeeTokenProposal(tc.feeTokenPoolInput.Denom, poolId)
converted, err := suite.app.TxFeesKeeper.ConvertToBaseToken(suite.ctx, tc.inputFee)
converted, err := suite.App.TxFeesKeeper.ConvertToBaseToken(suite.Ctx, tc.inputFee)
if tc.expectedConvertable {
suite.Require().NoError(err, "test: %s", tc.name)
suite.Require().True(converted.IsEqual(tc.expectedOutput), "test: %s", tc.name)
......
......@@ -14,15 +14,12 @@ import (
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
"github.com/osmosis-labs/osmosis/v7/app"
"github.com/osmosis-labs/osmosis/v7/x/gamm/pool-models/balancer"
"github.com/osmosis-labs/osmosis/v7/app/apptesting"
"github.com/osmosis-labs/osmosis/v7/x/txfees/types"
)
type KeeperTestSuite struct {
suite.Suite
ctx sdk.Context
app *app.OsmosisApp
apptesting.KeeperTestHelper
clientCtx client.Context
......@@ -43,14 +40,14 @@ func (suite *KeeperTestSuite) SetupTest(isCheckTx bool) {
types.RegisterQueryServer(queryHelper, app.TxFeesKeeper)
queryClient := types.NewQueryClient(queryHelper)
suite.app = app
suite.ctx = ctx
suite.App = app
suite.Ctx = ctx
suite.queryClient = queryClient
// Mint some assets to the accounts.
for _, acc := range []sdk.AccAddress{acc1, acc2, acc3} {
err := simapp.FundAccount(suite.app.BankKeeper, suite.ctx, acc,
err := simapp.FundAccount(suite.App.BankKeeper, suite.Ctx, acc,
sdk.NewCoins(
sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10000000000)),
sdk.NewCoin("uosmo", sdk.NewInt(100000000000000000)), // Needed for pool creation fee
......@@ -77,39 +74,5 @@ func (suite *KeeperTestSuite) ExecuteUpgradeFeeTokenProposal(feeToken string, po
PoolID: poolId,
},
)
return suite.app.TxFeesKeeper.HandleUpdateFeeTokenProposal(suite.ctx, &upgradeProp)
}
func (suite *KeeperTestSuite) PreparePoolWithAssets(asset1, asset2 sdk.Coin) uint64 {
return suite.preparePool(
[]balancer.PoolAsset{
{
Weight: sdk.NewInt(1),
Token: asset1,
},
{
Weight: sdk.NewInt(1),
Token: asset2,
},
},
)
}
func (suite *KeeperTestSuite) preparePool(assets []balancer.PoolAsset) uint64 {
suite.Require().Len(assets, 2)
msg := balancer.NewMsgCreateBalancerPool(acc1, balancer.PoolParams{
SwapFee: sdk.ZeroDec(),
ExitFee: sdk.ZeroDec(),
}, assets, "")
poolId, err := suite.app.GAMMKeeper.CreatePool(suite.ctx, msg)
suite.NoError(err)
_, err = suite.app.GAMMKeeper.CalculateSpotPrice(suite.ctx, poolId, assets[0].Token.Denom, assets[1].Token.Denom)
suite.NoError(err)
_, err = suite.app.GAMMKeeper.CalculateSpotPrice(suite.ctx, poolId, assets[1].Token.Denom, assets[0].Token.Denom)
suite.NoError(err)
return poolId
return suite.App.TxFeesKeeper.HandleUpdateFeeTokenProposal(suite.Ctx, &upgradeProp)
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment