diff --git a/libs/remix-solidity/src/compiler/compiler-input.ts b/libs/remix-solidity/src/compiler/compiler-input.ts index 8598c9dfd4..61c8ece472 100644 --- a/libs/remix-solidity/src/compiler/compiler-input.ts +++ b/libs/remix-solidity/src/compiler/compiler-input.ts @@ -17,7 +17,8 @@ export default (sources: Source, opts: CompilerInputOptions): string => { '': ['ast'], '*': ['abi', 'metadata', 'devdoc', 'userdoc', 'storageLayout', 'evm.legacyAssembly', 'evm.bytecode', 'evm.deployedBytecode', 'evm.methodIdentifiers', 'evm.gasEstimates', 'evm.assembly'] } - } + }, + remappings: opts.remappings || [] } } if (opts.evmVersion) { diff --git a/libs/remix-solidity/src/compiler/compiler.ts b/libs/remix-solidity/src/compiler/compiler.ts index 2e20b0c857..a99154c08a 100644 --- a/libs/remix-solidity/src/compiler/compiler.ts +++ b/libs/remix-solidity/src/compiler/compiler.ts @@ -32,6 +32,7 @@ export class Compiler { runs: 200, evmVersion: null, language: 'Solidity', + remappings: [], compilationStartTime: null, target: null, useFileConfiguration: false, @@ -213,12 +214,11 @@ export class Compiler { let input = "" try { if (source && source.sources) { - const { optimize, runs, evmVersion, language, useFileConfiguration, configFileContent } = this.state - + const { optimize, runs, evmVersion, language, remappings, useFileConfiguration, configFileContent } = this.state if (useFileConfiguration) { input = compilerInputForConfigFile(source.sources, JSON.parse(configFileContent)) } else { - input = compilerInput(source.sources, { optimize, runs, evmVersion, language }) + input = compilerInput(source.sources, { optimize, runs, evmVersion, language, remappings }) } result = JSON.parse(remoteCompiler.compile(input, { import: missingInputsCallback })) @@ -331,15 +331,18 @@ export class Compiler { this.state.compileJSON = (source: SourceWithTarget, timeStamp: number) => { if (source && source.sources) { - const { optimize, runs, evmVersion, language, useFileConfiguration, configFileContent } = this.state + const { optimize, runs, evmVersion, language, remappings, useFileConfiguration, configFileContent } = this.state jobs.push({ sources: source }) let input = "" try { if (useFileConfiguration) { - input = compilerInputForConfigFile(source.sources, JSON.parse(configFileContent)) + const compilerInput = JSON.parse(configFileContent) + if (compilerInput.settings.remappings?.length) compilerInput.settings.remappings.push(...remappings) + else compilerInput.settings.remappings = remappings + input = compilerInputForConfigFile(source.sources, compilerInput) } else { - input = compilerInput(source.sources, { optimize, runs, evmVersion, language }) + input = compilerInput(source.sources, { optimize, runs, evmVersion, language, remappings }) } } catch (exception) { this.onCompilationFinished({ error: { formattedMessage: exception.message } }, [], source, "", this.state.currentVersion) diff --git a/libs/remix-solidity/src/compiler/types.ts b/libs/remix-solidity/src/compiler/types.ts index d86e7b0b74..6a6a74e7ce 100644 --- a/libs/remix-solidity/src/compiler/types.ts +++ b/libs/remix-solidity/src/compiler/types.ts @@ -147,7 +147,8 @@ export interface CompilerInputOptions { [fileName: string]: Record }, evmVersion?: EVMVersion, - language?: Language + language?: Language, + remappings?: string[] } export type EVMVersion = 'homestead' | 'tangerineWhistle' | 'spuriousDragon' | 'byzantium' | 'constantinople' | 'petersburg' | 'istanbul' | 'berlin' | 'london' | 'paris' | null @@ -168,6 +169,7 @@ export interface CompilerState { runs: number evmVersion: EVMVersion| null, language: Language, + remappings: string[] compilationStartTime: number| null, target: string | null, useFileConfiguration: boolean, 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 579e1d7a40..8b464838e0 100644 --- a/libs/remix-ui/solidity-compiler/src/lib/compiler-container.tsx +++ b/libs/remix-ui/solidity-compiler/src/lib/compiler-container.tsx @@ -59,6 +59,7 @@ export const CompilerContainer = (props: CompilerContainerProps) => { compiledFileName: '', includeNightlies: false, language: 'Solidity', + remappings: [], evmVersion: '', createFileOnce: 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 9f36b48e9c..941296597e 100644 --- a/libs/remix-ui/solidity-compiler/src/lib/logic/compileTabLogic.ts +++ b/libs/remix-ui/solidity-compiler/src/lib/logic/compileTabLogic.ts @@ -106,10 +106,15 @@ export class CompileTabLogic { compileFile (target) { if (!target) throw new Error('No target provided for compiliation') return new Promise((resolve, reject) => { - this.api.readFile(target).then((content) => { + this.api.readFile(target).then(async(content) => { const sources = { [target]: { content } } this.event.emit('removeAnnotations') this.event.emit('startingCompilation') + if(await this.api.fileExists('remappings.txt')) { + this.api.readFile('remappings.txt').then( remappings => { + this.compiler.set('remappings', remappings.split('\n')) + }) + } if (this.configFilePath) { this.api.readFile(this.configFilePath).then( contentConfig => { this.compiler.set('configFileContent', contentConfig)