Unverified Commit bd32316c authored by mergify[bot]'s avatar mergify[bot] Committed by GitHub
Browse files

x/lock: Fix `ExtendLockup` API (backport #1937) (#2030)


* x/lock: Fix `ExtendLockup` API  (#1937)

* Fix extendlock api

* Apply suggestions from code review

* Add changelog

Co-authored-by: default avatarDev Ojha <ValarDragon@users.noreply.github.com>
Co-authored-by: default avatarDev Ojha <dojha@berkeley.edu>
(cherry picked from commit 99304f2b

)

# Conflicts:
#	CHANGELOG.md

* Fix merge conflict: changelog

Co-authored-by: default avatarMatt, Park <45252226+mattverse@users.noreply.github.com>
Co-authored-by: default avatarmattverse <mattpark1028@gmail.com>
parent d733f648
Showing with 33 additions and 21 deletions
+33 -21
......@@ -43,6 +43,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased - v10.1.0
* [2011](https://github.com/osmosis-labs/osmosis/pull/2011) Fix bug in TokenFactory initGenesis, relating to denom creation fee param.
#### Golang API breaks
* [#1937](https://github.com/osmosis-labs/osmosis/pull/1937) Change `lockupKeeper.ExtendLock` to take in lockID instead of the direct lock struct.
## v10.0.1
......
......@@ -353,7 +353,16 @@ func (k Keeper) unlockMaturedLockInternalLogic(ctx sdk.Context, lock types.Perio
// 2. Locks that are unlokcing are not allowed to change duration.
// 3. Locks that have synthetic lockup are not allowed to change.
// 4. Provided duration should be greater than the original duration.
func (k Keeper) ExtendLockup(ctx sdk.Context, lock types.PeriodLock, newDuration time.Duration) error {
func (k Keeper) ExtendLockup(ctx sdk.Context, lockID uint64, owner sdk.AccAddress, newDuration time.Duration) error {
lock, err := k.GetLockByID(ctx, lockID)
if err != nil {
return err
}
if lock.GetOwner() != owner.String() {
return types.ErrNotLockOwner
}
if lock.IsUnlocking() {
return fmt.Errorf("cannot edit unlocking lockup for lock %d", lock.ID)
}
......@@ -363,10 +372,15 @@ func (k Keeper) ExtendLockup(ctx sdk.Context, lock types.PeriodLock, newDuration
return fmt.Errorf("cannot edit lockup with synthetic lock %d", lock.ID)
}
oldLock := lock
// completely delete existing lock refs
err = k.deleteLockRefs(ctx, unlockingPrefix(lock.IsUnlocking()), *lock)
if err != nil {
return err
}
oldDuration := lock.GetDuration()
if newDuration != 0 {
if newDuration <= lock.Duration {
if newDuration <= oldDuration {
return fmt.Errorf("new duration should be greater than the original")
}
......@@ -379,25 +393,20 @@ func (k Keeper) ExtendLockup(ctx sdk.Context, lock types.PeriodLock, newDuration
lock.Duration = newDuration
}
// update lockup
err := k.deleteLockRefs(ctx, unlockingPrefix(oldLock.IsUnlocking()), oldLock)
if err != nil {
return err
}
err = k.addLockRefs(ctx, lock)
// add lock refs with the new duration
err = k.addLockRefs(ctx, *lock)
if err != nil {
return err
}
err = k.setLock(ctx, lock)
err = k.setLock(ctx, *lock)
if err != nil {
return err
}
k.hooks.OnLockupExtend(ctx,
lock.GetID(),
oldLock.GetDuration(),
oldDuration,
lock.GetDuration(),
)
......
......@@ -741,14 +741,14 @@ func (suite *KeeperTestSuite) TestEditLockup() {
lock, _ := suite.App.LockupKeeper.GetLockByID(suite.Ctx, 1)
// duration decrease should fail
err = suite.App.LockupKeeper.ExtendLockup(suite.Ctx, *lock, time.Second/2)
err = suite.App.LockupKeeper.ExtendLockup(suite.Ctx, lock.ID, addr, time.Second/2)
suite.Require().Error(err)
// extending lock with same duration should fail
err = suite.App.LockupKeeper.ExtendLockup(suite.Ctx, *lock, time.Second)
err = suite.App.LockupKeeper.ExtendLockup(suite.Ctx, lock.ID, addr, time.Second)
suite.Require().Error(err)
// duration increase should success
err = suite.App.LockupKeeper.ExtendLockup(suite.Ctx, *lock, time.Second*2)
err = suite.App.LockupKeeper.ExtendLockup(suite.Ctx, lock.ID, addr, time.Second*2)
suite.Require().NoError(err)
// check queries
......
......@@ -155,18 +155,19 @@ func createBeginUnlockEvent(lock *types.PeriodLock) sdk.Event {
func (server msgServer) ExtendLockup(goCtx context.Context, msg *types.MsgExtendLockup) (*types.MsgExtendLockupResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
lock, err := server.keeper.GetLockByID(ctx, msg.ID)
owner, err := sdk.AccAddressFromBech32(msg.Owner)
if err != nil {
return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, err.Error())
return nil, err
}
if msg.Owner != lock.Owner {
return nil, sdkerrors.Wrapf(types.ErrNotLockOwner, fmt.Sprintf("msg sender (%s) and lock owner (%s) does not match", msg.Owner, lock.Owner))
err = server.keeper.ExtendLockup(ctx, msg.ID, owner, msg.Duration)
if err != nil {
return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, err.Error())
}
err = server.keeper.ExtendLockup(ctx, *lock, msg.Duration)
lock, err := server.keeper.GetLockByID(ctx, msg.ID)
if err != nil {
return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, err.Error())
return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, err.Error())
}
ctx.EventManager().EmitEvents(sdk.Events{
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment