on master help sign in
activate:

It would be ideal to refactor `useRoller#performL2Reticket` to accept an `UrbitWallet`, but for now this change restores the creation of a BIP32 Interface wallet for sending transactions during the Activate Transfer phase. tested and confirmed on L2 mainnet

commitf3fddfeee46c0e21e4256a0a33250f8b40e64253 authortomholford <tomholford@users.noreply.github.com> dateThu 16 Dec 2021, 16:59 (5 years ago) parenta2920a4
4 files changed+40−15
src/lib/types/L2Transaction.ts+3−2 src/views/Activate/ActivateCodeForm.tsx+9−2 src/views/Activate/MasterKeyTransfer.tsx+3−8 src/views/Activate/useActivateFlowState.js+25−3
src/lib/types/L2Transaction.ts+3−2
@@ -1,5 +1,6 @@
11import RollerRPCAPI, { EthAddress, Proxy, Ship } from '@urbit/roller-api';
22import WalletConnect from '@walletconnect/client';
3+import BridgeWallet from './BridgeWallet';
34
45export type TransactionType =
56 | 'transferPoint'
@@ -43,6 +44,6 @@ export interface ReticketParams {
4344 point: Ship;
4445 to: EthAddress;
4546 manager: EthAddress;
46− fromWallet: UrbitWallet;
47− toWallet: any; // TODO: wallet type
47+ fromWallet: BridgeWallet;
48+ toWallet: UrbitWallet;
4849}
src/views/Activate/ActivateCodeForm.tsx+9−2
@@ -19,8 +19,8 @@ import WarningBox from 'components/WarningBox';
1919import useRoller from 'lib/useRoller';
2020import useImpliedTicket from 'lib/useImpliedTicket';
2121import { generateWallet } from 'lib/walletgen';
22−import { urbitWalletFromTicket } from 'lib/wallet';
23−import { POINT_PROXIES } from 'lib/constants';
22+import { urbitWalletFromTicket, walletFromMnemonic } from 'lib/wallet';
23+import { DEFAULT_HD_PATH, POINT_PROXIES } from 'lib/constants';
2424import useBreakpoints from 'lib/useBreakpoints';
2525import { Ship } from '@urbit/roller-api';
2626import { convertToInt } from 'lib/convertToInt';
@@ -45,6 +45,7 @@ const ActivateCodeForm = ({ afterSubmit }: ActivateCodeFormProps) => {
4545 setDerivedWallet,
4646 setInviteWallet,
4747 setIsIn,
48+ setSendWallet,
4849 } = useActivateFlow();
4950
5051 // this is a pretty naive way to detect if we're on a mobile device
@@ -114,6 +115,12 @@ const ActivateCodeForm = ({ afterSubmit }: ActivateCodeFormProps) => {
114115 const _inviteWallet: UrbitWallet = need.wallet(inviteWallet);
115116 const inviteAddress = _inviteWallet.ownership.keys.address;
116117
118+ const sendWallet = await walletFromMnemonic(
119+ _inviteWallet.ownership.seed,
120+ DEFAULT_HD_PATH
121+ );
122+ setSendWallet(sendWallet);
123+
117124 let incoming = await loadPoints(inviteAddress);
118125
119126 // Set derived
src/views/Activate/MasterKeyTransfer.tsx+3−8
@@ -20,7 +20,7 @@ const MasterKeyTransfer = () => {
2020 derivedPatp,
2121 derivedPoint,
2222 derivedWallet,
23− inviteWallet,
23+ sendWallet,
2424 } = useActivateFlow();
2525 const [error, setError] = useState();
2626
@@ -33,18 +33,13 @@ const MasterKeyTransfer = () => {
3333 to: derivedWallet.value.ownership.keys.address,
3434 manager: derivedWallet.value.management.keys.address,
3535 toWallet: derivedWallet.value,
36− fromWallet: inviteWallet.value,
36+ fromWallet: sendWallet.value,
3737 });
3838 } catch (e) {
3939 console.error(e);
4040 setError(e);
4141 }
42− }, [
43− derivedWallet,
44− performL2Reticket,
45− derivedPoint.value,
46− inviteWallet.value,
47− ]);
42+ }, [derivedWallet, performL2Reticket, derivedPoint.value, sendWallet.value]);
4843
4944 useFadeIn();
5045
src/views/Activate/useActivateFlowState.js+25−3
@@ -4,13 +4,30 @@ import { Nothing } from 'folktale/maybe';
44export default function useActivateFlowState() {
55 const [derivedPatp, setDerivedPatp] = useState(Nothing());
66 const [derivedPoint, setDerivedPoint] = useState(Nothing());
7− const [derivedPointDominion, setDerivedPointDominion] = useState(Nothing());
8− const [derivedWallet, setDerivedWallet] = useState(Nothing());
97 const [generated, setGenerated] = useState(false);
108 const [incomingPoints, setIncomingPoints] = useState(Nothing());
11− const [inviteWallet, setInviteWallet] = useState(Nothing());
9+ const [derivedPointDominion, setDerivedPointDominion] = useState(Nothing());
1210 const [isIn, setIsIn] = useState(false);
1311
12+ // A new wallet generated after confirming that the invite ticket is valid
13+ // and the point is available for activation.
14+ // At the end of the Activate flow, the point will be transferred
15+ // from the invite wallet to the derived wallet. When the user confirms
16+ // the Master Key (ticket) and downloads the passport / mnemonic,
17+ // it is for the derived wallet
18+ // type UrbitWallet
19+ const [derivedWallet, setDerivedWallet] = useState(Nothing());
20+ // The wallet generated deterministically during the invite flow;
21+ // it is re-generated when the user starts the Activate flow. It is used
22+ // to derive and confirm a shareable ticket that a user can activate a point with.
23+ // type UrbitWallet
24+ const [inviteWallet, setInviteWallet] = useState(Nothing());
25+ // This wallet is generated from the invite wallet's seed phrase.
26+ // It is used during the transfer phase of the invite flow to send transactions.
27+ // useMultiKeyFileGenerator.
28+ // type bip32.BIP32Interface
29+ const [sendWallet, setSendWallet] = useState(Nothing());
30+
1431 const reset = useCallback(() => {
1532 setDerivedPatp(Nothing());
1633 setDerivedPoint(Nothing());
@@ -19,13 +36,16 @@ export default function useActivateFlowState() {
1936 setGenerated(false);
2037 setIncomingPoints(Nothing());
2138 setInviteWallet(Nothing());
39+ setSendWallet(Nothing());
2240 }, [
41+ setDerivedPatp,
2342 setDerivedPoint,
2443 setDerivedPointDominion,
2544 setDerivedWallet,
2645 setGenerated,
2746 setIncomingPoints,
2847 setInviteWallet,
48+ setSendWallet,
2949 ]);
3050
3151 return {
@@ -38,6 +58,7 @@ export default function useActivateFlowState() {
3858 inviteWallet,
3959 isIn,
4060 reset,
61+ sendWallet,
4162 setDerivedPatp,
4263 setDerivedPoint,
4364 setDerivedPointDominion,
@@ -46,5 +67,6 @@ export default function useActivateFlowState() {
4667 setIncomingPoints,
4768 setInviteWallet,
4869 setIsIn,
70+ setSendWallet,
4971 };
5072}