1use crate::{
11 AccountId, Address, Blob, BlobAddress, DebitAgreementProof, Error, PublicKey, ReplicaEvent,
12 Result, Signature, SignedTransfer, TransferId, TransferValidated, XorName,
13};
14use serde::{Deserialize, Serialize};
15use std::collections::BTreeSet;
16
17#[allow(clippy::large_enum_variant)]
21#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
22pub enum NodeCmd {
23 System(NodeSystemCmd),
25 Data(NodeDataCmd),
27 Transfers(NodeTransferCmd),
29}
30
31#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
33pub enum NodeSystemCmd {
34 RegisterWallet {
36 wallet: PublicKey,
38 section: XorName,
40 },
41}
42
43#[allow(clippy::large_enum_variant)]
45#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
46pub enum NodeTransferCmd {
47 PropagateTransfer(DebitAgreementProof),
49 ValidateSectionPayout(SignedTransfer),
51 RegisterSectionPayout(DebitAgreementProof),
53}
54
55#[allow(clippy::large_enum_variant)]
57#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
58pub enum NodeDataCmd {
59 DuplicateChunk {
61 new_holder: XorName,
63 address: BlobAddress,
65 fetch_from_holders: BTreeSet<XorName>,
67 },
68}
69
70#[allow(clippy::large_enum_variant)]
74#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
75pub enum NodeEvent {
76 DuplicationComplete {
78 chunk: BlobAddress,
80 proof: Signature,
85 },
86 SectionPayoutValidated(TransferValidated),
88}
89
90#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
92pub enum NodeQuery {
93 Data(NodeDataQuery),
95 Rewards(NodeRewardQuery),
97 Transfers(NodeTransferQuery),
99}
100
101#[allow(clippy::large_enum_variant)]
103#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
104pub enum NodeRewardQuery {
105 GetAccountId {
108 old_node_id: XorName,
111 new_node_id: XorName,
114 },
115}
116
117#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
119pub enum NodeTransferQuery {
120 GetReplicaEvents(PublicKey),
124}
125
126#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
128pub enum NodeDataQuery {
129 GetChunk {
131 holder: XorName,
133 address: BlobAddress,
135 },
136 GetChunks {
138 holder: XorName,
140 addresses: BTreeSet<BlobAddress>,
142 },
143}
144
145#[allow(clippy::large_enum_variant)]
147#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
148pub enum NodeQueryResponse {
149 Data(NodeDataQueryResponse),
151 Rewards(NodeRewardQueryResponse),
153 Transfers(NodeTransferQueryResponse),
155}
156
157#[allow(clippy::large_enum_variant)]
159#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
160pub enum NodeRewardQueryResponse {
161 GetAccountId(Result<(PublicKey, XorName)>),
165}
166
167#[allow(clippy::large_enum_variant)]
169#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
170pub enum NodeTransferQueryResponse {
171 GetReplicaEvents(Result<Vec<ReplicaEvent>>),
175}
176
177#[allow(clippy::large_enum_variant)]
179#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
180pub enum NodeDataQueryResponse {
181 GetChunk(Result<Blob>),
183 GetChunks(Result<Vec<Blob>>),
185}
186
187#[allow(clippy::large_enum_variant)]
189#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
190pub enum NodeCmdError {
191 Data(NodeDataError),
193 Rewards(NodeRewardError),
195 Transfers(NodeTransferError),
197}
198
199#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
201pub enum NodeDataError {
202 ChunkDuplication {
204 address: BlobAddress,
206 error: Error,
208 },
209}
210
211#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
213pub enum NodeTransferError {
214 TransferPropagation(Error),
216}
217
218#[derive(Debug, Hash, Eq, PartialEq, Clone, Serialize, Deserialize)]
220pub enum NodeRewardError {
221 RewardClaiming {
223 account_id: AccountId,
225 error: Error,
227 },
228 RewardPayoutInitiation {
230 id: TransferId,
232 account: AccountId,
234 error: Error,
236 },
237 RewardPayoutFinalisation {
239 id: TransferId,
241 account: AccountId,
243 error: Error,
245 },
246}
247
248impl NodeCmd {
249 pub fn dst_address(&self) -> Address {
251 use Address::*;
252 use NodeCmd::*;
253 use NodeDataCmd::*;
254 use NodeTransferCmd::*;
255 match self {
256 System(NodeSystemCmd::RegisterWallet { section, .. }) => Section(*section),
257 Data(DuplicateChunk { new_holder, .. }) => Node(*new_holder),
258 Transfers(cmd) => match cmd {
259 ValidateSectionPayout(signed_transfer) => Section(signed_transfer.from().into()),
260 RegisterSectionPayout(debit_agreement) => Section(debit_agreement.from().into()),
261 PropagateTransfer(debit_agreement) => Section(debit_agreement.to().into()),
262 },
263 }
264 }
265}
266
267impl NodeEvent {
268 pub fn dst_address(&self) -> Address {
270 use Address::*;
271 use NodeEvent::*;
272 match self {
273 DuplicationComplete { chunk, .. } => Section(*chunk.name()),
274 SectionPayoutValidated(event) => Section(event.from().into()),
275 }
276 }
277}
278
279impl NodeQuery {
280 pub fn dst_address(&self) -> Address {
282 use Address::*;
283 use NodeDataQuery::*;
284 use NodeQuery::*;
285 use NodeRewardQuery::*;
286 use NodeTransferQuery::*;
287 match self {
288 Data(data_query) => match data_query {
289 GetChunk { holder, .. } | GetChunks { holder, .. } => Node(*holder),
290 },
291 Transfers(transfer_query) => match transfer_query {
292 GetReplicaEvents(section_key) => Section((*section_key).into()),
293 },
294 Rewards(GetAccountId { old_node_id, .. }) => Section(*old_node_id),
295 }
296 }
297}