massa_final_state/
mapping_grpc.rs

1// Copyright (c) 2023 MASSA LABS <info@massa.net>
2
3use crate::StateChanges;
4use massa_models::{
5    async_msg_id::AsyncMessageId,
6    types::{SetOrKeep, SetUpdateOrDelete},
7};
8use massa_proto_rs::massa::model::v1 as grpc_model;
9
10impl From<StateChanges> for grpc_model::StateChanges {
11    fn from(value: StateChanges) -> Self {
12        grpc_model::StateChanges {
13            executed_ops_changes: value
14                .executed_ops_changes
15                .into_iter()
16                .map(|(op_id, (op_exec_status, op_valid_until_slot))| {
17                    grpc_model::ExecutedOpsChangeEntry {
18                        operation_id: op_id.to_string(),
19                        value: Some(grpc_model::ExecutedOpsChangeValue {
20                            status: if op_exec_status {
21                                //TODO to be enhanced
22                                grpc_model::OperationExecutionStatus::Success as i32
23                            } else {
24                                grpc_model::OperationExecutionStatus::Failed as i32
25                            },
26                            slot: Some(op_valid_until_slot.into()),
27                        }),
28                    }
29                })
30                .collect(),
31            async_pool_changes: value
32                .async_pool_changes
33                .0
34                .into_iter()
35                .map(|(async_msg_id, change)| match change {
36                    SetUpdateOrDelete::Set(async_msg) => grpc_model::AsyncPoolChangeEntry {
37                        async_message_id: async_msg_id_to_string(async_msg_id),
38                        value: Some(grpc_model::AsyncPoolChangeValue {
39                            r#type: grpc_model::AsyncPoolChangeType::Set as i32,
40                            message: Some(
41                                grpc_model::async_pool_change_value::Message::CreatedMessage(
42                                    async_msg.into(),
43                                ),
44                            ),
45                        }),
46                    },
47                    SetUpdateOrDelete::Update(async_msg_update) => {
48                        grpc_model::AsyncPoolChangeEntry {
49                            async_message_id: async_msg_id_to_string(async_msg_id),
50                            value: Some(grpc_model::AsyncPoolChangeValue {
51                                r#type: grpc_model::AsyncPoolChangeType::Update as i32,
52                                message: Some(
53                                    grpc_model::async_pool_change_value::Message::UpdatedMessage(
54                                        async_msg_update.into(),
55                                    ),
56                                ),
57                            }),
58                        }
59                    }
60                    SetUpdateOrDelete::Delete => grpc_model::AsyncPoolChangeEntry {
61                        async_message_id: async_msg_id_to_string(async_msg_id),
62                        value: Some(grpc_model::AsyncPoolChangeValue {
63                            r#type: grpc_model::AsyncPoolChangeType::Delete as i32,
64                            message: None,
65                        }),
66                    },
67                })
68                .collect(),
69            ledger_changes: value
70                .ledger_changes
71                .0
72                .into_iter()
73                .map(|(key, value)| grpc_model::LedgerChangeEntry {
74                    address: key.to_string(),
75                    value: Some(match value {
76                        SetUpdateOrDelete::Set(value) => grpc_model::LedgerChangeValue {
77                            r#type: grpc_model::LedgerChangeType::Set as i32,
78                            entry: Some(grpc_model::ledger_change_value::Entry::CreatedEntry(
79                                value.into(),
80                            )),
81                        },
82                        SetUpdateOrDelete::Update(value) => grpc_model::LedgerChangeValue {
83                            r#type: grpc_model::LedgerChangeType::Update as i32,
84                            entry: Some(grpc_model::ledger_change_value::Entry::UpdatedEntry(
85                                value.into(),
86                            )),
87                        },
88                        SetUpdateOrDelete::Delete => grpc_model::LedgerChangeValue {
89                            r#type: grpc_model::LedgerChangeType::Delete as i32,
90                            entry: None,
91                        },
92                    }),
93                })
94                .collect(),
95            executed_denunciations_changes: value
96                .executed_denunciations_changes
97                .into_iter()
98                .map(|de_idx| de_idx.into())
99                .collect(),
100            execution_trail_hash_change: match value.execution_trail_hash_change {
101                SetOrKeep::Set(value) => Some(grpc_model::SetOrKeepString {
102                    change: Some(grpc_model::set_or_keep_string::Change::Set(
103                        value.to_string(),
104                    )),
105                }),
106                SetOrKeep::Keep => Some(grpc_model::SetOrKeepString {
107                    change: Some(grpc_model::set_or_keep_string::Change::Keep(
108                        grpc_model::Empty {},
109                    )),
110                }),
111            },
112        }
113    }
114}
115
116fn async_msg_id_to_string(id: AsyncMessageId) -> String {
117    bs58::encode(format!("{}{}{}{}", id.0 .0.numer(), id.0 .0.denom(), id.1, id.2).as_bytes())
118        .with_check()
119        .into_string()
120}