syntax = "proto3";

package vesting.v1beta1;

import "amino/amino.proto";
import "cosmos/auth/v1beta1/auth.proto";
import "cosmos/base/v1beta1/coin.proto";
import "gogoproto/gogo.proto";

option go_package = "github.com/axone-protocol/axoned/x/vesting/types";

// BaseVestingAccount implements the VestingAccount interface. It contains all
// the necessary fields needed for any vesting account implementation.
message BaseVestingAccount {
  option (amino.name) = "cosmos-sdk/BaseVestingAccount";
  option (gogoproto.goproto_getters) = false;

  cosmos.auth.v1beta1.BaseAccount base_account = 1 [(gogoproto.embed) = true];
  repeated cosmos.base.v1beta1.Coin original_vesting = 2 [
    (gogoproto.nullable) = false,
    (amino.dont_omitempty) = true,
    (amino.encoding) = "legacy_coins",
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"
  ];
  repeated cosmos.base.v1beta1.Coin delegated_free = 3 [
    (gogoproto.nullable) = false,
    (amino.dont_omitempty) = true,
    (amino.encoding) = "legacy_coins",
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"
  ];
  repeated cosmos.base.v1beta1.Coin delegated_vesting = 4 [
    (gogoproto.nullable) = false,
    (amino.dont_omitempty) = true,
    (amino.encoding) = "legacy_coins",
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"
  ];
  // Vesting end time, as unix timestamp (in seconds).
  int64 end_time = 5;
}

// ContinuousVestingAccount implements the VestingAccount interface. It
// continuously vests by unlocking coins linearly with respect to time.
message ContinuousVestingAccount {
  option (amino.name) = "cosmos-sdk/ContinuousVestingAccount";
  option (gogoproto.goproto_getters) = false;

  BaseVestingAccount base_vesting_account = 1 [(gogoproto.embed) = true];
  // Vesting start time, as unix timestamp (in seconds).
  int64 start_time = 2;
}

// 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 (amino.name) = "cosmos-sdk/DelayedVestingAccount";
  option (gogoproto.goproto_getters) = false;

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

// Period defines a length of time and amount of coins that will vest.
message Period {
  // Period duration in seconds.
  int64 length = 1;
  repeated cosmos.base.v1beta1.Coin amount = 2 [
    (gogoproto.nullable) = false,
    (amino.dont_omitempty) = true,
    (amino.encoding) = "legacy_coins",
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"
  ];
}

// PeriodicVestingAccount implements the VestingAccount interface. It
// periodically vests by unlocking coins during each specified period.
message PeriodicVestingAccount {
  option (amino.name) = "cosmos-sdk/PeriodicVestingAccount";
  option (gogoproto.goproto_getters) = false;

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

// PermanentLockedAccount implements the VestingAccount interface. It does
// not ever release coins, locking them indefinitely. Coins in this account can
// still be used for delegating and for governance votes even while locked.
//
// Since: cosmos-sdk 0.43
message PermanentLockedAccount {
  option (amino.name) = "cosmos-sdk/PermanentLockedAccount";
  option (gogoproto.goproto_getters) = false;

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

// CliffVestingAccount implements the VestingAccount interface. It
// continuously vests by unlocking coins after a cliff period linearly with respect to time.
message CliffVestingAccount {
  option (amino.name) = "cosmos-sdk/CliffVestingAccount";
  option (gogoproto.goproto_getters) = false;

  // base_vesting_account implements the VestingAccount interface. It contains
  // all the necessary fields needed for any vesting account implementation
  BaseVestingAccount base_vesting_account = 1 [(gogoproto.embed) = true];
  // start_time defines the time at which the vesting period begins
  int64 start_time = 2;
  // cliff_time defines the time at which the first portion of the vesting is unlocked
  int64 cliff_time = 3;
}
