2020-06-03 19:35:00 +00:00
|
|
|
package v18de63
|
|
|
|
|
|
|
|
import (
|
2020-08-20 17:33:21 +00:00
|
|
|
"encoding/json"
|
|
|
|
"strconv"
|
|
|
|
|
|
|
|
"github.com/tendermint/tendermint/crypto"
|
|
|
|
|
|
|
|
"github.com/cosmos/cosmos-sdk/codec"
|
2020-06-03 19:35:00 +00:00
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
|
|
)
|
|
|
|
|
|
|
|
// BaseVestingAccount implements the VestingAccount interface. It contains all
|
|
|
|
// the necessary fields needed for any vesting account implementation.
|
|
|
|
type BaseVestingAccount struct {
|
|
|
|
*BaseAccount
|
|
|
|
|
|
|
|
OriginalVesting sdk.Coins `json:"original_vesting" yaml:"original_vesting"` // coins in account upon initialization
|
|
|
|
DelegatedFree sdk.Coins `json:"delegated_free" yaml:"delegated_free"` // coins that are vested and delegated
|
|
|
|
DelegatedVesting sdk.Coins `json:"delegated_vesting" yaml:"delegated_vesting"` // coins that vesting and delegated
|
|
|
|
EndTime int64 `json:"end_time" yaml:"end_time"` // when the coins become unlocked
|
|
|
|
}
|
|
|
|
|
|
|
|
// ContinuousVestingAccount implements the VestingAccount interface. It
|
|
|
|
// continuously vests by unlocking coins linearly with respect to time.
|
|
|
|
type ContinuousVestingAccount struct {
|
|
|
|
*BaseVestingAccount
|
|
|
|
|
|
|
|
StartTime int64 `json:"start_time" yaml:"start_time"` // when the coins start to vest
|
|
|
|
}
|
|
|
|
|
|
|
|
// PeriodicVestingAccount implements the VestingAccount interface. It
|
|
|
|
// periodically vests by unlocking coins during each specified period
|
|
|
|
type PeriodicVestingAccount struct {
|
|
|
|
*BaseVestingAccount
|
|
|
|
StartTime int64 `json:"start_time" yaml:"start_time"` // when the coins start to vest
|
|
|
|
VestingPeriods Periods `json:"vesting_periods" yaml:"vesting_periods"` // the vesting schedule
|
|
|
|
}
|
|
|
|
|
2020-08-20 17:33:21 +00:00
|
|
|
type prettyPublicKey struct {
|
|
|
|
PubKey crypto.PubKey
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p prettyPublicKey) MarshalJSON() ([]byte, error) {
|
|
|
|
cdc := codec.New()
|
|
|
|
codec.RegisterCrypto(cdc)
|
|
|
|
return cdc.MarshalJSON(p.PubKey)
|
|
|
|
}
|
|
|
|
|
|
|
|
type vestingAccountPretty struct {
|
|
|
|
Address sdk.AccAddress `json:"address" yaml:"address"`
|
|
|
|
Coins sdk.Coins `json:"coins" yaml:"coins"`
|
|
|
|
PubKey prettyPublicKey `json:"public_key" yaml:"public_key"`
|
|
|
|
AccountNumber string `json:"account_number" yaml:"account_number"`
|
|
|
|
Sequence string `json:"sequence" yaml:"sequence"`
|
|
|
|
OriginalVesting sdk.Coins `json:"original_vesting" yaml:"original_vesting"`
|
|
|
|
DelegatedFree sdk.Coins `json:"delegated_free" yaml:"delegated_free"`
|
|
|
|
DelegatedVesting sdk.Coins `json:"delegated_vesting" yaml:"delegated_vesting"`
|
|
|
|
EndTime int64 `json:"end_time" yaml:"end_time"`
|
|
|
|
|
|
|
|
// custom fields based on concrete vesting type which can be omitted
|
|
|
|
StartTime int64 `json:"start_time,omitempty" yaml:"start_time,omitempty"`
|
|
|
|
VestingPeriods Periods `json:"vesting_periods,omitempty" yaml:"vesting_periods,omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pva PeriodicVestingAccount) MarshalJSON() ([]byte, error) {
|
|
|
|
pubKey := prettyPublicKey{PubKey: pva.PubKey}
|
|
|
|
|
|
|
|
alias := vestingAccountPretty{
|
|
|
|
Address: pva.Address,
|
|
|
|
Coins: pva.Coins,
|
|
|
|
PubKey: pubKey,
|
|
|
|
AccountNumber: strconv.FormatUint(pva.AccountNumber, 10),
|
|
|
|
Sequence: strconv.FormatUint(pva.Sequence, 10),
|
|
|
|
OriginalVesting: pva.OriginalVesting,
|
|
|
|
DelegatedFree: pva.DelegatedFree,
|
|
|
|
DelegatedVesting: pva.DelegatedVesting,
|
|
|
|
EndTime: pva.EndTime,
|
|
|
|
StartTime: pva.StartTime,
|
|
|
|
VestingPeriods: pva.VestingPeriods,
|
|
|
|
}
|
|
|
|
|
|
|
|
return json.Marshal(alias)
|
|
|
|
}
|
|
|
|
|
2020-06-03 19:35:00 +00:00
|
|
|
// DelayedVestingAccount implements the VestingAccount interface. It vests all
|
|
|
|
// coins after a specific time, but non prior. In other words, it keeps them
|
|
|
|
// locked until a specified time.
|
|
|
|
type DelayedVestingAccount struct {
|
|
|
|
*BaseVestingAccount
|
|
|
|
}
|