Skip to content

Commit

Permalink
test create gauge fees (#2228)
Browse files Browse the repository at this point in the history
* test create gauge fees

* add mod account to test

* test create gauge fees

* add mod account to test

* move to msg server

* merge
  • Loading branch information
czarcas7ic authored Jul 24, 2022
1 parent ec5fbea commit 590349f
Show file tree
Hide file tree
Showing 3 changed files with 379 additions and 98 deletions.
15 changes: 11 additions & 4 deletions x/incentives/keeper/export_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,20 @@ import (
"github.com/osmosis-labs/osmosis/v10/x/incentives/types"
)

const (
// CreateGaugeFee is the fee required to create a new gauge.
CreateGaugeFee = createGaugeFee
// AddToGagugeFee is the fee required to add to gauge.
AddToGaugeFee = addToGaugeFee
)

// AddGaugeRefByKey appends the provided gauge ID into an array associated with the provided key.
func (k Keeper) AddGaugeRefByKey(ctx sdk.Context, key []byte, guageID uint64) error {
return k.addGaugeRefByKey(ctx, key, guageID)
func (k Keeper) AddGaugeRefByKey(ctx sdk.Context, key []byte, gaugeID uint64) error {
return k.addGaugeRefByKey(ctx, key, gaugeID)
}

func (k Keeper) DeleteGaugeRefByKey(ctx sdk.Context, key []byte, guageID uint64) error {
return k.deleteGaugeRefByKey(ctx, key, guageID)
func (k Keeper) DeleteGaugeRefByKey(ctx sdk.Context, key []byte, gaugeID uint64) error {
return k.deleteGaugeRefByKey(ctx, key, gaugeID)
}

// GetGaugeRefs returns the gauge IDs specified by the provided key.
Expand Down
206 changes: 112 additions & 94 deletions x/incentives/keeper/gauge_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -241,97 +241,115 @@ func (suite *KeeperTestSuite) TestGaugeOperations() {
}
}

func (suite *KeeperTestSuite) TestChargeFee() {
const baseFee = int64(100)

testcases := map[string]struct {
accountBalanceToFund sdk.Coin
feeToCharge int64
gaugeCoins sdk.Coins

expectError bool
}{
"fee + base denom gauge coin == acount balance, success": {
accountBalanceToFund: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(baseFee)),
feeToCharge: baseFee / 2,
gaugeCoins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(baseFee/2))),
},
"fee + base denom gauge coin < acount balance, success": {
accountBalanceToFund: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(baseFee)),
feeToCharge: baseFee/2 - 1,
gaugeCoins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(baseFee/2))),
},
"fee + base denom gauge coin > acount balance, error": {
accountBalanceToFund: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(baseFee)),
feeToCharge: baseFee/2 + 1,
gaugeCoins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(baseFee/2))),

expectError: true,
},
"fee + base denom gauge coin < acount balance, custom values, success": {
accountBalanceToFund: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(11793193112)),
feeToCharge: 55,
gaugeCoins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(328812))),
},
"account funded with coins other than base denom, error": {
accountBalanceToFund: sdk.NewCoin("usdc", sdk.NewInt(baseFee)),
feeToCharge: baseFee,
gaugeCoins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(baseFee/2))),

expectError: true,
},
"fee == account balance, no gauge coins, success": {
accountBalanceToFund: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(baseFee)),
feeToCharge: baseFee,
},
"gauge coins == account balance, no fee, success": {
accountBalanceToFund: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(baseFee)),
gaugeCoins: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(baseFee))),
},
"fee == account balance, gauge coins in denom other than base, success": {
accountBalanceToFund: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(baseFee)),
feeToCharge: baseFee,
gaugeCoins: sdk.NewCoins(sdk.NewCoin("usdc", sdk.NewInt(baseFee*2))),
},
"fee + gauge coins == account balance, multiple gauge coins, one in denom other than base, success": {
accountBalanceToFund: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(baseFee)),
feeToCharge: baseFee / 2,
gaugeCoins: sdk.NewCoins(sdk.NewCoin("usdc", sdk.NewInt(baseFee*2)), sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(baseFee/2))),
},
}

for name, tc := range testcases {
suite.Run(name, func() {
suite.SetupTest()

testAccount := suite.TestAccs[0]

ctx := suite.Ctx
incentivesKeepers := suite.App.IncentivesKeeper
bankKeeper := suite.App.BankKeeper

// Pre-fund account.
suite.FundAcc(testAccount, sdk.NewCoins(tc.accountBalanceToFund))

oldBalanceAmount := bankKeeper.GetBalance(ctx, testAccount, sdk.DefaultBondDenom).Amount

// System under test.
err := incentivesKeepers.ChargeFee(ctx, testAccount, tc.feeToCharge, tc.gaugeCoins)

// Assertions.
newBalanceAmount := bankKeeper.GetBalance(ctx, testAccount, sdk.DefaultBondDenom).Amount
if tc.expectError {
suite.Require().Error(err)

// check account balance unchanged
suite.Require().Equal(oldBalanceAmount, newBalanceAmount)
} else {
suite.Require().NoError(err)

// check account balance changed.
expectedNewBalanceAmount := oldBalanceAmount.Sub(sdk.NewInt(tc.feeToCharge))
suite.Require().Equal(expectedNewBalanceAmount.String(), newBalanceAmount.String())
}
})
}
}
// func (suite *KeeperTestSuite) TestCreateGaugeFee() {

// tests := []struct {
// name string
// accountBalanceToFund sdk.Coins
// gaugeAddition sdk.Coins
// expectedEndBalance sdk.Coins
// isPerpetual bool
// isModuleAccount bool
// expectErr bool
// }{
// {
// name: "user creates a non-perpetual gauge and fills gauge with all remaining tokens",
// accountBalanceToFund: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(60000000))),
// gaugeAddition: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10000000))),
// expectedEndBalance: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(0))),
// },
// {
// name: "user creates a non-perpetual gauge and fills gauge with some remaining tokens",
// accountBalanceToFund: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(70000000))),
// gaugeAddition: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10000000))),
// expectedEndBalance: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10000000))),
// },
// {
// name: "user with multiple denoms creates a non-perpetual gauge and fills gauge with some remaining tokens",
// accountBalanceToFund: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(70000000)), sdk.NewCoin("foo", sdk.NewInt(70000000))),
// gaugeAddition: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10000000))),
// expectedEndBalance: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10000000)), sdk.NewCoin("foo", sdk.NewInt(70000000))),
// },
// {
// name: "module account creates a perpetual gauge and fills gauge with some remaining tokens",
// accountBalanceToFund: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(70000000)), sdk.NewCoin("foo", sdk.NewInt(70000000))),
// gaugeAddition: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10000000))),
// expectedEndBalance: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10000000)), sdk.NewCoin("foo", sdk.NewInt(70000000))),
// isPerpetual: true,
// isModuleAccount: true,
// },
// {
// name: "user with multiple denoms creates a perpetual gauge and fills gauge with some remaining tokens",
// accountBalanceToFund: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(70000000)), sdk.NewCoin("foo", sdk.NewInt(70000000))),
// gaugeAddition: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10000000))),
// expectedEndBalance: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10000000)), sdk.NewCoin("foo", sdk.NewInt(70000000))),
// isPerpetual: true,
// },
// {
// name: "user tries to create a non-perpetual gauge but does not have enough funds to pay for the create gauge fee",
// accountBalanceToFund: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(40000000))),
// gaugeAddition: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10000000))),
// expectedEndBalance: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(40000000))),
// expectErr: true,
// },
// {
// name: "user tries to create a non-perpetual gauge but does not have the correct fee denom",
// accountBalanceToFund: sdk.NewCoins(sdk.NewCoin("foo", sdk.NewInt(60000000))),
// gaugeAddition: sdk.NewCoins(sdk.NewCoin("foo", sdk.NewInt(10000000))),
// expectedEndBalance: sdk.NewCoins(sdk.NewCoin("foo", sdk.NewInt(60000000))),
// expectErr: true,
// },
// // TODO: This is unexpected behavior
// // We need validation to not charge fee if user doesn't have enough funds
// // {
// // name: "one user tries to create a gauge, has enough funds to pay for the create gauge fee but not enough to fill the gauge",
// // accountBalanceToFund: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(60000000))),
// // gaugeAddition: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(30000000))),
// // expectedEndBalance: sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(60000000))),
// // expectErr: true,
// // },

// }

// for _, tc := range tests {
// suite.SetupTest()

// //testAccount := suite.TestAccs[0]
// testAccountPubkey := secp256k1.GenPrivKeyFromSecret([]byte("acc")).PubKey()
// testAccountAddress := sdk.AccAddress(testAccountPubkey.Address())

// ctx := suite.Ctx
// incentivesKeepers := suite.App.IncentivesKeeper

// suite.FundAcc(testAccountAddress, tc.accountBalanceToFund)

// if tc.isModuleAccount {
// modAcc := authtypes.NewModuleAccount(authtypes.NewBaseAccount(testAccountAddress, testAccountPubkey, 1, 0),
// "module",
// "permission",
// )
// suite.App.AccountKeeper.SetModuleAccount(ctx, modAcc)
// }

// suite.SetupManyLocks(1, defaultLiquidTokens, defaultLPTokens, defaultLockDuration)
// distrTo := lockuptypes.QueryCondition{
// LockQueryType: lockuptypes.ByDuration,
// Denom: defaultLPDenom,
// Duration: defaultLockDuration,
// }

// // System under test.

// _, err := incentivesKeepers.CreateGauge(ctx, tc.isPerpetual, testAccountAddress, tc.gaugeAddition, distrTo, time.Time{}, 1)

// if tc.expectErr {
// suite.Require().Error(err)
// } else {
// suite.Require().NoError(err)
// }

// bal := suite.App.BankKeeper.GetAllBalances(suite.Ctx, testAccountAddress)
// suite.Require().Equal(tc.expectedEndBalance.String(), bal.String(), "test: %v", tc.name)

// }
// }
Loading

0 comments on commit 590349f

Please sign in to comment.