diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a83d7973..a27457dd 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -24,3 +24,12 @@ updates: open-pull-requests-limit: 10 versioning-strategy: increase rebase-strategy: disabled + - package-ecosystem: npm + directory: "/examples/hardhat" + schedule: + interval: weekly + time: "02:00" + timezone: Europe/Berlin + open-pull-requests-limit: 10 + versioning-strategy: increase + rebase-strategy: disabled diff --git a/.github/workflows/pull-request.yaml b/.github/workflows/pull-request.yaml index 57a77340..41c4f4b1 100644 --- a/.github/workflows/pull-request.yaml +++ b/.github/workflows/pull-request.yaml @@ -59,9 +59,9 @@ jobs: cargo run --package examples --example deployments cargo run --package examples --example events cargo run --package examples --example revert - cargo run --package examples-generate cargo run --package examples --example linked if [ "$PK" ] && [ "$INFURA_PROJECT_ID" ]; then + cargo run --package examples-generate cargo run --package examples --example rinkeby cargo run --package examples --example sources fi diff --git a/.gitignore b/.gitignore index 974c388e..24a7e45e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,7 @@ Cargo.lock node_modules/ examples/*/build/ +examples/*/artifacts +examples/*/cache .idea diff --git a/ethcontract-common/Cargo.toml b/ethcontract-common/Cargo.toml index 33ec228e..4663ce59 100644 --- a/ethcontract-common/Cargo.toml +++ b/ethcontract-common/Cargo.toml @@ -12,7 +12,7 @@ Common types for ethcontract-rs runtime and proc macro. """ [dependencies] -ethabi = "14.0" +ethabi = "14.1.0" hex = "0.4" serde = "1.0" serde_derive = "1.0" diff --git a/ethcontract-common/src/abiext.rs b/ethcontract-common/src/abiext.rs index 6ca42909..f2fd3728 100644 --- a/ethcontract-common/src/abiext.rs +++ b/ethcontract-common/src/abiext.rs @@ -7,11 +7,11 @@ use serde_json::json; /// Extension trait for `ethabi::Function`. pub trait FunctionExt { - /// Compute the method signature in the standard ABI format. This does not + /// Computes the method signature in the standard ABI format. This does not /// include the output types. fn abi_signature(&self) -> String; - /// Compute the Keccak256 function selector used by contract ABIs. + /// Computes the Keccak256 function selector used by contract ABIs. fn selector(&self) -> H32; } @@ -32,7 +32,7 @@ impl FunctionExt for Function { /// Extension trait for `ethabi::Event`. pub trait EventExt { - /// Compute the event signature in human-readable format. The `keccak256` + /// Computes the event signature in human-readable format. The `keccak256` /// hash of this value is the actual event signature that is used as topic0 /// in the transaction logs. fn abi_signature(&self) -> String; diff --git a/ethcontract-common/src/artifact.rs b/ethcontract-common/src/artifact.rs index cdf3731d..241176d2 100644 --- a/ethcontract-common/src/artifact.rs +++ b/ethcontract-common/src/artifact.rs @@ -24,7 +24,7 @@ pub struct Artifact { } impl Artifact { - /// Create a new empty artifact. + /// Creates a new empty artifact. pub fn new() -> Self { Artifact { origin: "".to_string(), @@ -32,7 +32,7 @@ impl Artifact { } } - /// Create a new artifact with an origin information. + /// Creates a new artifact with an origin information. pub fn with_origin(origin: impl Into) -> Self { Artifact { origin: origin.into(), @@ -40,7 +40,7 @@ impl Artifact { } } - /// Describe where this artifact comes from. + /// Provides description of where this artifact comes from. /// /// This function is used when a human-readable reference to the artifact /// is required. It could be anything: path to a json file, url, etc. @@ -48,7 +48,7 @@ impl Artifact { &self.origin } - /// Set new origin for the artifact. + /// Sets new origin for the artifact. /// /// Artifact loaders will set origin to something meaningful in most cases, /// so this function should not be used often. There are cases when @@ -57,22 +57,22 @@ impl Artifact { self.origin = origin.into(); } - /// Get number of contracts contained in this artifact. + /// Gets number of contracts contained in this artifact. pub fn len(&self) -> usize { self.contracts.len() } - /// Check if this artifact contains no contracts. + /// Returns `true` if this artifact contains no contracts. pub fn is_empty(&self) -> bool { self.contracts.is_empty() } - /// Check whether this artifact has a contract with the given name. + /// Returns `true` if this artifact has a contract with the given name. pub fn contains(&self, name: &str) -> bool { self.contracts.contains_key(name) } - /// Get contract by name. + /// Looks up contract by its name and returns a reference to it. /// /// Some artifact formats allow exporting a single unnamed contract. /// In this case, the contract will have an empty string as its name. @@ -80,19 +80,19 @@ impl Artifact { self.contracts.get(name) } - /// Get contract by name. + /// Looks up contract by its name and returns a handle that allows + /// safely mutating it. /// - /// Returns a handle that allows mutating the contract. It does not allow - /// renaming contract though. For that, you'll need to remove - /// it and add again. + /// The returned handle does not allow renaming contract. For that, + /// you'll need to remove it and add again. pub fn get_mut(&mut self, name: &str) -> Option { self.contracts.get_mut(name).map(ContractMut) } - /// Insert a new contract to the artifact. + /// Inserts a new contract to the artifact. /// - /// If contract with this name already exists, replace it - /// and return the old contract. + /// If contract with this name already exists, replaces it + /// and returns the old contract. pub fn insert(&mut self, contract: Contract) -> InsertResult { match self.contracts.entry(contract.name.clone()) { Entry::Occupied(mut o) => { @@ -109,7 +109,7 @@ impl Artifact { } } - /// Remove contract from the artifact. + /// Removes contract from the artifact. /// /// Returns removed contract or [`None`] if contract with the given name /// wasn't found. @@ -117,13 +117,13 @@ impl Artifact { self.contracts.remove(name) } - /// Create an iterator that yields the artifact's contracts. + /// Creates an iterator that yields the artifact's contracts. pub fn iter(&self) -> impl Iterator + '_ { self.contracts.values() } - /// Take all contracts from the artifact, leaving it empty, - /// and iterate over them. + /// Takes all contracts from the artifact, leaving it empty, + /// and returns an iterator over the taken contracts. pub fn drain(&mut self) -> impl Iterator + '_ { self.contracts.drain().map(|(_, contract)| contract) } @@ -149,27 +149,27 @@ pub struct InsertResult<'a> { pub struct ContractMut<'a>(&'a mut Contract); impl<'a> ContractMut<'a> { - /// Get mutable access to abi. + /// Returns mutable reference to contract's abi. pub fn abi_mut(&mut self) -> &mut Abi { &mut self.0.abi } - /// Get mutable access to bytecode. + /// Returns mutable reference to contract's bytecode. pub fn bytecode_mut(&mut self) -> &mut Bytecode { &mut self.0.bytecode } - /// Get mutable access to networks. + /// Returns mutable reference to contract's networks. pub fn networks_mut(&mut self) -> &mut HashMap { &mut self.0.networks } - /// Get mutable access to devdoc. + /// Returns mutable reference to contract's devdoc. pub fn devdoc_mut(&mut self) -> &mut Documentation { &mut self.0.devdoc } - /// Get mutable access to userdoc. + /// Returns mutable reference to contract's userdoc. pub fn userdoc_mut(&mut self) -> &mut Documentation { &mut self.0.userdoc } diff --git a/ethcontract-common/src/artifact/hardhat.rs b/ethcontract-common/src/artifact/hardhat.rs index 51420292..df208f49 100644 --- a/ethcontract-common/src/artifact/hardhat.rs +++ b/ethcontract-common/src/artifact/hardhat.rs @@ -11,7 +11,15 @@ //! all contracts deployed on it. It can be generated with //! `hardhat export --export-all` command. //! -//! Both formats are supported by [`HardHatLoader`], see its documentation +//! Third is hardhat's `deployments` directory. It contains more details about +//! contracts than the previous two formats. Specifically, it has info about +//! deployed bytecode, deployment transaction receipt, documentation for +//! contract methods, and some other things. Given that it is a directory, +//! there are obvious issues with loading it over network. For this reason, +//! we don't recommend this export format for public libraries that export +//! contracts. +//! +//! All three formats are supported by [`HardHatLoader`], see its documentation //! for info and limitations. //! //! [hardhat-deploy]: https://github.com/wighawag/hardhat-deploy @@ -19,7 +27,7 @@ use crate::artifact::Artifact; use crate::contract::Network; use crate::errors::ArtifactError; -use crate::{Address, Contract}; +use crate::{Address, Contract, DeploymentInformation, TransactionHash}; use serde::Deserialize; use serde_json::{from_reader, from_slice, from_str, from_value, Value}; use std::collections::HashMap; @@ -49,9 +57,6 @@ pub struct HardHatLoader { /// will be derived automatically. pub origin: Option, - /// Artifact format. - pub format: Format, - /// List of allowed network names and chain IDs. /// /// When loading a contract, networks with names that aren't found @@ -72,30 +77,51 @@ pub struct HardHatLoader { /// Deny list takes precedence over allow list. That is, if network /// appears in both, it will be denied. pub networks_deny_list: Vec, + + /// List of allowed contract names. + /// + /// When loading artifact, loader will only load contracts if their names + /// are present in this list. + /// + /// Empty list means that all contracts are allowed. + pub contracts_allow_list: Vec, + + /// List of denied contract names. + /// + /// When loading artifact, loader will not load contracts if their names + /// are present in this list. + /// + /// Empty list means that no contracts are denied. + /// + /// Deny list takes precedence over allow list. That is, if contract + /// appears in both, it will be denied. + pub contracts_deny_list: Vec, } impl HardHatLoader { - /// Create a new hardhat loader. - pub fn new(format: Format) -> Self { + /// Creates a new hardhat loader. + pub fn new() -> Self { HardHatLoader { origin: None, - format, networks_deny_list: Vec::new(), networks_allow_list: Vec::new(), + contracts_allow_list: Vec::new(), + contracts_deny_list: Vec::new(), } } - /// Create a new hardhat loader and set an override for artifact's origins. - pub fn with_origin(format: Format, origin: impl Into) -> Self { + /// Creates a new hardhat loader and sets an override for artifact's origins.z + pub fn with_origin(origin: impl Into) -> Self { HardHatLoader { origin: Some(origin.into()), - format, networks_deny_list: Vec::new(), networks_allow_list: Vec::new(), + contracts_allow_list: Vec::new(), + contracts_deny_list: Vec::new(), } } - /// Set new override for artifact's origin. See [`origin`] for more info. + /// Sets new override for artifact's origin. See [`origin`] for more info. /// /// [`origin`]: #structfield.origin pub fn origin(mut self, origin: impl Into) -> Self { @@ -103,77 +129,225 @@ impl HardHatLoader { self } - /// Set new format for artifacts. - pub fn format(mut self, format: Format) -> Self { - self.format = format; - self - } - - /// Add chain id to the list of [`allowed networks`]. + /// Adds chain id to the list of [`allowed networks`]. /// /// [`allowed networks`]: #structfield.networks_allow_list - pub fn allow_by_chain_id(mut self, network: impl Into) -> Self { + pub fn allow_network_by_chain_id(mut self, network: impl Into) -> Self { self.networks_allow_list .push(NetworkEntry::ByChainId(network.into())); self } - /// Add network name to the list of [`allowed networks`]. + /// Adds network name to the list of [`allowed networks`]. /// /// [`allowed networks`]: #structfield.networks_allow_list - pub fn allow_by_name(mut self, network: impl Into) -> Self { + pub fn allow_network_by_name(mut self, network: impl Into) -> Self { self.networks_allow_list .push(NetworkEntry::ByName(network.into())); self } - /// Add chain id to the list of [`denyid networks`]. + /// Adds chain id to the list of [`denied networks`]. /// /// [`denied networks`]: #structfield.networks_deny_list - pub fn deny_by_chain_id(mut self, network: impl Into) -> Self { + pub fn deny_network_by_chain_id(mut self, network: impl Into) -> Self { self.networks_deny_list .push(NetworkEntry::ByChainId(network.into())); self } - /// Add network name to the list of [`denied networks`]. + /// Adds network name to the list of [`denied networks`]. /// /// [`denied networks`]: #structfield.networks_deny_list - pub fn deny_by_name(mut self, network: impl Into) -> Self { + pub fn deny_network_by_name(mut self, network: impl Into) -> Self { self.networks_deny_list .push(NetworkEntry::ByName(network.into())); self } - /// Loads an artifact from a loaded JSON value. - pub fn load_from_reader(&self, v: impl Read) -> Result { - self.load_artifact("", v, from_reader, from_reader) + /// Adds contract name to the list of [`allowed contracts`]. + /// + /// [`allowed contracts`]: #structfield.contracts_allow_list + pub fn allow_contract(mut self, contract: impl Into) -> Self { + self.contracts_allow_list.push(contract.into()); + self + } + + /// Adds contract name to the list of [`denied contracts`]. + /// + /// [`denied contracts`]: #structfield.contracts_deny_list + pub fn deny_contract(mut self, contract: impl Into) -> Self { + self.contracts_deny_list.push(contract.into()); + self + } + + /// Loads an artifact from a JSON value. + pub fn load_from_reader(&self, f: Format, v: impl Read) -> Result { + self.load_artifact(f, "", v, from_reader, from_reader) } /// Loads an artifact from bytes of JSON text. - pub fn load_from_slice(&self, v: &[u8]) -> Result { - self.load_artifact("", v, from_slice, from_slice) + pub fn load_from_slice(&self, f: Format, v: &[u8]) -> Result { + self.load_artifact(f, "", v, from_slice, from_slice) } /// Loads an artifact from string of JSON text. - pub fn load_from_str(&self, v: &str) -> Result { - self.load_artifact("", v, from_str, from_str) + pub fn load_from_str(&self, f: Format, v: &str) -> Result { + self.load_artifact(f, "", v, from_str, from_str) } /// Loads an artifact from a loaded JSON value. - pub fn load_from_value(&self, v: Value) -> Result { - self.load_artifact("", v, from_value, from_value) + pub fn load_from_value(&self, f: Format, v: Value) -> Result { + self.load_artifact(f, "", v, from_value, from_value) } /// Loads an artifact from disk. - pub fn load_from_file(&self, p: &Path) -> Result { - let file = File::open(p)?; + pub fn load_from_file( + &self, + f: Format, + p: impl AsRef, + ) -> Result { + let path = p.as_ref(); + let file = File::open(path)?; let reader = BufReader::new(file); - self.load_artifact(p.display(), reader, from_reader, from_reader) + self.load_artifact(f, path.display(), reader, from_reader, from_reader) + } + + /// Loads an artifact from `deployments` directory. + pub fn load_from_directory(&self, p: impl AsRef) -> Result { + self._load_from_directory(p.as_ref()) + } + + /// Helper for `load_from_directory`. We use this helper function to avoid + /// making a big chunk of code generic over `AsRef`. + /// + /// # Implementation note + /// + /// Layout of the `deployments` directory looks like this: + /// + /// ```text + /// deployments + /// | + /// +-- main + /// | | + /// | +-- .chainId + /// | | + /// | +-- Contract1.json + /// | | + /// | +-- Contract2.json + /// | | + /// | ... + /// | + /// +-- rinkeby + /// | | + /// | +-- .chainId + /// | | + /// | +-- Contract1.json + /// | | + /// | +-- Contract2.json + /// | | + /// | ... + /// | + /// ... + /// ``` + /// + /// There's a directory for each network. Within network's directory, + /// there's a `.chainId` file containing chain identifier encoded + /// as plain text. Next to `.chainId` file, there are JSON files for each + /// contract deployed to this network. + fn _load_from_directory(&self, p: &Path) -> Result { + let mut artifact = Artifact::with_origin(p.display().to_string()); + + let mut chain_id_buf = String::new(); + + for chain_entry in p.read_dir()? { + let chain_entry = chain_entry?; + + let chain_path = chain_entry.path(); + if !chain_path.is_dir() { + continue; + } + + let chain_id_file = chain_path.join(".chainId"); + if !chain_id_file.exists() { + continue; + } + + chain_id_buf.clear(); + File::open(chain_id_file)?.read_to_string(&mut chain_id_buf)?; + let chain_id = chain_id_buf.trim().to_string(); + + let chain_name = chain_path + .file_name() + .ok_or_else(|| { + std::io::Error::new( + std::io::ErrorKind::Other, + format!("unable to get directory name for path {:?}", chain_path), + ) + })? + .to_string_lossy(); + + if !self.network_allowed(&chain_id, &chain_name) { + continue; + } + + for contract_entry in chain_path.read_dir()? { + let contract_entry = contract_entry?; + + let contract_path = contract_entry.path(); + if !contract_path.is_file() { + continue; + } + + let mut contract_name = contract_path + .file_name() + .ok_or_else(|| { + std::io::Error::new( + std::io::ErrorKind::Other, + format!("unable to get file name for path {:?}", contract_path), + ) + })? + .to_string_lossy() + .into_owned(); + + if !contract_name.ends_with(".json") { + continue; + } + + contract_name.truncate(contract_name.len() - ".json".len()); + + if !self.contract_allowed(&contract_name) { + continue; + } + + let HardHatContract { + address, + transaction_hash, + mut contract, + } = { + let file = File::open(contract_path)?; + let reader = BufReader::new(file); + from_reader(reader)? + }; + + contract.name = contract_name; + + self.add_contract_to_artifact( + &mut artifact, + contract, + chain_id.clone(), + address, + transaction_hash, + )?; + } + } + + Ok(artifact) } fn load_artifact( &self, + format: Format, origin: impl ToString, source: T, single_loader: impl FnOnce(T) -> serde_json::Result, @@ -183,7 +357,7 @@ impl HardHatLoader { let mut artifact = Artifact::with_origin(origin); - match self.format { + match format { Format::SingleExport => { let loaded = single_loader(source)?; self.fill_artifact(&mut artifact, loaded)? @@ -202,37 +376,27 @@ impl HardHatLoader { artifact: &mut Artifact, export: HardHatExport, ) -> Result<(), ArtifactError> { - if self.allowed(&export.chain_id, &export.chain_name) { - for (name, contract_with_address) in export.contracts { - let ContractWithAddress { + if self.network_allowed(&export.chain_id, &export.chain_name) { + for (name, contract) in export.contracts { + let HardHatContract { address, + transaction_hash, mut contract, - } = contract_with_address; + } = contract; - contract.name = name; - - let mut contract = match artifact.get_mut(&contract.name) { - Some(existing_contract) => { - if existing_contract.abi != contract.abi { - return Err(ArtifactError::AbiMismatch(contract.name)); - } + if !self.contract_allowed(&name) { + continue; + } - existing_contract - } - None => artifact.insert(contract).inserted_contract, - }; + contract.name = name; - let existing_network = contract.networks_mut().insert( + self.add_contract_to_artifact( + artifact, + contract, export.chain_id.clone(), - Network { - address, - deployment_information: None, - }, - ); - - if existing_network.is_some() { - return Err(ArtifactError::DuplicateChain(export.chain_id)); - } + address, + transaction_hash, + )?; } } @@ -253,27 +417,82 @@ impl HardHatLoader { Ok(()) } - fn allowed(&self, chain_id: &str, chain_name: &str) -> bool { - !self.explicitly_denied(chain_id, chain_name) + fn add_contract_to_artifact( + &self, + artifact: &mut Artifact, + contract: Contract, + chain_id: String, + address: Address, + transaction_hash: Option, + ) -> Result<(), ArtifactError> { + let mut contract = match artifact.get_mut(&contract.name) { + Some(existing_contract) => { + if existing_contract.abi != contract.abi { + return Err(ArtifactError::AbiMismatch(contract.name)); + } + + existing_contract + } + None => artifact.insert(contract).inserted_contract, + }; + + let deployment_information = transaction_hash.map(DeploymentInformation::TransactionHash); + + if contract.networks.contains_key(&chain_id) { + Err(ArtifactError::DuplicateChain(chain_id)) + } else { + contract.networks_mut().insert( + chain_id, + Network { + address, + deployment_information, + }, + ); + + Ok(()) + } + } + + fn contract_allowed(&self, name: &str) -> bool { + !self.contract_explicitly_denied(name) + && (self.contracts_allow_list.is_empty() || self.contract_explicitly_allowed(name)) + } + + fn contract_explicitly_allowed(&self, name: &str) -> bool { + self.contracts_allow_list.iter().any(|x| x == name) + } + + fn contract_explicitly_denied(&self, name: &str) -> bool { + self.contracts_deny_list.iter().any(|x| x == name) + } + + fn network_allowed(&self, chain_id: &str, chain_name: &str) -> bool { + !self.network_explicitly_denied(chain_id, chain_name) && (self.networks_allow_list.is_empty() - || self.explicitly_allowed(chain_id, chain_name)) + || self.network_explicitly_allowed(chain_id, chain_name)) } - fn explicitly_allowed(&self, chain_id: &str, chain_name: &str) -> bool { + fn network_explicitly_allowed(&self, chain_id: &str, chain_name: &str) -> bool { self.networks_allow_list .iter() .any(|x| x.matches(chain_id, chain_name)) } - fn explicitly_denied(&self, chain_id: &str, chain_name: &str) -> bool { + fn network_explicitly_denied(&self, chain_id: &str, chain_name: &str) -> bool { self.networks_deny_list .iter() .any(|x| x.matches(chain_id, chain_name)) } } +impl Default for HardHatLoader { + fn default() -> Self { + HardHatLoader::new() + } +} + /// Artifact format. -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone, Debug, Eq, PartialEq)] pub enum Format { /// Contracts for a single network. Generated with `hardhat export`. SingleExport, @@ -313,13 +532,14 @@ struct HardHatExport { chain_name: String, #[serde(rename = "chainId")] chain_id: String, - - contracts: HashMap, + contracts: HashMap, } #[derive(Deserialize)] -struct ContractWithAddress { +struct HardHatContract { address: Address, + #[serde(rename = "transactionHash")] + transaction_hash: Option, #[serde(flatten)] contract: Contract, } @@ -327,6 +547,7 @@ struct ContractWithAddress { #[cfg(test)] mod test { use super::*; + use std::path::PathBuf; use web3::ethabi::ethereum_types::BigEndianHash; use web3::types::{H256, U256}; @@ -351,8 +572,8 @@ mod test { } "#; - let artifact = HardHatLoader::new(Format::SingleExport) - .load_from_str(json) + let artifact = HardHatLoader::new() + .load_from_str(Format::SingleExport, json) .unwrap(); assert_eq!(artifact.len(), 2); @@ -368,40 +589,40 @@ mod test { assert_eq!(b.networks["1"].address, address(0xB)); } - #[test] - fn load_multi() { - let json = r#" - { - "1": { - "mainnet": { - "name": "mainnet", - "chainId": "1", - "contracts": { - "A": { - "address": "0x000000000000000000000000000000000000000A" - }, - "B": { - "address": "0x000000000000000000000000000000000000000B" - } - } + static MULTI_EXPORT: &str = r#" + { + "1": { + "mainnet": { + "name": "mainnet", + "chainId": "1", + "contracts": { + "A": { + "address": "0x000000000000000000000000000000000000000A" + }, + "B": { + "address": "0x000000000000000000000000000000000000000B" } - }, - "4": { - "rinkeby": { - "name": "rinkeby", - "chainId": "4", - "contracts": { - "A": { - "address": "0x00000000000000000000000000000000000000AA" - } - } + } + } + }, + "4": { + "rinkeby": { + "name": "rinkeby", + "chainId": "4", + "contracts": { + "A": { + "address": "0x00000000000000000000000000000000000000AA" } } } - "#; + } + } + "#; - let artifact = HardHatLoader::new(Format::MultiExport) - .load_from_str(json) + #[test] + fn load_multi() { + let artifact = HardHatLoader::new() + .load_from_str(Format::MultiExport, MULTI_EXPORT) .unwrap(); assert_eq!(artifact.len(), 2); @@ -445,8 +666,8 @@ mod test { } "#; - let artifact = HardHatLoader::new(Format::MultiExport) - .load_from_str(json) + let artifact = HardHatLoader::new() + .load_from_str(Format::MultiExport, json) .unwrap(); assert_eq!(artifact.len(), 2); @@ -489,7 +710,7 @@ mod test { } "#; - let err = HardHatLoader::new(Format::MultiExport).load_from_str(json); + let err = HardHatLoader::new().load_from_str(Format::MultiExport, json); match err { Err(ArtifactError::DuplicateChain(chain_id)) => assert_eq!(chain_id, "1"), @@ -549,7 +770,7 @@ mod test { } "#; - let err = HardHatLoader::new(Format::MultiExport).load_from_str(json); + let err = HardHatLoader::new().load_from_str(Format::MultiExport, json); match err { Err(ArtifactError::AbiMismatch(name)) => assert_eq!(name, "A"), @@ -607,10 +828,10 @@ mod test { #[test] fn load_multi_allow_by_name() { - let artifact = HardHatLoader::new(Format::MultiExport) - .allow_by_name("mainnet") - .allow_by_name("rinkeby") - .load_from_str(NETWORK_CONFLICTS) + let artifact = HardHatLoader::new() + .allow_network_by_name("mainnet") + .allow_network_by_name("rinkeby") + .load_from_str(Format::MultiExport, NETWORK_CONFLICTS) .unwrap(); assert_eq!(artifact.len(), 1); @@ -624,9 +845,9 @@ mod test { #[test] fn load_multi_allow_by_chain_id() { - let artifact = HardHatLoader::new(Format::MultiExport) - .allow_by_chain_id("4") - .load_from_str(NETWORK_CONFLICTS) + let artifact = HardHatLoader::new() + .allow_network_by_chain_id("4") + .load_from_str(Format::MultiExport, NETWORK_CONFLICTS) .unwrap(); assert_eq!(artifact.len(), 1); @@ -639,9 +860,9 @@ mod test { #[test] fn load_multi_deny_by_name() { - let artifact = HardHatLoader::new(Format::MultiExport) - .deny_by_name("mainnet_beta") - .load_from_str(NETWORK_CONFLICTS) + let artifact = HardHatLoader::new() + .deny_network_by_name("mainnet_beta") + .load_from_str(Format::MultiExport, NETWORK_CONFLICTS) .unwrap(); assert_eq!(artifact.len(), 1); @@ -655,9 +876,9 @@ mod test { #[test] fn load_multi_deny_by_chain_id() { - let artifact = HardHatLoader::new(Format::MultiExport) - .deny_by_chain_id("1") - .load_from_str(NETWORK_CONFLICTS) + let artifact = HardHatLoader::new() + .deny_network_by_chain_id("1") + .load_from_str(Format::MultiExport, NETWORK_CONFLICTS) .unwrap(); assert_eq!(artifact.len(), 1); @@ -667,4 +888,107 @@ mod test { assert_eq!(a.networks.len(), 1); assert_eq!(a.networks["4"].address, address(0xBA)); } + + #[test] + fn load_multi_allow_contract_name() { + let artifact = HardHatLoader::new() + .allow_contract("A") + .load_from_str(Format::MultiExport, MULTI_EXPORT) + .unwrap(); + + assert_eq!(artifact.len(), 1); + + let a = artifact.get("A").unwrap(); + assert_eq!(a.name, "A"); + assert_eq!(a.networks.len(), 2); + assert_eq!(a.networks["1"].address, address(0xA)); + assert_eq!(a.networks["4"].address, address(0xAA)); + + let artifact = HardHatLoader::new() + .allow_contract("X") + .load_from_str(Format::MultiExport, MULTI_EXPORT) + .unwrap(); + + assert_eq!(artifact.len(), 0); + } + + #[test] + fn load_multi_deny_contract_name() { + let artifact = HardHatLoader::new() + .deny_contract("A") + .load_from_str(Format::MultiExport, MULTI_EXPORT) + .unwrap(); + + assert_eq!(artifact.len(), 1); + + let a = artifact.get("B").unwrap(); + assert_eq!(a.name, "B"); + assert_eq!(a.networks.len(), 1); + assert_eq!(a.networks["1"].address, address(0xB)); + + let artifact = HardHatLoader::new() + .deny_contract("X") + .load_from_str(Format::MultiExport, MULTI_EXPORT) + .unwrap(); + + assert_eq!(artifact.len(), 2); + + let a = artifact.get("A").unwrap(); + assert_eq!(a.name, "A"); + assert_eq!(a.networks.len(), 2); + assert_eq!(a.networks["1"].address, address(0xA)); + assert_eq!(a.networks["4"].address, address(0xAA)); + + let b = artifact.get("B").unwrap(); + assert_eq!(b.name, "B"); + assert_eq!(b.networks.len(), 1); + assert_eq!(b.networks["1"].address, address(0xB)); + } + + fn hardhat_dir() -> PathBuf { + let mut path = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + path.push("../examples/hardhat/deployments"); + path + } + + #[test] + fn load_from_directory() { + let artifact = HardHatLoader::new() + .load_from_directory(hardhat_dir()) + .unwrap(); + + assert_eq!(artifact.len(), 1); + + let a = artifact.get("DeployedContract").unwrap(); + assert_eq!(a.name, "DeployedContract"); + assert_eq!(a.networks.len(), 2); + assert_eq!( + a.networks["4"].address, + "0x4E29B76eC7d20c58A6B156CB464594a4ae39FdEd" + .parse() + .unwrap() + ); + assert_eq!( + a.networks["4"].deployment_information, + Some(DeploymentInformation::TransactionHash( + "0x0122d15a8d394b8f9e45c15b7d3e5365bbf7122a15952246676e2fe7eb858f35" + .parse() + .unwrap() + )) + ); + assert_eq!( + a.networks["1337"].address, + "0x29BE0588389993e7064C21f00761303eb51373F5" + .parse() + .unwrap() + ); + assert_eq!( + a.networks["1337"].deployment_information, + Some(DeploymentInformation::TransactionHash( + "0xe0631d7f749fe73f94e59f6e25ff9b925980e8e29ed67b8f862ec76a783ea06e" + .parse() + .unwrap() + )) + ); + } } diff --git a/ethcontract-common/src/artifact/truffle.rs b/ethcontract-common/src/artifact/truffle.rs index b963ba31..c79a2f57 100644 --- a/ethcontract-common/src/artifact/truffle.rs +++ b/ethcontract-common/src/artifact/truffle.rs @@ -13,7 +13,7 @@ use crate::artifact::Artifact; use crate::errors::ArtifactError; use crate::Contract; -use serde_json::{from_reader, from_slice, from_str, from_value, Value}; +use serde_json::{from_reader, from_slice, from_str, from_value, to_string, Value}; use std::fs::File; use std::io::{BufReader, Read}; use std::path::Path; @@ -32,7 +32,7 @@ pub struct TruffleLoader { } impl TruffleLoader { - /// Create a new truffle loader. + /// Creates a new truffle loader. pub fn new() -> Self { TruffleLoader { origin: None, @@ -40,7 +40,7 @@ impl TruffleLoader { } } - /// Create a new truffle loader and set an override for artifact's origins. + /// Creates a new truffle loader and sets an override for artifact's origins. pub fn with_origin(origin: impl Into) -> Self { TruffleLoader { origin: Some(origin.into()), @@ -48,7 +48,7 @@ impl TruffleLoader { } } - /// Set new override for artifact's origin. See [`origin`] for more info. + /// Sets new override for artifact's origin. See [`origin`] for more info. /// /// [`origin`]: #structfield.origin pub fn origin(mut self, origin: impl Into) -> Self { @@ -56,7 +56,7 @@ impl TruffleLoader { self } - /// Set new override for artifact's name. See [`name`] for more info. + /// Sets new override for artifact's name. See [`name`] for more info. /// /// [`name`]: #structfield.name pub fn name(mut self, name: impl Into) -> Self { @@ -85,10 +85,11 @@ impl TruffleLoader { } /// Loads an artifact from disk. - pub fn load_from_file(&self, p: &Path) -> Result { - let file = File::open(p)?; + pub fn load_from_file(&self, p: impl AsRef) -> Result { + let path = p.as_ref(); + let file = File::open(path)?; let reader = BufReader::new(file); - self.load_artifact(p.display(), reader, from_reader) + self.load_artifact(path.display(), reader, from_reader) } /// Loads a contract from a loaded JSON value. @@ -112,8 +113,9 @@ impl TruffleLoader { } /// Loads a contract from disk. - pub fn load_contract_from_file(&self, p: &Path) -> Result { - let file = File::open(p)?; + pub fn load_contract_from_file(&self, p: impl AsRef) -> Result { + let path = p.as_ref(); + let file = File::open(path)?; let reader = BufReader::new(file); self.load_contract(reader, from_reader) } @@ -143,6 +145,11 @@ impl TruffleLoader { Ok(contract) } + + /// Serializes a single contract. + pub fn save_to_string(contract: &Contract) -> Result { + to_string(contract).map_err(Into::into) + } } impl Default for TruffleLoader { diff --git a/ethcontract-common/src/bytecode.rs b/ethcontract-common/src/bytecode.rs index e24c116a..dcb5b033 100644 --- a/ethcontract-common/src/bytecode.rs +++ b/ethcontract-common/src/bytecode.rs @@ -4,7 +4,7 @@ use crate::errors::{BytecodeError, LinkError}; use serde::de::{Error as DeError, Visitor}; -use serde::{Deserialize, Deserializer}; +use serde::{Deserialize, Deserializer, Serialize}; use std::collections::HashSet; use std::fmt::{Formatter, Result as FmtResult}; use std::mem; @@ -13,16 +13,12 @@ use web3::types::{Address, Bytes}; /// The string representation of the byte code. Note that this must be a /// `String` since `solc` linking requires string manipulation of the /// bytecode string representation. -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Default, Serialize)] pub struct Bytecode(String); impl Bytecode { - /// Read hex bytecode representation from a string slice. - pub fn from_hex_str(s: S) -> Result - where - S: AsRef, - { - let s = s.as_ref(); + /// Reads hex bytecode representation from a string slice. + pub fn from_hex_str(s: &str) -> Result { if s.is_empty() { // special case where we have an empty string byte code. return Ok(Bytecode::default()); @@ -53,7 +49,7 @@ impl Bytecode { Ok(Bytecode(s.to_string())) } - /// Link a library into the current bytecode. + /// Links a library into the current bytecode. /// /// # Panics /// @@ -81,7 +77,7 @@ impl Bytecode { Ok(()) } - /// Convert a bytecode into its byte representation. + /// Converts a bytecode into its byte representation. pub fn to_bytes(&self) -> Result { match self.undefined_libraries().next() { Some(library) => Err(LinkError::UndefinedLibrary(library.to_string())), @@ -89,7 +85,7 @@ impl Bytecode { } } - /// Iterator over all libraries remaining in the bytecode. + /// Returns an iterator over all libraries remaining in the bytecode. pub fn undefined_libraries(&self) -> LibIter<'_> { LibIter { cursor: &self.0, @@ -108,7 +104,7 @@ impl Bytecode { } } -/// internal type for iterating though a bytecode's string code blocks skipping +/// Internal type for iterating though a bytecode's string code blocks skipping /// the `solc` linker placeholders. struct CodeIter<'a>(&'a str); @@ -185,14 +181,6 @@ impl<'de> Visitor<'de> for BytecodeVisitor { { Bytecode::from_hex_str(v).map_err(E::custom) } - - fn visit_string(self, v: String) -> Result - where - E: DeError, - { - // TODO(nlordell): try to reuse this allocation - self.visit_str(&v) - } } fn to_fixed_hex(address: &Address) -> String { @@ -245,7 +233,7 @@ mod tests { let address_encoded = [0u8; 20]; let name = "name"; let placeholder = format!("__{:_<38}", name); - let mut bytecode = Bytecode::from_hex_str(format!( + let mut bytecode = Bytecode::from_hex_str(&format!( "0x61{}{}61{}", placeholder, placeholder, placeholder )) @@ -265,7 +253,7 @@ mod tests { fn bytecode_link_fail() { let address = Address::zero(); let placeholder = format!("__{:_<38}", "name0"); - let mut bytecode = Bytecode::from_hex_str(format!( + let mut bytecode = Bytecode::from_hex_str(&format!( "0x61{}{}61{}", placeholder, placeholder, placeholder )) diff --git a/ethcontract-common/src/contract.rs b/ethcontract-common/src/contract.rs index 22f0b095..ceab9cdc 100644 --- a/ethcontract-common/src/contract.rs +++ b/ethcontract-common/src/contract.rs @@ -3,14 +3,14 @@ use crate::errors::ArtifactError; use crate::Abi; use crate::{bytecode::Bytecode, DeploymentInformation}; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::fs::File; use std::path::Path; use web3::types::Address; /// Represents a contract data. -#[derive(Clone, Debug, Deserialize)] +#[derive(Clone, Debug, Serialize, Deserialize)] #[serde(default = "Contract::empty")] pub struct Contract { /// The contract name. Unnamed contracts have an empty string as their name. @@ -31,8 +31,13 @@ pub struct Contract { impl Contract { /// Creates an empty contract instance. pub fn empty() -> Self { + Contract::with_name(String::default()) + } + + /// Creates an empty contract instance with the given name. + pub fn with_name(name: impl Into) -> Self { Contract { - name: String::new(), + name: name.into(), abi: Abi { constructor: None, functions: HashMap::new(), @@ -47,7 +52,7 @@ impl Contract { } } - /// Parse a truffle artifact from JSON. + /// Parses a truffle artifact from JSON. pub fn from_json(json: S) -> Result where S: AsRef, @@ -68,7 +73,7 @@ impl Contract { } /// A contract's network configuration. -#[derive(Clone, Debug, Deserialize)] +#[derive(Clone, Debug, Serialize, Deserialize)] pub struct Network { /// The address at which the contract is deployed on this network. pub address: Address, @@ -78,7 +83,7 @@ pub struct Network { } /// A contract's documentation. -#[derive(Clone, Debug, Default, Deserialize)] +#[derive(Clone, Debug, Default, Serialize, Deserialize)] pub struct Documentation { /// Contract documentation pub details: Option, @@ -86,7 +91,7 @@ pub struct Documentation { pub methods: HashMap, } -#[derive(Clone, Debug, Default, Deserialize)] +#[derive(Clone, Debug, Default, Serialize, Deserialize)] /// A documentation entry. pub struct DocEntry { /// The documentation details for this entry. diff --git a/ethcontract-common/src/hash.rs b/ethcontract-common/src/hash.rs index e1207e55..a14e5cb0 100644 --- a/ethcontract-common/src/hash.rs +++ b/ethcontract-common/src/hash.rs @@ -20,7 +20,7 @@ where /// data in order to select which Solidity method will be called. pub type H32 = [u8; 4]; -/// Calculate the function selector as per the contract ABI specification. This +/// Calculates the function selector as per the contract ABI specification. This /// is definied as the first 4 bytes of the Keccak256 hash of the function /// signature. pub fn function_selector(signature: S) -> H32 diff --git a/ethcontract-common/src/lib.rs b/ethcontract-common/src/lib.rs index d0e41ee6..3b05abb3 100644 --- a/ethcontract-common/src/lib.rs +++ b/ethcontract-common/src/lib.rs @@ -14,12 +14,12 @@ pub use crate::abiext::FunctionExt; pub use crate::bytecode::Bytecode; pub use crate::contract::Contract; pub use ethabi::{self as abi, Contract as Abi}; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; pub use web3::types::Address; pub use web3::types::H256 as TransactionHash; /// Information about when a contract instance was deployed -#[derive(Debug, Clone, Copy, PartialEq, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)] #[serde(untagged)] pub enum DeploymentInformation { /// The block at which the contract was deployed diff --git a/ethcontract-derive/Cargo.toml b/ethcontract-derive/Cargo.toml index c6424098..9a44e89f 100644 --- a/ethcontract-derive/Cargo.toml +++ b/ethcontract-derive/Cargo.toml @@ -15,6 +15,7 @@ Proc macro for generating type-safe bindings to Ethereum smart contracts. proc-macro = true [dependencies] +anyhow = "1.0" ethcontract-common = { version = "0.12.2", path = "../ethcontract-common" } ethcontract-generate = { version = "0.12.2", path = "../ethcontract-generate" } proc-macro2 = "1.0" diff --git a/ethcontract-derive/src/lib.rs b/ethcontract-derive/src/lib.rs index cbf85405..f819b87b 100644 --- a/ethcontract-derive/src/lib.rs +++ b/ethcontract-derive/src/lib.rs @@ -8,14 +8,18 @@ extern crate proc_macro; mod spanned; use crate::spanned::{ParseInner, Spanned}; +use anyhow::{anyhow, Result}; use ethcontract_common::abi::{Function, Param, ParamType}; use ethcontract_common::abiext::{FunctionExt, ParamTypeExt}; -use ethcontract_generate::{parse_address, Address, Builder}; +use ethcontract_common::artifact::truffle::TruffleLoader; +use ethcontract_common::contract::Network; +use ethcontract_common::Address; +use ethcontract_generate::loaders::{HardHatFormat, HardHatLoader}; +use ethcontract_generate::{parse_address, ContractBuilder, Source}; use proc_macro::TokenStream; use proc_macro2::{Span, TokenStream as TokenStream2}; use quote::{quote, ToTokens as _}; use std::collections::HashSet; -use std::error::Error; use syn::ext::IdentExt; use syn::parse::{Error as ParseError, Parse, ParseStream, Result as ParseResult}; use syn::{ @@ -23,69 +27,166 @@ use syn::{ Token, Visibility, }; -/// Proc macro to generate type-safe bindings to a contract. This macro accepts -/// a path to a Truffle artifact JSON file. Note that this path is rooted in -/// the crate's root `CARGO_MANIFEST_DIR`. +/// Proc macro to generate type-safe bindings to a contract. +/// +/// This macro accepts a path to an artifact JSON file. Note that this path +/// is rooted in the crate's root `CARGO_MANIFEST_DIR`: /// /// ```ignore -/// ethcontract::contract!("build/contracts/MyContract.json"); +/// contract!("build/contracts/WETH9.json"); /// ``` /// /// Alternatively, other sources may be used, for full details consult the -/// `ethcontract-generate::source` documentation. Some basic examples: +/// [`ethcontract_generate::source`] documentation. Some basic examples: /// /// ```ignore /// // HTTP(S) source -/// ethcontract::contract!("https://my.domain.local/path/to/contract.json") -/// // Etherscan.io -/// ethcontract::contract!("etherscan:0x0001020304050607080910111213141516171819"); -/// ethcontract::contract!("https://etherscan.io/address/0x0001020304050607080910111213141516171819"); -/// // npmjs -/// ethcontract::contract!("npm:@org/package@1.0.0/path/to/contract.json") +/// contract!("https://my.domain.local/path/to/contract.json") +/// +/// // Etherscan source +/// contract!("etherscan:0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"); +/// +/// // NPM package source +/// contract!("npm:@openzeppelin/contracts@4.2.0/build/contracts/IERC20.json") /// ``` /// /// Note that Etherscan rate-limits requests to their API, to avoid this an /// `ETHERSCAN_API_KEY` environment variable can be set. If it is, it will use /// that API key when retrieving the contract ABI. /// -/// Currently the proc macro accepts additional parameters to configure some -/// aspects of the code generation. Specifically it accepts: -/// - `crate`: The name of the `ethcontract` crate. This is useful if the crate -/// was renamed in the `Cargo.toml` for whatever reason. -/// - `contract`: Override the contract name that is used for the generated -/// type. This is required when using sources that do not provide the contract -/// name in the artifact JSON such as Etherscan. -/// - `mod`: The name of the contract module to place generated code in. Note -/// that the root contract type gets re-exported in the context where the -/// macro was invoked. This defaults to the contract name converted into snake -/// case. -/// - `deployments`: A list of additional addresses of deployed contract for -/// specified network IDs. This mapping allows `MyContract::deployed` to work -/// for networks that are not included in the Truffle artifact's `networks` -/// property. Note that deployments defined this way **take precedence** over -/// the ones defined in the Truffle artifact. This parameter is intended to be -/// used to manually specify contract addresses for test environments, be it -/// testnet addresses that may defer from the originally published artifact or -/// deterministic contract addresses on local development nodes. -/// - `methods`: A list of mappings from method signatures to method names -/// allowing methods names to be explicitely set for contract methods. This -/// also provides a workaround for generating code for contracts with multiple -/// methods with the same name. -/// - `event_derives`: A list of additional derives that should be added to +/// Currently, the proc macro accepts additional parameters to configure some +/// aspects of the code generation. Specifically it accepts the following. +/// +/// - `format`: format of the artifact. +/// +/// Available values are: +/// +/// - `truffle` (default) to use [truffle loader]; +/// - `hardhat` to use [hardhat loader] in [single export mode]; +/// - `hardhat_multi` to use hardhat loader in [multi export mode]. +/// +/// Note that hardhat artifacts export multiple contracts. You'll have to use +/// `contract` parameter to specify which contract to generate bindings to. +/// +/// [truffle loader]: ethcontract_common::artifact::truffle::TruffleLoader +/// [hardhat loader]: ethcontract_common::artifact::hardhat::HardHatLoader +/// [single export mode]: ethcontract_common::artifact::hardhat::Format::SingleExport +/// [multi export mode]: ethcontract_common::artifact::hardhat::Format::MultiExport +/// +/// - `contract`: name of the contract we're generating bindings to. +/// +/// If an artifact exports a single unnamed artifact, this parameter +/// can be used to set its name. For example: +/// +/// ```ignore +/// contract!( +/// "etherscan:0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", +/// contract = WETH9 +/// ); +/// ``` +/// +/// Otherwise, it can be used to specify which contract we're generating +/// bindings to. Additionally, you can rename contract class by specifying +/// a new name after the `as` keyword. For example: +/// +/// ```ignore +/// contract!( +/// "build/contracts.json", +/// format = hardhat_multi, +/// contract = WETH9 as WrappedEthereum +/// ); +/// ``` +/// +/// - `mod`: name of the contract module to place generated code in. +/// +/// This defaults to the contract name converted into snake case. +/// +/// Note that the root contract type gets re-exported in the context where the +/// macro was invoked. +/// +/// Example: +/// +/// ```ignore +/// contract!( +/// "build/contracts/WETH9.json", +/// contract = WETH9 as WrappedEthereum, +/// mod = weth, +/// ); +/// ``` +/// +/// - `deployments`: a list of additional addresses of deployed contract for +/// specified network IDs. +/// +/// This mapping allows generated contract's `deployed` function to work +/// with networks that are not included in the artifact's deployment +/// information. +/// +/// Note that deployments defined this way **take precedence** over +/// the ones defined in the artifact. +/// +/// This parameter is intended to be used to manually specify contract +/// addresses for test environments, be it testnet addresses that may defer +/// from the originally published artifact or deterministic contract +/// addresses on local development nodes. +/// +/// Example: +/// +/// ```ignore +/// contract!( +/// "build/contracts/WETH9.json", +/// deployments { +/// 4 => "0x000102030405060708090a0b0c0d0e0f10111213", +/// 5777 => "0x0123456789012345678901234567890123456789", +/// }, +/// ); +/// ``` +/// +/// - `methods`: a list of mappings from method signatures to method names +/// allowing methods names to be explicitly set for contract methods. +/// +/// This also provides a workaround for generating code for contracts +/// with multiple methods with the same name. +/// +/// Example: +/// +/// ```ignore +/// contract!( +/// "build/contracts/WETH9.json", +/// methods { +/// approve(Address, U256) as set_allowance +/// }, +/// ); +/// ``` +/// +/// - `event_derives`: a list of additional derives that should be added to /// contract event structs and enums. /// -/// Additionally, the ABI source can be preceeded by a visibility modifier such +/// Example: +/// +/// ```ignore +/// contract!( +/// "build/contracts/WETH9.json", +/// event_derives (serde::Deserialize, serde::Serialize), +/// ); +/// ``` +/// +/// - `crate`: the name of the `ethcontract` crate. This is useful if the crate +/// was renamed in the `Cargo.toml` for whatever reason. +/// +/// Additionally, the ABI source can be preceded by a visibility modifier such /// as `pub` or `pub(crate)`. This visibility modifier is applied to both the /// generated module and contract re-export. If no visibility modifier is /// provided, then none is used for the generated code as well, making the /// module and contract private to the scope where the macro was invoked. /// +/// Full example: +/// /// ```ignore -/// ethcontract::contract!( -/// pub(crate) "build/contracts/MyContract.json", -/// crate = ethcontract_rename, -/// mod = my_contract_instance, -/// contract = MyContractInstance, +/// contract!( +/// pub(crate) "build/contracts.json", +/// format = hardhat_multi, +/// contract = WETH9 as WrappedEthereum, +/// mod = weth, /// deployments { /// 4 => "0x000102030405060708090a0b0c0d0e0f10111213", /// 5777 => "0x0123456789012345678901234567890123456789", @@ -94,6 +195,7 @@ use syn::{ /// myMethod(uint256,bool) as my_renamed_method; /// }, /// event_derives (serde::Deserialize, serde::Serialize), +/// crate = ethcontract_renamed, /// ); /// ``` /// @@ -102,15 +204,95 @@ use syn::{ #[proc_macro] pub fn contract(input: TokenStream) -> TokenStream { let args = parse_macro_input!(input as Spanned); - let span = args.span(); - expand(args.into_inner()) + generate(args.into_inner()) .unwrap_or_else(|e| SynError::new(span, format!("{:?}", e)).to_compile_error()) .into() } -fn expand(args: ContractArgs) -> Result> { - Ok(args.into_builder()?.generate()?.into_tokens()) +fn generate(args: ContractArgs) -> Result { + let mut artifact_format = Format::Truffle; + let mut contract_name = None; + + let mut builder = ContractBuilder::new(); + builder.visibility_modifier = args.visibility; + + for parameter in args.parameters.into_iter() { + match parameter { + Parameter::Mod(name) => builder.contract_mod_override = Some(name), + Parameter::Contract(name, alias) => { + builder.contract_name_override = alias.or_else(|| Some(name.clone())); + contract_name = Some(name); + } + Parameter::Crate(name) => builder.runtime_crate_name = name, + Parameter::Deployments(deployments) => { + for deployment in deployments { + builder.networks.insert( + deployment.network_id.to_string(), + Network { + address: deployment.address, + deployment_information: None, + }, + ); + } + } + Parameter::Methods(methods) => { + for method in methods { + builder + .method_aliases + .insert(method.signature, method.alias); + } + } + Parameter::EventDerives(derives) => { + builder.event_derives.extend(derives); + } + Parameter::Format(format) => artifact_format = format, + }; + } + + let source = Source::parse(&args.artifact_path)?; + let json = source.artifact_json()?; + + match artifact_format { + Format::Truffle => { + let mut contract = TruffleLoader::new().load_contract_from_str(&json)?; + + if let Some(contract_name) = contract_name { + if contract.name.is_empty() { + contract.name = contract_name; + } else if contract.name != contract_name { + return Err(anyhow!( + "there is no contract '{}' in artifact '{}'", + contract_name, + args.artifact_path + )); + } + } + + Ok(builder.generate(&contract)?.into_tokens()) + } + + Format::HardHat(format) => { + let artifact = HardHatLoader::new().load_from_str(format, &json)?; + + if let Some(contract_name) = contract_name { + if let Some(contract) = artifact.get(&contract_name) { + Ok(builder.generate(contract)?.into_tokens()) + } else { + Err(anyhow!( + "there is no contract '{}' in artifact '{}'", + contract_name, + args.artifact_path + )) + } + } else { + Err(anyhow!( + "when using hardhat artifacts, you should specify \ + contract name using 'contract' parameter" + )) + } + } + } } /// Contract procedural macro arguments. @@ -121,34 +303,6 @@ struct ContractArgs { parameters: Vec, } -impl ContractArgs { - fn into_builder(self) -> Result> { - let mut builder = Builder::from_source_url(&self.artifact_path)? - .with_visibility_modifier(self.visibility); - - for parameter in self.parameters.into_iter() { - builder = match parameter { - Parameter::Mod(name) => builder.with_contract_mod_override(Some(name)), - Parameter::Contract(name) => builder.with_contract_name_override(Some(name)), - Parameter::Crate(name) => builder.with_runtime_crate_name(name), - Parameter::Deployments(deployments) => { - deployments.into_iter().fold(builder, |builder, d| { - builder.add_deployment(d.network_id, d.address, None) - }) - } - Parameter::Methods(methods) => methods.into_iter().fold(builder, |builder, m| { - builder.add_method_alias(m.signature, m.alias) - }), - Parameter::EventDerives(derives) => derives - .into_iter() - .fold(builder, |builder, derive| builder.add_event_derive(derive)), - }; - } - - Ok(builder) - } -} - impl ParseInner for ContractArgs { fn spanned_parse(input: ParseStream) -> ParseResult<(Span, Self)> { let visibility = match input.parse::()? { @@ -185,15 +339,23 @@ impl ParseInner for ContractArgs { } } +/// Artifact format +#[cfg_attr(test, derive(Debug, Eq, PartialEq))] +enum Format { + Truffle, + HardHat(HardHatFormat), +} + /// A single procedural macro parameter. #[cfg_attr(test, derive(Debug, Eq, PartialEq))] enum Parameter { Mod(String), - Contract(String), + Contract(String, Option), Crate(String), Deployments(Vec), Methods(Vec), EventDerives(Vec), + Format(Format), } impl Parse for Parameter { @@ -210,10 +372,32 @@ impl Parse for Parameter { let name = input.parse::()?.to_string(); Parameter::Mod(name) } + "format" => { + input.parse::()?; + let token = input.parse::()?; + let format = match token.to_string().as_str() { + "truffle" => Format::Truffle, + "hardhat" => Format::HardHat(HardHatFormat::SingleExport), + "hardhat_multi" => Format::HardHat(HardHatFormat::MultiExport), + format => { + return Err(ParseError::new( + token.span(), + format!("unknown format {}", format), + )) + } + }; + Parameter::Format(format) + } "contract" => { input.parse::()?; let name = input.parse::()?.to_string(); - Parameter::Contract(name) + let alias = if input.parse::>()?.is_some() { + Some(input.parse::()?.to_string()) + } else { + None + }; + + Parameter::Contract(name, alias) } "deployments" => { let content; @@ -454,7 +638,7 @@ mod tests { parameters: vec![ Parameter::Crate("foobar".into()), Parameter::Mod("contract".into()), - Parameter::Contract("Contract".into()), + Parameter::Contract("Contract".into(), None), Parameter::Deployments(vec![ deployment(1, "0x000102030405060708090a0b0c0d0e0f10111213"), deployment(4, "0x0123456789012345678901234567890123456789"), @@ -473,6 +657,42 @@ mod tests { ); } + #[test] + fn parse_contract_args_format() { + let args = contract_args!("artifact.json", format = hardhat_multi); + assert_eq!( + args, + ContractArgs { + visibility: None, + artifact_path: "artifact.json".into(), + parameters: vec![Parameter::Format(Format::HardHat( + HardHatFormat::MultiExport + ))], + }, + ); + } + + #[test] + fn parse_contract_args_rename() { + let args = contract_args!("artifact.json", contract = Contract as Renamed); + assert_eq!( + args, + ContractArgs { + visibility: None, + artifact_path: "artifact.json".into(), + parameters: vec![Parameter::Contract( + "Contract".into(), + Some("Renamed".into()) + )], + }, + ); + } + + #[test] + fn unsupported_format_error() { + contract_args_err!("artifact.json", format = yaml); + } + #[test] fn duplicate_network_id_error() { contract_args_err!( diff --git a/ethcontract-generate/README.md b/ethcontract-generate/README.md index 371d26a3..88094c4a 100644 --- a/ethcontract-generate/README.md +++ b/ethcontract-generate/README.md @@ -3,8 +3,9 @@ An alternative API for generating type-safe contract bindings from `build.rs` scripts. Using this method instead of the procedural macro has a couple advantages: -- Proper integration with with RLS and Racer for autocomplete support -- Ability to inspect the generated code + +- proper integration with with RLS and Racer for autocomplete support; +- ability to inspect the generated code. The downside of using the generator API is the requirement of having a build script instead of a macro invocation. @@ -27,19 +28,28 @@ behaviour may occur. Then, in your `build.rs` include the following code: -```rs -use ethcontract_generate::Builder; -use std::env; -use std::path::Path; +```rust +use ethcontract_generate::loaders::TruffleLoader; +use ethcontract_generate::ContractBuilder; fn main() { - let dest = env::var("OUT_DIR").unwrap(); - Builder::new("path/to/truffle/build/contract/Contract.json") - .generate() + // Prepare filesystem paths. + let out_dir = std::env::var("OUT_DIR").unwrap(); + let dest = std::path::Path::new(&out_dir).join("rust_coin.rs"); + + // Load a contract. + let contract = TruffleLoader::new() + .load_contract_from_file("../build/Contract.json") + .unwrap(); + + // Generate bindings for it. + ContractBuilder::new() + .generate(&contract) .unwrap() - .write_to_file(Path::new(&dest).join("rust_coin.rs")) + .write_to_file(dest) .unwrap(); } + ``` ## Relation to `ethcontract-derive` diff --git a/ethcontract-generate/src/contract.rs b/ethcontract-generate/src/generate.rs similarity index 61% rename from ethcontract-generate/src/contract.rs rename to ethcontract-generate/src/generate.rs index 8e35f4b9..b5c7340d 100644 --- a/ethcontract-generate/src/contract.rs +++ b/ethcontract-generate/src/generate.rs @@ -1,5 +1,3 @@ -#![deny(missing_docs)] - //! Crate for generating type-safe bindings to Ethereum smart contracts. This //! crate is intended to be used either indirectly with the `ethcontract` //! crate's `contract` procedural macro or directly from a build script. @@ -10,87 +8,69 @@ mod events; mod methods; mod types; -use crate::util; -use crate::Args; +use crate::{util, ContractBuilder}; use anyhow::{anyhow, Context as _, Result}; -use ethcontract_common::{Address, Contract, DeploymentInformation}; +use ethcontract_common::contract::Network; +use ethcontract_common::Contract; use inflector::Inflector; -use proc_macro2::{Ident, Literal, TokenStream}; +use proc_macro2::{Ident, TokenStream}; use quote::quote; use std::collections::HashMap; use syn::{Path, Visibility}; -pub(crate) struct Deployment { - pub address: Address, - pub deployment_information: Option, -} - /// Internal shared context for generating smart contract bindings. -pub(crate) struct Context { - /// The artifact JSON as string literal. - artifact_json: Literal, +pub(crate) struct Context<'a> { /// The parsed contract. - contract: Contract, + contract: &'a Contract, + /// The identifier for the runtime crate. Usually this is `ethcontract` but /// it can be different if the crate was renamed in the Cargo manifest for /// example. runtime_crate: Ident, + /// The visibility for the generated module and re-exported contract type. visibility: Visibility, + /// The name of the module as an identifier in which to place the contract /// implementation. Note that the main contract type gets re-exported in the /// root. contract_mod: Ident, + /// The contract name as an identifier. contract_name: Ident, + /// Additional contract deployments. - deployments: HashMap, + networks: HashMap, + /// Manually specified method aliases. method_aliases: HashMap, + /// Derives added to event structs and enums. event_derives: Vec, } -impl Context { - /// Create a context from the code generation arguments. - fn from_args(args: Args) -> Result { - let (artifact_json, contract) = { - let artifact_json = args - .artifact_source - .artifact_json() - .context("failed to get artifact JSON")?; - - let contract = Contract::from_json(&artifact_json) - .with_context(|| format!("invalid artifact JSON '{}'", artifact_json)) - .with_context(|| { - format!( - "failed to parse artifact from source {:?}", - args.artifact_source, - ) - })?; - - (Literal::string(&artifact_json), contract) - }; - - let raw_contract_name = if let Some(name) = args.contract_name_override.as_ref() { +impl<'a> Context<'a> { + /// Creates a context from the code generation arguments. + fn from_builder(contract: &'a Contract, builder: ContractBuilder) -> Result { + let raw_contract_name = if let Some(name) = &builder.contract_name_override { name } else if !contract.name.is_empty() { &contract.name } else { return Err(anyhow!( "contract artifact is missing a name, this can happen when \ - using a source that does not provide a contract name such as \ + using a source that does not provide a contract name such as \ Etherscan; in this case the contract must be manually \ specified" )); }; - let runtime_crate = util::ident(&args.runtime_crate_name); - let visibility = match args.visibility_modifier.as_ref() { + let runtime_crate = util::ident(&builder.runtime_crate_name); + let visibility = match &builder.visibility_modifier { Some(vis) => syn::parse_str(vis)?, None => Visibility::Inherited, }; - let contract_mod = if let Some(name) = args.contract_mod_override.as_ref() { + let contract_mod = if let Some(name) = &builder.contract_mod_override { util::ident(name) } else { util::ident(&raw_contract_name.to_snake_case()) @@ -101,7 +81,7 @@ impl Context { // duplicate aliases, the compiler will produce a warning because a // method will be re-defined. let mut method_aliases = HashMap::new(); - for (signature, alias) in args.method_aliases.into_iter() { + for (signature, alias) in builder.method_aliases.into_iter() { let alias = syn::parse_str(&alias)?; if method_aliases.insert(signature.clone(), alias).is_some() { return Err(anyhow!( @@ -111,7 +91,7 @@ impl Context { } } - let event_derives = args + let event_derives = builder .event_derives .iter() .map(|derive| syn::parse_str::(derive)) @@ -119,38 +99,20 @@ impl Context { .context("failed to parse event derives")?; Ok(Context { - artifact_json, contract, runtime_crate, visibility, contract_mod, contract_name, - deployments: args.deployments, + networks: builder.networks, method_aliases, event_derives, }) } } -#[cfg(test)] -impl Default for Context { - fn default() -> Self { - Context { - artifact_json: Literal::string("{}"), - contract: Contract::empty(), - runtime_crate: util::ident("ethcontract"), - visibility: Visibility::Inherited, - contract_mod: util::ident("contract"), - contract_name: util::ident("Contract"), - deployments: HashMap::new(), - method_aliases: HashMap::new(), - event_derives: Vec::new(), - } - } -} - -pub(crate) fn expand(args: Args) -> Result { - let cx = Context::from_args(args)?; +pub(crate) fn expand(contract: &Contract, builder: ContractBuilder) -> Result { + let cx = Context::from_builder(contract, builder)?; let contract = expand_contract(&cx).context("error expanding contract from its ABI")?; Ok(contract) diff --git a/ethcontract-generate/src/contract/common.rs b/ethcontract-generate/src/generate/common.rs similarity index 94% rename from ethcontract-generate/src/contract/common.rs rename to ethcontract-generate/src/generate/common.rs index 3a00cdb7..17f6735f 100644 --- a/ethcontract-generate/src/contract/common.rs +++ b/ethcontract-generate/src/generate/common.rs @@ -1,11 +1,11 @@ -use crate::contract::Context; +use crate::generate::Context; use crate::util::expand_doc; +use ethcontract_common::artifact::truffle::TruffleLoader; use ethcontract_common::{Address, DeploymentInformation}; use proc_macro2::{Literal, TokenStream}; use quote::quote; pub(crate) fn expand(cx: &Context) -> TokenStream { - let artifact_json = &cx.artifact_json; let contract_name = &cx.contract_name; let doc_str = cx @@ -16,15 +16,16 @@ pub(crate) fn expand(cx: &Context) -> TokenStream { .unwrap_or("Generated by `ethcontract`"); let doc = expand_doc(doc_str); - let deployments = cx.deployments.iter().map(|(network_id, deployment)| { - let network_id = Literal::string(&network_id.to_string()); - let address = expand_address(deployment.address); - let deployment_information = - expand_deployment_information(deployment.deployment_information); + let artifact_json = TruffleLoader::save_to_string(cx.contract).unwrap(); + + let deployments = cx.networks.iter().map(|(chain_id, network)| { + let chain_id = Literal::string(chain_id); + let address = expand_address(network.address); + let deployment_information = expand_deployment_information(network.deployment_information); quote! { artifact.networks.insert( - #network_id.to_owned(), + #chain_id.to_owned(), self::ethcontract::common::contract::Network { address: #address, deployment_information: #deployment_information, diff --git a/ethcontract-generate/src/contract/deployment.rs b/ethcontract-generate/src/generate/deployment.rs similarity index 98% rename from ethcontract-generate/src/contract/deployment.rs rename to ethcontract-generate/src/generate/deployment.rs index 0e2eccf7..036b82cb 100644 --- a/ethcontract-generate/src/contract/deployment.rs +++ b/ethcontract-generate/src/generate/deployment.rs @@ -1,4 +1,4 @@ -use crate::contract::{methods, Context}; +use crate::generate::{methods, Context}; use crate::util; use anyhow::{Context as _, Result}; use inflector::Inflector; @@ -17,7 +17,7 @@ pub(crate) fn expand(cx: &Context) -> Result { } fn expand_deployed(cx: &Context) -> TokenStream { - if cx.contract.networks.is_empty() && cx.deployments.is_empty() { + if cx.contract.networks.is_empty() && cx.networks.is_empty() { return quote! {}; } diff --git a/ethcontract-generate/src/contract/events.rs b/ethcontract-generate/src/generate/events.rs similarity index 91% rename from ethcontract-generate/src/contract/events.rs rename to ethcontract-generate/src/generate/events.rs index a9103b94..07549b2c 100644 --- a/ethcontract-generate/src/contract/events.rs +++ b/ethcontract-generate/src/generate/events.rs @@ -1,4 +1,4 @@ -use crate::contract::{types, Context}; +use crate::generate::{types, Context}; use crate::util; use anyhow::Result; use ethcontract_common::abi::{Event, EventParam, Hash, ParamType}; @@ -282,7 +282,7 @@ fn expand_builder_type(event: &Event) -> Result { self } - /// Limit the number of events that can be retrieved by this filter. + /// Limits the number of events that can be retrieved by this filter. /// /// Note that this parameter is non-standard. pub fn limit(mut self, value: usize) -> Self { @@ -290,7 +290,7 @@ fn expand_builder_type(event: &Event) -> Result { self } - /// The polling interval. This is used as the interval between + /// Sets the polling interval. This is used as the interval between /// consecutive `eth_getFilterChanges` calls to get filter updates. pub fn poll_interval(mut self, value: std::time::Duration) -> Self { self.0 = (self.0).poll_interval(value); @@ -557,11 +557,15 @@ fn expand_invalid_data() -> TokenStream { #[cfg(test)] mod tests { use super::*; + use crate::ContractBuilder; use ethcontract_common::abi::{EventParam, ParamType}; + use ethcontract_common::Contract; #[test] fn expand_empty_filters() { - assert_quote!(expand_filters(&Context::default()).unwrap(), {}); + let contract = Contract::with_name("Contract"); + let context = Context::from_builder(&contract, ContractBuilder::new()).unwrap(); + assert_quote!(expand_filters(&context).unwrap(), {}); } #[test] @@ -703,38 +707,39 @@ mod tests { #[test] fn expand_enum_for_all_events() { - let context = { - let mut context = Context::default(); - context.contract.abi.events.insert( - "Foo".into(), - vec![Event { - name: "Foo".into(), - inputs: vec![EventParam { - name: String::new(), - kind: ParamType::Bool, - indexed: false, - }], - anonymous: false, + let mut contract = Contract::with_name("Contract"); + + contract.abi.events.insert( + "Foo".into(), + vec![Event { + name: "Foo".into(), + inputs: vec![EventParam { + name: String::new(), + kind: ParamType::Bool, + indexed: false, }], - ); - context.contract.abi.events.insert( - "Bar".into(), - vec![Event { - name: "Bar".into(), - inputs: vec![EventParam { - name: String::new(), - kind: ParamType::Address, - indexed: false, - }], - anonymous: true, + anonymous: false, + }], + ); + contract.abi.events.insert( + "Bar".into(), + vec![Event { + name: "Bar".into(), + inputs: vec![EventParam { + name: String::new(), + kind: ParamType::Address, + indexed: false, }], - ); - context.event_derives = ["Asdf", "a::B", "a::b::c::D"] - .iter() - .map(|derive| syn::parse_str::(derive).unwrap()) - .collect(); - context - }; + anonymous: true, + }], + ); + + let mut context = Context::from_builder(&contract, ContractBuilder::new()).unwrap(); + + context.event_derives = ["Asdf", "a::B", "a::b::c::D"] + .iter() + .map(|derive| syn::parse_str::(derive).unwrap()) + .collect(); assert_quote!(expand_event_enum(&context), { /// A contract event. @@ -748,34 +753,34 @@ mod tests { #[test] fn expand_parse_log_impl_for_all_events() { - let context = { - let mut context = Context::default(); - context.contract.abi.events.insert( - "Foo".into(), - vec![Event { - name: "Foo".into(), - inputs: vec![EventParam { - name: String::new(), - kind: ParamType::Bool, - indexed: false, - }], - anonymous: false, + let mut contract = Contract::with_name("Contract"); + + contract.abi.events.insert( + "Foo".into(), + vec![Event { + name: "Foo".into(), + inputs: vec![EventParam { + name: String::new(), + kind: ParamType::Bool, + indexed: false, }], - ); - context.contract.abi.events.insert( - "Bar".into(), - vec![Event { - name: "Bar".into(), - inputs: vec![EventParam { - name: String::new(), - kind: ParamType::Address, - indexed: false, - }], - anonymous: true, + anonymous: false, + }], + ); + contract.abi.events.insert( + "Bar".into(), + vec![Event { + name: "Bar".into(), + inputs: vec![EventParam { + name: String::new(), + kind: ParamType::Address, + indexed: false, }], - ); - context - }; + anonymous: true, + }], + ); + + let context = Context::from_builder(&contract, ContractBuilder::new()).unwrap(); let foo_signature = expand_hash(context.contract.abi.event("Foo").unwrap().signature()); let invalid_data = expand_invalid_data(); diff --git a/ethcontract-generate/src/contract/methods.rs b/ethcontract-generate/src/generate/methods.rs similarity index 99% rename from ethcontract-generate/src/contract/methods.rs rename to ethcontract-generate/src/generate/methods.rs index 3154d290..55845480 100644 --- a/ethcontract-generate/src/contract/methods.rs +++ b/ethcontract-generate/src/generate/methods.rs @@ -1,4 +1,4 @@ -use crate::contract::{types, Context}; +use crate::generate::{types, Context}; use crate::util; use anyhow::{anyhow, Context as _, Result}; use ethcontract_common::abi::{Function, Param, StateMutability}; diff --git a/ethcontract-generate/src/contract/types.rs b/ethcontract-generate/src/generate/types.rs similarity index 100% rename from ethcontract-generate/src/contract/types.rs rename to ethcontract-generate/src/generate/types.rs diff --git a/ethcontract-generate/src/lib.rs b/ethcontract-generate/src/lib.rs index 092bc1a7..0c904b70 100644 --- a/ethcontract-generate/src/lib.rs +++ b/ethcontract-generate/src/lib.rs @@ -10,265 +10,219 @@ #[path = "test/macros.rs"] mod test_macros; -mod contract; +pub mod source; + +mod generate; mod rustfmt; -mod source; mod util; pub use crate::source::Source; pub use crate::util::parse_address; + +pub use ethcontract_common::artifact::{Artifact, ContractMut, InsertResult}; + +/// Convenience re-imports so that you don't have to add `ethcontract-common` +/// as a dependency. +pub mod loaders { + pub use ethcontract_common::artifact::hardhat::{ + Format as HardHatFormat, HardHatLoader, NetworkEntry, + }; + pub use ethcontract_common::artifact::truffle::TruffleLoader; +} + use anyhow::Result; -use contract::Deployment; -use ethcontract_common::DeploymentInformation; -pub use ethcontract_common::{Address, TransactionHash}; +use ethcontract_common::contract::Network; +use ethcontract_common::Contract; use proc_macro2::TokenStream; use std::collections::HashMap; use std::fs::File; -use std::io::Write; +use std::io::{BufWriter, Write}; use std::path::Path; -/// Internal global arguments passed to the generators for each individual -/// component that control expansion. -pub(crate) struct Args { - /// The source of the artifact JSON for the contract whose bindings - /// are being generated. - artifact_source: Source, +/// Builder for generating contract code. Note that no code is generated until +/// the builder is finalized with `generate` or `output`. +pub struct ContractBuilder { /// The runtime crate name to use. - runtime_crate_name: String, + pub runtime_crate_name: String, + /// The visibility modifier to use for the generated module and contract /// re-export. - visibility_modifier: Option, + pub visibility_modifier: Option, + /// Override the contract module name that contains the generated code. - contract_mod_override: Option, + pub contract_mod_override: Option, + /// Override the contract name to use for the generated type. - contract_name_override: Option, + pub contract_name_override: Option, + /// Manually specified deployed contract address and transaction hash. - deployments: HashMap, + pub networks: HashMap, + /// Manually specified contract method aliases. - method_aliases: HashMap, + pub method_aliases: HashMap, + /// Derives added to event structs and enums. - event_derives: Vec, + pub event_derives: Vec, + + /// Format generated code sing locally installed copy of `rustfmt`. + pub rustfmt: bool, } -impl Args { - /// Creates a new builder given the path to a contract's artifact - /// JSON file. - pub fn new(source: Source) -> Self { - Args { - artifact_source: source, - runtime_crate_name: "ethcontract".to_owned(), +impl ContractBuilder { + /// Creates a new contract builder with default settings. + pub fn new() -> Self { + ContractBuilder { + runtime_crate_name: "ethcontract".to_string(), visibility_modifier: None, contract_mod_override: None, contract_name_override: None, - deployments: HashMap::new(), - method_aliases: HashMap::new(), - event_derives: Vec::new(), - } - } -} - -/// Internal output options for controlling how the generated code gets -/// serialized to file. -struct SerializationOptions { - /// Format the code using a locally installed copy of `rustfmt`. - rustfmt: bool, -} - -impl Default for SerializationOptions { - fn default() -> Self { - SerializationOptions { rustfmt: true } - } -} - -/// Builder for generating contract code. Note that no code is generated until -/// the builder is finalized with `generate` or `output`. -pub struct Builder { - /// The contract binding generation args. - args: Args, - /// The serialization options. - options: SerializationOptions, -} - -impl Builder { - /// Creates a new builder given the path to a contract's artifact - /// JSON file. - pub fn new

(artifact_path: P) -> Self - where - P: AsRef, - { - Builder::with_source(Source::local(artifact_path)) - } - - /// Creates a new builder from a source URL. - pub fn from_source_url(source_url: S) -> Result - where - S: AsRef, - { - let source = Source::parse(source_url)?; - Ok(Builder::with_source(source)) - } - - /// Creates a new builder with the given artifact JSON source. - pub fn with_source(source: Source) -> Self { - Builder { - args: Args::new(source), - options: SerializationOptions::default(), + networks: Default::default(), + method_aliases: Default::default(), + event_derives: vec![], + rustfmt: true, } } /// Sets the crate name for the runtime crate. This setting is usually only /// needed if the crate was renamed in the Cargo manifest. - pub fn with_runtime_crate_name(mut self, name: S) -> Self - where - S: Into, - { - self.args.runtime_crate_name = name.into(); + pub fn runtime_crate_name(mut self, name: impl Into) -> Self { + self.runtime_crate_name = name.into(); self } /// Sets an optional visibility modifier for the generated module and /// contract re-export. - pub fn with_visibility_modifier(mut self, vis: Option) -> Self - where - S: Into, - { - self.args.visibility_modifier = vis.map(S::into); + pub fn visibility_modifier(mut self, vis: impl Into) -> Self { + self.visibility_modifier = Some(vis.into()); self } /// Sets the optional contract module name override. - pub fn with_contract_mod_override(mut self, name: Option) -> Self - where - S: Into, - { - self.args.contract_mod_override = name.map(S::into); + pub fn contract_mod_override(mut self, name: impl Into) -> Self { + self.contract_mod_override = Some(name.into()); self } /// Sets the optional contract name override. This setting is needed when - /// using a artifact JSON source that does not provide a contract name such + /// using an artifact JSON source that does not provide a contract name such /// as Etherscan. - pub fn with_contract_name_override(mut self, name: Option) -> Self - where - S: Into, - { - self.args.contract_name_override = name.map(S::into); + pub fn contract_name_override(mut self, name: impl Into) -> Self { + self.contract_name_override = Some(name.into()); self } - /// Manually adds specifies the deployed address and deployment transaction - /// hash or block of a contract for a given network. Note that manually specified - /// deployments take precedence over deployments in the artifact. + /// Adds a deployed address and deployment transaction + /// hash or block of a contract for a given network. Note that manually + /// specified deployments take precedence over deployments in the artifact. /// /// This is useful for integration test scenarios where the address of a /// contract on the test node is deterministic, but the contract address /// is not in the artifact. - pub fn add_deployment( - mut self, - network_id: u32, - address: Address, - deployment_information: Option, - ) -> Self { - let deployment = Deployment { - address, - deployment_information, - }; - self.args.deployments.insert(network_id, deployment); + pub fn add_network(mut self, chain_id: impl Into, network: Network) -> Self { + self.networks.insert(chain_id.into(), network); self } - /// Manually adds specifies the deployed address as a string of a contract - /// for a given network. See `Builder::add_deployment` for more information. + /// Adds a deployed address. Parses address from string. + /// See [`add_deployment`] for more information. /// /// # Panics /// /// This method panics if the specified address string is invalid. See - /// `parse_address` for more information on the address string format. - pub fn add_deployment_str(self, network_id: u32, address: S) -> Self - where - S: AsRef, - { - self.add_deployment( - network_id, - parse_address(address).expect("failed to parse address"), - None, + /// [`parse_address`] for more information on the address string format. + pub fn add_network_str(self, chain_id: impl Into, address: &str) -> Self { + self.add_network( + chain_id, + Network { + address: parse_address(address).expect("failed to parse address"), + deployment_information: None, + }, ) } - /// Manually adds a solidity method alias to specify what the method name + /// Adds a solidity method alias to specify what the method name /// will be in Rust. For solidity methods without an alias, the snake cased /// method name will be used. - pub fn add_method_alias(mut self, signature: S1, alias: S2) -> Self - where - S1: Into, - S2: Into, - { - self.args - .method_aliases - .insert(signature.into(), alias.into()); + pub fn add_method_alias( + mut self, + signature: impl Into, + alias: impl Into, + ) -> Self { + self.method_aliases.insert(signature.into(), alias.into()); self } - /// Specify whether or not to format the code using a locally installed copy - /// of `rustfmt`. + /// Specifies whether or not to format the code using a locally installed + /// copy of `rustfmt`. /// /// Note that in case `rustfmt` does not exist or produces an error, the /// unformatted code will be used. - pub fn with_rustfmt(mut self, rustfmt: bool) -> Self { - self.options.rustfmt = rustfmt; + pub fn rustfmt(mut self, rustfmt: bool) -> Self { + self.rustfmt = rustfmt; self } - /// Add a custom derive to the derives for event structs and enums. + /// Adds a custom derive to the derives for event structs and enums. /// - /// This makes it possible to for example derive serde::Serialize and - /// serde::Deserialize for events. + /// This makes it possible to, for example, derive `serde::Serialize` and + /// `serde::Deserialize` for events. /// /// # Examples /// /// ``` - /// use ethcontract_generate::Builder; - /// let builder = Builder::new("path") + /// # use ethcontract_generate::ContractBuilder; + /// let builder = ContractBuilder::new() /// .add_event_derive("serde::Serialize") /// .add_event_derive("serde::Deserialize"); /// ``` - pub fn add_event_derive(mut self, derive: S) -> Self - where - S: Into, - { - self.args.event_derives.push(derive.into()); + pub fn add_event_derive(mut self, derive: impl Into) -> Self { + self.event_derives.push(derive.into()); self } /// Generates the contract bindings. - pub fn generate(self) -> Result { - let tokens = contract::expand(self.args)?; + pub fn generate(self, contract: &Contract) -> Result { + let rustfmt = self.rustfmt; Ok(ContractBindings { - tokens, - options: self.options, + tokens: generate::expand(contract, self)?, + rustfmt, }) } } +impl Default for ContractBuilder { + fn default() -> Self { + ContractBuilder::new() + } +} + /// Type-safe contract bindings generated by a `Builder`. This type can be /// either written to file or into a token stream for use in a procedural macro. pub struct ContractBindings { /// The TokenStream representing the contract bindings. - tokens: TokenStream, - /// The output options used for serialization. - options: SerializationOptions, + pub tokens: TokenStream, + + /// Format generated code using locally installed copy of `rustfmt`. + pub rustfmt: bool, } impl ContractBindings { + /// Specifies whether or not to format the code using a locally installed + /// copy of `rustfmt`. + /// + /// Note that in case `rustfmt` does not exist or produces an error, the + /// unformatted code will be used. + pub fn rustfmt(mut self, rustfmt: bool) -> Self { + self.rustfmt = rustfmt; + self + } + /// Writes the bindings to a given `Write`. - pub fn write(&self, mut w: W) -> Result<()> - where - W: Write, - { + pub fn write(&self, mut w: impl Write) -> Result<()> { let source = { let raw = self.tokens.to_string(); - if self.options.rustfmt { + if self.rustfmt { rustfmt::format(&raw).unwrap_or(raw) } else { raw @@ -280,12 +234,10 @@ impl ContractBindings { } /// Writes the bindings to the specified file. - pub fn write_to_file

(&self, path: P) -> Result<()> - where - P: AsRef, - { + pub fn write_to_file(&self, path: impl AsRef) -> Result<()> { let file = File::create(path)?; - self.write(file) + let writer = BufWriter::new(file); + self.write(writer) } /// Converts the bindings into its underlying token stream. This allows it diff --git a/ethcontract-generate/src/rustfmt.rs b/ethcontract-generate/src/rustfmt.rs index dd42a12c..a928d36a 100644 --- a/ethcontract-generate/src/rustfmt.rs +++ b/ethcontract-generate/src/rustfmt.rs @@ -4,11 +4,8 @@ use anyhow::{anyhow, Result}; use std::io::Write; use std::process::{Command, Stdio}; -/// Format the raw input source string and return formatted output. -pub fn format(source: S) -> Result -where - S: AsRef, -{ +/// Formats the raw input source string and return formatted output. +pub fn format(source: &str) -> Result { let mut rustfmt = Command::new("rustfmt") .args(&["--edition", "2018"]) .stdin(Stdio::piped()) @@ -20,7 +17,7 @@ where .stdin .as_mut() .ok_or_else(|| anyhow!("stdin was not created for `rustfmt` child process"))?; - stdin.write_all(source.as_ref().as_bytes())?; + stdin.write_all(source.as_bytes())?; } let output = rustfmt.wait_with_output()?; diff --git a/ethcontract-generate/src/source.rs b/ethcontract-generate/src/source.rs index 45fc34ba..a3fe93bb 100644 --- a/ethcontract-generate/src/source.rs +++ b/ethcontract-generate/src/source.rs @@ -1,4 +1,27 @@ -//! Module implements reading of contract artifacts from various sources. +//! Allows loading serialized artifacts from various sources. +//! +//! This module does not provide means for parsing artifacts. For that, +//! use facilities in [`ethcontract_common::artifact`]. +//! +//! # Examples +//! +//! Load artifact from local file: +//! +//! ```no_run +//! # use ethcontract_generate::Source; +//! let json = Source::local("build/contracts/IERC20.json") +//! .artifact_json() +//! .expect("failed to load an artifact"); +//! ``` +//! +//! Load artifact from an NPM package: +//! +//! ```no_run +//! # use ethcontract_generate::Source; +//! let json = Source::npm("npm:@openzeppelin/contracts@2.5.0/build/contracts/IERC20.json") +//! .artifact_json() +//! .expect("failed to load an artifact"); +//! ``` use crate::util; use anyhow::{anyhow, Context, Error, Result}; @@ -13,53 +36,69 @@ use url::Url; /// A source of an artifact JSON. #[derive(Clone, Debug, Eq, PartialEq)] pub enum Source { - /// An artifact or ABI located on the local file system. + /// File on the local file system. Local(PathBuf), - /// An artifact or ABI to be retrieved over HTTP(S). + + /// Resource in the internet, available via HTTP(S). Http(Url), - /// An address of a mainnet contract that has been verified on Etherscan.io. + + /// An address of a mainnet contract, available via [Etherscan]. + /// + /// Artifacts loaded from etherstan can be parsed using + /// the [truffle loader]. + /// + /// Note that Etherscan rate-limits requests to their API, to avoid this, + /// provide an Etherscan API key via the `ETHERSCAN_API_KEY` + /// environment variable. + /// + /// [Etherscan]: etherscan.io + /// [truffle loader]: ethcontract_common::artifact::truffle::TruffleLoader Etherscan(Address), - /// The package identifier of an npm package with a path to an artifact - /// or ABI to be retrieved from `unpkg.io`. + + /// The package identifier of an NPM package with a path to an artifact + /// or ABI to be retrieved from [unpkg]. + /// + /// [unpkg]: unpkg.io Npm(String), } impl Source { /// Parses an artifact source from a string. /// - /// Contract artifacts can be retrieved from the local filesystem or online - /// from `etherscan.io`, this method parses artifact source URLs and accepts - /// the following: - /// - `relative/path/to/Contract.json`: a relative path to an - /// artifact JSON file. This relative path is rooted in the current - /// working directory. To specify the root for relative paths, use - /// `Source::with_root`. - /// - `/absolute/path/to/Contract.json` or - /// `file:///absolute/path/to/Contract.json`: an absolute path or file URL - /// to an artifact JSON file. - /// - `http(s)://...` an HTTP url to a contract ABI or a artifact. - /// - `etherscan:0xXX..XX` or `https://etherscan.io/address/0xXX..XX`: a - /// address or URL of a verified contract on Etherscan. - /// - `npm:@org/package@1.0.0/path/to/contract.json` an npmjs package with - /// an optional version and path (defaulting to the latest version and - /// `index.js`). The contract artifact or ABI will be retrieved through - /// `unpkg.com`. - pub fn parse(source: S) -> Result - where - S: AsRef, - { + /// This method accepts the following: + /// + /// - relative path to a contract JSON file on the local filesystem, + /// for example `build/IERC20.json`. This relative path is rooted + /// in the current working directory. To specify the root for relative + /// paths, use [`with_root`] function; + /// + /// - absolute path to a contract JSON file on the local filesystem, + /// or a file URL, for example `/build/IERC20.json`, or the same path + /// using URL: `file:///build/IERC20.json`; + /// + /// - an HTTP(S) URL pointing to artifact JSON or contract ABI JSON; + /// + /// - a URL with `etherscan` scheme and a mainnet contract address. + /// For example `etherscan:0xC02AA...`. Alternatively, specify + /// an [etherscan] URL: `https://etherscan.io/address/0xC02AA...`. + /// The contract artifact or ABI will be retrieved through [`Etherscan`]; + /// + /// - a URL with `npm` scheme, NPM package name, an optional version + /// and a path (defaulting to the latest version and `index.js`). + /// For example `npm:@openzeppelin/contracts/build/contracts/IERC20.json`. + /// The contract artifact or ABI will be retrieved through [`unpkg`]. + /// + /// [Etherscan]: etherscan.io + /// [unpkg]: unpkg.io + pub fn parse(source: &str) -> Result { let root = env::current_dir()?.canonicalize()?; Source::with_root(root, source) } - /// Parses an artifact source from a string and a specified root directory - /// for resolving relative paths. See `Source::with_root` for more details + /// Parses an artifact source from a string and uses the specified root + /// directory for resolving relative paths. See [`parse`] for more details /// on supported source strings. - pub fn with_root(root: P, source: S) -> Result - where - P: AsRef, - S: AsRef, - { + pub fn with_root(root: impl AsRef, source: &str) -> Result { let base = Url::from_directory_path(root) .map_err(|_| anyhow!("root path '{}' is not absolute"))?; let url = base.join(source.as_ref())?; @@ -82,42 +121,38 @@ impl Source { } /// Creates a local filesystem source from a path string. - pub fn local

(path: P) -> Self - where - P: AsRef, - { + pub fn local(path: impl AsRef) -> Self { Source::Local(path.as_ref().into()) } /// Creates an HTTP source from a URL. - pub fn http(url: S) -> Result - where - S: AsRef, - { - Ok(Source::Http(Url::parse(url.as_ref())?)) + pub fn http(url: &str) -> Result { + Ok(Source::Http(Url::parse(url)?)) } - /// Creates an Etherscan source from an address string. - pub fn etherscan(address: S) -> Result - where - S: AsRef, - { - let address = - util::parse_address(address).context("failed to parse address for Etherscan source")?; - Ok(Source::Etherscan(address)) + /// Creates an [Etherscan] source from contract address on mainnet. + /// + /// [Etherscan]: etherscan.io + pub fn etherscan(address: &str) -> Result { + util::parse_address(address) + .context("failed to parse address for Etherscan source") + .map(Source::Etherscan) } - /// Creates an Etherscan source from an address string. - pub fn npm(package_path: S) -> Self - where - S: Into, - { + /// Creates an NPM source from a package path. + pub fn npm(package_path: impl Into) -> Self { Source::Npm(package_path.into()) } - /// Retrieves the source JSON of the artifact this will either read the JSON - /// from the file system or retrieve a contract ABI from the network - /// depending on the source type. + /// Retrieves the source JSON of the artifact. + /// + /// This will either read the JSON from the file system or retrieve + /// a contract ABI from the network, depending on the source type. + /// + /// Contract ABIs will be wrapped into a JSON object, so that you can load + /// them using the [truffle loader]. + /// + /// [truffle loader]: ethcontract_common::artifact::truffle::TruffleLoader pub fn artifact_json(&self) -> Result { match self { Source::Local(path) => get_local_contract(path), @@ -136,7 +171,6 @@ impl FromStr for Source { } } -/// Reads an artifact JSON file from the local filesystem. fn get_local_contract(path: &Path) -> Result { let path = if path.is_relative() { let absolute_path = path.canonicalize().with_context(|| { @@ -157,15 +191,12 @@ fn get_local_contract(path: &Path) -> Result { Ok(abi_or_artifact(json)) } -/// Retrieves an artifact or ABI from an HTTP URL. fn get_http_contract(url: &Url) -> Result { let json = util::http_get(url.as_str()) .with_context(|| format!("failed to retrieve JSON from {}", url))?; Ok(abi_or_artifact(json)) } -/// Retrieves a contract ABI from the Etherscan HTTP API and wraps it in an -/// artifact JSON for compatibility with the code generation facilities. fn get_etherscan_contract(address: Address) -> Result { // NOTE: We do not retrieve the bytecode since deploying contracts with the // same bytecode is unreliable as the libraries have already linked and @@ -193,7 +224,6 @@ fn get_etherscan_contract(address: Address) -> Result { Ok(json) } -/// Retrieves an artifact or ABI from an npm package through `unpkg.com`. fn get_npm_contract(package: &str) -> Result { let unpkg_url = format!("https://unpkg.com/{}", package); let json = util::http_get(&unpkg_url) @@ -212,6 +242,7 @@ fn get_npm_contract(package: &str) -> Result { /// /// This needs to be done as currently the contract generation infrastructure /// depends on having an artifact. +// TODO(taminomara): add loader for plain ABIs? fn abi_or_artifact(json: String) -> String { if json.trim().starts_with('[') { format!(r#"{{"abi":{}}}"#, json.trim()) diff --git a/ethcontract-generate/src/util.rs b/ethcontract-generate/src/util.rs index d3632cbe..1360faf3 100644 --- a/ethcontract-generate/src/util.rs +++ b/ethcontract-generate/src/util.rs @@ -53,7 +53,7 @@ where Ok(address_str[2..].parse()?) } -/// Perform an HTTP GET request and return the contents of the response. +/// Performs an HTTP GET request and return the contents of the response. pub fn http_get(url: &str) -> Result { let mut buffer = Vec::new(); let mut handle = Easy::new(); diff --git a/examples/generate/README.md b/examples/generate/README.md new file mode 100644 index 00000000..29f52598 --- /dev/null +++ b/examples/generate/README.md @@ -0,0 +1,7 @@ +# Build script example + +This example shows a simple setup that uses a build script to generate contract +bindings from hardhat `deployments` directory. + +We use `build.rs` to generate file `contracts.rs`. Then we include said file +into our code using the `include!` macro. diff --git a/examples/generate/build.rs b/examples/generate/build.rs index ca968b9b..f124c99c 100644 --- a/examples/generate/build.rs +++ b/examples/generate/build.rs @@ -1,13 +1,20 @@ -use ethcontract_generate::{Address, Builder, TransactionHash}; -use std::env; -use std::path::Path; +use ethcontract_generate::loaders::HardHatLoader; +use ethcontract_generate::ContractBuilder; fn main() { - let dest = env::var("OUT_DIR").unwrap(); - Builder::new("../truffle/build/contracts/RustCoin.json") - .add_deployment(42, Address::zero(), Some(TransactionHash::zero().into())) - .generate() - .unwrap() - .write_to_file(Path::new(&dest).join("rust_coin.rs")) + let out_dir = std::env::var("OUT_DIR").unwrap(); + let dest = std::path::Path::new(&out_dir).join("contracts.rs"); + + let artifact = HardHatLoader::new() + .deny_network_by_name("localhost") + .load_from_directory("../hardhat/deployments") .unwrap(); + + for contract in artifact.iter() { + ContractBuilder::new() + .generate(contract) + .unwrap() + .write_to_file(&dest) + .unwrap(); + } } diff --git a/examples/generate/src/main.rs b/examples/generate/src/main.rs index f01aff30..368ac7e6 100644 --- a/examples/generate/src/main.rs +++ b/examples/generate/src/main.rs @@ -1,22 +1,52 @@ use ethcontract::prelude::*; +use std::env; -include!(concat!(env!("OUT_DIR"), "/rust_coin.rs")); +include!(concat!(env!("OUT_DIR"), "/contracts.rs")); + +const RINKEBY_CHAIN_ID: u64 = 4; #[tokio::main] async fn main() { - let http = Http::new("http://localhost:9545").expect("create transport failed"); + let account = { + let pk = env::var("PK").expect("PK is not set"); + let key: PrivateKey = pk.parse().expect("invalid PK"); + Account::Offline(key, Some(RINKEBY_CHAIN_ID)) + }; + let infura_url = { + let project_id = env::var("INFURA_PROJECT_ID").expect("INFURA_PROJECT_ID is not set"); + format!("https://rinkeby.infura.io/v3/{}", project_id) + }; + + let http = Http::new(&infura_url).expect("create transport failed"); let web3 = Web3::new(http); - let instance = RustCoin::builder(&web3) - .gas(4_712_388.into()) - .deploy() - .await - .expect("deployment failed"); + let instance = { + let mut instance = DeployedContract::deployed(&web3) + .await + .expect("locating deployed contract failed"); + instance.defaults_mut().from = Some(account); + instance + }; println!( - "using {} ({}) at {:?}", - instance.name().call().await.expect("get name failed"), - instance.symbol().call().await.expect("get name failed"), - instance.address() + "Using contract at {:?} deployed with transaction {:?}", + instance.address(), + instance.deployment_information(), + ); + + println!( + " value before: {}", + instance.value().call().await.expect("get value failed") + ); + println!(" incrementing (this may take a while)..."); + instance + .increment() + .confirmations(1) // wait for 1 block confirmation + .send() + .await + .expect("increment failed"); + println!( + " value after: {}", + instance.value().call().await.expect("get value failed") ); } diff --git a/examples/hardhat/README.md b/examples/hardhat/README.md new file mode 100644 index 00000000..1c9b62d0 --- /dev/null +++ b/examples/hardhat/README.md @@ -0,0 +1,38 @@ +# HardHat + +This subdirectory contains a hardhat project with sample contracts used by the +`ethcontract-rs` crate for its examples and tests. + +Information about contracts ABI and their deployments is committed to the +`deployments` directory. You don't need to build them or deploy them to run +any examples. + +At the moment, there's only `DeployedContract.sol`, a simple contract that +is deployed on the Rinkeby testnet. It is identical to `DeployedContract.sol` +from truffle directory. + +## Building and Deploying + +Building and deploying contracts is done with the same commands as in the +Truffle package. + +To build: + +```sh +yarn run build +``` + +To deploy to Rinkeby, export private key and Infura key: + +```sh +export PK="private key" +export INFURA_PROJECT_ID="Infura project ID" +``` + +Then run the deployment script: + +```sh +yarn run deploy +``` + +This will run hardhat deployment process. diff --git a/examples/hardhat/contracts/DeployedContract.sol b/examples/hardhat/contracts/DeployedContract.sol new file mode 100644 index 00000000..c42dfb00 --- /dev/null +++ b/examples/hardhat/contracts/DeployedContract.sol @@ -0,0 +1,23 @@ +pragma solidity ^0.8.0; + +/** + * @dev Rinkeby deployed contract used in examples. + */ +contract DeployedContract { + mapping(address => uint256) private values; + + /** + * @dev Gets the current value set in the contract for the `msg.sender`. + */ + function value() public view returns (uint256) { + return values[msg.sender]; + } + + /** + * @dev Increments the value for the `msg.sender` by 1. + */ + function increment() public returns (uint256) { + values[msg.sender]++; + return (values[msg.sender]); + } +} diff --git a/examples/hardhat/deploy/00_init.js b/examples/hardhat/deploy/00_init.js new file mode 100644 index 00000000..598dd451 --- /dev/null +++ b/examples/hardhat/deploy/00_init.js @@ -0,0 +1,4 @@ +module.exports = async ({getNamedAccounts, deployments}) => { + const {deployer} = await getNamedAccounts(); + await deployments.deploy('DeployedContract', {from: deployer}); +}; diff --git a/examples/hardhat/deployments/localhost/.chainId b/examples/hardhat/deployments/localhost/.chainId new file mode 100644 index 00000000..a369ea60 --- /dev/null +++ b/examples/hardhat/deployments/localhost/.chainId @@ -0,0 +1 @@ +1337 diff --git a/examples/hardhat/deployments/localhost/DeployedContract.json b/examples/hardhat/deployments/localhost/DeployedContract.json new file mode 100644 index 00000000..ddd10adf --- /dev/null +++ b/examples/hardhat/deployments/localhost/DeployedContract.json @@ -0,0 +1,101 @@ +{ + "address": "0x29BE0588389993e7064C21f00761303eb51373F5", + "abi": [ + { + "inputs": [], + "name": "increment", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "value", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xe0631d7f749fe73f94e59f6e25ff9b925980e8e29ed67b8f862ec76a783ea06e", + "receipt": { + "to": null, + "from": "0x58F7bf16796d069a7590525eBD507921036Ce82B", + "contractAddress": "0x29BE0588389993e7064C21f00761303eb51373F5", + "transactionIndex": 0, + "gasUsed": "175807", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xbbc976772d85d908aedad3c88de6dd0f7adb6dc7af7524f6cf6bd3c726521c7e", + "transactionHash": "0xe0631d7f749fe73f94e59f6e25ff9b925980e8e29ed67b8f862ec76a783ea06e", + "logs": [], + "blockNumber": 151, + "cumulativeGasUsed": "175807", + "status": 1, + "byzantium": true + }, + "args": [], + "solcInputHash": "d7ef70c507cb995ea3e81152c437ca74", + "metadata": "{\"compiler\":{\"version\":\"0.8.0+commit.c7dfd78e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"increment\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"value\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Rinkeby deployed contract used in examples.\",\"kind\":\"dev\",\"methods\":{\"increment()\":{\"details\":\"Increments the value for the `msg.sender` by 1.\"},\"value()\":{\"details\":\"Gets the current value set in the contract for the `msg.sender`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/DeployedContract.sol\":\"DeployedContract\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/DeployedContract.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\n/**\\n * @dev Rinkeby deployed contract used in examples.\\n */\\ncontract DeployedContract {\\n mapping(address => uint256) private values;\\n\\n /**\\n * @dev Gets the current value set in the contract for the `msg.sender`.\\n */\\n function value() public view returns (uint256) {\\n return values[msg.sender];\\n }\\n\\n /**\\n * @dev Increments the value for the `msg.sender` by 1.\\n */\\n function increment() public returns (uint256) {\\n values[msg.sender]++;\\n return (values[msg.sender]);\\n }\\n}\\n\",\"keccak256\":\"0x85ebb83768b7c9a3ca7db76560b0833e0e57d29716df381ef14e72a144e4e64d\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50610239806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633fa4f2451461003b578063d09de08a14610059575b600080fd5b610043610077565b6040516100509190610166565b60405180910390f35b6100616100bd565b60405161006e9190610166565b60405180910390f35b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061010e9061018b565b91905055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b61016081610181565b82525050565b600060208201905061017b6000830184610157565b92915050565b6000819050919050565b600061019682610181565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156101c9576101c86101d4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220993b4e7128d49168b275476d44461ca250c375b19974365fa3372ff084874faf64736f6c63430008000033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80633fa4f2451461003b578063d09de08a14610059575b600080fd5b610043610077565b6040516100509190610166565b60405180910390f35b6100616100bd565b60405161006e9190610166565b60405180910390f35b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061010e9061018b565b91905055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b61016081610181565b82525050565b600060208201905061017b6000830184610157565b92915050565b6000819050919050565b600061019682610181565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156101c9576101c86101d4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220993b4e7128d49168b275476d44461ca250c375b19974365fa3372ff084874faf64736f6c63430008000033", + "devdoc": { + "details": "Rinkeby deployed contract used in examples.", + "kind": "dev", + "methods": { + "increment()": { + "details": "Increments the value for the `msg.sender` by 1." + }, + "value()": { + "details": "Gets the current value set in the contract for the `msg.sender`." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 6, + "contract": "contracts/DeployedContract.sol:DeployedContract", + "label": "values", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} diff --git a/examples/hardhat/deployments/localhost/solcInputs/d7ef70c507cb995ea3e81152c437ca74.json b/examples/hardhat/deployments/localhost/solcInputs/d7ef70c507cb995ea3e81152c437ca74.json new file mode 100644 index 00000000..c6ba88da --- /dev/null +++ b/examples/hardhat/deployments/localhost/solcInputs/d7ef70c507cb995ea3e81152c437ca74.json @@ -0,0 +1,35 @@ +{ + "language": "Solidity", + "sources": { + "contracts/DeployedContract.sol": { + "content": "pragma solidity ^0.8.0;\n\n/**\n * @dev Rinkeby deployed contract used in examples.\n */\ncontract DeployedContract {\n mapping(address => uint256) private values;\n\n /**\n * @dev Gets the current value set in the contract for the `msg.sender`.\n */\n function value() public view returns (uint256) {\n return values[msg.sender];\n }\n\n /**\n * @dev Increments the value for the `msg.sender` by 1.\n */\n function increment() public returns (uint256) {\n values[msg.sender]++;\n return (values[msg.sender]);\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} diff --git a/examples/hardhat/deployments/rinkeby/.chainId b/examples/hardhat/deployments/rinkeby/.chainId new file mode 100644 index 00000000..b8626c4c --- /dev/null +++ b/examples/hardhat/deployments/rinkeby/.chainId @@ -0,0 +1 @@ +4 diff --git a/examples/hardhat/deployments/rinkeby/DeployedContract.json b/examples/hardhat/deployments/rinkeby/DeployedContract.json new file mode 100644 index 00000000..cf638f83 --- /dev/null +++ b/examples/hardhat/deployments/rinkeby/DeployedContract.json @@ -0,0 +1,101 @@ +{ + "address": "0x4E29B76eC7d20c58A6B156CB464594a4ae39FdEd", + "abi": [ + { + "inputs": [], + "name": "increment", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "value", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x0122d15a8d394b8f9e45c15b7d3e5365bbf7122a15952246676e2fe7eb858f35", + "receipt": { + "to": null, + "from": "0x0981F8B48261E738CfB61ee6628A2737387C8625", + "contractAddress": "0x4E29B76eC7d20c58A6B156CB464594a4ae39FdEd", + "transactionIndex": 28, + "gasUsed": "175807", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x80cf78ee5a928d4db8ff652f794aa580541090ca02d114a5581b681229b857bf", + "transactionHash": "0x0122d15a8d394b8f9e45c15b7d3e5365bbf7122a15952246676e2fe7eb858f35", + "logs": [], + "blockNumber": 8890571, + "cumulativeGasUsed": "3726362", + "status": 1, + "byzantium": true + }, + "args": [], + "solcInputHash": "d7ef70c507cb995ea3e81152c437ca74", + "metadata": "{\"compiler\":{\"version\":\"0.8.0+commit.c7dfd78e\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"increment\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"value\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"Rinkeby deployed contract used in examples.\",\"kind\":\"dev\",\"methods\":{\"increment()\":{\"details\":\"Increments the value for the `msg.sender` by 1.\"},\"value()\":{\"details\":\"Gets the current value set in the contract for the `msg.sender`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/DeployedContract.sol\":\"DeployedContract\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/DeployedContract.sol\":{\"content\":\"pragma solidity ^0.8.0;\\n\\n/**\\n * @dev Rinkeby deployed contract used in examples.\\n */\\ncontract DeployedContract {\\n mapping(address => uint256) private values;\\n\\n /**\\n * @dev Gets the current value set in the contract for the `msg.sender`.\\n */\\n function value() public view returns (uint256) {\\n return values[msg.sender];\\n }\\n\\n /**\\n * @dev Increments the value for the `msg.sender` by 1.\\n */\\n function increment() public returns (uint256) {\\n values[msg.sender]++;\\n return (values[msg.sender]);\\n }\\n}\\n\",\"keccak256\":\"0x85ebb83768b7c9a3ca7db76560b0833e0e57d29716df381ef14e72a144e4e64d\"}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b50610239806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633fa4f2451461003b578063d09de08a14610059575b600080fd5b610043610077565b6040516100509190610166565b60405180910390f35b6100616100bd565b60405161006e9190610166565b60405180910390f35b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061010e9061018b565b91905055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b61016081610181565b82525050565b600060208201905061017b6000830184610157565b92915050565b6000819050919050565b600061019682610181565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156101c9576101c86101d4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220993b4e7128d49168b275476d44461ca250c375b19974365fa3372ff084874faf64736f6c63430008000033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80633fa4f2451461003b578063d09de08a14610059575b600080fd5b610043610077565b6040516100509190610166565b60405180910390f35b6100616100bd565b60405161006e9190610166565b60405180910390f35b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061010e9061018b565b91905055506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b61016081610181565b82525050565b600060208201905061017b6000830184610157565b92915050565b6000819050919050565b600061019682610181565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156101c9576101c86101d4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea2646970667358221220993b4e7128d49168b275476d44461ca250c375b19974365fa3372ff084874faf64736f6c63430008000033", + "devdoc": { + "details": "Rinkeby deployed contract used in examples.", + "kind": "dev", + "methods": { + "increment()": { + "details": "Increments the value for the `msg.sender` by 1." + }, + "value()": { + "details": "Gets the current value set in the contract for the `msg.sender`." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 6, + "contract": "contracts/DeployedContract.sol:DeployedContract", + "label": "values", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} diff --git a/examples/hardhat/deployments/rinkeby/solcInputs/d7ef70c507cb995ea3e81152c437ca74.json b/examples/hardhat/deployments/rinkeby/solcInputs/d7ef70c507cb995ea3e81152c437ca74.json new file mode 100644 index 00000000..c6ba88da --- /dev/null +++ b/examples/hardhat/deployments/rinkeby/solcInputs/d7ef70c507cb995ea3e81152c437ca74.json @@ -0,0 +1,35 @@ +{ + "language": "Solidity", + "sources": { + "contracts/DeployedContract.sol": { + "content": "pragma solidity ^0.8.0;\n\n/**\n * @dev Rinkeby deployed contract used in examples.\n */\ncontract DeployedContract {\n mapping(address => uint256) private values;\n\n /**\n * @dev Gets the current value set in the contract for the `msg.sender`.\n */\n function value() public view returns (uint256) {\n return values[msg.sender];\n }\n\n /**\n * @dev Increments the value for the `msg.sender` by 1.\n */\n function increment() public returns (uint256) {\n values[msg.sender]++;\n return (values[msg.sender]);\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} diff --git a/examples/hardhat/hardhat.config.js b/examples/hardhat/hardhat.config.js new file mode 100644 index 00000000..48650de4 --- /dev/null +++ b/examples/hardhat/hardhat.config.js @@ -0,0 +1,26 @@ +require("hardhat-deploy"); + +const {PK, INFURA_PROJECT_ID} = process.env; + +const sharedNetworkConfig = { + accounts: [PK], +}; + +module.exports = { + solidity: "0.8.0", + + networks: { + localhost: { + ...sharedNetworkConfig, + live: false, + }, + rinkeby: { + ...sharedNetworkConfig, + url: `https://rinkeby.infura.io/v3/${INFURA_PROJECT_ID}`, + }, + }, + + namedAccounts: { + deployer: 0, + }, +}; diff --git a/examples/hardhat/package.json b/examples/hardhat/package.json new file mode 100644 index 00000000..c4495afb --- /dev/null +++ b/examples/hardhat/package.json @@ -0,0 +1,25 @@ +{ + "name": "ethcontract-contracts", + "version": "0.0.0", + "private": true, + "description": "Test contracts for ethcontract-rs runtime and proc macro.", + "main": "index.js", + "scripts": { + "build": "hardhat compile", + "deploy": "hardhat --network rinkeby deploy" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/gnosis/ethcontract-rs.git" + }, + "author": "Nicholas Rodrigues Lordello ", + "license": "(MIT OR Apache-2.0)", + "bugs": { + "url": "https://github.com/gnosis/ethcontract-rs" + }, + "homepage": "https://github.com/gnosis/ethcontract-rs", + "devDependencies": { + "hardhat": "^2.3.0", + "hardhat-deploy": "^0.7.10" + } +} diff --git a/examples/hardhat/yarn.lock b/examples/hardhat/yarn.lock new file mode 100644 index 00000000..1574a410 --- /dev/null +++ b/examples/hardhat/yarn.lock @@ -0,0 +1,2709 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ethereumjs/block@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.3.0.tgz#a1b3baec831c71c0d9e7f6145f25e919cff4939c" + integrity sha512-WoefY9Rs4W8vZTxG9qwntAlV61xsSv0NPoXmHO7x3SH16dwJQtU15YvahPCz4HEEXbu7GgGgNgu0pv8JY7VauA== + dependencies: + "@ethereumjs/common" "^2.3.0" + "@ethereumjs/tx" "^3.2.0" + ethereumjs-util "^7.0.10" + merkle-patricia-tree "^4.2.0" + +"@ethereumjs/blockchain@^5.3.0": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.3.1.tgz#b8cc506ce2481c32aa7dbb22aa100931e6f3723b" + integrity sha512-Sr39BoTOzmVSnuYzjiCIpgcBUFE5JWcMF0lYCvzrtx/5Lg1tnpZhw9yMQ6JfIomN421epg4oDz99DWlL9Aqz3g== + dependencies: + "@ethereumjs/block" "^3.3.0" + "@ethereumjs/common" "^2.3.1" + "@ethereumjs/ethash" "^1.0.0" + debug "^2.2.0" + ethereumjs-util "^7.0.10" + level-mem "^5.0.1" + lru-cache "^5.1.1" + rlp "^2.2.4" + semaphore-async-await "^1.5.1" + +"@ethereumjs/common@^2.3.0", "@ethereumjs/common@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.3.1.tgz#d692e3aff5adb35dd587dd1e6caab69e0ed2fa0b" + integrity sha512-V8hrULExoq0H4HFs3cCmdRGbgmipmlNzak6Xg34nHYfQyqkSdrCuflvYjyWmsNpI8GtrcZhzifAbgX/1C1Cjwg== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.0.10" + +"@ethereumjs/ethash@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.0.0.tgz#4e77f85b37be1ade5393e8719bdabac3e796ddaa" + integrity sha512-iIqnGG6NMKesyOxv2YctB2guOVX18qMAWlj3QlZyrc+GqfzLqoihti+cVNQnyNxr7eYuPdqwLQOFuPe6g/uKjw== + dependencies: + "@types/levelup" "^4.3.0" + buffer-xor "^2.0.1" + ethereumjs-util "^7.0.7" + miller-rabin "^4.0.0" + +"@ethereumjs/tx@^3.2.0", "@ethereumjs/tx@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.2.1.tgz#65f5f1c11541764f08377a94ba4b0dcbbd67739e" + integrity sha512-i9V39OtKvwWos1uVNZxdVhd7zFOyzFLjgt69CoiOY0EmXugS0HjO3uxpLBSglDKFMRriuGqw6ddKEv+RP1UNEw== + dependencies: + "@ethereumjs/common" "^2.3.1" + ethereumjs-util "^7.0.10" + +"@ethereumjs/vm@^5.3.2": + version "5.4.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.4.2.tgz#4394abc8b637f127bc09e0216b7eb37702ee9c23" + integrity sha512-lznkeAPJJfVeW087qem75o3Ys3rCr0dRSWA1BXuRRNgjpIYQmS6ke9dNO7l1bK1QuWDIW7IIkvvMm5GsoBd+5A== + dependencies: + "@ethereumjs/block" "^3.3.0" + "@ethereumjs/blockchain" "^5.3.0" + "@ethereumjs/common" "^2.3.1" + "@ethereumjs/tx" "^3.2.1" + async-eventemitter "^0.2.4" + core-js-pure "^3.0.1" + debug "^2.2.0" + ethereumjs-util "^7.0.10" + functional-red-black-tree "^1.0.1" + mcl-wasm "^0.7.1" + merkle-patricia-tree "^4.2.0" + rustbn.js "~0.2.0" + util.promisify "^1.0.1" + +"@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.0.tgz#a6d63bdb3672f738398846d4279fa6b6c9818242" + integrity sha512-9gU2H+/yK1j2eVMdzm6xvHSnMxk8waIHQGYCZg5uvAyH0rsAzxkModzBSpbAkAuhKFEovC2S9hM4nPuLym8IZw== + dependencies: + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/hash" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + +"@ethersproject/abstract-provider@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.0.tgz#415331031b0f678388971e1987305244edc04e1d" + integrity sha512-vPBR7HKUBY0lpdllIn7tLIzNN7DrVnhCLKSzY0l8WAwxz686m/aL7ASDzrVxV93GJtIub6N2t4dfZ29CkPOxgA== + dependencies: + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/networks" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + "@ethersproject/web" "^5.4.0" + +"@ethersproject/abstract-signer@^5.0.0", "@ethersproject/abstract-signer@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.0.tgz#cd5f50b93141ee9f9f49feb4075a0b3eafb57d65" + integrity sha512-AieQAzt05HJZS2bMofpuxMEp81AHufA5D6M4ScKwtolj041nrfIbIi8ciNW7+F59VYxXq+V4c3d568Q6l2m8ew== + dependencies: + "@ethersproject/abstract-provider" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + +"@ethersproject/address@^5.0.0", "@ethersproject/address@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3" + integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q== + dependencies: + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/rlp" "^5.4.0" + +"@ethersproject/base64@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a" + integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ== + dependencies: + "@ethersproject/bytes" "^5.4.0" + +"@ethersproject/basex@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6" + integrity sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + +"@ethersproject/bignumber@^5.0.0", "@ethersproject/bignumber@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.0.tgz#be8dea298c0ec71208ee60f0b245be0761217ad9" + integrity sha512-OXUu9f9hO3vGRIPxU40cignXZVaYyfx6j9NNMjebKdnaCL3anCLSSy8/b8d03vY6dh7duCC0kW72GEC4tZer2w== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + bn.js "^4.11.9" + +"@ethersproject/bytes@^5.0.0", "@ethersproject/bytes@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e" + integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA== + dependencies: + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/constants@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a" + integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q== + dependencies: + "@ethersproject/bignumber" "^5.4.0" + +"@ethersproject/contracts@^5.0.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.0.tgz#e05fe6bd33acc98741e27d553889ec5920078abb" + integrity sha512-hkO3L3IhS1Z3ZtHtaAG/T87nQ7KiPV+/qnvutag35I0IkiQ8G3ZpCQ9NNOpSCzn4pWSW4CfzmtE02FcqnLI+hw== + dependencies: + "@ethersproject/abi" "^5.4.0" + "@ethersproject/abstract-provider" "^5.4.0" + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + +"@ethersproject/hash@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0" + integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA== + dependencies: + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + +"@ethersproject/hdnode@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac" + integrity sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q== + dependencies: + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/basex" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/pbkdf2" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/sha2" "^5.4.0" + "@ethersproject/signing-key" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + "@ethersproject/wordlists" "^5.4.0" + +"@ethersproject/json-wallets@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95" + integrity sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ== + dependencies: + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/hdnode" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/pbkdf2" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/random" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318" + integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A== + dependencies: + "@ethersproject/bytes" "^5.4.0" + js-sha3 "0.5.7" + +"@ethersproject/logger@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.0.tgz#f39adadf62ad610c420bcd156fd41270e91b3ca9" + integrity sha512-xYdWGGQ9P2cxBayt64d8LC8aPFJk6yWCawQi/4eJ4+oJdMMjEBMrIcIMZ9AxhwpPVmnBPrsB10PcXGmGAqgUEQ== + +"@ethersproject/networks@^5.4.0": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.1.tgz#2ce83b8e42aa85216e5d277a7952d97b6ce8d852" + integrity sha512-8SvowCKz9Uf4xC5DTKI8+il8lWqOr78kmiqAVLYT9lzB8aSmJHQMD1GSuJI0CW4hMAnzocpGpZLgiMdzsNSPig== + dependencies: + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/pbkdf2@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c" + integrity sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/sha2" "^5.4.0" + +"@ethersproject/properties@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.0.tgz#38ba20539b44dcc5d5f80c45ad902017dcdbefe7" + integrity sha512-7jczalGVRAJ+XSRvNA6D5sAwT4gavLq3OXPuV/74o3Rd2wuzSL035IMpIMgei4CYyBdialJMrTqkOnzccLHn4A== + dependencies: + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/providers@^5.0.0": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.1.tgz#654267b563b833046b9c9647647cfc8267cb93b4" + integrity sha512-p06eiFKz8nu/5Ju0kIX024gzEQIgE5pvvGrBCngpyVjpuLtUIWT3097Agw4mTn9/dEA0FMcfByzFqacBMSgCVg== + dependencies: + "@ethersproject/abstract-provider" "^5.4.0" + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/basex" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/hash" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/networks" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/random" "^5.4.0" + "@ethersproject/rlp" "^5.4.0" + "@ethersproject/sha2" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + "@ethersproject/web" "^5.4.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16" + integrity sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/rlp@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931" + integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/sha2@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371" + integrity sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec" + integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/solidity@^5.0.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec" + integrity sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ== + dependencies: + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/sha2" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + +"@ethersproject/strings@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a" + integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/transactions@^5.0.0", "@ethersproject/transactions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0" + integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ== + dependencies: + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/rlp" "^5.4.0" + "@ethersproject/signing-key" "^5.4.0" + +"@ethersproject/wallet@^5.0.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353" + integrity sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ== + dependencies: + "@ethersproject/abstract-provider" "^5.4.0" + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/hash" "^5.4.0" + "@ethersproject/hdnode" "^5.4.0" + "@ethersproject/json-wallets" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/random" "^5.4.0" + "@ethersproject/signing-key" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + "@ethersproject/wordlists" "^5.4.0" + +"@ethersproject/web@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f" + integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og== + dependencies: + "@ethersproject/base64" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + +"@ethersproject/wordlists@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7" + integrity sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/hash" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== + +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@solidity-parser/parser@^0.11.0": + version "0.11.1" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.1.tgz#fa840af64840c930f24a9c82c08d4a092a068add" + integrity sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ== + +"@types/abstract-leveldown@*": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.2.tgz#ee81917fe38f770e29eec8139b6f16ee4a8b0a5f" + integrity sha512-+jA1XXF3jsz+Z7FcuiNqgK53hTa/luglT2TyTpKPqoYbxVY+mCPF22Rm+q3KPBrMHJwNXFrTViHszBOfU4vftQ== + +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/bn.js@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + dependencies: + "@types/node" "*" + +"@types/level-errors@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" + integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== + +"@types/levelup@^4.3.0": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" + integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== + dependencies: + "@types/abstract-leveldown" "*" + "@types/level-errors" "*" + "@types/node" "*" + +"@types/lru-cache@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + +"@types/node@*": + version "16.0.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.0.0.tgz#067a6c49dc7a5c2412a505628e26902ae967bf6f" + integrity sha512-TmCW5HoZ2o2/z2EYi109jLqIaPIi9y/lc2LmDCWzuCi35bcaQ+OtUh6nwBiFK7SOu25FAU5+YKdqFZUwtqGSdg== + +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + +"@types/qs@^6.9.4": + version "6.9.6" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1" + integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA== + +"@types/secp256k1@^4.0.1": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +abstract-leveldown@^6.2.1: + version "6.3.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" + integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== + dependencies: + buffer "^5.5.0" + immediate "^3.2.3" + level-concat-iterator "~2.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + +abstract-leveldown@~6.2.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" + integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== + dependencies: + buffer "^5.5.0" + immediate "^3.2.3" + level-concat-iterator "~2.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + +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-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.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.1, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +async-eventemitter@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== + dependencies: + async "^2.4.0" + +async@^2.4.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" + +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.8" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" + integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +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== + +blakejs@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702" + integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg== + +bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +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" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +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== + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer-xor@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289" + integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== + dependencies: + safe-buffer "^5.1.1" + +buffer@^5.5.0, buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" + integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.2.0" + optionalDependencies: + fsevents "~2.1.1" + +chokidar@^3.4.0: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + 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" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +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.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +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== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +cookie@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +core-js-pure@^3.0.1: + version "3.15.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.15.2.tgz#c8e0874822705f3385d3197af9348f7c9ae2e3ce" + integrity sha512-D42L7RYh1J2grW8ttxoY1+17Y4wXZeKe7uyplAI3FkNQyI5OgBIAjUfFiTPfL1rs0qLpxaabITNbjKl1Sp82tA== + +crc-32@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" + integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +debug@3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@4, debug@^4.1.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +deferred-leveldown@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" + integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== + dependencies: + abstract-leveldown "~6.2.1" + inherits "^2.0.3" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +diff@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +elliptic@6.5.4, elliptic@^6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +encode-utf8@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda" + integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== + +encoding-down@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" + integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== + dependencies: + abstract-leveldown "^6.2.1" + inherits "^2.0.3" + level-codec "^9.0.0" + level-errors "^2.0.0" + +enquirer@^2.3.0: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +errno@~0.1.1: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +es-abstract@^1.18.0-next.2: + version "1.18.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" + integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.3" + is-string "^1.0.6" + object-inspect "^1.10.3" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +eth-sig-util@^2.5.2: + version "2.5.4" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5" + integrity sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A== + dependencies: + ethereumjs-abi "0.6.8" + ethereumjs-util "^5.1.1" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.0" + +ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" + integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== + dependencies: + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "^0.1.3" + rlp "^2.0.0" + safe-buffer "^5.1.1" + +ethereumjs-util@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethereumjs-util@^7.0.10, ethereumjs-util@^7.0.7: + version "7.0.10" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.0.10.tgz#5fb7b69fa1fda0acc59634cf39d6b0291180fc1f" + integrity sha512-c/xThw6A+EAnej5Xk5kOzFzyoSnw0WX0tSlZ6pAsfGVvQj3TItaDg9b1+Fz1RJXA+y2YksKwQnuzgt1eY6LKzw== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.4" + +ethjs-util@0.1.6, ethjs-util@^0.1.3: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== + +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@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +flat@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" + integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== + dependencies: + is-buffer "~2.0.3" + +fmix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" + integrity sha1-x7vxJN7ELJ0ZHPuUfQqXeN2YbAw= + dependencies: + imul "^1.0.0" + +follow-redirects@^1.10.0, follow-redirects@^1.12.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" + integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fp-ts@1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== + +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-caller-file@^2.0.1: + 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-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +glob-parent@~5.1.0, 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.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + 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" + +glob@^7.1.3: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + 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" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + +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== + +hardhat-deploy@^0.7.10: + version "0.7.11" + resolved "https://registry.yarnpkg.com/hardhat-deploy/-/hardhat-deploy-0.7.11.tgz#93f79dfbb529eeda24ac963e23a19064d536be2f" + integrity sha512-ONLH3NH8Biuhky44KRFyaINVHM8JI4Ihy1TpntIRZUpIFHlz9h3gieq46H7iwdp6z3CqMsOCChF0riUF3CFpmQ== + dependencies: + "@ethersproject/abi" "^5.0.0" + "@ethersproject/abstract-signer" "^5.0.0" + "@ethersproject/address" "^5.0.0" + "@ethersproject/bignumber" "^5.0.0" + "@ethersproject/bytes" "^5.0.0" + "@ethersproject/contracts" "^5.0.0" + "@ethersproject/providers" "^5.0.0" + "@ethersproject/solidity" "^5.0.0" + "@ethersproject/transactions" "^5.0.0" + "@ethersproject/wallet" "^5.0.0" + "@types/qs" "^6.9.4" + axios "^0.21.1" + chalk "^4.1.0" + chokidar "^3.4.0" + debug "^4.1.1" + form-data "^3.0.0" + fs-extra "^9.0.0" + match-all "^1.2.6" + murmur-128 "^0.2.1" + qs "^6.9.4" + +hardhat@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.4.1.tgz#2cd1e86ee6ca3a6a473eeb0f55bd3124c8c59250" + integrity sha512-vwllrFypukeE/Q+4ZfWj7j7nUo4ncUhRpsAYUM0Ruuuk6pQlKmRa0A6c0kxRSvvVgQsMud6j+/weYhbMX1wPmQ== + dependencies: + "@ethereumjs/block" "^3.3.0" + "@ethereumjs/blockchain" "^5.3.0" + "@ethereumjs/common" "^2.3.1" + "@ethereumjs/tx" "^3.2.1" + "@ethereumjs/vm" "^5.3.2" + "@ethersproject/abi" "^5.1.2" + "@sentry/node" "^5.18.1" + "@solidity-parser/parser" "^0.11.0" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + abort-controller "^3.0.0" + adm-zip "^0.4.16" + ansi-escapes "^4.3.0" + chalk "^2.4.2" + chokidar "^3.4.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + eth-sig-util "^2.5.2" + ethereum-cryptography "^0.1.2" + ethereumjs-abi "^0.6.8" + ethereumjs-util "^7.0.10" + find-up "^2.1.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + glob "^7.1.3" + https-proxy-agent "^5.0.0" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + lodash "^4.17.11" + merkle-patricia-tree "^4.2.0" + mnemonist "^0.38.0" + mocha "^7.1.2" + node-fetch "^2.6.0" + qs "^6.7.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + slash "^3.0.0" + solc "0.7.3" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + "true-case-path" "^2.2.1" + tsort "0.0.1" + uuid "^3.3.2" + ws "^7.4.6" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +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== + +has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +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== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +http-errors@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +immediate@~3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" + integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= + +immutable@^4.0.0-rc.12: + version "4.0.0-rc.12" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217" + integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A== + +imul@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" + integrity sha1-nVhnFh6LPelsLDjV3HyxAvNeKsk= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== + dependencies: + fp-ts "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + +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-boolean-object@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + dependencies: + call-bind "^1.0.2" + +is-buffer@~2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== + +is-date-object@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" + integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== + +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-regex@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +js-sha3@0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" + integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= + +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-yaml@3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keccak@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" + integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + +level-codec@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" + integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== + dependencies: + buffer "^5.6.0" + +level-concat-iterator@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" + integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== + +level-errors@^2.0.0, level-errors@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" + integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== + dependencies: + errno "~0.1.1" + +level-iterator-stream@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" + integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== + dependencies: + inherits "^2.0.4" + readable-stream "^3.4.0" + xtend "^4.0.2" + +level-mem@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" + integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== + dependencies: + level-packager "^5.0.3" + memdown "^5.0.0" + +level-packager@^5.0.3: + version "5.1.1" + resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" + integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== + dependencies: + encoding-down "^6.3.0" + levelup "^4.3.2" + +level-supports@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" + integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== + dependencies: + xtend "^4.0.2" + +level-ws@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" + integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== + dependencies: + inherits "^2.0.3" + readable-stream "^3.1.0" + xtend "^4.0.1" + +levelup@^4.3.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" + integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== + dependencies: + deferred-leveldown "~5.3.0" + level-errors "~2.0.0" + level-iterator-stream "~4.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== + dependencies: + chalk "^2.4.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= + +ltgt@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= + +match-all@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/match-all/-/match-all-1.2.6.tgz#66d276ad6b49655551e63d3a6ee53e8be0566f8d" + integrity sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ== + +mcl-wasm@^0.7.1: + version "0.7.8" + resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.8.tgz#4d0dc5a92f7bd20892fd3fcd41764acf86fd1e6e" + integrity sha512-qNHlYO6wuEtSoH5A8TcZfCEHtw8gGPqF6hLZpQn2SVd/Mck0ELIKOkmj072D98S9B9CI/jZybTUC96q1P2/ZDw== + dependencies: + typescript "^4.3.4" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +memdown@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" + integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== + dependencies: + abstract-leveldown "~6.2.1" + functional-red-black-tree "~1.0.1" + immediate "~3.2.3" + inherits "~2.0.1" + ltgt "~2.2.0" + safe-buffer "~5.2.0" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + +merkle-patricia-tree@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.0.tgz#a204b9041be5c25e8d14f0ff47021de090e811a1" + integrity sha512-0sBVXs7z1Q1/kxzWZ3nPnxSPiaHKF/f497UQzt9O7isRcS10tel9jM/4TivF6Jv7V1yFq4bWyoATxbDUOen5vQ== + dependencies: + "@types/levelup" "^4.3.0" + ethereumjs-util "^7.0.10" + level-mem "^5.0.1" + level-ws "^2.0.0" + readable-stream "^3.6.0" + rlp "^2.2.4" + semaphore-async-await "^1.5.1" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.48.0: + version "1.48.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" + integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== + +mime-types@^2.1.12: + version "2.1.31" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" + integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== + dependencies: + mime-db "1.48.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mnemonist@^0.38.0: + version "0.38.3" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.3.tgz#35ec79c1c1f4357cfda2fe264659c2775ccd7d9d" + integrity sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw== + dependencies: + obliterator "^1.6.1" + +mocha@^7.1.2: + version "7.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" + integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + chokidar "3.3.0" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "3.0.0" + minimatch "3.0.4" + mkdirp "0.5.5" + ms "2.1.1" + node-environment-flags "1.0.6" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "1.6.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +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.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +murmur-128@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/murmur-128/-/murmur-128-0.2.1.tgz#a9f6568781d2350ecb1bf80c14968cadbeaa4b4d" + integrity sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg== + dependencies: + encode-utf8 "^1.0.2" + fmix "^0.1.0" + imul "^1.0.0" + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-environment-flags@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" + integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + +node-fetch@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-gyp-build@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" + integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== + +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== + +object-inspect@^1.10.3, object-inspect@^1.9.0: + version "1.10.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" + integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + +obliterator@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3" + integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +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 sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +printj@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" + integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +qs@^6.7.0, qs@^6.9.4: + version "6.10.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" + integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== + dependencies: + side-channel "^1.0.4" + +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" + +raw-body@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" + integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== + dependencies: + picomatch "^2.0.4" + +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" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +rimraf@^2.2.8: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4: + version "2.2.6" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" + integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== + dependencies: + bn.js "^4.11.1" + +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.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== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scrypt-js@3.0.1, scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" + integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== + dependencies: + elliptic "^6.5.2" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +semaphore-async-await@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" + integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= + +semver@^5.5.0, semver@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +solc@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== + dependencies: + command-exists "^1.2.8" + commander "3.0.2" + follow-redirects "^1.12.1" + fs-extra "^0.30.0" + js-sha3 "0.8.0" + memorystream "^0.3.1" + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + +source-map-support@^0.5.13: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + 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== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= + dependencies: + is-hex-prefixed "1.0.0" + +strip-json-comments@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + dependencies: + has-flag "^3.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.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" + +tmp@0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +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" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +"true-case-path@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" + integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== + +tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y= + +tweetnacl-util@^0.15.0: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +typescript@^4.3.4: + version "4.3.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" + integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + for-each "^0.3.3" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.1" + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@^7.4.6: + version "7.5.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.2.tgz#09cc8fea3bec1bc5ed44ef51b42f945be36900f6" + integrity sha512-lkF7AWRicoB9mAgjeKbGqVUekLnSNO4VjKVnuPHpQeOxZOErX6BPXwJk70nFslRCEEA8EVW7ZjKwXaP9N+1sKQ== + +xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@13.1.2, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== + dependencies: + flat "^4.1.0" + lodash "^4.17.15" + yargs "^13.3.0" + +yargs@13.3.2, yargs@^13.3.0: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2"