on 2b8b988 help sign in
bridge/src/lib/useKeyfileGenerator.js
99 lines 2.6 kB history raw
1import { useCallback, useEffect, useState } from 'react';
2import { Just, Nothing } from 'folktale/maybe';
3import saveAs from 'file-saver';
4import * as ob from 'urbit-ob';
6import { usePointCache } from 'store/pointCache';
7import { useWallet } from 'store/wallet';
9import * as need from 'lib/need';
11import {
12 attemptNetworkSeedDerivation,
13 keysMatchChain,
14 deriveNetworkKeys,
15 compileNetworkingKey,
16} from './keys';
17import useCurrentPermissions from './useCurrentPermissions';
18import { usePointCursor } from 'store/pointCursor';
20export default function useKeyfileGenerator(manualNetworkSeed) {
21 const { getDetails } = usePointCache();
22 const { urbitWallet, wallet, authMnemonic } = useWallet();
23 const { pointCursor } = usePointCursor();
25 const [downloaded, setDownloaded] = useState(false);
26 const [generating, setGenerating] = useState(true);
27 const [keyfile, setKeyfile] = useState(false);
29 const _point = need.point(pointCursor);
30 const _details = need.details(getDetails(_point));
32 const networkRevision = parseInt(_details.keyRevisionNumber, 10);
33 const { isOwner, isManagementProxy } = useCurrentPermissions();
35 const hasNetworkingKeys = networkRevision > 0;
36 const available =
37 (isOwner || isManagementProxy) && hasNetworkingKeys && keyfile;
39 const generate = useCallback(async () => {
40 console.log('generating for network revision', networkRevision);
42 const networkSeed = manualNetworkSeed
43 ? Just(manualNetworkSeed)
44 : await attemptNetworkSeedDerivation({
45 urbitWallet,
46 wallet,
47 authMnemonic,
48 details: _details,
49 revision: networkRevision,
50 });
52 if (Nothing.hasInstance(networkSeed)) {
53 setGenerating(false);
54 return;
55 }
57 const _networkSeed = networkSeed.value;
59 const pair = deriveNetworkKeys(_networkSeed);
61 if (!keysMatchChain(pair, _details)) {
62 setGenerating(false);
63 return;
64 }
66 setKeyfile(compileNetworkingKey(pair, _point, networkRevision));
67 setGenerating(false);
68 }, [
69 networkRevision,
70 manualNetworkSeed,
71 urbitWallet,
72 wallet,
73 authMnemonic,
74 _details,
75 _point,
76 ]);
78 const download = useCallback(() => {
79 saveAs(
80 new Blob([keyfile], {
81 type: 'text/plain;charset=utf-8',
82 }),
83 `${ob.patp(_point).slice(1)}-${networkRevision}.key`
84 // TODO: ^ unifiy "remove tilde" calls
85 );
86 setDownloaded(true);
87 }, [_point, keyfile, networkRevision]);
89 useEffect(() => {
90 generate();
91 }, [generate]);
93 return {
94 generating,
95 available,
96 downloaded,
97 download,
98 };