on af19266 help sign in
bridge/src/lib/useKeyfileGenerator.js
93 lines 2.4 kB history raw
1import { useCallback, useState } from 'react';
2import saveAs from 'file-saver';
3import * as ob from 'urbit-ob';
5import { usePointCache } from 'store/pointCache';
6import { useWallet } from 'store/wallet';
8import * as need from 'lib/need';
10import {
11 attemptNetworkSeedDerivation,
12 keysMatchChain,
13 deriveNetworkKeys,
14 compileNetworkingKey,
15} from './keys';
16import usePermissionsForPoint from './usePermissionsForPoint';
18export default function useKeyfileGenerator(point) {
19 const { getDetails } = usePointCache();
20 const { urbitWallet, wallet, authMnemonic } = useWallet();
22 const [downloaded, setDownloaded] = useState(false);
23 const [generating, setGenerating] = useState(false);
24 const [keyfile, setKeyfile] = useState();
26 const details = need.details(getDetails(point));
27 const networkRevision = parseInt(details.keyRevisionNumber, 10);
29 const { isOwner, isManagementProxy } = usePermissionsForPoint(point);
30 const hasNetworkingKeys = networkRevision > 0;
31 const available = (isOwner || isManagementProxy) && hasNetworkingKeys;
33 const generate = useCallback(async () => {
34 setGenerating(true);
36 const networkSeed = await attemptNetworkSeedDerivation({
37 urbitWallet,
38 wallet,
39 authMnemonic,
40 details,
41 revision: networkRevision,
42 });
44 const _networkSeed = need.value(networkSeed, () => {
45 setGenerating(false);
46 throw new Error('Could not derive networking seed.');
47 });
49 const pair = deriveNetworkKeys(_networkSeed);
51 if (!keysMatchChain(pair, details)) {
52 setGenerating(false);
53 throw new Error(
54 'Derived networking keys do not match public keys on chain.'
55 );
56 }
58 setKeyfile(compileNetworkingKey(pair, point, networkRevision));
59 setGenerating(false);
60 }, [
61 setGenerating,
62 setKeyfile,
63 urbitWallet,
64 wallet,
65 authMnemonic,
66 details,
67 networkRevision,
68 point,
69 ]);
71 const download = useCallback(() => {
72 saveAs(
73 new Blob([keyfile], {
74 type: 'text/plain;charset=utf-8',
75 }),
76 `${ob.patp(point).slice(1)}-${networkRevision}.key`
77 // TODO: ^ unifiy "remove tilde" calls
78 );
79 setDownloaded(true);
80 }, [point, keyfile, networkRevision, setDownloaded]);
82 const generateAndDownload = useCallback(async () => {
83 await generate();
84 download();
85 }, [generate, download]);
87 return {
88 generating,
89 available,
90 downloaded,
91 generateAndDownload,
92 };