syntax = "proto3";

package cerc.registry.v1;

import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";
import "gogoproto/gogo.proto";
import "cosmos/base/v1beta1/coin.proto";

option go_package = "git.vdb.to/cerc-io/laconic2d/x/registry";

// Params defines the registry module parameters
message Params {
  cosmos.base.v1beta1.Coin record_rent = 1[
    (gogoproto.nullable) = false,
    (gogoproto.moretags) = "json:\"record_rent\" yaml:\"record_rent\""
  ];

  google.protobuf.Duration record_rent_duration = 2 [
    (gogoproto.nullable)    = false,
    (gogoproto.stdduration) = true,
    (gogoproto.moretags)    = "json:\"record_rent_duration\" yaml:\"record_rent_duration\""
  ];

  cosmos.base.v1beta1.Coin authority_rent = 3 [
    (gogoproto.nullable) = false,
    (gogoproto.moretags) = "json:\"authority_rent\" yaml:\"authority_rent\""
  ];

  google.protobuf.Duration authority_rent_duration = 4 [
    (gogoproto.nullable)    = false,
    (gogoproto.stdduration) = true,
    (gogoproto.moretags)    = "json:\"authority_rent_duration\" yaml:\"authority_rent_duration\""
  ];

  google.protobuf.Duration authority_grace_period = 5 [
    (gogoproto.nullable)    = false,
    (gogoproto.stdduration) = true,
    (gogoproto.moretags)    = "json:\"authority_grace_period\" yaml:\"authority_grace_period\""
  ];

  bool authority_auction_enabled = 6 [(gogoproto.moretags) = "json:\"authority_auction_enabled\" yaml:\"authority_auction_enabled\""];

  google.protobuf.Duration authority_auction_commits_duration = 7 [
    (gogoproto.nullable)    = false,
    (gogoproto.stdduration) = true,
    (gogoproto.moretags)    = "json:\"authority_auction_commits_duration\" yaml:\"authority_auction_commits_duration\""
  ];

  google.protobuf.Duration authority_auction_reveals_duration = 8 [
    (gogoproto.nullable)    = false,
    (gogoproto.stdduration) = true,
    (gogoproto.moretags)    = "json:\"authority_auction_reveals_duration\" yaml:\"authority_auction_reveals_duration\""
  ];

  cosmos.base.v1beta1.Coin authority_auction_commit_fee = 9 [
    (gogoproto.nullable) = false,
    (gogoproto.moretags) = "json:\"authority_auction_commit_fee\" yaml:\"authority_auction_commit_fee\""
  ];

  cosmos.base.v1beta1.Coin authority_auction_reveal_fee = 10 [
    (gogoproto.nullable) = false,
    (gogoproto.moretags) = "json:\"authority_auction_reveal_fee\" yaml:\"authority_auction_reveal_fee\""
  ];

  cosmos.base.v1beta1.Coin authority_auction_minimum_bid = 11 [
    (gogoproto.nullable) = false,
    (gogoproto.moretags) = "json:\"authority_auction_minimum_bid\" yaml:\"authority_auction_minimum_bid\""
  ];
}

// Record defines a registry record
message Record {
  string              id          = 1 [(gogoproto.moretags) = "json:\"id\" yaml:\"id\""];
  string              bond_id     = 2 [(gogoproto.moretags) = "json:\"bond_id\" yaml:\"bond_id\""];
  string              create_time = 3 [(gogoproto.moretags) = "json:\"create_time\" yaml:\"create_time\""];
  string              expiry_time = 4 [(gogoproto.moretags) = "json:\"expiry_time\" yaml:\"expiry_time\""];
  bool                deleted     = 5;
  repeated string     owners      = 6 [(gogoproto.moretags) = "json:\"owners\" yaml:\"owners\""];
  bytes               attributes  = 7 [(gogoproto.moretags) = "json:\"attributes\" yaml:\"attributes\""];
  repeated string     names       = 8 [(gogoproto.moretags) = "json:\"names\" yaml:\"names\""];
  string              type        = 9 [(gogoproto.moretags) = "json:\"types\" yaml:\"types\""];
}

// AuthorityEntry defines a registry authority
message AuthorityEntry {
  string        name  = 1;
  NameAuthority entry = 2;
}

// NameAuthority
message NameAuthority {
  // Owner public key.
  string owner_public_key = 1 [(gogoproto.moretags) = "json:\"owner_public_key\" yaml:\"owner_public_key\""];
  // Owner address.
  string owner_address = 2 [(gogoproto.moretags) = "json:\"owner_address\" yaml:\"owner_address\""];
  // height at which name/authority was created.
  uint64                    height      = 3;
  string                    status      = 4;
  string                    auction_id  = 5 [(gogoproto.moretags) = "json:\"auction_id\" yaml:\"auction_id\""];
  string                    bond_id     = 6 [(gogoproto.moretags) = "json:\"bond_id\" yaml:\"bond_id\""];

  google.protobuf.Timestamp expiry_time = 7 [
    (gogoproto.nullable) = false,
    (gogoproto.stdtime)  = true,
    (gogoproto.moretags) = "json:\"expiry_time\" yaml:\"expiry_time\""
  ];
}

// NameEntry
message NameEntry {
  string     name  = 1;
  NameRecord entry = 2;
}

// NameRecord defines a versioned name record
message NameRecord {
  NameRecordEntry          latest  = 1;
  repeated NameRecordEntry history = 2;
}

// NameRecordEntry
message NameRecordEntry {
  string id     = 1;
  uint64 height = 2;
}

// Signature
message Signature {
  string sig     = 1 [(gogoproto.moretags) = "json:\"sig\" yaml:\"sig\""];
  string pub_key = 2 [(gogoproto.moretags) = "json:\"pub_key\" yaml:\"pub_key\""];
}

// BlockChangeSet
message BlockChangeSet {
  int64                   height       = 1;
  repeated string         records      = 2;
  repeated string         auctions     = 3;
  repeated AuctionBidInfo auction_bids = 4 [(gogoproto.moretags) = "json:\"auction_bids\" yaml:\"auction_bids\""];
  repeated string         authorities  = 5;
  repeated string         names        = 6;
}

// AuctionBidInfo
message AuctionBidInfo {
  string auction_id     = 1 [(gogoproto.moretags) = "json:\"auction_id\" yaml:\"auction_id\""];
  string bidder_address = 2 [(gogoproto.moretags) = "json:\"bidder_address\" yaml:\"bidder_address\""];
}

// ExpiryQueue: record / authority expiry queue type
// id:    expiry time
// value: array of ids (record cids / authority names)
message ExpiryQueue {
  string          id    = 1;
  repeated string value = 2;
}