syntax = "proto3";

package ibc.applications.transfer.v1;

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

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

// Msg defines the ibc/transfer Msg service.
service Msg {
  // Transfer defines a rpc handler method for MsgTransfer.
  rpc Transfer(MsgTransfer) returns (MsgTransferResponse);
}

// 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 (gogoproto.equal)           = false;
  option (gogoproto.goproto_getters) = false;

  // the port on which the packet will be sent
  string source_port = 1 [(gogoproto.moretags) = "yaml:\"source_port\""];
  // the channel by which the packet will be sent
  string source_channel = 2 [(gogoproto.moretags) = "yaml:\"source_channel\""];
  // the tokens to be transferred
  cosmos.base.v1beta1.Coin token = 3 [(gogoproto.nullable) = false];
  // the sender address
  string sender = 4;
  // the recipient address on the destination chain
  string receiver = 5;
  // Timeout height relative to the current block height.
  // The timeout is disabled when set to 0.
  ibc.core.client.v1.Height timeout_height = 6
      [(gogoproto.moretags) = "yaml:\"timeout_height\"", (gogoproto.nullable) = false];
  // Timeout timestamp in absolute nanoseconds since unix epoch.
  // The timeout is disabled when set to 0.
  uint64 timeout_timestamp = 7 [(gogoproto.moretags) = "yaml:\"timeout_timestamp\""];
  // optional memo
  string memo = 8;
}

// MsgTransferResponse defines the Msg/Transfer response type.
message MsgTransferResponse {
  // sequence number of the transfer packet sent
  uint64 sequence = 1;
}