Merge PR #3717: Allow the undelegation of more coins than were delegated; More validity checks.
This commit is contained in:
committed by
Christopher Goes
parent
7e08b62f4e
commit
10bd98e58e
@@ -251,10 +251,12 @@ func DelegateCoins(t Time, from Account, amount Coins) {
|
||||
### Undelegating
|
||||
|
||||
For a vesting account attempting to undelegate `D` coins, the following is performed:
|
||||
NOTE: `DV < D` and `(DV + DF) < D` may be possible due to quirks in the rounding of
|
||||
delegation/undelegation logic.
|
||||
|
||||
1. Verify `(DV + DF) >= D > 0` (this is simply a sanity check)
|
||||
1. Verify `D > 0`
|
||||
2. Compute `X := min(DF, D)` (portion of `D` that should become free, prioritizing free coins)
|
||||
3. Compute `Y := D - X` (portion of `D` that should remain vesting)
|
||||
3. Compute `Y := min(DV, D - X)` (portion of `D` that should remain vesting)
|
||||
4. Set `DF -= X`
|
||||
5. Set `DV -= Y`
|
||||
6. Set `BC += D`
|
||||
@@ -274,6 +276,11 @@ func (cva ContinuousVestingAccount) TrackUndelegation(amount Coins) {
|
||||
with an excess `DV` amount, even after all its coins have vested. This is because
|
||||
undelegating free coins are prioritized.
|
||||
|
||||
**Note**: The undelegation (bond refund) amount may exceed the delegated
|
||||
vesting (bond) amount due to the way undelegation truncates the bond refund,
|
||||
which can increase the validator's exchange rate (tokens/shares) slightly if the
|
||||
undelegated tokens are non-integral.
|
||||
|
||||
#### Keepers/Handlers
|
||||
|
||||
```go
|
||||
|
||||
Reference in New Issue
Block a user