use eot::{forks::*, Fork, OpCode};
fn main() {
println!("🚀 EOT (EVM Opcode Table) - Basic Usage Example\n");
basic_opcode_operations();
fork_comparison();
explore_metadata();
gas_cost_analysis();
opcode_conversion();
}
fn basic_opcode_operations() {
println!("📋 Example 1: Basic Opcode Operations");
println!("=====================================");
let tload = Cancun::TLOAD;
println!("Opcode: {}", tload);
println!("Byte value: 0x{:02x}", u8::from(tload));
println!("Gas cost: {}", tload.gas_cost());
println!("Stack inputs: {}", tload.stack_inputs());
println!("Stack outputs: {}", tload.stack_outputs());
println!("Introduced in: {:?}", tload.introduced_in());
println!("Group: {:?}", tload.group());
println!("EIP: {:?}", tload.eip());
println!();
}
fn fork_comparison() {
println!("🔄 Example 2: Fork Comparison");
println!("=============================");
let opcodes_to_check = [
(0x01, "ADD"),
(0xf4, "DELEGATECALL"),
(0xfd, "REVERT"),
(0x5f, "PUSH0"),
(0x5c, "TLOAD"),
];
let _forks = [
("Frontier", Fork::Frontier),
("Homestead", Fork::Homestead),
("Byzantium", Fork::Byzantium),
("Shanghai", Fork::Shanghai),
("Cancun", Fork::Cancun),
];
println!("Opcode availability across forks:");
println!(
"{:<12} {:<12} {:<10} {:<8} {:<8} {:<6}",
"Opcode", "Frontier", "Homestead", "Byzantium", "Shanghai", "Cancun"
);
println!("{}", "-".repeat(70));
for (opcode_byte, name) in opcodes_to_check {
print!("{:<12}", name);
print!(
" {:<12}",
if Frontier::has_opcode(opcode_byte) {
"✅"
} else {
"❌"
}
);
print!(
" {:<10}",
if Homestead::has_opcode(opcode_byte) {
"✅"
} else {
"❌"
}
);
print!(
" {:<8}",
if Byzantium::has_opcode(opcode_byte) {
"✅"
} else {
"❌"
}
);
print!(
" {:<8}",
if Shanghai::has_opcode(opcode_byte) {
"✅"
} else {
"❌"
}
);
print!(
" {:<6}",
if Cancun::has_opcode(opcode_byte) {
"✅"
} else {
"❌"
}
);
println!();
}
println!();
}
fn explore_metadata() {
println!("🔍 Example 3: Exploring Opcode Metadata");
println!("=======================================");
let opcodes = [
Cancun::ADD,
Cancun::PUSH1,
Cancun::DUP1,
Cancun::SSTORE,
Cancun::CREATE2,
Cancun::TLOAD,
];
for opcode in opcodes {
let metadata = opcode.metadata();
println!("📊 {} (0x{:02x})", metadata.name, metadata.opcode);
println!(" Description: {}", metadata.description);
println!(" Group: {:?}", metadata.group);
println!(
" Gas: {}, Stack: {} → {}",
metadata.gas_cost, metadata.stack_inputs, metadata.stack_outputs
);
println!(" Introduced: {:?}", metadata.introduced_in);
if let Some(eip) = metadata.eip {
println!(" EIP: {}", eip);
}
println!();
}
}
fn gas_cost_analysis() {
println!("⛽ Example 4: Gas Cost Analysis");
println!("==============================");
let contract_opcodes = vec![
0x60, 0x60, 0x01, 0x60, 0x55, 0x60, 0x54, 0xf3, ];
println!("Analyzing contract opcode sequence:");
let mut total_gas = 0u64;
for (i, &byte) in contract_opcodes.iter().enumerate() {
if Cancun::has_opcode(byte) {
let opcode = Cancun::from(byte);
let gas = opcode.gas_cost();
total_gas += gas as u64;
println!(" {}: {} (0x{:02x}) - {} gas", i + 1, opcode, byte, gas);
}
}
println!("📈 Total estimated gas: {} (base costs only)", total_gas);
println!("⚠️ Note: This is simplified - actual gas costs depend on execution context");
println!();
}
fn opcode_conversion() {
println!("🔄 Example 5: Opcode Conversion");
println!("==============================");
let add_opcode = Cancun::ADD;
println!("Original opcode: {}", add_opcode);
let byte_val: u8 = add_opcode.into();
println!("As byte: 0x{:02x}", byte_val);
let back_to_opcode = Cancun::from(byte_val);
println!("Back to opcode: {}", back_to_opcode);
println!("Are they equal? {}", add_opcode == back_to_opcode);
println!("\nOpcode counts by fork:");
println!(" Frontier: {} opcodes", Frontier::all_opcodes().len());
println!(" Homestead: {} opcodes", Homestead::all_opcodes().len());
println!(" Byzantium: {} opcodes", Byzantium::all_opcodes().len());
println!(
" Constantinople: {} opcodes",
Constantinople::all_opcodes().len()
);
println!(" Istanbul: {} opcodes", Istanbul::all_opcodes().len());
println!(" Berlin: {} opcodes", Berlin::all_opcodes().len());
println!(" London: {} opcodes", London::all_opcodes().len());
println!(" Shanghai: {} opcodes", Shanghai::all_opcodes().len());
println!(" Cancun: {} opcodes", Cancun::all_opcodes().len());
println!("\n✅ Basic usage example completed!");
}