├── mock └── .gitkeep ├── .eslintrc ├── .roadhogrc.mock.js ├── src ├── index.css ├── assets │ └── yay.jpg ├── router.js ├── routes │ ├── IndexPage.js │ └── IndexPage.css ├── index.js ├── utils │ └── request.js ├── components │ ├── Example.js │ ├── MainPanel.js │ ├── GameContract.js │ ├── OPK.js │ ├── Common.js │ └── TokenContract.js ├── services │ ├── contract │ │ ├── divieslongAbi.json │ │ ├── gameAbi.json │ │ ├── tokenAbi.json │ │ ├── hourglassAbi.json │ │ └── pklongAbi.json │ ├── common.js │ ├── example.js │ ├── opk.js │ └── pklong.js └── models │ ├── example.js │ ├── common.js │ └── opk.js ├── process.png ├── seele.skr.png ├── seeletest.png ├── .webpackrc ├── dist ├── static │ └── yay.44dd3333.jpg └── index.html ├── README.md ├── .gitignore ├── .editorconfig ├── public └── index.html ├── package.json └── contracts ├── game.sol └── token.sol /mock/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "umi" 3 | } 4 | -------------------------------------------------------------------------------- /.roadhogrc.mock.js: -------------------------------------------------------------------------------- 1 | 2 | export default { 3 | }; 4 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | 2 | html, body, :global(#root) { 3 | height: 100%; 4 | } 5 | 6 | -------------------------------------------------------------------------------- /process.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cowkeys/erc20_purchase_game/master/process.png -------------------------------------------------------------------------------- /seele.skr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cowkeys/erc20_purchase_game/master/seele.skr.png -------------------------------------------------------------------------------- /seeletest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cowkeys/erc20_purchase_game/master/seeletest.png -------------------------------------------------------------------------------- /src/assets/yay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cowkeys/erc20_purchase_game/master/src/assets/yay.jpg -------------------------------------------------------------------------------- /.webpackrc: -------------------------------------------------------------------------------- 1 | { 2 | "extraBabelPlugins": [ 3 | ["import", { "libraryName": "antd", "style": "css" }] 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /dist/static/yay.44dd3333.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cowkeys/erc20_purchase_game/master/dist/static/yay.44dd3333.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### 代币参与游戏 2 | 3 | ![Image text](https://github.com/cowkeys/erc20_purchase_game/blob/master/process.png) 4 | 5 | ### 测试 6 | ![Image text](https://github.com/cowkeys/erc20_purchase_game/blob/master/seeletest.png) 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # production 7 | /dist/*.async.js 8 | 9 | # misc 10 | .DS_Store 11 | npm-debug.log* 12 | /.idea 13 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | 15 | [Makefile] 16 | indent_style = tab 17 | -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Dva Demo 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Dva Demo 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/router.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Router, Route, Switch } from 'dva/router'; 3 | import IndexPage from './routes/IndexPage'; 4 | 5 | function RouterConfig({ history }) { 6 | return ( 7 | 8 | 9 | 10 | 11 | 12 | ); 13 | } 14 | 15 | export default RouterConfig; 16 | -------------------------------------------------------------------------------- /src/routes/IndexPage.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { connect } from 'dva'; 3 | import styles from './IndexPage.css'; 4 | import Example from '../components/Example'; 5 | 6 | function IndexPage() { 7 | return ( 8 |
9 | 10 | 11 |
12 | ); 13 | } 14 | 15 | IndexPage.propTypes = { 16 | }; 17 | 18 | export default connect()(IndexPage); 19 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import dva from 'dva'; 2 | import './index.css'; 3 | 4 | // 1. Initialize 5 | const app = dva(); 6 | 7 | // 2. Plugins 8 | // app.use({}); 9 | 10 | // 3. Model 11 | app.model(require('./models/example').default); 12 | app.model(require('./models/opk').default); 13 | app.model(require('./models/common').default); 14 | 15 | // 4. Router 16 | app.router(require('./router').default); 17 | 18 | // 5. Start 19 | app.start('#root'); 20 | -------------------------------------------------------------------------------- /src/routes/IndexPage.css: -------------------------------------------------------------------------------- 1 | 2 | .normal { 3 | font-family: Georgia, sans-serif; 4 | margin-top: 3em; 5 | text-align: center; 6 | } 7 | 8 | .title { 9 | font-size: 2.5rem; 10 | font-weight: normal; 11 | letter-spacing: -1px; 12 | } 13 | 14 | .welcome { 15 | height: 328px; 16 | #background: url(../assets/yay.jpg) no-repeat center 0; 17 | #background-size: 388px 328px; 18 | } 19 | 20 | .list { 21 | font-size: 1.2em; 22 | margin-top: 1.8em; 23 | list-style: none; 24 | line-height: 1.5em; 25 | } 26 | 27 | .list code { 28 | background: #f7f7f7; 29 | } 30 | -------------------------------------------------------------------------------- /src/utils/request.js: -------------------------------------------------------------------------------- 1 | import fetch from 'dva/fetch'; 2 | 3 | function parseJSON(response) { 4 | return response.json(); 5 | } 6 | 7 | function checkStatus(response) { 8 | if (response.status >= 200 && response.status < 300) { 9 | return response; 10 | } 11 | 12 | const error = new Error(response.statusText); 13 | error.response = response; 14 | throw error; 15 | } 16 | 17 | /** 18 | * Requests a URL, returning a promise. 19 | * 20 | * @param {string} url The URL we want to request 21 | * @param {object} [options] The options we want to pass to "fetch" 22 | * @return {object} An object containing either "data" or "err" 23 | */ 24 | export default function request(url, options) { 25 | return fetch(url, options) 26 | .then(checkStatus) 27 | .then(parseJSON) 28 | .then(data => ({ data })) 29 | .catch(err => ({ err })); 30 | } 31 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "start": "roadhog server", 5 | "build": "roadhog build", 6 | "lint": "eslint --ext .js src test", 7 | "precommit": "npm run lint" 8 | }, 9 | "dependencies": { 10 | "antd": "^3.8.2", 11 | "babel-plugin-import": "^1.8.0", 12 | "big-number": "^1.0.0", 13 | "bignumber.js": "^7.2.1", 14 | "dva": "^2.4.0", 15 | "eth-query": "^2.1.2", 16 | "ethjs-contract": "^0.2.3", 17 | "ethjs-query": "^0.3.8", 18 | "monaco-editor": "^0.14.3", 19 | "react": "^16.2.0", 20 | "react-dom": "^16.2.0", 21 | "react-monaco-editor": "^0.18.0", 22 | "web3": "^1.0.0-beta.35" 23 | }, 24 | "devDependencies": { 25 | "babel-plugin-dva-hmr": "^0.3.2", 26 | "eslint": "^4.14.0", 27 | "eslint-config-umi": "^0.1.1", 28 | "eslint-plugin-flowtype": "^2.34.1", 29 | "eslint-plugin-import": "^2.6.0", 30 | "eslint-plugin-jsx-a11y": "^5.1.1", 31 | "eslint-plugin-react": "^7.1.0", 32 | "husky": "^0.12.0", 33 | "redbox-react": "^1.4.3", 34 | "roadhog": "^2.0.0" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/components/Example.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Tabs } from 'antd'; 3 | import {connect} from "dva/index"; 4 | import MainPanel from './MainPanel'; 5 | import OPK from './OPK'; 6 | import Common from './Common'; 7 | import GameContract from './GameContract'; 8 | import TokenContract from './TokenContract'; 9 | 10 | const TabPane = Tabs.TabPane; 11 | 12 | 13 | function callback(key) { 14 | console.log(key); 15 | } 16 | 17 | const Example = () => { 18 | return ( 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
38 | ); 39 | }; 40 | 41 | Example.propTypes = { 42 | }; 43 | 44 | export default connect()(Example); 45 | -------------------------------------------------------------------------------- /src/services/contract/divieslongAbi.json: -------------------------------------------------------------------------------- 1 | [{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pushers_","outputs":[{"name":"tracker","type":"uint256"},{"name":"time","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pusherTracker_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_percent","type":"uint256"}],"name":"distribute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rateLimiter_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"pusher","type":"address"},{"indexed":false,"name":"startingBalance","type":"uint256"},{"indexed":false,"name":"masternodePayout","type":"uint256"},{"indexed":false,"name":"finalBalance","type":"uint256"},{"indexed":false,"name":"compressedData","type":"uint256"}],"name":"onDistribute","type":"event"}] 2 | -------------------------------------------------------------------------------- /src/services/contract/gameAbi.json: -------------------------------------------------------------------------------- 1 | [{"constant":true,"inputs":[],"name":"keyprice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pIDxAddr_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"pID_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SeeleTotal_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"endRound","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"BuyKeyFromSeele","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"plyr_","outputs":[{"name":"id","type":"uint256"},{"name":"addr","type":"address"},{"name":"name","type":"bytes32"},{"name":"gen","type":"uint256"},{"name":"aff","type":"uint256"},{"name":"keys","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"}] 2 | -------------------------------------------------------------------------------- /src/models/example.js: -------------------------------------------------------------------------------- 1 | import * as examples from '../services/example'; 2 | import {BigNumber} from "bignumber.js/bignumber"; 3 | 4 | export default { 5 | 6 | namespace: 'example', 7 | 8 | state: { 9 | address:"0x", 10 | balance:0, 11 | allowance:0, 12 | gamekeys:0, 13 | dividend:0, 14 | seelebalance:0.0 15 | }, 16 | 17 | subscriptions: { 18 | setup({ dispatch, history }) { // eslint-disable-line 19 | //dispatch({type:'reloadInfo'}); 20 | }, 21 | }, 22 | 23 | effects: { 24 | *approve({ payload:{value} }, { call, put }) { // eslint-disable-line 25 | const result = yield call(examples.allocateSeele,{value}); 26 | yield put( 27 | { type: 'save'} 28 | ); 29 | }, 30 | 31 | *buykey({ payload:{value} }, { call, put }) { // eslint-disable-line 32 | const result = yield call(examples.buyKeyFromSeele,{value}); 33 | const keys = yield call(examples.currentPlayer,{}); 34 | yield put({ type: 'save', 35 | payload:{ 36 | gamekeys:+keys 37 | } 38 | }); 39 | }, 40 | 41 | *buyseele({ payload:{value} }, { call, put }) { // eslint-disable-line 42 | const result = yield call(examples.buyKeyFromSeele,{value}); 43 | const keys = yield call(examples.currentPlayer,{}); 44 | yield put({ type: 'save', 45 | payload:{ 46 | gamekeys:+keys 47 | } 48 | }); 49 | }, 50 | 51 | *reloadinfo({ payload }, { call, put }) { // eslint-disable-line 52 | const coinbase = yield call(examples.getCoinbase,{}); 53 | const balance = yield call(examples.getBalance,{coinbase}); 54 | const allowance = yield call(examples.getLeftAuthSeele,{}); 55 | const keys = yield call(examples.currentPlayer,{}); 56 | const seelebalance = yield call(examples.seeleBalance,{}); 57 | 58 | yield put( 59 | { type: 'save' , 60 | payload:{ 61 | address:coinbase, 62 | balance:balance, 63 | allowance:+allowance, 64 | gamekeys:+keys, 65 | seelebalance:+seelebalance 66 | } 67 | }); 68 | }, 69 | 70 | *fetch({ payload }, { call, put }) { // eslint-disable-line 71 | yield put({ type: 'save' }); 72 | }, 73 | }, 74 | 75 | reducers: { 76 | save(state, action) { 77 | return { ...state, ...action.payload }; 78 | }, 79 | }, 80 | 81 | }; 82 | -------------------------------------------------------------------------------- /src/models/common.js: -------------------------------------------------------------------------------- 1 | import * as com from '../services/common'; 2 | 3 | export default { 4 | namespace: 'common', 5 | state: { 6 | address:"0x", 7 | balance:0, 8 | contract:{}, 9 | abi:[], 10 | result:{}, 11 | network:"api" 12 | }, 13 | 14 | subscriptions: { 15 | setup({ dispatch, history }) { // eslint-disable-line 16 | //dispatch({type:'reloadInfo'}); 17 | }, 18 | }, 19 | 20 | effects: { 21 | 22 | //================common function============ 23 | * callingfunc({payload: {ctr,func,value,pay}}, {call, put}) { // eslint-disable-line 24 | console.log("ctr:",ctr,'func',func,"value:",...value,"| pay:",pay); 25 | const result = yield call(com.calling, ctr,func,pay,...value); 26 | if (result.error){ 27 | yield put({type: 'save'}); 28 | }else{ 29 | yield put({ 30 | type: 'save', 31 | payload:{ 32 | result:result 33 | } 34 | }); 35 | } 36 | 37 | }, 38 | 39 | *changenetwork({ payload:{network} }, { call, put }) { // eslint-disable-line 40 | const item = yield call(com.ChangeNetwork,{network}); 41 | console.log("item",item); 42 | yield put({ type: 'save', 43 | payload:{ 44 | network:network 45 | } 46 | }); 47 | }, 48 | 49 | //================contract 50 | *getCtract({ payload:{address} }, { call, put }) { // eslint-disable-line 51 | const item = yield call(com.NewContract,{address}); 52 | 53 | if (item.error){ 54 | yield put({type: 'save'}); 55 | }else { 56 | yield put({ 57 | type: 'save', 58 | payload: { 59 | contract: item.contract, 60 | abi: item.abi 61 | } 62 | }); 63 | } 64 | }, 65 | 66 | *reloadinfo({ payload }, { call, put }) { // eslint-disable-line 67 | const coinbase = yield call(com.getCoinbase,{}); 68 | const balance = yield call(com.getBalance,{coinbase}); 69 | 70 | yield put( 71 | { type: 'save' , 72 | payload:{ 73 | address:coinbase, 74 | balance:balance 75 | } 76 | }); 77 | }, 78 | 79 | *fetch({ payload }, { call, put }) { // eslint-disable-line 80 | yield put({ type: 'save' }); 81 | }, 82 | }, 83 | 84 | reducers: { 85 | save(state, action) { 86 | return { ...state, ...action.payload }; 87 | }, 88 | }, 89 | 90 | }; 91 | -------------------------------------------------------------------------------- /contracts/game.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | interface SeeleToken { 4 | function totalSupply() external view returns (uint256); 5 | function balanceOf(address _who) external view returns (uint256); 6 | function transfer(address _to, uint256 _value) external returns (bool); 7 | function allowance(address _owner, address _spender) external view returns (uint256); 8 | function transferFrom(address _from, address _to, uint256 _value) external returns (bool); 9 | function approve(address _spender, uint256 _value) external returns (bool); 10 | } 11 | 12 | contract Seelelong { 13 | 14 | SeeleToken constant private Seele = SeeleToken(0xBf10E654146ca9EA3A7B5Bf6c6cB4446688e5476); 15 | 16 | struct Player { 17 | uint256 id; 18 | address addr; // player address 19 | bytes32 name; // player name 20 | uint256 gen; // general vault 21 | uint256 aff; // affiliate vault 22 | uint256 keys; 23 | } 24 | 25 | mapping (uint256 => Player) public plyr_; 26 | mapping (address => uint256) public pIDxAddr_; 27 | uint256 public pID_; // total number of players 28 | uint256 public SeeleTotal_; 29 | uint256 public keyprice = 0.0001 ether; 30 | 31 | constructor (){ 32 | pID_ = 0; 33 | } 34 | 35 | function() 36 | public 37 | payable 38 | { 39 | revert(); 40 | } 41 | 42 | 43 | event log(uint256,uint256,uint256); 44 | // 用seele买key 45 | function BuyKeyFromSeele(uint256 _value) 46 | public 47 | payable 48 | { 49 | uint id = pIDxAddr_[msg.sender]; 50 | if (id == 0) { 51 | pID_++; 52 | id = pID_; 53 | pIDxAddr_[msg.sender] = id; 54 | } 55 | 56 | plyr_[id].addr = msg.sender; 57 | 58 | // 需要先approve才能成功 59 | Seele.transferFrom(msg.sender,this,_value); 60 | SeeleTotal_+=_value; 61 | 62 | plyr_[id].keys += _value / keyprice * 10**18; 63 | plyr_[id].aff += _value / 2; 64 | emit log(_value,keyprice,_value / keyprice * 10**18); 65 | } 66 | 67 | function withdraw() 68 | public 69 | payable 70 | { 71 | uint id = pIDxAddr_[msg.sender]; 72 | require( id > 0 ); 73 | 74 | Seele.transfer(msg.sender, plyr_[id].aff); 75 | SeeleTotal_ -= plyr_[id].aff; 76 | plyr_[id].aff = 0; 77 | plyr_[id].keys = 0; 78 | } 79 | 80 | //测试分配规则 最后一个人50% 剩下的平分 81 | function endRound() 82 | public 83 | payable 84 | { 85 | require(pID_ > 0); 86 | if (pID_ == 1) { 87 | Seele.transfer(plyr_[pID_].addr, SeeleTotal_); 88 | plyr_[pID_].aff = 0; 89 | return; 90 | } 91 | 92 | address winner = plyr_[pID_].addr; 93 | uint256 winnerReward = SeeleTotal_ / 2; 94 | 95 | Seele.transfer(winner, winnerReward); 96 | 97 | uint256 leftRewardPer = (SeeleTotal_ - winnerReward) / (pID_ - 1); 98 | 99 | for( uint8 i=1; i< pID_; i++ ){ 100 | Seele.transfer(plyr_[i].addr, leftRewardPer); 101 | plyr_[i].aff = 0; 102 | } 103 | 104 | SeeleTotal_ = 0; 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /src/services/common.js: -------------------------------------------------------------------------------- 1 | import Eth from 'ethjs-query'; 2 | import EthContract from "ethjs-contract"; 3 | import request from '../utils/request'; 4 | import {BigNumber} from "bignumber.js/bignumber"; 5 | var urlprefix = "api"; 6 | const {web3} = window; 7 | var eth = new Eth(web3.currentProvider); 8 | var CoinBase = ''; 9 | var Contracts = {}; 10 | 11 | export function getCoinbase() { 12 | return new Promise(function (resolve, reject) { 13 | web3.eth.getCoinbase((err, coinbase) => { 14 | if (err) { 15 | alert(err); 16 | resolve(err); 17 | } else { 18 | console.log('coinbase', coinbase); 19 | CoinBase = coinbase; 20 | resolve(coinbase); 21 | } 22 | }); 23 | }) 24 | } 25 | 26 | export async function ChangeNetwork({network}) { 27 | urlprefix = network+""; 28 | return true; 29 | } 30 | 31 | export function getBalance({coinbase}) { 32 | return new Promise(function (resolve, reject) { 33 | web3.eth.getBalance(coinbase, (err, balance) => { 34 | if (err) { 35 | resolve(err); 36 | } else { 37 | resolve(web3.fromWei(balance.toNumber(), "ether")); 38 | } 39 | }); 40 | }) 41 | } 42 | 43 | export function NewContract({name, address}) { 44 | var url = "http://"+urlprefix+".etherscan.io/api?module=contract&action=getabi&address=" + address; 45 | console.log(url); 46 | return new Promise(function (resolve, reject) { 47 | request(url, {}).then(function (data) { 48 | if (data.data.result =="Contract source code not verified") { 49 | alert('Contract source code not verified') 50 | var res = {}; 51 | res.error = "data.data.result"; 52 | resolve(res); 53 | return 54 | } 55 | var contract = new EthContract(eth); 56 | var abi = JSON.parse(data.data.result); 57 | //var aaa = "[{\"constant\":false,\"inputs\":[],\"name\":\"aFunc\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"cFunc\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"bFunc\",\"outputs\":[],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"\",\"type\":\"uint8\"}],\"name\":\"log\",\"type\":\"event\"}]" 58 | //var abi = JSON.parse(aaa); 59 | var Ctr = contract(abi); 60 | var item = {}; 61 | item.contract = Ctr.at(address); 62 | item.abi = abi; 63 | 64 | Contracts[address] = item.contract; 65 | resolve(item); 66 | }).catch(function (err) { 67 | reject(err); 68 | }) 69 | }) 70 | } 71 | 72 | function toBigNumber(value) { 73 | if (value == 0) { 74 | return 0 75 | } 76 | return new BigNumber(value).times('1000000000000000000'); 77 | } 78 | 79 | export function calling(ctr, fn,pay, ...param) { 80 | return new Promise(function (resolve, reject) { 81 | Contracts[ctr][fn](...param,{from:CoinBase,value:toBigNumber(pay)}, 82 | function (error, result) { 83 | if (error) { 84 | console.log(error) 85 | var res = {}; 86 | res.error = error; 87 | resolve(res); 88 | return 89 | } 90 | 91 | console.log("result:",result); 92 | resolve(result); 93 | }) 94 | }) 95 | } 96 | -------------------------------------------------------------------------------- /src/services/contract/tokenAbi.json: -------------------------------------------------------------------------------- 1 | [{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}] 2 | -------------------------------------------------------------------------------- /src/components/MainPanel.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {connect} from "dva/index"; 3 | import { Card, Col, Row, InputNumber,Button} from 'antd'; 4 | 5 | class MainPanel extends React.Component { 6 | constructor(props) { 7 | super(props) 8 | this.state = { 9 | money : 100, 10 | seele : 0, 11 | buyseele:0 12 | } 13 | } 14 | 15 | componentDidMount () { 16 | this.props.dispatch({ 17 | type: 'example/reloadinfo', 18 | }); 19 | } 20 | 21 | approve = () => { 22 | console.log("approve:",this.state.money); 23 | this.props.dispatch({ 24 | type: 'example/approve', 25 | payload: {value:+this.state.money}, 26 | }); 27 | }; 28 | 29 | buykey = () => { 30 | console.log("buykey:",this.state.seele); 31 | this.props.dispatch({ 32 | type: 'example/buykey', 33 | payload: {value:+this.state.seele}, 34 | }); 35 | }; 36 | 37 | onAuthChange = (value) => { 38 | this.setState({ 39 | money:value, 40 | }) 41 | }; 42 | 43 | onBuySeeleChange = (value) => { 44 | this.setState({ 45 | buyseele:value, 46 | }) 47 | }; 48 | 49 | buyseele = () => { 50 | console.log("buyseele:",this.state.buyseele); 51 | this.props.dispatch({ 52 | type: 'example/buyseele', 53 | payload: {value:+this.state.buyseele}, 54 | }); 55 | }; 56 | 57 | onSeeleChange = (value) => { 58 | this.setState({ 59 | seele:(value * 0.0001).toFixed(5), 60 | }) 61 | }; 62 | 63 | render() { 64 | /* 65 | 66 | {this.props.seelebalance} 67 | 68 | 69 | 70 | 71 | (seele) 72 | 73 | 74 | */ 75 | return ( 76 |
77 | 78 | 79 | {this.props.address} 80 | 81 | 82 | {this.props.balance} 83 | 84 | 85 | .. 86 | 87 | 88 | 89 | 授权额度:{this.props.allowance} (seele) / 账户总额度:{this.props.seelebalance} (seele) 90 | 91 | 92 | 93 | 94 | 95 | (seele) 96 | 97 | 98 | 99 | .. 100 | 101 | 102 | 103 | 已有:{this.props.gamekeys} (key) 104 | 105 | key = {this.state.seele} seele 106 | 107 | 108 | 109 | 110 | 分红:{this.props.gamekeys} (seele) 111 | 112 | 113 | 114 | 115 |
116 | ); 117 | } 118 | }; 119 | 120 | 121 | function mapStateToProps(state) { 122 | const { address, balance,allowance, gamekeys, dividend,seelebalance } = state.example; 123 | return { 124 | address, balance,allowance, gamekeys, dividend,seelebalance 125 | }; 126 | } 127 | 128 | export default connect(mapStateToProps)(MainPanel); 129 | -------------------------------------------------------------------------------- /src/models/opk.js: -------------------------------------------------------------------------------- 1 | import * as opks from '../services/opk'; 2 | import * as longs from '../services/pklong'; 3 | 4 | export default { 5 | namespace: 'opk', 6 | state: { 7 | address: "0x", 8 | balance: 0, 9 | opk: 0, 10 | buyprice: 0, 11 | sellprice: 0, 12 | opkdividend: 0, 13 | isico: true, 14 | isactive: false, 15 | keys: 0, 16 | keybuyprice: 0, 17 | vaults: {win: 0, gen: 0, aff: 0}, 18 | pid: 0, 19 | pklongContract: {}, 20 | laff: 0, 21 | roundactive: false 22 | }, 23 | 24 | subscriptions: { 25 | setup({dispatch, history}) { // eslint-disable-line 26 | //dispatch({type:'reloadInfo'}); 27 | }, 28 | }, 29 | 30 | effects: { 31 | //================contract 32 | * pkctr({payload: {address}}, {call, put}) { // eslint-disable-line 33 | const result = yield call(opks.buyOpk, {address}); 34 | yield put({ 35 | type: 'save', 36 | payload: { 37 | pklongContract: result 38 | } 39 | }); 40 | }, 41 | 42 | * querylaff({payload: {address}}, {call, put}) { // eslint-disable-line 43 | const result = yield call(longs.queryLaff, {address}); 44 | yield put({ 45 | type: 'save', 46 | payload: { 47 | laff: +result 48 | } 49 | }); 50 | }, 51 | 52 | //========================opk 53 | * buyopk({payload: {value}}, {call, put}) { // eslint-disable-line 54 | const result = yield call(opks.buyOpk, {value}); 55 | yield put({type: 'save'}); 56 | }, 57 | 58 | * sellopk({payload: {value}}, {call, put}) { // eslint-disable-line 59 | const result = yield call(opks.sellOpk, {value}); 60 | yield put({type: 'save'}); 61 | }, 62 | 63 | * withdraw({payload}, {call, put}) { // eslint-disable-line 64 | const result = yield call(opks.withdraw, {}); 65 | yield put({type: 'save'}); 66 | }, 67 | 68 | // =================divieslong 69 | 70 | * distribute({payload: {percent}}, {call, put}) { // eslint-disable-line 71 | const result = yield call(longs.distribute, {percent}); 72 | yield put({type: 'save'}); 73 | }, 74 | // ==========================long 75 | 76 | * buylongkey({payload: {value}}, {call, put}) { // eslint-disable-line 77 | const result = yield call(longs.buylongkey, {value}); 78 | yield put({type: 'save'}); 79 | }, 80 | 81 | * longwithdraw({payload}, {call, put}) { // eslint-disable-line 82 | const result = yield call(longs.withdraw, {}); 83 | yield put({type: 'save'}); 84 | }, 85 | 86 | * reloadinfo({payload: {value}}, {call, put}) { // eslint-disable-line 87 | const coinbase = yield call(opks.getCoinbase, {}); 88 | const balance = yield call(opks.getBalance, {coinbase}); 89 | const opk = yield call(opks.opktokens, {}); 90 | const buyprice = yield call(opks.buyprice, {}); 91 | const sellprice = yield call(opks.sellprice, {}); 92 | const isico = yield call(opks.isIco, {}); 93 | const opkdividend = yield call(opks.dividendsOf, {}); 94 | 95 | const balanceof = yield call(opks.balanceOf, {coinbase}); 96 | const stakingRequirement = yield call(opks.stakingRequirement, {coinbase}); 97 | 98 | //==============long 99 | 100 | const isactive = yield call(longs.isActive, {}); 101 | const isroundactive = yield call(longs.isRoundActive, {}); 102 | 103 | const keys = yield call(longs.mykeys, {coinbase}); 104 | const keybuyprice = yield call(longs.keybuyprice, {}); 105 | const pid = yield call(longs.currentPlayer, {}); 106 | const vaults = yield call(longs.vaults, {_pid: pid}); 107 | 108 | 109 | const timeleft = yield call(longs.air, ...value); 110 | console.log("timeleft:", timeleft); 111 | 112 | //============== 113 | 114 | yield put( 115 | { 116 | type: 'save', 117 | payload: { 118 | address: coinbase, 119 | balance: balance, 120 | opk: +opk, 121 | buyprice: +buyprice, 122 | sellprice: +sellprice, 123 | isico: isico, 124 | opkdividend: +opkdividend, 125 | isactive: isactive, 126 | keys: keys, 127 | keybuyprice: keybuyprice, 128 | vaults: vaults, 129 | pid: +pid, 130 | roundactive: isroundactive 131 | } 132 | }); 133 | }, 134 | 135 | * fetch({payload}, {call, put}) { // eslint-disable-line 136 | yield put({type: 'save'}); 137 | }, 138 | }, 139 | 140 | reducers: { 141 | save(state, action) { 142 | return {...state, ...action.payload}; 143 | }, 144 | }, 145 | 146 | }; 147 | -------------------------------------------------------------------------------- /src/components/GameContract.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {connect} from "dva/index"; 3 | import MonacoEditor from 'react-monaco-editor'; 4 | 5 | class GameContract extends React.Component { 6 | constructor(props) { 7 | super(props) 8 | this.state = { 9 | code:"pragma solidity ^0.4.24;\n" + 10 | "\n" + 11 | "interface SeeleToken {\n" + 12 | " function totalSupply() external view returns (uint256);\n" + 13 | " function balanceOf(address _who) external view returns (uint256);\n" + 14 | " function transfer(address _to, uint256 _value) external returns (bool);\n" + 15 | " function allowance(address _owner, address _spender) external view returns (uint256);\n" + 16 | " function transferFrom(address _from, address _to, uint256 _value) external returns (bool);\n" + 17 | " function approve(address _spender, uint256 _value) external returns (bool);\n" + 18 | "}\n" + 19 | "\n" + 20 | "contract Seelelong {\n" + 21 | " \n" + 22 | " SeeleToken constant private Seele = SeeleToken(0xBf10E654146ca9EA3A7B5Bf6c6cB4446688e5476);\n" + 23 | " \n" + 24 | " struct Player {\n" + 25 | " uint256 id;\n" + 26 | " address addr; // player address\n" + 27 | " bytes32 name; // player name\n" + 28 | " uint256 gen; // general vault\n" + 29 | " uint256 aff; // affiliate vault\n" + 30 | " uint256 keys;\n" + 31 | " }\n" + 32 | " \n" + 33 | " mapping (uint256 => Player) public plyr_;\n" + 34 | " mapping (address => uint256) public pIDxAddr_;\n" + 35 | " uint256 public pID_; // total number of players\n" + 36 | " uint256 public SeeleTotal_;\n" + 37 | " uint256 public keyprice = 0.0001 ether;\n" + 38 | " \n" + 39 | " constructor (){\n" + 40 | " pID_ = 0;\n" + 41 | " }\n" + 42 | " \n" + 43 | " function()\n" + 44 | " public\n" + 45 | " payable\n" + 46 | " {\n" + 47 | " revert();\n" + 48 | " }\n" + 49 | "\n" + 50 | "\n" + 51 | " event log(uint256,uint256,uint256);\n" + 52 | " // 用seele买key\n" + 53 | " function BuyKeyFromSeele(uint256 _value)\n" + 54 | " public\n" + 55 | " payable\n" + 56 | " {\n" + 57 | " uint id = pIDxAddr_[msg.sender];\n" + 58 | " if (id == 0) {\n" + 59 | " pID_++;\n" + 60 | " id = pID_;\n" + 61 | " pIDxAddr_[msg.sender] = id;\n" + 62 | " }\n" + 63 | " \n" + 64 | " plyr_[id].addr = msg.sender;\n" + 65 | " \n" + 66 | " // 需要先approve才能成功\n" + 67 | " Seele.transferFrom(msg.sender,this,_value);\n" + 68 | " SeeleTotal_+=_value;\n" + 69 | "\n" + 70 | " plyr_[id].keys += _value / keyprice * 10**18;\n" + 71 | " plyr_[id].aff += _value / 2;\n" + 72 | " emit log(_value,keyprice,_value / keyprice * 10**18);\n" + 73 | " }\n" + 74 | " \n" + 75 | " function withdraw()\n" + 76 | " public\n" + 77 | " payable\n" + 78 | " {\n" + 79 | " uint id = pIDxAddr_[msg.sender];\n" + 80 | " require( id > 0 );\n" + 81 | " \n" + 82 | " Seele.transfer(msg.sender, plyr_[id].aff);\n" + 83 | " SeeleTotal_ -= plyr_[id].aff;\n" + 84 | " plyr_[id].aff = 0;\n" + 85 | " plyr_[id].keys = 0;\n" + 86 | " }\n" + 87 | " \n" + 88 | " //测试分配规则 最后一个人50% 剩下的平分\n" + 89 | " function endRound()\n" + 90 | " public\n" + 91 | " payable\n" + 92 | " {\n" + 93 | " require(pID_ > 0);\n" + 94 | " if (pID_ == 1) {\n" + 95 | " Seele.transfer(plyr_[pID_].addr, SeeleTotal_);\n" + 96 | " plyr_[pID_].aff = 0;\n" + 97 | " return;\n" + 98 | " }\n" + 99 | " \n" + 100 | " address winner = plyr_[pID_].addr;\n" + 101 | " uint256 winnerReward = SeeleTotal_ / 2;\n" + 102 | " \n" + 103 | " Seele.transfer(winner, winnerReward);\n" + 104 | " \n" + 105 | " uint256 leftRewardPer = (SeeleTotal_ - winnerReward) / (pID_ - 1);\n" + 106 | " \n" + 107 | " for( uint8 i=1; i< pID_; i++ ){\n" + 108 | " Seele.transfer(plyr_[i].addr, leftRewardPer);\n" + 109 | " plyr_[i].aff = 0;\n" + 110 | " }\n" + 111 | " \n" + 112 | " SeeleTotal_ = 0;\n" + 113 | " }\n" + 114 | "}\n" 115 | } 116 | } 117 | 118 | render() { 119 | return ( 120 | 127 | 128 | ); 129 | } 130 | }; 131 | 132 | 133 | 134 | export default connect()(GameContract); 135 | -------------------------------------------------------------------------------- /src/services/example.js: -------------------------------------------------------------------------------- 1 | import Eth from 'ethjs-query'; 2 | import EthContract from 'ethjs-contract'; 3 | import tokenAbi from './contract/tokenAbi'; 4 | import gameAbi from './contract/gameAbi'; 5 | //import hourglassAbi from './contract/hourglassAbi'; 6 | 7 | import {BigNumber} from 'bignumber.js' 8 | 9 | 10 | const { web3 } = window; 11 | var eth = new Eth(web3.currentProvider); 12 | var CoinBase = ''; 13 | var tokenAddr = '0xBf10E654146ca9EA3A7B5Bf6c6cB4446688e5476'; 14 | var gameAddr = '0x0Fc6eb03AC93EdaBA749EDbC87DdaBC2B221C86E'; 15 | //var hourglassAddr = '0x3DD0864668C36D27B53a98137764c99F9FD5B7B2'; 16 | var TokenContract; 17 | var GameContract; 18 | var hourglassContract; 19 | 20 | if (typeof web3 === 'undefined') { 21 | alert("failed to un"); 22 | } 23 | 24 | function NewTokenContract() { 25 | var contract = new EthContract(eth); 26 | var tokenCtr = contract(tokenAbi); 27 | TokenContract = tokenCtr.at(tokenAddr); 28 | console.log(TokenContract); 29 | } 30 | 31 | function NewGameContract() { 32 | var contract = new EthContract(eth); 33 | var tokenCtr = contract(gameAbi); 34 | GameContract = tokenCtr.at(gameAddr); 35 | console.log(GameContract); 36 | } 37 | 38 | // function NewHourglassContract() { 39 | // var contract = new EthContract(eth); 40 | // var tokenCtr = contract(hourglassAbi); 41 | // hourglassContract = tokenCtr.at(hourglassAddr); 42 | // console.log(hourglassContract); 43 | // } 44 | 45 | NewTokenContract(); 46 | NewGameContract(); 47 | // NewHourglassContract(); 48 | 49 | export function getCoinbase() { 50 | return new Promise(function(resolve, reject){ 51 | web3.eth.getCoinbase((err, coinbase) => { 52 | if (err) { 53 | reject(err); 54 | } else { 55 | CoinBase = coinbase; 56 | resolve(coinbase); 57 | } 58 | }); 59 | }) 60 | } 61 | 62 | export function getBalance({coinbase}) { 63 | return new Promise(function(resolve, reject){ 64 | web3.eth.getBalance(coinbase,(err, balance) => { 65 | if (err) { 66 | reject(err); 67 | } else { 68 | resolve(web3.fromWei(balance.toNumber(), "ether" )); 69 | } 70 | }); 71 | }) 72 | } 73 | 74 | function formatBN(bn){ 75 | return new BigNumber(bn).div('1000000000000000000').toFormat(18); 76 | } 77 | 78 | export function getLeftAuthSeele() { 79 | return new Promise(function(resolve, reject){ 80 | TokenContract.allowance(CoinBase,gameAddr,function(error,result){ 81 | if (error) { 82 | console.log(error) 83 | reject(error); 84 | return 85 | } 86 | resolve(new BigNumber(result[0]).div('1000000000000000000').toNumber()); 87 | }) 88 | }) 89 | } 90 | 91 | export function allocateSeele({value}) { 92 | return new Promise(function(resolve, reject){ 93 | TokenContract.approve(gameAddr,new BigNumber(value).times('1000000000000000000'),{from:CoinBase},function(error,result){ 94 | if (error) { 95 | console.log(error) 96 | reject(error); 97 | return 98 | } 99 | console.log(result) 100 | resolve(true); 101 | }) 102 | }) 103 | } 104 | 105 | export function buyKeyFromSeele({value}) { 106 | return new Promise(function(resolve, reject){ 107 | GameContract.BuyKeyFromSeele(new BigNumber(value).times('1000000000000000000'),{from:CoinBase},function(error,result){ 108 | if (error) { 109 | console.log(error) 110 | reject(error); 111 | return 112 | } 113 | console.log(result) 114 | resolve(true); 115 | }) 116 | }) 117 | } 118 | 119 | export function seeleBalance() { 120 | return new Promise(function(resolve, reject){ 121 | TokenContract.balanceOf(CoinBase,function(error,result){ 122 | if (error) { 123 | console.log(error) 124 | reject(error); 125 | return 126 | } 127 | resolve(new BigNumber(result[0]).div('1000000000000000000').toString()) 128 | }) 129 | }) 130 | } 131 | 132 | export function buyseele() { 133 | 134 | } 135 | 136 | export function currentPlayer() { 137 | return new Promise(function(resolve, reject){ 138 | console.log("coinbase:",CoinBase); 139 | GameContract.pIDxAddr_(CoinBase,function(error,result){ 140 | if (error) { 141 | console.log(error) 142 | reject(error); 143 | return 144 | } 145 | 146 | GameContract.plyr_(result[0],function(error2,result2){ 147 | if (error2) { 148 | console.log(error2) 149 | reject(error2); 150 | return 151 | } 152 | console.log(result2); 153 | resolve(new BigNumber(result2.keys).div('1000000000000000000').toNumber()) 154 | }) 155 | }) 156 | }) 157 | } 158 | 159 | 160 | //=================== 161 | export function buyInICO({value}) { 162 | return new Promise(function(resolve, reject){ 163 | hourglassContract.buy('0x0000000000000000000000000000000000000000', 164 | {from:CoinBase,value:new BigNumber(value).times('1000000000000000000')}, 165 | function(error,result){ 166 | if (error) { 167 | console.log(error) 168 | reject(error); 169 | return 170 | } 171 | resolve(result) 172 | }) 173 | }) 174 | } 175 | -------------------------------------------------------------------------------- /src/services/opk.js: -------------------------------------------------------------------------------- 1 | import Eth from 'ethjs-query'; 2 | import EthContract from 'ethjs-contract'; 3 | import hourglassAbi from './contract/hourglassAbi'; 4 | import {BigNumber} from 'bignumber.js' 5 | 6 | 7 | const { web3 } = window; 8 | var eth = new Eth(web3.currentProvider); 9 | var CoinBase = ''; 10 | var hourglassAddr = '0x97550CE17666bB49349EF0E50f9fDb88353EDb64'; 11 | var hourglassContract; 12 | 13 | if (typeof web3 === 'undefined') { 14 | alert("failed to un"); 15 | } 16 | 17 | function NewHourglassContract() { 18 | var contract = new EthContract(eth); 19 | var tokenCtr = contract(hourglassAbi); 20 | hourglassContract = tokenCtr.at(hourglassAddr); 21 | console.log(hourglassContract); 22 | } 23 | 24 | NewHourglassContract(); 25 | 26 | export function getCoinbase() { 27 | return new Promise(function(resolve, reject){ 28 | web3.eth.getCoinbase((err, coinbase) => { 29 | if (err) { 30 | reject(err); 31 | } else { 32 | CoinBase = coinbase; 33 | resolve(coinbase); 34 | } 35 | }); 36 | }) 37 | } 38 | 39 | export function getBalance({coinbase}) { 40 | return new Promise(function(resolve, reject){ 41 | web3.eth.getBalance(coinbase,(err, balance) => { 42 | if (err) { 43 | reject(err); 44 | } else { 45 | resolve(web3.fromWei(balance.toNumber(), "ether" )); 46 | } 47 | }); 48 | }) 49 | } 50 | 51 | function formatBN(bn){ 52 | return new BigNumber(bn).div('1000000000000000000').toFormat(18); 53 | } 54 | 55 | function toBigNumber(value) { 56 | return new BigNumber(value).times('1000000000000000000'); 57 | } 58 | 59 | function fromBigNumber(value) { 60 | return new BigNumber(value).div('1000000000000000000').toString() 61 | } 62 | 63 | var nulladdr = '0x0000000000000000000000000000000000000000'; 64 | 65 | //=================== 66 | export function buyOpk({value}) { 67 | console.log("buy value,",value) 68 | return new Promise(function(resolve, reject){ 69 | hourglassContract.buy(nulladdr, {from:CoinBase,value:toBigNumber(value)}, 70 | function(error,result){ 71 | if (error) { 72 | console.log(error) 73 | reject(error); 74 | return 75 | } 76 | resolve(result) 77 | }) 78 | }) 79 | } 80 | 81 | export function sellOpk({value}) { 82 | console.log("sell value,",value) 83 | return new Promise(function(resolve, reject){ 84 | hourglassContract.sell(toBigNumber(value), {from:CoinBase}, 85 | function(error,result){ 86 | if (error) { 87 | console.log(error) 88 | reject(error); 89 | return 90 | } 91 | resolve(result); 92 | }); 93 | }) 94 | } 95 | 96 | export function withdraw() { 97 | console.log("withdraw value,") 98 | return new Promise(function(resolve, reject){ 99 | hourglassContract.withdraw({from:CoinBase}, 100 | function(error,result){ 101 | if (error) { 102 | console.log(error) 103 | reject(error); 104 | return 105 | } 106 | resolve(result); 107 | }); 108 | }) 109 | } 110 | 111 | export function opktokens() { 112 | return new Promise(function(resolve, reject){ 113 | hourglassContract.tokenBalanceLedger_(CoinBase, 114 | function(error,result){ 115 | if (error) { 116 | console.log(error) 117 | reject(error); 118 | return 119 | } 120 | resolve(fromBigNumber(result[0])); 121 | }); 122 | }) 123 | } 124 | 125 | export function sellprice() { 126 | return new Promise(function(resolve, reject){ 127 | hourglassContract.sellPrice(function(error,result){ 128 | if (error) { 129 | console.log(error) 130 | reject(error); 131 | return 132 | } 133 | resolve(fromBigNumber(result[0])); 134 | }); 135 | }) 136 | } 137 | 138 | export function buyprice() { 139 | return new Promise(function(resolve, reject){ 140 | hourglassContract.buyPrice( 141 | function(error,result){ 142 | if (error) { 143 | console.log(error) 144 | reject(error); 145 | return 146 | } 147 | resolve(fromBigNumber(result[0])); 148 | }); 149 | }) 150 | } 151 | 152 | export function isIco() { 153 | return new Promise(function(resolve, reject){ 154 | hourglassContract.inICO(function(error,result){ 155 | if (error) { 156 | console.log(error) 157 | reject(error); 158 | return 159 | } 160 | 161 | resolve(result[0]); 162 | }); 163 | }) 164 | } 165 | 166 | export function dividendsOf() { 167 | return new Promise(function(resolve, reject){ 168 | hourglassContract.dividendsOf(CoinBase,function(error,result){ 169 | if (error) { 170 | console.log(error) 171 | reject(error); 172 | return 173 | } 174 | 175 | resolve(fromBigNumber(result[0])); 176 | }); 177 | }) 178 | } 179 | 180 | export function myDividends() { 181 | return new Promise(function(resolve, reject){ 182 | hourglassContract.dividendsOf(CoinBase,function(error,result){ 183 | if (error) { 184 | console.log(error); 185 | reject(error); 186 | return 187 | } 188 | console.log('mydividends',result[0]); 189 | resolve(fromBigNumber(result[0])); 190 | }); 191 | }) 192 | } 193 | 194 | /// ===divieslong test 195 | 196 | export function balanceOf() { 197 | return new Promise(function(resolve, reject){ 198 | hourglassContract.balanceOf(CoinBase,function(error,result){ 199 | if (error) { 200 | console.log(error) 201 | reject(error); 202 | return 203 | } 204 | 205 | console.log('balanceOf:',fromBigNumber(result[0])) 206 | 207 | resolve(fromBigNumber(result[0])); 208 | }); 209 | }) 210 | } 211 | 212 | export function stakingRequirement() { 213 | return new Promise(function(resolve, reject){ 214 | hourglassContract.stakingRequirement(function(error,result){ 215 | if (error) { 216 | console.log(error) 217 | reject(error); 218 | return 219 | } 220 | 221 | console.log('stakingRequirement:',fromBigNumber(result[0])) 222 | 223 | resolve(fromBigNumber(result[0])); 224 | }); 225 | }) 226 | } 227 | -------------------------------------------------------------------------------- /src/services/contract/hourglassAbi.json: -------------------------------------------------------------------------------- 1 | [{"constant":true,"inputs":[{"name":"_customerAddress","type":"address"}],"name":"dividendsOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"activate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_ethereumToSpend","type":"uint256"}],"name":"calculateTokensReceived","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"okamiMaxPurchase_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"activated","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokensToSell","type":"uint256"}],"name":"calculateEthereumReceived","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sellPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"endICO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stakingRequirement","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"okamiMinPurchase_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokenBalanceLedger_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"okamiCurrentPurchase_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_includeReferralBonus","type":"bool"}],"name":"myDividends","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalEthereumBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_customerAddress","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"administrators","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amountOfTokens","type":"uint256"}],"name":"setStakingRequirement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"buyPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_identifier","type":"address"},{"name":"_status","type":"bool"}],"name":"setAdministrator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"myTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"okamiTotalPurchase_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_toAddress","type":"address"},{"name":"_amountOfTokens","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"okamiFunds_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_symbol","type":"string"}],"name":"setSymbol","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"icoPrice_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"referralBalance_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"payoutsTo_","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amountOfTokens","type":"uint256"}],"name":"sell","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_referredBy","type":"address"}],"name":"buy","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"inICO","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"reinvest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"customerAddress","type":"address"},{"indexed":false,"name":"incomingEthereum","type":"uint256"},{"indexed":false,"name":"tokensMinted","type":"uint256"},{"indexed":true,"name":"referredBy","type":"address"}],"name":"onTokenPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"customerAddress","type":"address"},{"indexed":false,"name":"tokensBurned","type":"uint256"},{"indexed":false,"name":"ethereumEarned","type":"uint256"}],"name":"onTokenSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"customerAddress","type":"address"},{"indexed":false,"name":"ethereumReinvested","type":"uint256"},{"indexed":false,"name":"tokensMinted","type":"uint256"}],"name":"onReinvestment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"customerAddress","type":"address"},{"indexed":false,"name":"ethereumWithdrawn","type":"uint256"}],"name":"onWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"Transfer","type":"event"}] 2 | -------------------------------------------------------------------------------- /src/components/OPK.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {connect} from "dva/index"; 3 | import { Card, Col, Row, InputNumber,Button,Input} from 'antd'; 4 | 5 | class OPK extends React.Component { 6 | constructor(props) { 7 | super(props) 8 | this.state = { 9 | money : 100, 10 | eth : 0, 11 | opk:0, 12 | longeth:0, 13 | longselleth:0, 14 | percent:0, 15 | affaddress:"0x" 16 | } 17 | } 18 | 19 | componentDidMount () { 20 | // this.props.dispatch({ 21 | // type: 'opk/reloadinfo', 22 | // }); 23 | // var params = [10,2,3]; 24 | this.props.dispatch({ 25 | type: 'opk/reloadinfo', 26 | payload:{value:[1]} 27 | }); 28 | 29 | // setInterval(() => { 30 | // this.props.dispatch({ 31 | // type: 'opk/reloadinfo', 32 | // }); 33 | // }, 5000); 34 | } 35 | //=======================opk===================== 36 | withdraw = () => { 37 | this.props.dispatch({ 38 | type: 'opk/withdraw', 39 | payload: {}, 40 | }); 41 | }; 42 | 43 | buyopk = () => { 44 | console.log("buyopk:",this.state.eth); 45 | this.props.dispatch({ 46 | type: 'opk/buyopk', 47 | payload: {value:+this.state.eth}, 48 | }); 49 | }; 50 | 51 | onEthChange = (value) => { 52 | this.setState({ 53 | eth:value, 54 | }) 55 | }; 56 | 57 | onOpkChange = (value) => { 58 | this.setState({ 59 | opk:value, 60 | }) 61 | }; 62 | 63 | sellopk = () => { 64 | console.log("sellopk:",this.state.opk); 65 | this.props.dispatch({ 66 | type: 'opk/sellopk', 67 | payload: {value:+this.state.opk}, 68 | }); 69 | }; 70 | 71 | //=======================long===================== 72 | longwithdraw = () => { 73 | this.props.dispatch({ 74 | type: 'opk/longwithdraw', 75 | payload: {}, 76 | }); 77 | }; 78 | 79 | onlongEthChange = (value) => { 80 | this.setState({ 81 | longeth:value, 82 | }) 83 | }; 84 | 85 | buylongkey = () => { 86 | console.log("buy long key:",this.state.longeth); 87 | this.props.dispatch({ 88 | type: 'opk/buylongkey', 89 | payload: {value:+this.state.longeth}, 90 | }); 91 | }; 92 | 93 | onlongsellEthChange = (value) => { 94 | this.setState({ 95 | longselleth:value, 96 | }) 97 | }; 98 | 99 | //=========divieslong 100 | onDistribute = () => { 101 | this.props.dispatch({ 102 | type: 'opk/distribute', 103 | payload: {percent:+this.state.percent}, 104 | }); 105 | }; 106 | 107 | onDistributeChange = (value) => { 108 | this.setState({ 109 | percent:value, 110 | }) 111 | }; 112 | 113 | queryLaff = () => { 114 | console.log('got',this.state.affaddress) 115 | this.props.dispatch({ 116 | type: 'opk/querylaff', 117 | payload: {address:this.state.affaddress}, 118 | }); 119 | }; 120 | 121 | onlongLaffChange = (e) => { 122 | this.setState({ 123 | affaddress:e.target.value, 124 | }) 125 | }; 126 | 127 | test = () => { 128 | var people = 1; 129 | var result = 0; 130 | for (var i = 0;i++;i<1000) { 131 | result += 1 / people; 132 | people++; 133 | if (result>50){ 134 | console.log('人数:',i); 135 | break; 136 | } 137 | } 138 | } 139 | 140 | //======================================= 141 | render() { 142 | return ( 143 |
144 | 145 | 146 | {this.props.address} 147 | 148 | 149 | {this.props.balance} 150 | 151 | 152 | -------------------opk------------------ 153 | 154 | 155 | 156 | opk 持有数量 :{this.props.opk} (opk) / 买价:{this.props.buyprice} (eth) /卖价:{this.props.sellprice} (eth) 157 | 158 | 159 | 160 | 161 | 分红:{this.props.opkdividend} (eth) 162 | 163 | 164 | 165 | 166 | .. 167 | 168 | 169 | 170 | 171 | (eth) 172 | 173 | 174 | 175 | 176 | 177 | (opk) 178 | 179 | 180 | 181 | -------------------opklong------------------- 182 | 183 | 184 | 185 | 186 |
187 | key 持有数量 :{this.props.keys} (key) / 买价:{this.props.keybuyprice} (eth) / win({this.props.vaults.win}) | gen({this.props.vaults.gen}) | aff({this.props.vaults.aff}) 188 |
189 | 190 |
191 | .. 192 | 193 | 194 | 195 | 196 | (eth) 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | .. 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | {this.props.laff} 217 | 218 | 219 | 220 |
221 | ); 222 | } 223 | }; 224 | 225 | 226 | function mapStateToProps(state) { 227 | const { address, balance,opk,buyprice,sellprice,opkdividend,isico, 228 | isactive,keys,keybuyprice,vaults,pid,laff, roundactive } = state.opk; 229 | 230 | return { 231 | address, balance,opk,buyprice,sellprice,opkdividend,isico, 232 | isactive,keys,keybuyprice,vaults,pid,laff,roundactive 233 | }; 234 | } 235 | 236 | export default connect(mapStateToProps)(OPK); 237 | -------------------------------------------------------------------------------- /src/components/Common.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {connect} from "dva/index"; 3 | import {Button, Card, Col, Input, Radio, Row, Select, Switch} from 'antd'; 4 | import {BigNumber} from 'bignumber.js' 5 | 6 | const {Option, OptGroup} = Select; 7 | 8 | var web3js = require('web3'); 9 | var utils = web3js.utils; 10 | 11 | var {web3} = window; 12 | 13 | class Common extends React.Component { 14 | constructor(props) { 15 | super(props) 16 | this.state = { 17 | address: "0x", 18 | searching: false, 19 | fn: {}, 20 | fnname: [], 21 | req: {}, 22 | reqvalue: 0, 23 | resultswitch: false 24 | } 25 | } 26 | 27 | componentDidMount() { 28 | this.props.dispatch({ 29 | type: 'common/reloadinfo', 30 | }); 31 | } 32 | 33 | getContract = () => { 34 | this.props.dispatch({ 35 | type: 'common/getCtract', 36 | payload: {address: this.state.address}, 37 | }); 38 | }; 39 | 40 | onAddressChange = (e) => { 41 | this.setState({ 42 | address: e.target.value, 43 | }) 44 | }; 45 | 46 | onRequestChange = (e) => { 47 | var req = this.state.req; 48 | req[e.target.id] = e.target.value; 49 | this.setState({ 50 | req: req 51 | }) 52 | }; 53 | 54 | onRequestValueChange = (e) => { 55 | this.setState({ 56 | reqvalue: +e.target.value 57 | }) 58 | }; 59 | 60 | onSwitchChange = (checked) => { 61 | //console.log(`switch to ${checked}`); 62 | this.setState({ 63 | resultswitch: checked 64 | }) 65 | } 66 | 67 | parseReq = () => { 68 | var value = []; 69 | for (var index in this.state.fn.inputs) { 70 | var item = this.state.fn.inputs[index]; 71 | var it = this.state.req[item.name]; 72 | 73 | if (item.name == "") { 74 | it = index + ""; 75 | } 76 | if (item.type.indexOf("uint") >= 0) { 77 | value.push(+it || 0); 78 | continue; 79 | } 80 | if (item.type == "bool") { 81 | value.push(it == "true"); 82 | continue; 83 | } 84 | 85 | if (item.type == "string") { 86 | value.push(it || ""); 87 | continue; 88 | } 89 | 90 | if (item.type == "address") { 91 | var addr = it || "0x0000000000000000000000000000000000000000"; 92 | value.push(it); 93 | continue; 94 | } 95 | 96 | if (item.type.indexOf("bytes") >= 0) { 97 | var b = web3.fromAscii(it || "", 32); 98 | value.push(b); 99 | continue; 100 | } 101 | 102 | alert("unknown type ", item.type, it); 103 | } 104 | return value; 105 | } 106 | 107 | getValue = () => { 108 | var value = this.parseReq() 109 | console.log("request:", value); 110 | 111 | var pay = this.state.reqvalue; 112 | if (!this.state.fn.payable) { 113 | pay = 0; 114 | } 115 | 116 | this.props.dispatch({ 117 | type: 'common/callingfunc', 118 | payload: {ctr: this.state.address, func: this.state.fn.name, value, pay}, 119 | }); 120 | }; 121 | 122 | handleSelectChange = (value) => { 123 | if (value.length == 0) { 124 | return 125 | } 126 | if (value.length == 1) { 127 | value = value[0]; 128 | } else { 129 | value = value[1]; 130 | } 131 | 132 | for (var index in this.props.abi) { 133 | if (value == this.props.abi[index].name) { 134 | this.setState({ 135 | fn: this.props.abi[index], 136 | fnname: [value], 137 | req: {} 138 | }) 139 | } 140 | } 141 | } 142 | 143 | handleNetChange = (e) => { 144 | console.log("value:", e.target.value); 145 | 146 | this.props.dispatch({ 147 | type: 'common/changenetwork', 148 | payload: {network:e.target.value}, 149 | }); 150 | } 151 | 152 | //======================================= 153 | render() { 154 | const children = []; 155 | const requestparam = []; 156 | const resultparam = []; 157 | var tip = "加载中" 158 | for (var index in this.props.contract.abi) { 159 | var item = this.props.contract.abi[index]; 160 | if (item.name && item.name != "") { 161 | children.push(); 162 | var tip = "加载成功" 163 | } 164 | } 165 | if (children.length == 0) { 166 | tip = "无数据" 167 | } 168 | 169 | var details = ""; 170 | if (this.state.fn.name) { 171 | details = "类型" + this.state.fn.stateMutability + " |常量 " + this.state.fn.constant + " | 方法 " + this.state.fn.name + " | payable " + this.state.fn.payable; 172 | } 173 | 174 | for (var index in this.state.fn.inputs) { 175 | var item = this.state.fn.inputs[index]; 176 | var title = item.name + ' (' + item.type + ')'; 177 | if (item.name == "") { 178 | item.name = index; 179 | } 180 | switch (item.type) { 181 | case "string": 182 | requestparam.push( 183 | 185 | ); 186 | break; 187 | case "address": 188 | requestparam.push( 189 | 191 | ); 192 | break; 193 | case "bool": 194 | requestparam.push( 195 | 197 | ); 198 | break; 199 | default: 200 | if (item.type.indexOf("uint") >= 0) { 201 | requestparam.push( 202 | 204 | ); 205 | break; 206 | } 207 | if (item.type.indexOf("bytes") >= 0) { 208 | requestparam.push( 209 | 211 | ); 212 | break; 213 | } 214 | requestparam.push( 215 | 217 | ); 218 | } 219 | } 220 | 221 | function fromBigNumber(value) { 222 | return new BigNumber(value).div('1000000000000000000').toString() 223 | } 224 | 225 | 226 | for (var index in this.props.result) { 227 | if (!this.state.fn.outputs[index]) { 228 | break; 229 | } 230 | var item = this.state.fn.outputs[index]; 231 | var res = this.props.result; 232 | if (item.name == "") { 233 | item.name = index; 234 | } 235 | switch (item.type) { 236 | case "string": 237 | resultparam.push( 238 |
{item.name + " : " + res[index]}
239 | ); 240 | break; 241 | case "address": 242 | resultparam.push( 243 |
{item.name + " : " + res[index]}
244 | ); 245 | break; 246 | case "bool": 247 | resultparam.push( 248 |
{item.name + " : " + res[index]}
249 | ); 250 | break; 251 | default: 252 | if (item.type.indexOf("uint") >= 0) { 253 | if (this.state.resultswitch) { 254 | resultparam.push( 255 |
{item.name + " : " + fromBigNumber(res[index])}
256 | ); 257 | break; 258 | } 259 | resultparam.push( 260 |
{item.name + " : " + new BigNumber(res[index]).toString()}
261 | ); 262 | break; 263 | } 264 | if (item.type.indexOf("bytes") >= 0) { 265 | resultparam.push( 266 |
{item.name + " : " + web3.toAscii(res[index])}
267 | ); 268 | break; 269 | } 270 | resultparam.push( 271 |
{item.name + " : " + res[index]}
272 | ); 273 | } 274 | 275 | } 276 | 277 | 278 | var showres = []; 279 | showres.push( 280 |
281 | {"结果显示"} 282 |
283 | ); 284 | 285 | return ( 286 |
287 | 288 | 289 | {this.props.address} 290 | 291 | 292 | {this.props.balance} 293 | 294 | 295 | .. 296 | 297 | 298 | 299 | {'合约地址 network:'} 300 | 301 | Main 302 | Kovan 303 | 304 |
} bordered={false}> 305 | 306 |
307 | 308 | 309 | 310 | 311 | , 321 | 322 | 323 | 324 | .. 325 | 326 | 327 | 328 | {details} 329 | {requestparam} 330 |
331 | 333 | 334 |
335 | 336 | 337 | 338 | 339 | {resultparam} 340 | 341 | 342 |
343 | 344 | ); 345 | } 346 | }; 347 | 348 | 349 | function mapStateToProps(state) { 350 | const {address, balance, contract, abi, result, network} = state.common; 351 | return { 352 | address, balance, contract, abi, result, network 353 | }; 354 | } 355 | 356 | export default connect(mapStateToProps)(Common); 357 | -------------------------------------------------------------------------------- /src/services/contract/pklongAbi.json: -------------------------------------------------------------------------------- 1 | [{"constant":true,"inputs":[],"name":"getBuyPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"levelRate_","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_affCode","type":"bytes32"},{"name":"_team","type":"uint256"},{"name":"_eth","type":"uint256"}],"name":"reLoadXname","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"activate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pIDxAddr_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"airDropTracker_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pID","type":"uint256"},{"name":"_addr","type":"address"},{"name":"_name","type":"bytes32"},{"name":"_laff","type":"uint256"},{"name":"_level","type":"uint8"}],"name":"receivePlayerInfo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"round_","outputs":[{"name":"plyr","type":"uint256"},{"name":"team","type":"uint256"},{"name":"end","type":"uint256"},{"name":"ended","type":"bool"},{"name":"strt","type":"uint256"},{"name":"keys","type":"uint256"},{"name":"eth","type":"uint256"},{"name":"pot","type":"uint256"},{"name":"mask","type":"uint256"},{"name":"ico","type":"uint256"},{"name":"icoGen","type":"uint256"},{"name":"icoAvg","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"bytes32"}],"name":"plyrNames_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"levelValue_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fees_","outputs":[{"name":"gen","type":"uint256"},{"name":"opk","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"pIDxName_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"rndTmEth_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rID_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_pID","type":"uint256"}],"name":"getPlayerVaults","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentRoundInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"address"},{"name":"","type":"bytes32"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nameString","type":"string"},{"name":"_affCode","type":"bytes32"},{"name":"_all","type":"bool"},{"name":"_level","type":"uint8"}],"name":"registerNameXname","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_pID","type":"uint256"},{"name":"_name","type":"bytes32"}],"name":"receivePlayerNameList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rID","type":"uint256"}],"name":"isRoundActive","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_fromName","type":"string"}],"name":"validateName","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"plyrRnds_","outputs":[{"name":"eth","type":"uint256"},{"name":"keys","type":"uint256"},{"name":"mask","type":"uint256"},{"name":"ico","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_fromName","type":"string"}],"name":"getBytesName","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_affCode","type":"bytes32"},{"name":"_team","type":"uint256"}],"name":"buyXname","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_otherOPK","type":"address"}],"name":"setOtherFomo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"potSplit_","outputs":[{"name":"gen","type":"uint256"},{"name":"opk","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTimeLeft","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_rID","type":"uint256"},{"name":"_eth","type":"uint256"}],"name":"calcKeysReceived","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_keys","type":"uint256"}],"name":"iWantXKeys","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"activated_","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"airDropPot_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"plyr_","outputs":[{"name":"addr","type":"address"},{"name":"name","type":"bytes32"},{"name":"win","type":"uint256"},{"name":"gen","type":"uint256"},{"name":"aff","type":"uint256"},{"name":"lrnd","type":"uint256"},{"name":"laff","type":"uint256"},{"name":"level","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"potSwap","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"getPlayerInfoByAddress","outputs":[{"name":"","type":"uint256"},{"name":"","type":"bytes32"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint8"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"levelRate2_","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerID","type":"uint256"},{"indexed":true,"name":"playerAddress","type":"address"},{"indexed":true,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"isNewPlayer","type":"bool"},{"indexed":false,"name":"affiliateID","type":"uint256"},{"indexed":false,"name":"affiliateAddress","type":"address"},{"indexed":false,"name":"affiliateName","type":"bytes32"},{"indexed":false,"name":"amountPaid","type":"uint256"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"onNewName","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"ethIn","type":"uint256"},{"indexed":false,"name":"keysBought","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"newPot","type":"uint256"},{"indexed":false,"name":"OPKAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"},{"indexed":false,"name":"potAmount","type":"uint256"},{"indexed":false,"name":"airDropPot","type":"uint256"}],"name":"onEndTx","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"playerID","type":"uint256"},{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"ethOut","type":"uint256"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"onWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"ethOut","type":"uint256"},{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"newPot","type":"uint256"},{"indexed":false,"name":"OPKAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"}],"name":"onWithdrawAndDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"ethIn","type":"uint256"},{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"newPot","type":"uint256"},{"indexed":false,"name":"OPKAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"}],"name":"onBuyAndDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"playerAddress","type":"address"},{"indexed":false,"name":"playerName","type":"bytes32"},{"indexed":false,"name":"compressedData","type":"uint256"},{"indexed":false,"name":"compressedIDs","type":"uint256"},{"indexed":false,"name":"winnerAddr","type":"address"},{"indexed":false,"name":"winnerName","type":"bytes32"},{"indexed":false,"name":"amountWon","type":"uint256"},{"indexed":false,"name":"newPot","type":"uint256"},{"indexed":false,"name":"OPKAmount","type":"uint256"},{"indexed":false,"name":"genAmount","type":"uint256"}],"name":"onReLoadAndDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"affiliateID","type":"uint256"},{"indexed":false,"name":"affiliateAddress","type":"address"},{"indexed":false,"name":"affiliateName","type":"bytes32"},{"indexed":true,"name":"roundID","type":"uint256"},{"indexed":true,"name":"buyerID","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"level","type":"uint8"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"onAffiliatePayout","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"uint256"},{"indexed":false,"name":"from_addr","type":"address"},{"indexed":false,"name":"to","type":"uint256"},{"indexed":false,"name":"to_addr","type":"address"},{"indexed":false,"name":"level","type":"uint8"},{"indexed":false,"name":"fee","type":"uint256"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"onAffiliateDistribute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"pID","type":"uint256"},{"indexed":false,"name":"leftfee","type":"uint256"}],"name":"onAffiliateDistributeLeft","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"roundID","type":"uint256"},{"indexed":false,"name":"amountAddedToPot","type":"uint256"}],"name":"onPotSwapDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"affiliateID","type":"uint256"},{"indexed":false,"name":"name","type":"bytes32"},{"indexed":false,"name":"level","type":"uint8"},{"indexed":false,"name":"fee","type":"uint256"},{"indexed":false,"name":"communityFee","type":"uint256"},{"indexed":false,"name":"opkFee","type":"uint256"},{"indexed":false,"name":"refererFee","type":"uint256"},{"indexed":false,"name":"referPotFee","type":"uint256"}],"name":"onDistributeRegisterFee","type":"event"}] -------------------------------------------------------------------------------- /src/services/pklong.js: -------------------------------------------------------------------------------- 1 | import Eth from 'ethjs-query'; 2 | import EthContract from 'ethjs-contract'; 3 | import pklongAbi from './contract/pklongAbi'; 4 | import diviesAbi from './contract/divieslongAbi'; 5 | import {BigNumber} from 'bignumber.js' 6 | 7 | 8 | 9 | const { web3 } = window; 10 | var eth = new Eth(web3.currentProvider); 11 | var CoinBase = ''; 12 | var pid = ''; 13 | var pklongAddr = '0xc0c2D062306fe840e11F7FCf394DF831A09EF20C';//prod 14 | var divieslongAddr = '0xD2344f06ce022a7424619b2aF222e71b65824975';//prod 15 | //var pklongAddr = '0x12f494f55eEDd9f3fF0cc5DBdbe4d6e2382d25F0';//dev 16 | //var divieslongAddr = '0x3654953d60f04b0091f0508A2d4baE3ae64e064B';//dev 17 | 18 | var pklongContract; 19 | var divieslongContract; 20 | 21 | if (typeof web3 === 'undefined') { 22 | alert("failed to un"); 23 | } 24 | 25 | //setTimeout(events(pklongAbi,pklongAddr),6000); 26 | // function events(simpleStore) { 27 | // console.log("=====================$$$$$$$$"); 28 | // // const Web3 = require("web3"); 29 | // // console.log('in events',Web3); 30 | // const filter = simpleStore.onAffiliatePayout() 31 | // .new({ toBlock: 'latest' }, (error, result) => { 32 | // console.log('ininini',error,result); 33 | // // result null filterId 34 | // }).then((result) => { 35 | // console.log(result) 36 | // }) 37 | // .catch((error) => { 38 | // throw new Error(error) 39 | // }); 40 | // 41 | // console.log("filter:========",filter); 42 | // filter.watch((err, result) => { 43 | // console.log('wath',err,result) 44 | // // result null FilterResult {...} 45 | // }); 46 | // 47 | // 48 | // // var web3ws = new Web3(new Web3.providers.WebsocketProvider("wss://mainnet.infura.io/ws",[])); 49 | // // const instance = new web3ws.eth.Contract(_abi, _addr); 50 | // // console.log('con',instance); 51 | // // 52 | // // // instance.events.onAffiliatePayout({ 53 | // // // filter: {}, // Using an array means OR: e.g. 20 or 23 54 | // // // fromBlock: 0 55 | // // // }, function(error, event){ console.log(event); }) 56 | // // // .on('data', function(event){ 57 | // // // console.log("==================="); 58 | // // // console.log(event); // same results as the optional callback above 59 | // // // }) 60 | // // // .on('changed', function(event){ 61 | // // // // remove event from local database 62 | // // // }) 63 | // // // .on('error', console.error); 64 | // // 65 | // // // console.log('instance',instance); 66 | // // // instance.getPastEvents( 67 | // // // "onAffiliatePayout", 68 | // // // { fromBlock: 0, toBlock: "latest" }, 69 | // // // (errors, events) => { 70 | // // // console.log("#######################"); 71 | // // // if (!errors) { 72 | // // // console.log('====events',events); 73 | // // // // process events 74 | // // // } 75 | // // // } 76 | // // // ); 77 | // // 78 | // // 79 | // // var event = instance.events.onAffiliatePayout({ fromBlock: 0, toBlock: "latest" },function (err,result) { 80 | // // console.log("Event are as following:-------"); 81 | // // 82 | // // for(let key in result){ 83 | // // console.log(key + " : " + result[key]); 84 | // // console.log(result["returnValues"]); 85 | // // } 86 | // // 87 | // // console.log("Event ending-------"); 88 | // // }); 89 | // } 90 | 91 | function NewpklongContract() { 92 | var contract = new EthContract(eth); 93 | var tokenCtr = contract(pklongAbi); 94 | pklongContract = tokenCtr.at(pklongAddr); 95 | console.log('long:',pklongContract); 96 | //events(pklongContract); 97 | 98 | // console.log("simplestorage",pklongContract); 99 | // var filter = pklongContract.onAffiliateDistribute() 100 | // .new({ toBlock: 'latest' }, (error, result) => { 101 | // // result null filterId 102 | // }); 103 | // console.log("filter==",filter); 104 | // filter.watch((err, result) => { 105 | // // result null FilterResult {...} 106 | // }); 107 | // filter.uninstall() 108 | // .then(function (result) { 109 | // console.log(result); 110 | // }); 111 | } 112 | 113 | NewpklongContract(); 114 | 115 | function NewdivieslongContract() { 116 | var contract = new EthContract(eth); 117 | var tokenCtr = contract(diviesAbi); 118 | divieslongContract = tokenCtr.at(divieslongAddr); 119 | console.log('divieslong:',divieslongContract); 120 | } 121 | 122 | NewdivieslongContract() 123 | 124 | 125 | export function getCoinbase() { 126 | return new Promise(function(resolve, reject){ 127 | web3.eth.getCoinbase((err, coinbase) => { 128 | if (err) { 129 | reject(err); 130 | } else { 131 | CoinBase = coinbase; 132 | resolve(coinbase); 133 | } 134 | }); 135 | }) 136 | } 137 | 138 | export function getBalance({coinbase}) { 139 | return new Promise(function(resolve, reject){ 140 | web3.eth.getBalance(coinbase,(err, balance) => { 141 | if (err) { 142 | reject(err); 143 | } else { 144 | resolve(web3.fromWei(balance.toNumber(), "ether" )); 145 | } 146 | }); 147 | }) 148 | } 149 | 150 | function formatBN(bn){ 151 | return new BigNumber(bn).div('1000000000000000000').toFormat(18); 152 | } 153 | 154 | function toBigNumber(value) { 155 | return new BigNumber(value).times('1000000000000000000'); 156 | } 157 | 158 | function fromBigNumber(value) { 159 | return new BigNumber(value).div('1000000000000000000').toString() 160 | } 161 | 162 | var nulladdr = '0x0000000000000000000000000000000000000000'; 163 | //==================divieslong 164 | 165 | export function distribute({percent}) { 166 | return new Promise(function(resolve, reject){ 167 | divieslongContract.distribute(percent, 168 | {from:CoinBase}, 169 | function(error,result){ 170 | if (error) { 171 | console.log(error) 172 | reject(error); 173 | return 174 | } 175 | console.log('isactive',result[0]); 176 | resolve(result[0]) 177 | }) 178 | }) 179 | } 180 | 181 | //===================pklong 182 | export function isActive() { 183 | return new Promise(function(resolve, reject){ 184 | pklongContract.activated_( 185 | function(error,result){ 186 | if (error) { 187 | console.log(error) 188 | reject(error); 189 | return 190 | } 191 | console.log('isactive',result[0]); 192 | resolve(result[0]) 193 | }) 194 | }) 195 | } 196 | 197 | export function isRoundActive() { 198 | return new Promise(function(resolve, reject){ 199 | pklongContract.isRoundActive(1, 200 | function(error,result){ 201 | if (error) { 202 | console.log(error) 203 | reject(error); 204 | return 205 | } 206 | console.log('isround active',result[0]); 207 | resolve(result[0]) 208 | }) 209 | }) 210 | } 211 | 212 | export function mykeys({coinbase}) { 213 | CoinBase = coinbase; 214 | return new Promise(function(resolve, reject){ 215 | pklongContract.getPlayerInfoByAddress(coinbase, 216 | function(error,result){ 217 | if (error) { 218 | console.log(error) 219 | reject(error); 220 | return 221 | } 222 | console.log('mykeys',fromBigNumber(result[2])); 223 | resolve(fromBigNumber(result[2])); 224 | }); 225 | }) 226 | } 227 | 228 | export function withdraw({value}) { 229 | console.log("withdraw value,") 230 | return new Promise(function(resolve, reject){ 231 | pklongContract.withdraw({from:CoinBase}, 232 | function(error,result){ 233 | if (error) { 234 | console.log(error) 235 | reject(error); 236 | return 237 | } 238 | resolve(result); 239 | }); 240 | }) 241 | } 242 | 243 | 244 | export function getTimeLeft() { 245 | return new Promise(function(resolve, reject){ 246 | pklongContract.getTimeLeft( 247 | function(error,result){ 248 | if (error) { 249 | console.log(error) 250 | reject(error); 251 | return 252 | } 253 | resolve(new BigNumber(result[0]).toString()); 254 | }); 255 | }) 256 | } 257 | 258 | export function round() { 259 | return new Promise(function(resolve, reject){ 260 | pklongContract.round_(1, 261 | function(error,result){ 262 | if (error) { 263 | console.log(error) 264 | reject(error); 265 | return 266 | } 267 | resolve(new BigNumber(result[0]).toString()); 268 | }); 269 | }) 270 | } 271 | //uint256 public airDropPot_; 272 | //uint256 public airDropTracker_ = 0; 273 | export function air(...param) { 274 | return new Promise(function(resolve, reject){ 275 | console.log("param==",...param); 276 | pklongContract['round_'](...param, 277 | function(error,result){ 278 | if (error) { 279 | console.log(error) 280 | reject(error); 281 | return 282 | } 283 | 284 | resolve(fromBigNumber(result[0])); 285 | }); 286 | }) 287 | } 288 | 289 | export function keybuyprice() { 290 | return new Promise(function(resolve, reject){ 291 | pklongContract.getBuyPrice( 292 | function(error,result){ 293 | if (error) { 294 | console.log(error) 295 | reject(error); 296 | return 297 | } 298 | resolve(fromBigNumber(result[0])); 299 | }); 300 | }) 301 | } 302 | 303 | export function vaults({_pid}) { 304 | return new Promise(function(resolve, reject){ 305 | console.log(pid); 306 | pklongContract.getPlayerVaults(135,function(error,result){ 307 | if (error) { 308 | console.log(error) 309 | reject(error); 310 | return 311 | } 312 | console.log("vaults",result); 313 | var v = {}; 314 | v.win =fromBigNumber(result[0]); 315 | v.gen =fromBigNumber(result[1]); 316 | v.aff =fromBigNumber(result[2]); 317 | resolve(v); 318 | }); 319 | }) 320 | } 321 | 322 | export function buylongkey({value}) { 323 | return new Promise(function(resolve, reject){ 324 | pklongContract.buyXid(0 325 | ,3, {from:CoinBase,value:toBigNumber(value)}, 326 | function(error,result){ 327 | if (error) { 328 | console.log(error) 329 | reject(error); 330 | return 331 | } 332 | console.log(result); 333 | resolve(result) 334 | }) 335 | }) 336 | } 337 | 338 | export function currentPlayer() { 339 | return new Promise(function(resolve, reject){ 340 | pklongContract.pIDxAddr_(CoinBase,function(error,result){ 341 | if (error) { 342 | console.log(error) 343 | reject(error); 344 | return 345 | } 346 | 347 | resolve(new BigNumber(result[0]).toString()); 348 | // pklongContract.plyr_(result[0],function(error2,result2){ 349 | // if (error2) { 350 | // console.log(error2) 351 | // reject(error2); 352 | // return 353 | // } 354 | // 355 | // resolve(new BigNumber(result2.keys).div('1000000000000000000').toNumber()) 356 | // }) 357 | }) 358 | }) 359 | } 360 | 361 | export function queryLaff({address}) { 362 | return new Promise(function(resolve, reject){ 363 | pklongContract.pIDxAddr_(address,function(error,result){ 364 | if (error) { 365 | console.log(error) 366 | reject(error); 367 | return 368 | } 369 | 370 | var id = new BigNumber(result[0]).toString(); 371 | pklongContract.plyr_(id,function(error2,result2){ 372 | if (error2) { 373 | console.log(error2) 374 | reject(error2); 375 | return 376 | } 377 | console.log('laff',new BigNumber(result2.laff).div('1000000000000000000').toNumber()); 378 | resolve(new BigNumber(result2.laff).toNumber()) 379 | }) 380 | }) 381 | }) 382 | } 383 | 384 | export function CommonFunc() { 385 | return new Promise(function(resolve, reject){ 386 | pklongContract.pIDxAddr_(CoinBase,function(error,result){ 387 | if (error) { 388 | console.log(error) 389 | reject(error); 390 | return 391 | } 392 | 393 | resolve(new BigNumber(result[0]).toString()); 394 | // pklongContract.plyr_(result[0],function(error2,result2){ 395 | // if (error2) { 396 | // console.log(error2) 397 | // reject(error2); 398 | // return 399 | // } 400 | // 401 | // resolve(new BigNumber(result2.keys).div('1000000000000000000').toNumber()) 402 | // }) 403 | }) 404 | }) 405 | } 406 | // export function mydividens() { 407 | // return new Promise(function(resolve, reject){ 408 | // pklongContract.buyPrice( 409 | // function(error,result){ 410 | // if (error) { 411 | // console.log(error) 412 | // reject(error); 413 | // return 414 | // } 415 | // resolve(fromBigNumber(result[0])); 416 | // }); 417 | // }) 418 | // } 419 | 420 | // export function isIco() { 421 | // return new Promise(function(resolve, reject){ 422 | // pklongContract.inICO(function(error,result){ 423 | // if (error) { 424 | // console.log(error) 425 | // reject(error); 426 | // return 427 | // } 428 | // 429 | // resolve(result[0]); 430 | // }); 431 | // }) 432 | // } 433 | // 434 | // export function dividendsOf() { 435 | // return new Promise(function(resolve, reject){ 436 | // pklongContract.dividendsOf(CoinBase,function(error,result){ 437 | // if (error) { 438 | // console.log(error) 439 | // reject(error); 440 | // return 441 | // } 442 | // 443 | // resolve(fromBigNumber(result[0])); 444 | // }); 445 | // }) 446 | // } 447 | -------------------------------------------------------------------------------- /contracts/token.sol: -------------------------------------------------------------------------------- 1 | pragma solidity ^0.4.24; 2 | 3 | // File: contracts/zeppelin-solidity/contracts/ownership/Ownable.sol 4 | 5 | /** 6 | * @title Ownable 7 | * @dev The Ownable contract has an owner address, and provides basic authorization control 8 | * functions, this simplifies the implementation of "user permissions". 9 | */ 10 | contract Ownable { 11 | address public owner; 12 | 13 | 14 | event OwnershipRenounced(address indexed previousOwner); 15 | event OwnershipTransferred( 16 | address indexed previousOwner, 17 | address indexed newOwner 18 | ); 19 | 20 | 21 | /** 22 | * @dev The Ownable constructor sets the original `owner` of the contract to the sender 23 | * account. 24 | */ 25 | constructor() public { 26 | owner = msg.sender; 27 | } 28 | 29 | /** 30 | * @dev Throws if called by any account other than the owner. 31 | */ 32 | modifier onlyOwner() { 33 | require(msg.sender == owner); 34 | _; 35 | } 36 | 37 | /** 38 | * @dev Allows the current owner to relinquish control of the contract. 39 | * @notice Renouncing to ownership will leave the contract without an owner. 40 | * It will not be possible to call the functions with the `onlyOwner` 41 | * modifier anymore. 42 | */ 43 | function renounceOwnership() public onlyOwner { 44 | emit OwnershipRenounced(owner); 45 | owner = address(0); 46 | } 47 | 48 | /** 49 | * @dev Allows the current owner to transfer control of the contract to a newOwner. 50 | * @param _newOwner The address to transfer ownership to. 51 | */ 52 | function transferOwnership(address _newOwner) public onlyOwner { 53 | _transferOwnership(_newOwner); 54 | } 55 | 56 | /** 57 | * @dev Transfers control of the contract to a newOwner. 58 | * @param _newOwner The address to transfer ownership to. 59 | */ 60 | function _transferOwnership(address _newOwner) internal { 61 | require(_newOwner != address(0)); 62 | emit OwnershipTransferred(owner, _newOwner); 63 | owner = _newOwner; 64 | } 65 | } 66 | 67 | // File: contracts/zeppelin-solidity/contracts/lifecycle/Pausable.sol 68 | 69 | /** 70 | * @title Pausable 71 | * @dev Base contract which allows children to implement an emergency stop mechanism. 72 | */ 73 | contract Pausable is Ownable { 74 | event Pause(); 75 | event Unpause(); 76 | 77 | bool public paused = false; 78 | 79 | 80 | /** 81 | * @dev Modifier to make a function callable only when the contract is not paused. 82 | */ 83 | modifier whenNotPaused() { 84 | require(!paused); 85 | _; 86 | } 87 | 88 | /** 89 | * @dev Modifier to make a function callable only when the contract is paused. 90 | */ 91 | modifier whenPaused() { 92 | require(paused); 93 | _; 94 | } 95 | 96 | /** 97 | * @dev called by the owner to pause, triggers stopped state 98 | */ 99 | function pause() public onlyOwner whenNotPaused { 100 | paused = true; 101 | emit Pause(); 102 | } 103 | 104 | /** 105 | * @dev called by the owner to unpause, returns to normal state 106 | */ 107 | function unpause() public onlyOwner whenPaused { 108 | paused = false; 109 | emit Unpause(); 110 | } 111 | } 112 | 113 | // File: contracts/zeppelin-solidity/contracts/math/SafeMath.sol 114 | 115 | /** 116 | * @title SafeMath 117 | * @dev Math operations with safety checks that throw on error 118 | */ 119 | library SafeMath { 120 | 121 | /** 122 | * @dev Multiplies two numbers, throws on overflow. 123 | */ 124 | function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { 125 | // Gas optimization: this is cheaper than asserting 'a' not being zero, but the 126 | // benefit is lost if 'b' is also tested. 127 | // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 128 | if (_a == 0) { 129 | return 0; 130 | } 131 | 132 | c = _a * _b; 133 | assert(c / _a == _b); 134 | return c; 135 | } 136 | 137 | /** 138 | * @dev Integer division of two numbers, truncating the quotient. 139 | */ 140 | function div(uint256 _a, uint256 _b) internal pure returns (uint256) { 141 | // assert(_b > 0); // Solidity automatically throws when dividing by 0 142 | // uint256 c = _a / _b; 143 | // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold 144 | return _a / _b; 145 | } 146 | 147 | /** 148 | * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). 149 | */ 150 | function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { 151 | assert(_b <= _a); 152 | return _a - _b; 153 | } 154 | 155 | /** 156 | * @dev Adds two numbers, throws on overflow. 157 | */ 158 | function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) { 159 | c = _a + _b; 160 | assert(c >= _a); 161 | return c; 162 | } 163 | } 164 | 165 | // File: contracts/zeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol 166 | 167 | /** 168 | * @title ERC20Basic 169 | * @dev Simpler version of ERC20 interface 170 | * See https://github.com/ethereum/EIPs/issues/179 171 | */ 172 | contract ERC20Basic { 173 | function totalSupply() public view returns (uint256); 174 | function balanceOf(address _who) public view returns (uint256); 175 | function transfer(address _to, uint256 _value) public returns (bool); 176 | event Transfer(address indexed from, address indexed to, uint256 value); 177 | } 178 | 179 | // File: contracts/zeppelin-solidity/contracts/token/ERC20/BasicToken.sol 180 | 181 | /** 182 | * @title Basic token 183 | * @dev Basic version of StandardToken, with no allowances. 184 | */ 185 | contract BasicToken is ERC20Basic { 186 | using SafeMath for uint256; 187 | 188 | mapping(address => uint256) internal balances; 189 | 190 | uint256 internal totalSupply_; 191 | 192 | /** 193 | * @dev Total number of tokens in existence 194 | */ 195 | function totalSupply() public view returns (uint256) { 196 | return totalSupply_; 197 | } 198 | 199 | /** 200 | * @dev Transfer token for a specified address 201 | * @param _to The address to transfer to. 202 | * @param _value The amount to be transferred. 203 | */ 204 | function transfer(address _to, uint256 _value) public returns (bool) { 205 | require(_value <= balances[msg.sender]); 206 | require(_to != address(0)); 207 | 208 | balances[msg.sender] = balances[msg.sender].sub(_value); 209 | balances[_to] = balances[_to].add(_value); 210 | emit Transfer(msg.sender, _to, _value); 211 | return true; 212 | } 213 | 214 | /** 215 | * @dev Gets the balance of the specified address. 216 | * @param _owner The address to query the the balance of. 217 | * @return An uint256 representing the amount owned by the passed address. 218 | */ 219 | function balanceOf(address _owner) public view returns (uint256) { 220 | return balances[_owner]; 221 | } 222 | 223 | } 224 | 225 | // File: contracts/zeppelin-solidity/contracts/token/ERC20/ERC20.sol 226 | 227 | /** 228 | * @title ERC20 interface 229 | * @dev see https://github.com/ethereum/EIPs/issues/20 230 | */ 231 | contract ERC20 is ERC20Basic { 232 | function allowance(address _owner, address _spender) 233 | public view returns (uint256); 234 | 235 | function transferFrom(address _from, address _to, uint256 _value) 236 | public returns (bool); 237 | 238 | function approve(address _spender, uint256 _value) public returns (bool); 239 | event Approval( 240 | address indexed owner, 241 | address indexed spender, 242 | uint256 value 243 | ); 244 | } 245 | 246 | // File: contracts/zeppelin-solidity/contracts/token/ERC20/StandardToken.sol 247 | 248 | /** 249 | * @title Standard ERC20 token 250 | * 251 | * @dev Implementation of the basic standard token. 252 | * https://github.com/ethereum/EIPs/issues/20 253 | * Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol 254 | */ 255 | contract StandardToken is ERC20, BasicToken { 256 | 257 | mapping (address => mapping (address => uint256)) internal allowed; 258 | 259 | 260 | /** 261 | * @dev Transfer tokens from one address to another 262 | * @param _from address The address which you want to send tokens from 263 | * @param _to address The address which you want to transfer to 264 | * @param _value uint256 the amount of tokens to be transferred 265 | */ 266 | function transferFrom( 267 | address _from, 268 | address _to, 269 | uint256 _value 270 | ) 271 | public 272 | returns (bool) 273 | { 274 | require(_value <= balances[_from]); 275 | require(_value <= allowed[_from][msg.sender]); 276 | require(_to != address(0)); 277 | 278 | balances[_from] = balances[_from].sub(_value); 279 | balances[_to] = balances[_to].add(_value); 280 | allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); 281 | emit Transfer(_from, _to, _value); 282 | return true; 283 | } 284 | 285 | /** 286 | * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. 287 | * Beware that changing an allowance with this method brings the risk that someone may use both the old 288 | * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this 289 | * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: 290 | * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 291 | * @param _spender The address which will spend the funds. 292 | * @param _value The amount of tokens to be spent. 293 | */ 294 | function approve(address _spender, uint256 _value) public returns (bool) { 295 | allowed[msg.sender][_spender] = _value; 296 | emit Approval(msg.sender, _spender, _value); 297 | return true; 298 | } 299 | 300 | /** 301 | * @dev Function to check the amount of tokens that an owner allowed to a spender. 302 | * @param _owner address The address which owns the funds. 303 | * @param _spender address The address which will spend the funds. 304 | * @return A uint256 specifying the amount of tokens still available for the spender. 305 | */ 306 | function allowance( 307 | address _owner, 308 | address _spender 309 | ) 310 | public 311 | view 312 | returns (uint256) 313 | { 314 | return allowed[_owner][_spender]; 315 | } 316 | 317 | /** 318 | * @dev Increase the amount of tokens that an owner allowed to a spender. 319 | * approve should be called when allowed[_spender] == 0. To increment 320 | * allowed value is better to use this function to avoid 2 calls (and wait until 321 | * the first transaction is mined) 322 | * From MonolithDAO Token.sol 323 | * @param _spender The address which will spend the funds. 324 | * @param _addedValue The amount of tokens to increase the allowance by. 325 | */ 326 | function increaseApproval( 327 | address _spender, 328 | uint256 _addedValue 329 | ) 330 | public 331 | returns (bool) 332 | { 333 | allowed[msg.sender][_spender] = ( 334 | allowed[msg.sender][_spender].add(_addedValue)); 335 | emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); 336 | return true; 337 | } 338 | 339 | /** 340 | * @dev Decrease the amount of tokens that an owner allowed to a spender. 341 | * approve should be called when allowed[_spender] == 0. To decrement 342 | * allowed value is better to use this function to avoid 2 calls (and wait until 343 | * the first transaction is mined) 344 | * From MonolithDAO Token.sol 345 | * @param _spender The address which will spend the funds. 346 | * @param _subtractedValue The amount of tokens to decrease the allowance by. 347 | */ 348 | function decreaseApproval( 349 | address _spender, 350 | uint256 _subtractedValue 351 | ) 352 | public 353 | returns (bool) 354 | { 355 | uint256 oldValue = allowed[msg.sender][_spender]; 356 | if (_subtractedValue >= oldValue) { 357 | allowed[msg.sender][_spender] = 0; 358 | } else { 359 | allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); 360 | } 361 | emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]); 362 | return true; 363 | } 364 | 365 | } 366 | 367 | // File: contracts/zeppelin-solidity/contracts/token/ERC20/PausableToken.sol 368 | 369 | /** 370 | * @title Pausable token 371 | * @dev StandardToken modified with pausable transfers. 372 | **/ 373 | contract PausableToken is StandardToken, Pausable { 374 | 375 | function transfer( 376 | address _to, 377 | uint256 _value 378 | ) 379 | public 380 | whenNotPaused 381 | returns (bool) 382 | { 383 | return super.transfer(_to, _value); 384 | } 385 | 386 | function transferFrom( 387 | address _from, 388 | address _to, 389 | uint256 _value 390 | ) 391 | public 392 | whenNotPaused 393 | returns (bool) 394 | { 395 | return super.transferFrom(_from, _to, _value); 396 | } 397 | 398 | function approve( 399 | address _spender, 400 | uint256 _value 401 | ) 402 | public 403 | whenNotPaused 404 | returns (bool) 405 | { 406 | return super.approve(_spender, _value); 407 | } 408 | 409 | function increaseApproval( 410 | address _spender, 411 | uint _addedValue 412 | ) 413 | public 414 | whenNotPaused 415 | returns (bool success) 416 | { 417 | return super.increaseApproval(_spender, _addedValue); 418 | } 419 | 420 | function decreaseApproval( 421 | address _spender, 422 | uint _subtractedValue 423 | ) 424 | public 425 | whenNotPaused 426 | returns (bool success) 427 | { 428 | return super.decreaseApproval(_spender, _subtractedValue); 429 | } 430 | } 431 | 432 | // File: contracts/TestToken.sol 433 | 434 | /// @author reedhong 435 | contract TestToken is PausableToken { 436 | using SafeMath for uint; 437 | 438 | /// Constant token specific fields 439 | string public constant name = "TestToken"; 440 | string public constant symbol = "Cows"; 441 | uint public constant decimals = 18; 442 | 443 | constructor() 444 | public 445 | { 446 | totalSupply_ = 100000000 ether; 447 | paused = false; 448 | balances[0xc0be69a5a0c1dce0d98649532f27cd3824f6061f] = totalSupply_; 449 | } 450 | } 451 | -------------------------------------------------------------------------------- /src/components/TokenContract.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {connect} from "dva/index"; 3 | import MonacoEditor from 'react-monaco-editor'; 4 | 5 | class TokenContract extends React.Component { 6 | constructor(props) { 7 | super(props) 8 | this.state = { 9 | code:"pragma solidity ^0.4.24;\n" + 10 | "\n" + 11 | "// File: contracts/zeppelin-solidity/contracts/ownership/Ownable.sol\n" + 12 | "\n" + 13 | "/**\n" + 14 | " * @title Ownable\n" + 15 | " * @dev The Ownable contract has an owner address, and provides basic authorization control\n" + 16 | " * functions, this simplifies the implementation of \"user permissions\".\n" + 17 | " */\n" + 18 | "contract Ownable {\n" + 19 | " address public owner;\n" + 20 | "\n" + 21 | "\n" + 22 | " event OwnershipRenounced(address indexed previousOwner);\n" + 23 | " event OwnershipTransferred(\n" + 24 | " address indexed previousOwner,\n" + 25 | " address indexed newOwner\n" + 26 | " );\n" + 27 | "\n" + 28 | "\n" + 29 | " /**\n" + 30 | " * @dev The Ownable constructor sets the original `owner` of the contract to the sender\n" + 31 | " * account.\n" + 32 | " */\n" + 33 | " constructor() public {\n" + 34 | " owner = msg.sender;\n" + 35 | " }\n" + 36 | "\n" + 37 | " /**\n" + 38 | " * @dev Throws if called by any account other than the owner.\n" + 39 | " */\n" + 40 | " modifier onlyOwner() {\n" + 41 | " require(msg.sender == owner);\n" + 42 | " _;\n" + 43 | " }\n" + 44 | "\n" + 45 | " /**\n" + 46 | " * @dev Allows the current owner to relinquish control of the contract.\n" + 47 | " * @notice Renouncing to ownership will leave the contract without an owner.\n" + 48 | " * It will not be possible to call the functions with the `onlyOwner`\n" + 49 | " * modifier anymore.\n" + 50 | " */\n" + 51 | " function renounceOwnership() public onlyOwner {\n" + 52 | " emit OwnershipRenounced(owner);\n" + 53 | " owner = address(0);\n" + 54 | " }\n" + 55 | "\n" + 56 | " /**\n" + 57 | " * @dev Allows the current owner to transfer control of the contract to a newOwner.\n" + 58 | " * @param _newOwner The address to transfer ownership to.\n" + 59 | " */\n" + 60 | " function transferOwnership(address _newOwner) public onlyOwner {\n" + 61 | " _transferOwnership(_newOwner);\n" + 62 | " }\n" + 63 | "\n" + 64 | " /**\n" + 65 | " * @dev Transfers control of the contract to a newOwner.\n" + 66 | " * @param _newOwner The address to transfer ownership to.\n" + 67 | " */\n" + 68 | " function _transferOwnership(address _newOwner) internal {\n" + 69 | " require(_newOwner != address(0));\n" + 70 | " emit OwnershipTransferred(owner, _newOwner);\n" + 71 | " owner = _newOwner;\n" + 72 | " }\n" + 73 | "}\n" + 74 | "\n" + 75 | "// File: contracts/zeppelin-solidity/contracts/lifecycle/Pausable.sol\n" + 76 | "\n" + 77 | "/**\n" + 78 | " * @title Pausable\n" + 79 | " * @dev Base contract which allows children to implement an emergency stop mechanism.\n" + 80 | " */\n" + 81 | "contract Pausable is Ownable {\n" + 82 | " event Pause();\n" + 83 | " event Unpause();\n" + 84 | "\n" + 85 | " bool public paused = false;\n" + 86 | "\n" + 87 | "\n" + 88 | " /**\n" + 89 | " * @dev Modifier to make a function callable only when the contract is not paused.\n" + 90 | " */\n" + 91 | " modifier whenNotPaused() {\n" + 92 | " require(!paused);\n" + 93 | " _;\n" + 94 | " }\n" + 95 | "\n" + 96 | " /**\n" + 97 | " * @dev Modifier to make a function callable only when the contract is paused.\n" + 98 | " */\n" + 99 | " modifier whenPaused() {\n" + 100 | " require(paused);\n" + 101 | " _;\n" + 102 | " }\n" + 103 | "\n" + 104 | " /**\n" + 105 | " * @dev called by the owner to pause, triggers stopped state\n" + 106 | " */\n" + 107 | " function pause() public onlyOwner whenNotPaused {\n" + 108 | " paused = true;\n" + 109 | " emit Pause();\n" + 110 | " }\n" + 111 | "\n" + 112 | " /**\n" + 113 | " * @dev called by the owner to unpause, returns to normal state\n" + 114 | " */\n" + 115 | " function unpause() public onlyOwner whenPaused {\n" + 116 | " paused = false;\n" + 117 | " emit Unpause();\n" + 118 | " }\n" + 119 | "}\n" + 120 | "\n" + 121 | "// File: contracts/zeppelin-solidity/contracts/math/SafeMath.sol\n" + 122 | "\n" + 123 | "/**\n" + 124 | " * @title SafeMath\n" + 125 | " * @dev Math operations with safety checks that throw on error\n" + 126 | " */\n" + 127 | "library SafeMath {\n" + 128 | "\n" + 129 | " /**\n" + 130 | " * @dev Multiplies two numbers, throws on overflow.\n" + 131 | " */\n" + 132 | " function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\n" + 133 | " // Gas optimization: this is cheaper than asserting 'a' not being zero, but the\n" + 134 | " // benefit is lost if 'b' is also tested.\n" + 135 | " // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522\n" + 136 | " if (_a == 0) {\n" + 137 | " return 0;\n" + 138 | " }\n" + 139 | "\n" + 140 | " c = _a * _b;\n" + 141 | " assert(c / _a == _b);\n" + 142 | " return c;\n" + 143 | " }\n" + 144 | "\n" + 145 | " /**\n" + 146 | " * @dev Integer division of two numbers, truncating the quotient.\n" + 147 | " */\n" + 148 | " function div(uint256 _a, uint256 _b) internal pure returns (uint256) {\n" + 149 | " // assert(_b > 0); // Solidity automatically throws when dividing by 0\n" + 150 | " // uint256 c = _a / _b;\n" + 151 | " // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold\n" + 152 | " return _a / _b;\n" + 153 | " }\n" + 154 | "\n" + 155 | " /**\n" + 156 | " * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).\n" + 157 | " */\n" + 158 | " function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {\n" + 159 | " assert(_b <= _a);\n" + 160 | " return _a - _b;\n" + 161 | " }\n" + 162 | "\n" + 163 | " /**\n" + 164 | " * @dev Adds two numbers, throws on overflow.\n" + 165 | " */\n" + 166 | " function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {\n" + 167 | " c = _a + _b;\n" + 168 | " assert(c >= _a);\n" + 169 | " return c;\n" + 170 | " }\n" + 171 | "}\n" + 172 | "\n" + 173 | "// File: contracts/zeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol\n" + 174 | "\n" + 175 | "/**\n" + 176 | " * @title ERC20Basic\n" + 177 | " * @dev Simpler version of ERC20 interface\n" + 178 | " * See https://github.com/ethereum/EIPs/issues/179\n" + 179 | " */\n" + 180 | "contract ERC20Basic {\n" + 181 | " function totalSupply() public view returns (uint256);\n" + 182 | " function balanceOf(address _who) public view returns (uint256);\n" + 183 | " function transfer(address _to, uint256 _value) public returns (bool);\n" + 184 | " event Transfer(address indexed from, address indexed to, uint256 value);\n" + 185 | "}\n" + 186 | "\n" + 187 | "// File: contracts/zeppelin-solidity/contracts/token/ERC20/BasicToken.sol\n" + 188 | "\n" + 189 | "/**\n" + 190 | " * @title Basic token\n" + 191 | " * @dev Basic version of StandardToken, with no allowances.\n" + 192 | " */\n" + 193 | "contract BasicToken is ERC20Basic {\n" + 194 | " using SafeMath for uint256;\n" + 195 | "\n" + 196 | " mapping(address => uint256) internal balances;\n" + 197 | "\n" + 198 | " uint256 internal totalSupply_;\n" + 199 | "\n" + 200 | " /**\n" + 201 | " * @dev Total number of tokens in existence\n" + 202 | " */\n" + 203 | " function totalSupply() public view returns (uint256) {\n" + 204 | " return totalSupply_;\n" + 205 | " }\n" + 206 | "\n" + 207 | " /**\n" + 208 | " * @dev Transfer token for a specified address\n" + 209 | " * @param _to The address to transfer to.\n" + 210 | " * @param _value The amount to be transferred.\n" + 211 | " */\n" + 212 | " function transfer(address _to, uint256 _value) public returns (bool) {\n" + 213 | " require(_value <= balances[msg.sender]);\n" + 214 | " require(_to != address(0));\n" + 215 | "\n" + 216 | " balances[msg.sender] = balances[msg.sender].sub(_value);\n" + 217 | " balances[_to] = balances[_to].add(_value);\n" + 218 | " emit Transfer(msg.sender, _to, _value);\n" + 219 | " return true;\n" + 220 | " }\n" + 221 | "\n" + 222 | " /**\n" + 223 | " * @dev Gets the balance of the specified address.\n" + 224 | " * @param _owner The address to query the the balance of.\n" + 225 | " * @return An uint256 representing the amount owned by the passed address.\n" + 226 | " */\n" + 227 | " function balanceOf(address _owner) public view returns (uint256) {\n" + 228 | " return balances[_owner];\n" + 229 | " }\n" + 230 | "\n" + 231 | "}\n" + 232 | "\n" + 233 | "// File: contracts/zeppelin-solidity/contracts/token/ERC20/ERC20.sol\n" + 234 | "\n" + 235 | "/**\n" + 236 | " * @title ERC20 interface\n" + 237 | " * @dev see https://github.com/ethereum/EIPs/issues/20\n" + 238 | " */\n" + 239 | "contract ERC20 is ERC20Basic {\n" + 240 | " function allowance(address _owner, address _spender)\n" + 241 | " public view returns (uint256);\n" + 242 | "\n" + 243 | " function transferFrom(address _from, address _to, uint256 _value)\n" + 244 | " public returns (bool);\n" + 245 | "\n" + 246 | " function approve(address _spender, uint256 _value) public returns (bool);\n" + 247 | " event Approval(\n" + 248 | " address indexed owner,\n" + 249 | " address indexed spender,\n" + 250 | " uint256 value\n" + 251 | " );\n" + 252 | "}\n" + 253 | "\n" + 254 | "// File: contracts/zeppelin-solidity/contracts/token/ERC20/StandardToken.sol\n" + 255 | "\n" + 256 | "/**\n" + 257 | " * @title Standard ERC20 token\n" + 258 | " *\n" + 259 | " * @dev Implementation of the basic standard token.\n" + 260 | " * https://github.com/ethereum/EIPs/issues/20\n" + 261 | " * Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol\n" + 262 | " */\n" + 263 | "contract StandardToken is ERC20, BasicToken {\n" + 264 | "\n" + 265 | " mapping (address => mapping (address => uint256)) internal allowed;\n" + 266 | "\n" + 267 | "\n" + 268 | " /**\n" + 269 | " * @dev Transfer tokens from one address to another\n" + 270 | " * @param _from address The address which you want to send tokens from\n" + 271 | " * @param _to address The address which you want to transfer to\n" + 272 | " * @param _value uint256 the amount of tokens to be transferred\n" + 273 | " */\n" + 274 | " function transferFrom(\n" + 275 | " address _from,\n" + 276 | " address _to,\n" + 277 | " uint256 _value\n" + 278 | " )\n" + 279 | " public\n" + 280 | " returns (bool)\n" + 281 | " {\n" + 282 | " require(_value <= balances[_from]);\n" + 283 | " require(_value <= allowed[_from][msg.sender]);\n" + 284 | " require(_to != address(0));\n" + 285 | "\n" + 286 | " balances[_from] = balances[_from].sub(_value);\n" + 287 | " balances[_to] = balances[_to].add(_value);\n" + 288 | " allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);\n" + 289 | " emit Transfer(_from, _to, _value);\n" + 290 | " return true;\n" + 291 | " }\n" + 292 | "\n" + 293 | " /**\n" + 294 | " * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.\n" + 295 | " * Beware that changing an allowance with this method brings the risk that someone may use both the old\n" + 296 | " * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this\n" + 297 | " * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:\n" + 298 | " * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n" + 299 | " * @param _spender The address which will spend the funds.\n" + 300 | " * @param _value The amount of tokens to be spent.\n" + 301 | " */\n" + 302 | " function approve(address _spender, uint256 _value) public returns (bool) {\n" + 303 | " allowed[msg.sender][_spender] = _value;\n" + 304 | " emit Approval(msg.sender, _spender, _value);\n" + 305 | " return true;\n" + 306 | " }\n" + 307 | "\n" + 308 | " /**\n" + 309 | " * @dev Function to check the amount of tokens that an owner allowed to a spender.\n" + 310 | " * @param _owner address The address which owns the funds.\n" + 311 | " * @param _spender address The address which will spend the funds.\n" + 312 | " * @return A uint256 specifying the amount of tokens still available for the spender.\n" + 313 | " */\n" + 314 | " function allowance(\n" + 315 | " address _owner,\n" + 316 | " address _spender\n" + 317 | " )\n" + 318 | " public\n" + 319 | " view\n" + 320 | " returns (uint256)\n" + 321 | " {\n" + 322 | " return allowed[_owner][_spender];\n" + 323 | " }\n" + 324 | "\n" + 325 | " /**\n" + 326 | " * @dev Increase the amount of tokens that an owner allowed to a spender.\n" + 327 | " * approve should be called when allowed[_spender] == 0. To increment\n" + 328 | " * allowed value is better to use this function to avoid 2 calls (and wait until\n" + 329 | " * the first transaction is mined)\n" + 330 | " * From MonolithDAO Token.sol\n" + 331 | " * @param _spender The address which will spend the funds.\n" + 332 | " * @param _addedValue The amount of tokens to increase the allowance by.\n" + 333 | " */\n" + 334 | " function increaseApproval(\n" + 335 | " address _spender,\n" + 336 | " uint256 _addedValue\n" + 337 | " )\n" + 338 | " public\n" + 339 | " returns (bool)\n" + 340 | " {\n" + 341 | " allowed[msg.sender][_spender] = (\n" + 342 | " allowed[msg.sender][_spender].add(_addedValue));\n" + 343 | " emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);\n" + 344 | " return true;\n" + 345 | " }\n" + 346 | "\n" + 347 | " /**\n" + 348 | " * @dev Decrease the amount of tokens that an owner allowed to a spender.\n" + 349 | " * approve should be called when allowed[_spender] == 0. To decrement\n" + 350 | " * allowed value is better to use this function to avoid 2 calls (and wait until\n" + 351 | " * the first transaction is mined)\n" + 352 | " * From MonolithDAO Token.sol\n" + 353 | " * @param _spender The address which will spend the funds.\n" + 354 | " * @param _subtractedValue The amount of tokens to decrease the allowance by.\n" + 355 | " */\n" + 356 | " function decreaseApproval(\n" + 357 | " address _spender,\n" + 358 | " uint256 _subtractedValue\n" + 359 | " )\n" + 360 | " public\n" + 361 | " returns (bool)\n" + 362 | " {\n" + 363 | " uint256 oldValue = allowed[msg.sender][_spender];\n" + 364 | " if (_subtractedValue >= oldValue) {\n" + 365 | " allowed[msg.sender][_spender] = 0;\n" + 366 | " } else {\n" + 367 | " allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);\n" + 368 | " }\n" + 369 | " emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);\n" + 370 | " return true;\n" + 371 | " }\n" + 372 | "\n" + 373 | "}\n" + 374 | "\n" + 375 | "// File: contracts/zeppelin-solidity/contracts/token/ERC20/PausableToken.sol\n" + 376 | "\n" + 377 | "/**\n" + 378 | " * @title Pausable token\n" + 379 | " * @dev StandardToken modified with pausable transfers.\n" + 380 | " **/\n" + 381 | "contract PausableToken is StandardToken, Pausable {\n" + 382 | "\n" + 383 | " function transfer(\n" + 384 | " address _to,\n" + 385 | " uint256 _value\n" + 386 | " )\n" + 387 | " public\n" + 388 | " whenNotPaused\n" + 389 | " returns (bool)\n" + 390 | " {\n" + 391 | " return super.transfer(_to, _value);\n" + 392 | " }\n" + 393 | "\n" + 394 | " function transferFrom(\n" + 395 | " address _from,\n" + 396 | " address _to,\n" + 397 | " uint256 _value\n" + 398 | " )\n" + 399 | " public\n" + 400 | " whenNotPaused\n" + 401 | " returns (bool)\n" + 402 | " {\n" + 403 | " return super.transferFrom(_from, _to, _value);\n" + 404 | " }\n" + 405 | "\n" + 406 | " function approve(\n" + 407 | " address _spender,\n" + 408 | " uint256 _value\n" + 409 | " )\n" + 410 | " public\n" + 411 | " whenNotPaused\n" + 412 | " returns (bool)\n" + 413 | " {\n" + 414 | " return super.approve(_spender, _value);\n" + 415 | " }\n" + 416 | "\n" + 417 | " function increaseApproval(\n" + 418 | " address _spender,\n" + 419 | " uint _addedValue\n" + 420 | " )\n" + 421 | " public\n" + 422 | " whenNotPaused\n" + 423 | " returns (bool success)\n" + 424 | " {\n" + 425 | " return super.increaseApproval(_spender, _addedValue);\n" + 426 | " }\n" + 427 | "\n" + 428 | " function decreaseApproval(\n" + 429 | " address _spender,\n" + 430 | " uint _subtractedValue\n" + 431 | " )\n" + 432 | " public\n" + 433 | " whenNotPaused\n" + 434 | " returns (bool success)\n" + 435 | " {\n" + 436 | " return super.decreaseApproval(_spender, _subtractedValue);\n" + 437 | " }\n" + 438 | "}\n" + 439 | "\n" + 440 | "// File: contracts/TestToken.sol\n" + 441 | "\n" + 442 | "/// @author reedhong\n" + 443 | "contract TestToken is PausableToken {\n" + 444 | " using SafeMath for uint;\n" + 445 | " \n" + 446 | " /// Constant token specific fields\n" + 447 | " string public constant name = \"TestToken\";\n" + 448 | " string public constant symbol = \"Cows\";\n" + 449 | " uint public constant decimals = 18;\n" + 450 | " \n" + 451 | " constructor()\n" + 452 | " public\n" + 453 | " {\n" + 454 | " totalSupply_ = 100000000 ether;\n" + 455 | " paused = false;\n" + 456 | " balances[0xc0be69a5a0c1dce0d98649532f27cd3824f6061f] = totalSupply_;\n" + 457 | " }\n" + 458 | "}\n" 459 | } 460 | } 461 | 462 | render() { 463 | const options = { 464 | selectOnLineNumbers: true 465 | }; 466 | 467 | return ( 468 | 475 | 476 | ); 477 | } 478 | }; 479 | 480 | 481 | 482 | export default connect()(TokenContract); 483 | --------------------------------------------------------------------------------