@@ -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">