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';
18interface useKeyfileGeneratorArgs {
23 * seed - (optional) derived from wallet, mnemonic, or token by default (if possible)
25export default function useKeyfileGenerator({ seed }: useKeyfileGeneratorArgs) {
26 const { urbitWallet, wallet, authMnemonic, authToken }: any = useWallet();
27 const { point } = useRollerStore();
29 const [notice, setNotice] = useState('Deriving networking keys...');
30 const [downloaded, setDownloaded] = useState(false);
31 const [generating, setGenerating] = useState(true);
32 const [keyfile, setKeyfile] = useState<boolean | string>(false);
33 const [code, setCode] = useState(false);
35 const networkRevision = Number(point.keyRevisionNumber);
36 const canManage = point.isOwner || point.isManagementProxy;
38 const hasNetworkKeys = networkRevision > 0;
39 const available = canManage && hasNetworkKeys && !!keyfile;
41 const generate = useCallback(async () => {
42 if (!hasNetworkKeys) {
44 setNotice('Network keys not yet set.');
46 `no networking keys available for revision ${networkRevision}`
51 const networkSeed = seed
53 : await attemptNetworkSeedDerivation({
60 revision: networkRevision,
63 if (Nothing.hasInstance(networkSeed)) {
66 'Custom or nondeterministic networking keys cannot be re-downloaded.'
68 console.log(`seed is nondeterminable for revision ${networkRevision}`);
72 const _networkSeed = networkSeed.value;
74 const pair = deriveNetworkKeys(_networkSeed);
76 if (!keysMatchChain(pair, point)) {
78 setNotice('Derived networking keys do not match on-chain details.');
79 console.log(`keys do not match details for revision ${networkRevision}`);
84 setCode(generateCode(pair));
86 compileMultiKey(point.value, [
88 revision: networkRevision,
106 const filename = useMemo(() => {
107 return `${stripSigPrefix(point.patp)}-${networkRevision}.key`;
108 }, [point, networkRevision]);
110 const download = useCallback(() => {
111 if (typeof keyfile !== 'string') {
116 new Blob([keyfile], {
117 type: 'text/plain;charset=utf-8',
122 }, [filename, keyfile]);
139 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