@@ -6,6 +6,7 @@ import * as serial from '../nockjs/serial';
6import * as kg from 'urbit-key-generation';
6import * as kg from 'urbit-key-generation';
8import { eqAddr, addHexPrefix } from './wallet';
8import { eqAddr, addHexPrefix } from './wallet';
9+import { shas } from './networkCode';
10// the curve param for the network keys
11// the curve param for the network keys
11export const NETWORK_KEY_CURVE_PARAMETER = '42';
12export const NETWORK_KEY_CURVE_PARAMETER = '42';
@@ -142,6 +143,25 @@ const deriveNetworkSeedFromMnemonic = async (
146+ * @param {number} point
147+ * @param {string} authToken
148+ * @param {number} revision
149+ * @return {Maybe<string>}
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)
159+ return Just(networkSeed);
163+ * Derives from either a full Urbit Wallet, a current management mnemonic,
164+ * or an auth token, in that order of preference.
145 * @return {Promise<Maybe<string>>}
165 * @return {Promise<Maybe<string>>}
147export const attemptNetworkSeedDerivation = async ({
167export const attemptNetworkSeedDerivation = async ({
@@ -149,6 +169,8 @@ export const attemptNetworkSeedDerivation = async ({
150 authMnemonic,
170 authMnemonic,
152 revision,
174 revision,
154 if (Just.hasInstance(urbitWallet)) {
176 if (Just.hasInstance(urbitWallet)) {
@@ -156,12 +178,19 @@ export const attemptNetworkSeedDerivation = async ({
158 if (Just.hasInstance(wallet) && Just.hasInstance(authMnemonic)) {
180 if (Just.hasInstance(wallet) && Just.hasInstance(authMnemonic)) {
159− return await deriveNetworkSeedFromManagementMnemonic(
181+ const managementSeed = await deriveNetworkSeedFromManagementMnemonic(
160 wallet.value,
182 wallet.value,
161 authMnemonic.value,
183 authMnemonic.value,
187+ if (Just.hasInstance(managementSeed)) {
188+ return managementSeed;
192+ if (Just.hasInstance(authToken)) {
193+ return deriveNetworkSeedFromAuthToken(point, authToken.value, revision);
167 return Nothing();
196 return Nothing();