muta_protocol/fixed_codec/
receipt.rs1use crate::fixed_codec::{FixedCodec, FixedCodecError};
2use crate::types::receipt::{Event, Receipt, ReceiptResponse};
3use crate::{impl_default_fixed_codec_for, ProtocolResult};
4
5impl_default_fixed_codec_for!(receipt, [Receipt, ReceiptResponse]);
7
8impl rlp::Encodable for Receipt {
9 fn rlp_append(&self, s: &mut rlp::RlpStream) {
10 s.begin_list(6);
11 s.append(&self.cycles_used);
12 s.append(&self.epoch_id);
13 s.begin_list(self.events.len());
14 for e in &self.events {
15 s.append(e);
16 }
17 s.append(&self.response);
18 s.append(&self.state_root);
19 s.append(&self.tx_hash);
20 }
21}
22
23impl rlp::Decodable for Receipt {
24 fn decode(r: &rlp::Rlp) -> Result<Self, rlp::DecoderError> {
25 if !r.is_list() && r.size() != 6 {
26 return Err(rlp::DecoderError::RlpIncorrectListLen);
27 }
28
29 let cycles_used: u64 = r.at(0)?.as_val()?;
30 let epoch_id = r.at(1)?.as_val()?;
31 let events: Vec<Event> = r.at(2)?.as_list()?;
32 let response: ReceiptResponse = rlp::decode(r.at(3)?.as_raw())?;
33 let state_root = rlp::decode(r.at(4)?.as_raw())?;
34 let tx_hash = rlp::decode(r.at(5)?.as_raw())?;
35
36 Ok(Receipt {
37 state_root,
38 epoch_id,
39 events,
40 tx_hash,
41 cycles_used,
42 response,
43 })
44 }
45}
46
47impl rlp::Encodable for ReceiptResponse {
48 fn rlp_append(&self, s: &mut rlp::RlpStream) {
49 s.begin_list(5)
50 .append(&self.is_error)
51 .append(&self.method)
52 .append(&self.ret)
53 .append(&self.service_name);
54 }
55}
56
57impl rlp::Decodable for ReceiptResponse {
58 fn decode(r: &rlp::Rlp) -> Result<Self, rlp::DecoderError> {
59 if !r.is_list() && r.size() != 4 {
60 return Err(rlp::DecoderError::RlpIncorrectListLen);
61 }
62
63 let is_error = r.at(0)?.as_val()?;
64 let method = r.at(1)?.as_val()?;
65 let ret = r.at(2)?.as_val()?;
66 let service_name = r.at(3)?.as_val()?;
67
68 Ok(ReceiptResponse {
69 is_error,
70 method,
71 ret,
72 service_name,
73 })
74 }
75}
76
77impl rlp::Decodable for Event {
78 fn decode(r: &rlp::Rlp) -> Result<Self, rlp::DecoderError> {
79 if !r.is_list() && r.size() != 2 {
80 return Err(rlp::DecoderError::RlpIncorrectListLen);
81 }
82
83 let service = r.at(0)?.as_val()?;
84 let data = r.at(1)?.as_val()?;
85
86 Ok(Event { service, data })
87 }
88}
89
90impl rlp::Encodable for Event {
91 fn rlp_append(&self, s: &mut rlp::RlpStream) {
92 s.begin_list(2).append(&self.service).append(&self.data);
93 }
94}