@devtion/backend 0.0.0-101d43f → 0.0.0-2ed8e18

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.
@@ -1,6 +1,6 @@
1
1
  /**
2
- * @module @p0tion/backend
3
- * @version 1.0.6
2
+ * @module @devtion/backend
3
+ * @version 1.0.9
4
4
  * @file MPC Phase 2 backend for Firebase services management
5
5
  * @copyright Ethereum Foundation 2022
6
6
  * @license MIT
@@ -9,7 +9,7 @@
9
9
  import admin from 'firebase-admin';
10
10
  import * as functions from 'firebase-functions';
11
11
  import dotenv from 'dotenv';
12
- import { getCircuitsCollectionPath, getTimeoutsCollectionPath, commonTerms, finalContributionIndex, getContributionsCollectionPath, githubReputation, getBucketName, vmBootstrapCommand, vmDependenciesAndCacheArtifactsCommand, vmBootstrapScriptFilename, computeDiskSizeForVM, createEC2Instance, getParticipantsCollectionPath, terminateEC2Instance, formatZkeyIndex, getTranscriptStorageFilePath, getZkeyStorageFilePath, startEC2Instance, vmContributionVerificationCommand, runCommandUsingSSM, getPotStorageFilePath, genesisZkeyIndex, createCustomLoggerForFile, blake512FromPath, getVerificationKeyStorageFilePath, getVerifierContractStorageFilePath, computeSHA256ToHex, retrieveCommandStatus, checkIfRunning, retrieveCommandOutput, stopEC2Instance, verificationKeyAcronym, verifierSmartContractAcronym } from '@p0tion/actions';
12
+ import { getCircuitsCollectionPath, getTimeoutsCollectionPath, commonTerms, finalContributionIndex, getContributionsCollectionPath, githubReputation, getBucketName, vmBootstrapCommand, vmDependenciesAndCacheArtifactsCommand, vmBootstrapScriptFilename, computeDiskSizeForVM, createEC2Instance, getParticipantsCollectionPath, terminateEC2Instance, formatZkeyIndex, getTranscriptStorageFilePath, getZkeyStorageFilePath, startEC2Instance, vmContributionVerificationCommand, runCommandUsingSSM, getPotStorageFilePath, genesisZkeyIndex, createCustomLoggerForFile, blake512FromPath, getVerificationKeyStorageFilePath, getVerifierContractStorageFilePath, computeSHA256ToHex, checkIfRunning, retrieveCommandOutput, stopEC2Instance, verificationKeyAcronym, verifierSmartContractAcronym, retrieveCommandStatus } from '@devtion/actions';
13
13
  import { encode } from 'html-entities';
14
14
  import { Timestamp, FieldValue } from 'firebase-admin/firestore';
15
15
  import { S3Client, GetObjectCommand, PutObjectCommand, DeleteObjectCommand, HeadBucketCommand, CreateBucketCommand, PutPublicAccessBlockCommand, PutBucketCorsCommand, HeadObjectCommand, CreateMultipartUploadCommand, UploadPartCommand, CompleteMultipartUploadCommand } from '@aws-sdk/client-s3';
@@ -19,7 +19,7 @@ import { pipeline } from 'node:stream';
19
19
  import { promisify } from 'node:util';
20
20
  import fs, { readFileSync } from 'fs';
21
21
  import mime from 'mime-types';
22
- import { setTimeout } from 'timers/promises';
22
+ import { setTimeout as setTimeout$1 } from 'timers/promises';
23
23
  import fetch from '@adobe/node-fetch-retry';
24
24
  import path from 'path';
25
25
  import os from 'os';
@@ -121,7 +121,8 @@ const SPECIFIC_ERRORS = {
121
121
  SE_VM_FAILED_COMMAND_EXECUTION: makeError("failed-precondition", "VM command execution failed", "Please, contact the coordinator if this error persists."),
122
122
  SE_VM_TIMEDOUT_COMMAND_EXECUTION: makeError("deadline-exceeded", "VM command execution took too long and has been timed-out", "Please, contact the coordinator if this error persists."),
123
123
  SE_VM_CANCELLED_COMMAND_EXECUTION: makeError("cancelled", "VM command execution has been cancelled", "Please, contact the coordinator if this error persists."),
124
- SE_VM_DELAYED_COMMAND_EXECUTION: makeError("unavailable", "VM command execution has been delayed since there were no available instance at the moment", "Please, contact the coordinator if this error persists.")
124
+ SE_VM_DELAYED_COMMAND_EXECUTION: makeError("unavailable", "VM command execution has been delayed since there were no available instance at the moment", "Please, contact the coordinator if this error persists."),
125
+ SE_VM_UNKNOWN_COMMAND_STATUS: makeError("unavailable", "VM command execution has failed due to an unknown status code", "Please, contact the coordinator if this error persists.")
125
126
  };
126
127
  /**
127
128
  * A set of common errors.
@@ -191,7 +192,7 @@ const getCurrentServerTimestampInMillis = () => Timestamp.now().toMillis();
191
192
  * Interrupt the current execution for a specified amount of time.
192
193
  * @param ms <number> - the amount of time expressed in milliseconds.
193
194
  */
194
- const sleep = async (ms) => setTimeout(ms);
195
+ const sleep = async (ms) => setTimeout$1(ms);
195
196
  /**
196
197
  * Query for ceremony circuits.
197
198
  * @notice the order by sequence position is fundamental to maintain parallelism among contributions for different circuits.
@@ -305,7 +306,7 @@ const downloadArtifactFromS3Bucket = async (bucketName, objectKey, localFilePath
305
306
  const writeStream = createWriteStream(localFilePath);
306
307
  const streamPipeline = promisify(pipeline);
307
308
  await streamPipeline(response.body, writeStream);
308
- writeStream.on('finish', () => {
309
+ writeStream.on("finish", () => {
309
310
  writeStream.end();
310
311
  });
311
312
  };
@@ -539,7 +540,9 @@ const registerAuthUser = functions
539
540
  // Delete user
540
541
  await auth.deleteUser(user.uid);
541
542
  // Throw error
542
- logAndThrowError(makeError("permission-denied", "The user is not allowed to sign up because their Github reputation is not high enough.", `The user ${user.displayName === "Null" || user.displayName === null ? user.uid : user.displayName} is not allowed to sign up because their Github reputation is not high enough. Please contact the administrator if you think this is a mistake.`));
543
+ logAndThrowError(makeError("permission-denied", "The user is not allowed to sign up because their Github reputation is not high enough.", `The user ${user.displayName === "Null" || user.displayName === null
544
+ ? user.uid
545
+ : user.displayName} is not allowed to sign up because their Github reputation is not high enough. Please contact the administrator if you think this is a mistake.`));
543
546
  }
544
547
  // store locally
545
548
  avatarUrl = avatarURL;
@@ -554,7 +557,7 @@ const registerAuthUser = functions
554
557
  }
555
558
  // Set document (nb. we refer to providerData[0] because we use Github OAuth provider only).
556
559
  // In future releases we might want to loop through the providerData array as we support
557
- // more providers.
560
+ // more providers.
558
561
  await userRef.set({
559
562
  name: encodedDisplayName,
560
563
  encodedDisplayName,
@@ -570,7 +573,7 @@ const registerAuthUser = functions
570
573
  // we want to create a new collection for the users to store the avatars
571
574
  const avatarRef = firestore.collection(commonTerms.collections.avatars.name).doc(uid);
572
575
  await avatarRef.set({
573
- avatarUrl: avatarUrl || "",
576
+ avatarUrl: avatarUrl || ""
574
577
  });
575
578
  printLog(`Authenticated user document with identifier ${uid} has been correctly stored`, LogLevel.DEBUG);
576
579
  printLog(`Authenticated user avatar with identifier ${uid} has been correctly stored`, LogLevel.DEBUG);
@@ -710,7 +713,7 @@ const setupCeremony = functions
710
713
  // Check if using the VM approach for contribution verification.
711
714
  if (circuit.verification.cfOrVm === "VM" /* CircuitContributionVerificationMechanism.VM */) {
712
715
  // VM command to be run at the startup.
713
- const startupCommand = vmBootstrapCommand(bucketName);
716
+ const startupCommand = vmBootstrapCommand(`${bucketName}/circuits/${circuit.name}`);
714
717
  // Get EC2 client.
715
718
  const ec2Client = await createEC2Client();
716
719
  // Get AWS variables.
@@ -719,7 +722,8 @@ const setupCeremony = functions
719
722
  const vmCommands = vmDependenciesAndCacheArtifactsCommand(`${bucketName}/${circuit.files?.initialZkeyStoragePath}`, `${bucketName}/${circuit.files?.potStoragePath}`, snsTopic, region);
720
723
  printLog(`Check VM dependencies and cache artifacts commands ${vmCommands.join("\n")}`, LogLevel.DEBUG);
721
724
  // Upload the post-startup commands script file.
722
- await uploadFileToBucketNoFile(bucketName, vmBootstrapScriptFilename, vmCommands.join("\n"));
725
+ printLog(`Uploading VM post-startup commands script file ${vmBootstrapScriptFilename}`, LogLevel.DEBUG);
726
+ await uploadFileToBucketNoFile(bucketName, `circuits/${circuit.name}/${vmBootstrapScriptFilename}`, vmCommands.join("\n"));
723
727
  // Compute the VM disk space requirement (in GB).
724
728
  const vmDiskSize = computeDiskSizeForVM(circuit.zKeySizeInBytes, circuit.metadata?.pot);
725
729
  printLog(`Check VM startup commands ${startupCommand.join("\n")}`, LogLevel.DEBUG);
@@ -866,7 +870,7 @@ dotenv.config();
866
870
  * @dev true when the participant can participate (1.A, 3.B, 1.D); otherwise false.
867
871
  */
868
872
  const checkParticipantForCeremony = functions
869
- .region('europe-west1')
873
+ .region("europe-west1")
870
874
  .runWith({
871
875
  memory: "512MB"
872
876
  })
@@ -970,7 +974,7 @@ const checkParticipantForCeremony = functions
970
974
  * 2) the participant has just finished the contribution for a circuit (contributionProgress != 0 && status = CONTRIBUTED && contributionStep = COMPLETED).
971
975
  */
972
976
  const progressToNextCircuitForContribution = functions
973
- .region('europe-west1')
977
+ .region("europe-west1")
974
978
  .runWith({
975
979
  memory: "512MB"
976
980
  })
@@ -1017,7 +1021,7 @@ const progressToNextCircuitForContribution = functions
1017
1021
  * 5) Completed contribution computation and verification.
1018
1022
  */
1019
1023
  const progressToNextContributionStep = functions
1020
- .region('europe-west1')
1024
+ .region("europe-west1")
1021
1025
  .runWith({
1022
1026
  memory: "512MB"
1023
1027
  })
@@ -1068,7 +1072,7 @@ const progressToNextContributionStep = functions
1068
1072
  * @dev enable the current contributor to resume a contribution from where it had left off.
1069
1073
  */
1070
1074
  const permanentlyStoreCurrentContributionTimeAndHash = functions
1071
- .region('europe-west1')
1075
+ .region("europe-west1")
1072
1076
  .runWith({
1073
1077
  memory: "512MB"
1074
1078
  })
@@ -1110,7 +1114,7 @@ const permanentlyStoreCurrentContributionTimeAndHash = functions
1110
1114
  * @dev enable the current contributor to resume a multi-part upload from where it had left off.
1111
1115
  */
1112
1116
  const temporaryStoreCurrentContributionMultiPartUploadId = functions
1113
- .region('europe-west1')
1117
+ .region("europe-west1")
1114
1118
  .runWith({
1115
1119
  memory: "512MB"
1116
1120
  })
@@ -1148,7 +1152,7 @@ const temporaryStoreCurrentContributionMultiPartUploadId = functions
1148
1152
  * @dev enable the current contributor to resume a multi-part upload from where it had left off.
1149
1153
  */
1150
1154
  const temporaryStoreCurrentContributionUploadedChunkData = functions
1151
- .region('europe-west1')
1155
+ .region("europe-west1")
1152
1156
  .runWith({
1153
1157
  memory: "512MB"
1154
1158
  })
@@ -1190,7 +1194,7 @@ const temporaryStoreCurrentContributionUploadedChunkData = functions
1190
1194
  * contributed to every selected ceremony circuits (= DONE).
1191
1195
  */
1192
1196
  const checkAndPrepareCoordinatorForFinalization = functions
1193
- .region('europe-west1')
1197
+ .region("europe-west1")
1194
1198
  .runWith({
1195
1199
  memory: "512MB"
1196
1200
  })
@@ -1342,39 +1346,54 @@ const coordinate = async (participant, circuit, isSingleParticipantCoordination,
1342
1346
  * Wait until the command has completed its execution inside the VM.
1343
1347
  * @dev this method implements a custom interval to check 5 times after 1 minute if the command execution
1344
1348
  * has been completed or not by calling the `retrieveCommandStatus` method.
1345
- * @param {any} resolve the promise.
1346
- * @param {any} reject the promise.
1347
1349
  * @param {SSMClient} ssm the SSM client.
1348
1350
  * @param {string} vmInstanceId the unique identifier of the VM instance.
1349
1351
  * @param {string} commandId the unique identifier of the VM command.
1350
1352
  * @returns <Promise<void>> true when the command execution succeed; otherwise false.
1351
1353
  */
1352
- const waitForVMCommandExecution = (resolve, reject, ssm, vmInstanceId, commandId) => {
1353
- const interval = setInterval(async () => {
1354
+ const waitForVMCommandExecution = (ssm, vmInstanceId, commandId) => new Promise((resolve, reject) => {
1355
+ const poll = async () => {
1354
1356
  try {
1355
1357
  // Get command status.
1356
1358
  const cmdStatus = await retrieveCommandStatus(ssm, vmInstanceId, commandId);
1357
1359
  printLog(`Checking command ${commandId} status => ${cmdStatus}`, LogLevel.DEBUG);
1358
- if (cmdStatus === CommandInvocationStatus.SUCCESS) {
1359
- printLog(`Command ${commandId} successfully completed`, LogLevel.DEBUG);
1360
- // Resolve the promise.
1361
- resolve();
1362
- }
1363
- else if (cmdStatus === CommandInvocationStatus.FAILED) {
1364
- logAndThrowError(SPECIFIC_ERRORS.SE_VM_FAILED_COMMAND_EXECUTION);
1365
- reject();
1366
- }
1367
- else if (cmdStatus === CommandInvocationStatus.TIMED_OUT) {
1368
- logAndThrowError(SPECIFIC_ERRORS.SE_VM_TIMEDOUT_COMMAND_EXECUTION);
1369
- reject();
1370
- }
1371
- else if (cmdStatus === CommandInvocationStatus.CANCELLED) {
1372
- logAndThrowError(SPECIFIC_ERRORS.SE_VM_CANCELLED_COMMAND_EXECUTION);
1373
- reject();
1360
+ let error;
1361
+ switch (cmdStatus) {
1362
+ case CommandInvocationStatus.CANCELLING:
1363
+ case CommandInvocationStatus.CANCELLED: {
1364
+ error = SPECIFIC_ERRORS.SE_VM_CANCELLED_COMMAND_EXECUTION;
1365
+ break;
1366
+ }
1367
+ case CommandInvocationStatus.DELAYED: {
1368
+ error = SPECIFIC_ERRORS.SE_VM_DELAYED_COMMAND_EXECUTION;
1369
+ break;
1370
+ }
1371
+ case CommandInvocationStatus.FAILED: {
1372
+ error = SPECIFIC_ERRORS.SE_VM_FAILED_COMMAND_EXECUTION;
1373
+ break;
1374
+ }
1375
+ case CommandInvocationStatus.TIMED_OUT: {
1376
+ error = SPECIFIC_ERRORS.SE_VM_TIMEDOUT_COMMAND_EXECUTION;
1377
+ break;
1378
+ }
1379
+ case CommandInvocationStatus.IN_PROGRESS:
1380
+ case CommandInvocationStatus.PENDING: {
1381
+ // wait a minute and poll again
1382
+ setTimeout(poll, 60000);
1383
+ return;
1384
+ }
1385
+ case CommandInvocationStatus.SUCCESS: {
1386
+ printLog(`Command ${commandId} successfully completed`, LogLevel.DEBUG);
1387
+ // Resolve the promise.
1388
+ resolve();
1389
+ return;
1390
+ }
1391
+ default: {
1392
+ logAndThrowError(SPECIFIC_ERRORS.SE_VM_UNKNOWN_COMMAND_STATUS);
1393
+ }
1374
1394
  }
1375
- else if (cmdStatus === CommandInvocationStatus.DELAYED) {
1376
- logAndThrowError(SPECIFIC_ERRORS.SE_VM_DELAYED_COMMAND_EXECUTION);
1377
- reject();
1395
+ if (error) {
1396
+ logAndThrowError(error);
1378
1397
  }
1379
1398
  }
1380
1399
  catch (error) {
@@ -1384,12 +1403,9 @@ const waitForVMCommandExecution = (resolve, reject, ssm, vmInstanceId, commandId
1384
1403
  // Reject the promise.
1385
1404
  reject();
1386
1405
  }
1387
- finally {
1388
- // Clear the interval.
1389
- clearInterval(interval);
1390
- }
1391
- }, 60000); // 1 minute.
1392
- };
1406
+ };
1407
+ setTimeout(poll, 60000);
1408
+ });
1393
1409
  /**
1394
1410
  * This method is used to coordinate the waiting queues of ceremony circuits.
1395
1411
  * @dev this cloud function is triggered whenever an update of a document related to a participant of a ceremony occurs.
@@ -1410,7 +1426,7 @@ const waitForVMCommandExecution = (resolve, reject, ssm, vmInstanceId, commandId
1410
1426
  * - Just completed a contribution or all contributions for each circuit. If yes, coordinate (multi-participant scenario).
1411
1427
  */
1412
1428
  const coordinateCeremonyParticipant = functionsV1
1413
- .region('europe-west1')
1429
+ .region("europe-west1")
1414
1430
  .runWith({
1415
1431
  memory: "512MB"
1416
1432
  })
@@ -1513,7 +1529,7 @@ const checkIfVMRunning = async (ec2, vmInstanceId, attempts = 5) => {
1513
1529
  * 1.A.4.C.1) If true, update circuit waiting for queue and average timings accordingly to contribution verification results;
1514
1530
  * 2) Send all updates atomically to the Firestore database.
1515
1531
  */
1516
- const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSeconds: 3600, region: 'europe-west1' }, async (request) => {
1532
+ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSeconds: 3600, region: "europe-west1" }, async (request) => {
1517
1533
  if (!request.auth || (!request.auth.token.participant && !request.auth.token.coordinator))
1518
1534
  logAndThrowError(SPECIFIC_ERRORS.SE_AUTH_NO_CURRENT_AUTH_USER);
1519
1535
  if (!request.data.ceremonyId ||
@@ -1624,8 +1640,6 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
1624
1640
  lastZkeyBlake2bHash = match.at(0);
1625
1641
  // re upload the formatted verification transcript
1626
1642
  await uploadFileToBucket(bucketName, verificationTranscriptStoragePathAndFilename, verificationTranscriptTemporaryLocalPath, true);
1627
- // Stop VM instance.
1628
- await stopEC2Instance(ec2, vmInstanceId);
1629
1643
  }
1630
1644
  else {
1631
1645
  // Upload verification transcript.
@@ -1686,6 +1700,9 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
1686
1700
  lastUpdated: getCurrentServerTimestampInMillis()
1687
1701
  });
1688
1702
  }
1703
+ // Stop VM instance
1704
+ if (isUsingVM)
1705
+ await stopEC2Instance(ec2, vmInstanceId);
1689
1706
  // Step (1.A.4.C)
1690
1707
  if (!isFinalizing) {
1691
1708
  // Step (1.A.4.C.1)
@@ -1700,7 +1717,7 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
1700
1717
  const newAvgVerifyCloudFunctionTime = avgVerifyCloudFunctionTime > 0
1701
1718
  ? (avgVerifyCloudFunctionTime + verifyCloudFunctionTime) / 2
1702
1719
  : verifyCloudFunctionTime;
1703
- // Prepare tx to update circuit average contribution/verification time.
1720
+ // Prepare tx to update circuit average contribution/verification time.
1704
1721
  const updatedCircuitDoc = await getDocumentById(getCircuitsCollectionPath(ceremonyId), circuitId);
1705
1722
  const { waitingQueue: updatedWaitingQueue } = updatedCircuitDoc.data();
1706
1723
  /// @dev this must happen only for valid contributions.
@@ -1750,7 +1767,7 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
1750
1767
  commandId = await runCommandUsingSSM(ssm, vmInstanceId, verificationCommand);
1751
1768
  printLog(`Starting the execution of command ${commandId}`, LogLevel.DEBUG);
1752
1769
  // Step (1.A.3.3).
1753
- return new Promise((resolve, reject) => waitForVMCommandExecution(resolve, reject, ssm, vmInstanceId, commandId))
1770
+ return waitForVMCommandExecution(ssm, vmInstanceId, commandId)
1754
1771
  .then(async () => {
1755
1772
  // Command execution successfully completed.
1756
1773
  printLog(`Command ${commandId} execution has been successfully completed`, LogLevel.DEBUG);
@@ -1762,40 +1779,38 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
1762
1779
  logAndThrowError(COMMON_ERRORS.CM_INVALID_COMMAND_EXECUTION);
1763
1780
  });
1764
1781
  }
1765
- else {
1766
- // CF approach.
1767
- printLog(`CF mechanism`, LogLevel.DEBUG);
1768
- const potStoragePath = getPotStorageFilePath(files.potFilename);
1769
- const firstZkeyStoragePath = getZkeyStorageFilePath(prefix, `${prefix}_${genesisZkeyIndex}.zkey`);
1770
- // Prepare temporary file paths.
1771
- // (nb. these are needed to download the necessary artifacts for verification from AWS S3).
1772
- verificationTranscriptTemporaryLocalPath = createTemporaryLocalPath(verificationTranscriptCompleteFilename);
1773
- const potTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}.pot`);
1774
- const firstZkeyTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}_genesis.zkey`);
1775
- const lastZkeyTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}_last.zkey`);
1776
- // Create and populate transcript.
1777
- const transcriptLogger = createCustomLoggerForFile(verificationTranscriptTemporaryLocalPath);
1778
- transcriptLogger.info(`${isFinalizing ? `Final verification` : `Verification`} transcript for ${prefix} circuit Phase 2 contribution.\n${isFinalizing ? `Coordinator ` : `Contributor # ${Number(lastZkeyIndex)}`} (${contributorOrCoordinatorIdentifier})\n`);
1779
- // Step (1.A.2).
1780
- await downloadArtifactFromS3Bucket(bucketName, potStoragePath, potTempFilePath);
1781
- await downloadArtifactFromS3Bucket(bucketName, firstZkeyStoragePath, firstZkeyTempFilePath);
1782
- await downloadArtifactFromS3Bucket(bucketName, lastZkeyStoragePath, lastZkeyTempFilePath);
1783
- // Step (1.A.4).
1784
- isContributionValid = await zKey.verifyFromInit(firstZkeyTempFilePath, potTempFilePath, lastZkeyTempFilePath, transcriptLogger);
1785
- // Compute contribution hash.
1786
- lastZkeyBlake2bHash = await blake512FromPath(lastZkeyTempFilePath);
1787
- // Free resources by unlinking temporary folders.
1788
- // Do not free-up verification transcript path here.
1789
- try {
1790
- fs.unlinkSync(potTempFilePath);
1791
- fs.unlinkSync(firstZkeyTempFilePath);
1792
- fs.unlinkSync(lastZkeyTempFilePath);
1793
- }
1794
- catch (error) {
1795
- printLog(`Error while unlinking temporary files - Error ${error}`, LogLevel.WARN);
1796
- }
1797
- await completeVerification();
1782
+ // CF approach.
1783
+ printLog(`CF mechanism`, LogLevel.DEBUG);
1784
+ const potStoragePath = getPotStorageFilePath(files.potFilename);
1785
+ const firstZkeyStoragePath = getZkeyStorageFilePath(prefix, `${prefix}_${genesisZkeyIndex}.zkey`);
1786
+ // Prepare temporary file paths.
1787
+ // (nb. these are needed to download the necessary artifacts for verification from AWS S3).
1788
+ verificationTranscriptTemporaryLocalPath = createTemporaryLocalPath(verificationTranscriptCompleteFilename);
1789
+ const potTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}.pot`);
1790
+ const firstZkeyTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}_genesis.zkey`);
1791
+ const lastZkeyTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}_last.zkey`);
1792
+ // Create and populate transcript.
1793
+ const transcriptLogger = createCustomLoggerForFile(verificationTranscriptTemporaryLocalPath);
1794
+ transcriptLogger.info(`${isFinalizing ? `Final verification` : `Verification`} transcript for ${prefix} circuit Phase 2 contribution.\n${isFinalizing ? `Coordinator ` : `Contributor # ${Number(lastZkeyIndex)}`} (${contributorOrCoordinatorIdentifier})\n`);
1795
+ // Step (1.A.2).
1796
+ await downloadArtifactFromS3Bucket(bucketName, potStoragePath, potTempFilePath);
1797
+ await downloadArtifactFromS3Bucket(bucketName, firstZkeyStoragePath, firstZkeyTempFilePath);
1798
+ await downloadArtifactFromS3Bucket(bucketName, lastZkeyStoragePath, lastZkeyTempFilePath);
1799
+ // Step (1.A.4).
1800
+ isContributionValid = await zKey.verifyFromInit(firstZkeyTempFilePath, potTempFilePath, lastZkeyTempFilePath, transcriptLogger);
1801
+ // Compute contribution hash.
1802
+ lastZkeyBlake2bHash = await blake512FromPath(lastZkeyTempFilePath);
1803
+ // Free resources by unlinking temporary folders.
1804
+ // Do not free-up verification transcript path here.
1805
+ try {
1806
+ fs.unlinkSync(potTempFilePath);
1807
+ fs.unlinkSync(firstZkeyTempFilePath);
1808
+ fs.unlinkSync(lastZkeyTempFilePath);
1809
+ }
1810
+ catch (error) {
1811
+ printLog(`Error while unlinking temporary files - Error ${error}`, LogLevel.WARN);
1798
1812
  }
1813
+ await completeVerification();
1799
1814
  }
1800
1815
  });
1801
1816
  /**
@@ -1804,7 +1819,7 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
1804
1819
  * this does not happen if the participant is actually the coordinator who is finalizing the ceremony.
1805
1820
  */
1806
1821
  const refreshParticipantAfterContributionVerification = functionsV1
1807
- .region('europe-west1')
1822
+ .region("europe-west1")
1808
1823
  .runWith({
1809
1824
  memory: "512MB"
1810
1825
  })
@@ -1865,7 +1880,7 @@ const refreshParticipantAfterContributionVerification = functionsV1
1865
1880
  * and verification key extracted from the circuit final contribution (as part of the ceremony finalization process).
1866
1881
  */
1867
1882
  const finalizeCircuit = functionsV1
1868
- .region('europe-west1')
1883
+ .region("europe-west1")
1869
1884
  .runWith({
1870
1885
  memory: "512MB"
1871
1886
  })
@@ -2062,8 +2077,10 @@ const createBucket = functions
2062
2077
  CORSConfiguration: {
2063
2078
  CORSRules: [
2064
2079
  {
2065
- AllowedMethods: ["GET"],
2066
- AllowedOrigins: ["*"]
2080
+ AllowedMethods: ["GET", "PUT"],
2081
+ AllowedOrigins: ["*"],
2082
+ ExposeHeaders: ["ETag", "Content-Length"],
2083
+ AllowedHeaders: ["*"]
2067
2084
  }
2068
2085
  ]
2069
2086
  }
@@ -2540,7 +2557,8 @@ const resumeContributionAfterTimeoutExpiration = functions
2540
2557
  if (status === "EXHUMED" /* ParticipantStatus.EXHUMED */)
2541
2558
  await participantDoc.ref.update({
2542
2559
  status: "READY" /* ParticipantStatus.READY */,
2543
- lastUpdated: getCurrentServerTimestampInMillis()
2560
+ lastUpdated: getCurrentServerTimestampInMillis(),
2561
+ tempContributionData: {}
2544
2562
  });
2545
2563
  else
2546
2564
  logAndThrowError(SPECIFIC_ERRORS.SE_CONTRIBUTE_CANNOT_PROGRESS_TO_NEXT_CIRCUIT);
@@ -1 +1 @@
1
- {"version":3,"file":"ceremony.d.ts","sourceRoot":"","sources":["../../../src/functions/ceremony.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAuC/C;;;;;GAKG;AACH,eAAO,MAAM,aAAa,kCAiBpB,CAAA;AAEN;;;;;GAKG;AACH,eAAO,MAAM,YAAY,kCAkBnB,CAAA;AAEN;;;;GAIG;AACH,eAAO,MAAM,aAAa,mDAyHpB,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,+BAA+B,oEAsCtC,CAAA;AAEN;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,mDAiEvB,CAAA"}
1
+ {"version":3,"file":"ceremony.d.ts","sourceRoot":"","sources":["../../../src/functions/ceremony.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAuC/C;;;;;GAKG;AACH,eAAO,MAAM,aAAa,kCAiBpB,CAAA;AAEN;;;;;GAKG;AACH,eAAO,MAAM,YAAY,kCAkBnB,CAAA;AAEN;;;;GAIG;AACH,eAAO,MAAM,aAAa,mDA8HpB,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,+BAA+B,oEAsCtC,CAAA;AAEN;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,mDAiEvB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"circuit.d.ts","sourceRoot":"","sources":["../../../src/functions/circuit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAA;AAyCpD,OAAO,EAAuB,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAkO5E;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,6BAA6B,4FAoGpC,CAAA;AA8BN;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,kBAAkB,0EA0Z9B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,+CAA+C,wEA4EtD,CAAA;AAEN;;;;GAIG;AACH,eAAO,MAAM,eAAe,uDA8EtB,CAAA"}
1
+ {"version":3,"file":"circuit.d.ts","sourceRoot":"","sources":["../../../src/functions/circuit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAA;AACpD,OAAO,KAAK,WAAW,MAAM,uBAAuB,CAAA;AAyCpD,OAAO,EAAuB,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAiP5E;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,6BAA6B,4FAoGpC,CAAA;AAyBN;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,kBAAkB,0EAsZ9B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,+CAA+C,wEA4EtD,CAAA;AAEN;;;;GAIG;AACH,eAAO,MAAM,eAAe,uDA8EtB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/functions/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAiI/C;;;GAGG;AACH,eAAO,MAAM,YAAY,mDAgGnB,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,kBAAkB,mDAgDzB,CAAA;AAEN;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,mDAyCpC,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,oBAAoB,mDA2D3B,CAAA;AAEN;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,mDAuElC,CAAA;AAEL;;;GAGG;AACH,eAAO,MAAM,uBAAuB,mDAgE9B,CAAA"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/functions/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAiI/C;;;GAGG;AACH,eAAO,MAAM,YAAY,mDAkGnB,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,kBAAkB,mDAgDzB,CAAA;AAEN;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,mDAyCpC,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,oBAAoB,mDA2D3B,CAAA;AAEN;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,mDAuElC,CAAA;AAEL;;;GAGG;AACH,eAAO,MAAM,uBAAuB,mDAgE9B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../../src/functions/timeout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAuB/C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iCAAiC,kCA6MxC,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,wCAAwC,mDAyC/C,CAAA"}
1
+ {"version":3,"file":"timeout.d.ts","sourceRoot":"","sources":["../../../src/functions/timeout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAuB/C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,iCAAiC,kCA6MxC,CAAA;AAEN;;;GAGG;AACH,eAAO,MAAM,wCAAwC,mDA0C/C,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/functions/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAW/C;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,mEAsGvB,CAAA;AACN;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,mEA+BpC,CAAA"}
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/functions/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAW/C;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,mEA+GvB,CAAA;AACN;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,mEA+BpC,CAAA"}
@@ -55,6 +55,7 @@ export declare const SPECIFIC_ERRORS: {
55
55
  SE_VM_TIMEDOUT_COMMAND_EXECUTION: functions.auth.HttpsError;
56
56
  SE_VM_CANCELLED_COMMAND_EXECUTION: functions.auth.HttpsError;
57
57
  SE_VM_DELAYED_COMMAND_EXECUTION: functions.auth.HttpsError;
58
+ SE_VM_UNKNOWN_COMMAND_STATUS: functions.auth.HttpsError;
58
59
  };
59
60
  /**
60
61
  * A set of common errors.
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,cAAe,kBAAkB,WAAW,MAAM,YAAY,MAAM,KAAG,UAC9B,CAAA;AAE/D;;;;GAIG;AACH,eAAO,MAAM,QAAQ,YAAa,MAAM,YAAY,QAAQ,SAqB3D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,UAAW,UAAU,UAGjD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkI3B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;CA2CzB,CAAA"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAC5E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAEzC;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,cAAe,kBAAkB,WAAW,MAAM,YAAY,MAAM,KAAG,UAC9B,CAAA;AAE/D;;;;GAIG;AACH,eAAO,MAAM,QAAQ,YAAa,MAAM,YAAY,QAAQ,SAqB3D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,UAAW,UAAU,UAGjD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuI3B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;CA2CzB,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { DocumentData, QuerySnapshot, DocumentSnapshot, QueryDocumentSnapshot, WhereFilterOp } from "firebase-admin/firestore";
2
2
  import admin from "firebase-admin";
3
- import { CircuitDocument } from "@p0tion/actions";
3
+ import { CircuitDocument } from "@devtion/actions";
4
4
  import { SSMClient } from "@aws-sdk/client-ssm";
5
5
  import { EC2Client } from "@aws-sdk/client-ec2";
6
6
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EAErB,aAAa,EAChB,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,MAAM,gBAAgB,CAAA;AAWlC,OAAO,EAOH,eAAe,EAClB,MAAM,iBAAiB,CAAA;AAIxB,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAM/C;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,eACZ,MAAM,cACN,MAAM,KACnB,QAAQ,iBAAiB,YAAY,CAAC,CASxC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,QAAO,MAAoC,CAAA;AAEzF;;;GAGG;AACH,eAAO,MAAM,KAAK,OAAc,MAAM,KAAG,QAAQ,IAAI,CAAmB,CAAA;AAExE;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,eAAsB,MAAM,KAAG,QAAQ,MAAM,sBAAsB,YAAY,CAAC,CAAC,CAYhH,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,eAC5B,MAAM,aACP,MAAM,KAClB,QAAQ,MAAM,sBAAsB,YAAY,CAAC,CAAC,CAUpD,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,eACpB,MAAM,iBACH,MAAM,KACtB,QAAQ,cAAc,YAAY,CAAC,CASrC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAa,QAAQ,MAAM,sBAAsB,YAAY,CAAC,CAAC,CAWhG,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,eACzB,MAAM,oBACA,MAAM,KACzB,QAAQ,sBAAsB,YAAY,CAAC,CAY7C,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,qBAAsB,MAAM,KAAG,MAAkD,CAAA;AAEtH;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,eAAsB,MAAM,aAAa,MAAM,iBAAiB,MAAM,kBA6B9G,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,eACf,MAAM,aACP,MAAM,iBACF,MAAM,aACX,OAAO,kBA4BpB,CAAA;AAED,eAAO,MAAM,wBAAwB,eACrB,MAAM,aACP,MAAM,QACX,MAAM,aACF,OAAO,kBAyBpB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,eAAsB,MAAM,aAAa,MAAM,kBAWvE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,UAC/B,MAAM,wBACS,OAAO,SACtB,aAAa,KACrB,QAAQ,MAAM,SAAS,cAAc,CAAC,MAAM,SAAS,aAAa,CAAC,CAYxD,CAAA;AAEd;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,eACjB,MAAM,aACP,MAAM,KAClB,QAAQ,sBAAsB,YAAY,CAAC,CAgB7C,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,oBAAqB,eAAe,KAAG,eAKvE,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAO,GAarC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,GAkBlC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,SAAS,CAYzD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,SAAS,CAYzD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,cAAqB,MAAM,KAAG,QAAQ,MAAM,CAQxE,CAAA"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EAErB,aAAa,EAChB,MAAM,0BAA0B,CAAA;AACjC,OAAO,KAAK,MAAM,gBAAgB,CAAA;AAWlC,OAAO,EAOH,eAAe,EAClB,MAAM,kBAAkB,CAAA;AAIzB,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAM/C;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,eACZ,MAAM,cACN,MAAM,KACnB,QAAQ,iBAAiB,YAAY,CAAC,CASxC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,QAAO,MAAoC,CAAA;AAEzF;;;GAGG;AACH,eAAO,MAAM,KAAK,OAAc,MAAM,KAAG,QAAQ,IAAI,CAAmB,CAAA;AAExE;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,eAAsB,MAAM,KAAG,QAAQ,MAAM,sBAAsB,YAAY,CAAC,CAAC,CAYhH,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,eAC5B,MAAM,aACP,MAAM,KAClB,QAAQ,MAAM,sBAAsB,YAAY,CAAC,CAAC,CAUpD,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,eACpB,MAAM,iBACH,MAAM,KACtB,QAAQ,cAAc,YAAY,CAAC,CASrC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAa,QAAQ,MAAM,sBAAsB,YAAY,CAAC,CAAC,CAWhG,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,eACzB,MAAM,oBACA,MAAM,KACzB,QAAQ,sBAAsB,YAAY,CAAC,CAY7C,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,qBAAsB,MAAM,KAAG,MAAkD,CAAA;AAEtH;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,eAAsB,MAAM,aAAa,MAAM,iBAAiB,MAAM,kBA6B9G,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,eACf,MAAM,aACP,MAAM,iBACF,MAAM,aACX,OAAO,kBA4BpB,CAAA;AAED,eAAO,MAAM,wBAAwB,eACrB,MAAM,aACP,MAAM,QACX,MAAM,aACF,OAAO,kBAyBpB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,eAAsB,MAAM,aAAa,MAAM,kBAWvE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,6BAA6B,UAC/B,MAAM,wBACS,OAAO,SACtB,aAAa,KACrB,QAAQ,MAAM,SAAS,cAAc,CAAC,MAAM,SAAS,aAAa,CAAC,CAYxD,CAAA;AAEd;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,eACjB,MAAM,aACP,MAAM,KAClB,QAAQ,sBAAsB,YAAY,CAAC,CAgB7C,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,oBAAqB,eAAe,KAAG,eAKvE,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,QAAO,GAarC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,GAkBlC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,SAAS,CAYzD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,SAAS,CAYzD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,cAAqB,MAAM,KAAG,QAAQ,MAAM,CAQxE,CAAA"}
@@ -1,4 +1,4 @@
1
- import { CeremonyInputData, CircuitDocument, ETagWithPartNumber } from "@p0tion/actions";
1
+ import { CeremonyInputData, CircuitDocument, ETagWithPartNumber } from "@devtion/actions";
2
2
  /**
3
3
  * Group all the necessary data needed for running the `setupCeremony` cloud function.
4
4
  * @typedef {Object} SetupCeremonyData
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAExF;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC5B,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;CACnC,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAA;CACrB,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CACpB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,wBAAwB,GAAG,sBAAsB,GAAG;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,8BAA8B,GAAG,sBAAsB,GAAG;IAClE,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,2BAA2B,GAAG,sBAAsB,GAAG;IAC/D,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAChC,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,8CAA8C,GAAG;IACzD,UAAU,EAAE,MAAM,CAAA;IAClB,2BAA2B,EAAE,MAAM,CAAA;IACnC,gBAAgB,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,kDAAkD,GAAG;IAC7D,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,kDAAkD,GAAG;IAC7D,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,kBAAkB,CAAA;CAC5B,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,kCAAkC,EAAE,MAAM,CAAA;CAC7C,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;CACjB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAEzF;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC5B,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;CACnC,CAAA;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAA;CACrB,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CACpB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,wBAAwB,GAAG,sBAAsB,GAAG;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,8BAA8B,GAAG,sBAAsB,GAAG;IAClE,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,2BAA2B,GAAG,sBAAsB,GAAG;IAC/D,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAChC,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,8CAA8C,GAAG;IACzD,UAAU,EAAE,MAAM,CAAA;IAClB,2BAA2B,EAAE,MAAM,CAAA;IACnC,gBAAgB,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,kDAAkD,GAAG;IAC7D,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACnB,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,kDAAkD,GAAG;IAC7D,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,kBAAkB,CAAA;CAC5B,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,kCAAkC,EAAE,MAAM,CAAA;CAC7C,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;CACjB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devtion/backend",
3
- "version": "0.0.0-101d43f",
3
+ "version": "0.0.0-2ed8e18",
4
4
  "description": "MPC Phase 2 backend for Firebase services management",
5
5
  "repository": "git@github.com:privacy-scaling-explorations/p0tion.git",
6
6
  "homepage": "https://github.com/privacy-scaling-explorations/p0tion",
@@ -67,7 +67,7 @@
67
67
  "@aws-sdk/client-ssm": "^3.357.0",
68
68
  "@aws-sdk/middleware-endpoint": "^3.329.0",
69
69
  "@aws-sdk/s3-request-presigner": "^3.329.0",
70
- "@p0tion/actions": "^1.0.6",
70
+ "@devtion/actions": "latest",
71
71
  "blakejs": "^1.2.1",
72
72
  "dotenv": "^16.0.3",
73
73
  "ethers": "5.7.2",
@@ -85,5 +85,5 @@
85
85
  "publishConfig": {
86
86
  "access": "public"
87
87
  },
88
- "gitHead": "2e6569587be6eeb1bbc2e65563eb247c100e9d66"
88
+ "gitHead": "8f0026fba3bb69e31e0716c61de58d1e4f513ff2"
89
89
  }
@@ -18,7 +18,7 @@ import {
18
18
  vmBootstrapCommand,
19
19
  vmDependenciesAndCacheArtifactsCommand,
20
20
  vmBootstrapScriptFilename
21
- } from "@p0tion/actions"
21
+ } from "@devtion/actions"
22
22
  import { encode } from "html-entities"
23
23
  import { SetupCeremonyData } from "../types/index"
24
24
  import { COMMON_ERRORS, logAndThrowError, printLog, SPECIFIC_ERRORS } from "../lib/errors"
@@ -146,7 +146,7 @@ export const setupCeremony = functions
146
146
  // Check if using the VM approach for contribution verification.
147
147
  if (circuit.verification.cfOrVm === CircuitContributionVerificationMechanism.VM) {
148
148
  // VM command to be run at the startup.
149
- const startupCommand = vmBootstrapCommand(bucketName)
149
+ const startupCommand = vmBootstrapCommand(`${bucketName}/circuits/${circuit.name!}`)
150
150
 
151
151
  // Get EC2 client.
152
152
  const ec2Client = await createEC2Client()
@@ -165,7 +165,12 @@ export const setupCeremony = functions
165
165
  printLog(`Check VM dependencies and cache artifacts commands ${vmCommands.join("\n")}`, LogLevel.DEBUG)
166
166
 
167
167
  // Upload the post-startup commands script file.
168
- await uploadFileToBucketNoFile(bucketName, vmBootstrapScriptFilename, vmCommands.join("\n"))
168
+ printLog(`Uploading VM post-startup commands script file ${vmBootstrapScriptFilename}`, LogLevel.DEBUG)
169
+ await uploadFileToBucketNoFile(
170
+ bucketName,
171
+ `circuits/${circuit.name!}/${vmBootstrapScriptFilename}`,
172
+ vmCommands.join("\n")
173
+ )
169
174
 
170
175
  // Compute the VM disk space requirement (in GB).
171
176
  const vmDiskSize = computeDiskSizeForVM(circuit.zKeySizeInBytes!, circuit.metadata?.pot!)