@@ -6,6 +6,7 @@ import * as serial from '../nockjs/serial';
66import * as kg from 'urbit-key-generation';
77
88import { eqAddr, addHexPrefix } from './wallet';
9+import { shas } from './networkCode';
910
1011// the curve param for the network keys
1112export const NETWORK_KEY_CURVE_PARAMETER = '42';
@@ -142,6 +143,25 @@ const deriveNetworkSeedFromMnemonic = async (
142143};
143144
144145/**
146+ * @param {number} point
147+ * @param {string} authToken
148+ * @param {number} revision
149+ * @return {Maybe<string>}
150+ */
151+export const deriveNetworkSeedFromAuthToken = (point, authToken, revision) => {
152+ //NOTE revision is the point's on-chain revision number.
153+ // since deriveNetworkSeedFromMnemonic does this too, we decrement the
154+ // revision number by one before deriving from it.
155+ const salt = Buffer.from(`revision-${point}-${revision - 1}`);
156+ const networkSeed = shas(authToken, salt)
157+ .toString('hex')
158+ .slice(0, 32);
159+ return Just(networkSeed);
160+};
161+
162+/**
163+ * Derives from either a full Urbit Wallet, a current management mnemonic,
164+ * or an auth token, in that order of preference.
145165 * @return {Promise<Maybe<string>>}
146166 */
147167export const attemptNetworkSeedDerivation = async ({
@@ -149,6 +169,8 @@ export const attemptNetworkSeedDerivation = async ({
149169 wallet,
150170 authMnemonic,
151171 details,
172+ point,
173+ authToken,
152174 revision,
153175}) => {
154176 if (Just.hasInstance(urbitWallet)) {
@@ -156,12 +178,19 @@ export const attemptNetworkSeedDerivation = async ({
156178 }
157179
158180 if (Just.hasInstance(wallet) && Just.hasInstance(authMnemonic)) {
159− return await deriveNetworkSeedFromManagementMnemonic(
181+ const managementSeed = await deriveNetworkSeedFromManagementMnemonic(
160182 wallet.value,
161183 authMnemonic.value,
162184 details,
163185 revision
164186 );
187+ if (Just.hasInstance(managementSeed)) {
188+ return managementSeed;
189+ }
190+ }
191+
192+ if (Just.hasInstance(authToken)) {
193+ return deriveNetworkSeedFromAuthToken(point, authToken.value, revision);
165194 }
166195
167196 return Nothing();