# Vesting

Vesting accounts can be initialized with some vesting and non-vesting coins. The non-vesting coins would be immediately transferable. DelayedVesting and ContinuousVesting accounts can be created with normal messages after Genesis. Other types of vesting accounts must be created at Genesis, or as part of a manual network upgrade. The current specification only allows for *unconditional* vesting (ie. there is no possibility of reaching `ET` and having coins fail to vest).

## ContinuousVestingAccount <a href="#continuousvestingaccount" id="continuousvestingaccount"></a>

The locked amount is being vested (freed) linearly over time.

```protobuf
// ContinuousVestingAccount implements the VestingAccount interface. It
// continuously vests by unlocking coins linearly with respect to time.
message ContinuousVestingAccount {
  option (gogoproto.goproto_getters)  = false;
  option (gogoproto.goproto_stringer) = false;

  BaseVestingAccount base_vesting_account = 1 [(gogoproto.embed) = true];
  int64              start_time           = 2;
}
```

## DelayedVestingAccount <a href="#delayedvestingaccount" id="delayedvestingaccount"></a>

The locked amount is being vested (freed) instantly at a pre-set time.

```protobuf
// 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.
message DelayedVestingAccount {
  option (gogoproto.goproto_getters)  = false;
  option (gogoproto.goproto_stringer) = false;

  BaseVestingAccount base_vesting_account = 1 [(gogoproto.embed) = true];
}
```

## PeriodicVestingAccount <a href="#periodicvestingaccount" id="periodicvestingaccount"></a>

The locked amount is being vested (freed) periodically according to the defined period.

```protobuf
// PeriodicVestingAccount implements the VestingAccount interface. It
// periodically vests by unlocking coins during each specified period.
message PeriodicVestingAccount {
  option (gogoproto.goproto_getters)  = false;
  option (gogoproto.goproto_stringer) = false;

  BaseVestingAccount base_vesting_account = 1 [(gogoproto.embed) = true];
  int64              start_time           = 2;
  repeated Period    vesting_periods      = 3 [(gogoproto.nullable) = false];
}
```

For detailed information see the [original](https://docs.cosmos.network/v0.46/modules/auth/05_vesting.html) document.
