Merge branch 'master' into fix-dark-theme-highlight-II

pull/1427/head
Liana Husikyan 3 years ago committed by GitHub
commit 53cca1f658
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      apps/remix-ide-e2e/src/tests/ballot.test.ts
  2. 2
      apps/remix-ide-e2e/src/tests/ballot_0_4_11.spec.ts
  3. 4
      apps/remix-ide-e2e/src/tests/debugger.spec.ts
  4. 16
      apps/remix-ide/src/app/files/remixd-handle.js
  5. 2
      apps/remix-ide/src/app/tabs/hardhat-provider.js
  6. 7
      apps/remix-ide/src/app/tabs/runTab/contractDropdown.js
  7. 7
      apps/remix-ide/src/app/tabs/runTab/recorder.js
  8. 8
      apps/remix-ide/src/app/tabs/runTab/settings.js
  9. 87
      apps/remix-ide/src/app/ui/confirmDialog.js
  10. 7
      apps/remix-ide/src/app/ui/sendTxCallbacks.js
  11. 10
      apps/remix-ide/src/blockchain/execution-context.js
  12. 14
      libs/remix-analyzer/package.json
  13. 14
      libs/remix-astwalker/package.json
  14. 14
      libs/remix-debug/package.json
  15. 2
      libs/remix-debug/src/code/codeUtils.ts
  16. 2
      libs/remix-debug/src/trace/traceManager.ts
  17. 2
      libs/remix-debug/test/decoder/vmCall.ts
  18. 2
      libs/remix-debug/test/vmCall.ts
  19. 10
      libs/remix-lib/package.json
  20. 6
      libs/remix-lib/src/execution/forkAt.ts
  21. 2
      libs/remix-lib/src/execution/txRunnerVM.ts
  22. 18
      libs/remix-lib/src/execution/txRunnerWeb3.ts
  23. 14
      libs/remix-simulator/package.json
  24. 2
      libs/remix-simulator/src/vm-context.ts
  25. 14
      libs/remix-solidity/package.json
  26. 18
      libs/remix-tests/package.json
  27. 1
      libs/remix-ui/clipboard/src/lib/copy-to-clipboard/copy-to-clipboard.tsx
  28. 13
      libs/remix-ui/solidity-compiler/src/lib/compiler-container.tsx
  29. 53
      libs/remix-ui/static-analyser/src/lib/remix-ui-static-analyser.tsx
  30. 4
      libs/remix-url-resolver/package.json
  31. 858
      package-lock.json
  32. 12
      package.json

@ -49,7 +49,7 @@ module.exports = {
'Debug Ballot / delegate': function (browser: NightwatchBrowser) { 'Debug Ballot / delegate': function (browser: NightwatchBrowser) {
browser.pause(500) browser.pause(500)
.click('*[data-id="txLoggerDebugButton0xf88bc0ac0761f78d8c883b32550c68dadcdb095595c30e1a1b7c583e5e958dcb"]') .debugTransaction(1)
.waitForElementVisible('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') .waitForElementVisible('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]')
.click('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') .click('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]')
.pause(2000) .pause(2000)

@ -45,7 +45,7 @@ module.exports = {
'Debug Ballot / delegate': function (browser: NightwatchBrowser) { 'Debug Ballot / delegate': function (browser: NightwatchBrowser) {
browser.pause(500) browser.pause(500)
.click('*[data-id="txLoggerDebugButton0xf88bc0ac0761f78d8c883b32550c68dadcdb095595c30e1a1b7c583e5e958dcb"]') .debugTransaction(1)
.pause(2000) .pause(2000)
.waitForElementVisible('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') .waitForElementVisible('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]')
.click('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]') .click('*[data-id="buttonNavigatorJumpPreviousBreakpoint"]')

@ -423,7 +423,7 @@ const localVariable_step717_ABIEncoder = { // eslint-disable-line
const jsGetTrace = `(async () => { const jsGetTrace = `(async () => {
try { try {
const result = await remix.call('debugger', 'getTrace', '0xa38bff6f06e7c4fc91df1db6aa31a69ab5d5882faa953b1e7a88bfa523268ed7') const result = await remix.call('debugger', 'getTrace', '0x9341be49e911afe99bf1abc67cbcf36739d2e6470a08a69511c205a0737d7332')
console.log('result ', result) console.log('result ', result)
} catch (e) { } catch (e) {
console.log(e.message) console.log(e.message)
@ -432,7 +432,7 @@ const jsGetTrace = `(async () => {
const jsDebug = `(async () => { const jsDebug = `(async () => {
try { try {
const result = await remix.call('debugger', 'debug', '0xa38bff6f06e7c4fc91df1db6aa31a69ab5d5882faa953b1e7a88bfa523268ed7') const result = await remix.call('debugger', 'debug', '0x9341be49e911afe99bf1abc67cbcf36739d2e6470a08a69511c205a0737d7332')
console.log('result ', result) console.log('result ', result)
} catch (e) { } catch (e) {
console.log(e.message) console.log(e.message)

@ -136,23 +136,25 @@ export class RemixdHandle extends WebsocketPlugin {
} }
function remixdDialog () { function remixdDialog () {
const commandText = 'remixd -s path-to-the-shared-folder --remix-ide remix-ide-instance-URL' const commandText = 'remixd -s <path-to-the-shared-folder> -u <remix-ide-instance-URL>'
return yo` return yo`
<div class=${css.dialog}> <div class=${css.dialog}>
<div class=${css.dialogParagraph}> <div class=${css.dialogParagraph}>
Access your local file system from Remix IDE using <a target="_blank" href="https://www.npmjs.com/package/@remix-project/remixd">Remixd NPM package</a>.<br/><br/> Access your local file system from Remix IDE using <a target="_blank" href="https://www.npmjs.com/package/@remix-project/remixd">Remixd NPM package</a>.<br/><br/>
Remixd needs to be running in the background to load the files in localhost workspace. For more info, please check the <a target="_blank" href="https://remix-ide.readthedocs.io/en/latest/remixd.html">Remixd tutorial</a>. Remixd needs to be running in the background to load the files in localhost workspace. For more info, please check the <a target="_blank" href="https://remix-ide.readthedocs.io/en/latest/remixd.html">Remixd tutorial</a>.
</div> </div>
<div class=${css.dialogParagraph}>If you are just looking for the remixd command, here it is: <div class=${css.dialogParagraph}>
If you are just looking for the remixd command, here it is:
<br><br><b>${commandText}</b> <br><br><b>${commandText}</b>
<span class="">${copyToClipboard(() => commandText)}</span> <span class="">${copyToClipboard(() => commandText)}</span>
</div> </div>
<div class=${css.dialogParagraph}>When connected, a session will be started between <em>${window.location.origin}</em> and your local file system at <i>ws://127.0.0.1:65520</i> <div class=${css.dialogParagraph}>
and the shared folder will be in the File Explorers workspace named "localhost". When connected, a session will be started between <em>${window.location.origin}</em> and your local file system at <i>ws://127.0.0.1:65520</i>.
<br/>Note, if the shared folder is a Hardhat project, an additional Hardhat websocket plugin will be listening at <i>ws://127.0.0.1:65522</i> The shared folder will be in the "File Explorers" workspace named "localhost".
<br/>Read more about other <a target="_blank" href="https://remix-ide.readthedocs.io/en/latest/remixd.html#ports-usage">Remixd ports usage</a>
</div> </div>
<div class=${css.dialogParagraph}>Please make sure your system is secured enough and ports 65520, 65522 are not opened nor forwarded. <div class=${css.dialogParagraph}>
This feature is still in Alpha, so we recommend to keep a copy of the shared folder. This feature is still in Alpha. We recommend to keep a backup of the shared folder.
</div> </div>
<div class=${css.dialogParagraph}> <div class=${css.dialogParagraph}>
<h6 class="text-danger"> <h6 class="text-danger">

@ -65,7 +65,7 @@ export default class HardhatProvider extends Plugin {
if (error) { if (error) {
this.blocked = true this.blocked = true
modalDialogCustom.alert('Hardhat Provider', `Error while connecting to the hardhat provider: ${error.message}`) modalDialogCustom.alert('Hardhat Provider', `Error while connecting to the hardhat provider: ${error.message}`)
await this.call('udapp', 'setEnvironmentMode', { context: 'vm', fork: 'berlin' }) await this.call('udapp', 'setEnvironmentMode', { context: 'vm', fork: 'london' })
this.provider = null this.provider = null
setTimeout(_ => { this.blocked = false }, 1000) // we wait 1 second for letting remix to switch to vm setTimeout(_ => { this.blocked = false }, 1000) // we wait 1 second for letting remix to switch to vm
return reject(error) return reject(error)

@ -361,7 +361,7 @@ class ContractDropdownUI {
return continueTxExecution(null) return continueTxExecution(null)
} }
const amount = this.blockchain.fromWei(tx.value, true, 'ether') const amount = this.blockchain.fromWei(tx.value, true, 'ether')
const content = confirmDialog(tx, amount, gasEstimation, null, this.blockchain.determineGasFees(tx), this.blockchain.determineGasPrice.bind(this.blockchain)) const content = confirmDialog(tx, network, amount, gasEstimation, this.blockchain.determineGasFees(tx), this.blockchain.determineGasPrice.bind(this.blockchain))
modalDialog('Confirm transaction', content, modalDialog('Confirm transaction', content,
{ {
@ -370,10 +370,9 @@ class ContractDropdownUI {
this.blockchain.config.setUnpersistedProperty('doNotShowTransactionConfirmationAgain', content.querySelector('input#confirmsetting').checked) this.blockchain.config.setUnpersistedProperty('doNotShowTransactionConfirmationAgain', content.querySelector('input#confirmsetting').checked)
// TODO: check if this is check is still valid given the refactor // TODO: check if this is check is still valid given the refactor
if (!content.gasPriceStatus) { if (!content.gasPriceStatus) {
cancelCb('Given gas price is not correct') cancelCb('Given transaction fee is not correct')
} else { } else {
var gasPrice = this.blockchain.toWei(content.querySelector('#gasprice').value, 'gwei') continueTxExecution(content.txFee)
continueTxExecution(gasPrice)
} }
} }
}, { }, {

@ -104,7 +104,7 @@ class RecorderUI extends Plugin {
return continueTxExecution(null) return continueTxExecution(null)
} }
const amount = this.blockchain.fromWei(tx.value, true, 'ether') const amount = this.blockchain.fromWei(tx.value, true, 'ether')
const content = confirmDialog(tx, amount, gasEstimation, null, this.blockchain.determineGasFees(tx), this.blockchain.determineGasPrice.bind(this.blockchain)) const content = confirmDialog(tx, network, amount, gasEstimation, this.blockchain.determineGasFees(tx), this.blockchain.determineGasPrice.bind(this.blockchain))
modalDialog('Confirm transaction', content, modalDialog('Confirm transaction', content,
{ {
@ -113,10 +113,9 @@ class RecorderUI extends Plugin {
this.config.setUnpersistedProperty('doNotShowTransactionConfirmationAgain', content.querySelector('input#confirmsetting').checked) this.config.setUnpersistedProperty('doNotShowTransactionConfirmationAgain', content.querySelector('input#confirmsetting').checked)
// TODO: check if this is check is still valid given the refactor // TODO: check if this is check is still valid given the refactor
if (!content.gasPriceStatus) { if (!content.gasPriceStatus) {
cancelCb('Given gas price is not correct') cancelCb('Given transaction fee is not correct')
} else { } else {
var gasPrice = this.blockchain.toWei(content.querySelector('#gasprice').value, 'gwei') continueTxExecution(content.txFee)
continueTxExecution(gasPrice)
} }
} }
}, { }, {

@ -98,14 +98,14 @@ class SettingsUI {
</label> </label>
<div class="${css.environment}"> <div class="${css.environment}">
<select id="selectExEnvOptions" data-id="settingsSelectEnvOptions" class="form-control ${css.select} custom-select"> <select id="selectExEnvOptions" data-id="settingsSelectEnvOptions" class="form-control ${css.select} custom-select">
<option id="vm-mode-berlin" data-id="settingsVMBerlinMode"
title="Execution environment does not connect to any node, everything is local and in memory only."
value="vm-berlin" name="executionContext" fork="berlin" > JavaScript VM (Berlin)
</option>
<option id="vm-mode-london" data-id="settingsVMLondonMode" <option id="vm-mode-london" data-id="settingsVMLondonMode"
title="Execution environment does not connect to any node, everything is local and in memory only." title="Execution environment does not connect to any node, everything is local and in memory only."
value="vm-london" name="executionContext" fork="london"> JavaScript VM (London) value="vm-london" name="executionContext" fork="london"> JavaScript VM (London)
</option> </option>
<option id="vm-mode-berlin" data-id="settingsVMBerlinMode"
title="Execution environment does not connect to any node, everything is local and in memory only."
value="vm-berlin" name="executionContext" fork="berlin" > JavaScript VM (Berlin)
</option>
<option id="injected-mode" data-id="settingsInjectedMode" <option id="injected-mode" data-id="settingsInjectedMode"
title="Execution environment has been provided by Metamask or similar provider." title="Execution environment has been provided by Metamask or similar provider."
value="injected" name="executionContext"> Injected Web3 value="injected" name="executionContext"> Injected Web3

@ -14,20 +14,47 @@ var css = csjs`
} }
` `
// TODO: self is not actually used and can be removed function confirmDialog (tx, network, amount, gasEstimation, newGasPriceCb, initialParamsCb) {
function confirmDialog (tx, amount, gasEstimation, self, newGasPriceCb, initialParamsCb) { const onGasPriceChange = function () {
var onGasPriceChange = function () {
var gasPrice = el.querySelector('#gasprice').value var gasPrice = el.querySelector('#gasprice').value
newGasPriceCb(gasPrice, (txFeeText, priceStatus) => { newGasPriceCb(gasPrice, (txFeeText, priceStatus) => {
el.querySelector('#txfee').innerHTML = txFeeText el.querySelector('#txfee').innerHTML = txFeeText
el.gasPriceStatus = priceStatus el.gasPriceStatus = priceStatus
el.txFee = { gasPrice }
}) })
} }
var el = yo` const onMaxFeeChange = function () {
var maxFee = el.querySelector('#maxfee').value
var confirmBtn = document.querySelector('#modal-footer-ok')
var maxPriorityFee = el.querySelector('#maxpriorityfee').value
if (parseInt(network.lastBlock.baseFeePerGas, 16) > parseInt(maxFee)) {
el.querySelector('#txfee').innerHTML = 'Transaction is invalid. Max fee should not be less than Base fee'
el.gasPriceStatus = false
confirmBtn.hidden = true
return
} else {
el.gasPriceStatus = true
confirmBtn.hidden = false
}
newGasPriceCb(maxFee, (txFeeText, priceStatus) => {
el.querySelector('#txfee').innerHTML = txFeeText
if (priceStatus) {
confirmBtn.hidden = false
} else {
confirmBtn.hidden = true
}
el.gasPriceStatus = priceStatus
el.txFee = { maxFee, maxPriorityFee, baseFeePerGas: network.lastBlock.baseFeePerGas }
})
}
const el = yo`
<div> <div>
<div>You are about to create a transaction on the Main Network. Confirm the details to send the info to your provider. <div class="text-dark">You are about to create a transaction on ${network.name} Network. Confirm the details to send the info to your provider.
<br>The provider for many users is MetaMask. The provider will ask you to sign the transaction before it is sent to the Main Network.</div> <br>The provider for many users is MetaMask. The provider will ask you to sign the transaction before it is sent to ${network.name} Network.
</div>
<div class="mt-3 ${css.txInfoBox}"> <div class="mt-3 ${css.txInfoBox}">
<div> <div>
<span class="text-dark mr-2">From:</span> <span class="text-dark mr-2">From:</span>
@ -37,7 +64,11 @@ function confirmDialog (tx, amount, gasEstimation, self, newGasPriceCb, initialP
<span class="text-dark mr-2">To:</span> <span class="text-dark mr-2">To:</span>
<span>${tx.to ? tx.to : '(Contract Creation)'}</span> <span>${tx.to ? tx.to : '(Contract Creation)'}</span>
</div> </div>
<div> <div class="d-flex align-items-center">
<span class="text-dark mr-2">Data:</span>
<pre class="${css.wrapword} mb-0">${tx.data && tx.data.length > 50 ? tx.data.substring(0, 49) + '...' : tx.data} ${copyToClipboard(() => { return tx.data })}</pre>
</div>
<div class="mb-3">
<span class="text-dark mr-2">Amount:</span> <span class="text-dark mr-2">Amount:</span>
<span>${amount} Ether</span> <span>${amount} Ether</span>
</div> </div>
@ -49,18 +80,32 @@ function confirmDialog (tx, amount, gasEstimation, self, newGasPriceCb, initialP
<span class="text-dark mr-2">Gas limit:</span> <span class="text-dark mr-2">Gas limit:</span>
<span>${tx.gas}</span> <span>${tx.gas}</span>
</div> </div>
<div> ${
network.lastBlock.baseFeePerGas ? yo`
<div class="align-items-center my-1" title="Represents the part of the tx fee that goes to the miner.">
<div class='d-flex'>
<span class="text-dark mr-2 text-nowrap">Max Priority fee:</span>
<input class="form-control mr-1 text-right" style='height: 1.2rem; width: 6rem;' value="0" id='maxpriorityfee' />
<span title="visit https://ethgasstation.info for current gas price info.">Gwei</span>
</div>
</div>
<div class="align-items-center my-1" title="Represents the maximum amount of fee that you will pay for this transaction. The minimun needs to be set to base fee.">
<div class='d-flex'>
<span class="text-dark mr-2 text-nowrap">Max fee (Not less than base fee - ${parseInt(network.lastBlock.baseFeePerGas, 16)} Gwei):</span>
<input class="form-control mr-1 text-right" style='height: 1.2rem; width: 6rem;' id='maxfee' oninput=${onMaxFeeChange} />
<span>Gwei</span>
<span class="text-dark ml-2"></span>
</div>
</div>`
: yo`<div class="d-flex align-items-center my-1">
<span class="text-dark mr-2 text-nowrap">Gas price:</span>
<input class="form-control mr-1 text-right" style='width: 40px; height: 28px;' id='gasprice' oninput=${onGasPriceChange} />
<span>Gwei (visit <a target='_blank' href='https://ethgasstation.info'>ethgasstation.info</a> for current gas price info.)</span>
</div>`
}
<div class="mb-3">
<span class="text-dark mr-2">Max transaction fee:</span> <span class="text-dark mr-2">Max transaction fee:</span>
<span id='txfee'></span> <span class="text-warning" id='txfee'></span>
</div>
<div class="d-flex align-items-center my-1">
<span class="text-dark mr-2">Gas price:</span>
<input class="form-control mr-1" style='width: 40px; height: 28px;'id='gasprice' oninput=${onGasPriceChange} />
<span>Gwei (visit <a target='_blank' href='https://ethgasstation.info'>ethgasstation.info</a> for current gas price info.)</span>
</div>
<div class="d-flex align-items-center">
<span class="text-dark mr-2 mb-3">Data:</span>
<pre class=${css.wrapword}>${tx.data && tx.data.length > 50 ? tx.data.substring(0, 49) + '...' : tx.data} ${copyToClipboard(() => { return tx.data })}</pre>
</div> </div>
</div> </div>
<div class="d-flex py-1 align-items-center custom-control custom-checkbox ${css.checkbox}"> <div class="d-flex py-1 align-items-center custom-control custom-checkbox ${css.checkbox}">
@ -74,10 +119,14 @@ function confirmDialog (tx, amount, gasEstimation, self, newGasPriceCb, initialP
if (txFeeText) { if (txFeeText) {
el.querySelector('#txfee').innerHTML = txFeeText el.querySelector('#txfee').innerHTML = txFeeText
} }
if (gasPriceValue) { if (el.querySelector('#gasprice') && gasPriceValue) {
el.querySelector('#gasprice').value = gasPriceValue el.querySelector('#gasprice').value = gasPriceValue
onGasPriceChange() onGasPriceChange()
} }
if (el.querySelector('#maxfee') && network && network.lastBlock && network.lastBlock.baseFeePerGas) {
el.querySelector('#maxfee').value = parseInt(network.lastBlock.baseFeePerGas, 16)
onMaxFeeChange()
}
if (gasPriceStatus !== undefined) { if (gasPriceStatus !== undefined) {
el.gasPriceStatus = gasPriceStatus el.gasPriceStatus = gasPriceStatus
} }

@ -51,7 +51,7 @@ const confirmationCb = function (network, tx, gasEstimation, continueTxExecution
return continueTxExecution(null) return continueTxExecution(null)
} }
var amount = Web3.utils.fromWei(typeConversion.toInt(tx.value), 'ether') var amount = Web3.utils.fromWei(typeConversion.toInt(tx.value), 'ether')
var content = confirmDialog(tx, amount, gasEstimation, self.udappUI, var content = confirmDialog(tx, network, amount, gasEstimation,
(gasPrice, cb) => { (gasPrice, cb) => {
let txFeeText, priceStatus let txFeeText, priceStatus
// TODO: this try catch feels like an anti pattern, can/should be // TODO: this try catch feels like an anti pattern, can/should be
@ -93,10 +93,9 @@ const confirmationCb = function (network, tx, gasEstimation, continueTxExecution
) )
// TODO: check if this is check is still valid given the refactor // TODO: check if this is check is still valid given the refactor
if (!content.gasPriceStatus) { if (!content.gasPriceStatus) {
cancelCb('Given gas price is not correct') cancelCb('Given transaction fee is not correct')
} else { } else {
var gasPrice = Web3.utils.toWei(content.querySelector('#gasprice').value, 'gwei') continueTxExecution(content.txFee)
continueTxExecution(gasPrice)
} }
} }
}, },

@ -20,9 +20,10 @@ export class ExecutionContext {
constructor () { constructor () {
this.event = new EventManager() this.event = new EventManager()
this.executionContext = null this.executionContext = null
this.lastBlock = null
this.blockGasLimitDefault = 4300000 this.blockGasLimitDefault = 4300000
this.blockGasLimit = this.blockGasLimitDefault this.blockGasLimit = this.blockGasLimitDefault
this.currentFork = 'berlin' this.currentFork = 'london'
this.mainNetGenesisHash = '0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3' this.mainNetGenesisHash = '0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3'
this.customNetWorks = {} this.customNetWorks = {}
this.blocks = {} this.blocks = {}
@ -86,10 +87,10 @@ export class ExecutionContext {
web3.eth.getBlock(0, (error, block) => { web3.eth.getBlock(0, (error, block) => {
if (error) console.log('cant query first block') if (error) console.log('cant query first block')
if (block && block.hash !== this.mainNetGenesisHash) name = 'Custom' if (block && block.hash !== this.mainNetGenesisHash) name = 'Custom'
callback(err, { id, name }) callback(err, { id, name, lastBlock: this.lastBlock, currentFork: this.currentFork })
}) })
} else { } else {
callback(err, { id, name }) callback(err, { id, name, lastBlock: this.lastBlock, currentFork: this.currentFork })
} }
}) })
} }
@ -176,10 +177,11 @@ export class ExecutionContext {
const block = await web3.eth.getBlock('latest') const block = await web3.eth.getBlock('latest')
// we can't use the blockGasLimit cause the next blocks could have a lower limit : https://github.com/ethereum/remix/issues/506 // we can't use the blockGasLimit cause the next blocks could have a lower limit : https://github.com/ethereum/remix/issues/506
this.blockGasLimit = (block && block.gasLimit) ? Math.floor(block.gasLimit - (5 * block.gasLimit) / 1024) : this.blockGasLimitDefault this.blockGasLimit = (block && block.gasLimit) ? Math.floor(block.gasLimit - (5 * block.gasLimit) / 1024) : this.blockGasLimitDefault
this.lastBlock = block
try { try {
this.currentFork = execution.forkAt(await web3.eth.net.getId(), block.number) this.currentFork = execution.forkAt(await web3.eth.net.getId(), block.number)
} catch (e) { } catch (e) {
this.currentFork = 'berlin' this.currentFork = 'london'
console.log(`unable to detect fork, defaulting to ${this.currentFork}..`) console.log(`unable to detect fork, defaulting to ${this.currentFork}..`)
console.error(e) console.error(e)
} }

@ -1,6 +1,6 @@
{ {
"name": "@remix-project/remix-analyzer", "name": "@remix-project/remix-analyzer",
"version": "0.5.13", "version": "0.5.14",
"description": "Tool to perform static analysis on Solidity smart contracts", "description": "Tool to perform static analysis on Solidity smart contracts",
"main": "index.js", "main": "index.js",
"types": ".index.d.ts", "types": ".index.d.ts",
@ -19,14 +19,14 @@
} }
], ],
"dependencies": { "dependencies": {
"@ethereumjs/block": "^3.3.0", "@ethereumjs/block": "^3.4.0",
"@ethereumjs/tx": "^3.2.1", "@ethereumjs/tx": "^3.3.0",
"@ethereumjs/vm": "^5.4.1", "@ethereumjs/vm": "^5.5.0",
"@remix-project/remix-astwalker": "^0.0.26", "@remix-project/remix-astwalker": "^0.0.26",
"@remix-project/remix-lib": "^0.5.4", "@remix-project/remix-lib": "^0.5.5",
"async": "^2.6.2", "async": "^2.6.2",
"ethereumjs-util": "^7.0.10", "ethereumjs-util": "^7.0.10",
"ethers": "^5.1.4", "ethers": "^5.4.2",
"string-similarity": "^4.0.4", "string-similarity": "^4.0.4",
"web3": "1.2.4" "web3": "1.2.4"
}, },
@ -51,5 +51,5 @@
"typescript": "^3.7.5" "typescript": "^3.7.5"
}, },
"typings": "index.d.ts", "typings": "index.d.ts",
"gitHead": "664824605fa84648c79770631da371d4f81e0052" "gitHead": "df7abe1c219e361a947031d620f4ae6e3786a4d7"
} }

@ -1,6 +1,6 @@
{ {
"name": "@remix-project/remix-astwalker", "name": "@remix-project/remix-astwalker",
"version": "0.0.34", "version": "0.0.35",
"description": "Tool to walk through Solidity AST", "description": "Tool to walk through Solidity AST",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
@ -34,14 +34,14 @@
] ]
}, },
"dependencies": { "dependencies": {
"@ethereumjs/block": "^3.3.0", "@ethereumjs/block": "^3.4.0",
"@ethereumjs/tx": "^3.2.1", "@ethereumjs/tx": "^3.3.0",
"@ethereumjs/vm": "^5.4.1", "@ethereumjs/vm": "^5.5.0",
"@remix-project/remix-lib": "^0.5.4", "@remix-project/remix-lib": "^0.5.5",
"@types/tape": "^4.2.33", "@types/tape": "^4.2.33",
"async": "^2.6.2", "async": "^2.6.2",
"ethereumjs-util": "^7.0.10", "ethereumjs-util": "^7.0.10",
"ethers": "^5.1.4", "ethers": "^5.4.2",
"nyc": "^13.3.0", "nyc": "^13.3.0",
"string-similarity": "^4.0.4", "string-similarity": "^4.0.4",
"tape": "^4.10.1", "tape": "^4.10.1",
@ -53,5 +53,5 @@
"tap-spec": "^5.0.0" "tap-spec": "^5.0.0"
}, },
"typings": "index.d.ts", "typings": "index.d.ts",
"gitHead": "664824605fa84648c79770631da371d4f81e0052" "gitHead": "df7abe1c219e361a947031d620f4ae6e3786a4d7"
} }

@ -1,6 +1,6 @@
{ {
"name": "@remix-project/remix-debug", "name": "@remix-project/remix-debug",
"version": "0.5.4", "version": "0.5.5",
"description": "Tool to debug Ethereum transactions", "description": "Tool to debug Ethereum transactions",
"contributors": [ "contributors": [
{ {
@ -18,17 +18,17 @@
], ],
"main": "src/index.js", "main": "src/index.js",
"dependencies": { "dependencies": {
"@ethereumjs/block": "^3.3.0", "@ethereumjs/block": "^3.4.0",
"@ethereumjs/common": "^2.2.0", "@ethereumjs/common": "^2.2.0",
"@ethereumjs/tx": "^3.2.1", "@ethereumjs/tx": "^3.3.0",
"@ethereumjs/vm": "^5.4.1", "@ethereumjs/vm": "^5.5.0",
"@remix-project/remix-astwalker": "^0.0.26", "@remix-project/remix-astwalker": "^0.0.26",
"@remix-project/remix-lib": "^0.5.4", "@remix-project/remix-lib": "^0.5.5",
"async": "^2.6.2", "async": "^2.6.2",
"commander": "^2.19.0", "commander": "^2.19.0",
"deep-equal": "^1.0.1", "deep-equal": "^1.0.1",
"ethereumjs-util": "^7.0.10", "ethereumjs-util": "^7.0.10",
"ethers": "^5.1.4", "ethers": "^5.4.2",
"string-similarity": "^4.0.4", "string-similarity": "^4.0.4",
"web3": "^1.2.4" "web3": "^1.2.4"
}, },
@ -61,5 +61,5 @@
}, },
"homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-debug#readme", "homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-debug#readme",
"typings": "src/index.d.ts", "typings": "src/index.d.ts",
"gitHead": "664824605fa84648c79770631da371d4f81e0052" "gitHead": "df7abe1c219e361a947031d620f4ae6e3786a4d7"
} }

@ -46,7 +46,7 @@ type Opcode = {
* information about the opcode. * information about the opcode.
*/ */
export function parseCode (raw) { export function parseCode (raw) {
const common = new Common({ chain: 'mainnet', hardfork: 'berlin' }) const common = new Common({ chain: 'mainnet', hardfork: 'london' })
const opcodes = getOpcodesForHF(common) const opcodes = getOpcodesForHF(common)
const code = [] const code = []

@ -40,7 +40,7 @@ export class TraceManager {
const networkId = await this.web3.eth.net.getId() const networkId = await this.web3.eth.net.getId()
this.fork = execution.forkAt(networkId, tx.blockNumber) this.fork = execution.forkAt(networkId, tx.blockNumber)
} catch (e) { } catch (e) {
this.fork = 'berlin' this.fork = 'london'
console.log(`unable to detect fork, defaulting to ${this.fork}..`) console.log(`unable to detect fork, defaulting to ${this.fork}..`)
console.error(e) console.error(e)
} }

@ -11,7 +11,7 @@ export function sendTx (vm, from, to, value, data, cb?) {
return new Promise ((resolve, reject) => { return new Promise ((resolve, reject) => {
var tx = new Tx({ var tx = new Tx({
nonce: new BN(from.nonce++), nonce: new BN(from.nonce++),
gasPrice: new BN(1), // gasPrice: new BN(1),
gasLimit: new BN(3000000, 10), gasLimit: new BN(3000000, 10),
to: to, to: to,
value: new BN(value, 10), value: new BN(value, 10),

@ -9,7 +9,7 @@ var remixLib = require('@remix-project/remix-lib')
function sendTx (vm, from, to, value, data, cb) { function sendTx (vm, from, to, value, data, cb) {
var tx = new Tx({ var tx = new Tx({
nonce: new BN(from.nonce++), nonce: new BN(from.nonce++),
gasPrice: new BN(1), // gasPrice: new BN(1),
gasLimit: new BN(3000000, 10), gasLimit: new BN(3000000, 10),
to: to, to: to,
value: new BN(value, 10), value: new BN(value, 10),

@ -1,6 +1,6 @@
{ {
"name": "@remix-project/remix-lib", "name": "@remix-project/remix-lib",
"version": "0.5.4", "version": "0.5.5",
"description": "Library to various Remix tools", "description": "Library to various Remix tools",
"contributors": [ "contributors": [
{ {
@ -14,9 +14,9 @@
], ],
"main": "src/index.js", "main": "src/index.js",
"dependencies": { "dependencies": {
"@ethereumjs/block": "^3.3.0", "@ethereumjs/block": "^3.4.0",
"@ethereumjs/tx": "^3.2.1", "@ethereumjs/tx": "^3.3.0",
"@ethereumjs/vm": "^5.4.1", "@ethereumjs/vm": "^5.5.0",
"async": "^2.1.2", "async": "^2.1.2",
"ethereumjs-util": "^7.0.10", "ethereumjs-util": "^7.0.10",
"ethers": "^4.0.40", "ethers": "^4.0.40",
@ -53,5 +53,5 @@
}, },
"homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-lib#readme", "homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-lib#readme",
"typings": "src/index.d.ts", "typings": "src/index.d.ts",
"gitHead": "664824605fa84648c79770631da371d4f81e0052" "gitHead": "df7abe1c219e361a947031d620f4ae6e3786a4d7"
} }

@ -17,7 +17,7 @@ export function forkAt (networkId, blockNumber) {
} }
return currentForkName return currentForkName
} }
return 'berlin' return 'london'
} }
// see https://github.com/ethereum/go-ethereum/blob/master/params/config.go // see https://github.com/ethereum/go-ethereum/blob/master/params/config.go
@ -46,6 +46,10 @@ const forks = {
{ {
number: 12244000, number: 12244000,
name: 'berlin' name: 'berlin'
},
{
number: 12965000,
name: 'london'
} }
], ],
3: [ 3: [

@ -72,7 +72,7 @@ export class TxRunnerVM {
} }
} }
const EIP1559 = this.commonContext.hardfork() !== 'berlin' const EIP1559 = this.commonContext.hardfork() !== 'berlin' // berlin is the only pre eip1559 fork that we handle.
let tx let tx
if (!EIP1559) { if (!EIP1559) {
tx = Transaction.fromTxData({ tx = Transaction.fromTxData({

@ -15,8 +15,18 @@ export class TxRunnerWeb3 {
this._api = api this._api = api
} }
_executeTx (tx, gasPrice, api, promptCb, callback) { _executeTx (tx, txFee, api, promptCb, callback) {
if (gasPrice) tx.gasPrice = this.getWeb3().utils.toHex(gasPrice) if (txFee) {
if (txFee.baseFeePerGas) {
tx.maxPriorityFee = this.getWeb3().utils.toHex(this.getWeb3().utils.toWei(txFee.maxPriorityFee, 'gwei'))
tx.maxFee = this.getWeb3().utils.toHex(this.getWeb3().utils.toWei(txFee.maxFee, 'gwei'))
tx.type = 2
} else {
tx.gasPrice = this.getWeb3().utils.toHex(this.getWeb3().utils.toWei(txFee.gasPrice, 'gwei'))
tx.type = 1
}
}
if (api.personalMode()) { if (api.personalMode()) {
promptCb( promptCb(
(value) => { (value) => {
@ -100,8 +110,8 @@ export class TxRunnerWeb3 {
return return
} }
confirmCb(network, tx, tx['gas'], (gasPrice) => { confirmCb(network, tx, tx['gas'], (txFee) => {
return this._executeTx(tx, gasPrice, this._api, promptCb, callback) return this._executeTx(tx, txFee, this._api, promptCb, callback)
}, (error) => { }, (error) => {
callback(error) callback(error)
}) })

@ -1,6 +1,6 @@
{ {
"name": "@remix-project/remix-simulator", "name": "@remix-project/remix-simulator",
"version": "0.2.4", "version": "0.2.5",
"description": "Ethereum IDE and tools for the web", "description": "Ethereum IDE and tools for the web",
"contributors": [ "contributors": [
{ {
@ -14,11 +14,11 @@
], ],
"main": "src/index.js", "main": "src/index.js",
"dependencies": { "dependencies": {
"@ethereumjs/block": "^3.3.0", "@ethereumjs/block": "^3.4.0",
"@ethereumjs/common": "^2.2.0", "@ethereumjs/common": "^2.2.0",
"@ethereumjs/tx": "^3.2.1", "@ethereumjs/tx": "^3.3.0",
"@ethereumjs/vm": "^5.4.1", "@ethereumjs/vm": "^5.5.0",
"@remix-project/remix-lib": "^0.5.4", "@remix-project/remix-lib": "^0.5.5",
"ansi-gray": "^0.1.1", "ansi-gray": "^0.1.1",
"async": "^3.1.0", "async": "^3.1.0",
"body-parser": "^1.18.2", "body-parser": "^1.18.2",
@ -26,7 +26,7 @@
"commander": "^2.19.0", "commander": "^2.19.0",
"cors": "^2.8.5", "cors": "^2.8.5",
"ethereumjs-util": "^7.0.10", "ethereumjs-util": "^7.0.10",
"ethers": "^5.1.4", "ethers": "^5.4.2",
"express": "^4.16.3", "express": "^4.16.3",
"express-ws": "^4.0.0", "express-ws": "^4.0.0",
"merge": "^1.2.0", "merge": "^1.2.0",
@ -66,5 +66,5 @@
}, },
"homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-simulator#readme", "homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-simulator#readme",
"typings": "src/index.d.ts", "typings": "src/index.d.ts",
"gitHead": "664824605fa84648c79770631da371d4f81e0052" "gitHead": "df7abe1c219e361a947031d620f4ae6e3786a4d7"
} }

@ -99,7 +99,7 @@ export class VMContext {
constructor (fork?) { constructor (fork?) {
this.blockGasLimitDefault = 4300000 this.blockGasLimitDefault = 4300000
this.blockGasLimit = this.blockGasLimitDefault this.blockGasLimit = this.blockGasLimitDefault
this.currentFork = fork || 'berlin' this.currentFork = fork || 'london'
this.currentVm = this.createVm(this.currentFork) this.currentVm = this.createVm(this.currentFork)
this.blocks = {} this.blocks = {}
this.latestBlockNumber = 0 this.latestBlockNumber = 0

@ -1,6 +1,6 @@
{ {
"name": "@remix-project/remix-solidity", "name": "@remix-project/remix-solidity",
"version": "0.4.4", "version": "0.4.5",
"description": "Tool to load and run Solidity compiler", "description": "Tool to load and run Solidity compiler",
"main": "index.js", "main": "index.js",
"types": "./index.d.ts", "types": "./index.d.ts",
@ -15,14 +15,14 @@
} }
], ],
"dependencies": { "dependencies": {
"@ethereumjs/block": "^3.3.0", "@ethereumjs/block": "^3.4.0",
"@ethereumjs/tx": "^3.2.1", "@ethereumjs/tx": "^3.3.0",
"@ethereumjs/vm": "^5.4.1", "@ethereumjs/vm": "^5.5.0",
"@remix-project/remix-lib": "^0.5.4", "@remix-project/remix-lib": "^0.5.5",
"async": "^2.6.2", "async": "^2.6.2",
"eslint-scope": "^5.0.0", "eslint-scope": "^5.0.0",
"ethereumjs-util": "^7.0.10", "ethereumjs-util": "^7.0.10",
"ethers": "^5.1.4", "ethers": "^5.4.2",
"solc": "^0.7.4", "solc": "^0.7.4",
"string-similarity": "^4.0.4", "string-similarity": "^4.0.4",
"web3": "1.2.4", "web3": "1.2.4",
@ -59,5 +59,5 @@
}, },
"homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-solidity#readme", "homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-solidity#readme",
"typings": "index.d.ts", "typings": "index.d.ts",
"gitHead": "664824605fa84648c79770631da371d4f81e0052" "gitHead": "df7abe1c219e361a947031d620f4ae6e3786a4d7"
} }

@ -1,6 +1,6 @@
{ {
"name": "@remix-project/remix-tests", "name": "@remix-project/remix-tests",
"version": "0.2.4", "version": "0.2.5",
"description": "Tool to test Solidity smart contracts", "description": "Tool to test Solidity smart contracts",
"main": "src/index.js", "main": "src/index.js",
"types": "./src/index.d.ts", "types": "./src/index.d.ts",
@ -35,13 +35,13 @@
}, },
"homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-tests#readme", "homepage": "https://github.com/ethereum/remix-project/tree/master/libs/remix-tests#readme",
"dependencies": { "dependencies": {
"@ethereumjs/block": "^3.3.0", "@ethereumjs/block": "^3.4.0",
"@ethereumjs/common": "^2.2.0", "@ethereumjs/common": "^2.2.0",
"@ethereumjs/tx": "^3.2.1", "@ethereumjs/tx": "^3.3.0",
"@ethereumjs/vm": "^5.4.1", "@ethereumjs/vm": "^5.5.0",
"@remix-project/remix-lib": "^0.5.4", "@remix-project/remix-lib": "^0.5.5",
"@remix-project/remix-simulator": "^0.2.4", "@remix-project/remix-simulator": "^0.2.5",
"@remix-project/remix-solidity": "^0.4.4", "@remix-project/remix-solidity": "^0.4.5",
"ansi-gray": "^0.1.1", "ansi-gray": "^0.1.1",
"async": "^2.6.0", "async": "^2.6.0",
"axios": ">=0.21.1", "axios": ">=0.21.1",
@ -50,7 +50,7 @@
"colors": "^1.1.2", "colors": "^1.1.2",
"commander": "^2.13.0", "commander": "^2.13.0",
"ethereumjs-util": "^7.0.10", "ethereumjs-util": "^7.0.10",
"ethers": "^5.1.4", "ethers": "^5.4.2",
"express-ws": "^4.0.0", "express-ws": "^4.0.0",
"merge": "^1.2.0", "merge": "^1.2.0",
"signale": "^1.4.0", "signale": "^1.4.0",
@ -77,5 +77,5 @@
"typescript": "^3.3.1" "typescript": "^3.3.1"
}, },
"typings": "src/index.d.ts", "typings": "src/index.d.ts",
"gitHead": "664824605fa84648c79770631da371d4f81e0052" "gitHead": "df7abe1c219e361a947031d620f4ae6e3786a4d7"
} }

@ -40,6 +40,7 @@ export const CopyToClipboard = (props: ICopyToClipboard) => {
} }
return ( return (
// eslint-disable-next-line jsx-a11y/anchor-is-valid
<a href='#' onClick={handleClick} onMouseLeave={reset}> <a href='#' onClick={handleClick} onMouseLeave={reset}>
<OverlayTrigger placement={direction} overlay={ <OverlayTrigger placement={direction} overlay={
<Tooltip id="overlay-tooltip"> <Tooltip id="overlay-tooltip">

@ -5,6 +5,7 @@ import * as helper from '../../../../../apps/remix-ide/src/lib/helper'
import { canUseWorker, baseURLBin, baseURLWasm, urlFromVersion, pathToURL, promisedMiniXhr } from '@remix-project/remix-solidity' import { canUseWorker, baseURLBin, baseURLWasm, urlFromVersion, pathToURL, promisedMiniXhr } from '@remix-project/remix-solidity'
import { compilerReducer, compilerInitialState } from './reducers/compiler' import { compilerReducer, compilerInitialState } from './reducers/compiler'
import { resetEditorMode, listenToEvents } from './actions/compiler' import { resetEditorMode, listenToEvents } from './actions/compiler'
import { OverlayTrigger, Tooltip } from 'react-bootstrap' // eslint-disable-line
import './css/style.css' import './css/style.css'
@ -572,9 +573,19 @@ export const CompilerContainer = (props: CompilerContainerProps) => {
</div> </div>
</div> </div>
{ {
isHardHatProject && <div className="mt-2 remixui_compilerConfig custom-control custom-checkbox"> isHardHatProject &&
<div className="mt-3 remixui_compilerConfig custom-control custom-checkbox">
<input className="remixui_autocompile custom-control-input" onChange={updatehhCompilation} id="enableHardhat" type="checkbox" title="Enable Hardhat Compilation" checked={hhCompilation} /> <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> <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">
<span className="p-1 pr-3" style={{ backgroundColor: 'black', minWidth: '230px' }}>Learn how to use Hardhat Compilation</span>
</Tooltip>
}>
<i style={{ fontSize: 'medium' }} className={'ml-2 fal fa-info-circle'} aria-hidden="true"></i>
</OverlayTrigger>
</a>
</div> </div>
} }
<button id="compileBtn" data-id="compilerContainerCompileBtn" className="btn btn-primary btn-block remixui_disabled mt-3" title="Compile" onClick={compile} disabled={disableCompileButton}> <button id="compileBtn" data-id="compilerContainerCompileBtn" className="btn btn-primary btn-block remixui_disabled mt-3" title="Compile" onClick={compile} disabled={disableCompileButton}>

@ -7,6 +7,7 @@ import { RemixUiCheckbox } from '@remix-ui/checkbox' // eslint-disable-line
import ErrorRenderer from './ErrorRenderer' // eslint-disable-line import ErrorRenderer from './ErrorRenderer' // eslint-disable-line
import { compilation } from './actions/staticAnalysisActions' import { compilation } from './actions/staticAnalysisActions'
import { initialState, analysisReducer } from './reducers/staticAnalysisReducer' import { initialState, analysisReducer } from './reducers/staticAnalysisReducer'
import { OverlayTrigger, Tooltip } from 'react-bootstrap'// eslint-disable-line
const StaticAnalysisRunner = require('@remix-project/remix-analyzer').CodeAnalysis const StaticAnalysisRunner = require('@remix-project/remix-analyzer').CodeAnalysis
const utils = remixLib.util const utils = remixLib.util
@ -56,7 +57,7 @@ export const RemixUiStaticAnalyser = (props: RemixUiStaticAnalyserProps) => {
} }
const [autoRun, setAutoRun] = useState(true) const [autoRun, setAutoRun] = useState(true)
const [slitherEnabled, setSlitherEnabled] = useState(false) const [slitherEnabled, setSlitherEnabled] = useState(false)
const [showSlither, setShowSlither] = useState('hidden') const [showSlither, setShowSlither] = useState(false)
const [categoryIndex, setCategoryIndex] = useState(groupedModuleIndex(groupedModules)) const [categoryIndex, setCategoryIndex] = useState(groupedModuleIndex(groupedModules))
const warningContainer = React.useRef(null) const warningContainer = React.useRef(null)
@ -88,9 +89,22 @@ export const RemixUiStaticAnalyser = (props: RemixUiStaticAnalyserProps) => {
// Reset state // Reset state
dispatch({ type: '', payload: {} }) dispatch({ type: '', payload: {} })
// Show 'Enable Slither Analysis' checkbox // Show 'Enable Slither Analysis' checkbox
if (currentWorkspace && currentWorkspace.isLocalhost === true) setShowSlither('visible') if (currentWorkspace && currentWorkspace.isLocalhost === true) setShowSlither(true)
else { else {
setShowSlither('hidden') setShowSlither(false)
setSlitherEnabled(false)
}
})
props.analysisModule.on('manager', 'pluginDeactivated', (plugin) => {
// Hide 'Enable Slither Analysis' checkbox
if (plugin.name === 'remixd') {
// Reset warning state
setWarningState([])
// Reset badge
props.event.trigger('staticAnaysisWarning', [])
// Reset state
dispatch({ type: '', payload: {} })
setShowSlither(false)
setSlitherEnabled(false) setSlitherEnabled(false)
} }
}) })
@ -401,17 +415,28 @@ export const RemixUiStaticAnalyser = (props: RemixUiStaticAnalyserProps) => {
/> />
<Button buttonText="Run" onClick={() => run(state.data, state.source, state.file)} disabled={(state.data === null || categoryIndex.length === 0) && !slitherEnabled }/> <Button buttonText="Run" onClick={() => run(state.data, state.source, state.file)} disabled={(state.data === null || categoryIndex.length === 0) && !slitherEnabled }/>
</div> </div>
<div className="d-flex" id="enableSlitherAnalysis"> { showSlither &&
<RemixUiCheckbox <div className="d-flex mt-2" id="enableSlitherAnalysis">
id="enableSlither" <RemixUiCheckbox
inputType="checkbox" id="enableSlither"
onClick={handleSlitherEnabled} inputType="checkbox"
checked={slitherEnabled} onClick={handleSlitherEnabled}
label="Enable Slither Analysis" checked={slitherEnabled}
onChange={() => {}} label="Enable Slither Analysis"
visibility = {showSlither} onChange={() => {}}
/> />
</div>
<a className="mt-1 text-nowrap" href='https://remix-ide.readthedocs.io/en/latest/slither.html#enable-slither-analysis' target={'_blank'}>
<OverlayTrigger placement={'right'} overlay={
<Tooltip className="text-nowrap" id="overlay-tooltip">
<span className="p-1 pr-3" style={{ backgroundColor: 'black', minWidth: '230px' }}>Learn how to use Slither Analysis</span>
</Tooltip>
}>
<i style={{ fontSize: 'medium' }} className={'fal fa-info-circle ml-3'} aria-hidden="true"></i>
</OverlayTrigger>
</a>
</div>
}
</div> </div>
<div id="staticanalysismodules" className="list-group list-group-flush"> <div id="staticanalysismodules" className="list-group list-group-flush">
{Object.keys(groupedModules).map((categoryId, i) => { {Object.keys(groupedModules).map((categoryId, i) => {

@ -1,6 +1,6 @@
{ {
"name": "@remix-project/remix-url-resolver", "name": "@remix-project/remix-url-resolver",
"version": "0.0.25", "version": "0.0.26",
"description": "Solidity import url resolver engine", "description": "Solidity import url resolver engine",
"main": "index.js", "main": "index.js",
"types": "./index.d.ts", "types": "./index.d.ts",
@ -42,5 +42,5 @@
"typescript": "^3.1.6" "typescript": "^3.1.6"
}, },
"typings": "index.d.ts", "typings": "index.d.ts",
"gitHead": "664824605fa84648c79770631da371d4f81e0052" "gitHead": "df7abe1c219e361a947031d620f4ae6e3786a4d7"
} }

858
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -1,6 +1,6 @@
{ {
"name": "remix-project", "name": "remix-project",
"version": "0.16.0-dev", "version": "0.17.0-dev",
"license": "MIT", "license": "MIT",
"description": "Ethereum Remix Monorepo", "description": "Ethereum Remix Monorepo",
"keywords": [ "keywords": [
@ -130,10 +130,10 @@
}, },
"dependencies": { "dependencies": {
"@erebos/bzz-node": "^0.13.0", "@erebos/bzz-node": "^0.13.0",
"@ethereumjs/block": "^3.3.0", "@ethereumjs/block": "^3.4.0",
"@ethereumjs/common": "^2.3.1", "@ethereumjs/common": "^2.4.0",
"@ethereumjs/tx": "^3.2.1", "@ethereumjs/tx": "^3.3.0",
"@ethereumjs/vm": "^5.4.1", "@ethereumjs/vm": "^5.5.0",
"@remixproject/engine": "^0.3.17", "@remixproject/engine": "^0.3.17",
"@remixproject/engine-web": "^0.3.17", "@remixproject/engine-web": "^0.3.17",
"@remixproject/plugin": "^0.3.17", "@remixproject/plugin": "^0.3.17",
@ -152,7 +152,7 @@
"deep-equal": "^1.0.1", "deep-equal": "^1.0.1",
"document-register-element": "1.13.1", "document-register-element": "1.13.1",
"ethereumjs-util": "^7.0.10", "ethereumjs-util": "^7.0.10",
"ethers": "^5.1.4", "ethers": "^5.4.2",
"express-ws": "^4.0.0", "express-ws": "^4.0.0",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"form-data": "^4.0.0", "form-data": "^4.0.0",

Loading…
Cancel
Save