Skip to content
This repository was archived by the owner on Mar 1, 2024. It is now read-only.

Commit 48f2288

Browse files
author
Denis Ermolin
committed
fix: do not subtract delegation from timeline if validator is unstaked
1 parent 7c0af26 commit 48f2288

File tree

4 files changed

+46
-7
lines changed

4 files changed

+46
-7
lines changed

contracts/staking/stakeManager/StakeManager.sol

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,9 @@ contract StakeManager is
535535
require(delegationEnabled, "Delegation is disabled");
536536
}
537537

538-
updateTimeline(amount, 0, 0);
538+
if (validators[validatorId].deactivationEpoch == 0) { // modify timeline only if validator didn't unstake
539+
updateTimeline(amount, 0, 0);
540+
}
539541

540542
if (amount >= 0) {
541543
increaseValidatorDelegatedAmount(validatorId, uint256(amount));

contracts/test/StakeManagerTestable.sol

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import { IValidatorShare } from "../staking/validatorShare/IValidatorShare.sol";
55

66
contract StakeManagerTestable is StakeManager {
77
function advanceEpoch(uint256 delta) public {
8-
currentEpoch = currentEpoch.add(delta);
8+
for (uint256 i = 0; i < delta; ++i) {
9+
_finalizeCommit();
10+
}
911
}
1012

1113
function testLockShareContract(uint256 validatorId, bool lock) public {

test/units/staking/ValidatorShare.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -952,7 +952,7 @@ contract('ValidatorShare', async function() {
952952
validatorId: '8',
953953
user: Alice,
954954
userTotalStaked: toWei('0'),
955-
totalStaked: ValidatorDefaultStake,
955+
totalStaked: 0,
956956
shares: aliceStake
957957
})
958958
})

test/units/staking/stakeManager/StakeManager.test.js

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2128,11 +2128,11 @@ contract('StakeManager', async function(accounts) {
21282128
prepareToTest()
21292129
testConfirmAuctionBidForNewValidator()
21302130
})
2131-
describe('when 1000 dynasties has passed', function() {
2131+
describe('when 10 dynasties has passed', function() {
21322132
prepareToTest()
21332133
before(async function() {
21342134
const currentDynasty = await this.stakeManager.dynasty()
2135-
await this.stakeManager.advanceEpoch(currentDynasty.mul(new BN('1000')))
2135+
await this.stakeManager.advanceEpoch(currentDynasty.mul(new BN('10')))
21362136
})
21372137

21382138
testConfirmAuctionBidForNewValidator()
@@ -2178,10 +2178,10 @@ contract('StakeManager', async function(accounts) {
21782178
})
21792179
})
21802180

2181-
describe('when 1000 dynasties has passed', function() {
2181+
describe('when 10 dynasties has passed', function() {
21822182
beforeEach(async function() {
21832183
const currentDynasty = await this.stakeManager.dynasty()
2184-
await this.stakeManager.advanceEpoch(currentDynasty.mul(new BN('1000')))
2184+
await this.stakeManager.advanceEpoch(currentDynasty.mul(new BN('10')))
21852185
})
21862186

21872187
it('reverts', async function() {
@@ -2378,6 +2378,41 @@ contract('StakeManager', async function(accounts) {
23782378
}
23792379
}
23802380

2381+
describe('when Chad moves stake to unstaked validator', function() {
2382+
const aliceId = '2'
2383+
const bobId = '8'
2384+
const delegator = wallets[9].getChecksumAddressString()
2385+
2386+
before(prepareForTest)
2387+
before(async function() {
2388+
await this.stakeManager.updateDynastyValue(1)
2389+
await this.stakeToken.mint(delegator, delegationAmount)
2390+
await this.stakeToken.approve(this.stakeManager.address, delegationAmount, {
2391+
from: delegator
2392+
})
2393+
2394+
{
2395+
// stake towards Alice validator
2396+
const validator = await this.stakeManager.validators(aliceId)
2397+
const validatorContract = await ValidatorShare.at(validator.contractAddress)
2398+
2399+
await buyVoucher(validatorContract, delegationAmount, delegator)
2400+
}
2401+
2402+
// unstake Bob validator
2403+
2404+
{
2405+
await this.stakeManager.unstake(bobId, { from: initialStakers[7].getChecksumAddressString() })
2406+
await this.stakeManager.advanceEpoch(100)
2407+
await this.stakeManager.unstakeClaim(bobId, { from: initialStakers[7].getChecksumAddressString() })
2408+
}
2409+
})
2410+
2411+
it('reverts', async function() {
2412+
await expectRevert(this.stakeManager.migrateDelegation(aliceId, bobId, migrationAmount, { from: delegator }), 'locked')
2413+
})
2414+
})
2415+
23812416
describe('when Chad moves stake from unstaked validator', function() {
23822417
const aliceId = '2'
23832418
const bobId = '8'

0 commit comments

Comments
 (0)