From ba61f8909e59ae9dcf5535bcf82ab48e409d2647 Mon Sep 17 00:00:00 2001 From: masaun Date: Fri, 7 Feb 2020 12:08:09 +0100 Subject: [PATCH] Add ./client to check function of contract at frontend --- client/.eslintrc.json | 3 + client/.gitignore | 26 +++ client/.node-version | 1 + client/README.md | 1 + client/config-overrides.js | 18 ++ client/config/webpack.js | 21 ++ client/netlify.toml | 6 + client/package.json | 38 ++++ client/public/favicon-32x32.png | Bin 0 -> 811 bytes client/public/index.html | 57 +++++ client/public/manifest.json | 15 ++ client/public/pic_bg.png | Bin 0 -> 90194 bytes client/src/App.css | 41 ++++ client/src/App.js | 202 +++++++++++++++++ client/src/App.module.scss | 81 +++++++ client/src/App.test.js | 9 + .../src/components/Footer/footer.module.scss | 78 +++++++ client/src/components/Footer/index.js | 18 ++ .../src/components/Header/header.module.scss | 92 ++++++++ client/src/components/Header/index.js | 16 ++ client/src/components/Hero/Hero.module.scss | 101 +++++++++ client/src/components/Hero/index.js | 14 ++ client/src/components/NewBancorPool/config.js | 27 +++ client/src/components/NewBancorPool/index.js | 189 ++++++++++++++++ .../components/Web3Info/Web3Info.module.scss | 35 +++ client/src/components/Web3Info/index.js | 64 ++++++ client/src/index.js | 12 + client/src/layout/index.scss | 207 ++++++++++++++++++ client/src/layout/variables.scss | 21 ++ client/src/routes.js | 87 ++++++++ client/src/serviceWorker.js | 135 ++++++++++++ client/src/utils/getWeb3.js | 61 ++++++ client/src/utils/theme.js | 18 ++ scripts/{ => bancor-protocol}/compile.sh | 0 scripts/{ => bancor-protocol}/deploy-one.js | 0 scripts/{ => bancor-protocol}/fix-modules.js | 0 scripts/{ => bancor-protocol}/flatten.js | 0 scripts/{ => bancor-protocol}/rebuild-all.js | 0 scripts/{ => bancor-protocol}/run-tests.js | 0 scripts/{ => bancor-protocol}/verify-all.js | 0 test/{ => bancor-protocol}/BancorConverter.js | 0 .../BancorConverterRegistry.js | 0 .../BancorConverterRegistryData.js | 0 .../BancorConverterUpgrader.js | 0 test/{ => bancor-protocol}/BancorFormula.js | 0 test/{ => bancor-protocol}/BancorNetwork.js | 0 .../BancorNetworkPathFinder.js | 0 .../BancorNetworkWithOldConverter.js | 0 test/{ => bancor-protocol}/BancorX.js | 0 .../{ => bancor-protocol}/ContractFeatures.js | 0 .../{ => bancor-protocol}/ContractRegistry.js | 0 .../CrowdsaleController.js | 0 test/{ => bancor-protocol}/ERC20Token.js | 0 test/{ => bancor-protocol}/EtherToken.js | 0 test/{ => bancor-protocol}/Managed.js | 0 test/{ => bancor-protocol}/Owned.js | 0 test/{ => bancor-protocol}/SafeMath.js | 0 test/{ => bancor-protocol}/SmartToken.js | 0 .../SmartTokenController.js | 0 test/{ => bancor-protocol}/TokenHolder.js | 0 test/{ => bancor-protocol}/Whitelist.js | 0 test/{ => bancor-protocol}/XConversions.js | 0 .../XTransferRerouter.js | 0 .../bin/bancor_converter_v10.abi | 0 .../bin/bancor_converter_v10.bin | 0 .../bin/bancor_converter_v11.abi | 0 .../bin/bancor_converter_v11.bin | 0 .../bin/bancor_converter_v4.abi | 0 .../bin/bancor_converter_v4.bin | 0 .../bin/bancor_converter_v9.abi | 0 .../bin/bancor_converter_v9.bin | 0 .../helpers/BancorConverter.js | 0 .../helpers/ContractRegistryClient.js | 0 .../helpers/FormulaConstants.js | 0 test/{ => bancor-protocol}/helpers/Utils.js | 0 utils/{ => bancor-protocol}/README.md | 0 .../deploy_network_emulation.js | 0 .../migrate_converter_registry_1.js | 0 .../migrate_converter_registry_2.js | 0 .../retrieve_contract_version.js | 0 .../verify_network_path_finder.js | 0 81 files changed, 1694 insertions(+) create mode 100755 client/.eslintrc.json create mode 100755 client/.gitignore create mode 100755 client/.node-version create mode 100755 client/README.md create mode 100755 client/config-overrides.js create mode 100755 client/config/webpack.js create mode 100755 client/netlify.toml create mode 100755 client/package.json create mode 100755 client/public/favicon-32x32.png create mode 100755 client/public/index.html create mode 100755 client/public/manifest.json create mode 100755 client/public/pic_bg.png create mode 100755 client/src/App.css create mode 100755 client/src/App.js create mode 100755 client/src/App.module.scss create mode 100755 client/src/App.test.js create mode 100755 client/src/components/Footer/footer.module.scss create mode 100755 client/src/components/Footer/index.js create mode 100755 client/src/components/Header/header.module.scss create mode 100755 client/src/components/Header/index.js create mode 100755 client/src/components/Hero/Hero.module.scss create mode 100755 client/src/components/Hero/index.js create mode 100644 client/src/components/NewBancorPool/config.js create mode 100644 client/src/components/NewBancorPool/index.js create mode 100755 client/src/components/Web3Info/Web3Info.module.scss create mode 100755 client/src/components/Web3Info/index.js create mode 100755 client/src/index.js create mode 100755 client/src/layout/index.scss create mode 100755 client/src/layout/variables.scss create mode 100755 client/src/routes.js create mode 100755 client/src/serviceWorker.js create mode 100755 client/src/utils/getWeb3.js create mode 100755 client/src/utils/theme.js rename scripts/{ => bancor-protocol}/compile.sh (100%) rename scripts/{ => bancor-protocol}/deploy-one.js (100%) rename scripts/{ => bancor-protocol}/fix-modules.js (100%) rename scripts/{ => bancor-protocol}/flatten.js (100%) rename scripts/{ => bancor-protocol}/rebuild-all.js (100%) rename scripts/{ => bancor-protocol}/run-tests.js (100%) rename scripts/{ => bancor-protocol}/verify-all.js (100%) rename test/{ => bancor-protocol}/BancorConverter.js (100%) rename test/{ => bancor-protocol}/BancorConverterRegistry.js (100%) rename test/{ => bancor-protocol}/BancorConverterRegistryData.js (100%) rename test/{ => bancor-protocol}/BancorConverterUpgrader.js (100%) rename test/{ => bancor-protocol}/BancorFormula.js (100%) rename test/{ => bancor-protocol}/BancorNetwork.js (100%) rename test/{ => bancor-protocol}/BancorNetworkPathFinder.js (100%) rename test/{ => bancor-protocol}/BancorNetworkWithOldConverter.js (100%) rename test/{ => bancor-protocol}/BancorX.js (100%) rename test/{ => bancor-protocol}/ContractFeatures.js (100%) rename test/{ => bancor-protocol}/ContractRegistry.js (100%) rename test/{ => bancor-protocol}/CrowdsaleController.js (100%) rename test/{ => bancor-protocol}/ERC20Token.js (100%) rename test/{ => bancor-protocol}/EtherToken.js (100%) rename test/{ => bancor-protocol}/Managed.js (100%) rename test/{ => bancor-protocol}/Owned.js (100%) rename test/{ => bancor-protocol}/SafeMath.js (100%) rename test/{ => bancor-protocol}/SmartToken.js (100%) rename test/{ => bancor-protocol}/SmartTokenController.js (100%) rename test/{ => bancor-protocol}/TokenHolder.js (100%) rename test/{ => bancor-protocol}/Whitelist.js (100%) rename test/{ => bancor-protocol}/XConversions.js (100%) rename test/{ => bancor-protocol}/XTransferRerouter.js (100%) rename test/{ => bancor-protocol}/bin/bancor_converter_v10.abi (100%) rename test/{ => bancor-protocol}/bin/bancor_converter_v10.bin (100%) rename test/{ => bancor-protocol}/bin/bancor_converter_v11.abi (100%) rename test/{ => bancor-protocol}/bin/bancor_converter_v11.bin (100%) rename test/{ => bancor-protocol}/bin/bancor_converter_v4.abi (100%) rename test/{ => bancor-protocol}/bin/bancor_converter_v4.bin (100%) rename test/{ => bancor-protocol}/bin/bancor_converter_v9.abi (100%) rename test/{ => bancor-protocol}/bin/bancor_converter_v9.bin (100%) rename test/{ => bancor-protocol}/helpers/BancorConverter.js (100%) rename test/{ => bancor-protocol}/helpers/ContractRegistryClient.js (100%) rename test/{ => bancor-protocol}/helpers/FormulaConstants.js (100%) rename test/{ => bancor-protocol}/helpers/Utils.js (100%) rename utils/{ => bancor-protocol}/README.md (100%) rename utils/{ => bancor-protocol}/deploy_network_emulation.js (100%) rename utils/{ => bancor-protocol}/migrate_converter_registry_1.js (100%) rename utils/{ => bancor-protocol}/migrate_converter_registry_2.js (100%) rename utils/{ => bancor-protocol}/retrieve_contract_version.js (100%) rename utils/{ => bancor-protocol}/verify_network_path_finder.js (100%) diff --git a/client/.eslintrc.json b/client/.eslintrc.json new file mode 100755 index 0000000..5e603ec --- /dev/null +++ b/client/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "react-app" +} diff --git a/client/.gitignore b/client/.gitignore new file mode 100755 index 0000000..7254ea7 --- /dev/null +++ b/client/.gitignore @@ -0,0 +1,26 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# lol macs +.DS_Store/ + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/client/.node-version b/client/.node-version new file mode 100755 index 0000000..db24ab9 --- /dev/null +++ b/client/.node-version @@ -0,0 +1 @@ +10.13.0 diff --git a/client/README.md b/client/README.md new file mode 100755 index 0000000..ab163a4 --- /dev/null +++ b/client/README.md @@ -0,0 +1 @@ +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). diff --git a/client/config-overrides.js b/client/config-overrides.js new file mode 100755 index 0000000..94f0c0a --- /dev/null +++ b/client/config-overrides.js @@ -0,0 +1,18 @@ +/* config-overrides.js */ +const { zeppelinSolidityHotLoader } = require('./config/webpack'); + +module.exports = function override(config, env) { + //do stuff with the webpack config... + + // allow importing from outside of app/src folder, ModuleScopePlugin prevents this. + const scope = config.resolve.plugins.findIndex(o => o.constructor.name === 'ModuleScopePlugin'); + if (scope > -1) { + config.resolve.plugins.splice(scope, 1); + } + + // add Zeppelin Solidity hot reloading support + // have to insert before last loader, because CRA user 'file-loader' as default one + config.module.rules.splice(config.module.rules - 2, 0, zeppelinSolidityHotLoader); + + return config; +} diff --git a/client/config/webpack.js b/client/config/webpack.js new file mode 100755 index 0000000..db2a1bc --- /dev/null +++ b/client/config/webpack.js @@ -0,0 +1,21 @@ +const zeppelinSolidityHotLoaderOptions = { + network: 'development', + // you can stop loader from automatic compile/push/updgrade + // action by setting disabled flag to true, but it will still + // serve .json files from file system + disabled: true, +} + +module.exports = { + zeppelinSolidityHotLoader: { + test: /\.sol$/, + use: [ + { loader: 'json-loader' }, + { + loader: 'zeppelin-solidity-hot-loader', + options: zeppelinSolidityHotLoaderOptions, + }, + ], + }, + zeppelinSolidityHotLoaderOptions, +}; diff --git a/client/netlify.toml b/client/netlify.toml new file mode 100755 index 0000000..40a8fa2 --- /dev/null +++ b/client/netlify.toml @@ -0,0 +1,6 @@ +# The following redirect is intended for use with most SPAs that handle +# routing internally. +[[redirects]] + from = "/*" + to = "/index.html" + status = 200 diff --git a/client/package.json b/client/package.json new file mode 100755 index 0000000..4aeb8dc --- /dev/null +++ b/client/package.json @@ -0,0 +1,38 @@ +{ + "name": "client", + "version": "0.1.0", + "private": true, + "dependencies": { + "@material-ui/core": "^4.0.0", + "@material-ui/icons": "^4.0.0", + "dotenv": "^8.2.0", + "eslint": "^6.0.1", + "json-loader": "^0.5.7", + "node-sass": "^4.11.0", + "react": "^16.8.6", + "react-app-rewired": "^2.1.0", + "react-dom": "^16.8.6", + "react-router-dom": "^5.0.0", + "react-scripts": "^2.1.3", + "rimble-ui": "^0.11.1", + "styled-components": "^4.1.3", + "web3": "1.0.0-beta.37", + "zeppelin-solidity-hot-loader": "^1.2.3" + }, + "scripts": { + "start": "react-app-rewired start", + "build": "react-app-rewired build", + "test": "react-app-rewired test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": "react-app" + }, + "browserslist": [ + ">0.2%", + "not dead", + "not ie <= 11", + "not op_mini all" + ], + "devDependencies": {} +} diff --git a/client/public/favicon-32x32.png b/client/public/favicon-32x32.png new file mode 100755 index 0000000000000000000000000000000000000000..3fe479b250a48a6e2e4a4b7494630b9781463994 GIT binary patch literal 811 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10f+@+{-G$+Qd;gjJKpuOE zr>`sfBUX7qcKvnRc6l-|FkbLEkC_D`AFH!!Y7<3q~Gp%n< zzri4Qw)Oi~pR+4_(gGfP?zie{JgO}9cftH-J$q-hi%(2fH(w~&FWJ{}h?VXBPs2;c z7@Ku8cWO!r`361EdG2X+USF1ZvX1)9v@YQkfjddsf0~qI7CX(2ZHd13;&0ya8(#t% z7aUfV{lnm|8neO0=lBCHYoUFPf$a7tqB-v`U(Q9%RO8e!l;8U5v)rOOro*SA4&6wT-;Wokz>~YES$`K@2PKbNEJiwz6(>&PTCXjtiI#rH`(Wwy0_w91}tB&F0IX$bA9odyEjBt zjhPObZ@+#y@t!Ah&NBv&z-5*#>=JhZ*)00q8%3W+{7){J^|s;oW2LPQH_{)>aq1CD z-coZsGPPG)r|87>SJNG5@Ao@uI73B`_lMVPCC>DK1ywbNn(Aeq|B~)nR`?$n-Kr(7 z5hW>!C8<`)MX5lF!N|bSLf61l*Vr(`(A>(v+{(mU+rY@mz~CjD)d>_0x%nxXX_dG& z%!qC(0cr@Z3W+EQN-S3>D9TUE%t=)!sVqoU$Sf#HW?-n8^Y{}FM`4(T#wq{PXFQ(< zF)%B0>m_pwD+_y17GV}vaA`0(oWiWUIYi;~jVmXPoH-(Mg#C1b#{w@shF9W(C7+y3 Rrvj~D@O1TaS?83{1OT41M4kWu literal 0 HcmV?d00001 diff --git a/client/public/index.html b/client/public/index.html new file mode 100755 index 0000000..de7cf43 --- /dev/null +++ b/client/public/index.html @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + Matic Plasma Backed Asset Swap + + + +
+ + + diff --git a/client/public/manifest.json b/client/public/manifest.json new file mode 100755 index 0000000..1f2f141 --- /dev/null +++ b/client/public/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/client/public/pic_bg.png b/client/public/pic_bg.png new file mode 100755 index 0000000000000000000000000000000000000000..1bcc6e3f160cb57aa82ca5d1bd254ef29f3097bc GIT binary patch literal 90194 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�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 JPDHLkV1ix+pv3?H literal 0 HcmV?d00001 diff --git a/client/src/App.css b/client/src/App.css new file mode 100755 index 0000000..53ba871 --- /dev/null +++ b/client/src/App.css @@ -0,0 +1,41 @@ +/* Styles go here */ +.token { + height: 150px; + width: 150px; + border-radius: 50%; + display: inline-block; +} + + +.App { + text-align: center; +} + +.App-logo { + animation: App-logo-spin infinite 20s linear; + height: 40vmin; +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/client/src/App.js b/client/src/App.js new file mode 100755 index 0000000..97921ec --- /dev/null +++ b/client/src/App.js @@ -0,0 +1,202 @@ +import React, { Component } from "react"; +import getWeb3, { getGanacheWeb3, Web3 } from "./utils/getWeb3"; +import Header from "./components/Header/index.js"; +import Footer from "./components/Footer/index.js"; +import Hero from "./components/Hero/index.js"; +import Web3Info from "./components/Web3Info/index.js"; + +// SwapFactory +import SwapFactory from "./components/NewBancorPool/index.js"; + +import { Typography, Grid, TextField } from '@material-ui/core'; +import { ThemeProvider } from '@material-ui/styles'; +import { theme } from './utils/theme'; +import { Loader, Button, Card, Input, Heading, Table, Form, Flex, Box, Image, EthAddress } from 'rimble-ui'; +import { zeppelinSolidityHotLoaderOptions } from '../config/webpack'; + +import styles from './App.module.scss'; +//import './App.css'; + + + +class App extends Component { + constructor(props) { + super(props); + + this.state = { + /////// Default state + storageValue: 0, + web3: null, + accounts: null, + route: window.location.pathname.replace("/", "") + }; + } + + + + ///////--------------------- Functions of testFunc --------------------------- + + + + + + + + //////////////////////////////////// + ///// Ganache + //////////////////////////////////// + getGanacheAddresses = async () => { + if (!this.ganacheProvider) { + this.ganacheProvider = getGanacheWeb3(); + } + if (this.ganacheProvider) { + return await this.ganacheProvider.eth.getAccounts(); + } + return []; + } + + componentDidMount = async () => { + const hotLoaderDisabled = zeppelinSolidityHotLoaderOptions.disabled; + + let NewBancorPool = {}; + try { + NewBancorPool = require("../../build/contracts/NewBancorPool.json"); // Load ABI of contract of NewBancorPool + } catch (e) { + console.log(e); + } + + try { + const isProd = process.env.NODE_ENV === 'production'; + if (!isProd) { + // Get network provider and web3 instance. + const web3 = await getWeb3(); + let ganacheAccounts = []; + + try { + ganacheAccounts = await this.getGanacheAddresses(); + } catch (e) { + console.log('Ganache is not running'); + } + + // Use web3 to get the user's accounts. + const accounts = await web3.eth.getAccounts(); + // Get the contract instance. + const networkId = await web3.eth.net.getId(); + const networkType = await web3.eth.net.getNetworkType(); + const isMetaMask = web3.currentProvider.isMetaMask; + let balance = accounts.length > 0 ? await web3.eth.getBalance(accounts[0]): web3.utils.toWei('0'); + balance = web3.utils.fromWei(balance, 'ether'); + + let instanceNewBancorPool = null; + let deployedNetwork = null; + + // Create instance of contracts + if (NewBancorPool.networks) { + deployedNetwork = NewBancorPool.networks[networkId.toString()]; + if (deployedNetwork) { + instanceNewBancorPool = new web3.eth.Contract( + NewBancorPool.abi, + deployedNetwork && deployedNetwork.address, + ); + console.log('=== instanceNewBancorPool ===', instanceNewBancorPool); + } + } + + if (NewBancorPool) { + this.setState({ + web3, + ganacheAccounts, + accounts, + balance, + networkId, + networkType, + hotLoaderDisabled, + isMetaMask, + new_bancor_pool: instanceNewBancorPool + }, () => { + this.refreshValues( + instanceNewBancorPool + ); + setInterval(() => { + this.refreshValues(instanceNewBancorPool); + }, 5000); + }); + } + else { + this.setState({ web3, ganacheAccounts, accounts, balance, networkId, networkType, hotLoaderDisabled, isMetaMask }); + } + } + } catch (error) { + // Catch any errors for any of the above operations. + alert( + `Failed to load web3, accounts, or contract. Check console for details.`, + ); + console.error(error); + } + }; + + componentWillUnmount() { + if (this.interval) { + clearInterval(this.interval); + } + } + + refreshValues = (instanceNewBancorPool) => { + if (instanceNewBancorPool) { + console.log('refreshValues of instanceStreamingMoney'); + } + } + + renderLoader() { + return ( +
+ +

Loading Web3, accounts, and contract...

+

Unlock your metamask

+
+ ); + } + + renderDeployCheck(instructionsKey) { + return ( +
+
+ Your contracts are not deployed in this network. Two potential reasons:
+

+ Maybe you are in the wrong network? Point Metamask to localhost.
+ You contract is not deployed. Follow the instructions below. +

+
+
+ ); + } + + renderInstructions() { + return ( +
+ +
+ ); + } + + renderNewBancorPool() { + return ( +
+ +
+ ); + } + + render() { + return ( +
+
+ {this.state.route === '' && this.renderInstructions()} + {this.state.route === 'swap_factory' && this.renderNewBancorPool()} +
+
+ ); + } +} + +export default App; diff --git a/client/src/App.module.scss b/client/src/App.module.scss new file mode 100755 index 0000000..12ff8d2 --- /dev/null +++ b/client/src/App.module.scss @@ -0,0 +1,81 @@ +@import './layout/variables.scss'; + +.App { + text-align: center; + display: flex; + flex-flow: column nowrap; + justify-content: flex-start; + align-items: center; +} + +code { + background: #fefefe; + box-shadow: 0 0px 2px 0px #ccc; + padding: 8px 16px; + font-size: 14px; + width: 100%; + font-family: source-code-pro,Menlo,Monaco,Consolas,Courier New, monospace; +} + +.wrapper { + min-height: 80vh; + width: 100%; + display: flex; + flex-flow: column nowrap; + align-items: center; +} + +.setup, .contracts { + width: 100%; + padding: 40px 0; + display: flex; + flex-flow: column nowrap; + align-items: center; + + .notice { + margin: 15px 0; + + p { + padding: 10px; + background: #ededed; + box-shadow: 0 1px 1px 2px #ccc; + border: 1px solid #ddd; + color: #444; + } + } + + .widgets { + display: flex; + max-width: 1200px; + width: 100%; + flex-flow: row wrap; + justify-content: space-between; + align-items: flex-start; + margin: 20px 0; + } +} + +.loader { + width: 100%; + display: flex; + flex-flow: column nowrap; + align-items: center; + justify-content: center; + min-height: 80vh; + padding: 40px 0; + h3 { + margin-top: 30px; + } +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + + +/* MapBox */ diff --git a/client/src/App.test.js b/client/src/App.test.js new file mode 100755 index 0000000..a754b20 --- /dev/null +++ b/client/src/App.test.js @@ -0,0 +1,9 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './App'; + +it('renders without crashing', () => { + const div = document.createElement('div'); + ReactDOM.render(, div); + ReactDOM.unmountComponentAtNode(div); +}); diff --git a/client/src/components/Footer/footer.module.scss b/client/src/components/Footer/footer.module.scss new file mode 100755 index 0000000..59819be --- /dev/null +++ b/client/src/components/Footer/footer.module.scss @@ -0,0 +1,78 @@ +@import '../../layout/variables.scss'; +.footer { + width: 100%; + display: flex; + flex-flow: row wrap; + justify-content: space-between; + align-items: flex-start; + background: $white; + border-top: 1px solid #D8D8D8; + padding: 25px 100px; + + .brand { + display: flex; + flex-flow: column nowrap; + color: $primary; + .created { + width: 100%; + display: flex; + flex-flow: row nowrap; + justify-content: flex-start; + align-items: center; + width: 400px; + color: $primary; + + img { + width: 33px; + margin-right: 14px; + } + + a { + color: $white; + margin-top: 4px; + } + + span { + color: $white; + margin-left: 60px; + line-height: 30px; + + a { + color: $purple-aux; + } + } + } + + .copyright { + font-size: 14px; + margin-top: 10px; + text-align: left; + color: rgba(0,0,0, 0.6); + } + } + + .links { + display: flex; + flex-flow: row wrap; + align-items: center; + justify-content: flex-start; + a { + margin: 0 10px; + } + img { + width: 21px; + } + } +} + +@media only screen and (max-width: $screen-sm-max) { + + .footer { + padding: 80px 40px; + + .links { + margin-top: 20px; + width: 100%; + } + } +} diff --git a/client/src/components/Footer/index.js b/client/src/components/Footer/index.js new file mode 100755 index 0000000..dfc56df --- /dev/null +++ b/client/src/components/Footer/index.js @@ -0,0 +1,18 @@ +import React from 'react'; +import styles from './footer.module.scss'; + + +const Footer = () => ( +
+
+
+ Created by masaun +
+
+ Copyright © masaun +
+
+
+) + +export default Footer; diff --git a/client/src/components/Header/header.module.scss b/client/src/components/Header/header.module.scss new file mode 100755 index 0000000..6036cb8 --- /dev/null +++ b/client/src/components/Header/header.module.scss @@ -0,0 +1,92 @@ +@import '../../layout/variables.scss'; + +.header { + width: 100%; + background: #3C4653; + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + height: auto; + display: flex; + justify-content: center; + + nav { + width: 100%; + max-width: 1180px; + padding: 0 30px; + display: flex; + justify-content: space-between; + align-items: center; + + .brand { + display: flex; + flex-flow: row nowrap; + justify-content: flex-start; + align-items: center; + width: 300px; + + img { + width: 120px; + margin-right: 14px; + } + } + + ul { + margin: 0; + padding: 0; + display: flex; + flex-flow: row nowrap; + height: 60px; + list-style: none; + + li { + padding: 15px; + margin: 0; + margin-right: 60px; + text-decoration: none; + a { + color: $white; + text-transform: uppercase; + font-size: 14px; + letter-spacing: 2px; + text-decoration: none; + font-family: 'Roboto Mono', monospace; + letter-spacing: 0.8px; + opacity: 0.8; + + &:hover { + opacity: 1; + text-decoration: none; + border-bottom: 2px solid $white; + } + } + } + } + } +} + +@media only screen and (max-width: $screen-sm-max) { + + .header nav ul .brand { + width: 100%; + margin-right: 0px; + justify-content: flex-start; + } +} +@media only screen and (max-width: $screen-sm-min) { + .header { + + nav { + flex-flow: row wrap; + margin-top: 10px; + } + + nav ul { + flex-flow: row wrap; + height: auto; + li { + width: 100%; + text-align: left; + padding: 3px 0; + } + } + } +} diff --git a/client/src/components/Header/index.js b/client/src/components/Header/index.js new file mode 100755 index 0000000..00a0c6c --- /dev/null +++ b/client/src/components/Header/index.js @@ -0,0 +1,16 @@ +import React from 'react'; +import styles from './header.module.scss'; + +const Header = () => ( +
+ +
+) + +export default Header; diff --git a/client/src/components/Hero/Hero.module.scss b/client/src/components/Hero/Hero.module.scss new file mode 100755 index 0000000..354f3c4 --- /dev/null +++ b/client/src/components/Hero/Hero.module.scss @@ -0,0 +1,101 @@ +@import '../../layout/variables.scss'; + +.Hero { + padding: 60px 20px; + width: 100%; + color: white; + display: flex; + flex-flow: row wrap; + align-items: flex-start; + justify-content: space-around; + background: linear-gradient(to bottom, #3C4653 , #212830); + + .hwrapper { + display: flex; + flex-flow: row wrap; + max-width: 1180px; + justify-content: space-between; + align-items: center; + width: 100%; + } + + .left, .right { + display: flex; + flex-flow: column nowrap; + width: calc(50% - 80px); + min-width: 400px; + justify-content: flex-end; + align-items: flex-start; + text-align: left; + margin-top: 20px; + margin-bottom: 20px; + padding: 0 20px; + + h1 { + font-size: 46px; + line-height: 50px; + margin-top: 0px; + font-weight: 300; + } + + h2 { + font-size: 1em; + line-height: 1.6; + font-weight: 500; + max-width: 400px; + color: #39e6e0; + } + + img { + width: 92%; + } + } + + .sellingpoints { + display: flex; + width: 100%; + justify-content: flex-end; + flex-flow: column nowrap; + + .feature { + margin: 6px 0; + font-size: 1em; + font-weight: 400; + opacity: 0.9; + + a { + color: $white; + font-weight: 600; + text-decoration: none; + + &:hover { + text-decoration: none; + border-bottom: 2px solid #fff; + } + } + } + } + + .ctas { + display: flex; + flex-flow: row wrap; + margin: 40px 0 0; + justify-content: flex-start; + + .mainLink { + text-decoration: none; + color: $blue; + font-weight: bold; + + &:hover { + text-decoration: underline; + } + } + } +} + +@media only screen and (max-width: 480px) { + .Hero .left, .Hero .right { + min-width: 92%; + } +} diff --git a/client/src/components/Hero/index.js b/client/src/components/Hero/index.js new file mode 100755 index 0000000..96406a5 --- /dev/null +++ b/client/src/components/Hero/index.js @@ -0,0 +1,14 @@ +import React, { Component } from "react"; +import styles from './Hero.module.scss'; + + +export default class Hero extends Component { + render() { + return ( +
+
+

Top Page

+
+ ); + } +} diff --git a/client/src/components/NewBancorPool/config.js b/client/src/components/NewBancorPool/config.js new file mode 100644 index 0000000..d846e0c --- /dev/null +++ b/client/src/components/NewBancorPool/config.js @@ -0,0 +1,27 @@ +/*** + * @dev - Reference from https://docs.matic.network/matic-js-tutorial/#configuring-matic-test-tokens-on-metamask + */ +require('dotenv').config(); + + +module.exports = { + MATIC_PROVIDER: 'https://testnet2.matic.network', // This is the MATIC testnet RPC + PARENT_PROVIDER: 'https://ropsten.infura.io/v3/70645f042c3a409599c60f96f6dd9fbc', // This is the Ropsten testnet RPC + ROOTCHAIN_ADDRESS: '0x60e2b19b9a87a3f37827f2c8c8306be718a5f9b4', // The address for the main Plasma contract in Ropsten testnet + WITHDRAWMANAGER_ADDRESS: '0x4ef2b60cdd4611fa0bc815792acc14de4c158d22', // An address for the WithdrawManager contract on Ropsten testnet + DEPOSITMANAGER_ADDRESS: '0x4072fab2a132bf98207cbfcd2c341adb904a67e9', // An address for a DepositManager contract in Ropsten testnet + SYNCER_URL: 'https://matic-syncer2.api.matic.network/api/v1', // Backend service which syncs the Matic sidechain state to a MySQL database which we use for faster querying. This comes in handy especially for constructing withdrawal proofs while exiting assets from Plasma. + WATCHER_URL: 'https://ropsten-watcher2.api.matic.network/api/v1', // Backend service which syncs the Matic Plasma contract events on Ethereum mainchain to a MySQL database which we use for faster querying. This comes in handy especially for listening to asset deposits on the Plasma contract. + ROOTWETH_ADDRESS: '0x421dc9053cb4b51a7ec07b60c2bbb3ec3cfe050b', // This is a wrapped ETH ERC20 contract address so that we can support ETH deposits to the sidechain + MATICWETH_ADDRESS: '0x31074c34a757a4b9FC45169C58068F43B717b2D0', // The corresponding wrapped ETH ERC20 contract address on the Matic chain + + PRIVATE_KEY: process.env.PRIVATE_KEY, // A sample private key prefix with `0x` + //PRIVATE_KEY: '', // A sample private key prefix with `0x` + FROM_ADDRESS: process.env.FROM_ADDRESS, // Your address + //FROM_ADDRESS: '', // Your address + + ROPSTEN_TEST_TOKEN: '0x70459e550254b9d3520a56ee95b78ee4f2dbd846', // Contract for ERC20 in Ropsten + MATIC_TEST_TOKEN: '0xc82c13004c06E4c627cF2518612A55CE7a3Db699', // Contract for ERC20 in Matic testnet + ROPSTEN_ERC721_TOKEN: '0x07d799252cf13c01f602779b4dce24f4e5b08bbd', // Contract for ERC721 in Ropsten testnet + MATIC_ERC721_TOKEN: '0x9f289a264b6db56d69ad53f363d06326b984e637', // Contract for ERC721 in matic testnet +} diff --git a/client/src/components/NewBancorPool/index.js b/client/src/components/NewBancorPool/index.js new file mode 100644 index 0000000..5c277b8 --- /dev/null +++ b/client/src/components/NewBancorPool/index.js @@ -0,0 +1,189 @@ +import React, { Component } from "react"; +import getWeb3, { getGanacheWeb3, Web3 } from "../../utils/getWeb3"; + +import App from "../../App.js"; + +import { Typography, Grid, TextField } from '@material-ui/core'; +import { ThemeProvider } from '@material-ui/styles'; +import { theme } from '../../utils/theme'; +import { Loader, Button, Card, Input, Heading, Table, Form, Flex, Box, Image, EthAddress } from 'rimble-ui'; +import { zeppelinSolidityHotLoaderOptions } from '../../../config/webpack'; + +import styles from '../../App.module.scss'; +//import './App.css'; + + + + +export default class NewBancorPool extends Component { + constructor(props) { + super(props); + + this.state = { + /////// Default state + storageValue: 0, + web3: null, + accounts: null, + route: window.location.pathname.replace("/", "") + }; + + this.getTestData = this.getTestData.bind(this); + } + + + getTestData = async () => { + const { accounts, new_bancor_pool, web3 } = this.state; + + const response_1 = await new_bancor_pool.methods.testFunc().send({ from: accounts[0] }) + console.log('=== response of testFunc() function ===', response_1); + } + + + //////////////////////////////////// + ///// Refresh Values + //////////////////////////////////// + refreshValues = (instanceNewBancorPool) => { + if (instanceNewBancorPool) { + console.log('refreshValues of instanceNewBancorPool'); + } + } + + + //////////////////////////////////// + ///// Ganache + //////////////////////////////////// + getGanacheAddresses = async () => { + if (!this.ganacheProvider) { + this.ganacheProvider = getGanacheWeb3(); + } + if (this.ganacheProvider) { + return await this.ganacheProvider.eth.getAccounts(); + } + return []; + } + + componentDidMount = async () => { + const hotLoaderDisabled = zeppelinSolidityHotLoaderOptions.disabled; + + let NewBancorPool = {}; + try { + NewBancorPool = require("../../../../build/contracts/NewBancorPool.json"); // Load ABI of contract of NewBancorPool + } catch (e) { + console.log(e); + } + + try { + const isProd = process.env.NODE_ENV === 'production'; + if (!isProd) { + // Get network provider and web3 instance. + const web3 = await getWeb3(); + let ganacheAccounts = []; + + try { + ganacheAccounts = await this.getGanacheAddresses(); + } catch (e) { + console.log('Ganache is not running'); + } + + // Use web3 to get the user's accounts. + const accounts = await web3.eth.getAccounts(); + // Get the contract instance. + const networkId = await web3.eth.net.getId(); + const networkType = await web3.eth.net.getNetworkType(); + const isMetaMask = web3.currentProvider.isMetaMask; + let balance = accounts.length > 0 ? await web3.eth.getBalance(accounts[0]): web3.utils.toWei('0'); + balance = web3.utils.fromWei(balance, 'ether'); + + let instanceNewBancorPool = null; + let deployedNetwork = null; + + // Create instance of contracts + if (NewBancorPool.networks) { + deployedNetwork = NewBancorPool.networks[networkId.toString()]; + if (deployedNetwork) { + instanceNewBancorPool = new web3.eth.Contract( + NewBancorPool.abi, + deployedNetwork && deployedNetwork.address, + ); + console.log('=== instanceNewBancorPool ===', instanceNewBancorPool); + } + } + + if (NewBancorPool) { + // Set web3, accounts, and contract to the state, and then proceed with an + // example of interacting with the contract's methods. + this.setState({ + web3, + ganacheAccounts, + accounts, + balance, + networkId, + networkType, + hotLoaderDisabled, + isMetaMask, + new_bancor_pool: instanceNewBancorPool + }, () => { + this.refreshValues( + instanceNewBancorPool + ); + setInterval(() => { + this.refreshValues(instanceNewBancorPool); + }, 5000); + }); + } + else { + this.setState({ web3, ganacheAccounts, accounts, balance, networkId, networkType, hotLoaderDisabled, isMetaMask }); + } + } + } catch (error) { + // Catch any errors for any of the above operations. + alert( + `Failed to load web3, accounts, or contract. Check console for details.`, + ); + console.error(error); + } + } + + + + render() { + return ( + +
+ + + + + +

Swap Factory

+ + random unsplash image + +
+ +
+
+ + + + + + +
+
+ ); + } + +} diff --git a/client/src/components/Web3Info/Web3Info.module.scss b/client/src/components/Web3Info/Web3Info.module.scss new file mode 100755 index 0000000..ab81cee --- /dev/null +++ b/client/src/components/Web3Info/Web3Info.module.scss @@ -0,0 +1,35 @@ +@import '../../layout/variables.scss'; + +.web3 { + padding: 40px 0; + display: flex; + flex-flow: column wrap; + justify-content: flex-start; + align-items: flex-start; + width: 380px; + height: auto; + padding: 40px 20px; + border: 1px solid #ccc; + box-shadow: 0px 2px 2px #ccc; + + h3 { + border-bottom: 1px dotted #FFBE44; + padding-bottom: 5px; + } + + .dataPoint { + display: flex; + flex-flow: column nowrap; + align-items: flex-start; + margin: 5px 0; + width: 100%; + + .value { + font-weight: bold; + display: flex; + flex-flow: row nowrap; + justify-content: space-between; + align-items: baseline; + } + } +} diff --git a/client/src/components/Web3Info/index.js b/client/src/components/Web3Info/index.js new file mode 100755 index 0000000..047b852 --- /dev/null +++ b/client/src/components/Web3Info/index.js @@ -0,0 +1,64 @@ +import React, { Component } from "react"; +import { EthAddress, Blockie } from 'rimble-ui'; +import styles from './Web3Info.module.scss'; + +export default class Web3Info extends Component { + + renderNetworkName(networkId) { + switch (networkId) { + case 3: + return 'Ropsten'; + case 4: + return 'Rinkeby'; + case 1: + return 'Main'; + case 42: + return 'Kovan'; + default: + return 'Private'; + } + } + + render() { + const { networkId, accounts, balance, isMetaMask } = this.props; + return ( +
+

Your Web3 Info

+
+
+ Network: +
+
+ {networkId} - {this.renderNetworkName(networkId)} +
+
+
+
+ Your address: +
+
+ + +
+
+
+
+ Your ETH balance: +
+
+ {balance} +
+
+
+
+ Using Metamask: +
+
+ {isMetaMask ? 'YES' : 'NO'} +
+
+
+ ); + } +} diff --git a/client/src/index.js b/client/src/index.js new file mode 100755 index 0000000..edf6f79 --- /dev/null +++ b/client/src/index.js @@ -0,0 +1,12 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import './layout/index.scss'; +import App from './App'; +import * as serviceWorker from './serviceWorker'; + +ReactDOM.render(, document.getElementById('root')); + +// If you want your app to work offline and load faster, you can change +// unregister() to register() below. Note this comes with some pitfalls. +// Learn more about service workers: http://bit.ly/CRA-PWA +serviceWorker.unregister(); diff --git a/client/src/layout/index.scss b/client/src/layout/index.scss new file mode 100755 index 0000000..8b8334b --- /dev/null +++ b/client/src/layout/index.scss @@ -0,0 +1,207 @@ +@import './variables.scss'; + +html { + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} + + +html, body { + overflow-x: hidden; +} + +body { + margin: 0; + padding: 0; + font: 112.5%/1.45em 'Roboto',sans-serif; + box-sizing: border-box; + overflow-y: scroll; + background: $white; + color: $primary; +} + +a { + color: $blue; + text-decoration: none; + cursor: pointer; + + &:hover { + text-decoration: underline; + } +} + +* { + box-sizing: inherit; +} +*:before { + box-sizing: inherit; +} +*:after { + box-sizing: inherit; +} + +body { + color: hsla(0, 0%, 0%, 0.8); + font-weight: normal; + word-wrap: break-word; + font-kerning: normal; + -moz-font-feature-settings: "kern", "liga", "clig", "calt"; + -ms-font-feature-settings: "kern", "liga", "clig", "calt"; + -webkit-font-feature-settings: "kern", "liga", "clig", "calt"; + font-feature-settings: "kern", "liga", "clig", "calt"; +} + +img { + max-width: 100%; + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 0; +} +h1 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + font-weight: bold; + text-rendering: optimizeLegibility; + line-height: 1.1; + font-size: 2em; + font-weight: 300; +} +h2 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 1.62671rem; + line-height: 1.1; +} +h3 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 1.38316rem; + line-height: 1.1; +} +h4 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 1rem; + line-height: 1.1; +} +h5 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 0.85028rem; + line-height: 1.1; +} +h6 { + margin-left: 0; + margin-right: 0; + margin-top: 0; + padding-bottom: 0; + padding-left: 0; + padding-right: 0; + padding-top: 0; + margin-bottom: 1.45rem; + color: inherit; + font-weight: bold; + text-rendering: optimizeLegibility; + font-size: 0.78405rem; + line-height: 1.1; +} + +button { + box-shadow: none; + outline: none; + color: $white; + padding: 10px 15px; + border: 1px solid $white; + font-size: 16px; + font-weight: 400; + cursor: pointer; + + &.purple { + background: $primary; + &:hover { + background: $white; + color: $primary; + border-color: $primary; + } + } + + &.yellow { + background: $yellow; + &:hover { + background: $white; + color: $yellow; + border-color: $yellow; + } + } + + &.pink { + background: $pink; + &:hover { + background: $white; + color: $pink; + border-color: $pink; + } + } +} + +input { + width: 100%; + border: 1px solid #ccc; + padding: 5px; + color: $primary; + margin: 5px 0; +} + +@media only screen and (max-width: 480px) { + html { + font-size: 100%; + } +} diff --git a/client/src/layout/variables.scss b/client/src/layout/variables.scss new file mode 100755 index 0000000..98b427c --- /dev/null +++ b/client/src/layout/variables.scss @@ -0,0 +1,21 @@ +// Colors +$primary: #3C4653; +$blue: #39e6e0; +$purple: #4420D8; +$purple-aux: #917DFF; +$yellow: #FFBE44; +$pink: #FF2972; +$white: #FFF; +$black: #000; + +// Fonts (use typography.js) +$font-size-base: 16px; +$font-size-h1: 3.375em; +// $font-family-sans-serif: 'Open Sans', sans-serif; +$line-height-base: 1.42; + +// Responsive +$screen-xs: 576px; +$screen-sm-min: 768px; +$screen-sm-max: 992px; +$screen-md-max: 1280px; diff --git a/client/src/routes.js b/client/src/routes.js new file mode 100755 index 0000000..53eee5d --- /dev/null +++ b/client/src/routes.js @@ -0,0 +1,87 @@ +/*! + +========================================================= +* Light Bootstrap Dashboard React - v1.3.0 +========================================================= + +* Product Page: https://www.creative-tim.com/product/light-bootstrap-dashboard-react +* Copyright 2019 Creative Tim (https://www.creative-tim.com) +* Licensed under MIT (https://github.com/creativetimofficial/light-bootstrap-dashboard-react/blob/master/LICENSE.md) + +* Coded by Creative Tim + +========================================================= + +* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +*/ +import Dashboard from "./views/Dashboard.jsx"; +import UserProfile from "./views/UserProfile.jsx"; +import TableList from "./views/TableList.jsx"; +import Typography from "./views/Typography.jsx"; +import Icons from "./views/Icons.jsx"; +import Maps from "./views/Maps.jsx"; +import Notifications from "./views/Notifications.jsx"; +import Upgrade from "./views/Upgrade.jsx"; + +const dashboardRoutes = [ + { + path: "/dashboard", + name: "Dashboard", + icon: "pe-7s-graph", + component: Dashboard, + layout: "/admin" + }, + { + path: "/user", + name: "User Profile", + icon: "pe-7s-user", + component: UserProfile, + layout: "/admin" + }, + { + path: "/table", + name: "Table List", + icon: "pe-7s-note2", + component: TableList, + layout: "/admin" + }, + { + path: "/typography", + name: "Typography", + icon: "pe-7s-news-paper", + component: Typography, + layout: "/admin" + }, + { + path: "/icons", + name: "Icons", + icon: "pe-7s-science", + component: Icons, + layout: "/admin" + }, + { + path: "/maps", + name: "Maps", + icon: "pe-7s-map-marker", + component: Maps, + layout: "/admin" + }, + { + path: "/notifications", + name: "Notifications", + icon: "pe-7s-bell", + component: Notifications, + layout: "/admin" + }, + { + upgrade: true, + path: "/upgrade", + name: "Upgrade to PRO", + icon: "pe-7s-rocket", + component: Upgrade, + layout: "/admin" + } +]; + +export default dashboardRoutes; diff --git a/client/src/serviceWorker.js b/client/src/serviceWorker.js new file mode 100755 index 0000000..2283ff9 --- /dev/null +++ b/client/src/serviceWorker.js @@ -0,0 +1,135 @@ +// This optional code is used to register a service worker. +// register() is not called by default. + +// This lets the app load faster on subsequent visits in production, and gives +// it offline capabilities. However, it also means that developers (and users) +// will only see deployed updates on subsequent visits to a page, after all the +// existing tabs open on the page have been closed, since previously cached +// resources are updated in the background. + +// To learn more about the benefits of this model and instructions on how to +// opt-in, read http://bit.ly/CRA-PWA + +const isLocalhost = Boolean( + window.location.hostname === 'localhost' || + // [::1] is the IPv6 localhost address. + window.location.hostname === '[::1]' || + // 127.0.0.1/8 is considered localhost for IPv4. + window.location.hostname.match( + /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ + ) +); + +export function register(config) { + if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { + // The URL constructor is available in all browsers that support SW. + const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); + if (publicUrl.origin !== window.location.origin) { + // Our service worker won't work if PUBLIC_URL is on a different origin + // from what our page is served on. This might happen if a CDN is used to + // serve assets; see https://github.com/facebook/create-react-app/issues/2374 + return; + } + + window.addEventListener('load', () => { + const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; + + if (isLocalhost) { + // This is running on localhost. Let's check if a service worker still exists or not. + checkValidServiceWorker(swUrl, config); + + // Add some additional logging to localhost, pointing developers to the + // service worker/PWA documentation. + navigator.serviceWorker.ready.then(() => { + console.log( + 'This web app is being served cache-first by a service ' + + 'worker. To learn more, visit http://bit.ly/CRA-PWA' + ); + }); + } else { + // Is not localhost. Just register service worker + registerValidSW(swUrl, config); + } + }); + } +} + +function registerValidSW(swUrl, config) { + navigator.serviceWorker + .register(swUrl) + .then(registration => { + registration.onupdatefound = () => { + const installingWorker = registration.installing; + if (installingWorker == null) { + return; + } + installingWorker.onstatechange = () => { + if (installingWorker.state === 'installed') { + if (navigator.serviceWorker.controller) { + // At this point, the updated precached content has been fetched, + // but the previous service worker will still serve the older + // content until all client tabs are closed. + console.log( + 'New content is available and will be used when all ' + + 'tabs for this page are closed. See http://bit.ly/CRA-PWA.' + ); + + // Execute callback + if (config && config.onUpdate) { + config.onUpdate(registration); + } + } else { + // At this point, everything has been precached. + // It's the perfect time to display a + // "Content is cached for offline use." message. + console.log('Content is cached for offline use.'); + + // Execute callback + if (config && config.onSuccess) { + config.onSuccess(registration); + } + } + } + }; + }; + }) + .catch(error => { + console.error('Error during service worker registration:', error); + }); +} + +function checkValidServiceWorker(swUrl, config) { + // Check if the service worker can be found. If it can't reload the page. + fetch(swUrl) + .then(response => { + // Ensure service worker exists, and that we really are getting a JS file. + const contentType = response.headers.get('content-type'); + if ( + response.status === 404 || + (contentType != null && contentType.indexOf('javascript') === -1) + ) { + // No service worker found. Probably a different app. Reload the page. + navigator.serviceWorker.ready.then(registration => { + registration.unregister().then(() => { + window.location.reload(); + }); + }); + } else { + // Service worker found. Proceed as normal. + registerValidSW(swUrl, config); + } + }) + .catch(() => { + console.log( + 'No internet connection found. App is running in offline mode.' + ); + }); +} + +export function unregister() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.ready.then(registration => { + registration.unregister(); + }); + } +} diff --git a/client/src/utils/getWeb3.js b/client/src/utils/getWeb3.js new file mode 100755 index 0000000..e76055d --- /dev/null +++ b/client/src/utils/getWeb3.js @@ -0,0 +1,61 @@ +import Web3 from "web3"; +// require('dotenv').config(); +// const INFURA_API_KEY = process.env.INFURA_API_KEY; + +//const FALLBACK_WEB3_PROVIDER = process.env.REACT_APP_NETWORK || 'https://rinkeby.infura.io/v3/' + INFURA_API_KEY; // Rinkeby +const FALLBACK_WEB3_PROVIDER = process.env.REACT_APP_NETWORK || 'http://0.0.0.0:7545'; // Ganache-GUI +//const FALLBACK_WEB3_PROVIDER = process.env.REACT_APP_NETWORK || 'http://0.0.0.0:8545'; + + +const getWeb3 = () => + new Promise((resolve, reject) => { + // Wait for loading completion to avoid race conditions with web3 injection timing. + window.addEventListener("load", async () => { + // Modern dapp browsers... + if (window.ethereum) { + const web3 = new Web3(window.ethereum); + try { + // Request account access if needed + await window.ethereum.enable(); + // Acccounts now exposed + resolve(web3); + } catch (error) { + reject(error); + } + } + // Legacy dapp browsers... + else if (window.web3) { + // Use Mist/MetaMask's provider. + const web3 = window.web3; + console.log("Injected web3 detected."); + resolve(web3); + } + // Fallback to localhost; use dev console port by default... + else { + const provider = new Web3.providers.HttpProvider( + FALLBACK_WEB3_PROVIDER + ); + const web3 = new Web3(provider); + console.log("No web3 instance injected, using Infura/Local web3."); + resolve(web3); + } + }); + }); + +const getGanacheWeb3 = () => { + const isProd = process.env.NODE_ENV === 'production'; + if (isProd) { + return null; + } + const provider = new Web3.providers.HttpProvider( + //'https://rinkeby.infura.io/v3/' + INFURA_API_KEY // Rinkeby + 'http://0.0.0.0:7545' // Ganache-GUI + //'http://0.0.0.0:8545' // Ganache-CLI + ); + const web3 = new Web3(provider); + console.log("No local ganache found."); + return web3; +} + +export default getWeb3; +export { getGanacheWeb3, Web3 }; diff --git a/client/src/utils/theme.js b/client/src/utils/theme.js new file mode 100755 index 0000000..d57d9dc --- /dev/null +++ b/client/src/utils/theme.js @@ -0,0 +1,18 @@ +import green from '@material-ui/core/colors/green'; +import blueGrey from '@material-ui/core/colors/blueGrey'; +import { createMuiTheme } from '@material-ui/core/styles'; + +export const theme = createMuiTheme({ + palette: { + primary: { + dark: blueGrey[900], + light: blueGrey[600], + main: blueGrey[800], + }, + secondary: { + dark: green[900], + light: green[500], + main: green[800], + }, + }, +}); diff --git a/scripts/compile.sh b/scripts/bancor-protocol/compile.sh similarity index 100% rename from scripts/compile.sh rename to scripts/bancor-protocol/compile.sh diff --git a/scripts/deploy-one.js b/scripts/bancor-protocol/deploy-one.js similarity index 100% rename from scripts/deploy-one.js rename to scripts/bancor-protocol/deploy-one.js diff --git a/scripts/fix-modules.js b/scripts/bancor-protocol/fix-modules.js similarity index 100% rename from scripts/fix-modules.js rename to scripts/bancor-protocol/fix-modules.js diff --git a/scripts/flatten.js b/scripts/bancor-protocol/flatten.js similarity index 100% rename from scripts/flatten.js rename to scripts/bancor-protocol/flatten.js diff --git a/scripts/rebuild-all.js b/scripts/bancor-protocol/rebuild-all.js similarity index 100% rename from scripts/rebuild-all.js rename to scripts/bancor-protocol/rebuild-all.js diff --git a/scripts/run-tests.js b/scripts/bancor-protocol/run-tests.js similarity index 100% rename from scripts/run-tests.js rename to scripts/bancor-protocol/run-tests.js diff --git a/scripts/verify-all.js b/scripts/bancor-protocol/verify-all.js similarity index 100% rename from scripts/verify-all.js rename to scripts/bancor-protocol/verify-all.js diff --git a/test/BancorConverter.js b/test/bancor-protocol/BancorConverter.js similarity index 100% rename from test/BancorConverter.js rename to test/bancor-protocol/BancorConverter.js diff --git a/test/BancorConverterRegistry.js b/test/bancor-protocol/BancorConverterRegistry.js similarity index 100% rename from test/BancorConverterRegistry.js rename to test/bancor-protocol/BancorConverterRegistry.js diff --git a/test/BancorConverterRegistryData.js b/test/bancor-protocol/BancorConverterRegistryData.js similarity index 100% rename from test/BancorConverterRegistryData.js rename to test/bancor-protocol/BancorConverterRegistryData.js diff --git a/test/BancorConverterUpgrader.js b/test/bancor-protocol/BancorConverterUpgrader.js similarity index 100% rename from test/BancorConverterUpgrader.js rename to test/bancor-protocol/BancorConverterUpgrader.js diff --git a/test/BancorFormula.js b/test/bancor-protocol/BancorFormula.js similarity index 100% rename from test/BancorFormula.js rename to test/bancor-protocol/BancorFormula.js diff --git a/test/BancorNetwork.js b/test/bancor-protocol/BancorNetwork.js similarity index 100% rename from test/BancorNetwork.js rename to test/bancor-protocol/BancorNetwork.js diff --git a/test/BancorNetworkPathFinder.js b/test/bancor-protocol/BancorNetworkPathFinder.js similarity index 100% rename from test/BancorNetworkPathFinder.js rename to test/bancor-protocol/BancorNetworkPathFinder.js diff --git a/test/BancorNetworkWithOldConverter.js b/test/bancor-protocol/BancorNetworkWithOldConverter.js similarity index 100% rename from test/BancorNetworkWithOldConverter.js rename to test/bancor-protocol/BancorNetworkWithOldConverter.js diff --git a/test/BancorX.js b/test/bancor-protocol/BancorX.js similarity index 100% rename from test/BancorX.js rename to test/bancor-protocol/BancorX.js diff --git a/test/ContractFeatures.js b/test/bancor-protocol/ContractFeatures.js similarity index 100% rename from test/ContractFeatures.js rename to test/bancor-protocol/ContractFeatures.js diff --git a/test/ContractRegistry.js b/test/bancor-protocol/ContractRegistry.js similarity index 100% rename from test/ContractRegistry.js rename to test/bancor-protocol/ContractRegistry.js diff --git a/test/CrowdsaleController.js b/test/bancor-protocol/CrowdsaleController.js similarity index 100% rename from test/CrowdsaleController.js rename to test/bancor-protocol/CrowdsaleController.js diff --git a/test/ERC20Token.js b/test/bancor-protocol/ERC20Token.js similarity index 100% rename from test/ERC20Token.js rename to test/bancor-protocol/ERC20Token.js diff --git a/test/EtherToken.js b/test/bancor-protocol/EtherToken.js similarity index 100% rename from test/EtherToken.js rename to test/bancor-protocol/EtherToken.js diff --git a/test/Managed.js b/test/bancor-protocol/Managed.js similarity index 100% rename from test/Managed.js rename to test/bancor-protocol/Managed.js diff --git a/test/Owned.js b/test/bancor-protocol/Owned.js similarity index 100% rename from test/Owned.js rename to test/bancor-protocol/Owned.js diff --git a/test/SafeMath.js b/test/bancor-protocol/SafeMath.js similarity index 100% rename from test/SafeMath.js rename to test/bancor-protocol/SafeMath.js diff --git a/test/SmartToken.js b/test/bancor-protocol/SmartToken.js similarity index 100% rename from test/SmartToken.js rename to test/bancor-protocol/SmartToken.js diff --git a/test/SmartTokenController.js b/test/bancor-protocol/SmartTokenController.js similarity index 100% rename from test/SmartTokenController.js rename to test/bancor-protocol/SmartTokenController.js diff --git a/test/TokenHolder.js b/test/bancor-protocol/TokenHolder.js similarity index 100% rename from test/TokenHolder.js rename to test/bancor-protocol/TokenHolder.js diff --git a/test/Whitelist.js b/test/bancor-protocol/Whitelist.js similarity index 100% rename from test/Whitelist.js rename to test/bancor-protocol/Whitelist.js diff --git a/test/XConversions.js b/test/bancor-protocol/XConversions.js similarity index 100% rename from test/XConversions.js rename to test/bancor-protocol/XConversions.js diff --git a/test/XTransferRerouter.js b/test/bancor-protocol/XTransferRerouter.js similarity index 100% rename from test/XTransferRerouter.js rename to test/bancor-protocol/XTransferRerouter.js diff --git a/test/bin/bancor_converter_v10.abi b/test/bancor-protocol/bin/bancor_converter_v10.abi similarity index 100% rename from test/bin/bancor_converter_v10.abi rename to test/bancor-protocol/bin/bancor_converter_v10.abi diff --git a/test/bin/bancor_converter_v10.bin b/test/bancor-protocol/bin/bancor_converter_v10.bin similarity index 100% rename from test/bin/bancor_converter_v10.bin rename to test/bancor-protocol/bin/bancor_converter_v10.bin diff --git a/test/bin/bancor_converter_v11.abi b/test/bancor-protocol/bin/bancor_converter_v11.abi similarity index 100% rename from test/bin/bancor_converter_v11.abi rename to test/bancor-protocol/bin/bancor_converter_v11.abi diff --git a/test/bin/bancor_converter_v11.bin b/test/bancor-protocol/bin/bancor_converter_v11.bin similarity index 100% rename from test/bin/bancor_converter_v11.bin rename to test/bancor-protocol/bin/bancor_converter_v11.bin diff --git a/test/bin/bancor_converter_v4.abi b/test/bancor-protocol/bin/bancor_converter_v4.abi similarity index 100% rename from test/bin/bancor_converter_v4.abi rename to test/bancor-protocol/bin/bancor_converter_v4.abi diff --git a/test/bin/bancor_converter_v4.bin b/test/bancor-protocol/bin/bancor_converter_v4.bin similarity index 100% rename from test/bin/bancor_converter_v4.bin rename to test/bancor-protocol/bin/bancor_converter_v4.bin diff --git a/test/bin/bancor_converter_v9.abi b/test/bancor-protocol/bin/bancor_converter_v9.abi similarity index 100% rename from test/bin/bancor_converter_v9.abi rename to test/bancor-protocol/bin/bancor_converter_v9.abi diff --git a/test/bin/bancor_converter_v9.bin b/test/bancor-protocol/bin/bancor_converter_v9.bin similarity index 100% rename from test/bin/bancor_converter_v9.bin rename to test/bancor-protocol/bin/bancor_converter_v9.bin diff --git a/test/helpers/BancorConverter.js b/test/bancor-protocol/helpers/BancorConverter.js similarity index 100% rename from test/helpers/BancorConverter.js rename to test/bancor-protocol/helpers/BancorConverter.js diff --git a/test/helpers/ContractRegistryClient.js b/test/bancor-protocol/helpers/ContractRegistryClient.js similarity index 100% rename from test/helpers/ContractRegistryClient.js rename to test/bancor-protocol/helpers/ContractRegistryClient.js diff --git a/test/helpers/FormulaConstants.js b/test/bancor-protocol/helpers/FormulaConstants.js similarity index 100% rename from test/helpers/FormulaConstants.js rename to test/bancor-protocol/helpers/FormulaConstants.js diff --git a/test/helpers/Utils.js b/test/bancor-protocol/helpers/Utils.js similarity index 100% rename from test/helpers/Utils.js rename to test/bancor-protocol/helpers/Utils.js diff --git a/utils/README.md b/utils/bancor-protocol/README.md similarity index 100% rename from utils/README.md rename to utils/bancor-protocol/README.md diff --git a/utils/deploy_network_emulation.js b/utils/bancor-protocol/deploy_network_emulation.js similarity index 100% rename from utils/deploy_network_emulation.js rename to utils/bancor-protocol/deploy_network_emulation.js diff --git a/utils/migrate_converter_registry_1.js b/utils/bancor-protocol/migrate_converter_registry_1.js similarity index 100% rename from utils/migrate_converter_registry_1.js rename to utils/bancor-protocol/migrate_converter_registry_1.js diff --git a/utils/migrate_converter_registry_2.js b/utils/bancor-protocol/migrate_converter_registry_2.js similarity index 100% rename from utils/migrate_converter_registry_2.js rename to utils/bancor-protocol/migrate_converter_registry_2.js diff --git a/utils/retrieve_contract_version.js b/utils/bancor-protocol/retrieve_contract_version.js similarity index 100% rename from utils/retrieve_contract_version.js rename to utils/bancor-protocol/retrieve_contract_version.js diff --git a/utils/verify_network_path_finder.js b/utils/bancor-protocol/verify_network_path_finder.js similarity index 100% rename from utils/verify_network_path_finder.js rename to utils/bancor-protocol/verify_network_path_finder.js