From eebb8b352b9f5313dc47ab39fc170dd5c795eb73 Mon Sep 17 00:00:00 2001 From: Ricardo Guilherme Schmidt Date: Sat, 12 Jan 2019 11:42:31 -0200 Subject: [PATCH] simplify bootstrap --- app/actions/accounts.js | 19 --- .../{testtoken.js => TestStatusNetwork.js} | 24 +--- app/components/accountList.js | 66 ---------- app/components/accountlist.css | 37 ------ app/components/erc20token.js | 35 +---- app/components/topnavbar.js | 33 ----- app/dapp.js | 11 +- app/index.js | 11 +- app/reducers/accounts.js | 54 -------- app/reducers/rootReducer.js | 8 -- app/store/configureStore.js | 11 -- app/store/init.js | 12 -- config/blockchain.js | 38 ++++-- config/contracts.js | 8 +- config/storage.js | 32 ++++- package.json | 4 - test/minimetoken.js | 123 ++++++++++++++++++ test/teststatusnetwork.js | 53 ++++++++ test/testtoken.js | 55 -------- 19 files changed, 250 insertions(+), 384 deletions(-) delete mode 100644 app/actions/accounts.js rename app/components/{testtoken.js => TestStatusNetwork.js} (62%) delete mode 100644 app/components/accountList.js delete mode 100644 app/components/accountlist.css delete mode 100644 app/components/topnavbar.js delete mode 100644 app/reducers/accounts.js delete mode 100644 app/reducers/rootReducer.js delete mode 100644 app/store/configureStore.js delete mode 100644 app/store/init.js create mode 100644 test/minimetoken.js create mode 100644 test/teststatusnetwork.js delete mode 100644 test/testtoken.js diff --git a/app/actions/accounts.js b/app/actions/accounts.js deleted file mode 100644 index 6e5323a..0000000 --- a/app/actions/accounts.js +++ /dev/null @@ -1,19 +0,0 @@ -import ERC20Token from 'Embark/contracts/ERC20Token'; -import { actions as accountActions } from '../reducers/accounts' - -const { receiveAccounts } = accountActions -export const fetchAndDispatchAccountsWithBalances = (web3, dispatch) => { - web3.eth.getAccounts((err, addresses) => { - if (addresses) { - const defaultAccount = web3.eth.defaultAccount || addresses[0] - const accounts = addresses.map(async address => { - const balance = await web3.eth.getBalance(address, 'latest') - const ERC20TokenBalance = await ERC20Token.methods.balanceOf(address).call() - return { address, balance, ERC20TokenBalance } - }) - Promise.all(accounts).then(accounts => { - dispatch(receiveAccounts(defaultAccount, accounts)) - }) - } - }) -} diff --git a/app/components/testtoken.js b/app/components/TestStatusNetwork.js similarity index 62% rename from app/components/testtoken.js rename to app/components/TestStatusNetwork.js index 4d8545a..235b916 100644 --- a/app/components/testtoken.js +++ b/app/components/TestStatusNetwork.js @@ -1,11 +1,9 @@ import EmbarkJS from 'Embark/EmbarkJS'; -import StatusRoot from 'Embark/contracts/StatusRoot'; +import TestStatusNetwork from 'Embark/contracts/TestStatusNetwork'; import MiniMeToken from 'Embark/contracts/MiniMeToken'; import React from 'react'; import { Form, FormGroup, FormControl, HelpBlock, Button } from 'react-bootstrap'; import ERC20TokenUI from './erc20token'; -import { connect } from 'react-redux'; -import { actions as accountActions } from '../reducers/accounts'; class TestTokenUI extends React.Component { @@ -20,20 +18,18 @@ class TestTokenUI extends React.Component { this.setState({amountToMint: e.target.value}); } - mint(e){ - const { addToBalance } = this.props; + async mint(e){ e.preventDefault(); - + await EmbarkJS.enableEthereum(); var value = parseInt(this.state.amountToMint, 10); - StatusRoot.methods.mint(value).send({from: web3.eth.defaultAccount}) - .then(r => { addToBalance(value) }); + TestStatusNetwork.methods.mint(value).send({ gas: 1000000 }) - console.log(StatusRoot.options.address +".mint("+value+").send({from: " + web3.eth.defaultAccount + "})"); + console.log(TestStatusNetwork.options.address +".mint("+value+").send({from: " + web3.eth.defaultAccount + "})"); } render(){ return ( -

Mint Test Token

+

Test Status Network

({ - addToBalance(amount) { - dispatch(accountActions.addToErc20TokenBalance(amount)); - }, -}); - -export default connect(null, mapDispatchToProps)(TestTokenUI); +export default TestTokenUI; diff --git a/app/components/accountList.js b/app/components/accountList.js deleted file mode 100644 index adcd873..0000000 --- a/app/components/accountList.js +++ /dev/null @@ -1,66 +0,0 @@ -import web3 from 'Embark/web3' -import React from 'react'; -import { connect } from 'react-redux'; -import { Nav, MenuItem, NavDropdown } from 'react-bootstrap'; -import Blockies from 'react-blockies'; -import { string, bool, func, arrayOf, shape } from 'prop-types'; -import { getAccounts, getDefaultAccount, accountsIsLoading, actions as accountActions } from '../reducers/accounts'; -import './accountlist.css'; - -const AccList = ({ - accounts, defaultAccount, changeAccount, isLoading, classNameNavDropdown, -}) => ( - - {!isLoading ? -
-
- -
-
- -
-
- :
Loading...
} -
-); - -AccList.propTypes = { - accounts: arrayOf(shape({ address: string, balance: string })).isRequired, - defaultAccount: string, - changeAccount: func.isRequired, - isLoading: bool.isRequired, - classNameNavDropdown: string -} - -const mapStateToProps = state => ({ - accounts: getAccounts(state), - defaultAccount: getDefaultAccount(state), - isLoading: accountsIsLoading(state), -}); - -const mapDispatchToProps = dispatch => ({ - changeAccount(address) { - web3.eth.defaultAccount = address; - dispatch(accountActions.updateDefaultAccount(address)); - }, -}); - -export default connect(mapStateToProps, mapDispatchToProps)(AccList); diff --git a/app/components/accountlist.css b/app/components/accountlist.css deleted file mode 100644 index 35b9ddd..0000000 --- a/app/components/accountlist.css +++ /dev/null @@ -1,37 +0,0 @@ -.identicon { - border-radius: 50%; -} - -.selectedIdenticon { - border-radius: 50%; - overflow: hidden; - float: left; - margin: 7px 0; -} - -.accountHexString { - margin-left: 7px; - width: 267px; - overflow: hidden; - text-overflow: ellipsis; - display:inline-block; -} - -.accountBalance { - margin-left: 10px; - overflow: hidden; - display: inline-block; - width:77px; - text-align: center; - text-overflow: ellipsis; -} - -.accountList { - float: left; - margin-left: 10px; -} - -.account { - display: flex; - align-items: center; -} \ No newline at end of file diff --git a/app/components/erc20token.js b/app/components/erc20token.js index 173b706..1a859fa 100644 --- a/app/components/erc20token.js +++ b/app/components/erc20token.js @@ -1,9 +1,7 @@ import EmbarkJS from 'Embark/EmbarkJS'; import ERC20Token from 'Embark/contracts/ERC20Token'; import React from 'react'; -import { connect } from 'react-redux'; import { Form, FormGroup, FormControl, HelpBlock, Button } from 'react-bootstrap'; -import { getCurrentAccount, accountsIsLoading } from '../reducers/accounts'; class ERC20TokenUI extends React.Component { @@ -44,24 +42,14 @@ class ERC20TokenUI extends React.Component { balanceOf(e){ e.preventDefault(); var who = e.target.value; - if (EmbarkJS.isNewWeb3()) { - ERC20Token.methods.balanceOf(who).call() - .then(_value => this.setState({balanceOf: _value})) - } else { - ERC20Token.balanceOf(who) - .then(_value => this.x({balanceOf: _value})); - } + ERC20Token.methods.balanceOf(who).call() + .then(_value => this.setState({balanceOf: _value})) this._addToLog(ERC20Token.options.address+".balanceOf(" + who + ")"); } getDefaultAccountBalance(){ - if (EmbarkJS.isNewWeb3()) { - ERC20Token.methods.balanceOf(web3.eth.defaultAccount).call() - .then(_value => this.setState({accountBalance: _value})) - } else { - ERC20Token.balanceOf(web3.eth.defaultAccount) - .then(_value => this.x({valueGet: _value})) - } + ERC20Token.methods.balanceOf(web3.eth.defaultAccount).call() + .then(_value => this.setState({accountBalance: _value})) this._addToLog(ERC20Token.options.address + ".balanceOf(" + web3.eth.defaultAccount + ")"); } @@ -70,16 +58,9 @@ class ERC20TokenUI extends React.Component { } render() { - const { account, isLoading } = this.props; + return ( -

Read your account token balance

- - - {!isLoading && Your test token balance is {account.ERC20TokenBalance}} - - -

Read account token balance

@@ -124,9 +105,5 @@ class ERC20TokenUI extends React.Component { } } -const mapStateToProps = state => ({ - account: getCurrentAccount(state), - isLoading: accountsIsLoading(state), -}); -export default connect(mapStateToProps)(ERC20TokenUI); +export default ERC20TokenUI; diff --git a/app/components/topnavbar.js b/app/components/topnavbar.js deleted file mode 100644 index d8bc689..0000000 --- a/app/components/topnavbar.js +++ /dev/null @@ -1,33 +0,0 @@ -import EmbarkJS from 'Embark/EmbarkJS'; -import React from 'react'; -import { Navbar, NavItem, Nav, MenuItem , NavDropdown} from 'react-bootstrap'; -import AccountList from './accountList'; - -class TopNavbar extends React.Component { - - constructor(props) { - super(props); - this.state = { - - } - - } - - render(){ - - return ( - - - - - Status.im Demo - - - - - - ); - } - } - - export default TopNavbar; \ No newline at end of file diff --git a/app/dapp.js b/app/dapp.js index 2b6b608..801422f 100644 --- a/app/dapp.js +++ b/app/dapp.js @@ -1,14 +1,11 @@ import React from 'react'; -import ReactDOM from 'react-dom'; import { Tabs, Tab } from 'react-bootstrap'; - import EmbarkJS from 'Embark/EmbarkJS'; -import TopNavbar from './components/topnavbar'; -import TestTokenUI from './components/testtoken'; +import TestTokenUI from './components/TestStatusNetwork'; import './dapp.css'; -class App extends React.Component { +class DApp extends React.Component { constructor(props) { super(props); @@ -32,7 +29,7 @@ class App extends React.Component { render(){ return (
- + @@ -42,4 +39,4 @@ class App extends React.Component { } } -export default App; +export default DApp; diff --git a/app/index.js b/app/index.js index 71ad7c2..7b8b2b4 100644 --- a/app/index.js +++ b/app/index.js @@ -1,16 +1,9 @@ import React from 'react'; import { render } from 'react-dom'; -import { Provider } from 'react-redux'; -import store from './store/configureStore'; -import App from './dapp'; -import init from './store/init' +import DApp from './dapp'; import './dapp.css'; -init(); - render( - - - , + , document.getElementById('app') ); diff --git a/app/reducers/accounts.js b/app/reducers/accounts.js deleted file mode 100644 index 4ca8dc9..0000000 --- a/app/reducers/accounts.js +++ /dev/null @@ -1,54 +0,0 @@ -import { createTypes, actionCreator } from 'redux-action-creator' -import { createSelector } from 'reselect' - -export const types = createTypes([ - 'RECEIVE_ACCOUNTS', - 'UPDATE_DEFAULT_ACCOUNT', - 'ADD_TO_ERC20_TOKEN_BALANCE' -], 'ACCOUNTS') -export const actions = { - receiveAccounts: actionCreator(types.RECEIVE_ACCOUNTS, 'defaultAccount','accounts'), - updateDefaultAccount: actionCreator(types.UPDATE_DEFAULT_ACCOUNT, 'defaultAccount'), - addToErc20TokenBalance: actionCreator(types.ADD_TO_ERC20_TOKEN_BALANCE, 'amount') -} - -export default function(state = { loading: true, accounts: [] }, action) { - switch (action.type) { - case types.RECEIVE_ACCOUNTS: { - const { defaultAccount, accounts } = action.payload - return { - ...state, - loading: false, - defaultAccount, - accounts - } - } - case types.UPDATE_DEFAULT_ACCOUNT: { - const { defaultAccount } = action.payload - return { ...state, defaultAccount } - } - case types.ADD_TO_ERC20_TOKEN_BALANCE: { - const currentAccount = { ...getCurrentAccount({accounts: state}) } - currentAccount.ERC20TokenBalance = Number(currentAccount.ERC20TokenBalance) + Number(action.payload.amount) - const accounts = [ ...state.accounts ] - const idx = accounts.findIndex(a => a.address === currentAccount.address) - accounts[idx] = currentAccount - return { - ...state, - accounts - } - } - default: - return state; - } -} - -export const getAccountState = state => state.acounts; -export const getAccounts = state => state.accounts.accounts; -export const getDefaultAccount = state => state.accounts.defaultAccount; -export const accountsIsLoading = state => state.accounts.loading; -export const getCurrentAccount = createSelector( - getDefaultAccount, - getAccounts, - (defaultAccount, accounts) => accounts.find(a => a.address === defaultAccount) -) diff --git a/app/reducers/rootReducer.js b/app/reducers/rootReducer.js deleted file mode 100644 index 244ee3e..0000000 --- a/app/reducers/rootReducer.js +++ /dev/null @@ -1,8 +0,0 @@ -import { combineReducers } from 'redux'; -import accounts from './accounts' - -const rootReducer = combineReducers({ - accounts -}); - -export default rootReducer; diff --git a/app/store/configureStore.js b/app/store/configureStore.js deleted file mode 100644 index d5ee806..0000000 --- a/app/store/configureStore.js +++ /dev/null @@ -1,11 +0,0 @@ -import { createStore, applyMiddleware } from 'redux'; -import rootReducer from '../reducers/rootReducer'; -import thunk from 'redux-thunk'; - -const store = createStore( - rootReducer, - window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(), - applyMiddleware(thunk) -); - -export default store; diff --git a/app/store/init.js b/app/store/init.js deleted file mode 100644 index 6e907fc..0000000 --- a/app/store/init.js +++ /dev/null @@ -1,12 +0,0 @@ -import web3 from "Embark/web3" -import EmbarkJS from 'Embark/EmbarkJS' -import store from './configureStore' -import { fetchAndDispatchAccountsWithBalances } from '../actions/accounts' - -const dispatch = action => store.dispatch(action) - -export default () => { - EmbarkJS.onReady((err) => { - fetchAndDispatchAccountsWithBalances(web3, dispatch) - }) -} diff --git a/config/blockchain.js b/config/blockchain.js index 2315b2a..a32183c 100644 --- a/config/blockchain.js +++ b/config/blockchain.js @@ -14,17 +14,18 @@ module.exports = { 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 proxy: true, // Proxy is used to present meaningful information about transactions - account: { - // "address": "", // When specified, uses that address instead of the default one for the network - password: "config/development/.password" // Password to unlock the account - }, + accounts: [ + { + nodeAccounts: true, + password: "config/development/.password" + } + ], targetGasLimit: 8000000, // Target gas limit sets the artificial target gas floor for the blocks to mine 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) - 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. }, testnet: { @@ -34,9 +35,12 @@ module.exports = { rpcHost: "localhost", rpcPort: 8545, rpcCorsDomain: "http://localhost:8000", - account: { - password: "config/testnet/.password" - } + accounts: [ + { + nodeAccounts: true, + password: "config/testnet/.password" + } + ], }, livenet: { enabled: false, @@ -45,9 +49,12 @@ module.exports = { rpcHost: "localhost", rpcPort: 8545, rpcCorsDomain: "http://localhost:8000", - account: { - password: "config/livenet/.password" - } + accounts: [ + { + nodeAccounts: true, + password: "config/livenet/.password" + } + ], }, rinkeby: { enabled: true, @@ -56,8 +63,11 @@ module.exports = { rpcHost: "localhost", rpcPort: 8545, rpcCorsDomain: "http://localhost:8000", - account: { - password: "config/rinkeby/.password" - } + accounts: [ + { + nodeAccounts: true, + password: "config/rinkeby/.password" + } + ], } }; diff --git a/config/contracts.js b/config/contracts.js index 402f02c..ff513a6 100644 --- a/config/contracts.js +++ b/config/contracts.js @@ -24,14 +24,12 @@ module.exports = { }, "StatusNetwork": {"deploy": false}, - "TestStatusNetwork": {"deploy": false}, - "StatusRoot": { - "instanceOf": "TestStatusNetwork", + "TestStatusNetwork": { "deploy": true, "args": ["0x0", "$MiniMeToken"], "onDeploy": [ - "await MiniMeToken.methods.changeController(StatusRoot.address).send()", - "await StatusRoot.methods.setOpen(true).send()", + "await MiniMeToken.methods.changeController(TestStatusNetwork.address).send()", + "await TestStatusNetwork.methods.setOpen(true).send()", ] } } diff --git a/config/storage.js b/config/storage.js index da9dab0..92e9192 100644 --- a/config/storage.js +++ b/config/storage.js @@ -1,16 +1,17 @@ module.exports = { + // default applies to all environments default: { enabled: true, ipfs_bin: "ipfs", - provider: "ipfs", available_providers: ["ipfs"], upload: { + provider: "ipfs", host: "localhost", port: 5001 }, dappConnection: [ { - provider: "ipfs", + provider:"ipfs", host: "localhost", port: 5001, getUrl: "http://localhost:8080/ipfs/" @@ -23,13 +24,36 @@ module.exports = { }, 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: true, - provider: "ipfs", upload: { + provider: "ipfs", 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: { + //} }; diff --git a/package.json b/package.json index 05d3f91..97a35d5 100644 --- a/package.json +++ b/package.json @@ -28,10 +28,6 @@ "react-blockies": "^1.4.0", "react-bootstrap": "0.32.1", "react-dom": "^16.3.2", - "react-redux": "^6.0.0", - "redux": "^4.0.1", - "redux-action-creator": "^3.0.0", - "redux-thunk": "^2.3.0", "web3": "^1.0.0-beta.34" } } diff --git a/test/minimetoken.js b/test/minimetoken.js new file mode 100644 index 0000000..1e63096 --- /dev/null +++ b/test/minimetoken.js @@ -0,0 +1,123 @@ +const utils = require('../utils/testUtils') + +const MiniMeToken = require('Embark/contracts/MiniMeToken'); +const ERC20TokenSpec = require('./abstract/erc20tokenspec'); +const ControlledSpec = require('./abstract/controlled'); + +config({ + contracts: { + "MiniMeTokenFactory": { + }, + "MiniMeToken": { + "args": [ + "$MiniMeTokenFactory", + utils.zeroAddress, + 0, + "TestMiniMeToken", + 18, + "TST", + true + ] + }, + ...ERC20TokenSpec.config.contracts + } +}); + + +contract("MiniMeToken", function() { + this.timeout(0); + var accounts; + before(function(done) { + web3.eth.getAccounts().then(function (res) { + accounts = res; + done(); + }); + }); + var miniMeTokenClone; + const b = []; + + it('should generate tokens for address 1', async () => { + await MiniMeToken.methods.generateTokens(accounts[1], 10).send(); + assert.equal(await MiniMeToken.methods.totalSupply().call(), 10); + assert.equal(await MiniMeToken.methods.balanceOf(accounts[1]).call(), 10); + b[0] = await web3.eth.getBlockNumber(); + }); + + it('should transfer tokens from address 1 to address 3', async () => { + await MiniMeToken.methods.transfer(accounts[3], 1).send({from: accounts[1]}); + assert.equal(await MiniMeToken.methods.totalSupply().call(), 10); + assert.equal(await MiniMeToken.methods.balanceOf(accounts[1]).call(), 9); + assert.equal(await MiniMeToken.methods.balanceOf(accounts[3]).call(), 1); + b[1] = await web3.eth.getBlockNumber(); + }); + + it('should destroy 3 tokens from 1 and 1 from 2', async () => { + await MiniMeToken.methods.destroyTokens(accounts[1], 3).send({ from: accounts[0] }); + assert.equal(await MiniMeToken.methods.totalSupply().call(), 7); + assert.equal(await MiniMeToken.methods.balanceOf(accounts[1]).call(), 6); + b[2] = await web3.eth.getBlockNumber(); + }); + + + it('should create the clone token', async () => { + const miniMeTokenCloneTx = await MiniMeToken.methods.createCloneToken( + 'Clone Token 1', + 18, + 'MMTc', + 0, + true).send({ from: accounts[0]}); + let addr = miniMeTokenCloneTx.events.NewCloneToken.returnValues[0]; + miniMeTokenClone = new web3.eth.Contract(MiniMeToken._jsonInterface, addr); + + b[3] = await web3.eth.getBlockNumber(); + + assert.equal(await miniMeTokenClone.methods.parentToken().call(), MiniMeToken.address); + assert.equal(await miniMeTokenClone.methods.parentSnapShotBlock().call(), b[3]); + assert.equal(await miniMeTokenClone.methods.totalSupply().call(), 7); + assert.equal(await MiniMeToken.methods.balanceOf(accounts[1]).call(), 6); + + assert.equal(await miniMeTokenClone.methods.totalSupplyAt(b[2]).call(), 7); + assert.equal(await miniMeTokenClone.methods.balanceOfAt(accounts[3], b[2]).call(), 1); + }); + + it('should move tokens in the clone token from 2 to 3', async () => { + + await miniMeTokenClone.methods.transfer(accounts[2], 4).send({ from: accounts[1], gas: 1000000 }); + b[4] = await web3.eth.getBlockNumber(); + + assert.equal(await MiniMeToken.methods.balanceOfAt(accounts[1], b[3]).call(), 6); + assert.equal(await MiniMeToken.methods.balanceOfAt(accounts[2], b[3]).call(), 0); + assert.equal(await miniMeTokenClone.methods.totalSupply().call(), 7); + assert.equal(await miniMeTokenClone.methods.balanceOf(accounts[1]).call(), 2); + assert.equal(await miniMeTokenClone.methods.balanceOf(accounts[2]).call(), 4); + assert.equal(await miniMeTokenClone.methods.balanceOfAt(accounts[1], b[3]).call(), 6); + assert.equal(await miniMeTokenClone.methods.balanceOfAt(accounts[2], b[3]).call(), 0); + assert.equal(await miniMeTokenClone.methods.balanceOfAt(accounts[1], b[2]).call(), 6); + assert.equal(await miniMeTokenClone.methods.balanceOfAt(accounts[2], b[2]).call(), 0); + assert.equal(await miniMeTokenClone.methods.totalSupplyAt(b[3]).call(), 7); + assert.equal(await miniMeTokenClone.methods.totalSupplyAt(b[2]).call(), 7); + }); + + it('should create tokens in the child token', async () => { + await miniMeTokenClone.methods.generateTokens(accounts[1], 10).send({ from: accounts[0], gas: 1000000}); + assert.equal(await miniMeTokenClone.methods.totalSupply().call(), 17); + assert.equal(await miniMeTokenClone.methods.balanceOf(accounts[1]).call(), 12); + assert.equal(await miniMeTokenClone.methods.balanceOf(accounts[2]).call(), 4); + }); + + + it("should mint balances for ERC20TokenSpec", async function() { + let initialBalance = 7 * 10 ^ 18; + for(i=0;i