syntax = "proto3";

package ibc.applications.transfer.v1;

option go_package = "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types";

import "amino/amino.proto";
import "gogoproto/gogo.proto";
import "cosmos/msg/v1/msg.proto";
import "cosmos/base/v1beta1/coin.proto";
import "ibc/core/client/v1/client.proto";
import "ibc/applications/transfer/v1/transfer.proto";

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

  // Transfer defines a rpc handler method for MsgTransfer.
  rpc Transfer(MsgTransfer) returns (MsgTransferResponse);

  // UpdateParams defines a rpc handler for MsgUpdateParams.
  rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse);
}

// MsgTransfer defines a msg to transfer fungible tokens (i.e Coins) between
// ICS20 enabled chains. See ICS Spec here:
// https://github.com/cosmos/ibc/tree/master/spec/app/ics-020-fungible-token-transfer#data-structures
message MsgTransfer {
  option (amino.name)           = "cosmos-sdk/MsgTransfer";
  option (cosmos.msg.v1.signer) = "sender";

  option (gogoproto.goproto_getters) = false;

  // the port on which the packet will be sent
  string source_port = 1;
  // the channel by which the packet will be sent
  string source_channel = 2;
  // token to be transferred
  cosmos.base.v1beta1.Coin token = 3 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];
  // the sender address
  string sender = 4;
  // the recipient address on the destination chain
  string receiver = 5;
  // Timeout height relative to the current block height.
  // If you are sending with IBC v1 protocol, either timeout_height or timeout_timestamp must be set.
  // If you are sending with IBC v2 protocol, timeout_timestamp must be set, and timeout_height must be omitted.
  ibc.core.client.v1.Height timeout_height = 6 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];
  // Timeout timestamp in absolute nanoseconds since unix epoch.
  // If you are sending with IBC v1 protocol, either timeout_height or timeout_timestamp must be set.
  // If you are sending with IBC v2 protocol, timeout_timestamp must be set.
  uint64 timeout_timestamp = 7;
  // optional memo
  string memo = 8;
  // optional encoding
  string encoding = 9;
}

// MsgTransferResponse defines the Msg/Transfer response type.
message MsgTransferResponse {
  option (gogoproto.goproto_getters) = false;

  // sequence number of the transfer packet sent
  uint64 sequence = 1;
}

// MsgUpdateParams is the Msg/UpdateParams request type.
message MsgUpdateParams {
  option (cosmos.msg.v1.signer) = "signer";

  option (gogoproto.goproto_getters) = false;

  // signer address
  string signer = 1;

  // params defines the transfer parameters to update.
  //
  // NOTE: All parameters must be supplied.
  Params params = 2 [(gogoproto.nullable) = false];
}

// MsgUpdateParamsResponse defines the response structure for executing a
// MsgUpdateParams message.
message MsgUpdateParamsResponse {}
