1import { useCallback, useMemo, useEffect, useState } from 'react';
2import { Just, Nothing } from 'folktale/maybe';
3import saveAs from 'file-saver';
5import { useWallet } from 'store/wallet';
6import { useRollerStore } from 'store/rollerStore';
8import { generateCode } from 'lib/networkCode';
11 attemptNetworkSeedDerivation,
16import { stripSigPrefix } from 'form/formatters';
18// overrideable defaults:
19// seed - derived from wallet, mnemonic, or token (if posisble)
20// point - the current pointCursor
21interface useKeyfileGeneratorArgs {
28 * Use `useMultikeyFileGenerator` instead
30export default function useKeyfileGenerator({ seed }: useKeyfileGeneratorArgs) {
31 const { urbitWallet, wallet, authMnemonic, authToken }: any = useWallet();
32 const { point } = useRollerStore();
34 const [notice, setNotice] = useState('Deriving networking keys...');
35 const [downloaded, setDownloaded] = useState(false);
36 const [generating, setGenerating] = useState(true);
37 const [keyfile, setKeyfile] = useState<boolean | string>(false);
38 const [code, setCode] = useState(false);
40 const networkRevision = Number(point.keyRevisionNumber);
41 const canManage = point.isOwner || point.isManagementProxy;
43 const hasNetworkKeys = networkRevision > 0;
44 const available = canManage && hasNetworkKeys && !!keyfile;
46 const generate = useCallback(async () => {
47 if (!hasNetworkKeys) {
49 setNotice('Network keys not yet set.');
51 `no networking keys available for revision ${networkRevision}`
56 const networkSeed = seed
58 : await attemptNetworkSeedDerivation({
65 revision: networkRevision,
68 if (Nothing.hasInstance(networkSeed)) {
71 'Custom or nondeterministic networking keys cannot be re-downloaded.'
73 console.log(`seed is nondeterminable for revision ${networkRevision}`);
77 const _networkSeed = networkSeed.value;
79 const pair = deriveNetworkKeys(_networkSeed);
81 if (!keysMatchChain(pair, point)) {
83 setNotice('Derived networking keys do not match on-chain details.');
84 console.log(`keys do not match details for revision ${networkRevision}`);
89 setCode(generateCode(pair));
90 setKeyfile(compileNetworkKey(pair, point.value, networkRevision));
104 const filename = useMemo(() => {
105 return `${stripSigPrefix(point.patp)}-${networkRevision}.key`;
106 }, [point, networkRevision]);
108 const download = useCallback(() => {
109 if (typeof keyfile !== 'string') {
114 new Blob([keyfile], {
115 type: 'text/plain;charset=utf-8',
120 }, [filename, keyfile]);
137 return { ...values, bind: values };
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list