diff --git a/crates/solidity/src/solc/standard_json/input/mod.rs b/crates/solidity/src/solc/standard_json/input/mod.rs index 409130e..db2b5be 100644 --- a/crates/solidity/src/solc/standard_json/input/mod.rs +++ b/crates/solidity/src/solc/standard_json/input/mod.rs @@ -12,6 +12,8 @@ use std::path::PathBuf; use rayon::iter::{IntoParallelIterator, ParallelIterator}; use serde::Deserialize; use serde::Serialize; +#[cfg(target_os = "emscripten")] +use std::fs::File; use crate::solc::pipeline::Pipeline as SolcPipeline; use crate::solc::standard_json::input::settings::metadata::Metadata as SolcStandardJsonInputSettingsMetadata; @@ -41,7 +43,20 @@ pub struct Input { impl Input { /// A shortcut constructor from stdin. pub fn try_from_stdin(solc_pipeline: SolcPipeline) -> anyhow::Result { - let mut input: Self = serde_json::from_reader(std::io::BufReader::new(std::io::stdin()))?; + let mut input: Self = serde_json::from_reader({ + #[cfg(target_os = "emscripten")] + { + std::io::BufReader::new( + File::open("/in") + .map_err(|error| anyhow::anyhow!("File /in openning error: {}", error))?, + ) + } + #[cfg(not(target_os = "emscripten"))] + { + std::io::BufReader::new(std::io::stdin()) + } + })?; + input .settings .output_selection diff --git a/js/run_revive.js b/js/run_revive.js index b4e1550..550a5d9 100644 --- a/js/run_revive.js +++ b/js/run_revive.js @@ -5,25 +5,68 @@ import solc from 'solc'; // Import the Emscripten module import ModuleFactory from './resolc.js'; -async function runCompiler() { - const Module = await ModuleFactory(); - Module.solc = solc; - - // Create input Solidity source code - const input = ` -// SPDX-License-Identifier: MIT -pragma solidity ^0.8; -contract Baseline { +// Solidity source code +const input = ` + // SPDX-License-Identifier: MIT + pragma solidity ^0.8; + contract Baseline { function baseline() public payable {} -}`; + }`; - // Write the input Solidity code to the Emscripten file system - Module.FS.writeFile('./input.sol', input); +async function runCompiler() { + const Module = await ModuleFactory(); + Module.solc = solc; - // Compile the Solidity source code - Module.callMain(['./input.sol', '-O3','--bin']); + // Write the input Solidity code to the Emscripten file system + Module.FS.writeFile('./input.sol', input); + + // Compile the Solidity source code + Module.callMain(['./input.sol', '-O3','--bin']); +} + +const compilerStandardJsonInput = { + language: 'Solidity', + sources: { + 'MyContract.sol': { + content: ` + // SPDX-License-Identifier: UNLICENSED + pragma solidity ^0.8.0; + contract MyContract { + function greet() public pure returns (string memory) { + return "Hello"; + } + } + `, + }, + }, + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + outputSelection: { + '*': { + '*': ['abi'], + }, + }, + }, + }; + +async function runCompilerWithStandardJson() { + const Module = await ModuleFactory(); + Module.solc = solc; + + // Write the input Solidity code to the Emscripten file system + Module.FS.writeFile('/in', JSON.stringify(compilerStandardJsonInput)); + + // Compile the Solidity source code + Module.callMain(['--standard-json']); } runCompiler().catch(err => { - console.error('Error:', err); + console.error('Error:', err); +}); + +runCompilerWithStandardJson().catch(err => { + console.error('Error:', err); }); diff --git a/js/soljson_interface.js b/js/soljson_interface.js index 1943564..c7e514f 100644 --- a/js/soljson_interface.js +++ b/js/soljson_interface.js @@ -41,7 +41,7 @@ mergeInto(LibraryManager.library, { let outputFile = newModule.FS.readFile('/out', { encoding: 'utf8' }); parentPort.postMessage({ output: outputFile }); } - });` + });`; function compileWithWorker(inputJson, callback) { return new Promise((resolve, reject) => {