Etherscan links based on netVersion identifier (#4772)

* Use netVersion to determine external links

* Update additional isTest references
This commit is contained in:
Jaco Greeff
2017-03-06 08:54:59 +01:00
committed by Gav Wood
parent 944dcdc010
commit 0b24a3d7f6
41 changed files with 217 additions and 175 deletions

View File

@@ -21,8 +21,8 @@ import etherscan from '~/3rdparty/etherscan';
export default class Store {
@observable address = null;
@observable isLoading = false;
@observable isTest = undefined;
@observable isTracing = false;
@observable netVersion = '0';
@observable txHashes = [];
constructor (api) {
@@ -44,8 +44,8 @@ export default class Store {
this.isLoading = isLoading;
}
@action setTest = (isTest) => {
this.isTest = isTest;
@action setNetVersion = (netVersion) => {
this.netVersion = netVersion;
}
@action setTracing = (isTracing) => {
@@ -55,7 +55,7 @@ export default class Store {
@action updateProps = (props) => {
transaction(() => {
this.setAddress(props.address);
this.setTest(props.isTest);
this.setNetVersion(props.netVersion);
// TODO: When tracing is enabled again, adjust to actually set
this.setTracing(false && props.traceMode);
@@ -65,7 +65,7 @@ export default class Store {
}
getTransactions () {
if (this.isTest === undefined) {
if (this.netVersion === '0') {
return Promise.resolve();
}
@@ -87,7 +87,7 @@ export default class Store {
}
fetchEtherscanTransactions () {
return etherscan.account.transactions(this.address, 0, this.isTest);
return etherscan.account.transactions(this.address, 0, false, this.netVersion);
}
fetchTraceTransactions () {

View File

@@ -43,7 +43,7 @@ function mockQuery () {
sort: 'desc'
},
reply: [{ hash: '123' }]
}], true);
}], false, '42');
}
describe('views/Account/Transactions/store', () => {
@@ -94,10 +94,10 @@ describe('views/Account/Transactions/store', () => {
});
});
describe('setTest', () => {
it('sets the isTest flag', () => {
store.setTest(true);
expect(store.isTest).to.be.true;
describe('setNetVersion', () => {
it('sets the netVersion', () => {
store.setNetVersion('testing');
expect(store.netVersion).to.equal('testing');
});
});
@@ -124,7 +124,7 @@ describe('views/Account/Transactions/store', () => {
it('retrieves the hashes via etherscan', () => {
sinon.spy(store, 'fetchEtherscanTransactions');
store.setAddress(ADDRESS);
store.setTest(true);
store.setNetVersion('42');
store.setTracing(false);
return store.getTransactions().then(() => {
@@ -137,7 +137,7 @@ describe('views/Account/Transactions/store', () => {
it('retrieves the hashes via tracing', () => {
sinon.spy(store, 'fetchTraceTransactions');
store.setAddress(ADDRESS);
store.setTest(true);
store.setNetVersion('42');
store.setTracing(true);
return store.getTransactions().then(() => {
@@ -151,7 +151,7 @@ describe('views/Account/Transactions/store', () => {
describe('fetchEtherscanTransactions', () => {
it('retrieves the transactions', () => {
store.setAddress(ADDRESS);
store.setTest(true);
store.setNetVersion('42');
return store.fetchEtherscanTransactions().then((transactions) => {
expect(transactions).to.deep.equal([{
@@ -169,7 +169,7 @@ describe('views/Account/Transactions/store', () => {
describe('fetchTraceTransactions', () => {
it('retrieves the transactions', () => {
store.setAddress(ADDRESS);
store.setTest(true);
store.setNetVersion('42');
return store.fetchTraceTransactions().then((transactions) => {
expect(transactions).to.deep.equal([

View File

@@ -32,7 +32,7 @@ class Transactions extends Component {
static propTypes = {
address: PropTypes.string.isRequired,
isTest: PropTypes.bool,
netVersion: PropTypes.string.isRequired,
traceMode: PropTypes.bool
}
@@ -48,7 +48,7 @@ class Transactions extends Component {
return;
}
const hasChanged = ['isTest', 'address']
const hasChanged = ['address', 'netVersion']
.map(key => newProps[key] !== this.props[key])
.reduce((truth, keyTruth) => truth || keyTruth, false);
@@ -112,10 +112,10 @@ class Transactions extends Component {
}
function mapStateToProps (state) {
const { isTest, traceMode } = state.nodeStatus;
const { netVersion, traceMode } = state.nodeStatus;
return {
isTest,
netVersion,
traceMode
};
}

View File

@@ -36,7 +36,7 @@ function createRedux () {
},
images: {},
nodeStatus: {
isTest: false,
netVersion: '1',
traceMode: false
},
personal: {

View File

@@ -32,8 +32,6 @@ class TabBar extends Component {
};
static propTypes = {
isTest: PropTypes.bool,
netChain: PropTypes.string,
pending: PropTypes.array,
views: PropTypes.array.isRequired
};

View File

@@ -46,8 +46,6 @@ class Application extends Component {
static propTypes = {
blockNumber: PropTypes.object,
children: PropTypes.node,
isTest: PropTypes.bool,
netChain: PropTypes.string,
pending: PropTypes.array
}
@@ -86,7 +84,7 @@ class Application extends Component {
}
renderApp () {
const { blockNumber, children, pending, netChain, isTest } = this.props;
const { blockNumber, children, pending } = this.props;
return (
<Container
@@ -94,11 +92,7 @@ class Application extends Component {
onCloseFirstRun={ this.store.closeFirstrun }
showFirstRun={ this.store.firstrunVisible }
>
<TabBar
netChain={ netChain }
isTest={ isTest }
pending={ pending }
/>
<TabBar pending={ pending } />
<div className={ styles.content }>
{ children }
</div>
@@ -125,15 +119,13 @@ class Application extends Component {
}
function mapStateToProps (state) {
const { blockNumber, netChain, isTest } = state.nodeStatus;
const { blockNumber } = state.nodeStatus;
const { hasAccounts } = state.personal;
const { pending } = state.signer;
return {
blockNumber,
hasAccounts,
isTest,
netChain,
pending
};
}

View File

@@ -32,7 +32,7 @@ export default class Event extends Component {
static propTypes = {
event: PropTypes.object.isRequired,
isTest: PropTypes.bool
netVersion: PropTypes.string.isRequired
}
state = {
@@ -44,11 +44,11 @@ export default class Event extends Component {
}
render () {
const { event, isTest } = this.props;
const { event, netVersion } = this.props;
const { block, transaction } = this.state;
const classes = `${styles.event} ${styles[event.state]}`;
const url = txLink(event.transactionHash, isTest);
const url = txLink(event.transactionHash, false, netVersion);
const keys = Object.keys(event.params).join(', ');
const values = Object.keys(event.params).map((name, index) => {
const param = event.params[name];

View File

@@ -36,9 +36,9 @@ export default class Events extends Component {
};
static propTypes = {
isTest: PropTypes.bool.isRequired,
isLoading: PropTypes.bool,
events: PropTypes.array
events: PropTypes.array,
netVersion: PropTypes.string.isRequired
};
static defaultProps = {
@@ -47,7 +47,7 @@ export default class Events extends Component {
};
render () {
const { events, isTest, isLoading } = this.props;
const { events, isLoading, netVersion } = this.props;
if (isLoading) {
return (
@@ -80,7 +80,7 @@ export default class Events extends Component {
<Event
key={ event.key }
event={ event }
isTest={ isTest }
netVersion={ netVersion }
/>
);
});
@@ -96,7 +96,9 @@ export default class Events extends Component {
</th>
</tr>
</thead>
<tbody>{ list }</tbody>
<tbody>
{ list }
</tbody>
</table>
</Container>
);

View File

@@ -47,7 +47,7 @@ class Contract extends Component {
accountsInfo: PropTypes.object,
balances: PropTypes.object,
contracts: PropTypes.object,
isTest: PropTypes.bool,
netVersion: PropTypes.string.isRequired,
params: PropTypes.object
};
@@ -115,7 +115,7 @@ class Contract extends Component {
}
render () {
const { accountsInfo, balances, contracts, params, isTest } = this.props;
const { accountsInfo, balances, contracts, netVersion, params } = this.props;
const { allEvents, contract, queryValues, loadingEvents } = this.state;
const account = contracts[params.address];
const balance = balances[params.address];
@@ -144,9 +144,9 @@ class Contract extends Component {
values={ queryValues }
/>
<Events
isTest={ isTest }
isLoading={ loadingEvents }
events={ allEvents }
netVersion={ netVersion }
/>
{ this.renderDetails(account) }
</Page>
@@ -518,14 +518,14 @@ class Contract extends Component {
function mapStateToProps (state) {
const { accounts, accountsInfo, contracts } = state.personal;
const { balances } = state.balances;
const { isTest } = state.nodeStatus;
const { netVersion } = state.nodeStatus;
return {
isTest,
accounts,
accountsInfo,
balances,
contracts,
balances
netVersion
};
}

View File

@@ -26,8 +26,7 @@ class AccountLink extends Component {
address: PropTypes.string.isRequired,
className: PropTypes.string,
children: PropTypes.node,
externalLink: PropTypes.string.isRequired,
isTest: PropTypes.bool.isRequired
externalLink: PropTypes.string.isRequired
}
state = {
@@ -35,15 +34,15 @@ class AccountLink extends Component {
};
componentWillMount () {
const { address, externalLink, isTest } = this.props;
const { address, externalLink } = this.props;
this.updateLink(address, externalLink, isTest);
this.updateLink(address, externalLink);
}
componentWillReceiveProps (nextProps) {
const { address, externalLink, isTest } = nextProps;
const { address, externalLink } = nextProps;
this.updateLink(address, externalLink, isTest);
this.updateLink(address, externalLink);
}
render () {
@@ -71,7 +70,7 @@ class AccountLink extends Component {
);
}
updateLink (address, externalLink, isTest) {
updateLink (address, externalLink) {
const { accountAddresses } = this.props;
const isAccount = accountAddresses.includes(address);

View File

@@ -27,7 +27,7 @@ export default class Account extends Component {
className: PropTypes.string,
disabled: PropTypes.bool,
externalLink: PropTypes.string.isRequired,
isTest: PropTypes.bool.isRequired,
netVersion: PropTypes.string.isRequired,
balance: PropTypes.object // eth BigNumber, not required since it mght take time to fetch
};
@@ -53,14 +53,14 @@ export default class Account extends Component {
}
render () {
const { address, disabled, externalLink, isTest, className } = this.props;
const { address, className, disabled, externalLink, netVersion } = this.props;
return (
<div className={ `${styles.acc} ${className}` }>
<AccountLink
address={ address }
externalLink={ externalLink }
isTest={ isTest }
netVersion={ netVersion }
>
<IdentityIcon
center
@@ -83,7 +83,7 @@ export default class Account extends Component {
}
renderName () {
const { address, externalLink, isTest } = this.props;
const { address, externalLink, netVersion } = this.props;
const name = <IdentityName address={ address } empty />;
if (!name) {
@@ -91,7 +91,7 @@ export default class Account extends Component {
<AccountLink
address={ address }
externalLink={ externalLink }
isTest={ isTest }
netVersion={ netVersion }
>
[{ this.shortAddress(address) }]
</AccountLink>
@@ -102,7 +102,7 @@ export default class Account extends Component {
<AccountLink
address={ address }
externalLink={ externalLink }
isTest={ isTest }
netVersion={ netVersion }
>
<span>
<span className={ styles.name }>{ name }</span>

View File

@@ -27,7 +27,7 @@ export default class RequestPending extends Component {
gasLimit: PropTypes.object.isRequired,
id: PropTypes.object.isRequired,
isSending: PropTypes.bool.isRequired,
isTest: PropTypes.bool.isRequired,
netVersion: PropTypes.string.isRequired,
onConfirm: PropTypes.func.isRequired,
onReject: PropTypes.func.isRequired,
origin: PropTypes.object.isRequired,
@@ -45,7 +45,7 @@ export default class RequestPending extends Component {
};
render () {
const { className, date, focus, gasLimit, id, isSending, isTest, onReject, payload, signerstore, origin } = this.props;
const { className, date, focus, gasLimit, id, isSending, netVersion, onReject, payload, signerstore, origin } = this.props;
if (payload.sign) {
const { sign } = payload;
@@ -59,7 +59,7 @@ export default class RequestPending extends Component {
id={ id }
isFinished={ false }
isSending={ isSending }
isTest={ isTest }
netVersion={ netVersion }
onConfirm={ this.onConfirm }
onReject={ onReject }
origin={ origin }
@@ -79,7 +79,7 @@ export default class RequestPending extends Component {
gasLimit={ gasLimit }
id={ id }
isSending={ isSending }
isTest={ isTest }
netVersion={ netVersion }
onConfirm={ this.onConfirm }
onReject={ onReject }
origin={ origin }

View File

@@ -54,8 +54,8 @@ function render (payload) {
date={ new Date() }
gasLimit={ new BigNumber(100000) }
id={ new BigNumber(123) }
isTest={ false }
isSending={ false }
netVersion='42'
onConfirm={ onConfirm }
onReject={ onReject }
origin={ {} }

View File

@@ -46,7 +46,7 @@ export default class SignRequest extends Component {
data: PropTypes.string.isRequired,
id: PropTypes.object.isRequired,
isFinished: PropTypes.bool.isRequired,
isTest: PropTypes.bool.isRequired,
netVersion: PropTypes.string.isRequired,
signerstore: PropTypes.object.isRequired,
className: PropTypes.string,
@@ -106,7 +106,7 @@ export default class SignRequest extends Component {
renderDetails () {
const { api } = this.context;
const { address, isTest, signerstore, data, origin } = this.props;
const { address, data, netVersion, origin, signerstore } = this.props;
const { balances, externalLink } = signerstore;
const balance = balances[address];
@@ -122,7 +122,7 @@ export default class SignRequest extends Component {
address={ address }
balance={ balance }
externalLink={ externalLink }
isTest={ isTest }
netVersion={ netVersion }
/>
<RequestOrigin origin={ origin } />
</div>

View File

@@ -36,7 +36,7 @@ export default class TransactionMainDetails extends Component {
fromBalance: PropTypes.object,
gasStore: PropTypes.object,
id: PropTypes.object.isRequired,
isTest: PropTypes.bool.isRequired,
netVersion: PropTypes.string.isRequired,
origin: PropTypes.any,
totalValue: PropTypes.object.isRequired,
transaction: PropTypes.object.isRequired,
@@ -63,7 +63,7 @@ export default class TransactionMainDetails extends Component {
}
render () {
const { children, disabled, externalLink, from, fromBalance, gasStore, isTest, transaction, origin } = this.props;
const { children, disabled, externalLink, from, fromBalance, gasStore, netVersion, transaction, origin } = this.props;
return (
<div className={ styles.transaction }>
@@ -74,7 +74,7 @@ export default class TransactionMainDetails extends Component {
balance={ fromBalance }
disabled={ disabled }
externalLink={ externalLink }
isTest={ isTest }
netVersion={ netVersion }
/>
</div>
<RequestOrigin origin={ origin } />

View File

@@ -43,7 +43,7 @@ class TransactionPending extends Component {
gasLimit: PropTypes.object,
id: PropTypes.object.isRequired,
isSending: PropTypes.bool.isRequired,
isTest: PropTypes.bool.isRequired,
netVersion: PropTypes.string.isRequired,
nonce: PropTypes.number,
onConfirm: PropTypes.func.isRequired,
onReject: PropTypes.func.isRequired,
@@ -98,7 +98,7 @@ class TransactionPending extends Component {
}
renderTransaction () {
const { accounts, className, focus, id, isSending, isTest, signerstore, transaction, origin } = this.props;
const { accounts, className, focus, id, isSending, netVersion, origin, signerstore, transaction } = this.props;
const { totalValue } = this.state;
const { balances, externalLink } = signerstore;
const { from, value } = transaction;
@@ -116,7 +116,7 @@ class TransactionPending extends Component {
fromBalance={ fromBalance }
gasStore={ this.gasStore }
id={ id }
isTest={ isTest }
netVersion={ netVersion }
origin={ origin }
totalValue={ totalValue }
transaction={ transaction }

View File

@@ -22,17 +22,17 @@ export default class TxHashLink extends Component {
static propTypes = {
children: PropTypes.node,
className: PropTypes.string,
isTest: PropTypes.bool.isRequired,
netVersion: PropTypes.string.isRequired,
txHash: PropTypes.string.isRequired
}
render () {
const { children, className, isTest, txHash } = this.props;
const { children, className, netVersion, txHash } = this.props;
return (
<a
className={ className }
href={ txLink(txHash, isTest) }
href={ txLink(txHash, false, netVersion) }
target='_blank'
>
{ children || txHash }

View File

@@ -39,7 +39,7 @@ class Embedded extends Component {
}).isRequired,
externalLink: PropTypes.string,
gasLimit: PropTypes.object.isRequired,
isTest: PropTypes.bool.isRequired,
netVersion: PropTypes.string.isRequired,
signer: PropTypes.shape({
finished: PropTypes.array.isRequired,
pending: PropTypes.array.isRequired
@@ -80,7 +80,7 @@ class Embedded extends Component {
}
renderPending = (data, index) => {
const { actions, gasLimit, isTest } = this.props;
const { actions, gasLimit, netVersion } = this.props;
const { date, id, isSending, payload, origin } = data;
return (
@@ -91,7 +91,7 @@ class Embedded extends Component {
gasLimit={ gasLimit }
id={ id }
isSending={ isSending }
isTest={ isTest }
netVersion={ netVersion }
key={ id }
onConfirm={ actions.startConfirmRequest }
onReject={ actions.startRejectRequest }
@@ -108,13 +108,13 @@ class Embedded extends Component {
}
function mapStateToProps (state) {
const { gasLimit, isTest } = state.nodeStatus;
const { gasLimit, netVersion } = state.nodeStatus;
const { actions, signer } = state;
return {
actions,
gasLimit,
isTest,
netVersion,
signer
};
}

View File

@@ -40,7 +40,7 @@ class RequestsPage extends Component {
startRejectRequest: PropTypes.func.isRequired
}).isRequired,
gasLimit: PropTypes.object.isRequired,
isTest: PropTypes.bool.isRequired,
netVersion: PropTypes.string.isRequired,
signer: PropTypes.shape({
pending: PropTypes.array.isRequired,
finished: PropTypes.array.isRequired
@@ -106,7 +106,7 @@ class RequestsPage extends Component {
}
renderPending = (data, index) => {
const { actions, gasLimit, isTest } = this.props;
const { actions, gasLimit, netVersion } = this.props;
const { date, id, isSending, payload, origin } = data;
return (
@@ -117,7 +117,7 @@ class RequestsPage extends Component {
gasLimit={ gasLimit }
id={ id }
isSending={ isSending }
isTest={ isTest }
netVersion={ netVersion }
key={ id }
onConfirm={ actions.startConfirmRequest }
onReject={ actions.startRejectRequest }
@@ -130,13 +130,13 @@ class RequestsPage extends Component {
}
function mapStateToProps (state) {
const { gasLimit, isTest } = state.nodeStatus;
const { gasLimit, netVersion } = state.nodeStatus;
const { actions, signer } = state;
return {
actions,
gasLimit,
isTest,
netVersion,
signer
};
}

View File

@@ -37,7 +37,7 @@ class WalletConfirmations extends Component {
static propTypes = {
accounts: PropTypes.object.isRequired,
address: PropTypes.string.isRequired,
isTest: PropTypes.bool.isRequired,
netVersion: PropTypes.string.isRequired,
owners: PropTypes.array.isRequired,
require: PropTypes.object.isRequired,
confirmOperation: PropTypes.func.isRequired,
@@ -115,7 +115,7 @@ class WalletConfirmation extends Component {
accounts: PropTypes.object.isRequired,
confirmation: PropTypes.object.isRequired,
address: PropTypes.string.isRequired,
isTest: PropTypes.bool.isRequired,
netVersion: PropTypes.string.isRequired,
owners: PropTypes.array.isRequired,
require: PropTypes.object.isRequired,
confirmOperation: PropTypes.func.isRequired,
@@ -353,7 +353,7 @@ class WalletConfirmation extends Component {
}
renderTransactionRow (confirmation, className) {
const { address, isTest } = this.props;
const { address, netVersion } = this.props;
const { operation, transactionHash, blockNumber, value, to, data } = confirmation;
if (value && to && data) {
@@ -362,7 +362,7 @@ class WalletConfirmation extends Component {
address={ address }
className={ className }
historic={ false }
isTest={ isTest }
netVersion={ netVersion }
key={ operation }
tx={ {
hash: transactionHash,

View File

@@ -26,7 +26,7 @@ import txListStyles from '~/ui/TxList/txList.css';
export default class WalletTransactions extends Component {
static propTypes = {
address: PropTypes.string.isRequired,
isTest: PropTypes.bool.isRequired,
netVersion: PropTypes.string.isRequired,
transactions: PropTypes.array
};
@@ -51,7 +51,7 @@ export default class WalletTransactions extends Component {
);
}
renderTransactions () {
const { address, isTest, transactions } = this.props;
const { address, netVersion, transactions } = this.props;
if (!transactions) {
return null;
@@ -76,7 +76,7 @@ export default class WalletTransactions extends Component {
return (
<TxRow
address={ address }
isTest={ isTest }
netVersion={ netVersion }
key={ `${transactionHash}_${index}` }
tx={ {
blockNumber,

View File

@@ -37,13 +37,13 @@ import styles from './wallet.css';
class WalletContainer extends Component {
static propTypes = {
isTest: PropTypes.any
netVersion: PropTypes.string.isRequired
};
render () {
const { isTest, ...others } = this.props;
const { netVersion, ...others } = this.props;
if (isTest !== false && isTest !== true) {
if (netVersion === '0') {
return (
<Loading size={ 4 } />
);
@@ -51,7 +51,7 @@ class WalletContainer extends Component {
return (
<Wallet
isTest={ isTest }
netVersion={ netVersion }
{ ...others }
/>
);
@@ -66,7 +66,7 @@ class Wallet extends Component {
static propTypes = {
address: PropTypes.string.isRequired,
balance: nullableProptype(PropTypes.object.isRequired),
isTest: PropTypes.bool.isRequired,
netVersion: PropTypes.string.isRequired,
owned: PropTypes.bool.isRequired,
setVisibleAccounts: PropTypes.func.isRequired,
wallet: PropTypes.object.isRequired,
@@ -181,7 +181,7 @@ class Wallet extends Component {
}
renderDetails () {
const { address, isTest, wallet } = this.props;
const { address, netVersion, wallet } = this.props;
const { owners, require, confirmations, transactions } = wallet;
if (!owners || !require) {
@@ -196,7 +196,7 @@ class Wallet extends Component {
<WalletConfirmations
address={ address }
confirmations={ confirmations }
isTest={ isTest }
netVersion={ netVersion }
key='confirmations'
owners={ owners }
require={ require }
@@ -204,7 +204,7 @@ class Wallet extends Component {
<WalletTransactions
address={ address }
isTest={ isTest }
netVersion={ netVersion }
key='transactions'
transactions={ transactions }
/>
@@ -389,7 +389,7 @@ function mapStateToProps (_, initProps) {
const { address } = initProps.params;
return (state) => {
const { isTest } = state.nodeStatus;
const { netVersion } = state.nodeStatus;
const { accountsInfo = {}, accounts = {} } = state.personal;
const { balances } = state.balances;
const walletAccount = accounts[address] || accountsInfo[address] || null;
@@ -405,7 +405,7 @@ function mapStateToProps (_, initProps) {
return {
address,
balance,
isTest,
netVersion,
owned,
wallet,
walletAccount