starknet_in_rust 0.4.0

A Rust implementation of Starknet execution logic
Documentation
use crate::syscalls::syscall_handler_errors::SyscallHandlerError;
use cairo_vm::felt::Felt252;
use cairo_vm::{
    hint_processor::builtin_hint_processor::{
        builtin_hint_processor_definition::HintProcessorData,
        hint_utils::{get_integer_from_var_name, insert_value_from_var_name},
    },
    vm::{errors::hint_errors::HintError, vm_core::VirtualMachine},
};
use num_traits::{One, Zero};
use std::{collections::HashMap, ops::Shl};

pub fn addr_bound_prime(
    vm: &mut VirtualMachine,
    hint_data: &HintProcessorData,
    constants: &HashMap<String, Felt252>,
) -> Result<(), SyscallHandlerError> {
    let addr_bound = constants
        .get("starkware.starknet.common.storage.ADDR_BOUND")
        .ok_or(HintError::MissingConstant(
            "starkware.starknet.common.storage.ADDR_BOUND".into(),
        ))?;

    let lower_bound = Felt252::from(1).shl(250u32);
    let upper_bound = Felt252::from(1).shl(251u32);
    if !(&lower_bound < addr_bound && addr_bound <= &upper_bound) {
        return Err(HintError::AssertionFailed(
            "normalize_address() cannot be used with the current constants."
                .to_string()
                .into_boxed_str(),
        )
        .into());
    }

    let addr = get_integer_from_var_name("addr", vm, &hint_data.ids_data, &hint_data.ap_tracking)?;
    let is_small = if addr.as_ref() < addr_bound {
        Felt252::one()
    } else {
        Felt252::zero()
    };

    insert_value_from_var_name(
        "is_small",
        is_small,
        vm,
        &hint_data.ids_data,
        &hint_data.ap_tracking,
    )?;

    Ok(())
}

pub fn addr_is_250(
    vm: &mut VirtualMachine,
    hint_data: &HintProcessorData,
) -> Result<(), SyscallHandlerError> {
    let addr = get_integer_from_var_name("addr", vm, &hint_data.ids_data, &hint_data.ap_tracking)?;
    let is_250 = if addr.as_ref().bits() <= 250 {
        Felt252::one()
    } else {
        Felt252::zero()
    };

    insert_value_from_var_name(
        "is_250",
        is_250,
        vm,
        &hint_data.ids_data,
        &hint_data.ap_tracking,
    )?;

    Ok(())
}