2import { Just, Nothing } from 'folktale/maybe';
4import * as noun from '../nockjs/noun';
5import * as serial from '../nockjs/serial';
6import * as kg from 'urbit-key-generation/dist';
8import { eqAddr, addHexPrefix, CURVE_ZERO_ADDR } from './wallet';
10const NETWORK_KEY_CURVE_PARAMETER = '42';
14 let hex = buf.reverse().toString('hex');
15 let n = new BN(hex, 'hex');
17 while (1 === n.cmpn(0)) {
18 c.push(n.andln(0x3f));
38 String.fromCharCode(trans(b)) + (i && 0 === i % 5 ? '.' : '') + a,
49 const pad = hex.length % 2 === 0 ? hex : '0' + hex;
50 return Buffer.from(pad, 'hex').reverse();
53// simple alias to avoid importing kg into component scope
54export const deriveNetworkKeys = seed => kg.deriveNetworkKeys(seed);
57 * @param {object} pair
58 * @param {number} point
59 * @param {number} revision
62export const compileNetworkingKey = (pair, point, revision) => {
64 pair.crypt.private + pair.auth.private + NETWORK_KEY_CURVE_PARAMETER,
68 const sed = noun.dwim(
69 noun.Atom.fromInt(point),
70 noun.Atom.fromInt(revision),
71 noun.Atom.fromString(bnsec.toString()),
79 * @param {object} urbitWallet
80 * @param {number} revision
81 * @return {Promise<Maybe<string>>}
83export const deriveNetworkSeedFromUrbitWallet = async (
87 return await deriveNetworkSeedFromSeed(urbitWallet.management.seed, revision);
91 * @param {Maybe<any>} wallet
92 * @param {string} authMnemonic
93 * @param {object} details
94 * @param {number} revision
95 * @return {Promise<Maybe<string>>}
97export const deriveNetworkSeedFromMnemonic = async (
103 const isOwner = eqAddr(wallet.address, details.owner);
104 const isManagementProxy = eqAddr(wallet.address, details.managementProxy);
106 // the network seed is only derivable from mnemonic if the derived
107 // management seed or owner equals the record we have on chain
108 if (isOwner || isManagementProxy) {
109 return await deriveNetworkSeedFromSeed(authMnemonic, revision);
116 * @param {string} seed
117 * @param {number} revision
118 * @return {Promise<Maybe<string>>}
120const deriveNetworkSeedFromSeed = async (seed, revision) => {
121 return Just(await kg.deriveNetworkSeed(seed, '', revision));
125 * @return {Promise<Maybe<string>>}
127export const attemptNetworkSeedDerivation = async ({
134 if (Just.hasInstance(urbitWallet)) {
135 return await deriveNetworkSeedFromUrbitWallet(urbitWallet.value, revision);
138 if (Just.hasInstance(wallet) && Just.hasInstance(authMnemonic)) {
139 return await deriveNetworkSeedFromMnemonic(
152 * @param {object} pair
153 * @param {object} details
156export const keysMatchChain = (pair, details) => {
157 const { crypt, auth } = pair;
158 const { encryptionKey, authenticationKey } = details;
161 encryptionKey === addHexPrefix(crypt.public) &&
162 authenticationKey === addHexPrefix(auth.public)
166export const segmentNetworkKey = hex => {
167 const sl = i => hex.slice(i, i + 4);
168 const rowFrom = i => `${sl(i)}.${sl(i + 4)}.${sl(i + 8)}.${sl(i + 12)}`;
169 if (hex === CURVE_ZERO_ADDR) {
173 return [rowFrom(2), rowFrom(18), rowFrom(34), rowFrom(50)];
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