on master help sign in
Get superset of L1 and L2 points
8da9642Will Galebach
src/components/InlineEthereumTransaction.js+32−22
@@ -221,18 +221,16 @@ export default function InlineEthereumTransaction({
221 {renderPrimarySection()}
221 {renderPrimarySection()}
222
222
223 {error && (
223 {error && (
224− <Grid.Item
225− className="eth-tx-button" full as={ErrorText} className="mv1">
224+ <Grid.Item className="mv1 eth-tx-button" full as={ErrorText}>
226 {error.message}
225 {error.message}
227 </Grid.Item>
226 </Grid.Item>
228 )}
227 )}
229
228
230 {needFunds && (
229 {needFunds && (
231 <Grid.Item
230 <Grid.Item
232− className="eth-tx-button"
231+ className="mt3 eth-tx-button"
233 full
232 full
234 as={NeedFundsNotice}
233 as={NeedFundsNotice}
235− className="mt3"
236 {...needFunds}
234 {...needFunds}
237 />
235 />
238 )}
236 )}
@@ -251,16 +249,14 @@ export default function InlineEthereumTransaction({
251 />
249 />
252
250
253 <Condition when="useAdvanced" is={true}>
251 <Condition when="useAdvanced" is={true}>
254− <Grid.Item
255− className="eth-tx-button" full className="mb2"></Grid.Item>
252+ <Grid.Item className="mb2 eth-tx-button" full></Grid.Item>
256 <Grid.Divider />
253 <Grid.Divider />
257 <Grid.Item
254 <Grid.Item
258− className="eth-tx-button"
255+ className="mt2 eth-tx-button"
259 full
256 full
260 as={Flex}
257 as={Flex}
261 row
258 row
262− justify="between"
259+ justify="between">
263− className="mt2">
264 <Flex.Item as={H5}>Transaction Fee</Flex.Item>
260 <Flex.Item as={H5}>Transaction Fee</Flex.Item>
265
261
266 <Flex.Item as={H5}>
262 <Flex.Item as={H5}>
@@ -286,12 +282,11 @@ export default function InlineEthereumTransaction({
286 }
282 }
287 />
283 />
288 <Grid.Item
284 <Grid.Item
289− className="eth-tx-button"
285+ className="f6 mt1 eth-tx-button"
290 full
286 full
291 as={Flex}
287 as={Flex}
292 row
288 row
293− justify="between"
289+ justify="between">
294− className="f6 mt1">
295 <Flex.Item as={Text}>Cheap</Flex.Item>
290 <Flex.Item as={Text}>Cheap</Flex.Item>
296 <Flex.Item as={Text}>Fast</Flex.Item>
291 <Flex.Item as={Text}>Fast</Flex.Item>
297 </Grid.Item>
292 </Grid.Item>
@@ -302,8 +297,7 @@ export default function InlineEthereumTransaction({
302
297
303 {showSignedTx && fakeSigned && (
298 {showSignedTx && fakeSigned && (
304 <>
299 <>
305− <Grid.Item
306− className="eth-tx-button" full as={NoticeBox} className="mt2">
300+ <Grid.Item className="mt2 eth-tx-button" full as={NoticeBox}>
307 Your wallet will sign the transaction upon sending it.
301 Your wallet will sign the transaction upon sending it.
308 </Grid.Item>
302 </Grid.Item>
309 </>
303 </>
@@ -341,24 +335,35 @@ function SignedTransactionList({ serializedTxsHex, nonce, maxCost }) {
341 <React.Fragment key={i}>
335 <React.Fragment key={i}>
342 <Grid.Divider />
336 <Grid.Divider />
343 <Grid.Item
337 <Grid.Item
344− className="eth-tx-button" full as={Flex} justify="between" className="pv4 black f5">
338+ className="pv4 black f5 eth-tx-button"
339+ full
340+ as={Flex}
341+ justify="between">
345 <Flex.Item>Nonce</Flex.Item>
342 <Flex.Item>Nonce</Flex.Item>
346 <Flex.Item>{nonce + i}</Flex.Item>
343 <Flex.Item>{nonce + i}</Flex.Item>
347 </Grid.Item>
344 </Grid.Item>
348 <Grid.Divider />
345 <Grid.Divider />
349 <Grid.Item
346 <Grid.Item
350− className="eth-tx-button" full as={Flex} justify="between" className="pv4 black f5">
347+ className="pv4 black f5 eth-tx-button"
348+ full
349+ as={Flex}
350+ justify="between">
351 <Flex.Item>Transaction Cost</Flex.Item>
351 <Flex.Item>Transaction Cost</Flex.Item>
352 <Flex.Item>{maxCost} ETH</Flex.Item>
352 <Flex.Item>{maxCost} ETH</Flex.Item>
353 </Grid.Item>
353 </Grid.Item>
354 <Grid.Divider />
354 <Grid.Divider />
355 <Grid.Item
355 <Grid.Item
356− className="eth-tx-button" full as={Flex} justify="between" className="mt3 mb2">
356+ className="mt3 mb2 eth-tx-button"
357+ full
358+ as={Flex}
359+ justify="between">
357 <Flex.Item as={H5}>Signed Transaction Hex</Flex.Item>
360 <Flex.Item as={H5}>Signed Transaction Hex</Flex.Item>
358 <Flex.Item as={CopyButton} text={serializedTxHex} />
361 <Flex.Item as={CopyButton} text={serializedTxHex} />
359 </Grid.Item>
362 </Grid.Item>
360 <Grid.Item
363 <Grid.Item
361− className="eth-tx-button" full as="code" className="mb4 f6 mono gray4 wrap">
364+ className="mb4 f6 mono gray4 wrap eth-tx-button"
365+ full
366+ as="code">
362 {serializedTxHex}
367 {serializedTxHex}
363 </Grid.Item>
368 </Grid.Item>
364 <Grid.Divider />
369 <Grid.Divider />
@@ -371,20 +376,25 @@ function TransactionReceipt({ txHashes, finalCost, onClose }) {
371 return (
376 return (
372 <>
377 <>
373 <Grid.Item
378 <Grid.Item
374− className="eth-tx-button" full as={Flex} justify="between" className="pv2 black f5">
379+ className="pv2 black f5 eth-tx-button"
380+ full
381+ as={Flex}
382+ justify="between">
375 <Flex.Item>Receipt</Flex.Item>
383 <Flex.Item>Receipt</Flex.Item>
376 <Flex.Item onClick={onClose} className="underline pointer">
384 <Flex.Item onClick={onClose} className="underline pointer">
377 Close
385 Close
378 </Flex.Item>
386 </Flex.Item>
379 </Grid.Item>
387 </Grid.Item>
380 <Grid.Item
388 <Grid.Item
381− className="eth-tx-button" full as={Flex} justify="between" className="pv2 black f5">
389+ className="pv2 black f5 eth-tx-button"
390+ full
391+ as={Flex}
392+ justify="between">
382 <Flex.Item>Transaction Cost</Flex.Item>
393 <Flex.Item>Transaction Cost</Flex.Item>
383 <Flex.Item className="mono">{finalCost} ETH</Flex.Item>
394 <Flex.Item className="mono">{finalCost} ETH</Flex.Item>
384 </Grid.Item>
395 </Grid.Item>
385 <Grid.Divider />
396 <Grid.Divider />
386− <Grid.Item
387− className="eth-tx-button" full as={Flex} col className="pv4">
397+ <Grid.Item className="pv4 eth-tx-button" full as={Flex} col>
388 <Flex.Item as={H5}>Receipt</Flex.Item>
398 <Flex.Item as={H5}>Receipt</Flex.Item>
389
399
390 {txHashes &&
400 {txHashes &&
src/components/Passport.js+1−1
@@ -222,7 +222,7 @@ function MiniPassport({ point, inverted, locked = false, ...rest }) {
222 const permissions = usePermissionsForPoint(address, point);
222 const permissions = usePermissionsForPoint(address, point);
223 const keyType = buildKeyType(permissions);
223 const keyType = buildKeyType(permissions);
224
224
225− const contrast = locked ? '#666666' : 'black'
225+ const contrast = locked ? '#666666' : 'black';
226
226
227 const sigil = useMemo(
227 const sigil = useMemo(
228 () =>
228 () =>
src/components/copiable/CopiableWithTooltip.js−1
@@ -1,5 +1,4 @@
1import React from 'react';
1import React from 'react';
2−import { ReactComponent as Copy } from 'assets/copy.svg';
3
2
4import useCopiable from 'lib/useCopiable';
3import useCopiable from 'lib/useCopiable';
5import WithTooltip from 'components/WithTooltip';
4import WithTooltip from 'components/WithTooltip';
src/lib/useInviter.js+1−1
@@ -193,7 +193,7 @@ const useInviter = () => {
193 };
193 };
194 }
194 }
195
195
196− console.log('INVITES', confirmedInvites)
196+ console.log('INVITES', confirmedInvites);
197 // TODO: store these locally, and also handle the situation
197 // TODO: store these locally, and also handle the situation
198 return { invites: confirmedInvites };
198 return { invites: confirmedInvites };
199 },
199 },
src/lib/useRoller.ts+43−36
@@ -29,7 +29,7 @@ import {
29 setStoredInvites,
29 setStoredInvites,
30} from 'store/storage/roller';
30} from 'store/storage/roller';
31import { usePointCache } from 'store/pointCache';
31import { usePointCache } from 'store/pointCache';
32−import { getOutgoingPoints, hasTransferProxy, maybeGetResult } from 'views/Points';
32+import { getOutgoingPoints, maybeGetResult } from 'views/Points';
33
33
34const hasPoint = (point: number) => (invite: Invite) => invite.planet === point;
34const hasPoint = (point: number) => (invite: Invite) => invite.planet === point;
35
35
@@ -227,7 +227,6 @@ export default function useRoller() {
227 const curPoint: string = need.point(pointCursor);
227 const curPoint: string = need.point(pointCursor);
228 const invites = getStoredInvites(curPoint);
228 const invites = getStoredInvites(curPoint);
229 const availableInvites = invites.available;
229 const availableInvites = invites.available;
230− console.log('WHAT', curPoint, invites, availableInvites)
231
230
232 const pendingTransactions = await api.getPendingByShip(curPoint);
231 const pendingTransactions = await api.getPendingByShip(curPoint);
233 console.log('PENDING', pendingTransactions);
232 console.log('PENDING', pendingTransactions);
@@ -252,43 +251,51 @@ export default function useRoller() {
252 });
251 });
253 setInvites(availableInvites);
252 setInvites(availableInvites);
254
253
255− let possibleMissingInvites: number[] = [];
256−
257− if (isL2) {
258− const allSpawned = await api.getSpawned(Number(curPoint));
259− const ownedPoints = maybeGetResult(controlledPoints, 'ownedPoints', []);
260− possibleMissingInvites = allSpawned.filter(
261− (p: number) =>
262− ownedPoints.includes(p) &&
263− azimuth.azimuth.getPointSize(p) ===
264− azimuth.azimuth.PointSize.Planet
265− );
266− } else {
267− // How to get outgoing points by star?
268− const outgoingPoints = getOutgoingPoints(
269− controlledPoints,
270− getDetails
271− );
272−
273− possibleMissingInvites = outgoingPoints.filter(
274− (p: number) =>
275− azimuth.azimuth.getPointSize(p) ===
276− azimuth.azimuth.PointSize.Planet
277− );
278− }
279−
280− // Iterate over all spawned and controlled planets
281− // If the planet is not in available invites, generate the ticket and add it
282 const _authToken = authToken.getOrElse(null);
254 const _authToken = authToken.getOrElse(null);
283 const _contracts = contracts.getOrElse(null);
255 const _contracts = contracts.getOrElse(null);
284
256
257+ if (_authToken && _contracts) {
258+ let possibleMissingInvites: number[] = [];
259+ if (isL2) {
260+ const allSpawned = await api.getSpawned(Number(curPoint));
261+ const ownedPoints = maybeGetResult(
262+ controlledPoints,
263+ 'ownedPoints',
264+ []
265+ );
266+ possibleMissingInvites = allSpawned.filter(
267+ (p: number) =>
268+ ownedPoints.includes(p) &&
269+ azimuth.azimuth.getPointSize(p) ===
270+ azimuth.azimuth.PointSize.Planet
271+ );
272+ } else {
273+ const outgoingPoints = getOutgoingPoints(
274+ controlledPoints,
275+ getDetails
276+ );
277+
278+ const availablePoints = await azimuth.azimuth.getUnspawnedChildren(
279+ _contracts,
280+ curPoint
281+ );
282+
285− console.log('POSSIBLE MISSING', possibleMissingInvites)
283+ possibleMissingInvites = outgoingPoints.filter(
284+ (p: number) =>
285+ azimuth.azimuth.getPointSize(p) ===
286+ azimuth.azimuth.PointSize.Planet &&
287+ availablePoints.includes(p)
288+ );
289+ }
286
290
291+ // Iterate over all spawned and controlled planets
292+ // If the planet is not in available invites, generate the ticket and add it
293+ console.log('POSSIBLE MISSING', possibleMissingInvites);
294+
287− const newClaimed = availableInvites.filter(
295+ const newClaimed = availableInvites.filter(
288− ({ planet }) => !possibleMissingInvites.includes(planet)
296+ ({ planet }) => !possibleMissingInvites.includes(planet)
289− );
297+ );
290
298
291− if (_authToken && _contracts) {
292 for (let i = 0; i < possibleMissingInvites.length; i++) {
299 for (let i = 0; i < possibleMissingInvites.length; i++) {
293 const planet = possibleMissingInvites[i];
300 const planet = possibleMissingInvites[i];
294
301
@@ -359,12 +366,12 @@ export default function useRoller() {
359 setNextBatchTime(response.nextBatch);
366 setNextBatchTime(response.nextBatch);
360 });
367 });
361
368
362− getInvites();
369+ getInvites(currentL2);
363 }
370 }
364 }, 1000);
371 }, 1000);
365
372
366 return () => clearInterval(interval);
373 return () => clearInterval(interval);
367− }, [nextBatchTime, getPendingTransactions]); // eslint-disable-line react-hooks/exhaustive-deps
374+ }, [nextBatchTime, getPendingTransactions, currentL2]); // eslint-disable-line react-hooks/exhaustive-deps
368
375
369 return {
376 return {
370 api,
377 api,
src/store/lib/useControlledPointsStore.js+36−6
@@ -1,11 +1,14 @@
1import { useState, useEffect, useCallback } from 'react';
1import { useState, useEffect, useCallback } from 'react';
2import { Just, Nothing } from 'folktale/maybe';
2import { Just, Nothing } from 'folktale/maybe';
3import Result from 'folktale/result';
3import Result from 'folktale/result';
4+import * as azimuth from 'azimuth-js';
4
5
5import { useNetwork } from '../network';
6import { useNetwork } from '../network';
6import { useWallet } from 'store/wallet';
7import { useWallet } from 'store/wallet';
7import useRoller from 'lib/useRoller';
8import useRoller from 'lib/useRoller';
8
9
10+const onlyUnique = (value, index, self) => self.indexOf(value) === index;
11+
9export default function useControlledPointsStore() {
12export default function useControlledPointsStore() {
10 const { contracts } = useNetwork();
13 const { contracts } = useNetwork();
11 const { wallet } = useWallet();
14 const { wallet } = useWallet();
@@ -39,7 +42,19 @@ export default function useControlledPointsStore() {
39 getPoints('spawn', address),
42 getPoints('spawn', address),
40 ]);
43 ]);
41
44
42− console.log('OWNED POINTS', ownedPoints)
45+ const [
46+ ownedPointsL1,
47+ incomingPointsL1,
48+ managingPointsL1,
49+ votingPointsL1,
50+ spawningPointsL1,
51+ ] = await Promise.all([
52+ azimuth.azimuth.getOwnedPoints(_contracts, address),
53+ azimuth.azimuth.getTransferringFor(_contracts, address),
54+ azimuth.azimuth.getManagerFor(_contracts, address),
55+ azimuth.azimuth.getVotingFor(_contracts, address),
56+ azimuth.azimuth.getSpawningFor(_contracts, address),
57+ ]);
43
58
44 if (
59 if (
45 ownedPoints === null &&
60 ownedPoints === null &&
@@ -55,11 +70,26 @@ export default function useControlledPointsStore() {
55 _setControlledPoints(
70 _setControlledPoints(
56 Just(
71 Just(
57 Result.Ok({
72 Result.Ok({
58− ownedPoints,
73+ ownedPoints: ownedPoints
74+ .concat(ownedPointsL1)
75+ .map(Number)
76+ .filter(onlyUnique),
59− incomingPoints,
77+ incomingPoints: incomingPoints
78+ .concat(incomingPointsL1)
79+ .map(Number)
80+ .filter(onlyUnique),
60− managingPoints,
81+ managingPoints: managingPoints
82+ .concat(managingPointsL1)
83+ .map(Number)
84+ .filter(onlyUnique),
61− votingPoints,
85+ votingPoints: votingPoints
86+ .concat(votingPointsL1)
87+ .map(Number)
88+ .filter(onlyUnique),
62− spawningPoints,
89+ spawningPoints: spawningPoints
90+ .concat(spawningPointsL1)
91+ .map(Number)
92+ .filter(onlyUnique),
63 })
93 })
64 )
94 )
65 );
95 );
src/store/storage/roller.ts+1−1
@@ -1,4 +1,4 @@
1−import { Invite } from "types/Invite";
1+import { Invite } from 'types/Invite';
2
2
3const INVITES_KEY = 'invites';
3const INVITES_KEY = 'invites';
4
4
src/views/Invite/Cohort.js+10−7
@@ -29,7 +29,7 @@ import Paginator from 'components/L2/Paginator';
29import InlineEthereumTransaction from 'components/InlineEthereumTransaction';
29import InlineEthereumTransaction from 'components/InlineEthereumTransaction';
30
30
31import './Cohort.scss';
31import './Cohort.scss';
32−import { getStoredInvites, setStoredInvites } from 'store/storage/roller';
32+import { getStoredInvites } from 'store/storage/roller';
33import { ETH_ZERO_ADDR } from 'lib/constants';
33import { ETH_ZERO_ADDR } from 'lib/constants';
34
34
35const INVITES_PER_PAGE = 7;
35const INVITES_PER_PAGE = 7;
@@ -45,10 +45,14 @@ export default function InviteCohort() {
45 invites,
45 invites,
46 setInvites,
46 setInvites,
47 } = useRollerStore();
47 } = useRollerStore();
48+ const {
49+ generateInviteCodes,
48− const { generateInviteCodes, getPendingTransactions } = useRoller();
50+ getPendingTransactions,
51+ getInvites,
52+ } = useRoller();
49 const { pointCursor } = usePointCursor();
53 const { pointCursor } = usePointCursor();
50 const { contracts } = useNetwork();
54 const { contracts } = useNetwork();
51− const { getDetails } = usePointCache();
55+ const { getDetails, syncControlledPoints } = usePointCache();
52
56
53 const point = need.point(pointCursor);
57 const point = need.point(pointCursor);
54 const _contracts = need.contracts(contracts);
58 const _contracts = need.contracts(contracts);
@@ -71,6 +75,8 @@ export default function InviteCohort() {
71
75
72 const { construct, unconstruct, completed, bind } = useIssueChild();
76 const { construct, unconstruct, completed, bind } = useIssueChild();
73
77
78+ useEffect(() => getInvites(), []); // eslint-disable-line react-hooks/exhaustive-deps
79+
74 // Set up the invite spawn if on L1
80 // Set up the invite spawn if on L1
75 useEffect(() => {
81 useEffect(() => {
76 const _authToken = authToken.getOrElse(null);
82 const _authToken = authToken.getOrElse(null);
@@ -102,11 +108,8 @@ export default function InviteCohort() {
102 _authToken
108 _authToken
103 );
109 );
104
110
105− console.log('INVITE POINT', invitePoint, owner.keys.address)
106−
107 construct(invitePoint, owner.keys.address);
111 construct(invitePoint, owner.keys.address);
108 setL1Invite({ ticket, planet: invitePoint });
112 setL1Invite({ ticket, planet: invitePoint });
109− console.log(0, { ticket, planet: invitePoint })
110 } else {
113 } else {
111 setError('No available planets');
114 setError('No available planets');
112 }
115 }
@@ -132,7 +135,6 @@ export default function InviteCohort() {
132
135
133 useEffect(() => {
136 useEffect(() => {
134 const { available } = getStoredInvites(point);
137 const { available } = getStoredInvites(point);
135− console.log(2, completed, l1Invite)
136
138
137 if (
139 if (
138 !completed ||
140 !completed ||
@@ -142,6 +144,7 @@ export default function InviteCohort() {
142 return;
144 return;
143 }
145 }
144
146
147+ syncControlledPoints();
145 setInvites([...invites, l1Invite]);
148 setInvites([...invites, l1Invite]);
146 setShowInviteForm(false);
149 setShowInviteForm(false);
147 setL1Invite(null);
150 setL1Invite(null);
src/views/IssueChild.js+1−1
@@ -43,7 +43,7 @@ export function useIssueChild() {
43 return useEthereumTransaction(
43 return useEthereumTransaction(
44 useCallback(
44 useCallback(
45 (spawnedPoint, owner) => {
45 (spawnedPoint, owner) => {
46− console.log(5, spawnedPoint, owner)
46+ console.log(5, spawnedPoint, owner);
47 setSpawnedPoint(spawnedPoint);
47 setSpawnedPoint(spawnedPoint);
48 return azimuth.ecliptic.spawn(_contracts, spawnedPoint, owner);
48 return azimuth.ecliptic.spawn(_contracts, spawnedPoint, owner);
49 },
49 },
src/views/Point.js+1−14
@@ -7,7 +7,6 @@ import { azimuth } from 'azimuth-js';
7
7
8import { usePointCursor } from 'store/pointCursor';
8import { usePointCursor } from 'store/pointCursor';
9import { useWallet } from 'store/wallet';
9import { useWallet } from 'store/wallet';
10−import { usePointCache } from 'store/pointCache';
11import { isL2, useRollerStore } from 'store/roller';
10import { isL2, useRollerStore } from 'store/roller';
12
11
13import View from 'components/View';
12import View from 'components/View';
@@ -123,13 +122,11 @@ export default function Point() {
123 const { pointCursor } = usePointCursor();
122 const { pointCursor } = usePointCursor();
124 const point = need.point(pointCursor);
123 const point = need.point(pointCursor);
125
124
126− const { getResidents } = usePointCache();
127 const { api, getInvites } = useRoller();
125 const { api, getInvites } = useRoller();
128 const {
126 const {
129 pendingTransactions,
127 pendingTransactions,
130 nextRoll,
128 nextRoll,
131 invites,
129 invites,
132− recentlyCompleted,
133 setCurrentPoint,
130 setCurrentPoint,
134 setPendingTransactions,
131 setPendingTransactions,
135 } = useRollerStore();
132 } = useRollerStore();
@@ -154,15 +151,7 @@ export default function Point() {
154 loadL2Info();
151 loadL2Info();
155 }, [api, point, authToken, setPendingTransactions, loaded]); // eslint-disable-line
152 }, [api, point, authToken, setPendingTransactions, loaded]); // eslint-disable-line
156
153
157− const { residentCount, requestCount } = getResidents(point);
158−
159− const {
160− isParent,
161− isActiveOwner,
162− canManage,
163− canSpawn,
164− canVote,
165− } = useCurrentPermissions();
154+ const { isParent, canManage, canSpawn, canVote } = useCurrentPermissions();
166
155
167 // L1 invites
156 // L1 invites
168 const l1Invites = useInvites(point);
157 const l1Invites = useInvites(point);
@@ -225,8 +214,6 @@ export default function Point() {
225 useSyncExtras([point]);
214 useSyncExtras([point]);
226
215
227 const address = need.addressFromWallet(wallet);
216 const address = need.addressFromWallet(wallet);
228−
229− const _requestCount = requestCount.getOrElse(0);
230 const numPending = pendingTransactions.length;
217 const numPending = pendingTransactions.length;
231
218
232 return (
219 return (
src/views/Points.js+22−25
@@ -41,32 +41,29 @@ export const hasTransferProxy = details =>
41 !isZeroAddress(details.transferProxy);
41 !isZeroAddress(details.transferProxy);
42
42
43export const getOutgoingPoints = (controlledPoints, getDetails) => {
43export const getOutgoingPoints = (controlledPoints, getDetails) => {
44− return controlledPoints.chain((points) =>
44+ return controlledPoints
45+ .chain(points =>
45− points.matchWith({
46+ points.matchWith({
46− Error: () => Nothing(),
47+ Error: () => Nothing(),
47− Ok: (c) => {
48+ Ok: c => {
48− const points = c.value.ownedPoints.map((point) =>
49+ const points = c.value.ownedPoints.map(point =>
49− getDetails(point).chain((details) => {
50+ getDetails(point).chain(details =>
50− // need those that are inactive
51− if (!details.active) {
52− console.log(point, details)
53− }
54− return Just({ point: point, has: hasTransferProxy(details) })
51+ Just({ point: point, has: hasTransferProxy(details) })
52+ )
53+ );
54+ if (points.every(p => Just.hasInstance(p))) {
55+ const outgoing = points
56+ .filter(p => p.value.has)
57+ .map(p => p.value.point);
58+ return Just(outgoing);
59+ } else {
60+ return Nothing();
55 }
61 }
56− )
62+ },
57− );
58− if (points.every((p) => Just.hasInstance(p))) {
59− const outgoing = points
60− .filter((p) => p.value.has)
61− .map((p) => p.value.point);
62− return Just(outgoing);
63− } else {
64− return Nothing();
65− }
66− },
63+ })
67− })
64+ )
68− ).getOrElse([]);
65+ .getOrElse([]);
69−}
66+};
70
67
71export const isLocked = details =>
68export const isLocked = details =>
72 details.owner === '0x86cd9cd0992f04231751e3761de45cecea5d1801' ||
69 details.owner === '0x86cd9cd0992f04231751e3761de45cecea5d1801' ||