syntax = "proto3";
package types;

import "tendermint/abci/types/types.proto";
import "gogoproto/gogo.proto";
import "google/protobuf/any.proto";

option go_package = "github.com/pokt-network/pocket-core/types";
option (gogoproto.goproto_stringer_all) = false;


// TxResponse defines a structure containing relevant tx data and metadata. The
// tags are stringified and the log is JSON decoded.
message TxResponse {
	option (gogoproto.goproto_getters) = false;
	// The block height
	int64 height = 1;
	// The transaction hash.
	string txhash = 2 [(gogoproto.customname) = "TxHash"];
	// Namespace for the Code
	string codespace = 3;
	// Response code.
	uint32 code = 4;
	// Result bytes, if any.
	string data = 5;
	// The output of the application's logger (raw string). May be non-deterministic.
	string raw_log = 6;
	// The output of the application's logger (typed). May be non-deterministic.
	repeated ABCIMessageLog logs = 7 [(gogoproto.castrepeated) = "ABCIMessageLogs", (gogoproto.nullable) = false];
	// Additional information. May be non-deterministic.
	string info = 8;
	// Amount of gas requested for transaction.
	int64 gas_wanted = 9;
	// Amount of gas consumed by transaction.
	int64 gas_used = 10;
	// The request transaction bytes.
	google.protobuf.Any tx = 11;
	// Time of the previous block. For heights > 1, it's the weighted median of the
	// timestamps of the valid votes in the block.LastCommit. For height == 1, it's genesis time.
	string timestamp = 12;
}

// ABCIMessageLog defines a structure containing an indexed tx ABCI message log.
message ABCIMessageLog {
	option (gogoproto.stringer) = true;

	uint32 msg_index = 1;
	bool success = 2;
	string log = 3;

	// Events contains a slice of Event objects that were emitted during some
	// execution.
	repeated StringEvent events = 4 [(gogoproto.castrepeated) = "StringEvents", (gogoproto.nullable) = false];
}

// StringEvent defines en Event object wrapper where all the attributes
// contain key/value pairs that are strings instead of raw bytes.
message StringEvent {
	option (gogoproto.stringer) = true;

	string type = 1;
	repeated Attribute attributes = 2 [(gogoproto.nullable) = false];
}

// Attribute defines an attribute wrapper where the key and value are
// strings instead of raw bytes.
message Attribute {
	string key = 1;
	string value = 2;
}

// GasInfo defines tx execution gas context.
message GasInfo {
	option (gogoproto.stringer) = true;
	// GasWanted is the maximum units of work we allow this tx to perform.
	uint64 gas_wanted = 1 [(gogoproto.moretags) = "yaml:\"gas_wanted\""];

	// GasUsed is the amount of gas actually consumed.
	uint64 gas_used = 2 [(gogoproto.moretags) = "yaml:\"gas_used\""];
}

// Result is the union of ResponseFormat and ResponseCheckTx.
message Result {
	option (gogoproto.goproto_getters) = false;
	option (gogoproto.stringer) = true;

	uint32 code = 1 [(gogoproto.casttype) = "CodeType"];

	string codespace = 2 [(gogoproto.casttype) = "CodespaceType"];

	// Data is any data returned from message or handler execution. It MUST be length
	// prefixed in order to separate data from multiple message executions.
	bytes data = 3;

	// Log contains the log information from message or handler execution.
	string log = 4;

	uint64 gasWanted = 5;

	uint64 gasUsed = 6;

	// Events contains a slice of Event objects that were emitted during message or
	// handler execution.
	repeated tendermint.abci.types.Event events = 7 [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "Events"];
}

// SimulationResponse defines the response generated when a transaction is
// successfully simulated.
message SimulationResponse {
	option (gogoproto.stringer) = true;
	GasInfo gas_info = 1 [(gogoproto.embed) = true, (gogoproto.nullable) = false];
	Result  result = 2;
}

// MsgData defines the data returned in a Result object during message execution.
message MsgData {
	option (gogoproto.stringer) = true;

	string msg_type = 1;
	bytes  data = 2;
}

// TxMsgData defines a list of MsgData. A transaction will have a MsgData object for
// each message.
message TxMsgData {
	option (gogoproto.stringer) = true;

	repeated MsgData data = 1;
}
