syntax = "proto3";
package kava.issuance.v1beta1;

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

option go_package = "github.com/kava-labs/kava/x/issuance/types";

// Msg defines the issuance Msg service.
service Msg {
  // IssueTokens message type used by the issuer to issue new tokens
  rpc IssueTokens(MsgIssueTokens) returns (MsgIssueTokensResponse);

  // RedeemTokens message type used by the issuer to redeem (burn) tokens
  rpc RedeemTokens(MsgRedeemTokens) returns (MsgRedeemTokensResponse);

  // BlockAddress message type used by the issuer to block an address from holding or transferring tokens
  rpc BlockAddress(MsgBlockAddress) returns (MsgBlockAddressResponse);

  // UnblockAddress message type used by the issuer to unblock an address from holding or transferring tokens
  rpc UnblockAddress(MsgUnblockAddress) returns (MsgUnblockAddressResponse);

  // SetPauseStatus message type used to pause or unpause status
  rpc SetPauseStatus(MsgSetPauseStatus) returns (MsgSetPauseStatusResponse);
}

// MsgIssueTokens represents a message used by the issuer to issue new tokens
message MsgIssueTokens {
  option (gogoproto.equal) = false;
  option (gogoproto.goproto_getters) = false;

  string sender = 1;
  cosmos.base.v1beta1.Coin tokens = 2 [(gogoproto.nullable) = false];
  string receiver = 3;
}

// MsgIssueTokensResponse defines the Msg/IssueTokens response type.
message MsgIssueTokensResponse {}

// MsgRedeemTokens represents a message used by the issuer to redeem (burn) tokens
message MsgRedeemTokens {
  option (gogoproto.equal) = false;
  option (gogoproto.goproto_getters) = false;

  string sender = 1;
  cosmos.base.v1beta1.Coin tokens = 2 [(gogoproto.nullable) = false];
}

// MsgRedeemTokensResponse defines the Msg/RedeemTokens response type.
message MsgRedeemTokensResponse {}

// MsgBlockAddress represents a message used by the issuer to block an address from holding or transferring tokens
message MsgBlockAddress {
  option (gogoproto.equal) = false;
  option (gogoproto.goproto_getters) = false;

  string sender = 1;
  string denom = 2;
  string blocked_address = 3;
}

// MsgBlockAddressResponse defines the Msg/BlockAddress response type.
message MsgBlockAddressResponse {}

// MsgUnblockAddress message type used by the issuer to unblock an address from holding or transferring tokens
message MsgUnblockAddress {
  option (gogoproto.equal) = false;
  option (gogoproto.goproto_getters) = false;

  string sender = 1;
  string denom = 2;
  string blocked_address = 3;
}

// MsgUnblockAddressResponse defines the Msg/UnblockAddress response type.
message MsgUnblockAddressResponse {}

// MsgSetPauseStatus message type used by the issuer to pause or unpause status
message MsgSetPauseStatus {
  option (gogoproto.equal) = false;
  option (gogoproto.goproto_getters) = false;

  string sender = 1;
  string denom = 2;
  bool status = 3;
}

// MsgSetPauseStatusResponse defines the Msg/SetPauseStatus response type.
message MsgSetPauseStatusResponse {}
