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 = "cosmossdk.io/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);

  // PruneAllowances prunes expired fee allowances, currently up to 75 at a time.
  rpc PruneAllowances(MsgPruneAllowances) returns (MsgPruneAllowancesResponse) {
    option (cosmos_proto.method_added_in) = "cosmos-sdk v0.50.0";
  };
}

// 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 {}

// MsgPruneAllowances prunes expired fee allowances.
message MsgPruneAllowances {
  option (cosmos.msg.v1.signer)          = "pruner";
  option (cosmos_proto.message_added_in) = "cosmos-sdk v0.50";

  // pruner is the address of the user pruning expired allowances.
  string pruner = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"];
}

// MsgPruneAllowancesResponse defines the Msg/PruneAllowancesResponse response type.
message MsgPruneAllowancesResponse {
  option (cosmos_proto.message_added_in) = "cosmos-sdk v0.50";
}