@devtion/actions 0.0.0-5d170d3 → 0.0.0-7cfaa5d

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/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
- * @module @p0tion/actions
3
- * @version 1.0.5
2
+ * @module @devtion/actions
3
+ * @version 1.0.8
4
4
  * @file A set of actions and helpers for CLI commands
5
5
  * @copyright Ethereum Foundation 2022
6
6
  * @license MIT
@@ -17,8 +17,7 @@ import crypto from 'crypto';
17
17
  import blake from 'blakejs';
18
18
  import { utils } from 'ffjavascript';
19
19
  import winston from 'winston';
20
- import { S3Client, HeadObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3';
21
- import { pipeline, Readable } from 'stream';
20
+ import { pipeline } from 'stream';
22
21
  import { promisify } from 'util';
23
22
  import { initializeApp } from 'firebase/app';
24
23
  import { signInWithCredential, initializeAuth, getAuth } from 'firebase/auth';
@@ -244,6 +243,12 @@ const commonTerms = {
244
243
  verificationStartedAt: "verificationStartedAt"
245
244
  }
246
245
  },
246
+ avatars: {
247
+ name: "avatars",
248
+ fields: {
249
+ avatarUrl: "avatarUrl"
250
+ }
251
+ },
247
252
  ceremonies: {
248
253
  name: "ceremonies",
249
254
  fields: {
@@ -334,7 +339,7 @@ const commonTerms = {
334
339
  finalizeCircuit: "finalizeCircuit",
335
340
  finalizeCeremony: "finalizeCeremony",
336
341
  downloadCircuitArtifacts: "downloadCircuitArtifacts",
337
- transferObject: "transferObject",
342
+ transferObject: "transferObject"
338
343
  }
339
344
  };
340
345
 
@@ -1052,7 +1057,8 @@ const parseCeremonyFile = async (path, cleanup = false) => {
1052
1057
  // read the data
1053
1058
  const data = JSON.parse(fs.readFileSync(path).toString());
1054
1059
  // verify that the data is correct
1055
- if (data['timeoutMechanismType'] !== "DYNAMIC" /* CeremonyTimeoutType.DYNAMIC */ && data['timeoutMechanismType'] !== "FIXED" /* CeremonyTimeoutType.FIXED */)
1060
+ if (data["timeoutMechanismType"] !== "DYNAMIC" /* CeremonyTimeoutType.DYNAMIC */ &&
1061
+ data["timeoutMechanismType"] !== "FIXED" /* CeremonyTimeoutType.FIXED */)
1056
1062
  throw new Error("Invalid timeout type. Please choose between DYNAMIC and FIXED.");
1057
1063
  // validate that we have at least 1 circuit input data
1058
1064
  if (!data.circuits || data.circuits.length === 0)
@@ -1085,42 +1091,26 @@ const parseCeremonyFile = async (path, cleanup = false) => {
1085
1091
  circuitArtifacts.push({
1086
1092
  artifacts: artifacts
1087
1093
  });
1088
- const r1csPath = artifacts.r1csStoragePath;
1089
- const wasmPath = artifacts.wasmStoragePath;
1090
1094
  // where we storing the r1cs downloaded
1091
1095
  const localR1csPath = `./${circuitData.name}.r1cs`;
1092
- // check that the artifacts exist in S3
1093
- // we don't need any privileges to download this
1094
- // just the correct region
1095
- const s3 = new S3Client({ region: artifacts.region });
1096
- try {
1097
- await s3.send(new HeadObjectCommand({
1098
- Bucket: artifacts.bucket,
1099
- Key: r1csPath
1100
- }));
1101
- }
1102
- catch (error) {
1103
- throw new Error(`The r1cs file (${r1csPath}) seems to not exist. Please ensure this is correct and that the object is publicly available.`);
1104
- }
1105
- try {
1106
- await s3.send(new HeadObjectCommand({
1107
- Bucket: artifacts.bucket,
1108
- Key: wasmPath
1109
- }));
1110
- }
1111
- catch (error) {
1112
- throw new Error(`The wasm file (${wasmPath}) seems to not exist. Please ensure this is correct and that the object is publicly available.`);
1113
- }
1096
+ // where we storing the wasm downloaded
1097
+ const localWasmPath = `./${circuitData.name}.wasm`;
1114
1098
  // download the r1cs to extract the metadata
1115
- const command = new GetObjectCommand({ Bucket: artifacts.bucket, Key: artifacts.r1csStoragePath });
1116
- const response = await s3.send(command);
1117
1099
  const streamPipeline = promisify(pipeline);
1118
- if (response.$metadata.httpStatusCode !== 200)
1119
- throw new Error("There was an error while trying to download the r1cs file. Please check that the file has the correct permissions (public) set.");
1120
- if (response.Body instanceof Readable)
1121
- await streamPipeline(response.Body, fs.createWriteStream(localR1csPath));
1100
+ // Make the call.
1101
+ const responseR1CS = await fetch(artifacts.r1csStoragePath);
1102
+ // Handle errors.
1103
+ if (!responseR1CS.ok && responseR1CS.status !== 200)
1104
+ throw new Error(`There was an error while trying to download the r1cs file for circuit ${circuitData.name}. Please check that the file has the correct permissions (public) set.`);
1105
+ await streamPipeline(responseR1CS.body, createWriteStream(localR1csPath));
1106
+ // Write the file locally
1122
1107
  // extract the metadata from the r1cs
1123
1108
  const metadata = getR1CSInfo(localR1csPath);
1109
+ // download wasm too to ensure it's available
1110
+ const responseWASM = await fetch(artifacts.wasmStoragePath);
1111
+ if (!responseWASM.ok && responseWASM.status !== 200)
1112
+ throw new Error(`There was an error while trying to download the WASM file for circuit ${circuitData.name}. Please check that the file has the correct permissions (public) set.`);
1113
+ await streamPipeline(responseWASM.body, createWriteStream(localWasmPath));
1124
1114
  // validate that the circuit hash and template links are valid
1125
1115
  const template = circuitData.template;
1126
1116
  const URLMatch = template.source.match(urlPattern);
@@ -1138,7 +1128,7 @@ const parseCeremonyFile = async (path, cleanup = false) => {
1138
1128
  const wasmCompleteFilename = `${circuitData.name}.wasm`;
1139
1129
  const smallestPowersOfTauCompleteFilenameForCircuit = `${potFilenameTemplate}${doubleDigitsPowers}.ptau`;
1140
1130
  const firstZkeyCompleteFilename = `${circuitPrefix}_${genesisZkeyIndex}.zkey`;
1141
- // storage paths
1131
+ // storage paths
1142
1132
  const r1csStorageFilePath = getR1csStorageFilePath(circuitPrefix, r1csCompleteFilename);
1143
1133
  const wasmStorageFilePath = getWasmStorageFilePath(circuitPrefix, wasmCompleteFilename);
1144
1134
  const potStorageFilePath = getPotStorageFilePath(smallestPowersOfTauCompleteFilenameForCircuit);
@@ -1154,7 +1144,7 @@ const parseCeremonyFile = async (path, cleanup = false) => {
1154
1144
  initialZkeyStoragePath: zkeyStorageFilePath,
1155
1145
  r1csBlake2bHash: r1csBlake2bHash
1156
1146
  };
1157
- // validate that the compiler hash is a valid hash
1147
+ // validate that the compiler hash is a valid hash
1158
1148
  const compiler = circuitData.compiler;
1159
1149
  const compilerHashMatch = compiler.commitHash.match(commitHashPattern);
1160
1150
  if (!compilerHashMatch || compilerHashMatch.length === 0 || compilerHashMatch.length > 1)
@@ -1189,7 +1179,7 @@ const parseCeremonyFile = async (path, cleanup = false) => {
1189
1179
  contributionComputation: 0,
1190
1180
  fullContribution: 0,
1191
1181
  verifyCloudFunction: 0
1192
- },
1182
+ }
1193
1183
  };
1194
1184
  }
1195
1185
  if (data.timeoutMechanismType === "FIXED" /* CeremonyTimeoutType.FIXED */) {
@@ -1212,13 +1202,14 @@ const parseCeremonyFile = async (path, cleanup = false) => {
1212
1202
  contributionComputation: 0,
1213
1203
  fullContribution: 0,
1214
1204
  verifyCloudFunction: 0
1215
- },
1205
+ }
1216
1206
  };
1217
1207
  }
1218
1208
  circuits.push(circuit);
1219
- // remove the local r1cs download (if used for verifying the config only vs setup)
1209
+ // remove the local r1cs and wasm downloads (if used for verifying the config only vs setup)
1220
1210
  if (cleanup)
1221
1211
  fs.unlinkSync(localR1csPath);
1212
+ fs.unlinkSync(localWasmPath);
1222
1213
  }
1223
1214
  const setupData = {
1224
1215
  ceremonyInputData: {
@@ -1372,7 +1363,9 @@ const getContributionsValidityForContributor = async (firestoreDatabase, circuit
1372
1363
  * @param isFinalizing <boolean> - true when the coordinator is finalizing the ceremony, otherwise false.
1373
1364
  * @returns <string> - the public attestation preamble.
1374
1365
  */
1375
- const getPublicAttestationPreambleForContributor = (contributorIdentifier, ceremonyName, isFinalizing) => `Hey, I'm ${contributorIdentifier} and I have ${isFinalizing ? "finalized" : "contributed to"} the ${ceremonyName} MPC Phase2 Trusted Setup ceremony.\nThe following are my contribution signatures:`;
1366
+ const getPublicAttestationPreambleForContributor = (contributorIdentifier, ceremonyName, isFinalizing) => `Hey, I'm ${contributorIdentifier} and I have ${isFinalizing ? "finalized" : "contributed to"} the ${ceremonyName}${ceremonyName.toLowerCase().includes("trusted setup") || ceremonyName.toLowerCase().includes("ceremony")
1367
+ ? "."
1368
+ : " MPC Phase2 Trusted Setup ceremony."}\nThe following are my contribution signatures:`;
1376
1369
  /**
1377
1370
  * Check and prepare public attestation for the contributor made only of its valid contributions.
1378
1371
  * @param firestoreDatabase <Firestore> - the Firestore service instance associated to the current Firebase application.
@@ -1828,7 +1821,7 @@ const getFirestoreDatabase = (app) => getFirestore(app);
1828
1821
  * @param app <FirebaseApp> - the Firebase application.
1829
1822
  * @returns <Functions> - the Cloud Functions associated to the application.
1830
1823
  */
1831
- const getFirebaseFunctions = (app) => getFunctions(app, 'europe-west1');
1824
+ const getFirebaseFunctions = (app) => getFunctions(app, "europe-west1");
1832
1825
  /**
1833
1826
  * Retrieve the configuration variables for the AWS services (S3, EC2).
1834
1827
  * @returns <AWSVariables> - the values of the AWS services configuration variables.
@@ -2079,55 +2072,27 @@ const verifyCeremony = async (functions, firestore, ceremonyPrefix, outputDirect
2079
2072
  };
2080
2073
 
2081
2074
  /**
2082
- * This function will return the number of public repos of a user
2083
- * @param user <string> The username of the user
2084
- * @returns <number> The number of public repos
2075
+ * This function queries the GitHub API to fetch users statistics
2076
+ * @param user {string} the user uid
2077
+ * @returns {any} the stats from the GitHub API
2085
2078
  */
2086
- const getNumberOfPublicReposGitHub = async (user) => {
2087
- const response = await fetch(`https://api.github.com/user/${user}/repos`, {
2079
+ const getGitHubStats = async (user) => {
2080
+ const response = await fetch(`https://api.github.com/user/${user}`, {
2088
2081
  method: "GET",
2089
2082
  headers: {
2090
2083
  Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`
2091
2084
  }
2092
2085
  });
2093
2086
  if (response.status !== 200)
2094
- throw new Error("It was not possible to retrieve the number of public repositories. Please try again.");
2087
+ throw new Error("It was not possible to retrieve the user's statistic. Please try again.");
2095
2088
  const jsonData = await response.json();
2096
- return jsonData.length;
2097
- };
2098
- /**
2099
- * This function will return the number of followers of a user
2100
- * @param user <string> The username of the user
2101
- * @returns <number> The number of followers
2102
- */
2103
- const getNumberOfFollowersGitHub = async (user) => {
2104
- const response = await fetch(`https://api.github.com/user/${user}/followers`, {
2105
- method: "GET",
2106
- headers: {
2107
- Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`
2108
- }
2109
- });
2110
- if (response.status !== 200)
2111
- throw new Error("It was not possible to retrieve the number of followers. Please try again.");
2112
- const jsonData = await response.json();
2113
- return jsonData.length;
2114
- };
2115
- /**
2116
- * This function will return the number of following of a user
2117
- * @param user <string> The username of the user
2118
- * @returns <number> The number of following users
2119
- */
2120
- const getNumberOfFollowingGitHub = async (user) => {
2121
- const response = await fetch(`https://api.github.com/user/${user}/following`, {
2122
- method: "GET",
2123
- headers: {
2124
- Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`
2125
- }
2126
- });
2127
- if (response.status !== 200)
2128
- throw new Error("It was not possible to retrieve the number of following. Please try again.");
2129
- const jsonData = await response.json();
2130
- return jsonData.length;
2089
+ const data = {
2090
+ following: jsonData.following,
2091
+ followers: jsonData.followers,
2092
+ publicRepos: jsonData.public_repos,
2093
+ avatarUrl: jsonData.avatar_url
2094
+ };
2095
+ return data;
2131
2096
  };
2132
2097
  /**
2133
2098
  * This function will check if the user is reputable enough to be able to use the app
@@ -2135,19 +2100,23 @@ const getNumberOfFollowingGitHub = async (user) => {
2135
2100
  * @param minimumAmountOfFollowing <number> The minimum amount of following the user should have
2136
2101
  * @param minimumAmountOfFollowers <number> The minimum amount of followers the user should have
2137
2102
  * @param minimumAmountOfPublicRepos <number> The minimum amount of public repos the user should have
2138
- * @returns <boolean> True if the user is reputable enough, false otherwise
2103
+ * @returns <any> Return the avatar URL of the user if the user is reputable, false otherwise
2139
2104
  */
2140
2105
  const githubReputation = async (userLogin, minimumAmountOfFollowing, minimumAmountOfFollowers, minimumAmountOfPublicRepos) => {
2141
2106
  if (!process.env.GITHUB_ACCESS_TOKEN)
2142
2107
  throw new Error("The GitHub access token is missing. Please insert a valid token to be used for anti-sybil checks on user registation, and then try again.");
2143
- const following = await getNumberOfFollowingGitHub(userLogin);
2144
- const repos = await getNumberOfPublicReposGitHub(userLogin);
2145
- const followers = await getNumberOfFollowersGitHub(userLogin);
2108
+ const { following, followers, publicRepos, avatarUrl } = await getGitHubStats(userLogin);
2146
2109
  if (following < minimumAmountOfFollowing ||
2147
- repos < minimumAmountOfPublicRepos ||
2110
+ publicRepos < minimumAmountOfPublicRepos ||
2148
2111
  followers < minimumAmountOfFollowers)
2149
- return false;
2150
- return true;
2112
+ return {
2113
+ reputable: false,
2114
+ avatarUrl: ""
2115
+ };
2116
+ return {
2117
+ reputable: true,
2118
+ avatarUrl: avatarUrl
2119
+ };
2151
2120
  };
2152
2121
 
2153
2122
  /**
@@ -2355,8 +2324,13 @@ const vmDependenciesAndCacheArtifactsCommand = (zKeyPath, potPath, snsTopic, reg
2355
2324
  // eslint-disable-next-line no-template-curly-in-string
2356
2325
  "touch ${MARKER_FILE}",
2357
2326
  "sudo yum update -y",
2358
- "curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash - ",
2359
- "sudo yum install -y nodejs",
2327
+ "curl -O https://nodejs.org/dist/v16.13.0/node-v16.13.0-linux-x64.tar.xz",
2328
+ "tar -xf node-v16.13.0-linux-x64.tar.xz",
2329
+ "mv node-v16.13.0-linux-x64 nodejs",
2330
+ "sudo mv nodejs /opt/",
2331
+ "echo 'export NODEJS_HOME=/opt/nodejs' >> /etc/profile",
2332
+ "echo 'export PATH=$NODEJS_HOME/bin:$PATH' >> /etc/profile",
2333
+ "source /etc/profile",
2360
2334
  "npm install -g snarkjs",
2361
2335
  `aws s3 cp s3://${zKeyPath} /var/tmp/genesisZkey.zkey`,
2362
2336
  `aws s3 cp s3://${potPath} /var/tmp/pot.ptau`,
@@ -2375,6 +2349,7 @@ const vmDependenciesAndCacheArtifactsCommand = (zKeyPath, potPath, snsTopic, reg
2375
2349
  * @returns Array<string> - the list of commands for contribution verification.
2376
2350
  */
2377
2351
  const vmContributionVerificationCommand = (bucketName, lastZkeyStoragePath, verificationTranscriptStoragePathAndFilename) => [
2352
+ `source /etc/profile`,
2378
2353
  `aws s3 cp s3://${bucketName}/${lastZkeyStoragePath} /var/tmp/lastZKey.zkey > /var/tmp/log.txt`,
2379
2354
  `snarkjs zkvi /var/tmp/genesisZkey.zkey /var/tmp/pot.ptau /var/tmp/lastZKey.zkey > /var/tmp/verification_transcript.log`,
2380
2355
  `aws s3 cp /var/tmp/verification_transcript.log s3://${bucketName}/${verificationTranscriptStoragePathAndFilename} &>/dev/null`,
@@ -1,6 +1,6 @@
1
1
  /**
2
- * @module @p0tion/actions
3
- * @version 1.0.5
2
+ * @module @devtion/actions
3
+ * @version 1.0.8
4
4
  * @file A set of actions and helpers for CLI commands
5
5
  * @copyright Ethereum Foundation 2022
6
6
  * @license MIT
@@ -19,7 +19,6 @@ var crypto = require('crypto');
19
19
  var blake = require('blakejs');
20
20
  var ffjavascript = require('ffjavascript');
21
21
  var winston = require('winston');
22
- var clientS3 = require('@aws-sdk/client-s3');
23
22
  var stream = require('stream');
24
23
  var util = require('util');
25
24
  var app = require('firebase/app');
@@ -246,6 +245,12 @@ const commonTerms = {
246
245
  verificationStartedAt: "verificationStartedAt"
247
246
  }
248
247
  },
248
+ avatars: {
249
+ name: "avatars",
250
+ fields: {
251
+ avatarUrl: "avatarUrl"
252
+ }
253
+ },
249
254
  ceremonies: {
250
255
  name: "ceremonies",
251
256
  fields: {
@@ -336,7 +341,7 @@ const commonTerms = {
336
341
  finalizeCircuit: "finalizeCircuit",
337
342
  finalizeCeremony: "finalizeCeremony",
338
343
  downloadCircuitArtifacts: "downloadCircuitArtifacts",
339
- transferObject: "transferObject",
344
+ transferObject: "transferObject"
340
345
  }
341
346
  };
342
347
 
@@ -1054,7 +1059,8 @@ const parseCeremonyFile = async (path, cleanup = false) => {
1054
1059
  // read the data
1055
1060
  const data = JSON.parse(fs.readFileSync(path).toString());
1056
1061
  // verify that the data is correct
1057
- if (data['timeoutMechanismType'] !== "DYNAMIC" /* CeremonyTimeoutType.DYNAMIC */ && data['timeoutMechanismType'] !== "FIXED" /* CeremonyTimeoutType.FIXED */)
1062
+ if (data["timeoutMechanismType"] !== "DYNAMIC" /* CeremonyTimeoutType.DYNAMIC */ &&
1063
+ data["timeoutMechanismType"] !== "FIXED" /* CeremonyTimeoutType.FIXED */)
1058
1064
  throw new Error("Invalid timeout type. Please choose between DYNAMIC and FIXED.");
1059
1065
  // validate that we have at least 1 circuit input data
1060
1066
  if (!data.circuits || data.circuits.length === 0)
@@ -1087,42 +1093,26 @@ const parseCeremonyFile = async (path, cleanup = false) => {
1087
1093
  circuitArtifacts.push({
1088
1094
  artifacts: artifacts
1089
1095
  });
1090
- const r1csPath = artifacts.r1csStoragePath;
1091
- const wasmPath = artifacts.wasmStoragePath;
1092
1096
  // where we storing the r1cs downloaded
1093
1097
  const localR1csPath = `./${circuitData.name}.r1cs`;
1094
- // check that the artifacts exist in S3
1095
- // we don't need any privileges to download this
1096
- // just the correct region
1097
- const s3 = new clientS3.S3Client({ region: artifacts.region });
1098
- try {
1099
- await s3.send(new clientS3.HeadObjectCommand({
1100
- Bucket: artifacts.bucket,
1101
- Key: r1csPath
1102
- }));
1103
- }
1104
- catch (error) {
1105
- throw new Error(`The r1cs file (${r1csPath}) seems to not exist. Please ensure this is correct and that the object is publicly available.`);
1106
- }
1107
- try {
1108
- await s3.send(new clientS3.HeadObjectCommand({
1109
- Bucket: artifacts.bucket,
1110
- Key: wasmPath
1111
- }));
1112
- }
1113
- catch (error) {
1114
- throw new Error(`The wasm file (${wasmPath}) seems to not exist. Please ensure this is correct and that the object is publicly available.`);
1115
- }
1098
+ // where we storing the wasm downloaded
1099
+ const localWasmPath = `./${circuitData.name}.wasm`;
1116
1100
  // download the r1cs to extract the metadata
1117
- const command = new clientS3.GetObjectCommand({ Bucket: artifacts.bucket, Key: artifacts.r1csStoragePath });
1118
- const response = await s3.send(command);
1119
1101
  const streamPipeline = util.promisify(stream.pipeline);
1120
- if (response.$metadata.httpStatusCode !== 200)
1121
- throw new Error("There was an error while trying to download the r1cs file. Please check that the file has the correct permissions (public) set.");
1122
- if (response.Body instanceof stream.Readable)
1123
- await streamPipeline(response.Body, fs.createWriteStream(localR1csPath));
1102
+ // Make the call.
1103
+ const responseR1CS = await fetch(artifacts.r1csStoragePath);
1104
+ // Handle errors.
1105
+ if (!responseR1CS.ok && responseR1CS.status !== 200)
1106
+ throw new Error(`There was an error while trying to download the r1cs file for circuit ${circuitData.name}. Please check that the file has the correct permissions (public) set.`);
1107
+ await streamPipeline(responseR1CS.body, fs.createWriteStream(localR1csPath));
1108
+ // Write the file locally
1124
1109
  // extract the metadata from the r1cs
1125
1110
  const metadata = getR1CSInfo(localR1csPath);
1111
+ // download wasm too to ensure it's available
1112
+ const responseWASM = await fetch(artifacts.wasmStoragePath);
1113
+ if (!responseWASM.ok && responseWASM.status !== 200)
1114
+ throw new Error(`There was an error while trying to download the WASM file for circuit ${circuitData.name}. Please check that the file has the correct permissions (public) set.`);
1115
+ await streamPipeline(responseWASM.body, fs.createWriteStream(localWasmPath));
1126
1116
  // validate that the circuit hash and template links are valid
1127
1117
  const template = circuitData.template;
1128
1118
  const URLMatch = template.source.match(urlPattern);
@@ -1140,7 +1130,7 @@ const parseCeremonyFile = async (path, cleanup = false) => {
1140
1130
  const wasmCompleteFilename = `${circuitData.name}.wasm`;
1141
1131
  const smallestPowersOfTauCompleteFilenameForCircuit = `${potFilenameTemplate}${doubleDigitsPowers}.ptau`;
1142
1132
  const firstZkeyCompleteFilename = `${circuitPrefix}_${genesisZkeyIndex}.zkey`;
1143
- // storage paths
1133
+ // storage paths
1144
1134
  const r1csStorageFilePath = getR1csStorageFilePath(circuitPrefix, r1csCompleteFilename);
1145
1135
  const wasmStorageFilePath = getWasmStorageFilePath(circuitPrefix, wasmCompleteFilename);
1146
1136
  const potStorageFilePath = getPotStorageFilePath(smallestPowersOfTauCompleteFilenameForCircuit);
@@ -1156,7 +1146,7 @@ const parseCeremonyFile = async (path, cleanup = false) => {
1156
1146
  initialZkeyStoragePath: zkeyStorageFilePath,
1157
1147
  r1csBlake2bHash: r1csBlake2bHash
1158
1148
  };
1159
- // validate that the compiler hash is a valid hash
1149
+ // validate that the compiler hash is a valid hash
1160
1150
  const compiler = circuitData.compiler;
1161
1151
  const compilerHashMatch = compiler.commitHash.match(commitHashPattern);
1162
1152
  if (!compilerHashMatch || compilerHashMatch.length === 0 || compilerHashMatch.length > 1)
@@ -1191,7 +1181,7 @@ const parseCeremonyFile = async (path, cleanup = false) => {
1191
1181
  contributionComputation: 0,
1192
1182
  fullContribution: 0,
1193
1183
  verifyCloudFunction: 0
1194
- },
1184
+ }
1195
1185
  };
1196
1186
  }
1197
1187
  if (data.timeoutMechanismType === "FIXED" /* CeremonyTimeoutType.FIXED */) {
@@ -1214,13 +1204,14 @@ const parseCeremonyFile = async (path, cleanup = false) => {
1214
1204
  contributionComputation: 0,
1215
1205
  fullContribution: 0,
1216
1206
  verifyCloudFunction: 0
1217
- },
1207
+ }
1218
1208
  };
1219
1209
  }
1220
1210
  circuits.push(circuit);
1221
- // remove the local r1cs download (if used for verifying the config only vs setup)
1211
+ // remove the local r1cs and wasm downloads (if used for verifying the config only vs setup)
1222
1212
  if (cleanup)
1223
1213
  fs.unlinkSync(localR1csPath);
1214
+ fs.unlinkSync(localWasmPath);
1224
1215
  }
1225
1216
  const setupData = {
1226
1217
  ceremonyInputData: {
@@ -1374,7 +1365,9 @@ const getContributionsValidityForContributor = async (firestoreDatabase, circuit
1374
1365
  * @param isFinalizing <boolean> - true when the coordinator is finalizing the ceremony, otherwise false.
1375
1366
  * @returns <string> - the public attestation preamble.
1376
1367
  */
1377
- const getPublicAttestationPreambleForContributor = (contributorIdentifier, ceremonyName, isFinalizing) => `Hey, I'm ${contributorIdentifier} and I have ${isFinalizing ? "finalized" : "contributed to"} the ${ceremonyName} MPC Phase2 Trusted Setup ceremony.\nThe following are my contribution signatures:`;
1368
+ const getPublicAttestationPreambleForContributor = (contributorIdentifier, ceremonyName, isFinalizing) => `Hey, I'm ${contributorIdentifier} and I have ${isFinalizing ? "finalized" : "contributed to"} the ${ceremonyName}${ceremonyName.toLowerCase().includes("trusted setup") || ceremonyName.toLowerCase().includes("ceremony")
1369
+ ? "."
1370
+ : " MPC Phase2 Trusted Setup ceremony."}\nThe following are my contribution signatures:`;
1378
1371
  /**
1379
1372
  * Check and prepare public attestation for the contributor made only of its valid contributions.
1380
1373
  * @param firestoreDatabase <Firestore> - the Firestore service instance associated to the current Firebase application.
@@ -1830,7 +1823,7 @@ const getFirestoreDatabase = (app) => firestore.getFirestore(app);
1830
1823
  * @param app <FirebaseApp> - the Firebase application.
1831
1824
  * @returns <Functions> - the Cloud Functions associated to the application.
1832
1825
  */
1833
- const getFirebaseFunctions = (app) => functions.getFunctions(app, 'europe-west1');
1826
+ const getFirebaseFunctions = (app) => functions.getFunctions(app, "europe-west1");
1834
1827
  /**
1835
1828
  * Retrieve the configuration variables for the AWS services (S3, EC2).
1836
1829
  * @returns <AWSVariables> - the values of the AWS services configuration variables.
@@ -2081,55 +2074,27 @@ const verifyCeremony = async (functions, firestore$1, ceremonyPrefix, outputDire
2081
2074
  };
2082
2075
 
2083
2076
  /**
2084
- * This function will return the number of public repos of a user
2085
- * @param user <string> The username of the user
2086
- * @returns <number> The number of public repos
2077
+ * This function queries the GitHub API to fetch users statistics
2078
+ * @param user {string} the user uid
2079
+ * @returns {any} the stats from the GitHub API
2087
2080
  */
2088
- const getNumberOfPublicReposGitHub = async (user) => {
2089
- const response = await fetch(`https://api.github.com/user/${user}/repos`, {
2081
+ const getGitHubStats = async (user) => {
2082
+ const response = await fetch(`https://api.github.com/user/${user}`, {
2090
2083
  method: "GET",
2091
2084
  headers: {
2092
2085
  Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`
2093
2086
  }
2094
2087
  });
2095
2088
  if (response.status !== 200)
2096
- throw new Error("It was not possible to retrieve the number of public repositories. Please try again.");
2089
+ throw new Error("It was not possible to retrieve the user's statistic. Please try again.");
2097
2090
  const jsonData = await response.json();
2098
- return jsonData.length;
2099
- };
2100
- /**
2101
- * This function will return the number of followers of a user
2102
- * @param user <string> The username of the user
2103
- * @returns <number> The number of followers
2104
- */
2105
- const getNumberOfFollowersGitHub = async (user) => {
2106
- const response = await fetch(`https://api.github.com/user/${user}/followers`, {
2107
- method: "GET",
2108
- headers: {
2109
- Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`
2110
- }
2111
- });
2112
- if (response.status !== 200)
2113
- throw new Error("It was not possible to retrieve the number of followers. Please try again.");
2114
- const jsonData = await response.json();
2115
- return jsonData.length;
2116
- };
2117
- /**
2118
- * This function will return the number of following of a user
2119
- * @param user <string> The username of the user
2120
- * @returns <number> The number of following users
2121
- */
2122
- const getNumberOfFollowingGitHub = async (user) => {
2123
- const response = await fetch(`https://api.github.com/user/${user}/following`, {
2124
- method: "GET",
2125
- headers: {
2126
- Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN}`
2127
- }
2128
- });
2129
- if (response.status !== 200)
2130
- throw new Error("It was not possible to retrieve the number of following. Please try again.");
2131
- const jsonData = await response.json();
2132
- return jsonData.length;
2091
+ const data = {
2092
+ following: jsonData.following,
2093
+ followers: jsonData.followers,
2094
+ publicRepos: jsonData.public_repos,
2095
+ avatarUrl: jsonData.avatar_url
2096
+ };
2097
+ return data;
2133
2098
  };
2134
2099
  /**
2135
2100
  * This function will check if the user is reputable enough to be able to use the app
@@ -2137,19 +2102,23 @@ const getNumberOfFollowingGitHub = async (user) => {
2137
2102
  * @param minimumAmountOfFollowing <number> The minimum amount of following the user should have
2138
2103
  * @param minimumAmountOfFollowers <number> The minimum amount of followers the user should have
2139
2104
  * @param minimumAmountOfPublicRepos <number> The minimum amount of public repos the user should have
2140
- * @returns <boolean> True if the user is reputable enough, false otherwise
2105
+ * @returns <any> Return the avatar URL of the user if the user is reputable, false otherwise
2141
2106
  */
2142
2107
  const githubReputation = async (userLogin, minimumAmountOfFollowing, minimumAmountOfFollowers, minimumAmountOfPublicRepos) => {
2143
2108
  if (!process.env.GITHUB_ACCESS_TOKEN)
2144
2109
  throw new Error("The GitHub access token is missing. Please insert a valid token to be used for anti-sybil checks on user registation, and then try again.");
2145
- const following = await getNumberOfFollowingGitHub(userLogin);
2146
- const repos = await getNumberOfPublicReposGitHub(userLogin);
2147
- const followers = await getNumberOfFollowersGitHub(userLogin);
2110
+ const { following, followers, publicRepos, avatarUrl } = await getGitHubStats(userLogin);
2148
2111
  if (following < minimumAmountOfFollowing ||
2149
- repos < minimumAmountOfPublicRepos ||
2112
+ publicRepos < minimumAmountOfPublicRepos ||
2150
2113
  followers < minimumAmountOfFollowers)
2151
- return false;
2152
- return true;
2114
+ return {
2115
+ reputable: false,
2116
+ avatarUrl: ""
2117
+ };
2118
+ return {
2119
+ reputable: true,
2120
+ avatarUrl: avatarUrl
2121
+ };
2153
2122
  };
2154
2123
 
2155
2124
  /**
@@ -2357,8 +2326,13 @@ const vmDependenciesAndCacheArtifactsCommand = (zKeyPath, potPath, snsTopic, reg
2357
2326
  // eslint-disable-next-line no-template-curly-in-string
2358
2327
  "touch ${MARKER_FILE}",
2359
2328
  "sudo yum update -y",
2360
- "curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash - ",
2361
- "sudo yum install -y nodejs",
2329
+ "curl -O https://nodejs.org/dist/v16.13.0/node-v16.13.0-linux-x64.tar.xz",
2330
+ "tar -xf node-v16.13.0-linux-x64.tar.xz",
2331
+ "mv node-v16.13.0-linux-x64 nodejs",
2332
+ "sudo mv nodejs /opt/",
2333
+ "echo 'export NODEJS_HOME=/opt/nodejs' >> /etc/profile",
2334
+ "echo 'export PATH=$NODEJS_HOME/bin:$PATH' >> /etc/profile",
2335
+ "source /etc/profile",
2362
2336
  "npm install -g snarkjs",
2363
2337
  `aws s3 cp s3://${zKeyPath} /var/tmp/genesisZkey.zkey`,
2364
2338
  `aws s3 cp s3://${potPath} /var/tmp/pot.ptau`,
@@ -2377,6 +2351,7 @@ const vmDependenciesAndCacheArtifactsCommand = (zKeyPath, potPath, snsTopic, reg
2377
2351
  * @returns Array<string> - the list of commands for contribution verification.
2378
2352
  */
2379
2353
  const vmContributionVerificationCommand = (bucketName, lastZkeyStoragePath, verificationTranscriptStoragePathAndFilename) => [
2354
+ `source /etc/profile`,
2380
2355
  `aws s3 cp s3://${bucketName}/${lastZkeyStoragePath} /var/tmp/lastZKey.zkey > /var/tmp/log.txt`,
2381
2356
  `snarkjs zkvi /var/tmp/genesisZkey.zkey /var/tmp/pot.ptau /var/tmp/lastZKey.zkey > /var/tmp/verification_transcript.log`,
2382
2357
  `aws s3 cp /var/tmp/verification_transcript.log s3://${bucketName}/${verificationTranscriptStoragePathAndFilename} &>/dev/null`,
@@ -98,6 +98,12 @@ export declare const commonTerms: {
98
98
  verificationStartedAt: string;
99
99
  };
100
100
  };
101
+ avatars: {
102
+ name: string;
103
+ fields: {
104
+ avatarUrl: string;
105
+ };
106
+ };
101
107
  ceremonies: {
102
108
  name: string;
103
109
  fields: {
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/helpers/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,sBAAsB,+CAA+C,CAAA;AAElF,eAAO,MAAM,mBAAmB,6BAA6B,CAAA;AAE7D,eAAO,MAAM,gBAAgB,UAAU,CAAA;AAEvC,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAElC,eAAO,MAAM,eAAe,UAAU,CAAA;AAEtC,eAAO,MAAM,sBAAsB,UAAU,CAAA;AAE7C,eAAO,MAAM,sBAAsB,SAAS,CAAA;AAE5C,eAAO,MAAM,4BAA4B,aAAa,CAAA;AAEtD,eAAO,MAAM,cAAc,sBAAsB,CAAA;AAEjD,eAAO,MAAM,yBAAyB,iBAAiB,CAAA;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ChC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;GA6G5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuHvB,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/helpers/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,sBAAsB,+CAA+C,CAAA;AAElF,eAAO,MAAM,mBAAmB,6BAA6B,CAAA;AAE7D,eAAO,MAAM,gBAAgB,UAAU,CAAA;AAEvC,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAElC,eAAO,MAAM,eAAe,UAAU,CAAA;AAEtC,eAAO,MAAM,sBAAsB,UAAU,CAAA;AAE7C,eAAO,MAAM,sBAAsB,SAAS,CAAA;AAE5C,eAAO,MAAM,4BAA4B,aAAa,CAAA;AAEtD,eAAO,MAAM,cAAc,sBAAsB,CAAA;AAEjD,eAAO,MAAM,yBAAyB,iBAAiB,CAAA;AAEvD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2ChC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;GA6G5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6HvB,CAAA"}
@@ -4,7 +4,7 @@
4
4
  * @param minimumAmountOfFollowing <number> The minimum amount of following the user should have
5
5
  * @param minimumAmountOfFollowers <number> The minimum amount of followers the user should have
6
6
  * @param minimumAmountOfPublicRepos <number> The minimum amount of public repos the user should have
7
- * @returns <boolean> True if the user is reputable enough, false otherwise
7
+ * @returns <any> Return the avatar URL of the user if the user is reputable, false otherwise
8
8
  */
9
- export declare const githubReputation: (userLogin: string, minimumAmountOfFollowing: number, minimumAmountOfFollowers: number, minimumAmountOfPublicRepos: number) => Promise<boolean>;
9
+ export declare const githubReputation: (userLogin: string, minimumAmountOfFollowing: number, minimumAmountOfFollowers: number, minimumAmountOfPublicRepos: number) => Promise<any>;
10
10
  //# sourceMappingURL=security.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../../src/helpers/security.ts"],"names":[],"mappings":"AAwDA;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,cACd,MAAM,4BACS,MAAM,4BACN,MAAM,8BACJ,MAAM,KACnC,QAAQ,OAAO,CAgBjB,CAAA"}
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../../src/helpers/security.ts"],"names":[],"mappings":"AA4BA;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,cACd,MAAM,4BACS,MAAM,4BACN,MAAM,8BACJ,MAAM,KACnC,QAAQ,GAAG,CAsBb,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/helpers/utils.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAW,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AAErC,OAAO,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEzC,OAAO,EACH,eAAe,EACf,YAAY,EAGZ,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EAGpB,MAAM,gBAAgB,CAAA;AAmBvB;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,SAAgB,MAAM,YAAW,OAAO,KAAW,QAAQ,iBAAiB,CAoOzG,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,+BAA+B,iBAAkB,MAAM,UAAU,MAAM,KAAG,MAgBtF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oCAAoC,gBAAiB,MAAM,WAAW,MAAM,WAUxF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,aAAc,MAAM,KAAG,MASlD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,wBAAyB,MAAM,KAAG,MACH,CAAA;AAElE;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,QAAS,MAAM,KAAG,MAEsC,CAAA;AAElF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,cAAsE,CAAA;AAEtG;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,aAC3B,MAAM,oBAAoB,CAAC,oBACnB,MAAM,KACzB,oBAYF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,cAAe,MAAM,WAAW,OAAO,KAAG,MAC1B,CAAA;AAEjD;;;;;;;;GAQG;AACH,eAAO,MAAM,sCAAsC,sBAC5B,SAAS,YAClB,MAAM,oBAAoB,CAAC,cACzB,MAAM,iBACH,MAAM,gBACP,OAAO,KACtB,QAAQ,MAAM,oBAAoB,CAAC,CAmCrC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,0CAA0C,0BAC5B,MAAM,gBACf,MAAM,gBACN,OAAO,WAImF,CAAA;AAE5G;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qCAAqC,sBAC3B,SAAS,YAClB,MAAM,oBAAoB,CAAC,cACzB,MAAM,iBACH,MAAM,4BACK,MAAM,YAAY,CAAC,yBACtB,MAAM,gBACf,MAAM,gBACN,OAAO,KACtB,QAAQ,MAAM,CA2DhB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,aAAc,MAAM,UAAS,QAAQ,aAAa,CAAC,OAAO,CAAC,KAAY,MAQvG,CAAA;AAEN;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,kBACX,MAAM,UACb,MAAM,UACN,MAAM,YACJ,YAAY,KACvB,MAYF,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,sBAAuB,MAAM,KAAG,eA0IvD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,WAAY,MAAM,KAAG,MAA0D,CAAA"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/helpers/utils.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAW,EAAE,YAAY,EAAqB,MAAM,IAAI,CAAA;AAExD,OAAO,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEzC,OAAO,EACH,eAAe,EACf,YAAY,EAGZ,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EAGpB,MAAM,gBAAgB,CAAA;AAmBvB;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,SAAgB,MAAM,YAAW,OAAO,KAAW,QAAQ,iBAAiB,CA4NzG,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,+BAA+B,iBAAkB,MAAM,UAAU,MAAM,KAAG,MAgBtF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oCAAoC,gBAAiB,MAAM,WAAW,MAAM,WAUxF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,aAAc,MAAM,KAAG,MASlD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,wBAAyB,MAAM,KAAG,MACH,CAAA;AAElE;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,QAAS,MAAM,KAAG,MAEsC,CAAA;AAElF;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,cAAsE,CAAA;AAEtG;;;;;;;GAOG;AACH,eAAO,MAAM,4BAA4B,aAC3B,MAAM,oBAAoB,CAAC,oBACnB,MAAM,KACzB,oBAYF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,cAAe,MAAM,WAAW,OAAO,KAAG,MAC1B,CAAA;AAEjD;;;;;;;;GAQG;AACH,eAAO,MAAM,sCAAsC,sBAC5B,SAAS,YAClB,MAAM,oBAAoB,CAAC,cACzB,MAAM,iBACH,MAAM,gBACP,OAAO,KACtB,QAAQ,MAAM,oBAAoB,CAAC,CAmCrC,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,0CAA0C,0BAC5B,MAAM,gBACf,MAAM,gBACN,OAAO,WAM4B,CAAA;AAErD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,qCAAqC,sBAC3B,SAAS,YAClB,MAAM,oBAAoB,CAAC,cACzB,MAAM,iBACH,MAAM,4BACK,MAAM,YAAY,CAAC,yBACtB,MAAM,gBACf,MAAM,gBACN,OAAO,KACtB,QAAQ,MAAM,CA2DhB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,aAAc,MAAM,UAAS,QAAQ,aAAa,CAAC,OAAO,CAAC,KAAY,MAQvG,CAAA;AAEN;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,kBACX,MAAM,UACb,MAAM,UACN,MAAM,YACJ,YAAY,KACvB,MAYF,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,sBAAuB,MAAM,KAAG,eA0IvD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,WAAY,MAAM,KAAG,MAA0D,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"vm.d.ts","sourceRoot":"","sources":["../../../../src/helpers/vm.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,SAAS,EAEZ,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAEH,SAAS,EAGZ,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAOtC;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,SAAS,CAYzD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,SAAS,CAYzD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,eAAgB,MAAM,KAAG,MAAM,MAAM,CAInE,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,sCAAsC,aACrC,MAAM,WACP,MAAM,YACL,MAAM,UACR,MAAM,KACf,MAAM,MAAM,CAoBd,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,eAC9B,MAAM,uBACG,MAAM,gDACmB,MAAM,KACrD,MAAM,MAAM,CAMd,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,oBAAqB,MAAM,OAAO,MAAM,KAAG,MACuB,CAAA;AAEnG;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,QACrB,SAAS,YACJ,MAAM,EAAE,gBACJ,MAAM,cACR,MAAM,YACR,aAAa,KACxB,QAAQ,WAAW,CAgErB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,cAAqB,SAAS,cAAc,MAAM,KAAG,QAAQ,OAAO,CAe9F,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,QAAe,SAAS,cAAc,MAAM,kBAYxE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAAe,SAAS,cAAc,MAAM,kBAYvE,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAAe,SAAS,cAAc,MAAM,kBAc5E,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,QACtB,SAAS,cACF,MAAM,YACR,MAAM,MAAM,CAAC,KACxB,QAAQ,MAAM,CAwBhB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,QAAe,SAAS,cAAc,MAAM,aAAa,MAAM,KAAG,QAAQ,MAAM,CAiBjH,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,QAAe,SAAS,cAAc,MAAM,aAAa,MAAM,KAAG,QAAQ,MAAM,CAgBjH,CAAA"}
1
+ {"version":3,"file":"vm.d.ts","sourceRoot":"","sources":["../../../../src/helpers/vm.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,SAAS,EAEZ,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAEH,SAAS,EAGZ,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAOtC;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,SAAS,CAYzD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAa,QAAQ,SAAS,CAYzD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,eAAgB,MAAM,KAAG,MAAM,MAAM,CAInE,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,sCAAsC,aACrC,MAAM,WACP,MAAM,YACL,MAAM,UACR,MAAM,KACf,MAAM,MAAM,CAyBd,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,eAC9B,MAAM,uBACG,MAAM,gDACmB,MAAM,KACrD,MAAM,MAAM,CAOd,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,oBAAqB,MAAM,OAAO,MAAM,KAAG,MACuB,CAAA;AAEnG;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,QACrB,SAAS,YACJ,MAAM,EAAE,gBACJ,MAAM,cACR,MAAM,YACR,aAAa,KACxB,QAAQ,WAAW,CAgErB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,cAAc,cAAqB,SAAS,cAAc,MAAM,KAAG,QAAQ,OAAO,CAe9F,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,QAAe,SAAS,cAAc,MAAM,kBAYxE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,QAAe,SAAS,cAAc,MAAM,kBAYvE,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAAe,SAAS,cAAc,MAAM,kBAc5E,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,QACtB,SAAS,cACF,MAAM,YACR,MAAM,MAAM,CAAC,KACxB,QAAQ,MAAM,CAwBhB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,QAAe,SAAS,cAAc,MAAM,aAAa,MAAM,KAAG,QAAQ,MAAM,CAiBjH,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,QAAe,SAAS,cAAc,MAAM,aAAa,MAAM,KAAG,QAAQ,MAAM,CAgBjH,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/types/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EACH,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,wCAAwC,EACxC,aAAa,EACb,2BAA2B,EAC3B,iBAAiB,EACpB,MAAM,YAAY,CAAA;AAEnB;;;;;;;;GAQG;AACH,MAAM,MAAM,YAAY,GAAG;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CAChB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,WAAW,EAAE,WAAW,CAAA;IACxB,iBAAiB,EAAE,SAAS,CAAA;IAC5B,iBAAiB,EAAE,SAAS,CAAA;CAC/B,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAA;IACpC,IAAI,EAAE,YAAY,CAAA;CACrB,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;CACvB,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC7B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;CACrB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAC/B,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,OAAO,CAAA;CACjB,CAAA;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,GAAG;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,OAAO,CAAA;IACtB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAC/B,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,oBAAoB,EAAE,mBAAmB,CAAA;IACzC,OAAO,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACrB,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,mBAAmB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;CACrC,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAC/B,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;CACvB,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,eAAe,GAAG;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,UAAU,CAAC,EAAE,aAAa,CAAA;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,+BAA+B,GAAG;IAC1C,MAAM,EAAE,wCAAwC,CAAA;IAChD,EAAE,CAAC,EAAE,eAAe,CAAA;CACvB,CAAA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,YAAY,EAAE,+BAA+B,CAAA;IAC7C,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAC3C,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,GAAG;IAC/C,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,aAAa,CAAA;IACpB,IAAI,EAAE,YAAY,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;CACtB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG;IACvB,GAAG,EAAE,MAAM,CAAA;IACX,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,oCAAoC,GAAG;IAC/C,2BAA2B,EAAE,MAAM,CAAA;IACnC,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAA;CACpC,CAAA;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,oBAAoB,EAAE,MAAM,CAAA;IAC5B,MAAM,EAAE,iBAAiB,CAAA;IACzB,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC,CAAA;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,gBAAgB,CAAC,EAAE,2BAA2B,CAAA;IAC9C,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,oBAAoB,CAAC,EAAE,oCAAoC,CAAA;CAC9D,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,eAAe,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,sBAAsB,EAAE,MAAM,CAAA;CACjC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG;IACzB,uBAAuB,EAAE,MAAM,CAAA;IAC/B,gBAAgB,EAAE,MAAM,CAAA;IACxB,mBAAmB,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC9B,sBAAsB,EAAE,MAAM,CAAA;IAC9B,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,mBAAmB,EAAE,MAAM,CAAA;CAC9B,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,eAAe,GAAG,gBAAgB,GAAG;IAC7C,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,KAAK,CAAC,EAAE,gBAAgB,CAAA;IACxB,UAAU,CAAC,EAAE,cAAc,CAAA;IAC3B,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,YAAY,CAAC,EAAE,mBAAmB,CAAA;IAClC,WAAW,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC5B,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,mBAAmB,EAAE,MAAM,CAAA;IAC3B,qBAAqB,EAAE,MAAM,CAAA;IAC7B,mBAAmB,EAAE,MAAM,CAAA;IAC3B,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,0BAA0B,CAAC,EAAE,MAAM,CAAA;IACnC,2BAA2B,CAAC,EAAE,MAAM,CAAA;IACpC,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC,2BAA2B,CAAC,EAAE,MAAM,CAAA;CACvC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gCAAgC,GAAG;IAC3C,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACrB,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAC/B,aAAa,EAAE,MAAM,CAAA;IACrB,2BAA2B,EAAE,MAAM,CAAA;IACnC,2BAA2B,EAAE,MAAM,CAAA;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,iBAAiB,CAAA;IACxB,oBAAoB,EAAE,gCAAgC,CAAA;IACtD,KAAK,EAAE,OAAO,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,UAAU,CAAA;CACtB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,+BAA+B,GAAG;IAC1C,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,eAAe,CAAA;CACxB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACvC,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,YAAY,CAAA;CACrB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gCAAgC,GAAG;IAC3C,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,gBAAgB,CAAA;CACzB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,mCAAmC,GAAG;IAC9C,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,mBAAmB,CAAA;CAC5B,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC5B,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,MAAM,CAAA;IACzB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,qBAAqB,EAAE,MAAM,CAAA;IAC7B,qBAAqB,EAAE,MAAM,CAAA;IAC7B,4BAA4B,EAAE,MAAM,CAAA;IACpC,iBAAiB,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,oCAAoC,GAAG;IAC/C,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,oBAAoB,CAAA;CAC7B,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACrB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;CACf,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC5B,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;IAChC,gBAAgB,EAAE,KAAK,CAAC,qCAAqC,CAAC,CAAA;CACjE,CAAA;AAGD,MAAM,MAAM,qCAAqC,GAAG;IAChD,SAAS,EAAE;QACP,MAAM,EAAE,MAAM,CAAA;QACd,MAAM,EAAE,MAAM,CAAA;QACd,eAAe,EAAE,MAAM,CAAA;QACvB,eAAe,EAAE,MAAM,CAAA;KAC1B,CAAA;CACJ,CAAA;AAED,MAAM,MAAM,mCAAmC,GAAG;IAC9C,gBAAgB,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,gCAAgC,GAAG;IAC3C,IAAI,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,oBAAoB,EAAE,mBAAmB,CAAA;IACzC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,KAAK,CAAC,eAAe,GAAG,qCAAqC,GAAG,mCAAmC,GAAG,gCAAgC,CAAC,CAAA;CACpJ,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/types/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devtion/actions",
3
- "version": "0.0.0-5d170d3",
3
+ "version": "0.0.0-7cfaa5d",
4
4
  "description": "A set of actions and helpers for CLI commands",
5
5
  "repository": "git@github.com:privacy-scaling-explorations/p0tion.git",
6
6
  "homepage": "https://github.com/privacy-scaling-explorations/p0tion",
@@ -55,10 +55,6 @@
55
55
  "firebase": "^9.21.0",
56
56
  "firebase-admin": "^11.8.0",
57
57
  "googleapis": "^118.0.0",
58
- "puppeteer": "^20.1.2",
59
- "puppeteer-extra": "^3.3.6",
60
- "puppeteer-extra-plugin-anonymize-ua": "^2.4.6",
61
- "puppeteer-extra-plugin-stealth": "^2.11.2",
62
58
  "rimraf": "^5.0.0",
63
59
  "rollup": "^3.21.6",
64
60
  "snarkjs": "^0.6.11",
@@ -83,5 +79,5 @@
83
79
  "publishConfig": {
84
80
  "access": "public"
85
81
  },
86
- "gitHead": "ff032e8717f4aac3f66730e0a256660c2e741505"
82
+ "gitHead": "53164d43af65410911da5fa33f1ac0cade724872"
87
83
  }
@@ -217,6 +217,12 @@ export const commonTerms = {
217
217
  verificationStartedAt: "verificationStartedAt"
218
218
  }
219
219
  },
220
+ avatars: {
221
+ name: "avatars",
222
+ fields: {
223
+ avatarUrl: "avatarUrl"
224
+ }
225
+ },
220
226
  ceremonies: {
221
227
  name: "ceremonies",
222
228
  fields: {
@@ -307,6 +313,6 @@ export const commonTerms = {
307
313
  finalizeCircuit: "finalizeCircuit",
308
314
  finalizeCeremony: "finalizeCeremony",
309
315
  downloadCircuitArtifacts: "downloadCircuitArtifacts",
310
- transferObject: "transferObject",
316
+ transferObject: "transferObject"
311
317
  }
312
318
  }
@@ -435,4 +435,4 @@ export const finalizeCeremony = async (functions: Functions, ceremonyId: string)
435
435
  await cf({
436
436
  ceremonyId
437
437
  })
438
- }
438
+ }
@@ -1,57 +1,29 @@
1
1
  import fetch from "@adobe/node-fetch-retry"
2
2
  /**
3
- * This function will return the number of public repos of a user
4
- * @param user <string> The username of the user
5
- * @returns <number> The number of public repos
3
+ * This function queries the GitHub API to fetch users statistics
4
+ * @param user {string} the user uid
5
+ * @returns {any} the stats from the GitHub API
6
6
  */
7
- const getNumberOfPublicReposGitHub = async (user: string): Promise<number> => {
8
- const response = await fetch(`https://api.github.com/user/${user}/repos`, {
7
+ const getGitHubStats = async (user: string): Promise<any> => {
8
+ const response = await fetch(`https://api.github.com/user/${user}`, {
9
9
  method: "GET",
10
10
  headers: {
11
11
  Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN!}`
12
12
  }
13
13
  })
14
14
  if (response.status !== 200)
15
- throw new Error("It was not possible to retrieve the number of public repositories. Please try again.")
16
- const jsonData: any = await response.json()
17
- return jsonData.length
18
- }
19
- /**
20
- * This function will return the number of followers of a user
21
- * @param user <string> The username of the user
22
- * @returns <number> The number of followers
23
- */
24
- const getNumberOfFollowersGitHub = async (user: string): Promise<number> => {
25
- const response = await fetch(`https://api.github.com/user/${user}/followers`, {
26
- method: "GET",
27
- headers: {
28
- Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN!}`
29
- }
30
- })
31
- if (response.status !== 200)
32
- throw new Error("It was not possible to retrieve the number of followers. Please try again.")
33
- const jsonData: any = await response.json()
34
- return jsonData.length
35
- }
36
- /**
37
- * This function will return the number of following of a user
38
- * @param user <string> The username of the user
39
- * @returns <number> The number of following users
40
- */
41
- const getNumberOfFollowingGitHub = async (user: string): Promise<number> => {
42
- const response = await fetch(`https://api.github.com/user/${user}/following`, {
43
- method: "GET",
44
- headers: {
45
- Authorization: `token ${process.env.GITHUB_ACCESS_TOKEN!}`
46
- }
47
- })
48
-
49
- if (response.status !== 200)
50
- throw new Error("It was not possible to retrieve the number of following. Please try again.")
15
+ throw new Error("It was not possible to retrieve the user's statistic. Please try again.")
51
16
 
52
17
  const jsonData: any = await response.json()
53
18
 
54
- return jsonData.length
19
+ const data = {
20
+ following: jsonData.following,
21
+ followers: jsonData.followers,
22
+ publicRepos: jsonData.public_repos,
23
+ avatarUrl: jsonData.avatar_url
24
+ }
25
+
26
+ return data
55
27
  }
56
28
 
57
29
  /**
@@ -60,27 +32,33 @@ const getNumberOfFollowingGitHub = async (user: string): Promise<number> => {
60
32
  * @param minimumAmountOfFollowing <number> The minimum amount of following the user should have
61
33
  * @param minimumAmountOfFollowers <number> The minimum amount of followers the user should have
62
34
  * @param minimumAmountOfPublicRepos <number> The minimum amount of public repos the user should have
63
- * @returns <boolean> True if the user is reputable enough, false otherwise
35
+ * @returns <any> Return the avatar URL of the user if the user is reputable, false otherwise
64
36
  */
65
37
  export const githubReputation = async (
66
38
  userLogin: string,
67
39
  minimumAmountOfFollowing: number,
68
40
  minimumAmountOfFollowers: number,
69
41
  minimumAmountOfPublicRepos: number
70
- ): Promise<boolean> => {
42
+ ): Promise<any> => {
71
43
  if (!process.env.GITHUB_ACCESS_TOKEN)
72
44
  throw new Error(
73
45
  "The GitHub access token is missing. Please insert a valid token to be used for anti-sybil checks on user registation, and then try again."
74
46
  )
75
- const following = await getNumberOfFollowingGitHub(userLogin)
76
- const repos = await getNumberOfPublicReposGitHub(userLogin)
77
- const followers = await getNumberOfFollowersGitHub(userLogin)
47
+
48
+ const { following, followers, publicRepos, avatarUrl } = await getGitHubStats(userLogin)
78
49
 
79
50
  if (
80
51
  following < minimumAmountOfFollowing ||
81
- repos < minimumAmountOfPublicRepos ||
52
+ publicRepos < minimumAmountOfPublicRepos ||
82
53
  followers < minimumAmountOfFollowers
83
54
  )
84
- return false
85
- return true
55
+ return {
56
+ reputable: false,
57
+ avatarUrl: ""
58
+ }
59
+
60
+ return {
61
+ reputable: true,
62
+ avatarUrl: avatarUrl
63
+ }
86
64
  }
@@ -22,7 +22,7 @@ export const getFirestoreDatabase = (app: FirebaseApp): Firestore => getFirestor
22
22
  * @param app <FirebaseApp> - the Firebase application.
23
23
  * @returns <Functions> - the Cloud Functions associated to the application.
24
24
  */
25
- export const getFirebaseFunctions = (app: FirebaseApp): Functions => getFunctions(app, 'europe-west1')
25
+ export const getFirebaseFunctions = (app: FirebaseApp): Functions => getFunctions(app, "europe-west1")
26
26
 
27
27
  /**
28
28
  * Retrieve the configuration variables for the AWS services (S3, EC2).
@@ -1,18 +1,18 @@
1
1
  import { Firestore } from "firebase/firestore"
2
- import fs, { ReadPosition } from "fs"
2
+ import fs, { ReadPosition, createWriteStream } from "fs"
3
3
  import { utils as ffUtils } from "ffjavascript"
4
4
  import winston, { Logger } from "winston"
5
- import { S3Client, GetObjectCommand, HeadObjectCommand } from "@aws-sdk/client-s3"
6
- import {
7
- CircuitMetadata,
8
- Contribution,
9
- CircuitDocument,
5
+ import fetch from "@adobe/node-fetch-retry"
6
+ import {
7
+ CircuitMetadata,
8
+ Contribution,
9
+ CircuitDocument,
10
10
  CircuitInputData,
11
- ContributionValidity,
12
- FirebaseDocumentInfo,
13
- SetupCeremonyData,
11
+ ContributionValidity,
12
+ FirebaseDocumentInfo,
13
+ SetupCeremonyData,
14
14
  CeremonySetupTemplate,
15
- CeremonySetupTemplateCircuitArtifacts,
15
+ CeremonySetupTemplateCircuitArtifacts
16
16
  } from "../types/index"
17
17
  import { finalContributionIndex, genesisZkeyIndex, potFilenameTemplate } from "./constants"
18
18
  import {
@@ -22,14 +22,14 @@ import {
22
22
  getContributionsCollectionPath
23
23
  } from "./database"
24
24
  import { CeremonyTimeoutType } from "../types/enums"
25
- import {
26
- getPotStorageFilePath,
27
- getR1csStorageFilePath,
28
- getWasmStorageFilePath,
25
+ import {
26
+ getPotStorageFilePath,
27
+ getR1csStorageFilePath,
28
+ getWasmStorageFilePath,
29
29
  getZkeyStorageFilePath
30
30
  } from "./storage"
31
31
  import { blake512FromPath } from "./crypto"
32
- import { Readable, pipeline } from "stream"
32
+ import { pipeline } from "stream"
33
33
  import { promisify } from "util"
34
34
 
35
35
  /**
@@ -41,23 +41,29 @@ import { promisify } from "util"
41
41
  */
42
42
  export const parseCeremonyFile = async (path: string, cleanup: boolean = false): Promise<SetupCeremonyData> => {
43
43
  // check that the path exists
44
- if (!fs.existsSync(path)) throw new Error("The provided path to the configuration file does not exist. Please provide an absolute path and try again.")
45
-
44
+ if (!fs.existsSync(path))
45
+ throw new Error(
46
+ "The provided path to the configuration file does not exist. Please provide an absolute path and try again."
47
+ )
48
+
46
49
  try {
47
50
  // read the data
48
51
  const data: CeremonySetupTemplate = JSON.parse(fs.readFileSync(path).toString())
49
52
 
50
53
  // verify that the data is correct
51
- if (data['timeoutMechanismType'] !== CeremonyTimeoutType.DYNAMIC && data['timeoutMechanismType'] !== CeremonyTimeoutType.FIXED)
54
+ if (
55
+ data["timeoutMechanismType"] !== CeremonyTimeoutType.DYNAMIC &&
56
+ data["timeoutMechanismType"] !== CeremonyTimeoutType.FIXED
57
+ )
52
58
  throw new Error("Invalid timeout type. Please choose between DYNAMIC and FIXED.")
53
-
59
+
54
60
  // validate that we have at least 1 circuit input data
55
- if (!data.circuits || data.circuits.length === 0)
61
+ if (!data.circuits || data.circuits.length === 0)
56
62
  throw new Error("You need to provide the data for at least 1 circuit.")
57
63
 
58
64
  // validate that the end date is in the future
59
- let endDate: Date
60
- let startDate: Date
65
+ let endDate: Date
66
+ let startDate: Date
61
67
  try {
62
68
  endDate = new Date(data.endDate)
63
69
  startDate = new Date(data.startDate)
@@ -66,12 +72,12 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
66
72
  }
67
73
 
68
74
  if (endDate <= startDate) throw new Error("The end date should be greater than the start date.")
69
-
75
+
70
76
  const currentDate = new Date()
71
77
 
72
- if (endDate <= currentDate || startDate <= currentDate)
78
+ if (endDate <= currentDate || startDate <= currentDate)
73
79
  throw new Error("The start and end dates should be in the future.")
74
-
80
+
75
81
  // validate penalty
76
82
  if (data.penalty <= 0) throw new Error("The penalty should be greater than zero.")
77
83
 
@@ -87,58 +93,49 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
87
93
  circuitArtifacts.push({
88
94
  artifacts: artifacts
89
95
  })
90
- const r1csPath = artifacts.r1csStoragePath
91
- const wasmPath = artifacts.wasmStoragePath
92
96
 
93
97
  // where we storing the r1cs downloaded
94
98
  const localR1csPath = `./${circuitData.name}.r1cs`
95
-
96
- // check that the artifacts exist in S3
97
- // we don't need any privileges to download this
98
- // just the correct region
99
- const s3 = new S3Client({region: artifacts.region})
100
-
101
- try {
102
- await s3.send(new HeadObjectCommand({
103
- Bucket: artifacts.bucket,
104
- Key: r1csPath
105
- }))
106
- } catch (error: any) {
107
- throw new Error(`The r1cs file (${r1csPath}) seems to not exist. Please ensure this is correct and that the object is publicly available.`)
108
- }
109
-
110
- try {
111
- await s3.send(new HeadObjectCommand({
112
- Bucket: artifacts.bucket,
113
- Key: wasmPath
114
- }))
115
- } catch (error: any) {
116
- throw new Error(`The wasm file (${wasmPath}) seems to not exist. Please ensure this is correct and that the object is publicly available.`)
117
- }
99
+ // where we storing the wasm downloaded
100
+ const localWasmPath = `./${circuitData.name}.wasm`
118
101
 
119
102
  // download the r1cs to extract the metadata
120
- const command = new GetObjectCommand({ Bucket: artifacts.bucket, Key: artifacts.r1csStoragePath })
121
- const response = await s3.send(command)
122
103
  const streamPipeline = promisify(pipeline)
123
104
 
124
- if (response.$metadata.httpStatusCode !== 200)
125
- throw new Error("There was an error while trying to download the r1cs file. Please check that the file has the correct permissions (public) set.")
105
+ // Make the call.
106
+ const responseR1CS = await fetch(artifacts.r1csStoragePath)
107
+
108
+ // Handle errors.
109
+ if (!responseR1CS.ok && responseR1CS.status !== 200)
110
+ throw new Error(
111
+ `There was an error while trying to download the r1cs file for circuit ${circuitData.name}. Please check that the file has the correct permissions (public) set.`
112
+ )
113
+
114
+ await streamPipeline(responseR1CS.body!, createWriteStream(localR1csPath))
115
+ // Write the file locally
126
116
 
127
- if (response.Body instanceof Readable)
128
- await streamPipeline(response.Body, fs.createWriteStream(localR1csPath))
129
-
130
117
  // extract the metadata from the r1cs
131
118
  const metadata = getR1CSInfo(localR1csPath)
132
119
 
120
+ // download wasm too to ensure it's available
121
+ const responseWASM = await fetch(artifacts.wasmStoragePath)
122
+ if (!responseWASM.ok && responseWASM.status !== 200)
123
+ throw new Error(
124
+ `There was an error while trying to download the WASM file for circuit ${circuitData.name}. Please check that the file has the correct permissions (public) set.`
125
+ )
126
+ await streamPipeline(responseWASM.body!, createWriteStream(localWasmPath))
127
+
133
128
  // validate that the circuit hash and template links are valid
134
129
  const template = circuitData.template
135
130
 
136
131
  const URLMatch = template.source.match(urlPattern)
137
- if (!URLMatch || URLMatch.length === 0 || URLMatch.length > 1) throw new Error("You should provide the URL to the circuits templates on GitHub.")
132
+ if (!URLMatch || URLMatch.length === 0 || URLMatch.length > 1)
133
+ throw new Error("You should provide the URL to the circuits templates on GitHub.")
138
134
 
139
135
  const hashMatch = template.commitHash.match(commitHashPattern)
140
- if (!hashMatch || hashMatch.length === 0 || hashMatch.length > 1) throw new Error("You should provide a valid commit hash of the circuit templates.")
141
-
136
+ if (!hashMatch || hashMatch.length === 0 || hashMatch.length > 1)
137
+ throw new Error("You should provide a valid commit hash of the circuit templates.")
138
+
142
139
  // calculate the hash of the r1cs file
143
140
  const r1csBlake2bHash = await blake512FromPath(localR1csPath)
144
141
 
@@ -151,12 +148,12 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
151
148
  const smallestPowersOfTauCompleteFilenameForCircuit = `${potFilenameTemplate}${doubleDigitsPowers}.ptau`
152
149
  const firstZkeyCompleteFilename = `${circuitPrefix}_${genesisZkeyIndex}.zkey`
153
150
 
154
- // storage paths
151
+ // storage paths
155
152
  const r1csStorageFilePath = getR1csStorageFilePath(circuitPrefix, r1csCompleteFilename)
156
153
  const wasmStorageFilePath = getWasmStorageFilePath(circuitPrefix, wasmCompleteFilename)
157
154
  const potStorageFilePath = getPotStorageFilePath(smallestPowersOfTauCompleteFilenameForCircuit)
158
155
  const zkeyStorageFilePath = getZkeyStorageFilePath(circuitPrefix, firstZkeyCompleteFilename)
159
-
156
+
160
157
  const files: any = {
161
158
  potFilename: smallestPowersOfTauCompleteFilenameForCircuit,
162
159
  r1csFilename: r1csCompleteFilename,
@@ -169,14 +166,15 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
169
166
  r1csBlake2bHash: r1csBlake2bHash
170
167
  }
171
168
 
172
- // validate that the compiler hash is a valid hash
169
+ // validate that the compiler hash is a valid hash
173
170
  const compiler = circuitData.compiler
174
171
  const compilerHashMatch = compiler.commitHash.match(commitHashPattern)
175
- if (!compilerHashMatch || compilerHashMatch.length === 0 || compilerHashMatch.length > 1) throw new Error("You should provide a valid commit hash of the circuit compiler.")
172
+ if (!compilerHashMatch || compilerHashMatch.length === 0 || compilerHashMatch.length > 1)
173
+ throw new Error("You should provide a valid commit hash of the circuit compiler.")
176
174
 
177
175
  // validate that the verification options are valid
178
176
  const verification = circuitData.verification
179
- if (verification.cfOrVm !== "CF" && verification.cfOrVm !== "VM")
177
+ if (verification.cfOrVm !== "CF" && verification.cfOrVm !== "VM")
180
178
  throw new Error("Please enter a valid verification mechanism: either CF or VM")
181
179
 
182
180
  // @todo VM parameters verification
@@ -189,8 +187,7 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
189
187
  let circuit: CircuitDocument | CircuitInputData = {} as CircuitDocument | CircuitInputData
190
188
 
191
189
  if (data.timeoutMechanismType === CeremonyTimeoutType.DYNAMIC) {
192
- if (circuitData.dynamicThreshold <= 0)
193
- throw new Error("The dynamic threshold should be > 0.")
190
+ if (circuitData.dynamicThreshold <= 0) throw new Error("The dynamic threshold should be > 0.")
194
191
  dynamicThreshold = circuitData.dynamicThreshold
195
192
 
196
193
  // the Circuit data for the ceremony setup
@@ -198,7 +195,7 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
198
195
  name: circuitData.name,
199
196
  description: circuitData.description,
200
197
  prefix: circuitPrefix,
201
- sequencePosition: i+1,
198
+ sequencePosition: i + 1,
202
199
  metadata: metadata,
203
200
  files: files,
204
201
  template: template,
@@ -209,23 +206,20 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
209
206
  contributionComputation: 0,
210
207
  fullContribution: 0,
211
208
  verifyCloudFunction: 0
212
- },
213
-
209
+ }
214
210
  }
215
211
  }
216
212
 
217
213
  if (data.timeoutMechanismType === CeremonyTimeoutType.FIXED) {
218
- if (circuitData.fixedTimeWindow <= 0)
219
- throw new Error("The fixed time window threshold should be > 0.")
214
+ if (circuitData.fixedTimeWindow <= 0) throw new Error("The fixed time window threshold should be > 0.")
220
215
  fixedTimeWindow = circuitData.fixedTimeWindow
221
216
 
222
-
223
217
  // the Circuit data for the ceremony setup
224
218
  circuit = {
225
219
  name: circuitData.name,
226
220
  description: circuitData.description,
227
221
  prefix: circuitPrefix,
228
- sequencePosition: i+1,
222
+ sequencePosition: i + 1,
229
223
  metadata: metadata,
230
224
  files: files,
231
225
  template: template,
@@ -236,16 +230,15 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
236
230
  contributionComputation: 0,
237
231
  fullContribution: 0,
238
232
  verifyCloudFunction: 0
239
- },
240
-
233
+ }
241
234
  }
242
235
  }
243
236
 
244
-
245
237
  circuits.push(circuit)
246
238
 
247
- // remove the local r1cs download (if used for verifying the config only vs setup)
239
+ // remove the local r1cs and wasm downloads (if used for verifying the config only vs setup)
248
240
  if (cleanup) fs.unlinkSync(localR1csPath)
241
+ fs.unlinkSync(localWasmPath)
249
242
  }
250
243
 
251
244
  const setupData: SetupCeremonyData = {
@@ -263,7 +256,6 @@ export const parseCeremonyFile = async (path: string, cleanup: boolean = false):
263
256
  }
264
257
 
265
258
  return setupData
266
-
267
259
  } catch (error: any) {
268
260
  throw new Error(`Error while parsing up the ceremony setup file. ${error.message}`)
269
261
  }
@@ -457,9 +449,11 @@ export const getPublicAttestationPreambleForContributor = (
457
449
  ceremonyName: string,
458
450
  isFinalizing: boolean
459
451
  ) =>
460
- `Hey, I'm ${contributorIdentifier} and I have ${
461
- isFinalizing ? "finalized" : "contributed to"
462
- } the ${ceremonyName} MPC Phase2 Trusted Setup ceremony.\nThe following are my contribution signatures:`
452
+ `Hey, I'm ${contributorIdentifier} and I have ${isFinalizing ? "finalized" : "contributed to"} the ${ceremonyName}${
453
+ ceremonyName.toLowerCase().includes("trusted setup") || ceremonyName.toLowerCase().includes("ceremony")
454
+ ? "."
455
+ : " MPC Phase2 Trusted Setup ceremony."
456
+ }\nThe following are my contribution signatures:`
463
457
 
464
458
  /**
465
459
  * Check and prepare public attestation for the contributor made only of its valid contributions.
@@ -740,4 +734,4 @@ export const getR1CSInfo = (localR1CSFilePath: string): CircuitMetadata => {
740
734
  * @param in <number> - the input number to be converted.
741
735
  * @returns <string> - the two digits stringified number derived from the conversion.
742
736
  */
743
- export const convertToDoubleDigits = (amount: number): string => (amount < 10 ? `0${amount}` : amount.toString())
737
+ export const convertToDoubleDigits = (amount: number): string => (amount < 10 ? `0${amount}` : amount.toString())
package/src/helpers/vm.ts CHANGED
@@ -82,7 +82,7 @@ export const vmDependenciesAndCacheArtifactsCommand = (
82
82
  zKeyPath: string,
83
83
  potPath: string,
84
84
  snsTopic: string,
85
- region: string
85
+ region: string
86
86
  ): Array<string> => [
87
87
  "#!/bin/bash",
88
88
  'MARKER_FILE="/var/run/my_script_ran"',
@@ -93,8 +93,13 @@ export const vmDependenciesAndCacheArtifactsCommand = (
93
93
  // eslint-disable-next-line no-template-curly-in-string
94
94
  "touch ${MARKER_FILE}",
95
95
  "sudo yum update -y",
96
- "curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash - ",
97
- "sudo yum install -y nodejs",
96
+ "curl -O https://nodejs.org/dist/v16.13.0/node-v16.13.0-linux-x64.tar.xz",
97
+ "tar -xf node-v16.13.0-linux-x64.tar.xz",
98
+ "mv node-v16.13.0-linux-x64 nodejs",
99
+ "sudo mv nodejs /opt/",
100
+ "echo 'export NODEJS_HOME=/opt/nodejs' >> /etc/profile",
101
+ "echo 'export PATH=$NODEJS_HOME/bin:$PATH' >> /etc/profile",
102
+ "source /etc/profile",
98
103
  "npm install -g snarkjs",
99
104
  `aws s3 cp s3://${zKeyPath} /var/tmp/genesisZkey.zkey`,
100
105
  `aws s3 cp s3://${potPath} /var/tmp/pot.ptau`,
@@ -118,6 +123,7 @@ export const vmContributionVerificationCommand = (
118
123
  lastZkeyStoragePath: string,
119
124
  verificationTranscriptStoragePathAndFilename: string
120
125
  ): Array<string> => [
126
+ `source /etc/profile`,
121
127
  `aws s3 cp s3://${bucketName}/${lastZkeyStoragePath} /var/tmp/lastZKey.zkey > /var/tmp/log.txt`,
122
128
  `snarkjs zkvi /var/tmp/genesisZkey.zkey /var/tmp/pot.ptau /var/tmp/lastZKey.zkey > /var/tmp/verification_transcript.log`,
123
129
  `aws s3 cp /var/tmp/verification_transcript.log s3://${bucketName}/${verificationTranscriptStoragePathAndFilename} &>/dev/null`,
package/src/index.ts CHANGED
@@ -87,7 +87,7 @@ export {
87
87
  verifyContribution,
88
88
  checkAndPrepareCoordinatorForFinalization,
89
89
  finalizeCircuit,
90
- finalizeCeremony
90
+ finalizeCeremony
91
91
  } from "./helpers/functions"
92
92
  export { toHex, blake512FromPath, computeSHA256ToHex, compareHashes } from "./helpers/crypto"
93
93
  export {
@@ -159,4 +159,4 @@ export {
159
159
  createEC2Client,
160
160
  vmContributionVerificationCommand,
161
161
  retrieveCommandStatus
162
- } from "./helpers/vm"
162
+ } from "./helpers/vm"
@@ -620,7 +620,6 @@ export type SetupCeremonyData = {
620
620
  circuitArtifacts: Array<CeremonySetupTemplateCircuitArtifacts>
621
621
  }
622
622
 
623
-
624
623
  export type CeremonySetupTemplateCircuitArtifacts = {
625
624
  artifacts: {
626
625
  bucket: string
@@ -640,11 +639,16 @@ export type CeremonySetupTemplateCircuitName = {
640
639
  }
641
640
 
642
641
  export type CeremonySetupTemplate = {
643
- title: string
642
+ title: string
644
643
  description: string
645
644
  startDate: string
646
645
  endDate: string
647
646
  timeoutMechanismType: CeremonyTimeoutType
648
- penalty: number
649
- circuits: Array<CircuitDocument & CeremonySetupTemplateCircuitArtifacts & CeremonySetupTemplateCircuitTimeout & CeremonySetupTemplateCircuitName>
650
- }
647
+ penalty: number
648
+ circuits: Array<
649
+ CircuitDocument &
650
+ CeremonySetupTemplateCircuitArtifacts &
651
+ CeremonySetupTemplateCircuitTimeout &
652
+ CeremonySetupTemplateCircuitName
653
+ >
654
+ }