refactor etherscan.io links (#2896)
* use proper querystring builder * etherscan.txLink helper * refactor to etherscan.txLink * etherscan.addressLink helper * refactor to etherscan.addressLink * move txLink & addressLink into common file
This commit is contained in:
parent
222b2b70ea
commit
86c0dbeedc
@ -125,6 +125,7 @@
|
|||||||
"material-ui": "^0.16.1",
|
"material-ui": "^0.16.1",
|
||||||
"material-ui-chip-input": "^0.8.0",
|
"material-ui-chip-input": "^0.8.0",
|
||||||
"moment": "^2.14.1",
|
"moment": "^2.14.1",
|
||||||
|
"qs": "^6.3.0",
|
||||||
"react": "^15.2.1",
|
"react": "^15.2.1",
|
||||||
"react-addons-css-transition-group": "^15.2.1",
|
"react-addons-css-transition-group": "^15.2.1",
|
||||||
"react-dom": "^15.2.1",
|
"react-dom": "^15.2.1",
|
||||||
|
17
js/src/3rdparty/etherscan/call.js
vendored
17
js/src/3rdparty/etherscan/call.js
vendored
@ -14,6 +14,8 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import { stringify } from 'qs';
|
||||||
|
|
||||||
const options = {
|
const options = {
|
||||||
method: 'GET',
|
method: 'GET',
|
||||||
headers: {
|
headers: {
|
||||||
@ -23,19 +25,14 @@ const options = {
|
|||||||
|
|
||||||
export function call (module, action, _params, test) {
|
export function call (module, action, _params, test) {
|
||||||
const host = test ? 'testnet.etherscan.io' : 'api.etherscan.io';
|
const host = test ? 'testnet.etherscan.io' : 'api.etherscan.io';
|
||||||
let params = '';
|
|
||||||
|
|
||||||
if (_params) {
|
const query = stringify(Object.assign({
|
||||||
Object.keys(_params).map((param) => {
|
module, action
|
||||||
const value = _params[param];
|
}, _params || {}));
|
||||||
|
|
||||||
params = `${params}&${param}=${value}`;
|
return fetch(`https://${host}/api?${query}`, options)
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return fetch(`http://${host}/api?module=${module}&action=${action}${params}`, options)
|
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
if (response.status !== 200) {
|
if (!response.ok) {
|
||||||
throw { code: response.status, message: response.statusText }; // eslint-disable-line
|
throw { code: response.status, message: response.statusText }; // eslint-disable-line
|
||||||
}
|
}
|
||||||
|
|
||||||
|
5
js/src/3rdparty/etherscan/index.js
vendored
5
js/src/3rdparty/etherscan/index.js
vendored
@ -16,10 +16,13 @@
|
|||||||
|
|
||||||
import { account } from './account';
|
import { account } from './account';
|
||||||
import { stats } from './stats';
|
import { stats } from './stats';
|
||||||
|
import { txLink, addressLink } from './links';
|
||||||
|
|
||||||
const etherscan = {
|
const etherscan = {
|
||||||
account: account,
|
account: account,
|
||||||
stats: stats
|
stats: stats,
|
||||||
|
txLink: txLink,
|
||||||
|
addressLink: addressLink
|
||||||
};
|
};
|
||||||
|
|
||||||
export default etherscan;
|
export default etherscan;
|
||||||
|
@ -14,8 +14,10 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
// links to chain explorers
|
export const txLink = (hash, isTestnet = false) => {
|
||||||
export const BASE_LINK_ACCOUNT_MORDEN = 'https://testnet.etherscan.io/address/';
|
return `https://${isTestnet ? 'testnet.' : ''}etherscan.io/tx/${hash}`;
|
||||||
export const BASE_LINK_ACCOUNT_HOMESTEAD = 'https://etherscan.io/address/';
|
};
|
||||||
export const BASE_LINK_TX_MORDEN = 'https://testnet.etherscan.io/tx/';
|
|
||||||
export const BASE_LINK_TX_HOMESTEAD = 'https://etherscan.io/tx/';
|
export const addressLink = (address, isTestnet = false) => {
|
||||||
|
return `https://${isTestnet ? 'testnet.' : ''}etherscan.io/address/${address}`;
|
||||||
|
};
|
@ -19,6 +19,7 @@ import React, { Component, PropTypes } from 'react';
|
|||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { bindActionCreators } from 'redux';
|
import { bindActionCreators } from 'redux';
|
||||||
import { LinearProgress } from 'material-ui';
|
import { LinearProgress } from 'material-ui';
|
||||||
|
import { txLink } from '../../3rdparty/etherscan/links';
|
||||||
|
|
||||||
import styles from './txHash.css';
|
import styles from './txHash.css';
|
||||||
|
|
||||||
@ -55,7 +56,6 @@ class TxHash extends Component {
|
|||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { hash, isTest } = this.props;
|
const { hash, isTest } = this.props;
|
||||||
const link = `https://${isTest ? 'testnet.' : ''}etherscan.io/tx/${hash}`;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={ styles.details }>
|
<div className={ styles.details }>
|
||||||
@ -63,7 +63,7 @@ class TxHash extends Component {
|
|||||||
The transaction has been posted to the network with a transaction hash of
|
The transaction has been posted to the network with a transaction hash of
|
||||||
</div>
|
</div>
|
||||||
<div className={ styles.hash }>
|
<div className={ styles.hash }>
|
||||||
<a href={ link } target='_blank'>{ hash }</a>
|
<a href={ txLink(hash, isTest) } target='_blank'>{ hash }</a>
|
||||||
</div>
|
</div>
|
||||||
{ this.renderConfirmations() }
|
{ this.renderConfirmations() }
|
||||||
</div>
|
</div>
|
||||||
|
@ -23,6 +23,7 @@ import { bindActionCreators } from 'redux';
|
|||||||
import { fetchBlock, fetchTransaction } from '../../../../redux/providers/blockchainActions';
|
import { fetchBlock, fetchTransaction } from '../../../../redux/providers/blockchainActions';
|
||||||
|
|
||||||
import { IdentityIcon, IdentityName, MethodDecoding } from '../../../../ui';
|
import { IdentityIcon, IdentityName, MethodDecoding } from '../../../../ui';
|
||||||
|
import { txLink, addressLink } from '../../../../3rdparty/etherscan/links';
|
||||||
|
|
||||||
import styles from '../transactions.css';
|
import styles from '../transactions.css';
|
||||||
|
|
||||||
@ -55,9 +56,7 @@ class Transaction extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { block, transaction, isTest } = this.props;
|
const { block, transaction } = this.props;
|
||||||
|
|
||||||
const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<tr>
|
<tr>
|
||||||
@ -65,9 +64,9 @@ class Transaction extends Component {
|
|||||||
<div>{ this.formatBlockTimestamp(block) }</div>
|
<div>{ this.formatBlockTimestamp(block) }</div>
|
||||||
<div>{ this.formatNumber(transaction.blockNumber) }</div>
|
<div>{ this.formatNumber(transaction.blockNumber) }</div>
|
||||||
</td>
|
</td>
|
||||||
{ this.renderAddress(prefix, transaction.from) }
|
{ this.renderAddress(transaction.from) }
|
||||||
{ this.renderTransaction() }
|
{ this.renderTransaction() }
|
||||||
{ this.renderAddress(prefix, transaction.to) }
|
{ this.renderAddress(transaction.to) }
|
||||||
<td className={ styles.method }>
|
<td className={ styles.method }>
|
||||||
{ this.renderMethod() }
|
{ this.renderMethod() }
|
||||||
</td>
|
</td>
|
||||||
@ -93,15 +92,16 @@ class Transaction extends Component {
|
|||||||
renderTransaction () {
|
renderTransaction () {
|
||||||
const { transaction, isTest } = this.props;
|
const { transaction, isTest } = this.props;
|
||||||
|
|
||||||
const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`;
|
|
||||||
const hashLink = `${prefix}tx/${transaction.hash}`;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<td className={ styles.transaction }>
|
<td className={ styles.transaction }>
|
||||||
{ this.renderEtherValue() }
|
{ this.renderEtherValue() }
|
||||||
<div>⇒</div>
|
<div>⇒</div>
|
||||||
<div>
|
<div>
|
||||||
<a href={ hashLink } target='_blank' className={ styles.link }>
|
<a
|
||||||
|
className={ styles.link }
|
||||||
|
href={ txLink(transaction.hash, isTest) }
|
||||||
|
target='_blank'
|
||||||
|
>
|
||||||
{ this.formatHash(transaction.hash) }
|
{ this.formatHash(transaction.hash) }
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@ -109,10 +109,12 @@ class Transaction extends Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
renderAddress (prefix, address) {
|
renderAddress (address) {
|
||||||
|
const { isTest } = this.props;
|
||||||
|
|
||||||
const eslink = address ? (
|
const eslink = address ? (
|
||||||
<a
|
<a
|
||||||
href={ `${prefix}address/${address}` }
|
href={ addressLink(address, isTest) }
|
||||||
target='_blank'
|
target='_blank'
|
||||||
className={ styles.link }>
|
className={ styles.link }>
|
||||||
<IdentityName address={ address } shorten />
|
<IdentityName address={ address } shorten />
|
||||||
|
@ -22,6 +22,7 @@ import { bindActionCreators } from 'redux';
|
|||||||
|
|
||||||
import { fetchBlock, fetchTransaction } from '../../../../redux/providers/blockchainActions';
|
import { fetchBlock, fetchTransaction } from '../../../../redux/providers/blockchainActions';
|
||||||
import { IdentityIcon, IdentityName, Input, InputAddress } from '../../../../ui';
|
import { IdentityIcon, IdentityName, Input, InputAddress } from '../../../../ui';
|
||||||
|
import { txLink } from '../../../../3rdparty/etherscan/links';
|
||||||
|
|
||||||
import styles from '../../contract.css';
|
import styles from '../../contract.css';
|
||||||
|
|
||||||
@ -49,7 +50,7 @@ class Event extends Component {
|
|||||||
const block = blocks[event.blockNumber.toString()];
|
const block = blocks[event.blockNumber.toString()];
|
||||||
const transaction = transactions[event.transactionHash] || {};
|
const transaction = transactions[event.transactionHash] || {};
|
||||||
const classes = `${styles.event} ${styles[event.state]}`;
|
const classes = `${styles.event} ${styles[event.state]}`;
|
||||||
const url = `https://${isTest ? 'testnet.' : ''}etherscan.io/tx/${event.transactionHash}`;
|
const url = txLink(event.transactionHash, isTest);
|
||||||
const keys = Object.keys(event.params).join(', ');
|
const keys = Object.keys(event.params).join(', ');
|
||||||
const values = Object.keys(event.params).map((name, index) => {
|
const values = Object.keys(event.params).map((name, index) => {
|
||||||
const param = event.params[name];
|
const param = event.params[name];
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
import React, { Component, PropTypes } from 'react';
|
import React, { Component, PropTypes } from 'react';
|
||||||
|
|
||||||
import { getAccountLink } from '../../util/account';
|
import { addressLink } from '../../../../../3rdparty/etherscan/links';
|
||||||
import styles from './AccountLink.css';
|
import styles from './AccountLink.css';
|
||||||
|
|
||||||
export default class AccountLink extends Component {
|
export default class AccountLink extends Component {
|
||||||
@ -57,7 +57,7 @@ export default class AccountLink extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
updateLink (address, chain) {
|
updateLink (address, chain) {
|
||||||
const link = getAccountLink(address, chain);
|
const link = addressLink(address, chain === 'morden' || chain === 'testnet');
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
link
|
link
|
||||||
|
@ -120,8 +120,9 @@ export default class TransactionFinished extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
renderTxHash () {
|
renderTxHash () {
|
||||||
const { txHash, chain } = this.props;
|
const { txHash } = this.props;
|
||||||
if (!txHash) {
|
const { chain } = this.state;
|
||||||
|
if (!txHash || !chain) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
import React, { Component, PropTypes } from 'react';
|
import React, { Component, PropTypes } from 'react';
|
||||||
|
|
||||||
import { getTxLink } from '../util/transaction';
|
import { txLink } from '../../../../3rdparty/etherscan/links';
|
||||||
|
|
||||||
export default class TxHashLink extends Component {
|
export default class TxHashLink extends Component {
|
||||||
|
|
||||||
@ -27,27 +27,12 @@ export default class TxHashLink extends Component {
|
|||||||
className: PropTypes.string
|
className: PropTypes.string
|
||||||
}
|
}
|
||||||
|
|
||||||
state = {
|
|
||||||
link: null
|
|
||||||
};
|
|
||||||
|
|
||||||
componentWillMount () {
|
|
||||||
const { txHash, chain } = this.props;
|
|
||||||
this.updateLink(txHash, chain);
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillReceiveProps (nextProps) {
|
|
||||||
const { txHash, chain } = nextProps;
|
|
||||||
this.updateLink(txHash, chain);
|
|
||||||
}
|
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { children, txHash, className } = this.props;
|
const { children, txHash, className, chain } = this.props;
|
||||||
const { link } = this.state;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<a
|
<a
|
||||||
href={ link }
|
href={ txLink(txHash, chain === 'morden' || chain === 'testnet') }
|
||||||
target='_blank'
|
target='_blank'
|
||||||
className={ className }>
|
className={ className }>
|
||||||
{ children || txHash }
|
{ children || txHash }
|
||||||
@ -55,9 +40,4 @@ export default class TxHashLink extends Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateLink (txHash, chain) {
|
|
||||||
const link = getTxLink(txHash, chain);
|
|
||||||
this.setState({ link });
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
// 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 { BASE_LINK_ACCOUNT_MORDEN, BASE_LINK_ACCOUNT_HOMESTEAD } from '../constants/constants';
|
|
||||||
|
|
||||||
export const getAccountLink = _getAccountLink;
|
|
||||||
|
|
||||||
function _getAccountLink (address, chain) {
|
|
||||||
const isTestNet = chain === 'morden' || chain === 'testnet';
|
|
||||||
const base = isTestNet ? BASE_LINK_ACCOUNT_MORDEN : BASE_LINK_ACCOUNT_HOMESTEAD;
|
|
||||||
return base + address;
|
|
||||||
}
|
|
@ -18,7 +18,6 @@ import BigNumber from 'bignumber.js';
|
|||||||
|
|
||||||
const WEI_TO_ETH_MULTIPLIER = 0.000000000000000001;
|
const WEI_TO_ETH_MULTIPLIER = 0.000000000000000001;
|
||||||
const WEI_TO_SZABU_MULTIPLIER = 0.000000000001;
|
const WEI_TO_SZABU_MULTIPLIER = 0.000000000001;
|
||||||
import { BASE_LINK_TX_MORDEN, BASE_LINK_TX_HOMESTEAD } from '../constants/constants';
|
|
||||||
|
|
||||||
export const getShortData = _getShortData;
|
export const getShortData = _getShortData;
|
||||||
// calculations
|
// calculations
|
||||||
@ -33,8 +32,6 @@ export const getTotalValueDisplay = _getTotalValueDisplay;
|
|||||||
export const getTotalValueDisplayWei = _getTotalValueDisplayWei;
|
export const getTotalValueDisplayWei = _getTotalValueDisplayWei;
|
||||||
export const getEthmFromWeiDisplay = _getEthmFromWeiDisplay;
|
export const getEthmFromWeiDisplay = _getEthmFromWeiDisplay;
|
||||||
export const getGasDisplay = _getGasDisplay;
|
export const getGasDisplay = _getGasDisplay;
|
||||||
// links
|
|
||||||
export const getTxLink = _getTxLink;
|
|
||||||
|
|
||||||
function _getShortData (data) {
|
function _getShortData (data) {
|
||||||
if (data.length <= 3) {
|
if (data.length <= 3) {
|
||||||
@ -111,11 +108,6 @@ function _getEthmFromWeiDisplay (weiHexString) {
|
|||||||
return value.times(WEI_TO_ETH_MULTIPLIER).times(1e7).toFixed(5);
|
return value.times(WEI_TO_ETH_MULTIPLIER).times(1e7).toFixed(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
function _getTxLink (txHash, chain) {
|
|
||||||
const base = chain === 'morden' || chain === 'testnet' ? BASE_LINK_TX_MORDEN : BASE_LINK_TX_HOMESTEAD;
|
|
||||||
return base + txHash;
|
|
||||||
}
|
|
||||||
|
|
||||||
function _getGasDisplay (gas) {
|
function _getGasDisplay (gas) {
|
||||||
return new BigNumber(gas).times(1e-7).toFormat(4);
|
return new BigNumber(gas).times(1e-7).toFormat(4);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user