on master help sign in
Added more info for point transfer
commitdd5f6efa4c956621b493f604c07f0239b9e7a830 authorWill Galebach <willbach@gmail.com> dateMon 13 Sep 2021, 21:45 (5 years ago) parent938c098
10 files changed+112−30
src/components/L2/Dropdowns/AccountsDropdown.tsx+4−1 src/components/L2/Headers/L2PointHeader.tsx+3−5 src/components/Passport.js+4−5 src/components/WithTooltip.tsx+3 src/components/copiable/CopiableAddress.js+2−1 src/components/copiable/CopiableWithTooltip.js+2−1 src/lib/utils/point.ts+4 src/views/Point/MigrateL2.scss+30 src/views/Point/MigrateL2.tsx+58−15 src/views/UrbitOS/ChangeSponsor.js+2−2
src/components/L2/Dropdowns/AccountsDropdown.tsx+4−1
@@ -8,6 +8,7 @@ import { Just } from 'folktale/maybe';
88import Sigil from 'components/Sigil';
99import LayerIndicator from 'components/L2/LayerIndicator';
1010import CopiableAddressWrap from 'components/copiable/CopiableAddressWrap';
11+import { TooltipPosition } from 'components/WithTooltip';
1112
1213import { useWallet } from 'store/wallet';
1314import { useHistory } from 'store/history';
@@ -88,7 +89,9 @@ const AccountsDropdown = ({ showMigrate = false }: AccountsDropdownProps) => {
8889 open={open}
8990 value={currentAddress.slice(0, 6)}
9091 toggleOpen={() => setOpen(!open)}>
91− <CopiableAddressWrap className="current-address">
92+ <CopiableAddressWrap
93+ className="current-address"
94+ position={TooltipPosition.Left}>
9295 {displayAddress}
9396 </CopiableAddressWrap>
9497 <Box className="divider" />
src/components/L2/Headers/L2PointHeader.tsx+3−5
@@ -1,5 +1,4 @@
11import React, { useEffect, useCallback } from 'react';
2−import { azimuth } from 'azimuth-js';
32import { Box, Row } from '@tlon/indigo-react';
43
54import useRoller from 'lib/useRoller';
@@ -12,6 +11,7 @@ import { useRollerStore } from 'store/roller';
1211import './L2PointHeader.scss';
1312import { isDevelopment } from 'lib/flags';
1413import { usePointCursor } from 'store/pointCursor';
14+import { isStar } from 'lib/utils/point';
1515
1616export interface L2PointHeaderProps {
1717 numInvites: number;
@@ -47,15 +47,13 @@ const L2PointHeader = ({
4747 push,
4848 ]);
4949
50− const isStar =
51− pointCursor?.value &&
52− azimuth.getPointSize(pointCursor?.value) === azimuth.PointSize.Star;
50+ const star = pointCursor?.value && isStar(pointCursor.value);
5351
5452 return (
5553 <Row className="l2-point-header">
5654 <AccountsDropdown showMigrate={showMigrate} />
5755 <Row className="info">
58− {!hideInvites && isStar && (
56+ {!hideInvites && star && (
5957 <Row onClick={goToInvites} className="invites">
6058 <InviteIcon />
6159 {numInvites}
src/components/Passport.js+4−5
@@ -216,12 +216,11 @@ const Cell = props => {
216216 */
217217function MiniPassport({ point, inverted, locked = false, ...rest }) {
218218 useSyncDetails([point]);
219− const { wallet } = useWallet();
220− const address = need.addressFromWallet(wallet);
221−
219+ // const { wallet } = useWallet();
220+ // const address = need.addressFromWallet(wallet);
221+ // const permissions = usePermissionsForPoint(address, point);
222+ // const keyType = buildKeyType(permissions);
222223 const patp = ob.patp(point);
223− const permissions = usePermissionsForPoint(address, point);
224− const keyType = buildKeyType(permissions);
225224
226225 const contrast = locked ? '#666666' : 'black';
227226
src/components/WithTooltip.tsx+3
@@ -4,6 +4,7 @@ import { useMemo } from 'react';
44export enum TooltipPosition {
55 Top,
66 TopRight,
7+ Left,
78 // Add more as necessary here and in #positionStyle
89}
910
@@ -30,6 +31,8 @@ export default function WithTooltip({
3031 return { bottom: '100%' };
3132 case TooltipPosition.TopRight:
3233 return { bottom: '90%', left: '90%' };
34+ case TooltipPosition.Left:
35+ return { bottom: '-67%', left: '-400%' };
3336 default:
3437 return { bottom: '100%' };
3538 }
src/components/copiable/CopiableAddress.js+2−1
@@ -3,9 +3,10 @@ import cn from 'classnames';
33
44import CopiableWithTooltip from './CopiableWithTooltip';
55
6−export default function CopiableAddress({ className, ...rest }) {
6+export default function CopiableAddress({ className, position, ...rest }) {
77 return (
88 <CopiableWithTooltip
9+ position={position}
910 className={cn(className, 'mono', 'nowrap')}
1011 {...rest}
1112 />
src/components/copiable/CopiableWithTooltip.js+2−1
@@ -9,6 +9,7 @@ export default function CopiableWithTooltip({
99 text,
1010 children,
1111 className,
12+ position,
1213 ...rest
1314}) {
1415 const [doCopy, didCopy] = useCopiable(text || children);
@@ -16,7 +17,7 @@ export default function CopiableWithTooltip({
1617 return (
1718 <As className={className} {...rest}>
1819 {children}
19− <WithTooltip content={didCopy ? 'Copied!' : 'Copy'}>
20+ <WithTooltip position={position} content={didCopy ? 'Copied!' : 'Copy'}>
2021 <Icon
2122 icon="Copy"
2223 style={{ height: '1em', width: '1em' }}
src/lib/utils/point.tsnew file+4
@@ -0,0 +1,4 @@
1+import { azimuth } from 'azimuth-js';
2+
3+export const isStar = (point: number) =>
4+ azimuth.getPointSize(point) === azimuth.PointSize.Star;
src/views/Point/MigrateL2.scss+30
@@ -143,6 +143,36 @@
143143 }
144144 }
145145
146+ .transfer-spawn-selector {
147+ display: flex;
148+ flex-direction: row;
149+
150+ .transfer, .spawn {
151+ margin: 16px 0px;
152+ cursor: pointer;
153+ border-radius: $medium-border-radius;
154+ color: white;
155+ background-color: $light-gray;
156+ padding: 4px 8px;
157+
158+ &:hover {
159+ opacity: 0.8;
160+ }
161+
162+ &.selected {
163+ background-color: black;
164+
165+ &:hover {
166+ opacity: 1;
167+ }
168+ }
169+ }
170+
171+ .transfer {
172+ margin-right: 8px;
173+ }
174+ }
175+
146176 .dropdown {
147177 margin-top: 4px;
148178 &.migrate-selector .dropdown-content {
src/views/Point/MigrateL2.tsx+58−15
@@ -1,6 +1,6 @@
11import React, { useState, useEffect, useCallback } from 'react';
22import { Grid } from 'indigo-react';
3−import * as azimuth from 'azimuth-js';
3+import { azimuth, ecliptic } from 'azimuth-js';
44import * as ob from 'urbit-ob';
55
66import View from 'components/View';
@@ -29,6 +29,7 @@ import { GAS_LIMITS } from 'lib/constants';
2929import Dropdown from 'components/L2/Dropdowns/Dropdown';
3030import { PointLayer } from 'lib/types/PointLayer';
3131import Sigil from 'components/Sigil';
32+import { isStar } from 'lib/utils/point';
3233
3334const DUMMY_L2_ADDRESS = '0x1111111111111111111111111111111111111111';
3435
@@ -61,13 +62,17 @@ const useMigrate = () => {
6162
6263 return useEthereumTransaction(
6364 useCallback(
64− (selectedPoint: number) => {
65+ (selectedPoint: number, transfer: boolean) => {
6566 setSelectedPoint(selectedPoint);
66− return azimuth.ecliptic.setSpawnProxy(
67− _contracts,
68− selectedPoint,
69− DUMMY_L2_ADDRESS
70− );
67+ return transfer ||
68+ azimuth.getPointSize(selectedPoint) === azimuth.PointSize.Planet
69+ ? ecliptic.transferPoint(
70+ _contracts,
71+ selectedPoint,
72+ DUMMY_L2_ADDRESS,
73+ false
74+ )
75+ : ecliptic.setSpawnProxy(_contracts, selectedPoint, DUMMY_L2_ADDRESS);
7176 },
7277 [_contracts]
7378 ),
@@ -86,12 +91,11 @@ export default function MigrateL2() {
8691 const [hideMessage, setHideMessage] = useState(false);
8792 const [selectedPoint, setSelectedPoint] = useState(point);
8893 const [showDropdown, setShowDropdown] = useState(false);
94+ const [transfer, setTransfer] = useState(true);
8995
9096 const points = controlledPoints?.value?.value?.pointsWithLayers || [];
9197 const l1Points = points.filter(
92− ({ point, layer }: PointLayer) =>
93− layer === 1 &&
94− azimuth.azimuth.getPointSize(point) === azimuth.azimuth.PointSize.Star
98+ ({ point, layer }: PointLayer) => layer === 1 && isStar(point)
9599 );
96100
97101 const hideInfo = getHideMigrationMessage();
@@ -100,7 +104,7 @@ export default function MigrateL2() {
100104
101105 useEffect(() => {
102106 if (point) {
103− construct(point);
107+ construct(point, transfer);
104108 } else {
105109 unconstruct();
106110 }
@@ -132,12 +136,19 @@ export default function MigrateL2() {
132136 (point: number) => {
133137 setSelectedPoint(point);
134138 setShowDropdown(false);
135− construct(point);
139+ construct(point, transfer);
136140 },
137− [setSelectedPoint, setShowDropdown, construct]
141+ [setSelectedPoint, setShowDropdown, construct, transfer]
138142 );
139143
144+ const toggleTransfer = useCallback(() => {
145+ construct(selectedPoint, !transfer);
146+ setTransfer(!transfer);
147+ }, [transfer, setTransfer, construct, selectedPoint]);
148+
140149 const getContent = () => {
150+ const star = isStar(selectedPoint);
151+
141152 if (l1Points.length === 0) {
142153 return (
143154 <Box className="content">
@@ -167,11 +178,36 @@ export default function MigrateL2() {
167178 />
168179 ))}
169180 </Dropdown>
181+ {star && (
182+ <Box className="transfer-spawn-selector">
183+ <Box
184+ onClick={toggleTransfer}
185+ className={`transfer ${transfer ? 'selected' : ''}`}>
186+ Transfer Point
187+ </Box>
188+ <Box
189+ onClick={toggleTransfer}
190+ className={`spawn ${!transfer ? 'selected' : ''}`}>
191+ Set Spawn Proxy
192+ </Box>
193+ </Box>
194+ )}
195+ {star && (
196+ <Box>
197+ Transferring this point will allow you to conduct all
198+ transactions on Layer 2 and is irreversible. Setting the spawn
199+ proxy of a star to the Layer 2 contract is reversible, will
200+ allow you to create planet invites for free, but will require
201+ you to do all other transactions on Layer 1.
202+ </Box>
203+ )}
170204 </Box>
171205 <Grid.Item
172206 full
173207 as={InlineEthereumTransaction}
174− label="Migrate to Layer 2"
208+ label={`${
209+ transfer ? 'Transfer point' : 'Set spawn proxy'
210+ } to Layer 2`}
175211 {...bind}
176212 onReturn={pop}
177213 />
@@ -184,7 +220,14 @@ export default function MigrateL2() {
184220 <Box className="message">
185221 You are about to migrate a node from Layer 1 to Layer 2. This will
186222 make transactions faster and cheaper. Here are some things you should
187− know. <span className="bold">Learn More</span>
223+ know.{' '}
224+ <a
225+ className="bold"
226+ target="_blank"
227+ rel="noreferrer"
228+ href="https://discord.com/channels/879614191672115260/879624035028324362">
229+ Learn More
230+ </a>
188231 </Box>
189232 {!hideInfo && (
190233 <Box className="info-list">
src/views/UrbitOS/ChangeSponsor.js+2−2
@@ -22,6 +22,7 @@ import * as need from 'lib/need';
2222import { validateMinimumPatpByteLength } from 'lib/validators';
2323import { usePointCursor } from 'store/pointCursor';
2424import useEthereumTransaction from 'lib/useEthereumTransaction';
25+import { isStar } from 'lib/utils/point';
2526
2627function useChangeSponsor() {
2728 const { contracts } = useNetwork();
@@ -73,8 +74,7 @@ function ChangeSponsor({ onDone }) {
7374 );
7475
7576 const validate = useMemo(() => {
76− const sponsorSize =
77− azimuth.getPointSize(point) === azimuth.PointSize.Star ? 1 : 2;
77+ const sponsorSize = isStar(point) ? 1 : 2;
7878 return composeValidator(
7979 {
8080 sponsor: buildPointValidator(sponsorSize, [