@@ -1,6 +1,6 @@
1import React, { useState, useEffect, useCallback } from 'react';
1import React, { useState, useEffect, useCallback } from 'react';
2import { Grid } from 'indigo-react';
2import { Grid } from 'indigo-react';
3−import * as azimuth from 'azimuth-js';
3+import { azimuth, ecliptic } from 'azimuth-js';
4import * as ob from 'urbit-ob';
4import * as ob from 'urbit-ob';
6import View from 'components/View';
6import View from 'components/View';
@@ -29,6 +29,7 @@ import { GAS_LIMITS } from 'lib/constants';
29import Dropdown from 'components/L2/Dropdowns/Dropdown';
29import Dropdown from 'components/L2/Dropdowns/Dropdown';
30import { PointLayer } from 'lib/types/PointLayer';
30import { PointLayer } from 'lib/types/PointLayer';
31import Sigil from 'components/Sigil';
31import Sigil from 'components/Sigil';
32+import { isStar } from 'lib/utils/point';
33const DUMMY_L2_ADDRESS = '0x1111111111111111111111111111111111111111';
34const DUMMY_L2_ADDRESS = '0x1111111111111111111111111111111111111111';
@@ -61,13 +62,17 @@ const useMigrate = () => {
62 return useEthereumTransaction(
63 return useEthereumTransaction(
63 useCallback(
64 useCallback(
64− (selectedPoint: number) => {
65+ (selectedPoint: number, transfer: boolean) => {
65 setSelectedPoint(selectedPoint);
66 setSelectedPoint(selectedPoint);
68+ azimuth.getPointSize(selectedPoint) === azimuth.PointSize.Planet
69+ ? ecliptic.transferPoint(
66− return azimuth.ecliptic.setSpawnProxy(
75+ : ecliptic.setSpawnProxy(_contracts, selectedPoint, DUMMY_L2_ADDRESS);
72 [_contracts]
77 [_contracts]
@@ -86,12 +91,11 @@ export default function MigrateL2() {
86 const [hideMessage, setHideMessage] = useState(false);
91 const [hideMessage, setHideMessage] = useState(false);
87 const [selectedPoint, setSelectedPoint] = useState(point);
92 const [selectedPoint, setSelectedPoint] = useState(point);
88 const [showDropdown, setShowDropdown] = useState(false);
93 const [showDropdown, setShowDropdown] = useState(false);
94+ const [transfer, setTransfer] = useState(true);
90 const points = controlledPoints?.value?.value?.pointsWithLayers || [];
96 const points = controlledPoints?.value?.value?.pointsWithLayers || [];
91 const l1Points = points.filter(
97 const l1Points = points.filter(
92− ({ point, layer }: PointLayer) =>
98+ ({ point, layer }: PointLayer) => layer === 1 && isStar(point)
94− azimuth.azimuth.getPointSize(point) === azimuth.azimuth.PointSize.Star
97 const hideInfo = getHideMigrationMessage();
101 const hideInfo = getHideMigrationMessage();
@@ -100,7 +104,7 @@ export default function MigrateL2() {
101 useEffect(() => {
105 useEffect(() => {
102 if (point) {
106 if (point) {
103− construct(point);
107+ construct(point, transfer);
105 unconstruct();
109 unconstruct();
@@ -132,12 +136,19 @@ export default function MigrateL2() {
132 (point: number) => {
136 (point: number) => {
133 setSelectedPoint(point);
137 setSelectedPoint(point);
134 setShowDropdown(false);
138 setShowDropdown(false);
135− construct(point);
139+ construct(point, transfer);
137− [setSelectedPoint, setShowDropdown, construct]
141+ [setSelectedPoint, setShowDropdown, construct, transfer]
144+ const toggleTransfer = useCallback(() => {
145+ construct(selectedPoint, !transfer);
146+ setTransfer(!transfer);
147+ }, [transfer, setTransfer, construct, selectedPoint]);
140 const getContent = () => {
149 const getContent = () => {
150+ const star = isStar(selectedPoint);
141 if (l1Points.length === 0) {
152 if (l1Points.length === 0) {
143 <Box className="content">
154 <Box className="content">
@@ -167,11 +178,36 @@ export default function MigrateL2() {
169 </Dropdown>
180 </Dropdown>
182+ <Box className="transfer-spawn-selector">
184+ onClick={toggleTransfer}
185+ className={`transfer ${transfer ? 'selected' : ''}`}>
189+ onClick={toggleTransfer}
190+ className={`spawn ${!transfer ? 'selected' : ''}`}>
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.
171 <Grid.Item
205 <Grid.Item
173 as={InlineEthereumTransaction}
207 as={InlineEthereumTransaction}
209+ transfer ? 'Transfer point' : 'Set spawn proxy'
174− label="Migrate to Layer 2"
210+ } to Layer 2`}
175 {...bind}
211 {...bind}
176 onReturn={pop}
212 onReturn={pop}
@@ -184,7 +220,14 @@ export default function MigrateL2() {
184 <Box className="message">
220 <Box className="message">
185 You are about to migrate a node from Layer 1 to Layer 2. This will
221 You are about to migrate a node from Layer 1 to Layer 2. This will
186 make transactions faster and cheaper. Here are some things you should
222 make transactions faster and cheaper. Here are some things you should
187− know. <span className="bold">Learn More</span>
225+ className="bold"
228+ href="https://discord.com/channels/879614191672115260/879624035028324362">
189 {!hideInfo && (
232 {!hideInfo && (
190 <Box className="info-list">
233 <Box className="info-list">