Fix the logic for finding the ABI in resolc

This commit is contained in:
Omar Abdulla
2025-08-25 19:55:57 +03:00
parent 59f439b5f8
commit f94faa2de2
+35 -17
View File
@@ -181,23 +181,41 @@ impl SolidityCompiler for Resolc {
.evm .evm
.and_then(|evm| evm.bytecode.clone()) .and_then(|evm| evm.bytecode.clone())
.context("Unexpected - Contract compiled with resolc has no bytecode")?; .context("Unexpected - Contract compiled with resolc has no bytecode")?;
let abi = contract_information let abi = {
.metadata let metadata = contract_information
.as_ref() .metadata
.and_then(|metadata| metadata.as_object()) .as_ref()
.and_then(|metadata| metadata.get("solc_metadata")) .context("No metadata found for the contract")?;
.and_then(|solc_metadata| solc_metadata.as_str()) let solc_metadata_str = match metadata {
.and_then(|metadata| serde_json::from_str::<serde_json::Value>(metadata).ok()) serde_json::Value::String(solc_metadata_str) => solc_metadata_str.as_str(),
.and_then(|metadata| { serde_json::Value::Object(metadata_object) => {
metadata.get("output").and_then(|output| { let solc_metadata_value = metadata_object
output .get("solc_metadata")
.get("abi") .context("Contract doesn't have a 'solc_metadata' field")?;
.and_then(|abi| serde_json::from_value::<JsonAbi>(abi.clone()).ok()) solc_metadata_value
}) .as_str()
}) .context("The 'solc_metadata' field is not a string")?
.context( }
"Unexpected - Failed to get the ABI for a contract compiled with resolc", serde_json::Value::Null
)?; | serde_json::Value::Bool(_)
| serde_json::Value::Number(_)
| serde_json::Value::Array(_) => {
anyhow::bail!("Unsupported type of metadata {metadata:?}")
}
};
let solc_metadata =
serde_json::from_str::<serde_json::Value>(solc_metadata_str).context(
"Failed to deserialize the solc_metadata as a serde_json generic value",
)?;
let output_value = solc_metadata
.get("output")
.context("solc_metadata doesn't have an output field")?;
let abi_value = output_value
.get("abi")
.context("solc_metadata output doesn't contain an abi field")?;
serde_json::from_value::<JsonAbi>(abi_value.clone())
.context("ABI found in solc_metadata output is not valid ABI")?
};
map.insert(contract_name, (bytecode.object, abi)); map.insert(contract_name, (bytecode.object, abi));
} }
} }