Merge branch 'master' into resolve_with_package

pull/5370/head
yann300 2 years ago committed by GitHub
commit 588cc5ac05
  1. 15
      apps/debugger/src/app/debugger-api.ts
  2. 3
      gulpfile.js
  3. 3
      lerna.json
  4. 16
      libs/remix-debug/src/trace/traceAnalyser.ts
  5. 5
      libs/remix-debug/src/trace/traceCache.ts
  6. 5
      libs/remix-debug/src/trace/traceHelper.ts
  7. 18
      libs/remix-debug/src/trace/traceManager.ts
  8. 21
      libs/remix-lib/src/util.ts
  9. 21
      libs/remix-simulator/bin/ethsim
  10. 30
      libs/remix-simulator/src/VmProxy.ts
  11. 17
      libs/remix-ui/home-tab/src/lib/components/homeTabLearn.tsx
  12. 2
      package.json
  13. 6
      yarn.lock

@ -2,6 +2,8 @@ import Web3 from 'web3'
import { init , traceHelper, TransactionDebugger as Debugger } from '@remix-project/remix-debug' import { init , traceHelper, TransactionDebugger as Debugger } from '@remix-project/remix-debug'
import { CompilerAbstract } from '@remix-project/remix-solidity' import { CompilerAbstract } from '@remix-project/remix-solidity'
import { lineText } from '@remix-ui/editor' import { lineText } from '@remix-ui/editor'
import { util } from '@remix-project/remix-lib'
const { toHexPaddedString } = util
export const DebuggerApiMixin = (Base) => class extends Base { export const DebuggerApiMixin = (Base) => class extends Base {
@ -137,7 +139,18 @@ export const DebuggerApiMixin = (Base) => class extends Base {
}, },
debugWithGeneratedSources: false debugWithGeneratedSources: false
}) })
return await debug.debugger.traceManager.getTrace(hash) const trace = await debug.debugger.traceManager.getTrace(hash)
trace.structLogs = trace.structLogs.map((step) => {
const stack = []
for (const prop in step.stack) {
if (prop !== 'length') {
stack.push(toHexPaddedString(step.stack[prop]))
}
}
step.stack = stack
return step
})
return trace
} }
debug (hash, web3?) { debug (hash, web3?) {

@ -52,7 +52,8 @@ task('syncLibVersions', async function () {
'remix-tests', 'remix-tests',
'remix-url-resolver', 'remix-url-resolver',
'remix-ws-templates', 'remix-ws-templates',
'remixd' 'remixd',
'ghaction-helper'
] ]
libs.forEach(lib => { libs.forEach(lib => {

@ -8,7 +8,8 @@
"dist/libs/remix-solidity", "dist/libs/remix-solidity",
"dist/libs/remix-tests", "dist/libs/remix-tests",
"dist/libs/remix-url-resolver", "dist/libs/remix-url-resolver",
"dist/libs/remix-ws-templates" "dist/libs/remix-ws-templates",
"dist/libs/ghaction-helper"
], ],
"version": "independent", "version": "independent",
"command": { "command": {

@ -1,4 +1,6 @@
'use strict' 'use strict'
import { util } from '@remix-project/remix-lib'
const { toHexPaddedString } = util
import * as traceHelper from './traceHelper' import * as traceHelper from './traceHelper'
export class TraceAnalyser { export class TraceAnalyser {
@ -36,8 +38,8 @@ export class TraceAnalyser {
buildReturnValues (index, step) { buildReturnValues (index, step) {
if (traceHelper.isReturnInstruction(step)) { if (traceHelper.isReturnInstruction(step)) {
let offset = 2 * parseInt(step.stack[step.stack.length - 1], 16) let offset = 2 * parseInt(toHexPaddedString(step.stack[step.stack.length - 1]), 16)
const size = 2 * parseInt(step.stack[step.stack.length - 2], 16) const size = 2 * parseInt(toHexPaddedString(step.stack[step.stack.length - 2]), 16)
const memory = this.trace[this.traceCache.memoryChanges[this.traceCache.memoryChanges.length - 1]].memory const memory = this.trace[this.traceCache.memoryChanges[this.traceCache.memoryChanges.length - 1]].memory
const noOfReturnParams = size / 64 const noOfReturnParams = size / 64
const memoryInString = memory.join('') const memoryInString = memory.join('')
@ -77,11 +79,11 @@ export class TraceAnalyser {
let offset = 0 let offset = 0
let size = 0 let size = 0
if (callStep.op === 'DELEGATECALL') { if (callStep.op === 'DELEGATECALL') {
offset = 2 * parseInt(stack[stack.length - 3], 16) offset = 2 * parseInt(toHexPaddedString(stack[stack.length - 3]), 16)
size = 2 * parseInt(stack[stack.length - 4], 16) size = 2 * parseInt(toHexPaddedString(stack[stack.length - 4]), 16)
} else { } else {
offset = 2 * parseInt(stack[stack.length - 4], 16) offset = 2 * parseInt(toHexPaddedString(stack[stack.length - 4]), 16)
size = 2 * parseInt(stack[stack.length - 5], 16) size = 2 * parseInt(toHexPaddedString(stack[stack.length - 5]), 16)
} }
calldata = '0x' + memory.join('').substr(offset, size) calldata = '0x' + memory.join('').substr(offset, size)
this.traceCache.pushCallDataChanges(index + 1, calldata) this.traceCache.pushCallDataChanges(index + 1, calldata)
@ -104,7 +106,7 @@ export class TraceAnalyser {
} }
this.traceCache.pushStoreChanges(index + 1, context.storageContext[context.storageContext.length - 1]) this.traceCache.pushStoreChanges(index + 1, context.storageContext[context.storageContext.length - 1])
} else if (traceHelper.isSSTOREInstruction(step)) { } else if (traceHelper.isSSTOREInstruction(step)) {
this.traceCache.pushStoreChanges(index + 1, context.storageContext[context.storageContext.length - 1], step.stack[step.stack.length - 1], step.stack[step.stack.length - 2]) this.traceCache.pushStoreChanges(index + 1, context.storageContext[context.storageContext.length - 1], toHexPaddedString(step.stack[step.stack.length - 1]), toHexPaddedString(step.stack[step.stack.length - 2]))
} else if (traceHelper.isReturnInstruction(step) || traceHelper.isStopInstruction(step)) { } else if (traceHelper.isReturnInstruction(step) || traceHelper.isStopInstruction(step)) {
context.storageContext.pop() context.storageContext.pop()
this.traceCache.pushStoreChanges(index + 1, context.storageContext[context.storageContext.length - 1]) this.traceCache.pushStoreChanges(index + 1, context.storageContext[context.storageContext.length - 1])

@ -1,5 +1,6 @@
'use strict' 'use strict'
import { util } from '@remix-project/remix-lib' import { util } from '@remix-project/remix-lib'
const { toHexPaddedString } = util
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase
const { sha3_256 } = util const { sha3_256 } = util
@ -103,8 +104,8 @@ export class TraceCache {
pushContractCreationFromMemory (index, token, trace, lastMemoryChange) { pushContractCreationFromMemory (index, token, trace, lastMemoryChange) {
const memory = trace[lastMemoryChange].memory const memory = trace[lastMemoryChange].memory
const stack = trace[index].stack const stack = trace[index].stack
const offset = 2 * parseInt(stack[stack.length - 2], 16) const offset = 2 * parseInt(toHexPaddedString(stack[stack.length - 2]), 16)
const size = 2 * parseInt(stack[stack.length - 3], 16) const size = 2 * parseInt(toHexPaddedString(stack[stack.length - 3]), 16)
this.contractCreation[token] = '0x' + memory.join('').substr(offset, size) this.contractCreation[token] = '0x' + memory.join('').substr(offset, size)
} }

@ -1,5 +1,6 @@
'use strict' 'use strict'
import { helpers } from '@remix-project/remix-lib' import { helpers, util } from '@remix-project/remix-lib'
const { toHexPaddedString } = util
const { ui } = helpers const { ui } = helpers
// vmTraceIndex has to point to a CALL, CODECALL, ... // vmTraceIndex has to point to a CALL, CODECALL, ...
@ -9,7 +10,7 @@ export function resolveCalledAddress (vmTraceIndex, trace) {
return contractCreationToken(vmTraceIndex) return contractCreationToken(vmTraceIndex)
} else if (isCallInstruction(step)) { } else if (isCallInstruction(step)) {
const stack = step.stack // callcode, delegatecall, ... const stack = step.stack // callcode, delegatecall, ...
return ui.normalizeHexAddress(stack[stack.length - 2]) return ui.normalizeHexAddress(toHexPaddedString(stack[stack.length - 2]))
} }
return undefined return undefined
} }

@ -1,5 +1,6 @@
'use strict' 'use strict'
import { util, execution } from '@remix-project/remix-lib' import { util, execution } from '@remix-project/remix-lib'
const { toHexPaddedString } = util
import { TraceAnalyser } from './traceAnalyser' import { TraceAnalyser } from './traceAnalyser'
import { TraceCache } from './traceCache' import { TraceCache } from './traceCache'
import { TraceStepManager } from './traceStepManager' import { TraceStepManager } from './traceStepManager'
@ -148,9 +149,24 @@ export class TraceManager {
getStackAt (stepIndex) { getStackAt (stepIndex) {
this.checkRequestedStep(stepIndex) this.checkRequestedStep(stepIndex)
if (this.trace[stepIndex] && this.trace[stepIndex].stack) { // there's always a stack if (this.trace[stepIndex] && this.trace[stepIndex].stack) { // there's always a stack
if (Array.isArray(this.trace[stepIndex].stack)) {
const stack = this.trace[stepIndex].stack.slice(0) const stack = this.trace[stepIndex].stack.slice(0)
stack.reverse() stack.reverse()
return stack.map(el => el.startsWith('0x') ? el : '0x' + el) return stack.map(el => toHexPaddedString(el))
} else {
// it's an object coming from the VM.
// for performance reasons,
// we don't turn the stack coming from the VM into an array when the tx is executed
// but now when the app needs it.
const stack = []
for (const prop in this.trace[stepIndex].stack) {
if (prop !== 'length') {
stack.push(toHexPaddedString(this.trace[stepIndex].stack[prop]))
}
}
stack.reverse()
return stack
}
} else { } else {
throw new Error('no stack found') throw new Error('no stack found')
} }

@ -1,5 +1,6 @@
'use strict' 'use strict'
import { BN, bufferToHex, keccak, setLengthLeft, toBuffer, addHexPrefix } from 'ethereumjs-util' import { bufferToHex, keccak, setLengthLeft, toBuffer, addHexPrefix } from 'ethereumjs-util'
import { bigIntToHex } from '@ethereumjs/util'
import stringSimilarity from 'string-similarity' import stringSimilarity from 'string-similarity'
/* /*
@ -35,14 +36,22 @@ export function hexToIntArray (hexString) {
export function hexListFromBNs (bnList) { export function hexListFromBNs (bnList) {
const ret = [] const ret = []
for (const k in bnList) { for (const k in bnList) {
const v = bnList[k] const v = bnList[k].toString(16)
if (BN.isBN(v)) { ret.push('0x' + v.padStart(64, '0'))
ret.push('0x' + v.toString('hex', 64)) }
return ret
}
export function toHexPaddedString(v: bigint | string): string {
if (v) {
if (typeof v === 'string') {
return v.startsWith('0x') ? v : '0x' + v
} else { } else {
ret.push('0x' + (new BN(v)).toString('hex', 64)) // TEMP FIX TO REMOVE ONCE https://github.com/ethereumjs/ethereumjs-vm/pull/293 is released return '0x' + v.toString(16).padStart(64, '0')
} }
} }
return ret else
return '0x' + '0'.padStart(64, '0')
} }
/* /*

@ -20,18 +20,21 @@ program
}) })
program program
.option('-p, --port [port]', 'specify port') .command('start')
.option('-b, --ip [host]', 'specify host') .option('-p, --port [port]', 'specify port', 8545)
.option('-c, --coinbase [coinbase]', 'specify host') .option('-b, --ip [host]', 'specify host', '127.0.0.1')
.option('--rpc', 'run rpc server only') .option('-c, --coinbase [coinbase]', 'specify coinbase', '0x0000000000000000000000000000000000000000')
.option('--details', 'display payloads for every requests and their responses') .option('--rpc', 'run rpc server only', true)
.parse(process.argv) .option('--details', 'display payloads for every requests and their responses', false)
.action(() => {
const Server = require('../src/server') const Server = require('../src/server')
const server = new Server({ const server = new Server({
coinbase: program.coinbase || "0x0000000000000000000000000000000000000000", coinbase: program.coinbase,
rpc: program.rpc, rpc: program.rpc,
logDetails: program.details logDetails: program.details
}) })
server.start(program.host || '127.0.0.1', program.port || 8545) server.start(program.host, program.port)
})
program.parse(process.argv)

@ -1,5 +1,5 @@
import { util } from '@remix-project/remix-lib' import { util } from '@remix-project/remix-lib'
const { hexListFromBNs, formatMemory } = util const { toHexPaddedString, formatMemory } = util
import { helpers } from '@remix-project/remix-lib' import { helpers } from '@remix-project/remix-lib'
const { normalizeHexAddress } = helpers.ui const { normalizeHexAddress } = helpers.ui
import { ConsoleLogs } from '@remix-project/remix-lib' import { ConsoleLogs } from '@remix-project/remix-lib'
@ -240,7 +240,7 @@ export class VmProxy {
previousOpcode.invalidDepthChange = previousOpcode.op !== 'RETURN' && previousOpcode.op !== 'STOP' previousOpcode.invalidDepthChange = previousOpcode.op !== 'RETURN' && previousOpcode.op !== 'STOP'
} }
const step = { const step = {
stack: hexListFromBNs(data.stack), stack: { ...data.stack },
storage: {}, storage: {},
memory: null, memory: null,
op: data.opcode.name, op: data.opcode.name,
@ -249,6 +249,7 @@ export class VmProxy {
gas: data.gasLeft.toString(), gas: data.gasLeft.toString(),
depth: depth depth: depth
} }
step.stack.length = Object.keys(data.stack).length
if (previousOpcode && (previousOpcode.op === 'CALLDATACOPY' || previousOpcode.op === 'CODECOPY' || previousOpcode.op === 'EXTCODECOPY' || previousOpcode.op === 'RETURNDATACOPY' || previousOpcode.op === 'MSTORE' || previousOpcode.op === 'MSTORE8')) { if (previousOpcode && (previousOpcode.op === 'CALLDATACOPY' || previousOpcode.op === 'CODECOPY' || previousOpcode.op === 'EXTCODECOPY' || previousOpcode.op === 'RETURNDATACOPY' || previousOpcode.op === 'MSTORE' || previousOpcode.op === 'MSTORE8')) {
step.memory = data.memory step.memory = data.memory
@ -256,9 +257,8 @@ export class VmProxy {
} }
this.vmTraces[this.processingHash].structLogs.push(step) this.vmTraces[this.processingHash].structLogs.push(step)
// Track hardhat console.log call // Track hardhat console.log call
if (step.op === 'STATICCALL' && step.stack[step.stack.length - 2] === '0x000000000000000000000000000000000000000000636f6e736f6c652e6c6f67') { if (step.op === 'STATICCALL' && toHexPaddedString(step.stack[step.stack.length - 2]) === '0x000000000000000000000000000000000000000000636f6e736f6c652e6c6f67') {
const stackLength = step.stack.length const payloadStart = parseInt(toHexPaddedString(step.stack[step.stack.length - 3]), 16)
const payloadStart = parseInt(step.stack[stackLength - 3], 16)
const memory = formatMemory(data.memory) const memory = formatMemory(data.memory)
const memoryStr = memory.join('') const memoryStr = memory.join('')
let payload = memoryStr.substring(payloadStart * 2, memoryStr.length) let payload = memoryStr.substring(payloadStart * 2, memoryStr.length)
@ -290,7 +290,7 @@ export class VmProxy {
this.processingAddress = '(Contract Creation - Step ' + this.processingIndex + ')' this.processingAddress = '(Contract Creation - Step ' + this.processingIndex + ')'
this.storageCache[this.processingHash][this.processingAddress] = {} this.storageCache[this.processingHash][this.processingAddress] = {}
} else { } else {
this.processingAddress = normalizeHexAddress(step.stack[step.stack.length - 2]) this.processingAddress = normalizeHexAddress(toHexPaddedString(step.stack[step.stack.length - 2]))
this.processingAddress = toChecksumAddress(this.processingAddress) this.processingAddress = toChecksumAddress(this.processingAddress)
if (!this.storageCache[this.processingHash][this.processingAddress]) { if (!this.storageCache[this.processingHash][this.processingAddress]) {
(async (processingHash, processingAddress, self) => { (async (processingHash, processingAddress, self) => {
@ -307,7 +307,7 @@ export class VmProxy {
} }
if (previousOpcode && previousOpcode.op === 'SHA3') { if (previousOpcode && previousOpcode.op === 'SHA3') {
const preimage = this.getSha3Input(previousOpcode.stack, formatMemory(this.lastMemoryUpdate)) const preimage = this.getSha3Input(previousOpcode.stack, formatMemory(this.lastMemoryUpdate))
const imageHash = step.stack[step.stack.length - 1].replace('0x', '') const imageHash = toHexPaddedString(step.stack[step.stack.length - 1]).replace('0x', '')
this.sha3Preimages[imageHash] = { this.sha3Preimages[imageHash] = {
preimage: preimage preimage: preimage
} }
@ -421,26 +421,26 @@ export class VmProxy {
} }
getSha3Input (stack, memory) { getSha3Input (stack, memory) {
let memoryStart = stack[stack.length - 1] const memoryStart = toHexPaddedString(stack[stack.length - 1])
let memoryLength = stack[stack.length - 2] const memoryLength = toHexPaddedString(stack[stack.length - 2])
const memStartDec = (new BN(memoryStart.replace('0x', ''), 16)).toString(10) const memStartDec = (new BN(memoryStart.replace('0x', ''), 16)).toString(10)
memoryStart = parseInt(memStartDec) * 2 const memoryStartInt = parseInt(memStartDec) * 2
const memLengthDec = (new BN(memoryLength.replace('0x', ''), 16).toString(10)) const memLengthDec = (new BN(memoryLength.replace('0x', ''), 16).toString(10))
memoryLength = parseInt(memLengthDec) * 2 const memoryLengthInt = parseInt(memLengthDec) * 2
let i = Math.floor(memoryStart / 32) let i = Math.floor(memoryStartInt / 32)
const maxIndex = Math.floor(memoryLength / 32) + i const maxIndex = Math.floor(memoryLengthInt / 32) + i
if (!memory[i]) { if (!memory[i]) {
return this.emptyFill(memoryLength) return this.emptyFill(memoryLength)
} }
let sha3Input = memory[i].slice(memoryStart - 32 * i) let sha3Input = memory[i].slice(memoryStartInt - 32 * i)
i++ i++
while (i < maxIndex) { while (i < maxIndex) {
sha3Input += memory[i] ? memory[i] : this.emptyFill(32) sha3Input += memory[i] ? memory[i] : this.emptyFill(32)
i++ i++
} }
if (sha3Input.length < memoryLength) { if (sha3Input.length < memoryLength) {
const leftSize = memoryLength - sha3Input.length const leftSize = memoryLengthInt - sha3Input.length
sha3Input += memory[i] ? memory[i].slice(0, leftSize) : this.emptyFill(leftSize) sha3Input += memory[i] ? memory[i].slice(0, leftSize) : this.emptyFill(leftSize)
} }
return sha3Input return sha3Input

@ -31,13 +31,24 @@ function HomeTabLearn ({plugin}: HomeTabLearnProps) {
window.open("https://remix-ide.readthedocs.io/en/latest/remix_tutorials_learneth.html?highlight=learneth#learneth-tutorial-repos", '_blank') window.open("https://remix-ide.readthedocs.io/en/latest/remix_tutorials_learneth.html?highlight=learneth#learneth-tutorial-repos", '_blank')
} }
const startLearnEthTutorial = async (tutorial: 'basics' | 'useofweb3js' | 'deploylibraries') => { const startLearnEthTutorial = async (tutorial: 'basics' | 'soliditybeginner' | 'deploylibraries') => {
await plugin.appManager.activatePlugin(['solidity', 'LearnEth', 'solidityUnitTesting']) await plugin.appManager.activatePlugin(['solidity', 'LearnEth', 'solidityUnitTesting'])
plugin.verticalIcons.select('LearnEth') plugin.verticalIcons.select('LearnEth')
plugin.call('LearnEth', 'startTutorial', 'ethereum/remix-workshops', 'master', tutorial) plugin.call('LearnEth', 'startTutorial', 'ethereum/remix-workshops', 'master', tutorial)
_paq.push(['trackEvent', 'hometab', 'startLearnEthTutorial', tutorial]) _paq.push(['trackEvent', 'hometab', 'startLearnEthTutorial', tutorial])
} }
const goToLearnEthHome = async () => {
if(await plugin.appManager.isActive('LearnEth')) {
plugin.verticalIcons.select('LearnEth')
await plugin.call('LearnEth', 'home')
} else {
await plugin.appManager.activatePlugin(['LearnEth', 'solidity', 'solidityUnitTesting'])
plugin.verticalIcons.select('LearnEth')
await plugin.call('LearnEth', 'home')
}
}
return ( return (
<div className="d-flex px-2 pb-2 pt-2 d-flex flex-column" id="hTLearnSection"> <div className="d-flex px-2 pb-2 pt-2 d-flex flex-column" id="hTLearnSection">
<div className="d-flex justify-content-between"> <div className="d-flex justify-content-between">
@ -46,7 +57,7 @@ function HomeTabLearn ({plugin}: HomeTabLearnProps) {
</label> </label>
<button <button
onClick={ async () => { onClick={ async () => {
await startLearnEthTutorial('basics') await goToLearnEthHome()
}} }}
className="h-100 px-2 pt-0 btn" className="h-100 px-2 pt-0 btn"
> >
@ -74,7 +85,7 @@ function HomeTabLearn ({plugin}: HomeTabLearnProps) {
{(state.visibleTutorial === VisibleTutorial.Intermediate) && <div className="pt-2 d-flex flex-column text-left"> {(state.visibleTutorial === VisibleTutorial.Intermediate) && <div className="pt-2 d-flex flex-column text-left">
<span> <span>
<FormattedMessage id="home.learnEth2Desc" /></span> <FormattedMessage id="home.learnEth2Desc" /></span>
<button className="btn btn-sm btn-secondary mt-2" style={{width: 'fit-content'}} onClick={() => startLearnEthTutorial('useofweb3js')}> <button className="btn btn-sm btn-secondary mt-2" style={{width: 'fit-content'}} onClick={() => startLearnEthTutorial('soliditybeginner')}>
<FormattedMessage id="home.getStarted" /> <FormattedMessage id="home.getStarted" />
</button> </button>
</div>} </div>}

@ -49,6 +49,7 @@
"build:libs": "nx run-many --target=build --parallel=false --with-deps=true --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remix-ws-templates,remixd,ghaction-helper", "build:libs": "nx run-many --target=build --parallel=false --with-deps=true --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remix-ws-templates,remixd,ghaction-helper",
"test:libs": "nx run-many --target=test --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-tests,remix-url-resolver,remixd", "test:libs": "nx run-many --target=test --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-tests,remix-url-resolver,remixd",
"publish:libs": "yarn run build:libs && lerna publish --skip-git && yarn run bumpVersion:libs", "publish:libs": "yarn run build:libs && lerna publish --skip-git && yarn run bumpVersion:libs",
"publishDev:libs": "yarn run build:libs && lerna publish --npm-tag alpha --skip-git && yarn run bumpVersion:libs",
"build:e2e": "node apps/remix-ide-e2e/src/buildGroupTests.js && tsc -p apps/remix-ide-e2e/tsconfig.e2e.json", "build:e2e": "node apps/remix-ide-e2e/src/buildGroupTests.js && tsc -p apps/remix-ide-e2e/tsconfig.e2e.json",
"babel": "babel", "babel": "babel",
"watch:e2e": "nodemon", "watch:e2e": "nodemon",
@ -104,6 +105,7 @@
"nightwatch_local_providers": "yarn run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/providers.test.js --env=chromeDesktop", "nightwatch_local_providers": "yarn run build:e2e && nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js dist/apps/remix-ide-e2e/src/tests/providers.test.js --env=chromeDesktop",
"onchange": "onchange apps/remix-ide/build/app.js -- npm-run-all lint", "onchange": "onchange apps/remix-ide/build/app.js -- npm-run-all lint",
"remixd": "nx build remixd && chmod +x dist/libs/remixd/src/bin/remixd.js && dist/libs/remixd/src/bin/remixd.js --remix-ide http://127.0.0.1:8080", "remixd": "nx build remixd && chmod +x dist/libs/remixd/src/bin/remixd.js && dist/libs/remixd/src/bin/remixd.js --remix-ide http://127.0.0.1:8080",
"simulator": "nx build remix-simulator && chmod +x dist/libs/remix-simulator/bin/ethsim && dist/libs/remix-simulator/bin/ethsim start --rpc",
"selenium": "selenium-standalone start", "selenium": "selenium-standalone start",
"selenium-install": "selenium-standalone install", "selenium-install": "selenium-standalone install",
"sourcemap": "exorcist --root ../ apps/remix-ide/build/app.js.map > apps/remix-ide/build/app.js", "sourcemap": "exorcist --root ../ apps/remix-ide/build/app.js.map > apps/remix-ide/build/app.js",

@ -25404,9 +25404,9 @@ typescript@^4.8.4:
integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==
ua-parser-js@^0.7.30: ua-parser-js@^0.7.30:
version "0.7.31" version "0.7.33"
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.33.tgz#1d04acb4ccef9293df6f70f2c3d22f3030d8b532"
integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== integrity sha512-s8ax/CeZdK9R/56Sui0WM6y9OFREJarMRHqLB2EwkovemBxNQ+Bqu8GAsUnVcXKgphb++ghr/B2BZx4mahujPw==
uglify-js@^2.8.16: uglify-js@^2.8.16:
version "2.8.29" version "2.8.29"

Loading…
Cancel
Save