aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkumavis <aaron@kumavis.me>2018-05-17 11:46:34 +0800
committerkumavis <aaron@kumavis.me>2018-05-17 11:46:34 +0800
commit088d7930e0895ef1802823c5fc843dd1c19b9661 (patch)
treea2aed8b980fa44254121021d0529169369d77992
parent708422432c634ffbd4c73388f980c43f766b3355 (diff)
downloaddexon-wallet-088d7930e0895ef1802823c5fc843dd1c19b9661.tar.gz
dexon-wallet-088d7930e0895ef1802823c5fc843dd1c19b9661.tar.zst
dexon-wallet-088d7930e0895ef1802823c5fc843dd1c19b9661.zip
network - create provider and block-tracker via json-rpc-engine
-rw-r--r--app/scripts/controllers/network/createInfuraClient.js34
-rw-r--r--app/scripts/controllers/network/createJsonRpcClient.js35
-rw-r--r--app/scripts/controllers/network/createLocalhostClient.js33
-rw-r--r--app/scripts/controllers/network/createMetamaskMiddleware.js43
-rw-r--r--app/scripts/controllers/network/network.js116
-rw-r--r--app/scripts/controllers/transactions/index.js1
-rw-r--r--app/scripts/controllers/transactions/nonce-tracker.js18
-rw-r--r--app/scripts/metamask-controller.js7
-rw-r--r--package.json4
-rw-r--r--test/unit/nonce-tracker-test.js8
10 files changed, 224 insertions, 75 deletions
diff --git a/app/scripts/controllers/network/createInfuraClient.js b/app/scripts/controllers/network/createInfuraClient.js
new file mode 100644
index 00000000..e346f4bc
--- /dev/null
+++ b/app/scripts/controllers/network/createInfuraClient.js
@@ -0,0 +1,34 @@
+const mergeMiddleware = require('json-rpc-engine/src/mergeMiddleware')
+const createAsyncMiddleware = require('json-rpc-engine/src/createAsyncMiddleware')
+const createBlockRefMiddleware = require('eth-json-rpc-middleware/block-ref')
+const createBlockRefMiddleware = require('eth-json-rpc-middleware/block-cache')
+const BlockTracker = require('eth-block-tracker')
+
+module.exports = createInfuraClient
+
+function createInfuraClient({ network }) {
+ const infuraMiddleware = createInfuraMiddleware({ network })
+ const blockProvider = providerFromMiddleware(infuraMiddleware)
+ const blockTracker = new BlockTracker({ provider: blockProvider })
+
+ const networkMiddleware = mergeMiddleware([
+ createBlockRefMiddleware({ blockTracker }),
+ createBlockCacheMiddleware({ blockTracker }),
+ createInflightMiddleware(),
+ createBlockTrackerInspectorMiddleware({ blockTracker }),
+ infuraMiddleware,
+ ])
+ return { networkMiddleware, blockTracker }
+}
+
+// inspect if response contains a block ref higher than our latest block
+const futureBlockRefRequests = ['eth_getTransactionByHash', 'eth_getTransactionReceipt']
+function createBlockTrackerInspectorMiddleware ({ blockTracker }) {
+ return createAsyncMiddleware(async (req, res, next) => {
+ if (!futureBlockRefRequests.includes(req.method)) return next()
+ await next()
+ const blockNumber = Number.parseInt(res.result.blockNumber, 16)
+ const currentBlockNumber = Number.parseInt(blockTracker.getCurrentBlock(), 16)
+ if (blockNumber > currentBlockNumber) await blockTracker.checkForLatestBlock()
+ })
+}
diff --git a/app/scripts/controllers/network/createJsonRpcClient.js b/app/scripts/controllers/network/createJsonRpcClient.js
new file mode 100644
index 00000000..5a8e85c2
--- /dev/null
+++ b/app/scripts/controllers/network/createJsonRpcClient.js
@@ -0,0 +1,35 @@
+const mergeMiddleware = require('json-rpc-engine/src/mergeMiddleware')
+const createAsyncMiddleware = require('json-rpc-engine/src/createAsyncMiddleware')
+const createFetchMiddleware = require('eth-json-rpc-middleware/fetch')
+const createBlockRefMiddleware = require('eth-json-rpc-middleware/block-ref')
+const createBlockRefMiddleware = require('eth-json-rpc-middleware/block-cache')
+const BlockTracker = require('eth-block-tracker')
+
+module.exports = createJsonRpcClient
+
+function createJsonRpcClient({ rpcUrl }) {
+ const fetchMiddleware = createFetchMiddleware({ rpcUrl })
+ const blockProvider = providerFromMiddleware(fetchMiddleware)
+ const blockTracker = new BlockTracker({ provider: blockProvider })
+
+ const networkMiddleware = mergeMiddleware([
+ createBlockRefMiddleware({ blockTracker }),
+ createBlockCacheMiddleware({ blockTracker }),
+ createInflightMiddleware(),
+ createBlockTrackerInspectorMiddleware({ blockTracker }),
+ fetchMiddleware,
+ ])
+ return { networkMiddleware, blockTracker }
+}
+
+// inspect if response contains a block ref higher than our latest block
+const futureBlockRefRequests = ['eth_getTransactionByHash', 'eth_getTransactionReceipt']
+function createBlockTrackerInspectorMiddleware ({ blockTracker }) {
+ return createAsyncMiddleware(async (req, res, next) => {
+ if (!futureBlockRefRequests.includes(req.method)) return next()
+ await next()
+ const blockNumber = Number.parseInt(res.result.blockNumber, 16)
+ const currentBlockNumber = Number.parseInt(blockTracker.getCurrentBlock(), 16)
+ if (blockNumber > currentBlockNumber) await blockTracker.checkForLatestBlock()
+ })
+}
diff --git a/app/scripts/controllers/network/createLocalhostClient.js b/app/scripts/controllers/network/createLocalhostClient.js
new file mode 100644
index 00000000..40441553
--- /dev/null
+++ b/app/scripts/controllers/network/createLocalhostClient.js
@@ -0,0 +1,33 @@
+const mergeMiddleware = require('json-rpc-engine/src/mergeMiddleware')
+const createAsyncMiddleware = require('json-rpc-engine/src/createAsyncMiddleware')
+const createFetchMiddleware = require('eth-json-rpc-middleware/fetch')
+const createBlockRefMiddleware = require('eth-json-rpc-middleware/block-ref')
+const createBlockRefMiddleware = require('eth-json-rpc-middleware/block-cache')
+const BlockTracker = require('eth-block-tracker')
+
+module.exports = createLocalhostClient
+
+function createLocalhostClient() {
+ const fetchMiddleware = createFetchMiddleware({ rpcUrl: 'http://localhost:8545/' })
+ const blockProvider = providerFromMiddleware(fetchMiddleware)
+ const blockTracker = new BlockTracker({ provider: blockProvider, pollingInterval: 1000 })
+
+ const networkMiddleware = mergeMiddleware([
+ createBlockRefMiddleware({ blockTracker }),
+ createBlockTrackerInspectorMiddleware({ blockTracker }),
+ fetchMiddleware,
+ ])
+ return { networkMiddleware, blockTracker }
+}
+
+// inspect if response contains a block ref higher than our latest block
+const futureBlockRefRequests = ['eth_getTransactionByHash', 'eth_getTransactionReceipt']
+function createBlockTrackerInspectorMiddleware ({ blockTracker }) {
+ return createAsyncMiddleware(async (req, res, next) => {
+ if (!futureBlockRefRequests.includes(req.method)) return next()
+ await next()
+ const blockNumber = Number.parseInt(res.result.blockNumber, 16)
+ const currentBlockNumber = Number.parseInt(blockTracker.getCurrentBlock(), 16)
+ if (blockNumber > currentBlockNumber) await blockTracker.checkForLatestBlock()
+ })
+}
diff --git a/app/scripts/controllers/network/createMetamaskMiddleware.js b/app/scripts/controllers/network/createMetamaskMiddleware.js
new file mode 100644
index 00000000..1974c231
--- /dev/null
+++ b/app/scripts/controllers/network/createMetamaskMiddleware.js
@@ -0,0 +1,43 @@
+const mergeMiddleware = require('json-rpc-engine/src/mergeMiddleware')
+const createScaffoldMiddleware = require('json-rpc-engine/src/scaffold')
+const createAsyncMiddleware = require('json-rpc-engine/src/createAsyncMiddleware')
+const createWalletSubprovider = require('eth-json-rpc-middleware/wallet')
+
+module.exports = createMetamaskMiddleware
+
+function createMetamaskMiddleware({
+ version,
+ getAccounts,
+ processTransaction,
+ processEthSignMessage,
+ processTypedMessage,
+ processPersonalMessage,
+ getPendingNonce
+}) {
+ const metamaskMiddleware = mergeMiddleware([
+ createScaffoldMiddleware({
+ // staticSubprovider
+ eth_syncing: false,
+ web3_clientVersion: `MetaMask/v${version}`,
+ }),
+ createWalletSubprovider({
+ getAccounts,
+ processTransaction,
+ processEthSignMessage,
+ processTypedMessage,
+ processPersonalMessage,
+ }),
+ createPendingNonceMiddleware({ getPendingNonce }),
+ })
+ return metamaskMiddleware
+}
+
+function createPendingNonceMiddleware ({ getPendingNonce }) {
+ return createAsyncMiddleware(async (req, res, next) => {
+ if (req.method !== 'eth_getTransactionCount') return next()
+ const address = req.params[0]
+ const blockRef = req.params[1]
+ if (blockRef !== 'pending') return next()
+ req.result = await getPendingNonce(address)
+ })
+}
diff --git a/app/scripts/controllers/network/network.js b/app/scripts/controllers/network/network.js
index 93fde7c5..c882c7d7 100644
--- a/app/scripts/controllers/network/network.js
+++ b/app/scripts/controllers/network/network.js
@@ -1,14 +1,17 @@
const assert = require('assert')
const EventEmitter = require('events')
-const createMetamaskProvider = require('web3-provider-engine/zero.js')
-const SubproviderFromProvider = require('web3-provider-engine/subproviders/provider.js')
-const createInfuraProvider = require('eth-json-rpc-infura/src/createProvider')
const ObservableStore = require('obs-store')
const ComposedStore = require('obs-store/lib/composed')
const extend = require('xtend')
const EthQuery = require('eth-query')
-const createEventEmitterProxy = require('../../lib/events-proxy.js')
const log = require('loglevel')
+const createMetamaskMiddleware = require('./createMetamaskMiddleware')
+const createInfuraClient = require('./createInfuraClient')
+const createJsonRpcClient = require('./createJsonRpcClient')
+const createLocalhostClient = require('./createLocalhostClient')
+// const createEventEmitterProxy = require('../../lib/events-proxy.js')
+const { createSwappableProxy, createEventEmitterProxy } = require('swappable-obj-proxy')
+
const {
ROPSTEN,
RINKEBY,
@@ -38,21 +41,27 @@ module.exports = class NetworkController extends EventEmitter {
this.providerStore = new ObservableStore(providerConfig)
this.networkStore = new ObservableStore('loading')
this.store = new ComposedStore({ provider: this.providerStore, network: this.networkStore })
- // create event emitter proxy
- this._proxy = createEventEmitterProxy()
-
this.on('networkDidChange', this.lookupNetwork)
+ // provider and block tracker
+ this._provider = null
+ this._blockTracker = null
+ // provider and block tracker proxies - because the network changes
+ this._providerProxy = null
+ this._blockTrackerProxy = null
}
- initializeProvider (_providerParams) {
- this._baseProviderParams = _providerParams
+ initializeProvider (providerParams) {
+ this._baseProviderParams = providerParams
const { type, rpcTarget } = this.providerStore.getState()
this._configureProvider({ type, rpcTarget })
- this._proxy.on('block', this._logBlock.bind(this))
- this._proxy.on('error', this.verifyNetwork.bind(this))
- this.ethQuery = new EthQuery(this._proxy)
this.lookupNetwork()
- return this._proxy
+ }
+
+ // return the proxies so the references will always be good
+ getProviderAndBlockTracker() {
+ const provider = this._providerProxy
+ const blockTracker = this._blockTracker
+ return { provider, blockTracker }
}
verifyNetwork () {
@@ -74,10 +83,11 @@ module.exports = class NetworkController extends EventEmitter {
lookupNetwork () {
// Prevent firing when provider is not defined.
- if (!this.ethQuery || !this.ethQuery.sendAsync) {
- return log.warn('NetworkController - lookupNetwork aborted due to missing ethQuery')
+ if (!this._provider) {
+ return log.warn('NetworkController - lookupNetwork aborted due to missing provider')
}
- this.ethQuery.sendAsync({ method: 'net_version' }, (err, network) => {
+ const ethQuery = new EthQuery(this._provider)
+ ethQuery.sendAsync({ method: 'net_version' }, (err, network) => {
if (err) return this.setNetworkState('loading')
log.info('web3.getNetwork returned ' + network)
this.setNetworkState(network)
@@ -123,7 +133,7 @@ module.exports = class NetworkController extends EventEmitter {
this._configureInfuraProvider(opts)
// other type-based rpc endpoints
} else if (type === LOCALHOST) {
- this._configureStandardProvider({ rpcUrl: LOCALHOST_RPC_URL })
+ this._configureLocalhostProvider()
// url-based rpc endpoints
} else if (type === 'rpc'){
this._configureStandardProvider({ rpcUrl: rpcTarget })
@@ -133,47 +143,47 @@ module.exports = class NetworkController extends EventEmitter {
}
_configureInfuraProvider ({ type }) {
- log.info('_configureInfuraProvider', type)
- const infuraProvider = createInfuraProvider({ network: type })
- const infuraSubprovider = new SubproviderFromProvider(infuraProvider)
- const providerParams = extend(this._baseProviderParams, {
- engineParams: {
- pollingInterval: 8000,
- blockTrackerProvider: infuraProvider,
- },
- dataSubprovider: infuraSubprovider,
- })
- const provider = createMetamaskProvider(providerParams)
- this._setProvider(provider)
+ log.info('NetworkController - configureInfuraProvider', type)
+ const networkClient = createInfuraClient({ network: type })
+ this._setNetworkClient(networkClient)
+ }
+
+ _configureLocalhostProvider () {
+ log.info('NetworkController - configureLocalhostProvider')
+ const networkClient = createLocalhostClient()
+ this._setNetworkClient(networkClient)
}
_configureStandardProvider ({ rpcUrl }) {
- const providerParams = extend(this._baseProviderParams, {
- rpcUrl,
- engineParams: {
- pollingInterval: 8000,
- },
- })
- const provider = createMetamaskProvider(providerParams)
- this._setProvider(provider)
- }
-
- _setProvider (provider) {
- // collect old block tracker events
- const oldProvider = this._provider
- let blockTrackerHandlers
- if (oldProvider) {
- // capture old block handlers
- blockTrackerHandlers = oldProvider._blockTracker.proxyEventHandlers
- // tear down
- oldProvider.removeAllListeners()
- oldProvider.stop()
+ log.info('NetworkController - configureStandardProvider', rpcUrl)
+ const networkClient = createJsonRpcClient({ rpcUrl })
+ this._setNetworkClient(networkClient)
+ }
+
+ _setNetworkClient ({ networkMiddleware, blockTracker }) {
+ const metamaskMiddleware = createMetamaskMiddleware(this._baseProviderParams)
+ const engine = new JsonRpcEngine()
+ engine.push(metamaskMiddleware)
+ engine.push(networkMiddleware)
+ const provider = providerFromEngine(engine)
+ this._setProviderAndBlockTracker({ provider, blockTracker })
+ }
+
+ _setProviderAndBlockTracker ({ provider, blockTracker }) {
+ // update or intialize proxies
+ if (this._providerProxy) {
+ this._providerProxy.setTarget(provider)
+ } else {
+ this._providerProxy = createSwappableProxy(provider)
+ }
+ if (this._blockTrackerProxy) {
+ this._blockTrackerProxy.setTarget(blockTracker)
+ } else {
+ this._blockTrackerProxy = createEventEmitterProxy(blockTracker)
}
- // override block tracler
- provider._blockTracker = createEventEmitterProxy(provider._blockTracker, blockTrackerHandlers)
- // set as new provider
+ // set new provider and blockTracker
this._provider = provider
- this._proxy.setTarget(provider)
+ this._blockTracker = blockTracker
}
_logBlock (block) {
diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js
index 3886db10..cb3d28f1 100644
--- a/app/scripts/controllers/transactions/index.js
+++ b/app/scripts/controllers/transactions/index.js
@@ -63,6 +63,7 @@ class TransactionController extends EventEmitter {
this.store = this.txStateManager.store
this.nonceTracker = new NonceTracker({
provider: this.provider,
+ blockTracker: this.blockTracker,
getPendingTransactions: this.txStateManager.getPendingTransactions.bind(this.txStateManager),
getConfirmedTransactions: this.txStateManager.getConfirmedTransactions.bind(this.txStateManager),
})
diff --git a/app/scripts/controllers/transactions/nonce-tracker.js b/app/scripts/controllers/transactions/nonce-tracker.js
index f8cdc552..490118c8 100644
--- a/app/scripts/controllers/transactions/nonce-tracker.js
+++ b/app/scripts/controllers/transactions/nonce-tracker.js
@@ -12,8 +12,9 @@ const Mutex = require('await-semaphore').Mutex
*/
class NonceTracker {
- constructor ({ provider, getPendingTransactions, getConfirmedTransactions }) {
+ constructor ({ provider, blockTracker, getPendingTransactions, getConfirmedTransactions }) {
this.provider = provider
+ this.blockTracker = blockTracker
this.ethQuery = new EthQuery(provider)
this.getPendingTransactions = getPendingTransactions
this.getConfirmedTransactions = getConfirmedTransactions
@@ -75,11 +76,10 @@ class NonceTracker {
}
async _getCurrentBlock () {
- const blockTracker = this._getBlockTracker()
- const currentBlock = blockTracker.getCurrentBlock()
+ const currentBlock = this.blockTracker.getCurrentBlock()
if (currentBlock) return currentBlock
return await new Promise((reject, resolve) => {
- blockTracker.once('latest', resolve)
+ this.blockTracker.once('latest', resolve)
})
}
@@ -171,16 +171,6 @@ class NonceTracker {
return { name: 'local', nonce: highest, details: { startPoint, highest } }
}
-
- // this is a hotfix for the fact that the blockTracker will
- // change when the network changes
-
- /**
- @returns {Object} the current blockTracker
- */
- _getBlockTracker () {
- return this.provider._blockTracker
- }
}
module.exports = NonceTracker
diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index a6b5d345..7f4f2fc9 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -103,8 +103,9 @@ module.exports = class MetamaskController extends EventEmitter {
this.blacklistController.scheduleUpdates()
// rpc provider
- this.provider = this.initializeProvider()
- this.blockTracker = this.provider._blockTracker
+ this.initializeProvider()
+ this.provider = this.networkController.getProviderAndBlockTracker().provider
+ this.blockTracker = this.networkController.getProviderAndBlockTracker().blockTracker
// token exchange rate tracker
this.tokenRatesController = new TokenRatesController({
@@ -1033,7 +1034,7 @@ module.exports = class MetamaskController extends EventEmitter {
// create filter polyfill middleware
const filterMiddleware = createFilterMiddleware({
provider: this.provider,
- blockTracker: this.provider._blockTracker,
+ blockTracker: this.blockTracker,
})
engine.push(createOriginMiddleware({ origin }))
diff --git a/package.json b/package.json
index f6338c54..4580d072 100644
--- a/package.json
+++ b/package.json
@@ -91,6 +91,7 @@
"ensnare": "^1.0.0",
"eslint-plugin-react": "^7.4.0",
"eth-bin-to-ops": "^1.0.1",
+ "eth-block-tracker": "github:metamask/eth-block-tracker#acbcfda348c309ece0fb96fad78d4861d08f5a91",
"eth-contract-metadata": "^1.1.5",
"eth-hd-keyring": "^1.2.1",
"eth-json-rpc-filters": "^1.2.6",
@@ -129,7 +130,7 @@
"iframe-stream": "^3.0.0",
"inject-css": "^0.1.1",
"jazzicon": "^1.2.0",
- "json-rpc-engine": "^3.6.1",
+ "json-rpc-engine": "^3.7.0",
"json-rpc-middleware-stream": "^1.0.1",
"lodash.debounce": "^4.0.8",
"lodash.memoize": "^4.1.2",
@@ -185,6 +186,7 @@
"shallow-copy": "0.0.1",
"sw-controller": "^1.0.3",
"sw-stream": "^2.0.2",
+ "swappable-obj-proxy": "^1.0.0",
"textarea-caret": "^3.0.1",
"through2": "^2.0.3",
"valid-url": "^1.0.9",
diff --git a/test/unit/nonce-tracker-test.js b/test/unit/nonce-tracker-test.js
index cf26945d..b9e6a594 100644
--- a/test/unit/nonce-tracker-test.js
+++ b/test/unit/nonce-tracker-test.js
@@ -226,14 +226,14 @@ function generateNonceTrackerWith (pending, confirmed, providerStub = '0x0') {
providerResultStub.result = providerStub
const provider = {
sendAsync: (_, cb) => { cb(undefined, providerResultStub) },
- _blockTracker: {
- getCurrentBlock: () => '0x11b568',
- },
+ }
+ const blockTracker = {
+ getCurrentBlock: () => '0x11b568',
}
return new NonceTracker({
provider,
+ blockTracker,
getPendingTransactions,
getConfirmedTransactions,
})
}
-
/span> \ \ | |_|/ / |/| | | | * | | miner: fix data race on setting etherbase/extradataPéter Szilágyi2016-12-132-10/+12 | * | | miner: fix a race between remote agent start/loopPéter Szilágyi2016-12-131-11/+14 |/ / / * | | Merge pull request #3413 from zsfelfoldi/light-topic4Felix Lange2016-12-1321-546/+1913 |\ \ \ | |/ / |/| | | * | les, light: add block availability check for ODR requestsZsolt Felfoldi2016-12-107-14/+71 | * | eth, les: defer starting LES service until ETH initial sync is finishedZsolt Felfoldi2016-12-105-5/+42 | * | les: using random request IDsZsolt Felfoldi2016-12-103-11/+10 | * | les: improved header fetcher and server statisticsZsolt Felfoldi2016-12-1010-481/+812 | * | les: fixed light fetcher request ID matchingZsolt Felfoldi2016-12-082-5/+11 | * | p2p/discv5: search and lookup improvementZsolt Felfoldi2016-12-082-64/+99 | * | les: implement light server poolZsolt Felfoldi2016-12-085-45/+947 * | | Merge pull request #3425 from karalabe/netstats-time-fixupPéter Szilágyi2016-12-121-38/+197 |\ \ \ | * | | ethstats: implement block history retrievalsPéter Szilágyi2016-12-121-38/+190 | * | | ethstats: fix timestamps and add custom proto supportPéter Szilágyi2016-12-121-1/+8 |/ / / * | | build: safe update of PATH on Windows (#3419)bas-vk2016-12-115-3/+164 * | | core: bugfix state change race condition in txpool (#3412)bas-vk2016-12-1112-56/+171 |/ / * | mobile: iOS naming and API fixes for generators and Swift (#3408)Péter Szilágyi2016-12-0815-147/+151 * | core, core/vm: implemented a generic environment (#3348)Jeffrey Wilcke2016-12-0639-1253/+952 * | Merge pull request #3402 from fjl/ethclient-api-fixesFelix Lange2016-12-0612-190/+327 |\ \ | |/ |/| | * ethereum: document use of Removed field for SubscribeFilterLogsFelix Lange2016-12-051-0/+3 | * core, core/vm, eth/filters: move Removed field into vm.LogFelix Lange2016-12-058-165/+252 | * ethclient, ethereum: add NotFound, split transactions out of ChainReaderFelix Lange2016-12-054-23/+67 | * ethclient: use package hexutil for number encodingFelix Lange2016-12-051-2/+2 | * ethclient: don't crash if server returns null uncle headerFelix Lange2016-12-051-0/+3 |/ * whisper/shhapi, whisper/whisperv5: refactoring (#3364)gluk2562016-12-0214-650/+828 * swarm/api: Update ENS root address for Ropsten & prod (#3391)Nick Johnson2016-12-022-5/+4 * Merge pull request #3390 from bas-vk/statsd-stopPéter Szilágyi2016-12-011-1/+9 |\ | * ethstats: check if received event is validBas van Kervel2016-12-011-1/+9 * | README: removed develop mentionsMaran2016-12-011-3/+1 |/ * cmd/geth: tidied up the source (#3385)Péter Szilágyi2016-11-303-133/+174 * Merge pull request #3373 from karalabe/ethstats-block-fieldsPéter Szilágyi2016-11-301-16/+16 |\ | * ethstats: don't drop concurrent head reports (mini forks)Péter Szilágyi2016-11-291-16/+16 * | Merge pull request #3368 from bas-vk/sha3Péter Szilágyi2016-11-301-3/+3 |\ \ | * | node: improve error handling for web3_sha3 RPC methodBas van Kervel2016-11-291-3/+3 * | | eth, miner: removed unnecessary state.Copy()Martin Holst Swende2016-11-303-2/+26 * | | cmd/utils: update helpscreen's testnet description (#3377)Luca Zeug2016-11-291-1/+1 * | | Merge pull request #3376 from karalabe/drop-dao-flagsPéter Szilágyi2016-11-293-88/+17 |\ \ \ | |_|/ |/| | | * | cmd: drop DAO related choice flags since ETC divergedPéter Szilágyi2016-11-293-88/+17 |/ / * | Merge pull request #3370 from karalabe/ethstats-block-fieldsPéter Szilágyi2016-11-291-6/+12 |\ \ | * | ethstats: report block miner, gas limit and gas consumptionPéter Szilágyi2016-11-291-6/+12 |/ / * / core/types: Document Transaction.To (#3366)Steven Roose2016-11-291-0/+2 |/ * VERSION, params: bump unstable version 1.5.5 (#3361)Jeffrey Wilcke2016-11-282-5/+5 * params: stable version 1.5.4 (#3360)Jeffrey Wilcke2016-11-281-4/+4 * eth/filter: add support for pending logs (#3219)bas-vk2016-11-287-92/+319 * common/hexutil: fix Test{Decode,Unmarshal}Uint64 on 32bit arch (#3363)Felix Lange2016-11-282-2/+2 * cmd/bzzd: swarm daemon fixes (#3359)Viktor Trón2016-11-287-46/+56 * Merge pull request #3355 from fjl/hexutil-2Péter Szilágyi2016-11-2817-566/+1125 |\ | * ethclient: "addresses" -> "address" in filter query encodingFelix Lange2016-11-281-1/+1 | * eth/filters: simplify query object decodingFelix Lange2016-11-281-47/+44 | * accounts: don't use common.Address for address fieldFelix Lange2016-11-281-4/+5 | * common: use package hexutil for fixed size type encodingFelix Lange2016-11-282-60/+30 | * ethclient: use package hexutil for JSON handlingFelix Lange2016-11-281-34/+35 | * core/types: use package hexutil for JSON handlingFelix Lange2016-11-286-392/+40 | * core/vm: use package hexutil for JSON handlingFelix Lange2016-11-282-28/+23 | * common/hexutil: new package for 0x hex encodingFelix Lange2016-11-284-0/+947 * | Merge pull request #3362 from karalabe/cocoapods-fix-3000Péter Szilágyi2016-11-282-8/+6 |\ \ | * | build: use single CocoaPods package, pre-release dev buildsPéter Szilágyi2016-11-282-8/+6 |/ / * | light: implemented VMState.Empty() (#3357)Felföldi Zsolt2016-11-282-2/+14 * | build/ci: add swarm related executables (bzzd, bzzup, bzzhash) to binary pack...Viktor Trón2016-11-281-0/+15 |/ * core: fixed unwinding bad hash (#3347)Jeffrey Wilcke2016-11-281-3/+8 * Merge pull request #3356 from fjl/accounts-no-watch-on-windowsPéter Szilágyi2016-11-282-2/+2 |\ | * accounts: disable file system watcher on windowsFelix Lange2016-11-282-2/+2 * | Merge pull request #3352 from fjl/build-git-tagPéter Szilágyi2016-11-281-1/+6 |\ \ | * | internal/build: use 'git tag --points-at' to get the current tagFelix Lange2016-11-281-1/+6 | |/ * / core: eip unit tests (#3309)Jeffrey Wilcke2016-11-281-7/+71 |/ * cmd, ethstats, les, mobile, params: native netstats (#3336)Péter Szilágyi2016-11-258-46/+533 * Merge pull request #3325 from fjl/p2p-netrestrictFelix Lange2016-11-25