import Web3 from 'web3'; import React from 'react'; import { Grid, Row, Form, FormGroup, FormControl, HelpBlock, Button, ControlLabel, Col, InputGroup, Alert } from 'react-bootstrap'; import AccountBalance from './accountBalance'; class CallGasRelayed extends React.Component { constructor(props) { super(props); this.state = { account: '0x1847ab5a71eaa95315c3fc2d3dfb53b7e6e8f313', address: this.props.IdentityGasRelay.options.address, topic: '0x4964656e', to: '0x00', value: 0, data: '0x00', nonce: 0, gasPrice: 0, gasLimit: 0, gasToken: "0x0000000000000000000000000000000000000000", signature: '', symKey: '0xd0d905c1c62b810b787141430417caf2b3f54cffadb395b7bb39fdeb8f17266b', kid: null, skid: null, msgSent: '', payload: '', messages: [], web3W: null, errorMessage: '' }; } componentDidMount(){ __embarkContext.execWhenReady(async () => { let web3W = new Web3('ws://localhost:8546'); let _skid = await web3W.shh.addSymKey(this.state.symKey); let _kid = await web3W.shh.newKeyPair(); this.setState({ kid: _kid, skid: _skid, whisper: web3W }); web3W.shh.subscribe('messages', { "privateKeyID": _kid, "ttl": 20, "minPow": 0.8, "powTime": 1000 }, (error, message, subscription) => { if(error) { console.log(error); this.setState({errorMessage: error.message}) } else { this.state.messages.push(this.props.web3.utils.hexToAscii(message.payload)); this.setState({messages: this.state.messages}) } }); }); } handleChange(e, name){ this.state[name] = e.target.value; this.setState(this.state); } async sendMessage(e){ e.preventDefault(); this.setState({ messages: [], errorMessage: '' }); try { let jsonAbi = this.props.IdentityGasRelay._jsonInterface.filter(x => x.name == "callGasRelayed")[0] let funCall = this.props.web3.eth.abi.encodeFunctionCall(jsonAbi, [this.state.to, this.state.value, this.state.data, this.state.nonce, this.state.gasPrice, this.state.gasLimit, this.state.gasToken, this.state.signature]); let msgObj = { symKeyID: this.state.skid, sig: this.state.kid, ttl: 1000, powTarget: 1, powTime: 20, topic: this.state.topic, payload: this.props.web3.utils.toHex({ 'address': this.state.address, 'encodedFunctionCall': funCall }) }; console.log(msgObj); this.props.web3.shh.post(msgObj) .then((err, result) => { console.log(result); console.log(err); this.setState({msgSent: result, payload: msgObj.payload}); }); } catch(error){ console.error(error); this.setState({errorMessage: error.message}) } } async sign(ev){ ev.preventDefault(); this.setState({ msgSent: false, payload: '', messages: [], errorMessage: '' }); try { let message = await this.props.IdentityGasRelay.methods.callGasRelayHash( this.state.to, this.state.value, this.props.web3.utils.soliditySha3({t: 'bytes', v: this.state.data}), this.state.nonce, this.state.gasPrice, this.state.gasLimit, this.state.gasToken ).call(); let accounts = await this.props.web3.eth.getAccounts(); let _signature = await this.props.web3.eth.sign(message, accounts[0]); this.setState({signature: _signature}); } catch(error){ console.error(error); this.setState({errorMessage: error.message}) } } render(){ return ( { this.state.errorMessage != '' ? {this.state.errorMessage} : '' }
Identity Address 0x this.handleChange(ev, 'address')} /> To 0x this.handleChange(ev, 'to')} /> Value this.handleChange(ev, 'value')} /> Data 0x this.handleChange(ev, 'data')} /> Nonce this.handleChange(ev, 'nonce')} /> Gas Price in Tokens this.handleChange(ev, 'gasPrice')} /> Gas Limit in Ether this.handleChange(ev, 'gasLimit')} /> Gas Token 0x this.handleChange(ev, 'gasToken')} /> RND: {this.props.RND.options.address} ETH: 0x0000000000000000000000000000000000000000 Signature: {this.state.signature} Symmetric Key 0x Topic 0x this.handleChange(ev, 'topic')} /> {this.state.msgSent}

Whisper Messages

{ this.state.messages.map((msg, i) =>

{msg}

) }
); } } export default CallGasRelayed;