// Since: cosmos-sdk 0.43
syntax = "proto3";
package cosmos.feegrant.v1beta1;

import "google/protobuf/any.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/feegrant";

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

  // GrantAllowance grants fee allowance to the grantee on the granter's
  // account with the provided expiration time.
  rpc GrantAllowance(MsgGrantAllowance) returns (MsgGrantAllowanceResponse);

  // RevokeAllowance revokes any fee allowance of granter's account that
  // has been granted to the grantee.
  rpc RevokeAllowance(MsgRevokeAllowance) returns (MsgRevokeAllowanceResponse);
}

// MsgGrantAllowance adds permission for Grantee to spend up to Allowance
// of fees from the account of Granter.
message MsgGrantAllowance {
  option (cosmos.msg.v1.signer) = "granter";
  option (amino.name)           = "cosmos-sdk/MsgGrantAllowance";

  // granter is the address of the user granting an allowance of their funds.
  string granter = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];

  // grantee is the address of the user being granted an allowance of another user's funds.
  string grantee = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"];

  // allowance can be any of basic, periodic, allowed fee allowance.
  google.protobuf.Any allowance = 3 [(cosmos_proto.accepts_interface) = "cosmos.feegrant.v1beta1.FeeAllowanceI"];
}

// MsgGrantAllowanceResponse defines the Msg/GrantAllowanceResponse response type.
message MsgGrantAllowanceResponse {}

// MsgRevokeAllowance removes any existing Allowance from Granter to Grantee.
message MsgRevokeAllowance {
  option (cosmos.msg.v1.signer) = "granter";
  option (amino.name)           = "cosmos-sdk/MsgRevokeAllowance";

  // granter is the address of the user granting an allowance of their funds.
  string granter = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];

  // grantee is the address of the user being granted an allowance of another user's funds.
  string grantee = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"];
}

// MsgRevokeAllowanceResponse defines the Msg/RevokeAllowanceResponse response type.
message MsgRevokeAllowanceResponse {}