1use crate::{Jam, key};
4use service::{OpaqueHash, ServiceId, service::ServiceAccount};
5
6impl Jam {
7 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 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 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 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 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 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 pub fn with_account(mut self, service: ServiceId, account: ServiceAccount) -> Self {
60 self.chain.accounts.insert(service, account);
61 self
62 }
63}