mirror of
https://github.com/pezkuwichain/revive.git
synced 2026-06-14 06:31:02 +00:00
add compiler helpers to solidity test utils
Signed-off-by: xermicus <cyrill@parity.io>
This commit is contained in:
@@ -1,8 +1,12 @@
|
|||||||
//! Common utility used for in frontend and integration tests.
|
//! Common utility used for in frontend and integration tests.
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use std::collections::BTreeSet;
|
use std::collections::BTreeSet;
|
||||||
|
use std::collections::HashMap;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
use std::sync::Mutex;
|
||||||
|
|
||||||
|
use once_cell::sync::Lazy;
|
||||||
|
|
||||||
use crate::project::Project;
|
use crate::project::Project;
|
||||||
use crate::solc::pipeline::Pipeline as SolcPipeline;
|
use crate::solc::pipeline::Pipeline as SolcPipeline;
|
||||||
@@ -14,6 +18,16 @@ use crate::solc::standard_json::output::Output as SolcStandardJsonOutput;
|
|||||||
use crate::solc::Compiler as SolcCompiler;
|
use crate::solc::Compiler as SolcCompiler;
|
||||||
use crate::warning::Warning;
|
use crate::warning::Warning;
|
||||||
|
|
||||||
|
static PVM_BLOB_CACHE: Lazy<Mutex<HashMap<CachedBlob, Vec<u8>>>> = Lazy::new(Default::default);
|
||||||
|
static EVM_BLOB_CACHE: Lazy<Mutex<HashMap<CachedBlob, Vec<u8>>>> = Lazy::new(Default::default);
|
||||||
|
|
||||||
|
#[derive(Hash, PartialEq, Eq)]
|
||||||
|
struct CachedBlob {
|
||||||
|
contract_name: String,
|
||||||
|
solc_optimizer_enabled: bool,
|
||||||
|
pipeline: SolcPipeline,
|
||||||
|
}
|
||||||
|
|
||||||
/// Checks if the required executables are present in `${PATH}`.
|
/// Checks if the required executables are present in `${PATH}`.
|
||||||
fn check_dependencies() {
|
fn check_dependencies() {
|
||||||
for executable in [
|
for executable in [
|
||||||
@@ -260,3 +274,91 @@ pub fn check_solidity_warning(
|
|||||||
|
|
||||||
Ok(contains_warning)
|
Ok(contains_warning)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Compile the blob of `contract_name` found in given `source_code`.
|
||||||
|
/// The `solc` optimizer will be enabled
|
||||||
|
pub fn compile_blob(contract_name: &str, source_code: &str) -> Vec<u8> {
|
||||||
|
compile_blob_with_options(contract_name, source_code, true, SolcPipeline::Yul)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Compile the EVM bin-runtime of `contract_name` found in given `source_code`.
|
||||||
|
/// The `solc` optimizer will be enabled
|
||||||
|
pub fn compile_evm_bin_runtime(contract_name: &str, source_code: &str) -> Vec<u8> {
|
||||||
|
let pipeline = SolcPipeline::Yul;
|
||||||
|
let solc_optimizer_enabled = true;
|
||||||
|
let id = CachedBlob {
|
||||||
|
contract_name: contract_name.to_owned(),
|
||||||
|
pipeline,
|
||||||
|
solc_optimizer_enabled,
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(blob) = EVM_BLOB_CACHE.lock().unwrap().get(&id) {
|
||||||
|
return blob.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
let file_name = "contract.sol";
|
||||||
|
let contracts = build_solidity_with_options_evm(
|
||||||
|
[(file_name.into(), source_code.into())].into(),
|
||||||
|
Default::default(),
|
||||||
|
None,
|
||||||
|
pipeline,
|
||||||
|
solc_optimizer_enabled,
|
||||||
|
)
|
||||||
|
.expect("source should compile");
|
||||||
|
let bin_runtime = &contracts
|
||||||
|
.get(contract_name)
|
||||||
|
.unwrap_or_else(|| panic!("contract '{}' didn't produce bin-runtime", contract_name))
|
||||||
|
.object;
|
||||||
|
|
||||||
|
let blob = hex::decode(bin_runtime).expect("bin-runtime shold be hex encoded");
|
||||||
|
|
||||||
|
EVM_BLOB_CACHE.lock().unwrap().insert(id, blob.clone());
|
||||||
|
|
||||||
|
blob
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Compile the blob of `contract_name` found in given `source_code`.
|
||||||
|
pub fn compile_blob_with_options(
|
||||||
|
contract_name: &str,
|
||||||
|
source_code: &str,
|
||||||
|
solc_optimizer_enabled: bool,
|
||||||
|
pipeline: SolcPipeline,
|
||||||
|
) -> Vec<u8> {
|
||||||
|
let id = CachedBlob {
|
||||||
|
contract_name: contract_name.to_owned(),
|
||||||
|
solc_optimizer_enabled,
|
||||||
|
pipeline,
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(blob) = PVM_BLOB_CACHE.lock().unwrap().get(&id) {
|
||||||
|
return blob.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
let file_name = "contract.sol";
|
||||||
|
let contracts = build_solidity_with_options(
|
||||||
|
[(file_name.into(), source_code.into())].into(),
|
||||||
|
Default::default(),
|
||||||
|
None,
|
||||||
|
pipeline,
|
||||||
|
revive_llvm_context::OptimizerSettings::cycles(),
|
||||||
|
solc_optimizer_enabled,
|
||||||
|
)
|
||||||
|
.expect("source should compile")
|
||||||
|
.contracts
|
||||||
|
.expect("source should contain at least one contract");
|
||||||
|
|
||||||
|
let bytecode = contracts[file_name][contract_name]
|
||||||
|
.evm
|
||||||
|
.as_ref()
|
||||||
|
.expect("source should produce EVM output")
|
||||||
|
.bytecode
|
||||||
|
.as_ref()
|
||||||
|
.expect("source should produce assembly text")
|
||||||
|
.object
|
||||||
|
.as_str();
|
||||||
|
let blob = hex::decode(bytecode).expect("hex encoding should always be valid");
|
||||||
|
|
||||||
|
PVM_BLOB_CACHE.lock().unwrap().insert(id, blob.clone());
|
||||||
|
|
||||||
|
blob
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user