use blockifier::state::state_api::StateReader;
use starknet_types::contract_address::ContractAddress;
use starknet_types::contract_class::ContractClass;
use starknet_types::felt::ClassHash;
use starknet_types::rpc::state::Balance;
use crate::account::FeeToken;
use crate::error::DevnetResult;
use crate::state::state_readers::DictState;
use crate::state::{CustomState, CustomStateReader, StarknetState};
pub trait HashIdentified {
type Element;
type Hash;
fn get_by_hash(&self, hash: Self::Hash) -> Option<&Self::Element>;
}
pub trait HashIdentifiedMut {
type Element;
type Hash;
fn get_by_hash_mut(&mut self, hash: &Self::Hash) -> Option<&mut Self::Element>;
}
pub(crate) trait Deployed {
fn deploy(&self, state: &mut StarknetState) -> DevnetResult<()>;
fn get_address(&self) -> ContractAddress;
fn declare_if_undeclared(
&self,
state: &mut StarknetState,
class_hash: ClassHash,
contract_class: &ContractClass,
) -> DevnetResult<()> {
if !state.is_contract_declared(class_hash) {
state.predeclare_contract_class(class_hash, contract_class.clone())?;
}
Ok(())
}
}
pub trait Accounted {
fn set_initial_balance(&self, state: &mut DictState) -> DevnetResult<()>;
#[allow(unused)] fn get_balance(&self, state: &mut impl StateReader, token: FeeToken) -> DevnetResult<Balance>;
}
pub trait AccountGenerator {
type Acc: Accounted;
fn generate_accounts(
&mut self,
number_of_accounts: u8,
class_hash: ClassHash,
contract_class: &ContractClass,
) -> DevnetResult<&Vec<Self::Acc>>;
}