syntax = "proto3";

import "google/protobuf/empty.proto";
import "types/types.proto";

package txpool;

option go_package = "./txpool;txpoolproto";

message TxHashes {
  repeated types.H256 hashes = 1;
}

message AddRequest {
  repeated bytes rlp_txs = 1;
}

enum ImportResult {
  SUCCESS = 0;
  ALREADY_EXISTS = 1;
  FEE_TOO_LOW = 2;
  STALE = 3;
  INVALID = 4;
  INTERNAL_ERROR = 5;
}

message AddReply {
  repeated ImportResult imported = 1;
  repeated string errors = 2;
}

message TransactionsRequest {
  repeated types.H256 hashes = 1;
}
message TransactionsReply {
  repeated bytes rlp_txs = 1;
}

message OnAddRequest {}
message OnAddReply {
  repeated bytes rpl_txs = 1;
}

message AllRequest {}
message AllReply {
  enum TxnType {
    PENDING = 0; // All currently processable transactions
    QUEUED = 1;  // Queued but non-processable transactions
    BASE_FEE = 2;  // BaseFee not enough baseFee non-processable transactions
  }
  message Tx {
    TxnType txn_type = 1;
    types.H160 sender = 2;
    bytes rlp_tx = 3;
  }
  repeated Tx txs = 1;
}

message PendingReply {
  message Tx {
    types.H160 sender = 1;
    bytes rlp_tx = 2;
    bool is_local = 3;
  }
  repeated Tx txs = 1;
}

message StatusRequest {}
message StatusReply {
  uint32 pending_count = 1;
  uint32 queued_count = 2;
  uint32 base_fee_count = 3;
}

message NonceRequest {
  types.H160 address = 1;
}
message NonceReply {
  bool found = 1;
  uint64 nonce = 2;
}

message GetBlobsRequest{
  repeated types.H256 blob_hashes = 1;
}

message BlobAndProof {
  bytes blob = 1;
  repeated bytes proofs = 2;
}

message GetBlobsReply {
  repeated BlobAndProof blobs_with_proofs = 1;
}

service Txpool {
  // Version returns the service version number
  rpc Version(google.protobuf.Empty) returns (types.VersionReply);
  // preserves incoming order, changes amount, unknown hashes will be omitted
  rpc FindUnknown(TxHashes) returns (TxHashes);
  // Expecting signed transactions. Preserves incoming order and amount
  // Adding txs as local (use P2P to add remote txs)
  rpc Add(AddRequest) returns (AddReply);
  // preserves incoming order and amount, if some transaction doesn't exists in pool - returns nil in this slot
  rpc Transactions(TransactionsRequest) returns (TransactionsReply);
  // returns all transactions from tx pool
  rpc All(AllRequest) returns (AllReply);
  // Returns all pending (processable) transactions, in ready-for-mining order
  rpc Pending(google.protobuf.Empty) returns (PendingReply);
  // subscribe to new transactions add event
  rpc OnAdd(OnAddRequest) returns (stream OnAddReply);
  // returns high level status
  rpc Status(StatusRequest) returns (StatusReply);
  // returns nonce for given account
  rpc Nonce(NonceRequest) returns (NonceReply);
  // returns the list of blobs and proofs for a given list of blob hashes
  rpc GetBlobs(GetBlobsRequest) returns (GetBlobsReply);
}
