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

import "gogoproto/gogo.proto";
import "cosmos/base/v1beta1/coin.proto";
import "cosmos/bank/v1beta1/bank.proto";
import "cosmos_proto/cosmos.proto";
import "cosmos/msg/v1/msg.proto";
import "amino/amino.proto";

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

// Msg defines the bank Msg service.
service Msg {
  option (cosmos.msg.v1.service) = true;

  // Send defines a method for sending coins from one account to another account.
  rpc Send(MsgSend) returns (MsgSendResponse);

  // MultiSend defines a method for sending coins from some accounts to other accounts.
  rpc MultiSend(MsgMultiSend) returns (MsgMultiSendResponse);

  // UpdateParams defines a governance operation for updating the x/bank module parameters.
  // The authority is defined in the keeper.
  rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse) {
    option (cosmos_proto.method_added_in) = "cosmos-sdk 0.47";
  };

  // SetSendEnabled is a governance operation for setting the SendEnabled flag
  // on any number of Denoms. Only the entries to add or update should be
  // included. Entries that already exist in the store, but that aren't
  // included in this message, will be left unchanged.
  rpc SetSendEnabled(MsgSetSendEnabled) returns (MsgSetSendEnabledResponse) {
    option (cosmos_proto.method_added_in) = "cosmos-sdk 0.47";
  };

  // UpdateDenomMetadata defines a method for updating the denom metadata. Only usable in x/gov proposal.
  rpc UpdateDenomMetadata(MsgUpdateDenomMetadata) returns (MsgUpdateDenomMetadataResponse);
}

// MsgSend represents a message to send coins from one account to another.
message MsgSend {
  option (cosmos.msg.v1.signer) = "from_address";
  option (amino.name)           = "cosmos-sdk/MsgSend";

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

  string   from_address                    = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
  string   to_address                      = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"];
  repeated cosmos.base.v1beta1.Coin amount = 3 [
    (gogoproto.nullable)     = false,
    (amino.dont_omitempty)   = true,
    (amino.encoding)         = "legacy_coins",
    (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"
  ];
}

// MsgSendResponse defines the Msg/Send response type.
message MsgSendResponse {}

// MsgMultiSend represents an arbitrary multi-in, multi-out send message.
message MsgMultiSend {
  option (cosmos.msg.v1.signer) = "inputs";
  option (amino.name)           = "cosmos-sdk/MsgMultiSend";

  option (gogoproto.equal) = false;

  // Inputs, despite being `repeated`, only allows one sender input. This is
  // checked in MsgMultiSend's ValidateBasic.
  repeated Input  inputs  = 1 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];
  repeated Output outputs = 2 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];
}

// MsgMultiSendResponse defines the Msg/MultiSend response type.
message MsgMultiSendResponse {}

// MsgUpdateParams is the Msg/UpdateParams request type.
message MsgUpdateParams {
  option (cosmos_proto.message_added_in) = "cosmos-sdk 0.47";
  option (cosmos.msg.v1.signer)          = "authority";

  // authority is the address that controls the module (defaults to x/gov unless overwritten).
  string authority    = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
  option (amino.name) = "cosmos-sdk/x/bank/MsgUpdateParams";

  // params defines the x/bank parameters to update.
  //
  // NOTE: All parameters must be supplied.
  Params params = 2 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];
}

// MsgUpdateParamsResponse defines the response structure for executing a
// MsgUpdateParams message.
message MsgUpdateParamsResponse {
  option (cosmos_proto.message_added_in) = "cosmos-sdk 0.47";
}

// MsgSetSendEnabled is the Msg/SetSendEnabled request type.
//
// Only entries to add/update/delete need to be included.
// Existing SendEnabled entries that are not included in this
// message are left unchanged.
message MsgSetSendEnabled {
  option (cosmos_proto.message_added_in) = "cosmos-sdk 0.47";
  option (cosmos.msg.v1.signer)          = "authority";
  option (amino.name)                    = "cosmos-sdk/MsgSetSendEnabled";

  // authority is the address that controls the module.
  string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];

  // send_enabled is the list of entries to add or update.
  repeated SendEnabled send_enabled = 2;

  // use_default_for is a list of denoms that should use the params.default_send_enabled value.
  // Denoms listed here will have their SendEnabled entries deleted.
  // If a denom is included that doesn't have a SendEnabled entry,
  // it will be ignored.
  repeated string use_default_for = 3;
}

// MsgSetSendEnabledResponse defines the Msg/SetSendEnabled response type.
message MsgSetSendEnabledResponse {
  option (cosmos_proto.message_added_in) = "cosmos-sdk 0.47";
}

// MsgUpdateDenomMetadata defines the Msg/UpdateDenomMetadata request type.
message MsgUpdateDenomMetadata {
  option (cosmos.msg.v1.signer) = "from_address";

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

  string   from_address = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
  string   title        = 2;
  string   description  = 3;
  Metadata metadata     = 4 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];
}

// MsgUpdateDenomMetadataResponse defines the Msg/UpdateDenomMetadata response type.
message MsgUpdateDenomMetadataResponse {}