@devtion/devcli 0.0.0-bfc9ee4 → 0.0.0-c1f4cbe

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +3 -1
  2. package/dist/.env +17 -3
  3. package/dist/index.js +503 -106
  4. package/dist/public/mini-semaphore.wasm +0 -0
  5. package/dist/public/mini-semaphore.zkey +0 -0
  6. package/dist/types/commands/authBandada.d.ts +2 -0
  7. package/dist/types/commands/authSIWE.d.ts +7 -0
  8. package/dist/types/commands/ceremony/index.d.ts +3 -0
  9. package/dist/types/commands/ceremony/listParticipants.d.ts +2 -0
  10. package/dist/types/commands/contribute.d.ts +1 -1
  11. package/dist/types/commands/finalize.d.ts +4 -3
  12. package/dist/types/commands/index.d.ts +2 -0
  13. package/dist/types/commands/observe.d.ts +1 -1
  14. package/dist/types/commands/setup.d.ts +2 -2
  15. package/dist/types/lib/bandada.d.ts +6 -0
  16. package/dist/types/lib/files.d.ts +1 -0
  17. package/dist/types/lib/localConfigs.d.ts +38 -0
  18. package/dist/types/lib/prompts.d.ts +6 -6
  19. package/dist/types/lib/utils.d.ts +3 -2
  20. package/dist/types/types/index.d.ts +63 -0
  21. package/package.json +12 -4
  22. package/src/commands/auth.ts +24 -8
  23. package/src/commands/authBandada.ts +120 -0
  24. package/src/commands/authSIWE.ts +178 -0
  25. package/src/commands/ceremony/index.ts +20 -0
  26. package/src/commands/ceremony/listParticipants.ts +30 -0
  27. package/src/commands/contribute.ts +27 -18
  28. package/src/commands/finalize.ts +22 -13
  29. package/src/commands/index.ts +3 -1
  30. package/src/commands/listCeremonies.ts +2 -3
  31. package/src/commands/logout.ts +3 -1
  32. package/src/commands/observe.ts +3 -3
  33. package/src/commands/setup.ts +56 -45
  34. package/src/commands/validate.ts +2 -3
  35. package/src/index.ts +35 -13
  36. package/src/lib/bandada.ts +51 -0
  37. package/src/lib/errors.ts +1 -1
  38. package/src/lib/localConfigs.ts +55 -1
  39. package/src/lib/prompts.ts +20 -20
  40. package/src/lib/services.ts +39 -16
  41. package/src/lib/utils.ts +45 -10
  42. package/src/types/index.ts +68 -0
@@ -2,17 +2,22 @@ import {
2
2
  getCurrentFirebaseAuthUser,
3
3
  initializeFirebaseCoreServices,
4
4
  signInToFirebaseWithCredentials
5
- } from "@p0tion/actions"
5
+ } from "@devtion/actions"
6
6
  import clear from "clear"
7
7
  import figlet from "figlet"
8
8
  import { FirebaseApp } from "firebase/app"
9
- import { OAuthCredential } from "firebase/auth"
9
+ import { OAuthCredential, getAuth, signInWithCustomToken } from "firebase/auth"
10
10
  import dotenv from "dotenv"
11
11
  import { fileURLToPath } from "url"
12
12
  import { dirname } from "path"
13
13
  import { AuthUser } from "../types/index.js"
14
14
  import { CONFIG_ERRORS, CORE_SERVICES_ERRORS, showError, THIRD_PARTY_SERVICES_ERRORS } from "./errors.js"
15
- import { checkLocalAccessToken, deleteLocalAccessToken, getLocalAccessToken } from "./localConfigs.js"
15
+ import {
16
+ checkLocalAccessToken,
17
+ deleteLocalAccessToken,
18
+ getLocalAccessToken,
19
+ getLocalAuthMethod
20
+ } from "./localConfigs.js"
16
21
  import theme from "./theme.js"
17
22
  import { exchangeGithubTokenForCredentials, getGithubProviderUserId, getUserHandleFromProviderUserId } from "./utils.js"
18
23
 
@@ -117,8 +122,6 @@ export const signInToFirebase = async (firebaseApp: FirebaseApp, credentials: OA
117
122
  }
118
123
  }
119
124
 
120
-
121
-
122
125
  /**
123
126
  * Ensure that the callee is an authenticated user.
124
127
  * @notice The token will be passed as parameter.
@@ -166,22 +169,42 @@ export const checkAuth = async (firebaseApp: FirebaseApp): Promise<AuthUser> =>
166
169
  // Retrieve local access token.
167
170
  const token = String(getLocalAccessToken())
168
171
 
169
- // Get credentials.
170
- const credentials = exchangeGithubTokenForCredentials(token)
171
-
172
- // Sign in to Firebase using credentials.
173
- await signInToFirebase(firebaseApp, credentials)
172
+ let providerUserId: string
173
+ let username: string
174
+ const authMethod = getLocalAuthMethod()
175
+ switch (authMethod) {
176
+ case "github": {
177
+ // Get credentials.
178
+ const credentials = exchangeGithubTokenForCredentials(token)
179
+ // Sign in to Firebase using credentials.
180
+ await signInToFirebase(firebaseApp, credentials)
181
+ // Get Github unique identifier (handle-id).
182
+ providerUserId = await getGithubProviderUserId(String(token))
183
+ username = getUserHandleFromProviderUserId(providerUserId)
184
+ break
185
+ }
186
+ case "bandada": {
187
+ const userCredentials = await signInWithCustomToken(getAuth(), token)
188
+ providerUserId = userCredentials.user.uid
189
+ username = providerUserId
190
+ break
191
+ }
192
+ case "siwe": {
193
+ const userCredentials = await signInWithCustomToken(getAuth(), token)
194
+ providerUserId = userCredentials.user.uid
195
+ username = providerUserId
196
+ break
197
+ }
198
+ default: {
199
+ break
200
+ }
201
+ }
174
202
 
175
203
  // Get current authenticated user.
176
204
  const user = getCurrentFirebaseAuthUser(firebaseApp)
177
205
 
178
- // Get Github unique identifier (handle-id).
179
- const providerUserId = await getGithubProviderUserId(String(token))
180
-
181
206
  // Greet the user.
182
- console.log(
183
- `Greetings, @${theme.text.bold(getUserHandleFromProviderUserId(providerUserId))} ${theme.emojis.wave}\n`
184
- )
207
+ console.log(`Greetings, @${theme.text.bold(username)} ${theme.emojis.wave}\n`)
185
208
 
186
209
  return {
187
210
  user,
package/src/lib/utils.ts CHANGED
@@ -19,7 +19,7 @@ import {
19
19
  permanentlyStoreCurrentContributionTimeAndHash,
20
20
  progressToNextContributionStep,
21
21
  verifyContribution
22
- } from "@p0tion/actions"
22
+ } from "@devtion/actions"
23
23
  import { Presets, SingleBar } from "cli-progress"
24
24
  import dotenv from "dotenv"
25
25
  import { GithubAuthProvider, OAuthCredential } from "firebase/auth"
@@ -155,7 +155,9 @@ export const getPublicAttestationGist = async (
155
155
  * @returns <string> - the third-party provider handle of the user.
156
156
  */
157
157
  export const getUserHandleFromProviderUserId = (providerUserId: string): string => {
158
- if (providerUserId.indexOf("-") === -1) showError(THIRD_PARTY_SERVICES_ERRORS.GITHUB_GET_GITHUB_ACCOUNT_INFO, true)
158
+ if (providerUserId.indexOf("-") === -1) {
159
+ return providerUserId
160
+ }
159
161
 
160
162
  return providerUserId.split("-")[0]
161
163
  }
@@ -311,8 +313,22 @@ export const generateCustomUrlToTweetAboutParticipation = (
311
313
  isFinalizing: boolean
312
314
  ) =>
313
315
  isFinalizing
314
- ? `https://twitter.com/intent/tweet?text=I%20have%20finalized%20the%20${ceremonyName}%20Phase%202%20Trusted%20Setup%20ceremony!%20You%20can%20view%20my%20final%20attestation%20here:%20${gistUrl}%20#Ethereum%20#ZKP%20#PSE`
315
- : `https://twitter.com/intent/tweet?text=I%20contributed%20to%20the%20${ceremonyName}%20Phase%202%20Trusted%20Setup%20ceremony!%20You%20can%20contribute%20here:%20https://github.com/privacy-scaling-explorations/p0tion%20You%20can%20view%20my%20attestation%20here:%20${gistUrl}%20#Ethereum%20#ZKP`
316
+ ? `https://twitter.com/intent/tweet?text=I%20have%20finalized%20the%20${ceremonyName}${
317
+ ceremonyName.toLowerCase().includes("trusted") ||
318
+ ceremonyName.toLowerCase().includes("setup") ||
319
+ ceremonyName.toLowerCase().includes("phase2") ||
320
+ ceremonyName.toLowerCase().includes("ceremony")
321
+ ? "!"
322
+ : "%20Phase%202%20Trusted%20Setup%20ceremony!"
323
+ }%20You%20can%20view%20my%20final%20attestation%20here:%20${gistUrl}%20#Ethereum%20#ZKP%20#PSE`
324
+ : `https://twitter.com/intent/tweet?text=I%20contributed%20to%20the%20${ceremonyName}${
325
+ ceremonyName.toLowerCase().includes("trusted") ||
326
+ ceremonyName.toLowerCase().includes("setup") ||
327
+ ceremonyName.toLowerCase().includes("phase2") ||
328
+ ceremonyName.toLowerCase().includes("ceremony")
329
+ ? "!"
330
+ : "%20Phase%202%20Trusted%20Setup%20ceremony!"
331
+ }%20You%20can%20view%20the%20steps%20to%20contribute%20here:%20https://ceremony.pse.dev%20You%20can%20view%20my%20attestation%20here:%20${gistUrl}%20#Ethereum%20#ZKP`
316
332
 
317
333
  /**
318
334
  * Return a custom progress bar.
@@ -521,6 +537,7 @@ export const getLatestUpdatesFromParticipant = async (
521
537
  * @param entropyOrBeaconHash <string> - the entropy or beacon hash (only when finalizing) for the contribution.
522
538
  * @param contributorOrCoordinatorIdentifier <string> - the identifier of the contributor or coordinator (only when finalizing).
523
539
  * @param isFinalizing <boolean> - flag to discriminate between ceremony finalization (true) and contribution (false).
540
+ * @param circuitsLength <number> - the total number of circuits in the ceremony.
524
541
  */
525
542
  export const handleStartOrResumeContribution = async (
526
543
  cloudFunctions: Functions,
@@ -530,7 +547,8 @@ export const handleStartOrResumeContribution = async (
530
547
  participant: FirebaseDocumentInfo,
531
548
  entropyOrBeaconHash: any,
532
549
  contributorOrCoordinatorIdentifier: string,
533
- isFinalizing: boolean
550
+ isFinalizing: boolean,
551
+ circuitsLength: number
534
552
  ): Promise<void> => {
535
553
  // Extract data.
536
554
  const { prefix: ceremonyPrefix } = ceremony.data
@@ -538,7 +556,9 @@ export const handleStartOrResumeContribution = async (
538
556
  const { completedContributions } = waitingQueue // = current progress.
539
557
 
540
558
  console.log(
541
- `${theme.text.bold(`\n- Circuit # ${theme.colors.magenta(`${sequencePosition}`)}`)} (Contribution Steps)`
559
+ `${theme.text.bold(
560
+ `\n- Circuit # ${theme.colors.magenta(`${sequencePosition}/${circuitsLength}`)}`
561
+ )} (Contribution Steps)`
542
562
  )
543
563
 
544
564
  // Get most up-to-date data from the participant document.
@@ -607,6 +627,8 @@ export const handleStartOrResumeContribution = async (
607
627
  `${theme.symbols.success} Contribution ${theme.text.bold(`#${lastZkeyIndex}`)} correctly downloaded`
608
628
  )
609
629
 
630
+ await sleep(3000)
631
+
610
632
  // Advance to next contribution step (COMPUTING) if not finalizing.
611
633
  if (!isFinalizing) {
612
634
  spinner.text = `Preparing for contribution computation...`
@@ -650,6 +672,8 @@ export const handleStartOrResumeContribution = async (
650
672
  // Format contribution hash.
651
673
  const contributionHash = matchContributionHash?.at(0)?.replace("\n\t\t", "")!
652
674
 
675
+ await sleep(500)
676
+
653
677
  // Make request to cloud functions to permanently store the information.
654
678
  await permanentlyStoreCurrentContributionTimeAndHash(
655
679
  cloudFunctions,
@@ -675,6 +699,9 @@ export const handleStartOrResumeContribution = async (
675
699
  )}`
676
700
  )
677
701
 
702
+ // ensure the previous step is completed
703
+ await sleep(5000)
704
+
678
705
  // Advance to next contribution step (UPLOADING) if not finalizing.
679
706
  if (!isFinalizing) {
680
707
  spinner.text = `Preparing for uploading the contribution...`
@@ -696,10 +723,12 @@ export const handleStartOrResumeContribution = async (
696
723
  !isFinalizing ? theme.text.bold(`#${nextZkeyIndex}`) : ""
697
724
  } to storage.\n${
698
725
  theme.symbols.warning
699
- } This step may take a while based on circuit size and your contribution speed. Everything's fine, just be patient.`
726
+ } This step may take a while based on circuit size and your internet speed. Everything's fine, just be patient.`
700
727
  spinner.start()
701
728
 
702
- if (!isFinalizing)
729
+ const progressBar = customProgressBar(ProgressBarType.UPLOAD, `your contribution`)
730
+
731
+ if (!isFinalizing) {
703
732
  await multiPartUpload(
704
733
  cloudFunctions,
705
734
  bucketName,
@@ -707,9 +736,12 @@ export const handleStartOrResumeContribution = async (
707
736
  nextZkeyLocalFilePath,
708
737
  Number(process.env.CONFIG_STREAM_CHUNK_SIZE_IN_MB),
709
738
  ceremony.id,
710
- participantData.tempContributionData
739
+ participantData.tempContributionData,
740
+ progressBar
711
741
  )
712
- else
742
+
743
+ progressBar.stop()
744
+ } else
713
745
  await multiPartUpload(
714
746
  cloudFunctions,
715
747
  bucketName,
@@ -718,6 +750,9 @@ export const handleStartOrResumeContribution = async (
718
750
  Number(process.env.CONFIG_STREAM_CHUNK_SIZE_IN_MB)
719
751
  )
720
752
 
753
+ // small sleep to ensure the previous step is completed
754
+ await sleep(5000)
755
+
721
756
  spinner.succeed(
722
757
  `${
723
758
  isFinalizing ? `Contribution` : `Contribution ${theme.text.bold(`#${nextZkeyIndex}`)}`
@@ -68,3 +68,71 @@ export type GithubGistFile = {
68
68
  raw_url: string
69
69
  size: number
70
70
  }
71
+
72
+ /**
73
+ * Define the return object of the function that verifies the Bandada membership and proof.
74
+ * @typedef {Object} VerifiedBandadaResponse
75
+ * @property {boolean} valid - true if the proof is valid and the user is a member of the group; otherwise false.
76
+ * @property {string} message - a message describing the result of the verification.
77
+ * @property {string} token - the custom access token.
78
+ */
79
+ export type VerifiedBandadaResponse = {
80
+ valid: boolean
81
+ message: string
82
+ token: string
83
+ }
84
+
85
+ /**
86
+ * Define the return object of the device code uri request.
87
+ * @typedef {Object} OAuthDeviceCodeResponse
88
+ * @property {string} device_code - the device code.
89
+ * @property {string} user_code - the user code.
90
+ * @property {string} verification_uri - the verification uri.
91
+ * @property {number} expires_in - the expiration time in seconds.
92
+ * @property {number} interval - the interval time in seconds.
93
+ * @property {string} verification_uri_complete - the complete verification uri.
94
+ */
95
+ export type OAuthDeviceCodeResponse = {
96
+ device_code: string
97
+ user_code: string
98
+ verification_uri: string
99
+ expires_in: number
100
+ interval: number
101
+ verification_uri_complete: string
102
+ }
103
+
104
+ /**
105
+ * Define the return object of the polling endpoint
106
+ * @typedef {Object} OAuthTokenResponse
107
+ * @property {string} access_token - the resulting device flow token
108
+ * @property {string} token_type - token type
109
+ * @property {number} expires_in - when does the token expires
110
+ * @property {string} scope - the scope requested by the initial device flow endpoint
111
+ * @property {string} refresh_token - refresh token
112
+ * @property {string} id_token - id token
113
+ * @property {string} error - in case there was an error
114
+ * @property {string} error_description - error details
115
+ */
116
+ export type OAuthTokenResponse = {
117
+ access_token: string
118
+ token_type: string
119
+ expires_in: number
120
+ scope: string
121
+ refresh_token: string
122
+ id_token: string
123
+ // error response should contain
124
+ error?: string
125
+ error_description?: string
126
+ }
127
+
128
+ /**
129
+ * @typedef {Object} CheckNonceOfSIWEAddressResponse
130
+ * @property {boolean} valid - if the checking was valid or not
131
+ * @property {string} message - more information about the validity
132
+ * @property {string} token - token to sign into Firebase
133
+ */
134
+ export type CheckNonceOfSIWEAddressResponse = {
135
+ valid: boolean
136
+ message: string
137
+ token: string
138
+ }