from starkware.cairo.common.cairo_builtins import PoseidonBuiltin
from starkware.cairo.common.hash_state_poseidon import (
HashState,
hash_finalize,
hash_init,
hash_update_single,
hash_update_with_nested_hash,
)
const CONTRACT_CLASS_VERSION = 'CONTRACT_CLASS_V0.1.0';
struct ContractEntryPoint {
// A field element that encodes the signature of the called function.
selector: felt,
function_idx: felt,
}
struct ContractClass {
contract_class_version: felt,
// The length and pointer to the external entry point table of the contract.
n_external_functions: felt,
external_functions: ContractEntryPoint*,
// The length and pointer to the L1 handler entry point table of the contract.
n_l1_handlers: felt,
l1_handlers: ContractEntryPoint*,
// The length and pointer to the constructor entry point table of the contract.
n_constructors: felt,
constructors: ContractEntryPoint*,
// starknet_keccak of the contract ABI.
// Note that the OS does not enforce any constraints on this value.
abi_hash: felt,
// The length and pointer of the Sierra program.
sierra_program_length: felt,
sierra_program_ptr: felt*,
}
func class_hash{poseidon_ptr: PoseidonBuiltin*}(contract_class: ContractClass*) -> (hash: felt) {
let hash_state: HashState = hash_init();
with hash_state {
hash_update_single(item=contract_class.contract_class_version);
// Hash external entry points.
hash_update_with_nested_hash(
data_ptr=contract_class.external_functions,
data_length=contract_class.n_external_functions * ContractEntryPoint.SIZE,
);
// Hash L1 handler entry points.
hash_update_with_nested_hash(
data_ptr=contract_class.l1_handlers,
data_length=contract_class.n_l1_handlers * ContractEntryPoint.SIZE,
);
// Hash constructor entry points.
hash_update_with_nested_hash(
data_ptr=contract_class.constructors,
data_length=contract_class.n_constructors * ContractEntryPoint.SIZE,
);
// Hash abi_hash.
hash_update_single(item=contract_class.abi_hash);
// Hash Sierra program.
hash_update_with_nested_hash(
data_ptr=contract_class.sierra_program_ptr,
data_length=contract_class.sierra_program_length,
);
let hash: felt = hash_finalize(hash_state=hash_state);
}
return (hash=hash);
}