Browse Source

fix(recovery_window): fix wallet recovery by specifying default recovery window

renovate/lint-staged-8.x
Jack Mallers 7 years ago
parent
commit
d9ed3f2c8b
  1. 1
      app/components/Onboarding/Login.js
  2. 30
      app/components/Onboarding/Onboarding.js
  3. 38
      app/components/Onboarding/RecoverForm.js
  4. 61
      app/components/Onboarding/RecoverForm.scss
  5. 7
      app/containers/Root.js
  6. 2
      app/lnd/config/rpc.proto
  7. 2
      app/lnd/lib/rpc.proto
  8. 5
      app/lnd/methods/walletController.js
  9. 10
      app/reducers/onboarding.js
  10. 2
      app/rpc.proto

1
app/components/Onboarding/Login.js

@ -33,7 +33,6 @@ const Login = ({
}
</span>
</div>
<div>Recover existing wallet</div>
</section>
</div>
)

30
app/components/Onboarding/Onboarding.js

@ -8,6 +8,7 @@ import Alias from './Alias'
import Autopilot from './Autopilot'
import Login from './Login'
import Signup from './Signup'
import RecoverForm from './RecoverForm'
import NewWalletSeed from './NewWalletSeed'
import ReEnterSeed from './ReEnterSeed'
import NewWalletPassword from './NewWalletPassword'
@ -31,6 +32,7 @@ const Onboarding = ({
aliasProps,
initWalletProps,
autopilotProps,
recoverFormProps,
newWalletSeedProps,
newWalletPasswordProps,
newAezeedPasswordProps,
@ -93,11 +95,37 @@ const Onboarding = ({
title={'Alright, let\'s get set up'}
description='Would you like to create a new wallet or import an existing one?' // eslint-disable-line
back={() => changeStep(4)}
next={() => (initWalletProps.signupProps.signupForm.create ? changeStep(6) : console.log('import'))}
next={() => (initWalletProps.signupProps.signupForm.create ? changeStep(6) : changeStep(5.1))}
>
<Signup {...initWalletProps.signupProps} />
</FormContainer>
)
case 5.1:
return (
<FormContainer
title='Import your seed'
description={'Recovering a wallet, nice. You don\'t need anyone else, you got yourself :)'} // eslint-disable-line
back={() => changeStep(5)}
next={() => changeStep(5.2)}
>
<RecoverForm {...recoverFormProps} />
</FormContainer>
)
case 5.2:
return (
<FormContainer
title='Seed passphrase'
description={'Enter your cipherseed passphrase (or just submit if you don\'t have one)'} // eslint-disable-line
back={() => changeStep(5)}
next={() => {
const recoverySeed = recoverFormProps.seedInput.map(input => input.word)
submitNewWallet(createWalletPassword, recoverySeed, aezeedPassword)
}}
>
<NewAezeedPassword {...newAezeedPasswordProps} />
</FormContainer>
)
case 6:
return (
<FormContainer

38
app/components/Onboarding/RecoverForm.js

@ -0,0 +1,38 @@
import React from 'react'
import PropTypes from 'prop-types'
import styles from './RecoverForm.scss'
const RecoverForm = ({ seed, seedInput, updateSeedInput }) => (
<div className={styles.container}>
<ul className={styles.seedContainer}>
{
Array(24).fill('').map((word, index) => (
<li key={index}>
<section>
<label htmlFor={index}>{index + 1}</label>
</section>
<section>
<input
type='text'
id={index}
placeholder='word'
value={seedInput[index] ? seedInput[index].word : ''}
onChange={event => updateSeedInput({ word: event.target.value, index })}
className={styles.word}
/>
</section>
</li>
))
}
</ul>
</div>
)
RecoverForm.propTypes = {
seed: PropTypes.array.isRequired,
seedInput: PropTypes.array.isRequired,
updateSeedInput: PropTypes.func.isRequired
}
export default RecoverForm

61
app/components/Onboarding/RecoverForm.scss

@ -0,0 +1,61 @@
@import '../../variables.scss';
.seedContainer {
position: relative;
display: inline-block;
font-size: 12px;
li {
display: inline-block;
margin: 5px 0;
width: 25%;
section {
display: inline-block;
vertical-align: middle;
color: $white;
&:nth-child(1) {
width: 15%;
text-align: center;
opacity: 0.5;
}
&:nth-child(2) {
width: calc(85% - 10px);
margin: 0 5px;
}
}
}
}
.word {
margin: 0 3px;
background-color: #1c1e26;
outline: 0;
border: none;
padding: 5px 10px;
color: $white;
font-family: courier;
font-family: 'Courier';
&.valid {
color: $green;
}
&.invalid {
color: $red;
}
}
.word::-webkit-input-placeholder {
text-shadow: none;
-webkit-text-fill-color: initial;
}
.contentEditable {
width: 100px;
background: red;
}

7
app/containers/Root.js

@ -118,6 +118,12 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => {
updateAezeedPasswordConfirmation: dispatchProps.updateAezeedPasswordConfirmation
}
const recoverFormProps = {
seed: stateProps.onboarding.seed,
seedInput: stateProps.onboarding.seedInput,
updateSeedInput: dispatchProps.updateSeedInput
}
const reEnterSeedProps = {
seed: stateProps.onboarding.seed,
seedInput: stateProps.onboarding.seedInput,
@ -136,6 +142,7 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => {
newWalletSeedProps,
newWalletPasswordProps,
newAezeedPasswordProps,
recoverFormProps,
reEnterSeedProps
}

2
app/lnd/config/rpc.proto

@ -1,6 +1,6 @@
syntax = "proto3";
import "google/api/annotations.proto";
// import "google/api/annotations.proto";
package lnrpc;
/**

2
app/lnd/lib/rpc.proto

@ -1,6 +1,6 @@
syntax = "proto3";
import "google/api/annotations.proto";
// import "google/api/annotations.proto";
package lnrpc;
/**

5
app/lnd/methods/walletController.js

@ -125,12 +125,13 @@ export function unlockWallet(walletUnlocker, { wallet_password }) {
* @param {[type]} password [description]
* @param {[type]} cipher_seed_mnemonic [description]
*/
export function initWallet(walletUnlocker, { wallet_password, cipher_seed_mnemonic, aezeed_passphrase }) {
export function initWallet(walletUnlocker, { wallet_password, cipher_seed_mnemonic, aezeed_passphrase, recovery_window }) {
return new Promise((resolve, reject) => {
walletUnlocker.initWallet({
wallet_password,
cipher_seed_mnemonic,
aezeed_passphrase: Buffer.from(aezeed_passphrase, 'hex')
aezeed_passphrase: Buffer.from(aezeed_passphrase, 'hex'),
recovery_window: 250
}, (err, data) => {
if (err) { reject(err) }

10
app/reducers/onboarding.js

@ -243,7 +243,12 @@ onboardingSelectors.showAezeedPasswordConfirmationError = createSelector(
onboardingSelectors.reEnterSeedChecker = createSelector(
seedSelector,
seedInputSelector,
(seed, seedInput) => seed.length === seedInput.length && seed.every((word, i) => word === seedInput[i].word)
(seed, seedInput) => {
console.log('seed: ', seed)
console.log('seedInput: ', seedInput)
return seed.length === seedInput.length && seed.every((word, i) => word === seedInput[i].word)
}
)
export { onboardingSelectors }
@ -280,7 +285,8 @@ const initialState = {
// array of inputs for when the user re-enters their seed
// object has a word attr and a index attr:
// { word: 'foo', index: 0 }
seedInput: [],
// seedInput: [],
seedInput: ["absent", "install", "quality", "boss", "olympic", "account", "trick", "banner", "pioneer", "pause", "arm", "faculty", "spawn", "diary", "pool", "north", "spike", "symbol", "alter", "soon", "twist", "provide", "ball", "rubber"].map((word, index) => { return { word, index } }),
// step where the user decides whether they want a newly created seed or to import an existing one
signupForm: {
create: false,

2
app/rpc.proto

@ -1,6 +1,6 @@
syntax = "proto3";
import "google/api/annotations.proto";
// import "google/api/annotations.proto";
package lnrpc;
/**

Loading…
Cancel
Save