use crate::utils::Address;
const fn at(low: u8) -> Address {
let mut bytes = [0u8; 20];
bytes[19] = low;
Address::from_bytes(bytes)
}
pub const ARB_SYS: Address = at(0x64);
pub const ARB_INFO: Address = at(0x65);
pub const ARB_ADDRESS_TABLE: Address = at(0x66);
pub const ARB_OWNER_PUBLIC: Address = at(0x6b);
pub const ARB_GAS_INFO: Address = at(0x6c);
pub const ARB_AGGREGATOR: Address = at(0x6d);
pub const ARB_RETRYABLE_TX: Address = at(0x6e);
pub const ARB_STATISTICS: Address = at(0x6f);
pub const ARB_OWNER: Address = at(0x70);
pub const ARB_WASM: Address = at(0x71);
pub const ARB_WASM_CACHE: Address = at(0x72);
pub const NODE_INTERFACE: Address = at(0xc8);
pub const ARBOS: Address = match Address::parse_const("0x00000000000000000000000000000000000a4b05") {
Some(address) => address,
None => Address::ZERO,
};
pub const ARBOS_VERSION_OFFSET: u64 = 55;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Precompile {
pub address: Address,
pub name: &'static str,
}
pub const ALL: [Precompile; 12] = [
Precompile { address: ARB_SYS, name: "ArbSys" },
Precompile { address: ARB_INFO, name: "ArbInfo" },
Precompile { address: ARB_ADDRESS_TABLE, name: "ArbAddressTable" },
Precompile { address: ARB_OWNER_PUBLIC, name: "ArbOwnerPublic" },
Precompile { address: ARB_GAS_INFO, name: "ArbGasInfo" },
Precompile { address: ARB_AGGREGATOR, name: "ArbAggregator" },
Precompile { address: ARB_RETRYABLE_TX, name: "ArbRetryableTx" },
Precompile { address: ARB_STATISTICS, name: "ArbStatistics" },
Precompile { address: ARB_OWNER, name: "ArbOwner" },
Precompile { address: ARB_WASM, name: "ArbWasm" },
Precompile { address: ARB_WASM_CACHE, name: "ArbWasmCache" },
Precompile { address: NODE_INTERFACE, name: "NodeInterface" },
];
#[must_use]
pub fn precompile(address: Address) -> Option<&'static Precompile> {
ALL.iter().find(|one| one.address == address)
}
#[cfg(test)]
#[path = "tests/table.rs"]
mod tests;