mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-24 15:25:18 +00:00
Harvest: refactor deposit type to claim type (#716)
* status: refactor deposit type to claim type * refactor all deposit types to claim types * refactor msg withdraw * update module errors * refactor querier and rest * update spec * update tests * update handler, alias * refactor to IterateDepositsByDenom * v0_12 legacy types * fix build
This commit is contained in:
parent
510b7e7c04
commit
df2c4271e4
@ -15,9 +15,9 @@ const (
|
||||
AttributeKeyClaimAmount = types.AttributeKeyClaimAmount
|
||||
AttributeKeyClaimHolder = types.AttributeKeyClaimHolder
|
||||
AttributeKeyClaimMultiplier = types.AttributeKeyClaimMultiplier
|
||||
AttributeKeyClaimType = types.AttributeKeyClaimType
|
||||
AttributeKeyDeposit = types.AttributeKeyDeposit
|
||||
AttributeKeyDepositDenom = types.AttributeKeyDepositDenom
|
||||
AttributeKeyDepositType = types.AttributeKeyDepositType
|
||||
AttributeKeyDepositor = types.AttributeKeyDepositor
|
||||
AttributeKeyRewardsDistribution = types.AttributeKeyRewardsDistribution
|
||||
AttributeValueCategory = types.AttributeValueCategory
|
||||
@ -82,8 +82,7 @@ var (
|
||||
DefaultGovSchedules = types.DefaultGovSchedules
|
||||
DefaultLPSchedules = types.DefaultLPSchedules
|
||||
DefaultPreviousBlockTime = types.DefaultPreviousBlockTime
|
||||
DepositTypesClaimQuery = types.DepositTypesClaimQuery
|
||||
DepositTypesDepositQuery = types.DepositTypesDepositQuery
|
||||
ClaimTypesClaimQuery = types.ClaimTypesClaimQuery
|
||||
DepositsKeyPrefix = types.DepositsKeyPrefix
|
||||
ErrAccountNotFound = types.ErrAccountNotFound
|
||||
ErrClaimExpired = types.ErrClaimExpired
|
||||
@ -91,10 +90,10 @@ var (
|
||||
ErrDepositNotFound = types.ErrDepositNotFound
|
||||
ErrGovScheduleNotFound = types.ErrGovScheduleNotFound
|
||||
ErrInsufficientModAccountBalance = types.ErrInsufficientModAccountBalance
|
||||
ErrInvaliWithdrawAmount = types.ErrInvaliWithdrawAmount
|
||||
ErrInvaliWithdrawAmount = types.ErrInvalidWithdrawAmount
|
||||
ErrInvalidAccountType = types.ErrInvalidAccountType
|
||||
ErrInvalidDepositDenom = types.ErrInvalidDepositDenom
|
||||
ErrInvalidDepositType = types.ErrInvalidDepositType
|
||||
ErrInvalidClaimType = types.ErrInvalidClaimType
|
||||
ErrInvalidMultiplier = types.ErrInvalidMultiplier
|
||||
ErrLPScheduleNotFound = types.ErrLPScheduleNotFound
|
||||
ErrZeroClaim = types.ErrZeroClaim
|
||||
@ -116,7 +115,7 @@ type (
|
||||
DelegatorDistributionSchedule = types.DelegatorDistributionSchedule
|
||||
DelegatorDistributionSchedules = types.DelegatorDistributionSchedules
|
||||
Deposit = types.Deposit
|
||||
DepositType = types.DepositType
|
||||
ClaimType = types.ClaimType
|
||||
DistributionSchedule = types.DistributionSchedule
|
||||
DistributionSchedules = types.DistributionSchedules
|
||||
GenesisDistributionTime = types.GenesisDistributionTime
|
||||
|
@ -22,7 +22,7 @@ const (
|
||||
flagName = "name"
|
||||
flagDepositDenom = "deposit-denom"
|
||||
flagOwner = "owner"
|
||||
flagDepositType = "deposit-type"
|
||||
flagClaimType = "claim-type"
|
||||
)
|
||||
|
||||
// GetQueryCmd returns the cli query commands for the harvest module
|
||||
@ -122,8 +122,8 @@ func queryDepositsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
||||
|
||||
Example:
|
||||
$ kvcli q harvest deposits
|
||||
$ kvcli q harvest deposits --owner kava1l0xsq2z7gqd7yly0g40y5836g0appumark77ny --deposit-type lp --deposit-denom bnb
|
||||
$ kvcli q harvest deposits --deposit-type stake --deposit-denom ukava
|
||||
$ kvcli q harvest deposits --owner kava1l0xsq2z7gqd7yly0g40y5836g0appumark77ny --deposit-denom bnb
|
||||
$ kvcli q harvest deposits --deposit-denom ukava
|
||||
$ kvcli q harvest deposits --deposit-denom btcb`,
|
||||
),
|
||||
Args: cobra.NoArgs,
|
||||
@ -131,11 +131,9 @@ func queryDepositsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
||||
cliCtx := context.NewCLIContext().WithCodec(cdc)
|
||||
|
||||
var owner sdk.AccAddress
|
||||
var depositType types.DepositType
|
||||
|
||||
ownerBech := viper.GetString(flagOwner)
|
||||
depositDenom := viper.GetString(flagDepositDenom)
|
||||
depositTypeStr := viper.GetString(flagDepositType)
|
||||
|
||||
if len(ownerBech) != 0 {
|
||||
depositOwner, err := sdk.AccAddressFromBech32(ownerBech)
|
||||
@ -145,17 +143,10 @@ func queryDepositsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
||||
owner = depositOwner
|
||||
}
|
||||
|
||||
if len(depositTypeStr) != 0 {
|
||||
if err := types.DepositType(depositTypeStr).IsValid(); err != nil {
|
||||
return err
|
||||
}
|
||||
depositType = types.DepositType(depositTypeStr)
|
||||
}
|
||||
|
||||
page := viper.GetInt(flags.FlagPage)
|
||||
limit := viper.GetInt(flags.FlagLimit)
|
||||
|
||||
params := types.NewQueryDepositParams(page, limit, depositDenom, owner, depositType)
|
||||
params := types.NewQueryDepositParams(page, limit, depositDenom, owner)
|
||||
bz, err := cdc.MarshalJSON(params)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -179,7 +170,6 @@ func queryDepositsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
||||
cmd.Flags().Int(flags.FlagLimit, 100, "pagination limit (max 100)")
|
||||
cmd.Flags().String(flagOwner, "", "(optional) filter for deposits by owner address")
|
||||
cmd.Flags().String(flagDepositDenom, "", "(optional) filter for deposits by denom")
|
||||
cmd.Flags().String(flagDepositType, "", "(optional) filter for deposits by type (lp or staking)")
|
||||
return cmd
|
||||
}
|
||||
|
||||
@ -191,8 +181,8 @@ func queryClaimsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
||||
|
||||
Example:
|
||||
$ kvcli q harvest claims
|
||||
$ kvcli q harvest claims --owner kava1l0xsq2z7gqd7yly0g40y5836g0appumark77ny --deposit-type lp --deposit-denom bnb
|
||||
$ kvcli q harvest claims --deposit-type stake --deposit-denom ukava
|
||||
$ kvcli q harvest claims --owner kava1l0xsq2z7gqd7yly0g40y5836g0appumark77ny --claim-type lp --deposit-denom bnb
|
||||
$ kvcli q harvest claims --claim-type stake --deposit-denom ukava
|
||||
$ kvcli q harvest claims --deposit-denom btcb`,
|
||||
),
|
||||
Args: cobra.NoArgs,
|
||||
@ -200,11 +190,11 @@ func queryClaimsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
||||
cliCtx := context.NewCLIContext().WithCodec(cdc)
|
||||
|
||||
var owner sdk.AccAddress
|
||||
var depositType types.DepositType
|
||||
var claimType types.ClaimType
|
||||
|
||||
ownerBech := viper.GetString(flagOwner)
|
||||
depositDenom := viper.GetString(flagDepositDenom)
|
||||
depositTypeStr := viper.GetString(flagDepositType)
|
||||
claimTypeStr := viper.GetString(flagClaimType)
|
||||
|
||||
if len(ownerBech) != 0 {
|
||||
claimOwner, err := sdk.AccAddressFromBech32(ownerBech)
|
||||
@ -214,17 +204,17 @@ func queryClaimsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
||||
owner = claimOwner
|
||||
}
|
||||
|
||||
if len(depositTypeStr) != 0 {
|
||||
if err := types.DepositType(depositTypeStr).IsValid(); err != nil {
|
||||
if len(claimTypeStr) != 0 {
|
||||
if err := types.ClaimType(claimTypeStr).IsValid(); err != nil {
|
||||
return err
|
||||
}
|
||||
depositType = types.DepositType(depositTypeStr)
|
||||
claimType = types.ClaimType(claimTypeStr)
|
||||
}
|
||||
|
||||
page := viper.GetInt(flags.FlagPage)
|
||||
limit := viper.GetInt(flags.FlagLimit)
|
||||
|
||||
params := types.NewQueryDepositParams(page, limit, depositDenom, owner, depositType)
|
||||
params := types.NewQueryClaimParams(page, limit, depositDenom, owner, claimType)
|
||||
bz, err := cdc.MarshalJSON(params)
|
||||
if err != nil {
|
||||
return err
|
||||
@ -248,7 +238,7 @@ func queryClaimsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
||||
cmd.Flags().Int(flags.FlagLimit, 100, "pagination limit (max 100)")
|
||||
cmd.Flags().String(flagOwner, "", "(optional) filter for claims by owner address")
|
||||
cmd.Flags().String(flagDepositDenom, "", "(optional) filter for claims by denom")
|
||||
cmd.Flags().String(flagDepositType, "", "(optional) filter for claims by type (lp or staking)")
|
||||
cmd.Flags().String(flagClaimType, "", "(optional) filter for claims by type (lp or staking)")
|
||||
return cmd
|
||||
}
|
||||
|
||||
|
@ -41,11 +41,10 @@ func GetTxCmd(cdc *codec.Codec) *cobra.Command {
|
||||
|
||||
func getCmdDeposit(cdc *codec.Codec) *cobra.Command {
|
||||
return &cobra.Command{
|
||||
Use: "deposit [amount] [deposit-type]",
|
||||
Use: "deposit [amount]",
|
||||
Short: "deposit coins to harvest",
|
||||
Args: cobra.ExactArgs(2),
|
||||
Example: fmt.Sprintf(
|
||||
`%s tx %s deposit 10000000bnb lp --from <key>`, version.ClientName, types.ModuleName,
|
||||
`%s tx %s deposit 10000000bnb --from <key>`, version.ClientName, types.ModuleName,
|
||||
),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
inBuf := bufio.NewReader(cmd.InOrStdin())
|
||||
@ -55,7 +54,7 @@ func getCmdDeposit(cdc *codec.Codec) *cobra.Command {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
msg := types.NewMsgDeposit(cliCtx.GetFromAddress(), amount, args[1])
|
||||
msg := types.NewMsgDeposit(cliCtx.GetFromAddress(), amount)
|
||||
if err := msg.ValidateBasic(); err != nil {
|
||||
return err
|
||||
}
|
||||
@ -66,11 +65,11 @@ func getCmdDeposit(cdc *codec.Codec) *cobra.Command {
|
||||
|
||||
func getCmdWithdraw(cdc *codec.Codec) *cobra.Command {
|
||||
return &cobra.Command{
|
||||
Use: "withdraw [amount] [deposit-type]",
|
||||
Use: "withdraw [amount]",
|
||||
Short: "withdraw coins from harvest",
|
||||
Args: cobra.ExactArgs(2),
|
||||
Args: cobra.ExactArgs(1),
|
||||
Example: fmt.Sprintf(
|
||||
`%s tx %s withdraw 10000000bnb lp --from <key>`, version.ClientName, types.ModuleName,
|
||||
`%s tx %s withdraw 10000000bnb --from <key>`, version.ClientName, types.ModuleName,
|
||||
),
|
||||
RunE: func(cmd *cobra.Command, args []string) error {
|
||||
inBuf := bufio.NewReader(cmd.InOrStdin())
|
||||
@ -80,7 +79,7 @@ func getCmdWithdraw(cdc *codec.Codec) *cobra.Command {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
msg := types.NewMsgWithdraw(cliCtx.GetFromAddress(), amount, args[1])
|
||||
msg := types.NewMsgWithdraw(cliCtx.GetFromAddress(), amount)
|
||||
if err := msg.ValidateBasic(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -56,7 +56,6 @@ func queryDepositsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||
|
||||
var depositDenom string
|
||||
var depositOwner sdk.AccAddress
|
||||
var depositType types.DepositType
|
||||
|
||||
if x := r.URL.Query().Get(RestDenom); len(x) != 0 {
|
||||
depositDenom = strings.TrimSpace(x)
|
||||
@ -71,17 +70,7 @@ func queryDepositsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||
}
|
||||
}
|
||||
|
||||
if x := r.URL.Query().Get(RestType); len(x) != 0 {
|
||||
depositTypeStr := strings.ToLower(strings.TrimSpace(x))
|
||||
err := types.DepositType(depositTypeStr).IsValid()
|
||||
if err != nil {
|
||||
rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
|
||||
return
|
||||
}
|
||||
depositType = types.DepositType(depositTypeStr)
|
||||
}
|
||||
|
||||
params := types.NewQueryDepositParams(page, limit, depositDenom, depositOwner, depositType)
|
||||
params := types.NewQueryDepositParams(page, limit, depositDenom, depositOwner)
|
||||
|
||||
bz, err := cliCtx.Codec.MarshalJSON(params)
|
||||
if err != nil {
|
||||
@ -115,7 +104,7 @@ func queryClaimsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||
|
||||
var depositDenom string
|
||||
var claimOwner sdk.AccAddress
|
||||
var depositType types.DepositType
|
||||
var claimType types.ClaimType
|
||||
|
||||
if x := r.URL.Query().Get(RestDenom); len(x) != 0 {
|
||||
depositDenom = strings.TrimSpace(x)
|
||||
@ -131,16 +120,16 @@ func queryClaimsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||
}
|
||||
|
||||
if x := r.URL.Query().Get(RestType); len(x) != 0 {
|
||||
depositTypeStr := strings.ToLower(strings.TrimSpace(x))
|
||||
err := types.DepositType(depositTypeStr).IsValid()
|
||||
claimTypeStr := strings.ToLower(strings.TrimSpace(x))
|
||||
err := types.ClaimType(claimTypeStr).IsValid()
|
||||
if err != nil {
|
||||
rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
|
||||
return
|
||||
}
|
||||
depositType = types.DepositType(depositTypeStr)
|
||||
claimType = types.ClaimType(claimTypeStr)
|
||||
}
|
||||
|
||||
params := types.NewQueryDepositParams(page, limit, depositDenom, claimOwner, depositType)
|
||||
params := types.NewQueryClaimParams(page, limit, depositDenom, claimOwner, claimType)
|
||||
|
||||
bz, err := cliCtx.Codec.MarshalJSON(params)
|
||||
if err != nil {
|
||||
|
@ -33,7 +33,7 @@ func postDepositHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||
return
|
||||
}
|
||||
|
||||
msg := types.NewMsgDeposit(req.From, req.Amount, strings.ToLower(req.DepositType))
|
||||
msg := types.NewMsgDeposit(req.From, req.Amount)
|
||||
if err := msg.ValidateBasic(); err != nil {
|
||||
rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
|
||||
return
|
||||
@ -54,7 +54,7 @@ func postWithdrawHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||
return
|
||||
}
|
||||
|
||||
msg := types.NewMsgWithdraw(req.From, req.Amount, strings.ToLower(req.DepositType))
|
||||
msg := types.NewMsgWithdraw(req.From, req.Amount)
|
||||
if err := msg.ValidateBasic(); err != nil {
|
||||
rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
|
||||
return
|
||||
|
@ -30,7 +30,7 @@ func NewHandler(k Keeper) sdk.Handler {
|
||||
}
|
||||
|
||||
func handleMsgClaimReward(ctx sdk.Context, k keeper.Keeper, msg types.MsgClaimReward) (*sdk.Result, error) {
|
||||
err := k.ClaimReward(ctx, msg.Sender, msg.Receiver, msg.DepositDenom, types.DepositType(strings.ToLower(msg.DepositType)), types.MultiplierName(strings.ToLower(msg.MultiplierName)))
|
||||
err := k.ClaimReward(ctx, msg.Sender, msg.Receiver, msg.DepositDenom, types.ClaimType(strings.ToLower(msg.ClaimType)), types.MultiplierName(strings.ToLower(msg.MultiplierName)))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -48,7 +48,7 @@ func handleMsgClaimReward(ctx sdk.Context, k keeper.Keeper, msg types.MsgClaimRe
|
||||
}
|
||||
|
||||
func handleMsgDeposit(ctx sdk.Context, k keeper.Keeper, msg types.MsgDeposit) (*sdk.Result, error) {
|
||||
err := k.Deposit(ctx, msg.Depositor, msg.Amount, types.DepositType(strings.ToLower(msg.DepositType)))
|
||||
err := k.Deposit(ctx, msg.Depositor, msg.Amount)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -66,7 +66,7 @@ func handleMsgDeposit(ctx sdk.Context, k keeper.Keeper, msg types.MsgDeposit) (*
|
||||
}
|
||||
|
||||
func handleMsgWithdraw(ctx sdk.Context, k keeper.Keeper, msg types.MsgWithdraw) (*sdk.Result, error) {
|
||||
err := k.Withdraw(ctx, msg.Depositor, msg.Amount, types.DepositType(strings.ToLower(msg.DepositType)))
|
||||
err := k.Withdraw(ctx, msg.Depositor, msg.Amount)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -351,7 +351,7 @@ func (suite *KeeperTestSuite) TestBorrow() {
|
||||
// Deposit coins to harvest
|
||||
depositedCoins := sdk.NewCoins()
|
||||
for _, depositCoin := range tc.args.depositCoins {
|
||||
err = suite.keeper.Deposit(suite.ctx, tc.args.borrower, depositCoin, types.LP)
|
||||
err = suite.keeper.Deposit(suite.ctx, tc.args.borrower, depositCoin)
|
||||
suite.Require().NoError(err)
|
||||
depositedCoins.Add(depositCoin)
|
||||
}
|
||||
|
@ -20,11 +20,11 @@ const (
|
||||
)
|
||||
|
||||
// ClaimReward sends the reward amount to the reward owner and deletes the claim from the store
|
||||
func (k Keeper) ClaimReward(ctx sdk.Context, claimHolder sdk.AccAddress, receiver sdk.AccAddress, depositDenom string, depositType types.DepositType, multiplier types.MultiplierName) error {
|
||||
func (k Keeper) ClaimReward(ctx sdk.Context, claimHolder sdk.AccAddress, receiver sdk.AccAddress, depositDenom string, claimType types.ClaimType, multiplier types.MultiplierName) error {
|
||||
|
||||
claim, found := k.GetClaim(ctx, claimHolder, depositDenom, depositType)
|
||||
claim, found := k.GetClaim(ctx, claimHolder, depositDenom, claimType)
|
||||
if !found {
|
||||
return sdkerrors.Wrapf(types.ErrClaimNotFound, "no %s %s claim found for %s", depositDenom, depositType, claimHolder)
|
||||
return sdkerrors.Wrapf(types.ErrClaimNotFound, "no %s %s claim found for %s", depositDenom, claimType, claimHolder)
|
||||
}
|
||||
|
||||
err := k.validateSenderReceiver(ctx, claimHolder, receiver)
|
||||
@ -32,13 +32,13 @@ func (k Keeper) ClaimReward(ctx sdk.Context, claimHolder sdk.AccAddress, receive
|
||||
return err
|
||||
}
|
||||
|
||||
switch depositType {
|
||||
switch claimType {
|
||||
case types.LP:
|
||||
err = k.claimLPReward(ctx, claim, receiver, multiplier)
|
||||
case types.Stake:
|
||||
err = k.claimDelegatorReward(ctx, claim, receiver, multiplier)
|
||||
default:
|
||||
return sdkerrors.Wrap(types.ErrInvalidDepositType, string(depositType))
|
||||
return sdkerrors.Wrap(types.ErrInvalidClaimType, string(claimType))
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
@ -49,7 +49,7 @@ func (k Keeper) ClaimReward(ctx sdk.Context, claimHolder sdk.AccAddress, receive
|
||||
sdk.NewAttribute(sdk.AttributeKeyAmount, claim.Amount.String()),
|
||||
sdk.NewAttribute(types.AttributeKeyClaimHolder, claimHolder.String()),
|
||||
sdk.NewAttribute(types.AttributeKeyDepositDenom, depositDenom),
|
||||
sdk.NewAttribute(types.AttributeKeyDepositType, string(depositType)),
|
||||
sdk.NewAttribute(types.AttributeKeyClaimType, string(claimType)),
|
||||
sdk.NewAttribute(types.AttributeKeyClaimMultiplier, string(multiplier)),
|
||||
),
|
||||
)
|
||||
|
@ -20,7 +20,7 @@ func (suite *KeeperTestSuite) TestClaim() {
|
||||
claimOwner sdk.AccAddress
|
||||
receiver sdk.AccAddress
|
||||
denom string
|
||||
depositType types.DepositType
|
||||
claimType types.ClaimType
|
||||
multiplier types.MultiplierName
|
||||
blockTime time.Time
|
||||
createClaim bool
|
||||
@ -47,7 +47,7 @@ func (suite *KeeperTestSuite) TestClaim() {
|
||||
claimOwner: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
receiver: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
denom: "bnb",
|
||||
depositType: types.LP,
|
||||
claimType: types.LP,
|
||||
blockTime: time.Date(2020, 11, 1, 14, 0, 0, 0, time.UTC),
|
||||
createClaim: true,
|
||||
claimAmount: sdk.NewCoin("hard", sdk.NewInt(100)),
|
||||
@ -69,7 +69,7 @@ func (suite *KeeperTestSuite) TestClaim() {
|
||||
claimOwner: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
receiver: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
denom: "bnb",
|
||||
depositType: types.Stake,
|
||||
claimType: types.Stake,
|
||||
blockTime: time.Date(2020, 11, 1, 14, 0, 0, 0, time.UTC),
|
||||
createClaim: true,
|
||||
claimAmount: sdk.NewCoin("hard", sdk.NewInt(100)),
|
||||
@ -91,7 +91,7 @@ func (suite *KeeperTestSuite) TestClaim() {
|
||||
claimOwner: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
receiver: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
denom: "bnb",
|
||||
depositType: types.LP,
|
||||
claimType: types.LP,
|
||||
blockTime: time.Date(2020, 11, 1, 14, 0, 0, 0, time.UTC),
|
||||
createClaim: true,
|
||||
claimAmount: sdk.NewCoin("hard", sdk.NewInt(100)),
|
||||
@ -113,7 +113,7 @@ func (suite *KeeperTestSuite) TestClaim() {
|
||||
claimOwner: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
receiver: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
denom: "bnb",
|
||||
depositType: types.LP,
|
||||
claimType: types.LP,
|
||||
blockTime: time.Date(2020, 11, 1, 14, 0, 0, 0, time.UTC),
|
||||
createClaim: true,
|
||||
claimAmount: sdk.NewCoin("hard", sdk.NewInt(100)),
|
||||
@ -135,7 +135,7 @@ func (suite *KeeperTestSuite) TestClaim() {
|
||||
claimOwner: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
receiver: sdk.AccAddress(crypto.AddressHash([]byte("test2"))),
|
||||
denom: "bnb",
|
||||
depositType: types.LP,
|
||||
claimType: types.LP,
|
||||
blockTime: time.Date(2020, 11, 1, 14, 0, 0, 0, time.UTC),
|
||||
createClaim: true,
|
||||
claimAmount: sdk.NewCoin("hard", sdk.NewInt(100)),
|
||||
@ -157,7 +157,7 @@ func (suite *KeeperTestSuite) TestClaim() {
|
||||
claimOwner: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
receiver: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
denom: "bnb",
|
||||
depositType: types.LP,
|
||||
claimType: types.LP,
|
||||
blockTime: time.Date(2020, 11, 1, 14, 0, 0, 0, time.UTC),
|
||||
createClaim: true,
|
||||
claimAmount: sdk.NewCoin("hard", sdk.NewInt(100)),
|
||||
@ -179,7 +179,7 @@ func (suite *KeeperTestSuite) TestClaim() {
|
||||
claimOwner: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
receiver: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
denom: "bnb",
|
||||
depositType: types.LP,
|
||||
claimType: types.LP,
|
||||
blockTime: time.Date(2020, 11, 1, 14, 0, 0, 0, time.UTC),
|
||||
createClaim: false,
|
||||
claimAmount: sdk.NewCoin("hard", sdk.NewInt(100)),
|
||||
@ -201,7 +201,7 @@ func (suite *KeeperTestSuite) TestClaim() {
|
||||
claimOwner: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
receiver: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
denom: "bnb",
|
||||
depositType: types.LP,
|
||||
claimType: types.LP,
|
||||
blockTime: time.Date(2022, 11, 1, 14, 0, 0, 0, time.UTC),
|
||||
createClaim: true,
|
||||
claimAmount: sdk.NewCoin("hard", sdk.NewInt(100)),
|
||||
@ -223,7 +223,7 @@ func (suite *KeeperTestSuite) TestClaim() {
|
||||
claimOwner: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
receiver: sdk.AccAddress(crypto.AddressHash([]byte("test2"))),
|
||||
denom: "bnb",
|
||||
depositType: types.LP,
|
||||
claimType: types.LP,
|
||||
blockTime: time.Date(2020, 11, 1, 14, 0, 0, 0, time.UTC),
|
||||
createClaim: true,
|
||||
claimAmount: sdk.NewCoin("hard", sdk.NewInt(100)),
|
||||
@ -303,17 +303,17 @@ func (suite *KeeperTestSuite) TestClaim() {
|
||||
suite.keeper = keeper
|
||||
|
||||
if tc.args.createClaim {
|
||||
claim := types.NewClaim(tc.args.claimOwner, tc.args.denom, tc.args.claimAmount, tc.args.depositType)
|
||||
claim := types.NewClaim(tc.args.claimOwner, tc.args.denom, tc.args.claimAmount, tc.args.claimType)
|
||||
suite.Require().NotPanics(func() { suite.keeper.SetClaim(suite.ctx, claim) })
|
||||
}
|
||||
|
||||
err := suite.keeper.ClaimReward(suite.ctx, tc.args.claimOwner, tc.args.receiver, tc.args.denom, tc.args.depositType, tc.args.multiplier)
|
||||
err := suite.keeper.ClaimReward(suite.ctx, tc.args.claimOwner, tc.args.receiver, tc.args.denom, tc.args.claimType, tc.args.multiplier)
|
||||
if tc.errArgs.expectPass {
|
||||
suite.Require().NoError(err)
|
||||
acc := suite.getAccount(tc.args.receiver)
|
||||
suite.Require().Equal(tc.args.expectedAccountBalance, acc.GetCoins())
|
||||
mAcc := suite.getModuleAccount(types.LPAccount)
|
||||
if tc.args.depositType == types.Stake {
|
||||
if tc.args.claimType == types.Stake {
|
||||
mAcc = suite.getModuleAccount(types.DelegatorAccount)
|
||||
}
|
||||
suite.Require().Equal(tc.args.expectedModAccountBalance, mAcc.GetCoins())
|
||||
@ -324,7 +324,7 @@ func (suite *KeeperTestSuite) TestClaim() {
|
||||
} else {
|
||||
suite.Require().False(ok)
|
||||
}
|
||||
_, f := suite.keeper.GetClaim(ctx, tc.args.claimOwner, tc.args.denom, tc.args.depositType)
|
||||
_, f := suite.keeper.GetClaim(ctx, tc.args.claimOwner, tc.args.denom, tc.args.claimType)
|
||||
suite.Require().False(f)
|
||||
} else {
|
||||
suite.Require().Error(err)
|
||||
|
@ -9,26 +9,21 @@ import (
|
||||
)
|
||||
|
||||
// Deposit deposit
|
||||
func (k Keeper) Deposit(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.Coin, depositType types.DepositType) error {
|
||||
func (k Keeper) Deposit(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.Coin) error {
|
||||
|
||||
err := k.ValidateDeposit(ctx, amount, depositType)
|
||||
err := k.ValidateDeposit(ctx, amount)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
switch depositType {
|
||||
case types.LP:
|
||||
err = k.supplyKeeper.SendCoinsFromAccountToModule(ctx, depositor, types.ModuleAccountName, sdk.NewCoins(amount))
|
||||
default:
|
||||
return sdkerrors.Wrap(types.ErrInvalidDepositType, string(depositType))
|
||||
}
|
||||
err = k.supplyKeeper.SendCoinsFromAccountToModule(ctx, depositor, types.ModuleAccountName, sdk.NewCoins(amount))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
deposit, found := k.GetDeposit(ctx, depositor, amount.Denom, depositType)
|
||||
deposit, found := k.GetDeposit(ctx, depositor, amount.Denom)
|
||||
if !found {
|
||||
deposit = types.NewDeposit(depositor, amount, depositType)
|
||||
deposit = types.NewDeposit(depositor, amount)
|
||||
} else {
|
||||
deposit.Amount = deposit.Amount.Add(amount)
|
||||
}
|
||||
@ -41,7 +36,6 @@ func (k Keeper) Deposit(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.Co
|
||||
sdk.NewAttribute(sdk.AttributeKeyAmount, amount.String()),
|
||||
sdk.NewAttribute(types.AttributeKeyDepositor, deposit.Depositor.String()),
|
||||
sdk.NewAttribute(types.AttributeKeyDepositDenom, deposit.Amount.Denom),
|
||||
sdk.NewAttribute(types.AttributeKeyDepositType, string(depositType)),
|
||||
),
|
||||
)
|
||||
|
||||
@ -49,22 +43,7 @@ func (k Keeper) Deposit(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.Co
|
||||
}
|
||||
|
||||
// ValidateDeposit validates a deposit
|
||||
func (k Keeper) ValidateDeposit(ctx sdk.Context, amount sdk.Coin, depositType types.DepositType) error {
|
||||
var err error
|
||||
switch depositType {
|
||||
case types.LP:
|
||||
err = k.ValidateLPDeposit(ctx, amount, depositType)
|
||||
default:
|
||||
return sdkerrors.Wrap(types.ErrInvalidDepositType, string(depositType))
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ValidateLPDeposit validates that a liquidity provider deposit
|
||||
func (k Keeper) ValidateLPDeposit(ctx sdk.Context, amount sdk.Coin, depositType types.DepositType) error {
|
||||
func (k Keeper) ValidateDeposit(ctx sdk.Context, amount sdk.Coin) error {
|
||||
params := k.GetParams(ctx)
|
||||
for _, lps := range params.LiquidityProviderSchedules {
|
||||
if lps.DepositDenom == amount.Denom {
|
||||
@ -75,22 +54,16 @@ func (k Keeper) ValidateLPDeposit(ctx sdk.Context, amount sdk.Coin, depositType
|
||||
}
|
||||
|
||||
// Withdraw returns some or all of a deposit back to original depositor
|
||||
func (k Keeper) Withdraw(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.Coin, depositType types.DepositType) error {
|
||||
deposit, found := k.GetDeposit(ctx, depositor, amount.Denom, depositType)
|
||||
func (k Keeper) Withdraw(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.Coin) error {
|
||||
deposit, found := k.GetDeposit(ctx, depositor, amount.Denom)
|
||||
if !found {
|
||||
return sdkerrors.Wrapf(types.ErrDepositNotFound, "no %s %s deposit found for %s", amount.Denom, depositType, depositor)
|
||||
return sdkerrors.Wrapf(types.ErrDepositNotFound, "no %s deposit found for %s", amount.Denom, depositor)
|
||||
}
|
||||
if !deposit.Amount.IsGTE(amount) {
|
||||
return sdkerrors.Wrapf(types.ErrInvaliWithdrawAmount, "%s>%s", amount, deposit.Amount)
|
||||
return sdkerrors.Wrapf(types.ErrInvalidWithdrawAmount, "%s>%s", amount, deposit.Amount)
|
||||
}
|
||||
|
||||
var err error
|
||||
switch depositType {
|
||||
case types.LP:
|
||||
err = k.supplyKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleAccountName, depositor, sdk.NewCoins(amount))
|
||||
default:
|
||||
return sdkerrors.Wrap(types.ErrInvalidDepositType, string(depositType))
|
||||
}
|
||||
err := k.supplyKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleAccountName, depositor, sdk.NewCoins(amount))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -101,7 +74,6 @@ func (k Keeper) Withdraw(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.C
|
||||
sdk.NewAttribute(sdk.AttributeKeyAmount, amount.String()),
|
||||
sdk.NewAttribute(types.AttributeKeyDepositor, depositor.String()),
|
||||
sdk.NewAttribute(types.AttributeKeyDepositDenom, amount.Denom),
|
||||
sdk.NewAttribute(types.AttributeKeyDepositType, string(depositType)),
|
||||
),
|
||||
)
|
||||
|
||||
@ -111,7 +83,6 @@ func (k Keeper) Withdraw(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.C
|
||||
types.EventTypeDeleteHarvestDeposit,
|
||||
sdk.NewAttribute(types.AttributeKeyDepositor, depositor.String()),
|
||||
sdk.NewAttribute(types.AttributeKeyDepositDenom, amount.Denom),
|
||||
sdk.NewAttribute(types.AttributeKeyDepositType, string(depositType)),
|
||||
),
|
||||
)
|
||||
k.DeleteDeposit(ctx, deposit)
|
||||
@ -125,12 +96,8 @@ func (k Keeper) Withdraw(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.C
|
||||
}
|
||||
|
||||
// GetTotalDeposited returns the total amount deposited for the input deposit type and deposit denom
|
||||
func (k Keeper) GetTotalDeposited(ctx sdk.Context, depositType types.DepositType, depositDenom string) (total sdk.Int) {
|
||||
|
||||
func (k Keeper) GetTotalDeposited(ctx sdk.Context, depositDenom string) (total sdk.Int) {
|
||||
var macc supplyExported.ModuleAccountI
|
||||
switch depositType {
|
||||
case types.LP:
|
||||
macc = k.supplyKeeper.GetModuleAccount(ctx, types.ModuleAccountName)
|
||||
}
|
||||
macc = k.supplyKeeper.GetModuleAccount(ctx, types.ModuleAccountName)
|
||||
return macc.GetCoins().AmountOf(depositDenom)
|
||||
}
|
||||
|
@ -17,7 +17,6 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
||||
type args struct {
|
||||
depositor sdk.AccAddress
|
||||
amount sdk.Coin
|
||||
depositType types.DepositType
|
||||
numberDeposits int
|
||||
expectedAccountBalance sdk.Coins
|
||||
expectedModAccountBalance sdk.Coins
|
||||
@ -37,7 +36,6 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
||||
args{
|
||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
amount: sdk.NewCoin("bnb", sdk.NewInt(100)),
|
||||
depositType: types.LP,
|
||||
numberDeposits: 1,
|
||||
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(900)), sdk.NewCoin("btcb", sdk.NewInt(1000))),
|
||||
expectedModAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(100))),
|
||||
@ -52,7 +50,6 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
||||
args{
|
||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
amount: sdk.NewCoin("bnb", sdk.NewInt(100)),
|
||||
depositType: types.LP,
|
||||
numberDeposits: 2,
|
||||
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(800)), sdk.NewCoin("btcb", sdk.NewInt(1000))),
|
||||
expectedModAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(200))),
|
||||
@ -62,27 +59,11 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
||||
contains: "",
|
||||
},
|
||||
},
|
||||
{
|
||||
"invalid deposit type",
|
||||
args{
|
||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
amount: sdk.NewCoin("bnb", sdk.NewInt(100)),
|
||||
depositType: types.Stake,
|
||||
numberDeposits: 1,
|
||||
expectedAccountBalance: sdk.Coins{},
|
||||
expectedModAccountBalance: sdk.Coins{},
|
||||
},
|
||||
errArgs{
|
||||
expectPass: false,
|
||||
contains: "invalid deposit type",
|
||||
},
|
||||
},
|
||||
{
|
||||
"invalid deposit denom",
|
||||
args{
|
||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
amount: sdk.NewCoin("btcb", sdk.NewInt(100)),
|
||||
depositType: types.LP,
|
||||
numberDeposits: 1,
|
||||
expectedAccountBalance: sdk.Coins{},
|
||||
expectedModAccountBalance: sdk.Coins{},
|
||||
@ -97,7 +78,6 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
||||
args{
|
||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000)),
|
||||
depositType: types.LP,
|
||||
numberDeposits: 1,
|
||||
expectedAccountBalance: sdk.Coins{},
|
||||
expectedModAccountBalance: sdk.Coins{},
|
||||
@ -141,7 +121,7 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
||||
// run the test
|
||||
var err error
|
||||
for i := 0; i < tc.args.numberDeposits; i++ {
|
||||
err = suite.keeper.Deposit(suite.ctx, tc.args.depositor, tc.args.amount, tc.args.depositType)
|
||||
err = suite.keeper.Deposit(suite.ctx, tc.args.depositor, tc.args.amount)
|
||||
}
|
||||
|
||||
// verify results
|
||||
@ -151,7 +131,7 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
||||
suite.Require().Equal(tc.args.expectedAccountBalance, acc.GetCoins())
|
||||
mAcc := suite.getModuleAccount(types.ModuleAccountName)
|
||||
suite.Require().Equal(tc.args.expectedModAccountBalance, mAcc.GetCoins())
|
||||
_, f := suite.keeper.GetDeposit(suite.ctx, tc.args.depositor, tc.args.amount.Denom, tc.args.depositType)
|
||||
_, f := suite.keeper.GetDeposit(suite.ctx, tc.args.depositor, tc.args.amount.Denom)
|
||||
suite.Require().True(f)
|
||||
} else {
|
||||
suite.Require().Error(err)
|
||||
@ -166,8 +146,6 @@ func (suite *KeeperTestSuite) TestWithdraw() {
|
||||
depositor sdk.AccAddress
|
||||
depositAmount sdk.Coin
|
||||
withdrawAmount sdk.Coin
|
||||
depositType types.DepositType
|
||||
withdrawType types.DepositType
|
||||
createDeposit bool
|
||||
expectedAccountBalance sdk.Coins
|
||||
expectedModAccountBalance sdk.Coins
|
||||
@ -190,8 +168,6 @@ func (suite *KeeperTestSuite) TestWithdraw() {
|
||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
depositAmount: sdk.NewCoin("bnb", sdk.NewInt(200)),
|
||||
withdrawAmount: sdk.NewCoin("bnb", sdk.NewInt(100)),
|
||||
depositType: types.LP,
|
||||
withdrawType: types.LP,
|
||||
createDeposit: true,
|
||||
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(900)), sdk.NewCoin("btcb", sdk.NewInt(1000))),
|
||||
expectedModAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(100))),
|
||||
@ -209,8 +185,6 @@ func (suite *KeeperTestSuite) TestWithdraw() {
|
||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
depositAmount: sdk.NewCoin("bnb", sdk.NewInt(200)),
|
||||
withdrawAmount: sdk.NewCoin("bnb", sdk.NewInt(200)),
|
||||
depositType: types.LP,
|
||||
withdrawType: types.LP,
|
||||
createDeposit: true,
|
||||
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(1000)), sdk.NewCoin("btcb", sdk.NewInt(1000))),
|
||||
expectedModAccountBalance: sdk.Coins(nil),
|
||||
@ -228,27 +202,6 @@ func (suite *KeeperTestSuite) TestWithdraw() {
|
||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
depositAmount: sdk.NewCoin("bnb", sdk.NewInt(200)),
|
||||
withdrawAmount: sdk.NewCoin("btcb", sdk.NewInt(200)),
|
||||
depositType: types.LP,
|
||||
withdrawType: types.LP,
|
||||
createDeposit: true,
|
||||
expectedAccountBalance: sdk.Coins{},
|
||||
expectedModAccountBalance: sdk.Coins{},
|
||||
depositExists: false,
|
||||
finalDepositAmount: sdk.Coin{},
|
||||
},
|
||||
errArgs{
|
||||
expectPass: false,
|
||||
contains: "deposit not found",
|
||||
},
|
||||
},
|
||||
{
|
||||
"deposit not found invalid deposit type",
|
||||
args{
|
||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
depositAmount: sdk.NewCoin("bnb", sdk.NewInt(200)),
|
||||
withdrawAmount: sdk.NewCoin("bnb", sdk.NewInt(200)),
|
||||
depositType: types.LP,
|
||||
withdrawType: types.Stake,
|
||||
createDeposit: true,
|
||||
expectedAccountBalance: sdk.Coins{},
|
||||
expectedModAccountBalance: sdk.Coins{},
|
||||
@ -266,8 +219,6 @@ func (suite *KeeperTestSuite) TestWithdraw() {
|
||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||
depositAmount: sdk.NewCoin("bnb", sdk.NewInt(200)),
|
||||
withdrawAmount: sdk.NewCoin("bnb", sdk.NewInt(300)),
|
||||
depositType: types.LP,
|
||||
withdrawType: types.LP,
|
||||
createDeposit: true,
|
||||
expectedAccountBalance: sdk.Coins{},
|
||||
expectedModAccountBalance: sdk.Coins{},
|
||||
@ -311,11 +262,11 @@ func (suite *KeeperTestSuite) TestWithdraw() {
|
||||
suite.keeper = keeper
|
||||
|
||||
if tc.args.createDeposit {
|
||||
err := suite.keeper.Deposit(suite.ctx, tc.args.depositor, tc.args.depositAmount, tc.args.depositType)
|
||||
err := suite.keeper.Deposit(suite.ctx, tc.args.depositor, tc.args.depositAmount)
|
||||
suite.Require().NoError(err)
|
||||
}
|
||||
|
||||
err := suite.keeper.Withdraw(suite.ctx, tc.args.depositor, tc.args.withdrawAmount, tc.args.withdrawType)
|
||||
err := suite.keeper.Withdraw(suite.ctx, tc.args.depositor, tc.args.withdrawAmount)
|
||||
|
||||
if tc.errArgs.expectPass {
|
||||
suite.Require().NoError(err)
|
||||
@ -323,7 +274,7 @@ func (suite *KeeperTestSuite) TestWithdraw() {
|
||||
suite.Require().Equal(tc.args.expectedAccountBalance, acc.GetCoins())
|
||||
mAcc := suite.getModuleAccount(types.ModuleAccountName)
|
||||
suite.Require().Equal(tc.args.expectedModAccountBalance, mAcc.GetCoins())
|
||||
testDeposit, f := suite.keeper.GetDeposit(suite.ctx, tc.args.depositor, tc.args.depositAmount.Denom, tc.args.depositType)
|
||||
testDeposit, f := suite.keeper.GetDeposit(suite.ctx, tc.args.depositor, tc.args.depositAmount.Denom)
|
||||
if tc.args.depositExists {
|
||||
suite.Require().True(f)
|
||||
suite.Require().Equal(tc.args.finalDepositAmount, testDeposit.Amount)
|
||||
|
@ -75,10 +75,10 @@ func (k Keeper) SetPreviousDelegationDistribution(ctx sdk.Context, distTime time
|
||||
store.Set([]byte(denom), k.cdc.MustMarshalBinaryBare(distTime))
|
||||
}
|
||||
|
||||
// GetDeposit returns a deposit from the store for a particular depositor address, deposit denom, and deposit type
|
||||
func (k Keeper) GetDeposit(ctx sdk.Context, depositor sdk.AccAddress, denom string, depositType types.DepositType) (types.Deposit, bool) {
|
||||
// GetDeposit returns a deposit from the store for a particular depositor address, deposit denom
|
||||
func (k Keeper) GetDeposit(ctx sdk.Context, depositor sdk.AccAddress, denom string) (types.Deposit, bool) {
|
||||
store := prefix.NewStore(ctx.KVStore(k.key), types.DepositsKeyPrefix)
|
||||
bz := store.Get(types.DepositKey(depositType, denom, depositor))
|
||||
bz := store.Get(types.DepositKey(denom, depositor))
|
||||
if bz == nil {
|
||||
return types.Deposit{}, false
|
||||
}
|
||||
@ -91,13 +91,13 @@ func (k Keeper) GetDeposit(ctx sdk.Context, depositor sdk.AccAddress, denom stri
|
||||
func (k Keeper) SetDeposit(ctx sdk.Context, deposit types.Deposit) {
|
||||
store := prefix.NewStore(ctx.KVStore(k.key), types.DepositsKeyPrefix)
|
||||
bz := k.cdc.MustMarshalBinaryBare(deposit)
|
||||
store.Set(types.DepositKey(deposit.Type, deposit.Amount.Denom, deposit.Depositor), bz)
|
||||
store.Set(types.DepositKey(deposit.Amount.Denom, deposit.Depositor), bz)
|
||||
}
|
||||
|
||||
// DeleteDeposit deletes a deposit from the store
|
||||
func (k Keeper) DeleteDeposit(ctx sdk.Context, deposit types.Deposit) {
|
||||
store := prefix.NewStore(ctx.KVStore(k.key), types.DepositsKeyPrefix)
|
||||
store.Delete(types.DepositKey(deposit.Type, deposit.Amount.Denom, deposit.Depositor))
|
||||
store.Delete(types.DepositKey(deposit.Amount.Denom, deposit.Depositor))
|
||||
}
|
||||
|
||||
// IterateDeposits iterates over all deposit objects in the store and performs a callback function
|
||||
@ -114,11 +114,10 @@ func (k Keeper) IterateDeposits(ctx sdk.Context, cb func(deposit types.Deposit)
|
||||
}
|
||||
}
|
||||
|
||||
// IterateDepositsByTypeAndDenom iterates over all deposit objects in the store with the matching deposit type and deposit denom and performs a callback function
|
||||
func (k Keeper) IterateDepositsByTypeAndDenom(ctx sdk.Context, depositType types.DepositType, depositDenom string, cb func(deposit types.Deposit) (stop bool)) {
|
||||
|
||||
// IterateDepositsByDenom iterates over all deposit objects in the store with the matching deposit denom and performs a callback function
|
||||
func (k Keeper) IterateDepositsByDenom(ctx sdk.Context, depositDenom string, cb func(deposit types.Deposit) (stop bool)) {
|
||||
store := prefix.NewStore(ctx.KVStore(k.key), types.DepositsKeyPrefix)
|
||||
iterator := sdk.KVStorePrefixIterator(store, types.DepositTypeIteratorKey(depositType, depositDenom))
|
||||
iterator := sdk.KVStorePrefixIterator(store, types.DepositTypeIteratorKey(depositDenom))
|
||||
defer iterator.Close()
|
||||
for ; iterator.Valid(); iterator.Next() {
|
||||
var deposit types.Deposit
|
||||
@ -129,10 +128,10 @@ func (k Keeper) IterateDepositsByTypeAndDenom(ctx sdk.Context, depositType types
|
||||
}
|
||||
}
|
||||
|
||||
// GetClaim returns a claim from the store for a particular claim owner, deposit denom, and deposit type
|
||||
func (k Keeper) GetClaim(ctx sdk.Context, owner sdk.AccAddress, depositDenom string, depositType types.DepositType) (types.Claim, bool) {
|
||||
// GetClaim returns a claim from the store for a particular claim owner, deposit denom, and claim type
|
||||
func (k Keeper) GetClaim(ctx sdk.Context, owner sdk.AccAddress, depositDenom string, claimType types.ClaimType) (types.Claim, bool) {
|
||||
store := prefix.NewStore(ctx.KVStore(k.key), types.ClaimsKeyPrefix)
|
||||
bz := store.Get(types.ClaimKey(depositType, depositDenom, owner))
|
||||
bz := store.Get(types.ClaimKey(claimType, depositDenom, owner))
|
||||
if bz == nil {
|
||||
return types.Claim{}, false
|
||||
}
|
||||
@ -168,10 +167,10 @@ func (k Keeper) IterateClaims(ctx sdk.Context, cb func(claim types.Claim) (stop
|
||||
}
|
||||
}
|
||||
|
||||
// IterateClaimsByTypeAndDenom iterates over all claim objects in the store with the matching deposit type and deposit denom and performs a callback function
|
||||
func (k Keeper) IterateClaimsByTypeAndDenom(ctx sdk.Context, depositType types.DepositType, depositDenom string, cb func(claim types.Claim) (stop bool)) {
|
||||
// IterateClaimsByTypeAndDenom iterates over all claim objects in the store with the matching claim type and deposit denom and performs a callback function
|
||||
func (k Keeper) IterateClaimsByTypeAndDenom(ctx sdk.Context, claimType types.ClaimType, depositDenom string, cb func(claim types.Claim) (stop bool)) {
|
||||
store := prefix.NewStore(ctx.KVStore(k.key), types.ClaimsKeyPrefix)
|
||||
iterator := sdk.KVStorePrefixIterator(store, types.DepositTypeIteratorKey(depositType, depositDenom))
|
||||
iterator := sdk.KVStorePrefixIterator(store, types.ClaimTypeIteratorKey(claimType, depositDenom))
|
||||
defer iterator.Close()
|
||||
for ; iterator.Valid(); iterator.Next() {
|
||||
var claim types.Claim
|
||||
|
@ -72,27 +72,27 @@ func (suite *KeeperTestSuite) TestGetSetPreviousDelegatorDistribution() {
|
||||
}
|
||||
|
||||
func (suite *KeeperTestSuite) TestGetSetDeleteDeposit() {
|
||||
dep := types.NewDeposit(sdk.AccAddress("test"), sdk.NewCoin("bnb", sdk.NewInt(100)), "lp")
|
||||
dep := types.NewDeposit(sdk.AccAddress("test"), sdk.NewCoin("bnb", sdk.NewInt(100)))
|
||||
|
||||
_, f := suite.keeper.GetDeposit(suite.ctx, sdk.AccAddress("test"), "bnb", "lp")
|
||||
_, f := suite.keeper.GetDeposit(suite.ctx, sdk.AccAddress("test"), "bnb")
|
||||
suite.Require().False(f)
|
||||
|
||||
suite.keeper.SetDeposit(suite.ctx, dep)
|
||||
|
||||
testDeposit, f := suite.keeper.GetDeposit(suite.ctx, sdk.AccAddress("test"), "bnb", "lp")
|
||||
testDeposit, f := suite.keeper.GetDeposit(suite.ctx, sdk.AccAddress("test"), "bnb")
|
||||
suite.Require().True(f)
|
||||
suite.Require().Equal(dep, testDeposit)
|
||||
|
||||
suite.Require().NotPanics(func() { suite.keeper.DeleteDeposit(suite.ctx, dep) })
|
||||
|
||||
_, f = suite.keeper.GetDeposit(suite.ctx, sdk.AccAddress("test"), "bnb", "lp")
|
||||
_, f = suite.keeper.GetDeposit(suite.ctx, sdk.AccAddress("test"), "bnb")
|
||||
suite.Require().False(f)
|
||||
|
||||
}
|
||||
|
||||
func (suite *KeeperTestSuite) TestIterateDeposits() {
|
||||
for i := 0; i < 5; i++ {
|
||||
dep := types.NewDeposit(sdk.AccAddress("test"+string(i)), sdk.NewCoin("bnb", sdk.NewInt(100)), "lp")
|
||||
dep := types.NewDeposit(sdk.AccAddress("test"+string(i)), sdk.NewCoin("bnb", sdk.NewInt(100)))
|
||||
suite.Require().NotPanics(func() { suite.keeper.SetDeposit(suite.ctx, dep) })
|
||||
}
|
||||
var deposits []types.Deposit
|
||||
@ -103,39 +103,39 @@ func (suite *KeeperTestSuite) TestIterateDeposits() {
|
||||
suite.Require().Equal(5, len(deposits))
|
||||
}
|
||||
|
||||
func (suite *KeeperTestSuite) TestIterateDepositsByTypeAndDenom() {
|
||||
func (suite *KeeperTestSuite) TestIterateDepositsByDenom() {
|
||||
for i := 0; i < 5; i++ {
|
||||
depA := types.NewDeposit(sdk.AccAddress("test"+string(i)), sdk.NewCoin("bnb", sdk.NewInt(100)), "lp")
|
||||
depA := types.NewDeposit(sdk.AccAddress("test"+string(i)), sdk.NewCoin("bnb", sdk.NewInt(100)))
|
||||
suite.Require().NotPanics(func() { suite.keeper.SetDeposit(suite.ctx, depA) })
|
||||
depB := types.NewDeposit(sdk.AccAddress("test"+string(i)), sdk.NewCoin("bnb", sdk.NewInt(100)), "gov")
|
||||
depB := types.NewDeposit(sdk.AccAddress("test"+string(i)), sdk.NewCoin("bnb", sdk.NewInt(100)))
|
||||
suite.Require().NotPanics(func() { suite.keeper.SetDeposit(suite.ctx, depB) })
|
||||
depC := types.NewDeposit(sdk.AccAddress("test"+string(i)), sdk.NewCoin("btcb", sdk.NewInt(100)), "lp")
|
||||
depC := types.NewDeposit(sdk.AccAddress("test"+string(i)), sdk.NewCoin("btcb", sdk.NewInt(100)))
|
||||
suite.Require().NotPanics(func() { suite.keeper.SetDeposit(suite.ctx, depC) })
|
||||
}
|
||||
var bnbLPDeposits []types.Deposit
|
||||
suite.keeper.IterateDepositsByTypeAndDenom(suite.ctx, "lp", "bnb", func(d types.Deposit) bool {
|
||||
bnbLPDeposits = append(bnbLPDeposits, d)
|
||||
|
||||
// Check BNB deposits
|
||||
var bnbDeposits []types.Deposit
|
||||
suite.keeper.IterateDepositsByDenom(suite.ctx, "bnb", func(d types.Deposit) bool {
|
||||
bnbDeposits = append(bnbDeposits, d)
|
||||
return false
|
||||
})
|
||||
suite.Require().Equal(5, len(bnbLPDeposits))
|
||||
var bnbGovDeposits []types.Deposit
|
||||
suite.keeper.IterateDepositsByTypeAndDenom(suite.ctx, "gov", "bnb", func(d types.Deposit) bool {
|
||||
bnbGovDeposits = append(bnbGovDeposits, d)
|
||||
suite.Require().Equal(5, len(bnbDeposits))
|
||||
|
||||
// Check BTCB deposits
|
||||
var btcbDeposits []types.Deposit
|
||||
suite.keeper.IterateDepositsByDenom(suite.ctx, "btcb", func(d types.Deposit) bool {
|
||||
btcbDeposits = append(btcbDeposits, d)
|
||||
return false
|
||||
})
|
||||
suite.Require().Equal(5, len(bnbGovDeposits))
|
||||
var btcbLPDeposits []types.Deposit
|
||||
suite.keeper.IterateDepositsByTypeAndDenom(suite.ctx, "lp", "btcb", func(d types.Deposit) bool {
|
||||
btcbLPDeposits = append(btcbLPDeposits, d)
|
||||
return false
|
||||
})
|
||||
suite.Require().Equal(5, len(btcbLPDeposits))
|
||||
suite.Require().Equal(5, len(btcbDeposits))
|
||||
|
||||
// Fetch all deposits
|
||||
var deposits []types.Deposit
|
||||
suite.keeper.IterateDeposits(suite.ctx, func(d types.Deposit) bool {
|
||||
deposits = append(deposits, d)
|
||||
return false
|
||||
})
|
||||
suite.Require().Equal(15, len(deposits))
|
||||
suite.Require().Equal(len(bnbDeposits)+len(btcbDeposits), len(deposits))
|
||||
}
|
||||
|
||||
func (suite *KeeperTestSuite) TestGetSetDeleteClaim() {
|
||||
|
@ -84,59 +84,26 @@ func queryGetDeposits(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte,
|
||||
}
|
||||
depositDenom := len(params.DepositDenom) > 0
|
||||
owner := len(params.Owner) > 0
|
||||
depositType := len(params.DepositType) > 0
|
||||
|
||||
var deposits []types.Deposit
|
||||
switch {
|
||||
case depositDenom && owner && depositType:
|
||||
deposit, found := k.GetDeposit(ctx, params.Owner, params.DepositDenom, params.DepositType)
|
||||
case depositDenom && owner:
|
||||
deposit, found := k.GetDeposit(ctx, params.Owner, params.DepositDenom)
|
||||
if found {
|
||||
deposits = append(deposits, deposit)
|
||||
}
|
||||
case depositDenom && owner:
|
||||
for _, dt := range types.DepositTypesDepositQuery {
|
||||
deposit, found := k.GetDeposit(ctx, params.Owner, params.DepositDenom, dt)
|
||||
if found {
|
||||
deposits = append(deposits, deposit)
|
||||
}
|
||||
}
|
||||
case depositDenom && depositType:
|
||||
k.IterateDepositsByTypeAndDenom(ctx, params.DepositType, params.DepositDenom, func(deposit types.Deposit) (stop bool) {
|
||||
case depositDenom:
|
||||
k.IterateDepositsByDenom(ctx, params.DepositDenom, func(deposit types.Deposit) (stop bool) {
|
||||
deposits = append(deposits, deposit)
|
||||
return false
|
||||
})
|
||||
case owner && depositType:
|
||||
schedules := k.GetParams(ctx).LiquidityProviderSchedules
|
||||
for _, lps := range schedules {
|
||||
deposit, found := k.GetDeposit(ctx, params.Owner, lps.DepositDenom, params.DepositType)
|
||||
if found {
|
||||
deposits = append(deposits, deposit)
|
||||
}
|
||||
}
|
||||
case depositDenom:
|
||||
for _, dt := range types.DepositTypesDepositQuery {
|
||||
k.IterateDepositsByTypeAndDenom(ctx, dt, params.DepositDenom, func(deposit types.Deposit) (stop bool) {
|
||||
deposits = append(deposits, deposit)
|
||||
return false
|
||||
})
|
||||
}
|
||||
case owner:
|
||||
schedules := k.GetParams(ctx).LiquidityProviderSchedules
|
||||
for _, lps := range schedules {
|
||||
for _, dt := range types.DepositTypesDepositQuery {
|
||||
deposit, found := k.GetDeposit(ctx, params.Owner, lps.DepositDenom, dt)
|
||||
if found {
|
||||
deposits = append(deposits, deposit)
|
||||
}
|
||||
}
|
||||
}
|
||||
case depositType:
|
||||
schedules := k.GetParams(ctx).LiquidityProviderSchedules
|
||||
for _, lps := range schedules {
|
||||
k.IterateDepositsByTypeAndDenom(ctx, params.DepositType, lps.DepositDenom, func(deposit types.Deposit) (stop bool) {
|
||||
deposit, found := k.GetDeposit(ctx, params.Owner, lps.DepositDenom)
|
||||
if found {
|
||||
deposits = append(deposits, deposit)
|
||||
return false
|
||||
})
|
||||
}
|
||||
}
|
||||
default:
|
||||
k.IterateDeposits(ctx, func(deposit types.Deposit) (stop bool) {
|
||||
@ -169,47 +136,47 @@ func queryGetClaims(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, e
|
||||
}
|
||||
depositDenom := len(params.DepositDenom) > 0
|
||||
owner := len(params.Owner) > 0
|
||||
depositType := len(params.DepositType) > 0
|
||||
claimType := len(params.ClaimType) > 0
|
||||
|
||||
var claims []types.Claim
|
||||
switch {
|
||||
case depositDenom && owner && depositType:
|
||||
claim, found := k.GetClaim(ctx, params.Owner, params.DepositDenom, params.DepositType)
|
||||
case depositDenom && owner && claimType:
|
||||
claim, found := k.GetClaim(ctx, params.Owner, params.DepositDenom, params.ClaimType)
|
||||
if found {
|
||||
claims = append(claims, claim)
|
||||
}
|
||||
case depositDenom && owner:
|
||||
for _, dt := range types.DepositTypesClaimQuery {
|
||||
for _, dt := range types.ClaimTypesClaimQuery {
|
||||
claim, found := k.GetClaim(ctx, params.Owner, params.DepositDenom, dt)
|
||||
if found {
|
||||
claims = append(claims, claim)
|
||||
}
|
||||
}
|
||||
case depositDenom && depositType:
|
||||
k.IterateClaimsByTypeAndDenom(ctx, params.DepositType, params.DepositDenom, func(claim types.Claim) (stop bool) {
|
||||
case depositDenom && claimType:
|
||||
k.IterateClaimsByTypeAndDenom(ctx, params.ClaimType, params.DepositDenom, func(claim types.Claim) (stop bool) {
|
||||
claims = append(claims, claim)
|
||||
return false
|
||||
})
|
||||
case owner && depositType:
|
||||
case owner && claimType:
|
||||
harvestParams := k.GetParams(ctx)
|
||||
switch {
|
||||
case params.DepositType == types.LP:
|
||||
case params.ClaimType == types.LP:
|
||||
for _, lps := range harvestParams.LiquidityProviderSchedules {
|
||||
claim, found := k.GetClaim(ctx, params.Owner, lps.DepositDenom, params.DepositType)
|
||||
claim, found := k.GetClaim(ctx, params.Owner, lps.DepositDenom, params.ClaimType)
|
||||
if found {
|
||||
claims = append(claims, claim)
|
||||
}
|
||||
}
|
||||
case params.DepositType == types.Stake:
|
||||
case params.ClaimType == types.Stake:
|
||||
for _, dss := range harvestParams.DelegatorDistributionSchedules {
|
||||
claim, found := k.GetClaim(ctx, params.Owner, dss.DistributionSchedule.DepositDenom, params.DepositType)
|
||||
claim, found := k.GetClaim(ctx, params.Owner, dss.DistributionSchedule.DepositDenom, params.ClaimType)
|
||||
if found {
|
||||
claims = append(claims, claim)
|
||||
}
|
||||
}
|
||||
}
|
||||
case depositDenom:
|
||||
for _, dt := range types.DepositTypesClaimQuery {
|
||||
for _, dt := range types.ClaimTypesClaimQuery {
|
||||
k.IterateClaimsByTypeAndDenom(ctx, dt, params.DepositDenom, func(claim types.Claim) (stop bool) {
|
||||
claims = append(claims, claim)
|
||||
return false
|
||||
@ -229,16 +196,16 @@ func queryGetClaims(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, e
|
||||
claims = append(claims, claim)
|
||||
}
|
||||
}
|
||||
case depositType:
|
||||
case claimType:
|
||||
harvestParams := k.GetParams(ctx)
|
||||
for _, lps := range harvestParams.LiquidityProviderSchedules {
|
||||
k.IterateClaimsByTypeAndDenom(ctx, params.DepositType, lps.DepositDenom, func(claim types.Claim) (stop bool) {
|
||||
k.IterateClaimsByTypeAndDenom(ctx, params.ClaimType, lps.DepositDenom, func(claim types.Claim) (stop bool) {
|
||||
claims = append(claims, claim)
|
||||
return false
|
||||
})
|
||||
}
|
||||
for _, dds := range harvestParams.DelegatorDistributionSchedules {
|
||||
k.IterateClaimsByTypeAndDenom(ctx, params.DepositType, dds.DistributionSchedule.DepositDenom, func(claim types.Claim) (stop bool) {
|
||||
k.IterateClaimsByTypeAndDenom(ctx, params.ClaimType, dds.DistributionSchedule.DepositDenom, func(claim types.Claim) (stop bool) {
|
||||
claims = append(claims, claim)
|
||||
return false
|
||||
})
|
||||
|
@ -34,7 +34,7 @@ func (k Keeper) ApplyDepositRewards(ctx sdk.Context) {
|
||||
if lps.Start.After(ctx.BlockTime()) {
|
||||
continue
|
||||
}
|
||||
totalDeposited := k.GetTotalDeposited(ctx, types.LP, lps.DepositDenom)
|
||||
totalDeposited := k.GetTotalDeposited(ctx, lps.DepositDenom)
|
||||
if totalDeposited.IsZero() {
|
||||
continue
|
||||
}
|
||||
@ -43,7 +43,7 @@ func (k Keeper) ApplyDepositRewards(ctx sdk.Context) {
|
||||
continue
|
||||
}
|
||||
rewardsDistributed := sdk.ZeroInt()
|
||||
k.IterateDepositsByTypeAndDenom(ctx, types.LP, lps.DepositDenom, func(dep types.Deposit) (stop bool) {
|
||||
k.IterateDepositsByDenom(ctx, lps.DepositDenom, func(dep types.Deposit) (stop bool) {
|
||||
rewardsShare := sdk.NewDecFromInt(dep.Amount.Amount).Quo(sdk.NewDecFromInt(totalDeposited))
|
||||
if rewardsShare.IsZero() {
|
||||
return false
|
||||
@ -52,7 +52,7 @@ func (k Keeper) ApplyDepositRewards(ctx sdk.Context) {
|
||||
if rewardsEarned.IsZero() {
|
||||
return false
|
||||
}
|
||||
k.AddToClaim(ctx, dep.Depositor, dep.Amount.Denom, dep.Type, sdk.NewCoin(lps.RewardsPerSecond.Denom, rewardsEarned))
|
||||
k.AddToClaim(ctx, dep.Depositor, dep.Amount.Denom, types.LP, sdk.NewCoin(lps.RewardsPerSecond.Denom, rewardsEarned))
|
||||
rewardsDistributed = rewardsDistributed.Add(rewardsEarned)
|
||||
return false
|
||||
})
|
||||
@ -164,10 +164,10 @@ func (k Keeper) ApplyDelegationRewards(ctx sdk.Context, denom string) {
|
||||
}
|
||||
|
||||
// AddToClaim adds the input amount to an existing claim or creates a new one
|
||||
func (k Keeper) AddToClaim(ctx sdk.Context, owner sdk.AccAddress, depositDenom string, depositType types.DepositType, amountToAdd sdk.Coin) {
|
||||
claim, found := k.GetClaim(ctx, owner, depositDenom, depositType)
|
||||
func (k Keeper) AddToClaim(ctx sdk.Context, owner sdk.AccAddress, depositDenom string, claimType types.ClaimType, amountToAdd sdk.Coin) {
|
||||
claim, found := k.GetClaim(ctx, owner, depositDenom, claimType)
|
||||
if !found {
|
||||
claim = types.NewClaim(owner, depositDenom, amountToAdd, depositType)
|
||||
claim = types.NewClaim(owner, depositDenom, amountToAdd, claimType)
|
||||
} else {
|
||||
claim.Amount = claim.Amount.Add(amountToAdd)
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ func (suite *KeeperTestSuite) TestApplyDepositRewards() {
|
||||
depositAmount sdk.Coin
|
||||
totalDeposits sdk.Coin
|
||||
rewardRate sdk.Coin
|
||||
depositType types.DepositType
|
||||
claimType types.ClaimType
|
||||
previousBlockTime time.Time
|
||||
blockTime time.Time
|
||||
expectedClaimBalance sdk.Coin
|
||||
@ -47,7 +47,7 @@ func (suite *KeeperTestSuite) TestApplyDepositRewards() {
|
||||
rewardRate: c("hard", 500),
|
||||
depositAmount: c("bnb", 100),
|
||||
totalDeposits: c("bnb", 1000),
|
||||
depositType: types.LP,
|
||||
claimType: types.LP,
|
||||
previousBlockTime: time.Date(2020, 11, 1, 13, 59, 50, 0, time.UTC),
|
||||
blockTime: time.Date(2020, 11, 1, 14, 0, 0, 0, time.UTC),
|
||||
expectedClaimBalance: c("hard", 500),
|
||||
@ -83,7 +83,7 @@ func (suite *KeeperTestSuite) TestApplyDepositRewards() {
|
||||
supplyKeeper := tApp.GetSupplyKeeper()
|
||||
supplyKeeper.MintCoins(ctx, types.ModuleAccountName, cs(tc.args.totalDeposits))
|
||||
keeper := tApp.GetHarvestKeeper()
|
||||
deposit := types.NewDeposit(tc.args.depositor, tc.args.depositAmount, tc.args.depositType)
|
||||
deposit := types.NewDeposit(tc.args.depositor, tc.args.depositAmount)
|
||||
keeper.SetDeposit(ctx, deposit)
|
||||
suite.app = tApp
|
||||
suite.ctx = ctx
|
||||
@ -93,7 +93,7 @@ func (suite *KeeperTestSuite) TestApplyDepositRewards() {
|
||||
suite.Require().Panics(func() { suite.keeper.ApplyDepositRewards(suite.ctx) })
|
||||
} else {
|
||||
suite.Require().NotPanics(func() { suite.keeper.ApplyDepositRewards(suite.ctx) })
|
||||
claim, f := suite.keeper.GetClaim(suite.ctx, tc.args.depositor, tc.args.denom, tc.args.depositType)
|
||||
claim, f := suite.keeper.GetClaim(suite.ctx, tc.args.depositor, tc.args.denom, tc.args.claimType)
|
||||
suite.Require().True(f)
|
||||
suite.Require().Equal(tc.args.expectedClaimBalance, claim.Amount)
|
||||
}
|
||||
|
391
x/harvest/legacy/v0_12/types.go
Normal file
391
x/harvest/legacy/v0_12/types.go
Normal file
@ -0,0 +1,391 @@
|
||||
package v0_12
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/x/auth/vesting"
|
||||
"github.com/cosmos/cosmos-sdk/x/params"
|
||||
|
||||
cdptypes "github.com/kava-labs/kava/x/cdp/types"
|
||||
)
|
||||
|
||||
// Parameter keys and default values
|
||||
var (
|
||||
KeyActive = []byte("Active")
|
||||
KeyLPSchedules = []byte("LPSchedules")
|
||||
KeyDelegatorSchedule = []byte("DelegatorSchedule")
|
||||
DefaultActive = true
|
||||
DefaultGovSchedules = DistributionSchedules{}
|
||||
DefaultLPSchedules = DistributionSchedules{}
|
||||
DefaultDelegatorSchedules = DelegatorDistributionSchedules{}
|
||||
GovDenom = cdptypes.DefaultGovDenom
|
||||
)
|
||||
|
||||
// Params governance parameters for harvest module
|
||||
type Params struct {
|
||||
Active bool `json:"active" yaml:"active"`
|
||||
LiquidityProviderSchedules DistributionSchedules `json:"liquidity_provider_schedules" yaml:"liquidity_provider_schedules"`
|
||||
DelegatorDistributionSchedules DelegatorDistributionSchedules `json:"delegator_distribution_schedules" yaml:"delegator_distribution_schedules"`
|
||||
}
|
||||
|
||||
// DistributionSchedule distribution schedule for liquidity providers
|
||||
type DistributionSchedule struct {
|
||||
Active bool `json:"active" yaml:"active"`
|
||||
DepositDenom string `json:"deposit_denom" yaml:"deposit_denom"`
|
||||
Start time.Time `json:"start" yaml:"start"`
|
||||
End time.Time `json:"end" yaml:"end"`
|
||||
RewardsPerSecond sdk.Coin `json:"rewards_per_second" yaml:"rewards_per_second"`
|
||||
ClaimEnd time.Time `json:"claim_end" yaml:"claim_end"`
|
||||
ClaimMultipliers Multipliers `json:"claim_multipliers" yaml:"claim_multipliers"`
|
||||
}
|
||||
|
||||
// NewDistributionSchedule returns a new DistributionSchedule
|
||||
func NewDistributionSchedule(active bool, denom string, start, end time.Time, reward sdk.Coin, claimEnd time.Time, multipliers Multipliers) DistributionSchedule {
|
||||
return DistributionSchedule{
|
||||
Active: active,
|
||||
DepositDenom: denom,
|
||||
Start: start,
|
||||
End: end,
|
||||
RewardsPerSecond: reward,
|
||||
ClaimEnd: claimEnd,
|
||||
ClaimMultipliers: multipliers,
|
||||
}
|
||||
}
|
||||
|
||||
// String implements fmt.Stringer
|
||||
func (ds DistributionSchedule) String() string {
|
||||
return fmt.Sprintf(`Liquidity Provider Distribution Schedule:
|
||||
Deposit Denom: %s,
|
||||
Start: %s,
|
||||
End: %s,
|
||||
Rewards Per Second: %s,
|
||||
Claim End: %s,
|
||||
Active: %t
|
||||
`, ds.DepositDenom, ds.Start, ds.End, ds.RewardsPerSecond, ds.ClaimEnd, ds.Active)
|
||||
}
|
||||
|
||||
// Validate performs a basic check of a distribution schedule.
|
||||
func (ds DistributionSchedule) Validate() error {
|
||||
if !ds.RewardsPerSecond.IsValid() {
|
||||
return fmt.Errorf("invalid reward coins %s for %s", ds.RewardsPerSecond, ds.DepositDenom)
|
||||
}
|
||||
if !ds.RewardsPerSecond.IsPositive() {
|
||||
return fmt.Errorf("reward amount must be positive, is %s for %s", ds.RewardsPerSecond, ds.DepositDenom)
|
||||
}
|
||||
if ds.RewardsPerSecond.Denom != "hard" {
|
||||
return fmt.Errorf("reward denom should be hard, is %s", ds.RewardsPerSecond.Denom)
|
||||
}
|
||||
if ds.Start.IsZero() {
|
||||
return errors.New("reward period start time cannot be 0")
|
||||
}
|
||||
if ds.End.IsZero() {
|
||||
return errors.New("reward period end time cannot be 0")
|
||||
}
|
||||
if ds.Start.After(ds.End) {
|
||||
return fmt.Errorf("end period time %s cannot be before start time %s", ds.End, ds.Start)
|
||||
}
|
||||
if ds.ClaimEnd.Before(ds.End) {
|
||||
return fmt.Errorf("claim end time %s cannot be before end time %s", ds.ClaimEnd, ds.End)
|
||||
}
|
||||
for _, multiplier := range ds.ClaimMultipliers {
|
||||
if err := multiplier.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DistributionSchedules slice of DistributionSchedule
|
||||
type DistributionSchedules []DistributionSchedule
|
||||
|
||||
// Validate checks if all the LiquidityProviderSchedules are valid and there are no duplicated
|
||||
// entries.
|
||||
func (dss DistributionSchedules) Validate() error {
|
||||
seenPeriods := make(map[string]bool)
|
||||
for _, ds := range dss {
|
||||
if seenPeriods[ds.DepositDenom] {
|
||||
return fmt.Errorf("duplicated distribution provider schedule with deposit denom %s", ds.DepositDenom)
|
||||
}
|
||||
|
||||
if err := ds.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
seenPeriods[ds.DepositDenom] = true
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// String implements fmt.Stringer
|
||||
func (dss DistributionSchedules) String() string {
|
||||
out := "Distribution Schedules\n"
|
||||
for _, ds := range dss {
|
||||
out += fmt.Sprintf("%s\n", ds)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
// DelegatorDistributionSchedule distribution schedule for delegators
|
||||
type DelegatorDistributionSchedule struct {
|
||||
DistributionSchedule DistributionSchedule `json:"distribution_schedule" yaml:"distribution_schedule"`
|
||||
|
||||
DistributionFrequency time.Duration `json:"distribution_frequency" yaml:"distribution_frequency"`
|
||||
}
|
||||
|
||||
// NewDelegatorDistributionSchedule returns a new DelegatorDistributionSchedule
|
||||
func NewDelegatorDistributionSchedule(ds DistributionSchedule, frequency time.Duration) DelegatorDistributionSchedule {
|
||||
return DelegatorDistributionSchedule{
|
||||
DistributionSchedule: ds,
|
||||
DistributionFrequency: frequency,
|
||||
}
|
||||
}
|
||||
|
||||
// Validate performs a basic check of a reward fields.
|
||||
func (dds DelegatorDistributionSchedule) Validate() error {
|
||||
if err := dds.DistributionSchedule.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
if dds.DistributionFrequency <= 0 {
|
||||
return fmt.Errorf("distribution frequency should be positive, got %d", dds.DistributionFrequency)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DelegatorDistributionSchedules slice of DelegatorDistributionSchedule
|
||||
type DelegatorDistributionSchedules []DelegatorDistributionSchedule
|
||||
|
||||
// Validate checks if all the LiquidityProviderSchedules are valid and there are no duplicated
|
||||
// entries.
|
||||
func (dds DelegatorDistributionSchedules) Validate() error {
|
||||
seenPeriods := make(map[string]bool)
|
||||
for _, ds := range dds {
|
||||
if seenPeriods[ds.DistributionSchedule.DepositDenom] {
|
||||
return fmt.Errorf("duplicated liquidity provider schedule with deposit denom %s", ds.DistributionSchedule.DepositDenom)
|
||||
}
|
||||
|
||||
if err := ds.Validate(); err != nil {
|
||||
return err
|
||||
}
|
||||
seenPeriods[ds.DistributionSchedule.DepositDenom] = true
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Multiplier amount the claim rewards get increased by, along with how long the claim rewards are locked
|
||||
type Multiplier struct {
|
||||
Name MultiplierName `json:"name" yaml:"name"`
|
||||
MonthsLockup int64 `json:"months_lockup" yaml:"months_lockup"`
|
||||
Factor sdk.Dec `json:"factor" yaml:"factor"`
|
||||
}
|
||||
|
||||
// NewMultiplier returns a new Multiplier
|
||||
func NewMultiplier(name MultiplierName, lockup int64, factor sdk.Dec) Multiplier {
|
||||
return Multiplier{
|
||||
Name: name,
|
||||
MonthsLockup: lockup,
|
||||
Factor: factor,
|
||||
}
|
||||
}
|
||||
|
||||
// Validate multiplier param
|
||||
func (m Multiplier) Validate() error {
|
||||
if err := m.Name.IsValid(); err != nil {
|
||||
return err
|
||||
}
|
||||
if m.MonthsLockup < 0 {
|
||||
return fmt.Errorf("expected non-negative lockup, got %d", m.MonthsLockup)
|
||||
}
|
||||
if m.Factor.IsNegative() {
|
||||
return fmt.Errorf("expected non-negative factor, got %s", m.Factor.String())
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetMultiplier returns the named multiplier from the input distribution schedule
|
||||
func (ds DistributionSchedule) GetMultiplier(name MultiplierName) (Multiplier, bool) {
|
||||
for _, multiplier := range ds.ClaimMultipliers {
|
||||
if multiplier.Name == name {
|
||||
return multiplier, true
|
||||
}
|
||||
}
|
||||
return Multiplier{}, false
|
||||
}
|
||||
|
||||
// Multipliers slice of Multiplier
|
||||
type Multipliers []Multiplier
|
||||
|
||||
// NewParams returns a new params object
|
||||
func NewParams(active bool, lps DistributionSchedules, dds DelegatorDistributionSchedules) Params {
|
||||
return Params{
|
||||
Active: active,
|
||||
LiquidityProviderSchedules: lps,
|
||||
DelegatorDistributionSchedules: dds,
|
||||
}
|
||||
}
|
||||
|
||||
// DefaultParams returns default params for harvest module
|
||||
func DefaultParams() Params {
|
||||
return NewParams(DefaultActive, DefaultLPSchedules, DefaultDelegatorSchedules)
|
||||
}
|
||||
|
||||
// String implements fmt.Stringer
|
||||
func (p Params) String() string {
|
||||
return fmt.Sprintf(`Params:
|
||||
Active: %t
|
||||
Liquidity Provider Distribution Schedules %s
|
||||
Delegator Distribution Schedule %s`, p.Active, p.LiquidityProviderSchedules, p.DelegatorDistributionSchedules)
|
||||
}
|
||||
|
||||
// ParamKeyTable Key declaration for parameters
|
||||
func ParamKeyTable() params.KeyTable {
|
||||
return params.NewKeyTable().RegisterParamSet(&Params{})
|
||||
}
|
||||
|
||||
// ParamSetPairs implements the ParamSet interface and returns all the key/value pairs
|
||||
func (p *Params) ParamSetPairs() params.ParamSetPairs {
|
||||
return params.ParamSetPairs{
|
||||
params.NewParamSetPair(KeyActive, &p.Active, validateActiveParam),
|
||||
params.NewParamSetPair(KeyLPSchedules, &p.LiquidityProviderSchedules, validateLPParams),
|
||||
params.NewParamSetPair(KeyDelegatorSchedule, &p.DelegatorDistributionSchedules, validateDelegatorParams),
|
||||
}
|
||||
}
|
||||
|
||||
// Validate checks that the parameters have valid values.
|
||||
func (p Params) Validate() error {
|
||||
if err := validateActiveParam(p.Active); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := validateDelegatorParams(p.DelegatorDistributionSchedules); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return validateLPParams(p.LiquidityProviderSchedules)
|
||||
}
|
||||
|
||||
func validateActiveParam(i interface{}) error {
|
||||
_, ok := i.(bool)
|
||||
if !ok {
|
||||
return fmt.Errorf("invalid parameter type: %T", i)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateLPParams(i interface{}) error {
|
||||
dss, ok := i.(DistributionSchedules)
|
||||
if !ok {
|
||||
return fmt.Errorf("invalid parameter type: %T", i)
|
||||
}
|
||||
|
||||
for _, ds := range dss {
|
||||
err := ds.Validate()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateDelegatorParams(i interface{}) error {
|
||||
dds, ok := i.(DelegatorDistributionSchedules)
|
||||
if !ok {
|
||||
return fmt.Errorf("invalid parameter type: %T", i)
|
||||
}
|
||||
|
||||
return dds.Validate()
|
||||
}
|
||||
|
||||
// MultiplierName name for valid multiplier
|
||||
type MultiplierName string
|
||||
|
||||
// DepositType type for valid deposit type strings
|
||||
type DepositType string
|
||||
|
||||
// Valid reward multipliers and reward types
|
||||
const (
|
||||
Small MultiplierName = "small"
|
||||
Medium MultiplierName = "medium"
|
||||
Large MultiplierName = "large"
|
||||
|
||||
LP DepositType = "lp"
|
||||
Stake DepositType = "stake"
|
||||
)
|
||||
|
||||
// Queryable deposit types
|
||||
var (
|
||||
DepositTypesDepositQuery = []DepositType{LP}
|
||||
DepositTypesClaimQuery = []DepositType{LP, Stake}
|
||||
)
|
||||
|
||||
// IsValid checks if the input is one of the expected strings
|
||||
func (mn MultiplierName) IsValid() error {
|
||||
switch mn {
|
||||
case Small, Medium, Large:
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("invalid multiplier name: %s", mn)
|
||||
}
|
||||
|
||||
// IsValid checks if the input is one of the expected strings
|
||||
func (dt DepositType) IsValid() error {
|
||||
switch dt {
|
||||
case LP, Stake:
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("invalid deposit type: %s", dt)
|
||||
}
|
||||
|
||||
// Deposit defines an amount of coins deposited into a harvest module account
|
||||
type Deposit struct {
|
||||
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
||||
Type DepositType `json:"type" yaml:"type"`
|
||||
}
|
||||
|
||||
// NewDeposit returns a new deposit
|
||||
func NewDeposit(depositor sdk.AccAddress, amount sdk.Coin, dtype DepositType) Deposit {
|
||||
return Deposit{
|
||||
Depositor: depositor,
|
||||
Amount: amount,
|
||||
Type: dtype,
|
||||
}
|
||||
}
|
||||
|
||||
// Claim defines an amount of coins that the owner can claim
|
||||
type Claim struct {
|
||||
Owner sdk.AccAddress `json:"owner" yaml:"owner"`
|
||||
DepositDenom string `json:"deposit_denom" yaml:"deposit_denom"`
|
||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
||||
Type DepositType `json:"type" yaml:"type"`
|
||||
}
|
||||
|
||||
// NewClaim returns a new claim
|
||||
func NewClaim(owner sdk.AccAddress, denom string, amount sdk.Coin, dtype DepositType) Claim {
|
||||
return Claim{
|
||||
Owner: owner,
|
||||
DepositDenom: denom,
|
||||
Amount: amount,
|
||||
Type: dtype,
|
||||
}
|
||||
}
|
||||
|
||||
// NewPeriod returns a new vesting period
|
||||
func NewPeriod(amount sdk.Coins, length int64) vesting.Period {
|
||||
return vesting.Period{Amount: amount, Length: length}
|
||||
}
|
||||
|
||||
// GetTotalVestingPeriodLength returns the summed length of all vesting periods
|
||||
func GetTotalVestingPeriodLength(periods vesting.Periods) int64 {
|
||||
length := int64(0)
|
||||
for _, period := range periods {
|
||||
length += period.Length
|
||||
}
|
||||
return length
|
||||
}
|
@ -27,7 +27,7 @@ func TestDecodeDistributionStore(t *testing.T) {
|
||||
cdc := makeTestCodec()
|
||||
|
||||
prevBlockTime := time.Now().UTC()
|
||||
deposit := types.NewDeposit(sdk.AccAddress("test"), sdk.NewCoin("bnb", sdk.NewInt(1)), "lp")
|
||||
deposit := types.NewDeposit(sdk.AccAddress("test"), sdk.NewCoin("bnb", sdk.NewInt(1)))
|
||||
claim := types.NewClaim(sdk.AccAddress("test"), "bnb", sdk.NewCoin("hard", sdk.NewInt(100)), "stake")
|
||||
|
||||
kvPairs := kv.Pairs{
|
||||
|
@ -11,14 +11,12 @@ There are three messages in the harvest module. Deposit allows users to deposit
|
||||
type MsgDeposit struct {
|
||||
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
||||
DepositType string `json:"deposit_type" yaml:"deposit_type"`
|
||||
}
|
||||
|
||||
// MsgWithdraw withdraw from the harvest module.
|
||||
type MsgWithdraw struct {
|
||||
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
||||
DepositType string `json:"deposit_type" yaml:"deposit_type"`
|
||||
}
|
||||
|
||||
// MsgClaimReward message type used to claim HARD tokens
|
||||
|
@ -17,7 +17,6 @@ The harvest module emits the following events:
|
||||
| harvest_deposit | amount | `{amount}` |
|
||||
| harvest_deposit | depositor | `{depositor address}` |
|
||||
| harvest_deposit | deposit_denom | `{deposit denom}` |
|
||||
| harvest_deposit | deposit_type | `{deposit type}` |
|
||||
|
||||
### MsgWithdraw
|
||||
|
||||
@ -31,7 +30,6 @@ The harvest module emits the following events:
|
||||
| harvest_deposit | deposit_type | `{deposit type}` |
|
||||
| delete_harvest_deposit | depositor | `{depositor address}` |
|
||||
| delete_harvest_deposit | deposit_denom | `{deposit denom}` |
|
||||
| delete_harvest_deposit | deposit_type | `{deposit type}` |
|
||||
|
||||
### MsgClaimReward
|
||||
|
||||
@ -42,7 +40,7 @@ The harvest module emits the following events:
|
||||
| claim_harvest_reward | amount | `{amount}` |
|
||||
| claim_harvest_reward | claim_holder | `{claim holder address}` |
|
||||
| claim_harvest_reward | deposit_denom | `{deposit denom}` |
|
||||
| claim_harvest_reward | deposit_type | `{deposit type}` |
|
||||
| claim_harvest_reward | claim_type | `{claim type}` |
|
||||
| claim_harvest_reward | claim_multiplier | `{claim multiplier}` |
|
||||
|
||||
## BeginBlock
|
||||
|
@ -9,15 +9,15 @@ type Claim struct {
|
||||
Owner sdk.AccAddress `json:"owner" yaml:"owner"`
|
||||
DepositDenom string `json:"deposit_denom" yaml:"deposit_denom"`
|
||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
||||
Type DepositType `json:"type" yaml:"type"`
|
||||
Type ClaimType `json:"claim_type" yaml:"claim_type"`
|
||||
}
|
||||
|
||||
// NewClaim returns a new claim
|
||||
func NewClaim(owner sdk.AccAddress, denom string, amount sdk.Coin, dtype DepositType) Claim {
|
||||
func NewClaim(owner sdk.AccAddress, denom string, amount sdk.Coin, claimType ClaimType) Claim {
|
||||
return Claim{
|
||||
Owner: owner,
|
||||
DepositDenom: denom,
|
||||
Amount: amount,
|
||||
Type: dtype,
|
||||
Type: claimType,
|
||||
}
|
||||
}
|
||||
|
@ -8,14 +8,12 @@ import (
|
||||
type Deposit struct {
|
||||
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
||||
Type DepositType `json:"type" yaml:"type"`
|
||||
}
|
||||
|
||||
// NewDeposit returns a new deposit
|
||||
func NewDeposit(depositor sdk.AccAddress, amount sdk.Coin, dtype DepositType) Deposit {
|
||||
func NewDeposit(depositor sdk.AccAddress, amount sdk.Coin) Deposit {
|
||||
return Deposit{
|
||||
Depositor: depositor,
|
||||
Amount: amount,
|
||||
Type: dtype,
|
||||
}
|
||||
}
|
||||
|
@ -11,10 +11,10 @@ var (
|
||||
ErrInvalidDepositDenom = sdkerrors.Register(ModuleName, 2, "invalid deposit denom")
|
||||
// ErrDepositNotFound error for deposit not found
|
||||
ErrDepositNotFound = sdkerrors.Register(ModuleName, 3, "deposit not found")
|
||||
// ErrInvaliWithdrawAmount error for invalid withdrawal amount
|
||||
ErrInvaliWithdrawAmount = sdkerrors.Register(ModuleName, 4, "withdrawal amount exceeds deposit amount")
|
||||
// ErrInvalidDepositType error for invalid deposit type
|
||||
ErrInvalidDepositType = sdkerrors.Register(ModuleName, 5, "invalid deposit type")
|
||||
// ErrInvalidWithdrawAmount error for invalid withdrawal amount
|
||||
ErrInvalidWithdrawAmount = sdkerrors.Register(ModuleName, 4, "withdrawal amount exceeds deposit amount")
|
||||
// ErrInvalidClaimType error for invalid claim type
|
||||
ErrInvalidClaimType = sdkerrors.Register(ModuleName, 5, "invalid claim type")
|
||||
// ErrClaimNotFound error for claim not found
|
||||
ErrClaimNotFound = sdkerrors.Register(ModuleName, 6, "claim not found")
|
||||
// ErrZeroClaim error for claim amount rounded to zero
|
||||
|
@ -13,9 +13,9 @@ const (
|
||||
AttributeKeyBlockHeight = "block_height"
|
||||
AttributeKeyRewardsDistribution = "rewards_distributed"
|
||||
AttributeKeyDeposit = "deposit"
|
||||
AttributeKeyDepositType = "deposit_type"
|
||||
AttributeKeyDepositDenom = "deposit_denom"
|
||||
AttributeKeyDepositor = "depositor"
|
||||
AttributeKeyClaimType = "claim_type"
|
||||
AttributeKeyClaimHolder = "claim_holder"
|
||||
AttributeKeyClaimAmount = "claim_amount"
|
||||
AttributeKeyClaimMultiplier = "claim_multiplier"
|
||||
|
@ -41,20 +41,25 @@ var (
|
||||
)
|
||||
|
||||
// DepositKey key of a specific deposit in the store
|
||||
func DepositKey(depositType DepositType, denom string, depositor sdk.AccAddress) []byte {
|
||||
return createKey([]byte(depositType), sep, []byte(denom), sep, depositor)
|
||||
func DepositKey(denom string, depositor sdk.AccAddress) []byte {
|
||||
return createKey([]byte(denom), sep, depositor)
|
||||
}
|
||||
|
||||
// DepositTypeIteratorKey returns an interator prefix for interating over deposits by deposit type and denom
|
||||
func DepositTypeIteratorKey(depositType DepositType, denom string) []byte {
|
||||
return createKey([]byte(depositType), sep, []byte(denom))
|
||||
// DepositTypeIteratorKey returns an interator prefix for interating over deposits by deposit denom
|
||||
func DepositTypeIteratorKey(denom string) []byte {
|
||||
return createKey([]byte(denom))
|
||||
}
|
||||
|
||||
// ClaimKey key of a specific deposit in the store
|
||||
func ClaimKey(depositType DepositType, denom string, owner sdk.AccAddress) []byte {
|
||||
func ClaimKey(depositType ClaimType, denom string, owner sdk.AccAddress) []byte {
|
||||
return createKey([]byte(depositType), sep, []byte(denom), sep, owner)
|
||||
}
|
||||
|
||||
// ClaimTypeIteratorKey returns an interator prefix for interating over claims by deposit type and denom
|
||||
func ClaimTypeIteratorKey(depositType ClaimType, denom string) []byte {
|
||||
return createKey([]byte(depositType), sep, []byte(denom))
|
||||
}
|
||||
|
||||
func createKey(bytes ...[]byte) (r []byte) {
|
||||
for _, b := range bytes {
|
||||
r = append(r, b...)
|
||||
|
@ -11,8 +11,8 @@ import (
|
||||
// MultiplierName name for valid multiplier
|
||||
type MultiplierName string
|
||||
|
||||
// DepositType type for valid deposit type strings
|
||||
type DepositType string
|
||||
// ClaimType type for valid claim type strings
|
||||
type ClaimType string
|
||||
|
||||
// Valid reward multipliers and reward types
|
||||
const (
|
||||
@ -20,14 +20,13 @@ const (
|
||||
Medium MultiplierName = "medium"
|
||||
Large MultiplierName = "large"
|
||||
|
||||
LP DepositType = "lp"
|
||||
Stake DepositType = "stake"
|
||||
LP ClaimType = "lp"
|
||||
Stake ClaimType = "stake"
|
||||
)
|
||||
|
||||
// Queryable deposit types
|
||||
// Queryable claim types
|
||||
var (
|
||||
DepositTypesDepositQuery = []DepositType{LP}
|
||||
DepositTypesClaimQuery = []DepositType{LP, Stake}
|
||||
ClaimTypesClaimQuery = []ClaimType{LP, Stake}
|
||||
)
|
||||
|
||||
// IsValid checks if the input is one of the expected strings
|
||||
@ -40,12 +39,12 @@ func (mn MultiplierName) IsValid() error {
|
||||
}
|
||||
|
||||
// IsValid checks if the input is one of the expected strings
|
||||
func (dt DepositType) IsValid() error {
|
||||
func (dt ClaimType) IsValid() error {
|
||||
switch dt {
|
||||
case LP, Stake:
|
||||
return nil
|
||||
}
|
||||
return fmt.Errorf("invalid deposit type: %s", dt)
|
||||
return fmt.Errorf("invalid claim type: %s", dt)
|
||||
}
|
||||
|
||||
// ensure Msg interface compliance at compile time
|
||||
@ -58,17 +57,15 @@ var (
|
||||
|
||||
// MsgDeposit deposit collateral to the harvest module.
|
||||
type MsgDeposit struct {
|
||||
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
||||
DepositType string `json:"deposit_type" yaml:"deposit_type"`
|
||||
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
||||
}
|
||||
|
||||
// NewMsgDeposit returns a new MsgDeposit
|
||||
func NewMsgDeposit(depositor sdk.AccAddress, amount sdk.Coin, depositType string) MsgDeposit {
|
||||
func NewMsgDeposit(depositor sdk.AccAddress, amount sdk.Coin) MsgDeposit {
|
||||
return MsgDeposit{
|
||||
Depositor: depositor,
|
||||
Amount: amount,
|
||||
DepositType: depositType,
|
||||
Depositor: depositor,
|
||||
Amount: amount,
|
||||
}
|
||||
}
|
||||
|
||||
@ -86,7 +83,7 @@ func (msg MsgDeposit) ValidateBasic() error {
|
||||
if !msg.Amount.IsValid() || msg.Amount.IsZero() {
|
||||
return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "deposit amount %s", msg.Amount)
|
||||
}
|
||||
return DepositType(strings.ToLower(msg.DepositType)).IsValid()
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetSignBytes gets the canonical byte representation of the Msg.
|
||||
@ -105,23 +102,20 @@ func (msg MsgDeposit) String() string {
|
||||
return fmt.Sprintf(`Deposit Message:
|
||||
Depositor: %s
|
||||
Amount: %s
|
||||
Deposit Type: %s
|
||||
`, msg.Depositor, msg.Amount, msg.DepositType)
|
||||
`, msg.Depositor, msg.Amount)
|
||||
}
|
||||
|
||||
// MsgWithdraw withdraw from the harvest module.
|
||||
type MsgWithdraw struct {
|
||||
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
||||
DepositType string `json:"deposit_type" yaml:"deposit_type"`
|
||||
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
||||
}
|
||||
|
||||
// NewMsgWithdraw returns a new MsgWithdraw
|
||||
func NewMsgWithdraw(depositor sdk.AccAddress, amount sdk.Coin, depositType string) MsgWithdraw {
|
||||
func NewMsgWithdraw(depositor sdk.AccAddress, amount sdk.Coin) MsgWithdraw {
|
||||
return MsgWithdraw{
|
||||
Depositor: depositor,
|
||||
Amount: amount,
|
||||
DepositType: depositType,
|
||||
Depositor: depositor,
|
||||
Amount: amount,
|
||||
}
|
||||
}
|
||||
|
||||
@ -139,7 +133,7 @@ func (msg MsgWithdraw) ValidateBasic() error {
|
||||
if !msg.Amount.IsValid() || msg.Amount.IsZero() {
|
||||
return sdkerrors.Wrapf(sdkerrors.ErrInvalidCoins, "deposit amount %s", msg.Amount)
|
||||
}
|
||||
return DepositType(strings.ToLower(msg.DepositType)).IsValid()
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetSignBytes gets the canonical byte representation of the Msg.
|
||||
@ -158,8 +152,7 @@ func (msg MsgWithdraw) String() string {
|
||||
return fmt.Sprintf(`Withdraw Message:
|
||||
Depositor: %s
|
||||
Amount: %s
|
||||
Deposit Type: %s
|
||||
`, msg.Depositor, msg.Amount, msg.DepositType)
|
||||
`, msg.Depositor, msg.Amount)
|
||||
}
|
||||
|
||||
// MsgClaimReward message type used to claim rewards
|
||||
@ -168,17 +161,17 @@ type MsgClaimReward struct {
|
||||
Receiver sdk.AccAddress `json:"receiver" yaml:"receiver"`
|
||||
DepositDenom string `json:"deposit_denom" yaml:"deposit_denom"`
|
||||
MultiplierName string `json:"multiplier_name" yaml:"multiplier_name"`
|
||||
DepositType string `json:"deposit_type" yaml:"deposit_type"`
|
||||
ClaimType string `json:"claim_type" yaml:"claim_type"`
|
||||
}
|
||||
|
||||
// NewMsgClaimReward returns a new MsgClaimReward.
|
||||
func NewMsgClaimReward(sender, receiver sdk.AccAddress, depositDenom, depositType, multiplier string) MsgClaimReward {
|
||||
func NewMsgClaimReward(sender, receiver sdk.AccAddress, depositDenom, claimType, multiplier string) MsgClaimReward {
|
||||
return MsgClaimReward{
|
||||
Sender: sender,
|
||||
Receiver: receiver,
|
||||
DepositDenom: depositDenom,
|
||||
MultiplierName: multiplier,
|
||||
DepositType: depositType,
|
||||
ClaimType: claimType,
|
||||
}
|
||||
}
|
||||
|
||||
@ -199,7 +192,7 @@ func (msg MsgClaimReward) ValidateBasic() error {
|
||||
if err := sdk.ValidateDenom(msg.DepositDenom); err != nil {
|
||||
return fmt.Errorf("collateral type cannot be blank")
|
||||
}
|
||||
if err := DepositType(strings.ToLower(msg.DepositType)).IsValid(); err != nil {
|
||||
if err := ClaimType(strings.ToLower(msg.ClaimType)).IsValid(); err != nil {
|
||||
return err
|
||||
}
|
||||
return MultiplierName(strings.ToLower(msg.MultiplierName)).IsValid()
|
||||
|
@ -17,9 +17,8 @@ type MsgTestSuite struct {
|
||||
|
||||
func (suite *MsgTestSuite) TestMsgDeposit() {
|
||||
type args struct {
|
||||
depositor sdk.AccAddress
|
||||
amount sdk.Coin
|
||||
depositType string
|
||||
depositor sdk.AccAddress
|
||||
amount sdk.Coin
|
||||
}
|
||||
addrs := []sdk.AccAddress{
|
||||
sdk.AccAddress("test1"),
|
||||
@ -34,9 +33,8 @@ func (suite *MsgTestSuite) TestMsgDeposit() {
|
||||
{
|
||||
name: "valid",
|
||||
args: args{
|
||||
depositor: addrs[0],
|
||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000000)),
|
||||
depositType: "lp",
|
||||
depositor: addrs[0],
|
||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000000)),
|
||||
},
|
||||
expectPass: true,
|
||||
expectedErr: "",
|
||||
@ -44,27 +42,16 @@ func (suite *MsgTestSuite) TestMsgDeposit() {
|
||||
{
|
||||
name: "valid2",
|
||||
args: args{
|
||||
depositor: addrs[0],
|
||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000000)),
|
||||
depositType: "LP",
|
||||
depositor: addrs[0],
|
||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000000)),
|
||||
},
|
||||
expectPass: true,
|
||||
expectedErr: "",
|
||||
},
|
||||
{
|
||||
name: "invalid",
|
||||
args: args{
|
||||
depositor: addrs[0],
|
||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000000)),
|
||||
depositType: "cat",
|
||||
},
|
||||
expectPass: false,
|
||||
expectedErr: "invalid deposit type",
|
||||
},
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
suite.Run(tc.name, func() {
|
||||
msg := types.NewMsgDeposit(tc.args.depositor, tc.args.amount, tc.args.depositType)
|
||||
msg := types.NewMsgDeposit(tc.args.depositor, tc.args.amount)
|
||||
err := msg.ValidateBasic()
|
||||
if tc.expectPass {
|
||||
suite.NoError(err)
|
||||
@ -78,9 +65,8 @@ func (suite *MsgTestSuite) TestMsgDeposit() {
|
||||
|
||||
func (suite *MsgTestSuite) TestMsgWithdraw() {
|
||||
type args struct {
|
||||
depositor sdk.AccAddress
|
||||
amount sdk.Coin
|
||||
depositType string
|
||||
depositor sdk.AccAddress
|
||||
amount sdk.Coin
|
||||
}
|
||||
addrs := []sdk.AccAddress{
|
||||
sdk.AccAddress("test1"),
|
||||
@ -95,9 +81,8 @@ func (suite *MsgTestSuite) TestMsgWithdraw() {
|
||||
{
|
||||
name: "valid",
|
||||
args: args{
|
||||
depositor: addrs[0],
|
||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000000)),
|
||||
depositType: "lp",
|
||||
depositor: addrs[0],
|
||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000000)),
|
||||
},
|
||||
expectPass: true,
|
||||
expectedErr: "",
|
||||
@ -105,27 +90,16 @@ func (suite *MsgTestSuite) TestMsgWithdraw() {
|
||||
{
|
||||
name: "valid2",
|
||||
args: args{
|
||||
depositor: addrs[0],
|
||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000000)),
|
||||
depositType: "LP",
|
||||
depositor: addrs[0],
|
||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000000)),
|
||||
},
|
||||
expectPass: true,
|
||||
expectedErr: "",
|
||||
},
|
||||
{
|
||||
name: "invalid",
|
||||
args: args{
|
||||
depositor: addrs[0],
|
||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000000)),
|
||||
depositType: "cat",
|
||||
},
|
||||
expectPass: false,
|
||||
expectedErr: "invalid deposit type",
|
||||
},
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
suite.Run(tc.name, func() {
|
||||
msg := types.NewMsgWithdraw(tc.args.depositor, tc.args.amount, tc.args.depositType)
|
||||
msg := types.NewMsgWithdraw(tc.args.depositor, tc.args.amount)
|
||||
err := msg.ValidateBasic()
|
||||
if tc.expectPass {
|
||||
suite.NoError(err)
|
||||
@ -139,11 +113,11 @@ func (suite *MsgTestSuite) TestMsgWithdraw() {
|
||||
|
||||
func (suite *MsgTestSuite) TestMsgClaim() {
|
||||
type args struct {
|
||||
sender sdk.AccAddress
|
||||
receiver sdk.AccAddress
|
||||
denom string
|
||||
depositType string
|
||||
multiplier string
|
||||
sender sdk.AccAddress
|
||||
receiver sdk.AccAddress
|
||||
denom string
|
||||
claimType string
|
||||
multiplier string
|
||||
}
|
||||
addrs := []sdk.AccAddress{
|
||||
sdk.AccAddress("test1"),
|
||||
@ -158,11 +132,11 @@ func (suite *MsgTestSuite) TestMsgClaim() {
|
||||
{
|
||||
name: "valid",
|
||||
args: args{
|
||||
sender: addrs[0],
|
||||
receiver: addrs[0],
|
||||
denom: "bnb",
|
||||
depositType: "lp",
|
||||
multiplier: "large",
|
||||
sender: addrs[0],
|
||||
receiver: addrs[0],
|
||||
denom: "bnb",
|
||||
claimType: "lp",
|
||||
multiplier: "large",
|
||||
},
|
||||
expectPass: true,
|
||||
expectedErr: "",
|
||||
@ -170,11 +144,11 @@ func (suite *MsgTestSuite) TestMsgClaim() {
|
||||
{
|
||||
name: "valid2",
|
||||
args: args{
|
||||
sender: addrs[0],
|
||||
receiver: addrs[0],
|
||||
denom: "bnb",
|
||||
depositType: "stake",
|
||||
multiplier: "small",
|
||||
sender: addrs[0],
|
||||
receiver: addrs[0],
|
||||
denom: "bnb",
|
||||
claimType: "stake",
|
||||
multiplier: "small",
|
||||
},
|
||||
expectPass: true,
|
||||
expectedErr: "",
|
||||
@ -182,11 +156,11 @@ func (suite *MsgTestSuite) TestMsgClaim() {
|
||||
{
|
||||
name: "valid3",
|
||||
args: args{
|
||||
sender: addrs[0],
|
||||
receiver: addrs[1],
|
||||
denom: "bnb",
|
||||
depositType: "lp",
|
||||
multiplier: "Medium",
|
||||
sender: addrs[0],
|
||||
receiver: addrs[1],
|
||||
denom: "bnb",
|
||||
claimType: "lp",
|
||||
multiplier: "Medium",
|
||||
},
|
||||
expectPass: true,
|
||||
expectedErr: "",
|
||||
@ -194,11 +168,11 @@ func (suite *MsgTestSuite) TestMsgClaim() {
|
||||
{
|
||||
name: "invalid",
|
||||
args: args{
|
||||
sender: addrs[0],
|
||||
receiver: addrs[0],
|
||||
denom: "bnb",
|
||||
depositType: "lp",
|
||||
multiplier: "huge",
|
||||
sender: addrs[0],
|
||||
receiver: addrs[0],
|
||||
denom: "bnb",
|
||||
claimType: "lp",
|
||||
multiplier: "huge",
|
||||
},
|
||||
expectPass: false,
|
||||
expectedErr: "invalid multiplier name",
|
||||
@ -206,7 +180,7 @@ func (suite *MsgTestSuite) TestMsgClaim() {
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
suite.Run(tc.name, func() {
|
||||
msg := types.NewMsgClaimReward(tc.args.sender, tc.args.receiver, tc.args.denom, tc.args.depositType, tc.args.multiplier)
|
||||
msg := types.NewMsgClaimReward(tc.args.sender, tc.args.receiver, tc.args.denom, tc.args.claimType, tc.args.multiplier)
|
||||
err := msg.ValidateBasic()
|
||||
if tc.expectPass {
|
||||
suite.NoError(err)
|
||||
|
@ -20,17 +20,15 @@ type QueryDepositParams struct {
|
||||
Limit int `json:"limit" yaml:"limit"`
|
||||
DepositDenom string `json:"deposit_denom" yaml:"deposit_denom"`
|
||||
Owner sdk.AccAddress `json:"owner" yaml:"owner"`
|
||||
DepositType DepositType `json:"deposit_type" yaml:"deposit_type"`
|
||||
}
|
||||
|
||||
// NewQueryDepositParams creates a new QueryDepositParams
|
||||
func NewQueryDepositParams(page, limit int, depositDenom string, owner sdk.AccAddress, depositType DepositType) QueryDepositParams {
|
||||
func NewQueryDepositParams(page, limit int, depositDenom string, owner sdk.AccAddress) QueryDepositParams {
|
||||
return QueryDepositParams{
|
||||
Page: page,
|
||||
Limit: limit,
|
||||
DepositDenom: depositDenom,
|
||||
Owner: owner,
|
||||
DepositType: depositType,
|
||||
}
|
||||
}
|
||||
|
||||
@ -40,17 +38,17 @@ type QueryClaimParams struct {
|
||||
Limit int `json:"limit" yaml:"limit"`
|
||||
DepositDenom string `json:"deposit_denom" yaml:"deposit_denom"`
|
||||
Owner sdk.AccAddress `json:"owner" yaml:"owner"`
|
||||
DepositType DepositType `json:"deposit_type" yaml:"deposit_type"`
|
||||
ClaimType ClaimType `json:"claim_type" yaml:"claim_type"`
|
||||
}
|
||||
|
||||
// NewQueryClaimParams creates a new QueryClaimParams
|
||||
func NewQueryClaimParams(page, limit int, depositDenom string, owner sdk.AccAddress, depositType DepositType) QueryClaimParams {
|
||||
func NewQueryClaimParams(page, limit int, depositDenom string, owner sdk.AccAddress, claimType ClaimType) QueryClaimParams {
|
||||
return QueryClaimParams{
|
||||
Page: page,
|
||||
Limit: limit,
|
||||
DepositDenom: depositDenom,
|
||||
Owner: owner,
|
||||
DepositType: depositType,
|
||||
ClaimType: claimType,
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user