|
|
|
@ -2,11 +2,10 @@ import React, { useEffect, useState, useRef, useReducer } from 'react' // eslint |
|
|
|
|
import semver from 'semver' |
|
|
|
|
import { CompilerContainerProps } from './types' |
|
|
|
|
import { ConfigurationSettings } from '@remix-project/remix-lib-ts' |
|
|
|
|
import { checkSpecialChars, extractNameFromKey } from '@remix-ui/helper' |
|
|
|
|
import { checkSpecialChars, CustomTooltip, extractNameFromKey } from '@remix-ui/helper' |
|
|
|
|
import { canUseWorker, baseURLBin, baseURLWasm, urlFromVersion, pathToURL, promisedMiniXhr } from '@remix-project/remix-solidity' |
|
|
|
|
import { compilerReducer, compilerInitialState } from './reducers/compiler' |
|
|
|
|
import { resetEditorMode, listenToEvents } from './actions/compiler' |
|
|
|
|
import { OverlayTrigger, Tooltip } from 'react-bootstrap' // eslint-disable-line
|
|
|
|
|
import { getValidLanguage } from '@remix-project/remix-solidity' |
|
|
|
|
import { CopyToClipboard } from '@remix-ui/clipboard' |
|
|
|
|
import { configFileContent } from './compilerConfiguration' |
|
|
|
@ -725,26 +724,22 @@ export const CompilerContainer = (props: CompilerContainerProps) => { |
|
|
|
|
<div className='pt-0 remixui_compilerSection'> |
|
|
|
|
<div className="mb-1"> |
|
|
|
|
<label className="remixui_compilerLabel form-check-label" htmlFor="versionSelector">Compiler</label> |
|
|
|
|
<OverlayTrigger |
|
|
|
|
<CustomTooltip |
|
|
|
|
placement="top" |
|
|
|
|
overlay={ |
|
|
|
|
<Tooltip id="promptCompilerTooltip" className="text-nowrap"> |
|
|
|
|
<span>{"Add a custom compiler with URL"}</span> |
|
|
|
|
</Tooltip> |
|
|
|
|
} |
|
|
|
|
tooltipId="promptCompilerTooltip" |
|
|
|
|
tooltipClasses="text-nowrap" |
|
|
|
|
tooltipText={"Add a custom compiler with URL"} |
|
|
|
|
> |
|
|
|
|
<span className="far fa-plus border-0 p-0 ml-3" onClick={() => promptCompiler()}></span> |
|
|
|
|
</OverlayTrigger> |
|
|
|
|
<OverlayTrigger |
|
|
|
|
</CustomTooltip> |
|
|
|
|
<CustomTooltip |
|
|
|
|
placement="top" |
|
|
|
|
overlay={ |
|
|
|
|
<Tooltip id="showCompilerTooltip" className="text-nowrap"> |
|
|
|
|
<span>{"See compiler license"}</span> |
|
|
|
|
</Tooltip> |
|
|
|
|
} |
|
|
|
|
tooltipId="showCompilerTooltip" |
|
|
|
|
tooltipClasses="text-nowrap" |
|
|
|
|
tooltipText={"See compiler license"} |
|
|
|
|
> |
|
|
|
|
<span className="fa fa-file-text-o border-0 p-0 ml-2" onClick={() => showCompilerLicense()}></span> |
|
|
|
|
</OverlayTrigger> |
|
|
|
|
</CustomTooltip> |
|
|
|
|
<select value={state.selectedVersion || state.defaultVersion} onChange={(e) => handleLoadVersion(e.target.value)} className="custom-select" id="versionSelector" disabled={state.allversions.length <= 0}> |
|
|
|
|
{state.allversions.length <= 0 && <option disabled data-id={state.selectedVersion === state.defaultVersion ? 'selected' : ''}>{state.defaultVersion}</option>} |
|
|
|
|
{state.allversions.length <= 0 && <option disabled data-id={state.selectedVersion === 'builtin' ? 'selected' : ''}>builtin</option>} |
|
|
|
@ -775,13 +770,14 @@ export const CompilerContainer = (props: CompilerContainerProps) => { |
|
|
|
|
<input className="remixui_autocompile custom-control-input" onChange={updatehhCompilation} id="enableHardhat" type="checkbox" title="Enable Hardhat Compilation" checked={hhCompilation} /> |
|
|
|
|
<label className="form-check-label custom-control-label" htmlFor="enableHardhat">Enable Hardhat Compilation</label> |
|
|
|
|
<a className="mt-1 text-nowrap" href='https://remix-ide.readthedocs.io/en/latest/hardhat.html#enable-hardhat-compilation' target={'_blank'}> |
|
|
|
|
<OverlayTrigger placement={'right'} overlay={ |
|
|
|
|
<Tooltip className="text-nowrap" id="overlay-tooltip-hardhat"> |
|
|
|
|
<span className="border bg-light text-dark p-1 pr-3" style={{ minWidth: '230px' }}>Learn how to use Hardhat Compilation</span> |
|
|
|
|
</Tooltip> |
|
|
|
|
}> |
|
|
|
|
<CustomTooltip |
|
|
|
|
placement={'right'} |
|
|
|
|
tooltipClasses="text-nowrap" |
|
|
|
|
tooltipId="overlay-tooltip-hardhat" |
|
|
|
|
tooltipText={<span className="border bg-light text-dark p-1 pr-3" style={{ minWidth: '230px' }}>Learn how to use Hardhat Compilation</span>} |
|
|
|
|
> |
|
|
|
|
<i style={{ fontSize: 'medium' }} className={'ml-2 fal fa-info-circle'} aria-hidden="true"></i> |
|
|
|
|
</OverlayTrigger> |
|
|
|
|
</CustomTooltip> |
|
|
|
|
</a> |
|
|
|
|
</div> |
|
|
|
|
} |
|
|
|
@ -791,13 +787,14 @@ export const CompilerContainer = (props: CompilerContainerProps) => { |
|
|
|
|
<input className="remixui_autocompile custom-control-input" onChange={updateTruffleCompilation} id="enableTruffle" type="checkbox" title="Enable Truffle Compilation" checked={truffleCompilation} /> |
|
|
|
|
<label className="form-check-label custom-control-label" htmlFor="enableTruffle">Enable Truffle Compilation</label> |
|
|
|
|
<a className="mt-1 text-nowrap" href='https://remix-ide.readthedocs.io/en/latest/truffle.html#enable-truffle-compilation' target={'_blank'}> |
|
|
|
|
<OverlayTrigger placement={'right'} overlay={ |
|
|
|
|
<Tooltip className="text-nowrap" id="overlay-tooltip-truffle"> |
|
|
|
|
<span className="border bg-light text-dark p-1 pr-3" style={{ minWidth: '230px' }}>Learn how to use Truffle Compilation</span> |
|
|
|
|
</Tooltip> |
|
|
|
|
}> |
|
|
|
|
<CustomTooltip |
|
|
|
|
placement={'right'} |
|
|
|
|
tooltipClasses="text-nowrap" |
|
|
|
|
tooltipId="overlay-tooltip-truffle" |
|
|
|
|
tooltipText={<span className="border bg-light text-dark p-1 pr-3" style={{ minWidth: '230px' }}>Learn how to use Truffle Compilation</span>} |
|
|
|
|
> |
|
|
|
|
<i style={{ fontSize: 'medium' }} className={'ml-2 fal fa-info-circle'} aria-hidden="true"></i> |
|
|
|
|
</OverlayTrigger> |
|
|
|
|
</CustomTooltip> |
|
|
|
|
</a> |
|
|
|
|
</div> |
|
|
|
|
} |
|
|
|
@ -820,19 +817,17 @@ export const CompilerContainer = (props: CompilerContainerProps) => { |
|
|
|
|
<div className={`flex-column 'd-flex'}`}> |
|
|
|
|
<div className="mb-2 ml-4"> |
|
|
|
|
<label className="remixui_compilerLabel form-check-label" htmlFor="compilierLanguageSelector">Language</label> |
|
|
|
|
<OverlayTrigger |
|
|
|
|
<CustomTooltip |
|
|
|
|
placement="right-start" |
|
|
|
|
overlay={ |
|
|
|
|
<Tooltip id="compilerLabelTooltip" className="text-nowrap"> |
|
|
|
|
<span>{'Language specification available from Compiler >= v0.5.7'}</span> |
|
|
|
|
</Tooltip> |
|
|
|
|
} |
|
|
|
|
tooltipId="compilerLabelTooltip" |
|
|
|
|
tooltipClasses="text-nowrap" |
|
|
|
|
tooltipText={<span>{'Language specification available from Compiler >= v0.5.7'}</span>} |
|
|
|
|
> |
|
|
|
|
<select onChange={(e) => handleLanguageChange(e.target.value)} disabled={state.useFileConfiguration} value={state.language} className="custom-select" id="compilierLanguageSelector"> |
|
|
|
|
<option data-id={state.language === 'Solidity' ? 'selected' : ''} value='Solidity'>Solidity</option> |
|
|
|
|
<option data-id={state.language === 'Yul' ? 'selected' : ''} value='Yul'>Yul</option> |
|
|
|
|
</select> |
|
|
|
|
</OverlayTrigger> |
|
|
|
|
</CustomTooltip> |
|
|
|
|
</div> |
|
|
|
|
<div className="mb-2 ml-4"> |
|
|
|
|
<label className="remixui_compilerLabel form-check-label" htmlFor="evmVersionSelector">EVM Version</label> |
|
|
|
@ -863,21 +858,19 @@ export const CompilerContainer = (props: CompilerContainerProps) => { |
|
|
|
|
<label className="form-check-label custom-control-label" htmlFor="scFileConfig" data-id="scFileConfiguration">Use configuration file</label> |
|
|
|
|
</div> |
|
|
|
|
<div className={`pt-2 ml-4 ml-2 align-items-start justify-content-between d-flex`}> |
|
|
|
|
{(!showFilePathInput && state.useFileConfiguration) && <OverlayTrigger |
|
|
|
|
{(!showFilePathInput && state.useFileConfiguration) && <CustomTooltip |
|
|
|
|
placement="bottom" |
|
|
|
|
overlay={ |
|
|
|
|
<Tooltip id="configfileTooltip" className="text-nowrap"> |
|
|
|
|
<span> |
|
|
|
|
tooltipId="configfileTooltip" |
|
|
|
|
tooltipClasses="text-nowrap" |
|
|
|
|
tooltipText={<span> |
|
|
|
|
Click to open the config file |
|
|
|
|
</span> |
|
|
|
|
</Tooltip> |
|
|
|
|
} |
|
|
|
|
</span>} |
|
|
|
|
> |
|
|
|
|
<span |
|
|
|
|
onClick={configFilePath === '' ? () => { } : async () => { await openFile() }} |
|
|
|
|
className="py-2 remixui_compilerConfigPath" |
|
|
|
|
>{configFilePath === '' ? 'No file selected.' : configFilePath}</span> |
|
|
|
|
</OverlayTrigger>} |
|
|
|
|
</CustomTooltip>} |
|
|
|
|
{(!showFilePathInput && !state.useFileConfiguration) && <span className="py-2 text-secondary">{configFilePath}</span>} |
|
|
|
|
<input |
|
|
|
|
ref={configFilePathInput} |
|
|
|
@ -897,19 +890,19 @@ export const CompilerContainer = (props: CompilerContainerProps) => { |
|
|
|
|
</div> |
|
|
|
|
<div className="px-4"> |
|
|
|
|
<button id="compileBtn" data-id="compilerContainerCompileBtn" className="btn btn-primary btn-block d-block w-100 text-break remixui_disabled mb-1 mt-3" onClick={compile} disabled={(configFilePath === '' && state.useFileConfiguration) || disableCompileButton}> |
|
|
|
|
<OverlayTrigger overlay={ |
|
|
|
|
<Tooltip id="overlay-tooltip-compile"> |
|
|
|
|
<div className="text-left"> |
|
|
|
|
<CustomTooltip |
|
|
|
|
placement="auto" |
|
|
|
|
tooltipId="overlay-tooltip-compile" |
|
|
|
|
tooltipText={<div className="text-left"> |
|
|
|
|
{!(configFilePath === '' && state.useFileConfiguration) && <div><b>Ctrl+S</b> for compiling</div>} |
|
|
|
|
{(configFilePath === '' && state.useFileConfiguration) && <div> No config file selected</div>} |
|
|
|
|
</div> |
|
|
|
|
</Tooltip> |
|
|
|
|
}> |
|
|
|
|
</div>} |
|
|
|
|
> |
|
|
|
|
<span> |
|
|
|
|
{<i ref={compileIcon} className="fas fa-sync remixui_iconbtn" aria-hidden="true"></i>} |
|
|
|
|
Compile {typeof state.compiledFileName === 'string' ? extractNameFromKey(state.compiledFileName) || '<no file selected>' : '<no file selected>'} |
|
|
|
|
</span> |
|
|
|
|
</OverlayTrigger> |
|
|
|
|
</CustomTooltip> |
|
|
|
|
</button> |
|
|
|
|
<div className='d-flex align-items-center'> |
|
|
|
|
<button |
|
|
|
@ -919,22 +912,23 @@ export const CompilerContainer = (props: CompilerContainerProps) => { |
|
|
|
|
onClick={compileAndRun} |
|
|
|
|
disabled={(configFilePath === '' && state.useFileConfiguration) || disableCompileButton} |
|
|
|
|
> |
|
|
|
|
<OverlayTrigger overlay={ |
|
|
|
|
<Tooltip id="overlay-tooltip-compile-run"> |
|
|
|
|
<div className="text-left"> |
|
|
|
|
<CustomTooltip |
|
|
|
|
placement="auto" |
|
|
|
|
tooltipId="overlay-tooltip-compile-run" |
|
|
|
|
tooltipText={<div className="text-left"> |
|
|
|
|
{!(configFilePath === '' && state.useFileConfiguration) && <div><b>Ctrl+Shift+S</b> for compiling and script execution</div>} |
|
|
|
|
{(configFilePath === '' && state.useFileConfiguration) && <div> No config file selected</div>} |
|
|
|
|
</div> |
|
|
|
|
</Tooltip> |
|
|
|
|
}> |
|
|
|
|
</div>} |
|
|
|
|
> |
|
|
|
|
<span> |
|
|
|
|
Compile and Run script |
|
|
|
|
</span> |
|
|
|
|
</OverlayTrigger> |
|
|
|
|
</CustomTooltip> |
|
|
|
|
</button> |
|
|
|
|
<OverlayTrigger overlay={ |
|
|
|
|
<Tooltip id="overlay-tooltip-compile-run-doc"> |
|
|
|
|
<div className="text-left p-2"> |
|
|
|
|
<CustomTooltip |
|
|
|
|
placement="auto" |
|
|
|
|
tooltipId="overlay-tooltip-compile-run-doc" |
|
|
|
|
tooltipText={<div className="text-left p-2"> |
|
|
|
|
<div>Choose the script to execute right after compilation by adding the `dev-run-script` natspec tag, as in:</div> |
|
|
|
|
<pre> |
|
|
|
|
<code> |
|
|
|
@ -947,11 +941,10 @@ export const CompilerContainer = (props: CompilerContainerProps) => { |
|
|
|
|
</code> |
|
|
|
|
</pre> |
|
|
|
|
Click to know more |
|
|
|
|
</div> |
|
|
|
|
</Tooltip> |
|
|
|
|
}> |
|
|
|
|
</div>} |
|
|
|
|
> |
|
|
|
|
<a href="https://remix-ide.readthedocs.io/en/latest/running_js_scripts.html#compile-a-contract-and-run-a-script-on-the-fly" target="_blank" ><i className="pl-2 ml-2 mt-3 mb-1 fas fa-info text-dark"></i></a> |
|
|
|
|
</OverlayTrigger> |
|
|
|
|
</CustomTooltip> |
|
|
|
|
<CopyToClipboard tip="Click to copy the custom NatSpec tag" getContent={() => '@custom:dev-run-script file_path'} direction='top'> |
|
|
|
|
<button className="btn remixui_copyButton ml-2 mt-3 mb-1 text-dark"> |
|
|
|
|
<i className="remixui_copyIcon far fa-copy" aria-hidden="true"></i> |
|
|
|
|