@@ -2,6 +2,7 @@ import React, { useState, useCallback } from 'react';
22import { Just, Nothing } from 'folktale/maybe';
33import * as need from 'lib/need';
44import { Grid } from 'indigo-react';
5+import { azimuth } from 'azimuth-js';
56
67import { ForwardButton } from 'components/Buttons';
78import { matchBlinky, matchBlinkyDate } from 'components/Blinky';
@@ -19,6 +20,7 @@ import { PROXY_TYPE, proxyTypeToHuman } from 'lib/proxy';
1920import { useLocalRouter } from 'lib/LocalRouter';
2021import { formatDots } from 'lib/dateFormat';
2122import capitalize from 'lib/capitalize';
23+import { eqAddr } from 'lib/wallet';
2224
2325//TODO consolidate with azimuth-js' getActivationBlock
2426const getRekeyDate = async (web3, contracts, point) => {
@@ -43,24 +45,25 @@ export default function AdminEditPermissions() {
4345 const { pointCursor } = usePointCursor();
4446 const { getDetails } = usePointCache();
4547
48+ const _web3 = need.web3(web3);
49+ const _contracts = need.contracts(contracts);
50+
4651 const [rekeyDate, setRekeyDate] = useState(Nothing());
4752
4853 const point = need.point(pointCursor);
54+ const pointSize = azimuth.getPointSize(point);
55+ const isParent = pointSize !== azimuth.PointSize.Planet;
56+ const isSenate = pointSize === azimuth.PointSize.Galaxy;
4957 const userAddress = need.wallet(wallet).address;
5058
5159 const details = need.details(getDetails(point));
52− const { canManage, canTransfer, canSpawn, canVote } = usePermissionsForPoint(
53− userAddress,
54− point
55− );
60+ const { canManage, isOwner } = usePermissionsForPoint(userAddress, point);
5661
5762 useLifecycle(() => {
58− getRekeyDate(need.web3(web3), need.contracts(contracts), point).then(
59− res => {
60− if (res === null) setRekeyDate(Just(new Date()));
61− else setRekeyDate(Just(res));
62− }
63− );
63+ getRekeyDate(_web3, _contracts, point).then(res => {
64+ if (res === null) setRekeyDate(Just(new Date()));
65+ else setRekeyDate(Just(res));
66+ });
6467 });
6568
6669 const goToProxy = useCallback(
@@ -71,8 +74,10 @@ export default function AdminEditPermissions() {
7174 const goSetKeys = useCallback(() => push(names.SET_KEYS), [push, names]);
7275
7376 const proxyAction = (proxyType, address, enabled) => {
74− if (address === ETH_ZERO_ADDR) {
75− address = 'Not yet set';
77+ if (eqAddr(address, ETH_ZERO_ADDR)) {
78+ address = 'Not set';
79+ } else if (eqAddr(address, _contracts.delegatedSending.address)) {
80+ address = address + ' (invites contract)';
7681 }
7782
7883 const detail = enabled
@@ -82,14 +87,17 @@ export default function AdminEditPermissions() {
8287 )} proxy.`;
8388
8489 return (
85− <Grid.Item full>
86− <ForwardButton
87− disabled={!enabled}
88− onClick={() => goToProxy(proxyType)}
89− detail={detail}>
90− {capitalize(proxyTypeToHuman(proxyType))} Proxy Address
91− </ForwardButton>
92− </Grid.Item>
90+ <>
91+ <Grid.Item full>
92+ <ForwardButton
93+ disabled={!enabled}
94+ onClick={() => goToProxy(proxyType)}
95+ detail={detail}>
96+ {capitalize(proxyTypeToHuman(proxyType))} Proxy Address
97+ </ForwardButton>
98+ </Grid.Item>
99+ <Grid.Divider />
100+ </>
93101 );
94102 };
95103
@@ -114,17 +122,11 @@ export default function AdminEditPermissions() {
114122 </Grid.Item>
115123 <Grid.Divider />
116124
117− {proxyAction(PROXY_TYPE.MANAGEMENT, details.managementProxy, canManage)}
118− <Grid.Divider />
125+ {proxyAction(PROXY_TYPE.MANAGEMENT, details.managementProxy, isOwner)}
119126
120− {proxyAction(PROXY_TYPE.SPAWN, details.spawnProxy, canSpawn)}
121− <Grid.Divider />
127+ {isParent && proxyAction(PROXY_TYPE.SPAWN, details.spawnProxy, isOwner)}
122128
123− {proxyAction(PROXY_TYPE.TRANSFER, details.transferProxy, canTransfer)}
124− <Grid.Divider />
125−
126− {proxyAction(PROXY_TYPE.VOTING, details.votingProxy, canVote)}
127− <Grid.Divider />
129+ {isSenate && proxyAction(PROXY_TYPE.VOTING, details.votingProxy, isOwner)}
128130
129131 <Grid.Item
130132 full