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

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

option go_package = "github.com/cosmos/cosmos-sdk/x/bank/types";

// Params defines the parameters for the bank module.
message Params {
  option (gogoproto.goproto_stringer)       = false;
  repeated SendEnabled send_enabled         = 1 [(gogoproto.moretags) = "yaml:\"send_enabled,omitempty\""];
  bool                 default_send_enabled = 2 [(gogoproto.moretags) = "yaml:\"default_send_enabled,omitempty\""];
}

// SendEnabled maps coin denom to a send_enabled status (whether a denom is
// sendable).
message SendEnabled {
  option (gogoproto.equal)            = true;
  option (gogoproto.goproto_stringer) = false;
  string denom                        = 1;
  bool   enabled                      = 2;
}

// Input models transaction input.
message Input {
  option (gogoproto.equal)           = false;
  option (gogoproto.goproto_getters) = false;

  string   address                        = 1;
  repeated cosmos.base.v1beta1.Coin coins = 2
      [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"];
}

// Output models transaction outputs.
message Output {
  option (gogoproto.equal)           = false;
  option (gogoproto.goproto_getters) = false;

  string   address                        = 1;
  repeated cosmos.base.v1beta1.Coin coins = 2
      [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"];
}

// Supply represents a struct that passively keeps track of the total supply
// amounts in the network.
// This message is deprecated now that supply is indexed by denom.
message Supply {
  option deprecated = true;

  option (gogoproto.equal)           = true;
  option (gogoproto.goproto_getters) = false;

  option (cosmos_proto.implements_interface) = "*github.com/cosmos/cosmos-sdk/x/bank/legacy/v040.SupplyI";

  repeated cosmos.base.v1beta1.Coin total = 1
      [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"];
}

// DenomUnit represents a struct that describes a given
// denomination unit of the basic token.
message DenomUnit {
  // denom represents the string name of the given denom unit (e.g uatom).
  string denom = 1;
  // exponent represents power of 10 exponent that one must
  // raise the base_denom to in order to equal the given DenomUnit's denom
  // 1 denom = 1^exponent base_denom
  // (e.g. with a base_denom of uatom, one can create a DenomUnit of 'atom' with
  // exponent = 6, thus: 1 atom = 10^6 uatom).
  uint32 exponent = 2;
  // aliases is a list of string aliases for the given denom
  repeated string aliases = 3;
}

// Metadata represents a struct that describes
// a basic token.
message Metadata {
  string description = 1;
  // denom_units represents the list of DenomUnit's for a given coin
  repeated DenomUnit denom_units = 2;
  // base represents the base denom (should be the DenomUnit with exponent = 0).
  string base = 3;
  // display indicates the suggested denom that should be
  // displayed in clients.
  string display = 4;
  // name defines the name of the token (eg: Cosmos Atom)
  string name = 5;
  // symbol is the token symbol usually shown on exchanges (eg: ATOM). This can
  // be the same as the display.
  string symbol = 6;
}
