syntax = "proto3";
package cosmos.upgrade.v1beta1;

import "google/protobuf/any.proto";
import "gogoproto/gogo.proto";
import "google/protobuf/timestamp.proto";

option go_package                       = "github.com/cosmos/cosmos-sdk/x/upgrade/types";
option (gogoproto.goproto_stringer_all) = false;
option (gogoproto.goproto_getters_all)  = false;

// Plan specifies information about a planned upgrade and when it should occur.
message Plan {
  option (gogoproto.equal) = true;

  // Sets the name for the upgrade. This name will be used by the upgraded
  // version of the software to apply any special "on-upgrade" commands during
  // the first BeginBlock method after the upgrade is applied. It is also used
  // to detect whether a software version can handle a given upgrade. If no
  // upgrade handler with this name has been set in the software, it will be
  // assumed that the software is out-of-date when the upgrade Time or Height is
  // reached and the software will exit.
  string name = 1;

  // The time after which the upgrade must be performed.
  // Leave set to its zero value to use a pre-defined Height instead.
  google.protobuf.Timestamp time = 2 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false];

  // The height at which the upgrade must be performed.
  // Only used if Time is not set.
  int64 height = 3;

  // Any application specific upgrade info to be included on-chain
  // such as a git commit that validators could automatically upgrade to
  string info = 4;

  // IBC-enabled chains can opt-in to including the upgraded client state in its upgrade plan
  // This will make the chain commit to the correct upgraded (self) client state before the upgrade occurs,
  // so that connecting chains can verify that the new upgraded client is valid by verifying a proof on the
  // previous version of the chain.
  // This will allow IBC connections to persist smoothly across planned chain upgrades
  google.protobuf.Any upgraded_client_state = 5 [(gogoproto.moretags) = "yaml:\"upgraded_client_state\""];;
}

// SoftwareUpgradeProposal is a gov Content type for initiating a software
// upgrade.
message SoftwareUpgradeProposal {
  option (gogoproto.equal) = true;

  string title       = 1;
  string description = 2;
  Plan   plan        = 3 [(gogoproto.nullable) = false];
}

// CancelSoftwareUpgradeProposal is a gov Content type for cancelling a software
// upgrade.
message CancelSoftwareUpgradeProposal {
  option (gogoproto.equal) = true;

  string title       = 1;
  string description = 2;
}
