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-chip-input": "^0.8.0", | ||||
|     "moment": "^2.14.1", | ||||
|     "qs": "^6.3.0", | ||||
|     "react": "^15.2.1", | ||||
|     "react-addons-css-transition-group": "^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
 | ||||
| // along with Parity.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| import { stringify } from 'qs'; | ||||
| 
 | ||||
| const options = { | ||||
|   method: 'GET', | ||||
|   headers: { | ||||
| @ -23,19 +25,14 @@ const options = { | ||||
| 
 | ||||
| export function call (module, action, _params, test) { | ||||
|   const host = test ? 'testnet.etherscan.io' : 'api.etherscan.io'; | ||||
|   let params = ''; | ||||
| 
 | ||||
|   if (_params) { | ||||
|     Object.keys(_params).map((param) => { | ||||
|       const value = _params[param]; | ||||
|   const query = stringify(Object.assign({ | ||||
|     module, action | ||||
|   }, _params || {})); | ||||
| 
 | ||||
|       params = `${params}&${param}=${value}`; | ||||
|     }); | ||||
|   } | ||||
| 
 | ||||
|   return fetch(`http://${host}/api?module=${module}&action=${action}${params}`, options) | ||||
|   return fetch(`https://${host}/api?${query}`, options) | ||||
|     .then((response) => { | ||||
|       if (response.status !== 200) { | ||||
|       if (!response.ok) { | ||||
|         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 { stats } from './stats'; | ||||
| import { txLink, addressLink } from './links'; | ||||
| 
 | ||||
| const etherscan = { | ||||
|   account: account, | ||||
|   stats: stats | ||||
|   stats: stats, | ||||
|   txLink: txLink, | ||||
|   addressLink: addressLink | ||||
| }; | ||||
| 
 | ||||
| export default etherscan; | ||||
|  | ||||
| @ -14,8 +14,10 @@ | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| // along with Parity.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| // links to chain explorers
 | ||||
| export const BASE_LINK_ACCOUNT_MORDEN = 'https://testnet.etherscan.io/address/'; | ||||
| 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 txLink = (hash, isTestnet = false) => { | ||||
|   return `https://${isTestnet ? 'testnet.' : ''}etherscan.io/tx/${hash}`; | ||||
| }; | ||||
| 
 | ||||
| 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 { bindActionCreators } from 'redux'; | ||||
| import { LinearProgress } from 'material-ui'; | ||||
| import { txLink } from '../../3rdparty/etherscan/links'; | ||||
| 
 | ||||
| import styles from './txHash.css'; | ||||
| 
 | ||||
| @ -55,7 +56,6 @@ class TxHash extends Component { | ||||
| 
 | ||||
|   render () { | ||||
|     const { hash, isTest } = this.props; | ||||
|     const link = `https://${isTest ? 'testnet.' : ''}etherscan.io/tx/${hash}`; | ||||
| 
 | ||||
|     return ( | ||||
|       <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 | ||||
|         </div> | ||||
|         <div className={ styles.hash }> | ||||
|           <a href={ link } target='_blank'>{ hash }</a> | ||||
|           <a href={ txLink(hash, isTest) } target='_blank'>{ hash }</a> | ||||
|         </div> | ||||
|         { this.renderConfirmations() } | ||||
|       </div> | ||||
|  | ||||
| @ -23,6 +23,7 @@ import { bindActionCreators } from 'redux'; | ||||
| import { fetchBlock, fetchTransaction } from '../../../../redux/providers/blockchainActions'; | ||||
| 
 | ||||
| import { IdentityIcon, IdentityName, MethodDecoding } from '../../../../ui'; | ||||
| import { txLink, addressLink } from '../../../../3rdparty/etherscan/links'; | ||||
| 
 | ||||
| import styles from '../transactions.css'; | ||||
| 
 | ||||
| @ -55,9 +56,7 @@ class Transaction extends Component { | ||||
|   } | ||||
| 
 | ||||
|   render () { | ||||
|     const { block, transaction, isTest } = this.props; | ||||
| 
 | ||||
|     const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`; | ||||
|     const { block, transaction } = this.props; | ||||
| 
 | ||||
|     return ( | ||||
|       <tr> | ||||
| @ -65,9 +64,9 @@ class Transaction extends Component { | ||||
|           <div>{ this.formatBlockTimestamp(block) }</div> | ||||
|           <div>{ this.formatNumber(transaction.blockNumber) }</div> | ||||
|         </td> | ||||
|         { this.renderAddress(prefix, transaction.from) } | ||||
|         { this.renderAddress(transaction.from) } | ||||
|         { this.renderTransaction() } | ||||
|         { this.renderAddress(prefix, transaction.to) } | ||||
|         { this.renderAddress(transaction.to) } | ||||
|         <td className={ styles.method }> | ||||
|           { this.renderMethod() } | ||||
|         </td> | ||||
| @ -93,15 +92,16 @@ class Transaction extends Component { | ||||
|   renderTransaction () { | ||||
|     const { transaction, isTest } = this.props; | ||||
| 
 | ||||
|     const prefix = `https://${isTest ? 'testnet.' : ''}etherscan.io/`; | ||||
|     const hashLink = `${prefix}tx/${transaction.hash}`; | ||||
| 
 | ||||
|     return ( | ||||
|       <td className={ styles.transaction }> | ||||
|         { this.renderEtherValue() } | ||||
|         <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) } | ||||
|           </a> | ||||
|         </div> | ||||
| @ -109,10 +109,12 @@ class Transaction extends Component { | ||||
|     ); | ||||
|   } | ||||
| 
 | ||||
|   renderAddress (prefix, address) { | ||||
|   renderAddress (address) { | ||||
|     const { isTest } = this.props; | ||||
| 
 | ||||
|     const eslink = address ? ( | ||||
|       <a | ||||
|         href={ `${prefix}address/${address}` } | ||||
|         href={ addressLink(address, isTest) } | ||||
|         target='_blank' | ||||
|         className={ styles.link }> | ||||
|         <IdentityName address={ address } shorten /> | ||||
|  | ||||
| @ -22,6 +22,7 @@ import { bindActionCreators } from 'redux'; | ||||
| 
 | ||||
| import { fetchBlock, fetchTransaction } from '../../../../redux/providers/blockchainActions'; | ||||
| import { IdentityIcon, IdentityName, Input, InputAddress } from '../../../../ui'; | ||||
| import { txLink } from '../../../../3rdparty/etherscan/links'; | ||||
| 
 | ||||
| import styles from '../../contract.css'; | ||||
| 
 | ||||
| @ -49,7 +50,7 @@ class Event extends Component { | ||||
|     const block = blocks[event.blockNumber.toString()]; | ||||
|     const transaction = transactions[event.transactionHash] || {}; | ||||
|     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 values = Object.keys(event.params).map((name, index) => { | ||||
|       const param = event.params[name]; | ||||
|  | ||||
| @ -16,7 +16,7 @@ | ||||
| 
 | ||||
| import React, { Component, PropTypes } from 'react'; | ||||
| 
 | ||||
| import { getAccountLink } from '../../util/account'; | ||||
| import { addressLink } from '../../../../../3rdparty/etherscan/links'; | ||||
| import styles from './AccountLink.css'; | ||||
| 
 | ||||
| export default class AccountLink extends Component { | ||||
| @ -57,7 +57,7 @@ export default class AccountLink extends Component { | ||||
|   } | ||||
| 
 | ||||
|   updateLink (address, chain) { | ||||
|     const link = getAccountLink(address, chain); | ||||
|     const link = addressLink(address, chain === 'morden' || chain === 'testnet'); | ||||
| 
 | ||||
|     this.setState({ | ||||
|       link | ||||
|  | ||||
| @ -120,8 +120,9 @@ export default class TransactionFinished extends Component { | ||||
|   } | ||||
| 
 | ||||
|   renderTxHash () { | ||||
|     const { txHash, chain } = this.props; | ||||
|     if (!txHash) { | ||||
|     const { txHash } = this.props; | ||||
|     const { chain } = this.state; | ||||
|     if (!txHash || !chain) { | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -16,7 +16,7 @@ | ||||
| 
 | ||||
| import React, { Component, PropTypes } from 'react'; | ||||
| 
 | ||||
| import { getTxLink } from '../util/transaction'; | ||||
| import { txLink } from '../../../../3rdparty/etherscan/links'; | ||||
| 
 | ||||
| export default class TxHashLink extends Component { | ||||
| 
 | ||||
| @ -27,27 +27,12 @@ export default class TxHashLink extends Component { | ||||
|     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 () { | ||||
|     const { children, txHash, className } = this.props; | ||||
|     const { link } = this.state; | ||||
|     const { children, txHash, className, chain } = this.props; | ||||
| 
 | ||||
|     return ( | ||||
|       <a | ||||
|         href={ link } | ||||
|         href={ txLink(txHash, chain === 'morden' || chain === 'testnet') } | ||||
|         target='_blank' | ||||
|         className={ className }> | ||||
|         { 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_SZABU_MULTIPLIER = 0.000000000001; | ||||
| import { BASE_LINK_TX_MORDEN, BASE_LINK_TX_HOMESTEAD } from '../constants/constants'; | ||||
| 
 | ||||
| export const getShortData = _getShortData; | ||||
| // calculations
 | ||||
| @ -33,8 +32,6 @@ export const getTotalValueDisplay = _getTotalValueDisplay; | ||||
| export const getTotalValueDisplayWei = _getTotalValueDisplayWei; | ||||
| export const getEthmFromWeiDisplay = _getEthmFromWeiDisplay; | ||||
| export const getGasDisplay = _getGasDisplay; | ||||
| // links
 | ||||
| export const getTxLink = _getTxLink; | ||||
| 
 | ||||
| function _getShortData (data) { | ||||
|   if (data.length <= 3) { | ||||
| @ -111,11 +108,6 @@ function _getEthmFromWeiDisplay (weiHexString) { | ||||
|   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) { | ||||
|   return new BigNumber(gas).times(1e-7).toFormat(4); | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user