From 91632a4c1372cea81f5218c570f49e1af5205f75 Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 31 May 2024 21:43:34 +0300 Subject: [PATCH] Remove solana and avail adapters (#647) --- .../sovereign-sdk/adapters/avail/Cargo.toml | 58 - crates/sovereign-sdk/adapters/avail/README.md | 8 - .../sovereign-sdk/adapters/avail/src/avail.rs | 15 - .../sovereign-sdk/adapters/avail/src/lib.rs | 10 - .../adapters/avail/src/service.rs | 325 --- .../adapters/avail/src/spec/address.rs | 48 - .../adapters/avail/src/spec/block.rs | 40 - .../adapters/avail/src/spec/hash.rs | 38 - .../adapters/avail/src/spec/header.rs | 88 - .../adapters/avail/src/spec/mod.rs | 30 - .../adapters/avail/src/spec/transaction.rs | 87 - .../adapters/avail/src/verifier.rs | 82 - crates/sovereign-sdk/adapters/solana/Makefile | 29 - .../sovereign-sdk/adapters/solana/README.md | 299 --- .../sovereign-sdk/adapters/solana/config.json | 9 - .../adapters/solana/da_client/Cargo.toml | 31 - .../src/bin/account_delta_processor.rs | 158 -- .../adapters/solana/da_client/src/lib.rs | 64 - .../adapters/solana/da_client/src/main.rs | 314 --- .../solana/solana_da_programs/.gitignore | 8 - .../solana/solana_da_programs/.prettierignore | 8 - .../solana/solana_da_programs/Anchor.toml | 17 - .../solana/solana_da_programs/Cargo.lock | 1744 ----------------- .../solana/solana_da_programs/Cargo.toml | 13 - .../solana_da_programs/migrations/deploy.ts | 12 - .../solana/solana_da_programs/package.json | 19 - .../programs/blockroot/Cargo.toml | 19 - .../programs/blockroot/Xargo.toml | 2 - .../programs/blockroot/src/da.rs | 272 --- .../programs/blockroot/src/lib.rs | 151 -- .../tests/solana_da_programs.ts | 16 - .../solana/solana_da_programs/tsconfig.json | 10 - .../solana/solana_da_programs/yarn.lock | 1147 ----------- 33 files changed, 5171 deletions(-) delete mode 100644 crates/sovereign-sdk/adapters/avail/Cargo.toml delete mode 100644 crates/sovereign-sdk/adapters/avail/README.md delete mode 100644 crates/sovereign-sdk/adapters/avail/src/avail.rs delete mode 100644 crates/sovereign-sdk/adapters/avail/src/lib.rs delete mode 100644 crates/sovereign-sdk/adapters/avail/src/service.rs delete mode 100644 crates/sovereign-sdk/adapters/avail/src/spec/address.rs delete mode 100644 crates/sovereign-sdk/adapters/avail/src/spec/block.rs delete mode 100644 crates/sovereign-sdk/adapters/avail/src/spec/hash.rs delete mode 100644 crates/sovereign-sdk/adapters/avail/src/spec/header.rs delete mode 100644 crates/sovereign-sdk/adapters/avail/src/spec/mod.rs delete mode 100644 crates/sovereign-sdk/adapters/avail/src/spec/transaction.rs delete mode 100644 crates/sovereign-sdk/adapters/avail/src/verifier.rs delete mode 100644 crates/sovereign-sdk/adapters/solana/Makefile delete mode 100644 crates/sovereign-sdk/adapters/solana/README.md delete mode 100644 crates/sovereign-sdk/adapters/solana/config.json delete mode 100644 crates/sovereign-sdk/adapters/solana/da_client/Cargo.toml delete mode 100644 crates/sovereign-sdk/adapters/solana/da_client/src/bin/account_delta_processor.rs delete mode 100644 crates/sovereign-sdk/adapters/solana/da_client/src/lib.rs delete mode 100644 crates/sovereign-sdk/adapters/solana/da_client/src/main.rs delete mode 100644 crates/sovereign-sdk/adapters/solana/solana_da_programs/.gitignore delete mode 100644 crates/sovereign-sdk/adapters/solana/solana_da_programs/.prettierignore delete mode 100644 crates/sovereign-sdk/adapters/solana/solana_da_programs/Anchor.toml delete mode 100644 crates/sovereign-sdk/adapters/solana/solana_da_programs/Cargo.lock delete mode 100644 crates/sovereign-sdk/adapters/solana/solana_da_programs/Cargo.toml delete mode 100644 crates/sovereign-sdk/adapters/solana/solana_da_programs/migrations/deploy.ts delete mode 100644 crates/sovereign-sdk/adapters/solana/solana_da_programs/package.json delete mode 100644 crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/Cargo.toml delete mode 100644 crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/Xargo.toml delete mode 100644 crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/src/da.rs delete mode 100644 crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/src/lib.rs delete mode 100644 crates/sovereign-sdk/adapters/solana/solana_da_programs/tests/solana_da_programs.ts delete mode 100644 crates/sovereign-sdk/adapters/solana/solana_da_programs/tsconfig.json delete mode 100644 crates/sovereign-sdk/adapters/solana/solana_da_programs/yarn.lock diff --git a/crates/sovereign-sdk/adapters/avail/Cargo.toml b/crates/sovereign-sdk/adapters/avail/Cargo.toml deleted file mode 100644 index 3df6babe3..000000000 --- a/crates/sovereign-sdk/adapters/avail/Cargo.toml +++ /dev/null @@ -1,58 +0,0 @@ -[package] -name = "sov-avail-adapter" -version.workspace = true -edition.workspace = true -license.workspace = true -authors.workspace = true -homepage.workspace = true -publish.workspace = true -repository.workspace = true - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -borsh = { workspace = true, features = ["bytes"] } -sov-rollup-interface = { path = "../../rollup-interface" } -bytes = { version = "1.2.1", features = ["serde"] } -primitive-types = { version = "0.12.2", features = ["serde"] } -sp-core-hashing = "14.0.0" -subxt = { version = "0.29", optional = true } -avail-subxt = { git = "https://github.com/availproject/avail.git", tag = "v1.6.3", features = [ - "std", -], optional = true } -codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = [ - "derive", - "full", - "bit-vec", -], optional = true } - -# Convenience -tokio = { workspace = true, optional = true } -futures = { workspace = true, optional = true } -pin-project = { workspace = true, optional = true } -tracing = { workspace = true } -tracing-subscriber = { version = "0.3.17", features = ["fmt"] } -async-trait = { workspace = true } -anyhow = { workspace = true } -serde = { workspace = true } -serde_json = { workspace = true } -reqwest = { workspace = true, optional = true } -thiserror = { workspace = true } -sp-keyring = { version = "24", optional = true } -sp-core = { version = "21", optional = true } -hex = { workspace = true } - -[features] -default = ["native"] -native = [ - "dep:tokio", - "dep:codec", - "dep:reqwest", - "dep:avail-subxt", - "dep:subxt", - "dep:futures", - "dep:pin-project", - "dep:sp-keyring", - "dep:sp-core", - "sov-rollup-interface/native", -] diff --git a/crates/sovereign-sdk/adapters/avail/README.md b/crates/sovereign-sdk/adapters/avail/README.md deleted file mode 100644 index ce54aac1a..000000000 --- a/crates/sovereign-sdk/adapters/avail/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Avail Sovereign DA adapter (presence) - -This is a _research-only_ adapter making Avail compatible with the Sovereign SDK. - -> **_NOTE:_** None of its code is suitable for production use. - -This adapter was originally written by Vibhu Rajeev, Aleksandar Terentić and the Avail team, but is -provided as part of the Sovereign SDK under the Apache 2.0 and MIT licenses. diff --git a/crates/sovereign-sdk/adapters/avail/src/avail.rs b/crates/sovereign-sdk/adapters/avail/src/avail.rs deleted file mode 100644 index 05351659e..000000000 --- a/crates/sovereign-sdk/adapters/avail/src/avail.rs +++ /dev/null @@ -1,15 +0,0 @@ -use avail_subxt::primitives::AppUncheckedExtrinsic; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct Confidence { - pub block: u32, - pub confidence: f64, - pub serialised_confidence: Option, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ExtrinsicsData { - pub block: u32, - pub extrinsics: Vec, -} diff --git a/crates/sovereign-sdk/adapters/avail/src/lib.rs b/crates/sovereign-sdk/adapters/avail/src/lib.rs deleted file mode 100644 index 10b076213..000000000 --- a/crates/sovereign-sdk/adapters/avail/src/lib.rs +++ /dev/null @@ -1,10 +0,0 @@ -#[cfg(feature = "native")] -mod avail; -#[cfg(feature = "native")] -pub mod service; -pub mod spec; -pub mod verifier; - -// NOTE: Remove once dependency to the node is removed -#[cfg(feature = "native")] -pub use avail_subxt::build_client; diff --git a/crates/sovereign-sdk/adapters/avail/src/service.rs b/crates/sovereign-sdk/adapters/avail/src/service.rs deleted file mode 100644 index 97b23122d..000000000 --- a/crates/sovereign-sdk/adapters/avail/src/service.rs +++ /dev/null @@ -1,325 +0,0 @@ -use core::time::Duration; -use std::pin::Pin; -use std::task::{Context, Poll}; - -use anyhow::anyhow; -use async_trait::async_trait; -use avail_subxt::api::runtime_types::sp_core::bounded::bounded_vec::BoundedVec; -use avail_subxt::primitives::AvailExtrinsicParams; -use avail_subxt::{api, AvailConfig}; -use pin_project::pin_project; -use reqwest::StatusCode; -use sov_rollup_interface::da::DaSpec; -use sov_rollup_interface::services::da::DaService; -use sp_core::crypto::Pair as PairTrait; -use sp_keyring::sr25519::sr25519::Pair; -use subxt::tx::PairSigner; -use subxt::OnlineClient; -use tracing::info; - -use crate::avail::{Confidence, ExtrinsicsData}; -use crate::spec::block::AvailBlock; -use crate::spec::header::AvailHeader; -use crate::spec::transaction::AvailBlobTransaction; -use crate::spec::DaLayerSpec; -use crate::verifier::Verifier; - -/// Runtime configuration for the DA service -#[derive(Clone, PartialEq, serde::Deserialize, serde::Serialize)] -pub struct DaServiceConfig { - pub light_client_url: String, - pub node_client_url: String, - //TODO: Safer strategy to load seed so it is not accidentally revealed. - pub seed: String, - pub polling_timeout: Option, - pub polling_interval: Option, - pub app_id: u32, -} - -const DEFAULT_POLLING_TIMEOUT: Duration = Duration::from_secs(60); -const DEFAULT_POLLING_INTERVAL: Duration = Duration::from_secs(1); - -#[derive(Clone)] -pub struct DaProvider { - pub node_client: OnlineClient, - pub light_client_url: String, - signer: PairSigner, - polling_timeout: Duration, - polling_interval: Duration, - app_id: u32, -} - -impl DaProvider { - fn appdata_url(&self, block_num: u64) -> String { - let light_client_url = self.light_client_url.clone(); - format!("{light_client_url}/v1/appdata/{block_num}") - } - - fn confidence_url(&self, block_num: u64) -> String { - let light_client_url = self.light_client_url.clone(); - format!("{light_client_url}/v1/confidence/{block_num}") - } - - pub async fn new(config: DaServiceConfig) -> Self { - let pair = Pair::from_string_with_seed(&config.seed, None).unwrap(); - let signer = PairSigner::::new(pair.0.clone()); - - let node_client = avail_subxt::build_client(config.node_client_url.to_string(), false) - .await - .unwrap(); - let light_client_url = config.light_client_url; - - DaProvider { - node_client, - light_client_url, - signer, - polling_timeout: match config.polling_timeout { - Some(i) => Duration::from_secs(i), - None => DEFAULT_POLLING_TIMEOUT, - }, - polling_interval: match config.polling_interval { - Some(i) => Duration::from_secs(i), - None => DEFAULT_POLLING_INTERVAL, - }, - app_id: config.app_id, - } - } -} - -// TODO: Is there a way to avoid coupling to tokio? - -async fn wait_for_confidence( - confidence_url: &str, - polling_timeout: Duration, - polling_interval: Duration, -) -> anyhow::Result<()> { - let start_time = std::time::Instant::now(); - - loop { - if start_time.elapsed() >= polling_timeout { - return Err(anyhow!( - "Confidence not received after timeout: {}s", - polling_timeout.as_secs() - )); - } - - let response = reqwest::get(confidence_url).await?; - if response.status() != StatusCode::OK { - info!("Confidence not received"); - tokio::time::sleep(polling_interval).await; - continue; - } - - let response: Confidence = serde_json::from_str(&response.text().await?)?; - if response.confidence < 92.5 { - info!("Confidence not reached"); - tokio::time::sleep(polling_interval).await; - continue; - } - - break; - } - - Ok(()) -} - -async fn wait_for_appdata( - appdata_url: &str, - block: u32, - polling_timeout: Duration, - polling_interval: Duration, -) -> anyhow::Result { - let start_time = std::time::Instant::now(); - - loop { - if start_time.elapsed() >= polling_timeout { - return Err(anyhow!( - "RPC call for filtered block to light client timed out. Timeout: {}s", - polling_timeout.as_secs() - )); - } - - let response = reqwest::get(appdata_url).await?; - if response.status() == StatusCode::NOT_FOUND { - return Ok(ExtrinsicsData { - block, - extrinsics: vec![], - }); - } - if response.status() != StatusCode::OK { - tokio::time::sleep(polling_interval).await; - continue; - } - - let appdata: ExtrinsicsData = serde_json::from_str(&response.text().await?)?; - return Ok(appdata); - } -} - -/// Convincice copy from [`subxt::blocks::BlocksClient`] -type BlockStream = Pin> + Send>>; -/// Wrapper around return of [`subxt::blocks::BlocksClient::subscribe_finalized`] -/// that maps `Ok` variant to [`AvailHeader`] and `Error` variant to [`anyhow::Error`] -#[pin_project] -pub struct AvailBlockHeaderStream { - #[pin] - inner: BlockStream>>, -} - -impl futures::Stream for AvailBlockHeaderStream { - type Item = anyhow::Result; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - let this = self.project(); - let poll_result = this.inner.poll_next(cx); - Poll::Ready(match poll_result { - Poll::Ready(Some(Ok(block))) => Some(Ok(AvailHeader::from(block))), - Poll::Ready(Some(Err(e))) => Some(Err(e.into())), - Poll::Ready(None) => None, - Poll::Pending => return Poll::Pending, - }) - } -} - -#[async_trait] -impl DaService for DaProvider { - type Spec = DaLayerSpec; - - type Verifier = Verifier; - - type FilteredBlock = AvailBlock; - type HeaderStream = AvailBlockHeaderStream; - type TransactionId = [u8; 32]; - - type Error = anyhow::Error; - - // Make an RPC call to the node to get the block at the given height, if one exists. - // If no such block exists, block until one does. - async fn get_block_at(&self, height: u64) -> Result { - let node_client = self.node_client.clone(); - let confidence_url = self.confidence_url(height); - let appdata_url = self.appdata_url(height); - - wait_for_confidence(&confidence_url, self.polling_timeout, self.polling_interval).await?; - let appdata = wait_for_appdata( - &appdata_url, - height as u32, - self.polling_timeout, - self.polling_interval, - ) - .await?; - info!("Appdata: {:?}", appdata); - - let hash = match node_client.rpc().block_hash(Some(height.into())).await? { - Some(i) => i, - None => return Err(anyhow!("Hash for height: {} not found.", height)), - }; - - let header = match node_client.rpc().header(Some(hash)).await? { - Some(i) => i, - None => return Err(anyhow!("Header for hash: {} not found.", hash)), - }; - - let header = AvailHeader::new(header, hash); - let transactions: Result, anyhow::Error> = appdata - .extrinsics - .iter() - .map(AvailBlobTransaction::new) - .collect(); - - let transactions = transactions?; - Ok(AvailBlock { - header, - transactions, - }) - } - - async fn get_last_finalized_block_header( - &self, - ) -> Result<::BlockHeader, Self::Error> { - let node_client = self.node_client.clone(); - let finalized_header_hash = node_client.rpc().finalized_head().await?; - - let header = node_client - .rpc() - .header(Some(finalized_header_hash)) - .await? - .ok_or(anyhow::anyhow!("No finalized head found"))?; - let header = AvailHeader::new(header, finalized_header_hash); - Ok(header) - } - - async fn subscribe_finalized_header(&self) -> Result { - let block_stream = self.node_client.blocks().subscribe_finalized().await?; - Ok(AvailBlockHeaderStream { - inner: block_stream, - }) - } - - async fn get_head_block_header( - &self, - ) -> Result<::BlockHeader, Self::Error> { - let node_client = self.node_client.clone(); - let latest_block = node_client.blocks().at_latest().await?; - - Ok(latest_block.into()) - } - - // Extract the blob transactions relevant to a particular rollup from a block. - // NOTE: The avail light client is expected to be run in app specific mode, and hence the - // transactions in the block are already filtered and retrieved by light client. - fn extract_relevant_blobs( - &self, - block: &Self::FilteredBlock, - ) -> Vec<::BlobTransaction> { - block.transactions.clone() - } - - // Extract the inclusion and completeness proof for filtered block provided. - // The output of this method will be passed to the verifier. - // NOTE: The light client here has already completed DA sampling and verification of inclusion and soundness. - async fn get_extraction_proof( - &self, - _block: &Self::FilteredBlock, - _blobs: &[::BlobTransaction], - ) -> ( - ::InclusionMultiProof, - ::CompletenessProof, - ) { - ((), ()) - } - - async fn send_transaction(&self, blob: &[u8]) -> Result { - let data_transfer = api::tx() - .data_availability() - .submit_data(BoundedVec(blob.to_vec())); - - let extrinsic_params = AvailExtrinsicParams::new_with_app_id(self.app_id.into()); - - let h = self - .node_client - .tx() - .sign_and_submit_then_watch(&data_transfer, &self.signer, extrinsic_params) - .await?; - - info!("Transaction submitted: {:#?}", h.extrinsic_hash()); - - Ok([0; 32]) - } - - async fn send_aggregated_zk_proof(&self, _proof: &[u8]) -> Result { - unimplemented!() - } - - async fn get_aggregated_proofs_at(&self, _height: u64) -> Result>, Self::Error> { - unimplemented!() - } - - async fn get_fee_rate(&self) -> Result { - unimplemented!() - } - - async fn get_block_by_hash(&self, _hash: [u8; 32]) -> Result { - unimplemented!() - } -} diff --git a/crates/sovereign-sdk/adapters/avail/src/spec/address.rs b/crates/sovereign-sdk/adapters/avail/src/spec/address.rs deleted file mode 100644 index d99b20748..000000000 --- a/crates/sovereign-sdk/adapters/avail/src/spec/address.rs +++ /dev/null @@ -1,48 +0,0 @@ -use core::fmt::{Display, Formatter}; -use std::hash::Hash; -use std::str::FromStr; - -use primitive_types::H256; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize, Debug, PartialEq, Clone, Eq, Hash)] -pub struct AvailAddress([u8; 32]); - -impl sov_rollup_interface::BasicAddress for AvailAddress {} - -impl Display for AvailAddress { - fn fmt(&self, f: &mut Formatter) -> core::fmt::Result { - let hash = H256(self.0); - write!(f, "{hash}") - } -} - -impl AsRef<[u8]> for AvailAddress { - fn as_ref(&self) -> &[u8] { - self.0.as_ref() - } -} - -impl From<[u8; 32]> for AvailAddress { - fn from(value: [u8; 32]) -> Self { - Self(value) - } -} - -impl FromStr for AvailAddress { - type Err = ::Err; - - fn from_str(s: &str) -> Result { - let h_256 = H256::from_str(s)?; - - Ok(Self(h_256.to_fixed_bytes())) - } -} - -impl<'a> TryFrom<&'a [u8]> for AvailAddress { - type Error = anyhow::Error; - - fn try_from(value: &'a [u8]) -> Result { - Ok(Self(<[u8; 32]>::try_from(value)?)) - } -} diff --git a/crates/sovereign-sdk/adapters/avail/src/spec/block.rs b/crates/sovereign-sdk/adapters/avail/src/spec/block.rs deleted file mode 100644 index 8884f3360..000000000 --- a/crates/sovereign-sdk/adapters/avail/src/spec/block.rs +++ /dev/null @@ -1,40 +0,0 @@ -use serde::{Deserialize, Serialize}; -use sov_rollup_interface::da::BlockHeaderTrait; -use sov_rollup_interface::services::da::SlotData; - -use super::header::AvailHeader; -use super::transaction::AvailBlobTransaction; -use crate::verifier::ChainValidityCondition; - -#[derive(Serialize, Deserialize, PartialEq, Clone, Debug)] -pub struct AvailBlock { - pub header: AvailHeader, - pub transactions: Vec, -} - -impl SlotData for AvailBlock { - type BlockHeader = AvailHeader; - type Cond = ChainValidityCondition; - - fn hash(&self) -> [u8; 32] { - *self.header.hash().inner() - } - - fn header(&self) -> &Self::BlockHeader { - &self.header - } - - fn validity_condition(&self) -> ChainValidityCondition { - let mut txs_commitment: [u8; 32] = [0u8; 32]; - - for tx in &self.transactions { - txs_commitment = tx.combine_hash(txs_commitment); - } - - ChainValidityCondition { - prev_hash: *self.header().prev_hash().inner(), - block_hash: ::hash(self), - txs_commitment, - } - } -} diff --git a/crates/sovereign-sdk/adapters/avail/src/spec/hash.rs b/crates/sovereign-sdk/adapters/avail/src/spec/hash.rs deleted file mode 100644 index ad28c8fbd..000000000 --- a/crates/sovereign-sdk/adapters/avail/src/spec/hash.rs +++ /dev/null @@ -1,38 +0,0 @@ -use primitive_types::H256; -use serde::{Deserialize, Serialize}; -use sov_rollup_interface::da::BlockHashTrait; - -#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq, Hash)] -pub struct AvailHash(H256); - -impl AvailHash { - pub fn new(hash: H256) -> Self { - Self(hash) - } -} - -impl BlockHashTrait for AvailHash {} - -impl core::fmt::Display for AvailHash { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - write!(f, "0x{}", hex::encode(self.0)) - } -} - -impl AsRef<[u8]> for AvailHash { - fn as_ref(&self) -> &[u8] { - self.0.as_ref() - } -} - -impl From for [u8; 32] { - fn from(value: AvailHash) -> Self { - value.0.to_fixed_bytes() - } -} - -impl AvailHash { - pub fn inner(&self) -> &[u8; 32] { - self.0.as_fixed_bytes() - } -} diff --git a/crates/sovereign-sdk/adapters/avail/src/spec/header.rs b/crates/sovereign-sdk/adapters/avail/src/spec/header.rs deleted file mode 100644 index f1f845f4f..000000000 --- a/crates/sovereign-sdk/adapters/avail/src/spec/header.rs +++ /dev/null @@ -1,88 +0,0 @@ -#[cfg(feature = "native")] -use avail_subxt::primitives::Header as SubxtHeader; -use primitive_types::H256; -use serde::{Deserialize, Serialize}; -use sov_rollup_interface::da::BlockHeaderTrait; - -const KATE_START_TIME: i64 = 1686066440; -const KATE_SECONDS_PER_BLOCK: i64 = 20; - -#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] -#[serde(rename_all = "camelCase")] -pub struct Header { - pub parent_hash: H256, - pub number: u32, - pub state_root: H256, - pub extrinsics_root: H256, - pub data_root: H256, -} - -use super::hash::AvailHash; - -#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] -pub struct AvailHeader { - hash: AvailHash, - - pub header: Header, -} - -#[cfg(feature = "native")] -impl AvailHeader { - pub fn new(header: SubxtHeader, hash: H256) -> Self { - Self { - hash: AvailHash::new(hash), - header: Header { - parent_hash: header.parent_hash, - number: header.number, - state_root: header.state_root, - data_root: header.data_root(), - extrinsics_root: header.extrinsics_root, - }, - } - } -} - -impl BlockHeaderTrait for AvailHeader { - type Hash = AvailHash; - - fn prev_hash(&self) -> Self::Hash { - AvailHash::new(self.header.parent_hash) - } - - fn hash(&self) -> Self::Hash { - self.hash.clone() - } - - fn txs_commitment(&self) -> Self::Hash { - unimplemented!("txs_commitment") - } - - fn height(&self) -> u64 { - self.header.number as u64 - } - - fn time(&self) -> sov_rollup_interface::da::Time { - sov_rollup_interface::da::Time::from_secs( - KATE_START_TIME + (self.header.number as i64 * KATE_SECONDS_PER_BLOCK), - ) - } -} - -#[cfg(feature = "native")] -impl - From< - subxt::blocks::Block< - avail_subxt::AvailConfig, - subxt::OnlineClient, - >, - > for AvailHeader -{ - fn from( - block: subxt::blocks::Block< - avail_subxt::AvailConfig, - subxt::OnlineClient, - >, - ) -> Self { - AvailHeader::new(block.header().clone(), block.hash()) - } -} diff --git a/crates/sovereign-sdk/adapters/avail/src/spec/mod.rs b/crates/sovereign-sdk/adapters/avail/src/spec/mod.rs deleted file mode 100644 index c922e174c..000000000 --- a/crates/sovereign-sdk/adapters/avail/src/spec/mod.rs +++ /dev/null @@ -1,30 +0,0 @@ -use sov_rollup_interface::da::DaSpec; - -use crate::verifier::ChainValidityCondition; - -pub mod address; -pub mod block; -mod hash; -pub mod header; -pub mod transaction; - -#[derive(serde::Serialize, serde::Deserialize, PartialEq, Eq, Debug, Clone)] -pub struct DaLayerSpec; - -impl DaSpec for DaLayerSpec { - type SlotHash = hash::AvailHash; - - type BlockHeader = header::AvailHeader; - - type BlobTransaction = transaction::AvailBlobTransaction; - - type Address = address::AvailAddress; - - type ValidityCondition = ChainValidityCondition; - - type InclusionMultiProof = (); - - type CompletenessProof = (); - - type ChainParams = (); -} diff --git a/crates/sovereign-sdk/adapters/avail/src/spec/transaction.rs b/crates/sovereign-sdk/adapters/avail/src/spec/transaction.rs deleted file mode 100644 index b09662dbb..000000000 --- a/crates/sovereign-sdk/adapters/avail/src/spec/transaction.rs +++ /dev/null @@ -1,87 +0,0 @@ -#[cfg(feature = "native")] -use anyhow::anyhow; -#[cfg(feature = "native")] -use avail_subxt::{ - api::runtime_types::{da_control::pallet::Call, da_runtime::RuntimeCall::DataAvailability}, - primitives::AppUncheckedExtrinsic, -}; -use bytes::Bytes; -#[cfg(feature = "native")] -use codec::Encode; -use serde::{Deserialize, Serialize}; -use sov_rollup_interface::da::{BlobReaderTrait, CountedBufReader}; - -use super::address::AvailAddress; - -#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] - -pub struct AvailBlobTransaction { - blob: CountedBufReader, - hash: [u8; 32], - address: AvailAddress, -} - -impl BlobReaderTrait for AvailBlobTransaction { - type Address = AvailAddress; - - fn sender(&self) -> AvailAddress { - self.address.clone() - } - - fn hash(&self) -> [u8; 32] { - self.hash - } - - fn verified_data(&self) -> &[u8] { - self.blob.accumulator() - } - - #[cfg(feature = "native")] - fn advance(&mut self, num_bytes: usize) -> &[u8] { - self.blob.advance(num_bytes); - self.verified_data() - } - - fn total_len(&self) -> usize { - self.blob.total_len() - } -} - -impl AvailBlobTransaction { - #[cfg(feature = "native")] - pub fn new(unchecked_extrinsic: &AppUncheckedExtrinsic) -> anyhow::Result { - let address = match &unchecked_extrinsic.signature { - //TODO: Handle other types of MultiAddress. - Some((subxt::utils::MultiAddress::Id(id), _, _)) => AvailAddress::from(id.clone().0), - _ => { - return Err(anyhow!( - "Unsigned extrinsic being used to create AvailBlobTransaction." - )) - } - }; - let blob = match &unchecked_extrinsic.function { - DataAvailability(Call::submit_data { data }) => { - CountedBufReader::::new(Bytes::copy_from_slice(&data.0)) - } - _ => { - return Err(anyhow!( - "Invalid type of extrinsic being converted to AvailBlobTransaction." - )) - } - }; - - Ok(AvailBlobTransaction { - hash: sp_core_hashing::blake2_256(&unchecked_extrinsic.encode()), - address, - blob, - }) - } - - pub fn combine_hash(&self, hash: [u8; 32]) -> [u8; 32] { - let mut combined_hashes: Vec = Vec::with_capacity(64); - combined_hashes.extend_from_slice(hash.as_ref()); - combined_hashes.extend_from_slice(self.hash().as_ref()); - - sp_core_hashing::blake2_256(&combined_hashes) - } -} diff --git a/crates/sovereign-sdk/adapters/avail/src/verifier.rs b/crates/sovereign-sdk/adapters/avail/src/verifier.rs deleted file mode 100644 index f225b71ba..000000000 --- a/crates/sovereign-sdk/adapters/avail/src/verifier.rs +++ /dev/null @@ -1,82 +0,0 @@ -use borsh::{BorshDeserialize, BorshSerialize}; -use serde::{Deserialize, Serialize}; -use sov_rollup_interface::da::{BlockHeaderTrait, DaSpec, DaVerifier}; -use sov_rollup_interface::zk::ValidityCondition; -use thiserror::Error; - -use crate::spec::DaLayerSpec; - -#[derive(Error, Debug)] -pub enum ValidityConditionError { - #[error("conditions for validity can only be combined if the blocks are consecutive")] - BlocksNotConsecutive, -} - -#[derive( - Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Copy, BorshDeserialize, BorshSerialize, -)] -/// A validity condition expressing that a chain of DA layer blocks is contiguous and canonical -pub struct ChainValidityCondition { - pub prev_hash: [u8; 32], - pub block_hash: [u8; 32], - //Chained or batch txs commitment. - pub txs_commitment: [u8; 32], -} - -impl ValidityCondition for ChainValidityCondition { - type Error = ValidityConditionError; - - fn combine(&self, rhs: Self) -> Result { - let mut combined_hashes: Vec = Vec::with_capacity(64); - combined_hashes.extend_from_slice(self.txs_commitment.as_ref()); - combined_hashes.extend_from_slice(rhs.txs_commitment.as_ref()); - - let combined_root = sp_core_hashing::blake2_256(&combined_hashes); - - if self.block_hash != rhs.prev_hash { - return Err(ValidityConditionError::BlocksNotConsecutive); - } - - Ok(Self { - prev_hash: rhs.prev_hash, - block_hash: rhs.block_hash, - txs_commitment: combined_root, - }) - } -} - -pub struct Verifier; - -impl DaVerifier for Verifier { - type Spec = DaLayerSpec; - - type Error = ValidityConditionError; - - // Verify that the given list of blob transactions is complete and correct. - // NOTE: Function return unit since application client already verifies application data. - fn verify_relevant_tx_list( - &self, - block_header: &::BlockHeader, - txs: &[::BlobTransaction], - _inclusion_proof: ::InclusionMultiProof, - _completeness_proof: ::CompletenessProof, - ) -> Result<::ValidityCondition, Self::Error> { - let mut txs_commitment: [u8; 32] = [0u8; 32]; - - for tx in txs { - txs_commitment = tx.combine_hash(txs_commitment); - } - - let validity_condition = ChainValidityCondition { - prev_hash: *block_header.prev_hash().inner(), - block_hash: *block_header.hash().inner(), - txs_commitment, - }; - - Ok(validity_condition) - } - - fn new(_params: ::ChainParams) -> Self { - Verifier {} - } -} diff --git a/crates/sovereign-sdk/adapters/solana/Makefile b/crates/sovereign-sdk/adapters/solana/Makefile deleted file mode 100644 index 63571af64..000000000 --- a/crates/sovereign-sdk/adapters/solana/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -# Variables -TARGET_REPO=git@github.com:rpcpool/yellowstone-grpc.git -TAG=v1.9.0+solana.1.16.15 -TMP_DIR := $(shell mktemp -d) -REPO_DIR=$(TMP_DIR)/yellowstone-grpc -GEYSER_DIR=$(REPO_DIR)/yellowstone-grpc-geyser -DEST_DIR := $(PWD) -LIB_NAME=libyellowstone_grpc_geyser.dylib - -.PHONY: all clean - -all: $(DEST_DIR)/$(LIB_NAME) - -$(DEST_DIR)/$(LIB_NAME): $(REPO_DIR)/target/release/$(LIB_NAME) - cp $< $@ - -$(REPO_DIR)/target/release/$(LIB_NAME): $(GEYSER_DIR) - cd $(GEYSER_DIR) && cargo build --release - -$(GEYSER_DIR): $(TMP_DIR)/.cloned - cd $(REPO_DIR) && git checkout $(TAG) - touch $@ - -$(TMP_DIR)/.cloned: - git clone $(TARGET_REPO) $(REPO_DIR) - touch $@ - -clean: - rm -rf $(TMP_DIR) diff --git a/crates/sovereign-sdk/adapters/solana/README.md b/crates/sovereign-sdk/adapters/solana/README.md deleted file mode 100644 index cef5ca521..000000000 --- a/crates/sovereign-sdk/adapters/solana/README.md +++ /dev/null @@ -1,299 +0,0 @@ -### Solana DA -This folder contains -1. On chain program that enables using Solana as a minimal DA layer (solana/solana_da_programs) -2. Client to interact with the on-chain program (solana/da_client) - -## Installation -* `solana_da_programs` is an `anchor` workspace and requires `anchor` installed to make use of it. - * https://book.anchor-lang.com/getting_started/installation.html - * ensure that anchor is also installed with avm -* solana cli and solana-test-validator are both used for testing. - * https://docs.solana.com/cli/install-solana-cli-tools - -### Installation and Setup -* The on-chain program that handles the DA logic is located at `solana/solana_da_programs/programs/bockroot` -* A sequencer that wants to submit blobs for rollup first needs to create a `ChunkAccumulator` account on-chain - * This account is like "scratch space" for the sequencer. It keeps track of chunks as they arrive - * The account is a keypair account - * Solana has two kinds of accounts - * keypair accounts: these are keys where the public key is a point on the curve - * PDA: This is an address without a private key (since the point does not lie on the curve) - * Keypair accounts are associated with a private key, but they can also be owned by a program - * Only a program that owns an account can modify its contents - * The reason we use Keypair account for scratch space is because Keypair accounts have a size limit of 10MB whereas PDAs are restricted to 10KB -* As part of creating the `ChunkAccumulator` account, the instruction also includes a transfer of ownership to the `blockroot` program -* Once the account is created, the sequencer calls the `Initialize` with the account as Input. - * This initializes the account data with the base structures needed to track chunks. -* The keypair needs to be retained since all interactions with the `blockroot` program require two signatures - * `ChunkAccumulator` signature to prove ownership of the account. This is so that each sequencer can have its own "scratch space" and other sequencers cannot modify it using the program - * The transaction signer which pays the gas fees - -## Running the demo -### Setting up and starting a local solana validator -* Create a folder to hold your solana keys -```bash -$ mkdir ~/.solw -``` -* Generate a keypair -```bash -$ solana-keygen new -o ~/.solw/test.json -``` -* Set the keypair in the solana cli - * For now, do not set a passphrase for testing since it complicates the workflow a bit -``` -$ solana config set -k ~/.solw/test.json -``` -* Point the solana cli to local -```bash -$ solana config set -u l -``` -* Check solana config -``` -$ solana config get -Config File: /Users/dubbelosix/.config/solana/cli/config.yml -RPC URL: http://localhost:8899 -WebSocket URL: ws://localhost:8900/ (computed) -Keypair Path: ~/.solw/test.json -Commitment: confirmed -``` -* We also need to build the geyser plugin that streams account updates, so that a listener can calculate - * A merkle proof of rollup block existence - * A non inclusion merkle proof of a rollup block being absent -* Build the geyser plugin -```bash -cd sovereign/adapters/solana/ -make -``` -* Start the `solana-test-validator` with the plugin config -```bash -$ cd sovereign -$ solana-test-validator --geyser-plugin-config adapters/solana/config.json -Ledger location: test-ledger -Log: test-ledger/validator.log -⠴ Initializing... -⠉ 00:00:12 | Processed Slot: 25 | Confirmed Slot: 25 | Finalized Slot: 0 | Full Snapshot Slot: - | Incremental Snapshot Slot: - | -``` -* Check balance of primary account from config -```bash -$ solana balance -500000000 SOL -``` -* Leave this terminal running and in a new window, start the logs monitoring -```bash -$ solana logs -``` -* Some notes - * The `solana-test-validator` creates and uses a `test-ledger` folder in the current working directory. - * If killed and restarted, the `solana-test-validator` continues from where it left off. - * If the ledger needs to be wiped clean, then this folder can just be removed and the local dev chain will start with a fresh genesis. - * If the key needs to be changed and you need more local network sol, then you can switch the key using `solana config -k` and request sol using `solana airdrop` - -### The on-chain program -* Ensure anchor is installed by following the steps from the [Installation and Setup](#installation-and-setup) section -* Build and deploy the on-chain program -```bash -$ cd solana/solana_da_programs -$ anchor build --program-name blockroot -$ anchor deploy --program-name blockroot --provider.wallet ~/.solw/test.json -Deploying cluster: http://localhost:8899 -Upgrade authority: /Users/dubbelosix/.solw/test.json -Deploying program "blockroot"... -Program path: ~/sovereign/adapters/solana/solana_da_programs/target/deploy/blockroot.so... -Program Id: 6YQGvP866CHpLTdHwmLqj2Vh5q7T1GF4Kk9gS9MCta8E -``` -* Once the program is deployed, we need the Program ID from the output for the next steps `6YQGvP866CHpLTdHwmLqj2Vh5q7T1GF4Kk9gS9MCta8E` - -### The solana da client -* The client is written in rust (there are SDKs in typescript, python, go etc) -* Rust makes it easier since we can share structs, serde and functions directly between on-chain program and client -* The client actually makes use of a lot of the function from `solana_da_programs/programs/blockroot` -* Build and run the client -``` -$ cd solana/da_client -$ cargo run -- -h -Usage: da_client [OPTIONS] --signer --blockroot-program - -Commands: - chunk-account Manage the chunks account on chain. This is the scratch space for accumulating chunks on chain scoped to a sequencer - create-test-data Produce test data (Random bytes of desired size) - submit Submit chunks to the chain - verify - help Print this message or the help of the given subcommand(s) - -Options: - --signer - Path to the signer key - --blockroot-program - b58 encoded address for the on chain sovereign blockroot program - -r, --rpc-url - URL for solana RPC [default: http://localhost:8899] - -w, --ws-url - URL for solana Websocket [default: ws://localhost:8900] - -h, --help - Print help - -V, --version - Print version -``` -* We first want to create our chunk-account -```bash -da_client $ cargo run -- --signer ~/.solw/test.json --blockroot-program 6YQGvP866CHpLTdHwmLqj2Vh5q7T1GF4Kk9gS9MCta8E chunk-account create ~/.solw/chunk_account.json -``` - * `--blockroot-program` is the on-chainprogram that we deployed - * `--signer` is the key that can sign transactions and pay for account storage - * `~/.solw/chunk_account.json` is where we want the keypair chunk account to be created. Explanation of what the chunk account is used for is provided in the next section -* Create a test blob of 100kb (Very large sizes cause the solana program to run OOM. We need to test these limits and see if we can go higher) -```bash -$ cargo run -- --signer ~/.solw/test.json --blockroot-program 6YQGvP866CHpLTdHwmLqj2Vh5q7T1GF4Kk9gS9MCta8E create-test-data testblob 100000 -``` -* The above command should create a file called `testblob` in the current working directory -* We now need to submit blob (which represents a block of rollup transactions) to solana -```bash -da_client $ cargo run -- --signer ~/.solw/test.json --blockroot-program 6YQGvP866CHpLTdHwmLqj2Vh5q7T1GF4Kk9gS9MCta8E submit ~/.solw/chunk_account.json testblob -raw data file: testblob -digest: 50267856fe52ceb63b95b4bb70f203952bf18d1ac141b5d886dc9a6feb4d09b8 -number of chunk transactions: 131 -chunks digest for blob file at testblob is 50267856fe52ceb63b95b4bb70f203952bf18d1ac141b5d886dc9a6feb4d09b8 -Ok(5UWtJPavtr2NjRN1gxsxKrtrPoQNB9Jeq6CF3Ya8GFxeS7BHruscAjpYrHW8ALd3QAdEyDnXsnR4Wo5jEmfecepe) -Ok(67ZBFYjXiqYrVXqNqEByFjmvZVp67dzWuyJUJtqTkhNpask1mxPQGECCseBNEPu8MkXwCZJtF11v8HhhhapaXTPB) -Ok(2mentFby7BnW64NuM7EQBgfpsUmYU37iffwDq8vLj2xrCVxfNitUkK1iL73rWN2UwJ8bqR1HNBBorThqWctShbdf) -Ok(2GX1fTkufWZJVn88TiMbBEkn46NAc8acqguVAbVMhowZiJEZvNppJVWi2opC4xVoT31pcqhiaCKSjS51bNwF8AyW) -. -. -. -Ok(44CoVzXpXyYKS8ucjsebuaRjwpf6bvuEzEPpaXNY85LUbT62kLc58Z21TJ6ceLfE2XU9GJevEw5k4okMaRGd1rTV) -``` -* Simultaneously, you can see the chunk accumulation working on the terminal that's running `solana logs` -```bash -Transaction executed in slot 9290: - Signature: 3bgUwqNPvKCG3yz5AXCAVhg9TbBBJqtbzsurJUXRzDLb4UMGT7d3T2pgC1kBQyT1dFmVbXfVT22dn8Uv3vJUPidZ - Status: Ok - Log Messages: - Program 6YQGvP866CHpLTdHwmLqj2Vh5q7T1GF4Kk9gS9MCta8E invoke [1] - Program log: Instruction: ProcessChunk - Program log: false - Program 6YQGvP866CHpLTdHwmLqj2Vh5q7T1GF4Kk9gS9MCta8E consumed 60998 of 200000 compute units - Program 6YQGvP866CHpLTdHwmLqj2Vh5q7T1GF4Kk9gS9MCta8E success -Transaction executed in slot 9291: - Signature: 2coXd479bV8H1fWhq43WYr9Ay1K1aezHhHL4h9hfNSjuxLW8F6Y6kJPF1kNBDJfKkKo2jQ4eVhwEJGVoH3jk9X1X - Status: Ok - Log Messages: - Program 6YQGvP866CHpLTdHwmLqj2Vh5q7T1GF4Kk9gS9MCta8E invoke [1] - Program log: Instruction: ProcessChunk - Program log: false - Program 6YQGvP866CHpLTdHwmLqj2Vh5q7T1GF4Kk9gS9MCta8E consumed 60876 of 200000 compute units - Program 6YQGvP866CHpLTdHwmLqj2Vh5q7T1GF4Kk9gS9MCta8E success -``` -* The important lines are under `Log Messages` -```bash - Program 6YQGvP866CHpLTdHwmLqj2Vh5q7T1GF4Kk9gS9MCta8E invoke [1] - Program log: Instruction: ProcessChunk - Program log: false -``` -* The "false" indicates that the data hasn't been completely accumulated yet. Once the last chunk transaction is submitted, we should see -```bash - Program log: Instruction: ProcessChunk - Program log: true - Program log: accumulation blob with digest: [80, 38, 120, 86, 254, 82, 206, 182, 59, 149, 180, 187, 112, 242, 3, 149, 43, 241, 141, 26, 193, 65, 181, 216, 134, 220, 154, 111, 235, 77, 9, 184] has completed with root [80, 38, 120, 86, 254, 82, 206, 182, 59, 149, 180, 187, 112, 242, 3, 149, 43, 241, 141, 26, 193, 65, 181, 216, 134, 220, 154, 111, 235, 77, 9, 184] - Program log: blocks root for slot 9431, blob root: [80, 38, 120, 86, 254, 82, 206, 182, 59, 149, 180, 187, 112, 242, 3, 149, 43, 241, 141, 26, 193, 65, 181, 216, 134, 220, 154, 111, 235, 77, 9, 184] combined root: [80, 38, 120, 86, 254, 82, 206, 182, 59, 149, 180, 187, 112, 242, 3, 149, 43, 241, 141, 26, 193, 65, 181, 216, 134, 220, 154, 111, 235, 77, 9, 184] -``` -* The `true` indicates that accumulation as completed and the merkle root for the chunks is also logged as having been written to another account - -### Explanation of the Process -* A rollup blob is a sequence of bytes `&[u8]` -* The blob is broken down into chunks using the `get_chunks` function -```rust -pub struct Chunk { - pub digest: [u8; 32], - pub num_chunks: u64, - pub chunk_num: u64, - pub actual_size: u64, - pub chunk_body: Vec, -} -``` - * The actual data of the blob is part of `chunk_body` - * The remaining fields are metadata - * `digest`: This is a unique identifier for the blob and serves to indicate which blob a specific chunk belongs to. This can be any unique identifier, but for convenience, it's currently the merkle root of all the chunks - * `num_chunks`: Number of chunks that constitute the blob - * `chunk_num`: The position in the sequence of chunks that form blob with `digest`. Used to order the chunks in order to reconstruct the blob - * `actual_size`: The chunks are equal sized, so the final chunk has padding. `actual_size` is used to enable stripping out padding during reconstruction. - * We can do away with padding if we find that it's un-necessary. -* The `blockroot` program contains 3 instructions - * Initialize - used to initialize the accounts - * Clear - Used to clear the `ChunkAccumulator` account of any incomplete blobs. - * This is only necessary if there are incomplete chunks - * Ultimately, management of the "scratch space" is up to the sequencers, and they can make decisions around size, cleanup etc - * ProcessChunk - logic to keep track of the chunks as they arrive and calculate the merkle root of the chunks -* Each Chunk is formatted into a transaction for the `ProcessChunk` instruction. -* `ProcessChunk` works with 2 main accounts - * `ChunkAccumulator` account - this account is owned by the sequencer, has a keypair and can only be modified by the `blockroot` program since it's the owner of the account - * `BlocksRoot` account - this is a PDA (program derived address) account that is unique to the entire program -* When the `ProcessChunk` instruction first sees a new `digest` indicating a new blob, it extracts the necessary metadata from the chunk and allocates space for a merkle tree capable of handling `num_chunks` number of leaves in the `ChunkAccumulator` account -* The new merkle tree has empty slots and `Chunk`s are inserted into the right positions as they arrive -* The `ProcessChunk` instruction also bubbles up the hashes towards the root as the chunks arrive - * This has the benefit of spreading compute among multiple transactions - * Each transaction performs a fraction of work in calculating the merkle root - * The specific logic for merkelization can be seen in the `accumulate` function in [lib.rs](solana_da_programs/programs/blockroot/src/lib.rs) - * The code also makes use of the `hashv` syscall. - * For odd numbered levels, the un-paired leaves are promoted to the next level. (This logic needs to be audited since its custom) -``` - Root - | - +-----+----------+ - | | - Parent1 Parent2 [X] - | | - +--+--+ +-----+------+ - | | | | -Chunk1 Chunk2 Chunk3 Chunk4 - [ ] [ ] [X] [X] - -``` - * The above diagram illustrates what the `ChunkAccumulator` might look like at a point in time when `Chunk3` and `Chunk4` have arrived - * `Chunk3` arrives first and everything else in the tree is empty. - * `Parent2` is calculated once `Chunk4` arrives - * `Chunk1`, `Chunk2`, `Parent1` and `Root` are still incomplete -* Chunks can arrive in any order since they get inserted into the right slots of the tree in the `ChunkAccumulator` account's on-chain space -* Once the final chunk arrives and the merkle root is available, the root is "accumulated" into the `BlocksRoot` PDA account - * This accumulation takes the form of a hashlist (since we don't really need merkelization here) - * The `BlocksRoot` account also keeps track of the current slot number - * If multiple chunks arrive and finish multiple blobs in a single slot, then all their merkle roots will be written into the blocksroot account - * As an example, assume 4 final chunks arrive and 4 merkle roots are available (M1, M2, M3, M4) at slot 4200 - * The first merkle root to finish, M1, observes that the slot number is < 4200, so it's the first root. - * The digest is set to M1 and slot_number is changed to 4200 (digest = M1) - * The second merkle root, M2 observes that the slot_number in the account is equal to the current slot number, so its not the first blob to finish - * Therefore, it accumulates itself into the digest (digest = hashv(digest|M2)) which is just hashv(M1|M2) - * By the time the final root is accumulated the Digest would be hashv(hashv(hashv(M1|M2)|M3)|M4) -* A solana Bank Hash stores the account delta hash in each block. Since 4 blob roots were accumulated in slot 4200, this means that the account value for `BlocksRoot` changed, so it's hash would be part of the Bank Hash -* The Solana Bank hash providing a commitment to the value of `BlocksRoot` account is ultimately what enables DA -* The accounts delta root is also calculated by sorting the leaves, which means we can also prove non-inclusion - * Showing that the `BlocksRoot` PDA doesn't exist between two adjacent leaves tells us that there are no rollup blobs in a specific Solana block - -### Block Processor -* Run the block processor binary, which streams geyser updates from the `solana-test-validator` -```bash -cd sovereign/adapters/solana/da_client -cargo run --bin account_delta_processor -``` -* The above should print a stream of slots, modified accounts and their hashes -``` -slot:30638, pubkey:"SysvarS1otHashes111111111111111111111111111", hash:"E4NFvB38MnE5LPPPcQB5LUfoMGMhKDMiZs4mQzJ8qCcG" -slot:30638, pubkey:"SysvarC1ock11111111111111111111111111111111", hash:"EUgR9BNdKjrnwZTMqwJ2CD3fdTkRn82axLAeCokx7NK5" -slot:30638, pubkey:"5Pmg4aiLg3WYzns5FCpbs5bxxNRzdb6YwKJemykPbZBD", hash:"G8LNAUrjhdGhX5npczHJT8j2hR5qTvvKnKnvZS4jesgD" -slot:30638, pubkey:"SysvarRecentB1ockHashes11111111111111111111", hash:"2d3xmQ1ueKR3Jk2cQsN9uEFsMfjDZmohHESpHz3MBfiC" -slot:30638, pubkey:"5MgKRwYGsa9S7Shtch7UAjXhzGUaze5u2dx1NuP4oskH", hash:"txi5QmUUCbXMkcD5CPTpyin3X4Ky1gvRKGyzJpc2UB5" -slot:30638, pubkey:"SysvarS1otHistory11111111111111111111111111", hash:"GSGN4DcEBN49rFaMLDCTmMkXuh1yKfT4z9R4mZJHFD34" -slot:30639, pubkey:"SysvarS1otHashes111111111111111111111111111", hash:"Dmc2WP9psnKG476ahjwTHgnFaimpXNSkJQcTG7zoYTXQ" -slot:30639, pubkey:"SysvarC1ock11111111111111111111111111111111", hash:"GZev34FK7jn5X7Du3joegLb4YuKxaMAByy7JcVXzj3w3" -slot:30639, pubkey:"5Pmg4aiLg3WYzns5FCpbs5bxxNRzdb6YwKJemykPbZBD", hash:"2rLWZfTBhpiHWmg8n3w737By9Bcvs6N4zbRKZZaN2KDB" -slot:30639, pubkey:"SysvarRecentB1ockHashes11111111111111111111", hash:"C5gqC6mZdDH3Lr33GLusDstSqX4ftTbWd34nTrgBppnh" -slot:30639, pubkey:"5MgKRwYGsa9S7Shtch7UAjXhzGUaze5u2dx1NuP4oskH", hash:"AYVKX9n4Gs9zRLpW4Nsu5o68k7ijE2VitDLT2HAwi8jz" -``` - -### TBD -* The logic to fetch the bank hash and verify availability still needs to be written into the da_client -* Test cases for merkelization - -### Notes -* Since `ChunkAccumulator` is unique to each sequencer, multiple sequencers can do this simultaneously -* A single sequencer can also have a pool of accounts that it uses for this purpose -* The sol paid for rent exemption (approximate 69 sol for 10MB of on-chain space) can be reclaimed by closing down the account if needed diff --git a/crates/sovereign-sdk/adapters/solana/config.json b/crates/sovereign-sdk/adapters/solana/config.json deleted file mode 100644 index 346887cc5..000000000 --- a/crates/sovereign-sdk/adapters/solana/config.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "libpath": "./libyellowstone_grpc_geyser.dylib", - "grpc": { - "address": "0.0.0.0:10000", - "channel_capacity": "100_000", - "unary_concurrency_limit": 100, - "unary_disabled": false - } -} diff --git a/crates/sovereign-sdk/adapters/solana/da_client/Cargo.toml b/crates/sovereign-sdk/adapters/solana/da_client/Cargo.toml deleted file mode 100644 index ba51fdcfa..000000000 --- a/crates/sovereign-sdk/adapters/solana/da_client/Cargo.toml +++ /dev/null @@ -1,31 +0,0 @@ -[package] -name = "da_client" -version = "0.4.0-rc.3" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -anchor-lang = "0.28.0" -anchor-client = "0.28.0" -solana-sdk = "1.16" -bs58 = "0.5.0" -clap = { workspace = true } -blockroot = { path = "../solana_da_programs/programs/blockroot", features = [ - "no-entrypoint", -] } -solana-runtime = "1.16" -solana-rpc-client = "1.16" -anyhow = "1.0.75" -rand = "0.8.5" -hex = "0.4.3" -blake3 = "1.3.3" -futures = "0.3.24" -env_logger = "0.10.0" -backoff = { version = "0.4.0", features = ["tokio"] } -tokio = { version = "1.32.0", features = ["rt-multi-thread", "macros", "time"] } -log = { version = "0.4.14", features = ["std"] } -yellowstone-grpc-proto = { git = "https://github.com/rpcpool/yellowstone-grpc.git", package = "yellowstone-grpc-proto", rev = "v1.9.0+solana.1.16.15" } -yellowstone-grpc-client = { git = "https://github.com/rpcpool/yellowstone-grpc.git", package = "yellowstone-grpc-client", rev = "v1.9.0+solana.1.16.15" } - -[workspace] diff --git a/crates/sovereign-sdk/adapters/solana/da_client/src/bin/account_delta_processor.rs b/crates/sovereign-sdk/adapters/solana/da_client/src/bin/account_delta_processor.rs deleted file mode 100644 index b65aa595c..000000000 --- a/crates/sovereign-sdk/adapters/solana/da_client/src/bin/account_delta_processor.rs +++ /dev/null @@ -1,158 +0,0 @@ -// ---------------------------------------------------------------------------- -// This file includes code adapted from the "yellowstone-grpc" project's example client: -// https://github.com/rpcpool/yellowstone-grpc/blob/master/examples/rust/src/bin/client.rs -// -// Credit to the original authors and contributors of the "yellowstone-grpc" project for their work. -// ---------------------------------------------------------------------------- - -use std::collections::HashMap; -use std::time::Duration; - -use backoff::future::retry; -use backoff::ExponentialBackoff; -use clap::Parser; -use da_client::hash_solana_account; -use futures::future::TryFutureExt; -use futures::sink::SinkExt; -use futures::stream::StreamExt; -use log::{error, info}; -use yellowstone_grpc_client::{GeyserGrpcClient, GeyserGrpcClientError}; -use yellowstone_grpc_proto::prelude::subscribe_update::UpdateOneof; -use yellowstone_grpc_proto::prelude::{ - SubscribeRequest, SubscribeRequestFilterAccounts, SubscribeRequestFilterBlocks, - SubscribeRequestFilterBlocksMeta, SubscribeRequestFilterEntry, SubscribeRequestFilterSlots, - SubscribeRequestFilterTransactions, SubscribeUpdateAccount, -}; - -type SlotsFilterMap = HashMap; -type AccountFilterMap = HashMap; -type TransactionsFilterMap = HashMap; -type EntryFilterMap = HashMap; -type BlocksFilterMap = HashMap; -type BlocksMetaFilterMap = HashMap; - -const DEFAULT_GRPC_URL: &str = "http://127.0.0.1:10000"; - -#[derive(Parser)] -#[command(author, version, about, long_about = None)] -struct Cli { - #[arg(short, long, default_value_t=DEFAULT_GRPC_URL.to_string())] - /// URL for solana RPC - grpc_url: String, -} - -fn get_subscribe_request() -> SubscribeRequest { - let mut accounts: AccountFilterMap = HashMap::new(); - let slots: SlotsFilterMap = HashMap::new(); - let transactions: TransactionsFilterMap = HashMap::new(); - let entry: EntryFilterMap = HashMap::new(); - let blocks: BlocksFilterMap = HashMap::new(); - let blocks_meta: BlocksMetaFilterMap = HashMap::new(); - let accounts_data_slice = Vec::new(); - - accounts.insert( - "client".to_owned(), - SubscribeRequestFilterAccounts { - account: vec![], - owner: vec![], - filters: vec![], - }, - ); - SubscribeRequest { - slots, - accounts, - transactions, - entry, - blocks, - blocks_meta, - commitment: Some(1), - accounts_data_slice, - } -} - -fn print_account(sub_account: SubscribeUpdateAccount) { - let slot_num = sub_account.slot; - let account = sub_account.account.unwrap(); - let pub_key = account.pubkey.clone(); - let account_hash = hash_solana_account( - account.lamports, - &account.owner, - account.executable, - account.rent_epoch, - &account.data, - &pub_key, - ); - println!( - "slot:{:?}, pubkey:{:?}, hash:{:?}", - slot_num, - bs58::encode(pub_key).into_string(), - bs58::encode(account_hash).into_string() - ); -} - -#[tokio::main] -async fn main() -> anyhow::Result<()> { - env_logger::init(); - info!("Starting"); - - let cli = Cli::parse(); - // optional overrides - let grpc_url = &cli.grpc_url; - let mut maybe_first_attempt = Some(()); - - retry(ExponentialBackoff::default(), move || { - async move { - if maybe_first_attempt.take().is_none() { - info!("Retry to connect to the server"); - } - let mut client = GeyserGrpcClient::connect_with_timeout( - grpc_url.to_string(), - Option::::None, - None, - Some(Duration::from_secs(10)), - Some(Duration::from_secs(10)), - false, - ) - .await - .map_err(|e| backoff::Error::transient(anyhow::Error::new(e)))?; - - let (mut subscribe_tx, mut stream) = client - .subscribe() - .await - .map_err(|e| backoff::Error::Permanent(anyhow::Error::from(e)))?; - - subscribe_tx - .send(get_subscribe_request()) - .await - .map_err(|e| { - backoff::Error::Permanent(anyhow::Error::from( - GeyserGrpcClientError::SubscribeSendError(e), - )) - })?; - - while let Some(message) = stream.next().await { - match message { - Ok(msg) => - { - #[allow(clippy::single_match)] - match msg.update_oneof { - Some(UpdateOneof::Account(account)) => { - print_account(account); - continue; - } - _ => {} - } - } - Err(error) => { - error!("error: {error:?}"); - break; - } - } - } - Ok::<(), backoff::Error>(()) - } - .inspect_err(|error| error!("failed to connect: {error}")) - }) - .await - .map_err(Into::into) -} diff --git a/crates/sovereign-sdk/adapters/solana/da_client/src/lib.rs b/crates/sovereign-sdk/adapters/solana/da_client/src/lib.rs deleted file mode 100644 index 44473659c..000000000 --- a/crates/sovereign-sdk/adapters/solana/da_client/src/lib.rs +++ /dev/null @@ -1,64 +0,0 @@ -use std::fs::File; -use std::io::{Read, Write}; -use std::path::Path; - -use blake3::traits::digest::Digest; -use solana_runtime::accounts_hash::AccountsHasher; -use solana_sdk::hash::Hash; -use solana_sdk::pubkey::Pubkey; - -/// Util helper function to write `size` number of random bytes to file at path `P` -pub fn write_random_bytes>(path: P, size: u64) -> std::io::Result<()> { - let mut file = File::create(path)?; - - let random_bytes: Vec = (0..size).map(|_| rand::random::()).collect(); - - file.write_all(&random_bytes) -} - -/// Util helper function to read file at path `P` as bytes -pub fn read_file_to_vec>(path: P) -> std::io::Result> { - let mut file = File::open(path)?; - let mut buffer = Vec::new(); - - file.read_to_end(&mut buffer)?; - - Ok(buffer) -} - -/// Util helper function to calculate the hash of a solana account -/// https://github.com/solana-labs/solana/blob/v1.16.15/runtime/src/accounts_db.rs#L6076-L6118 -/// We can see as we make the code more resilient to see if we can also make -/// the structures match and use the function from solana-sdk, but currently it seems a bit more -/// complicated and lower priority, since getting a stable version working is top priority -pub fn hash_solana_account( - lamports: u64, - owner: &[u8], - executable: bool, - rent_epoch: u64, - data: &[u8], - pubkey: &[u8], -) -> [u8; 32] { - if lamports == 0 { - return [08; 32]; - } - let mut hasher = blake3::Hasher::new(); - - hasher.update(&lamports.to_le_bytes()); - hasher.update(&rent_epoch.to_le_bytes()); - hasher.update(data); - - if executable { - hasher.update(&[1u8; 1]); - } else { - hasher.update(&[0u8; 1]); - } - hasher.update(owner.as_ref()); - hasher.update(pubkey.as_ref()); - - hasher.finalize().into() -} - -pub fn calculate_root(pubkey_hash_vec: Vec<(Pubkey, Hash)>) -> Hash { - AccountsHasher::accumulate_account_hashes(pubkey_hash_vec) -} diff --git a/crates/sovereign-sdk/adapters/solana/da_client/src/main.rs b/crates/sovereign-sdk/adapters/solana/da_client/src/main.rs deleted file mode 100644 index 65416e9a6..000000000 --- a/crates/sovereign-sdk/adapters/solana/da_client/src/main.rs +++ /dev/null @@ -1,314 +0,0 @@ -use alloc::rc::Rc; -use std::path::Path; -use std::process; -use std::str::FromStr; - -use anchor_client::{Client, Cluster}; -use anchor_lang::solana_program::sysvar::clock::Clock; -use blockroot::da::{get_chunks, Chunk, ChunkAccumulator, CHUNK_SIZE, PREFIX}; -use blockroot::{accounts as blockroot_accounts, instruction as blockroot_instruction}; -use clap::{Parser, Subcommand}; -use solana_rpc_client::rpc_client::RpcClient; -use solana_sdk::commitment_config::{CommitmentConfig, CommitmentLevel}; -use solana_sdk::pubkey::Pubkey; -use solana_sdk::signature::{EncodableKey, Keypair, Signature, Signer}; -use solana_sdk::signer::keypair::read_keypair_file; -use solana_sdk::sysvar::SysvarId; -use solana_sdk::transaction::Transaction; -use solana_sdk::{system_instruction, system_program}; -extern crate alloc; - -use da_client::{read_file_to_vec, write_random_bytes}; - -const DEFAULT_RPC_URL: &str = "http://localhost:8899"; -const DEFAULT_WS_URL: &str = "ws://localhost:8900"; - -pub struct DaClient { - pub rpc_url: String, - pub ws_url: String, - pub signer: Keypair, - pub blockroot_program: Pubkey, - pub blockroot_pda: (Pubkey, u8), - pub clock_account: Pubkey, - pub system_program: Pubkey, -} - -impl DaClient { - pub fn new(rpc_url: String, ws_url: String, signer: Keypair, blockroot_program: &str) -> Self { - let blockroot_program_pubkey = Pubkey::from_str(blockroot_program).unwrap(); - let (blockroot_pda, bump) = - Pubkey::find_program_address(&[PREFIX.as_bytes()], &blockroot_program_pubkey); - - DaClient { - rpc_url, - ws_url, - signer, - blockroot_program: Pubkey::from_str(blockroot_program).unwrap(), - blockroot_pda: (blockroot_pda, bump), - clock_account: Clock::id(), - system_program: system_program::id(), - } - } - - pub fn create_account(&self, chunks_account: &str, size: u64) -> anyhow::Result { - let client = RpcClient::new(&self.rpc_url); - let new_account = Keypair::new(); - new_account.write_to_file(chunks_account).unwrap(); - - let rent = client.get_minimum_balance_for_rent_exemption(size.try_into()?)?; - let instr = system_instruction::create_account( - &self.signer.pubkey(), - &new_account.pubkey(), - rent, - size, - &self.blockroot_program, - ); - - let blockhash = client.get_latest_blockhash()?; - let tx = Transaction::new_signed_with_payer( - &[instr], - Some(&self.signer.pubkey()), - &[&self.signer, &new_account], - blockhash, - ); - client.send_and_confirm_transaction(&tx)?; - Ok(new_account) - } - - pub fn initialize_account(&self, chunks_keypair: &Keypair) -> anyhow::Result { - let c = Client::new( - Cluster::Custom(self.rpc_url.clone(), self.ws_url.clone()), - Rc::new(self.signer.insecure_clone()), - ); - let prog = c.program(self.blockroot_program).unwrap(); - - let signature = prog - .request() - .accounts(blockroot_accounts::Initialize { - creator: self.signer.pubkey(), - chunk_accumulator: chunks_keypair.pubkey(), - system_program: self.system_program, - }) - .args(blockroot_instruction::Initialize {}) - .signer(chunks_keypair) - .send()?; - Ok(signature) - } - - pub fn create_large_account(&self, chunks_account: &str, size: u64) -> anyhow::Result { - let chunks_keypair = self.create_account(chunks_account, size)?; - let signature = self.initialize_account(&chunks_keypair); - println!("{:?}", signature); - Ok(chunks_keypair) - } - - pub fn send_chunk_transaction( - &self, - chunks_keypair: &Keypair, - chunk: Chunk, - ) -> anyhow::Result { - let creator_pubkey = self.signer.pubkey(); - let c = Client::new( - Cluster::Custom(self.rpc_url.clone(), self.ws_url.clone()), - Rc::new(self.signer.insecure_clone()), - ); - let prog = c.program(self.blockroot_program).unwrap(); - - let signature = prog - .request() - .accounts(blockroot_accounts::ProcessChunk { - creator: creator_pubkey, - chunk_accumulator: chunks_keypair.pubkey(), - clock: self.clock_account, - blocks_root: self.blockroot_pda.0, - system_program: self.system_program, - }) - .args(blockroot_instruction::ProcessChunk { - bump: self.blockroot_pda.1, - chunk, - }) - .options(CommitmentConfig { - commitment: CommitmentLevel::Processed, - }) - .signer(chunks_keypair) - .send()?; - Ok(signature) - } - - pub fn wipe_account(&self, chunks_keypair: &Keypair) -> anyhow::Result { - let creator_pubkey = self.signer.pubkey(); - let c = Client::new( - Cluster::Custom(self.rpc_url.clone(), self.ws_url.clone()), - Rc::new(self.signer.insecure_clone()), - ); - let prog = c.program(self.blockroot_program).unwrap(); - - let signature = prog - .request() - .accounts(blockroot_accounts::Clear { - creator: creator_pubkey, - chunk_accumulator: chunks_keypair.pubkey(), - system_program: self.system_program, - }) - .args(blockroot_instruction::Clear { digest: None }) - .signer(chunks_keypair) - .send()?; - Ok(signature) - } -} - -fn _accumulate_chunks_get_root(chunks: Vec) -> Option<[u8; 32]> { - let raw_data_digest = chunks[0].digest; - let mut ca = ChunkAccumulator::new(); - for c in chunks { - ca.accumulate(c); - } - ca.get_merkle_root(&raw_data_digest) -} - -#[derive(Parser)] -#[command(author, version, about, long_about = None)] -struct Cli { - #[arg(long, required = true)] - /// Path to the signer key - signer: String, - - #[arg(long, required = true)] - /// b58 encoded address for the on chain sovereign blockroot program - blockroot_program: String, - - #[command(subcommand)] - command: Commands, - - #[arg(short, long, default_value_t=DEFAULT_RPC_URL.to_string())] - /// URL for solana RPC - rpc_url: String, - - #[arg(short, long, default_value_t=DEFAULT_WS_URL.to_string())] - /// URL for solana Websocket - ws_url: String, -} - -#[derive(Subcommand)] -enum Commands { - #[command(subcommand)] - /// Manage the chunks account on chain. - /// This is the scratch space for accumulating chunks on chain scoped to a sequencer - ChunkAccount(ChunkAccountArgs), - /// Produce test data (Random bytes of desired size) - CreateTestData { - test_blob_path: String, - size: u64, - }, - /// Submit chunks to the chain - Submit { - chunk_account_path: String, - blob_path: String, - }, - Verify, -} - -#[derive(Subcommand)] -enum ChunkAccountArgs { - Create { - path: String, - #[arg(short, long, default_value_t = 10000000)] - size: u64, - #[arg(short, long, default_value_t = false)] - force: bool, - #[arg(short, long, default_value_t = false)] - use_existing: bool, - }, - Clear { - path: String, - }, - Info { - path: String, - }, -} - -fn main() { - let cli = Cli::parse(); - - // required parameters - let signer = cli.signer; - let blockroot_program = &cli.blockroot_program; - - // optional overrides - let rpc_url = cli.rpc_url; - let ws_url = cli.ws_url; - - let signer_keypair = read_keypair_file(signer).unwrap(); - - let da_client = DaClient::new(rpc_url, ws_url, signer_keypair, blockroot_program); - - // Cli parsing - match &cli.command { - Commands::Verify => { - // TODO: we want to be able get the block data and the root from validator - // and verify that the data provided matches what was published on-chain - unimplemented!() - } - Commands::ChunkAccount(chunk_args) => match chunk_args { - ChunkAccountArgs::Create { - path, - size, - force, - use_existing, - } => { - if Path::new(path).exists() { - if *force { - println!("Over-writing existing keypair at {} ", path); - da_client.create_large_account(&path, *size).unwrap(); - } else { - if *use_existing { - println!("Attempting to re-use existing keypair at {} ", path); - let chunks_keypair = read_keypair_file(path).unwrap(); - let signature = da_client.initialize_account(&chunks_keypair).unwrap(); - println!("{}", signature); - } - println!("Chunk account keypair already exists. Use \ - --force to create a new keypair and override existing one, or \ - --use_existing to use the existing file, fund it and transfer ownership to blockroot program"); - process::exit(1); - } - } else { - da_client.create_large_account(&path, *size).unwrap(); - } - } - ChunkAccountArgs::Clear { path } => { - let chunks_keypair = read_keypair_file(path).unwrap(); - da_client.wipe_account(&chunks_keypair).unwrap(); - } - ChunkAccountArgs::Info { path: _path } => { - unimplemented!() - } - }, - Commands::CreateTestData { - test_blob_path, - size, - } => { - write_random_bytes(test_blob_path, *size).unwrap(); - } - Commands::Submit { - chunk_account_path, - blob_path, - } => { - let chunks_keypair = read_keypair_file(chunk_account_path).unwrap(); - let contents = read_file_to_vec(blob_path).expect("Failed to read from the file"); - let chunk_list = get_chunks(&contents, CHUNK_SIZE); - println!("raw data file: {}", blob_path); - println!("digest: {}", hex::encode(chunk_list[0].digest)); - println!("number of chunk transactions: {}", chunk_list[0].num_chunks); - println!( - "chunks digest for blob file at {} is {} ", - blob_path, - hex::encode(chunk_list[0].digest) - ); - for c in chunk_list { - let sig = da_client.send_chunk_transaction(&chunks_keypair, c); - println!("{:?}", sig); - } - } - } -} diff --git a/crates/sovereign-sdk/adapters/solana/solana_da_programs/.gitignore b/crates/sovereign-sdk/adapters/solana/solana_da_programs/.gitignore deleted file mode 100644 index 8d401163f..000000000 --- a/crates/sovereign-sdk/adapters/solana/solana_da_programs/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ - -.anchor -.DS_Store -target -**/*.rs.bk -node_modules -test-ledger -.yarn diff --git a/crates/sovereign-sdk/adapters/solana/solana_da_programs/.prettierignore b/crates/sovereign-sdk/adapters/solana/solana_da_programs/.prettierignore deleted file mode 100644 index c1a0b75f0..000000000 --- a/crates/sovereign-sdk/adapters/solana/solana_da_programs/.prettierignore +++ /dev/null @@ -1,8 +0,0 @@ - -.anchor -.DS_Store -target -node_modules -dist -build -test-ledger diff --git a/crates/sovereign-sdk/adapters/solana/solana_da_programs/Anchor.toml b/crates/sovereign-sdk/adapters/solana/solana_da_programs/Anchor.toml deleted file mode 100644 index 14d69ba61..000000000 --- a/crates/sovereign-sdk/adapters/solana/solana_da_programs/Anchor.toml +++ /dev/null @@ -1,17 +0,0 @@ -[features] -seeds = false -skip-lint = false -[programs.localnet] -blob_chunks = "5dEVwohfk3ciDudFS7mXi35ET2e5nrQMnuWbis1J5PJ7" -blockroot = "6YQGvP866CHpLTdHwmLqj2Vh5q7T1GF4Kk9gS9MCta8E" -solana_da_programs = "FYTJ57g8BhUwVK5Y3d2KbBeHHe1hLrA5NckBbENssK3U" - -[registry] -url = "https://api.apr.dev" - -[provider] -cluster = "Localnet" -wallet = "/Users/dubbelosix/.config/solana/id.json" - -[scripts] -test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" diff --git a/crates/sovereign-sdk/adapters/solana/solana_da_programs/Cargo.lock b/crates/sovereign-sdk/adapters/solana/solana_da_programs/Cargo.lock deleted file mode 100644 index c5cfb701f..000000000 --- a/crates/sovereign-sdk/adapters/solana/solana_da_programs/Cargo.lock +++ /dev/null @@ -1,1744 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "ahash" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" -dependencies = [ - "getrandom 0.2.10", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" -dependencies = [ - "cfg-if", - "getrandom 0.2.10", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" -dependencies = [ - "memchr", -] - -[[package]] -name = "anchor-attribute-access-control" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa5be5b72abea167f87c868379ba3c2be356bfca9e6f474fd055fa0f7eeb4f2" -dependencies = [ - "anchor-syn", - "anyhow", - "proc-macro2", - "quote", - "regex", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-account" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f468970344c7c9f9d03b4da854fd7c54f21305059f53789d0045c1dd803f0018" -dependencies = [ - "anchor-syn", - "anyhow", - "bs58 0.5.0", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-constant" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59948e7f9ef8144c2aefb3f32a40c5fce2798baeec765ba038389e82301017ef" -dependencies = [ - "anchor-syn", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-error" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc753c9d1c7981cb8948cf7e162fb0f64558999c0413058e2d43df1df5448086" -dependencies = [ - "anchor-syn", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-event" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38b4e172ba1b52078f53fdc9f11e3dc0668ad27997838a0aad2d148afac8c97" -dependencies = [ - "anchor-syn", - "anyhow", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-program" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eebd21543606ab61e2d83d9da37d24d3886a49f390f9c43a1964735e8c0f0d5" -dependencies = [ - "anchor-syn", - "anyhow", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-derive-accounts" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec4720d899b3686396cced9508f23dab420f1308344456ec78ef76f98fda42af" -dependencies = [ - "anchor-syn", - "anyhow", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-derive-space" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f495e85480bd96ddeb77b71d499247c7d4e8b501e75ecb234e9ef7ae7bd6552a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-lang" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d2d4b20100f1310a774aba3471ef268e5c4ba4d5c28c0bbe663c2658acbc414" -dependencies = [ - "anchor-attribute-access-control", - "anchor-attribute-account", - "anchor-attribute-constant", - "anchor-attribute-error", - "anchor-attribute-event", - "anchor-attribute-program", - "anchor-derive-accounts", - "anchor-derive-space", - "arrayref", - "base64 0.13.1", - "bincode", - "borsh 0.10.3", - "bytemuck", - "getrandom 0.2.10", - "solana-program", - "thiserror", -] - -[[package]] -name = "anchor-syn" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a125e4b0cc046cfec58f5aa25038e34cf440151d58f0db3afc55308251fe936d" -dependencies = [ - "anyhow", - "bs58 0.5.0", - "heck", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2 0.10.8", - "syn 1.0.109", - "thiserror", -] - -[[package]] -name = "anyhow" -version = "1.0.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" - -[[package]] -name = "ark-bn254" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-std", -] - -[[package]] -name = "ark-ec" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" -dependencies = [ - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", - "itertools", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", - "derivative", - "digest 0.10.7", - "itertools", - "num-bigint", - "num-traits", - "paste", - "rustc_version", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-poly" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" -dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-serialize-derive", - "ark-std", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "array-bytes" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ad284aeb45c13f2fb4f084de4a420ebf447423bdf9386c0540ce33cb3ef4b8c" - -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "base64" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitmaps" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" -dependencies = [ - "typenum", -] - -[[package]] -name = "blake3" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", - "digest 0.10.7", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blockroot" -version = "0.3.0" -dependencies = [ - "anchor-lang", -] - -[[package]] -name = "borsh" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" -dependencies = [ - "borsh-derive 0.9.3", - "hashbrown 0.11.2", -] - -[[package]] -name = "borsh" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" -dependencies = [ - "borsh-derive 0.10.3", - "hashbrown 0.13.2", -] - -[[package]] -name = "borsh-derive" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" -dependencies = [ - "borsh-derive-internal 0.9.3", - "borsh-schema-derive-internal 0.9.3", - "proc-macro-crate", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "borsh-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" -dependencies = [ - "borsh-derive-internal 0.10.3", - "borsh-schema-derive-internal 0.10.3", - "proc-macro-crate", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "borsh-derive-internal" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "borsh-derive-internal" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "borsh-schema-derive-internal" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "borsh-schema-derive-internal" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" - -[[package]] -name = "bs58" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "bumpalo" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" - -[[package]] -name = "bv" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" -dependencies = [ - "feature-probe", - "serde", -] - -[[package]] -name = "bytemuck" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "jobserver", - "libc", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if", - "wasm-bindgen", -] - -[[package]] -name = "console_log" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" -dependencies = [ - "log", - "web-sys", -] - -[[package]] -name = "constant_time_eq" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" - -[[package]] -name = "cpufeatures" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" -dependencies = [ - "autocfg", - "cfg-if", - "crossbeam-utils", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array", - "subtle", -] - -[[package]] -name = "curve25519-dalek" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "serde", - "subtle", - "zeroize", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "crypto-common", - "subtle", -] - -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "feature-probe" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "serde", - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash 0.7.6", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.3", -] - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hmac" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac", - "digest 0.9.0", -] - -[[package]] -name = "hmac-drbg" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" -dependencies = [ - "digest 0.9.0", - "generic-array", - "hmac", -] - -[[package]] -name = "im" -version = "15.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" -dependencies = [ - "bitmaps", - "rand_core 0.6.4", - "rand_xoshiro", - "rayon", - "serde", - "sized-chunks", - "typenum", - "version_check", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "jobserver" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "keccak" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libc" -version = "0.2.148" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" - -[[package]] -name = "libsecp256k1" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" -dependencies = [ - "arrayref", - "base64 0.12.3", - "digest 0.9.0", - "hmac-drbg", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "typenum", -] - -[[package]] -name = "libsecp256k1-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" -dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", -] - -[[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "memchr" -version = "2.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" - -[[package]] -name = "memmap2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "pbkdf2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" -dependencies = [ - "crypto-mac", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml", -] - -[[package]] -name = "proc-macro2" -version = "1.0.67" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.10", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_xoshiro" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "rayon" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex" -version = "1.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebee201405406dbf528b8b672104ae6d6d63e6d118cb10e4d51abbc7b58044ff" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b23e92ee4318893fa3fe3e6fb365258efbfe6ac6ab30f090cdcbb7aa37efa9" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc_version" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" -dependencies = [ - "semver", -] - -[[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "semver" -version = "1.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad977052201c6de01a8ef2aa3378c4bd23217a056337d1d6da40468d267a4fb0" - -[[package]] -name = "serde" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_bytes" -version = "0.11.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "serde_json" -version = "1.0.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "sized-chunks" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" -dependencies = [ - "bitmaps", - "typenum", -] - -[[package]] -name = "smallvec" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" - -[[package]] -name = "solana-frozen-abi" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "361cc834e5fbbe1a73f1d904fcb8ab052a665e5be6061bd1ba7ab478d7d17c9c" -dependencies = [ - "ahash 0.8.3", - "blake3", - "block-buffer 0.10.4", - "bs58 0.4.0", - "bv", - "byteorder", - "cc", - "either", - "generic-array", - "getrandom 0.1.16", - "im", - "lazy_static", - "log", - "memmap2", - "once_cell", - "rand_core 0.6.4", - "rustc_version", - "serde", - "serde_bytes", - "serde_derive", - "serde_json", - "sha2 0.10.8", - "solana-frozen-abi-macro", - "subtle", - "thiserror", -] - -[[package]] -name = "solana-frozen-abi-macro" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "575d875dc050689f9f88c542e292e295e2f081d4e96e0df297981e45cbad8824" -dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.37", -] - -[[package]] -name = "solana-program" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9863ff5c6e828015bec331c26fb53e48352a264a9be682e7e078d2c3b3e93b46" -dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff", - "ark-serialize", - "array-bytes", - "base64 0.21.4", - "bincode", - "bitflags", - "blake3", - "borsh 0.10.3", - "borsh 0.9.3", - "bs58 0.4.0", - "bv", - "bytemuck", - "cc", - "console_error_panic_hook", - "console_log", - "curve25519-dalek", - "getrandom 0.2.10", - "itertools", - "js-sys", - "lazy_static", - "libc", - "libsecp256k1", - "log", - "memoffset", - "num-bigint", - "num-derive", - "num-traits", - "parking_lot", - "rand 0.7.3", - "rand_chacha 0.2.2", - "rustc_version", - "rustversion", - "serde", - "serde_bytes", - "serde_derive", - "serde_json", - "sha2 0.10.8", - "sha3", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-sdk-macro", - "thiserror", - "tiny-bip39", - "wasm-bindgen", - "zeroize", -] - -[[package]] -name = "solana-sdk-macro" -version = "1.16.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd177a74fb3a0a362f1292c027d668eff609ac189f08b78158324587a0a4f8d1" -dependencies = [ - "bs58 0.4.0", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.37", -] - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] - -[[package]] -name = "tiny-bip39" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" -dependencies = [ - "anyhow", - "hmac", - "once_cell", - "pbkdf2", - "rand 0.7.3", - "rustc-hash", - "sha2 0.9.9", - "thiserror", - "unicode-normalization", - "wasm-bindgen", - "zeroize", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.37", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.87" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" - -[[package]] -name = "web-sys" -version = "0.3.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "zeroize" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.37", -] diff --git a/crates/sovereign-sdk/adapters/solana/solana_da_programs/Cargo.toml b/crates/sovereign-sdk/adapters/solana/solana_da_programs/Cargo.toml deleted file mode 100644 index ef17a63c0..000000000 --- a/crates/sovereign-sdk/adapters/solana/solana_da_programs/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[workspace] -members = [ - "programs/*" -] - -[profile.release] -overflow-checks = true -lto = "fat" -codegen-units = 1 -[profile.release.build-override] -opt-level = 3 -incremental = false -codegen-units = 1 diff --git a/crates/sovereign-sdk/adapters/solana/solana_da_programs/migrations/deploy.ts b/crates/sovereign-sdk/adapters/solana/solana_da_programs/migrations/deploy.ts deleted file mode 100644 index 82fb175fa..000000000 --- a/crates/sovereign-sdk/adapters/solana/solana_da_programs/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@coral-xyz/anchor"); - -module.exports = async function (provider) { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/crates/sovereign-sdk/adapters/solana/solana_da_programs/package.json b/crates/sovereign-sdk/adapters/solana/solana_da_programs/package.json deleted file mode 100644 index 7ce74a967..000000000 --- a/crates/sovereign-sdk/adapters/solana/solana_da_programs/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@coral-xyz/anchor": "^0.28.0" - }, - "devDependencies": { - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "typescript": "^4.3.5", - "prettier": "^2.6.2" - } -} diff --git a/crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/Cargo.toml b/crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/Cargo.toml deleted file mode 100644 index 742821f59..000000000 --- a/crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "blockroot" -version = "0.4.0-rc.3" -description = "Created with Anchor" -edition = "2021" - -[lib] -crate-type = ["cdylib", "lib"] -name = "blockroot" - -[features] -no-entrypoint = [] -no-idl = [] -no-log-ix-name = [] -cpi = ["no-entrypoint"] -default = [] - -[dependencies] -anchor-lang = { version = "0.28.0", features = ["init-if-needed"] } diff --git a/crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/Xargo.toml b/crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/Xargo.toml deleted file mode 100644 index 475fb71ed..000000000 --- a/crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/Xargo.toml +++ /dev/null @@ -1,2 +0,0 @@ -[target.bpfel-unknown-unknown.dependencies.std] -features = [] diff --git a/crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/src/da.rs b/crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/src/da.rs deleted file mode 100644 index d7c2106aa..000000000 --- a/crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/src/da.rs +++ /dev/null @@ -1,272 +0,0 @@ -#![deny(missing_docs)] -#![doc = include_str!("../../../../README.md")] - -use std::collections::BTreeMap; - -use anchor_lang::prelude::*; -use anchor_lang::solana_program::keccak::hashv; - -/// Prefix for the PDA that will hold the root of the rollup blocks -/// and be included in the solana block header as part of the account diff -pub const PREFIX: &str = "chunk_accumulator"; - -/// Solana transaction size is currently capped to 1280 bytes (including frame header) -/// We're picking a size that won't push our transaction size beyond 1280 -/// This can be optimized further -pub const CHUNK_SIZE: u64 = 768; - -/// Represents an individual chunk of data for rollup blobs. -#[account] -#[derive(Default, Debug)] -pub struct Chunk { - /// Unique identifier for the blob to which this chunk belongs (we currently use Merkle root for simplicity but can be a UUID or even a hash of the entire blob) - pub digest: [u8; 32], - /// Total number of chunks that make up the complete blob. - pub num_chunks: u64, - /// Position of this chunk in the sequence of chunks that form the blob. - pub chunk_num: u64, - /// Actual size of the chunk data, used for handling padding in the final chunk. - pub actual_size: u64, - /// The actual data content of this chunk. - pub chunk_body: Vec, -} - -/// Represents the root account for blocks, typically storing a Merkle root. -#[account] -#[derive(Default, Debug)] -pub struct BlocksRoot { - /// The accumulated digest for all the merkle roots for each blob that is successfully "accumulated" during that slot - pub digest: [u8; 32], - /// The current slot number in Solana when this root is recorded. - pub slot: u64, -} - -/// Represents an accumulator for chunks, allowing for efficient accumulation and retrieval. -#[account] -#[derive(Default, Debug)] -pub struct ChunkAccumulator { - /// A map where keys are blob digests and values are nested vectors of optional chunk hashes. The nested vectors represent a Merkle tree structure. - pub chunks: BTreeMap<[u8; 32], Vec>>>, -} - -impl BlocksRoot { - /// Create a new `BlocksRoot` instance with default values. - pub fn new() -> Self { - BlocksRoot { - digest: [0u8; 32], - slot: 0, - } - } - - /// Updates the root of the `BlocksRoot` with given block root and slot number. - /// If the slot number is greater than the current slot, the digest is updated. - /// Otherwise, an accumulator function is used to merge the current digest with the given block root. - pub fn update_root(&mut self, blockroot: &[u8; 32], slot_num: u64) { - // slot number switched - if slot_num > self.slot { - self.digest = *blockroot; - self.slot = self.slot; - } else { - // we're in the same solana slot - self.digest = blocks_root_accumulator(&self.digest, blockroot); - } - } -} - -impl ChunkAccumulator { - /// Create a new `ChunkAccumulator` instance with an empty chunks BTreeMap. - pub fn new() -> Self { - ChunkAccumulator { - chunks: BTreeMap::new(), - } - } - /// Clear the chunks BTreeMap of a specific digest. - pub fn clear_digest(&mut self, digest: &[u8; 32]) { - self.chunks.remove(digest); - } - - /// Accumulate a given chunk into the chunks BTreeMap. - /// This involves updating the Merkle tree structure associated with the chunk's digest. - pub fn accumulate(&mut self, chunk: Chunk) { - let Chunk { - digest, - num_chunks, - chunk_num, - actual_size, - chunk_body, - } = chunk; - - let levels = self.chunks.entry(digest).or_insert_with(|| { - let mut vec = Vec::new(); - let mut num = num_chunks as usize; - while num > 1 { - vec.push(vec![None; num]); - num = (num + 1) / 2; - } - vec.push(vec![None]); - vec - }); - - // including the actual size as part of the merkelization. first 8 bytes - let chunk_hash = { - let mut combined = Vec::with_capacity(8 + chunk_body.len()); - combined.extend_from_slice(&actual_size.to_le_bytes()); - combined.extend(chunk_body); - hashv(&[&combined]).to_bytes() - }; - levels[0][chunk_num as usize] = Some(chunk_hash); - - let mut current_level = 0; - let mut current_index = chunk_num as usize; - - while current_level < levels.len() - 1 { - if current_index % 2 == 1 - && levels[current_level][current_index].is_some() - && levels[current_level][current_index - 1].is_some() - { - let left = levels[current_level][current_index - 1].as_ref().unwrap(); - let right = levels[current_level][current_index].as_ref().unwrap(); - let merged = hashv(&[left, right]).to_bytes(); - - levels[current_level + 1][current_index / 2] = Some(merged); - current_level += 1; - current_index /= 2; - } else if chunk_num == num_chunks - 1 - && current_index % 2 == 0 - && levels[current_level][current_index].is_some() - { - // Handle the case for unpaired nodes at the end of the level. - levels[current_level + 1][current_index / 2] = - levels[current_level][current_index].clone(); - current_level += 1; - current_index /= 2; - } else { - break; - } - } - } - - /// Fetches the Merkle root for a specific digest. - /// Returns `None` if the Merkle tree for the given digest is incomplete. - pub fn get_merkle_root(&self, digest: &[u8; 32]) -> Option<[u8; 32]> { - self.chunks - .get(digest) - .and_then(|levels| levels.last()?.first().cloned()) - .flatten() - } - - /// Checks if the Merkle tree associated with a given digest is complete. - pub fn is_complete(&self, digest: &[u8; 32]) -> bool { - self.get_merkle_root(digest).is_some() - } -} - -/// Splits the given raw data into chunks of the specified size and returns them as a vector. -/// -/// Each `Chunk` is initialized with its respective metadata such as its number (`chunk_num`), -/// actual size (`actual_size`), and body (`chunk_body`). Padding is added to the `chunk_body` -/// to ensure all chunks are of uniform size. After all chunks are created, they are merkleized -/// and their digest values are updated. -/// -/// # Arguments -/// -/// * `raw_data` - The data to be split into chunks. -/// * `chunk_size` - The desired size for each chunk. -/// -/// # Returns -/// -/// A vector containing the generated `Chunk` objects. -pub fn get_chunks(raw_data: &[u8], chunk_size: u64) -> Vec { - let data_length = raw_data.len() as u64; - let num_chunks = (data_length as f64 / chunk_size as f64).ceil() as u64; - let mut chunks = Vec::new(); - for i in 0..num_chunks { - let start = i * chunk_size; - let end = std::cmp::min((start as u64) + chunk_size, data_length); - let mut chunk_body = raw_data[(start as usize)..(end as usize)].to_vec(); - - // Padding - while (chunk_body.len() as u64) < chunk_size { - chunk_body.push(0); - } - - chunks.push(Chunk { - digest: [0u8; 32], - num_chunks, - chunk_num: i, - actual_size: end - start, - chunk_body, - }); - } - - let digest = merkleize(&chunks); - for c in &mut chunks { - c.digest = digest; - } - chunks -} - -/// Computes a Merkle root from a given slice of `Chunk` objects. -/// -/// Each `Chunk` is first hashed based on its `actual_size` and `chunk_body`. The resulting hashes -/// are then aggregated level by level until a single Merkle root is derived. -/// -/// # Arguments -/// -/// * `chunks` - The slices of `Chunk` objects to be merkleized. -/// -/// # Returns -/// -/// The derived Merkle root as a byte array of length 32. -pub fn merkleize(chunks: &[Chunk]) -> [u8; 32] { - let mut current_level = chunks - .iter() - .map(|chunk| { - let mut combined = Vec::with_capacity(8 + chunk.chunk_body.len()); - combined.extend_from_slice(&chunk.actual_size.to_le_bytes()); - combined.extend(&chunk.chunk_body); - hashv(&[&combined]).0 - }) - .collect::>(); - - while current_level.len() > 1 { - let mut next_level = Vec::new(); - - for pairs in current_level.chunks(2) { - match pairs.len() { - 2 => { - let merged = hashv(&[&pairs[0], &pairs[1]]).0; // Destructuring again - next_level.push(merged); - } - 1 => { - // Just copy the unpaired leaf to the next level. - next_level.push(pairs[0]); - } - // chunks() with 2 should only yield 1 or 2 items - // should never happen, but match completion. - // TODO: make this logic cleaner - _ => unreachable!(), - } - } - - current_level = next_level; - } - current_level[0] -} - -/// Combines the current root and a block digest using a cryptographic hash function (keccak hashv syscall) -/// -/// This function essentially merges the `current_root` and `block_digest` by hashing them together. -/// -/// # Arguments -/// -/// * `current_root` - The current root hash. -/// * `block_digest` - The block digest to be combined with the current root. -/// -/// # Returns -/// -/// The resulting combined hash as a byte array of length 32. -fn blocks_root_accumulator(current_root: &[u8; 32], block_digest: &[u8; 32]) -> [u8; 32] { - let combined = [current_root.as_ref(), block_digest.as_ref()]; - hashv(&combined).0 -} diff --git a/crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/src/lib.rs b/crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/src/lib.rs deleted file mode 100644 index a0bf4a018..000000000 --- a/crates/sovereign-sdk/adapters/solana/solana_da_programs/programs/blockroot/src/lib.rs +++ /dev/null @@ -1,151 +0,0 @@ -pub mod da; - -use std::collections::BTreeMap; - -use anchor_lang::prelude::*; - -use crate::da::{BlocksRoot, Chunk, ChunkAccumulator, CHUNK_SIZE, PREFIX}; - -declare_id!("6YQGvP866CHpLTdHwmLqj2Vh5q7T1GF4Kk9gS9MCta8E"); - -#[program] -pub mod blockroot { - use super::*; - - /// Initializes the chunk accumulator with an empty set of chunks. - /// - /// # Arguments - /// - /// * `ctx` - The context for the `Initialize` operation. - /// - /// # Returns - /// - /// * A `Result` indicating the success or failure of the initialization. - pub fn initialize<'info>(ctx: Context) -> Result<()> { - let accumulator = &mut ctx.accounts.chunk_accumulator; - accumulator.chunks = BTreeMap::new(); - Ok(()) - } - - /// Clears a specific chunk based on its digest or all chunks if no digest is provided. - /// - /// # Arguments - /// - /// * `ctx` - The context for the `Clear` operation. - /// * `digest` - An optional digest of the chunk to be cleared. If `None`, all chunks are cleared. - /// - /// # Returns - /// - /// * A `Result` indicating the success or failure of the clearing operation. - pub fn clear<'info>(ctx: Context, digest: Option<[u8; 32]>) -> Result<()> { - let accumulator = &mut ctx.accounts.chunk_accumulator; - if let Some(d) = digest { - accumulator.chunks.remove(&d); - } else { - accumulator.chunks = BTreeMap::new(); - }; - Ok(()) - } - - /// Processes a given chunk, checks its completion status, and if completed, updates the root. - /// - /// # Arguments - /// - /// * `ctx` - The context for the `ProcessChunk` operation. - /// * `bump` - Used to calculate and check the BlocksRoot PDA. - /// Unused in the instruction directly, but used by the - /// derive macro in the ProcessChunk context - /// * `chunk` - The chunk data to be processed. - /// - /// # Returns - /// - /// * A `Result` indicating the success or failure of the chunk processing operation. - #[allow(unused_variables)] - pub fn process_chunk<'info>(ctx: Context, bump: u8, chunk: Chunk) -> Result<()> { - if chunk.chunk_body.len() > CHUNK_SIZE as usize { - return Err(error!(ErrorCode::ChunkSizeTooLarge)); - } - let chunk_accumulator = &mut ctx.accounts.chunk_accumulator; - let blocks_root = &mut ctx.accounts.blocks_root; - let digest = chunk.digest.clone(); - let current_slot_num = ctx.accounts.clock.slot; - chunk_accumulator.accumulate(chunk); - msg!("{}", chunk_accumulator.is_complete(&digest)); - if let Some(merkle_root) = chunk_accumulator.get_merkle_root(&digest) { - msg!( - "accumulation blob with digest: {:?} has completed with root {:?}", - digest, - merkle_root - ); - blocks_root.update_root(&merkle_root, current_slot_num); - msg!( - "blocks root for slot {}, blob root: {:?} combined root: {:?}", - current_slot_num, - merkle_root, - blocks_root.digest - ); - chunk_accumulator.clear_digest(&digest); - } - Ok(()) - } -} - -/// Represents the accounts to be utilized during the initialization of the chunk accumulator. -#[derive(Accounts)] -pub struct Initialize<'info> { - /// The signer/payer for the transaction. Sequencer identity. - #[account(mut)] - pub creator: Signer<'info>, - - /// The key pair account for storing chunk data for in-flight blobs. Must be zeroed for init. Must be a signer. - #[account(signer, zero)] - pub chunk_accumulator: Account<'info, ChunkAccumulator>, - - /// The built-in Solana system program. - pub system_program: Program<'info, System>, -} - -/// Represents the accounts to be utilized during the clearing operation of the chunk accumulator. -#[derive(Accounts)] -pub struct Clear<'info> { - /// The signer who initiates the clearing operation. - #[account(mut)] - pub creator: Signer<'info>, - - /// The key pair account for storing chunk data for in-flight blobs. Must be a signer. - #[account(signer, mut)] - pub chunk_accumulator: Account<'info, ChunkAccumulator>, - - /// The built-in Solana system program. - pub system_program: Program<'info, System>, -} - -/// Represents the accounts to be utilized during the chunk processing operation. -#[derive(Accounts)] -pub struct ProcessChunk<'info> { - /// The signer who initiates the chunk processing. - #[account(mut)] - pub creator: Signer<'info>, - - /// The key pair account for storing chunk data for in-flight blobs. Must be a signer. - #[account(signer, mut)] - pub chunk_accumulator: Account<'info, ChunkAccumulator>, - - /// Account (PDA) for storing the Merkle root of the accumulated chunks. Initializes if not already present. - #[account(init_if_needed, payer=creator, space=8+32+8, seeds= [PREFIX.as_bytes()], bump)] - pub blocks_root: Account<'info, BlocksRoot>, - - /// The built-in Solana system program. - pub system_program: Program<'info, System>, - - /// The Solana sysvar to fetch the current slot number. - pub clock: Sysvar<'info, Clock>, -} - -/// Errors for the Block root DA program -#[error_code] -pub enum ErrorCode { - /// Each chunk needs a fixed size and it cannot be exceeded - #[msg(format!("Max chunk size is {}",CHUNK_SIZE))] - ChunkSizeTooLarge, -} diff --git a/crates/sovereign-sdk/adapters/solana/solana_da_programs/tests/solana_da_programs.ts b/crates/sovereign-sdk/adapters/solana/solana_da_programs/tests/solana_da_programs.ts deleted file mode 100644 index e5914c3de..000000000 --- a/crates/sovereign-sdk/adapters/solana/solana_da_programs/tests/solana_da_programs.ts +++ /dev/null @@ -1,16 +0,0 @@ -import * as anchor from "@coral-xyz/anchor"; -import { Program } from "@coral-xyz/anchor"; -import { SolanaDaPrograms } from "../target/types/solana_da_programs"; - -describe("solana_da_programs", () => { - // Configure the client to use the local cluster. - anchor.setProvider(anchor.AnchorProvider.env()); - - const program = anchor.workspace.SolanaDaPrograms as Program; - - it("Is initialized!", async () => { - // Add your test here. - const tx = await program.methods.initialize().rpc(); - console.log("Your transaction signature", tx); - }); -}); diff --git a/crates/sovereign-sdk/adapters/solana/solana_da_programs/tsconfig.json b/crates/sovereign-sdk/adapters/solana/solana_da_programs/tsconfig.json deleted file mode 100644 index cd5d2e3d0..000000000 --- a/crates/sovereign-sdk/adapters/solana/solana_da_programs/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/crates/sovereign-sdk/adapters/solana/solana_da_programs/yarn.lock b/crates/sovereign-sdk/adapters/solana/solana_da_programs/yarn.lock deleted file mode 100644 index b9d1ac44d..000000000 --- a/crates/sovereign-sdk/adapters/solana/solana_da_programs/yarn.lock +++ /dev/null @@ -1,1147 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/runtime@^7.17.2", "@babel/runtime@^7.22.6": - version "7.23.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d" - integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== - dependencies: - regenerator-runtime "^0.14.0" - -"@coral-xyz/anchor@^0.28.0": - version "0.28.0" - resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.28.0.tgz#8345c3c9186a91f095f704d7b90cd256f7e8b2dc" - integrity sha512-kQ02Hv2ZqxtWP30WN1d4xxT4QqlOXYDxmEd3k/bbneqhV3X5QMO4LAtoUFs7otxyivOgoqam5Il5qx81FuI4vw== - dependencies: - "@coral-xyz/borsh" "^0.28.0" - "@solana/web3.js" "^1.68.0" - base64-js "^1.5.1" - bn.js "^5.1.2" - bs58 "^4.0.1" - buffer-layout "^1.2.2" - camelcase "^6.3.0" - cross-fetch "^3.1.5" - crypto-hash "^1.3.0" - eventemitter3 "^4.0.7" - js-sha256 "^0.9.0" - pako "^2.0.3" - snake-case "^3.0.4" - superstruct "^0.15.4" - toml "^3.0.0" - -"@coral-xyz/borsh@^0.28.0": - version "0.28.0" - resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.28.0.tgz#fa368a2f2475bbf6f828f4657f40a52102e02b6d" - integrity sha512-/u1VTzw7XooK7rqeD7JLUSwOyRSesPUk0U37BV9zK0axJc1q0nRbKFGFLYCQ16OtdOJTTwGfGp11Lx9B45bRCQ== - dependencies: - bn.js "^5.1.2" - buffer-layout "^1.2.0" - -"@noble/curves@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" - integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== - dependencies: - "@noble/hashes" "1.3.2" - -"@noble/hashes@1.3.2", "@noble/hashes@^1.3.1": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" - integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== - -"@solana/buffer-layout@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" - integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== - dependencies: - buffer "~6.0.3" - -"@solana/web3.js@^1.68.0": - version "1.78.7" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.78.7.tgz#a53dd3bbd604c13468555cb5eea1d39d69dd9e82" - integrity sha512-BiAuCaHnbxgHsjNt/4dfMYjvPDRw+tollg6uWdVZpPogQW2GJj51LQ2NeVhfIGlJIU75O03YZeIc0r0H6LH1vA== - dependencies: - "@babel/runtime" "^7.22.6" - "@noble/curves" "^1.2.0" - "@noble/hashes" "^1.3.1" - "@solana/buffer-layout" "^4.0.0" - agentkeepalive "^4.3.0" - bigint-buffer "^1.1.5" - bn.js "^5.2.1" - borsh "^0.7.0" - bs58 "^4.0.1" - buffer "6.0.3" - fast-stable-stringify "^1.0.0" - jayson "^4.1.0" - node-fetch "^2.6.12" - rpc-websockets "^7.5.1" - superstruct "^0.14.2" - -"@types/bn.js@^5.1.0": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.2.tgz#162f5238c46f4bcbac07a98561724eca1fcf0c5e" - integrity sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg== - dependencies: - "@types/node" "*" - -"@types/chai@^4.3.0": - version "4.3.6" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.6.tgz#7b489e8baf393d5dd1266fb203ddd4ea941259e6" - integrity sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw== - -"@types/connect@^3.4.33": - version "3.4.36" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" - integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== - dependencies: - "@types/node" "*" - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/mocha@^9.0.0": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" - integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== - -"@types/node@*": - version "20.8.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.2.tgz#d76fb80d87d0d8abfe334fc6d292e83e5524efc4" - integrity sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w== - -"@types/node@^12.12.54": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== - -"@types/ws@^7.4.4": - version "7.4.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" - integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== - dependencies: - "@types/node" "*" - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - -JSONStream@^1.3.5: - version "1.3.5" - resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -agentkeepalive@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== - dependencies: - humanize-ms "^1.2.1" - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^3.0.2: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -bigint-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" - integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== - dependencies: - bindings "^1.3.0" - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bindings@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -borsh@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" - integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== - dependencies: - bn.js "^5.2.0" - bs58 "^4.0.0" - text-encoding-utf-8 "^1.0.2" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -bs58@^4.0.0, bs58@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== - dependencies: - base-x "^3.0.2" - -buffer-from@^1.0.0, buffer-from@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-layout@^1.2.0, buffer-layout@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" - integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== - -buffer@6.0.3, buffer@~6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -bufferutil@^4.0.1: - version "4.0.7" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" - integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== - dependencies: - node-gyp-build "^4.3.0" - -camelcase@^6.0.0, camelcase@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -chai@^4.3.4: - version "4.3.10" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384" - integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.0.8" - -chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" - -chokidar@3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^2.20.3: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -cross-fetch@^3.1.5: - version "3.1.8" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== - dependencies: - node-fetch "^2.6.12" - -crypto-hash@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" - integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== - -debug@4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -deep-eql@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" - integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== - dependencies: - type-detect "^4.0.0" - -delay@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" - integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -diff@^3.1.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== - dependencies: - es6-promise "^4.0.3" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eventemitter3@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -eyes@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== - -fast-stable-stringify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" - integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isomorphic-ws@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" - integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== - -jayson@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.0.tgz#60dc946a85197317f2b1439d672a8b0a99cea2f9" - integrity sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A== - dependencies: - "@types/connect" "^3.4.33" - "@types/node" "^12.12.54" - "@types/ws" "^7.4.4" - JSONStream "^1.3.5" - commander "^2.20.3" - delay "^5.0.0" - es6-promisify "^5.0.0" - eyes "^0.1.8" - isomorphic-ws "^4.0.1" - json-stringify-safe "^5.0.1" - uuid "^8.3.2" - ws "^7.4.5" - -js-sha256@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" - integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -log-symbols@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -loupe@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" - integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== - dependencies: - get-func-name "^2.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -minimatch@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" - integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.0.4: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mkdirp@^0.5.1: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mocha@^9.0.3: - version "9.2.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" - integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.3" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - growl "1.10.5" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "4.2.1" - ms "2.1.3" - nanoid "3.3.1" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - workerpool "6.2.0" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.0.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-fetch@^2.6.12: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-gyp-build@^4.3.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" - integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -pako@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" - integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -prettier@^2.6.2: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -rpc-websockets@^7.5.1: - version "7.6.0" - resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.6.0.tgz#d3f4c0dac108ca35566b0e31552c32e58928cd04" - integrity sha512-Jgcs8q6t8Go98dEulww1x7RysgTkzpCMelVxZW4hvuyFtOGpeUz9prpr2KjUa/usqxgFCd9Tu3+yhHEP9GVmiQ== - dependencies: - "@babel/runtime" "^7.17.2" - eventemitter3 "^4.0.7" - uuid "^8.3.2" - ws "^8.5.0" - optionalDependencies: - bufferutil "^4.0.1" - utf-8-validate "^5.0.2" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -snake-case@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" - integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -source-map-support@^0.5.6: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-json-comments@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -superstruct@^0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" - integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== - -superstruct@^0.15.4: - version "0.15.5" - resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.5.tgz#0f0a8d3ce31313f0d84c6096cd4fa1bfdedc9dab" - integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== - -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -text-encoding-utf-8@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" - integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== - -"through@>=2.2.7 <3": - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toml@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" - integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-mocha@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-10.0.0.tgz#41a8d099ac90dbbc64b06976c5025ffaebc53cb9" - integrity sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw== - dependencies: - ts-node "7.0.1" - optionalDependencies: - tsconfig-paths "^3.5.0" - -ts-node@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" - integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== - dependencies: - arrify "^1.0.0" - buffer-from "^1.1.0" - diff "^3.1.0" - make-error "^1.1.1" - minimist "^1.2.0" - mkdirp "^0.5.1" - source-map-support "^0.5.6" - yn "^2.0.0" - -tsconfig-paths@^3.5.0: - version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.0.3: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -type-detect@^4.0.0, type-detect@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -typescript@^4.3.5: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -utf-8-validate@^5.0.2: - version "5.0.10" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" - integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== - dependencies: - node-gyp-build "^4.3.0" - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -workerpool@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" - integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -ws@^7.4.5: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.5.0: - version "8.14.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" - integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yn@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" - integrity sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==