fuel-core 0.9.5

Fuel client.
use crate::{
    database::{columns::CONTRACTS_CODE_ROOT, Database},
    state::Error,
};
use fuel_core_interfaces::common::fuel_vm::prelude::{Bytes32, ContractId, Salt, Storage};
use std::borrow::Cow;

impl Storage<ContractId, (Salt, Bytes32)> for Database {
    type Error = Error;

    fn insert(
        &mut self,
        key: &ContractId,
        value: &(Salt, Bytes32),
    ) -> Result<Option<(Salt, Bytes32)>, Error> {
        Database::insert(self, key.as_ref(), CONTRACTS_CODE_ROOT, *value)
    }

    fn remove(&mut self, key: &ContractId) -> Result<Option<(Salt, Bytes32)>, Error> {
        Database::remove(self, key.as_ref(), CONTRACTS_CODE_ROOT)
    }

    fn get(&self, key: &ContractId) -> Result<Option<Cow<(Salt, Bytes32)>>, Error> {
        Database::get(self, key.as_ref(), CONTRACTS_CODE_ROOT)
    }

    fn contains_key(&self, key: &ContractId) -> Result<bool, Error> {
        Database::exists(self, key.as_ref(), CONTRACTS_CODE_ROOT)
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use fuel_core_interfaces::common::fuel_vm::prelude::Contract;
    use rand::rngs::StdRng;
    use rand::{Rng, SeedableRng};

    #[test]
    fn get() {
        let rng = &mut StdRng::seed_from_u64(2322u64);
        let contract_id: ContractId = ContractId::from([1u8; 32]);
        let contract: Contract = Contract::from(vec![32u8]);
        let root = contract.root();
        let salt: Salt = rng.gen();

        let database = Database::default();
        database
            .insert(
                contract_id.as_ref().to_vec(),
                CONTRACTS_CODE_ROOT,
                (salt, root),
            )
            .unwrap();

        assert_eq!(
            Storage::<ContractId, (Salt, Bytes32)>::get(&database, &contract_id)
                .unwrap()
                .unwrap()
                .into_owned(),
            (salt, root)
        );
    }

    #[test]
    fn put() {
        let rng = &mut StdRng::seed_from_u64(2322u64);
        let contract_id: ContractId = ContractId::from([1u8; 32]);
        let contract: Contract = Contract::from(vec![32u8]);
        let root = contract.root();
        let salt: Salt = rng.gen();

        let mut database = Database::default();
        Storage::<ContractId, (Salt, Bytes32)>::insert(&mut database, &contract_id, &(salt, root))
            .unwrap();

        let returned: (Salt, Bytes32) = database
            .get(contract_id.as_ref(), CONTRACTS_CODE_ROOT)
            .unwrap()
            .unwrap();
        assert_eq!(returned, (salt, root));
    }

    #[test]
    fn remove() {
        let rng = &mut StdRng::seed_from_u64(2322u64);
        let contract_id: ContractId = ContractId::from([1u8; 32]);
        let contract: Contract = Contract::from(vec![32u8]);
        let root = contract.root();
        let salt: Salt = rng.gen();

        let mut database = Database::default();
        database
            .insert(
                contract_id.as_ref().to_vec(),
                CONTRACTS_CODE_ROOT,
                (salt, root),
            )
            .unwrap();

        Storage::<ContractId, (Salt, Bytes32)>::remove(&mut database, &contract_id).unwrap();

        assert!(!database
            .exists(contract_id.as_ref(), CONTRACTS_CODE_ROOT)
            .unwrap());
    }

    #[test]
    fn exists() {
        let rng = &mut StdRng::seed_from_u64(2322u64);
        let contract_id: ContractId = ContractId::from([1u8; 32]);
        let contract: Contract = Contract::from(vec![32u8]);
        let root = contract.root();
        let salt: Salt = rng.gen();

        let database = Database::default();
        database
            .insert(
                contract_id.as_ref().to_vec(),
                CONTRACTS_CODE_ROOT,
                (salt, root),
            )
            .unwrap();

        assert!(
            Storage::<ContractId, (Salt, Bytes32)>::contains_key(&database, &contract_id).unwrap()
        );
    }
}