Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Copyright 2018-2020 Parity Technologies (UK) Ltd.
// This file is part of cargo-contract.
//
// cargo-contract is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// cargo-contract is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with cargo-contract. If not, see <http://www.gnu.org/licenses/>.
use super::{
runtime_api::api::contracts::events::ContractEmitted,
transcode::{env_types, ContractMessageTranscoder, TranscoderBuilder},
};
use crate::{maybe_println, Verbosity, DEFAULT_KEY_COL_WIDTH};
use colored::Colorize as _;
use anyhow::Result;
use scale::Input;
use subxt::{self, DefaultConfig, Event, TransactionEvents};
pub fn display_events(
result: &TransactionEvents<DefaultConfig>,
transcoder: &ContractMessageTranscoder,
subxt_metadata: &subxt::Metadata,
verbosity: &Verbosity,
) -> Result<()> {
if matches!(verbosity, Verbosity::Quiet) {
return Ok(());
}
if matches!(verbosity, Verbosity::Verbose) {
println!("VERBOSE")
}
let runtime_metadata = subxt_metadata.runtime_metadata();
let events_transcoder = TranscoderBuilder::new(&runtime_metadata.types)
.register_custom_type::<sp_runtime::AccountId32, _>(env_types::AccountId)
.done();
const EVENT_FIELD_INDENT: usize = DEFAULT_KEY_COL_WIDTH - 3;
for event in result.as_slice() {
log::debug!("displaying event {}::{}", event.pallet, event.variant);
let event_metadata = subxt_metadata.event(event.pallet_index, event.variant_index)?;
let event_fields = event_metadata.variant().fields();
println!(
"{:>width$} {} ➜ {}",
"Event".bright_green().bold(),
event.pallet.bright_white(),
event.variant.bright_white().bold(),
width = DEFAULT_KEY_COL_WIDTH
);
let event_data = &mut &event.data[..];
let mut unnamed_field_name = 0;
for field in event_fields {
if <ContractEmitted as Event>::is_event(&event.pallet, &event.variant)
&& field.name() == Some(&"data".to_string())
{
// data is a byte vec so the first byte is the length.
let _data_len = event_data.read_byte()?;
let contract_event = transcoder.decode_contract_event(event_data)?;
maybe_println!(
verbosity,
"{:width$}{}",
"",
format!("{}: {}", "data".bright_white(), contract_event),
width = EVENT_FIELD_INDENT
);
} else {
let field_name = field.name().cloned().unwrap_or_else(|| {
let name = unnamed_field_name.to_string();
unnamed_field_name += 1;
name
});
let decoded_field = events_transcoder.decode(field.ty().id(), event_data)?;
maybe_println!(
verbosity,
"{:width$}{}",
"",
format!("{}: {}", field_name.bright_white(), decoded_field),
width = EVENT_FIELD_INDENT
);
}
}
}
println!();
Ok(())
}