on master help sign in
Merge pull request #197 from urbit/feat/indigo-admin-passphrase-keys

Fix issues around networking key derivation

commit25822488050699c346dded22361c4627630eeb95 authorFang <Fang-@users.noreply.github.com> dateThu 18 Jul 2019, 21:20 (7 years ago) parentb87ca5ca4c9ba2
5 files changed+26−9
src/lib/keys.js+15−3 src/lib/reticket.js+2−4 src/lib/wallet.js+1 src/views/Admin/AdminNetworkingKeys.js+1−1 src/views/Admin/Reticket/ReticketExecute.js+7−1
src/lib/keys.js+15−3
@@ -92,6 +92,7 @@ export const deriveNetworkSeedFromUrbitWallet = async (
9292) => {
9393 return await deriveNetworkSeedFromMnemonic(
9494 urbitWallet.management.seed,
95+ urbitWallet.meta.passphrase,
9596 revision
9697 );
9798};
@@ -113,7 +114,11 @@ export const deriveNetworkSeedFromManagementMnemonic = async (
113114
114115 // the network seed is derivable iff this mnemonic is the management proxy
115116 if (isManagementProxy) {
116− return await deriveNetworkSeedFromMnemonic(authMnemonic, revision);
117+ return await deriveNetworkSeedFromMnemonic(
118+ authMnemonic,
119+ wallet.passphrase,
120+ revision
121+ );
117122 }
118123
119124 return Nothing();
@@ -124,8 +129,15 @@ export const deriveNetworkSeedFromManagementMnemonic = async (
124129 * @param {number} revision
125130 * @return {Promise<Maybe<string>>}
126131 */
127−const deriveNetworkSeedFromMnemonic = async (mnemonic, revision) => {
128− return Just(await kg.deriveNetworkSeed(mnemonic, '', revision));
132+const deriveNetworkSeedFromMnemonic = async (
133+ mnemonic,
134+ passphrase,
135+ revision
136+) => {
137+ //NOTE revision is the point's on-chain revision number. since common uhdw
138+ // usage derives the first key at revision/index 0, we need to decrement
139+ // the on-chain revision number by one to get the number to derive with.
140+ return Just(await kg.deriveNetworkSeed(mnemonic, passphrase, revision - 1));
129141};
130142
131143/**
src/lib/reticket.js+2−4
@@ -33,6 +33,7 @@ export async function reticketPointBetweenWallets({
3333 contracts,
3434 onUpdate,
3535 transferEth = false,
36+ nextRevision = INITIAL_NETWORK_KEY_REVISION,
3637}) {
3738 const askForFunding = (address, minBalance, balance) =>
3839 onUpdate({
@@ -65,10 +66,7 @@ export async function reticketPointBetweenWallets({
6566 transferTmpTx.gas = GAS_LIMITS.TRANSFER;
6667
6768 // configure networking public keys
68− const seed = await deriveNetworkSeedFromUrbitWallet(
69− toWallet,
70− INITIAL_NETWORK_KEY_REVISION
71− );
69+ const seed = await deriveNetworkSeedFromUrbitWallet(toWallet, nextRevision);
7270
7371 const networkSeed = seed.matchWith({
7472 Nothing: () => {
src/lib/wallet.js+1
@@ -91,6 +91,7 @@ export const walletFromMnemonic = (mnemonic, hdpath, passphrase) => {
9191 const hd = bip32.fromSeed(sd);
9292 wal = hd.derivePath(path);
9393 wal.address = addressFromSecp256k1Public(wal.publicKey);
94+ wal.passphrase = passphrase || '';
9495 wal = Just(wal);
9596 } catch (_) {
9697 wal = Nothing();
src/views/Admin/AdminNetworkingKeys.js+1−1
@@ -95,7 +95,7 @@ function useSetKeys() {
9595 wallet,
9696 authMnemonic,
9797 details,
98− revision: networkRevision + 1,
98+ revision: networkRevision,
9999 });
100100
101101 return networkSeed.matchWith({
src/views/Admin/Reticket/ReticketExecute.js+7−1
@@ -13,6 +13,7 @@ import useLifecycle from 'lib/useLifecycle';
1313import { useNetwork } from 'store/network';
1414import { useWallet } from 'store/wallet';
1515import { usePointCursor } from 'store/pointCursor';
16+import { usePointCache } from 'store/pointCache';
1617import { useHistory } from 'store/history';
1718
1819import { RestartButton, ForwardButton } from 'components/Buttons';
@@ -44,6 +45,7 @@ export default function ReticketExecute({ newWallet, setNewWallet }) {
4445 const { web3, contracts } = useNetwork();
4546 const { wallet, setWalletType, resetWallet, setUrbitWallet } = useWallet();
4647 const { pointCursor } = usePointCursor();
48+ const { getDetails } = usePointCache();
4749
4850 const [generalError, setGeneralError] = useState();
4951 const [progress, setProgress] = useState(0);
@@ -53,14 +55,18 @@ export default function ReticketExecute({ newWallet, setNewWallet }) {
5355 // start reticketing transactions on mount
5456 useLifecycle(() => {
5557 (async () => {
58+ const point = need.point(pointCursor);
59+ const details = need.details(getDetails(point));
60+ const networkRevision = parseInt(details.keyRevisionNumber, 10);
5661 try {
5762 await reticketPointBetweenWallets({
5863 fromWallet: need.wallet(wallet),
5964 toWallet: newWallet.value.wallet,
60− point: need.point(pointCursor),
65+ point: point,
6166 web3: need.web3(web3),
6267 contracts: need.contracts(contracts),
6368 onUpdate: handleUpdate,
69+ nextRevision: networkRevision + 1,
6470 });
6571 } catch (err) {
6672 setGeneralError(err);