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 #[cfg_attr(feature = "json", json(hex))]
59 #[serde(alias = "code_hash")]
60 pub code: OpaqueHash,
61
62 pub balance: u64,
64
65 #[serde(alias = "min_memo_gas")]
68 pub accumulate: Gas,
69
70 #[serde(alias = "min_item_gas")]
72 pub transfer: Gas,
73
74 #[serde(alias = "bytes")]
76 pub total: u64,
77
78 #[serde(alias = "deposit_offset")]
80 pub offset: u64,
81
82 pub items: u32,
84
85 #[serde(alias = "creation_slot")]
87 pub creation: u32,
88
89 #[serde(alias = "last_accumulation_slot")]
91 pub update: u32,
92
93 #[serde(alias = "parent_service")]
95 pub parent: u32,
96}
97
98impl ServiceInfo {
99 pub fn host(&self) -> Result<Vec<u8>> {
104 codec::encode(&(
105 self.code,
106 self.balance,
107 self.threshold(),
108 self.accumulate,
109 self.transfer,
110 self.total,
111 self.items,
112 self.offset,
113 self.creation,
114 self.update,
115 self.parent,
116 ))
117 .map_err(Into::into)
118 }
119
120 pub fn threshold(&self) -> u64 {
122 (crate::BALANCE_PER_SERVICE
123 + crate::BALANCE_PER_ITEM * self.items as u64
124 + crate::BALANCE_PER_OCTET * self.total)
125 .saturating_sub(self.offset)
126 }
127}