syntax = "proto3";

package did.v1;

import "cosmos/orm/v1/orm.proto";
import "did/v1/genesis.proto";

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

// Alias represents a DID alias
message Alias {
  option (cosmos.orm.v1.table) = {
    id: 1
    primary_key: {fields: "id"}
    index: {
      id: 1
      fields: "subject,origin"
      unique: true
    }
  };

  // The unique identifier of the alias
  string id = 1;

  // The alias of the DID
  string subject = 2;

  // Origin of the alias
  string origin = 3;
}

// Controller represents a Sonr DWN Vault
message Controller {
  option (cosmos.orm.v1.table) = {
    id: 2
    primary_key: {
      fields: "number"
      auto_increment: true
    }
    index: {
      id: 1
      fields: "sonr_address"
      unique: true
    }
    index: {
      id: 2
      fields: "eth_address"
      unique: true
    }
    index: {
      id: 3
      fields: "btc_address"
      unique: true
    }
    index: {
      id: 4
      fields: "did"
      unique: true
    }
  };

  // The unique identifier of the controller
  uint64 number = 1;

  // The unique identifier of the controller
  string did = 2;

  // The DID of the controller
  string sonr_address = 3;

  // The DID of the controller
  string eth_address = 4;

  // The DID of the controller
  string btc_address = 5;

  // PubKey is the verification method
  bytes public_key = 6;

  // Val Keyshare
  string ks_val = 7;

  // The Status of the claims for the controller
  bool claimed = 8;
}

// Verification reprsents a method of verifying membership in a DID
message Verification {
  option (cosmos.orm.v1.table) = {
    id: 4
    primary_key: {fields: "did"}
    index: {
      id: 1
      fields: "issuer,subject"
      unique: true
    }
    index: {
      id: 2
      fields: "controller,did_method,issuer"
      unique: true
    }
    index: {
      id: 3
      fields: "verification_type,subject,issuer"
      unique: true
    }
  };

  // The unique identifier of the verification
  string did = 1;

  // The controller of the verification
  string controller = 2;

  // The DIDNamespace of the verification
  string did_method = 3;

  // The value of the linked identifier
  string issuer = 4;

  // The subject of the verification
  string subject = 5;

  // The public key of the verification
  PubKey public_key = 6;

  // The Verification Type (Authentication, Assertion, CapabilityDelegation,
  // CapabilityInvocation)
  string verification_type = 7;
}
