Backporting to beta (#3623)

* Ropsten network (#3539)

* Ropsten network

* Sorted premine

* Comas

* Removed trailing coma

* --testnet set to ropset

* New registry contract address for ropsten (#3549)

* New registry for ropsten

* Registry address

* Registry with payable modifier

* Fix panic on importing own invalid transaction (#3550)

* Use patched MIO

* Trim whitespace from recovery phrase

* v1.4.5

* Appending logs by default

* Fixing phrases generated on windows

* Manually add \r to Windows phrases pre 1.4.4

* < 1.4.5

* Update test, fix number. (#3612)

* Set default tx price to 0.0025 USD

* Only support 1.4.x dictionary


Former-commit-id: 793003af5ff14bccb34e24b8b57897762647e03d
This commit is contained in:
Arkadiy Paronyan
2016-11-25 20:57:34 +01:00
committed by GitHub
parent e84819c72d
commit e7d7280a89
22 changed files with 434 additions and 71 deletions

View File

@@ -15,6 +15,7 @@
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
import React, { Component, PropTypes } from 'react';
import { Checkbox } from 'material-ui';
import { Form, Input } from '../../../ui';
@@ -37,6 +38,7 @@ export default class RecoveryPhrase extends Component {
password1Error: ERRORS.invalidPassword,
password2: '',
password2Error: ERRORS.noMatchPassword,
windowsPhrase: false,
isValidPass: false,
isValidName: false,
isValidPhrase: false
@@ -47,15 +49,13 @@ export default class RecoveryPhrase extends Component {
}
render () {
const { accountName, accountNameError, passwordHint, password1, password1Error, password2, password2Error, recoveryPhrase } = this.state;
const { accountName, accountNameError, passwordHint, password1, password1Error, password2, password2Error, recoveryPhrase, windowsPhrase } = this.state;
return (
<Form>
<Input
hint='the account recovery phrase'
label='account recovery phrase'
multiLine
rows={ 1 }
value={ recoveryPhrase }
onChange={ this.onEditPhrase } />
<Input
@@ -88,20 +88,26 @@ export default class RecoveryPhrase extends Component {
value={ password2 }
onChange={ this.onEditPassword2 } />
</div>
<Checkbox
className={ styles.checkbox }
label='Key was created with Parity <1.4.5 on Windows'
checked={ windowsPhrase }
onCheck={ this.onToggleWindowsPhrase } />
</div>
</Form>
);
}
updateParent = () => {
const { isValidName, isValidPass, isValidPhrase, accountName, passwordHint, password1, recoveryPhrase } = this.state;
const { isValidName, isValidPass, isValidPhrase, accountName, passwordHint, password1, recoveryPhrase, windowsPhrase } = this.state;
const isValid = isValidName && isValidPass && isValidPhrase;
this.props.onChange(isValid, {
name: accountName,
passwordHint,
password: password1,
phrase: recoveryPhrase
phrase: recoveryPhrase,
windowsPhrase
});
}
@@ -111,18 +117,33 @@ export default class RecoveryPhrase extends Component {
});
}
onEditPhrase = (event) => {
const value = event.target.value;
let error = null;
onToggleWindowsPhrase = (event) => {
this.setState({
windowsPhrase: !this.state.windowsPhrase
}, this.updateParent);
}
if (!value || value.trim().length < 25) {
error = ERRORS.noPhrase;
onEditPhrase = (event) => {
const recoveryPhrase = event.target.value
.toLowerCase() // wordlists are lowercase
.trim() // remove whitespace at both ends
.replace(/\s/g, ' ') // replace any whitespace with single space
.replace(/ +/g, ' '); // replace multiple spaces with a single space
const phraseParts = recoveryPhrase
.split(' ')
.map((part) => part.trim())
.filter((part) => part.length);
let recoveryPhraseError = null;
if (!recoveryPhrase || recoveryPhrase.length < 25 || phraseParts.length < 8) {
recoveryPhraseError = ERRORS.noPhrase;
}
this.setState({
recoveryPhrase: value,
recoveryPhraseError: error,
isValidPhrase: !error
recoveryPhrase: phraseParts.join(' '),
recoveryPhraseError,
isValidPhrase: !recoveryPhraseError
}, this.updateParent);
}

View File

@@ -14,6 +14,7 @@
/* You should have received a copy of the GNU General Public License
/* along with Parity. If not, see <http://www.gnu.org/licenses/>.
*/
.spaced {
line-height: 1.618em;
}
@@ -67,3 +68,7 @@
.upload>div {
margin-right: 0.5em;
}
.checkbox {
margin-top: 2em;
}

View File

@@ -59,6 +59,7 @@ export default class CreateAccount extends Component {
passwordHint: null,
password: null,
phrase: null,
windowsPhrase: false,
rawKey: null,
json: null,
canCreate: false,
@@ -200,7 +201,7 @@ export default class CreateAccount extends Component {
}
onCreate = () => {
const { createType } = this.state;
const { createType, windowsPhrase } = this.state;
const { api } = this.context;
this.setState({
@@ -208,8 +209,16 @@ export default class CreateAccount extends Component {
});
if (createType === 'fromNew' || createType === 'fromPhrase') {
let phrase = this.state.phrase;
if (createType === 'fromPhrase' && windowsPhrase) {
phrase = phrase
.split(' ') // get the words
.map((word) => word === 'misjudged' ? word : `${word}\r`) // add \r after each (except last in dict)
.join(' '); // re-create string
}
return api.parity
.newAccountFromPhrase(this.state.phrase, this.state.password)
.newAccountFromPhrase(phrase, this.state.password)
.then((address) => {
this.setState({ address });
return api.parity
@@ -326,7 +335,7 @@ export default class CreateAccount extends Component {
});
}
onChangeDetails = (canCreate, { name, passwordHint, address, password, phrase, rawKey }) => {
onChangeDetails = (canCreate, { name, passwordHint, address, password, phrase, rawKey, windowsPhrase }) => {
this.setState({
canCreate,
name,
@@ -334,6 +343,7 @@ export default class CreateAccount extends Component {
address,
password,
phrase,
windowsPhrase: windowsPhrase || false,
rawKey
});
}