From 049705004f306bb83ad1bc0b7315d322becf8263 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Mon, 17 Oct 2016 14:48:25 -0700 Subject: Reproduced issue 743 in test case This contract hex does include the value `f4`, but it was compiled from a contract with no instance of `.delegatecall`. I believe `f4` in this case is part of some other value or contract address, and `ethBinToOps` has some error in how it skips pushed data. @kumavis --- app/scripts/lib/idStore.js | 23 ++++++++++++++--------- test/lib/non-delegate-code.txt | 1 + test/unit/idStore-test.js | 23 ++++++++++++++++++++--- 3 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 test/lib/non-delegate-code.txt diff --git a/app/scripts/lib/idStore.js b/app/scripts/lib/idStore.js index 9d0ca7f19..402a5e612 100644 --- a/app/scripts/lib/idStore.js +++ b/app/scripts/lib/idStore.js @@ -249,15 +249,9 @@ IdentityStore.prototype.addUnconfirmedTransaction = function (txParams, onTxDone if (txParams.to) { query.getCode(txParams.to, function (err, result) { if (err) return cb(err) - var code = ethUtil.toBuffer(result) - if (code !== '0x') { - var ops = ethBinToOps(code) - var containsDelegateCall = ops.some((op) => op.name === 'DELEGATECALL') - txData.containsDelegateCall = containsDelegateCall - cb() - } else { - cb() - } + var containsDelegateCall = this.checkForDelegateCall(result) + txData.containsDelegateCall = containsDelegateCall + cb() }) } else { cb() @@ -282,6 +276,17 @@ IdentityStore.prototype.addUnconfirmedTransaction = function (txParams, onTxDone } } +IdentityStore.prototype.checkForDelegateCall = function (codeHex) { + const code = ethUtil.toBuffer(codeHex) + if (code !== '0x') { + const ops = ethBinToOps(code) + const containsDelegateCall = ops.some((op) => op.name === 'DELEGATECALL') + return containsDelegateCall + } else { + return false + } +} + IdentityStore.prototype.addGasBuffer = function (gasHex) { var gas = new BN(gasHex, 16) var buffer = new BN('100000', 10) diff --git a/test/lib/non-delegate-code.txt b/test/lib/non-delegate-code.txt new file mode 100644 index 000000000..68b0d4dac --- /dev/null +++ b/test/lib/non-delegate-code.txt @@ -0,0 +1 @@ +0x606060405260e060020a60003504637bd703e8811461003157806390b98a111461005c578063f8b2cb4f1461008e575b005b6100b4600435600073f28c53067227848f8145355c455da5cfdd20e3136396e4ee3d6100da84610095565b6100c660043560243533600160a060020a03166000908152602081905260408120548290101561011f57506000610189565b6100b46004355b600160a060020a0381166000908152602081905260409020545b919050565b60408051918252519081900360200190f35b604080519115158252519081900360200190f35b60026040518360e060020a02815260040180838152602001828152602001925050506020604051808303818660325a03f4156100025750506040515191506100af9050565b33600160a060020a0390811660008181526020818152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060015b9291505056 \ No newline at end of file diff --git a/test/unit/idStore-test.js b/test/unit/idStore-test.js index 0a57d2121..c3f79b088 100644 --- a/test/unit/idStore-test.js +++ b/test/unit/idStore-test.js @@ -1,10 +1,15 @@ -var assert = require('assert') -var IdentityStore = require('../../app/scripts/lib/idStore') -var configManagerGen = require('../lib/mock-config-manager') +const assert = require('assert') +const IdentityStore = require('../../app/scripts/lib/idStore') +const configManagerGen = require('../lib/mock-config-manager') +const fs = require('fs') +const path = require('path') const ethUtil = require('ethereumjs-util') const BN = ethUtil.BN const async = require('async') +const nonDelegatePath = path.join(__dirname, '..', 'lib', 'non-delegate-code.txt') +const nonDelegateCode = fs.readFileSync(nonDelegatePath).toString() + describe('IdentityStore', function() { describe('#createNewVault', function () { @@ -156,4 +161,16 @@ describe('IdentityStore', function() { assert.ok(bnResult.gt(gas), 'added more gas as buffer.') assert.equal(result.indexOf('0x'), 0, 'include hex prefix') }) + + describe('#checkForDelegateCall', function() { + const idStore = new IdentityStore({ + configManager: configManagerGen(), + ethStore: { + addAccount(acct) { accounts.push(ethUtil.addHexPrefix(acct)) }, + }, + }) + + var result = idStore.checkForDelegateCall(nonDelegateCode) + assert.equal(result, false, 'no delegate call in provided code') + }) }) -- cgit v1.2.3 From 3af3565000e4952d95c50c1c25a9367ba8caec90 Mon Sep 17 00:00:00 2001 From: kumavis Date: Mon, 24 Oct 2016 16:12:44 -0700 Subject: test - fix delegate-call test --- package.json | 2 +- test/lib/example-code.json | 3 +++ test/lib/non-delegate-code.txt | 1 - test/unit/idStore-test.js | 16 ++++++---------- 4 files changed, 10 insertions(+), 12 deletions(-) create mode 100644 test/lib/example-code.json delete mode 100644 test/lib/non-delegate-code.txt diff --git a/package.json b/package.json index 2af0aebfc..4e1b9e73b 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "dnode": "^1.2.2", "end-of-stream": "^1.1.0", "ensnare": "^1.0.0", - "eth-bin-to-ops": "^1.0.0", + "eth-bin-to-ops": "^1.0.1", "eth-lightwallet": "^2.3.3", "eth-query": "^1.0.3", "eth-store": "^1.1.0", diff --git a/test/lib/example-code.json b/test/lib/example-code.json new file mode 100644 index 000000000..b76d37a4c --- /dev/null +++ b/test/lib/example-code.json @@ -0,0 +1,3 @@ +{ + "delegateCallCode": "0x606060405260e060020a60003504637bd703e8811461003157806390b98a111461005c578063f8b2cb4f1461008e575b005b6100b4600435600073f28c53067227848f8145355c455da5cfdd20e3136396e4ee3d6100da84610095565b6100c660043560243533600160a060020a03166000908152602081905260408120548290101561011f57506000610189565b6100b46004355b600160a060020a0381166000908152602081905260409020545b919050565b60408051918252519081900360200190f35b604080519115158252519081900360200190f35b60026040518360e060020a02815260040180838152602001828152602001925050506020604051808303818660325a03f4156100025750506040515191506100af9050565b33600160a060020a0390811660008181526020818152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060015b9291505056" +} diff --git a/test/lib/non-delegate-code.txt b/test/lib/non-delegate-code.txt deleted file mode 100644 index 68b0d4dac..000000000 --- a/test/lib/non-delegate-code.txt +++ /dev/null @@ -1 +0,0 @@ -0x606060405260e060020a60003504637bd703e8811461003157806390b98a111461005c578063f8b2cb4f1461008e575b005b6100b4600435600073f28c53067227848f8145355c455da5cfdd20e3136396e4ee3d6100da84610095565b6100c660043560243533600160a060020a03166000908152602081905260408120548290101561011f57506000610189565b6100b46004355b600160a060020a0381166000908152602081905260409020545b919050565b60408051918252519081900360200190f35b604080519115158252519081900360200190f35b60026040518360e060020a02815260040180838152602001828152602001925050506020604051808303818660325a03f4156100025750506040515191506100af9050565b33600160a060020a0390811660008181526020818152604080832080548890039055938716808352918490208054870190558351868152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35060015b9291505056 \ No newline at end of file diff --git a/test/unit/idStore-test.js b/test/unit/idStore-test.js index c3f79b088..da465f511 100644 --- a/test/unit/idStore-test.js +++ b/test/unit/idStore-test.js @@ -1,14 +1,10 @@ +const async = require('async') const assert = require('assert') -const IdentityStore = require('../../app/scripts/lib/idStore') -const configManagerGen = require('../lib/mock-config-manager') -const fs = require('fs') -const path = require('path') const ethUtil = require('ethereumjs-util') const BN = ethUtil.BN -const async = require('async') - -const nonDelegatePath = path.join(__dirname, '..', 'lib', 'non-delegate-code.txt') -const nonDelegateCode = fs.readFileSync(nonDelegatePath).toString() +const configManagerGen = require('../lib/mock-config-manager') +const delegateCallCode = require('../lib/example-code.json').delegateCallCode +const IdentityStore = require('../../app/scripts/lib/idStore') describe('IdentityStore', function() { @@ -170,7 +166,7 @@ describe('IdentityStore', function() { }, }) - var result = idStore.checkForDelegateCall(nonDelegateCode) - assert.equal(result, false, 'no delegate call in provided code') + var result = idStore.checkForDelegateCall(delegateCallCode) + assert.equal(result, true, 'no delegate call in provided code') }) }) -- cgit v1.2.3 From b1fb8da3b00b68060443066608dc511a4a836b86 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Tue, 25 Oct 2016 14:16:04 -0700 Subject: Fix provider menu selection indication --- ui/app/app.js | 15 +++++++-------- ui/app/components/drop-menu-item.js | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/ui/app/app.js b/ui/app/app.js index 71e0637d0..ae6fe7071 100644 --- a/ui/app/app.js +++ b/ui/app/app.js @@ -240,6 +240,7 @@ App.prototype.renderNetworkDropdown = function () { action: () => props.dispatch(actions.setProviderType('testnet')), icon: h('.menu-icon.red-dot'), activeNetworkRender: props.network, + provider: props.provider, }), h(DropMenuItem, { @@ -250,13 +251,6 @@ App.prototype.renderNetworkDropdown = function () { activeNetworkRender: props.provider.rpcTarget, }), - h(DropMenuItem, { - label: 'Custom RPC', - closeMenu: () => this.setState({ isNetworkMenuOpen: false }), - action: () => this.props.dispatch(actions.showConfigPage()), - icon: h('i.fa.fa-question-circle.fa-lg'), - }), - this.renderCustomOption(props.provider.rpcTarget), ]) } @@ -508,7 +502,12 @@ App.prototype.toggleMetamaskActive = function () { App.prototype.renderCustomOption = function (rpcTarget) { switch (rpcTarget) { case undefined: - return null + return h(DropMenuItem, { + label: 'Custom RPC', + closeMenu: () => this.setState({ isNetworkMenuOpen: false }), + action: () => this.props.dispatch(actions.showConfigPage()), + icon: h('i.fa.fa-question-circle.fa-lg'), + }) case 'http://localhost:8545': return h(DropMenuItem, { diff --git a/ui/app/components/drop-menu-item.js b/ui/app/components/drop-menu-item.js index 0ca1988c6..8088680c0 100644 --- a/ui/app/components/drop-menu-item.js +++ b/ui/app/components/drop-menu-item.js @@ -42,7 +42,7 @@ DropMenuItem.prototype.activeNetworkRender = function () { if (providerType === 'mainnet') return h('.check', '✓') break case 'Morden Test Network': - if (activeNetwork === '2') return h('.check', '✓') + if (provider.type === 'testnet') return h('.check', '✓') break case 'Localhost 8545': if (activeNetwork === 'http://localhost:8545') return h('.check', '✓') -- cgit v1.2.3 From f2497c5a97b78e4ea8b3c1c47d89e45334626986 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Tue, 25 Oct 2016 14:17:15 -0700 Subject: Bump changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2c442050..e7695defc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ ## Current Master - Add a check for improper Transaction data. +- Fix bug where custom provider selection could show duplicate items. +- Fix bug where connecting to a local morden node would make two providers appear selected. ## 2.13.5 2016-10-18 -- cgit v1.2.3 From bda64ab132e87d4f717f257935a842f7368f0776 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Tue, 25 Oct 2016 14:58:04 -0700 Subject: Fix delegate call analysis Fixed reference allowing transactions to be analyzed for delegate call again. --- CHANGELOG.md | 1 + app/scripts/lib/idStore.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2c442050..0586b8ef1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Current Master - Add a check for improper Transaction data. +- Fix bug that was sometimes preventing transactions from being sent. ## 2.13.5 2016-10-18 diff --git a/app/scripts/lib/idStore.js b/app/scripts/lib/idStore.js index 402a5e612..cb14a5145 100644 --- a/app/scripts/lib/idStore.js +++ b/app/scripts/lib/idStore.js @@ -247,7 +247,7 @@ IdentityStore.prototype.addUnconfirmedTransaction = function (txParams, onTxDone // perform static analyis on the target contract code function analyzeForDelegateCall(cb){ if (txParams.to) { - query.getCode(txParams.to, function (err, result) { + query.getCode(txParams.to, (err, result) => { if (err) return cb(err) var containsDelegateCall = this.checkForDelegateCall(result) txData.containsDelegateCall = containsDelegateCall -- cgit v1.2.3 From 9b8c9707063e71487a00f4ccd74e87fb507de323 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Tue, 25 Oct 2016 16:43:56 -0700 Subject: Update web3.js version --- CHANGELOG.md | 1 + package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2c442050..3a02965be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Current Master - Add a check for improper Transaction data. +- Inject up to date version of web3.js ## 2.13.5 2016-10-18 diff --git a/package.json b/package.json index 4e1b9e73b..88d62db4c 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "three.js": "^0.73.2", "through2": "^2.0.1", "vreme": "^3.0.2", - "web3": "ethereum/web3.js#260ac6e78a8ce4b2e13f5bb0fdb65f4088585876", + "web3": "ethereum/web3.js", "web3-provider-engine": "^8.1.5", "web3-stream-provider": "^2.0.6", "xtend": "^4.0.1" -- cgit v1.2.3 From b3613232a2817ac32d624950164d6269a7ce16e7 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Tue, 25 Oct 2016 16:54:43 -0700 Subject: Rename wallet to account Fixes #762 --- CHANGELOG.md | 1 + app/scripts/lib/idStore.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2c442050..ba3bee37a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Current Master - Add a check for improper Transaction data. +- Now nicknaming new accounts "Account #" instead of "Wallet #" for clarity. ## 2.13.5 2016-10-18 diff --git a/app/scripts/lib/idStore.js b/app/scripts/lib/idStore.js index 402a5e612..6b492e040 100644 --- a/app/scripts/lib/idStore.js +++ b/app/scripts/lib/idStore.js @@ -426,7 +426,7 @@ IdentityStore.prototype._loadIdentities = function () { // // add to ethStore this._ethStore.addAccount(ethUtil.addHexPrefix(address)) // add to identities - const defaultLabel = 'Wallet ' + (i + 1) + const defaultLabel = 'Account ' + (i + 1) const nickname = configManager.nicknameForWallet(address) var identity = { name: nickname || defaultLabel, -- cgit v1.2.3 From 21e73311115504aebb206a24f3084ee304157647 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Tue, 25 Oct 2016 17:41:50 -0700 Subject: Fix delegate call function reference 2 --- app/scripts/lib/idStore.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/scripts/lib/idStore.js b/app/scripts/lib/idStore.js index cb14a5145..27372b3e9 100644 --- a/app/scripts/lib/idStore.js +++ b/app/scripts/lib/idStore.js @@ -249,7 +249,7 @@ IdentityStore.prototype.addUnconfirmedTransaction = function (txParams, onTxDone if (txParams.to) { query.getCode(txParams.to, (err, result) => { if (err) return cb(err) - var containsDelegateCall = this.checkForDelegateCall(result) + var containsDelegateCall = self.checkForDelegateCall(result) txData.containsDelegateCall = containsDelegateCall cb() }) -- cgit v1.2.3 From 84bd8784d01436c505bad4beedafcd5dcbbc5058 Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 26 Oct 2016 11:36:43 -0700 Subject: deps - web3 - set version to 0.17.0-beta --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 88d62db4c..7c6b60a4f 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "three.js": "^0.73.2", "through2": "^2.0.1", "vreme": "^3.0.2", - "web3": "ethereum/web3.js", + "web3": "0.17.0-beta", "web3-provider-engine": "^8.1.5", "web3-stream-provider": "^2.0.6", "xtend": "^4.0.1" -- cgit v1.2.3 From b8acdfcab5166acf43fa3be556e10db0fb0ed3c3 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Wed, 26 Oct 2016 11:48:42 -0700 Subject: Version 2.13.6 --- CHANGELOG.md | 2 ++ app/manifest.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa0fb5a63..893c0d9cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Current Master +## 2.13.6 2016-10-26 + - Add a check for improper Transaction data. - Now nicknaming new accounts "Account #" instead of "Wallet #" for clarity. - Fix bug where custom provider selection could show duplicate items. diff --git a/app/manifest.json b/app/manifest.json index 8f5a34ea6..e35f2918d 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -1,7 +1,7 @@ { "name": "MetaMask", "short_name": "Metamask", - "version": "2.13.5", + "version": "2.13.6", "manifest_version": 2, "author": "https://metamask.io", "description": "Ethereum Browser Extension", -- cgit v1.2.3 From bdaf94059363bb7319534cb152570b43ad3ef97b Mon Sep 17 00:00:00 2001 From: Frankie Date: Wed, 26 Oct 2016 13:42:56 -0700 Subject: Add more info about first use --- library/README.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/library/README.md b/library/README.md index 7dc291564..b6b944051 100644 --- a/library/README.md +++ b/library/README.md @@ -3,4 +3,22 @@ start the dual servers (dapp + mascara) node server.js ``` -open the example dapp at `http://localhost:9002/` \ No newline at end of file +open the example dapp at `http://localhost:9002/` + +*You will need to build MetaMask in order for this to work* +``` +gulp dev +``` +to build MetaMask and have it live reload if you make changes + + +## First time use: + +- navigate to: http://127.0.0.1:9001/popup/popup.html +- Create an Account +- go back too http://localhost:9002/ +- open devTools +- click Sync Tx + +### Todos +- Look into using [Service Workers](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) -- cgit v1.2.3 From 5ae45fe17f4e897b67852f18fd8d2153f23d09eb Mon Sep 17 00:00:00 2001 From: Frankie Date: Wed, 26 Oct 2016 13:43:26 -0700 Subject: Fix the size of the pop-up --- library/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/index.js b/library/index.js index ab341f1f8..e4654128a 100644 --- a/library/index.js +++ b/library/index.js @@ -4,7 +4,7 @@ const setupProvider = require('./lib/setup-provider.js') // // setup web3 // - +console.log('hello world im here') var provider = setupProvider() hijackProvider(provider) var web3 = new Web3(provider) @@ -27,7 +27,7 @@ var shouldPop = false window.addEventListener('click', function(){ if (!shouldPop) return shouldPop = false - window.open('http://127.0.0.1:9001/popup/popup.html', '', 'width=1000') + window.open('http://127.0.0.1:9001/popup/popup.html', '', 'width=360 height=500') console.log('opening window...') }) @@ -41,4 +41,4 @@ function hijackProvider(provider){ } _super(payload, cb) } -} \ No newline at end of file +} -- cgit v1.2.3 From a75edcdc187a3d0fcda6f4e63d3647b7253f0e38 Mon Sep 17 00:00:00 2001 From: Frankie Date: Wed, 26 Oct 2016 13:57:15 -0700 Subject: Fix typos and clean up --- library/README.md | 2 +- library/index.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/library/README.md b/library/README.md index b6b944051..6a6574dbd 100644 --- a/library/README.md +++ b/library/README.md @@ -16,7 +16,7 @@ to build MetaMask and have it live reload if you make changes - navigate to: http://127.0.0.1:9001/popup/popup.html - Create an Account -- go back too http://localhost:9002/ +- go back to http://localhost:9002/ - open devTools - click Sync Tx diff --git a/library/index.js b/library/index.js index e4654128a..b5f4f6637 100644 --- a/library/index.js +++ b/library/index.js @@ -4,7 +4,6 @@ const setupProvider = require('./lib/setup-provider.js') // // setup web3 // -console.log('hello world im here') var provider = setupProvider() hijackProvider(provider) var web3 = new Web3(provider) -- cgit v1.2.3 From d047ba541f3211f692193b2974199cd528bdf894 Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 26 Oct 2016 15:27:38 -0700 Subject: mascara - example dapp - log main account --- library/example/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/example/index.js b/library/example/index.js index b23c15307..4a107df6a 100644 --- a/library/example/index.js +++ b/library/example/index.js @@ -17,7 +17,7 @@ function startApp(){ console.log('getting main account...') web3.eth.getAccounts(function(err, addresses){ if (err) throw err - console.log('set address') + console.log('set address', addresses[0]) primaryAccount = addresses[0] }) -- cgit v1.2.3 From b790b0c256daac5cfb6c94a98fbbea692e3c102e Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 26 Oct 2016 15:29:13 -0700 Subject: mascara - remove global transpile --- library/server.js | 9 --------- package.json | 1 - 2 files changed, 10 deletions(-) diff --git a/library/server.js b/library/server.js index bb0b24e50..797ad8a77 100644 --- a/library/server.js +++ b/library/server.js @@ -80,15 +80,6 @@ function createBundle(entryPoint){ plugin: [watchify], }) - // global transpile - var bablePreset = require.resolve('babel-preset-es2015') - - bundler.transform(babelify, { - global: true, - presets: [bablePreset], - babelrc: false, - }) - bundler.on('update', bundle) bundle() diff --git a/package.json b/package.json index 7c6b60a4f..2ed978cd5 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,6 @@ }, "devDependencies": { "babel-eslint": "^6.0.5", - "babel-preset-es2015": "^6.6.0", "babel-register": "^6.7.2", "babelify": "^7.2.0", "beefy": "^2.1.5", -- cgit v1.2.3