syntax = "proto3";

package did.v1;

import "cosmos/msg/v1/msg.proto";
import "cosmos_proto/cosmos.proto";
import "did/v1/genesis.proto";
import "gogoproto/gogo.proto";

option go_package = "github.com/onsonr/sonr/x/did/types";

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

  // ExecuteTx executes a transaction on the Sonr Blockchain. It leverages
  // Macaroon for verification.
  rpc ExecuteTx(MsgExecuteTx) returns (MsgExecuteTxResponse);

  // LinkAssertion links an assertion to a controller.
  rpc LinkAssertion(MsgLinkAssertion) returns (MsgLinkAssertionResponse);

  // LinkAuthentication links an authentication to a controller.
  rpc LinkAuthentication(MsgLinkAuthentication)
      returns (MsgLinkAuthenticationResponse);

  // UnlinkAssertion unlinks an assertion from a controller.
  rpc UnlinkAssertion(MsgUnlinkAssertion)
      returns (MsgUnlinkAssertionResponse);

  // UnlinkAuthentication unlinks an authentication from a controller.
  rpc UnlinkAuthentication(MsgUnlinkAuthentication)
      returns (MsgUnlinkAuthenticationResponse);

  // UpdateParams defines a governance operation for updating the parameters.
  rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse);
}

// MsgLinkAuthentication is the message type for the LinkAuthentication RPC.
message MsgLinkAuthentication {
  option (cosmos.msg.v1.signer) = "controller";

  // Controller is the address of the controller to authenticate.
  string controller = 1 [ (cosmos_proto.scalar) = "cosmos.AddressString" ];

  // Subject is the subject of the authentication.
  string subject = 2;

  // Assertion is the assertion of the authentication.
  string assertion = 3;

  // Authentication is the authentication of the authentication.
  bytes credential_id = 4;

  // token is the macron token to authenticate the operation.
  string macaroon_token = 5;
}

// MsgLinkAuthenticationResponse is the response type for the
// LinkAuthentication RPC.
message MsgLinkAuthenticationResponse {
  // Success returns true if the specified cid is valid and not already
  // encrypted.
  bool success = 1;

  // Controller is the address of the initialized controller.
  string did = 2;
}

// MsgLinkAssertion is the message type for the LinkAssertion RPC.
message MsgLinkAssertion {
  option (cosmos.msg.v1.signer) = "controller";

  // Controller is the address of the controller to authenticate.
  string controller = 1 [ (cosmos_proto.scalar) = "cosmos.AddressString" ];

  // Subject is the subject of the authentication.
  string subject = 2;

  // Assertion is the assertion of the authentication.
  string assertion = 3;

  // token is the macron token to authenticate the operation.
  string macaroon_token = 4;
}

// MsgLinkAssertionResponse is the response type for the
// LinkAssertion RPC.
message MsgLinkAssertionResponse {
  // Success returns true if the specified cid is valid and not already
  // encrypted.
  bool success = 1;

  // Controller is the address of the initialized controller.
  string did = 2;
}


// MsgExecuteTx is the message type for the ExecuteTx RPC.
message MsgExecuteTx {
  option (cosmos.msg.v1.signer) = "controller";

  // Controller is the address of the controller to authenticate.
  string controller = 1 [ (cosmos_proto.scalar) = "cosmos.AddressString" ];

  // Messages is the list of messages to execute.
  map<string, bytes> messages = 2;

  // MacaroonToken is the macaroon token to authenticate the operation.
  string macaroon_token = 3;
}

// MsgExecuteTxResponse is the response type for the ExecuteTx RPC.
message MsgExecuteTxResponse {
  bool success = 1;
  string tx_hash = 2;
}

// MsgUnlinkAssertion is the message type for the UnlinkAssertion RPC.
message MsgUnlinkAssertion {
  option (cosmos.msg.v1.signer) = "controller";

  // Controller is the address of the controller to authenticate.
  string controller = 1 [ (cosmos_proto.scalar) = "cosmos.AddressString" ];

  // Assertion is the assertion of the authentication.
  string assertion_did = 2;

  // token is the macron token to authenticate the operation.
  string macaroon_token = 3;
}

// MsgUnlinkAssertionResponse is the response type for the
// UnlinkAssertion RPC.
message MsgUnlinkAssertionResponse {
  // Success returns true if the specified cid is valid and not already
  // encrypted.
  bool success = 1;

  // Controller is the address of the initialized controller.
  string did = 2;
}

// MsgUnlinkAuthentication is the message type for the UnlinkAuthentication RPC.
message MsgUnlinkAuthentication {
  option (cosmos.msg.v1.signer) = "controller";

  // Controller is the address of the controller to authenticate.
  string controller = 1 [ (cosmos_proto.scalar) = "cosmos.AddressString" ];

  // Subject is the subject of the authentication.
  string authentication_did = 2;

  // token is the macron token to authenticate the operation.
  string macaroon_token = 3;
}

// MsgUnlinkAuthenticationResponse is the response type for the
// UnlinkAuthentication RPC.
message MsgUnlinkAuthenticationResponse {
  // Success returns true if the specified cid is valid and not already
  // encrypted.
  bool success = 1;

  // Controller is the address of the initialized controller.
  string did = 2;
}

// MsgUpdateParams is the Msg/UpdateParams request type.
//
// Since: cosmos-sdk 0.47
message MsgUpdateParams {
  option (cosmos.msg.v1.signer) = "authority";

  // authority is the address of the governance account.
  string authority = 1 [ (cosmos_proto.scalar) = "cosmos.AddressString" ];

  // params defines the parameters to update.
  Params params = 2 [ (gogoproto.nullable) = false ];

  // token is the macron token to authenticate the operation.
  string token = 3;
}

// MsgUpdateParamsResponse defines the response structure for executing a
// MsgUpdateParams message.
//
// Since: cosmos-sdk 0.47
message MsgUpdateParamsResponse {}
