import {Alert, Button, Col, ControlLabel, Form, FormControl, Grid, HelpBlock, InputGroup, Row} from 'react-bootstrap'; import AccountBalance from './accountBalance'; import React from 'react'; import Web3 from 'web3'; class CallGasRelayed extends React.Component { constructor(props) { super(props); this.state = { account: '', address: this.props.IdentityGasRelay.options.address, topic: '0x4964656e', to: '0x0000000000000000000000000000000000000000', 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 accounts = await this.props.web3.eth.getAccounts(); this.setState({ account: accounts[0] }); 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){ const newState = {}; newState[name] = e.target.value; this.setState(newState); } 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;