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

import "gogoproto/gogo.proto";
import "google/protobuf/duration.proto";
import "cosmos/base/v1beta1/coin.proto";
import "vulcanize/auction/v1beta1/types.proto";

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

// MsgCreateAuction defines a create auction message
message MsgCreateAuction {
  option (gogoproto.goproto_getters) = false;

  // Duration of the commits phase in seconds
  google.protobuf.Duration commits_duration = 1 [
    (gogoproto.nullable) = false,
    (gogoproto.stdduration) = true,
    (gogoproto.moretags) = "json:\"commits_duration\" yaml:\"commits_duration\""
  ];
  // Duration of the reveals phase in seconds
  google.protobuf.Duration reveals_duration = 2 [
    (gogoproto.nullable) = false,
    (gogoproto.stdduration) = true,
    (gogoproto.moretags) = "json:\"reveals_duration\" yaml:\"reveals_duration\""
  ];
  // Commit fees
  cosmos.base.v1beta1.Coin commit_fee = 3 [
    (gogoproto.nullable) = false,
    (gogoproto.moretags) = "json:\"commit_fee\" yaml:\"commit_fee\""
  ];
  // Reveal fees
  cosmos.base.v1beta1.Coin reveal_fee = 4 [
    (gogoproto.nullable) = false,
    (gogoproto.moretags) = "json:\"reveal_fee\" yaml:\"reveal_fee\""
  ];
  // Minimum acceptable bid amount
  cosmos.base.v1beta1.Coin minimum_bid = 5 [
    (gogoproto.nullable) = false,
    (gogoproto.moretags) = "json:\"minimum_bid\" yaml:\"minimum_bid\""
  ];
  // Address of the signer
  string signer = 6 [
    (gogoproto.moretags) = "json:\"signer\" yaml:\"signer\""
  ];
}

// MsgCreateAuctionResponse returns the details of the created auction
message MsgCreateAuctionResponse {
  option (gogoproto.goproto_getters) = false;
  // Auction details
  Auction auction = 1 [
    (gogoproto.moretags) = "json:\"auction\" yaml:\"auction\""
  ];
}

// CommitBid defines the message to commit a bid
message MsgCommitBid {
  option (gogoproto.goproto_getters) = false;

  // Auction ID
  string auction_id = 1 [
    (gogoproto.moretags) = "json:\"auction_id\" yaml:\"auction_id\""
  ];
  // Commit Hash
  string commit_hash = 2 [
    (gogoproto.moretags) = "json:\"commit_hash\" yaml:\"commit_hash\""
  ];
  // Address of the signer
  string signer = 3 [
    (gogoproto.moretags) = "json:\"signer\" yaml:\"signer\""
  ];
}

// RevealBid defines the message to reveal a bid
message MsgRevealBid {
  option (gogoproto.goproto_getters) = false;

  // Auction ID
  string auction_id = 1 [
    (gogoproto.moretags) = "json:\"auction_id\" yaml:\"auction_id\""
  ];
  // Commit Hash
  string reveal = 2 [
    (gogoproto.moretags) = "json:\"reveal\" yaml:\"reveal\""
  ];
  // Address of the signer
  string signer = 3 [
    (gogoproto.moretags) = "json:\"signer\" yaml:\"signer\""
  ];
}

// MsgCommitBidResponse returns the state of the auction after the bid creation
message MsgCommitBidResponse {
  option (gogoproto.goproto_getters) = false;
  // Auction details
  Bid bid = 1 [
    (gogoproto.moretags) = "json:\"bid\" yaml:\"bid\""
  ];
}

// MsgRevealBidResponse returns the state of the auction after the bid reveal
message MsgRevealBidResponse {
  option (gogoproto.goproto_getters) = false;
  // Auction details
  Auction auction = 1 [
    (gogoproto.moretags) = "json:\"auction\" yaml:\"auction\""
  ];
}

// Tx defines the gRPC tx interface
service Msg {
  // CreateAuction is the command for creating an auction
  rpc CreateAuction(MsgCreateAuction) returns (MsgCreateAuctionResponse);

  // CommitBid is the command for committing a bid
  rpc CommitBid(MsgCommitBid) returns (MsgCommitBidResponse);

  //RevealBid is the command for revealing a bid
  rpc RevealBid(MsgRevealBid) returns (MsgRevealBidResponse);
}