jade_testing/
account.rs

1//! Service account builder
2
3use crate::{Jam, key};
4use service::{OpaqueHash, ServiceId, service::ServiceAccount};
5
6impl Jam {
7    /// Add a service account
8    pub fn add_account(&mut self, service: ServiceId, mut account: ServiceAccount) {
9        account.index = service;
10        self.chain.accounts.insert(service, account);
11    }
12
13    /// Add a service account
14    pub fn add_service(&mut self, service: ServiceId, code: Vec<u8>) {
15        let hash = self.add_preimage(service, code);
16        self.set_code(service, hash);
17        self.mint(service, 1_000_000_000);
18    }
19
20    /// Add a preimage to the service account
21    pub fn add_preimage(&mut self, service: ServiceId, preimage: Vec<u8>) -> OpaqueHash {
22        let account = self.chain.accounts.entry(service).or_default();
23        let hash = service::blake2b(preimage.as_slice());
24        let len = preimage.len() as u32;
25        account.index = service;
26        account.preimage.insert(hash, preimage);
27        account
28            .lookup
29            .insert((hash, len), vec![self.chain.best.slot]);
30        hash
31    }
32
33    /// Get a storage of an account
34    pub fn get_storage<V: serde::de::DeserializeOwned>(
35        &self,
36        service: ServiceId,
37        key: &[u8],
38    ) -> Option<V> {
39        let account = self.chain.accounts.get(&service)?;
40        let vkey = key.to_vec();
41        let key = key::storage(service, &codec::encode(&vkey).ok()?);
42        let encoded = account.storage.get(key.as_ref())?;
43        codec::decode(&encoded[..]).ok()
44    }
45
46    /// Set the code of the service account
47    pub fn set_code(&mut self, service: ServiceId, code: OpaqueHash) {
48        let account = self.chain.accounts.entry(service).or_default();
49        account.info.code = code;
50    }
51
52    /// Mint balance to a service account
53    pub fn mint(&mut self, service: ServiceId, amount: u64) {
54        let account = self.chain.accounts.entry(service).or_default();
55        account.info.balance += amount;
56    }
57
58    /// Add a service account
59    pub fn with_account(mut self, service: ServiceId, account: ServiceAccount) -> Self {
60        self.chain.accounts.insert(service, account);
61        self
62    }
63}