on master help sign in
invite-flow: wip invite creation and acceptance
commit7f18d028aa4655f4fd77a8989a560353e3187fac authoryosoyubik <yosoyubik@gmail.com> dateTue 21 Sep 2021, 17:36 (5 years ago) parent2c72275
5 files changed+53−52
src/lib/useRoller.ts+9−11 src/lib/utils/roller.ts+11 src/react-app-env.d.ts+1 src/views/Activate/ActivateCodeForm.tsx+31−40 src/views/Activate/MasterKeyTransfer.tsx+1−1
src/lib/useRoller.ts+9−11
@@ -10,7 +10,7 @@ import { ensureHexPrefix } from 'form/formatters';
1010import { getOutgoingPoints } from 'views/Points';
1111import { isDevelopment, isRopsten } from './flags';
1212import { isPlanet } from './utils/point';
13−import { hasPoint } from './utils/roller';
13+import { hasPoint, generateInviteWallet } from './utils/roller';
1414import { ROLLER_HOSTS } from './constants';
1515import { signTransactionHash } from './authToken';
1616import { useNetwork } from 'store/network';
@@ -164,7 +164,7 @@ export default function useRoller() {
164164 const planet = planets[i];
165165 const nonceInc = i + nonce;
166166
167− const { ticket, owner } = await wg.generateTemporaryDeterministicWallet(
167+ const { ticket, owner } = await generateInviteWallet(
168168 planet,
169169 _authToken
170170 );
@@ -224,8 +224,6 @@ export default function useRoller() {
224224 contracts,
225225 pointCursor,
226226 wallet,
227− // walletHdPath,
228− // walletType,
229227 web3,
230228 getDetails,
231229 authMnemonic,
@@ -331,15 +329,16 @@ export default function useRoller() {
331329 if (isDevelopment) {
332330 console.log('POSSIBLE MISSING', possibleMissingInvites);
333331 }
334−
332+ // TODO: this can be verym slow, so best to allow the user to manually
333+ // reveal the ticket, after checking if the invite is still "active"
334+ // (i.e. if the address inferred from the derived inviteWallet corresponds to
335+ // to the address the point has as owner)
336+ //
335337 for (let i = 0; i < possibleMissingInvites.length; i++) {
336338 const planet = possibleMissingInvites[i];
337339 if (!availableInvites.find(hasPoint(planet))) {
338340 console.log('MISSING IN AVAILABLE', planet);
339− const {
340− ticket,
341− owner,
342− } = await wg.generateTemporaryDeterministicWallet(
341+ const { ticket, owner } = await generateInviteWallet(
343342 planet,
344343 _authToken
345344 );
@@ -401,7 +400,6 @@ export default function useRoller() {
401400 toWallet,
402401 }: AcceptInviteParams) => {
403402 const azimuthPoint = await api.getPoint(point);
404− const spawnerPatp = ob.patp(azimuthPoint?.network?.sponsor?.who);
405403 console.log('azimuthPoint', azimuthPoint);
406404 const ownerAddress = azimuthPoint?.ownership?.owner?.address!;
407405
@@ -415,7 +413,7 @@ export default function useRoller() {
415413 const networkRevision = convertToInt(azimuthPoint.network.keys.life, 10);
416414 const nextRevision = networkRevision + 1;
417415 const fromOwnerProxy: From = {
418− ship: spawnerPatp,
416+ ship: point,
419417 proxy: 'own',
420418 };
421419
src/lib/utils/roller.ts+11
@@ -8,6 +8,10 @@ import {
88 CRYPTO_SUITE_VERSION,
99} from 'lib/keys';
1010import { addHexPrefix } from 'lib/utils/address';
11+import {
12+ makeDeterministicTicket,
13+ generateOwnershipWallet,
14+} from 'lib/walletgen';
1115
1216export const SECOND = 1000;
1317export const MINUTE = SECOND * 60;
@@ -29,6 +33,13 @@ export const getTimeToNextBatch = (nextBatch: number, now: number) => {
2933
3034export const isL2 = (dom?: string) => dom === 'l2' || dom === 'spawn';
3135
36+export const generateInviteWallet = async (point: number, seed: string) => {
37+ const ticket = makeDeterministicTicket(point, seed);
38+ const owner = await generateOwnershipWallet(point, ticket);
39+
40+ return { ticket, owner };
41+};
42+
3243export const spawn = async (
3344 api: any,
3445 _wallet: any,
src/react-app-env.d.ts+1
@@ -1 +1,2 @@
11/// <reference types="react-scripts" />
2+declare module 'folktale/maybe';
src/views/Activate/ActivateCodeForm.tsx+31−40
@@ -1,4 +1,3 @@
1−import * as azimuth from 'azimuth-js';
21import * as need from 'lib/need';
32import * as ob from 'urbit-ob';
43import { WARNING } from 'form/helpers';
@@ -19,13 +18,10 @@ import { useActivateFlow } from './ActivateFlow';
1918import WarningBox from 'components/WarningBox';
2019import useRoller from 'lib/useRoller';
2120import useImpliedTicket from 'lib/useImpliedTicket';
22−import {
23− generateTemporaryOwnershipWallet,
24− generateWallet,
25−} from 'lib/walletgen';
21+import { generateOwnershipWallet } from 'lib/walletgen';
22+import { generateWallet } from 'lib/invite';
2623import { walletFromMnemonic } from 'lib/wallet';
27−import { useNetwork } from 'store/network';
28−import { DEFAULT_HD_PATH, POINT_DOMINIONS, POINT_PROXIES } from 'lib/constants';
24+import { DEFAULT_HD_PATH, POINT_PROXIES } from 'lib/constants';
2925import useBreakpoints from 'lib/useBreakpoints';
3026import { Ship } from '@urbit/roller-api';
3127import { convertToInt } from 'lib/convertToInt';
@@ -39,9 +35,13 @@ interface ActivateCodeFormProps {
3935}
4036
4137const ActivateCodeForm = ({ afterSubmit }: ActivateCodeFormProps) => {
42− const { contracts } = useNetwork();
4338 const { api, getPoints } = useRoller();
44− const { impliedAzimuthPoint, impliedTicket } = useImpliedTicket();
39+ const {
40+ impliedAzimuthPoint,
41+ impliedTicket,
42+ impliedPatp,
43+ } = useImpliedTicket();
44+ console.log(impliedAzimuthPoint, impliedTicket);
4545 const didWarn = useRef<boolean>(false);
4646
4747 const {
@@ -80,27 +80,23 @@ const ActivateCodeForm = ({ afterSubmit }: ActivateCodeFormProps) => {
8080 [validateForm]
8181 );
8282
83− const loadL1Points = useCallback(
84− async (address: string): Promise<number[]> => {
85− const _contracts = need.contracts(contracts);
86− const owned = await azimuth.azimuth.getOwnedPoints(_contracts, address);
87− const transferring = await azimuth.azimuth.getTransferringFor(
88− _contracts,
89− address
90− );
91− const incoming = [...owned, ...transferring];
92− console.log('incoming L1 points', incoming);
93− return incoming;
94− },
95− [contracts]
96− );
97−
98− const loadl2points = useCallback(
83+ const getTicketAndPoint = (invite: string) => {
84+ const segments = invite.split('-');
85+ console.log(segments);
86+ return {
87+ ticket: segments.slice(0, 4).join('-'),
88+ point: impliedPatp
89+ ? ob.patp2dec(impliedPatp)
90+ : ob.patp2dec(`~${segments.slice(4, segments.length).join('-')}`),
91+ };
92+ };
93+
94+ const loadPoints = useCallback(
9995 async (address: string): Promise<Ship[]> => {
10096 const owned = await getPoints(POINT_PROXIES.OWN, address);
10197 const transferring = await getPoints(POINT_PROXIES.TRANSFER, address);
10298 const incoming = [...owned, ...transferring];
103− console.log('incoming L2 points', incoming);
99+ console.log('incoming points', incoming);
104100 return incoming;
105101 },
106102 [getPoints]
@@ -113,21 +109,16 @@ const ActivateCodeForm = ({ afterSubmit }: ActivateCodeFormProps) => {
113109 await timeout(42);
114110
115111 // Derive wallet
116− const ticket = impliedTicket || values.ticket;
117− const { seed } = await generateTemporaryOwnershipWallet(ticket);
112+ const { ticket, point } = getTicketAndPoint(
113+ impliedTicket || values.ticket
114+ );
115+ const { seed } = await generateOwnershipWallet(point, ticket);
118116 const inviteWallet = walletFromMnemonic(seed, DEFAULT_HD_PATH);
119117 setInviteWallet(inviteWallet);
120118 const _inviteWallet = need.wallet(inviteWallet);
121119 const inviteAddress = _inviteWallet.address;
122120
123− // Query for points depending on point's dominion
124− const rollerPoint = await api.getPoint(impliedAzimuthPoint!);
125− let incoming: number[] | Ship[];
126− if (rollerPoint.dominion === POINT_DOMINIONS.L2) {
127− incoming = await loadl2points(inviteAddress);
128− } else {
129− incoming = await loadL1Points(inviteAddress);
130− }
121+ let incoming: number[] | Ship[] = await loadPoints(inviteAddress);
131122
132123 // Set derived
133124 if (incoming.length > 0) {
@@ -143,11 +134,12 @@ const ActivateCodeForm = ({ afterSubmit }: ActivateCodeFormProps) => {
143134 }
144135
145136 const point = convertToInt(incoming[0], 10);
137+ const rollerPoint = await api.getPoint(point!);
146138
147139 setDerivedPatp(Just(ob.patp(point)));
148140 setDerivedPoint(Just(point));
149141 setDerivedPointDominion(Just(rollerPoint.dominion));
150− setDerivedWallet(Just(await generateWallet(point, ticket, true)));
142+ setDerivedWallet(Just(await generateWallet(point, true)));
151143 setIsIn(false);
152144 await timeout(100);
153145 } else {
@@ -160,10 +152,9 @@ const ActivateCodeForm = ({ afterSubmit }: ActivateCodeFormProps) => {
160152 },
161153 [
162154 api,
163− impliedAzimuthPoint,
164155 impliedTicket,
165− loadL1Points,
166− loadl2points,
156+ getTicketAndPoint,
157+ loadPoints,
167158 setDerivedPatp,
168159 setDerivedPoint,
169160 setDerivedPointDominion,
src/views/Activate/MasterKeyTransfer.tsx+1−1
@@ -29,7 +29,7 @@ const MasterKeyTransfer = () => {
2929 try {
3030 await acceptInvite({
3131 point: derivedPoint.value,
32− to: derivedWallet.value.ownership.address,
32+ to: derivedWallet.value.ownership.keys.address,
3333 toWallet: derivedWallet.value,
3434 fromWallet: inviteWallet.value,
3535 });