revive_solc_json_interface/combined_json/
contract.rs1use std::collections::BTreeMap;
4use std::collections::HashSet;
5
6use serde::Deserialize;
7use serde::Serialize;
8
9#[derive(Debug, Serialize, Deserialize)]
11#[serde(rename_all = "kebab-case")]
12pub struct Contract {
13 #[serde(skip_serializing_if = "Option::is_none")]
15 pub hashes: Option<BTreeMap<String, String>>,
16 #[serde(skip_serializing_if = "Option::is_none")]
18 pub abi: Option<serde_json::Value>,
19 #[serde(skip_serializing_if = "Option::is_none")]
21 pub metadata: Option<String>,
22 #[serde(skip_serializing_if = "Option::is_none")]
24 pub devdoc: Option<serde_json::Value>,
25 #[serde(skip_serializing_if = "Option::is_none")]
27 pub userdoc: Option<serde_json::Value>,
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub storage_layout: Option<serde_json::Value>,
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub ast: Option<serde_json::Value>,
34 #[serde(skip_serializing_if = "Option::is_none")]
36 pub asm: Option<serde_json::Value>,
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub bin: Option<String>,
40 #[serde(skip_serializing_if = "Option::is_none")]
42 pub bin_runtime: Option<String>,
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub factory_deps: Option<BTreeMap<String, String>>,
46 #[serde(skip_serializing_if = "Option::is_none")]
48 pub missing_libraries: Option<HashSet<String>>,
49}
50
51impl Contract {
52 pub fn entry(&self, entry: &str) -> u32 {
56 self.hashes
57 .as_ref()
58 .expect("Always exists")
59 .iter()
60 .find_map(|(contract_entry, hash)| {
61 if contract_entry.starts_with(entry) {
62 Some(
63 u32::from_str_radix(hash.as_str(), revive_common::BASE_HEXADECIMAL)
64 .expect("Test hash is always valid"),
65 )
66 } else {
67 None
68 }
69 })
70 .unwrap_or_else(|| panic!("Entry `{entry}` not found"))
71 }
72}