// Copyright 2015, 2016 Ethcore (UK) Ltd. // This file is part of Parity. // Parity is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Parity is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Parity. If not, see . // Copyright 2015, 2016 Ethcore (UK) Ltd. // This file is part of Parity. // Parity is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Parity is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Parity. If not, see . import React, { Component, PropTypes } from 'react'; import { MenuItem } from 'material-ui'; import { Form, Input, TypedInput, Select } from '../../../ui'; import { validateAbi } from '../../../util/validation'; import { parseAbiType } from '../../../util/abi'; import styles from '../deployContract.css'; export default class ParametersStep extends Component { static contextTypes = { api: PropTypes.object.isRequired }; static propTypes = { accounts: PropTypes.object.isRequired, inputType: PropTypes.object.isRequired, onAbiChange: PropTypes.func.isRequired, onCodeChange: PropTypes.func.isRequired, onParamsChange: PropTypes.func.isRequired, abi: PropTypes.string, abiError: PropTypes.string, code: PropTypes.string, codeError: PropTypes.string, params: PropTypes.array, paramsError: PropTypes.array, readOnly: PropTypes.bool }; static defaultProps = { readOnly: false }; state = { inputs: [], solcOutput: '', contracts: {}, selectedContractIndex: 0 } componentDidMount () { const { abi, code } = this.props; if (abi) { this.onAbiChange(abi); } if (code) { this.onCodeChange(code); } } render () { const { abi, abiError, code, codeError, readOnly, inputType } = this.props; const manualInput = inputType.key === 'MANUAL'; return (
{ this.renderFromSOLC() } { this.renderConstructorInputs() }
); } renderFromSOLC () { const { inputType } = this.props; if (inputType.key !== 'SOLC') { return null; } const { solcOutput, contracts } = this.state; const error = contracts && Object.keys(contracts).length ? null : 'enter a valid solc output'; return (

To get solc output, you can use this command:

solc --combined-json abi,bin Contract.sol | xclip -selection c { this.renderContractSelect() }
); } renderContractSelect () { const { contracts } = this.state; if (!contracts || Object.keys(contracts).length === 0) { return null; } const { selectedContractIndex } = this.state; const contractsItems = Object.keys(contracts).map((name, index) => ( { name } )); return ( ); } renderConstructorInputs () { const { accounts, params, paramsError } = this.props; const { inputs } = this.state; if (!inputs || !inputs.length) { return null; } const inputsComponents = inputs.map((input, index) => { const onChange = (value) => this.onParamChange(index, value); const label = `${input.name ? `${input.name}: ` : ''}${input.type}`; const value = params[index]; const error = paramsError[index]; const param = parseAbiType(input.type); return (
); }); return (

Choose the contract parameters

{ inputsComponents }
); } onContractChange = (event, index) => { const { contracts } = this.state; const contractName = Object.keys(contracts)[index]; const contract = contracts[contractName]; const { abi, bin } = contract; const code = /^0x/.test(bin) ? bin : `0x${bin}`; this.setState({ selectedContractIndex: index }, () => { this.onAbiChange(abi); this.onCodeChange(code); }); } onSolcChange = (event, value) => { try { const solcParsed = JSON.parse(value); if (!solcParsed && !solcParsed.contracts) { throw new Error('Wrong solc output'); } this.setState({ contracts: solcParsed.contracts }, () => { this.onContractChange(null, 0); }); } catch (e) { this.setState({ contracts: null }); this.onAbiChange(''); this.onCodeChange(''); } this.setState({ solcOutput: value }); } onParamChange = (index, value) => { const { params, onParamsChange } = this.props; params[index] = value; onParamsChange(params); } onAbiChange = (abi) => { const { api } = this.context; const { onAbiChange, onParamsChange } = this.props; const { abiError, abiParsed } = validateAbi(abi, api); if (!abiError) { const { inputs } = abiParsed .find((method) => method.type === 'constructor') || { inputs: [] }; const params = []; inputs.forEach((input) => { const param = parseAbiType(input.type); params.push(param.default); }); onParamsChange(params); this.setState({ inputs }); } else { onParamsChange([]); this.setState({ inputs: [] }); } onAbiChange(abi); } onCodeChange = (code) => { const { onCodeChange } = this.props; onCodeChange(code); } }