spacejam_service/service/
account.rs1use crate::{BTreeMap, Gas, OpaqueHash, TimeSlot, Vec, service::GasLimit};
4use anyhow::Result;
5use serde::{Deserialize, Serialize};
6
7#[cfg(feature = "json")]
8use {crate::String, spacejson::Json};
9
10#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone, Default)]
12#[cfg_attr(feature = "json", derive(Json))]
13pub struct ServiceAccount {
14 pub index: u32,
16
17 pub storage: BTreeMap<Vec<u8>, Vec<u8>>,
19
20 pub preimage: BTreeMap<OpaqueHash, Vec<u8>>,
22
23 pub lookup: BTreeMap<(OpaqueHash, u32), Vec<TimeSlot>>,
25
26 #[cfg_attr(feature = "json", json(nested))]
28 pub info: ServiceInfo,
29}
30
31impl ServiceAccount {
32 pub fn new(gas: GasLimit) -> Self {
34 Self {
35 index: 0,
36 storage: BTreeMap::new(),
37 preimage: BTreeMap::new(),
38 lookup: BTreeMap::new(),
39 info: ServiceInfo {
40 transfer: gas.transfer,
41 accumulate: gas.accumulate,
42 ..Default::default()
43 },
44 }
45 }
46
47 pub fn state(&self) -> ServiceInfo {
49 self.info.clone()
50 }
51}
52
53#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone, Default)]
55#[cfg_attr(feature = "json", derive(Json))]
56pub struct ServiceInfo {
57 pub version: u8,
59
60 #[cfg_attr(feature = "json", json(hex))]
62 #[serde(alias = "code_hash")]
63 pub code: OpaqueHash,
64
65 pub balance: u64,
67
68 #[serde(alias = "min_memo_gas")]
71 pub accumulate: Gas,
72
73 #[serde(alias = "min_item_gas")]
75 pub transfer: Gas,
76
77 #[serde(alias = "bytes")]
79 pub total: u64,
80
81 #[serde(alias = "deposit_offset")]
83 pub offset: u64,
84
85 pub items: u32,
87
88 #[serde(alias = "creation_slot")]
90 pub creation: u32,
91
92 #[serde(alias = "last_accumulation_slot")]
94 pub update: u32,
95
96 #[serde(alias = "parent_service")]
98 pub parent: u32,
99}
100
101impl ServiceInfo {
102 pub fn host(&self) -> Result<Vec<u8>> {
107 codec::encode(&(
108 self.code,
109 self.balance,
110 self.threshold(),
111 self.accumulate,
112 self.transfer,
113 self.total,
114 self.items,
115 self.offset,
116 self.creation,
117 self.update,
118 self.parent,
119 ))
120 .map_err(Into::into)
121 }
122
123 pub fn threshold(&self) -> u64 {
125 (crate::BALANCE_PER_SERVICE
126 + crate::BALANCE_PER_ITEM * self.items as u64
127 + crate::BALANCE_PER_OCTET * self.total)
128 .saturating_sub(self.offset)
129 }
130}