syntax = "proto3";
package ethermint.evm.v1;

import "gogoproto/gogo.proto";

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

// Params defines the EVM module parameters
message Params {
  // evm denom represents the token denomination used to run the EVM state
  // transitions.
  string evm_denom = 1 [ (gogoproto.moretags) = "yaml:\"evm_denom\"" ];
  // enable create toggles state transitions that use the vm.Create function
  bool enable_create = 2 [ (gogoproto.moretags) = "yaml:\"enable_create\"" ];
  // enable call toggles state transitions that use the vm.Call function
  bool enable_call = 3 [ (gogoproto.moretags) = "yaml:\"enable_call\"" ];
  // extra eips defines the additional EIPs for the vm.Config
  repeated int64 extra_eips = 4 [
    (gogoproto.customname) = "ExtraEIPs",
    (gogoproto.moretags) = "yaml:\"extra_eips\""
  ];
  // chain config defines the EVM chain configuration parameters
  ChainConfig chain_config = 5 [
    (gogoproto.moretags) = "yaml:\"chain_config\"",
    (gogoproto.nullable) = false
  ];
  // list of allowed eip712 msgs and their types
  repeated EIP712AllowedMsg eip712_allowed_msgs = 6 [
    (gogoproto.customname) = "EIP712AllowedMsgs",
    (gogoproto.nullable) = false
  ];
}

// ChainConfig defines the Ethereum ChainConfig parameters using *sdk.Int values
// instead of *big.Int.
message ChainConfig {
  // Homestead switch block (nil no fork, 0 = already homestead)
  string homestead_block = 1 [
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags) = "yaml:\"homestead_block\""
  ];
  // TheDAO hard-fork switch block (nil no fork)
  string dao_fork_block = 2 [
    (gogoproto.customname) = "DAOForkBlock",
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags) = "yaml:\"dao_fork_block\""
  ];
  // Whether the nodes supports or opposes the DAO hard-fork
  bool dao_fork_support = 3 [
    (gogoproto.customname) = "DAOForkSupport",
    (gogoproto.moretags) = "yaml:\"dao_fork_support\""
  ];
  // EIP150 implements the Gas price changes
  // (https://github.com/ethereum/EIPs/issues/150) EIP150 HF block (nil no fork)
  string eip150_block = 4 [
    (gogoproto.customname) = "EIP150Block",
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags) = "yaml:\"eip150_block\""
  ];
  // EIP150 HF hash (needed for header only clients as only gas pricing changed)
  string eip150_hash = 5 [
    (gogoproto.customname) = "EIP150Hash",
    (gogoproto.moretags) = "yaml:\"byzantium_block\""
  ];
  // EIP155Block HF block
  string eip155_block = 6 [
    (gogoproto.customname) = "EIP155Block",
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags) = "yaml:\"eip155_block\""
  ];
  // EIP158 HF block
  string eip158_block = 7 [
    (gogoproto.customname) = "EIP158Block",
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags) = "yaml:\"eip158_block\""
  ];
  // Byzantium switch block (nil no fork, 0 = already on byzantium)
  string byzantium_block = 8 [
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags) = "yaml:\"byzantium_block\""
  ];
  // Constantinople switch block (nil no fork, 0 = already activated)
  string constantinople_block = 9 [
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags) = "yaml:\"constantinople_block\""
  ];
  // Petersburg switch block (nil same as Constantinople)
  string petersburg_block = 10 [
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags) = "yaml:\"petersburg_block\""
  ];
  // Istanbul switch block (nil no fork, 0 = already on istanbul)
  string istanbul_block = 11 [
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags) = "yaml:\"istanbul_block\""
  ];
  // Eip-2384 (bomb delay) switch block (nil no fork, 0 = already activated)
  string muir_glacier_block = 12 [
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags) = "yaml:\"muir_glacier_block\""
  ];
  // Berlin switch block (nil = no fork, 0 = already on berlin)
  string berlin_block = 13 [
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags) = "yaml:\"berlin_block\""
  ];
  // DEPRECATED: EWASM, YOLOV3 and Catalyst block have been deprecated
  reserved 14, 15, 16;
  reserved "yolo_v3_block", "ewasm_block", "catalyst_block";
  // London switch block (nil = no fork, 0 = already on london)
  string london_block = 17 [
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags) = "yaml:\"london_block\""
  ];
  // Eip-4345 (bomb delay) switch block (nil = no fork, 0 = already activated)
  string arrow_glacier_block = 18 [
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags) = "yaml:\"arrow_glacier_block\""
  ];
  // EIP-3675 (TheMerge) switch block (nil = no fork, 0 = already in merge proceedings)
  string merge_fork_block = 19 [
    (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int",
    (gogoproto.moretags) = "yaml:\"merge_fork_block\""
  ];
}

// State represents a single Storage key value pair item.
message State {
  string key = 1;
  string value = 2;
}

// TransactionLogs define the logs generated from a transaction execution
// with a given hash. It it used for import/export data as transactions are not
// persisted on blockchain state after an upgrade.
message TransactionLogs {
  string hash = 1;
  repeated Log logs = 2;
}

// Log represents an protobuf compatible Ethereum Log that defines a contract
// log event. These events are generated by the LOG opcode and stored/indexed by
// the node.
message Log {
  // Consensus fields:

  // address of the contract that generated the event
  string address = 1;
  // list of topics provided by the contract.
  repeated string topics = 2;
  // supplied by the contract, usually ABI-encoded
  bytes data = 3;

  // Derived fields. These fields are filled in by the node
  // but not secured by consensus.

  // block in which the transaction was included
  uint64 block_number = 4 [ (gogoproto.jsontag) = "blockNumber" ];
  // hash of the transaction
  string tx_hash = 5 [ (gogoproto.jsontag) = "transactionHash" ];
  // index of the transaction in the block
  uint64 tx_index = 6 [ (gogoproto.jsontag) = "transactionIndex" ];
  // hash of the block in which the transaction was included
  string block_hash = 7 [ (gogoproto.jsontag) = "blockHash" ];
  // index of the log in the block
  uint64 index = 8 [ (gogoproto.jsontag) = "logIndex" ];

  // The Removed field is true if this log was reverted due to a chain
  // reorganisation. You must pay attention to this field if you receive logs
  // through a filter query.
  bool removed = 9;
}

// TxResult stores results of Tx execution.
message TxResult {
  option (gogoproto.goproto_getters) = false;

  // contract_address contains the ethereum address of the created contract (if
  // any). If the state transition is an evm.Call, the contract address will be
  // empty.
  string contract_address = 1
      [ (gogoproto.moretags) = "yaml:\"contract_address\"" ];
  // bloom represents the bloom filter bytes
  bytes bloom = 2;
  // tx_logs contains the transaction hash and the proto-compatible ethereum
  // logs.
  TransactionLogs tx_logs = 3 [
    (gogoproto.moretags) = "yaml:\"tx_logs\"",
    (gogoproto.nullable) = false
  ];
  // ret defines the bytes from the execution.
  bytes ret = 4;
  // reverted flag is set to true when the call has been reverted
  bool reverted = 5;
  // gas_used notes the amount of gas consumed while execution
  uint64 gas_used = 6;
}

// AccessTuple is the element type of an access list.
message AccessTuple {
  option (gogoproto.goproto_getters) = false;

  // hex formatted ethereum address
  string address = 1;
  // hex formatted hashes of the storage keys
  repeated string storage_keys = 2 [ (gogoproto.jsontag) = "storageKeys" ];
}

// TraceConfig holds extra parameters to trace functions.
message TraceConfig {
  // DEPRECATED: DisableMemory and DisableReturnData have been renamed to
  // Enable*.
  reserved 4, 7;
  reserved "disable_memory", "disable_return_data";

  // custom javascript tracer
  string tracer = 1;
  // overrides the default timeout of 5 seconds for JavaScript-based tracing
  // calls
  string timeout = 2;
  // number of blocks the tracer is willing to go back
  uint64 reexec = 3;
  // disable stack capture
  bool disable_stack = 5 [ (gogoproto.jsontag) = "disableStack" ];
  // disable storage capture
  bool disable_storage = 6 [ (gogoproto.jsontag) = "disableStorage" ];
  // print output during capture end
  bool debug = 8;
  // maximum length of output, but zero means unlimited
  int32 limit = 9;
  // Chain overrides, can be used to execute a trace using future fork rules
  ChainConfig overrides = 10;
  // enable memory capture
  bool enable_memory = 11 [ (gogoproto.jsontag) = "enableMemory" ];
  // enable return data capture
  bool enable_return_data = 12 [ (gogoproto.jsontag) = "enableReturnData" ];
}

// EIP712AllowedMsg stores an allowed legacy msg and its eip712 type.
message EIP712AllowedMsg {
  // msg's proto type name. ie "/cosmos.bank.v1beta1.MsgSend"
  string msg_type_url = 1;

  // name of the eip712 value type. ie "MsgValueSend"
  string msg_value_type_name = 2;

  // types of the msg value
  repeated EIP712MsgAttrType value_types = 3 [(gogoproto.nullable) = false];

  // nested types of the msg value
  repeated EIP712NestedMsgType nested_types = 4 [(gogoproto.nullable) = false];
}

// EIP712MsgType is the eip712 type of a single message.
message EIP712NestedMsgType {
  // name of the nested type. ie "Fee", "Coin"
  string name = 1;

  // attrs of the nested type
  repeated EIP712MsgAttrType attrs = 2 [(gogoproto.nullable) = false];
}

// EIP712MsgAttrType is the eip712 type of a single message attribute.
message EIP712MsgAttrType {
  string name = 1;
  string type = 2;
}