neo_devpack_solidity/cli/mod.rs
1//! Neo DevPack for Solidity CLI Module
2//!
3//! Command-line interface for the Neo DevPack for Solidity compiler. This module provides
4//! the main entry point for compiling Solidity contracts to NeoVM bytecode.
5//!
6//! # Features
7//!
8//! - Single file and multi-file compilation
9//! - Standard JSON input/output (Solidity compiler compatible)
10//! - NEF (Neo Executable Format) generation
11//! - Manifest generation for Neo N3 deployment
12//! - Multiple optimization levels (0-3)
13//! - Verbose output
14//!
15//! # Submodules
16//!
17//! - `bytecode` - NeoVM bytecode generation from IR
18//! - `standard_json` - Standard JSON compilation interface
19//!
20//! # Usage
21//!
22//! ```bash
23//! neo-solc input.sol -o build/
24//! neo-solc --standard-json < input.json > output.json
25//! neo-solc --standard-json --input input.json --output output.json
26//! ```
27
28use clap::{Arg, ArgAction, Command};
29use neo_devpack_solidity::frontend::VisibilityKind;
30use neo_devpack_solidity::ir;
31use neo_devpack_solidity::neo::{
32 build_nef_with_tokens, clamp_nef_source_with_flag, NEF_SOURCE_MAX_BYTES,
33};
34use neo_devpack_solidity::semantic_model::build_semantic_model;
35use neo_devpack_solidity::solidity::{
36 analyse_all_sources, validate_contract, ContractMetadata, DiagnosticSeverity, EventMetadata,
37 FunctionKind, FunctionMetadata, NatspecDoc, ParameterMetadata, StateMutability,
38};
39use neo_devpack_solidity::type_system::NeoType;
40use serde_json::{json, Value};
41use sha3::{Digest, Keccak256};
42use std::collections::{HashMap, HashSet};
43use std::fs;
44use std::path::Path;
45
46mod bytecode;
47#[cfg(test)]
48pub(crate) use crate::interop::interop_id_bytes;
49pub(crate) use bytecode::generate_contract_bytecode;
50// Public re-export of the NeoVM bytecode disassembler so external tooling
51// (fuzz targets, debugging consumers) can call it without touching
52// `pub(crate)` internals. The function is total — any byte sequence
53// produces a string without panicking. See
54// `fuzz/fuzz_targets/fuzz_target_disasm.rs`.
55pub use bytecode::disassemble_neovm_bytecode;
56mod ir_optimize;
57pub(crate) use ir_optimize::optimize_ir;
58mod standard_json;
59pub(crate) use standard_json::*;
60
61/// Fuzz-only public entry point for the Solidity standard-JSON input parser.
62///
63/// Accepts arbitrary bytes, converts to UTF-8 (returns `Err` on invalid
64/// UTF-8 rather than panicking), and invokes the internal standard-JSON
65/// processor with safe defaults (no output path, default options). The
66/// function is total — it must never panic. Callers (the fuzz target)
67/// ignore the returned `Result` and only watch for panics.
68///
69/// This wrapper exists so `fuzz/fuzz_targets/fuzz_target_standard_json.rs`
70/// can exercise the standard-JSON parser without touching `pub(crate)`
71/// internals. See that target for the libfuzzer harness.
72pub fn fuzz_process_standard_json_content(input: &[u8]) -> Result<(), String> {
73 let input_str = std::str::from_utf8(input)
74 .map_err(|err| format!("standard-json fuzz input was not valid UTF-8: {err}"))?;
75 let options = StandardJsonOptions {
76 optimizer_level: 0,
77 use_callt: false,
78 deny_wildcard_permissions: false,
79 deny_wildcard_contracts: false,
80 deny_wildcard_methods: false,
81 nef_source: None,
82 manifest_permissions: None,
83 contract_names: Vec::new(),
84 };
85 process_standard_json_content(input_str, None, options)
86}
87
88include!("cli_parts/cli_defs.rs");
89include!("cli_parts/cli_run.rs");
90include!("cli_parts/cli_compile.rs");
91include!("cli_parts/cli_analyze.rs");
92include!("cli_parts/cli_output.rs");
93include!("cli_parts/cli_manifest.rs");
94include!("cli_parts/cli_deploy.rs");
95include!("cli_parts/cli_diagnostics.rs");
96
97#[cfg(test)]
98mod tests;