mirror of
https://github.com/status-im/snt-voting.git
synced 2025-02-21 14:48:07 +00:00
Update to Embark 3.2.1 (pt1)
This commit is contained in:
parent
50d4f9b98f
commit
cc9c965f9c
26
.babelrc
26
.babelrc
@ -1,4 +1,24 @@
|
|||||||
{
|
{
|
||||||
"plugins": ["transform-object-rest-spread"],
|
"plugins": [
|
||||||
"presets": ["stage-2"]
|
"@babel/plugin-proposal-object-rest-spread",
|
||||||
}
|
"@babel/plugin-syntax-dynamic-import",
|
||||||
|
"@babel/plugin-syntax-import-meta",
|
||||||
|
"@babel/plugin-proposal-class-properties",
|
||||||
|
"@babel/plugin-proposal-json-strings",
|
||||||
|
[
|
||||||
|
"@babel/plugin-proposal-decorators",
|
||||||
|
{
|
||||||
|
"legacy": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"@babel/plugin-proposal-function-sent",
|
||||||
|
"@babel/plugin-proposal-export-namespace-from",
|
||||||
|
"@babel/plugin-proposal-numeric-separator",
|
||||||
|
"@babel/plugin-proposal-throw-expressions"
|
||||||
|
],
|
||||||
|
"presets": [],
|
||||||
|
"ignore": [
|
||||||
|
"config/",
|
||||||
|
"node_modules"
|
||||||
|
]
|
||||||
|
}
|
@ -5,8 +5,6 @@ import { Tabs, Tab } from 'react-bootstrap';
|
|||||||
import TopNavbar from './topnavbar';
|
import TopNavbar from './topnavbar';
|
||||||
import TestTokenUI from './testtoken';
|
import TestTokenUI from './testtoken';
|
||||||
import ERC20TokenUI from './erc20token';
|
import ERC20TokenUI from './erc20token';
|
||||||
import ProposalManager from './proposal-manager/proposal-manager'
|
|
||||||
import VotingDapp from './voting-dapp/voting-dapp';
|
|
||||||
import SNTUI from './snt-ui';
|
import SNTUI from './snt-ui';
|
||||||
|
|
||||||
export default ({ setAccount }) => {
|
export default ({ setAccount }) => {
|
||||||
@ -15,11 +13,8 @@ export default ({ setAccount }) => {
|
|||||||
<TopNavbar accountUpdateHandler={(e) => setAccount(e)} />
|
<TopNavbar accountUpdateHandler={(e) => setAccount(e)} />
|
||||||
<Tabs defaultActiveKey={0} id="uncontrolled-tab-example">
|
<Tabs defaultActiveKey={0} id="uncontrolled-tab-example">
|
||||||
<Tab eventKey={0} title="VotingDapp">
|
<Tab eventKey={0} title="VotingDapp">
|
||||||
<VotingDapp />
|
|
||||||
</Tab>
|
|
||||||
<Tab eventKey={1} title="ProposalManager">
|
|
||||||
<ProposalManager />
|
|
||||||
</Tab>
|
</Tab>
|
||||||
|
|
||||||
<Tab eventKey={2} title="SNT Token">
|
<Tab eventKey={2} title="SNT Token">
|
||||||
<SNTUI />
|
<SNTUI />
|
||||||
</Tab>
|
</Tab>
|
||||||
|
@ -16,7 +16,7 @@ class AccList extends React.Component {
|
|||||||
addresses: [],
|
addresses: [],
|
||||||
balances: []
|
balances: []
|
||||||
}
|
}
|
||||||
__embarkContext.execWhenReady(() => {
|
EmbarkJS.onReady(() => {
|
||||||
this.load()
|
this.load()
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -1,186 +0,0 @@
|
|||||||
import EmbarkJS from 'Embark/EmbarkJS';
|
|
||||||
import ERC20Token from 'Embark/contracts/ERC20Token';
|
|
||||||
import ProposalCuration from 'Embark/contracts/ProposalCuration';
|
|
||||||
import SNT from 'Embark/contracts/SNT';
|
|
||||||
import React, { PureComponent, Fragment } from 'react';
|
|
||||||
import { Form, FormGroup, FormControl, HelpBlock, Button, Alert } from 'react-bootstrap';
|
|
||||||
import web3 from "Embark/web3";
|
|
||||||
import { withFormik } from 'formik';
|
|
||||||
import FieldGroup from '../standard/FieldGroup';
|
|
||||||
import TokenPermissions from '../standard/TokenPermission'
|
|
||||||
|
|
||||||
const { setSubmitPrice } = ProposalCuration.methods;
|
|
||||||
class InnerForm extends PureComponent {
|
|
||||||
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.state = {
|
|
||||||
submitPrice: "Loading...",
|
|
||||||
canSubmit: true
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount(){
|
|
||||||
this._loadPrice();
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillReceiveProps(){
|
|
||||||
this._loadPrice();
|
|
||||||
}
|
|
||||||
|
|
||||||
_loadPrice(){
|
|
||||||
__embarkContext.execWhenReady(async () => {
|
|
||||||
try {
|
|
||||||
let _b = await ProposalCuration.methods.getSubmitPrice(web3.eth.defaultAccount).call();
|
|
||||||
this.setState({
|
|
||||||
submitPrice: _b,
|
|
||||||
canSubmit: true
|
|
||||||
});
|
|
||||||
} catch(err){
|
|
||||||
this.setState({
|
|
||||||
canSubmit: false,
|
|
||||||
submitPrice: "-"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
setPrice = (address = web3.eth.defaultAccount, allowed = true, stakeValue = 1) => {
|
|
||||||
setSubmitPrice(address, allowed, stakeValue)
|
|
||||||
.send()
|
|
||||||
.then(res => {
|
|
||||||
this.setState({ ...this.state, canSubmit: true });
|
|
||||||
console.log(res);
|
|
||||||
})
|
|
||||||
.catch(err => { console.log(err) })
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
|
||||||
const { values, errors, touched, handleChange, handleBlur, handleSubmit, isSubmitting, setFieldValue } = this.props;
|
|
||||||
const { canSubmit } = this.state;
|
|
||||||
return (
|
|
||||||
<Fragment>
|
|
||||||
{!canSubmit &&
|
|
||||||
<Alert bsStyle="warning">
|
|
||||||
Account not allowed to submit proposals <Button onClick={(e) => this.setPrice()}>Click to enable (Admin only)</Button>
|
|
||||||
</Alert>
|
|
||||||
}
|
|
||||||
<TokenPermissions methods={SNT.methods} spender={ProposalCuration._address} symbol='SNT' />
|
|
||||||
<hr/>
|
|
||||||
<h2>Add proposal</h2>
|
|
||||||
<h3>Price: {this.state.submitPrice}</h3>
|
|
||||||
<Form onSubmit={handleSubmit}>
|
|
||||||
<FieldGroup
|
|
||||||
id="title"
|
|
||||||
name="title"
|
|
||||||
type="text"
|
|
||||||
label="Title"
|
|
||||||
onChange={handleChange}
|
|
||||||
onBlur={handleBlur}
|
|
||||||
value={values.title}
|
|
||||||
/>
|
|
||||||
<FieldGroup
|
|
||||||
id="description"
|
|
||||||
name="description"
|
|
||||||
type="text"
|
|
||||||
label="Description"
|
|
||||||
onChange={handleChange}
|
|
||||||
onBlur={handleBlur}
|
|
||||||
value={values.description}
|
|
||||||
/>
|
|
||||||
<FieldGroup
|
|
||||||
id="url"
|
|
||||||
name="url"
|
|
||||||
type="text"
|
|
||||||
label="URL"
|
|
||||||
onChange={handleChange}
|
|
||||||
onBlur={handleBlur}
|
|
||||||
value={values.url}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<FieldGroup
|
|
||||||
id="topic"
|
|
||||||
name="topic"
|
|
||||||
type="text"
|
|
||||||
label="Topic"
|
|
||||||
onChange={handleChange}
|
|
||||||
onBlur={handleBlur}
|
|
||||||
value={values.topic}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<FieldGroup
|
|
||||||
id="to"
|
|
||||||
name="to"
|
|
||||||
type="text"
|
|
||||||
label="To"
|
|
||||||
onChange={handleChange}
|
|
||||||
onBlur={handleBlur}
|
|
||||||
value={values.to}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<FieldGroup
|
|
||||||
id="data"
|
|
||||||
name="data"
|
|
||||||
type="text"
|
|
||||||
label="Data"
|
|
||||||
onChange={handleChange}
|
|
||||||
onBlur={handleBlur}
|
|
||||||
value={values.data}
|
|
||||||
/>
|
|
||||||
<FieldGroup
|
|
||||||
id="value"
|
|
||||||
name="value"
|
|
||||||
type="text"
|
|
||||||
label="Value"
|
|
||||||
onChange={handleChange}
|
|
||||||
onBlur={handleBlur}
|
|
||||||
value={values.value}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<Button type="submit" disabled={!canSubmit || isSubmitting}>{isSubmitting ? 'Submission in progress' : 'Submit'}</Button>
|
|
||||||
</Form>
|
|
||||||
</Fragment>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const ProposalManager = withFormik({
|
|
||||||
mapPropsToValues: props => ({ title: '', description: '', url: '', data: '0x00', value: '0', topic: '0x00', to: '0x0000000000000000000000000000000000000000' }),
|
|
||||||
validate(values) {},
|
|
||||||
handleSubmit(values, { setSubmitting}){
|
|
||||||
|
|
||||||
let dataObj = {
|
|
||||||
title: values.title,
|
|
||||||
description: values.description,
|
|
||||||
url: values.url,
|
|
||||||
};
|
|
||||||
|
|
||||||
const { toHex } = web3.utils;
|
|
||||||
const { submitProposal } = ProposalCuration.methods;
|
|
||||||
|
|
||||||
EmbarkJS.Storage.saveText(JSON.stringify(dataObj))
|
|
||||||
.then(hash => {
|
|
||||||
const hexHash = toHex(hash);
|
|
||||||
//TODO create toggle for address approval
|
|
||||||
submitProposal(
|
|
||||||
values.topic,
|
|
||||||
values.to,
|
|
||||||
values.value,
|
|
||||||
values.data,
|
|
||||||
hexHash
|
|
||||||
)
|
|
||||||
.send({from: web3.eth.defaultAccount, gasLimit: 1000000})
|
|
||||||
.then(res => {
|
|
||||||
setSubmitting(false);
|
|
||||||
console.log(res);
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
setSubmitting(false);
|
|
||||||
//TODO show error
|
|
||||||
console.log('Storage saveText Error: ', err.message)
|
|
||||||
});
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})(InnerForm)
|
|
||||||
|
|
||||||
export default ProposalManager;
|
|
@ -214,25 +214,22 @@ const AddPoll = withFormik({
|
|||||||
}
|
}
|
||||||
setSubmitting(true);
|
setSubmitting(true);
|
||||||
|
|
||||||
toSend.estimateGas()
|
try {
|
||||||
.then(gasEstimated => {
|
const gasEstimated = await toSend.estimateGas();
|
||||||
console.log("addPoll gas estimated: "+ gasEstimated);
|
console.log("addPoll gas estimated: "+ gasEstimated);
|
||||||
return toSend.send({gas: gasEstimated + 100000});
|
const res = await toSend.send({gas: gasEstimated + 100000});
|
||||||
})
|
console.log('sucess:', res);
|
||||||
.then(res => {
|
resetForm();
|
||||||
console.log('sucess:', res);
|
props.getPolls();
|
||||||
resetForm();
|
setSubmitting(false);
|
||||||
props.getPolls();
|
props.togglePoll();
|
||||||
setSubmitting(false);
|
|
||||||
props.togglePoll();
|
} catch (err) {
|
||||||
})
|
console.log('fail:', err);
|
||||||
.catch(res => {
|
setErrors({ 'description': err.message.split('Error:').pop().trim() });
|
||||||
console.log('fail:', res);
|
}
|
||||||
setErrors({ 'description': res.message.split('Error:').pop().trim() });
|
|
||||||
})
|
setSubmitting(false);
|
||||||
.finally(() => {
|
|
||||||
setSubmitting(false);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
})(StyledForm)
|
})(StyledForm)
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ class SNTUI extends React.Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount(){
|
componentDidMount(){
|
||||||
__embarkContext.execWhenReady(async () => {
|
EmbarkJS.onReady(async () => {
|
||||||
this.setState({address: web3.eth.defaultAccount});
|
this.setState({address: web3.eth.defaultAccount});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -36,7 +36,7 @@ class SNTUI extends React.Component {
|
|||||||
|
|
||||||
SNT.methods.controller().call()
|
SNT.methods.controller().call()
|
||||||
.then((controller) => {
|
.then((controller) => {
|
||||||
return SNT.methods.generateTokens(address, value)
|
return SNT.methods.generateTokens(address, value.toString())
|
||||||
.send({from: controller, gasLimit: 1000000});
|
.send({from: controller, gasLimit: 1000000});
|
||||||
})
|
})
|
||||||
.then(console.log);
|
.then(console.log);
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
import web3 from "Embark/web3"
|
|
||||||
import EmbarkJS from 'Embark/EmbarkJS';
|
|
||||||
import React, {Fragment} from 'react';
|
|
||||||
import {Button} from 'react-bootstrap';
|
|
||||||
|
|
||||||
const Paginator = props => {
|
|
||||||
let ln = Math.ceil(props.total / props.recordsByPage);
|
|
||||||
let btnArray = []
|
|
||||||
for(let i = 1; i <= ln; i++){
|
|
||||||
btnArray.push(<Button
|
|
||||||
bsStyle="link"
|
|
||||||
className={i == props.pageNum ? 'current' : ''}
|
|
||||||
onClick={(e) => props.pageHandler(e, i)}>{i}</Button>)
|
|
||||||
}
|
|
||||||
|
|
||||||
return <div>{
|
|
||||||
btnArray.map((component, index) => (
|
|
||||||
<Fragment key={index}>
|
|
||||||
{ component }
|
|
||||||
</Fragment>
|
|
||||||
))
|
|
||||||
}</div>;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Paginator;
|
|
@ -1,67 +0,0 @@
|
|||||||
import web3 from "Embark/web3"
|
|
||||||
import EmbarkJS from 'Embark/EmbarkJS';
|
|
||||||
import React, {Component, Fragment} from 'react';
|
|
||||||
import Proposal from './proposal';
|
|
||||||
import ProposalList from './proposal-list';
|
|
||||||
import Paginator from './paginator';
|
|
||||||
import ProposalManager from 'Embark/contracts/ProposalManager';
|
|
||||||
import ProposalCuration from 'Embark/contracts/ProposalCuration';
|
|
||||||
|
|
||||||
const pageLength = 4;
|
|
||||||
class ProposalContainer extends Component {
|
|
||||||
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.state = {
|
|
||||||
proposals: [],
|
|
||||||
total: 0,
|
|
||||||
page: 1
|
|
||||||
};
|
|
||||||
window['ProposalCuration'] = ProposalCuration;
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount(){
|
|
||||||
__embarkContext.execWhenReady(async () => {
|
|
||||||
ProposalManager.options.address = await ProposalCuration.methods.proposalManager().call();
|
|
||||||
await this.getTotalProposals();
|
|
||||||
await this.getProposalsOnPage(this.state.page);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async getTotalProposals(){
|
|
||||||
let proposalCount = await ProposalManager.methods.getProposalCount().call();
|
|
||||||
this.setState({
|
|
||||||
total: parseInt(proposalCount)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async getProposalsOnPage(pageNum){
|
|
||||||
this.fetchProposals((pageNum - 1) * pageLength, pageLength,
|
|
||||||
_p => {
|
|
||||||
this.setState({
|
|
||||||
proposals: _p,
|
|
||||||
page: pageNum
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async fetchProposals(from, qty, cb){
|
|
||||||
let proposalList = [];
|
|
||||||
for(let i = from; i < from + qty && i < this.state.total; i++){
|
|
||||||
let res = await ProposalCuration.methods.proposals(i).call();
|
|
||||||
res.id = i;
|
|
||||||
proposalList.push(res);
|
|
||||||
}
|
|
||||||
cb(proposalList);
|
|
||||||
}
|
|
||||||
|
|
||||||
render(){
|
|
||||||
return <Fragment>
|
|
||||||
<ProposalList proposals={this.state.proposals} />
|
|
||||||
<Paginator total={this.state.total} recordsByPage={pageLength} page={this.state.page} pageHandler={(e, pageNum) => this.getProposalsOnPage(pageNum) } />
|
|
||||||
</Fragment>;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export default ProposalContainer;
|
|
@ -1,11 +0,0 @@
|
|||||||
import React, {Fragment} from 'react';
|
|
||||||
import Proposal from './proposal';
|
|
||||||
|
|
||||||
const ProposalList = props =>
|
|
||||||
<Fragment>
|
|
||||||
{props.proposals.map((u, i) => (
|
|
||||||
<Proposal key={i} data={u} />
|
|
||||||
))}
|
|
||||||
</Fragment>
|
|
||||||
|
|
||||||
export default ProposalList;
|
|
@ -1,68 +0,0 @@
|
|||||||
import web3 from "Embark/web3"
|
|
||||||
import React from 'react';
|
|
||||||
import $ from 'jquery';
|
|
||||||
import { Button, Alert } from 'react-bootstrap';
|
|
||||||
import EmbarkJS from 'Embark/EmbarkJS';
|
|
||||||
import Voting from './voting';
|
|
||||||
|
|
||||||
class Proposal extends React.Component {
|
|
||||||
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.state = {
|
|
||||||
url: null,
|
|
||||||
title: null,
|
|
||||||
description: null,
|
|
||||||
error: null
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidUpdate(prevProps, prevState, snapshot){
|
|
||||||
if(prevProps.data.description !== this.props.data.description)
|
|
||||||
this.getProposalData();
|
|
||||||
}
|
|
||||||
|
|
||||||
componentDidMount(){
|
|
||||||
__embarkContext.execWhenReady(() => {
|
|
||||||
this.getProposalData();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getProposalData(){
|
|
||||||
let hash = web3.utils.toAscii(this.props.data.description);
|
|
||||||
EmbarkJS.Storage.get(hash)
|
|
||||||
.then((content) => {
|
|
||||||
let jsonObj = JSON.parse(content);
|
|
||||||
this.setState({
|
|
||||||
url: jsonObj.url,
|
|
||||||
title: jsonObj.title,
|
|
||||||
description: jsonObj.description
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
if(err){
|
|
||||||
console.log("Storage get Error => " + err.message);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
render(){
|
|
||||||
return (<div>
|
|
||||||
{
|
|
||||||
this.state.error !== null ?
|
|
||||||
<Alert bsStyle="warning">
|
|
||||||
{ this.state.error }
|
|
||||||
</Alert>
|
|
||||||
: ''
|
|
||||||
}
|
|
||||||
<h3>{ this.state.title }</h3>
|
|
||||||
<p>{ this.state.description }</p>
|
|
||||||
<a href={ this.state.url } target="_blank">{ this.state.url }</a>
|
|
||||||
<Voting proposalId={this.props.data.id} />
|
|
||||||
</div>);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
export default Proposal;
|
|
@ -1,32 +0,0 @@
|
|||||||
import web3 from "Embark/web3"
|
|
||||||
import EmbarkJS from 'Embark/EmbarkJS';
|
|
||||||
import React, {Component} from 'react';
|
|
||||||
import SNT from 'Embark/contracts/SNT'; // TODO change this to SNT
|
|
||||||
|
|
||||||
class StatusBar extends Component {
|
|
||||||
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.state = {
|
|
||||||
balance: 0
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillReceiveProps(){
|
|
||||||
__embarkContext.execWhenReady(async () => {
|
|
||||||
let _b = await SNT.methods.balanceOf(web3.eth.defaultAccount).call();
|
|
||||||
this.setState({
|
|
||||||
balance: _b
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
render(){
|
|
||||||
return <div className="SNTBalance">
|
|
||||||
SNT Voting Balance: <span>{this.state.balance}</span>
|
|
||||||
</div>;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export default StatusBar;
|
|
@ -1,13 +0,0 @@
|
|||||||
import web3 from "Embark/web3"
|
|
||||||
import EmbarkJS from 'Embark/EmbarkJS';
|
|
||||||
import React from 'react';
|
|
||||||
import ProposalContainer from './proposal-container';
|
|
||||||
import StatusBar from './status-bar';
|
|
||||||
|
|
||||||
const VotingDapp = props =>
|
|
||||||
<div>
|
|
||||||
<StatusBar {...props} />
|
|
||||||
<ProposalContainer />
|
|
||||||
</div>;
|
|
||||||
|
|
||||||
export default VotingDapp;
|
|
@ -1,159 +0,0 @@
|
|||||||
import web3 from "Embark/web3"
|
|
||||||
import EmbarkJS from 'Embark/EmbarkJS';
|
|
||||||
import React, {Component, Fragment} from 'react';
|
|
||||||
import { Button } from 'react-bootstrap';
|
|
||||||
import ProposalManager from 'Embark/contracts/ProposalManager';
|
|
||||||
import ProposalCuration from 'Embark/contracts/ProposalCuration';
|
|
||||||
|
|
||||||
class Voting extends Component {
|
|
||||||
|
|
||||||
constructor(props) {
|
|
||||||
super(props);
|
|
||||||
this.state = {
|
|
||||||
decision: 0,
|
|
||||||
finalResult: null,
|
|
||||||
data: null,
|
|
||||||
tabulationAvailable: false,
|
|
||||||
votingAvailable: false
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillReceiveProps(){
|
|
||||||
__embarkContext.execWhenReady(async () => {
|
|
||||||
this._loadProposalData();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async _loadProposalData() {
|
|
||||||
ProposalManager.options.address = await ProposalCuration.methods.proposalManager().call();
|
|
||||||
const _votingInfo = await ProposalManager.methods.getVoteInfo(this.props.proposalId, web3.eth.defaultAccount).call();
|
|
||||||
const _blockNum = await web3.eth.getBlockNumber();
|
|
||||||
const _data = await ProposalManager.methods.proposals(this.props.proposalId).call();
|
|
||||||
|
|
||||||
const _votingAvailable = await ProposalManager.methods.isVotingAvailable(this.props.proposalId).call();
|
|
||||||
const _tabulationAvailable = await ProposalManager.methods.isTabulationAvailable(this.props.proposalId).call();
|
|
||||||
const _voteTabulated = await ProposalManager.methods.isDelegatorVoteTabulated(this.props.proposalId, web3.eth.defaultAccount).call();
|
|
||||||
const _canCalculateFinalResult = await ProposalManager.methods.canCalculateFinalResult(this.props.proposalId).call();
|
|
||||||
|
|
||||||
this.setState({
|
|
||||||
data: _data,
|
|
||||||
decision: _votingInfo.vote,
|
|
||||||
block: _blockNum,
|
|
||||||
finalResult: _data.result,
|
|
||||||
votingAvailable: _votingAvailable,
|
|
||||||
tabulationAvailable: _tabulationAvailable,
|
|
||||||
finalResultAvailable: _canCalculateFinalResult,
|
|
||||||
voteTabulated: _voteTabulated
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
async determineFinalResult(e){
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
let receipt = await ProposalManager.methods.finalResult(this.props.proposalId)
|
|
||||||
.send({from: web3.eth.defaultAccount, gasLimit: 1000000});
|
|
||||||
if(receipt.status == '0x1'){
|
|
||||||
this.setState({
|
|
||||||
finalResult: receipt.events.ProposalResult.returnValues.finalResult,
|
|
||||||
finalResultAvailable: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async tabulateVote(e){
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
const receipt = await ProposalManager.methods.tabulateVote(this.props.proposalId, web3.eth.defaultAccount)
|
|
||||||
.send({from: web3.eth.defaultAccount, gasLimit: 1000000});
|
|
||||||
|
|
||||||
// TODO: handle error
|
|
||||||
|
|
||||||
this._loadProposalData();
|
|
||||||
}
|
|
||||||
|
|
||||||
async handleClick(e, vote){
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
let choice = 0;
|
|
||||||
if(vote == 'APPROVE')
|
|
||||||
choice = 2;
|
|
||||||
else
|
|
||||||
choice = 1;
|
|
||||||
|
|
||||||
const proposal = this.props.proposalId;
|
|
||||||
const receipt = await ProposalManager.methods.voteProposal(this.props.proposalId, choice)
|
|
||||||
.send({from: web3.eth.defaultAccount});
|
|
||||||
|
|
||||||
const _votingAvailable = await ProposalManager.methods.isVotingAvailable(this.props.proposalId).call();
|
|
||||||
const _tabulationAvailable = await ProposalManager.methods.isTabulationAvailable(this.props.proposalId).call();
|
|
||||||
const _voteTabulated = await ProposalManager.methods.isDelegatorVoteTabulated(this.props.proposalId, web3.eth.defaultAccount).call();
|
|
||||||
const _canCalculateFinalResult = await ProposalManager.methods.canCalculateFinalResult(this.props.proposalId).call();
|
|
||||||
|
|
||||||
const blockNum = await web3.eth.getBlockNumber();
|
|
||||||
|
|
||||||
if(receipt.status == '0x1'){
|
|
||||||
this.setState({
|
|
||||||
decision: choice,
|
|
||||||
block: blockNum,
|
|
||||||
votingAvailable: _votingAvailable,
|
|
||||||
tabulationAvailable: _tabulationAvailable,
|
|
||||||
finalResultAvailable: _canCalculateFinalResult,
|
|
||||||
voteTabulated: _voteTabulated
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// TODO: handle error
|
|
||||||
}
|
|
||||||
|
|
||||||
render(){
|
|
||||||
console.log(this.state);
|
|
||||||
return <div>
|
|
||||||
{
|
|
||||||
this.state.decision != 0 ?
|
|
||||||
<p>You voted for: <ResultChoice decision={this.state.decision} /></p>
|
|
||||||
: ''
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
this.state.data != null && this.state.votingAvailable ?
|
|
||||||
<Fragment>
|
|
||||||
<Button onClick={(e) => this.handleClick(e, 'APPROVE') }>Approve</Button>
|
|
||||||
<Button onClick={(e) => this.handleClick(e, 'REJECT') }>Reject</Button>
|
|
||||||
</Fragment>
|
|
||||||
: ''
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
this.state.data != null && this.state.tabulationAvailable && !this.state.voteTabulated ?
|
|
||||||
<Button onClick={(e) => this.tabulateVote(e) }>Tabulate your vote</Button>
|
|
||||||
: ''
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
|
|
||||||
this.state.finalResultAvailable ?
|
|
||||||
<Button onClick={(e) => this.determineFinalResult(e) }>Determine final result</Button>
|
|
||||||
: !this.state.tabulationAvailable && !this.state.voteTabulated ?
|
|
||||||
<p>Final results aren't available yet</p> : ''
|
|
||||||
}
|
|
||||||
|
|
||||||
{ this.state.data != null ?
|
|
||||||
<ul>
|
|
||||||
<li>Voting ends on block: {this.state.data.voteBlockEnd }</li>
|
|
||||||
<li>Current Block: { this.state.block }</li>
|
|
||||||
<li>Final Result: <ResultChoice decision={this.state.finalResult} /></li>
|
|
||||||
</ul>
|
|
||||||
: '' }
|
|
||||||
|
|
||||||
</div>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
const ResultChoice = props =>
|
|
||||||
<span>{props.decision.toString() == '1' ? 'REJECT' : props.decision.toString() == '2' ? 'APPROVE' : ''}</span>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export default Voting;
|
|
0
app/css/.gitkeep
Normal file
0
app/css/.gitkeep
Normal file
0
app/js/.gitkeep
Normal file
0
app/js/.gitkeep
Normal file
6
app/js/index.js
Normal file
6
app/js/index.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import EmbarkJS from 'Embark/EmbarkJS';
|
||||||
|
|
||||||
|
// import your contracts
|
||||||
|
// e.g if you have a contract named SimpleStorage:
|
||||||
|
//import SimpleStorage from 'Embark/contracts/SimpleStorage';
|
||||||
|
|
105
config/blockchain.js
Normal file
105
config/blockchain.js
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
module.exports = {
|
||||||
|
// applies to all environments
|
||||||
|
default: {
|
||||||
|
enabled: true,
|
||||||
|
rpcHost: "localhost", // HTTP-RPC server listening interface (default: "localhost")
|
||||||
|
rpcPort: 8545, // HTTP-RPC server listening port (default: 8545)
|
||||||
|
rpcCorsDomain: "auto", // Comma separated list of domains from which to accept cross origin requests (browser enforced)
|
||||||
|
// When set to "auto", Embark will automatically set the cors to the address of the webserver
|
||||||
|
wsRPC: true, // Enable the WS-RPC server
|
||||||
|
wsOrigins: "auto", // Origins from which to accept websockets requests
|
||||||
|
// When set to "auto", Embark will automatically set the cors to the address of the webserver
|
||||||
|
wsHost: "localhost", // WS-RPC server listening interface (default: "localhost")
|
||||||
|
wsPort: 8546 // WS-RPC server listening port (default: 8546)
|
||||||
|
},
|
||||||
|
|
||||||
|
// default environment, merges with the settings in default
|
||||||
|
// assumed to be the intended environment by `embark run` and `embark blockchain`
|
||||||
|
development: {
|
||||||
|
networkType: "custom", // Can be: testnet, rinkeby, livenet or custom, in which case, it will use the specified networkId
|
||||||
|
networkId: "1337", // Network id used when networkType is custom
|
||||||
|
isDev: true, // Uses and ephemeral proof-of-authority network with a pre-funded developer account, mining enabled
|
||||||
|
datadir: ".embark/development/datadir", // Data directory for the databases and keystore
|
||||||
|
mineWhenNeeded: true, // Uses our custom script (if isDev is false) to mine only when needed
|
||||||
|
nodiscover: true, // Disables the peer discovery mechanism (manual peer addition)
|
||||||
|
maxpeers: 0, // Maximum number of network peers (network disabled if set to 0) (default: 25)
|
||||||
|
proxy: false, // Proxy is used to present meaningful information about transactions
|
||||||
|
targetGasLimit: 8000000, // Target gas limit sets the artificial target gas floor for the blocks to mine
|
||||||
|
simulatorMnemonic: "example exile argue silk regular smile grass bomb merge arm assist farm", // Mnemonic used by the simulator to generate a wallet
|
||||||
|
simulatorBlocktime: 0, // Specify blockTime in seconds for automatic mining. Default is 0 and no auto-mining.
|
||||||
|
account: {
|
||||||
|
// numAccounts: 3, // When specified, creates accounts for use in the dapp. This option only works in the development environment, and can be used as a quick start option that bypasses the need for MetaMask in development. These accounts are unlocked and funded with the below settings.
|
||||||
|
// password: "config/development/password", // Password for the created accounts (as specified in the `numAccounts` setting). If `mineWhenNeeded` is enabled (and isDev is not), this password is used to create a development account controlled by the node.
|
||||||
|
// balance: "5 ether" // Balance to be given to the created accounts (as specified in the `numAccounts` setting)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run privatenet" and/or "embark blockchain privatenet"
|
||||||
|
privatenet: {
|
||||||
|
networkType: "custom",
|
||||||
|
networkId: "1337",
|
||||||
|
isDev: false,
|
||||||
|
datadir: ".embark/privatenet/datadir",
|
||||||
|
// -- mineWhenNeeded --
|
||||||
|
// This options is only valid when isDev is false.
|
||||||
|
// Enabling this option uses our custom script to mine only when needed.
|
||||||
|
// Embark creates a development account for you (using `geth account new`) and funds the account. This account can be used for
|
||||||
|
// development (and even imported in to MetaMask). To enable correct usage, a password for this account must be specified
|
||||||
|
// in the `account > password` setting below.
|
||||||
|
// NOTE: once `mineWhenNeeded` is enabled, you must run an `embark reset` on your dApp before running
|
||||||
|
// `embark blockchain` or `embark run` for the first time.
|
||||||
|
mineWhenNeeded: true,
|
||||||
|
// -- genesisBlock --
|
||||||
|
// This option is only valid when mineWhenNeeded is true (which is only valid if isDev is false).
|
||||||
|
// When enabled, geth uses POW to mine transactions as it would normally, instead of using POA as it does in --dev mode.
|
||||||
|
// On the first `embark blockchain or embark run` after this option is enabled, geth will create a new chain with a
|
||||||
|
// genesis block, which can be configured using the `genesisBlock` configuration option below.
|
||||||
|
genesisBlock: "config/privatenet/genesis.json", // Genesis block to initiate on first creation of a development node
|
||||||
|
nodiscover: true,
|
||||||
|
maxpeers: 0,
|
||||||
|
proxy: true,
|
||||||
|
account: {
|
||||||
|
// "address": "", // When specified, uses that address instead of the default one for the network
|
||||||
|
password: "config/privatenet/password" // Password to unlock the account. If `mineWhenNeeded` is enabled (and isDev is not), this password is used to create a development account controlled by the node.
|
||||||
|
},
|
||||||
|
targetGasLimit: 8000000,
|
||||||
|
simulatorMnemonic: "example exile argue silk regular smile grass bomb merge arm assist farm",
|
||||||
|
simulatorBlocktime: 0
|
||||||
|
},
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run testnet" and/or "embark blockchain testnet"
|
||||||
|
testnet: {
|
||||||
|
networkType: "testnet",
|
||||||
|
syncMode: "light",
|
||||||
|
account: {
|
||||||
|
password: "config/testnet/password"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
testnet_devcoin: {
|
||||||
|
networkType: "testnet",
|
||||||
|
syncMode: "light",
|
||||||
|
account: {
|
||||||
|
password: "config/testnet/password"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run livenet" and/or "embark blockchain livenet"
|
||||||
|
livenet: {
|
||||||
|
networkType: "livenet",
|
||||||
|
syncMode: "light",
|
||||||
|
rpcCorsDomain: "http://localhost:8000",
|
||||||
|
wsOrigins: "http://localhost:8000",
|
||||||
|
account: {
|
||||||
|
password: "config/livenet/password"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// you can name an environment with specific settings and then specify with
|
||||||
|
// "embark run custom_name" or "embark blockchain custom_name"
|
||||||
|
//custom_name: {
|
||||||
|
//}
|
||||||
|
};
|
@ -1,89 +0,0 @@
|
|||||||
{
|
|
||||||
"development": {
|
|
||||||
"enabled": true,
|
|
||||||
"networkType": "custom",
|
|
||||||
"genesisBlock": "config/development/genesis.json",
|
|
||||||
"datadir": ".embark/development/datadir",
|
|
||||||
"mineWhenNeeded": true,
|
|
||||||
"nodiscover": true,
|
|
||||||
"maxpeers": 0,
|
|
||||||
"rpcHost": "localhost",
|
|
||||||
"rpcPort": 8545,
|
|
||||||
"rpcCorsDomain": "auto",
|
|
||||||
"account": {
|
|
||||||
"password": "config/development/password"
|
|
||||||
},
|
|
||||||
"targetGasLimit": 8000000,
|
|
||||||
"wsOrigins": "auto",
|
|
||||||
"wsRPC": true,
|
|
||||||
"wsHost": "localhost",
|
|
||||||
"wsPort": 8546,
|
|
||||||
"simulatorMnemonic": "example exile argue silk regular smile grass bomb merge arm assist farm",
|
|
||||||
"simulatorBlocktime": 0
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"testnet": {
|
|
||||||
"enabled": true,
|
|
||||||
"proxy": false,
|
|
||||||
"networkType": "testnet",
|
|
||||||
"syncMode": "light",
|
|
||||||
"rpcHost": "localhost",
|
|
||||||
"rpcPort": 8545,
|
|
||||||
"rpcCorsDomain": "http://localhost:8000",
|
|
||||||
"account": {
|
|
||||||
"password": "config/testnet/password"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"testnet_devcoin": {
|
|
||||||
"enabled": true,
|
|
||||||
"proxy": false,
|
|
||||||
"networkType": "testnet",
|
|
||||||
"syncMode": "light",
|
|
||||||
"rpcHost": "localhost",
|
|
||||||
"rpcPort": 8545,
|
|
||||||
"rpcCorsDomain": "http://localhost:8000",
|
|
||||||
"account": {
|
|
||||||
"password": "config/testnet/password"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
"staging": {
|
|
||||||
"enabled": true,
|
|
||||||
"proxy": false,
|
|
||||||
"networkType": "livenet",
|
|
||||||
"syncMode": "light",
|
|
||||||
"rpcHost": "localhost",
|
|
||||||
"rpcPort": 8545,
|
|
||||||
"rpcCorsDomain": "http://localhost:8000",
|
|
||||||
"account": {
|
|
||||||
"password": "config/staging/password"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"livenet": {
|
|
||||||
"enabled": true,
|
|
||||||
"proxy": false,
|
|
||||||
"networkType": "livenet",
|
|
||||||
"syncMode": "light",
|
|
||||||
"rpcHost": "localhost",
|
|
||||||
"rpcPort": 8545,
|
|
||||||
"rpcCorsDomain": "http://localhost:8000",
|
|
||||||
"account": {
|
|
||||||
"password": "config/livenet/password"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"privatenet": {
|
|
||||||
"enabled": true,
|
|
||||||
"proxy": false,
|
|
||||||
"networkType": "custom",
|
|
||||||
"rpcHost": "localhost",
|
|
||||||
"rpcPort": 8545,
|
|
||||||
"rpcCorsDomain": "http://localhost:8000",
|
|
||||||
"datadir": "yourdatadir",
|
|
||||||
"networkId": "123",
|
|
||||||
"bootnodes": ""
|
|
||||||
}
|
|
||||||
}
|
|
40
config/communication.js
Normal file
40
config/communication.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
module.exports = {
|
||||||
|
// default applies to all environments
|
||||||
|
default: {
|
||||||
|
enabled: false,
|
||||||
|
provider: "whisper", // Communication provider. Currently, Embark only supports whisper
|
||||||
|
available_providers: ["whisper"], // Array of available providers
|
||||||
|
},
|
||||||
|
|
||||||
|
// default environment, merges with the settings in default
|
||||||
|
// assumed to be the intended environment by `embark run`
|
||||||
|
development: {
|
||||||
|
connection: {
|
||||||
|
host: "localhost", // Host of the blockchain node
|
||||||
|
port: 8546, // Port of the blockchain node
|
||||||
|
type: "ws" // Type of connection (ws or rpc)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run privatenet"
|
||||||
|
privatenet: {
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run testnet"
|
||||||
|
testnet: {
|
||||||
|
},
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run livenet"
|
||||||
|
livenet: {
|
||||||
|
},
|
||||||
|
|
||||||
|
// you can name an environment with specific settings and then specify with
|
||||||
|
// "embark run custom_name"
|
||||||
|
//custom_name: {
|
||||||
|
//}
|
||||||
|
};
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"default": {
|
|
||||||
"enabled": true,
|
|
||||||
"provider": "whisper",
|
|
||||||
"available_providers": ["whisper", "orbit"],
|
|
||||||
"connection": {
|
|
||||||
"host": "localhost",
|
|
||||||
"port": 8546,
|
|
||||||
"type": "ws"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
185
config/contracts.js
Normal file
185
config/contracts.js
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
module.exports = {
|
||||||
|
// default applies to all environments
|
||||||
|
default: {
|
||||||
|
// Blockchain node to deploy the contracts
|
||||||
|
deployment: {
|
||||||
|
host: "localhost", // Host of the blockchain node
|
||||||
|
port: 8545, // Port of the blockchain node
|
||||||
|
type: "rpc" // Type of connection (ws or rpc),
|
||||||
|
// Accounts to use instead of the default account to populate your wallet
|
||||||
|
/*,accounts: [
|
||||||
|
{
|
||||||
|
privateKey: "your_private_key",
|
||||||
|
balance: "5 ether" // You can set the balance of the account in the dev environment
|
||||||
|
// Balances are in Wei, but you can specify the unit with its name
|
||||||
|
},
|
||||||
|
{
|
||||||
|
privateKeyFile: "path/to/file", // Either a keystore or a list of keys, separated by , or ;
|
||||||
|
password: "passwordForTheKeystore" // Needed to decrypt the keystore file
|
||||||
|
},
|
||||||
|
{
|
||||||
|
mnemonic: "12 word mnemonic",
|
||||||
|
addressIndex: "0", // Optionnal. The index to start getting the address
|
||||||
|
numAddresses: "1", // Optionnal. The number of addresses to get
|
||||||
|
hdpath: "m/44'/60'/0'/0/" // Optionnal. HD derivation path
|
||||||
|
}
|
||||||
|
]*/
|
||||||
|
},
|
||||||
|
// order of connections the dapp should connect to
|
||||||
|
dappConnection: [
|
||||||
|
"$WEB3", // uses pre existing web3 object if available (e.g in Mist)
|
||||||
|
"ws://localhost:8546",
|
||||||
|
"http://localhost:8545"
|
||||||
|
],
|
||||||
|
gas: "auto",
|
||||||
|
contracts: {
|
||||||
|
"ERC20Receiver": { "deploy": false },
|
||||||
|
"MiniMeToken": { "deploy": false },
|
||||||
|
"TestToken": {
|
||||||
|
},
|
||||||
|
"MiniMeTokenFactory": {
|
||||||
|
|
||||||
|
},
|
||||||
|
"SNT": {
|
||||||
|
"instanceOf": "MiniMeToken",
|
||||||
|
"args": [
|
||||||
|
"$MiniMeTokenFactory",
|
||||||
|
"0x0000000000000000000000000000000000000000",
|
||||||
|
0,
|
||||||
|
"TestMiniMeToken",
|
||||||
|
18,
|
||||||
|
"TST",
|
||||||
|
true
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"PollManager": {
|
||||||
|
"args": ["$SNT"]
|
||||||
|
},
|
||||||
|
"RLPHelper": {
|
||||||
|
"deploy": false
|
||||||
|
},
|
||||||
|
"RLPReader": {
|
||||||
|
"deploy": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// default environment, merges with the settings in default
|
||||||
|
// assumed to be the intended environment by `embark run`
|
||||||
|
development: {
|
||||||
|
dappConnection: [
|
||||||
|
"ws://localhost:8546",
|
||||||
|
"http://localhost:8545",
|
||||||
|
"$WEB3" // uses pre existing web3 object if available (e.g in Mist)
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run privatenet"
|
||||||
|
privatenet: {
|
||||||
|
},
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run testnet"
|
||||||
|
testnet: {
|
||||||
|
deployment: {
|
||||||
|
host: "localhost",
|
||||||
|
port: 8545,
|
||||||
|
type: "rpc",
|
||||||
|
accounts: [
|
||||||
|
{
|
||||||
|
privateKey: "0x00000...."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"contracts": {
|
||||||
|
"TestToken": { "deploy": false },
|
||||||
|
"MiniMeTokenFactory": {
|
||||||
|
"address": "0x6bfa86a71a7dbc68566d5c741f416e3009804279"
|
||||||
|
},
|
||||||
|
"SNT": {
|
||||||
|
"instanceOf": "MiniMeToken",
|
||||||
|
"address": "0xc55cf4b03948d7ebc8b9e8bad92643703811d162"
|
||||||
|
},
|
||||||
|
"PollManager": {
|
||||||
|
"args": ["$SNT"],
|
||||||
|
"gasPrice": 5000000000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"testnet_devcoin":{
|
||||||
|
deployment: {
|
||||||
|
host: "localhost",
|
||||||
|
port: 8545,
|
||||||
|
type: "rpc",
|
||||||
|
accounts: [
|
||||||
|
{
|
||||||
|
privateKey: "0x00000...."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"contracts": {
|
||||||
|
"TestToken": { "deploy": false },
|
||||||
|
"MiniMeTokenFactory": {
|
||||||
|
"gasPrice": 5000000000
|
||||||
|
},
|
||||||
|
"SNT": {
|
||||||
|
"instanceOf": "MiniMeToken",
|
||||||
|
"args": [
|
||||||
|
"$MiniMeTokenFactory",
|
||||||
|
"0x0000000000000000000000000000000000000000",
|
||||||
|
0,
|
||||||
|
"Status Core Dev Token (TEST)",
|
||||||
|
18,
|
||||||
|
"SCT",
|
||||||
|
true
|
||||||
|
],
|
||||||
|
"gasPrice": 5000000000
|
||||||
|
},
|
||||||
|
"PollManager": {
|
||||||
|
"args": ["$SNT"],
|
||||||
|
"gasPrice": 5000000000
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"staging":{
|
||||||
|
"contracts": {
|
||||||
|
"TestToken": { "deploy": false },
|
||||||
|
"MiniMeTokenFactory": {
|
||||||
|
"address": "0xa1c957C0210397D2d0296341627B74411756d476"
|
||||||
|
},
|
||||||
|
"SNT": {
|
||||||
|
"instanceOf": "MiniMeToken",
|
||||||
|
"address": "0x744d70fdbe2ba4cf95131626614a1763df805b9e"
|
||||||
|
},
|
||||||
|
"PollManager": {
|
||||||
|
"address": "0x0e222932911b9a558104b4b4b2f330398561436f"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run livenet"
|
||||||
|
livenet: {
|
||||||
|
"contracts": {
|
||||||
|
"TestToken": { "deploy": false },
|
||||||
|
"MiniMeTokenFactory": {
|
||||||
|
"address": "0xa1c957C0210397D2d0296341627B74411756d476"
|
||||||
|
},
|
||||||
|
"SNT": {
|
||||||
|
"instanceOf": "MiniMeToken",
|
||||||
|
"address": "0x744d70fdbe2ba4cf95131626614a1763df805b9e"
|
||||||
|
},
|
||||||
|
"PollManager": {
|
||||||
|
"address": "0x0e222932911b9a558104b4b4b2f330398561436f"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// you can name an environment with specific settings and then specify with
|
||||||
|
// "embark run custom_name" or "embark blockchain custom_name"
|
||||||
|
//custom_name: {
|
||||||
|
//}
|
||||||
|
};
|
@ -1,141 +0,0 @@
|
|||||||
{
|
|
||||||
"default": {
|
|
||||||
"deployment": {
|
|
||||||
"host": "localhost",
|
|
||||||
"port": 8545,
|
|
||||||
"type": "rpc"
|
|
||||||
},
|
|
||||||
"dappConnection": [
|
|
||||||
"$WEB3",
|
|
||||||
"http://localhost:8545"
|
|
||||||
],
|
|
||||||
|
|
||||||
"gas": "auto",
|
|
||||||
"contracts": {
|
|
||||||
"ERC20Receiver": { "deploy": false },
|
|
||||||
"MiniMeToken": { "deploy": false },
|
|
||||||
"TestToken": {
|
|
||||||
},
|
|
||||||
"MiniMeTokenFactory": {
|
|
||||||
|
|
||||||
},
|
|
||||||
"SNT": {
|
|
||||||
"instanceOf": "MiniMeToken",
|
|
||||||
"args": [
|
|
||||||
"$MiniMeTokenFactory",
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
"TestMiniMeToken",
|
|
||||||
18,
|
|
||||||
"TST",
|
|
||||||
true
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"PollManager": {
|
|
||||||
"args": ["$SNT"]
|
|
||||||
},
|
|
||||||
"RLPHelper": {
|
|
||||||
"deploy": false
|
|
||||||
},
|
|
||||||
"RLPReader": {
|
|
||||||
"deploy": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"testnet":{
|
|
||||||
"deployment": {
|
|
||||||
"host": "localhost",
|
|
||||||
"port": 8545,
|
|
||||||
"type": "rpc",
|
|
||||||
"accounts": [
|
|
||||||
{
|
|
||||||
"privateKey": "0x00000"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"contracts": {
|
|
||||||
"TestToken": { "deploy": false },
|
|
||||||
"MiniMeTokenFactory": {
|
|
||||||
"address": "0x6bfa86a71a7dbc68566d5c741f416e3009804279"
|
|
||||||
},
|
|
||||||
"SNT": {
|
|
||||||
"instanceOf": "MiniMeToken",
|
|
||||||
"address": "0xc55cf4b03948d7ebc8b9e8bad92643703811d162"
|
|
||||||
},
|
|
||||||
"PollManager": {
|
|
||||||
"args": ["$SNT"],
|
|
||||||
"gasPrice": 5000000000
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
"testnet_devcoin":{
|
|
||||||
"deployment": {
|
|
||||||
"host": "localhost",
|
|
||||||
"port": 8545,
|
|
||||||
"type": "rpc",
|
|
||||||
"accounts": [
|
|
||||||
{
|
|
||||||
"privateKey": "0x00000"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"contracts": {
|
|
||||||
"TestToken": { "deploy": false },
|
|
||||||
"MiniMeTokenFactory": {
|
|
||||||
"gasPrice": 5000000000
|
|
||||||
},
|
|
||||||
"SNT": {
|
|
||||||
"instanceOf": "MiniMeToken",
|
|
||||||
"args": [
|
|
||||||
"$MiniMeTokenFactory",
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
"Status Core Dev Token (TEST)",
|
|
||||||
18,
|
|
||||||
"SCT",
|
|
||||||
true
|
|
||||||
],
|
|
||||||
"gasPrice": 5000000000
|
|
||||||
},
|
|
||||||
"PollManager": {
|
|
||||||
"args": ["$SNT"],
|
|
||||||
"gasPrice": 5000000000
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"staging":{
|
|
||||||
"contracts": {
|
|
||||||
"TestToken": { "deploy": false },
|
|
||||||
"MiniMeTokenFactory": {
|
|
||||||
"address": "0xa1c957C0210397D2d0296341627B74411756d476"
|
|
||||||
},
|
|
||||||
"SNT": {
|
|
||||||
"instanceOf": "MiniMeToken",
|
|
||||||
"address": "0x744d70fdbe2ba4cf95131626614a1763df805b9e"
|
|
||||||
},
|
|
||||||
"PollManager": {
|
|
||||||
"address": "0x0e222932911b9a558104b4b4b2f330398561436f"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"livenet":{
|
|
||||||
"contracts": {
|
|
||||||
"TestToken": { "deploy": false },
|
|
||||||
"MiniMeTokenFactory": {
|
|
||||||
"address": "0xa1c957C0210397D2d0296341627B74411756d476"
|
|
||||||
},
|
|
||||||
"SNT": {
|
|
||||||
"instanceOf": "MiniMeToken",
|
|
||||||
"address": "0x744d70fdbe2ba4cf95131626614a1763df805b9e"
|
|
||||||
},
|
|
||||||
"PollManager": {
|
|
||||||
"address": "0x0e222932911b9a558104b4b4b2f330398561436f"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +1,39 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
|
// default applies to all environments
|
||||||
default: {
|
default: {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
available_providers: ["ens"],
|
available_providers: ["ens"],
|
||||||
provider: "ens"
|
provider: "ens"
|
||||||
}
|
},
|
||||||
|
|
||||||
|
// default environment, merges with the settings in default
|
||||||
|
// assumed to be the intended environment by `embark run`
|
||||||
|
development: {
|
||||||
|
register: {
|
||||||
|
rootDomain: "embark.eth",
|
||||||
|
subdomains: {
|
||||||
|
'status': '0x1a2f3b98e434c02363f3dac3174af93c1d690914'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run privatenet"
|
||||||
|
privatenet: {
|
||||||
|
},
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run testnet"
|
||||||
|
testnet: {
|
||||||
|
},
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run livenet"
|
||||||
|
livenet: {
|
||||||
|
},
|
||||||
|
|
||||||
|
// you can name an environment with specific settings and then specify with
|
||||||
|
// "embark run custom_name" or "embark blockchain custom_name"
|
||||||
|
//custom_name: {
|
||||||
|
//}
|
||||||
};
|
};
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"config": {
|
"config": {
|
||||||
"homesteadBlock": 1,
|
"homesteadBlock": 0,
|
||||||
"byzantiumBlock": 1,
|
"byzantiumBlock": 0,
|
||||||
"daoForkSupport": true
|
"daoForkSupport": true
|
||||||
},
|
},
|
||||||
"nonce": "0x0000000000000042",
|
"nonce": "0x0000000000000042",
|
59
config/storage.js
Normal file
59
config/storage.js
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
module.exports = {
|
||||||
|
// default applies to all environments
|
||||||
|
default: {
|
||||||
|
enabled: true,
|
||||||
|
ipfs_bin: "ipfs",
|
||||||
|
provider: "ipfs",
|
||||||
|
available_providers: ["ipfs"],
|
||||||
|
upload: {
|
||||||
|
host: "localhost",
|
||||||
|
port: 5001
|
||||||
|
},
|
||||||
|
dappConnection: [
|
||||||
|
{
|
||||||
|
provider: "ipfs",
|
||||||
|
host: "localhost",
|
||||||
|
port: 5001,
|
||||||
|
getUrl: "http://localhost:8080/ipfs/"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
// Configuration to start Swarm in the same terminal as `embark run`
|
||||||
|
/*,account: {
|
||||||
|
address: "YOUR_ACCOUNT_ADDRESS", // Address of account accessing Swarm
|
||||||
|
password: "PATH/TO/PASSWORD/FILE" // File containing the password of the account
|
||||||
|
},
|
||||||
|
swarmPath: "PATH/TO/SWARM/EXECUTABLE" // Path to swarm executable (default: swarm)*/
|
||||||
|
},
|
||||||
|
|
||||||
|
// default environment, merges with the settings in default
|
||||||
|
// assumed to be the intended environment by `embark run`
|
||||||
|
development: {
|
||||||
|
enabled: false,
|
||||||
|
provider: "ipfs",
|
||||||
|
upload: {
|
||||||
|
host: "localhost",
|
||||||
|
port: 5001,
|
||||||
|
getUrl: "http://localhost:8080/ipfs/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run privatenet"
|
||||||
|
privatenet: {
|
||||||
|
},
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run testnet"
|
||||||
|
testnet: {
|
||||||
|
},
|
||||||
|
|
||||||
|
// merges with the settings in default
|
||||||
|
// used with "embark run livenet"
|
||||||
|
livenet: {
|
||||||
|
},
|
||||||
|
|
||||||
|
// you can name an environment with specific settings and then specify with
|
||||||
|
// "embark run custom_name"
|
||||||
|
//custom_name: {
|
||||||
|
//}
|
||||||
|
};
|
@ -1,20 +0,0 @@
|
|||||||
{
|
|
||||||
"default": {
|
|
||||||
"versions": {
|
|
||||||
"ipfs-api": "17.2.4"
|
|
||||||
},
|
|
||||||
"enabled": false,
|
|
||||||
"ipfs_bin": "ipfs",
|
|
||||||
"provider": "ipfs",
|
|
||||||
"available_providers": ["ipfs"],
|
|
||||||
"host": "localhost",
|
|
||||||
"port": 5001
|
|
||||||
},
|
|
||||||
"development": {
|
|
||||||
"enabled": false,
|
|
||||||
"provider": "ipfs",
|
|
||||||
"host": "localhost",
|
|
||||||
"port": 5001,
|
|
||||||
"getUrl": "http://localhost:8080/ipfs/"
|
|
||||||
}
|
|
||||||
}
|
|
6
config/webserver.js
Normal file
6
config/webserver.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
module.exports = {
|
||||||
|
enabled: true,
|
||||||
|
host: "localhost",
|
||||||
|
openBrowser: true,
|
||||||
|
port: 8000
|
||||||
|
};
|
@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"enabled": true,
|
|
||||||
"host": "localhost",
|
|
||||||
"port": 8000
|
|
||||||
}
|
|
0
contracts/.gitkeep
Normal file
0
contracts/.gitkeep
Normal file
10
embark.json
10
embark.json
@ -2,18 +2,22 @@
|
|||||||
"contracts": ["contracts/**"],
|
"contracts": ["contracts/**"],
|
||||||
"app": {
|
"app": {
|
||||||
"js/dapp.js": ["app/dapp.js"],
|
"js/dapp.js": ["app/dapp.js"],
|
||||||
"js/migration.js": ["app/migration.js"],
|
|
||||||
"index.html": "app/index.html",
|
"index.html": "app/index.html",
|
||||||
"migration.html": "app/migration.html",
|
|
||||||
"images/": ["app/images/**"]
|
"images/": ["app/images/**"]
|
||||||
},
|
},
|
||||||
"buildDir": "dist/",
|
"buildDir": "dist/",
|
||||||
"config": "config/",
|
"config": "config/",
|
||||||
"versions": {
|
"versions": {
|
||||||
"web3": "1.0.0-beta.34",
|
"web3": "1.0.0-beta.34",
|
||||||
"solc": "0.4.24",
|
"solc": "0.4.25",
|
||||||
"ipfs-api": "17.2.4"
|
"ipfs-api": "17.2.4"
|
||||||
},
|
},
|
||||||
"plugins": {
|
"plugins": {
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"solc": {
|
||||||
|
"optimize": true,
|
||||||
|
"optimize-runs": 200
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
987
package-lock.json
generated
987
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
26
package.json
26
package.json
@ -16,22 +16,32 @@
|
|||||||
"url": "https://github.com/status-im/contracts/issues"
|
"url": "https://github.com/status-im/contracts/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/status-im/contracts#readme",
|
"homepage": "https://github.com/status-im/contracts#readme",
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/plugin-proposal-class-properties": "^7.0.0",
|
||||||
|
"@babel/plugin-proposal-decorators": "^7.0.0",
|
||||||
|
"@babel/plugin-proposal-export-namespace-from": "^7.0.0",
|
||||||
|
"@babel/plugin-proposal-function-sent": "^7.0.0",
|
||||||
|
"@babel/plugin-proposal-json-strings": "^7.0.0",
|
||||||
|
"@babel/plugin-proposal-numeric-separator": "^7.0.0",
|
||||||
|
"@babel/plugin-proposal-object-rest-spread": "^7.0.0",
|
||||||
|
"@babel/plugin-proposal-throw-expressions": "^7.0.0",
|
||||||
|
"@babel/plugin-syntax-dynamic-import": "^7.0.0",
|
||||||
|
"@babel/plugin-syntax-import-meta": "^7.0.0"
|
||||||
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@material-ui/core": "^1.3.0",
|
"@material-ui/core": "^3.0.0",
|
||||||
"@material-ui/icons": "^1.1.0",
|
"@material-ui/icons": "^3.0.0",
|
||||||
"@material-ui/lab": "^1.0.0-alpha.5",
|
"@material-ui/lab": "^1.0.0-alpha.12",
|
||||||
"axios": "^0.18.0",
|
"axios": "^0.18.0",
|
||||||
"babel-plugin-transform-object-rest-spread": "^6.26.0",
|
"lodash": "^4.17.10",
|
||||||
"babel-preset-stage-2": "^6.24.1",
|
|
||||||
"bignumber.js": "^5.0.0",
|
"bignumber.js": "^5.0.0",
|
||||||
"bootstrap": "^3.3.7",
|
"bootstrap": "^3.3.7",
|
||||||
"formik": "^0.11.11",
|
"formik": "^0.11.11",
|
||||||
"jquery": "^3.3.1",
|
"jquery": "^3.3.1",
|
||||||
"lodash": "^4.17.10",
|
"react": "^16.4.2",
|
||||||
"react": "^16.3.2",
|
|
||||||
"react-blockies": "^1.3.0",
|
"react-blockies": "^1.3.0",
|
||||||
"react-bootstrap": "^0.32.1",
|
"react-bootstrap": "^0.32.1",
|
||||||
"react-dom": "^16.3.2",
|
"react-dom": "^16.4.2",
|
||||||
"react-toggle": "^4.0.2",
|
"react-toggle": "^4.0.2",
|
||||||
"rlp": "^2.1.0",
|
"rlp": "^2.1.0",
|
||||||
"typeface-roboto": "0.0.54"
|
"typeface-roboto": "0.0.54"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user