on master help sign in
bridge/src/lib/types/Point.ts
255 lines 7.9 kB history raw
1import * as ob from 'urbit-ob';
2import { isGalaxy, isPlanet, isStar } from 'lib/utils/point';
3import { eqAddr, isZeroAddress } from 'lib/utils/address';
4import { L1Point } from './L1Point';
5import { Proxy } from '@urbit/roller-api';
6import { DUMMY_L2_ADDRESS } from 'lib/constants';
8export interface Points {
9 [key: number]: Point;
12export type PermissionLevel =
13 | 'own'
14 | 'manage'
15 | 'spawn'
16 | 'vote'
17 | 'transfer'
18 | null;
20export const shouldDisplayPermissionLevel = (level: PermissionLevel) =>
21 level === 'manage' || level === 'spawn' || level === 'vote';
23export enum PointField {
24 value = 'value',
25 layer = 'layer',
26 active = 'active',
27 authenticationKey = 'authenticationKey',
28 continuityNumber = 'continuityNumber',
29 cryptoSuiteVersion = 'cryptoSuiteVersion',
30 encryptionKey = 'encryptionKey',
31 escapeRequested = 'escapeRequested',
32 escapeRequestedTo = 'escapeRequestedTo',
33 hasSponsor = 'hasSponsor',
34 keyRevisionNumber = 'keyRevisionNumber',
35 managementProxy = 'managementProxy',
36 owner = 'owner',
37 spawnProxy = 'spawnProxy',
38 sponsor = 'sponsor',
39 transferProxy = 'transferProxy',
40 votingProxy = 'votingProxy',
41 isL2 = 'isL2',
42 isL2Spawn = 'isL2Spawn',
43 isL1 = 'isL1',
44 isGalaxy = 'isGalaxy',
45 isStar = 'isStar',
46 isPlanet = 'isPlanet',
47 isParent = 'isParent',
48 canMigrate = 'canMigrate',
49 networkKeysSet = 'networkKeysSet',
50 isOwner = 'isOwner',
51 isActiveOwner = 'isActiveOwner',
52 isManagementProxy = 'isManagementProxy',
53 isSpawnProxy = 'isSpawnProxy',
54 isVotingProxy = 'isVotingProxy',
55 isTransferProxy = 'isTransferProxy',
56 isManagementProxySet = 'isManagementProxySet',
57 isSpawnProxySet = 'isSpawnProxySet',
58 isVotingProxySet = 'isVotingProxySet',
59 isTransferProxySet = 'isTransferProxySet',
60 canManage = 'canManage',
61 canSpawn = 'canSpawn',
62 canTransfer = 'canTransfer',
63 canVote = 'canVote',
64 showInvites = 'showInvites',
67interface PointConstructorParams {
68 value: number;
69 details: L1Point;
70 address: string;
71 l2Quota?: number;
72 l2Allowance?: number;
73 isPlaceholder?: boolean;
76export default class Point {
77 value: number;
78 patp: string;
79 layer: 1 | 2;
80 l2Quota: number;
81 l2Allowance: number;
82 active: boolean;
83 authenticationKey: string;
84 continuityNumber: string;
85 cryptoSuiteVersion: string;
86 encryptionKey: string;
87 escapeRequested: boolean;
88 escapeRequestedTo: string;
89 hasSponsor: boolean;
90 keyRevisionNumber: number;
91 managementProxy: string;
92 owner: string;
93 spawnProxy: string;
94 sponsor: string;
95 transferProxy: string;
96 votingProxy: string;
97 // Derived details
98 isL2: boolean;
99 isL2Spawn: boolean;
100 isL1: boolean;
101 isGalaxy: boolean;
102 isStar: boolean;
103 isPlanet: boolean;
104 isParent: boolean;
105 canMigrate: boolean;
106 networkKeysSet: boolean;
107 // usePermissionsForPoint details
108 isOwner: boolean;
109 isActiveOwner: boolean;
110 isManagementProxy: boolean;
111 isSpawnProxy: boolean;
112 isVotingProxy: boolean;
113 isTransferProxy: boolean;
114 isManagementProxySet: boolean;
115 isSpawnProxySet: boolean;
116 isVotingProxySet: boolean;
117 isTransferProxySet: boolean;
118 canManage: boolean;
119 couldSpawn: boolean;
120 canSpawn: boolean;
121 canTransfer: boolean;
122 canVote: boolean;
123 showInvites: boolean;
124 isDefault: boolean;
125 isPlaceholder: boolean;
126 ownManageSpawnVote: boolean;
127 shouldDisplay: boolean;
128 isOutgoing: boolean;
129 permissionLevel: PermissionLevel;
130 displayPermission: boolean;
132 constructor({
133 value,
134 details,
135 address,
136 l2Quota = 0,
137 l2Allowance = 0,
138 isPlaceholder = false,
139 }: PointConstructorParams) {
140 this.value = value;
141 this.patp = value < 0 ? 'null' : ob.patp(value);
143 this.layer = details.layer || 1;
144 this.l2Quota = l2Quota;
145 this.l2Allowance = l2Allowance;
146 this.isL2Spawn = Boolean(details.isL2Spawn);
147 this.active = details.active;
148 this.authenticationKey = details.authenticationKey;
149 this.continuityNumber = details.continuityNumber;
150 this.cryptoSuiteVersion = details.cryptoSuiteVersion;
151 this.encryptionKey = details.encryptionKey;
152 this.escapeRequested = details.escapeRequested;
153 this.escapeRequestedTo = details.escapeRequestedTo;
154 this.hasSponsor = details.hasSponsor;
155 this.keyRevisionNumber = Number(details.keyRevisionNumber);
156 this.managementProxy = details.managementProxy;
157 this.owner = details.owner;
158 this.spawnProxy = details.spawnProxy;
159 this.sponsor = details.sponsor;
160 this.transferProxy = details.transferProxy;
161 this.votingProxy = details.votingProxy;
162 // Derived details here
163 this.isL2 = this.layer === 2;
164 this.isL1 = this.layer === 1;
165 this.isGalaxy = isGalaxy(value);
166 this.isStar = isStar(value);
167 this.isPlanet = isPlanet(value);
168 this.isParent = !this.isPlanet;
169 this.networkKeysSet = Number(this.keyRevisionNumber) > 0;
170 // usePermissionsForPoint
171 this.isOwner = eqAddr(address, this.owner);
172 this.isActiveOwner = this.isOwner && this.active;
173 this.isManagementProxy = eqAddr(address, this.managementProxy);
174 this.isSpawnProxy = eqAddr(address, this.spawnProxy);
175 this.isVotingProxy = eqAddr(address, this.votingProxy);
176 this.isTransferProxy = eqAddr(address, this.transferProxy);
177 this.permissionLevel = this.isOwner
178 ? 'own'
179 : this.isManagementProxy
180 ? 'manage'
181 : this.isSpawnProxy
182 ? 'spawn'
183 : this.isVotingProxy
184 ? 'vote'
185 : this.isTransferProxy
186 ? 'transfer'
187 : null;
188 this.displayPermission = shouldDisplayPermissionLevel(this.permissionLevel);
189 this.isManagementProxySet = !isZeroAddress(this.managementProxy);
190 this.isSpawnProxySet = !isZeroAddress(this.spawnProxy);
191 this.isVotingProxySet = !isZeroAddress(this.votingProxy);
192 this.isTransferProxySet = !isZeroAddress(this.transferProxy);
193 this.canManage = this.isOwner || this.isManagementProxy;
194 this.canTransfer = this.isOwner || this.isTransferProxy;
195 this.couldSpawn = this.isParent && (this.isOwner || this.isSpawnProxy);
196 this.canSpawn =
197 this.isParent &&
198 (this.isOwner || this.isSpawnProxy) &&
199 this.networkKeysSet;
200 this.canVote =
201 this.isGalaxy && this.active && (this.isOwner || this.isVotingProxy);
202 this.canMigrate =
203 this.canManage &&
204 this.isL1 &&
205 ((this.isGalaxy && !this.isL2Spawn) || this.isStar || this.isPlanet);
206 this.showInvites = this.canManage || this.canSpawn;
207 this.isDefault = value === -1;
208 this.isPlaceholder = isPlaceholder;
209 this.ownManageSpawnVote =
210 !this.isPlaceholder &&
211 !this.isDefault &&
212 (this.isOwner ||
213 this.isSpawnProxy ||
214 this.isManagementProxy ||
215 this.isVotingProxy);
216 this.shouldDisplay = this.ownManageSpawnVote || this.isTransferProxy;
217 this.isOutgoing =
218 this.isTransferProxySet &&
219 !this.isTransferProxy &&
220 this.canManage &&
221 this.transferProxy !== DUMMY_L2_ADDRESS;
222 }
224 equals = (point: Point) => {
225 return Object.values(PointField).reduce(
226 (acc, field) => acc && this[field] === point[field],
227 true
228 );
229 };
231 getChangedField = (point: Point, targetField?: PointField) =>
232 targetField
233 ? this[targetField] !== point[targetField] && targetField
234 : Object.values(PointField).find(field => this[field] !== point[field]);
236 getAddressProxy = (proxyType: Proxy) =>
237 this.isOwner
238 ? 'own'
239 : proxyType === 'manage' && this.isManagementProxy
240 ? 'manage'
241 : proxyType === 'spawn' && this.isSpawnProxy
242 ? 'spawn'
243 : proxyType === 'transfer' && this.isTransferProxy
244 ? 'transfer'
245 : undefined;
247 getManagerProxy = () =>
248 this.isOwner ? 'own' : this.isManagementProxy ? 'manage' : undefined;
250 getSpawnProxy = () =>
251 this.isOwner ? 'own' : this.isSpawnProxy ? 'spawn' : undefined;
253 getTransferProxy = () =>
254 this.isOwner ? 'own' : this.isTransferProxy ? 'transfer' : undefined;