diff --git a/packages/cli/package.json b/packages/cli/package.json index b5f307e1113f..32f583e0d843 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -58,7 +58,6 @@ "@chainsafe/discv5": "^1.1.2", "@chainsafe/ssz": "^0.9.2", "@libp2p/peer-id-factory": "^1.0.18", - "@multiformats/multiaddr": "^11.0.0", "@lodestar/api": "^1.1.1", "@lodestar/beacon-node": "^1.1.1", "@lodestar/config": "^1.1.1", @@ -69,6 +68,7 @@ "@lodestar/types": "^1.1.1", "@lodestar/utils": "^1.1.1", "@lodestar/validator": "^1.1.1", + "@multiformats/multiaddr": "^11.0.0", "@types/lockfile": "^1.0.1", "bip39": "^3.0.2", "deepmerge": "^4.2.2", @@ -85,15 +85,15 @@ "source-map-support": "^0.5.19", "uint8arrays": "^3.1.0", "uuidv4": "^6.1.1", - "yargs": "^16.1.0", "winston": "^3.3.3", "winston-daily-rotate-file": "^4.5.5", - "winston-transport": "^4.3.0" + "winston-transport": "^4.3.0", + "yargs": "^16.1.0" }, "devDependencies": { "@types/expand-tilde": "^2.0.0", "@types/got": "^9.6.11", - "@types/inquirer": "^7.3.0", + "@types/inquirer": "^9.0.2", "@types/js-yaml": "^3.12.5", "@types/lodash": "^4.14.157", "@types/rimraf": "^3.0.2", diff --git a/packages/types/src/eip4844/sszTypes.ts b/packages/types/src/eip4844/sszTypes.ts index 3d6abb49b77e..8848ed76799a 100644 --- a/packages/types/src/eip4844/sszTypes.ts +++ b/packages/types/src/eip4844/sszTypes.ts @@ -1,4 +1,4 @@ -import {ContainerType, ListCompositeType} from "@chainsafe/ssz"; +import {ContainerType, ListCompositeType, ByteVectorType} from "@chainsafe/ssz"; import {HISTORICAL_ROOTS_LIMIT, FIELD_ELEMENTS_PER_BLOB, MAX_BLOBS_PER_BLOCK} from "@lodestar/params"; import {ssz as primitiveSsz} from "../primitive/index.js"; import {ssz as phase0Ssz} from "../phase0/index.js"; @@ -18,12 +18,14 @@ export const BLSFieldElement = Bytes32; export const KZGCommitment = Bytes48; export const KZGProof = Bytes48; +const BYTES_PER_FIELD_ELEMENT = 32; + // Beacon chain // Custom types // https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/beacon-chain.md#custom-types -export const Blob = new ListCompositeType(BLSFieldElement, FIELD_ELEMENTS_PER_BLOB); +export const Blob = new ByteVectorType(BYTES_PER_FIELD_ELEMENT * FIELD_ELEMENTS_PER_BLOB); export const Blobs = new ListCompositeType(Blob, MAX_BLOBS_PER_BLOCK); export const VersionedHash = Bytes32; export const BlobKzgCommitments = new ListCompositeType(KZGCommitment, MAX_BLOBS_PER_BLOCK); diff --git a/packages/validator/package.json b/packages/validator/package.json index 175e70e0b73c..0e2846ab1df6 100644 --- a/packages/validator/package.json +++ b/packages/validator/package.json @@ -59,6 +59,7 @@ "@lodestar/types": "^1.1.1", "@lodestar/utils": "^1.1.1", "bigint-buffer": "^1.1.5", + "c-kzg": "^0.0.6", "cross-fetch": "^3.1.4", "strict-event-emitter-types": "^2.0.0" }, diff --git a/packages/validator/src/services/block.ts b/packages/validator/src/services/block.ts index f7e6ef7bb1e0..43881cba4ed8 100644 --- a/packages/validator/src/services/block.ts +++ b/packages/validator/src/services/block.ts @@ -1,14 +1,15 @@ +import {computeAggregateKzgProof} from "c-kzg"; import {BLSPubkey, Slot, BLSSignature, allForks, bellatrix, isBlindedBeaconBlock, eip4844, ssz} from "@lodestar/types"; import {IChainForkConfig} from "@lodestar/config"; import {ForkName, ForkSeq} from "@lodestar/params"; import {extendError, prettyBytes} from "@lodestar/utils"; import {toHexString} from "@chainsafe/ssz"; import {Api} from "@lodestar/api"; -import {Blobs} from "@lodestar/types/eip4844"; +import {Blobs, BlobsSidecar} from "@lodestar/types/eip4844"; +import {blindedOrFullBlockHashTreeRoot} from "@lodestar/state-transition"; import {IClock, ILoggerVc} from "../util/index.js"; import {PubkeyHex} from "../types.js"; import {Metrics} from "../metrics.js"; -import {getBlobsSidecar} from "../util/blobs/polynomialCommitments.js"; import {ValidatorStore} from "./validatorStore.js"; import {BlockDutiesService, GENESIS_SLOT} from "./blockDuties.js"; @@ -106,7 +107,7 @@ export class BlockProposingService { const signedBlockWithBlobs = ssz.eip4844.SignedBeaconBlockAndBlobsSidecar.defaultValue(); signedBlockWithBlobs.beaconBlock = signedBlock as eip4844.SignedBeaconBlock; - signedBlockWithBlobs.blobsSidecar = getBlobsSidecar(this.config, block, blobs); + signedBlockWithBlobs.blobsSidecar = this.getBlobsSidecar(block, blobs); // TODO EIP-4844: Blinded blocks??? No clue! await this.api.beacon.publishBlockWithBlobs(signedBlockWithBlobs).catch(onPublishError); @@ -121,6 +122,27 @@ export class BlockProposingService { } } + /** + * https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/validator.md#sidecar + * def get_blobs_sidecar(block: BeaconBlock, blobs: Sequence[Blob]) -> BlobsSidecar: + * return BlobsSidecar( + * beacon_block_root=hash_tree_root(block), + * beacon_block_slot=block.slot, + * blobs=blobs, + * kzg_aggregated_proof=compute_proof_from_blobs(blobs), + * ) + */ + private getBlobsSidecar(block: allForks.FullOrBlindedBeaconBlock, blobs: Blobs): BlobsSidecar { + const blobsSidecar = ssz.eip4844.BlobsSidecar.defaultValue(); + + blobsSidecar.beaconBlockRoot = blindedOrFullBlockHashTreeRoot(this.config, block); + blobsSidecar.beaconBlockSlot = block.slot; + blobsSidecar.blobs = blobs; + blobsSidecar.kzgAggregatedProof = computeAggregateKzgProof(blobs); + + return blobsSidecar; + } + private publishBlockWrapper = async (signedBlock: allForks.FullOrBlindedSignedBeaconBlock): Promise => { return isBlindedBeaconBlock(signedBlock.message) ? this.api.beacon.publishBlindedBlock(signedBlock as bellatrix.SignedBlindedBeaconBlock) diff --git a/packages/validator/src/util/blobs/bitReversalPermutation.ts b/packages/validator/src/util/blobs/bitReversalPermutation.ts deleted file mode 100644 index 49d6ba45be3a..000000000000 --- a/packages/validator/src/util/blobs/bitReversalPermutation.ts +++ /dev/null @@ -1,54 +0,0 @@ -// https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/polynomial-commitments.md#bit-reversal-permutation - -import {FIELD_ELEMENTS_PER_BLOB} from "@lodestar/params"; - -/* -All polynomials (which are always given in Lagrange form) should be interpreted as being in bit-reversal permutation. In practice, clients can implement this by storing the lists KZG_SETUP_LAGRANGE and ROOTS_OF_UNITY in bit-reversal permutation, so these functions only have to be called once at startup. -*/ - -// def is_power_of_two(value: int) -> bool: -// """ -// Check if ``value`` is a power of two integer. -// """ -// return (value > 0) and (value & (value - 1) == 0) -function isPowerOfTwo(value: number): boolean { - return value > 0 && !(value & (value - 1)); -} - -// def reverse_bits(n: int, order: int) -> int: -// """ -// Reverse the bit order of an integer n -// """ -// assert is_power_of_two(order) -// # Convert n to binary with the same number of bits as "order" - 1, then reverse its bit order -// return int(('{:0' + str(order.bit_length() - 1) + 'b}').format(n)[::-1], 2) -function reverseBits(n: number, _order: number): number { - // TODO: EIP-4844 implement this - // Prysm does: - // bits.Reverse64(uint64(i)) >> (65 - bits.Len64(params.FieldElementsPerBlob)) - return n; -} - -// def bit_reversal_permutation(sequence: Sequence[T]) -> Sequence[T]: -// """ -// Return a copy with bit-reversed permutation. The permutation is an involution (inverts itself). - -// The input and output are a sequence of generic type ``T`` objects. -// """ -// return [sequence[reverse_bits(i, len(sequence))] for i in range(len(sequence))] -export function bitReversalPermutation(sequence: T[]): T[] { - if (!isPowerOfTwo(FIELD_ELEMENTS_PER_BLOB)) { - throw new Error( - `FIELD_ELEMENTS_PER_BLOB must be a power of two. The value FIELD_ELEMENTS_PER_BLOB: ${FIELD_ELEMENTS_PER_BLOB} is not.` - ); - } - - const order = sequence.length; - const permutedSequence: T[] = []; - - sequence.forEach((_, index: number) => { - permutedSequence[index] = sequence[reverseBits(index, order)]; - }); - - return permutedSequence; -} diff --git a/packages/validator/src/util/blobs/bls.ts b/packages/validator/src/util/blobs/bls.ts deleted file mode 100644 index 4b79c16368b8..000000000000 --- a/packages/validator/src/util/blobs/bls.ts +++ /dev/null @@ -1,70 +0,0 @@ -// https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/polynomial-commitments.md#bls12-381-helpers - -import {KZGCommitment, BLSFieldElement} from "@lodestar/types/eip4844"; -import {Bytes32, ssz} from "@lodestar/types"; -import {bytesToBigInt, intToBytes, bigIntToBytes} from "@lodestar/utils"; -import {BLS_MODULUS} from "./constants.js"; - -// def bytes_to_bls_field(b: Bytes32) -> BLSFieldElement: -// """ -// Convert bytes to a BLS field scalar. The output is not uniform over the BLS field. -// """ -// return int.from_bytes(b, "little") % BLS_MODULUS -export function bytesToBLSField(b: Bytes32): BLSFieldElement { - return intToBytes(bytesToBigInt(b) % BLS_MODULUS, 32); -} - -// def bls_modular_inverse(x: BLSFieldElement) -> BLSFieldElement: -// """ -// Compute the modular inverse of x -// i.e. return y such that x * y % BLS_MODULUS == 1 and return 0 for x == 0 -// """ -// return pow(x, -1, BLS_MODULUS) if x != 0 else 0 -export function blsModularInverse(x: BLSFieldElement): BLSFieldElement { - // Maybe BLSFieldElement should actually just be "number"? - const value = bytesToBigInt(x); - if (value !== BigInt(0)) { - return intToBytes(value ** BigInt(-1) % BLS_MODULUS, 32); - } - return intToBytes(0, 32); -} - -// def div(x: BLSFieldElement, y: BLSFieldElement) -> BLSFieldElement: -// """Divide two field elements: `x` by `y`""" -// return (int(x) * int(bls_modular_inverse(y))) % BLS_MODULUS -export function div(x: BLSFieldElement, y: BLSFieldElement): BLSFieldElement { - const product = bytesToBigInt(x) * bytesToBigInt(blsModularInverse(y)); - return bigIntToBytes(product % BLS_MODULUS, 32); -} - -// def g1_lincomb(points: Sequence[KZGCommitment], scalars: Sequence[BLSFieldElement]) -> KZGCommitment: -// """ -// BLS multiscalar multiplication. This function can be optimized using Pippenger's algorithm and variants. -// """ -// assert len(points) == len(scalars) -// result = bls.Z1 -// for x, a in zip(points, scalars): -// result = bls.add(result, bls.multiply(bls.bytes48_to_G1(x), a)) -// return KZGCommitment(bls.G1_to_bytes48(result)) -export function g1Lincomb(points: KZGCommitment[], scalars: BLSFieldElement[]): KZGCommitment { - if (points.length !== scalars.length) { - throw new Error("BLS multiscalar multiplication requires points length to match scalars length."); - } - - return ssz.eip4844.KZGCommitment.defaultValue(); -} - -// def vector_lincomb(vectors: Sequence[Sequence[BLSFieldElement]], -// scalars: Sequence[BLSFieldElement]) -> Sequence[BLSFieldElement]: -// """ -// Given a list of ``vectors``, interpret it as a 2D matrix and compute the linear combination -// of each column with `scalars`: return the resulting vector. -// """ -// result = [0] * len(vectors[0]) -// for v, s in zip(vectors, scalars): -// for i, x in enumerate(v): -// result[i] = (result[i] + int(s) * int(x)) % BLS_MODULUS -// return [BLSFieldElement(x) for x in result] -export function vectorLincomb(_vectors: BLSFieldElement[][], _scalars: BLSFieldElement[]): BLSFieldElement[] { - return []; -} diff --git a/packages/validator/src/util/blobs/constants.ts b/packages/validator/src/util/blobs/constants.ts deleted file mode 100644 index b9e84f0f5520..000000000000 --- a/packages/validator/src/util/blobs/constants.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Constants -// https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/polynomial-commitments.md#constants - -import {KZGCommitment} from "@lodestar/types/eip4844"; -import {bitReversalPermutation} from "./bitReversalPermutation.js"; - -// Scalar field modulus of BLS12-381 -export const BLS_MODULUS = BigInt("52435875175126190479447740508185965837690552500527637822603658699938581184513"); - -// Roots of unity of order FIELD_ELEMENTS_PER_BLOB over the BLS12-381 field -export const ROOTS_OF_UNITY: KZGCommitment[] = []; -export const KZG_SETUP_LAGRANGE = bitReversalPermutation(ROOTS_OF_UNITY); diff --git a/packages/validator/src/util/blobs/polynomialCommitments.ts b/packages/validator/src/util/blobs/polynomialCommitments.ts deleted file mode 100644 index a2597bb1b91f..000000000000 --- a/packages/validator/src/util/blobs/polynomialCommitments.ts +++ /dev/null @@ -1,145 +0,0 @@ -import {IChainForkConfig} from "@lodestar/config"; -import {blindedOrFullBlockHashTreeRoot} from "@lodestar/state-transition"; -import {allForks, ssz} from "@lodestar/types"; -import { - Blob, - Blobs, - BlobsSidecar, - KZGCommitment, - KZGProof, - PolynomialAndCommitment, - Polynomial, - BLSFieldElement, -} from "@lodestar/types/eip4844"; -import {digest} from "@chainsafe/as-sha256"; -import {KZG_SETUP_LAGRANGE} from "./constants.js"; -import {bytesToBLSField, g1Lincomb} from "./bls.js"; - -// https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/validator.md#hash_to_bls_field -// def hash_to_bls_field(x: Container) -> BLSFieldElement: -// """ -// Compute 32-byte hash of serialized container and convert it to BLS field. -// The output is not uniform over the BLS field. -// """ -// return bytes_to_bls_field(hash(ssz_serialize(x))) -export function hashToBlsField(x: PolynomialAndCommitment): BLSFieldElement { - return bytesToBLSField(digest(ssz.eip4844.PolynomialAndCommitment.serialize(x))); -} - -// https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/polynomial-commitments.md#blob_to_kzg_commitment -// def blob_to_kzg_commitment(blob: Blob) -> KZGCommitment: -// return g1_lincomb(bit_reversal_permutation(KZG_SETUP_LAGRANGE), blob) -export function blobToKzgCommitment(blob: Blob): KZGCommitment { - return g1Lincomb(KZG_SETUP_LAGRANGE, blob); -} - -// https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/polynomial-commitments.md#evaluate_polynomial_in_evaluation_form -// def evaluate_polynomial_in_evaluation_form(polynomial: Sequence[BLSFieldElement], -// z: BLSFieldElement) -> BLSFieldElement: -// """ -// Evaluate a polynomial (in evaluation form) at an arbitrary point `z` -// Uses the barycentric formula: -// f(z) = (1 - z**WIDTH) / WIDTH * sum_(i=0)^WIDTH (f(DOMAIN[i]) * DOMAIN[i]) / (z - DOMAIN[i]) -// """ -// width = len(polynomial) -// assert width == FIELD_ELEMENTS_PER_BLOB -// inverse_width = bls_modular_inverse(width) - -// # Make sure we won't divide by zero during division -// assert z not in ROOTS_OF_UNITY - -// roots_of_unity_brp = bit_reversal_permutation(ROOTS_OF_UNITY) - -// result = 0 -// for i in range(width): -// result += div(int(polynomial[i]) * int(roots_of_unity_brp[i]), (z - roots_of_unity_brp[i])) -// result = result * (pow(z, width, BLS_MODULUS) - 1) * inverse_width % BLS_MODULUS -// return result -export function evaluatePolynomialInEvaluationForm(_polynomial: Polynomial, _z: BLSFieldElement): BLSFieldElement { - // This is now in https://pkg.go.dev/github.com/protolambda/go-kzg@v0.0.0-20221025081131-f3a74d3b1d0c/bls?utm_source=gopls#EvaluatePolyInEvaluationForm - // We will use a KZG library for this! - return ssz.eip4844.BLSFieldElement.defaultValue(); -} - -// https://github.com/ethereum/consensus-specs/blob/3552e2f6e8cb62f6342733d135c9fe8eecd26ecf/specs/eip4844/polynomial-commitments.md#compute_kzg_proof -// def compute_kzg_proof(polynomial: Sequence[BLSFieldElement], z: BLSFieldElement) -> KZGProof: -// """ -// Compute KZG proof at point `z` with `polynomial` being in evaluation form -// """ - -// # To avoid SSZ overflow/underflow, convert element into int -// polynomial = [int(i) for i in polynomial] -// z = int(z) - -// # Shift our polynomial first (in evaluation form we can't handle the division remainder) -// y = evaluate_polynomial_in_evaluation_form(polynomial, z) -// polynomial_shifted = [(p - int(y)) % BLS_MODULUS for p in polynomial] - -// # Make sure we won't divide by zero during division -// assert z not in ROOTS_OF_UNITY -// denominator_poly = [(x - z) % BLS_MODULUS for x in bit_reversal_permutation(ROOTS_OF_UNITY)] - -// # Calculate quotient polynomial by doing point-by-point division -// quotient_polynomial = [div(a, b) for a, b in zip(polynomial_shifted, denominator_poly)] -// return KZGProof(g1_lincomb(bit_reversal_permutation(KZG_SETUP_LAGRANGE), quotient_polynomial)) -export function computeKzgProof(polynomial: Polynomial, z: BLSFieldElement): KZGProof { - // const polynomialNumeric = polynomial.map(bytesToNumber); - // const zed = bytesToNumber(z); - - // Shift our polynomial first (in evaluation form we can't handle the division remainder) - const _y = evaluatePolynomialInEvaluationForm(polynomial, z); - // const polynomialShifted = polynomialNumeric.map((p) => (((p) - y) % BLS_MODULUS); - - return ssz.eip4844.KZGProof.defaultValue(); -} - -// https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/validator.md#compute_aggregated_poly_and_commitment -export function computeAggregatedPolynomialAndCommitment( - _blobs: Blobs, - _commitments: KZGCommitment[] -): PolynomialAndCommitment { - const polynomialAndCommitment = ssz.eip4844.PolynomialAndCommitment.defaultValue(); - polynomialAndCommitment.polynomial = ssz.eip4844.Polynomial.defaultValue(); - polynomialAndCommitment.kzgCommitment = ssz.eip4844.KZGCommitment.defaultValue(); - - return polynomialAndCommitment; -} - -// https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/validator.md#compute_proof_from_blobs -// def compute_proof_from_blobs(blobs: Sequence[Blob]) -> KZGProof: -// commitments = [blob_to_kzg_commitment(blob) for blob in blobs] -// aggregated_poly, aggregated_poly_commitment = compute_aggregated_poly_and_commitment(blobs, commitments) -// x = hash_to_bls_field(PolynomialAndCommitment( -// polynomial=aggregated_poly, -// kzg_commitment=aggregated_poly_commitment, -// )) -// return compute_kzg_proof(aggregated_poly, x) -export function computeProofFromBlobs(blobs: Blobs): KZGProof { - const commitments = blobs.map(blobToKzgCommitment); - const aggregatedPolyAndCommitment = computeAggregatedPolynomialAndCommitment(blobs, commitments); - const x = hashToBlsField(aggregatedPolyAndCommitment); - return computeKzgProof(aggregatedPolyAndCommitment.polynomial, x); -} - -// https://github.com/ethereum/consensus-specs/blob/dev/specs/eip4844/validator.md#sidecar -// def get_blobs_sidecar(block: BeaconBlock, blobs: Sequence[Blob]) -> BlobsSidecar: -// return BlobsSidecar( -// beacon_block_root=hash_tree_root(block), -// beacon_block_slot=block.slot, -// blobs=blobs, -// kzg_aggregated_proof=compute_proof_from_blobs(blobs), -// ) -export function getBlobsSidecar( - config: IChainForkConfig, - block: allForks.FullOrBlindedBeaconBlock, - blobs: Blobs -): BlobsSidecar { - const blobsSidecar = ssz.eip4844.BlobsSidecar.defaultValue(); - - blobsSidecar.beaconBlockRoot = blindedOrFullBlockHashTreeRoot(config, block); - blobsSidecar.beaconBlockSlot = block.slot; - blobsSidecar.blobs = blobs; - blobsSidecar.kzgAggregatedProof = computeProofFromBlobs(blobs); - - return blobsSidecar; -} diff --git a/packages/validator/src/validator.ts b/packages/validator/src/validator.ts index 062ab4ffae0a..6ac2222a5998 100644 --- a/packages/validator/src/validator.ts +++ b/packages/validator/src/validator.ts @@ -1,3 +1,5 @@ +// TODO EIP-4844 Do this (use the trusted setup from Geth) +// import {loadTrustedSetup} from "c-kzg"; import {IDatabaseApiOptions} from "@lodestar/db"; import {BLSPubkey, ssz} from "@lodestar/types"; import {createIBeaconConfig, IBeaconConfig} from "@lodestar/config"; diff --git a/yarn.lock b/yarn.lock index 0de85126ab05..2d0881faec5a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3292,13 +3292,13 @@ resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz" integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A== -"@types/inquirer@^7.3.0": - version "7.3.1" - resolved "https://registry.npmjs.org/@types/inquirer/-/inquirer-7.3.1.tgz" - integrity sha512-osD38QVIfcdgsPCT0V3lD7eH0OFurX71Jft18bZrsVQWVRt6TuxRzlr0GJLrxoHZR2V5ph7/qP8se/dcnI7o0g== +"@types/inquirer@^9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-9.0.2.tgz#846b141c17608aad9fc62572280753bb6ec09184" + integrity sha512-MQc3adiIh/rDxLkjnvL03rSvuHg+/dKif4dn/MRsnE+oU1bAdyuDbW0w+ewR1M/M/u/Z0YAbw7NZYCpgQ5SW8A== dependencies: "@types/through" "*" - rxjs "^6.4.0" + rxjs "^7.2.0" "@types/it-all@^1.0.0": version "1.0.0" @@ -4798,6 +4798,11 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +c-kzg@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/c-kzg/-/c-kzg-0.0.6.tgz#10ef9deb5ee142f0ba4d8e2813384dbbbb8c7730" + integrity sha512-usV8tEv5vEwWR84h6k16DXdKVSol/ewa3KUd3oQaGLrBEVXZvOKxXTKakkXPn4suyHapfZOXwFbiIBv6zHVkZA== + cacache@^15.2.0: version "15.3.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" @@ -11586,13 +11591,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^6.4.0: - version "6.5.5" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== - dependencies: - tslib "^1.9.0" - rxjs@^7.2.0: version "7.3.0" resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz" @@ -12699,7 +12697,7 @@ tslib@2.3.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.10.0, tslib@^1.8.1: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==