From 226b894c0f41ca0857de57ca8cd88aa15d7591fc Mon Sep 17 00:00:00 2001 From: Cosmic Vagabond <121588426+cosmic-vagabond@users.noreply.github.com> Date: Tue, 27 Feb 2024 15:13:08 +0100 Subject: [PATCH] fix: update open price in perpetual position (#388) * fix: update open price in perpetual position * test: fix tests --- x/accountedpool/types/mocks/amm_keeper.go | 1 - .../types/mocks/perpetual_keeper.go | 3 +- x/perpetual/keeper/begin_blocker.go | 3 +- .../keeper/begin_blocker_process_mtp.go | 8 +- x/perpetual/keeper/open.go | 3 + x/perpetual/keeper/open_consolidate.go | 3 + x/perpetual/keeper/open_long_test.go | 62 +++++++++++-- x/perpetual/keeper/open_test.go | 1 + x/perpetual/keeper/update_open_price.go | 34 ++++++++ x/perpetual/types/expected_keepers.go | 1 + x/perpetual/types/mocks/account_keeper.go | 1 - x/perpetual/types/mocks/amm_keeper.go | 87 +++++++++---------- .../types/mocks/asset_profile_keeper.go | 1 - .../types/mocks/authorization_checker.go | 3 +- x/perpetual/types/mocks/bank_keeper.go | 3 +- x/perpetual/types/mocks/close_long_checker.go | 6 +- .../types/mocks/close_short_checker.go | 6 +- x/perpetual/types/mocks/open_checker.go | 49 ++++++++++- x/perpetual/types/mocks/open_long_checker.go | 6 +- x/perpetual/types/mocks/open_short_checker.go | 6 +- x/perpetual/types/mocks/pool_checker.go | 1 - x/perpetual/types/mocks/position_checker.go | 3 +- .../types/reached_take_profit_price.go | 7 +- 23 files changed, 216 insertions(+), 82 deletions(-) create mode 100644 x/perpetual/keeper/update_open_price.go diff --git a/x/accountedpool/types/mocks/amm_keeper.go b/x/accountedpool/types/mocks/amm_keeper.go index 8ebde6fae..fc8dd998c 100644 --- a/x/accountedpool/types/mocks/amm_keeper.go +++ b/x/accountedpool/types/mocks/amm_keeper.go @@ -66,7 +66,6 @@ func (_c *AmmKeeper_GetAllPool_Call) RunAndReturn(run func(types.Context) []ammt return _c } - // GetPool provides a mock function with given fields: _a0, _a1 func (_m *AmmKeeper) GetPool(_a0 types.Context, _a1 uint64) (ammtypes.Pool, bool) { ret := _m.Called(_a0, _a1) diff --git a/x/accountedpool/types/mocks/perpetual_keeper.go b/x/accountedpool/types/mocks/perpetual_keeper.go index 0bd836370..4293b66e6 100644 --- a/x/accountedpool/types/mocks/perpetual_keeper.go +++ b/x/accountedpool/types/mocks/perpetual_keeper.go @@ -3,10 +3,9 @@ package mocks import ( + types "github.com/cosmos/cosmos-sdk/types" perpetualtypes "github.com/elys-network/elys/x/perpetual/types" mock "github.com/stretchr/testify/mock" - - types "github.com/cosmos/cosmos-sdk/types" ) // PerpetualKeeper is an autogenerated mock type for the PerpetualKeeper type diff --git a/x/perpetual/keeper/begin_blocker.go b/x/perpetual/keeper/begin_blocker.go index 2e62f7c61..b706eed8a 100644 --- a/x/perpetual/keeper/begin_blocker.go +++ b/x/perpetual/keeper/begin_blocker.go @@ -25,6 +25,7 @@ func (k Keeper) BeginBlocker(ctx sdk.Context) { ctx.Logger().Error(errorsmod.Wrapf(assetprofiletypes.ErrAssetProfileNotFound, "asset %s not found", ptypes.BaseCurrency).Error()) } baseCurrency := entry.Denom + baseCurrencyDecimal := entry.Decimals currentHeight := ctx.BlockHeight() pools := k.GetAllPools(ctx) @@ -53,7 +54,7 @@ func (k Keeper) BeginBlocker(ctx sdk.Context) { mtps, _, _ := k.GetMTPsForPool(ctx, pool.AmmPoolId, nil) for _, mtp := range mtps { - err := BeginBlockerProcessMTP(ctx, k, mtp, pool, ammPool, baseCurrency) + err := BeginBlockerProcessMTP(ctx, k, mtp, pool, ammPool, baseCurrency, baseCurrencyDecimal) if err != nil { ctx.Logger().Error(err.Error()) continue diff --git a/x/perpetual/keeper/begin_blocker_process_mtp.go b/x/perpetual/keeper/begin_blocker_process_mtp.go index f5f09c970..2ed81c2cd 100644 --- a/x/perpetual/keeper/begin_blocker_process_mtp.go +++ b/x/perpetual/keeper/begin_blocker_process_mtp.go @@ -14,7 +14,7 @@ import ( "github.com/elys-network/elys/x/perpetual/types" ) -func BeginBlockerProcessMTP(ctx sdk.Context, k Keeper, mtp *types.MTP, pool types.Pool, ammPool ammtypes.Pool, baseCurrency string) error { +func BeginBlockerProcessMTP(ctx sdk.Context, k Keeper, mtp *types.MTP, pool types.Pool, ammPool ammtypes.Pool, baseCurrency string, baseCurrencyDecimal uint64) error { defer func() { if r := recover(); r != nil { if msg, ok := r.(string); ok { @@ -76,7 +76,11 @@ func BeginBlockerProcessMTP(ctx sdk.Context, k Keeper, mtp *types.MTP, pool type if err != nil { return errors.Wrap(err, fmt.Sprintf("error estimating swap: %s", mtp.CustodyAsset)) } - if types.ReachedTakeProfitPrice(mtp, assetPrice) { + + // divide assetPrice by 10^baseCurrencyDecimal to get the actual price in decimal + assetPriceDec := math.LegacyNewDecFromBigInt(assetPrice.BigInt()).Quo(math.LegacyNewDec(10).Power(uint64(baseCurrencyDecimal))) + + if types.ReachedTakeProfitPrice(mtp, assetPriceDec) { // flag position as must force close mustForceClose = true } else { diff --git a/x/perpetual/keeper/open.go b/x/perpetual/keeper/open.go index 4643b1be3..b19ae2469 100644 --- a/x/perpetual/keeper/open.go +++ b/x/perpetual/keeper/open.go @@ -70,6 +70,9 @@ func (k Keeper) Open(ctx sdk.Context, msg *types.MsgOpen) (*types.MsgOpenRespons return k.OpenConsolidate(ctx, existingMtp, mtp, msg, baseCurrency) } + // calc and update open price + k.OpenChecker.UpdateOpenPrice(ctx, mtp, ammPool, baseCurrency) + k.OpenChecker.EmitOpenEvent(ctx, mtp) if k.hooks != nil { diff --git a/x/perpetual/keeper/open_consolidate.go b/x/perpetual/keeper/open_consolidate.go index d62e0ea22..7944c254c 100644 --- a/x/perpetual/keeper/open_consolidate.go +++ b/x/perpetual/keeper/open_consolidate.go @@ -41,6 +41,9 @@ func (k Keeper) OpenConsolidate(ctx sdk.Context, existingMtp *types.MTP, newMtp return nil, errorsmod.Wrap(types.ErrInvalidPosition, msg.Position.String()) } + // calc and update open price + k.UpdateOpenPrice(ctx, existingMtp, ammPool, baseCurrency) + ctx.EventManager().EmitEvent(types.GenerateOpenEvent(existingMtp)) if k.hooks != nil { diff --git a/x/perpetual/keeper/open_long_test.go b/x/perpetual/keeper/open_long_test.go index b976428c6..d817e460c 100644 --- a/x/perpetual/keeper/open_long_test.go +++ b/x/perpetual/keeper/open_long_test.go @@ -7,6 +7,7 @@ import ( "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" ammtypes "github.com/elys-network/elys/x/amm/types" + assetprofiletypes "github.com/elys-network/elys/x/assetprofile/types" "github.com/elys-network/elys/x/perpetual/keeper" "github.com/elys-network/elys/x/perpetual/types" "github.com/elys-network/elys/x/perpetual/types/mocks" @@ -408,14 +409,26 @@ func TestOpenLong_BaseCurrency_Collateral(t *testing.T) { // Setup coin prices SetupStableCoinPrices(ctx, oracle) + // Set asset profile + app.AssetprofileKeeper.SetEntry(ctx, assetprofiletypes.Entry{ + BaseDenom: ptypes.BaseCurrency, + Denom: ptypes.BaseCurrency, + Decimals: 6, + }) + app.AssetprofileKeeper.SetEntry(ctx, assetprofiletypes.Entry{ + BaseDenom: ptypes.ATOM, + Denom: ptypes.ATOM, + Decimals: 6, + }) + // Generate 1 random account with 1000stake balanced addr := simapp.AddTestAddrs(app, ctx, 1, sdk.NewInt(1000000000000)) // Create a pool // Mint 100000USDC - usdcToken := []sdk.Coin{sdk.NewCoin(ptypes.BaseCurrency, sdk.NewInt(100000000000))} + usdcToken := []sdk.Coin{sdk.NewCoin(ptypes.BaseCurrency, sdk.NewInt(200000000000))} // Mint 100000ATOM - atomToken := []sdk.Coin{sdk.NewCoin(ptypes.ATOM, sdk.NewInt(100000000000))} + atomToken := []sdk.Coin{sdk.NewCoin(ptypes.ATOM, sdk.NewInt(200000000000))} err := app.BankKeeper.MintCoins(ctx, ammtypes.ModuleName, usdcToken) require.NoError(t, err) @@ -430,11 +443,11 @@ func TestOpenLong_BaseCurrency_Collateral(t *testing.T) { poolAssets := []ammtypes.PoolAsset{ { Weight: sdk.NewInt(50), - Token: sdk.NewCoin(ptypes.ATOM, sdk.NewInt(100000000000)), + Token: sdk.NewCoin(ptypes.ATOM, sdk.NewInt(10000000000)), }, { Weight: sdk.NewInt(50), - Token: sdk.NewCoin(ptypes.BaseCurrency, sdk.NewInt(10000000000)), + Token: sdk.NewCoin(ptypes.BaseCurrency, sdk.NewInt(100000000000)), }, } @@ -473,8 +486,8 @@ func TestOpenLong_BaseCurrency_Collateral(t *testing.T) { // Balance check before create a perpetual position balances := app.BankKeeper.GetAllBalances(ctx, poolAddress) - require.Equal(t, balances.AmountOf(ptypes.BaseCurrency), sdk.NewInt(10000000000)) - require.Equal(t, balances.AmountOf(ptypes.ATOM), sdk.NewInt(100000000000)) + require.Equal(t, balances.AmountOf(ptypes.BaseCurrency), sdk.NewInt(100000000000)) + require.Equal(t, balances.AmountOf(ptypes.ATOM), sdk.NewInt(10000000000)) // Create a perpetual position open msg msg2 := types.NewMsgOpen( @@ -493,14 +506,47 @@ func TestOpenLong_BaseCurrency_Collateral(t *testing.T) { require.Equal(t, len(mtps), 1) balances = app.BankKeeper.GetAllBalances(ctx, poolAddress) - require.Equal(t, balances.AmountOf(ptypes.BaseCurrency), sdk.NewInt(10100000000)) - require.Equal(t, balances.AmountOf(ptypes.ATOM), sdk.NewInt(100000000000)) + require.Equal(t, balances.AmountOf(ptypes.BaseCurrency), sdk.NewInt(100100000000)) + require.Equal(t, balances.AmountOf(ptypes.ATOM), sdk.NewInt(10000000000)) _, found = mk.OpenLongChecker.GetPool(ctx, pool.PoolId) require.Equal(t, found, true) err = mk.InvariantCheck(ctx) require.Equal(t, err, nil) + + mtp := mtps[0] + + // Check MTP + require.Equal(t, types.MTP{ + Address: addr[0].String(), + CollateralAsset: "uusdc", + TradingAsset: "uatom", + LiabilitiesAsset: "uusdc", + CustodyAsset: "uatom", + Collateral: sdk.NewInt(100000000), + Liabilities: sdk.NewInt(400000000), + BorrowInterestPaidCollateral: sdk.NewInt(0), + BorrowInterestPaidCustody: sdk.NewInt(0), + BorrowInterestUnpaidCollateral: sdk.NewInt(0), + Custody: sdk.NewInt(49751243), + TakeProfitLiabilities: sdk.NewInt(495049497), + TakeProfitCustody: sdk.NewInt(49751243), + Leverage: sdk.NewDec(5), + MtpHealth: sdk.MustNewDecFromStr("1.249999982500000000"), + Position: types.Position_LONG, + Id: uint64(1), + AmmPoolId: uint64(1), + ConsolidateLeverage: sdk.NewDec(4), + SumCollateral: sdk.NewInt(100000000), + TakeProfitPrice: sdk.MustNewDecFromStr(types.TakeProfitPriceDefault), + TakeProfitBorrowRate: sdk.MustNewDecFromStr("1.0"), + FundingFeePaidCollateral: sdk.NewInt(0), + FundingFeePaidCustody: sdk.NewInt(0), + FundingFeeReceivedCollateral: sdk.NewInt(0), + FundingFeeReceivedCustody: sdk.NewInt(0), + OpenPrice: sdk.MustNewDecFromStr("10.00000000000000000"), + }, mtp) } func TestOpenLong_ATOM_Collateral(t *testing.T) { diff --git a/x/perpetual/keeper/open_test.go b/x/perpetual/keeper/open_test.go index b77795744..de0d7bd36 100644 --- a/x/perpetual/keeper/open_test.go +++ b/x/perpetual/keeper/open_test.go @@ -261,6 +261,7 @@ func TestOpen_Successful(t *testing.T) { mockChecker.On("PreparePools", ctx, msg.Collateral.Denom, msg.TradingAsset).Return(poolId, ammtypes.Pool{}, types.Pool{}, nil) mockChecker.On("CheckPoolHealth", ctx, poolId).Return(nil) mockChecker.On("OpenShort", ctx, poolId, msg, ptypes.BaseCurrency).Return(mtp, nil) + mockChecker.On("UpdateOpenPrice", ctx, mtp, ammtypes.Pool{}, ptypes.BaseCurrency).Return(nil) mockChecker.On("EmitOpenEvent", ctx, mtp).Return() _, err := k.Open(ctx, msg) diff --git a/x/perpetual/keeper/update_open_price.go b/x/perpetual/keeper/update_open_price.go new file mode 100644 index 000000000..7838b41de --- /dev/null +++ b/x/perpetual/keeper/update_open_price.go @@ -0,0 +1,34 @@ +package keeper + +import ( + "fmt" + + "cosmossdk.io/errors" + "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + ammtypes "github.com/elys-network/elys/x/amm/types" + "github.com/elys-network/elys/x/perpetual/types" +) + +func (k Keeper) UpdateOpenPrice(ctx sdk.Context, mtp *types.MTP, ammPool ammtypes.Pool, baseCurrency string) error { + collateralAmountInBaseCurrency := mtp.Collateral + if mtp.CollateralAsset != baseCurrency { + C, err := k.EstimateSwap(ctx, sdk.NewCoin(mtp.CollateralAsset, mtp.Collateral), baseCurrency, ammPool) + if err != nil { + return errors.Wrap(err, fmt.Sprintf("error estimating swap: %s", mtp.CustodyAsset)) + } + collateralAmountInBaseCurrency = C + } + + // open price = (collateral + liabilities) / custody + mtp.OpenPrice = math.LegacyNewDecFromBigInt( + collateralAmountInBaseCurrency.Add(mtp.Liabilities).Quo(mtp.Custody).BigInt(), + ) + + err := k.SetMTP(ctx, mtp) + if err != nil { + return err + } + + return nil +} diff --git a/x/perpetual/types/expected_keepers.go b/x/perpetual/types/expected_keepers.go index 4c17d10c7..374ada4a5 100644 --- a/x/perpetual/types/expected_keepers.go +++ b/x/perpetual/types/expected_keepers.go @@ -36,6 +36,7 @@ type OpenChecker interface { CheckPoolHealth(ctx sdk.Context, poolId uint64) error OpenLong(ctx sdk.Context, poolId uint64, msg *MsgOpen, baseCurrency string) (*MTP, error) OpenShort(ctx sdk.Context, poolId uint64, msg *MsgOpen, baseCurrency string) (*MTP, error) + UpdateOpenPrice(ctx sdk.Context, mtp *MTP, ammPool ammtypes.Pool, baseCurrency string) error EmitOpenEvent(ctx sdk.Context, mtp *MTP) SetMTP(ctx sdk.Context, mtp *MTP) error CheckSameAssetPosition(ctx sdk.Context, msg *MsgOpen) *MTP diff --git a/x/perpetual/types/mocks/account_keeper.go b/x/perpetual/types/mocks/account_keeper.go index a01afb4d8..41d5a4190 100644 --- a/x/perpetual/types/mocks/account_keeper.go +++ b/x/perpetual/types/mocks/account_keeper.go @@ -4,7 +4,6 @@ package mocks import ( authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - mock "github.com/stretchr/testify/mock" types "github.com/cosmos/cosmos-sdk/types" diff --git a/x/perpetual/types/mocks/amm_keeper.go b/x/perpetual/types/mocks/amm_keeper.go index fff3b9fb9..aa2a5de2f 100644 --- a/x/perpetual/types/mocks/amm_keeper.go +++ b/x/perpetual/types/mocks/amm_keeper.go @@ -3,9 +3,8 @@ package mocks import ( - ammtypes "github.com/elys-network/elys/x/amm/types" - math "cosmossdk.io/math" + ammtypes "github.com/elys-network/elys/x/amm/types" mock "github.com/stretchr/testify/mock" @@ -304,23 +303,23 @@ func (_c *AmmKeeper_GetAllPool_Call) RunAndReturn(run func(types.Context) []ammt return _c } -// GetPool provides a mock function with given fields: _a0, _a1 -func (_m *AmmKeeper) GetPool(_a0 types.Context, _a1 uint64) (ammtypes.Pool, bool) { - ret := _m.Called(_a0, _a1) +// GetBestPoolWithDenoms provides a mock function with given fields: ctx, denoms +func (_m *AmmKeeper) GetBestPoolWithDenoms(ctx types.Context, denoms []string) (ammtypes.Pool, bool) { + ret := _m.Called(ctx, denoms) var r0 ammtypes.Pool var r1 bool - if rf, ok := ret.Get(0).(func(types.Context, uint64) (ammtypes.Pool, bool)); ok { - return rf(_a0, _a1) + if rf, ok := ret.Get(0).(func(types.Context, []string) (ammtypes.Pool, bool)); ok { + return rf(ctx, denoms) } - if rf, ok := ret.Get(0).(func(types.Context, uint64) ammtypes.Pool); ok { - r0 = rf(_a0, _a1) + if rf, ok := ret.Get(0).(func(types.Context, []string) ammtypes.Pool); ok { + r0 = rf(ctx, denoms) } else { r0 = ret.Get(0).(ammtypes.Pool) } - if rf, ok := ret.Get(1).(func(types.Context, uint64) bool); ok { - r1 = rf(_a0, _a1) + if rf, ok := ret.Get(1).(func(types.Context, []string) bool); ok { + r1 = rf(ctx, denoms) } else { r1 = ret.Get(1).(bool) } @@ -328,52 +327,52 @@ func (_m *AmmKeeper) GetPool(_a0 types.Context, _a1 uint64) (ammtypes.Pool, bool return r0, r1 } -// AmmKeeper_GetPool_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetPool' -type AmmKeeper_GetPool_Call struct { +// AmmKeeper_GetBestPoolWithDenoms_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBestPoolWithDenoms' +type AmmKeeper_GetBestPoolWithDenoms_Call struct { *mock.Call } -// GetPool is a helper method to define mock.On call -// - _a0 types.Context -// - _a1 uint64 -func (_e *AmmKeeper_Expecter) GetPool(_a0 interface{}, _a1 interface{}) *AmmKeeper_GetPool_Call { - return &AmmKeeper_GetPool_Call{Call: _e.mock.On("GetPool", _a0, _a1)} +// GetBestPoolWithDenoms is a helper method to define mock.On call +// - ctx types.Context +// - denoms []string +func (_e *AmmKeeper_Expecter) GetBestPoolWithDenoms(ctx interface{}, denoms interface{}) *AmmKeeper_GetBestPoolWithDenoms_Call { + return &AmmKeeper_GetBestPoolWithDenoms_Call{Call: _e.mock.On("GetBestPoolWithDenoms", ctx, denoms)} } -func (_c *AmmKeeper_GetPool_Call) Run(run func(_a0 types.Context, _a1 uint64)) *AmmKeeper_GetPool_Call { +func (_c *AmmKeeper_GetBestPoolWithDenoms_Call) Run(run func(ctx types.Context, denoms []string)) *AmmKeeper_GetBestPoolWithDenoms_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Context), args[1].(uint64)) + run(args[0].(types.Context), args[1].([]string)) }) return _c } -func (_c *AmmKeeper_GetPool_Call) Return(_a0 ammtypes.Pool, _a1 bool) *AmmKeeper_GetPool_Call { - _c.Call.Return(_a0, _a1) +func (_c *AmmKeeper_GetBestPoolWithDenoms_Call) Return(pool ammtypes.Pool, found bool) *AmmKeeper_GetBestPoolWithDenoms_Call { + _c.Call.Return(pool, found) return _c } -func (_c *AmmKeeper_GetPool_Call) RunAndReturn(run func(types.Context, uint64) (ammtypes.Pool, bool)) *AmmKeeper_GetPool_Call { +func (_c *AmmKeeper_GetBestPoolWithDenoms_Call) RunAndReturn(run func(types.Context, []string) (ammtypes.Pool, bool)) *AmmKeeper_GetBestPoolWithDenoms_Call { _c.Call.Return(run) return _c } -// GetBestPoolWithDenoms provides a mock function with given fields: ctx, denoms -func (_m *AmmKeeper) GetBestPoolWithDenoms(ctx types.Context, denoms []string) (ammtypes.Pool, bool) { - ret := _m.Called(ctx, denoms) +// GetPool provides a mock function with given fields: _a0, _a1 +func (_m *AmmKeeper) GetPool(_a0 types.Context, _a1 uint64) (ammtypes.Pool, bool) { + ret := _m.Called(_a0, _a1) var r0 ammtypes.Pool var r1 bool - if rf, ok := ret.Get(0).(func(types.Context, []string) (ammtypes.Pool, bool)); ok { - return rf(ctx, denoms) + if rf, ok := ret.Get(0).(func(types.Context, uint64) (ammtypes.Pool, bool)); ok { + return rf(_a0, _a1) } - if rf, ok := ret.Get(0).(func(types.Context, []string) ammtypes.Pool); ok { - r0 = rf(ctx, denoms) + if rf, ok := ret.Get(0).(func(types.Context, uint64) ammtypes.Pool); ok { + r0 = rf(_a0, _a1) } else { r0 = ret.Get(0).(ammtypes.Pool) } - if rf, ok := ret.Get(1).(func(types.Context, []string) bool); ok { - r1 = rf(ctx, denoms) + if rf, ok := ret.Get(1).(func(types.Context, uint64) bool); ok { + r1 = rf(_a0, _a1) } else { r1 = ret.Get(1).(bool) } @@ -381,31 +380,31 @@ func (_m *AmmKeeper) GetBestPoolWithDenoms(ctx types.Context, denoms []string) ( return r0, r1 } -// AmmKeeper_GetBestPoolWithDenoms_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetBestPoolWithDenoms' -type AmmKeeper_GetBestPoolWithDenoms_Call struct { +// AmmKeeper_GetPool_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetPool' +type AmmKeeper_GetPool_Call struct { *mock.Call } -// GetBestPoolWithDenoms is a helper method to define mock.On call -// - ctx types.Context -// - denoms []string -func (_e *AmmKeeper_Expecter) GetBestPoolWithDenoms(ctx interface{}, denoms interface{}) *AmmKeeper_GetBestPoolWithDenoms_Call { - return &AmmKeeper_GetBestPoolWithDenoms_Call{Call: _e.mock.On("GetBestPoolWithDenoms", ctx, denoms)} +// GetPool is a helper method to define mock.On call +// - _a0 types.Context +// - _a1 uint64 +func (_e *AmmKeeper_Expecter) GetPool(_a0 interface{}, _a1 interface{}) *AmmKeeper_GetPool_Call { + return &AmmKeeper_GetPool_Call{Call: _e.mock.On("GetPool", _a0, _a1)} } -func (_c *AmmKeeper_GetBestPoolWithDenoms_Call) Run(run func(ctx types.Context, denoms []string)) *AmmKeeper_GetBestPoolWithDenoms_Call { +func (_c *AmmKeeper_GetPool_Call) Run(run func(_a0 types.Context, _a1 uint64)) *AmmKeeper_GetPool_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Context), args[1].([]string)) + run(args[0].(types.Context), args[1].(uint64)) }) return _c } -func (_c *AmmKeeper_GetBestPoolWithDenoms_Call) Return(poolId uint64, found bool) *AmmKeeper_GetBestPoolWithDenoms_Call { - _c.Call.Return(poolId, found) +func (_c *AmmKeeper_GetPool_Call) Return(_a0 ammtypes.Pool, _a1 bool) *AmmKeeper_GetPool_Call { + _c.Call.Return(_a0, _a1) return _c } -func (_c *AmmKeeper_GetBestPoolWithDenoms_Call) RunAndReturn(run func(types.Context, []string) (uint64, bool)) *AmmKeeper_GetBestPoolWithDenoms_Call { +func (_c *AmmKeeper_GetPool_Call) RunAndReturn(run func(types.Context, uint64) (ammtypes.Pool, bool)) *AmmKeeper_GetPool_Call { _c.Call.Return(run) return _c } diff --git a/x/perpetual/types/mocks/asset_profile_keeper.go b/x/perpetual/types/mocks/asset_profile_keeper.go index 45841b368..3ba948f94 100644 --- a/x/perpetual/types/mocks/asset_profile_keeper.go +++ b/x/perpetual/types/mocks/asset_profile_keeper.go @@ -4,7 +4,6 @@ package mocks import ( assetprofiletypes "github.com/elys-network/elys/x/assetprofile/types" - mock "github.com/stretchr/testify/mock" types "github.com/cosmos/cosmos-sdk/types" diff --git a/x/perpetual/types/mocks/authorization_checker.go b/x/perpetual/types/mocks/authorization_checker.go index 8ccb806dd..df9d2d34b 100644 --- a/x/perpetual/types/mocks/authorization_checker.go +++ b/x/perpetual/types/mocks/authorization_checker.go @@ -3,8 +3,9 @@ package mocks import ( - types "github.com/cosmos/cosmos-sdk/types" mock "github.com/stretchr/testify/mock" + + types "github.com/cosmos/cosmos-sdk/types" ) // AuthorizationChecker is an autogenerated mock type for the AuthorizationChecker type diff --git a/x/perpetual/types/mocks/bank_keeper.go b/x/perpetual/types/mocks/bank_keeper.go index 03d64abb9..6a5366228 100644 --- a/x/perpetual/types/mocks/bank_keeper.go +++ b/x/perpetual/types/mocks/bank_keeper.go @@ -3,8 +3,9 @@ package mocks import ( - types "github.com/cosmos/cosmos-sdk/types" mock "github.com/stretchr/testify/mock" + + types "github.com/cosmos/cosmos-sdk/types" ) // BankKeeper is an autogenerated mock type for the BankKeeper type diff --git a/x/perpetual/types/mocks/close_long_checker.go b/x/perpetual/types/mocks/close_long_checker.go index 87e932c56..23774db36 100644 --- a/x/perpetual/types/mocks/close_long_checker.go +++ b/x/perpetual/types/mocks/close_long_checker.go @@ -3,13 +3,13 @@ package mocks import ( - ammtypes "github.com/elys-network/elys/x/amm/types" - perpetualtypes "github.com/elys-network/elys/x/perpetual/types" - math "cosmossdk.io/math" + ammtypes "github.com/elys-network/elys/x/amm/types" mock "github.com/stretchr/testify/mock" + perpetualtypes "github.com/elys-network/elys/x/perpetual/types" + types "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/perpetual/types/mocks/close_short_checker.go b/x/perpetual/types/mocks/close_short_checker.go index 9d8491775..f43212eea 100644 --- a/x/perpetual/types/mocks/close_short_checker.go +++ b/x/perpetual/types/mocks/close_short_checker.go @@ -3,13 +3,13 @@ package mocks import ( - ammtypes "github.com/elys-network/elys/x/amm/types" - perpetualtypes "github.com/elys-network/elys/x/perpetual/types" - math "cosmossdk.io/math" + ammtypes "github.com/elys-network/elys/x/amm/types" mock "github.com/stretchr/testify/mock" + perpetualtypes "github.com/elys-network/elys/x/perpetual/types" + types "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/perpetual/types/mocks/open_checker.go b/x/perpetual/types/mocks/open_checker.go index 1ef4dce75..7fbfba2f5 100644 --- a/x/perpetual/types/mocks/open_checker.go +++ b/x/perpetual/types/mocks/open_checker.go @@ -4,10 +4,10 @@ package mocks import ( ammtypes "github.com/elys-network/elys/x/amm/types" - perpetualtypes "github.com/elys-network/elys/x/perpetual/types" - mock "github.com/stretchr/testify/mock" + perpetualtypes "github.com/elys-network/elys/x/perpetual/types" + types "github.com/cosmos/cosmos-sdk/types" ) @@ -540,6 +540,51 @@ func (_c *OpenChecker_SetMTP_Call) RunAndReturn(run func(types.Context, *perpetu return _c } +// UpdateOpenPrice provides a mock function with given fields: ctx, mtp, ammPool, baseCurrency +func (_m *OpenChecker) UpdateOpenPrice(ctx types.Context, mtp *perpetualtypes.MTP, ammPool ammtypes.Pool, baseCurrency string) error { + ret := _m.Called(ctx, mtp, ammPool, baseCurrency) + + var r0 error + if rf, ok := ret.Get(0).(func(types.Context, *perpetualtypes.MTP, ammtypes.Pool, string) error); ok { + r0 = rf(ctx, mtp, ammPool, baseCurrency) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// OpenChecker_UpdateOpenPrice_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateOpenPrice' +type OpenChecker_UpdateOpenPrice_Call struct { + *mock.Call +} + +// UpdateOpenPrice is a helper method to define mock.On call +// - ctx types.Context +// - mtp *perpetualtypes.MTP +// - ammPool ammtypes.Pool +// - baseCurrency string +func (_e *OpenChecker_Expecter) UpdateOpenPrice(ctx interface{}, mtp interface{}, ammPool interface{}, baseCurrency interface{}) *OpenChecker_UpdateOpenPrice_Call { + return &OpenChecker_UpdateOpenPrice_Call{Call: _e.mock.On("UpdateOpenPrice", ctx, mtp, ammPool, baseCurrency)} +} + +func (_c *OpenChecker_UpdateOpenPrice_Call) Run(run func(ctx types.Context, mtp *perpetualtypes.MTP, ammPool ammtypes.Pool, baseCurrency string)) *OpenChecker_UpdateOpenPrice_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Context), args[1].(*perpetualtypes.MTP), args[2].(ammtypes.Pool), args[3].(string)) + }) + return _c +} + +func (_c *OpenChecker_UpdateOpenPrice_Call) Return(_a0 error) *OpenChecker_UpdateOpenPrice_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *OpenChecker_UpdateOpenPrice_Call) RunAndReturn(run func(types.Context, *perpetualtypes.MTP, ammtypes.Pool, string) error) *OpenChecker_UpdateOpenPrice_Call { + _c.Call.Return(run) + return _c +} + // NewOpenChecker creates a new instance of OpenChecker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. func NewOpenChecker(t interface { diff --git a/x/perpetual/types/mocks/open_long_checker.go b/x/perpetual/types/mocks/open_long_checker.go index bd6e2d2d5..36fa015de 100644 --- a/x/perpetual/types/mocks/open_long_checker.go +++ b/x/perpetual/types/mocks/open_long_checker.go @@ -3,13 +3,13 @@ package mocks import ( - ammtypes "github.com/elys-network/elys/x/amm/types" - perpetualtypes "github.com/elys-network/elys/x/perpetual/types" - math "cosmossdk.io/math" + ammtypes "github.com/elys-network/elys/x/amm/types" mock "github.com/stretchr/testify/mock" + perpetualtypes "github.com/elys-network/elys/x/perpetual/types" + types "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/perpetual/types/mocks/open_short_checker.go b/x/perpetual/types/mocks/open_short_checker.go index 316d930e4..dbfd5d200 100644 --- a/x/perpetual/types/mocks/open_short_checker.go +++ b/x/perpetual/types/mocks/open_short_checker.go @@ -3,13 +3,13 @@ package mocks import ( - ammtypes "github.com/elys-network/elys/x/amm/types" - perpetualtypes "github.com/elys-network/elys/x/perpetual/types" - math "cosmossdk.io/math" + ammtypes "github.com/elys-network/elys/x/amm/types" mock "github.com/stretchr/testify/mock" + perpetualtypes "github.com/elys-network/elys/x/perpetual/types" + types "github.com/cosmos/cosmos-sdk/types" ) diff --git a/x/perpetual/types/mocks/pool_checker.go b/x/perpetual/types/mocks/pool_checker.go index 1ffc7e2e5..68608b294 100644 --- a/x/perpetual/types/mocks/pool_checker.go +++ b/x/perpetual/types/mocks/pool_checker.go @@ -5,7 +5,6 @@ package mocks import ( math "cosmossdk.io/math" perpetualtypes "github.com/elys-network/elys/x/perpetual/types" - mock "github.com/stretchr/testify/mock" types "github.com/cosmos/cosmos-sdk/types" diff --git a/x/perpetual/types/mocks/position_checker.go b/x/perpetual/types/mocks/position_checker.go index ee18ecc89..96a905b1c 100644 --- a/x/perpetual/types/mocks/position_checker.go +++ b/x/perpetual/types/mocks/position_checker.go @@ -3,8 +3,9 @@ package mocks import ( - types "github.com/cosmos/cosmos-sdk/types" mock "github.com/stretchr/testify/mock" + + types "github.com/cosmos/cosmos-sdk/types" ) // PositionChecker is an autogenerated mock type for the PositionChecker type diff --git a/x/perpetual/types/reached_take_profit_price.go b/x/perpetual/types/reached_take_profit_price.go index 823585d84..50907d6de 100644 --- a/x/perpetual/types/reached_take_profit_price.go +++ b/x/perpetual/types/reached_take_profit_price.go @@ -2,15 +2,14 @@ package types import ( "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" ) // ReachedTakeProfitPrice tells if the take profit price is reached -func ReachedTakeProfitPrice(mtp *MTP, assetPrice math.Int) bool { +func ReachedTakeProfitPrice(mtp *MTP, assetPrice math.LegacyDec) bool { if mtp.Position == Position_LONG { - return mtp.TakeProfitPrice.GTE(sdk.NewDecFromInt(assetPrice)) + return mtp.TakeProfitPrice.GTE(assetPrice) } else if mtp.Position == Position_SHORT { - return mtp.TakeProfitPrice.LTE(sdk.NewDecFromInt(assetPrice)) + return mtp.TakeProfitPrice.LTE(assetPrice) } return false }