syntax = "proto3";
package vulcanize.nameservice.v1beta1;

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

option go_package = "github.com/tharsis/ethermint/x/nameservice/types";

// Params defines the nameservice 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\""
  ];
}

// Params defines the nameservice module records
message Record {
  string id = 1 [
    (gogoproto.moretags) = "json:\"id\" yaml:\"id\""
  ];
  string bond_id = 2 [
    (gogoproto.moretags) = "json:\"bondId\" yaml:\"bondId\""
  ];
  google.protobuf.Timestamp create_time = 3 [
    (gogoproto.stdtime) = true,
    (gogoproto.nullable) = false,
    (gogoproto.moretags) = "json:\"createTime\" yaml:\"createTime\""
  ];
  google.protobuf.Timestamp expiry_time = 4 [
    (gogoproto.stdtime) = true,
    (gogoproto.nullable) = false,
    (gogoproto.moretags) = "json:\"expiryTime\" yaml:\"expiryTime\""
  ];
  bool deleted = 5;
  repeated string owners = 6 [
    (gogoproto.moretags) = "json:\"owners\" yaml:\"owners\""
  ];
  bytes attributes = 7 [
    (gogoproto.moretags) = "json:\"attributes\" yaml:\"attributes\""
  ];
}

// AuthorityEntry defines the nameservice module AuthorityEntries
message AuthorityEntry{
  string name = 1;
  NameAuthority entry = 2;
}

// NameAuthority
message NameAuthority {
  // Owner public key.
  string owner_public_key = 1 [
    (gogoproto.moretags) = "json:\"ownerPublicKey\" yaml:\"ownerPublicKey\""
  ];
  // Owner address.
  string owner_address = 2 [
    (gogoproto.moretags) = "json:\"ownerAddress\" yaml:\"ownerAddress\""
  ];
  // height at which name/authority was created.
  uint64  height = 3;
  string status = 4;
  string auction_id = 5 [
    (gogoproto.moretags) = "json:\"auctionID\" yaml:\"auctionID\""
  ];
  string bond_id = 6 [
    (gogoproto.moretags) = "json:\"bondID\" yaml:\"bondID\""
  ];
  google.protobuf.Timestamp expiry_time = 7 [
    (gogoproto.nullable) = false,
    (gogoproto.stdtime) = true,
    (gogoproto.moretags) = "json:\"expiryTime\" yaml:\"expiryTime\""
  ];
}

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

// NameRecord
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:\"pubKey\" yaml:\"pubKey\""
  ];
}

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

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