on a13b9eb help sign in
bridge/src/views/Admin/AdminSetProxy.js
137 lines 4.2 kB history raw
1import React, { useCallback } from 'react';
2import { Grid, P, Text, Input, Flex, LinkButton } from 'indigo-react';
3import * as azimuth from 'azimuth-js';
5import { useNetwork } from 'store/network';
7import * as need from 'lib/need';
8import { useLocalRouter } from 'lib/LocalRouter';
9import { ETH_ZERO_ADDR, eqAddr } from 'lib/wallet';
11import ViewHeader from 'components/ViewHeader';
12import { usePointCursor } from 'store/pointCursor';
13import {
14 PROXY_TYPE,
15 proxyTypeToHuman,
16 proxyTypeToHumanDescription,
17} from 'lib/proxy';
18import MiniBackButton from 'components/MiniBackButton';
19import capitalize from 'lib/capitalize';
20import { usePointCache } from 'store/pointCache';
21import { GenerateButton } from 'components/Buttons';
22import { useAddressInput } from 'lib/useInputs';
24const proxyFromDetails = (details, proxyType) => {
25 switch (proxyType) {
26 case PROXY_TYPE.MANAGEMENT:
27 return details.managementProxy;
28 case PROXY_TYPE.SPAWN:
29 return details.spawnProxy;
30 case PROXY_TYPE.TRANSFER:
31 return details.transferProxy;
32 case PROXY_TYPE.VOTING:
33 return details.votingProxy;
34 default:
35 throw new Error(`Unknown proxyType: ${proxyType}`);
36 }
37};
39function useSetProxy(proxyType) {
40 // TODO: abstract eth login into higher level useTransaction()
41 const { contracts } = useNetwork();
42 const { pointCursor } = usePointCursor();
44 const buildUnsignedTx = useCallback(
45 address => {
46 const _contracts = need.contracts(contracts);
47 const _point = need.point(pointCursor);
49 const txArgs = [_contracts, _point, address];
51 switch (proxyType) {
52 case PROXY_TYPE.MANAGEMENT:
53 return azimuth.ecliptic.setManagementProxy(...txArgs);
54 case PROXY_TYPE.SPAWN:
55 return azimuth.ecliptic.setSpawnProxy(...txArgs);
56 case PROXY_TYPE.TRANSFER:
57 return azimuth.ecliptic.setTransferProxy(...txArgs);
58 case PROXY_TYPE.VOTING:
59 return azimuth.ecliptic.setTransferProxy(...txArgs);
60 default:
61 throw new Error(`Unknown proxyType ${proxyType}`);
62 }
63 },
64 [proxyType, contracts, pointCursor]
65 );
67 const generate = useCallback(
68 async address => {
69 const utx = buildUnsignedTx(address);
70 console.log(utx);
71 },
72 [buildUnsignedTx]
73 );
75 const unset = useCallback(() => generate(ETH_ZERO_ADDR), [generate]);
77 const locked = false;
79 return {
80 locked,
81 generate,
82 unset,
83 };
86export default function AdminSetProxy() {
87 const { data, pop } = useLocalRouter();
88 const { getDetails } = usePointCache();
89 const { pointCursor } = usePointCursor();
90 const point = need.point(pointCursor);
91 const details = need.details(getDetails(point));
93 const properProxyType = capitalize(proxyTypeToHuman(data.proxyType));
95 const { generate, unset, locked } = useSetProxy(data.proxyType);
96 const [addressInput, { pass, data: address }] = useAddressInput({
97 name: 'address',
98 label: `New ${properProxyType} Address`,
99 disabled: locked,
100 });
102 const _generate = useCallback(() => generate(address), [address, generate]);
104 const proxyAddress = proxyFromDetails(details, data.proxyType);
105 const isProxySet = !eqAddr(ETH_ZERO_ADDR, proxyAddress);
107 return (
108 <Grid>
109 <Grid.Item full as={MiniBackButton} onClick={() => pop()} />
110 <Grid.Item full as={ViewHeader}>
111 {properProxyType} Address
112 </Grid.Item>
113 <Grid.Item full as={Text} className="mb4">
114 {proxyTypeToHumanDescription(data.proxyType)}
115 </Grid.Item>
116 <Grid.Item full as={Text} className="f6 mb1">
117 Current {properProxyType} Address
118 </Grid.Item>
119 <Grid.Item full as={Flex} row justify="between" align="center">
120 <Flex.Item flex as={Text} className="mono">
121 {isProxySet ? proxyAddress : 'Unset'}
122 </Flex.Item>
123 {isProxySet && (
124 <Flex.Item as={LinkButton} onClick={unset}>
125 Unset
126 </Flex.Item>
127 )}
128 </Grid.Item>
130 <Grid.Item full as={Input} {...addressInput} className="mv4" />
132 <Grid.Item full as={GenerateButton} onClick={_generate} disabled={!pass}>
133 Generate & Sign Transaction
134 </Grid.Item>
135 </Grid>
136 );