2017-12-11 17:35:57 -08:00
|
|
|
import React, {Component} from 'react';
|
|
|
|
import ReactDOM from 'react-dom';
|
|
|
|
import App from './App';
|
|
|
|
import registerServiceWorker from './registerServiceWorker';
|
|
|
|
import KeysManager from './contracts/KeysManager.contract'
|
|
|
|
import Metadata from './contracts/Metadata.contract'
|
2018-01-25 00:02:25 -08:00
|
|
|
import getWeb3, {setWeb3} from './getWeb3'
|
2018-03-12 11:41:19 -07:00
|
|
|
import helpers from './helpers'
|
2017-12-11 17:35:57 -08:00
|
|
|
import {
|
2017-12-11 23:01:59 -08:00
|
|
|
Router,
|
2017-12-11 17:35:57 -08:00
|
|
|
Route,
|
2017-12-11 23:01:59 -08:00
|
|
|
NavLink
|
2017-12-11 17:35:57 -08:00
|
|
|
} from 'react-router-dom'
|
2017-12-11 23:01:59 -08:00
|
|
|
import createBrowserHistory from 'history/createBrowserHistory'
|
|
|
|
import Loading from './Loading'
|
2018-02-26 04:56:00 -08:00
|
|
|
import Footer from './Footer';
|
2017-12-11 23:01:59 -08:00
|
|
|
import AllValidators from './AllValidators'
|
2018-01-25 00:02:25 -08:00
|
|
|
import Select from 'react-select'
|
|
|
|
import "react-select/dist/react-select.css";
|
2018-02-01 14:48:48 -08:00
|
|
|
import networkAddresses from './contracts/addresses';
|
2017-12-11 23:01:59 -08:00
|
|
|
|
2018-01-23 13:32:28 -08:00
|
|
|
let errorMsgNoMetamaskAccount = `Your MetaMask is locked.
|
2018-02-26 06:35:10 -08:00
|
|
|
Please choose your voting key in MetaMask and reload the page.
|
2018-01-23 13:32:28 -08:00
|
|
|
Check POA Network <a href='https://github.com/poanetwork/wiki' target='blank'>wiki</a> for more info.`;
|
|
|
|
|
2017-12-11 23:01:59 -08:00
|
|
|
const history = createBrowserHistory()
|
|
|
|
|
2018-01-25 00:26:31 -08:00
|
|
|
let Header = ({netId, onChange, injectedWeb3}) => {
|
|
|
|
let select;
|
2018-01-25 01:26:29 -08:00
|
|
|
let headerClassName = netId === '77' ? 'sokol' : '';
|
|
|
|
const logoClassName = netId === '77' ? 'header-logo-sokol' : 'header-logo';
|
2018-01-25 00:26:31 -08:00
|
|
|
if(!injectedWeb3) {
|
|
|
|
select = <Select id="netId"
|
2018-01-25 00:02:25 -08:00
|
|
|
value={netId}
|
|
|
|
onChange={onChange}
|
|
|
|
style={{
|
|
|
|
width: '150px',
|
|
|
|
}}
|
|
|
|
wrapperStyle={{
|
|
|
|
width: '150px',
|
|
|
|
}}
|
|
|
|
clearable={false}
|
|
|
|
options={[
|
|
|
|
{ value: '77', label: 'Network: Sokol' },
|
|
|
|
{ value: '99', label: 'Network: Core' },
|
|
|
|
]} />
|
2018-01-25 00:26:31 -08:00
|
|
|
}
|
|
|
|
return (
|
2018-01-25 01:26:29 -08:00
|
|
|
<header id="header" className={`header ${headerClassName}`}>
|
2018-01-25 00:26:31 -08:00
|
|
|
<div className="container">
|
2018-01-25 01:26:29 -08:00
|
|
|
<a href="/poa-dapps-validators" className={logoClassName}></a>
|
2018-01-25 00:26:31 -08:00
|
|
|
{select}
|
|
|
|
</div>
|
2018-01-23 16:21:01 -08:00
|
|
|
</header>
|
|
|
|
)
|
|
|
|
}
|
2017-12-11 23:01:59 -08:00
|
|
|
class AppMainRouter extends Component {
|
|
|
|
constructor(props){
|
|
|
|
super(props);
|
2017-12-15 19:01:04 -08:00
|
|
|
this.rootPath = '/poa-dapps-validators'
|
2017-12-11 23:01:59 -08:00
|
|
|
history.listen(this.onRouteChange.bind(this));
|
2017-12-12 23:27:31 -08:00
|
|
|
this.onSetRender = this.onSetRender.bind(this);
|
|
|
|
this.onPendingChangesRender = this.onPendingChangesRender.bind(this);
|
2017-12-11 23:01:59 -08:00
|
|
|
this.onAllValidatorsRender = this.onAllValidatorsRender.bind(this)
|
2017-12-12 23:27:31 -08:00
|
|
|
this.onConfirmPendingChange = this.onConfirmPendingChange.bind(this);
|
2017-12-13 16:39:17 -08:00
|
|
|
this.onFinalize = this.onFinalize.bind(this);
|
2017-12-13 02:01:21 -08:00
|
|
|
this.onSearch = this.onSearch.bind(this);
|
2018-02-01 14:48:48 -08:00
|
|
|
this.onNetworkChange = this.onNetworkChange.bind(this);
|
2017-12-11 23:01:59 -08:00
|
|
|
this.state = {
|
|
|
|
showSearch: true,
|
2018-06-29 00:54:14 -07:00
|
|
|
keysManager: null,
|
2017-12-11 23:01:59 -08:00
|
|
|
metadataContract: null,
|
|
|
|
poaConsensus: null,
|
2018-06-29 00:54:14 -07:00
|
|
|
votingKey: null,
|
2017-12-12 00:29:28 -08:00
|
|
|
loading: true,
|
2017-12-29 22:27:13 -08:00
|
|
|
searchTerm: '',
|
2018-01-25 01:26:29 -08:00
|
|
|
injectedWeb3: true,
|
2018-01-25 00:26:31 -08:00
|
|
|
netId: '',
|
|
|
|
error: false
|
2017-12-11 23:01:59 -08:00
|
|
|
}
|
|
|
|
getWeb3().then(async (web3Config) => {
|
2018-02-01 14:48:48 -08:00
|
|
|
return networkAddresses(web3Config)
|
|
|
|
}).then(async (config) => {
|
|
|
|
const {web3Config, addresses} = config;
|
|
|
|
const keysManager = new KeysManager()
|
|
|
|
await keysManager.init({
|
2017-12-29 23:07:11 -08:00
|
|
|
web3: web3Config.web3Instance,
|
2018-02-01 14:48:48 -08:00
|
|
|
netId: web3Config.netId,
|
|
|
|
addresses,
|
|
|
|
})
|
|
|
|
const metadataContract = new Metadata()
|
|
|
|
await metadataContract.init({
|
2017-12-29 23:07:11 -08:00
|
|
|
web3: web3Config.web3Instance,
|
2018-02-01 14:48:48 -08:00
|
|
|
netId: web3Config.netId,
|
|
|
|
addresses,
|
2017-12-11 23:01:59 -08:00
|
|
|
})
|
|
|
|
this.setState({
|
|
|
|
votingKey: web3Config.defaultAccount,
|
|
|
|
keysManager,
|
|
|
|
metadataContract,
|
2017-12-12 00:29:28 -08:00
|
|
|
loading: false,
|
2018-01-24 15:37:01 -08:00
|
|
|
injectedWeb3: web3Config.injectedWeb3,
|
2018-02-01 14:48:48 -08:00
|
|
|
netId: web3Config.netId,
|
2017-12-11 23:01:59 -08:00
|
|
|
})
|
2017-12-12 00:29:28 -08:00
|
|
|
}).catch((error) => {
|
2017-12-12 23:27:31 -08:00
|
|
|
console.error(error.message);
|
2018-01-25 00:26:31 -08:00
|
|
|
this.setState({loading: false, error: true});
|
2018-03-12 11:41:19 -07:00
|
|
|
helpers.generateAlert("error", "Error!", error.message);
|
2017-12-11 23:01:59 -08:00
|
|
|
})
|
|
|
|
}
|
|
|
|
onRouteChange(){
|
2017-12-13 16:39:17 -08:00
|
|
|
const setMetadata = this.rootPath + "/set";
|
|
|
|
if(history.location.pathname === setMetadata){
|
2017-12-11 23:01:59 -08:00
|
|
|
this.setState({showSearch: false})
|
2017-12-29 22:27:13 -08:00
|
|
|
if(this.state.injectedWeb3 === false){
|
2018-03-12 11:41:19 -07:00
|
|
|
helpers.generateAlert("warning", "Warning!", 'Metamask was not found');
|
2017-12-29 22:27:13 -08:00
|
|
|
}
|
2017-12-11 23:01:59 -08:00
|
|
|
} else {
|
|
|
|
this.setState({showSearch: true})
|
|
|
|
}
|
|
|
|
}
|
2018-01-23 13:32:28 -08:00
|
|
|
checkForVotingKey(cb){
|
2018-01-23 16:21:01 -08:00
|
|
|
if(this.state.votingKey && !this.state.loading){
|
2018-01-23 13:32:28 -08:00
|
|
|
return cb();
|
|
|
|
} else {
|
2018-03-12 11:41:19 -07:00
|
|
|
helpers.generateAlert("warning", "Warning!", errorMsgNoMetamaskAccount);
|
2018-01-23 13:32:28 -08:00
|
|
|
return ''
|
|
|
|
}
|
|
|
|
}
|
2017-12-11 23:01:59 -08:00
|
|
|
onSetRender() {
|
2018-06-29 00:54:14 -07:00
|
|
|
if (!this.state.netId) {
|
|
|
|
return '';
|
|
|
|
}
|
2018-01-23 13:32:28 -08:00
|
|
|
return this.checkForVotingKey(() => {
|
|
|
|
return <App web3Config={this.state}/>
|
2018-06-29 00:54:14 -07:00
|
|
|
});
|
2017-12-11 23:01:59 -08:00
|
|
|
}
|
2017-12-13 16:39:17 -08:00
|
|
|
async _onBtnClick({event, methodToCall, successMsg}){
|
|
|
|
event.preventDefault();
|
2018-01-23 13:32:28 -08:00
|
|
|
this.checkForVotingKey(async () => {
|
|
|
|
this.setState({loading: true})
|
|
|
|
const miningKey = event.currentTarget.getAttribute('miningkey');
|
|
|
|
try{
|
|
|
|
let result = await this.state.metadataContract[methodToCall]({
|
|
|
|
miningKeyToConfirm: miningKey,
|
|
|
|
senderVotingKey: this.state.votingKey
|
|
|
|
});
|
|
|
|
console.log(result);
|
|
|
|
this.setState({loading: false})
|
2018-03-12 11:41:19 -07:00
|
|
|
helpers.generateAlert("success", "Congratulations!", successMsg);
|
2018-01-23 13:32:28 -08:00
|
|
|
} catch(error) {
|
|
|
|
this.setState({loading: false})
|
|
|
|
console.error(error.message);
|
2018-03-12 11:41:19 -07:00
|
|
|
helpers.generateAlert("error", "Error!", error.message);
|
2018-01-23 13:32:28 -08:00
|
|
|
}
|
|
|
|
})
|
2017-12-12 23:27:31 -08:00
|
|
|
}
|
2017-12-13 16:39:17 -08:00
|
|
|
async onConfirmPendingChange(event) {
|
|
|
|
await this._onBtnClick({
|
|
|
|
event,
|
|
|
|
methodToCall: 'confirmPendingChange',
|
|
|
|
successMsg: 'You have successfully confirmed the change!'
|
|
|
|
});
|
|
|
|
}
|
|
|
|
async onFinalize(event){
|
|
|
|
await this._onBtnClick({
|
|
|
|
event,
|
|
|
|
methodToCall: 'finalize',
|
|
|
|
successMsg: 'You have successfully finalized the change!'
|
|
|
|
});
|
|
|
|
}
|
2017-12-12 23:27:31 -08:00
|
|
|
onPendingChangesRender() {
|
2018-02-26 06:35:10 -08:00
|
|
|
return this.state.loading || this.state.error? '' : <AllValidators
|
2018-02-01 14:48:48 -08:00
|
|
|
ref="AllValidatorsRef"
|
2017-12-12 23:27:31 -08:00
|
|
|
methodToCall="getAllPendingChanges"
|
2017-12-13 16:39:17 -08:00
|
|
|
searchTerm={this.state.searchTerm}
|
2017-12-12 23:27:31 -08:00
|
|
|
web3Config={this.state}>
|
2017-12-13 16:39:17 -08:00
|
|
|
<button onClick={this.onFinalize} className="create-keys-button finalize">Finalize</button>
|
|
|
|
<button onClick={this.onConfirmPendingChange} className="create-keys-button">Confirm</button>
|
2017-12-29 22:27:13 -08:00
|
|
|
</AllValidators>;
|
2017-12-12 23:27:31 -08:00
|
|
|
}
|
2017-12-11 23:01:59 -08:00
|
|
|
onAllValidatorsRender() {
|
2018-01-25 00:26:31 -08:00
|
|
|
return this.state.loading || this.state.error ? '' : <AllValidators
|
2018-01-25 00:02:25 -08:00
|
|
|
searchTerm={this.state.searchTerm}
|
|
|
|
methodToCall="getAllValidatorsData"
|
2018-01-31 13:24:52 -08:00
|
|
|
web3Config={this.state}
|
|
|
|
/>
|
2017-12-13 02:01:21 -08:00
|
|
|
}
|
|
|
|
onSearch(term){
|
2017-12-13 16:39:17 -08:00
|
|
|
this.setState({searchTerm: term.target.value.toLowerCase()})
|
2017-12-11 23:01:59 -08:00
|
|
|
}
|
2018-02-01 14:48:48 -08:00
|
|
|
async onNetworkChange(e){
|
2018-01-25 00:02:25 -08:00
|
|
|
const netId = e.value;
|
|
|
|
const web3 = setWeb3(netId);
|
2018-02-01 14:48:48 -08:00
|
|
|
networkAddresses({netId}).then(async (config) => {
|
|
|
|
const {addresses} = config;
|
|
|
|
const keysManager = new KeysManager();
|
|
|
|
await keysManager.init({
|
|
|
|
web3,
|
|
|
|
netId,
|
|
|
|
addresses
|
|
|
|
});
|
|
|
|
const metadataContract = new Metadata()
|
|
|
|
await metadataContract.init({
|
|
|
|
web3,
|
|
|
|
netId,
|
|
|
|
addresses
|
|
|
|
});
|
|
|
|
this.setState({netId: e.value, keysManager, metadataContract})
|
2018-01-25 00:02:25 -08:00
|
|
|
})
|
|
|
|
}
|
2017-12-11 23:01:59 -08:00
|
|
|
render(){
|
2018-03-12 11:41:19 -07:00
|
|
|
console.log('v2.09')
|
2017-12-13 02:01:21 -08:00
|
|
|
const search = this.state.showSearch ? <input type="search" className="search-input" onChange={this.onSearch}/> : ''
|
2018-01-24 15:37:01 -08:00
|
|
|
const loading = this.state.loading ? <Loading netId={this.state.netId} /> : ''
|
2017-12-11 23:01:59 -08:00
|
|
|
return (
|
|
|
|
<Router history={history}>
|
|
|
|
<section className="content">
|
2018-02-01 14:48:48 -08:00
|
|
|
<Header netId={this.state.netId} onChange={this.onNetworkChange} injectedWeb3={this.state.injectedWeb3} />
|
2017-12-11 23:01:59 -08:00
|
|
|
{loading}
|
2018-01-31 13:24:52 -08:00
|
|
|
<div className="nav-container">
|
|
|
|
<div className="container">
|
2017-12-11 23:01:59 -08:00
|
|
|
<div className="nav">
|
2018-01-31 13:24:52 -08:00
|
|
|
<NavLink className="nav-i" exact activeClassName="nav-i_active" to={`${this.rootPath}/`}>All</NavLink>
|
|
|
|
<NavLink className="nav-i" activeClassName="nav-i_active" to={`${this.rootPath}/set`}>Set metadata</NavLink>
|
|
|
|
<NavLink className="nav-i" activeClassName="nav-i_active" to={`${this.rootPath}/pending-changes`}>Pending changes</NavLink>
|
2017-12-11 23:01:59 -08:00
|
|
|
</div>
|
2017-12-13 16:39:17 -08:00
|
|
|
{search}
|
2017-12-11 23:01:59 -08:00
|
|
|
</div>
|
|
|
|
</div>
|
2017-12-13 16:39:17 -08:00
|
|
|
<Route exact path={`${this.rootPath}/`} render={this.onAllValidatorsRender} web3Config={this.state}/>
|
2018-01-04 10:10:09 -08:00
|
|
|
<Route exact path="/" render={this.onAllValidatorsRender} web3Config={this.state}/>
|
2017-12-12 00:45:37 -08:00
|
|
|
<Route path={`${this.rootPath}/set`} render={this.onSetRender} />
|
2017-12-12 23:27:31 -08:00
|
|
|
<Route path={`${this.rootPath}/pending-changes`} render={this.onPendingChangesRender} />
|
2018-01-25 01:26:29 -08:00
|
|
|
<Footer netId={this.state.netId} />
|
2017-12-11 23:01:59 -08:00
|
|
|
</section>
|
|
|
|
</Router>
|
|
|
|
)
|
|
|
|
}
|
2018-01-31 13:24:52 -08:00
|
|
|
}
|
2017-12-11 17:35:57 -08:00
|
|
|
|
|
|
|
ReactDOM.render(<AppMainRouter />, document.getElementById('root'));
|
2017-12-11 23:01:59 -08:00
|
|
|
registerServiceWorker();
|