drive/cache/
system_contracts.rs1use crate::error::Error;
2use arc_swap::{ArcSwap, Guard};
3use dpp::data_contract::DataContract;
4use dpp::prelude::Identifier;
5use dpp::system_data_contracts::{load_system_data_contract, SystemDataContract};
6use platform_version::version::{PlatformVersion, ProtocolVersion};
7use std::sync::Arc;
8
9pub struct ActiveSystemDataContract {
15 pub contract: ArcSwap<DataContract>,
17
18 #[allow(unused)]
20 pub active_since_protocol_version: ProtocolVersion,
21}
22
23impl ActiveSystemDataContract {
24 pub fn store(&self, contract: DataContract) {
30 self.contract.store(Arc::new(contract));
31 }
32
33 pub fn load(&self) -> Guard<Arc<DataContract>> {
38 self.contract.load()
39 }
40
41 pub fn new(contract: DataContract, active_since_protocol_version: ProtocolVersion) -> Self {
48 ActiveSystemDataContract {
49 contract: ArcSwap::from_pointee(contract),
50 active_since_protocol_version,
51 }
52 }
53}
54
55pub struct SystemDataContracts {
57 withdrawals: ActiveSystemDataContract,
59 dpns: ActiveSystemDataContract,
61 dashpay: ActiveSystemDataContract,
63 masternode_reward_shares: ActiveSystemDataContract,
65 token_history: ActiveSystemDataContract,
67 keyword_search: ActiveSystemDataContract,
69}
70
71impl SystemDataContracts {
72 pub fn reload_system_contracts(&self, platform_version: &PlatformVersion) -> Result<(), Error> {
81 use SystemDataContract::*;
82
83 let withdrawals = load_system_data_contract(Withdrawals, platform_version)?;
85 let dpns = load_system_data_contract(DPNS, platform_version)?;
86 let dashpay = load_system_data_contract(Dashpay, platform_version)?;
87 let masternode_reward_shares =
88 load_system_data_contract(MasternodeRewards, platform_version)?;
89 let token_history = load_system_data_contract(TokenHistory, platform_version)?;
90 let keyword_search = load_system_data_contract(KeywordSearch, platform_version)?;
91
92 self.withdrawals.store(withdrawals);
94 self.dpns.store(dpns);
95 self.dashpay.store(dashpay);
96 self.masternode_reward_shares
97 .store(masternode_reward_shares);
98 self.token_history.store(token_history);
99 self.keyword_search.store(keyword_search);
100
101 Ok(())
102 }
103
104 pub fn load_genesis_system_contracts() -> Result<Self, Error> {
106 Ok(Self {
108 withdrawals: ActiveSystemDataContract::new(
109 load_system_data_contract(
110 SystemDataContract::Withdrawals,
111 PlatformVersion::first(),
112 )?,
113 1,
114 ),
115 dpns: ActiveSystemDataContract::new(
116 load_system_data_contract(SystemDataContract::DPNS, PlatformVersion::first())?,
117 1,
118 ),
119 dashpay: ActiveSystemDataContract::new(
120 load_system_data_contract(SystemDataContract::Dashpay, PlatformVersion::first())?,
121 1,
122 ),
123 masternode_reward_shares: ActiveSystemDataContract::new(
124 load_system_data_contract(
125 SystemDataContract::MasternodeRewards,
126 PlatformVersion::first(),
127 )?,
128 1,
129 ),
130 token_history: ActiveSystemDataContract::new(
131 load_system_data_contract(
132 SystemDataContract::TokenHistory,
133 PlatformVersion::first(),
134 )?,
135 9,
136 ),
137 keyword_search: ActiveSystemDataContract::new(
138 load_system_data_contract(
139 SystemDataContract::KeywordSearch,
140 PlatformVersion::first(),
141 )?,
142 9,
143 ),
144 })
145 }
146
147 pub fn load_withdrawals(&self) -> Guard<Arc<DataContract>> {
149 self.withdrawals.load()
150 }
151
152 pub fn load_token_history(&self) -> Guard<Arc<DataContract>> {
154 self.token_history.load()
155 }
156
157 pub fn load_dpns(&self) -> Guard<Arc<DataContract>> {
159 self.dpns.load()
160 }
161
162 pub fn load_dashpay(&self) -> Guard<Arc<DataContract>> {
164 self.dashpay.load()
165 }
166
167 pub fn load_masternode_reward_shares(&self) -> Guard<Arc<DataContract>> {
169 self.masternode_reward_shares.load()
170 }
171
172 pub fn load_keyword_search(&self) -> Guard<Arc<DataContract>> {
174 self.keyword_search.load()
175 }
176
177 pub fn find_by_id(&self, id: Identifier) -> Option<Arc<DataContract>> {
182 let active = if id == SystemDataContract::Withdrawals.id() {
185 &self.withdrawals
186 } else if id == SystemDataContract::MasternodeRewards.id() {
187 &self.masternode_reward_shares
188 } else if id == SystemDataContract::DPNS.id() {
189 &self.dpns
190 } else if id == SystemDataContract::Dashpay.id() {
191 &self.dashpay
192 } else if id == SystemDataContract::TokenHistory.id() {
193 &self.token_history
194 } else if id == SystemDataContract::KeywordSearch.id() {
195 &self.keyword_search
196 } else {
197 return None;
198 };
199 Some(Arc::clone(&active.load()))
200 }
201}