Skip to main content

muta_protocol/fixed_codec/
receipt.rs

1use crate::fixed_codec::{FixedCodec, FixedCodecError};
2use crate::types::receipt::{Event, Receipt, ReceiptResponse};
3use crate::{impl_default_fixed_codec_for, ProtocolResult};
4
5// Impl FixedCodec trait for types
6impl_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}