Skip to content

Commit 94b0741

Browse files
authored
Merge pull request #225 from synonymdev/seed-derivation
Derive LDK seed from mnemonic in example app
2 parents eff283d + 2c1627c commit 94b0741

File tree

4 files changed

+46
-125
lines changed

4 files changed

+46
-125
lines changed

example/ios/Podfile.lock

Lines changed: 0 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -10,71 +10,12 @@ PODS:
1010
- React-Core (= 0.72.4)
1111
- React-jsi (= 0.72.4)
1212
- ReactCommon/turbomodule/core (= 0.72.4)
13-
- Flipper (0.182.0):
14-
- Flipper-Folly (~> 2.6)
15-
- Flipper-Boost-iOSX (1.76.0.1.11)
16-
- Flipper-DoubleConversion (3.2.0.1)
17-
- Flipper-Fmt (7.1.7)
18-
- Flipper-Folly (2.6.10):
19-
- Flipper-Boost-iOSX
20-
- Flipper-DoubleConversion
21-
- Flipper-Fmt (= 7.1.7)
22-
- Flipper-Glog
23-
- libevent (~> 2.1.12)
24-
- OpenSSL-Universal (= 1.1.1100)
25-
- Flipper-Glog (0.5.0.5)
26-
- Flipper-PeerTalk (0.0.4)
27-
- FlipperKit (0.182.0):
28-
- FlipperKit/Core (= 0.182.0)
29-
- FlipperKit/Core (0.182.0):
30-
- Flipper (~> 0.182.0)
31-
- FlipperKit/CppBridge
32-
- FlipperKit/FBCxxFollyDynamicConvert
33-
- FlipperKit/FBDefines
34-
- FlipperKit/FKPortForwarding
35-
- SocketRocket (~> 0.6.0)
36-
- FlipperKit/CppBridge (0.182.0):
37-
- Flipper (~> 0.182.0)
38-
- FlipperKit/FBCxxFollyDynamicConvert (0.182.0):
39-
- Flipper-Folly (~> 2.6)
40-
- FlipperKit/FBDefines (0.182.0)
41-
- FlipperKit/FKPortForwarding (0.182.0):
42-
- CocoaAsyncSocket (~> 7.6)
43-
- Flipper-PeerTalk (~> 0.0.4)
44-
- FlipperKit/FlipperKitHighlightOverlay (0.182.0)
45-
- FlipperKit/FlipperKitLayoutHelpers (0.182.0):
46-
- FlipperKit/Core
47-
- FlipperKit/FlipperKitHighlightOverlay
48-
- FlipperKit/FlipperKitLayoutTextSearchable
49-
- FlipperKit/FlipperKitLayoutIOSDescriptors (0.182.0):
50-
- FlipperKit/Core
51-
- FlipperKit/FlipperKitHighlightOverlay
52-
- FlipperKit/FlipperKitLayoutHelpers
53-
- YogaKit (~> 1.18)
54-
- FlipperKit/FlipperKitLayoutPlugin (0.182.0):
55-
- FlipperKit/Core
56-
- FlipperKit/FlipperKitHighlightOverlay
57-
- FlipperKit/FlipperKitLayoutHelpers
58-
- FlipperKit/FlipperKitLayoutIOSDescriptors
59-
- FlipperKit/FlipperKitLayoutTextSearchable
60-
- YogaKit (~> 1.18)
61-
- FlipperKit/FlipperKitLayoutTextSearchable (0.182.0)
62-
- FlipperKit/FlipperKitNetworkPlugin (0.182.0):
63-
- FlipperKit/Core
64-
- FlipperKit/FlipperKitReactPlugin (0.182.0):
65-
- FlipperKit/Core
66-
- FlipperKit/FlipperKitUserDefaultsPlugin (0.182.0):
67-
- FlipperKit/Core
68-
- FlipperKit/SKIOSNetworkPlugin (0.182.0):
69-
- FlipperKit/Core
70-
- FlipperKit/FlipperKitNetworkPlugin
7113
- fmt (6.2.1)
7214
- glog (0.3.5)
7315
- hermes-engine (0.72.4):
7416
- hermes-engine/Pre-built (= 0.72.4)
7517
- hermes-engine/Pre-built (0.72.4)
7618
- libevent (2.1.12)
77-
- OpenSSL-Universal (1.1.1100)
7819
- RCT-Folly (2021.07.22.00):
7920
- boost
8021
- DoubleConversion
@@ -502,46 +443,22 @@ PODS:
502443
- React-Core
503444
- SocketRocket (0.6.1)
504445
- Yoga (1.14.0)
505-
- YogaKit (1.18.1):
506-
- Yoga (~> 1.14)
507446

508447
DEPENDENCIES:
509448
- boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`)
510449
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
511450
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
512451
- FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`)
513-
- Flipper (= 0.182.0)
514-
- Flipper-Boost-iOSX (= 1.76.0.1.11)
515-
- Flipper-DoubleConversion (= 3.2.0.1)
516-
- Flipper-Fmt (= 7.1.7)
517-
- Flipper-Folly (= 2.6.10)
518-
- Flipper-Glog (= 0.5.0.5)
519-
- Flipper-PeerTalk (= 0.0.4)
520-
- FlipperKit (= 0.182.0)
521-
- FlipperKit/Core (= 0.182.0)
522-
- FlipperKit/CppBridge (= 0.182.0)
523-
- FlipperKit/FBCxxFollyDynamicConvert (= 0.182.0)
524-
- FlipperKit/FBDefines (= 0.182.0)
525-
- FlipperKit/FKPortForwarding (= 0.182.0)
526-
- FlipperKit/FlipperKitHighlightOverlay (= 0.182.0)
527-
- FlipperKit/FlipperKitLayoutPlugin (= 0.182.0)
528-
- FlipperKit/FlipperKitLayoutTextSearchable (= 0.182.0)
529-
- FlipperKit/FlipperKitNetworkPlugin (= 0.182.0)
530-
- FlipperKit/FlipperKitReactPlugin (= 0.182.0)
531-
- FlipperKit/FlipperKitUserDefaultsPlugin (= 0.182.0)
532-
- FlipperKit/SKIOSNetworkPlugin (= 0.182.0)
533452
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
534453
- hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`)
535454
- libevent (~> 2.1.12)
536-
- OpenSSL-Universal (= 1.1.1100)
537455
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
538456
- RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`)
539457
- RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
540458
- React (from `../node_modules/react-native/`)
541459
- React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
542460
- React-Codegen (from `build/generated/ios`)
543461
- React-Core (from `../node_modules/react-native/`)
544-
- React-Core/DevSupport (from `../node_modules/react-native/`)
545462
- React-Core/RCTWebSocket (from `../node_modules/react-native/`)
546463
- React-CoreModules (from `../node_modules/react-native/React/CoreModules`)
547464
- React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`)
@@ -580,19 +497,9 @@ DEPENDENCIES:
580497
SPEC REPOS:
581498
trunk:
582499
- CocoaAsyncSocket
583-
- Flipper
584-
- Flipper-Boost-iOSX
585-
- Flipper-DoubleConversion
586-
- Flipper-Fmt
587-
- Flipper-Folly
588-
- Flipper-Glog
589-
- Flipper-PeerTalk
590-
- FlipperKit
591500
- fmt
592501
- libevent
593-
- OpenSSL-Universal
594502
- SocketRocket
595-
- YogaKit
596503

597504
EXTERNAL SOURCES:
598505
boost:
@@ -695,19 +602,10 @@ SPEC CHECKSUMS:
695602
DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
696603
FBLazyVector: 5d4a3b7f411219a45a6d952f77d2c0a6c9989da5
697604
FBReactNativeSpec: 3fc2d478e1c4b08276f9dd9128f80ec6d5d85c1f
698-
Flipper: 6edb735e6c3e332975d1b17956bcc584eccf5818
699-
Flipper-Boost-iOSX: fd1e2b8cbef7e662a122412d7ac5f5bea715403c
700-
Flipper-DoubleConversion: 2dc99b02f658daf147069aad9dbd29d8feb06d30
701-
Flipper-Fmt: 60cbdd92fc254826e61d669a5d87ef7015396a9b
702-
Flipper-Folly: 584845625005ff068a6ebf41f857f468decd26b3
703-
Flipper-Glog: 70c50ce58ddaf67dc35180db05f191692570f446
704-
Flipper-PeerTalk: 116d8f857dc6ef55c7a5a75ea3ceaafe878aadc9
705-
FlipperKit: 2efad7007d6745a3f95e4034d547be637f89d3f6
706605
fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9
707606
glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b
708607
hermes-engine: 81191603c4eaa01f5e4ae5737a9efcf64756c7b2
709608
libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913
710-
OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c
711609
RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1
712610
RCTRequired: c0569ecc035894e4a68baecb30fe6a7ea6e399f9
713611
RCTTypeSafety: e90354072c21236e0bcf1699011e39acd25fea2f
@@ -749,7 +647,6 @@ SPEC CHECKSUMS:
749647
RNKeychain: a65256b6ca6ba6976132cc4124b238a5b13b3d9c
750648
SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17
751649
Yoga: 3efc43e0d48686ce2e8c60f99d4e6bd349aff981
752-
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
753650

754651
PODFILE CHECKSUM: 940323d07de591a59a2ab39fc0ef7b7d6dc89c0d
755652

example/rn-setup.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const baseCommand =
55
'rn-nodeify --install buffer,stream,assert,events,crypto,vm,process --hack';
66

77
function postInstallMac() {
8-
exec(`${baseCommand} && cd ios && pod install && cd ..`);
8+
exec(`${baseCommand} && cd ios && NO_FLIPPER=1 pod install && cd ..`);
99
}
1010
function postInstallLinWin() {
1111
exec(baseCommand);

example/utils/helpers.ts

Lines changed: 40 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ import {
55
IAddress,
66
} from '@synonymdev/react-native-ldk';
77
import { getItem, setItem } from '../ldk';
8-
import { EAccount } from './types';
8+
import { EAccount, TWallet } from './types';
99
import { err, ok, Result } from './result';
10+
// @ts-ignore
1011
import { randomBytes } from 'react-native-randombytes';
1112
import * as bitcoin from 'bitcoinjs-lib';
1213
import { selectedNetwork } from './constants';
@@ -21,16 +22,16 @@ import networks from '@synonymdev/react-native-ldk/dist/utils/networks';
2122
* @param {string} [key]
2223
* @param {string} seed
2324
*/
24-
export const setAccount = async ({
25+
export const setWallet = async ({
2526
name = EAccount.name,
26-
seed = randomSeed(),
27-
}: TAccount): Promise<boolean> => {
27+
mnemonic = createMnemonic(),
28+
}: TWallet): Promise<boolean> => {
2829
try {
29-
const account: TAccount = {
30+
const wallet = {
3031
name,
31-
seed,
32+
mnemonic,
3233
};
33-
await Keychain.setGenericPassword(name, JSON.stringify(account), {
34+
await Keychain.setGenericPassword(name, JSON.stringify(wallet), {
3435
service: name,
3536
});
3637
await setItem(EAccount.currentAccountKey, name);
@@ -45,30 +46,37 @@ export const setAccount = async ({
4546
* @param {string} [accountName]
4647
* @returns {Promise<string>}
4748
*/
48-
export const getAccount = async (accountName?: string): Promise<TAccount> => {
49+
export const getWallet = async (accountName?: string): Promise<TWallet> => {
4950
if (!accountName) {
5051
accountName = await getCurrentAccountName();
5152
}
52-
const defaultAccount: TAccount = {
53+
const defaultWallet: TWallet = {
5354
name: EAccount.name,
54-
seed: randomSeed(),
55+
mnemonic: createMnemonic(),
5556
};
5657
try {
5758
let result = await Keychain.getGenericPassword({ service: accountName });
5859
if (result && result?.password) {
59-
// Return existing account.
60-
return JSON.parse(result?.password);
60+
return JSON.parse(result.password);
6161
} else {
6262
// Setup default account.
63-
await setAccount(defaultAccount);
64-
return defaultAccount;
63+
await setWallet({ name: accountName, mnemonic: defaultWallet.mnemonic });
64+
return defaultWallet;
6565
}
6666
} catch (e) {
6767
console.log(e);
68-
return defaultAccount;
68+
return defaultWallet;
6969
}
7070
};
7171

72+
export const getAccount = async (accountName?: string): Promise<TAccount> => {
73+
const wallet = await getWallet(accountName);
74+
return {
75+
name: wallet.name,
76+
seed: await getLdkSeed(wallet.mnemonic),
77+
};
78+
};
79+
7280
/**
7381
* Returns current account name, if any.
7482
* @returns {Promise<string>}
@@ -98,20 +106,32 @@ export const createNewAccount = async (): Promise<Result<TAccount>> => {
98106
}
99107
}
100108
const name = `wallet${num}`;
109+
const mnemonic = createMnemonic();
110+
101111
const account: TAccount = {
102112
name,
103-
seed: randomSeed(),
113+
seed: await getLdkSeed(mnemonic),
104114
};
105-
await setAccount(account);
115+
await setWallet({ name, mnemonic });
106116
return ok(account);
107117
} catch (e) {
108118
console.log(e);
109119
return err(e);
110120
}
111121
};
112122

113-
export const randomSeed = (): string => {
114-
return randomBytes(32).toString('hex');
123+
export const createMnemonic = (): string => {
124+
return bip39.entropyToMnemonic(randomBytes(32));
125+
};
126+
127+
/**
128+
* Returns seed derived from mnemonic that is compatible with LDK-Node.
129+
* @returns {Promise<string>}
130+
*/
131+
export const getLdkSeed = async (mnumonic: string): Promise<string> => {
132+
const mnemonicSeed = await bip39.mnemonicToSeed(mnumonic);
133+
const root = bip32.fromSeed(mnemonicSeed, getNetwork(selectedNetwork));
134+
return root.privateKey!.toString('hex');
115135
};
116136

117137
/**
@@ -191,8 +211,7 @@ export const getMnemonicPhraseFromSeed = (accountSeed: string): string => {
191211
export const getAddress = async (): Promise<IAddress> => {
192212
const network = getNetwork(selectedNetwork);
193213

194-
const { seed: accountSeed } = await getAccount();
195-
const mnemonic = getMnemonicPhraseFromSeed(accountSeed);
214+
const { mnemonic } = await getWallet();
196215
const mnemonicSeed = await bip39.mnemonicToSeed(mnemonic);
197216
const root = bip32.fromSeed(mnemonicSeed, network);
198217
const keyPair = root.derivePath("m/84'/1'/0'/0/0");

example/utils/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { TAvailableNetworks } from '@synonymdev/react-native-ldk';
22

3+
export type TWallet = {
4+
name: string;
5+
mnemonic: string;
6+
};
7+
38
export enum EAccount {
49
name = 'wallet0',
510
currentAccountKey = 'currentAccount',

0 commit comments

Comments
 (0)