syntax = "proto3";
package ibc.applications.transfer.v1;

option go_package = "github.com/cosmos/cosmos-sdk/x/ibc/applications/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/ics/tree/master/spec/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 nanoseconds) relative to the current block timestamp.
  // The timeout is disabled when set to 0.
  uint64 timeout_timestamp = 7 [(gogoproto.moretags) = "yaml:\"timeout_timestamp\""];
}

// MsgTransferResponse defines the Msg/Transfer response type.
message MsgTransferResponse { }

// FungibleTokenPacketData defines a struct for the packet payload
// See FungibleTokenPacketData spec:
// https://github.com/cosmos/ics/tree/master/spec/ics-020-fungible-token-transfer#data-structures
message FungibleTokenPacketData {
  // the token denomination to be transferred
  string denom = 1;
  // the token amount to be transferred
  uint64 amount = 2;
  // the sender address
  string sender = 3;
  // the recipient address on the destination chain
  string receiver = 4;
}

// DenomTrace contains the base denomination for ICS20 fungible tokens and the
// source tracing information path.
message DenomTrace {
  // path defines the chain of port/channel identifiers used for tracing the
  // source of the fungible token.
  string path = 1;
  // base denomination of the relayed fungible token.
  string base_denom = 2;
}

// Params defines the set of IBC transfer parameters.
// NOTE: To prevent a single token from being transferred, set the
// TransfersEnabled parameter to true and then set the bank module's SendEnabled
// parameter for the denomination to false.
message Params {
  // send_enabled enables or disables all cross-chain token transfers from this
  // chain.
  bool send_enabled = 1 [(gogoproto.moretags) = "yaml:\"send_enabled\""];
  // receive_enabled enables or disables all cross-chain token transfers to this
  // chain.
  bool receive_enabled = 2 [(gogoproto.moretags) = "yaml:\"receive_enabled\""];
}
