Skip to content

Commit

Permalink
Merge pull request #670 from comdex-official/feature/dev
Browse files Browse the repository at this point in the history
Multiple Parameters Update for v8
  • Loading branch information
dheerajkd30 authored Jan 31, 2023
2 parents 65812a1 + ac8726b commit a3b435a
Show file tree
Hide file tree
Showing 9 changed files with 875 additions and 94 deletions.
2 changes: 1 addition & 1 deletion app/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -1212,7 +1212,7 @@ func (a *App) ModuleAccountsPermissions() map[string][]string {
func (a *App) registerUpgradeHandlers() {
a.UpgradeKeeper.SetUpgradeHandler(
mv8.UpgradeName800,
mv8.CreateUpgradeHandler800(a.mm, a.configurator),
mv8.CreateUpgradeHandler800(a.mm, a.configurator, a.AssetKeeper, a.LendKeeper, a.AuctionKeeper),
)
// When a planned update height is reached, the old binary will panic
// writing on disk the height and name of the update that triggered it
Expand Down
2 changes: 1 addition & 1 deletion app/upgrades/mainnet/v8/constants.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package v8

const (
UpgradeName800 = "v8.0.0"
UpgradeName800 = "v8.1.0"
UpgradeHeight800 = ""
UpgradeInfo800 = `'{
"binaries": {
Expand Down
188 changes: 188 additions & 0 deletions app/upgrades/mainnet/v8/upgrades.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,205 @@
package v8

import (
"fmt"

"github.com/comdex-official/comdex/app/wasm/bindings"
assetkeeper "github.com/comdex-official/comdex/x/asset/keeper"
assettypes "github.com/comdex-official/comdex/x/asset/types"
auctionkeeper "github.com/comdex-official/comdex/x/auction/keeper"
lendkeeper "github.com/comdex-official/comdex/x/lend/keeper"
"github.com/comdex-official/comdex/x/lend/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/module"
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
)

func UpdateExtendedPairVaults(ctx sdk.Context, assetKeeper assetkeeper.Keeper) {
extPairs := []*bindings.MsgUpdatePairsVault{
{
AppID: 2, ExtPairID: 2, StabilityFee: sdk.MustNewDecFromStr("1"), ClosingFee: sdk.ZeroDec(), LiquidationPenalty: sdk.MustNewDecFromStr("0.15"),
DrawDownFee: sdk.MustNewDecFromStr("0.005"), IsVaultActive: true, DebtCeiling: sdk.NewInt(250000000000), DebtFloor: sdk.NewInt(50000000), MinCr: sdk.MustNewDecFromStr("1.4"),
MinUsdValueLeft: 100000,
},
{
AppID: 2, ExtPairID: 3, StabilityFee: sdk.MustNewDecFromStr("0.5"), ClosingFee: sdk.ZeroDec(), LiquidationPenalty: sdk.MustNewDecFromStr("0.15"),
DrawDownFee: sdk.MustNewDecFromStr("0.005"), IsVaultActive: true, DebtCeiling: sdk.NewInt(350000000000), DebtFloor: sdk.NewInt(50000000), MinCr: sdk.MustNewDecFromStr("1.7"),
MinUsdValueLeft: 100000,
},
{
AppID: 2, ExtPairID: 4, StabilityFee: sdk.MustNewDecFromStr("0.25"), ClosingFee: sdk.ZeroDec(), LiquidationPenalty: sdk.MustNewDecFromStr("0.15"),
DrawDownFee: sdk.MustNewDecFromStr("0.005"), IsVaultActive: true, DebtCeiling: sdk.NewInt(400000000000), DebtFloor: sdk.NewInt(50000000), MinCr: sdk.MustNewDecFromStr("2"),
MinUsdValueLeft: 100000,
},
{
AppID: 2, ExtPairID: 5, StabilityFee: sdk.MustNewDecFromStr("1"), ClosingFee: sdk.ZeroDec(), LiquidationPenalty: sdk.MustNewDecFromStr("0.15"),
DrawDownFee: sdk.MustNewDecFromStr("0.005"), IsVaultActive: true, DebtCeiling: sdk.NewInt(250000000000), DebtFloor: sdk.NewInt(50000000), MinCr: sdk.MustNewDecFromStr("1.5"),
MinUsdValueLeft: 100000,
},
{
AppID: 2, ExtPairID: 6, StabilityFee: sdk.MustNewDecFromStr("0.5"), ClosingFee: sdk.ZeroDec(), LiquidationPenalty: sdk.MustNewDecFromStr("0.15"),
DrawDownFee: sdk.MustNewDecFromStr("0.005"), IsVaultActive: true, DebtCeiling: sdk.NewInt(350000000000), DebtFloor: sdk.NewInt(50000000), MinCr: sdk.MustNewDecFromStr("1.8"),
MinUsdValueLeft: 100000,
},
{
AppID: 2, ExtPairID: 7, StabilityFee: sdk.MustNewDecFromStr("0.25"), ClosingFee: sdk.ZeroDec(), LiquidationPenalty: sdk.MustNewDecFromStr("0.15"),
DrawDownFee: sdk.MustNewDecFromStr("0.005"), IsVaultActive: true, DebtCeiling: sdk.NewInt(400000000000), DebtFloor: sdk.NewInt(50000000), MinCr: sdk.MustNewDecFromStr("2.1"),
MinUsdValueLeft: 100000,
},
}
for _, extPair := range extPairs {
err := assetKeeper.WasmUpdatePairsVault(ctx, extPair)
if err != nil {
fmt.Println("err in updating extended pair ", extPair.ExtPairID)
}
}
}

func Dec(s string) sdk.Dec {
dec, err := sdk.NewDecFromStr(s)
if err != nil {
panic(err)
}
return dec
}

func UpdateAuctionParams(
ctx sdk.Context,
assetKeeper assetkeeper.Keeper,
lendKeeper lendkeeper.Keeper,
auctionKeeper auctionkeeper.Keeper,
) {
// Add cAssets for USDC and stATOM
// Add Asset Rates for OSMO, USDC, stATOM
// Update auction params for lend module and Harbor app

// Adding cAssets
cUSDC := assettypes.Asset{
Name: "CAXLUSDC",
Denom: "ucaxlusdc",
Decimals: sdk.NewInt(1000000),
IsOnChain: true,
IsOraclePriceRequired: false,
IsCdpMintable: true,
}
err := assetKeeper.AddAssetRecords(ctx, cUSDC)
if err != nil {
return
}

cstATOM := assettypes.Asset{
Name: "CSTATOM",
Denom: "ucstatom",
Decimals: sdk.NewInt(1000000),
IsOnChain: true,
IsOraclePriceRequired: false,
IsCdpMintable: true,
}
err = assetKeeper.AddAssetRecords(ctx, cstATOM)
if err != nil {
return
}
// Adding Asset Rates
OSMORatesParams := types.AssetRatesParams{
AssetID: 4,
UOptimal: Dec("0.65"),
Base: Dec("0.002"),
Slope1: Dec("0.08"),
Slope2: Dec("1.5"),
EnableStableBorrow: false,
StableBase: Dec("0.0"),
StableSlope1: Dec("0.0"),
StableSlope2: Dec("0.0"),
Ltv: Dec("0.65"),
LiquidationThreshold: Dec("0.70"),
LiquidationPenalty: Dec("0.075"),
LiquidationBonus: Dec("0.075"),
ReserveFactor: Dec("0.2"),
CAssetID: 8,
}
lendKeeper.SetAssetRatesParams(ctx, OSMORatesParams)
axlUSDCRatesParams := types.AssetRatesParams{
AssetID: 10,
UOptimal: Dec("0.80"),
Base: Dec("0.002"),
Slope1: Dec("0.06"),
Slope2: Dec("0.6"),
EnableStableBorrow: false,
StableBase: Dec("0.0"),
StableSlope1: Dec("0.0"),
StableSlope2: Dec("0.0"),
Ltv: Dec("0.80"),
LiquidationThreshold: Dec("0.85"),
LiquidationPenalty: Dec("0.05"),
LiquidationBonus: Dec("0.05"),
ReserveFactor: Dec("0.2"),
CAssetID: 21,
}
lendKeeper.SetAssetRatesParams(ctx, axlUSDCRatesParams)

stATOMRatesParams := types.AssetRatesParams{
AssetID: 14,
UOptimal: Dec("0.60"),
Base: Dec("0.002"),
Slope1: Dec("0.08"),
Slope2: Dec("1.60"),
EnableStableBorrow: false,
StableBase: Dec("0.0"),
StableSlope1: Dec("0.0"),
StableSlope2: Dec("0.0"),
Ltv: Dec("0.6"),
LiquidationThreshold: Dec("0.65"),
LiquidationPenalty: Dec("0.075"),
LiquidationBonus: Dec("0.075"),
ReserveFactor: Dec("0.2"),
CAssetID: 22,
}
lendKeeper.SetAssetRatesParams(ctx, stATOMRatesParams)

auctionParamsLend := types.AuctionParams{
AppId: 3,
AuctionDurationSeconds: 18000,
Buffer: Dec("1.15"),
Cusp: Dec("0.7"),
Step: sdk.NewInt(360),
PriceFunctionType: 1,
DutchId: 3,
BidDurationSeconds: 3600,
}
err = lendKeeper.AddAuctionParamsData(ctx, auctionParamsLend)
if err != nil {
return
}

auctionParams := bindings.MsgAddAuctionParams{
AppID: 2,
AuctionDurationSeconds: 18000,
Buffer: Dec("1.15"),
Cusp: Dec("0.70"),
Step: 360,
PriceFunctionType: 1,
SurplusID: 1,
DebtID: 2,
DutchID: 3,
BidDurationSeconds: 3600,
}
err = auctionKeeper.AddAuctionParams(ctx, &auctionParams)
if err != nil {
return
}
}

func CreateUpgradeHandler800(
mm *module.Manager,
configurator module.Configurator,
assetKeeper assetkeeper.Keeper,
lendKeeper lendkeeper.Keeper,
auctionKeeper auctionkeeper.Keeper,
) upgradetypes.UpgradeHandler {
return func(ctx sdk.Context, _ upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) {
newVM, err := mm.RunMigrations(ctx, configurator, fromVM)
UpdateAuctionParams(ctx, assetKeeper, lendKeeper, auctionKeeper)
UpdateExtendedPairVaults(ctx, assetKeeper)
return newVM, err
}
}
15 changes: 15 additions & 0 deletions proto/comdex/rewards/v1beta1/query.proto
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ service Query {
rpc QueryEpochTime(QueryEpochTimeRequest) returns (QueryEpochTimeResponse) {
option (google.api.http).get = "/comdex/rewards/v1beta1/epoch_time";
}
rpc QueryExtLendRewardsAPR(QueryExtLendRewardsAPRRequest) returns (QueryExtLendRewardsAPRResponse) {
option (google.api.http).get = "/comdex/rewards/v1beta1/ext_rewards_lend_apr";
}
}


Expand Down Expand Up @@ -224,3 +227,15 @@ message QueryEpochTimeResponse {
cosmos.base.query.v1beta1.PageResponse pagination = 2
[(gogoproto.moretags) = "yaml:\"pagination\""];
}

message QueryExtLendRewardsAPRRequest {
uint64 asset_id = 1;
uint64 c_pool_id = 2;
}
message QueryExtLendRewardsAPRResponse {
string apr = 1 [
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.nullable) = false,
(gogoproto.moretags) = "yaml:\"ext_rewards_lend_apr\""
];
}
44 changes: 44 additions & 0 deletions x/rewards/client/cli/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ func GetQueryCmd() *cobra.Command {
queryExternalRewardLends(),
queryExternalRewardStableMint(),
queryEpochTime(),
queryExtLendRewardsAPR(),
)

return cmd
Expand Down Expand Up @@ -583,3 +584,46 @@ func queryEpochTime() *cobra.Command {

return cmd
}

func queryExtLendRewardsAPR() *cobra.Command {
cmd := &cobra.Command{
Use: "ext_rewards_lend_apr [asset-id] [cpool-id]",
Short: "Query ext rewards lend apr",
Args: cobra.ExactArgs(2),
RunE: func(cmd *cobra.Command, args []string) error {
ctx, err := client.GetClientQueryContext(cmd)
if err != nil {
return err
}

assetID, err := strconv.ParseUint(args[0], 10, 64)
if err != nil {
return err
}
cPoolID, err := strconv.ParseUint(args[1], 10, 64)
if err != nil {
return err
}

queryClient := types.NewQueryClient(ctx)

res, err := queryClient.QueryExtLendRewardsAPR(
context.Background(),
&types.QueryExtLendRewardsAPRRequest{
AssetId: assetID,
CPoolId: cPoolID,
},
)
if err != nil {
return err
}

return ctx.PrintProto(res)
},
}

flags.AddQueryFlagsToCmd(cmd)
flags.AddPaginationFlagsToCmd(cmd, "ext_rewards_lend_apr")

return cmd
}
14 changes: 14 additions & 0 deletions x/rewards/keeper/grpc_query.go
Original file line number Diff line number Diff line change
Expand Up @@ -317,3 +317,17 @@ func (k Keeper) QueryEpochTime(c context.Context, req *types.QueryEpochTimeReque
Pagination: pagination,
}, nil
}

func (k Keeper) QueryExtLendRewardsAPR(c context.Context, req *types.QueryExtLendRewardsAPRRequest) (*types.QueryExtLendRewardsAPRResponse, error) {
if req == nil {
return nil, status.Error(codes.InvalidArgument, "request cannot be empty")
}
var (
ctx = sdk.UnwrapSDKContext(c)
)
apr := k.ExtLendRewardsAPR(ctx, req)

return &types.QueryExtLendRewardsAPRResponse{
Apr: apr,
}, nil
}
36 changes: 36 additions & 0 deletions x/rewards/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -391,3 +391,39 @@ func (k Keeper) ActExternalRewardsStableVaults(
k.SetEpochTime(ctx, epoch)
return nil
}

func (k Keeper) ExtLendRewardsAPR(ctx sdk.Context, request *types.QueryExtLendRewardsAPRRequest) sdk.Dec {
extRewards := k.GetExternalRewardLends(ctx)
totalAPR := sdk.NewDec(0)
for _, v := range extRewards {
if v.IsActive && request.CPoolId == v.RewardsAssetPoolData.CPoolId && uint64InSlice(request.AssetId, v.RewardsAssetPoolData.AssetId) {
epoch, _ := k.GetEpochTime(ctx, v.EpochId)
totalBorrowedAmt := sdk.ZeroInt()
rewardsAssetPoolData := v.RewardsAssetPoolData
for _, assetID := range rewardsAssetPoolData.AssetId {
amt, _ := k.CalculateTotalBorrowedAmtByFarmers(ctx, assetID, rewardsAssetPoolData.CPoolId, rewardsAssetPoolData.CSwapAppId, v.MasterPoolId)
totalBorrowedAmt = totalBorrowedAmt.Add(amt.TruncateInt()) // in $USD
}
// calculating totalAPR
rewardAsset, found := k.asset.GetAssetForDenom(ctx, v.TotalRewards.Denom)
if !found {
continue
}
totalRewardAmt, found := k.OraclePriceForRewards(ctx, rewardAsset.Id, v.AvailableRewards.Amount)
if !found {
continue
}
if totalBorrowedAmt.LTE(sdk.ZeroInt()) {
continue
}
str, err := sdk.NewDecFromStr(types.DaysInYear)
if err != nil {
continue
}
dailyRewardAmt := totalRewardAmt.Quo(sdk.NewDec(v.DurationDays - int64(epoch.Count)))
APR := dailyRewardAmt.Quo(sdk.NewDecFromInt(totalBorrowedAmt))
totalAPR = APR.Mul(str)
}
}
return totalAPR
}
Loading

0 comments on commit a3b435a

Please sign in to comment.