Skip to content
This repository has been archived by the owner on Nov 6, 2020. It is now read-only.

Commit

Permalink
Show contract parameters in MethodDecoding (#4024)
Browse files Browse the repository at this point in the history
* Add decoding of Inner Contract Deployment params #3715

* Fixed TypedInput when formatted value

* Fix TypedInput

* PR Grumble

* Add test to `Param.toParams`
  • Loading branch information
ngotchac authored and jacogr committed Jan 5, 2017
1 parent ddeb06d commit d16ab5e
Show file tree
Hide file tree
Showing 9 changed files with 208 additions and 65 deletions.
8 changes: 7 additions & 1 deletion js/src/abi/spec/param.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,12 @@ export default class Param {
}

static toParams (params) {
return params.map((param) => new Param(param.name, param.type));
return params.map((param) => {
if (param instanceof Param) {
return param;
}

return new Param(param.name, param.type);
});
}
}
9 changes: 9 additions & 0 deletions js/src/abi/spec/param.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,14 @@ describe('abi/spec/Param', () => {
expect(params[0].name).to.equal('foo');
expect(params[0].kind.type).to.equal('uint');
});

it('converts only if needed', () => {
const _params = Param.toParams([{ name: 'foo', type: 'uint' }]);
const params = Param.toParams(_params);

expect(params.length).to.equal(1);
expect(params[0].name).to.equal('foo');
expect(params[0].kind.type).to.equal('uint');
});
});
});
12 changes: 9 additions & 3 deletions js/src/api/util/decode.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ export function decodeCallData (data) {

if (data.substr(0, 2) === '0x') {
return decodeCallData(data.slice(2));
} else if (data.length < 8) {
}

if (data.length < 8) {
throw new Error('Input to decodeCallData should be method signature + data');
}

Expand All @@ -42,10 +44,14 @@ export function decodeCallData (data) {
export function decodeMethodInput (methodAbi, paramdata) {
if (!methodAbi) {
throw new Error('decodeMethodInput should receive valid method-specific ABI');
} else if (paramdata && paramdata.length) {
}

if (paramdata && paramdata.length) {
if (!isHex(paramdata)) {
throw new Error('Input to decodeMethodInput should be a hex value');
} else if (paramdata.substr(0, 2) === '0x') {
}

if (paramdata.substr(0, 2) === '0x') {
return decodeMethodInput(methodAbi, paramdata.slice(2));
}
}
Expand Down
6 changes: 4 additions & 2 deletions js/src/ui/Form/AddressSelect/addressSelect.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ class AddressSelect extends Component {
// Optional props
allowCopy: PropTypes.bool,
allowInput: PropTypes.bool,
className: PropTypes.string,
disabled: PropTypes.bool,
error: nodeOrStringProptype(),
hint: nodeOrStringProptype(),
Expand Down Expand Up @@ -123,13 +124,14 @@ class AddressSelect extends Component {

renderInput () {
const { focused } = this.state;
const { accountsInfo, allowCopy, disabled, error, hint, label, readOnly, value } = this.props;
const { accountsInfo, allowCopy, className, disabled, error, hint, label, readOnly, value } = this.props;

const input = (
<InputAddress
accountsInfo={ accountsInfo }
allowCopy={ allowCopy }
disabled={ disabled }
className={ className }
disabled={ disabled || readOnly }
error={ error }
hint={ hint }
focused={ focused }
Expand Down
11 changes: 9 additions & 2 deletions js/src/ui/Form/InputAddress/inputAddress.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,14 +75,19 @@ class InputAddress extends Component {
containerClasses.push(styles.small);
}

const props = {};

if (!readOnly && !disabled) {
props.focused = focused;
}

return (
<div className={ containerClasses.join(' ') }>
<Input
allowCopy={ allowCopy && ((disabled || readOnly) ? value : false) }
className={ classes.join(' ') }
disabled={ disabled }
error={ error }
focused={ focused }
hideUnderline={ hideUnderline }
hint={ hint }
label={ label }
Expand All @@ -96,7 +101,9 @@ class InputAddress extends Component {
text && account
? account.name
: (nullName || value)
} />
}
{ ...props }
/>
{ icon }
</div>
);
Expand Down
4 changes: 3 additions & 1 deletion js/src/ui/Form/InputAddressSelect/inputAddressSelect.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class InputAddressSelect extends Component {
contracts: PropTypes.object.isRequired,

allowCopy: PropTypes.bool,
className: PropTypes.string,
error: PropTypes.string,
hint: PropTypes.string,
label: PropTypes.string,
Expand All @@ -36,13 +37,14 @@ class InputAddressSelect extends Component {
};

render () {
const { accounts, allowCopy, contacts, contracts, label, hint, error, value, onChange, readOnly } = this.props;
const { accounts, allowCopy, className, contacts, contracts, label, hint, error, value, onChange, readOnly } = this.props;

return (
<AddressSelect
allowCopy={ allowCopy }
allowInput
accounts={ accounts }
className={ className }
contacts={ contacts }
contracts={ contracts }
error={ error }
Expand Down
45 changes: 33 additions & 12 deletions js/src/ui/Form/TypedInput/typedInput.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ export default class TypedInput extends Component {

accounts: PropTypes.object,
allowCopy: PropTypes.bool,
className: PropTypes.string,
error: PropTypes.any,
hint: PropTypes.string,
isEth: PropTypes.bool,
Expand Down Expand Up @@ -91,7 +92,7 @@ export default class TypedInput extends Component {
const { type } = param;

if (type === ABI_TYPES.ARRAY) {
const { accounts, label, value = param.default } = this.props;
const { accounts, className, label, value = param.default } = this.props;
const { subtype, length } = param;

const fixedLength = !!length;
Expand All @@ -107,6 +108,7 @@ export default class TypedInput extends Component {
<TypedInput
accounts={ accounts }
allowCopy={ allowCopy }
className={ className }
key={ `${subtype.type}_${index}` }
onChange={ onChange }
param={ subtype }
Expand Down Expand Up @@ -236,17 +238,34 @@ export default class TypedInput extends Component {
);
}

getNumberValue (value) {
if (!value) {
return value;
}

const { readOnly } = this.props;

const rawValue = typeof value === 'string'
? value.replace(/,/g, '')
: value;

const bnValue = new BigNumber(rawValue);

return readOnly
? bnValue.toFormat()
: bnValue.toNumber();
}

renderInteger (value = this.props.value, onChange = this.onChange) {
const { allowCopy, label, error, hint, min, max, readOnly } = this.props;
const { allowCopy, className, label, error, hint, min, max, readOnly } = this.props;
const param = this.getParam();

const realValue = value
? (new BigNumber(value))[readOnly ? 'toFormat' : 'toNumber']()
: value;
const realValue = this.getNumberValue(value);

return (
<Input
allowCopy={ allowCopy }
className={ className }
label={ label }
hint={ hint }
value={ realValue }
Expand All @@ -269,16 +288,15 @@ export default class TypedInput extends Component {
* @see https://github.com/facebook/react/issues/1549
*/
renderFloat (value = this.props.value, onChange = this.onChange) {
const { allowCopy, label, error, hint, min, max, readOnly } = this.props;
const { allowCopy, className, label, error, hint, min, max, readOnly } = this.props;
const param = this.getParam();

const realValue = value
? (new BigNumber(value))[readOnly ? 'toFormat' : 'toNumber']()
: value;
const realValue = this.getNumberValue(value);

return (
<Input
allowCopy={ allowCopy }
className={ className }
label={ label }
hint={ hint }
value={ realValue }
Expand All @@ -293,11 +311,12 @@ export default class TypedInput extends Component {
}

renderDefault () {
const { allowCopy, label, value, error, hint, readOnly } = this.props;
const { allowCopy, className, label, value, error, hint, readOnly } = this.props;

return (
<Input
allowCopy={ allowCopy }
className={ className }
label={ label }
hint={ hint }
value={ value }
Expand All @@ -309,12 +328,13 @@ export default class TypedInput extends Component {
}

renderAddress () {
const { accounts, allowCopy, label, value, error, hint, readOnly } = this.props;
const { accounts, allowCopy, className, label, value, error, hint, readOnly } = this.props;

return (
<InputAddressSelect
allowCopy={ allowCopy }
accounts={ accounts }
className={ className }
error={ error }
hint={ hint }
label={ label }
Expand All @@ -326,7 +346,7 @@ export default class TypedInput extends Component {
}

renderBoolean () {
const { allowCopy, label, value, error, hint, readOnly } = this.props;
const { allowCopy, className, label, value, error, hint, readOnly } = this.props;

if (readOnly) {
return this.renderDefault();
Expand All @@ -346,6 +366,7 @@ export default class TypedInput extends Component {
return (
<Select
allowCopy={ allowCopy }
className={ className }
error={ error }
hint={ hint }
label={ label }
Expand Down
58 changes: 29 additions & 29 deletions js/src/ui/MethodDecoding/methodDecoding.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,11 @@
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see <http://www.gnu.org/licenses/>.

import BigNumber from 'bignumber.js';
import React, { Component, PropTypes } from 'react';
import { connect } from 'react-redux';
import CircularProgress from 'material-ui/CircularProgress';

import { Input, InputAddress } from '../Form';
import { TypedInput, InputAddress } from '../Form';
import MethodDecodingStore from './methodDecodingStore';

import styles from './methodDecoding.css';
Expand Down Expand Up @@ -245,6 +244,7 @@ class MethodDecoding extends Component {

renderDeploy () {
const { historic, transaction } = this.props;
const { methodInputs } = this.state;

if (!historic) {
return (
Expand All @@ -261,6 +261,14 @@ class MethodDecoding extends Component {
</div>

{ this.renderAddressName(transaction.creates, false) }

<div>
{ methodInputs && methodInputs.length ? 'with the following parameters:' : ''}
</div>

<div className={ styles.inputs }>
{ this.renderInputs() }
</div>
</div>
);
}
Expand Down Expand Up @@ -364,39 +372,31 @@ class MethodDecoding extends Component {
renderInputs () {
const { methodInputs } = this.state;

return methodInputs.map((input, index) => {
switch (input.type) {
case 'address':
return (
<InputAddress
disabled
text
key={ index }
className={ styles.input }
value={ input.value }
label={ input.type } />
);

default:
return (
<Input
readOnly
allowCopy
key={ index }
className={ styles.input }
value={ this.renderValue(input.value) }
label={ input.type } />
);
}
if (!methodInputs || methodInputs.length === 0) {
return null;
}

const inputs = methodInputs.map((input, index) => {
return (
<TypedInput
allowCopy
className={ styles.input }
label={ input.type }
key={ index }
param={ input.type }
readOnly
value={ this.renderValue(input.value) }
/>
);
});

return inputs;
}

renderValue (value) {
const { api } = this.context;

if (api.util.isInstanceOf(value, BigNumber)) {
return value.toFormat(0);
} else if (api.util.isArray(value)) {
if (api.util.isArray(value)) {
return api.util.bytesToHex(value);
}

Expand Down
Loading

0 comments on commit d16ab5e

Please sign in to comment.