mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-04-04 15:55:23 +00:00 
			
		
		
		
	Hard: refactor borrow/borrows and deposit/deposits query (#761)
* refactor cli borrows query * rest api feature parity for borrows query * refactor deposits cli query * remove deposit/borrow query names from types * add named deposit/borrow queries back into types * rest api feature parity for deposits query * load synced deposit instead of synced balance * deposits query returns synced deposits * borrows query returns synced borrows * refactor querier types * update comment for accuracy * add deposit/borrow slice types * refactor 'borrowed' query * implement 'deposited' query types * implement 'deposited' query keeper function * implement 'deposited' query CLI * implement 'deposited' query rest endpoint * update naming conventions to 'total'
This commit is contained in:
		
							parent
							
								
									d05516bbe0
								
							
						
					
					
						commit
						34a7172581
					
				| @ -74,7 +74,6 @@ var ( | |||||||
| 	NewPeriod                        = types.NewPeriod | 	NewPeriod                        = types.NewPeriod | ||||||
| 	NewQueryAccountParams            = types.NewQueryAccountParams | 	NewQueryAccountParams            = types.NewQueryAccountParams | ||||||
| 	NewQueryClaimParams              = types.NewQueryClaimParams | 	NewQueryClaimParams              = types.NewQueryClaimParams | ||||||
| 	NewQueryDepositParams            = types.NewQueryDepositParams |  | ||||||
| 	ParamKeyTable                    = types.ParamKeyTable | 	ParamKeyTable                    = types.ParamKeyTable | ||||||
| 	RegisterCodec                    = types.RegisterCodec | 	RegisterCodec                    = types.RegisterCodec | ||||||
| 
 | 
 | ||||||
| @ -135,7 +134,6 @@ type ( | |||||||
| 	Params                         = types.Params | 	Params                         = types.Params | ||||||
| 	QueryAccountParams             = types.QueryAccountParams | 	QueryAccountParams             = types.QueryAccountParams | ||||||
| 	QueryClaimParams               = types.QueryClaimParams | 	QueryClaimParams               = types.QueryClaimParams | ||||||
| 	QueryDepositParams             = types.QueryDepositParams |  | ||||||
| 	StakingKeeper                  = types.StakingKeeper | 	StakingKeeper                  = types.StakingKeeper | ||||||
| 	SupplyKeeper                   = types.SupplyKeeper | 	SupplyKeeper                   = types.SupplyKeeper | ||||||
| ) | ) | ||||||
|  | |||||||
| @ -19,10 +19,10 @@ import ( | |||||||
| 
 | 
 | ||||||
| // flags for cli queries
 | // flags for cli queries
 | ||||||
| const ( | const ( | ||||||
| 	flagName         = "name" | 	flagName      = "name" | ||||||
| 	flagDepositDenom = "deposit-denom" | 	flagDenom     = "denom" | ||||||
| 	flagOwner        = "owner" | 	flagOwner     = "owner" | ||||||
| 	flagClaimType    = "claim-type" | 	flagClaimType = "claim-type" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // GetQueryCmd returns the cli query commands for the  module
 | // GetQueryCmd returns the cli query commands for the  module
 | ||||||
| @ -39,14 +39,13 @@ func GetQueryCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 		queryParamsCmd(queryRoute, cdc), | 		queryParamsCmd(queryRoute, cdc), | ||||||
| 		queryModAccountsCmd(queryRoute, cdc), | 		queryModAccountsCmd(queryRoute, cdc), | ||||||
| 		queryDepositsCmd(queryRoute, cdc), | 		queryDepositsCmd(queryRoute, cdc), | ||||||
| 		queryDepositCmd(queryRoute, cdc), | 		queryTotalDepositedCmd(queryRoute, cdc), | ||||||
| 		queryClaimsCmd(queryRoute, cdc), | 		queryClaimsCmd(queryRoute, cdc), | ||||||
| 		queryBorrowsCmd(queryRoute, cdc), | 		queryBorrowsCmd(queryRoute, cdc), | ||||||
| 		queryBorrowCmd(queryRoute, cdc), | 		queryTotalBorrowedCmd(queryRoute, cdc), | ||||||
| 	)...) | 	)...) | ||||||
| 
 | 
 | ||||||
| 	return hardQueryCmd | 	return hardQueryCmd | ||||||
| 
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func queryParamsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | func queryParamsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | ||||||
| @ -124,9 +123,9 @@ func queryDepositsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 
 | 
 | ||||||
| 		Example: | 		Example: | ||||||
| 		$ kvcli q hard deposits | 		$ kvcli q hard deposits | ||||||
| 		$ kvcli q hard deposits --owner kava1l0xsq2z7gqd7yly0g40y5836g0appumark77ny --deposit-denom bnb | 		$ kvcli q hard deposits --owner kava1l0xsq2z7gqd7yly0g40y5836g0appumark77ny --denom bnb | ||||||
| 		$ kvcli q hard deposits --deposit-denom ukava | 		$ kvcli q hard deposits --denom ukava | ||||||
| 		$ kvcli q hard deposits --deposit-denom btcb`, | 		$ kvcli q hard deposits --denom btcb`, | ||||||
| 		), | 		), | ||||||
| 		Args: cobra.NoArgs, | 		Args: cobra.NoArgs, | ||||||
| 		RunE: func(cmd *cobra.Command, args []string) error { | 		RunE: func(cmd *cobra.Command, args []string) error { | ||||||
| @ -135,7 +134,7 @@ func queryDepositsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 			var owner sdk.AccAddress | 			var owner sdk.AccAddress | ||||||
| 
 | 
 | ||||||
| 			ownerBech := viper.GetString(flagOwner) | 			ownerBech := viper.GetString(flagOwner) | ||||||
| 			depositDenom := viper.GetString(flagDepositDenom) | 			denom := viper.GetString(flagDenom) | ||||||
| 
 | 
 | ||||||
| 			if len(ownerBech) != 0 { | 			if len(ownerBech) != 0 { | ||||||
| 				depositOwner, err := sdk.AccAddressFromBech32(ownerBech) | 				depositOwner, err := sdk.AccAddressFromBech32(ownerBech) | ||||||
| @ -145,10 +144,12 @@ func queryDepositsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 				owner = depositOwner | 				owner = depositOwner | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | 			// Note: The 10 users with the lowest LTV ratio have their outstanding interest applied each block, so if
 | ||||||
|  | 			// testing with 10 or less addresses they'll all show their latest balance including outstanding interest.
 | ||||||
| 			page := viper.GetInt(flags.FlagPage) | 			page := viper.GetInt(flags.FlagPage) | ||||||
| 			limit := viper.GetInt(flags.FlagLimit) | 			limit := viper.GetInt(flags.FlagLimit) | ||||||
| 
 | 
 | ||||||
| 			params := types.NewQueryDepositsParams(page, limit, depositDenom, owner) | 			params := types.NewQueryDepositsParams(page, limit, denom, owner) | ||||||
| 			bz, err := cdc.MarshalJSON(params) | 			bz, err := cdc.MarshalJSON(params) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| @ -161,17 +162,18 @@ func queryDepositsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 			} | 			} | ||||||
| 			cliCtx = cliCtx.WithHeight(height) | 			cliCtx = cliCtx.WithHeight(height) | ||||||
| 
 | 
 | ||||||
| 			var deposits []types.Deposit | 			var deposits types.Deposits | ||||||
| 			if err := cdc.UnmarshalJSON(res, &deposits); err != nil { | 			if err := cdc.UnmarshalJSON(res, &deposits); err != nil { | ||||||
| 				return fmt.Errorf("failed to unmarshal deposits: %w", err) | 				return fmt.Errorf("failed to unmarshal deposits: %w", err) | ||||||
| 			} | 			} | ||||||
| 			return cliCtx.PrintOutput(deposits) | 			return cliCtx.PrintOutput(deposits) | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	cmd.Flags().Int(flags.FlagPage, 1, "pagination page to query for") | 	cmd.Flags().Int(flags.FlagPage, 1, "pagination page to query for") | ||||||
| 	cmd.Flags().Int(flags.FlagLimit, 100, "pagination limit (max 100)") | 	cmd.Flags().Int(flags.FlagLimit, 100, "pagination limit (max 100)") | ||||||
| 	cmd.Flags().String(flagOwner, "", "(optional) filter for deposits by owner address") | 	cmd.Flags().String(flagOwner, "", "(optional) filter for deposits by owner address") | ||||||
| 	cmd.Flags().String(flagDepositDenom, "", "(optional) filter for deposits by denom") | 	cmd.Flags().String(flagDenom, "", "(optional) filter for deposits by denom") | ||||||
| 	return cmd | 	return cmd | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -183,9 +185,9 @@ func queryClaimsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 
 | 
 | ||||||
| 		Example: | 		Example: | ||||||
| 		$ kvcli q hard claims | 		$ kvcli q hard claims | ||||||
| 		$ kvcli q hard claims --owner kava1l0xsq2z7gqd7yly0g40y5836g0appumark77ny --claim-type lp --deposit-denom bnb | 		$ kvcli q hard claims --owner kava1l0xsq2z7gqd7yly0g40y5836g0appumark77ny --claim-type lp --denom bnb | ||||||
| 		$ kvcli q hard claims --claim-type stake --deposit-denom ukava | 		$ kvcli q hard claims --claim-type stake --denom ukava | ||||||
| 		$ kvcli q hard claims --deposit-denom btcb`, | 		$ kvcli q hard claims --denom btcb`, | ||||||
| 		), | 		), | ||||||
| 		Args: cobra.NoArgs, | 		Args: cobra.NoArgs, | ||||||
| 		RunE: func(cmd *cobra.Command, args []string) error { | 		RunE: func(cmd *cobra.Command, args []string) error { | ||||||
| @ -195,7 +197,7 @@ func queryClaimsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 			var claimType types.ClaimType | 			var claimType types.ClaimType | ||||||
| 
 | 
 | ||||||
| 			ownerBech := viper.GetString(flagOwner) | 			ownerBech := viper.GetString(flagOwner) | ||||||
| 			depositDenom := viper.GetString(flagDepositDenom) | 			denom := viper.GetString(flagDenom) | ||||||
| 			claimTypeStr := viper.GetString(flagClaimType) | 			claimTypeStr := viper.GetString(flagClaimType) | ||||||
| 
 | 
 | ||||||
| 			if len(ownerBech) != 0 { | 			if len(ownerBech) != 0 { | ||||||
| @ -216,7 +218,7 @@ func queryClaimsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 			page := viper.GetInt(flags.FlagPage) | 			page := viper.GetInt(flags.FlagPage) | ||||||
| 			limit := viper.GetInt(flags.FlagLimit) | 			limit := viper.GetInt(flags.FlagLimit) | ||||||
| 
 | 
 | ||||||
| 			params := types.NewQueryClaimParams(page, limit, depositDenom, owner, claimType) | 			params := types.NewQueryClaimParams(page, limit, denom, owner, claimType) | ||||||
| 			bz, err := cdc.MarshalJSON(params) | 			bz, err := cdc.MarshalJSON(params) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| @ -236,10 +238,11 @@ func queryClaimsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 			return cliCtx.PrintOutput(claims) | 			return cliCtx.PrintOutput(claims) | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
| 	cmd.Flags().Int(flags.FlagPage, 1, "pagination page to query for") | 	cmd.Flags().Int(flags.FlagPage, 1, "pagination page to query for") | ||||||
| 	cmd.Flags().Int(flags.FlagLimit, 100, "pagination limit (max 100)") | 	cmd.Flags().Int(flags.FlagLimit, 100, "pagination limit (max 100)") | ||||||
| 	cmd.Flags().String(flagOwner, "", "(optional) filter for claims by owner address") | 	cmd.Flags().String(flagOwner, "", "(optional) filter for claims by owner address") | ||||||
| 	cmd.Flags().String(flagDepositDenom, "", "(optional) filter for claims by denom") | 	cmd.Flags().String(flagDenom, "", "(optional) filter for claims by denom") | ||||||
| 	cmd.Flags().String(flagClaimType, "", "(optional) filter for claims by type (lp or staking)") | 	cmd.Flags().String(flagClaimType, "", "(optional) filter for claims by type (lp or staking)") | ||||||
| 	return cmd | 	return cmd | ||||||
| } | } | ||||||
| @ -252,8 +255,8 @@ func queryBorrowsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 
 | 
 | ||||||
| 		Example: | 		Example: | ||||||
| 		$ kvcli q hard borrows | 		$ kvcli q hard borrows | ||||||
| 		$ kvcli q hard borrows --borrower kava1l0xsq2z7gqd7yly0g40y5836g0appumark77ny | 		$ kvcli q hard borrows --owner kava1l0xsq2z7gqd7yly0g40y5836g0appumark77ny | ||||||
| 		$ kvcli q hard borrows --borrow-denom bnb`, | 		$ kvcli q hard borrows --denom bnb`, | ||||||
| 		), | 		), | ||||||
| 		Args: cobra.NoArgs, | 		Args: cobra.NoArgs, | ||||||
| 		RunE: func(cmd *cobra.Command, args []string) error { | 		RunE: func(cmd *cobra.Command, args []string) error { | ||||||
| @ -262,7 +265,7 @@ func queryBorrowsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 			var owner sdk.AccAddress | 			var owner sdk.AccAddress | ||||||
| 
 | 
 | ||||||
| 			ownerBech := viper.GetString(flagOwner) | 			ownerBech := viper.GetString(flagOwner) | ||||||
| 			depositDenom := viper.GetString(flagDepositDenom) | 			denom := viper.GetString(flagDenom) | ||||||
| 
 | 
 | ||||||
| 			if len(ownerBech) != 0 { | 			if len(ownerBech) != 0 { | ||||||
| 				borrowOwner, err := sdk.AccAddressFromBech32(ownerBech) | 				borrowOwner, err := sdk.AccAddressFromBech32(ownerBech) | ||||||
| @ -272,10 +275,12 @@ func queryBorrowsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 				owner = borrowOwner | 				owner = borrowOwner | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | 			// Note: The 10 users with the lowest LTV ratio have their outstanding debt applied each block, so if
 | ||||||
|  | 			// testing with 10 or less addresses they'll all show their latest balance including outstanding debt.
 | ||||||
| 			page := viper.GetInt(flags.FlagPage) | 			page := viper.GetInt(flags.FlagPage) | ||||||
| 			limit := viper.GetInt(flags.FlagLimit) | 			limit := viper.GetInt(flags.FlagLimit) | ||||||
| 
 | 
 | ||||||
| 			params := types.NewQueryBorrowsParams(page, limit, owner, depositDenom) | 			params := types.NewQueryBorrowsParams(page, limit, owner, denom) | ||||||
| 			bz, err := cdc.MarshalJSON(params) | 			bz, err := cdc.MarshalJSON(params) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| @ -288,7 +293,7 @@ func queryBorrowsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 			} | 			} | ||||||
| 			cliCtx = cliCtx.WithHeight(height) | 			cliCtx = cliCtx.WithHeight(height) | ||||||
| 
 | 
 | ||||||
| 			var borrows []types.Borrow | 			var borrows types.Borrows | ||||||
| 			if err := cdc.UnmarshalJSON(res, &borrows); err != nil { | 			if err := cdc.UnmarshalJSON(res, &borrows); err != nil { | ||||||
| 				return fmt.Errorf("failed to unmarshal borrows: %w", err) | 				return fmt.Errorf("failed to unmarshal borrows: %w", err) | ||||||
| 			} | 			} | ||||||
| @ -298,126 +303,92 @@ func queryBorrowsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 	cmd.Flags().Int(flags.FlagPage, 1, "pagination page to query for") | 	cmd.Flags().Int(flags.FlagPage, 1, "pagination page to query for") | ||||||
| 	cmd.Flags().Int(flags.FlagLimit, 100, "pagination limit (max 100)") | 	cmd.Flags().Int(flags.FlagLimit, 100, "pagination limit (max 100)") | ||||||
| 	cmd.Flags().String(flagOwner, "", "(optional) filter for borrows by owner address") | 	cmd.Flags().String(flagOwner, "", "(optional) filter for borrows by owner address") | ||||||
|  | 	cmd.Flags().String(flagDenom, "", "(optional) filter for borrows by denom") | ||||||
| 	return cmd | 	return cmd | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func queryBorrowedCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | func queryTotalBorrowedCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | ||||||
| 	return &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| 		Use:   "borrowed", | 		Use:   "total-borrowed", | ||||||
| 		Short: "get total current borrowed amount", | 		Short: "get total current borrowed amount", | ||||||
| 		Long:  "get the total amount of coins currently borrowed for the Hard protocol", | 		Long: strings.TrimSpace(`get the total amount of coins currently borrowed using flags: | ||||||
| 		Args:  cobra.NoArgs, | 
 | ||||||
|  | 		Example: | ||||||
|  | 		$ kvcli q hard total-borrowed | ||||||
|  | 		$ kvcli q hard total-borrowed --denom bnb`, | ||||||
|  | 		), | ||||||
|  | 		Args: cobra.NoArgs, | ||||||
| 		RunE: func(cmd *cobra.Command, args []string) error { | 		RunE: func(cmd *cobra.Command, args []string) error { | ||||||
| 			cliCtx := context.NewCLIContext().WithCodec(cdc) | 			cliCtx := context.NewCLIContext().WithCodec(cdc) | ||||||
| 
 | 
 | ||||||
| 			// Query
 | 			denom := viper.GetString(flagDenom) | ||||||
| 			route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetBorrowed) | 
 | ||||||
| 			res, height, err := cliCtx.QueryWithData(route, nil) | 			// Construct query with params
 | ||||||
|  | 			params := types.NewQueryTotalBorrowedParams(denom) | ||||||
|  | 			bz, err := cdc.MarshalJSON(params) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			// Execute query
 | ||||||
|  | 			route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetTotalBorrowed) | ||||||
|  | 			res, height, err := cliCtx.QueryWithData(route, bz) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
| 			cliCtx = cliCtx.WithHeight(height) | 			cliCtx = cliCtx.WithHeight(height) | ||||||
| 
 | 
 | ||||||
| 			// Decode and print results
 | 			// Decode and print results
 | ||||||
| 			var borrowedCoins sdk.Coins | 			var totalBorrowedCoins sdk.Coins | ||||||
| 			if err := cdc.UnmarshalJSON(res, &borrowedCoins); err != nil { | 			if err := cdc.UnmarshalJSON(res, &totalBorrowedCoins); err != nil { | ||||||
| 				return fmt.Errorf("failed to unmarshal borrowed coins: %w", err) | 				return fmt.Errorf("failed to unmarshal total borrowed coins: %w", err) | ||||||
| 			} | 			} | ||||||
| 			return cliCtx.PrintOutput(borrowedCoins) | 			return cliCtx.PrintOutput(totalBorrowedCoins) | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|  | 	cmd.Flags().String(flagDenom, "", "(optional) filter total borrowed coins by denom") | ||||||
|  | 	return cmd | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func queryBorrowCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | func queryTotalDepositedCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | ||||||
| 	cmd := &cobra.Command{ | 	cmd := &cobra.Command{ | ||||||
| 		Use:   "borrow", | 		Use:   "total-deposited", | ||||||
| 		Short: "query outstanding borrow balance for a user", | 		Short: "get total current deposited amount", | ||||||
| 		Long: strings.TrimSpace(`query outstanding borrow balance for a user: | 		Long: strings.TrimSpace(`get the total amount of coins currently deposited using flags: | ||||||
|  | 
 | ||||||
| 		Example: | 		Example: | ||||||
| 		$ kvcli q hard borrow --owner kava1l0xsq2z7gqd7yly0g40y5836g0appumark77ny`, | 		$ kvcli q hard total-deposited | ||||||
|  | 		$ kvcli q hard total-deposited --denom bnb`, | ||||||
| 		), | 		), | ||||||
| 		Args: cobra.NoArgs, | 		Args: cobra.NoArgs, | ||||||
| 		RunE: func(cmd *cobra.Command, args []string) error { | 		RunE: func(cmd *cobra.Command, args []string) error { | ||||||
| 			cliCtx := context.NewCLIContext().WithCodec(cdc) | 			cliCtx := context.NewCLIContext().WithCodec(cdc) | ||||||
| 
 | 
 | ||||||
| 			var owner sdk.AccAddress | 			denom := viper.GetString(flagDenom) | ||||||
| 
 | 
 | ||||||
| 			ownerBech := viper.GetString(flagOwner) | 			// Construct query with params
 | ||||||
| 			if len(ownerBech) != 0 { | 			params := types.NewQueryTotalDepositedParams(denom) | ||||||
| 				borrowOwner, err := sdk.AccAddressFromBech32(ownerBech) |  | ||||||
| 				if err != nil { |  | ||||||
| 					return err |  | ||||||
| 				} |  | ||||||
| 				owner = borrowOwner |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			params := types.NewQueryBorrowParams(owner) |  | ||||||
| 			bz, err := cdc.MarshalJSON(params) | 			bz, err := cdc.MarshalJSON(params) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetBorrow) | 			// Execute query
 | ||||||
|  | 			route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetTotalDeposited) | ||||||
| 			res, height, err := cliCtx.QueryWithData(route, bz) | 			res, height, err := cliCtx.QueryWithData(route, bz) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| 			} | 			} | ||||||
| 			cliCtx = cliCtx.WithHeight(height) | 			cliCtx = cliCtx.WithHeight(height) | ||||||
| 
 | 
 | ||||||
| 			var balance sdk.Coins | 			// Decode and print results
 | ||||||
| 			if err := cdc.UnmarshalJSON(res, &balance); err != nil { | 			var totalSuppliedCoins sdk.Coins | ||||||
| 				return fmt.Errorf("failed to unmarshal borrow balance: %w", err) | 			if err := cdc.UnmarshalJSON(res, &totalSuppliedCoins); err != nil { | ||||||
|  | 				return fmt.Errorf("failed to unmarshal total deposited coins: %w", err) | ||||||
| 			} | 			} | ||||||
| 			return cliCtx.PrintOutput(balance) | 			return cliCtx.PrintOutput(totalSuppliedCoins) | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| 	cmd.Flags().String(flagOwner, "", "filter for borrows by owner address") | 	cmd.Flags().String(flagDenom, "", "(optional) filter total deposited coins by denom") | ||||||
| 	return cmd |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func queryDepositCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { |  | ||||||
| 	cmd := &cobra.Command{ |  | ||||||
| 		Use:   "deposit", |  | ||||||
| 		Short: "query outstanding deposit balance for a user", |  | ||||||
| 		Long: strings.TrimSpace(`query outstanding deposit balance for a user: |  | ||||||
| 		Example: |  | ||||||
| 		$ kvcli q hard deposit --owner kava1l0xsq2z7gqd7yly0g40y5836g0appumark77ny`, |  | ||||||
| 		), |  | ||||||
| 		Args: cobra.NoArgs, |  | ||||||
| 		RunE: func(cmd *cobra.Command, args []string) error { |  | ||||||
| 			cliCtx := context.NewCLIContext().WithCodec(cdc) |  | ||||||
| 
 |  | ||||||
| 			var owner sdk.AccAddress |  | ||||||
| 
 |  | ||||||
| 			ownerBech := viper.GetString(flagOwner) |  | ||||||
| 			if len(ownerBech) != 0 { |  | ||||||
| 				borrowOwner, err := sdk.AccAddressFromBech32(ownerBech) |  | ||||||
| 				if err != nil { |  | ||||||
| 					return err |  | ||||||
| 				} |  | ||||||
| 				owner = borrowOwner |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			params := types.NewQueryDepositParams(owner) |  | ||||||
| 			bz, err := cdc.MarshalJSON(params) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetDeposit) |  | ||||||
| 			res, height, err := cliCtx.QueryWithData(route, bz) |  | ||||||
| 			if err != nil { |  | ||||||
| 				return err |  | ||||||
| 			} |  | ||||||
| 			cliCtx = cliCtx.WithHeight(height) |  | ||||||
| 
 |  | ||||||
| 			var balance sdk.Coins |  | ||||||
| 			if err := cdc.UnmarshalJSON(res, &balance); err != nil { |  | ||||||
| 				return fmt.Errorf("failed to unmarshal borrow balance: %w", err) |  | ||||||
| 			} |  | ||||||
| 			return cliCtx.PrintOutput(balance) |  | ||||||
| 		}, |  | ||||||
| 	} |  | ||||||
| 	cmd.Flags().String(flagOwner, "", "filter for borrows by owner address") |  | ||||||
| 	return cmd | 	return cmd | ||||||
| } | } | ||||||
|  | |||||||
| @ -17,11 +17,11 @@ import ( | |||||||
| func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router) { | func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router) { | ||||||
| 	r.HandleFunc(fmt.Sprintf("/%s/parameters", types.ModuleName), queryParamsHandlerFn(cliCtx)).Methods("GET") | 	r.HandleFunc(fmt.Sprintf("/%s/parameters", types.ModuleName), queryParamsHandlerFn(cliCtx)).Methods("GET") | ||||||
| 	r.HandleFunc(fmt.Sprintf("/%s/deposits", types.ModuleName), queryDepositsHandlerFn(cliCtx)).Methods("GET") | 	r.HandleFunc(fmt.Sprintf("/%s/deposits", types.ModuleName), queryDepositsHandlerFn(cliCtx)).Methods("GET") | ||||||
|  | 	r.HandleFunc(fmt.Sprintf("/%s/total-deposited", types.ModuleName), queryTotalDepositedHandlerFn(cliCtx)).Methods("GET") | ||||||
| 	r.HandleFunc(fmt.Sprintf("/%s/claims", types.ModuleName), queryClaimsHandlerFn(cliCtx)).Methods("GET") | 	r.HandleFunc(fmt.Sprintf("/%s/claims", types.ModuleName), queryClaimsHandlerFn(cliCtx)).Methods("GET") | ||||||
| 	r.HandleFunc(fmt.Sprintf("/%s/accounts", types.ModuleName), queryModAccountsHandlerFn(cliCtx)).Methods("GET") | 	r.HandleFunc(fmt.Sprintf("/%s/accounts", types.ModuleName), queryModAccountsHandlerFn(cliCtx)).Methods("GET") | ||||||
| 	r.HandleFunc(fmt.Sprintf("/%s/borrows", types.ModuleName), queryBorrowsHandlerFn(cliCtx)).Methods("GET") | 	r.HandleFunc(fmt.Sprintf("/%s/borrows", types.ModuleName), queryBorrowsHandlerFn(cliCtx)).Methods("GET") | ||||||
| 	r.HandleFunc(fmt.Sprintf("/%s/borrow", types.ModuleName), queryBorrowHandlerFn(cliCtx)).Methods("GET") | 	r.HandleFunc(fmt.Sprintf("/%s/total-borrowed", types.ModuleName), queryTotalBorrowedHandlerFn(cliCtx)).Methods("GET") | ||||||
| 	r.HandleFunc(fmt.Sprintf("/%s/borrowed", types.ModuleName), queryBorrowedHandlerFn(cliCtx)).Methods("GET") |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func queryParamsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | func queryParamsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | ||||||
| @ -57,23 +57,23 @@ func queryDepositsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | |||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		var depositDenom string | 		var denom string | ||||||
| 		var depositOwner sdk.AccAddress | 		var owner sdk.AccAddress | ||||||
| 
 | 
 | ||||||
| 		if x := r.URL.Query().Get(RestDenom); len(x) != 0 { | 		if x := r.URL.Query().Get(RestDenom); len(x) != 0 { | ||||||
| 			depositDenom = strings.TrimSpace(x) | 			denom = strings.TrimSpace(x) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if x := r.URL.Query().Get(RestOwner); len(x) != 0 { | 		if x := r.URL.Query().Get(RestOwner); len(x) != 0 { | ||||||
| 			depositOwnerStr := strings.ToLower(strings.TrimSpace(x)) | 			ownerStr := strings.ToLower(strings.TrimSpace(x)) | ||||||
| 			depositOwner, err = sdk.AccAddressFromBech32(depositOwnerStr) | 			owner, err = sdk.AccAddressFromBech32(ownerStr) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("cannot parse address from deposit owner %s", depositOwnerStr)) | 				rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("cannot parse address from deposit owner %s", ownerStr)) | ||||||
| 				return | 				return | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		params := types.NewQueryDepositsParams(page, limit, depositDenom, depositOwner) | 		params := types.NewQueryDepositsParams(page, limit, denom, owner) | ||||||
| 
 | 
 | ||||||
| 		bz, err := cliCtx.Codec.MarshalJSON(params) | 		bz, err := cliCtx.Codec.MarshalJSON(params) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -92,6 +92,44 @@ func queryDepositsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func queryTotalDepositedHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | ||||||
|  | 	return func(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 		_, _, _, err := rest.ParseHTTPArgsWithLimit(r, 0) | ||||||
|  | 		if err != nil { | ||||||
|  | 			rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		// Parse the query height
 | ||||||
|  | 		cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) | ||||||
|  | 		if !ok { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		var denom string | ||||||
|  | 
 | ||||||
|  | 		if x := r.URL.Query().Get(RestDenom); len(x) != 0 { | ||||||
|  | 			denom = strings.TrimSpace(x) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		params := types.NewQueryTotalDepositedParams(denom) | ||||||
|  | 
 | ||||||
|  | 		bz, err := cliCtx.Codec.MarshalJSON(params) | ||||||
|  | 		if err != nil { | ||||||
|  | 			rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		route := fmt.Sprintf("custom/%s/%s", types.ModuleName, types.QueryGetTotalDeposited) | ||||||
|  | 		res, height, err := cliCtx.QueryWithData(route, bz) | ||||||
|  | 		cliCtx = cliCtx.WithHeight(height) | ||||||
|  | 		if err != nil { | ||||||
|  | 			rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		rest.PostProcessResponse(w, cliCtx, res) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func queryClaimsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | func queryClaimsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | ||||||
| 	return func(w http.ResponseWriter, r *http.Request) { | 	return func(w http.ResponseWriter, r *http.Request) { | ||||||
| 		_, page, limit, err := rest.ParseHTTPArgsWithLimit(r, 0) | 		_, page, limit, err := rest.ParseHTTPArgsWithLimit(r, 0) | ||||||
| @ -105,12 +143,12 @@ func queryClaimsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | |||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		var depositDenom string | 		var denom string | ||||||
| 		var claimOwner sdk.AccAddress | 		var claimOwner sdk.AccAddress | ||||||
| 		var claimType types.ClaimType | 		var claimType types.ClaimType | ||||||
| 
 | 
 | ||||||
| 		if x := r.URL.Query().Get(RestDenom); len(x) != 0 { | 		if x := r.URL.Query().Get(RestDenom); len(x) != 0 { | ||||||
| 			depositDenom = strings.TrimSpace(x) | 			denom = strings.TrimSpace(x) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if x := r.URL.Query().Get(RestOwner); len(x) != 0 { | 		if x := r.URL.Query().Get(RestOwner); len(x) != 0 { | ||||||
| @ -122,7 +160,7 @@ func queryClaimsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if x := r.URL.Query().Get(RestType); len(x) != 0 { | 		if x := r.URL.Query().Get(RestClaimType); len(x) != 0 { | ||||||
| 			claimTypeStr := strings.ToLower(strings.TrimSpace(x)) | 			claimTypeStr := strings.ToLower(strings.TrimSpace(x)) | ||||||
| 			err := types.ClaimType(claimTypeStr).IsValid() | 			err := types.ClaimType(claimTypeStr).IsValid() | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| @ -132,7 +170,7 @@ func queryClaimsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | |||||||
| 			claimType = types.ClaimType(claimTypeStr) | 			claimType = types.ClaimType(claimTypeStr) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		params := types.NewQueryClaimParams(page, limit, depositDenom, claimOwner, claimType) | 		params := types.NewQueryClaimParams(page, limit, denom, claimOwner, claimType) | ||||||
| 
 | 
 | ||||||
| 		bz, err := cliCtx.Codec.MarshalJSON(params) | 		bz, err := cliCtx.Codec.MarshalJSON(params) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -164,23 +202,23 @@ func queryBorrowsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | |||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		var borrowDenom string | 		var denom string | ||||||
| 		var borrowOwner sdk.AccAddress | 		var owner sdk.AccAddress | ||||||
| 
 | 
 | ||||||
| 		if x := r.URL.Query().Get(RestBorrowDenom); len(x) != 0 { | 		if x := r.URL.Query().Get(RestDenom); len(x) != 0 { | ||||||
| 			borrowDenom = strings.TrimSpace(x) | 			denom = strings.TrimSpace(x) | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if x := r.URL.Query().Get(RestOwner); len(x) != 0 { | 		if x := r.URL.Query().Get(RestOwner); len(x) != 0 { | ||||||
| 			borrowOwnerStr := strings.ToLower(strings.TrimSpace(x)) | 			ownerStr := strings.ToLower(strings.TrimSpace(x)) | ||||||
| 			borrowOwner, err = sdk.AccAddressFromBech32(borrowOwnerStr) | 			owner, err = sdk.AccAddressFromBech32(ownerStr) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("cannot parse address from borrow owner %s", borrowOwnerStr)) | 				rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("cannot parse address from borrow owner %s", ownerStr)) | ||||||
| 				return | 				return | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		params := types.NewQueryBorrowsParams(page, limit, borrowOwner, borrowDenom) | 		params := types.NewQueryBorrowsParams(page, limit, owner, denom) | ||||||
| 
 | 
 | ||||||
| 		bz, err := cliCtx.Codec.MarshalJSON(params) | 		bz, err := cliCtx.Codec.MarshalJSON(params) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -199,7 +237,7 @@ func queryBorrowsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func queryBorrowHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | func queryTotalBorrowedHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | ||||||
| 	return func(w http.ResponseWriter, r *http.Request) { | 	return func(w http.ResponseWriter, r *http.Request) { | ||||||
| 		_, _, _, err := rest.ParseHTTPArgsWithLimit(r, 0) | 		_, _, _, err := rest.ParseHTTPArgsWithLimit(r, 0) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -212,18 +250,13 @@ func queryBorrowHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | |||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		var borrowOwner sdk.AccAddress | 		var denom string | ||||||
| 
 | 
 | ||||||
| 		if x := r.URL.Query().Get(RestOwner); len(x) != 0 { | 		if x := r.URL.Query().Get(RestDenom); len(x) != 0 { | ||||||
| 			borrowOwnerStr := strings.ToLower(strings.TrimSpace(x)) | 			denom = strings.TrimSpace(x) | ||||||
| 			borrowOwner, err = sdk.AccAddressFromBech32(borrowOwnerStr) |  | ||||||
| 			if err != nil { |  | ||||||
| 				rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("cannot parse address from borrow owner %s", borrowOwnerStr)) |  | ||||||
| 				return |  | ||||||
| 			} |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		params := types.NewQueryBorrowParams(borrowOwner) | 		params := types.NewQueryTotalBorrowedParams(denom) | ||||||
| 
 | 
 | ||||||
| 		bz, err := cliCtx.Codec.MarshalJSON(params) | 		bz, err := cliCtx.Codec.MarshalJSON(params) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @ -231,45 +264,7 @@ func queryBorrowHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | |||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		route := fmt.Sprintf("custom/%s/%s", types.ModuleName, types.QueryGetBorrow) | 		route := fmt.Sprintf("custom/%s/%s", types.ModuleName, types.QueryGetTotalBorrowed) | ||||||
| 		res, height, err := cliCtx.QueryWithData(route, bz) |  | ||||||
| 		cliCtx = cliCtx.WithHeight(height) |  | ||||||
| 		if err != nil { |  | ||||||
| 			rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) |  | ||||||
| 			return |  | ||||||
| 		} |  | ||||||
| 		rest.PostProcessResponse(w, cliCtx, res) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func queryBorrowedHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { |  | ||||||
| 	return func(w http.ResponseWriter, r *http.Request) { |  | ||||||
| 		_, _, _, err := rest.ParseHTTPArgsWithLimit(r, 0) |  | ||||||
| 		if err != nil { |  | ||||||
| 			rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) |  | ||||||
| 			return |  | ||||||
| 		} |  | ||||||
| 		// Parse the query height
 |  | ||||||
| 		cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) |  | ||||||
| 		if !ok { |  | ||||||
| 			return |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		var borrowDenom string |  | ||||||
| 
 |  | ||||||
| 		if x := r.URL.Query().Get(RestBorrowDenom); len(x) != 0 { |  | ||||||
| 			borrowDenom = strings.TrimSpace(x) |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		params := types.NewQueryBorrowedParams(borrowDenom) |  | ||||||
| 
 |  | ||||||
| 		bz, err := cliCtx.Codec.MarshalJSON(params) |  | ||||||
| 		if err != nil { |  | ||||||
| 			rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) |  | ||||||
| 			return |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		route := fmt.Sprintf("custom/%s/%s", types.ModuleName, types.QueryGetBorrowed) |  | ||||||
| 		res, height, err := cliCtx.QueryWithData(route, bz) | 		res, height, err := cliCtx.QueryWithData(route, bz) | ||||||
| 		cliCtx = cliCtx.WithHeight(height) | 		cliCtx = cliCtx.WithHeight(height) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
|  | |||||||
| @ -11,11 +11,10 @@ import ( | |||||||
| // REST variable names
 | // REST variable names
 | ||||||
| // nolint
 | // nolint
 | ||||||
| const ( | const ( | ||||||
| 	RestOwner       = "owner" | 	RestOwner     = "owner" | ||||||
| 	RestDenom       = "deposit-denom" | 	RestDenom     = "denom" | ||||||
| 	RestType        = "deposit-type" | 	RestClaimType = "claim-type" | ||||||
| 	RestBorrowDenom = "borrow-denom" | 	RestName      = "name" | ||||||
| 	RestName        = "name" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // RegisterRoutes registers hard-related REST handlers to a router
 | // RegisterRoutes registers hard-related REST handlers to a router
 | ||||||
|  | |||||||
| @ -251,15 +251,20 @@ func (k Keeper) DecrementBorrowedCoins(ctx sdk.Context, coins sdk.Coins) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetBorrowBalance gets the user's total borrow balance (borrow balance + pending interest)
 | // GetSyncedBorrow returns a borrow object containing current balances and indexes
 | ||||||
| func (k Keeper) GetBorrowBalance(ctx sdk.Context, borrower sdk.AccAddress) sdk.Coins { | func (k Keeper) GetSyncedBorrow(ctx sdk.Context, borrower sdk.AccAddress) (types.Borrow, bool) { | ||||||
| 	borrowBalance := sdk.Coins{} |  | ||||||
| 	borrow, found := k.GetBorrow(ctx, borrower) | 	borrow, found := k.GetBorrow(ctx, borrower) | ||||||
| 	if !found { | 	if !found { | ||||||
| 		return borrowBalance | 		return types.Borrow{}, false | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	return k.loadSyncedBorrow(ctx, borrow), true | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // loadSyncedBorrow calculates a user's synced borrow, but does not update state
 | ||||||
|  | func (k Keeper) loadSyncedBorrow(ctx sdk.Context, borrow types.Borrow) types.Borrow { | ||||||
| 	totalNewInterest := sdk.Coins{} | 	totalNewInterest := sdk.Coins{} | ||||||
|  | 	newBorrowIndexes := types.BorrowInterestFactors{} | ||||||
| 	for _, coin := range borrow.Amount { | 	for _, coin := range borrow.Amount { | ||||||
| 		interestFactorValue, foundInterestFactorValue := k.GetBorrowInterestFactor(ctx, coin.Denom) | 		interestFactorValue, foundInterestFactorValue := k.GetBorrowInterestFactor(ctx, coin.Denom) | ||||||
| 		if foundInterestFactorValue { | 		if foundInterestFactorValue { | ||||||
| @ -271,6 +276,7 @@ func (k Keeper) GetBorrowBalance(ctx sdk.Context, borrower sdk.AccAddress) sdk.C | |||||||
| 					break | 					break | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  | 
 | ||||||
| 			// Calculate interest owed by user for this asset
 | 			// Calculate interest owed by user for this asset
 | ||||||
| 			if foundAtIndex != -1 { | 			if foundAtIndex != -1 { | ||||||
| 				storedAmount := sdk.NewDecFromInt(borrow.Amount.AmountOf(coin.Denom)) | 				storedAmount := sdk.NewDecFromInt(borrow.Amount.AmountOf(coin.Denom)) | ||||||
| @ -279,7 +285,10 @@ func (k Keeper) GetBorrowBalance(ctx sdk.Context, borrower sdk.AccAddress) sdk.C | |||||||
| 				totalNewInterest = totalNewInterest.Add(sdk.NewCoin(coin.Denom, coinInterest.TruncateInt())) | 				totalNewInterest = totalNewInterest.Add(sdk.NewCoin(coin.Denom, coinInterest.TruncateInt())) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
|  | 		borrowIndex := types.NewBorrowInterestFactor(coin.Denom, interestFactorValue) | ||||||
|  | 		newBorrowIndexes = append(newBorrowIndexes, borrowIndex) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return borrow.Amount.Add(totalNewInterest...) | 	return types.NewBorrow(borrow.Borrower, borrow.Amount.Add(totalNewInterest...), newBorrowIndexes) | ||||||
| } | } | ||||||
|  | |||||||
| @ -167,15 +167,20 @@ func (k Keeper) DecrementSuppliedCoins(ctx sdk.Context, coins sdk.Coins) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // GetSupplyBalance gets the user's total supply balance (supply balance + pending interest)
 | // GetSyncedDeposit returns a deposit object containing current balances and indexes
 | ||||||
| func (k Keeper) GetSupplyBalance(ctx sdk.Context, depositor sdk.AccAddress) sdk.Coins { | func (k Keeper) GetSyncedDeposit(ctx sdk.Context, depositor sdk.AccAddress) (types.Deposit, bool) { | ||||||
| 	supplyBalance := sdk.Coins{} |  | ||||||
| 	deposit, found := k.GetDeposit(ctx, depositor) | 	deposit, found := k.GetDeposit(ctx, depositor) | ||||||
| 	if !found { | 	if !found { | ||||||
| 		return supplyBalance | 		return types.Deposit{}, false | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	return k.loadSyncedDeposit(ctx, deposit), true | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // loadSyncedDeposit calculates a user's synced deposit, but does not update state
 | ||||||
|  | func (k Keeper) loadSyncedDeposit(ctx sdk.Context, deposit types.Deposit) types.Deposit { | ||||||
| 	totalNewInterest := sdk.Coins{} | 	totalNewInterest := sdk.Coins{} | ||||||
|  | 	newSupplyIndexes := types.SupplyInterestFactors{} | ||||||
| 	for _, coin := range deposit.Amount { | 	for _, coin := range deposit.Amount { | ||||||
| 		interestFactorValue, foundInterestFactorValue := k.GetSupplyInterestFactor(ctx, coin.Denom) | 		interestFactorValue, foundInterestFactorValue := k.GetSupplyInterestFactor(ctx, coin.Denom) | ||||||
| 		if foundInterestFactorValue { | 		if foundInterestFactorValue { | ||||||
| @ -187,7 +192,8 @@ func (k Keeper) GetSupplyBalance(ctx sdk.Context, depositor sdk.AccAddress) sdk. | |||||||
| 					break | 					break | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 			// Calculate interest owed by user for this asset
 | 
 | ||||||
|  | 			// Calculate interest that will be paid to user for this asset
 | ||||||
| 			if foundAtIndex != -1 { | 			if foundAtIndex != -1 { | ||||||
| 				storedAmount := sdk.NewDecFromInt(deposit.Amount.AmountOf(coin.Denom)) | 				storedAmount := sdk.NewDecFromInt(deposit.Amount.AmountOf(coin.Denom)) | ||||||
| 				userLastInterestFactor := deposit.Index[foundAtIndex].Value | 				userLastInterestFactor := deposit.Index[foundAtIndex].Value | ||||||
| @ -195,7 +201,10 @@ func (k Keeper) GetSupplyBalance(ctx sdk.Context, depositor sdk.AccAddress) sdk. | |||||||
| 				totalNewInterest = totalNewInterest.Add(sdk.NewCoin(coin.Denom, coinInterest.TruncateInt())) | 				totalNewInterest = totalNewInterest.Add(sdk.NewCoin(coin.Denom, coinInterest.TruncateInt())) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | 
 | ||||||
|  | 		supplyIndex := types.NewSupplyInterestFactor(coin.Denom, interestFactorValue) | ||||||
|  | 		newSupplyIndexes = append(newSupplyIndexes, supplyIndex) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return deposit.Amount.Add(totalNewInterest...) | 	return types.NewDeposit(deposit.Depositor, deposit.Amount.Add(totalNewInterest...), newSupplyIndexes) | ||||||
| } | } | ||||||
|  | |||||||
| @ -22,16 +22,14 @@ func NewQuerier(k Keeper) sdk.Querier { | |||||||
| 			return queryGetModAccounts(ctx, req, k) | 			return queryGetModAccounts(ctx, req, k) | ||||||
| 		case types.QueryGetDeposits: | 		case types.QueryGetDeposits: | ||||||
| 			return queryGetDeposits(ctx, req, k) | 			return queryGetDeposits(ctx, req, k) | ||||||
| 		case types.QueryGetDeposit: | 		case types.QueryGetTotalDeposited: | ||||||
| 			return queryGetDeposit(ctx, req, k) | 			return queryGetTotalDeposited(ctx, req, k) | ||||||
| 		case types.QueryGetClaims: | 		case types.QueryGetClaims: | ||||||
| 			return queryGetClaims(ctx, req, k) | 			return queryGetClaims(ctx, req, k) | ||||||
| 		case types.QueryGetBorrows: | 		case types.QueryGetBorrows: | ||||||
| 			return queryGetBorrows(ctx, req, k) | 			return queryGetBorrows(ctx, req, k) | ||||||
| 		case types.QueryGetBorrow: | 		case types.QueryGetTotalBorrowed: | ||||||
| 			return queryGetBorrow(ctx, req, k) | 			return queryGetTotalBorrowed(ctx, req, k) | ||||||
| 		case types.QueryGetBorrowed: |  | ||||||
| 			return queryGetBorrowed(ctx, req, k) |  | ||||||
| 		default: | 		default: | ||||||
| 			return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unknown %s query endpoint", types.ModuleName) | 			return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unknown %s query endpoint", types.ModuleName) | ||||||
| 		} | 		} | ||||||
| @ -86,33 +84,32 @@ func queryGetDeposits(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | ||||||
| 	} | 	} | ||||||
| 	depositDenom := len(params.DepositDenom) > 0 | 	denom := len(params.Denom) > 0 | ||||||
| 	owner := len(params.Owner) > 0 | 	owner := len(params.Owner) > 0 | ||||||
| 
 | 
 | ||||||
| 	var deposits []types.Deposit | 	var deposits types.Deposits | ||||||
| 	switch { | 	switch { | ||||||
| 	case depositDenom && owner: | 	case owner && denom: | ||||||
| 		deposit, found := k.GetDeposit(ctx, params.Owner) | 		deposit, found := k.GetSyncedDeposit(ctx, params.Owner) | ||||||
| 		if found { | 		if found { | ||||||
| 			for _, depCoin := range deposit.Amount { | 			for _, coin := range deposit.Amount { | ||||||
| 				if depCoin.Denom == params.DepositDenom { | 				if coin.Denom == params.Denom { | ||||||
| 					deposits = append(deposits, deposit) | 					deposits = append(deposits, deposit) | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 
 |  | ||||||
| 		} | 		} | ||||||
| 	case depositDenom: | 	case owner: | ||||||
|  | 		deposit, found := k.GetSyncedDeposit(ctx, params.Owner) | ||||||
|  | 		if found { | ||||||
|  | 			deposits = append(deposits, deposit) | ||||||
|  | 		} | ||||||
|  | 	case denom: | ||||||
| 		k.IterateDeposits(ctx, func(deposit types.Deposit) (stop bool) { | 		k.IterateDeposits(ctx, func(deposit types.Deposit) (stop bool) { | ||||||
| 			if deposit.Amount.AmountOf(params.DepositDenom).IsPositive() { | 			if deposit.Amount.AmountOf(params.Denom).IsPositive() { | ||||||
| 				deposits = append(deposits, deposit) | 				deposits = append(deposits, deposit) | ||||||
| 			} | 			} | ||||||
| 			return false | 			return false | ||||||
| 		}) | 		}) | ||||||
| 	case owner: |  | ||||||
| 		deposit, found := k.GetDeposit(ctx, params.Owner) |  | ||||||
| 		if found { |  | ||||||
| 			deposits = append(deposits, deposit) |  | ||||||
| 		} |  | ||||||
| 	default: | 	default: | ||||||
| 		k.IterateDeposits(ctx, func(deposit types.Deposit) (stop bool) { | 		k.IterateDeposits(ctx, func(deposit types.Deposit) (stop bool) { | ||||||
| 			deposits = append(deposits, deposit) | 			deposits = append(deposits, deposit) | ||||||
| @ -120,18 +117,35 @@ func queryGetDeposits(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, | |||||||
| 		}) | 		}) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	start, end := client.Paginate(len(deposits), params.Page, params.Limit, 100) | 	var bz []byte | ||||||
| 	if start < 0 || end < 0 { | 
 | ||||||
| 		deposits = []types.Deposit{} | 	// If owner param was specified then deposits array already contains the user's synced deposit
 | ||||||
| 	} else { | 	if owner { | ||||||
| 		deposits = deposits[start:end] | 		bz, err = codec.MarshalJSONIndent(types.ModuleCdc, deposits) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) | ||||||
|  | 		} | ||||||
|  | 		return bz, nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bz, err := codec.MarshalJSONIndent(types.ModuleCdc, deposits) | 	// Otherwise we need to simulate syncing of each deposit
 | ||||||
|  | 	var syncedDeposits types.Deposits | ||||||
|  | 	for _, deposit := range deposits { | ||||||
|  | 		syncedDeposit, _ := k.GetSyncedDeposit(ctx, deposit.Depositor) | ||||||
|  | 		syncedDeposits = append(syncedDeposits, syncedDeposit) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	start, end := client.Paginate(len(syncedDeposits), params.Page, params.Limit, 100) | ||||||
|  | 	if start < 0 || end < 0 { | ||||||
|  | 		syncedDeposits = types.Deposits{} | ||||||
|  | 	} else { | ||||||
|  | 		syncedDeposits = syncedDeposits[start:end] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	bz, err = codec.MarshalJSONIndent(types.ModuleCdc, syncedDeposits) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) | 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	return bz, nil | 	return bz, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -142,26 +156,26 @@ func queryGetClaims(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, e | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | ||||||
| 	} | 	} | ||||||
| 	depositDenom := len(params.DepositDenom) > 0 | 	depositDenom := len(params.Denom) > 0 | ||||||
| 	owner := len(params.Owner) > 0 | 	owner := len(params.Owner) > 0 | ||||||
| 	claimType := len(params.ClaimType) > 0 | 	claimType := len(params.ClaimType) > 0 | ||||||
| 
 | 
 | ||||||
| 	var claims []types.Claim | 	var claims []types.Claim | ||||||
| 	switch { | 	switch { | ||||||
| 	case depositDenom && owner && claimType: | 	case depositDenom && owner && claimType: | ||||||
| 		claim, found := k.GetClaim(ctx, params.Owner, params.DepositDenom, params.ClaimType) | 		claim, found := k.GetClaim(ctx, params.Owner, params.Denom, params.ClaimType) | ||||||
| 		if found { | 		if found { | ||||||
| 			claims = append(claims, claim) | 			claims = append(claims, claim) | ||||||
| 		} | 		} | ||||||
| 	case depositDenom && owner: | 	case depositDenom && owner: | ||||||
| 		for _, dt := range types.ClaimTypesClaimQuery { | 		for _, dt := range types.ClaimTypesClaimQuery { | ||||||
| 			claim, found := k.GetClaim(ctx, params.Owner, params.DepositDenom, dt) | 			claim, found := k.GetClaim(ctx, params.Owner, params.Denom, dt) | ||||||
| 			if found { | 			if found { | ||||||
| 				claims = append(claims, claim) | 				claims = append(claims, claim) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	case depositDenom && claimType: | 	case depositDenom && claimType: | ||||||
| 		k.IterateClaimsByTypeAndDenom(ctx, params.ClaimType, params.DepositDenom, func(claim types.Claim) (stop bool) { | 		k.IterateClaimsByTypeAndDenom(ctx, params.ClaimType, params.Denom, func(claim types.Claim) (stop bool) { | ||||||
| 			claims = append(claims, claim) | 			claims = append(claims, claim) | ||||||
| 			return false | 			return false | ||||||
| 		}) | 		}) | ||||||
| @ -185,7 +199,7 @@ func queryGetClaims(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, e | |||||||
| 		} | 		} | ||||||
| 	case depositDenom: | 	case depositDenom: | ||||||
| 		for _, dt := range types.ClaimTypesClaimQuery { | 		for _, dt := range types.ClaimTypesClaimQuery { | ||||||
| 			k.IterateClaimsByTypeAndDenom(ctx, dt, params.DepositDenom, func(claim types.Claim) (stop bool) { | 			k.IterateClaimsByTypeAndDenom(ctx, dt, params.Denom, func(claim types.Claim) (stop bool) { | ||||||
| 				claims = append(claims, claim) | 				claims = append(claims, claim) | ||||||
| 				return false | 				return false | ||||||
| 			}) | 			}) | ||||||
| @ -241,39 +255,79 @@ func queryGetClaims(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, e | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func queryGetBorrows(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { | func queryGetBorrows(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { | ||||||
|  | 
 | ||||||
| 	var params types.QueryBorrowsParams | 	var params types.QueryBorrowsParams | ||||||
| 	err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) | 	err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | ||||||
| 	} | 	} | ||||||
|  | 	denom := len(params.Denom) > 0 | ||||||
|  | 	owner := len(params.Owner) > 0 | ||||||
| 
 | 
 | ||||||
| 	// TODO: filter query results
 | 	var borrows types.Borrows | ||||||
| 	// depositDenom := len(params.BorrowDenom) > 0
 | 	switch { | ||||||
| 	// owner := len(params.Owner) > 0
 | 	case owner && denom: | ||||||
| 
 | 		borrow, found := k.GetSyncedBorrow(ctx, params.Owner) | ||||||
| 	var borrows []types.Borrow | 		if found { | ||||||
| 	k.IterateBorrows(ctx, func(borrow types.Borrow) (stop bool) { | 			for _, coin := range borrow.Amount { | ||||||
| 		borrows = append(borrows, borrow) | 				if coin.Denom == params.Denom { | ||||||
| 		return false | 					borrows = append(borrows, borrow) | ||||||
| 	}) | 				} | ||||||
| 
 | 			} | ||||||
| 	start, end := client.Paginate(len(borrows), params.Page, params.Limit, 100) | 		} | ||||||
| 	if start < 0 || end < 0 { | 	case owner: | ||||||
| 		borrows = []types.Borrow{} | 		borrow, found := k.GetSyncedBorrow(ctx, params.Owner) | ||||||
| 	} else { | 		if found { | ||||||
| 		borrows = borrows[start:end] | 			borrows = append(borrows, borrow) | ||||||
|  | 		} | ||||||
|  | 	case denom: | ||||||
|  | 		k.IterateBorrows(ctx, func(borrow types.Borrow) (stop bool) { | ||||||
|  | 			if borrow.Amount.AmountOf(params.Denom).IsPositive() { | ||||||
|  | 				borrows = append(borrows, borrow) | ||||||
|  | 			} | ||||||
|  | 			return false | ||||||
|  | 		}) | ||||||
|  | 	default: | ||||||
|  | 		k.IterateBorrows(ctx, func(borrow types.Borrow) (stop bool) { | ||||||
|  | 			borrows = append(borrows, borrow) | ||||||
|  | 			return false | ||||||
|  | 		}) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bz, err := codec.MarshalJSONIndent(types.ModuleCdc, borrows) | 	var bz []byte | ||||||
|  | 
 | ||||||
|  | 	// If owner param was specified then borrows array already contains the user's synced borrow
 | ||||||
|  | 	if owner { | ||||||
|  | 		bz, err = codec.MarshalJSONIndent(types.ModuleCdc, borrows) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) | ||||||
|  | 		} | ||||||
|  | 		return bz, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Otherwise we need to simulate syncing of each borrow
 | ||||||
|  | 	var syncedBorrows types.Borrows | ||||||
|  | 	for _, borrow := range borrows { | ||||||
|  | 		syncedBorrow, _ := k.GetSyncedBorrow(ctx, borrow.Borrower) | ||||||
|  | 		syncedBorrows = append(syncedBorrows, syncedBorrow) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	start, end := client.Paginate(len(syncedBorrows), params.Page, params.Limit, 100) | ||||||
|  | 	if start < 0 || end < 0 { | ||||||
|  | 		syncedBorrows = types.Borrows{} | ||||||
|  | 	} else { | ||||||
|  | 		syncedBorrows = syncedBorrows[start:end] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	bz, err = codec.MarshalJSONIndent(types.ModuleCdc, syncedBorrows) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) | 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	return bz, nil | 	return bz, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func queryGetBorrowed(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { | func queryGetTotalBorrowed(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { | ||||||
| 	var params types.QueryBorrowedParams | 	var params types.QueryTotalBorrowedParams | ||||||
| 	err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) | 	err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | ||||||
| @ -297,39 +351,24 @@ func queryGetBorrowed(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, | |||||||
| 	return bz, nil | 	return bz, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func queryGetBorrow(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { | func queryGetTotalDeposited(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { | ||||||
| 	var params types.QueryBorrowsParams | 	var params types.QueryTotalDepositedParams | ||||||
| 	err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) | 	err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var borrowBalance sdk.Coins | 	suppliedCoins, found := k.GetSuppliedCoins(ctx) | ||||||
| 	if len(params.Owner) > 0 { | 	if !found { | ||||||
| 		borrowBalance = k.GetBorrowBalance(ctx, params.Owner) | 		return nil, types.ErrSuppliedCoinsNotFound | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	bz, err := codec.MarshalJSONIndent(types.ModuleCdc, borrowBalance) | 	// If user specified a denom only return coins of that denom type
 | ||||||
| 	if err != nil { | 	if len(params.Denom) > 0 { | ||||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) | 		suppliedCoins = sdk.NewCoins(sdk.NewCoin(params.Denom, suppliedCoins.AmountOf(params.Denom))) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	return bz, nil | 	bz, err := codec.MarshalJSONIndent(types.ModuleCdc, suppliedCoins) | ||||||
| } |  | ||||||
| 
 |  | ||||||
| func queryGetDeposit(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { |  | ||||||
| 	var params types.QueryDepositParams |  | ||||||
| 	err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	var supplyBalance sdk.Coins |  | ||||||
| 	if len(params.Owner) > 0 { |  | ||||||
| 		supplyBalance = k.GetSupplyBalance(ctx, params.Owner) |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	bz, err := codec.MarshalJSONIndent(types.ModuleCdc, supplyBalance) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) | 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -20,6 +20,9 @@ func NewBorrow(borrower sdk.AccAddress, amount sdk.Coins, index BorrowInterestFa | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Borrows is a slice of Borrow
 | ||||||
|  | type Borrows []Borrow | ||||||
|  | 
 | ||||||
| // BorrowInterestFactor defines an individual borrow interest factor
 | // BorrowInterestFactor defines an individual borrow interest factor
 | ||||||
| type BorrowInterestFactor struct { | type BorrowInterestFactor struct { | ||||||
| 	Denom string  `json:"denom" yaml:"denom"` | 	Denom string  `json:"denom" yaml:"denom"` | ||||||
|  | |||||||
| @ -20,6 +20,9 @@ func NewDeposit(depositor sdk.AccAddress, amount sdk.Coins, indexes SupplyIntere | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Deposits is a slice of Deposit
 | ||||||
|  | type Deposits []Deposit | ||||||
|  | 
 | ||||||
| // SupplyInterestFactor defines an individual borrow interest factor
 | // SupplyInterestFactor defines an individual borrow interest factor
 | ||||||
| type SupplyInterestFactor struct { | type SupplyInterestFactor struct { | ||||||
| 	Denom string  `json:"denom" yaml:"denom"` | 	Denom string  `json:"denom" yaml:"denom"` | ||||||
|  | |||||||
| @ -9,60 +9,47 @@ const ( | |||||||
| 	QueryGetParams         = "params" | 	QueryGetParams         = "params" | ||||||
| 	QueryGetModuleAccounts = "accounts" | 	QueryGetModuleAccounts = "accounts" | ||||||
| 	QueryGetDeposits       = "deposits" | 	QueryGetDeposits       = "deposits" | ||||||
| 	QueryGetDeposit        = "deposit" | 	QueryGetTotalDeposited = "total-deposited" | ||||||
| 	QueryGetClaims         = "claims" | 	QueryGetClaims         = "claims" | ||||||
| 	QueryGetBorrows        = "borrows" | 	QueryGetBorrows        = "borrows" | ||||||
| 	QueryGetBorrowed       = "borrowed" | 	QueryGetTotalBorrowed  = "total-borrowed" | ||||||
| 	QueryGetBorrow         = "borrow" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| // QueryDepositParams is the params for a filtered deposit query
 |  | ||||||
| type QueryDepositParams struct { |  | ||||||
| 	Owner sdk.AccAddress `json:"owner" yaml:"owner"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // NewQueryDepositParams creates a new QueryDepositParams
 |  | ||||||
| func NewQueryDepositParams(owner sdk.AccAddress) QueryDepositParams { |  | ||||||
| 	return QueryDepositParams{ |  | ||||||
| 		Owner: owner, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // QueryDepositsParams is the params for a filtered deposit query
 | // QueryDepositsParams is the params for a filtered deposit query
 | ||||||
| type QueryDepositsParams struct { | type QueryDepositsParams struct { | ||||||
| 	Page         int            `json:"page" yaml:"page"` | 	Page  int            `json:"page" yaml:"page"` | ||||||
| 	Limit        int            `json:"limit" yaml:"limit"` | 	Limit int            `json:"limit" yaml:"limit"` | ||||||
| 	DepositDenom string         `json:"deposit_denom" yaml:"deposit_denom"` | 	Denom string         `json:"denom" yaml:"denom"` | ||||||
| 	Owner        sdk.AccAddress `json:"owner" yaml:"owner"` | 	Owner sdk.AccAddress `json:"owner" yaml:"owner"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewQueryDepositsParams creates a new QueryDepositsParams
 | // NewQueryDepositsParams creates a new QueryDepositsParams
 | ||||||
| func NewQueryDepositsParams(page, limit int, depositDenom string, owner sdk.AccAddress) QueryDepositsParams { | func NewQueryDepositsParams(page, limit int, denom string, owner sdk.AccAddress) QueryDepositsParams { | ||||||
| 	return QueryDepositsParams{ | 	return QueryDepositsParams{ | ||||||
| 		Page:         page, | 		Page:  page, | ||||||
| 		Limit:        limit, | 		Limit: limit, | ||||||
| 		DepositDenom: depositDenom, | 		Denom: denom, | ||||||
| 		Owner:        owner, | 		Owner: owner, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // QueryClaimParams is the params for a filtered claim query
 | // QueryClaimParams is the params for a filtered claim query
 | ||||||
| type QueryClaimParams struct { | type QueryClaimParams struct { | ||||||
| 	Page         int            `json:"page" yaml:"page"` | 	Page      int            `json:"page" yaml:"page"` | ||||||
| 	Limit        int            `json:"limit" yaml:"limit"` | 	Limit     int            `json:"limit" yaml:"limit"` | ||||||
| 	DepositDenom string         `json:"deposit_denom" yaml:"deposit_denom"` | 	Denom     string         `json:"denom" yaml:"denom"` | ||||||
| 	Owner        sdk.AccAddress `json:"owner" yaml:"owner"` | 	Owner     sdk.AccAddress `json:"owner" yaml:"owner"` | ||||||
| 	ClaimType    ClaimType      `json:"claim_type" yaml:"claim_type"` | 	ClaimType ClaimType      `json:"claim_type" yaml:"claim_type"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewQueryClaimParams creates a new QueryClaimParams
 | // NewQueryClaimParams creates a new QueryClaimParams
 | ||||||
| func NewQueryClaimParams(page, limit int, depositDenom string, owner sdk.AccAddress, claimType ClaimType) QueryClaimParams { | func NewQueryClaimParams(page, limit int, denom string, owner sdk.AccAddress, claimType ClaimType) QueryClaimParams { | ||||||
| 	return QueryClaimParams{ | 	return QueryClaimParams{ | ||||||
| 		Page:         page, | 		Page:      page, | ||||||
| 		Limit:        limit, | 		Limit:     limit, | ||||||
| 		DepositDenom: depositDenom, | 		Denom:     denom, | ||||||
| 		Owner:        owner, | 		Owner:     owner, | ||||||
| 		ClaimType:    claimType, | 		ClaimType: claimType, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -84,42 +71,42 @@ func NewQueryAccountParams(page, limit int, name string) QueryAccountParams { | |||||||
| 
 | 
 | ||||||
| // QueryBorrowsParams is the params for a filtered borrows query
 | // QueryBorrowsParams is the params for a filtered borrows query
 | ||||||
| type QueryBorrowsParams struct { | type QueryBorrowsParams struct { | ||||||
| 	Page        int            `json:"page" yaml:"page"` | 	Page  int            `json:"page" yaml:"page"` | ||||||
| 	Limit       int            `json:"limit" yaml:"limit"` | 	Limit int            `json:"limit" yaml:"limit"` | ||||||
| 	Owner       sdk.AccAddress `json:"owner" yaml:"owner"` | 	Owner sdk.AccAddress `json:"owner" yaml:"owner"` | ||||||
| 	BorrowDenom string         `json:"borrow_denom" yaml:"borrow_denom"` | 	Denom string         `json:"denom" yaml:"denom"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewQueryBorrowsParams creates a new QueryBorrowsParams
 | // NewQueryBorrowsParams creates a new QueryBorrowsParams
 | ||||||
| func NewQueryBorrowsParams(page, limit int, owner sdk.AccAddress, borrowDenom string) QueryBorrowsParams { | func NewQueryBorrowsParams(page, limit int, owner sdk.AccAddress, denom string) QueryBorrowsParams { | ||||||
| 	return QueryBorrowsParams{ | 	return QueryBorrowsParams{ | ||||||
| 		Page:        page, | 		Page:  page, | ||||||
| 		Limit:       limit, | 		Limit: limit, | ||||||
| 		Owner:       owner, | 		Owner: owner, | ||||||
| 		BorrowDenom: borrowDenom, |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // QueryBorrowedParams is the params for a filtered borrowed coins query
 |  | ||||||
| type QueryBorrowedParams struct { |  | ||||||
| 	Denom string `json:"denom" yaml:"denom"` |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // NewQueryBorrowedParams creates a new QueryBorrowedParams
 |  | ||||||
| func NewQueryBorrowedParams(denom string) QueryBorrowedParams { |  | ||||||
| 	return QueryBorrowedParams{ |  | ||||||
| 		Denom: denom, | 		Denom: denom, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // QueryBorrowParams is the params for a current borrow balance query
 | // QueryTotalBorrowedParams is the params for a filtered total borrowed coins query
 | ||||||
| type QueryBorrowParams struct { | type QueryTotalBorrowedParams struct { | ||||||
| 	Owner sdk.AccAddress `json:"owner" yaml:"owner"` | 	Denom string `json:"denom" yaml:"denom"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // NewQueryBorrowParams creates a new QueryBorrowParams
 | // NewQueryTotalBorrowedParams creates a new QueryTotalBorrowedParams
 | ||||||
| func NewQueryBorrowParams(owner sdk.AccAddress) QueryBorrowParams { | func NewQueryTotalBorrowedParams(denom string) QueryTotalBorrowedParams { | ||||||
| 	return QueryBorrowParams{ | 	return QueryTotalBorrowedParams{ | ||||||
| 		Owner: owner, | 		Denom: denom, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // QueryTotalDepositedParams is the params for a filtered total deposited coins query
 | ||||||
|  | type QueryTotalDepositedParams struct { | ||||||
|  | 	Denom string `json:"denom" yaml:"denom"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewQueryTotalDepositedParams creates a new QueryTotalDepositedParams
 | ||||||
|  | func NewQueryTotalDepositedParams(denom string) QueryTotalDepositedParams { | ||||||
|  | 	return QueryTotalDepositedParams{ | ||||||
|  | 		Denom: denom, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Denali Marsh
						Denali Marsh