// Copyright 2022 Prysmatic Labs.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";

package ethereum.engine.v1;

import "proto/eth/ext/options.proto";

option csharp_namespace = "Ethereum.Engine.V1";
option go_package = "github.com/prysmaticlabs/prysm/proto/engine/v1;enginev1";
option java_multiple_files = true;
option java_outer_classname = "ExecutionEngineProto";
option java_package = "org.ethereum.engine.v1";
option php_namespace = "Ethereum\\Engine\\v1";

message ExecutionBlock {
	bytes number                = 1;
	bytes hash                  = 2;
	bytes parent_hash           = 3;
	bytes sha3_uncles           = 4;
	bytes miner                 = 5;
	bytes state_root            = 6;
	bytes transactions_root     = 7;
	bytes receipts_root         = 8;
	bytes logs_bloom            = 9;
	bytes difficulty            = 10;
	string total_difficulty     = 11;
	uint64 gas_limit            = 12;
	uint64 gas_used             = 13;
	bytes base_fee_per_gas      = 14;
	bytes size                  = 15;
	uint64 timestamp            = 16;
	bytes extra_data            = 17;
	bytes mix_hash              = 18;
	bytes nonce                 = 19;
	repeated bytes transactions = 20;
	repeated bytes uncles       = 21;
}

message ExecutionPayload {
	bytes parent_hash           = 1 [(ethereum.eth.ext.ssz_size) = "32"];
	bytes fee_recipient         = 2 [(ethereum.eth.ext.ssz_size) = "20"];
	bytes state_root            = 3 [(ethereum.eth.ext.ssz_size) = "32"];
	bytes receipts_root         = 4 [(ethereum.eth.ext.ssz_size) = "32"];
	bytes logs_bloom            = 5 [(ethereum.eth.ext.ssz_size) = "256"];
	bytes prev_randao           = 6 [(ethereum.eth.ext.ssz_size) = "32"];
	uint64 block_number         = 7;
	uint64 gas_limit            = 8;
	uint64 gas_used             = 9;
	uint64 timestamp            = 10;
	bytes extra_data            = 11 [(ethereum.eth.ext.ssz_max) = "32"];
	bytes base_fee_per_gas      = 12 [(ethereum.eth.ext.ssz_size) = "32"];
	bytes block_hash            = 13 [(ethereum.eth.ext.ssz_size) = "32"];
	repeated bytes transactions = 14 [(ethereum.eth.ext.ssz_size) = "?,?", (ethereum.eth.ext.ssz_max)  = "1048576,1073741824"];
}

message TransitionConfiguration {
	string terminal_total_difficulty = 1;
	bytes terminal_block_hash        = 2;
	bytes terminal_block_number      = 3;
}

message PayloadAttributes {
	uint64 timestamp              = 1;
	bytes prev_randao             = 2 [(ethereum.eth.ext.ssz_size) = "32"];
	bytes suggested_fee_recipient = 3 [(ethereum.eth.ext.ssz_size) = "20"];
}

message PayloadStatus {
	Status status           = 1;
	bytes latest_valid_hash = 2 [(ethereum.eth.ext.ssz_size) = "32"];
	string validation_error = 3;
	enum Status {
		UNKNOWN                 = 0;
		VALID                   = 1;
		INVALID                 = 2;
		SYNCING                 = 3;
		ACCEPTED                = 4;
		INVALID_BLOCK_HASH      = 5;
		INVALID_TERMINAL_BLOCK  = 6;
	}
}

message ForkchoiceState {
	bytes head_block_hash      = 1 [(ethereum.eth.ext.ssz_size) = "32"];
	bytes safe_block_hash      = 2 [(ethereum.eth.ext.ssz_size) = "32"];
	bytes finalized_block_hash = 3 [(ethereum.eth.ext.ssz_size) = "32"];
}
