From 840891214fcbe0625ac86070b58ac3d150b0e55f Mon Sep 17 00:00:00 2001 From: ioedeveloper Date: Thu, 2 Oct 2025 10:34:59 +0100 Subject: [PATCH 1/2] Add support for custom solidity config file --- .../src/lib/compiler-container.tsx | 20 ++++++++++++++-- .../src/lib/logic/compileTabLogic.ts | 23 ++++++++++++++++++- .../src/lib/solidity-compiler.tsx | 2 ++ .../solidity-compiler/src/lib/types/index.ts | 4 +++- 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/libs/remix-ui/solidity-compiler/src/lib/compiler-container.tsx b/libs/remix-ui/solidity-compiler/src/lib/compiler-container.tsx index 7f779bf7ae4..7eb0e3b9d9a 100644 --- a/libs/remix-ui/solidity-compiler/src/lib/compiler-container.tsx +++ b/libs/remix-ui/solidity-compiler/src/lib/compiler-container.tsx @@ -436,7 +436,15 @@ export const CompilerContainer = (props: CompilerContainerProps) => { let externalCompType if (hhCompilation) externalCompType = 'hardhat' else if (truffleCompilation) externalCompType = 'truffle' - compileTabLogic.runCompiler(externalCompType) + compileTabLogic.runCompiler(externalCompType).catch((error) => { + tooltip(error.message) + compileIcon.current.classList.remove('remixui_bouncingIcon') + compileIcon.current.classList.remove('remixui_spinningIcon') + // @ts-ignore + props.setCompileErrors({ [currentFile]: { error: error.message } }) + // @ts-ignore + props.setBadgeStatus({ [currentFile]: { key: 1, title: error.message, type: 'error' } }) + }) } const compileAndRun = () => { @@ -448,7 +456,15 @@ export const CompilerContainer = (props: CompilerContainerProps) => { if (hhCompilation) externalCompType = 'hardhat' else if (truffleCompilation) externalCompType = 'truffle' api.runScriptAfterCompilation(currentFile) - compileTabLogic.runCompiler(externalCompType) + compileTabLogic.runCompiler(externalCompType).catch((error) => { + tooltip(error.message) + compileIcon.current.classList.remove('remixui_bouncingIcon') + compileIcon.current.classList.remove('remixui_spinningIcon') + // @ts-ignore + props.setCompileErrors({ [currentFile]: { error: error.message } }) + // @ts-ignore + props.setBadgeStatus({ [currentFile]: { key: 1, title: error.message, type: 'error' } }) + }) } const _updateVersionSelector = (version, customUrl = '', setQueryParameter = true) => { diff --git a/libs/remix-ui/solidity-compiler/src/lib/logic/compileTabLogic.ts b/libs/remix-ui/solidity-compiler/src/lib/logic/compileTabLogic.ts index 5dc0474a946..fd8e1aed61f 100644 --- a/libs/remix-ui/solidity-compiler/src/lib/logic/compileTabLogic.ts +++ b/libs/remix-ui/solidity-compiler/src/lib/logic/compileTabLogic.ts @@ -117,7 +117,28 @@ export class CompileTabLogic { const config = JSON.parse(configContent) if (config['solidity-compiler']) { - this.compiler.set('configFileContent', config['solidity-compiler']) + if (typeof config['solidity-compiler'] === 'string') { + if (config['solidity-compiler'].endsWith('.json')) { + const configFilePath = config['solidity-compiler'] + const fileExists = await this.api.fileExists(configFilePath) + + if (fileExists) { + try { + const fileContent = await this.api.readFile(configFilePath) + config['solidity-compiler'] = JSON.parse(fileContent) + this.compiler.set('configFileContent', config['solidity-compiler']) + } catch (e) { + throw new Error('Configuration file specified in remix.config.json contains invalid configuration') + } + } else { + throw new Error('Configuration file specified in remix.config.json does not exist') + } + } else { + throw new Error('Configuration file specified in remix.config.json is not a valid JSON file') + } + } else { + this.compiler.set('configFileContent', config['solidity-compiler']) + } } else { this.compiler.set('configFileContent', JSON.parse(configFileContent)) this.api.writeFile(remixConfigPath, JSON.stringify({ ...config, 'solidity-compiler': JSON.parse(configFileContent) }, null, 2)) diff --git a/libs/remix-ui/solidity-compiler/src/lib/solidity-compiler.tsx b/libs/remix-ui/solidity-compiler/src/lib/solidity-compiler.tsx index b34214c6b5a..fd24afe26ca 100644 --- a/libs/remix-ui/solidity-compiler/src/lib/solidity-compiler.tsx +++ b/libs/remix-ui/solidity-compiler/src/lib/solidity-compiler.tsx @@ -285,6 +285,8 @@ export const SolidityCompiler = (props: SolidityCompilerProps) => { updateCurrentVersion={updateCurrentVersion} configurationSettings={configurationSettings} solJsonBinData={state.solJsonBinData} + setCompileErrors={setCompileErrors} + setBadgeStatus={setBadgeStatus} /> {/* "compileErrors[currentFile]['contracts']" field will not be there in case of compilation errors */} {contractsFile && contractsFile[currentFile] && contractsFile[currentFile].contractsDetails diff --git a/libs/remix-ui/solidity-compiler/src/lib/types/index.ts b/libs/remix-ui/solidity-compiler/src/lib/types/index.ts index 2386066c360..56bdb2020cb 100644 --- a/libs/remix-ui/solidity-compiler/src/lib/types/index.ts +++ b/libs/remix-ui/solidity-compiler/src/lib/types/index.ts @@ -21,7 +21,9 @@ export interface CompilerContainerProps { compiledFileName: string, updateCurrentVersion: any, configurationSettings: ConfigurationSettings, - solJsonBinData: iSolJsonBinData + solJsonBinData: iSolJsonBinData, + setCompileErrors: (errors: Record) => void + setBadgeStatus: (badgeStatus: Record) => void } export interface ContractSelectionProps { From fa340f18e486254f4a500f5037e1ff06fd74a7a9 Mon Sep 17 00:00:00 2001 From: ioedeveloper Date: Thu, 2 Oct 2025 11:19:54 +0100 Subject: [PATCH 2/2] Catch errors for other compilation modes --- apps/remix-ide/src/app/tabs/compile-tab.js | 2 +- libs/remix-ui/solidity-compiler/src/lib/api/compiler-api.ts | 4 +++- libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/remix-ide/src/app/tabs/compile-tab.js b/apps/remix-ide/src/app/tabs/compile-tab.js index 08c7e7e67b7..6663f8a5552 100644 --- a/apps/remix-ide/src/app/tabs/compile-tab.js +++ b/apps/remix-ide/src/app/tabs/compile-tab.js @@ -120,7 +120,7 @@ export default class CompileTab extends CompilerApiMixin(ViewPlugin) { // implem compile(fileName) { if (!isNative(this.currentRequest.from)) this.call('notification', 'toast', compileToastMsg(this.currentRequest.from, fileName)) - super.compile(fileName) + return super.compile(fileName) } compileFile(event) { diff --git a/libs/remix-ui/solidity-compiler/src/lib/api/compiler-api.ts b/libs/remix-ui/solidity-compiler/src/lib/api/compiler-api.ts index fcc9f236ba0..995f68e62e9 100644 --- a/libs/remix-ui/solidity-compiler/src/lib/api/compiler-api.ts +++ b/libs/remix-ui/solidity-compiler/src/lib/api/compiler-api.ts @@ -366,7 +366,9 @@ export const CompilerApiMixin = (Base) => class extends Base { if (this.currentFile && (this.currentFile.endsWith('.sol') || this.currentFile.endsWith('.yul'))) { if (await this.getAppParameter('hardhat-compilation')) this.compileTabLogic.runCompiler('hardhat') else if (await this.getAppParameter('truffle-compilation')) this.compileTabLogic.runCompiler('truffle') - else this.compileTabLogic.runCompiler(undefined) + else this.compileTabLogic.runCompiler(undefined).catch((error) => { + this.call('notification', 'toast', error.message) + }) } else if (this.currentFile && this.currentFile.endsWith('.circom')) { await this.call('circuit-compiler', 'compile', this.currentFile) } else if (this.currentFile && this.currentFile.endsWith('.vy')) { diff --git a/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx index 42bc34637c5..48a411632c0 100644 --- a/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx +++ b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx @@ -498,7 +498,9 @@ export const TabsUI = (props: TabsUIProps) => { if (tabsState.currentExt === 'vy') { await props.plugin.call(compilerName, 'vyperCompileCustomAction') } else { - await props.plugin.call(compilerName, 'compile', path) + await props.plugin.call(compilerName, 'compile', path).catch((error) => { + props.plugin.call('notification', 'toast', error.message) + }) } } catch (e) {