Merge branch 'remixd_terminal' of https://github.com/ethereum/remix-project into remixd_terminal

pull/1342/head
davidzagi93@gmail.com 3 years ago
commit 56ac64bf9d
  1. 1
      .circleci/config.yml
  2. 6
      apps/remix-ide-e2e/src/tests/ballot.test.ts
  3. 6
      apps/remix-ide-e2e/src/tests/solidityUnittests.spec.ts
  4. 6
      apps/remix-ide/src/app/tabs/compile-tab.js
  5. 12
      libs/remix-lib/src/web3Provider/web3VmProvider.ts
  6. 2
      libs/remix-simulator/test/blocks.ts
  7. 13
      libs/remix-tests/src/testRunner.ts
  8. 12
      libs/remix-tests/tests/examples_0/assert_ok_without_console_test.sol
  9. 20
      libs/remix-tests/tests/testRunner.cli.spec.ts
  10. 2
      libs/remix-ui/plugin-manager/src/lib/components/LocalPluginForm.tsx
  11. 2
      libs/remix-ui/solidity-compiler/src/lib/logic/compileTabLogic.ts
  12. 1
      libs/remix-url-resolver/package.json
  13. 37
      package-lock.json
  14. 2
      package.json

@ -51,6 +51,7 @@ jobs:
- checkout - checkout
- run: npm install - run: npm install
- run: npm run build:libs - run: npm run build:libs
- run: cd dist/libs/remix-tests && npm install
- run: npm run test:libs - run: npm run test:libs
remix-ide-chrome-1: remix-ide-chrome-1:

@ -56,8 +56,7 @@ module.exports = {
.waitForElementVisible('#stepdetail') .waitForElementVisible('#stepdetail')
.goToVMTraceStep(144) .goToVMTraceStep(144)
.pause(2000) .pause(2000)
// Should be uncommented while fixing https://github.com/ethereum/remix-project/issues/1644 .checkVariableDebug('soliditystate', stateCheck)
// .checkVariableDebug('soliditystate', stateCheck)
.checkVariableDebug('soliditylocals', localsCheck) .checkVariableDebug('soliditylocals', localsCheck)
}, },
@ -125,7 +124,7 @@ const localsCheck = {
type: 'address' type: 'address'
} }
} }
/*
const stateCheck = { const stateCheck = {
chairperson: { chairperson: {
value: '0xCA35B7D915458EF540ADE6068DFE2F44E8FA733C', value: '0xCA35B7D915458EF540ADE6068DFE2F44E8FA733C',
@ -183,7 +182,6 @@ const stateCheck = {
immutable: false immutable: false
} }
} }
*/
const ballotABI = `[ const ballotABI = `[
{ {
"inputs": [ "inputs": [

@ -255,8 +255,7 @@ module.exports = {
.waitForElementContainsText('*[data-id="functionPanel"]', 'checkWinningProposal()', 60000) .waitForElementContainsText('*[data-id="functionPanel"]', 'checkWinningProposal()', 60000)
.waitForElementContainsText('*[data-id="functionPanel"]', 'vote(proposal)', 60000) .waitForElementContainsText('*[data-id="functionPanel"]', 'vote(proposal)', 60000)
.pause(2000) .pause(2000)
// Should be uncommented while fixing https://github.com/ethereum/remix-project/issues/1644 .checkVariableDebug('soliditylocals', locals)
// .checkVariableDebug('soliditylocals', locals)
.clickLaunchIcon('filePanel') .clickLaunchIcon('filePanel')
.pause(2000) .pause(2000)
.openFile('tests/ballotFailedDebug_test.sol') .openFile('tests/ballotFailedDebug_test.sol')
@ -562,7 +561,7 @@ const sources = [
} }
} }
] ]
/*
const locals = { const locals = {
sender: { sender: {
value: { value: {
@ -590,4 +589,3 @@ const locals = {
type: 'uint256' type: 'uint256'
} }
} }
*/

@ -124,7 +124,11 @@ class CompileTab extends CompilerApiMixin(ViewPlugin) { // implements ICompilerA
path: [], path: [],
pattern: [] pattern: []
}) })
this.currentFile = await this.call('fileManager', 'file') try {
this.currentFile = await this.call('fileManager', 'file')
} catch (error) {
if (error.message !== 'Error: No such file or directory No file selected') throw error
}
} }
getCompilerParameters () { getCompilerParameters () {

@ -129,11 +129,7 @@ export class Web3VmProvider {
this.storageCache[this.processingHash] = {} this.storageCache[this.processingHash] = {}
if (data.to) { if (data.to) {
try { try {
// dumpStorage throws error as 'Missing Node in DB' const storage = await this.vm.stateManager.dumpStorage(data.to)
// This can be uncommented once that error is handled
// https://github.com/ethereum/remix-project/issues/1644
// const storage = await this.vm.stateManager.dumpStorage(data.to)
const storage = {}
this.storageCache[this.processingHash][tx['to']] = storage this.storageCache[this.processingHash][tx['to']] = storage
this.lastProcessedStorageTxHash[tx['to']] = this.processingHash this.lastProcessedStorageTxHash[tx['to']] = this.processingHash
} catch (e) { } catch (e) {
@ -249,11 +245,7 @@ export class Web3VmProvider {
if (!this.storageCache[this.processingHash][this.processingAddress]) { if (!this.storageCache[this.processingHash][this.processingAddress]) {
const account = Address.fromString(this.processingAddress) const account = Address.fromString(this.processingAddress)
try { try {
// dumpStorage throws error as 'Missing Node in DB' const storage = await this.vm.stateManager.dumpStorage(account)
// This can be uncommented once that error is handled
// https://github.com/ethereum/remix-project/issues/1644
// const storage = await this.vm.stateManager.dumpStorage(account)
const storage = {}
this.storageCache[this.processingHash][this.processingAddress] = storage this.storageCache[this.processingHash][this.processingAddress] = storage
this.lastProcessedStorageTxHash[this.processingAddress] = this.processingHash this.lastProcessedStorageTxHash[this.processingAddress] = this.processingHash
} catch (e) { } catch (e) {

@ -115,7 +115,6 @@ describe('blocks', () => {
assert.deepEqual(numberTransactions, correctBlock.uncles.length) assert.deepEqual(numberTransactions, correctBlock.uncles.length)
}) })
}) })
/*
describe('eth_getStorageAt', () => { describe('eth_getStorageAt', () => {
it('should get storage at position at given address', async () => { it('should get storage at position at given address', async () => {
const abi: any = [ const abi: any = [
@ -222,7 +221,6 @@ describe('blocks', () => {
assert.deepEqual(storage, '0xc8') assert.deepEqual(storage, '0xc8')
}) })
}) })
*/
describe('eth_call', () => { describe('eth_call', () => {
it('should get a value', async () => { it('should get a value', async () => {
const abi: any = [ const abi: any = [

@ -251,7 +251,6 @@ export function runTest (testName: string, testObject: any, contractDetails: Com
method.call(sendParams).then(async (result) => { method.call(sendParams).then(async (result) => {
const time = (Date.now() - startTime) / 1000.0 const time = (Date.now() - startTime) / 1000.0
let tagTxHash let tagTxHash
let hhLogs
if (web3.eth && web3.eth.getHashFromTagBySimulator) tagTxHash = await web3.eth.getHashFromTagBySimulator(tagTimestamp) if (web3.eth && web3.eth.getHashFromTagBySimulator) tagTxHash = await web3.eth.getHashFromTagBySimulator(tagTimestamp)
if (web3.eth && web3.eth.getHHLogsForTx) hhLogs = await web3.eth.getHHLogsForTx(tagTxHash) if (web3.eth && web3.eth.getHHLogsForTx) hhLogs = await web3.eth.getHHLogsForTx(tagTxHash)
if (result) { if (result) {
@ -262,7 +261,7 @@ export function runTest (testName: string, testObject: any, contractDetails: Com
time: time, time: time,
context: testName context: testName
} }
if (hhLogs) resp.hhLogs = hhLogs if (hhLogs && hhLogs.length) resp.hhLogs = hhLogs
testCallback(undefined, resp) testCallback(undefined, resp)
passingNum += 1 passingNum += 1
timePassed += time timePassed += time
@ -275,7 +274,7 @@ export function runTest (testName: string, testObject: any, contractDetails: Com
errMsg: 'function returned false', errMsg: 'function returned false',
context: testName context: testName
} }
if (hhLogs) resp.hhLogs = hhLogs if (hhLogs && hhLogs.length) resp.hhLogs = hhLogs
testCallback(undefined, resp) testCallback(undefined, resp)
failureNum += 1 failureNum += 1
timePassed += time timePassed += time
@ -325,7 +324,7 @@ export function runTest (testName: string, testObject: any, contractDetails: Com
location, location,
web3 web3
} }
if (hhLogs) resp.hhLogs = hhLogs if (hhLogs && hhLogs.length) resp.hhLogs = hhLogs
testCallback(undefined, resp) testCallback(undefined, resp)
failureNum += 1 failureNum += 1
timePassed += time timePassed += time
@ -344,11 +343,11 @@ export function runTest (testName: string, testObject: any, contractDetails: Com
time: time, time: time,
context: testName context: testName
} }
if (hhLogs) resp.hhLogs = hhLogs if (hhLogs && hhLogs.length) resp.hhLogs = hhLogs
testCallback(undefined, resp) testCallback(undefined, resp)
passingNum += 1 passingNum += 1
timePassed += time timePassed += time
} else if (hhLogs) { } else if (hhLogs && hhLogs.length) {
const resp: TestResultInterface = { const resp: TestResultInterface = {
type: 'logOnly', type: 'logOnly',
value: changeCase.sentenceCase(func.name), value: changeCase.sentenceCase(func.name),
@ -380,7 +379,7 @@ export function runTest (testName: string, testObject: any, contractDetails: Com
if (err.message.includes('Transaction has been reverted by the EVM')) { if (err.message.includes('Transaction has been reverted by the EVM')) {
const txHash = JSON.parse(err.message.replace('Transaction has been reverted by the EVM:', '')).transactionHash const txHash = JSON.parse(err.message.replace('Transaction has been reverted by the EVM:', '')).transactionHash
if (web3.eth && web3.eth.getHHLogsForTx) hhLogs = await web3.eth.getHHLogsForTx(txHash) if (web3.eth && web3.eth.getHHLogsForTx) hhLogs = await web3.eth.getHHLogsForTx(txHash)
if (hhLogs) resp.hhLogs = hhLogs if (hhLogs && hhLogs.length) resp.hhLogs = hhLogs
} }
testCallback(undefined, resp) testCallback(undefined, resp)
failureNum += 1 failureNum += 1

@ -0,0 +1,12 @@
import "remix_tests.sol"; // this import is automatically injected by Remix.
contract AssertOkTest {
function okPassTest() public {
Assert.ok(true, "okPassTest passes");
}
function okFailTest() public {
Assert.ok(false, "okFailTest fails");
}
}

@ -10,7 +10,9 @@ describe('testRunner: remix-tests CLI', () => {
if(result) { if(result) {
const dirContent = result.stdout.toString() const dirContent = result.stdout.toString()
// Install dependencies if 'node_modules' is not already present // Install dependencies if 'node_modules' is not already present
if(!dirContent.includes('node_modules')) execSync('npm install', { cwd: resolve(__dirname + '/../../../dist/libs/remix-tests') }) if(!dirContent.includes('node_modules')) {
execSync('npm install', { cwd: resolve(__dirname + '/../../../dist/libs/remix-tests') })
}
} }
@ -40,7 +42,7 @@ Commands:
}) })
test('remix-tests running a test file', () => { test('remix-tests running a test file', () => {
const res = spawnSync(executablePath, [resolve(__dirname + '/examples_0/assert_ok_test.sol')]) const res = spawnSync(executablePath, [resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines // match initial lines
expect(res.stdout.toString().trim()).toMatch(/:: Running remix-tests - Unit testing for solidity ::/) expect(res.stdout.toString().trim()).toMatch(/:: Running remix-tests - Unit testing for solidity ::/)
expect(res.stdout.toString().trim()).toMatch(/creation of library remix_tests.sol:Assert pending.../) expect(res.stdout.toString().trim()).toMatch(/creation of library remix_tests.sol:Assert pending.../)
@ -55,7 +57,7 @@ Commands:
}) })
test('remix-tests running a test file with custom compiler version', () => { test('remix-tests running a test file with custom compiler version', () => {
const res = spawnSync(executablePath, ['--compiler', '0.7.4', resolve(__dirname + '/examples_0/assert_ok_test.sol')]) const res = spawnSync(executablePath, ['--compiler', '0.7.4', resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines // match initial lines
expect(res.stdout.toString().trim().includes('Compiler version set to 0.7.4. Latest version is')).toBeTruthy() expect(res.stdout.toString().trim().includes('Compiler version set to 0.7.4. Latest version is')).toBeTruthy()
expect(res.stdout.toString().trim().includes('Loading remote solc version v0.7.4+commit.3f05b770 ...')).toBeTruthy() expect(res.stdout.toString().trim().includes('Loading remote solc version v0.7.4+commit.3f05b770 ...')).toBeTruthy()
@ -69,13 +71,13 @@ Commands:
}) })
test('remix-tests running a test file with unavailable custom compiler version (should fail)', () => { test('remix-tests running a test file with unavailable custom compiler version (should fail)', () => {
const res = spawnSync(executablePath, ['--compiler', '1.10.4', resolve(__dirname + '/examples_0/assert_ok_test.sol')]) const res = spawnSync(executablePath, ['--compiler', '1.10.4', resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines // match initial lines
expect(res.stdout.toString().trim().includes('No compiler found in releases with version 1.10.4')).toBeTruthy() expect(res.stdout.toString().trim().includes('No compiler found in releases with version 1.10.4')).toBeTruthy()
}) })
test('remix-tests running a test file with custom EVM', () => { test('remix-tests running a test file with custom EVM', () => {
const res = spawnSync(executablePath, ['--evm', 'petersburg', resolve(__dirname + '/examples_0/assert_ok_test.sol')]) const res = spawnSync(executablePath, ['--evm', 'petersburg', resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines // match initial lines
expect(res.stdout.toString().trim().includes('EVM set to petersburg')).toBeTruthy() expect(res.stdout.toString().trim().includes('EVM set to petersburg')).toBeTruthy()
expect(res.stdout.toString().trim()).toMatch(/:: Running remix-tests - Unit testing for solidity ::/) expect(res.stdout.toString().trim()).toMatch(/:: Running remix-tests - Unit testing for solidity ::/)
@ -88,7 +90,7 @@ Commands:
}) })
test('remix-tests running a test file by enabling optimization', () => { test('remix-tests running a test file by enabling optimization', () => {
const res = spawnSync(executablePath, ['--optimize', 'true', resolve(__dirname + '/examples_0/assert_ok_test.sol')]) const res = spawnSync(executablePath, ['--optimize', 'true', resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines // match initial lines
expect(res.stdout.toString().trim().includes('Optimization is enabled')).toBeTruthy() expect(res.stdout.toString().trim().includes('Optimization is enabled')).toBeTruthy()
expect(res.stdout.toString().trim()).toMatch(/:: Running remix-tests - Unit testing for solidity ::/) expect(res.stdout.toString().trim()).toMatch(/:: Running remix-tests - Unit testing for solidity ::/)
@ -101,7 +103,7 @@ Commands:
}) })
test('remix-tests running a test file by enabling optimization and setting runs', () => { test('remix-tests running a test file by enabling optimization and setting runs', () => {
const res = spawnSync(executablePath, ['--optimize', 'true', '--runs', '300', resolve(__dirname + '/examples_0/assert_ok_test.sol')]) const res = spawnSync(executablePath, ['--optimize', 'true', '--runs', '300', resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines // match initial lines
expect(res.stdout.toString().trim().includes('Optimization is enabled')).toBeTruthy() expect(res.stdout.toString().trim().includes('Optimization is enabled')).toBeTruthy()
expect(res.stdout.toString().trim().includes('Runs set to 300')).toBeTruthy() expect(res.stdout.toString().trim().includes('Runs set to 300')).toBeTruthy()
@ -115,13 +117,13 @@ Commands:
}) })
test('remix-tests running a test file without enabling optimization and setting runs (should fail)', () => { test('remix-tests running a test file without enabling optimization and setting runs (should fail)', () => {
const res = spawnSync(executablePath, ['--runs', '300', resolve(__dirname + '/examples_0/assert_ok_test.sol')]) const res = spawnSync(executablePath, ['--runs', '300', resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines // match initial lines
expect(res.stdout.toString().trim().includes('Optimization should be enabled for runs')).toBeTruthy() expect(res.stdout.toString().trim().includes('Optimization should be enabled for runs')).toBeTruthy()
}) })
test('remix-tests running a test file with all options', () => { test('remix-tests running a test file with all options', () => {
const res = spawnSync(executablePath, ['--compiler', '0.7.5', '--evm', 'istanbul', '--optimize', 'true', '--runs', '250', resolve(__dirname + '/examples_0/assert_ok_test.sol')]) const res = spawnSync(executablePath, ['--compiler', '0.7.5', '--evm', 'istanbul', '--optimize', 'true', '--runs', '250', resolve(__dirname + '/examples_0/assert_ok_without_console_test.sol')])
// match initial lines // match initial lines
expect(res.stdout.toString().trim().includes('Compiler version set to 0.7.5. Latest version is')).toBeTruthy() expect(res.stdout.toString().trim().includes('Compiler version set to 0.7.5. Latest version is')).toBeTruthy()
expect(res.stdout.toString().trim().includes('Loading remote solc version v0.7.5+commit.eb77ed08 ...')).toBeTruthy() expect(res.stdout.toString().trim().includes('Loading remote solc version v0.7.5+commit.eb77ed08 ...')).toBeTruthy()

@ -52,7 +52,7 @@ function LocalPluginForm ({ closeModal, visible, pluginManager }: LocalPluginFor
setMethods(Array.isArray(storagePlugin.methods) ? storagePlugin.methods.join(',') : storagePlugin.methods) setMethods(Array.isArray(storagePlugin.methods) ? storagePlugin.methods.join(',') : storagePlugin.methods)
setType(storagePlugin.type) setType(storagePlugin.type)
setDisplayName(storagePlugin.displayName) setDisplayName(storagePlugin.displayName)
setCanactivate(Array.isArray(storagePlugin.canActivate) ? storagePlugin.canActivate.join(',') : storagePlugin.canActivate) setCanactivate(Array.isArray(storagePlugin.canActivate) ? storagePlugin.canActivate.join(',') : storagePlugin.canActivate || '')
}, []) }, [])
const handleModalOkClick = async () => { const handleModalOkClick = async () => {

@ -80,6 +80,7 @@ export class CompileTabLogic {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.api.readFile(target).then((content) => { this.api.readFile(target).then((content) => {
const sources = { [target]: { content } } const sources = { [target]: { content } }
this.event.emit('removeAnnotations')
this.event.emit('startingCompilation') this.event.emit('startingCompilation')
// setTimeout fix the animation on chrome... (animation triggered by 'staringCompilation') // setTimeout fix the animation on chrome... (animation triggered by 'staringCompilation')
setTimeout(() => { this.compiler.compile(sources, target); resolve(true) }, 100) setTimeout(() => { this.compiler.compile(sources, target); resolve(true) }, 100)
@ -122,7 +123,6 @@ export class CompileTabLogic {
} }
// TODO readd saving current file // TODO readd saving current file
this.api.saveCurrentFile() this.api.saveCurrentFile()
this.event.emit('removeAnnotations')
var currentFile = this.api.currentFile var currentFile = this.api.currentFile
return this.compileFile(currentFile) return this.compileFile(currentFile)
} catch (err) { } catch (err) {

@ -26,7 +26,6 @@
"dependencies": { "dependencies": {
"@erebos/bzz-node": "^0.13.0", "@erebos/bzz-node": "^0.13.0",
"axios": ">=0.21.1", "axios": ">=0.21.1",
"solc": "^0.7.4",
"url": "^0.11.0", "url": "^0.11.0",
"valid-url": "^1.0.9" "valid-url": "^1.0.9"
}, },

37
package-lock.json generated

@ -2566,11 +2566,11 @@
} }
}, },
"@ethereumjs/blockchain": { "@ethereumjs/blockchain": {
"version": "5.4.1", "version": "5.4.2",
"resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.4.1.tgz", "resolved": "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.4.2.tgz",
"integrity": "sha512-PVNgVG4W79FZ8HacpYQkNleFsjqUbHnAW61+QFUL9LfK6MKddB5TBHcw3sE4AoXToWGq/UFpuBaaq1G0VBxM0g==", "integrity": "sha512-AOAAwz/lw2lciG9gf5wHi7M/qknraXXnLR66lYgbQ04qfyFC3ZE5x/5rLVm1Vu+kfJLlKrYZTmA0IbOkc7kvgw==",
"requires": { "requires": {
"@ethereumjs/block": "^3.5.0", "@ethereumjs/block": "^3.5.1",
"@ethereumjs/common": "^2.5.0", "@ethereumjs/common": "^2.5.0",
"@ethereumjs/ethash": "^1.1.0", "@ethereumjs/ethash": "^1.1.0",
"debug": "^2.2.0", "debug": "^2.2.0",
@ -31110,9 +31110,9 @@
} }
}, },
"merge": { "merge": {
"version": "1.2.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz",
"integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==" "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w=="
}, },
"merge-descriptors": { "merge-descriptors": {
"version": "1.0.1", "version": "1.0.1",
@ -31158,17 +31158,32 @@
"dev": true "dev": true
}, },
"merkle-patricia-tree": { "merkle-patricia-tree": {
"version": "4.2.1", "version": "4.2.2",
"resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.1.tgz", "resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.2.tgz",
"integrity": "sha512-25reMgrT8PhJy0Ba0U7fMZD2oobS1FPWB9vQa0uBpJYIQYYuFXEHoqEkTqA/UzX+s9br3pmUVVY/TOsFt/x0oQ==", "integrity": "sha512-eqZYNTshcYx9aESkSPr71EqwsR/QmpnObDEV4iLxkt/x/IoLYZYjJvKY72voP/27Vy61iMOrfOG6jrn7ttXD+Q==",
"requires": { "requires": {
"@types/levelup": "^4.3.0", "@types/levelup": "^4.3.0",
"ethereumjs-util": "^7.1.0", "ethereumjs-util": "^7.1.2",
"level-mem": "^5.0.1", "level-mem": "^5.0.1",
"level-ws": "^2.0.0", "level-ws": "^2.0.0",
"readable-stream": "^3.6.0", "readable-stream": "^3.6.0",
"rlp": "^2.2.4", "rlp": "^2.2.4",
"semaphore-async-await": "^1.5.1" "semaphore-async-await": "^1.5.1"
},
"dependencies": {
"ethereumjs-util": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.2.tgz",
"integrity": "sha512-xCV3PTAhW8Q2k88XZn9VcO4OrjpeXAlDm5LQTaOLp81SjNSSY6+MwuGXrx6vafOMheWSmZGxIXUbue5e9UvUBw==",
"requires": {
"@types/bn.js": "^5.1.0",
"bn.js": "^5.1.2",
"create-hash": "^1.1.2",
"ethereum-cryptography": "^0.1.3",
"ethjs-util": "0.1.6",
"rlp": "^2.2.4"
}
}
} }
}, },
"methods": { "methods": {

@ -171,7 +171,7 @@
"jquery": "^3.3.1", "jquery": "^3.3.1",
"jszip": "^3.6.0", "jszip": "^3.6.0",
"latest-version": "^5.1.0", "latest-version": "^5.1.0",
"merge": "^1.2.0", "merge": "^2.1.1",
"npm-install-version": "^6.0.2", "npm-install-version": "^6.0.2",
"react": "^17.0.2", "react": "^17.0.2",
"react-beautiful-dnd": "^13.1.0", "react-beautiful-dnd": "^13.1.0",

Loading…
Cancel
Save