@@ -65,7 +65,7 @@ func (suite *KeeperTestSuite) TestBeginUnlockPeriodLock() {
6565 suite .Require ().Equal (locks [0 ].IsUnlocking (), false )
6666
6767 // begin unlock
68- err = suite .app .LockupKeeper .BeginUnlock (suite .ctx , locks [0 ])
68+ err = suite .app .LockupKeeper .BeginUnlock (suite .ctx , locks [0 ], nil )
6969 suite .Require ().NoError (err )
7070
7171 // check locks
@@ -127,7 +127,7 @@ func (suite *KeeperTestSuite) TestUnlockPeriodLockByID() {
127127 // begin unlock
128128 lock , err = lockKeeper .GetLockByID (suite .ctx , 1 )
129129 suite .Require ().NoError (err )
130- err = lockKeeper .BeginUnlock (suite .ctx , * lock )
130+ err = lockKeeper .BeginUnlock (suite .ctx , * lock , nil )
131131 suite .Require ().NoError (err )
132132
133133 // unlock 1s after begin unlock
@@ -190,14 +190,82 @@ func (suite *KeeperTestSuite) TestUnlock() {
190190 suite .Require ().NoError (err )
191191
192192 // begin unlock with lock object
193- err = suite .app .LockupKeeper .BeginUnlock (suite .ctx , lock )
193+ err = suite .app .LockupKeeper .BeginUnlock (suite .ctx , lock , nil )
194194 suite .Require ().NoError (err )
195195
196196 // unlock with lock object
197197 err = suite .app .LockupKeeper .Unlock (suite .ctx .WithBlockTime (now .Add (time .Second )), lock )
198198 suite .Require ().NoError (err )
199199}
200200
201+ func (suite * KeeperTestSuite ) TestPartialUnlock () {
202+ suite .SetupTest ()
203+ now := suite .ctx .BlockTime ()
204+
205+ addr1 := sdk .AccAddress ([]byte ("addr1---------------" ))
206+ coins := sdk.Coins {sdk .NewInt64Coin ("stake" , 10 )}
207+
208+ // lock with balance
209+ err := simapp .FundAccount (suite .app .BankKeeper , suite .ctx , addr1 , coins )
210+ suite .Require ().NoError (err )
211+ lock , err := suite .app .LockupKeeper .LockTokens (suite .ctx , addr1 , coins , time .Second )
212+ suite .Require ().NoError (err )
213+
214+ // check unlocking coins
215+ unlockings := suite .app .LockupKeeper .GetAccountUnlockingCoins (suite .ctx , addr1 )
216+ suite .Require ().Equal (len (unlockings ), 0 )
217+
218+ // check locked coins
219+ locked := suite .app .LockupKeeper .GetAccountLockedCoins (suite .ctx , addr1 )
220+ suite .Require ().Equal (len (locked ), 1 )
221+ suite .Require ().Equal (locked [0 ].Amount .Int64 (), int64 (10 ))
222+
223+ // test exceeding coins
224+ exceedingCoins := sdk.Coins {sdk .NewInt64Coin ("stake" , 15 )}
225+ err = suite .app .LockupKeeper .BeginUnlock (suite .ctx , lock , exceedingCoins )
226+ suite .Require ().Error (err )
227+
228+ // test invalid coins
229+ invalidCoins := sdk.Coins {sdk .NewInt64Coin ("unknown" , 1 )}
230+ err = suite .app .LockupKeeper .BeginUnlock (suite .ctx , lock , invalidCoins )
231+ suite .Require ().Error (err )
232+
233+ // begin unlock partial amount
234+ partialCoins := sdk.Coins {sdk .NewInt64Coin ("stake" , 1 )}
235+ err = suite .app .LockupKeeper .BeginUnlock (suite .ctx , lock , partialCoins )
236+ suite .Require ().NoError (err )
237+
238+ // check unlocking coins
239+ unlockings = suite .app .LockupKeeper .GetAccountUnlockingCoins (suite .ctx , addr1 )
240+ suite .Require ().Equal (len (unlockings ), 1 )
241+ suite .Require ().Equal (unlockings [0 ].Amount .Int64 (), int64 (1 ))
242+
243+ // check locked coins
244+ locked = suite .app .LockupKeeper .GetAccountLockedCoins (suite .ctx , addr1 )
245+ suite .Require ().Equal (len (locked ), 1 )
246+ suite .Require ().Equal (locked [0 ].Amount .Int64 (), int64 (10 ))
247+
248+ // check locked coins after the unlocking period
249+ locked = suite .app .LockupKeeper .GetAccountLockedCoins (suite .ctx .WithBlockTime (now .Add (time .Second )), addr1 )
250+ suite .Require ().Equal (len (locked ), 1 )
251+ suite .Require ().Equal (locked [0 ].Amount .Int64 (), int64 (9 ))
252+
253+ // Finish unlocking partial unlock
254+ partialUnlock := suite .app .LockupKeeper .GetAccountPeriodLocks (suite .ctx , addr1 )[1 ]
255+ err = suite .app .LockupKeeper .Unlock (suite .ctx .WithBlockTime (now .Add (time .Second )), partialUnlock )
256+ suite .Require ().NoError (err )
257+
258+ // check unlocking coins
259+ unlockings = suite .app .LockupKeeper .GetAccountUnlockingCoins (suite .ctx , addr1 )
260+ suite .Require ().Equal (len (unlockings ), 0 )
261+
262+ // check locked coins
263+ locked = suite .app .LockupKeeper .GetAccountLockedCoins (suite .ctx , addr1 )
264+ suite .Require ().Equal (len (locked ), 1 )
265+ suite .Require ().Equal (locked [0 ].Amount .Int64 (), int64 (9 ))
266+
267+ }
268+
201269func (suite * KeeperTestSuite ) TestModuleLockedCoins () {
202270 suite .SetupTest ()
203271
0 commit comments