Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test improvisation for Superfluid #1070

Merged
merged 11 commits into from
Mar 14, 2022
Prev Previous commit
Next Next commit
Add testing packages
  • Loading branch information
mattverse committed Mar 10, 2022
commit 97de47c6e15de9191986df1c1fce7f80bf1e25ee
88 changes: 88 additions & 0 deletions app/apptesting/balancertesting/test_suite.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package balancertesting

import (
"fmt"

"github.com/cosmos/cosmos-sdk/simapp"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/osmosis-labs/osmosis/v7/app/apptesting"
"github.com/osmosis-labs/osmosis/v7/x/gamm/pool-models/balancer"
gammtypes "github.com/osmosis-labs/osmosis/v7/x/gamm/types"
"github.com/tendermint/tendermint/crypto/ed25519"
)

type BalancerTestHelper struct {
*apptesting.KeeperTestHelper
}

func (balancerTestHelper *BalancerTestHelper) SetupGammPoolsWithBondDenomMultiplier(multipliers []sdk.Dec) []gammtypes.PoolI {
balancerTestHelper.App.GAMMKeeper.SetParams(balancerTestHelper.Ctx, gammtypes.Params{
PoolCreationFee: sdk.Coins{},
})

bondDenom := balancerTestHelper.App.StakingKeeper.BondDenom(balancerTestHelper.Ctx)
acc1 := sdk.AccAddress(ed25519.GenPrivKey().PubKey().Address().Bytes())

pools := []gammtypes.PoolI{}

for index, multiplier := range multipliers {
token := fmt.Sprintf("token%d", index)

uosmoAmount := gammtypes.InitPoolSharesSupply.ToDec().Mul(multiplier).RoundInt()

err := simapp.FundAccount(balancerTestHelper.App.BankKeeper, balancerTestHelper.Ctx, acc1, sdk.NewCoins(
sdk.NewCoin(bondDenom, uosmoAmount.Mul(sdk.NewInt(10))),
sdk.NewInt64Coin(token, 100000),
))
balancerTestHelper.NoError(err)

var (
defaultFutureGovernor = ""

// pool assets
defaultFooAsset gammtypes.PoolAsset = gammtypes.PoolAsset{
Weight: sdk.NewInt(100),
Token: sdk.NewCoin(bondDenom, uosmoAmount),
}
defaultBarAsset gammtypes.PoolAsset = gammtypes.PoolAsset{
Weight: sdk.NewInt(100),
Token: sdk.NewCoin(token, sdk.NewInt(10000)),
}
poolAssets []gammtypes.PoolAsset = []gammtypes.PoolAsset{defaultFooAsset, defaultBarAsset}
)

poolId, err := balancerTestHelper.App.GAMMKeeper.CreateBalancerPool(balancerTestHelper.Ctx, acc1, balancer.PoolParams{
SwapFee: sdk.NewDecWithPrec(1, 2),
ExitFee: sdk.NewDecWithPrec(1, 2),
}, poolAssets, defaultFutureGovernor)
balancerTestHelper.Require().NoError(err)

pool, err := balancerTestHelper.App.GAMMKeeper.GetPool(balancerTestHelper.Ctx, poolId)
balancerTestHelper.Require().NoError(err)

pools = append(pools, pool)
}
return pools
}

// SwapAndSetSpotPrice runs a swap to set Spot price of a pool using arbitrary values
// returns spot price after the arbitrary swap
func (balancerTestHelper *BalancerTestHelper) SwapAndSetSpotPrice(poolId uint64, fromAsset gammtypes.PoolAsset, toAsset gammtypes.PoolAsset) sdk.Dec {
// create a dummy account
acc1 := sdk.AccAddress(ed25519.GenPrivKey().PubKey().Address().Bytes())

// fund dummy account with tokens to swap
coins := sdk.Coins{sdk.NewInt64Coin(fromAsset.Token.Denom, 100000000000000)}
err := simapp.FundAccount(balancerTestHelper.App.BankKeeper, balancerTestHelper.Ctx, acc1, coins)
balancerTestHelper.Require().NoError(err)

_, _, err = balancerTestHelper.App.GAMMKeeper.SwapExactAmountOut(
balancerTestHelper.Ctx, acc1,
poolId, fromAsset.Token.Denom, fromAsset.Token.Amount,
sdk.NewCoin(toAsset.Token.Denom, toAsset.Token.Amount.Quo(sdk.NewInt(4))))
balancerTestHelper.Require().NoError(err)

spotPrice, err := balancerTestHelper.App.GAMMKeeper.CalculateSpotPrice(balancerTestHelper.Ctx, poolId, toAsset.Token.Denom, fromAsset.Token.Denom)
balancerTestHelper.Require().NoError(err)
return spotPrice
}
25 changes: 25 additions & 0 deletions app/apptesting/lockuptesting/test_suite.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package lockuptesting

import (
"time"

"github.com/cosmos/cosmos-sdk/simapp"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/osmosis-labs/osmosis/v7/app/apptesting"

lockupkeeper "github.com/osmosis-labs/osmosis/v7/x/lockup/keeper"
lockuptypes "github.com/osmosis-labs/osmosis/v7/x/lockup/types"
)

type LockupTestHelper struct {
*apptesting.KeeperTestHelper
}

func (lockupTestHelper *LockupTestHelper) LockTokens(addr sdk.AccAddress, coins sdk.Coins, duration time.Duration) (lockID uint64) {
msgServer := lockupkeeper.NewMsgServerImpl(lockupTestHelper.App.LockupKeeper)
err := simapp.FundAccount(lockupTestHelper.App.BankKeeper, lockupTestHelper.Ctx, addr, coins)
lockupTestHelper.Require().NoError(err)
msgResponse, err := msgServer.LockTokens(sdk.WrapSDKContext(lockupTestHelper.Ctx), lockuptypes.NewMsgLockTokens(addr, duration, coins))
lockupTestHelper.Require().NoError(err)
return msgResponse.ID
}
3 changes: 3 additions & 0 deletions x/superfluid/keeper/epoch.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package keeper

import (
"errors"
"fmt"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/osmosis-labs/osmosis/v7/osmoutils"
Expand Down Expand Up @@ -118,6 +119,8 @@ func (k Keeper) UpdateOsmoEquivalentMultipliers(ctx sdk.Context, asset types.Sup
}

twap := k.calculateOsmoBackingPerShare(pool, osmoPoolAsset)
fmt.Println(poolId)
fmt.Println(twap)
k.SetOsmoEquivalentMultiplier(ctx, newEpochNumber, asset.Denom, twap)
} else if asset.AssetType == types.SuperfluidAssetTypeNative {
// TODO: Consider deleting superfluid asset type native
Expand Down
19 changes: 4 additions & 15 deletions x/superfluid/keeper/hooks_test.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package keeper_test

import (
"github.com/cosmos/cosmos-sdk/simapp"
sdk "github.com/cosmos/cosmos-sdk/types"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
"github.com/tendermint/tendermint/crypto/ed25519"
)

func (suite *KeeperTestSuite) TestSuperfluidAfterEpochEnd() {
Expand Down Expand Up @@ -35,27 +33,18 @@ func (suite *KeeperTestSuite) TestSuperfluidAfterEpochEnd() {
intermediaryAccs, locks := suite.SetupSuperfluidDelegations(delAddrs, valAddrs, tc.superDelegations, denoms)
suite.checkIntermediaryAccountDelegations(intermediaryAccs)

// gamm swap operation before refresh
acc1 := sdk.AccAddress(ed25519.GenPrivKey().PubKey().Address().Bytes())
// run swap and set spot price
pool, err := suite.App.GAMMKeeper.GetPool(suite.Ctx, poolIds[0])
suite.Require().NoError(err)
poolAssets := pool.GetAllPoolAssets()

coins := sdk.Coins{sdk.NewInt64Coin(poolAssets[1].Token.Denom, 100000000000000)}
err = simapp.FundAccount(suite.App.BankKeeper, suite.Ctx, acc1, coins)
suite.Require().NoError(err)
_, _, err = suite.App.GAMMKeeper.SwapExactAmountOut(
suite.Ctx, acc1,
poolIds[0], poolAssets[1].Token.Denom, poolAssets[1].Token.Amount,
sdk.NewCoin(poolAssets[0].Token.Denom, poolAssets[0].Token.Amount.Quo(sdk.NewInt(4))))
suite.Require().NoError(err)
suite.balancerTestHelper.SwapAndSetSpotPrice(poolIds[0], poolAssets[1], poolAssets[0])

// run epoch actions
suite.BeginNewBlock(true)

// check lptoken twap value set
newEpochTwap := suite.App.SuperfluidKeeper.GetOsmoEquivalentMultiplier(suite.Ctx, denoms[0])
suite.Require().Equal(newEpochTwap, sdk.NewDec(15))
newEpochMultiplier := suite.App.SuperfluidKeeper.GetOsmoEquivalentMultiplier(suite.Ctx, denoms[0])
suite.Require().Equal(newEpochMultiplier, sdk.NewDec(15))

// check gauge creation in new block
intermediaryAccAddr := suite.App.SuperfluidKeeper.GetLockIdIntermediaryAccountConnection(suite.Ctx, locks[0].ID)
Expand Down
83 changes: 14 additions & 69 deletions x/superfluid/keeper/keeper_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package keeper_test

import (
"fmt"
"testing"
"time"

Expand All @@ -11,43 +10,36 @@ import (
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
"github.com/osmosis-labs/osmosis/v7/app"
"github.com/osmosis-labs/osmosis/v7/app/apptesting"
"github.com/osmosis-labs/osmosis/v7/app/apptesting/balancertesting"
"github.com/osmosis-labs/osmosis/v7/app/apptesting/lockuptesting"
"github.com/osmosis-labs/osmosis/v7/x/superfluid/types"
"github.com/stretchr/testify/suite"
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"

"github.com/osmosis-labs/osmosis/v7/x/gamm/pool-models/balancer"
"github.com/tendermint/tendermint/crypto/ed25519"

lockupkeeper "github.com/osmosis-labs/osmosis/v7/x/lockup/keeper"

epochtypes "github.com/osmosis-labs/osmosis/v7/x/epochs/types"
gammtypes "github.com/osmosis-labs/osmosis/v7/x/gamm/types"
lockuptypes "github.com/osmosis-labs/osmosis/v7/x/lockup/types"
minttypes "github.com/osmosis-labs/osmosis/v7/x/mint/types"
)

type KeeperTestSuite struct {
apptesting.KeeperTestHelper

queryClient types.QueryClient
}
balancerTestHelper balancertesting.BalancerTestHelper
lockupTestHelper lockuptesting.LockupTestHelper

func (suite *KeeperTestSuite) GetSuite() *suite.Suite {
return &suite.Suite
}
func (suite *KeeperTestSuite) GetCtx() sdk.Context {
return suite.Ctx
}
func (suite *KeeperTestSuite) GetApp() *app.OsmosisApp {
return suite.App
}
func (suite *KeeperTestSuite) SetCtx(Ctx sdk.Context) {
suite.Ctx = Ctx
queryClient types.QueryClient
}

func (suite *KeeperTestSuite) SetupTest() {
suite.App = app.Setup(false)

// make reference to keepertesthelpers
suite.balancerTestHelper.KeeperTestHelper = &suite.KeeperTestHelper
suite.lockupTestHelper.KeeperTestHelper = &suite.KeeperTestHelper

startTime := time.Unix(1645580000, 0)
suite.Ctx = suite.App.BaseApp.NewContext(false, tmproto.Header{Height: 1, ChainID: "osmosis-1", Time: startTime.UTC()})
queryHelper := baseapp.NewQueryServerTestHelper(suite.Ctx, suite.App.InterfaceRegistry())
Expand Down Expand Up @@ -137,15 +129,6 @@ func (suite *KeeperTestSuite) createGammPool(denoms []string) uint64 {
return poolId
}

func (suite *KeeperTestSuite) LockTokens(addr sdk.AccAddress, coins sdk.Coins, duration time.Duration) (lockID uint64) {
msgServer := lockupkeeper.NewMsgServerImpl(suite.App.LockupKeeper)
err := simapp.FundAccount(suite.App.BankKeeper, suite.Ctx, addr, coins)
suite.Require().NoError(err)
msgResponse, err := msgServer.LockTokens(sdk.WrapSDKContext(suite.Ctx), lockuptypes.NewMsgLockTokens(addr, duration, coins))
suite.Require().NoError(err)
return msgResponse.ID
}

func (suite *KeeperTestSuite) SetupValidators(bondStatuses []stakingtypes.BondStatus) []sdk.ValAddress {
valAddrs := []sdk.ValAddress{}
for _, status := range bondStatuses {
Expand All @@ -156,52 +139,13 @@ func (suite *KeeperTestSuite) SetupValidators(bondStatuses []stakingtypes.BondSt
}

func (suite *KeeperTestSuite) SetupGammPoolsAndSuperfluidAssets(multipliers []sdk.Dec) ([]string, []uint64) {
suite.App.GAMMKeeper.SetParams(suite.Ctx, gammtypes.Params{
PoolCreationFee: sdk.Coins{},
})

bondDenom := suite.App.StakingKeeper.BondDenom(suite.Ctx)
pools := suite.balancerTestHelper.SetupGammPoolsWithBondDenomMultiplier(multipliers)

acc1 := sdk.AccAddress(ed25519.GenPrivKey().PubKey().Address().Bytes())
denoms := []string{}
poolIds := []uint64{}

for index, multiplier := range multipliers {
token := fmt.Sprintf("token%d", index)

uosmoAmount := gammtypes.InitPoolSharesSupply.ToDec().Mul(multiplier).RoundInt()

err := simapp.FundAccount(suite.App.BankKeeper, suite.Ctx, acc1, sdk.NewCoins(
sdk.NewCoin(bondDenom, uosmoAmount.Mul(sdk.NewInt(10))),
sdk.NewInt64Coin(token, 100000),
))
suite.NoError(err)

var (
defaultFutureGovernor = ""

// pool assets
defaultFooAsset gammtypes.PoolAsset = gammtypes.PoolAsset{
Weight: sdk.NewInt(100),
Token: sdk.NewCoin(bondDenom, uosmoAmount),
}
defaultBarAsset gammtypes.PoolAsset = gammtypes.PoolAsset{
Weight: sdk.NewInt(100),
Token: sdk.NewCoin(token, sdk.NewInt(10000)),
}
poolAssets []gammtypes.PoolAsset = []gammtypes.PoolAsset{defaultFooAsset, defaultBarAsset}
)

poolId, err := suite.App.GAMMKeeper.CreateBalancerPool(suite.Ctx, acc1, balancer.PoolParams{
SwapFee: sdk.NewDecWithPrec(1, 2),
ExitFee: sdk.NewDecWithPrec(1, 2),
}, poolAssets, defaultFutureGovernor)
suite.Require().NoError(err)

pool, err := suite.App.GAMMKeeper.GetPool(suite.Ctx, poolId)
suite.Require().NoError(err)

for _, pool := range pools {
denom := pool.GetTotalShares().Denom

suite.App.SuperfluidKeeper.AddNewSuperfluidAsset(suite.Ctx, types.SuperfluidAsset{
Denom: denom,
AssetType: types.SuperfluidAssetTypeLPShare,
Expand All @@ -213,9 +157,10 @@ func (suite *KeeperTestSuite) SetupGammPoolsAndSuperfluidAssets(multipliers []sd
AssetType: types.SuperfluidAssetTypeLPShare,
})

poolIds = append(poolIds, poolId)
denoms = append(denoms, denom)
poolIds = append(poolIds, pool.GetId())
}

return denoms, poolIds
}

Expand Down
2 changes: 1 addition & 1 deletion x/superfluid/keeper/stake_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ func (suite *KeeperTestSuite) SetupSuperfluidDelegate(delAddr sdk.AccAddress, va
coins := sdk.Coins{sdk.NewInt64Coin(denom, amount)}
lastLockID := suite.App.LockupKeeper.GetLastLockID(suite.Ctx)

lockID := suite.LockTokens(delAddr, coins, unbondingDuration)
lockID := suite.lockupTestHelper.LockTokens(delAddr, coins, unbondingDuration)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LockTokens should be used on all LockTokens related tests, not only superfluid?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean I should change other tests in other packages to use this as well?

lock, err := suite.App.LockupKeeper.GetLockByID(suite.Ctx, lockID)
suite.Require().NoError(err)

Expand Down