Use trace API for decentralized transaction list (#2784)
* Using traces when available to get accounts transactions (#2148) * Fixed traceMode detection and transactions rendering (#2148) * [WIP] Use Redux Thunk in main UI => Async Actions (#2148) * Using Redux for Transaction / Block / Methods... (#2148) * Use BigNumber comparedTo function to sort txs (#2148)
This commit is contained in:
committed by
Jaco Greeff
parent
479657b23b
commit
76cded7fa4
@@ -13,6 +13,7 @@
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||
import thunk from 'redux-thunk';
|
||||
|
||||
import ErrorsMiddleware from '../ui/Errors/middleware';
|
||||
import SettingsMiddleware from '../views/Settings/middleware';
|
||||
@@ -32,5 +33,5 @@ export default function (api) {
|
||||
errors.toMiddleware()
|
||||
];
|
||||
|
||||
return middleware.concat(status);
|
||||
return middleware.concat(status, thunk);
|
||||
}
|
||||
|
||||
22
js/src/redux/providers/apiActions.js
Normal file
22
js/src/redux/providers/apiActions.js
Normal file
@@ -0,0 +1,22 @@
|
||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
||||
// This file is part of Parity.
|
||||
|
||||
// Parity is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Parity is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
export function setApi (api) {
|
||||
return {
|
||||
type: 'setApi',
|
||||
api
|
||||
};
|
||||
}
|
||||
26
js/src/redux/providers/apiReducer.js
Normal file
26
js/src/redux/providers/apiReducer.js
Normal file
@@ -0,0 +1,26 @@
|
||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
||||
// This file is part of Parity.
|
||||
|
||||
// Parity is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Parity is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import { handleActions } from 'redux-actions';
|
||||
|
||||
const initialState = {};
|
||||
|
||||
export default handleActions({
|
||||
setApi (state, action) {
|
||||
const { api } = action;
|
||||
return api;
|
||||
}
|
||||
}, initialState);
|
||||
128
js/src/redux/providers/blockchainActions.js
Normal file
128
js/src/redux/providers/blockchainActions.js
Normal file
@@ -0,0 +1,128 @@
|
||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
||||
// This file is part of Parity.
|
||||
|
||||
// Parity is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Parity is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import Contracts from '../../contracts';
|
||||
|
||||
export function setBlock (blockNumber, block) {
|
||||
return {
|
||||
type: 'setBlock',
|
||||
blockNumber, block
|
||||
};
|
||||
}
|
||||
|
||||
export function setTransaction (txHash, info) {
|
||||
return {
|
||||
type: 'setTransaction',
|
||||
txHash, info
|
||||
};
|
||||
}
|
||||
|
||||
export function setBytecode (address, bytecode) {
|
||||
return {
|
||||
type: 'setBytecode',
|
||||
address, bytecode
|
||||
};
|
||||
}
|
||||
|
||||
export function setMethod (signature, method) {
|
||||
return {
|
||||
type: 'setMethod',
|
||||
signature, method
|
||||
};
|
||||
}
|
||||
|
||||
export function fetchBlock (blockNumber) {
|
||||
return (dispatch, getState) => {
|
||||
const { blocks } = getState().blockchain;
|
||||
|
||||
if (blocks[blockNumber.toString()]) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { api } = getState();
|
||||
|
||||
api.eth
|
||||
.getBlockByNumber(blockNumber)
|
||||
.then(block => {
|
||||
dispatch(setBlock(blockNumber, block));
|
||||
})
|
||||
.catch(e => {
|
||||
console.error('blockchain::fetchBlock', e);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
export function fetchTransaction (txHash) {
|
||||
return (dispatch, getState) => {
|
||||
const { transactions } = getState().blockchain;
|
||||
|
||||
if (transactions[txHash]) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { api } = getState();
|
||||
|
||||
api.eth
|
||||
.getTransactionByHash(txHash)
|
||||
.then(info => {
|
||||
dispatch(setTransaction(txHash, info));
|
||||
})
|
||||
.catch(e => {
|
||||
console.error('blockchain::fetchTransaction', e);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
export function fetchBytecode (address) {
|
||||
return (dispatch, getState) => {
|
||||
const { bytecodes } = getState().blockchain;
|
||||
|
||||
if (bytecodes[address]) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { api } = getState();
|
||||
|
||||
api.eth
|
||||
.getCode(address)
|
||||
.then(code => {
|
||||
dispatch(setBytecode(address, code));
|
||||
})
|
||||
.catch(e => {
|
||||
console.error('blockchain::fetchBytecode', e);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
export function fetchMethod (signature) {
|
||||
return (dispatch, getState) => {
|
||||
const { methods } = getState().blockchain;
|
||||
|
||||
if (methods[signature]) {
|
||||
return;
|
||||
}
|
||||
|
||||
Contracts
|
||||
.get()
|
||||
.signatureReg.lookup(signature)
|
||||
.then(method => {
|
||||
dispatch(setMethod(signature, method));
|
||||
})
|
||||
.catch(e => {
|
||||
console.error('blockchain::fetchMethod', e);
|
||||
});
|
||||
};
|
||||
}
|
||||
66
js/src/redux/providers/blockchainReducer.js
Normal file
66
js/src/redux/providers/blockchainReducer.js
Normal file
@@ -0,0 +1,66 @@
|
||||
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
||||
// This file is part of Parity.
|
||||
|
||||
// Parity is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// Parity is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import { handleActions } from 'redux-actions';
|
||||
|
||||
const initialState = {
|
||||
blocks: {},
|
||||
transactions: {},
|
||||
bytecodes: {},
|
||||
methods: {}
|
||||
};
|
||||
|
||||
export default handleActions({
|
||||
setBlock (state, action) {
|
||||
const { blockNumber, block } = action;
|
||||
|
||||
const blocks = Object.assign({}, state.blocks, {
|
||||
[blockNumber.toString()]: block
|
||||
});
|
||||
|
||||
return Object.assign({}, state, { blocks });
|
||||
},
|
||||
|
||||
setTransaction (state, action) {
|
||||
const { txHash, info } = action;
|
||||
|
||||
const transactions = Object.assign({}, state.transactions, {
|
||||
[txHash]: info
|
||||
});
|
||||
|
||||
return Object.assign({}, state, { transactions });
|
||||
},
|
||||
|
||||
setBytecode (state, action) {
|
||||
const { address, bytecode } = action;
|
||||
|
||||
const bytecodes = Object.assign({}, state.bytecodes, {
|
||||
[address]: bytecode
|
||||
});
|
||||
|
||||
return Object.assign({}, state, { bytecodes });
|
||||
},
|
||||
|
||||
setMethod (state, action) {
|
||||
const { signature, method } = action;
|
||||
|
||||
const methods = Object.assign({}, state.methods, {
|
||||
[signature]: method
|
||||
});
|
||||
|
||||
return Object.assign({}, state, { methods });
|
||||
}
|
||||
}, initialState);
|
||||
@@ -19,8 +19,10 @@ export Personal from './personal';
|
||||
export Signer from './signer';
|
||||
export Status from './status';
|
||||
|
||||
export apiReducer from './apiReducer';
|
||||
export balancesReducer from './balancesReducer';
|
||||
export imagesReducer from './imagesReducer';
|
||||
export personalReducer from './personalReducer';
|
||||
export signerReducer from './signerReducer';
|
||||
export statusReducer from './statusReducer';
|
||||
export blockchainReducer from './blockchainReducer';
|
||||
|
||||
@@ -54,6 +54,16 @@ export default class Status {
|
||||
.catch(() => dispatch(false));
|
||||
}
|
||||
|
||||
_pollTraceMode = () => {
|
||||
return this._api.trace.block()
|
||||
.then(blockTraces => {
|
||||
// Assumes not in Trace Mode if no transactions
|
||||
// in latest block...
|
||||
return blockTraces.length > 0;
|
||||
})
|
||||
.catch(() => false);
|
||||
}
|
||||
|
||||
_pollStatus = () => {
|
||||
const { secureToken, isConnected, isConnecting, needsToken } = this._api;
|
||||
const nextTimeout = (timeout = 1000) => {
|
||||
@@ -80,9 +90,10 @@ export default class Status {
|
||||
this._api.ethcore.netPort(),
|
||||
this._api.ethcore.nodeName(),
|
||||
this._api.ethcore.rpcSettings(),
|
||||
this._api.eth.syncing()
|
||||
this._api.eth.syncing(),
|
||||
this._pollTraceMode()
|
||||
])
|
||||
.then(([clientVersion, coinbase, defaultExtraData, extraData, gasFloorTarget, hashrate, minGasPrice, netChain, netPeers, netPort, nodeName, rpcSettings, syncing]) => {
|
||||
.then(([clientVersion, coinbase, defaultExtraData, extraData, gasFloorTarget, hashrate, minGasPrice, netChain, netPeers, netPort, nodeName, rpcSettings, syncing, traceMode]) => {
|
||||
const isTest = netChain === 'morden' || netChain === 'testnet';
|
||||
|
||||
this._store.dispatch(statusCollection({
|
||||
@@ -99,7 +110,8 @@ export default class Status {
|
||||
nodeName,
|
||||
rpcSettings,
|
||||
syncing,
|
||||
isTest
|
||||
isTest,
|
||||
traceMode
|
||||
}));
|
||||
nextTimeout();
|
||||
})
|
||||
|
||||
@@ -41,7 +41,8 @@ const initialState = {
|
||||
syncing: false,
|
||||
isApiConnected: true,
|
||||
isPingConnected: true,
|
||||
isTest: true
|
||||
isTest: false,
|
||||
traceMode: undefined
|
||||
};
|
||||
|
||||
export default handleActions({
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
import { combineReducers } from 'redux';
|
||||
import { routerReducer } from 'react-router-redux';
|
||||
|
||||
import { balancesReducer, imagesReducer, personalReducer, signerReducer, statusReducer as nodeStatusReducer } from './providers';
|
||||
import { apiReducer, balancesReducer, blockchainReducer, imagesReducer, personalReducer, signerReducer, statusReducer as nodeStatusReducer } from './providers';
|
||||
|
||||
import { errorReducer } from '../ui/Errors';
|
||||
import { settingsReducer } from '../views/Settings';
|
||||
@@ -25,12 +25,14 @@ import { tooltipReducer } from '../ui/Tooltips';
|
||||
|
||||
export default function () {
|
||||
return combineReducers({
|
||||
api: apiReducer,
|
||||
errors: errorReducer,
|
||||
tooltip: tooltipReducer,
|
||||
routing: routerReducer,
|
||||
settings: settingsReducer,
|
||||
|
||||
balances: balancesReducer,
|
||||
blockchain: blockchainReducer,
|
||||
images: imagesReducer,
|
||||
nodeStatus: nodeStatusReducer,
|
||||
personal: personalReducer,
|
||||
|
||||
Reference in New Issue
Block a user