Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions src/data/contracts/registry.rs

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion src/helpers/pre_conditions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ pub fn check_before(contract_to_deploy: Option<&ContractSpec>, args: &CliArgs) {
info!("Resolved contract: {}", spec.name);
info!("Address contract: {:?}", spec.address);
info!("Path contract: {:?}", spec.path);
info!("verify_json_path contract: {:?}", spec.verify_json_path);
info!("salt contract: {:?}", spec.salt);

if spec.deployer_tx.is_some() {
Expand Down
1 change: 0 additions & 1 deletion src/types/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ pub struct ContractSpec {
pub deployer_tx: Option<&'static [u8]>,
pub constructor_args: Option<&'static [u8]>,
pub creation_bytecode: Option<&'static [u8]>,
pub verify_json_path: Option<&'static str>,
}

#[derive(Deserialize)]
Expand Down
2 changes: 0 additions & 2 deletions src/types/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,6 @@ pub enum VerifierError {
MissingAddress(&'static str),
#[error("Missing contract source path for '{0}'")]
MissingContractPath(&'static str),
#[error("Failed to read verify JSON for '{0}': {1}")]
ReadFailed(&'static str, String),
#[error("Missing env var: {0}")]
MissingEnvVar(&'static str),
#[error("Unsupported chain for verification: {0}")]
Expand Down
88 changes: 8 additions & 80 deletions src/utils/verifier.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
use serde_json::{Map, Value, from_str};
use std::borrow::Cow;
use std::env::var;
use std::fs::read_to_string;
use std::process::Command;
use std::process::Output;
use std::sync::Arc;
Expand Down Expand Up @@ -301,86 +300,15 @@ pub async fn verify_contract(
let api_key: String = var(Constants::ETHERSCAN_API_KEY_ENV)
.map_err(|_| VerifierError::MissingEnvVar(Constants::ETHERSCAN_API_KEY_ENV))?;

if let Some(verify_path) = spec.verify_json_path {
verify_via_etherscan_api(
spec,
address,
contract_path,
chain,
chain_id,
&api_key,
verify_path,
)
.await
} else {
let contract_id: String = format!("{contract_path}:{}", spec.name);
let name: &str = spec.name;
let cargs: Option<&[u8]> = spec.constructor_args;

spawn_blocking(move || {
verify_via_forge_sync(name, address, &contract_id, chain_id, &api_key, cargs)
})
.await
.map_err(|e| VerifierError::VerificationFailed(spec.name, e.to_string()))?
}
}

async fn verify_via_etherscan_api(
spec: &ContractSpec,
address: Address,
contract_path: &str,
chain: &str,
chain_id: u64,
api_key: &str,
verify_path: &str,
) -> Result<String, VerifierError> {
let compiler_version: String = var(Constants::SOLC_VERSION_ENV)
.map_err(|_| VerifierError::MissingEnvVar(Constants::SOLC_VERSION_ENV))?;

let source_code: String = read_to_string(verify_path)
.map_err(|e| VerifierError::ReadFailed(spec.name, e.to_string()))?;

let contract_name: String = format!("{contract_path}:{}", spec.name);
let constructor_args: String = spec.constructor_args.map(hex::encode).unwrap_or_default();

let client: Client = reqwest::Client::new();
let submit_url: String = format!(
"{}?module=contract&action=verifysourcecode&chainid={chain_id}&apikey={api_key}",
Constants::ETHERSCAN_V2_URL
);

let addr_str: String = format!("{address}");
let body: String = build_form_body(&[
("contractaddress", &addr_str),
("sourceCode", &source_code),
("codeformat", "solidity-standard-json-input"),
("contractname", &contract_name),
("compilerversion", &compiler_version),
("constructorArguements", &constructor_args),
]);

let resp: EtherscanResponse = client
.post(&submit_url)
.header("Content-Type", "application/x-www-form-urlencoded")
.body(body)
.send()
.await
.map_err(|e| VerifierError::HttpError(spec.name, e.to_string()))?
.json()
.await
.map_err(|e| VerifierError::HttpError(spec.name, e.to_string()))?;

if resp.status != "1" {
return Err(VerifierError::SubmissionFailed(spec.name, resp.result));
}

let guid: String = resp.result;
info!(
"Verification submitted for '{}' on {chain} (guid: {guid})",
spec.name
);
let contract_id: String = format!("{contract_path}:{}", spec.name);
let name: &str = spec.name;
let cargs: Option<&[u8]> = spec.constructor_args;

poll_verification_status(&client, chain_id, api_key, &guid, spec.name).await
spawn_blocking(move || {
verify_via_forge_sync(name, address, &contract_id, chain_id, &api_key, cargs)
})
.await
.map_err(|e| VerifierError::VerificationFailed(spec.name, e.to_string()))?
}

pub async fn run_verifications(
Expand Down