on master help sign in
keys: address PR feedback, refactor keyfile gen
63bd524tomholford
src/lib/useKeyfileGenerator.ts+163−50
@@ -1,44 +1,66 @@
1import { useCallback, useMemo, useEffect, useState } from 'react';
1import { useCallback, useMemo, useEffect, useState } from 'react';
2−import { Just, Nothing } from 'folktale/maybe';
2+import { Just } from 'folktale/maybe';
3import saveAs from 'file-saver';
3import saveAs from 'file-saver';
4−
5import { useWallet } from 'store/wallet';
4import { useWallet } from 'store/wallet';
6−import { useRollerStore } from 'store/rollerStore';
5+import { EMPTY_POINT, useRollerStore } from 'store/rollerStore';
7−
8import { generateCode } from 'lib/networkCode';
6import { generateCode } from 'lib/networkCode';
9−
10import {
7import {
11 attemptNetworkSeedDerivation,
8 attemptNetworkSeedDerivation,
9+ deriveNetworkSeedFromUrbitWallet,
12 keysMatchChain,
10 keysMatchChain,
13 deriveNetworkKeys,
11 deriveNetworkKeys,
14 compileMultiKey,
12 compileMultiKey,
15} from './keys';
13} from './keys';
16import { stripSigPrefix } from 'form/formatters';
14import { stripSigPrefix } from 'form/formatters';
15+import useRoller from './useRoller';
16+import Point from './types/Point';
17+import { toL1Details } from './utils/point';
18+import { ETH_ZERO_ADDR } from './constants';
17
19
18interface useKeyfileGeneratorArgs {
20interface useKeyfileGeneratorArgs {
21+ point?: Point;
19− seed?: string;
22+ seeds: string[];
20}
23}
21
24
22/**
25/**
23− * seed - (optional) derived from wallet, mnemonic, or token by default (if possible)
26+ * The default Keyfile Generator. Can be used by itself, or composed with
27+ * other hooks (see `useActivationKeyfileGenerator` and `useHomeKeyfileGenerator`).
28+ *
29+ * @param point Point - (optional) the Point for which to generate keys
30+ * @param seeds string[] - (required) one or more seeds consumed by deriveNetworkKeys
31+ *
24 */
32 */
25−export default function useKeyfileGenerator({ seed }: useKeyfileGeneratorArgs) {
33+function useKeyfileGenerator({ point, seeds }: useKeyfileGeneratorArgs) {
26− const { urbitWallet, wallet, authMnemonic, authToken }: any = useWallet();
34+ // exported keyfile generator properties
27− const { point } = useRollerStore();
28−
29 const [notice, setNotice] = useState('Deriving networking keys...');
35 const [notice, setNotice] = useState('Deriving networking keys...');
30 const [downloaded, setDownloaded] = useState(false);
36 const [downloaded, setDownloaded] = useState(false);
31 const [generating, setGenerating] = useState(true);
37 const [generating, setGenerating] = useState(true);
32 const [keyfile, setKeyfile] = useState<boolean | string>(false);
38 const [keyfile, setKeyfile] = useState<boolean | string>(false);
33 const [code, setCode] = useState(false);
39 const [code, setCode] = useState(false);
34
40
41+ // resolved point
42+ const { point: storedPoint } = useRollerStore();
43+ const resolvedPoint = useMemo(() => {
44+ return point || storedPoint;
45+ }, [point, storedPoint]);
46+
35− const networkRevision = Number(point.keyRevisionNumber);
47+ const networkRevision = useMemo(() => {
48+ return Number(resolvedPoint.keyRevisionNumber);
49+ }, [resolvedPoint]);
50+ const canManage = useMemo(() => {
36− const canManage = point.isOwner || point.isManagementProxy;
51+ return resolvedPoint.isOwner || resolvedPoint.isManagementProxy;
52+ }, [resolvedPoint]);
37
53
38 const hasNetworkKeys = networkRevision > 0;
54 const hasNetworkKeys = networkRevision > 0;
39 const available = canManage && hasNetworkKeys && !!keyfile;
55 const available = canManage && hasNetworkKeys && !!keyfile;
40
56
41 const generate = useCallback(async () => {
57 const generate = useCallback(async () => {
58+ // Point still loading ...
59+ if (resolvedPoint.value === EMPTY_POINT.value) {
60+ console.log('Loading point data ...');
61+ return;
62+ }
63+
42 if (!hasNetworkKeys) {
64 if (!hasNetworkKeys) {
43 setGenerating(false);
65 setGenerating(false);
44 setNotice('Network keys not yet set.');
66 setNotice('Network keys not yet set.');
@@ -48,19 +70,9 @@ export default function useKeyfileGenerator({ seed }: useKeyfileGeneratorArgs) {
48 return;
70 return;
49 }
71 }
50
72
51− const networkSeed = seed
73+ // seeds were either generated non-deterministically,
52− ? Just(seed)
74+ // or still being derived ...
53− : await attemptNetworkSeedDerivation({
75+ if (seeds.length === 0) {
54− urbitWallet,
55− wallet,
56− authMnemonic,
57− details: point,
58− authToken,
59− point: point.value,
60− revision: networkRevision,
61− });
62−
63− if (Nothing.hasInstance(networkSeed)) {
64 setGenerating(false);
76 setGenerating(false);
65 setNotice(
77 setNotice(
66 'Custom or nondeterministic networking keys cannot be re-downloaded.'
78 'Custom or nondeterministic networking keys cannot be re-downloaded.'
@@ -69,11 +81,10 @@ export default function useKeyfileGenerator({ seed }: useKeyfileGeneratorArgs) {
69 return;
81 return;
70 }
82 }
71
83
72− const _networkSeed = networkSeed.value;
73−
74− const pair = deriveNetworkKeys(_networkSeed);
84+ const pairs = seeds.map(seed => deriveNetworkKeys(seed));
85+ const firstPair = pairs[0];
75
86
76− if (!keysMatchChain(pair, point)) {
87+ if (!keysMatchChain(firstPair, resolvedPoint)) {
77 setGenerating(false);
88 setGenerating(false);
78 setNotice('Derived networking keys do not match on-chain details.');
89 setNotice('Derived networking keys do not match on-chain details.');
79 console.log(`keys do not match details for revision ${networkRevision}`);
90 console.log(`keys do not match details for revision ${networkRevision}`);
@@ -81,31 +92,22 @@ export default function useKeyfileGenerator({ seed }: useKeyfileGeneratorArgs) {
81 }
92 }
82
93
83 setNotice('');
94 setNotice('');
84− setCode(generateCode(pair));
95+ setCode(generateCode(firstPair));
85 setKeyfile(
96 setKeyfile(
86− compileMultiKey(point.value, [
97+ compileMultiKey(
87− {
98+ resolvedPoint.value,
99+ pairs.map((pair, k) => {
88− revision: networkRevision,
100+ return { revision: networkRevision + k, pair };
89− pair: pair,
90− },
101+ })
91− ])
102+ )
92 );
103 );
104+ console.log(`keyfile generated for revision ${networkRevision}`);
93 setGenerating(false);
105 setGenerating(false);
94− }, [
95− networkRevision,
96− hasNetworkKeys,
106+ }, [hasNetworkKeys, seeds, resolvedPoint, networkRevision]);
97− seed,
98− urbitWallet,
99− wallet,
100− authMnemonic,
101− setCode,
102− point,
103− authToken,
104− ]);
105
107
106 const filename = useMemo(() => {
108 const filename = useMemo(() => {
107− return `${stripSigPrefix(point.patp)}-${networkRevision}.key`;
109+ return `${stripSigPrefix(resolvedPoint.patp)}-${networkRevision}.key`;
108− }, [point, networkRevision]);
110+ }, [resolvedPoint, networkRevision]);
109
111
110 const download = useCallback(() => {
112 const download = useCallback(() => {
111 if (typeof keyfile !== 'string') {
113 if (typeof keyfile !== 'string') {
@@ -138,3 +140,114 @@ export default function useKeyfileGenerator({ seed }: useKeyfileGeneratorArgs) {
138
140
139 return { ...values, bind: values };
141 return { ...values, bind: values };
140}
142}
143+
144+interface ActivationKeyfileGeneratorArgs {
145+ pointId: number;
146+ wallets: UrbitWallet[];
147+}
148+
149+/**
150+ * This Activation Keyfile Generator is used to derive a multikey during the
151+ * Activation Flow. At the time of generation, there is no Point yet set in
152+ * the Roller Store, so we need to look it up by Point ID (to retreive the
153+ * current key revision via API).
154+ *
155+ * @param pointId number - (required) the point ID for which to generate keys
156+ * @param wallets UrbitWallet[] - (required) for each wallet,
157+ * a seed + revision pair is generated and consumed by `compileMultiKey`.
158+ * It should be an array of [deterministic invite wallet, non-deterministic
159+ * master ticket wallet] (the sending and receiving wallets)
160+ */
161+export const useActivationKeyfileGenerator = ({
162+ pointId,
163+ wallets,
164+}: ActivationKeyfileGeneratorArgs) => {
165+ // resolve point
166+ const { api } = useRoller();
167+ const [point, setPoint] = useState<Point>(EMPTY_POINT);
168+
169+ const resolvePoint = useCallback(async () => {
170+ const resolved = new Point({
171+ value: pointId,
172+ details: toL1Details(await api.getPoint(pointId)),
173+ address: ETH_ZERO_ADDR,
174+ });
175+
176+ setPoint(resolved);
177+ }, [api, pointId]);
178+
179+ useEffect(() => {
180+ resolvePoint();
181+ }, [resolvePoint]);
182+
183+ // derive seeds from wallets
184+ const [seeds, setSeeds] = useState<string[]>([]);
185+ const deriveSeeds = useCallback(async () => {
186+ if (!('keyRevisionNumber' in point)) {
187+ return;
188+ }
189+
190+ const derivedSeeds = await Promise.all(
191+ wallets.map(async (w, i) => {
192+ return deriveNetworkSeedFromUrbitWallet(w, point.keyRevisionNumber + i);
193+ })
194+ );
195+
196+ setSeeds(
197+ derivedSeeds
198+ .map(maybeSeed => maybeSeed.getOrElse(null))
199+ .filter(s => s !== null)
200+ );
201+ }, [point, wallets]);
202+
203+ useEffect(() => {
204+ deriveSeeds();
205+ // eslint-disable-next-line react-hooks/exhaustive-deps
206+ }, [point]);
207+
208+ return useKeyfileGenerator({ point, seeds });
209+};
210+
211+interface HomeKeyfileGeneratorArgs {
212+ seed?: string;
213+}
214+
215+/**
216+ * This Home Keyfile Generator is used to derive a multikey in multiple views
217+ * in the Bridge dashboard (Set Network Keys, Home > ID, Home > OS views).
218+ *
219+ * * @param seed string - (optional) default: provided by the logged in wallet
220+ */
221+export const useHomeKeyfileGenerator = ({ seed }: HomeKeyfileGeneratorArgs) => {
222+ // use provided seed, or fallback to deriving from logged in wallet
223+ const { point } = useRollerStore();
224+ const { authMnemonic, authToken, urbitWallet, wallet }: any = useWallet();
225+ const [seeds, setSeeds] = useState<string[]>([]);
226+
227+ const deriveSeeds = useCallback(async () => {
228+ if (seed) {
229+ setSeeds([seed]);
230+ return;
231+ }
232+
233+ const derivedSeed = await attemptNetworkSeedDerivation({
234+ urbitWallet,
235+ wallet,
236+ authMnemonic,
237+ details: point,
238+ authToken,
239+ point: point.value,
240+ revision: point.keyRevisionNumber,
241+ });
242+
243+ if (Just.hasInstance(derivedSeed)) {
244+ setSeeds([derivedSeed.value]);
245+ }
246+ }, [authMnemonic, authToken, point, seed, urbitWallet, wallet]);
247+
248+ useEffect(() => {
249+ deriveSeeds();
250+ }, [deriveSeeds]);
251+
252+ return useKeyfileGenerator({ seeds });
253+};
src/lib/useMultiKeyfileGenerator.tsdeleted−180
@@ -1,180 +0,0 @@
1−import saveAs from 'file-saver';
2−import ob from 'urbit-ob';
3−import { Nothing } from 'folktale/maybe';
4−
5−import { useCallback, useEffect, useMemo, useState } from 'react';
6−import { deriveNetworkKeys } from 'urbit-key-generation';
7−import {
8− compileMultiKey,
9− deriveNetworkSeedFromUrbitWallet,
10− keysMatchChain,
11−} from './keys';
12−import { generateCode } from './networkCode';
13−import { stripSigPrefix } from 'form/formatters';
14−import useRoller from './useRoller';
15−import Point from './types/Point';
16−
17−interface useMultiKeyfileGeneratorArgs {
18− point: number;
19− inviteWallet: UrbitWallet;
20− inviteMasterTicketWallet: UrbitWallet;
21−}
22−
23−/**
24− * defaults:
25− * - point: the activating point
26− * - inviteWallet: determinstic invite wallet (generated during invite creation)
27− * - inviteMasterTicketWallet: the non-deterministic wallet (generated during invite acceptance);
28− * it is the wallet that receives the point transfer during Activation (and accessed by Master Ticket)
29− *
30− * This should only be used during the Activation flow,
31− * because the point will be "in between" key revisions.
32− * (0 --> 1 is when the invite is generated, 1 --> 2 is upon invite acceptance).
33− *
34− * For other keyfile use cases, see: useKeyfileGenerator
35− */
36−export default function useMultiKeyfileGenerator({
37− point,
38− inviteWallet,
39− inviteMasterTicketWallet,
40−}: useMultiKeyfileGeneratorArgs) {
41− const [notice, setNotice] = useState('Deriving networking keys...');
42− const [downloaded, setDownloaded] = useState(false);
43− const [generating, setGenerating] = useState(true);
44− const [keyfile, setKeyfile] = useState<boolean | string>(false);
45− const [code, setCode] = useState(false);
46− const [pointDetails, setPointDetails] = useState<Point | null>(null);
47− const { initPoint } = useRoller();
48−
49− const fetchPoint = useCallback(async () => {
50− setPointDetails(await initPoint(point));
51− }, [initPoint, point]);
52−
53− useEffect(() => {
54− fetchPoint();
55− }, [fetchPoint]);
56−
57− const currentRevision = useMemo(
58− () => (pointDetails ? pointDetails.keyRevisionNumber : 0),
59− [pointDetails]
60− );
61− const nextRevision = useMemo(() => currentRevision + 1, [currentRevision]);
62−
63− const pairFromRevision = useCallback(
64− async (revision: number, derivationWallet) => {
65− if (!pointDetails) {
66− return;
67− }
68−
69− const networkSeed = await deriveNetworkSeedFromUrbitWallet({
70− urbitWallet: derivationWallet,
71− revision,
72− });
73−
74− if (Nothing.hasInstance(networkSeed)) {
75− setGenerating(false);
76− setNotice(
77− 'Custom or nondeterministic networking keys cannot be re-downloaded.'
78− );
79− console.log(`seed is nondeterminable for revision ${revision}`);
80− return;
81− }
82−
83− const _networkSeed = networkSeed.value;
84−
85− return deriveNetworkKeys(_networkSeed);
86− },
87− [pointDetails]
88− );
89−
90− const hasNetworkKeys = currentRevision > 0;
91−
92− const generate = useCallback(async () => {
93− if (!hasNetworkKeys) {
94− setGenerating(false);
95− setNotice('Network keys not yet set.');
96− console.log(
97− `no networking keys available for revision ${currentRevision}`
98− );
99− return;
100− }
101−
102− const currentPair = await pairFromRevision(currentRevision, inviteWallet);
103−
104− if (!currentPair || !keysMatchChain(currentPair, pointDetails || {})) {
105− setGenerating(false);
106− setNotice('Derived networking keys do not match on-chain details.');
107− console.log(`keys do not match details for revision ${currentRevision}`);
108− return;
109− }
110−
111− // During the activation flow, we pass in the
112− // inviteMasterTicketWallet to derive the multikey
113− // During the activation flow, we want to use the invite wallet for the next pair
114− const nextPair = await pairFromRevision(
115− nextRevision,
116− inviteMasterTicketWallet
117− );
118−
119− setNotice('');
120− setCode(generateCode(currentPair));
121− setKeyfile(
122− compileMultiKey(point, [
123− {
124− revision: currentRevision,
125− pair: currentPair,
126− },
127− {
128− revision: nextRevision,
129− pair: nextPair,
130− },
131− ])
132− );
133− setGenerating(false);
134− }, [
135− hasNetworkKeys,
136− pairFromRevision,
137− currentRevision,
138− inviteWallet,
139− pointDetails,
140− nextRevision,
141− inviteMasterTicketWallet,
142− point,
143− ]);
144−
145− const filename = useMemo(() => {
146− return `${stripSigPrefix(
147− ob.patp(point)
148− )}-${currentRevision}-${nextRevision}.key`;
149− }, [point, currentRevision, nextRevision]);
150−
151− const download = useCallback(() => {
152− if (typeof keyfile !== 'string') {
153− return;
154− }
155−
156− saveAs(
157− new Blob([keyfile], {
158− type: 'text/plain;charset=utf-8',
159− }),
160− filename
161− );
162− setDownloaded(true);
163− }, [filename, keyfile]);
164−
165− useEffect(() => {
166− generate();
167− }, [generate]);
168−
169− const output = {
170− generating,
171− downloaded,
172− download,
173− filename,
174− notice,
175− keyfile,
176− code,
177− };
178−
179− return { ...output, bind: output };
180−}
src/lib/useRoller.ts+1−6
@@ -31,12 +31,7 @@ import {
31 registerProxyAddress,
31 registerProxyAddress,
32 isL2Spawn,
32 isL2Spawn,
33} from './utils/roller';
33} from './utils/roller';
34−import {
35− ETH_ZERO_ADDR,
36− POINT_DOMINIONS,
34+import { POINT_DOMINIONS, ROLLER_HOSTS, TEN_SECONDS } from './constants';
37− ROLLER_HOSTS,
38− TEN_SECONDS,
39−} from './constants';
40
35
41import {
36import {
42 Config,
37 Config,
src/urbit-key-generation.d.ts+56
@@ -1,3 +1,18 @@
1+type ValueOf<T> = T[keyof T];
2+
3+type CHILD_SEED_TYPES = {
4+ OWNERSHIP: 'ownership';
5+ TRANSFER: 'transfer';
6+ SPAWN: 'spawn';
7+ VOTING: 'voting';
8+ MANAGEMENT: 'management';
9+ NETWORK: 'network';
10+ BITCOIN_MAINNET: 'bitcoinMainnet';
11+ BITCOIN_TESTNET: 'bitcoinTestnet';
12+};
13+
14+type ChildSeedType = ValueOf<CHILD_SEED_TYPES>;
15+
1interface NetworkKeys {
16interface NetworkKeys {
2 crypt: {
17 crypt: {
3 private: string;
18 private: string;
@@ -23,6 +38,8 @@ interface WalletNode {
23 derivationPath: string;
38 derivationPath: string;
24}
39}
25
40
41+interface BitcoinWallet extends WalletNode {}
42+
26interface WalletConfig {
43interface WalletConfig {
27 ticket: string;
44 ticket: string;
28 ship: number;
45 ship: number;
@@ -55,15 +72,54 @@ interface UrbitWallet {
55 | {};
72 | {};
56 voting?: WalletNode;
73 voting?: WalletNode;
57 spawn?: WalletNode;
74 spawn?: WalletNode;
75+ bitcoinTestnet: BitcoinWallet;
76+ bitcoinMainnet: BitcoinWallet;
58}
77}
59
78
60declare module 'urbit-key-generation' {
79declare module 'urbit-key-generation' {
80+ const CHILD_SEED_TYPES: CHILD_SEED_TYPES;
81+ function addressFromSecp256k1Public(pub: string): string;
82+ function argon2u(entropy: Buffer, ship: number): Promise<Uint8Array>;
61 function combine(shards: string[]): string;
83 function combine(shards: string[]): string;
84+ function deriveNetworkInfo(
85+ mnemonic: string,
86+ revision: number,
87+ passphrase?: string
88+ ): { type: 'network'; seed: string; keys: WalletNodeKeys };
62 function deriveNetworkKeys(hex: string): NetworkKeys;
89 function deriveNetworkKeys(hex: string): NetworkKeys;
90+ function deriveNetworkSeed(
91+ mnemonic: string,
92+ passphrase: string,
93+ revision: number
94+ ): string;
95+ function deriveNode(
96+ master: Uint8Array,
97+ type: ChildSeedType,
98+ derivationPath: string,
99+ passphrase?: string
100+ ): WalletNode;
101+ function deriveNodeKeys(
102+ mnemonic: string,
103+ derivationPath: string,
104+ passphrase?: string
105+ ): WalletNodeKeys;
106+ function deriveNodeSeed(master: Uint8Array, type: ChildSeedType): string;
107+ function generateCode(pair: NetworkKeys, step: number): string;
108+ function generateKeyfile(
109+ pair: NetworkKeys,
110+ point: number,
111+ revision: number
112+ ): string;
113+ function generateOwnershipWallet({
114+ ticket,
115+ ship,
116+ passphrase,
117+ }: WalletConfig): UrbitWallet;
63 function generateWallet({
118 function generateWallet({
64 ticket,
119 ticket,
65 ship,
120 ship,
66 passphrase,
121 passphrase,
67 boot,
122 boot,
68 }: WalletConfig): UrbitWallet;
123 }: WalletConfig): UrbitWallet;
124+ function shard(ticket: string): string[];
69}
125}
src/views/Activate/MasterKeyDownload.tsx+4−5
@@ -18,7 +18,7 @@ import { DEFAULT_FADE_TIMEOUT, MASTER_KEY_DURATION } from 'lib/constants';
18import { timeout } from 'lib/timeout';
18import { timeout } from 'lib/timeout';
19import { downloadWallet } from 'lib/invite';
19import { downloadWallet } from 'lib/invite';
20import View from 'components/View';
20import View from 'components/View';
21−import useMultiKeyfileGenerator from 'lib/useMultiKeyfileGenerator';
21+import { useActivationKeyfileGenerator } from 'lib/useKeyfileGenerator';
22
22
23const MasterKeyDownload = () => {
23const MasterKeyDownload = () => {
24 const {
24 const {
@@ -46,10 +46,9 @@ const MasterKeyDownload = () => {
46 Just: (p: any) => p.value.toFixed(),
46 Just: (p: any) => p.value.toFixed(),
47 });
47 });
48
48
49− const { keyfile, filename } = useMultiKeyfileGenerator({
49+ const { keyfile, filename } = useActivationKeyfileGenerator({
50− point,
50+ pointId: point,
51− inviteWallet,
52− inviteMasterTicketWallet,
51+ wallets: [inviteWallet.value, inviteMasterTicketWallet.value],
53 });
52 });
54
53
55 // sync paper value to activation state
54 // sync paper value to activation state
src/views/UrbitID/DownloadKeys.js+2−2
@@ -9,7 +9,7 @@ import { DownloadButton, RestartButton } from 'components/Buttons';
9import PaperBuilder from 'components/PaperBuilder';
9import PaperBuilder from 'components/PaperBuilder';
10
10
11import { downloadWallet } from 'lib/invite';
11import { downloadWallet } from 'lib/invite';
12−import useKeyfileGenerator from 'lib/useKeyfileGenerator';
12+import { useHomeKeyfileGenerator } from 'lib/useKeyfileGenerator';
13
13
14import { useWallet } from 'store/wallet';
14import { useWallet } from 'store/wallet';
15import { Grid, P } from 'indigo-react';
15import { Grid, P } from 'indigo-react';
@@ -26,7 +26,7 @@ export default function AdminRedownload() {
26 const _urbitWallet = need.wallet(urbitWallet);
26 const _urbitWallet = need.wallet(urbitWallet);
27 const point = need.point(pointCursor);
27 const point = need.point(pointCursor);
28
28
29− const { keyfile, filename } = useKeyfileGenerator({});
29+ const { keyfile, filename } = useHomeKeyfileGenerator({});
30
30
31 const [paper, setPaper] = useState(Nothing());
31 const [paper, setPaper] = useState(Nothing());
32 const [downloaded, setDownloaded] = useState(false);
32 const [downloaded, setDownloaded] = useState(false);
src/views/UrbitID/Home.tsx+2−2
@@ -13,7 +13,7 @@ import {
13} from 'lib/constants';
13} from 'lib/constants';
14import { abbreviateAddress } from 'lib/utils/address';
14import { abbreviateAddress } from 'lib/utils/address';
15import { downloadWallet } from 'lib/invite';
15import { downloadWallet } from 'lib/invite';
16−import useKeyfileGenerator from 'lib/useKeyfileGenerator';
16+import { useHomeKeyfileGenerator } from 'lib/useKeyfileGenerator';
17
17
18import { useWallet } from 'store/wallet';
18import { useWallet } from 'store/wallet';
19import { useRollerStore } from 'store/rollerStore';
19import { useRollerStore } from 'store/rollerStore';
@@ -43,7 +43,7 @@ export default function UrbitIDHome() {
43 return null;
43 return null;
44 }
44 }
45 }, [urbitWallet]);
45 }, [urbitWallet]);
46− const { keyfile, filename } = useKeyfileGenerator({});
46+ const { keyfile, filename } = useHomeKeyfileGenerator({});
47 const [paper, setPaper] = useState(Nothing());
47 const [paper, setPaper] = useState(Nothing());
48
48
49 const downloadKeys = useCallback(() => {
49 const downloadKeys = useCallback(() => {
src/views/UrbitOS/Home.tsx+2−2
@@ -9,7 +9,7 @@ import BodyPane from 'components/L2/Window/BodyPane';
9import { ReactComponent as KeyfileIcon } from 'assets/keyfile.svg';
9import { ReactComponent as KeyfileIcon } from 'assets/keyfile.svg';
10
10
11import { useLocalRouter } from 'lib/LocalRouter';
11import { useLocalRouter } from 'lib/LocalRouter';
12−import useKeyfileGenerator from 'lib/useKeyfileGenerator';
12+import { useHomeKeyfileGenerator } from 'lib/useKeyfileGenerator';
13import { Box, Button, Row } from '@tlon/indigo-react';
13import { Box, Button, Row } from '@tlon/indigo-react';
14import CopiableWithTooltip from 'components/copiable/CopiableWithTooltip';
14import CopiableWithTooltip from 'components/copiable/CopiableWithTooltip';
15
15
@@ -42,7 +42,7 @@ export default function UrbitOSHome() {
42 names,
42 names,
43 ]);
43 ]);
44
44
45− const { code, download } = useKeyfileGenerator({});
45+ const { code, download } = useHomeKeyfileGenerator({});
46
46
47 return (
47 return (
48 <Window className="os-home">
48 <Window className="os-home">
src/views/UrbitOS/NetworkKeys.tsx+2−2
@@ -27,7 +27,7 @@ import {
27import useEthereumTransaction from 'lib/useEthereumTransaction';
27import useEthereumTransaction from 'lib/useEthereumTransaction';
28import { GAS_LIMITS, ONE_SECOND } from 'lib/constants';
28import { GAS_LIMITS, ONE_SECOND } from 'lib/constants';
29import { addHexPrefix } from 'lib/utils/address';
29import { addHexPrefix } from 'lib/utils/address';
30−import useKeyfileGenerator from 'lib/useKeyfileGenerator';
30+import { useHomeKeyfileGenerator } from 'lib/useKeyfileGenerator';
31
31
32import DownloadKeyfileButton from 'components/DownloadKeyfileButton';
32import DownloadKeyfileButton from 'components/DownloadKeyfileButton';
33import InlineEthereumTransaction from 'components/InlineEthereumTransaction';
33import InlineEthereumTransaction from 'components/InlineEthereumTransaction';
@@ -66,7 +66,7 @@ function useSetKeys(
66 generating: keyfileGenerating,
66 generating: keyfileGenerating,
67 filename,
67 filename,
68 bind: keyfileBind,
68 bind: keyfileBind,
69− } = useKeyfileGenerator({ seed: manualNetworkSeed });
69+ } = useHomeKeyfileGenerator({ seed: manualNetworkSeed });
70
70
71 const buildNetworkSeed = useCallback(
71 const buildNetworkSeed = useCallback(
72 async manualSeed => {
72 async manualSeed => {