Updated logic to compile contracts with .abi.sol extensions and find the matching .yul contract to inject the abi into the yul artifact.
This commit is contained in:
parent
99d0dfd785
commit
01cbbb48b6
|
@ -1,7 +1,9 @@
|
||||||
//! Output artifact handling
|
//! Output artifact handling
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
artifacts::{CompactContract, CompactContractBytecode, Contract, FileToContractsMap},
|
artifacts::{
|
||||||
|
CompactContract, CompactContractBytecode, Contract, FileToContractsMap, LosslessAbi,
|
||||||
|
},
|
||||||
contracts::VersionedContracts,
|
contracts::VersionedContracts,
|
||||||
error::Result,
|
error::Result,
|
||||||
utils, HardhatArtifact, ProjectPathsConfig, SolcError,
|
utils, HardhatArtifact, ProjectPathsConfig, SolcError,
|
||||||
|
@ -9,11 +11,14 @@ use crate::{
|
||||||
use ethers_core::{abi::Abi, types::Bytes};
|
use ethers_core::{abi::Abi, types::Bytes};
|
||||||
use semver::Version;
|
use semver::Version;
|
||||||
use serde::{de::DeserializeOwned, Serialize};
|
use serde::{de::DeserializeOwned, Serialize};
|
||||||
|
use serde_json::map::OccupiedEntry;
|
||||||
|
use std::collections::hash_map::Entry;
|
||||||
use std::{
|
use std::{
|
||||||
collections::btree_map::BTreeMap,
|
collections::btree_map::BTreeMap,
|
||||||
fmt, fs, io,
|
fmt, fs, io,
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
};
|
};
|
||||||
|
use std::{collections::HashMap, ffi::OsStr};
|
||||||
|
|
||||||
mod configurable;
|
mod configurable;
|
||||||
pub use configurable::*;
|
pub use configurable::*;
|
||||||
|
@ -503,6 +508,14 @@ pub trait ArtifactOutput {
|
||||||
/// **Note:** This does only convert, but _NOT_ write the artifacts to disk, See
|
/// **Note:** This does only convert, but _NOT_ write the artifacts to disk, See
|
||||||
/// [`Self::on_output()`]
|
/// [`Self::on_output()`]
|
||||||
fn output_to_artifacts(&self, contracts: &VersionedContracts) -> Artifacts<Self::Artifact> {
|
fn output_to_artifacts(&self, contracts: &VersionedContracts) -> Artifacts<Self::Artifact> {
|
||||||
|
//Hash map to store the yul abi targets. Each value in the hashmap is a (String, String, &LosslessAbi)
|
||||||
|
//Each key in the hashmap is the file path of the target yul artifact to inject the abi into
|
||||||
|
//The first value in the tuple is the name of the contract in the artifact
|
||||||
|
//the second value is the abi that will be injected into the yul artifact
|
||||||
|
//the third value is the abi.sol file path to be removed from artifacts
|
||||||
|
|
||||||
|
let mut yul_abi_targets: HashMap<String, (String, &LosslessAbi, String)> = HashMap::new();
|
||||||
|
|
||||||
let mut artifacts = ArtifactsMap::new();
|
let mut artifacts = ArtifactsMap::new();
|
||||||
for (file, contracts) in contracts.as_ref().iter() {
|
for (file, contracts) in contracts.as_ref().iter() {
|
||||||
let mut entries = BTreeMap::new();
|
let mut entries = BTreeMap::new();
|
||||||
|
@ -517,21 +530,69 @@ pub trait ArtifactOutput {
|
||||||
};
|
};
|
||||||
let artifact = self.contract_to_artifact(file, name, contract.contract.clone());
|
let artifact = self.contract_to_artifact(file, name, contract.contract.clone());
|
||||||
|
|
||||||
|
//if the artifact path has a yul abi extension, then add the target yul contract file path
|
||||||
|
//and abi to yul_abi_targets
|
||||||
|
if is_yul_abi(artifact_path.clone()) {
|
||||||
|
//Add the target file path
|
||||||
|
let target_file = file.as_str().replace(".abi.sol", ".yul");
|
||||||
|
let artifact_name = name.as_str();
|
||||||
|
|
||||||
|
yul_abi_targets.insert(
|
||||||
|
target_file,
|
||||||
|
(
|
||||||
|
artifact_name.to_string(),
|
||||||
|
contract.contract.abi.as_ref().unwrap(),
|
||||||
|
file.to_string(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
//Debug--------------------------------------
|
||||||
|
|
||||||
contracts.push(ArtifactFile {
|
contracts.push(ArtifactFile {
|
||||||
artifact,
|
artifact,
|
||||||
file: artifact_path,
|
file: artifact_path,
|
||||||
version: contract.version.clone(),
|
version: contract.version.clone(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
entries.insert(name.to_string(), contracts);
|
entries.insert(name.to_string(), contracts);
|
||||||
}
|
}
|
||||||
artifacts.insert(file.to_string(), entries);
|
artifacts.insert(file.to_string(), entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//inject yul abis into target .yul artifacts
|
||||||
|
for (yul_target_path, artifact_tuple) in yul_abi_targets {
|
||||||
|
//find the target yul entry with the target file path
|
||||||
|
let mut _entries = artifacts.entry(yul_target_path).or_insert(BTreeMap::new());
|
||||||
|
|
||||||
|
let artifact_file = &_entries.get(&artifact_tuple.0).unwrap()[0];
|
||||||
|
|
||||||
|
//TODO: Update logic to get the ConfigurableContractArtifact and inject the abi
|
||||||
|
println!("{:?}", artifact_file.artifact);
|
||||||
|
println!("\n");
|
||||||
|
}
|
||||||
|
|
||||||
Artifacts(artifacts)
|
Artifacts(artifacts)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//check if .abi.sol in the file extension
|
||||||
|
fn is_yul_abi(artifact_path: PathBuf) -> bool {
|
||||||
|
//get the file name from the artifact
|
||||||
|
let artifact_file_name = artifact_path.into_os_string().into_string().unwrap();
|
||||||
|
|
||||||
|
//parse the file extension
|
||||||
|
let parsed_file_ext: Vec<&str> = artifact_file_name.split(".").collect::<Vec<&str>>();
|
||||||
|
|
||||||
|
//if the file extension contains .abi.sol
|
||||||
|
if parsed_file_ext[1] == "abi" {
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// An `Artifact` implementation that uses a compact representation
|
/// An `Artifact` implementation that uses a compact representation
|
||||||
///
|
///
|
||||||
/// Creates a single json artifact with
|
/// Creates a single json artifact with
|
||||||
|
|
Loading…
Reference in New Issue