@devtion/backend 0.0.0-9c50f66 → 0.0.0-b499eaf
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.
- package/README.md +7 -7
- package/dist/src/functions/index.js +139 -103
- package/dist/src/functions/index.mjs +141 -105
- package/dist/types/functions/ceremony.d.ts.map +1 -1
- package/dist/types/functions/circuit.d.ts.map +1 -1
- package/dist/types/functions/storage.d.ts.map +1 -1
- package/dist/types/functions/timeout.d.ts.map +1 -1
- package/dist/types/functions/user.d.ts.map +1 -1
- package/dist/types/lib/errors.d.ts +1 -0
- package/dist/types/lib/errors.d.ts.map +1 -1
- package/dist/types/lib/utils.d.ts +1 -1
- package/dist/types/lib/utils.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +1 -1
- package/package.json +2 -2
- package/src/functions/ceremony.ts +9 -4
- package/src/functions/circuit.ts +138 -116
- package/src/functions/participant.ts +9 -9
- package/src/functions/storage.ts +7 -4
- package/src/functions/timeout.ts +4 -3
- package/src/functions/user.ts +19 -9
- package/src/lib/errors.ts +5 -0
- package/src/lib/utils.ts +11 -9
- package/src/types/index.ts +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module @p0tion/backend
|
|
3
|
-
* @version 1.
|
|
3
|
+
* @version 1.1.1
|
|
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,
|
|
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 '@p0tion/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.
|
|
@@ -264,7 +265,7 @@ const queryOpenedCeremonies = async () => {
|
|
|
264
265
|
const getCircuitDocumentByPosition = async (ceremonyId, sequencePosition) => {
|
|
265
266
|
// Query for all ceremony circuits.
|
|
266
267
|
const circuits = await getCeremonyCircuits(ceremonyId);
|
|
267
|
-
// Apply a filter using the sequence
|
|
268
|
+
// Apply a filter using the sequence position.
|
|
268
269
|
const matchedCircuits = circuits.filter((circuit) => circuit.data().sequencePosition === sequencePosition);
|
|
269
270
|
if (matchedCircuits.length !== 1)
|
|
270
271
|
logAndThrowError(COMMON_ERRORS.CM_NO_CIRCUIT_FOR_GIVEN_SEQUENCE_POSITION);
|
|
@@ -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(
|
|
309
|
+
writeStream.on("finish", () => {
|
|
309
310
|
writeStream.end();
|
|
310
311
|
});
|
|
311
312
|
};
|
|
@@ -429,12 +430,14 @@ const htmlEncodeCircuitData = (circuitDocument) => ({
|
|
|
429
430
|
const getGitHubVariables = () => {
|
|
430
431
|
if (!process.env.GITHUB_MINIMUM_FOLLOWERS ||
|
|
431
432
|
!process.env.GITHUB_MINIMUM_FOLLOWING ||
|
|
432
|
-
!process.env.GITHUB_MINIMUM_PUBLIC_REPOS
|
|
433
|
+
!process.env.GITHUB_MINIMUM_PUBLIC_REPOS ||
|
|
434
|
+
!process.env.GITHUB_MINIMUM_AGE)
|
|
433
435
|
logAndThrowError(COMMON_ERRORS.CM_WRONG_CONFIGURATION);
|
|
434
436
|
return {
|
|
435
437
|
minimumFollowers: Number(process.env.GITHUB_MINIMUM_FOLLOWERS),
|
|
436
438
|
minimumFollowing: Number(process.env.GITHUB_MINIMUM_FOLLOWING),
|
|
437
|
-
minimumPublicRepos: Number(process.env.GITHUB_MINIMUM_PUBLIC_REPOS)
|
|
439
|
+
minimumPublicRepos: Number(process.env.GITHUB_MINIMUM_PUBLIC_REPOS),
|
|
440
|
+
minimumAge: Number(process.env.GITHUB_MINIMUM_AGE)
|
|
438
441
|
};
|
|
439
442
|
};
|
|
440
443
|
/**
|
|
@@ -444,7 +447,7 @@ const getGitHubVariables = () => {
|
|
|
444
447
|
const getAWSVariables = () => {
|
|
445
448
|
if (!process.env.AWS_ACCESS_KEY_ID ||
|
|
446
449
|
!process.env.AWS_SECRET_ACCESS_KEY ||
|
|
447
|
-
!process.env.
|
|
450
|
+
!process.env.AWS_INSTANCE_PROFILE_ARN ||
|
|
448
451
|
!process.env.AWS_AMI_ID ||
|
|
449
452
|
!process.env.AWS_SNS_TOPIC_ARN)
|
|
450
453
|
logAndThrowError(COMMON_ERRORS.CM_WRONG_CONFIGURATION);
|
|
@@ -452,7 +455,7 @@ const getAWSVariables = () => {
|
|
|
452
455
|
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
453
456
|
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
454
457
|
region: process.env.AWS_REGION || "eu-central-1",
|
|
455
|
-
|
|
458
|
+
instanceProfileArn: process.env.AWS_INSTANCE_PROFILE_ARN,
|
|
456
459
|
amiId: process.env.AWS_AMI_ID,
|
|
457
460
|
snsTopic: process.env.AWS_SNS_TOPIC_ARN
|
|
458
461
|
};
|
|
@@ -534,12 +537,14 @@ const registerAuthUser = functions
|
|
|
534
537
|
const vars = getGitHubVariables();
|
|
535
538
|
// this return true or false
|
|
536
539
|
try {
|
|
537
|
-
const { reputable, avatarUrl: avatarURL } = await githubReputation(user.providerData[0].uid, vars.minimumFollowing, vars.minimumFollowers, vars.minimumPublicRepos);
|
|
540
|
+
const { reputable, avatarUrl: avatarURL } = await githubReputation(user.providerData[0].uid, vars.minimumFollowing, vars.minimumFollowers, vars.minimumPublicRepos, vars.minimumAge);
|
|
538
541
|
if (!reputable) {
|
|
539
542
|
// Delete user
|
|
540
543
|
await auth.deleteUser(user.uid);
|
|
541
544
|
// 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
|
|
545
|
+
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
|
|
546
|
+
? user.uid
|
|
547
|
+
: 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
548
|
}
|
|
544
549
|
// store locally
|
|
545
550
|
avatarUrl = avatarURL;
|
|
@@ -554,7 +559,7 @@ const registerAuthUser = functions
|
|
|
554
559
|
}
|
|
555
560
|
// Set document (nb. we refer to providerData[0] because we use Github OAuth provider only).
|
|
556
561
|
// In future releases we might want to loop through the providerData array as we support
|
|
557
|
-
// more providers.
|
|
562
|
+
// more providers.
|
|
558
563
|
await userRef.set({
|
|
559
564
|
name: encodedDisplayName,
|
|
560
565
|
encodedDisplayName,
|
|
@@ -570,7 +575,7 @@ const registerAuthUser = functions
|
|
|
570
575
|
// we want to create a new collection for the users to store the avatars
|
|
571
576
|
const avatarRef = firestore.collection(commonTerms.collections.avatars.name).doc(uid);
|
|
572
577
|
await avatarRef.set({
|
|
573
|
-
avatarUrl: avatarUrl || ""
|
|
578
|
+
avatarUrl: avatarUrl || ""
|
|
574
579
|
});
|
|
575
580
|
printLog(`Authenticated user document with identifier ${uid} has been correctly stored`, LogLevel.DEBUG);
|
|
576
581
|
printLog(`Authenticated user avatar with identifier ${uid} has been correctly stored`, LogLevel.DEBUG);
|
|
@@ -710,7 +715,7 @@ const setupCeremony = functions
|
|
|
710
715
|
// Check if using the VM approach for contribution verification.
|
|
711
716
|
if (circuit.verification.cfOrVm === "VM" /* CircuitContributionVerificationMechanism.VM */) {
|
|
712
717
|
// VM command to be run at the startup.
|
|
713
|
-
const startupCommand = vmBootstrapCommand(bucketName);
|
|
718
|
+
const startupCommand = vmBootstrapCommand(`${bucketName}/circuits/${circuit.name}`);
|
|
714
719
|
// Get EC2 client.
|
|
715
720
|
const ec2Client = await createEC2Client();
|
|
716
721
|
// Get AWS variables.
|
|
@@ -719,7 +724,8 @@ const setupCeremony = functions
|
|
|
719
724
|
const vmCommands = vmDependenciesAndCacheArtifactsCommand(`${bucketName}/${circuit.files?.initialZkeyStoragePath}`, `${bucketName}/${circuit.files?.potStoragePath}`, snsTopic, region);
|
|
720
725
|
printLog(`Check VM dependencies and cache artifacts commands ${vmCommands.join("\n")}`, LogLevel.DEBUG);
|
|
721
726
|
// Upload the post-startup commands script file.
|
|
722
|
-
|
|
727
|
+
printLog(`Uploading VM post-startup commands script file ${vmBootstrapScriptFilename}`, LogLevel.DEBUG);
|
|
728
|
+
await uploadFileToBucketNoFile(bucketName, `circuits/${circuit.name}/${vmBootstrapScriptFilename}`, vmCommands.join("\n"));
|
|
723
729
|
// Compute the VM disk space requirement (in GB).
|
|
724
730
|
const vmDiskSize = computeDiskSizeForVM(circuit.zKeySizeInBytes, circuit.metadata?.pot);
|
|
725
731
|
printLog(`Check VM startup commands ${startupCommand.join("\n")}`, LogLevel.DEBUG);
|
|
@@ -813,7 +819,7 @@ const finalizeCeremony = functions
|
|
|
813
819
|
// Get ceremony circuits.
|
|
814
820
|
const circuits = await getCeremonyCircuits(ceremonyId);
|
|
815
821
|
// Get final contribution for each circuit.
|
|
816
|
-
// nb. the `getFinalContributionDocument` checks the
|
|
822
|
+
// nb. the `getFinalContributionDocument` checks the existence of the final contribution document (if not present, throws).
|
|
817
823
|
// Therefore, we just need to call the method without taking any data to verify the pre-condition of having already computed
|
|
818
824
|
// the final contributions for each ceremony circuit.
|
|
819
825
|
for await (const circuit of circuits)
|
|
@@ -866,7 +872,7 @@ dotenv.config();
|
|
|
866
872
|
* @dev true when the participant can participate (1.A, 3.B, 1.D); otherwise false.
|
|
867
873
|
*/
|
|
868
874
|
const checkParticipantForCeremony = functions
|
|
869
|
-
.region(
|
|
875
|
+
.region("europe-west1")
|
|
870
876
|
.runWith({
|
|
871
877
|
memory: "512MB"
|
|
872
878
|
})
|
|
@@ -937,7 +943,7 @@ const checkParticipantForCeremony = functions
|
|
|
937
943
|
participantDoc.ref.update({
|
|
938
944
|
status: "EXHUMED" /* ParticipantStatus.EXHUMED */,
|
|
939
945
|
contributions,
|
|
940
|
-
tempContributionData: tempContributionData
|
|
946
|
+
tempContributionData: tempContributionData || FieldValue.delete(),
|
|
941
947
|
contributionStep: "DOWNLOADING" /* ParticipantContributionStep.DOWNLOADING */,
|
|
942
948
|
contributionStartedAt: 0,
|
|
943
949
|
verificationStartedAt: FieldValue.delete(),
|
|
@@ -970,7 +976,7 @@ const checkParticipantForCeremony = functions
|
|
|
970
976
|
* 2) the participant has just finished the contribution for a circuit (contributionProgress != 0 && status = CONTRIBUTED && contributionStep = COMPLETED).
|
|
971
977
|
*/
|
|
972
978
|
const progressToNextCircuitForContribution = functions
|
|
973
|
-
.region(
|
|
979
|
+
.region("europe-west1")
|
|
974
980
|
.runWith({
|
|
975
981
|
memory: "512MB"
|
|
976
982
|
})
|
|
@@ -1017,7 +1023,7 @@ const progressToNextCircuitForContribution = functions
|
|
|
1017
1023
|
* 5) Completed contribution computation and verification.
|
|
1018
1024
|
*/
|
|
1019
1025
|
const progressToNextContributionStep = functions
|
|
1020
|
-
.region(
|
|
1026
|
+
.region("europe-west1")
|
|
1021
1027
|
.runWith({
|
|
1022
1028
|
memory: "512MB"
|
|
1023
1029
|
})
|
|
@@ -1068,7 +1074,7 @@ const progressToNextContributionStep = functions
|
|
|
1068
1074
|
* @dev enable the current contributor to resume a contribution from where it had left off.
|
|
1069
1075
|
*/
|
|
1070
1076
|
const permanentlyStoreCurrentContributionTimeAndHash = functions
|
|
1071
|
-
.region(
|
|
1077
|
+
.region("europe-west1")
|
|
1072
1078
|
.runWith({
|
|
1073
1079
|
memory: "512MB"
|
|
1074
1080
|
})
|
|
@@ -1110,7 +1116,7 @@ const permanentlyStoreCurrentContributionTimeAndHash = functions
|
|
|
1110
1116
|
* @dev enable the current contributor to resume a multi-part upload from where it had left off.
|
|
1111
1117
|
*/
|
|
1112
1118
|
const temporaryStoreCurrentContributionMultiPartUploadId = functions
|
|
1113
|
-
.region(
|
|
1119
|
+
.region("europe-west1")
|
|
1114
1120
|
.runWith({
|
|
1115
1121
|
memory: "512MB"
|
|
1116
1122
|
})
|
|
@@ -1148,7 +1154,7 @@ const temporaryStoreCurrentContributionMultiPartUploadId = functions
|
|
|
1148
1154
|
* @dev enable the current contributor to resume a multi-part upload from where it had left off.
|
|
1149
1155
|
*/
|
|
1150
1156
|
const temporaryStoreCurrentContributionUploadedChunkData = functions
|
|
1151
|
-
.region(
|
|
1157
|
+
.region("europe-west1")
|
|
1152
1158
|
.runWith({
|
|
1153
1159
|
memory: "512MB"
|
|
1154
1160
|
})
|
|
@@ -1190,7 +1196,7 @@ const temporaryStoreCurrentContributionUploadedChunkData = functions
|
|
|
1190
1196
|
* contributed to every selected ceremony circuits (= DONE).
|
|
1191
1197
|
*/
|
|
1192
1198
|
const checkAndPrepareCoordinatorForFinalization = functions
|
|
1193
|
-
.region(
|
|
1199
|
+
.region("europe-west1")
|
|
1194
1200
|
.runWith({
|
|
1195
1201
|
memory: "512MB"
|
|
1196
1202
|
})
|
|
@@ -1342,54 +1348,74 @@ const coordinate = async (participant, circuit, isSingleParticipantCoordination,
|
|
|
1342
1348
|
* Wait until the command has completed its execution inside the VM.
|
|
1343
1349
|
* @dev this method implements a custom interval to check 5 times after 1 minute if the command execution
|
|
1344
1350
|
* has been completed or not by calling the `retrieveCommandStatus` method.
|
|
1345
|
-
* @param {any} resolve the promise.
|
|
1346
|
-
* @param {any} reject the promise.
|
|
1347
1351
|
* @param {SSMClient} ssm the SSM client.
|
|
1348
1352
|
* @param {string} vmInstanceId the unique identifier of the VM instance.
|
|
1349
1353
|
* @param {string} commandId the unique identifier of the VM command.
|
|
1350
1354
|
* @returns <Promise<void>> true when the command execution succeed; otherwise false.
|
|
1351
1355
|
*/
|
|
1352
|
-
const waitForVMCommandExecution = (
|
|
1353
|
-
const
|
|
1356
|
+
const waitForVMCommandExecution = (ssm, vmInstanceId, commandId) => new Promise((resolve, reject) => {
|
|
1357
|
+
const poll = async () => {
|
|
1354
1358
|
try {
|
|
1355
1359
|
// Get command status.
|
|
1356
1360
|
const cmdStatus = await retrieveCommandStatus(ssm, vmInstanceId, commandId);
|
|
1357
1361
|
printLog(`Checking command ${commandId} status => ${cmdStatus}`, LogLevel.DEBUG);
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1362
|
+
let error;
|
|
1363
|
+
switch (cmdStatus) {
|
|
1364
|
+
case CommandInvocationStatus.CANCELLING:
|
|
1365
|
+
case CommandInvocationStatus.CANCELLED: {
|
|
1366
|
+
error = SPECIFIC_ERRORS.SE_VM_CANCELLED_COMMAND_EXECUTION;
|
|
1367
|
+
break;
|
|
1368
|
+
}
|
|
1369
|
+
case CommandInvocationStatus.DELAYED: {
|
|
1370
|
+
error = SPECIFIC_ERRORS.SE_VM_DELAYED_COMMAND_EXECUTION;
|
|
1371
|
+
break;
|
|
1372
|
+
}
|
|
1373
|
+
case CommandInvocationStatus.FAILED: {
|
|
1374
|
+
error = SPECIFIC_ERRORS.SE_VM_FAILED_COMMAND_EXECUTION;
|
|
1375
|
+
break;
|
|
1376
|
+
}
|
|
1377
|
+
case CommandInvocationStatus.TIMED_OUT: {
|
|
1378
|
+
error = SPECIFIC_ERRORS.SE_VM_TIMEDOUT_COMMAND_EXECUTION;
|
|
1379
|
+
break;
|
|
1380
|
+
}
|
|
1381
|
+
case CommandInvocationStatus.IN_PROGRESS:
|
|
1382
|
+
case CommandInvocationStatus.PENDING: {
|
|
1383
|
+
// wait a minute and poll again
|
|
1384
|
+
setTimeout(poll, 60000);
|
|
1385
|
+
return;
|
|
1386
|
+
}
|
|
1387
|
+
case CommandInvocationStatus.SUCCESS: {
|
|
1388
|
+
printLog(`Command ${commandId} successfully completed`, LogLevel.DEBUG);
|
|
1389
|
+
// Resolve the promise.
|
|
1390
|
+
resolve();
|
|
1391
|
+
return;
|
|
1392
|
+
}
|
|
1393
|
+
default: {
|
|
1394
|
+
logAndThrowError(SPECIFIC_ERRORS.SE_VM_UNKNOWN_COMMAND_STATUS);
|
|
1395
|
+
}
|
|
1374
1396
|
}
|
|
1375
|
-
|
|
1376
|
-
logAndThrowError(
|
|
1377
|
-
reject();
|
|
1397
|
+
if (error) {
|
|
1398
|
+
logAndThrowError(error);
|
|
1378
1399
|
}
|
|
1379
1400
|
}
|
|
1380
1401
|
catch (error) {
|
|
1381
1402
|
printLog(`Invalid command ${commandId} execution`, LogLevel.DEBUG);
|
|
1403
|
+
const ec2 = await createEC2Client();
|
|
1404
|
+
// if it errors out, let's just log it as a warning so the coordinator is aware
|
|
1405
|
+
try {
|
|
1406
|
+
await stopEC2Instance(ec2, vmInstanceId);
|
|
1407
|
+
}
|
|
1408
|
+
catch (error) {
|
|
1409
|
+
printLog(`Error while stopping VM instance ${vmInstanceId} - Error ${error}`, LogLevel.WARN);
|
|
1410
|
+
}
|
|
1382
1411
|
if (!error.toString().includes(commandId))
|
|
1383
1412
|
logAndThrowError(COMMON_ERRORS.CM_INVALID_COMMAND_EXECUTION);
|
|
1384
1413
|
// Reject the promise.
|
|
1385
1414
|
reject();
|
|
1386
1415
|
}
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
}
|
|
1391
|
-
}, 60000); // 1 minute.
|
|
1392
|
-
};
|
|
1416
|
+
};
|
|
1417
|
+
setTimeout(poll, 60000);
|
|
1418
|
+
});
|
|
1393
1419
|
/**
|
|
1394
1420
|
* This method is used to coordinate the waiting queues of ceremony circuits.
|
|
1395
1421
|
* @dev this cloud function is triggered whenever an update of a document related to a participant of a ceremony occurs.
|
|
@@ -1410,7 +1436,7 @@ const waitForVMCommandExecution = (resolve, reject, ssm, vmInstanceId, commandId
|
|
|
1410
1436
|
* - Just completed a contribution or all contributions for each circuit. If yes, coordinate (multi-participant scenario).
|
|
1411
1437
|
*/
|
|
1412
1438
|
const coordinateCeremonyParticipant = functionsV1
|
|
1413
|
-
.region(
|
|
1439
|
+
.region("europe-west1")
|
|
1414
1440
|
.runWith({
|
|
1415
1441
|
memory: "512MB"
|
|
1416
1442
|
})
|
|
@@ -1481,11 +1507,9 @@ const checkIfVMRunning = async (ec2, vmInstanceId, attempts = 5) => {
|
|
|
1481
1507
|
const isVMRunning = await checkIfRunning(ec2, vmInstanceId);
|
|
1482
1508
|
if (!isVMRunning) {
|
|
1483
1509
|
printLog(`VM not running, ${attempts - 1} attempts remaining. Retrying in 1 minute...`, LogLevel.DEBUG);
|
|
1484
|
-
return
|
|
1485
|
-
}
|
|
1486
|
-
else {
|
|
1487
|
-
return true;
|
|
1510
|
+
return checkIfVMRunning(ec2, vmInstanceId, attempts - 1);
|
|
1488
1511
|
}
|
|
1512
|
+
return true;
|
|
1489
1513
|
};
|
|
1490
1514
|
/**
|
|
1491
1515
|
* Verify the contribution of a participant computed while contributing to a specific circuit of a ceremony.
|
|
@@ -1513,7 +1537,7 @@ const checkIfVMRunning = async (ec2, vmInstanceId, attempts = 5) => {
|
|
|
1513
1537
|
* 1.A.4.C.1) If true, update circuit waiting for queue and average timings accordingly to contribution verification results;
|
|
1514
1538
|
* 2) Send all updates atomically to the Firestore database.
|
|
1515
1539
|
*/
|
|
1516
|
-
const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSeconds: 3600, region:
|
|
1540
|
+
const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSeconds: 3600, region: "europe-west1" }, async (request) => {
|
|
1517
1541
|
if (!request.auth || (!request.auth.token.participant && !request.auth.token.coordinator))
|
|
1518
1542
|
logAndThrowError(SPECIFIC_ERRORS.SE_AUTH_NO_CURRENT_AUTH_USER);
|
|
1519
1543
|
if (!request.data.ceremonyId ||
|
|
@@ -1624,8 +1648,6 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
|
|
|
1624
1648
|
lastZkeyBlake2bHash = match.at(0);
|
|
1625
1649
|
// re upload the formatted verification transcript
|
|
1626
1650
|
await uploadFileToBucket(bucketName, verificationTranscriptStoragePathAndFilename, verificationTranscriptTemporaryLocalPath, true);
|
|
1627
|
-
// Stop VM instance.
|
|
1628
|
-
await stopEC2Instance(ec2, vmInstanceId);
|
|
1629
1651
|
}
|
|
1630
1652
|
else {
|
|
1631
1653
|
// Upload verification transcript.
|
|
@@ -1686,6 +1708,18 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
|
|
|
1686
1708
|
lastUpdated: getCurrentServerTimestampInMillis()
|
|
1687
1709
|
});
|
|
1688
1710
|
}
|
|
1711
|
+
// Stop VM instance
|
|
1712
|
+
if (isUsingVM) {
|
|
1713
|
+
// using try and catch as the VM stopping function can throw
|
|
1714
|
+
// however we want to continue without stopping as the
|
|
1715
|
+
// verification was valid, and inform the coordinator
|
|
1716
|
+
try {
|
|
1717
|
+
await stopEC2Instance(ec2, vmInstanceId);
|
|
1718
|
+
}
|
|
1719
|
+
catch (error) {
|
|
1720
|
+
printLog(`Error while stopping VM instance ${vmInstanceId} - Error ${error}`, LogLevel.WARN);
|
|
1721
|
+
}
|
|
1722
|
+
}
|
|
1689
1723
|
// Step (1.A.4.C)
|
|
1690
1724
|
if (!isFinalizing) {
|
|
1691
1725
|
// Step (1.A.4.C.1)
|
|
@@ -1700,7 +1734,7 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
|
|
|
1700
1734
|
const newAvgVerifyCloudFunctionTime = avgVerifyCloudFunctionTime > 0
|
|
1701
1735
|
? (avgVerifyCloudFunctionTime + verifyCloudFunctionTime) / 2
|
|
1702
1736
|
: verifyCloudFunctionTime;
|
|
1703
|
-
// Prepare tx to update circuit average contribution/verification time.
|
|
1737
|
+
// Prepare tx to update circuit average contribution/verification time.
|
|
1704
1738
|
const updatedCircuitDoc = await getDocumentById(getCircuitsCollectionPath(ceremonyId), circuitId);
|
|
1705
1739
|
const { waitingQueue: updatedWaitingQueue } = updatedCircuitDoc.data();
|
|
1706
1740
|
/// @dev this must happen only for valid contributions.
|
|
@@ -1750,7 +1784,7 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
|
|
|
1750
1784
|
commandId = await runCommandUsingSSM(ssm, vmInstanceId, verificationCommand);
|
|
1751
1785
|
printLog(`Starting the execution of command ${commandId}`, LogLevel.DEBUG);
|
|
1752
1786
|
// Step (1.A.3.3).
|
|
1753
|
-
return
|
|
1787
|
+
return waitForVMCommandExecution(ssm, vmInstanceId, commandId)
|
|
1754
1788
|
.then(async () => {
|
|
1755
1789
|
// Command execution successfully completed.
|
|
1756
1790
|
printLog(`Command ${commandId} execution has been successfully completed`, LogLevel.DEBUG);
|
|
@@ -1762,40 +1796,38 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
|
|
|
1762
1796
|
logAndThrowError(COMMON_ERRORS.CM_INVALID_COMMAND_EXECUTION);
|
|
1763
1797
|
});
|
|
1764
1798
|
}
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1786
|
-
|
|
1787
|
-
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
fs.unlinkSync(lastZkeyTempFilePath);
|
|
1793
|
-
}
|
|
1794
|
-
catch (error) {
|
|
1795
|
-
printLog(`Error while unlinking temporary files - Error ${error}`, LogLevel.WARN);
|
|
1796
|
-
}
|
|
1797
|
-
await completeVerification();
|
|
1799
|
+
// CF approach.
|
|
1800
|
+
printLog(`CF mechanism`, LogLevel.DEBUG);
|
|
1801
|
+
const potStoragePath = getPotStorageFilePath(files.potFilename);
|
|
1802
|
+
const firstZkeyStoragePath = getZkeyStorageFilePath(prefix, `${prefix}_${genesisZkeyIndex}.zkey`);
|
|
1803
|
+
// Prepare temporary file paths.
|
|
1804
|
+
// (nb. these are needed to download the necessary artifacts for verification from AWS S3).
|
|
1805
|
+
verificationTranscriptTemporaryLocalPath = createTemporaryLocalPath(verificationTranscriptCompleteFilename);
|
|
1806
|
+
const potTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}.pot`);
|
|
1807
|
+
const firstZkeyTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}_genesis.zkey`);
|
|
1808
|
+
const lastZkeyTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}_last.zkey`);
|
|
1809
|
+
// Create and populate transcript.
|
|
1810
|
+
const transcriptLogger = createCustomLoggerForFile(verificationTranscriptTemporaryLocalPath);
|
|
1811
|
+
transcriptLogger.info(`${isFinalizing ? `Final verification` : `Verification`} transcript for ${prefix} circuit Phase 2 contribution.\n${isFinalizing ? `Coordinator ` : `Contributor # ${Number(lastZkeyIndex)}`} (${contributorOrCoordinatorIdentifier})\n`);
|
|
1812
|
+
// Step (1.A.2).
|
|
1813
|
+
await downloadArtifactFromS3Bucket(bucketName, potStoragePath, potTempFilePath);
|
|
1814
|
+
await downloadArtifactFromS3Bucket(bucketName, firstZkeyStoragePath, firstZkeyTempFilePath);
|
|
1815
|
+
await downloadArtifactFromS3Bucket(bucketName, lastZkeyStoragePath, lastZkeyTempFilePath);
|
|
1816
|
+
// Step (1.A.4).
|
|
1817
|
+
isContributionValid = await zKey.verifyFromInit(firstZkeyTempFilePath, potTempFilePath, lastZkeyTempFilePath, transcriptLogger);
|
|
1818
|
+
// Compute contribution hash.
|
|
1819
|
+
lastZkeyBlake2bHash = await blake512FromPath(lastZkeyTempFilePath);
|
|
1820
|
+
// Free resources by unlinking temporary folders.
|
|
1821
|
+
// Do not free-up verification transcript path here.
|
|
1822
|
+
try {
|
|
1823
|
+
fs.unlinkSync(potTempFilePath);
|
|
1824
|
+
fs.unlinkSync(firstZkeyTempFilePath);
|
|
1825
|
+
fs.unlinkSync(lastZkeyTempFilePath);
|
|
1798
1826
|
}
|
|
1827
|
+
catch (error) {
|
|
1828
|
+
printLog(`Error while unlinking temporary files - Error ${error}`, LogLevel.WARN);
|
|
1829
|
+
}
|
|
1830
|
+
await completeVerification();
|
|
1799
1831
|
}
|
|
1800
1832
|
});
|
|
1801
1833
|
/**
|
|
@@ -1804,7 +1836,7 @@ const verifycontribution = functionsV2.https.onCall({ memory: "16GiB", timeoutSe
|
|
|
1804
1836
|
* this does not happen if the participant is actually the coordinator who is finalizing the ceremony.
|
|
1805
1837
|
*/
|
|
1806
1838
|
const refreshParticipantAfterContributionVerification = functionsV1
|
|
1807
|
-
.region(
|
|
1839
|
+
.region("europe-west1")
|
|
1808
1840
|
.runWith({
|
|
1809
1841
|
memory: "512MB"
|
|
1810
1842
|
})
|
|
@@ -1865,7 +1897,7 @@ const refreshParticipantAfterContributionVerification = functionsV1
|
|
|
1865
1897
|
* and verification key extracted from the circuit final contribution (as part of the ceremony finalization process).
|
|
1866
1898
|
*/
|
|
1867
1899
|
const finalizeCircuit = functionsV1
|
|
1868
|
-
.region(
|
|
1900
|
+
.region("europe-west1")
|
|
1869
1901
|
.runWith({
|
|
1870
1902
|
memory: "512MB"
|
|
1871
1903
|
})
|
|
@@ -2062,8 +2094,10 @@ const createBucket = functions
|
|
|
2062
2094
|
CORSConfiguration: {
|
|
2063
2095
|
CORSRules: [
|
|
2064
2096
|
{
|
|
2065
|
-
AllowedMethods: ["GET"],
|
|
2066
|
-
AllowedOrigins: ["*"]
|
|
2097
|
+
AllowedMethods: ["GET", "PUT"],
|
|
2098
|
+
AllowedOrigins: ["*"],
|
|
2099
|
+
ExposeHeaders: ["ETag", "Content-Length"],
|
|
2100
|
+
AllowedHeaders: ["*"]
|
|
2067
2101
|
}
|
|
2068
2102
|
]
|
|
2069
2103
|
}
|
|
@@ -2240,7 +2274,8 @@ const startMultiPartUpload = functions
|
|
|
2240
2274
|
const generatePreSignedUrlsParts = functions
|
|
2241
2275
|
.region("europe-west1")
|
|
2242
2276
|
.runWith({
|
|
2243
|
-
memory: "512MB"
|
|
2277
|
+
memory: "512MB",
|
|
2278
|
+
timeoutSeconds: 300
|
|
2244
2279
|
})
|
|
2245
2280
|
.https.onCall(async (data, context) => {
|
|
2246
2281
|
if (!context.auth || (!context.auth.token.participant && !context.auth.token.coordinator))
|
|
@@ -2390,7 +2425,7 @@ const checkAndRemoveBlockingContributor = functions
|
|
|
2390
2425
|
// Get ceremony circuits.
|
|
2391
2426
|
const circuits = await getCeremonyCircuits(ceremony.id);
|
|
2392
2427
|
// Extract ceremony data.
|
|
2393
|
-
const { timeoutMechanismType, penalty } = ceremony.data();
|
|
2428
|
+
const { timeoutType: timeoutMechanismType, penalty } = ceremony.data();
|
|
2394
2429
|
for (const circuit of circuits) {
|
|
2395
2430
|
if (!circuit.data())
|
|
2396
2431
|
// Do not use `logAndThrowError` method to avoid the function to exit before checking every ceremony.
|
|
@@ -2540,7 +2575,8 @@ const resumeContributionAfterTimeoutExpiration = functions
|
|
|
2540
2575
|
if (status === "EXHUMED" /* ParticipantStatus.EXHUMED */)
|
|
2541
2576
|
await participantDoc.ref.update({
|
|
2542
2577
|
status: "READY" /* ParticipantStatus.READY */,
|
|
2543
|
-
lastUpdated: getCurrentServerTimestampInMillis()
|
|
2578
|
+
lastUpdated: getCurrentServerTimestampInMillis(),
|
|
2579
|
+
tempContributionData: {}
|
|
2544
2580
|
});
|
|
2545
2581
|
else
|
|
2546
2582
|
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,
|
|
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;
|
|
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;AA2CpD,OAAO,EAAuB,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAwP5E;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,6BAA6B,4FAoGpC,CAAA;AAwBN;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,kBAAkB,0EA8Z9B,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,
|
|
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,mDAwElC,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,
|
|
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,
|
|
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,mEAgHvB,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
|
|
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 "@
|
|
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,
|
|
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,GAerC,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 "@
|
|
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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devtion/backend",
|
|
3
|
-
"version": "0.0.0-
|
|
3
|
+
"version": "0.0.0-b499eaf",
|
|
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",
|
|
@@ -85,5 +85,5 @@
|
|
|
85
85
|
"publishConfig": {
|
|
86
86
|
"access": "public"
|
|
87
87
|
},
|
|
88
|
-
"gitHead": "
|
|
88
|
+
"gitHead": "253890f0a88d586c4d023c6ace7a5fd3d5085568"
|
|
89
89
|
}
|