1import { Just, Nothing } from 'folktale/maybe';
2import { randomHex } from 'web3-utils';
3import WalletConnect from '@walletconnect/client';
14} from '@urbit/roller-api';
16import { Invite } from 'lib/types/Invite';
17import { signTransactionHash } from 'lib/authToken';
18import { deriveNetworkKeys, CRYPTO_SUITE_VERSION } from 'lib/keys';
19import { addHexPrefix } from 'lib/utils/address';
20import { makeDeterministicTicket, generateWallet } from 'lib/walletgen';
21import { WALLET_TYPES } from 'lib/constants';
22import { L2TransactionArgs, TransactionData } from 'lib/types/L2Transaction';
24export const SECOND = 1000;
25export const MINUTE = SECOND * 60;
26export const HOUR = MINUTE * 60;
28export const padZero = (amount: number) =>
29 `${amount < 10 && amount >= 0 ? '0' : ''}${amount}`;
31export const hasPoint = (point: number) => (invite: Invite) =>
32 invite.planet === point;
34export const getTimeToNextBatch = (nextBatch: number, now: number) => {
35 const toNext = Math.max(nextBatch - now, 0);
36 const hours = Math.floor(toNext / HOUR);
37 const minutes = Math.floor((toNext - hours * HOUR) / MINUTE);
38 const seconds = Math.floor(
39 (toNext - hours * HOUR - minutes * MINUTE) / SECOND
42 return `${padZero(hours)}h ${padZero(minutes)}m ${padZero(seconds)}s`;
45export const isL2 = (dom?: string) => dom === 'l2';
47export const isL2Spawn = (dom?: string) => dom === 'l2' || dom === 'spawn';
49export const generateInviteWallet = async (point: number, seed: string) => {
50 const ticket = makeDeterministicTicket(point, seed);
51 const inviteWallet = await generateWallet(point, ticket, true);
53 return { ticket, inviteWallet };
56export const generateHashAndSign = async (
65 connector: WalletConnect | null
67 if (walletType === WALLET_TYPES.METAMASK) {
68 const hash = await api.prepareForSigning(nonce, from, type, data);
69 const sig = await web3.eth.personal.sign(hash, wallet.address, '');
71 } else if (walletType === WALLET_TYPES.WALLET_CONNECT) {
72 if (!connector || !connector.connected) {
73 throw new Error('Awaiting WalletConnect connection...');
76 const hash = await api.prepareForSigning(nonce, from, type, data);
77 const sig = await connector.signPersonalMessage([hash, wallet.address]);
80 const hash = await api.getUnsignedTx(nonce, from, type, data);
81 const sig = await signTransactionHash(hash, wallet.privateKey);
86export const configureKeys = async (
95 connector: WalletConnect | null,
97 force: boolean = false
100 ship: point, //ship to configure keys
104 // TODO: do something here?
105 if (Nothing.hasInstance(networkSeed)) {
106 console.log("Network key Error: couldn't derive network keys");
107 // throw new Error("Network key Error: couldn't derive network keys");
110 const seed = Just.hasInstance(networkSeed)
114 const pair = deriveNetworkKeys(seed);
117 encrypt: addHexPrefix(pair.crypt.public),
118 auth: addHexPrefix(pair.auth.public),
119 cryptoSuite: String(CRYPTO_SUITE_VERSION),
120 breach: breach || false,
123 const sig = await generateHashAndSign(
134 return api.configureKeys(sig, force, from, wallet.address, data);
137export const transferPointRequest = async (
140 pointToTransfer: Ship,
146 connector: WalletConnect | null,
148 force: boolean = false
151 ship: pointToTransfer,
157 reset: reset || false,
160 const sig = await generateHashAndSign(
172 return api.transferPoint(sig, force, from, wallet.address, data);
175const proxyType = (proxy: Proxy) => {
178 return 'setManagementProxy';
180 return 'setSpawnProxy';
182 return 'setTransferProxy';
184 throw new Error(`Unknown proxyType ${proxy}`);
188const setProxy = async (
190 proxyAddressType: string,
195 force: boolean = false
197 switch (proxyAddressType) {
199 return await api.setManagementProxy(sig, force, from, address, data);
201 return await api.setSpawnProxy(sig, force, from, address, data);
203 return await api.setTransferProxy(sig, force, from, address, data);
205 throw new Error(`Unknown proxyType ${proxyAddressType}`);
209export const registerProxyAddress = async (
211 wallet: any, // BridgeWallet
214 proxyAddressType: string,
219 connector: WalletConnect | null,
226 const data = { address };
228 const sig = await generateHashAndSign(
233 proxyType(proxyAddressType),
251const getDataAndMethod = (args: L2TransactionArgs) => {
263 const result: TransactionData = { data: { address }, method: () => null };
266 case 'transferPoint':
267 result.method = api.transferPoint;
268 result.data.reset = reset || false;
271 result.method = api.spawn;
272 result.data.ship = pointToSpawn;
274 case 'configureKeys':
275 // TODO: do something here?
276 if (Nothing.hasInstance(networkSeed)) {
277 console.log("Network key Error: couldn't derive network keys");
278 // throw new Error("Network key Error: couldn't derive network keys");
281 const seed = Just.hasInstance(networkSeed)
285 const pair = deriveNetworkKeys(seed);
288 encrypt: addHexPrefix(pair.crypt.public),
289 auth: addHexPrefix(pair.auth.public),
290 cryptoSuite: String(CRYPTO_SUITE_VERSION),
291 breach: breach || false,
293 result.method = api.configureKeys;
296 result.method = api.escape;
297 result.data.ship = newSponsor;
298 delete result.data.address;
301 result.method = api.cancelEscape;
302 result.data.ship = ship;
303 delete result.data.address;
306 result.method = api.adopt;
307 result.data.ship = sponsee;
308 delete result.data.address;
311 result.method = api.detach;
312 result.data.ship = sponsee;
313 delete result.data.address;
316 result.method = api.reject;
317 result.data.ship = sponsee;
318 delete result.data.address;
323export const submitL2Transaction = async (args: L2TransactionArgs) => {
336 const from = { ship, proxy };
337 const { data, method } = getDataAndMethod(args);
339 const sig = await generateHashAndSign(
351 return method(sig, from, wallet.address, data);
354export const reticketL2Point = async () => {};
356export const hasInvite = (point: number) => (invite: Invite) =>
357 invite.planet === point && invite.ticket.length > 0;
359function isSpawn(tx: L2Data | undefined): tx is SpawnParams {
360 return (tx as SpawnParams) !== undefined;
363function isShipNumber(ship: number | string | undefined): ship is number {
364 return (ship as number) !== undefined;
367export const getPendingSpawns = (pendingTxs: PendingTransaction[]) =>
368 pendingTxs.reduce((acc, pending) => {
369 return isSpawn(pending.rawTx?.tx) &&
370 isShipNumber(pending.rawTx?.tx.data.ship)
371 ? acc.add(pending.rawTx?.tx.data.ship!)
373 }, new Set<number>());
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list