on master help sign in
Allow (opt-in) use of arbitrary strings as mnemonic seeds
bc8d8c0Fang
src/form/validators.js+2
@@ -60,6 +60,8 @@ export const hasErrors = iter =>
60
60
61export const buildPatqValidator = (validators = []) =>
61export const buildPatqValidator = (validators = []) =>
62 buildValidator([validateNotEmpty, validatePatq, ...validators]);
62 buildValidator([validateNotEmpty, validatePatq, ...validators]);
63+export const buildAnyMnemonicValidator = () =>
64+ buildValidator([validateNotEmpty]);
63export const buildMnemonicValidator = () =>
65export const buildMnemonicValidator = () =>
64 buildValidator([validateNotEmpty, validateMnemonic]);
66 buildValidator([validateNotEmpty, validateMnemonic]);
65export const buildCheckboxValidator = mustBe =>
67export const buildCheckboxValidator = mustBe =>
src/lib/wallet.js+10−4
@@ -81,10 +81,16 @@ export const urbitWalletFromTicket = async (ticket, point, passphrase) => {
81 });
81 });
82};
82};
83
83
84−export const walletFromMnemonic = (mnemonic, hdpath, passphrase) => {
84+export const walletFromMnemonic = (
85+ mnemonic,
86+ hdpath,
87+ passphrase,
88+ skipMnemonicCheck
89+) => {
90+ const seed =
85− const seed = bip39.validateMnemonic(mnemonic)
91+ skipMnemonicCheck || bip39.validateMnemonic(mnemonic)
86− ? Just(bip39.mnemonicToSeed(mnemonic, passphrase))
92+ ? Just(bip39.mnemonicToSeed(mnemonic, passphrase))
87− : Nothing();
93+ : Nothing();
88
94
89 const toWallet = (sd, path) => {
95 const toWallet = (sd, path) => {
90 let wal;
96 let wal;
src/views/Login/Mnemonic.js+34−13
@@ -1,4 +1,4 @@
1−import React, { useCallback, useMemo } from 'react';
1+import React, { useCallback, useState, useMemo } from 'react';
2import cn from 'classnames';
2import cn from 'classnames';
3import { Just, Nothing } from 'folktale/maybe';
3import { Just, Nothing } from 'folktale/maybe';
4import { Grid, CheckboxInput } from 'indigo-react';
4import { Grid, CheckboxInput } from 'indigo-react';
@@ -10,6 +10,7 @@ import useLoginView from 'lib/useLoginView';
10import { MnemonicInput, HdPathInput, PassphraseInput } from 'form/Inputs';
10import { MnemonicInput, HdPathInput, PassphraseInput } from 'form/Inputs';
11import {
11import {
12 composeValidator,
12 composeValidator,
13+ buildAnyMnemonicValidator,
13 buildMnemonicValidator,
14 buildMnemonicValidator,
14 buildCheckboxValidator,
15 buildCheckboxValidator,
15 buildPassphraseValidator,
16 buildPassphraseValidator,
@@ -25,25 +26,34 @@ export default function Mnemonic({ className, goHome }) {
25
26
26 const { setWallet, setAuthMnemonic, setWalletHdPath } = useWallet();
27 const { setWallet, setAuthMnemonic, setWalletHdPath } = useWallet();
27
28
29+ const [anyMnemonic, setAnyMnemonic] = useState(false);
30+
28− const validate = useMemo(
31+ const validate = useMemo(() => {
29− () =>
32+ const mnemonicValidator = anyMnemonic
33+ ? buildAnyMnemonicValidator()
34+ : buildMnemonicValidator();
30− composeValidator({
35+ return composeValidator({
31− useAdvanced: buildCheckboxValidator(),
36+ useAdvanced: buildCheckboxValidator(),
32− mnemonic: buildMnemonicValidator(),
37+ mnemonic: mnemonicValidator,
33− passphrase: buildPassphraseValidator(),
38+ passphrase: buildPassphraseValidator(),
34− hdpath: buildHdPathValidator(),
39+ hdpath: buildHdPathValidator(),
35− }),
40+ });
36− []
41+ }, [anyMnemonic]);
37− );
38
42
39 // when the properties change, re-derive wallet and set global state
43 // when the properties change, re-derive wallet and set global state
40 const onValues = useCallback(
44 const onValues = useCallback(
41 ({ valid, values }) => {
45 ({ valid, values }) => {
46+ setAnyMnemonic(values.anyMnemonic);
42 if (valid) {
47 if (valid) {
43 setWalletHdPath(values.hdpath);
48 setWalletHdPath(values.hdpath);
44 setAuthMnemonic(Just(values.mnemonic));
49 setAuthMnemonic(Just(values.mnemonic));
45 setWallet(
50 setWallet(
46− walletFromMnemonic(values.mnemonic, values.hdpath, values.passphrase)
51+ walletFromMnemonic(
52+ values.mnemonic,
53+ values.hdpath,
54+ values.passphrase,
55+ values.anyMnemonic
56+ )
47 );
57 );
48 } else {
58 } else {
49 setAuthMnemonic(Nothing());
59 setAuthMnemonic(Nothing());
@@ -53,7 +63,11 @@ export default function Mnemonic({ className, goHome }) {
53 [setAuthMnemonic, setWallet, setWalletHdPath]
63 [setAuthMnemonic, setWallet, setWalletHdPath]
54 );
64 );
55
65
66+ const initialValues = {
56− const initialValues = { hdpath: DEFAULT_HD_PATH, useAdvanced: false };
67+ hdpath: DEFAULT_HD_PATH,
68+ useAdvanced: false,
69+ anyMnemonic: false,
70+ };
57
71
58 return (
72 return (
59 <Grid className={cn('mt4', className)}>
73 <Grid className={cn('mt4', className)}>
@@ -71,6 +85,13 @@ export default function Mnemonic({ className, goHome }) {
71 label="BIP39 Mnemonic"
85 label="BIP39 Mnemonic"
72 />
86 />
73
87
88+ <Grid.Item
89+ full
90+ as={CheckboxInput}
91+ name="anyMnemonic"
92+ label="Skip mnemonic validation"
93+ />
94+
74 <Condition when="useAdvanced" is={true}>
95 <Condition when="useAdvanced" is={true}>
75 <Grid.Item
96 <Grid.Item
76 full
97 full