mirror of
https://github.com/selfxyz/self.git
synced 2026-04-27 03:01:15 -04:00
Update circuits to calculate path internally
This commit is contained in:
@@ -17,13 +17,10 @@ template ProveNameDobNotInOfac(nLevels) {
|
||||
signal input path[nLevels];
|
||||
signal input siblings[nLevels];
|
||||
signal input current_date[6];
|
||||
|
||||
|
||||
signal input closest_leaf;
|
||||
signal input smt_root;
|
||||
signal input smt_size;
|
||||
signal input smt_path[256];
|
||||
signal input smt_siblings[256];
|
||||
signal input path_to_match[256];
|
||||
signal output proofType;
|
||||
signal output proofLevel;
|
||||
|
||||
@@ -49,24 +46,31 @@ template ProveNameDobNotInOfac(nLevels) {
|
||||
// NameDob hash
|
||||
signal name_dob_hash <== Poseidon(2)([pos_dob.out, name_hash]);
|
||||
signal smtleaf_hash <== Poseidon(3)([name_dob_hash, 1,1]);
|
||||
signal computedRoot <== BinaryMerkleRoot(256)(closest_leaf, smt_size, smt_path, smt_siblings);
|
||||
|
||||
signal sibLength <== SiblingsLength()(smt_siblings);
|
||||
signal smt_path_new[256];
|
||||
signal path_in_bits_reversed[256] <== Num2Bits(256)(name_dob_hash);
|
||||
var path_in_bits[256];
|
||||
for (var i = 0; i < 256; i++) {
|
||||
path_in_bits[i] = path_in_bits_reversed[255-i];
|
||||
}
|
||||
|
||||
component ct1 = VarShiftLeft(256,256);
|
||||
ct1.in <== path_in_bits;
|
||||
ct1.shift <== (256-sibLength);
|
||||
smt_path_new <== ct1.out;
|
||||
|
||||
signal closest_hash <== Poseidon(3)([closest_leaf, 1,1]);
|
||||
signal isClosestZero <== IsEqual()([closest_leaf,0]);
|
||||
signal closest <== IsEqual()([isClosestZero,0]);
|
||||
signal closestleaf_hash <== closest_hash * closest;
|
||||
|
||||
signal computedRoot <== BinaryMerkleRoot(256)(closestleaf_hash, sibLength, smt_path_new, smt_siblings);
|
||||
computedRoot === smt_root;
|
||||
|
||||
proofType <== IsEqual()([closest_leaf,smtleaf_hash]);
|
||||
proofType <== IsEqual()([closestleaf_hash,smtleaf_hash]);
|
||||
proofType === 0; // Uncomment this line to make circuit handle both membership and non-membership proof and returns the type of proof (0 for non-membership, 1 for membership)
|
||||
|
||||
signal sibLength <== SiblingsLength()(smt_siblings); // If someone tries to bypass the next test by deliberately passing in smt_size < commonLength
|
||||
sibLength === smt_size;
|
||||
|
||||
// Common length
|
||||
component ct = CommonBitsLengthFromEnd();
|
||||
ct.bits1 <== path_to_match;
|
||||
ct.bits2 <== Num2Bits(256)(name_dob_hash);
|
||||
signal commonLength <== ct.out;
|
||||
signal closestLeafValid <== LessEqThan(9)([smt_size,commonLength]);
|
||||
|
||||
signal check <== IsZero()(proofType+closestLeafValid);
|
||||
check === 0; // Assert the culminated condition
|
||||
proofLevel <== 2;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,10 +19,7 @@ template ProveNameNotInOfac(nLevels) {
|
||||
|
||||
signal input closest_leaf;
|
||||
signal input smt_root;
|
||||
signal input smt_size;
|
||||
signal input smt_path[256];
|
||||
signal input smt_siblings[256];
|
||||
signal input path_to_match[256];
|
||||
signal output proofType;
|
||||
signal output proofLevel;
|
||||
|
||||
@@ -40,24 +37,31 @@ template ProveNameNotInOfac(nLevels) {
|
||||
|
||||
signal name_hash <== Poseidon(3)([poseidon_hasher[0].out, poseidon_hasher[1].out, poseidon_hasher[2].out]);
|
||||
signal smtleaf_hash <== Poseidon(3)([name_hash, 1,1]);
|
||||
signal computedRoot <== BinaryMerkleRoot(256)(closest_leaf, smt_size, smt_path, smt_siblings);
|
||||
|
||||
signal sibLength <== SiblingsLength()(smt_siblings);
|
||||
signal smt_path_new[256];
|
||||
signal path_in_bits_reversed[256] <== Num2Bits(256)(name_hash);
|
||||
var path_in_bits[256];
|
||||
for (var i = 0; i < 256; i++) {
|
||||
path_in_bits[i] = path_in_bits_reversed[255-i];
|
||||
}
|
||||
|
||||
component ct1 = VarShiftLeft(256,256);
|
||||
ct1.in <== path_in_bits;
|
||||
ct1.shift <== (256-sibLength);
|
||||
smt_path_new <== ct1.out;
|
||||
|
||||
signal closest_hash <== Poseidon(3)([closest_leaf, 1,1]);
|
||||
signal isClosestZero <== IsEqual()([closest_leaf,0]);
|
||||
signal closest <== IsEqual()([isClosestZero,0]);
|
||||
signal closestleaf_hash <== closest_hash * closest;
|
||||
|
||||
signal computedRoot <== BinaryMerkleRoot(256)(closestleaf_hash, sibLength, smt_path_new, smt_siblings);
|
||||
computedRoot === smt_root;
|
||||
|
||||
proofType <== IsEqual()([closest_leaf,smtleaf_hash]);
|
||||
proofType <== IsEqual()([closestleaf_hash,smtleaf_hash]);
|
||||
proofType === 0; // Uncomment this line to make circuit handle both membership and non-membership proof and returns the type of proof (0 for non-membership, 1 for membership)
|
||||
|
||||
signal sibLength <== SiblingsLength()(smt_siblings); // If someone tries to bypass the next test by deliberately passing in smt_size < commonLength
|
||||
sibLength === smt_size;
|
||||
|
||||
// Common length
|
||||
component ct = CommonBitsLengthFromEnd();
|
||||
ct.bits1 <== path_to_match;
|
||||
ct.bits2 <== Num2Bits(256)(name_hash);
|
||||
signal commonLength <== ct.out;
|
||||
signal closestLeafValid <== LessEqThan(9)([smt_size,commonLength]);
|
||||
|
||||
signal check <== IsZero()(proofType+closestLeafValid);
|
||||
check === 0; // Assert the culminated condition
|
||||
proofLevel <== 1;
|
||||
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ pragma circom 2.1.5;
|
||||
include "circomlib/circuits/poseidon.circom";
|
||||
include "circomlib/circuits/comparators.circom";
|
||||
include "circomlib/circuits/bitify.circom";
|
||||
include "@zk-email/circuits/utils/array.circom";
|
||||
include "binary-merkle-root.circom";
|
||||
include "../utils/getCommonLength.circom";
|
||||
include "../utils/validatePassport.circom";
|
||||
@@ -20,56 +21,51 @@ template ProvePassportNotInOfac(nLevels) {
|
||||
|
||||
signal input closest_leaf;
|
||||
signal input smt_root;
|
||||
signal input smt_size;
|
||||
signal input smt_path[256];
|
||||
signal input smt_siblings[256];
|
||||
signal input path_to_match[256];
|
||||
signal output proofType;
|
||||
signal output proofLevel;
|
||||
|
||||
// Validate passport
|
||||
ValidatePassport(nLevels)(secret, attestation_id, pubkey_leaf, mrz, merkle_root, merkletree_size, path, siblings, current_date);
|
||||
|
||||
// PassportNoHash
|
||||
// PassportNo Hash
|
||||
component poseidon_hasher = Poseidon(9);
|
||||
for (var i = 0; i < 9; i++) {
|
||||
poseidon_hasher.inputs[i] <== mrz[49 + i];
|
||||
}
|
||||
signal smtleaf_hash <== Poseidon(3)([poseidon_hasher.out, 1,1]);
|
||||
// If computedRoot != smt_root; the below assertion fails as path and siblings do not compute to root and proof is not generated.
|
||||
// If computedRoot == smt_root; path and siblings are true but the proof could be membership or non-membership and then furthur checks are made.
|
||||
signal computedRoot <== BinaryMerkleRoot(256)(closest_leaf, smt_size, smt_path, smt_siblings);
|
||||
|
||||
// Caclulate the depth needed
|
||||
signal sibLength <== SiblingsLength()(smt_siblings);
|
||||
|
||||
// Calulate the path needed
|
||||
signal smt_path_new[256];
|
||||
signal path_in_bits_reversed[256] <== Num2Bits(256)(poseidon_hasher.out);
|
||||
var path_in_bits[256];
|
||||
for (var i = 0; i < 256; i++) {
|
||||
path_in_bits[i] = path_in_bits_reversed[255-i];
|
||||
}
|
||||
|
||||
// Shift the path to the left by sibLength to make it compatible for BinaryMerkleRoot function
|
||||
component ct1 = VarShiftLeft(256,256);
|
||||
ct1.in <== path_in_bits;
|
||||
ct1.shift <== (256-sibLength);
|
||||
smt_path_new <== ct1.out;
|
||||
|
||||
// Closest_leaf hash
|
||||
signal closest_hash <== Poseidon(3)([closest_leaf, 1,1]);
|
||||
signal isClosestZero <== IsEqual()([closest_leaf,0]);
|
||||
signal closest <== IsEqual()([isClosestZero,0]); // Because zk-kit/smt stores a 0 leaf as itself and not as Hash(0,value,1)
|
||||
signal closestleaf_hash <== closest_hash * closest;
|
||||
|
||||
// Verification
|
||||
signal computedRoot <== BinaryMerkleRoot(256)(closestleaf_hash, sibLength, smt_path_new, smt_siblings);
|
||||
computedRoot === smt_root;
|
||||
|
||||
// If leaf given = leaf calulated ; then membership proof
|
||||
proofType <== IsEqual()([closest_leaf,smtleaf_hash]); // 1 for membership proof, 0 for non-membership proof
|
||||
proofType <== IsEqual()([closestleaf_hash,smtleaf_hash]); // 1 for membership proof, 0 for non-membership proof
|
||||
proofType === 0; // Uncomment this line to make circuit handle both membership and non-membership proof and returns the type of proof (0 for non-membership, 1 for membership)
|
||||
|
||||
// If proofType if 0, then the given path and siblings are correct but for closest leaf (non-membership proof) or a 0 leaf (non-membership proof)
|
||||
// now we need to prove that if it is the closest leaf, than first common bits of hashes >= siblings length
|
||||
// if it is , then proof == true or it is invalid.
|
||||
|
||||
// Just an edge case verification if someone tries to bypass the next test by deliberately passing in smt_size < commonLength
|
||||
signal sibLength <== SiblingsLength()(smt_siblings); //gives the siblings length
|
||||
sibLength === smt_size;
|
||||
|
||||
// Common length
|
||||
component ct = CommonBitsLengthFromEnd();
|
||||
ct.bits1 <== path_to_match;
|
||||
ct.bits2 <== Num2Bits(256)(poseidon_hasher.out);
|
||||
signal commonLength <== ct.out;
|
||||
signal closestLeafValid <== LessEqThan(9)([smt_size,commonLength]); // out1 = 1 if first common bits of hashes >= siblings length
|
||||
// out1 = 1 if first common bits of hashes >= siblings length
|
||||
// out1 = 0 if first common bits of hashes < siblings length
|
||||
|
||||
// Now assert that
|
||||
// Membership condn ; bits < siblings length
|
||||
// 1,any = valid (membership proof, hence no need of other conditions)
|
||||
// 0,1 = valid (non-membership proof, closest sibling)
|
||||
// 0,0 = invalid (non-membership proof, but not closest sibling, i.e : user gave a random correct smt_path and smt_siblings)
|
||||
|
||||
signal check <== IsZero()(proofType+closestLeafValid); // if 0,0,0 then invalid
|
||||
check === 0; // Assert the culminated condition
|
||||
proofLevel <== 3;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ pragma circom 2.1.5;
|
||||
include "circomlib/circuits/comparators.circom";
|
||||
include "circomlib/circuits/bitify.circom";
|
||||
|
||||
// computes the first n common bits of the hashes
|
||||
// Computes the first n common bits of the hashes
|
||||
template CommonBitsLengthFromEnd() {
|
||||
|
||||
signal input bits1[256];
|
||||
@@ -32,6 +32,7 @@ template CommonBitsLengthFromEnd() {
|
||||
|
||||
}
|
||||
|
||||
// Computes length of an array when array is padded with 0;s from end and the last element after which padding starts is not 0, 0's might come in between.
|
||||
template SiblingsLength() {
|
||||
signal input siblings[256];
|
||||
signal output length;
|
||||
@@ -39,8 +40,12 @@ template SiblingsLength() {
|
||||
// Siblings can be like (1,2,3,0,0,4,5,0,0...all 0 till 256[the padded 0 ones])
|
||||
// We need to get the length , i.e 7 in this case
|
||||
var foo[256];
|
||||
for(var i = 0; i<256; i++){
|
||||
foo[i] = 0;
|
||||
}
|
||||
foo[255] = siblings[255];
|
||||
for(var i = 256-2; i>=0; i--){
|
||||
foo[i] = foo[i] + foo[i+1];
|
||||
foo[i] = siblings[i] + foo[i+1];
|
||||
}
|
||||
|
||||
// convert to (15,14,12,9,9,9,5,0,0,0..), this takes out the middle 0's
|
||||
@@ -50,7 +55,7 @@ template SiblingsLength() {
|
||||
|
||||
for(var i = 0; i<256; i++){
|
||||
iszero[i] = IsZero();
|
||||
siblings[i] ==> iszero[i].in;
|
||||
foo[i] ==> iszero[i].in;
|
||||
pop[i] <== iszero[i].out;
|
||||
}
|
||||
|
||||
|
||||
@@ -217,13 +217,13 @@ export function generateCircuitInputsOfac(
|
||||
const namedob_leaf = getNameDobLeaf(mrz_bytes.slice(10,49), mrz_bytes.slice(62, 68)) // [57-62] + 5 shift
|
||||
const name_leaf = getNameLeaf(mrz_bytes.slice(10,49)) // [6-44] + 5 shift
|
||||
|
||||
let root, depth, closestleaf, indices, siblings, pathToMatch;
|
||||
let root,closestleaf,siblings;
|
||||
if(proofLevel == 3){
|
||||
({root, depth, closestleaf, indices, siblings, pathToMatch} = generateSMTProof(sparsemerkletree, passport_leaf));
|
||||
({root, closestleaf, siblings} = generateSMTProof(sparsemerkletree, passport_leaf));
|
||||
} else if(proofLevel == 2){
|
||||
({root, depth, closestleaf, indices, siblings, pathToMatch} = generateSMTProof(sparsemerkletree, namedob_leaf));
|
||||
({root, closestleaf, siblings} = generateSMTProof(sparsemerkletree, namedob_leaf));
|
||||
} else if (proofLevel == 1){
|
||||
({root, depth, closestleaf, indices, siblings, pathToMatch} = generateSMTProof(sparsemerkletree, name_leaf));
|
||||
({root, closestleaf, siblings} = generateSMTProof(sparsemerkletree, name_leaf));
|
||||
} else {
|
||||
throw new Error("Invalid proof level")
|
||||
}
|
||||
@@ -232,10 +232,7 @@ export function generateCircuitInputsOfac(
|
||||
...finalResult,
|
||||
closest_leaf: [BigInt(closestleaf).toString()],
|
||||
smt_root: [BigInt(root).toString()],
|
||||
smt_size: [BigInt(depth).toString()],
|
||||
smt_path : indices.map(index => BigInt(index).toString()),
|
||||
smt_siblings: siblings.map(index => BigInt(index).toString()),
|
||||
path_to_match: pathToMatch.map(index => BigInt(index).toString())
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ import { sha256 } from 'js-sha256';
|
||||
import { sha1 } from 'js-sha1';
|
||||
import { sha384 } from 'js-sha512';
|
||||
import { SMT } from '@ashpect/smt';
|
||||
import { poseidon3 } from 'poseidon-lite';
|
||||
import forge from 'node-forge';
|
||||
|
||||
export function formatMrz(mrz: string) {
|
||||
@@ -310,26 +309,28 @@ export function generateSMTProof(smt: SMT, leaf: bigint) {
|
||||
// then check if entry[1] exists
|
||||
if(!entry[1]){
|
||||
// non membership proof
|
||||
console.log("entry[1] is 0")
|
||||
closestleaf = BigInt(0); // 0 leaf
|
||||
} else {
|
||||
closestleaf = poseidon3(entry); // leaf itself (memb proof)
|
||||
closestleaf = BigInt(entry[0]); // leaf itself (memb proof)
|
||||
}
|
||||
} else {
|
||||
closestleaf = poseidon3(matchingEntry); // actual closest
|
||||
// non membership proof
|
||||
closestleaf = BigInt(matchingEntry[0]); // actual closest
|
||||
}
|
||||
const binary = entry[0].toString(2)
|
||||
const bits = binary.slice(-depth);
|
||||
let indices = bits.padEnd(256, "0").split("").map(Number)
|
||||
siblings.reverse()
|
||||
const pathToMatch = num2Bits(256,BigInt(entry[0])) //no need to pad actually as poseidon hashes are 256 onli
|
||||
|
||||
while(indices.length < 256) indices.push(0);
|
||||
while(siblings.length < 256) siblings.push(BigInt(0));
|
||||
|
||||
// // CALCULATED ROOT FOR TESTING -- // Useful for debugging hence leaving as comments
|
||||
// closestleaf, depth, siblings, indices, root : needed
|
||||
// let calculatedNode = closestleaf;
|
||||
// PATH, SIBLINGS manipulation as per binary tree in the circuit
|
||||
siblings.reverse()
|
||||
while(siblings.length < 256) siblings.push(BigInt(0));
|
||||
|
||||
// ----- Useful for debugging hence leaving as comments -----
|
||||
// const binary = entry[0].toString(2)
|
||||
// const bits = binary.slice(-depth);
|
||||
// let indices = bits.padEnd(256, "0").split("").map(Number)
|
||||
// const pathToMatch = num2Bits(256,BigInt(entry[0]))
|
||||
// while(indices.length < 256) indices.push(0);
|
||||
// // CALCULATED ROOT FOR TESTING
|
||||
// // closestleaf, depth, siblings, indices, root : needed
|
||||
// let calculatedNode = poseidon3([closestleaf,1,1]);
|
||||
// console.log("Initial node while calculating",calculatedNode)
|
||||
// console.log(smt.verifyProof(smt.createProof(leaf)))
|
||||
// for (let i= 0; i < depth ; i++) {
|
||||
@@ -339,14 +340,13 @@ export function generateSMTProof(smt: SMT, leaf: bigint) {
|
||||
// }
|
||||
// console.log("Actual node", root)
|
||||
// console.log("calculated node", calculatedNode)
|
||||
// -----------------------------------------------------------
|
||||
|
||||
return {
|
||||
root,
|
||||
depth,
|
||||
closestleaf,
|
||||
indices,
|
||||
siblings,
|
||||
pathToMatch
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -102,6 +102,11 @@ asn1.js@^5.4.1:
|
||||
minimalistic-assert "^1.0.0"
|
||||
safer-buffer "^2.1.0"
|
||||
|
||||
asynckit@^0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
|
||||
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
|
||||
|
||||
available-typed-arrays@^1.0.7:
|
||||
version "1.0.7"
|
||||
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
|
||||
@@ -109,6 +114,15 @@ available-typed-arrays@^1.0.7:
|
||||
dependencies:
|
||||
possible-typed-array-names "^1.0.0"
|
||||
|
||||
axios@^1.7.2:
|
||||
version "1.7.3"
|
||||
resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.3.tgz#a1125f2faf702bc8e8f2104ec3a76fab40257d85"
|
||||
integrity sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==
|
||||
dependencies:
|
||||
follow-redirects "^1.15.6"
|
||||
form-data "^4.0.0"
|
||||
proxy-from-env "^1.1.0"
|
||||
|
||||
base64-js@^1.3.1:
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
|
||||
@@ -143,6 +157,13 @@ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bin
|
||||
get-intrinsic "^1.2.4"
|
||||
set-function-length "^1.2.1"
|
||||
|
||||
combined-stream@^1.0.8:
|
||||
version "1.0.8"
|
||||
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
|
||||
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
|
||||
dependencies:
|
||||
delayed-stream "~1.0.0"
|
||||
|
||||
data-view-buffer@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2"
|
||||
@@ -188,6 +209,11 @@ define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1:
|
||||
has-property-descriptors "^1.0.0"
|
||||
object-keys "^1.1.1"
|
||||
|
||||
delayed-stream@~1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
|
||||
integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
|
||||
|
||||
elliptic@^6.5.5:
|
||||
version "6.5.5"
|
||||
resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded"
|
||||
@@ -310,6 +336,11 @@ es7-shim@^6.0.0:
|
||||
string.prototype.trimleft "^2.0.0"
|
||||
string.prototype.trimright "^2.0.0"
|
||||
|
||||
follow-redirects@^1.15.6:
|
||||
version "1.15.6"
|
||||
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
|
||||
integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
|
||||
|
||||
for-each@^0.3.3:
|
||||
version "0.3.3"
|
||||
resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
|
||||
@@ -317,6 +348,15 @@ for-each@^0.3.3:
|
||||
dependencies:
|
||||
is-callable "^1.1.3"
|
||||
|
||||
form-data@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
|
||||
integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
|
||||
dependencies:
|
||||
asynckit "^0.4.0"
|
||||
combined-stream "^1.0.8"
|
||||
mime-types "^2.1.12"
|
||||
|
||||
fs@^0.0.1-security:
|
||||
version "0.0.1-security"
|
||||
resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.1-security.tgz#8a7bd37186b6dddf3813f23858b57ecaaf5e41d4"
|
||||
@@ -595,6 +635,18 @@ lodash@^4.17.10:
|
||||
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
|
||||
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
|
||||
|
||||
mime-db@1.52.0:
|
||||
version "1.52.0"
|
||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
|
||||
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
|
||||
|
||||
mime-types@^2.1.12:
|
||||
version "2.1.35"
|
||||
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
|
||||
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
|
||||
dependencies:
|
||||
mime-db "1.52.0"
|
||||
|
||||
minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
|
||||
@@ -688,6 +740,11 @@ process@^0.11.1:
|
||||
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
|
||||
integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
|
||||
|
||||
proxy-from-env@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
|
||||
integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
|
||||
|
||||
regenerator-runtime@^0.14.0:
|
||||
version "0.14.0"
|
||||
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
|
||||
|
||||
@@ -2,51 +2,6 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@cspotcode/source-map-support@^0.8.0":
|
||||
version "0.8.1"
|
||||
resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz"
|
||||
integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
|
||||
dependencies:
|
||||
"@jridgewell/trace-mapping" "0.3.9"
|
||||
|
||||
"@jridgewell/resolve-uri@^3.0.3":
|
||||
version "3.1.2"
|
||||
resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
|
||||
integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
|
||||
|
||||
"@jridgewell/sourcemap-codec@^1.4.10":
|
||||
version "1.4.15"
|
||||
resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz"
|
||||
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
|
||||
|
||||
"@jridgewell/trace-mapping@0.3.9":
|
||||
version "0.3.9"
|
||||
resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz"
|
||||
integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
|
||||
dependencies:
|
||||
"@jridgewell/resolve-uri" "^3.0.3"
|
||||
"@jridgewell/sourcemap-codec" "^1.4.10"
|
||||
|
||||
"@tsconfig/node10@^1.0.7":
|
||||
version "1.0.11"
|
||||
resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz"
|
||||
integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==
|
||||
|
||||
"@tsconfig/node12@^1.0.7":
|
||||
version "1.0.11"
|
||||
resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz"
|
||||
integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==
|
||||
|
||||
"@tsconfig/node14@^1.0.0":
|
||||
version "1.0.3"
|
||||
resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz"
|
||||
integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
|
||||
|
||||
"@tsconfig/node16@^1.0.2":
|
||||
version "1.0.4"
|
||||
resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz"
|
||||
integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==
|
||||
|
||||
"@types/node@^20.11.20":
|
||||
version "20.11.20"
|
||||
resolved "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz"
|
||||
@@ -114,13 +69,3 @@ undici-types@~5.26.4:
|
||||
version "5.26.5"
|
||||
resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz"
|
||||
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
|
||||
|
||||
v8-compile-cache-lib@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz"
|
||||
integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
|
||||
|
||||
yn@3.1.1:
|
||||
version "3.1.1"
|
||||
resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz"
|
||||
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
|
||||
|
||||
Reference in New Issue
Block a user