syntax = "proto3"; package arbiter.shared.evm; import "google/protobuf/empty.proto"; message EtherTransferMeaning { bytes to = 1; // 20-byte Ethereum address bytes value = 2; // U256 as big-endian bytes } message TokenInfo { string symbol = 1; bytes address = 2; // 20-byte Ethereum address uint64 chain_id = 3; } // Mirror of token_transfers::Meaning message TokenTransferMeaning { TokenInfo token = 1; bytes to = 2; // 20-byte Ethereum address bytes value = 3; // U256 as big-endian bytes } // Mirror of policies::SpecificMeaning message SpecificMeaning { oneof meaning { EtherTransferMeaning ether_transfer = 1; TokenTransferMeaning token_transfer = 2; } } message GasLimitExceededViolation { optional bytes max_gas_fee_per_gas = 1; // U256 as big-endian bytes optional bytes max_priority_fee_per_gas = 2; // U256 as big-endian bytes } message EvalViolation { message ChainIdMismatch { uint64 expected = 1; uint64 actual = 2; } oneof kind { bytes invalid_target = 1; // 20-byte Ethereum address GasLimitExceededViolation gas_limit_exceeded = 2; google.protobuf.Empty rate_limit_exceeded = 3; google.protobuf.Empty volumetric_limit_exceeded = 4; google.protobuf.Empty invalid_time = 5; google.protobuf.Empty invalid_transaction_type = 6; ChainIdMismatch chain_id_mismatch = 7; } } // Transaction was classified but no grant covers it message NoMatchingGrantError { SpecificMeaning meaning = 1; } // Transaction was classified and a grant was found, but constraints were violated message PolicyViolationsError { SpecificMeaning meaning = 1; repeated EvalViolation violations = 2; } // top-level error returned when transaction evaluation fails message TransactionEvalError { oneof kind { google.protobuf.Empty contract_creation_not_supported = 1; google.protobuf.Empty unsupported_transaction_type = 2; NoMatchingGrantError no_matching_grant = 3; PolicyViolationsError policy_violations = 4; } }