syntax = "proto3";

package amino;

import "google/protobuf/descriptor.proto";

// TODO(fdymylja): once we fully migrate to protov2 the go_package needs to be updated.
// We need this right now because gogoproto codegen needs to import the extension.
option go_package = "github.com/cosmos/cosmos-sdk/types/tx/amino";

extend google.protobuf.MessageOptions {
  // name is the string used when registering a concrete
  // type into the Amino type registry, via the Amino codec's
  // `RegisterConcrete()` method. This string MUST be at most 39
  // characters long, or else the message will be rejected by the
  // Ledger hardware device.
  string name = 11110001;

  // encoding describes the encoding format used by Amino for the given
  // message. The field type is chosen to be a string for
  // flexibility, but it should ideally be short and expected to be
  // machine-readable, for example "base64" or "utf8_json". We
  // highly recommend to use underscores for word separation instead of spaces.
  //
  // If left empty, then the Amino encoding is expected to be the same as the
  // Protobuf one.
  //
  // This annotation should not be confused with the `encoding`
  // one which operates on the field level.
  string message_encoding = 11110002;
}

extend google.protobuf.FieldOptions {
  // encoding describes the encoding format used by Amino for
  // the given field. The field type is chosen to be a string for
  // flexibility, but it should ideally be short and expected to be
  // machine-readable, for example "base64" or "utf8_json". We
  // highly recommend to use underscores for word separation instead of spaces.
  //
  // If left empty, then the Amino encoding is expected to be the same as the
  // Protobuf one.
  //
  // This annotation should not be confused with the
  // `message_encoding` one which operates on the message level.
  string encoding = 11110003;

  // field_name sets a different field name (i.e. key name) in
  // the amino JSON object for the given field.
  //
  // Example:
  //
  // message Foo {
  //   string bar = 1 [(amino.field_name) = "baz"];
  // }
  //
  // Then the Amino encoding of Foo will be:
  // `{"baz":"some value"}`
  string field_name = 11110004;

  // dont_omitempty sets the field in the JSON object even if
  // its value is empty, i.e. equal to the Golang zero value. To learn what
  // the zero values are, see https://go.dev/ref/spec#The_zero_value.
  //
  // Fields default to `omitempty`, which is the default behavior when this
  // annotation is unset. When set to true, then the field value in the
  // JSON object will be set, i.e. not `undefined`.
  //
  // Example:
  //
  // message Foo {
  //   string bar = 1;
  //   string baz = 2 [(amino.dont_omitempty) = true];
  // }
  //
  // f := Foo{};
  // out := AminoJSONEncoder(&f);
  // out == {"baz":""}
  bool dont_omitempty = 11110005;

  // oneof_name sets the type name for the given field oneof field.  This is used
  // by the Amino JSON encoder to encode the type of the oneof field, and must be the same string in
  // the RegisterConcrete() method usage used to register the concrete type.
  string oneof_name = 11110006;
}