@@ -18,20 +18,35 @@ import {
1818} from './keys';
1919import useCurrentPermissions from './useCurrentPermissions';
2020import { convertToInt } from './convertToInt';
21+import { stripSigPrefix } from 'form/formatters';
22+
23+// overrideable defaults:
24+// seed - derived from wallet, mnemonic, or token (if posisble)
25+// point - the current pointCursor
26+interface useKeyfileGeneratorArgs {
27+ seed?: string;
28+ point?: number;
29+}
2130
22−export default function useKeyfileGenerator(manualNetworkSeed) {
23− const { urbitWallet, wallet, authMnemonic, authToken } = useWallet();
24− const { pointCursor } = usePointCursor();
25− const { getDetails } = usePointCache();
31+export default function useKeyfileGenerator({
32+ seed,
33+ point,
34+}: useKeyfileGeneratorArgs) {
35+ const { urbitWallet, wallet, authMnemonic, authToken }: any = useWallet();
36+ const { pointCursor }: any = usePointCursor();
37+ const { syncDetails, getDetails }: any = usePointCache();
2638
2739 const [notice, setNotice] = useState('Deriving networking keys...');
2840 const [downloaded, setDownloaded] = useState(false);
2941 const [generating, setGenerating] = useState(true);
30− const [keyfile, setKeyfile] = useState(false);
31−
42+ const [keyfile, setKeyfile] = useState<boolean | string>(false);
3243 const [code, setCode] = useState(false);
3344
34− const _point = need.point(pointCursor);
45+ const _point = point || need.point(pointCursor);
46+ useEffect(() => {
47+ syncDetails(_point);
48+ }, [_point, syncDetails]);
49+
3550 const details = getDetails(_point);
3651
3752 const networkRevision = details.matchWith({
@@ -56,8 +71,8 @@ export default function useKeyfileGenerator(manualNetworkSeed) {
5671
5772 const _details = need.details(details);
5873
59− const networkSeed = manualNetworkSeed
60− ? Just(manualNetworkSeed)
74+ const networkSeed = seed
75+ ? Just(seed)
6176 : await attemptNetworkSeedDerivation({
6277 urbitWallet,
6378 wallet,
@@ -88,14 +103,14 @@ export default function useKeyfileGenerator(manualNetworkSeed) {
88103 return;
89104 }
90105
91− setNotice();
106+ setNotice('');
92107 setCode(generateCode(pair));
93108 setKeyfile(compileNetworkKey(pair, _point, networkRevision));
94109 setGenerating(false);
95110 }, [
96111 networkRevision,
97112 hasNetworkKeys,
98− manualNetworkSeed,
113+ seed,
99114 urbitWallet,
100115 wallet,
101116 authMnemonic,
@@ -106,11 +121,14 @@ export default function useKeyfileGenerator(manualNetworkSeed) {
106121 ]);
107122
108123 const filename = useMemo(() => {
109− return `${ob.patp(_point).slice(1)}-${networkRevision}.key`;
110− // TODO: ^ unifiy "remove tilde" calls
124+ return `${stripSigPrefix(ob.patp(_point))}-${networkRevision}.key`;
111125 }, [_point, networkRevision]);
112126
113127 const download = useCallback(() => {
128+ if (typeof keyfile !== 'string') {
129+ return;
130+ }
131+
114132 saveAs(
115133 new Blob([keyfile], {
116134 type: 'text/plain;charset=utf-8',