Compare commits

..

1 Commits

Author SHA1 Message Date
dependabot[bot]
b55dafa1dd
chore: bump async from 2.6.3 to 2.6.4 in /docs
Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4.
- [Release notes](https://github.com/caolan/async/releases)
- [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md)
- [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4)

---
updated-dependencies:
- dependency-name: async
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-15 08:43:21 +00:00
49 changed files with 5688 additions and 7799 deletions

46
Cargo.lock generated
View File

@ -177,9 +177,9 @@ dependencies = [
[[package]] [[package]]
name = "async-trait" name = "async-trait"
version = "0.1.53" version = "0.1.52"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3"
dependencies = [ dependencies = [
"proc-macro2 1.0.32", "proc-macro2 1.0.32",
"quote 1.0.10", "quote 1.0.10",
@ -631,7 +631,7 @@ checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa"
dependencies = [ dependencies = [
"camino", "camino",
"cargo-platform", "cargo-platform",
"semver 1.0.7", "semver 1.0.6",
"serde", "serde",
"serde_json", "serde_json",
] ]
@ -935,9 +935,9 @@ dependencies = [
[[package]] [[package]]
name = "crossbeam-channel" name = "crossbeam-channel"
version = "0.5.4" version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" checksum = "fdbfe11fe19ff083c48923cf179540e8cd0535903dc35e178a1fdeeb59aef51f"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"crossbeam-utils", "crossbeam-utils",
@ -3759,7 +3759,7 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
dependencies = [ dependencies = [
"semver 1.0.7", "semver 1.0.6",
] ]
[[package]] [[package]]
@ -3940,9 +3940,9 @@ dependencies = [
[[package]] [[package]]
name = "semver" name = "semver"
version = "1.0.7" version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4" checksum = "a4a3381e03edd24287172047536f20cabde766e2cd3e65e6b00fb3af51c4f38d"
dependencies = [ dependencies = [
"serde", "serde",
] ]
@ -4565,7 +4565,7 @@ dependencies = [
"num-traits", "num-traits",
"pretty-hex", "pretty-hex",
"reqwest", "reqwest",
"semver 1.0.7", "semver 1.0.6",
"serde", "serde",
"serde_derive", "serde_derive",
"serde_json", "serde_json",
@ -4621,7 +4621,7 @@ dependencies = [
"humantime", "humantime",
"indicatif", "indicatif",
"pretty-hex", "pretty-hex",
"semver 1.0.7", "semver 1.0.6",
"serde", "serde",
"serde_json", "serde_json",
"solana-account-decoder", "solana-account-decoder",
@ -4664,7 +4664,7 @@ dependencies = [
"rayon", "rayon",
"reqwest", "reqwest",
"rustls", "rustls",
"semver 1.0.7", "semver 1.0.6",
"serde", "serde",
"serde_derive", "serde_derive",
"serde_json", "serde_json",
@ -5074,7 +5074,7 @@ dependencies = [
"lazy_static", "lazy_static",
"nix", "nix",
"reqwest", "reqwest",
"semver 1.0.7", "semver 1.0.6",
"serde", "serde",
"serde_yaml", "serde_yaml",
"solana-clap-utils", "solana-clap-utils",
@ -5559,7 +5559,7 @@ dependencies = [
"num-traits", "num-traits",
"parking_lot 0.12.0", "parking_lot 0.12.0",
"qstring", "qstring",
"semver 1.0.7", "semver 1.0.6",
"solana-sdk", "solana-sdk",
"thiserror", "thiserror",
"uriparse", "uriparse",
@ -7239,9 +7239,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
[[package]] [[package]]
name = "wasm-bindgen" name = "wasm-bindgen"
version = "0.2.80" version = "0.2.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"wasm-bindgen-macro", "wasm-bindgen-macro",
@ -7249,9 +7249,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-backend" name = "wasm-bindgen-backend"
version = "0.2.80" version = "0.2.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"lazy_static", "lazy_static",
@ -7276,9 +7276,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.80" version = "0.2.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9"
dependencies = [ dependencies = [
"quote 1.0.10", "quote 1.0.10",
"wasm-bindgen-macro-support", "wasm-bindgen-macro-support",
@ -7286,9 +7286,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro-support" name = "wasm-bindgen-macro-support"
version = "0.2.80" version = "0.2.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab"
dependencies = [ dependencies = [
"proc-macro2 1.0.32", "proc-macro2 1.0.32",
"quote 1.0.10", "quote 1.0.10",
@ -7299,9 +7299,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-shared" name = "wasm-bindgen-shared"
version = "0.2.80" version = "0.2.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc"
[[package]] [[package]]
name = "web-sys" name = "web-sys"

View File

@ -148,18 +148,6 @@ all_test_steps() {
# Full test suite # Full test suite
command_step stable ". ci/rust-version.sh; ci/docker-run.sh \$\$rust_stable_docker_image ci/test-stable.sh" 70 command_step stable ". ci/rust-version.sh; ci/docker-run.sh \$\$rust_stable_docker_image ci/test-stable.sh" 70
# Docs tests
if affects \
.rs$ \
^ci/rust-version.sh \
^ci/test-docs.sh \
; then
command_step doctest "ci/test-docs.sh" 15
else
annotate --style info --context test-docs \
"Docs skipped as no .rs files were modified"
fi
wait_step wait_step
# BPF test suite # BPF test suite

View File

@ -1 +0,0 @@
test-stable.sh

View File

@ -30,7 +30,7 @@ JOBS=$((JOBS>NPROC ? NPROC : JOBS))
echo "Executing $testName" echo "Executing $testName"
case $testName in case $testName in
test-stable) test-stable)
_ "$cargo" stable test --jobs "$JOBS" --all --tests --exclude solana-local-cluster ${V:+--verbose} -- --nocapture _ "$cargo" stable test --jobs "$JOBS" --all --exclude solana-local-cluster ${V:+--verbose} -- --nocapture
;; ;;
test-stable-bpf) test-stable-bpf)
# Clear the C dependency files, if dependency moves these files are not regenerated # Clear the C dependency files, if dependency moves these files are not regenerated
@ -130,10 +130,6 @@ test-wasm)
done done
exit 0 exit 0
;; ;;
test-docs)
_ "$cargo" stable test --jobs "$JOBS" --all --doc --exclude solana-local-cluster ${V:+--verbose} -- --nocapture
exit 0
;;
*) *)
echo "Error: Unknown test: $testName" echo "Error: Unknown test: $testName"
;; ;;

View File

@ -18,7 +18,7 @@ console = "0.15.0"
humantime = "2.0.1" humantime = "2.0.1"
indicatif = "0.16.2" indicatif = "0.16.2"
pretty-hex = "0.2.1" pretty-hex = "0.2.1"
semver = "1.0.7" semver = "1.0.6"
serde = "1.0.136" serde = "1.0.136"
serde_json = "1.0.79" serde_json = "1.0.79"
solana-account-decoder = { path = "../account-decoder", version = "=1.11.0" } solana-account-decoder = { path = "../account-decoder", version = "=1.11.0" }

View File

@ -23,7 +23,7 @@ log = "0.4.14"
num-traits = "0.2" num-traits = "0.2"
pretty-hex = "0.2.1" pretty-hex = "0.2.1"
reqwest = { version = "0.11.10", default-features = false, features = ["blocking", "rustls-tls", "json"] } reqwest = { version = "0.11.10", default-features = false, features = ["blocking", "rustls-tls", "json"] }
semver = "1.0.7" semver = "1.0.6"
serde = "1.0.136" serde = "1.0.136"
serde_derive = "1.0.103" serde_derive = "1.0.103"
serde_json = "1.0.79" serde_json = "1.0.79"

View File

@ -11,7 +11,7 @@ edition = "2021"
[dependencies] [dependencies]
async-mutex = "1.4.0" async-mutex = "1.4.0"
async-trait = "0.1.53" async-trait = "0.1.52"
base64 = "0.13.0" base64 = "0.13.0"
bincode = "1.3.3" bincode = "1.3.3"
bs58 = "0.4.0" bs58 = "0.4.0"
@ -33,7 +33,7 @@ rand_chacha = "0.2.2"
rayon = "1.5.1" rayon = "1.5.1"
reqwest = { version = "0.11.10", default-features = false, features = ["blocking", "rustls-tls", "json"] } reqwest = { version = "0.11.10", default-features = false, features = ["blocking", "rustls-tls", "json"] }
rustls = { version = "0.20.2", features = ["dangerous_configuration"] } rustls = { version = "0.20.2", features = ["dangerous_configuration"] }
semver = "1.0.7" semver = "1.0.6"
serde = "1.0.136" serde = "1.0.136"
serde_derive = "1.0.103" serde_derive = "1.0.103"
serde_json = "1.0.79" serde_json = "1.0.79"

View File

@ -20,10 +20,10 @@ use {
}; };
// Should be non-zero // Should be non-zero
static MAX_CONNECTIONS: usize = 1024; static MAX_CONNECTIONS: usize = 64;
#[derive(Clone)] #[derive(Clone)]
pub enum Connection { enum Connection {
Udp(Arc<UdpTpuConnection>), Udp(Arc<UdpTpuConnection>),
Quic(Arc<QuicTpuConnection>), Quic(Arc<QuicTpuConnection>),
} }
@ -117,14 +117,14 @@ impl ConnectionCacheStats {
} }
} }
struct ConnectionMap { struct ConnMap {
map: LruCache<SocketAddr, Connection>, map: LruCache<SocketAddr, Connection>,
stats: Arc<ConnectionCacheStats>, stats: Arc<ConnectionCacheStats>,
last_stats: AtomicInterval, last_stats: AtomicInterval,
use_quic: bool, use_quic: bool,
} }
impl ConnectionMap { impl ConnMap {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
map: LruCache::new(MAX_CONNECTIONS), map: LruCache::new(MAX_CONNECTIONS),
@ -140,7 +140,7 @@ impl ConnectionMap {
} }
lazy_static! { lazy_static! {
static ref CONNECTION_MAP: Mutex<ConnectionMap> = Mutex::new(ConnectionMap::new()); static ref CONNECTION_MAP: Mutex<ConnMap> = Mutex::new(ConnMap::new());
} }
pub fn set_use_quic(use_quic: bool) { pub fn set_use_quic(use_quic: bool) {
@ -346,7 +346,6 @@ mod tests {
#[test] #[test]
fn test_connection_cache() { fn test_connection_cache() {
solana_logger::setup();
// Allow the test to run deterministically // Allow the test to run deterministically
// with the same pseudorandom sequence between runs // with the same pseudorandom sequence between runs
// and on different platforms - the cryptographic security // and on different platforms - the cryptographic security

View File

@ -11,20 +11,15 @@ use {
itertools::Itertools, itertools::Itertools,
lazy_static::lazy_static, lazy_static::lazy_static,
log::*, log::*,
quinn::{ quinn::{ClientConfig, Endpoint, EndpointConfig, NewConnection, WriteError},
ClientConfig, Endpoint, EndpointConfig, IdleTimeout, NewConnection, VarInt, WriteError,
},
quinn_proto::ConnectionStats, quinn_proto::ConnectionStats,
solana_sdk::{ solana_sdk::{
quic::{ quic::{QUIC_MAX_CONCURRENT_STREAMS, QUIC_PORT_OFFSET},
QUIC_KEEP_ALIVE_MS, QUIC_MAX_CONCURRENT_STREAMS, QUIC_MAX_TIMEOUT_MS, QUIC_PORT_OFFSET,
},
transport::Result as TransportResult, transport::Result as TransportResult,
}, },
std::{ std::{
net::{SocketAddr, UdpSocket}, net::{SocketAddr, UdpSocket},
sync::{atomic::Ordering, Arc}, sync::{atomic::Ordering, Arc},
time::Duration,
}, },
tokio::runtime::Runtime, tokio::runtime::Runtime,
}; };
@ -168,13 +163,7 @@ impl QuicClient {
let mut endpoint = RUNTIME.block_on(create_endpoint); let mut endpoint = RUNTIME.block_on(create_endpoint);
let mut config = ClientConfig::new(Arc::new(crypto)); endpoint.set_default_client_config(ClientConfig::new(Arc::new(crypto)));
let transport_config = Arc::get_mut(&mut config.transport).unwrap();
let timeout = IdleTimeout::from(VarInt::from_u32(QUIC_MAX_TIMEOUT_MS));
transport_config.max_idle_timeout(Some(timeout));
transport_config.keep_alive_interval(Some(Duration::from_millis(QUIC_KEEP_ALIVE_MS)));
endpoint.set_default_client_config(config);
Self { Self {
endpoint, endpoint,

View File

@ -59,7 +59,6 @@ pub mod sigverify;
pub mod sigverify_shreds; pub mod sigverify_shreds;
pub mod sigverify_stage; pub mod sigverify_stage;
pub mod snapshot_packager_service; pub mod snapshot_packager_service;
pub mod staked_nodes_updater_service;
pub mod stats_reporter_service; pub mod stats_reporter_service;
pub mod system_monitor_service; pub mod system_monitor_service;
mod tower1_7_14; mod tower1_7_14;
@ -74,7 +73,6 @@ pub mod verified_vote_packets;
pub mod vote_simulator; pub mod vote_simulator;
pub mod vote_stake_tracker; pub mod vote_stake_tracker;
pub mod voting_service; pub mod voting_service;
pub mod warm_quic_cache_service;
pub mod window_service; pub mod window_service;
#[macro_use] #[macro_use]

View File

@ -1,76 +0,0 @@
use {
solana_gossip::cluster_info::ClusterInfo,
solana_runtime::bank_forks::BankForks,
std::{
collections::HashMap,
net::IpAddr,
sync::{
atomic::{AtomicBool, Ordering},
Arc, RwLock,
},
thread::{self, sleep, Builder, JoinHandle},
time::{Duration, Instant},
},
};
const IP_TO_STAKE_REFRESH_DURATION: Duration = Duration::from_secs(5);
pub struct StakedNodesUpdaterService {
thread_hdl: JoinHandle<()>,
}
impl StakedNodesUpdaterService {
pub fn new(
exit: Arc<AtomicBool>,
cluster_info: Arc<ClusterInfo>,
bank_forks: Arc<RwLock<BankForks>>,
shared_staked_nodes: Arc<RwLock<HashMap<IpAddr, u64>>>,
) -> Self {
let thread_hdl = Builder::new()
.name("sol-sn-updater".to_string())
.spawn(move || {
let mut last_stakes = Instant::now();
while !exit.load(Ordering::Relaxed) {
let mut new_ip_to_stake = HashMap::new();
Self::try_refresh_ip_to_stake(
&mut last_stakes,
&mut new_ip_to_stake,
&bank_forks,
&cluster_info,
);
let mut shared = shared_staked_nodes.write().unwrap();
*shared = new_ip_to_stake;
}
})
.unwrap();
Self { thread_hdl }
}
fn try_refresh_ip_to_stake(
last_stakes: &mut Instant,
ip_to_stake: &mut HashMap<IpAddr, u64>,
bank_forks: &RwLock<BankForks>,
cluster_info: &ClusterInfo,
) {
if last_stakes.elapsed() > IP_TO_STAKE_REFRESH_DURATION {
let root_bank = bank_forks.read().unwrap().root_bank();
let staked_nodes = root_bank.staked_nodes();
*ip_to_stake = cluster_info
.tvu_peers()
.into_iter()
.filter_map(|node| {
let stake = staked_nodes.get(&node.id)?;
Some((node.tvu.ip(), *stake))
})
.collect();
*last_stakes = Instant::now();
} else {
sleep(Duration::from_millis(1));
}
}
pub fn join(self) -> thread::Result<()> {
self.thread_hdl.join()
}
}

View File

@ -13,7 +13,6 @@ use {
find_packet_sender_stake_stage::FindPacketSenderStakeStage, find_packet_sender_stake_stage::FindPacketSenderStakeStage,
sigverify::TransactionSigVerifier, sigverify::TransactionSigVerifier,
sigverify_stage::SigVerifyStage, sigverify_stage::SigVerifyStage,
staked_nodes_updater_service::StakedNodesUpdaterService,
}, },
crossbeam_channel::{bounded, unbounded, Receiver, RecvTimeoutError}, crossbeam_channel::{bounded, unbounded, Receiver, RecvTimeoutError},
solana_gossip::cluster_info::ClusterInfo, solana_gossip::cluster_info::ClusterInfo,
@ -29,9 +28,7 @@ use {
vote_sender_types::{ReplayVoteReceiver, ReplayVoteSender}, vote_sender_types::{ReplayVoteReceiver, ReplayVoteSender},
}, },
solana_sdk::signature::Keypair, solana_sdk::signature::Keypair,
solana_streamer::quic::{spawn_server, MAX_STAKED_CONNECTIONS, MAX_UNSTAKED_CONNECTIONS},
std::{ std::{
collections::HashMap,
net::UdpSocket, net::UdpSocket,
sync::{atomic::AtomicBool, Arc, Mutex, RwLock}, sync::{atomic::AtomicBool, Arc, Mutex, RwLock},
thread, thread,
@ -65,7 +62,6 @@ pub struct Tpu {
tpu_quic_t: thread::JoinHandle<()>, tpu_quic_t: thread::JoinHandle<()>,
find_packet_sender_stake_stage: FindPacketSenderStakeStage, find_packet_sender_stake_stage: FindPacketSenderStakeStage,
vote_find_packet_sender_stake_stage: FindPacketSenderStakeStage, vote_find_packet_sender_stake_stage: FindPacketSenderStakeStage,
staked_nodes_updater_service: StakedNodesUpdaterService,
} }
impl Tpu { impl Tpu {
@ -136,23 +132,13 @@ impl Tpu {
let (verified_sender, verified_receiver) = unbounded(); let (verified_sender, verified_receiver) = unbounded();
let staked_nodes = Arc::new(RwLock::new(HashMap::new())); let tpu_quic_t = solana_streamer::quic::spawn_server(
let staked_nodes_updater_service = StakedNodesUpdaterService::new(
exit.clone(),
cluster_info.clone(),
bank_forks.clone(),
staked_nodes.clone(),
);
let tpu_quic_t = spawn_server(
transactions_quic_sockets, transactions_quic_sockets,
keypair, keypair,
cluster_info.my_contact_info().tpu.ip(), cluster_info.my_contact_info().tpu.ip(),
packet_sender, packet_sender,
exit.clone(), exit.clone(),
MAX_QUIC_CONNECTIONS_PER_IP, MAX_QUIC_CONNECTIONS_PER_IP,
staked_nodes,
MAX_STAKED_CONNECTIONS,
MAX_UNSTAKED_CONNECTIONS,
) )
.unwrap(); .unwrap();
@ -222,7 +208,6 @@ impl Tpu {
tpu_quic_t, tpu_quic_t,
find_packet_sender_stake_stage, find_packet_sender_stake_stage,
vote_find_packet_sender_stake_stage, vote_find_packet_sender_stake_stage,
staked_nodes_updater_service,
} }
} }
@ -251,7 +236,6 @@ impl Tpu {
self.banking_stage.join(), self.banking_stage.join(),
self.find_packet_sender_stake_stage.join(), self.find_packet_sender_stake_stage.join(),
self.vote_find_packet_sender_stake_stage.join(), self.vote_find_packet_sender_stake_stage.join(),
self.staked_nodes_updater_service.join(),
]; ];
self.tpu_quic_t.join()?; self.tpu_quic_t.join()?;
let broadcast_result = self.broadcast_stage.join(); let broadcast_result = self.broadcast_stage.join();

View File

@ -25,7 +25,6 @@ use {
sigverify_stage::SigVerifyStage, sigverify_stage::SigVerifyStage,
tower_storage::TowerStorage, tower_storage::TowerStorage,
voting_service::VotingService, voting_service::VotingService,
warm_quic_cache_service::WarmQuicCacheService,
}, },
crossbeam_channel::{bounded, unbounded, Receiver, RecvTimeoutError}, crossbeam_channel::{bounded, unbounded, Receiver, RecvTimeoutError},
solana_geyser_plugin_manager::block_metadata_notifier_interface::BlockMetadataNotifierLock, solana_geyser_plugin_manager::block_metadata_notifier_interface::BlockMetadataNotifierLock,
@ -79,7 +78,6 @@ pub struct Tvu {
accounts_hash_verifier: AccountsHashVerifier, accounts_hash_verifier: AccountsHashVerifier,
cost_update_service: CostUpdateService, cost_update_service: CostUpdateService,
voting_service: VotingService, voting_service: VotingService,
warm_quic_cache_service: WarmQuicCacheService,
drop_bank_service: DropBankService, drop_bank_service: DropBankService,
transaction_cost_metrics_service: TransactionCostMetricsService, transaction_cost_metrics_service: TransactionCostMetricsService,
} }
@ -285,9 +283,6 @@ impl Tvu {
bank_forks.clone(), bank_forks.clone(),
); );
let warm_quic_cache_service =
WarmQuicCacheService::new(cluster_info.clone(), poh_recorder.clone(), exit.clone());
let (cost_update_sender, cost_update_receiver) = unbounded(); let (cost_update_sender, cost_update_receiver) = unbounded();
let cost_update_service = let cost_update_service =
CostUpdateService::new(blockstore.clone(), cost_model.clone(), cost_update_receiver); CostUpdateService::new(blockstore.clone(), cost_model.clone(), cost_update_receiver);
@ -361,7 +356,6 @@ impl Tvu {
accounts_hash_verifier, accounts_hash_verifier,
cost_update_service, cost_update_service,
voting_service, voting_service,
warm_quic_cache_service,
drop_bank_service, drop_bank_service,
transaction_cost_metrics_service, transaction_cost_metrics_service,
} }
@ -396,7 +390,6 @@ impl Tvu {
self.accounts_hash_verifier.join()?; self.accounts_hash_verifier.join()?;
self.cost_update_service.join()?; self.cost_update_service.join()?;
self.voting_service.join()?; self.voting_service.join()?;
self.warm_quic_cache_service.join()?;
self.drop_bank_service.join()?; self.drop_bank_service.join()?;
self.transaction_cost_metrics_service.join()?; self.transaction_cost_metrics_service.join()?;
Ok(()) Ok(())

View File

@ -1,70 +0,0 @@
// Connect to future leaders with some jitter so the quic connection is warm
// by the time we need it.
use {
rand::{thread_rng, Rng},
solana_client::connection_cache::send_wire_transaction,
solana_gossip::cluster_info::ClusterInfo,
solana_poh::poh_recorder::PohRecorder,
std::{
sync::{
atomic::{AtomicBool, Ordering},
Arc, Mutex,
},
thread::{self, sleep, Builder, JoinHandle},
time::Duration,
},
};
pub struct WarmQuicCacheService {
thread_hdl: JoinHandle<()>,
}
// ~50 seconds
const CACHE_OFFSET_SLOT: i64 = 100;
const CACHE_JITTER_SLOT: i64 = 20;
impl WarmQuicCacheService {
pub fn new(
cluster_info: Arc<ClusterInfo>,
poh_recorder: Arc<Mutex<PohRecorder>>,
exit: Arc<AtomicBool>,
) -> Self {
let thread_hdl = Builder::new()
.name("sol-warm-quic-service".to_string())
.spawn(move || {
let slot_jitter = thread_rng().gen_range(-CACHE_JITTER_SLOT, CACHE_JITTER_SLOT);
let mut maybe_last_leader = None;
while !exit.load(Ordering::Relaxed) {
if let Some(leader_pubkey) = poh_recorder
.lock()
.unwrap()
.leader_after_n_slots((CACHE_OFFSET_SLOT + slot_jitter) as u64)
{
if maybe_last_leader
.map_or(true, |last_leader| last_leader != leader_pubkey)
{
maybe_last_leader = Some(leader_pubkey);
if let Some(addr) = cluster_info
.lookup_contact_info(&leader_pubkey, |leader| leader.tpu)
{
if let Err(err) = send_wire_transaction(&[0u8], &addr) {
warn!(
"Failed to warmup QUIC connection to the leader {:?}, Error {:?}",
leader_pubkey, err
);
}
}
}
}
sleep(Duration::from_millis(200));
}
})
.unwrap();
Self { thread_hdl }
}
pub fn join(self) -> thread::Result<()> {
self.thread_hdl.join()
}
}

12
docs/package-lock.json generated
View File

@ -3275,9 +3275,9 @@
} }
}, },
"node_modules/async": { "node_modules/async": {
"version": "2.6.3", "version": "2.6.4",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
"dependencies": { "dependencies": {
"lodash": "^4.17.14" "lodash": "^4.17.14"
} }
@ -18239,9 +18239,9 @@
"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
}, },
"async": { "async": {
"version": "2.6.3", "version": "2.6.4",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
"integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
"requires": { "requires": {
"lodash": "^4.17.14" "lodash": "^4.17.14"
} }

View File

@ -2267,9 +2267,9 @@ async-limiter@~1.0.0:
integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
async@^2.6.2: async@^2.6.2:
version "2.6.3" version "2.6.4"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221"
integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==
dependencies: dependencies:
lodash "^4.17.14" lodash "^4.17.14"

View File

@ -13,30 +13,14 @@ import {
import { Cluster, useCluster } from "providers/cluster"; import { Cluster, useCluster } from "providers/cluster";
import { useTokenRegistry } from "providers/mints/token-registry"; import { useTokenRegistry } from "providers/mints/token-registry";
import { TokenInfoMap } from "@solana/spl-token-registry"; import { TokenInfoMap } from "@solana/spl-token-registry";
import { Connection } from "@solana/web3.js";
import { getDomainInfo, hasDomainSyntax } from "utils/name-service";
interface SearchOptions {
label: string;
options: {
label: string;
value: string[];
pathname: string;
}[];
}
export function SearchBar() { export function SearchBar() {
const [search, setSearch] = React.useState(""); const [search, setSearch] = React.useState("");
const searchRef = React.useRef("");
const [searchOptions, setSearchOptions] = React.useState<SearchOptions[]>([]);
const [loadingSearch, setLoadingSearch] = React.useState<boolean>(false);
const [loadingSearchMessage, setLoadingSearchMessage] =
React.useState<string>("loading...");
const selectRef = React.useRef<StateManager<any> | null>(null); const selectRef = React.useRef<StateManager<any> | null>(null);
const history = useHistory(); const history = useHistory();
const location = useLocation(); const location = useLocation();
const { tokenRegistry } = useTokenRegistry(); const { tokenRegistry } = useTokenRegistry();
const { url, cluster, clusterInfo } = useCluster(); const { cluster, clusterInfo } = useCluster();
const onChange = ( const onChange = (
{ pathname }: ValueType<any, false>, { pathname }: ValueType<any, false>,
@ -49,54 +33,7 @@ export function SearchBar() {
}; };
const onInputChange = (value: string, { action }: InputActionMeta) => { const onInputChange = (value: string, { action }: InputActionMeta) => {
if (action === "input-change") { if (action === "input-change") setSearch(value);
setSearch(value);
}
};
React.useEffect(() => {
searchRef.current = search;
setLoadingSearchMessage("Loading...");
setLoadingSearch(true);
// builds and sets local search output
const options = buildOptions(
search,
cluster,
tokenRegistry,
clusterInfo?.epochInfo.epoch
);
setSearchOptions(options);
// checking for non local search output
if (hasDomainSyntax(search)) {
// if search input is a potential domain we continue the loading state
domainSearch(options);
} else {
// if search input is not a potential domain we can conclude the search has finished
setLoadingSearch(false);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [search]);
// appends domain lookup results to the local search state
const domainSearch = async (options: SearchOptions[]) => {
setLoadingSearchMessage("Looking up domain...");
const connection = new Connection(url);
const searchTerm = search;
const updatedOptions = await buildDomainOptions(
connection,
search,
options
);
if (searchRef.current === searchTerm) {
setSearchOptions(updatedOptions);
// after attempting to fetch the domain name we can conclude the loading state
setLoadingSearch(false);
setLoadingSearchMessage("Loading...");
}
}; };
const resetValue = "" as any; const resetValue = "" as any;
@ -107,9 +44,13 @@ export function SearchBar() {
<Select <Select
autoFocus autoFocus
ref={(ref) => (selectRef.current = ref)} ref={(ref) => (selectRef.current = ref)}
options={searchOptions} options={buildOptions(
search,
cluster,
tokenRegistry,
clusterInfo?.epochInfo.epoch
)}
noOptionsMessage={() => "No Results"} noOptionsMessage={() => "No Results"}
loadingMessage={() => loadingSearchMessage}
placeholder="Search for blocks, accounts, transactions, programs, and tokens" placeholder="Search for blocks, accounts, transactions, programs, and tokens"
value={resetValue} value={resetValue}
inputValue={search} inputValue={search}
@ -124,7 +65,6 @@ export function SearchBar() {
onInputChange={onInputChange} onInputChange={onInputChange}
components={{ DropdownIndicator }} components={{ DropdownIndicator }}
classNamePrefix="search-bar" classNamePrefix="search-bar"
isLoading={loadingSearch}
/> />
</div> </div>
</div> </div>
@ -247,7 +187,7 @@ function buildTokenOptions(
if (matchedTokens.length > 0) { if (matchedTokens.length > 0) {
return { return {
label: "Tokens", label: "Tokens",
options: matchedTokens.slice(0, 10).map(([id, details]) => ({ options: matchedTokens.map(([id, details]) => ({
label: details.name, label: details.name,
value: [details.name, details.symbol, id], value: [details.name, details.symbol, id],
pathname: "/address/" + id, pathname: "/address/" + id,
@ -256,39 +196,6 @@ function buildTokenOptions(
} }
} }
async function buildDomainOptions(
connection: Connection,
search: string,
options: SearchOptions[]
) {
const domainInfo = await getDomainInfo(search, connection);
const updatedOptions: SearchOptions[] = [...options];
if (domainInfo && domainInfo.owner && domainInfo.address) {
updatedOptions.push({
label: "Domain Owner",
options: [
{
label: domainInfo.owner,
value: [search],
pathname: "/address/" + domainInfo.owner,
},
],
});
updatedOptions.push({
label: "Name Service Account",
options: [
{
label: search,
value: [search],
pathname: "/address/" + domainInfo.address,
},
],
});
}
return updatedOptions;
}
// builds local search options
function buildOptions( function buildOptions(
rawSearch: string, rawSearch: string,
cluster: Cluster, cluster: Cluster,
@ -380,7 +287,6 @@ function buildOptions(
}); });
} }
} catch (err) {} } catch (err) {}
return options; return options;
} }

View File

@ -1,9 +1,6 @@
import { PublicKey, Connection } from "@solana/web3.js"; import { PublicKey, Connection } from "@solana/web3.js";
import { import {
getFilteredProgramAccounts, getFilteredProgramAccounts,
getHashedName,
getNameAccountKey,
getNameOwner,
NAME_PROGRAM_ID, NAME_PROGRAM_ID,
performReverseLookup, performReverseLookup,
} from "@bonfida/spl-name-service"; } from "@bonfida/spl-name-service";
@ -14,48 +11,10 @@ import { Cluster, useCluster } from "providers/cluster";
const SOL_TLD_AUTHORITY = new PublicKey( const SOL_TLD_AUTHORITY = new PublicKey(
"58PwtjSDuFHuUkYjH9BYnnQKHfwo9reZhC2zMJv9JPkx" "58PwtjSDuFHuUkYjH9BYnnQKHfwo9reZhC2zMJv9JPkx"
); );
export interface DomainInfo { export interface DomainInfo {
name: string; name: string;
address: PublicKey; address: PublicKey;
} }
export const hasDomainSyntax = (value: string) => {
return value.length > 4 && value.substring(value.length - 4) === ".sol";
};
async function getDomainKey(
name: string,
nameClass?: PublicKey,
nameParent?: PublicKey
) {
const hashedDomainName = await getHashedName(name);
const nameKey = await getNameAccountKey(
hashedDomainName,
nameClass,
nameParent
);
return nameKey;
}
// returns non empty wallet string if a given .sol domain is owned by a wallet
export async function getDomainInfo(domain: string, connection: Connection) {
const domainKey = await getDomainKey(
domain.slice(0, -4), // remove .sol
undefined,
SOL_TLD_AUTHORITY
);
try {
const registry = await getNameOwner(connection, domainKey);
return registry && registry.registry.owner
? {
owner: registry.registry.owner.toString(),
address: domainKey.toString(),
}
: null;
} catch {
return null;
}
}
async function getUserDomainAddresses( async function getUserDomainAddresses(
connection: Connection, connection: Connection,

View File

@ -23,7 +23,7 @@ indicatif = "0.16.2"
lazy_static = "1.4.0" lazy_static = "1.4.0"
nix = "0.23.1" nix = "0.23.1"
reqwest = { version = "0.11.10", default-features = false, features = ["blocking", "rustls-tls", "json"] } reqwest = { version = "0.11.10", default-features = false, features = ["blocking", "rustls-tls", "json"] }
semver = "1.0.7" semver = "1.0.6"
serde = { version = "1.0.136", features = ["derive"] } serde = { version = "1.0.136", features = ["derive"] }
serde_yaml = "0.8.23" serde_yaml = "0.8.23"
solana-clap-utils = { path = "../clap-utils", version = "=1.11.0" } solana-clap-utils = { path = "../clap-utils", version = "=1.11.0" }

View File

@ -892,7 +892,7 @@ pub fn confirm_slot(
) -> result::Result<(), BlockstoreProcessorError> { ) -> result::Result<(), BlockstoreProcessorError> {
let slot = bank.slot(); let slot = bank.slot();
let slot_entries_load_result = { let (entries, num_shreds, slot_full) = {
let mut load_elapsed = Measure::start("load_elapsed"); let mut load_elapsed = Measure::start("load_elapsed");
let load_result = blockstore let load_result = blockstore
.get_slot_entries_with_shred_info(slot, progress.num_shreds, allow_dead_slots) .get_slot_entries_with_shred_info(slot, progress.num_shreds, allow_dead_slots)
@ -906,35 +906,6 @@ pub fn confirm_slot(
load_result load_result
}?; }?;
confirm_slot_entries(
bank,
slot_entries_load_result,
timing,
progress,
skip_verification,
transaction_status_sender,
replay_vote_sender,
transaction_cost_metrics_sender,
entry_callback,
recyclers,
)
}
#[allow(clippy::too_many_arguments)]
fn confirm_slot_entries(
bank: &Arc<Bank>,
slot_entries_load_result: (Vec<Entry>, u64, bool),
timing: &mut ConfirmationTiming,
progress: &mut ConfirmationProgress,
skip_verification: bool,
transaction_status_sender: Option<&TransactionStatusSender>,
replay_vote_sender: Option<&ReplayVoteSender>,
transaction_cost_metrics_sender: Option<&TransactionCostMetricsSender>,
entry_callback: Option<&ProcessCallback>,
recyclers: &VerifyRecyclers,
) -> result::Result<(), BlockstoreProcessorError> {
let slot = bank.slot();
let (entries, num_shreds, slot_full) = slot_entries_load_result;
let num_entries = entries.len(); let num_entries = entries.len();
let num_txs = entries.iter().map(|e| e.transactions.len()).sum::<usize>(); let num_txs = entries.iter().map(|e| e.transactions.len()).sum::<usize>();
trace!( trace!(
@ -3909,108 +3880,4 @@ pub mod tests {
8 8
); );
} }
fn confirm_slot_entries_for_tests(
bank: &Arc<Bank>,
slot_entries: Vec<Entry>,
slot_full: bool,
prev_entry_hash: Hash,
) -> result::Result<(), BlockstoreProcessorError> {
confirm_slot_entries(
bank,
(slot_entries, 0, slot_full),
&mut ConfirmationTiming::default(),
&mut ConfirmationProgress::new(prev_entry_hash),
false,
None,
None,
None,
None,
&VerifyRecyclers::default(),
)
}
#[test]
fn test_confirm_slot_entries() {
const HASHES_PER_TICK: u64 = 10;
const TICKS_PER_SLOT: u64 = 2;
let collector_id = Pubkey::new_unique();
let GenesisConfigInfo {
mut genesis_config,
mint_keypair,
..
} = create_genesis_config(10_000);
genesis_config.poh_config.hashes_per_tick = Some(HASHES_PER_TICK);
genesis_config.ticks_per_slot = TICKS_PER_SLOT;
let genesis_hash = genesis_config.hash();
let slot_0_bank = Arc::new(Bank::new_for_tests(&genesis_config));
assert_eq!(slot_0_bank.slot(), 0);
assert_eq!(slot_0_bank.tick_height(), 0);
assert_eq!(slot_0_bank.max_tick_height(), 2);
assert_eq!(slot_0_bank.last_blockhash(), genesis_hash);
assert_eq!(slot_0_bank.get_hash_age(&genesis_hash), Some(0));
let slot_0_entries = entry::create_ticks(TICKS_PER_SLOT, HASHES_PER_TICK, genesis_hash);
let slot_0_hash = slot_0_entries.last().unwrap().hash;
confirm_slot_entries_for_tests(&slot_0_bank, slot_0_entries, true, genesis_hash).unwrap();
assert_eq!(slot_0_bank.tick_height(), slot_0_bank.max_tick_height());
assert_eq!(slot_0_bank.last_blockhash(), slot_0_hash);
assert_eq!(slot_0_bank.get_hash_age(&genesis_hash), Some(1));
assert_eq!(slot_0_bank.get_hash_age(&slot_0_hash), Some(0));
let slot_2_bank = Arc::new(Bank::new_from_parent(&slot_0_bank, &collector_id, 2));
assert_eq!(slot_2_bank.slot(), 2);
assert_eq!(slot_2_bank.tick_height(), 2);
assert_eq!(slot_2_bank.max_tick_height(), 6);
assert_eq!(slot_2_bank.last_blockhash(), slot_0_hash);
let slot_1_entries = entry::create_ticks(TICKS_PER_SLOT, HASHES_PER_TICK, slot_0_hash);
let slot_1_hash = slot_1_entries.last().unwrap().hash;
confirm_slot_entries_for_tests(&slot_2_bank, slot_1_entries, false, slot_0_hash).unwrap();
assert_eq!(slot_2_bank.tick_height(), 4);
assert_eq!(slot_2_bank.last_blockhash(), slot_1_hash);
assert_eq!(slot_2_bank.get_hash_age(&genesis_hash), Some(2));
assert_eq!(slot_2_bank.get_hash_age(&slot_0_hash), Some(1));
assert_eq!(slot_2_bank.get_hash_age(&slot_1_hash), Some(0));
// Check that slot 2 transactions can use any previous slot hash, including the
// hash for slot 1 which is just ticks.
let slot_2_entries = {
let to_pubkey = Pubkey::new_unique();
let mut prev_entry_hash = slot_1_hash;
let mut remaining_entry_hashes = HASHES_PER_TICK;
let mut entries: Vec<Entry> = [genesis_hash, slot_0_hash, slot_1_hash]
.into_iter()
.map(|recent_hash| {
let tx =
system_transaction::transfer(&mint_keypair, &to_pubkey, 1, recent_hash);
remaining_entry_hashes = remaining_entry_hashes.checked_sub(1).unwrap();
next_entry_mut(&mut prev_entry_hash, 1, vec![tx])
})
.collect();
entries.push(next_entry_mut(
&mut prev_entry_hash,
remaining_entry_hashes,
vec![],
));
entries.push(next_entry_mut(
&mut prev_entry_hash,
HASHES_PER_TICK,
vec![],
));
entries
};
let slot_2_hash = slot_2_entries.last().unwrap().hash;
confirm_slot_entries_for_tests(&slot_2_bank, slot_2_entries, true, slot_1_hash).unwrap();
assert_eq!(slot_2_bank.tick_height(), slot_2_bank.max_tick_height());
assert_eq!(slot_2_bank.last_blockhash(), slot_2_hash);
assert_eq!(slot_2_bank.get_hash_age(&genesis_hash), Some(3));
assert_eq!(slot_2_bank.get_hash_age(&slot_0_hash), Some(2));
assert_eq!(slot_2_bank.get_hash_age(&slot_1_hash), Some(1));
assert_eq!(slot_2_bank.get_hash_age(&slot_2_hash), Some(0));
}
} }

View File

@ -1199,7 +1199,6 @@ pub fn mock_process_instruction(
transaction_accounts: Vec<TransactionAccount>, transaction_accounts: Vec<TransactionAccount>,
instruction_accounts: Vec<AccountMeta>, instruction_accounts: Vec<AccountMeta>,
sysvar_cache_override: Option<&SysvarCache>, sysvar_cache_override: Option<&SysvarCache>,
feature_set_override: Option<Arc<FeatureSet>>,
expected_result: Result<(), InstructionError>, expected_result: Result<(), InstructionError>,
process_instruction: ProcessInstructionWithContext, process_instruction: ProcessInstructionWithContext,
) -> Vec<AccountSharedData> { ) -> Vec<AccountSharedData> {
@ -1219,9 +1218,6 @@ pub fn mock_process_instruction(
if let Some(sysvar_cache) = sysvar_cache_override { if let Some(sysvar_cache) = sysvar_cache_override {
invoke_context.sysvar_cache = Cow::Borrowed(sysvar_cache); invoke_context.sysvar_cache = Cow::Borrowed(sysvar_cache);
} }
if let Some(feature_set) = feature_set_override {
invoke_context.feature_set = feature_set;
}
let result = invoke_context let result = invoke_context
.push( .push(
&preparation.instruction_accounts, &preparation.instruction_accounts,

View File

@ -9,7 +9,7 @@ version = "1.11.0"
[dependencies] [dependencies]
assert_matches = "1.5.0" assert_matches = "1.5.0"
async-trait = "0.1.53" async-trait = "0.1.52"
base64 = "0.13.0" base64 = "0.13.0"
bincode = "1.3.3" bincode = "1.3.3"
chrono-humanize = "0.2.1" chrono-humanize = "0.2.1"

174
programs/bpf/Cargo.lock generated
View File

@ -136,13 +136,13 @@ dependencies = [
[[package]] [[package]]
name = "async-trait" name = "async-trait"
version = "0.1.53" version = "0.1.52"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -277,8 +277,8 @@ dependencies = [
"borsh-derive-internal", "borsh-derive-internal",
"borsh-schema-derive-internal", "borsh-schema-derive-internal",
"proc-macro-crate", "proc-macro-crate",
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -287,9 +287,9 @@ version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -298,9 +298,9 @@ version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -346,9 +346,9 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e215f8c2f9f79cb53c8335e687ffd07d5bfcb6fe5fc80723762d0be46e7cc54" checksum = "8e215f8c2f9f79cb53c8335e687ffd07d5bfcb6fe5fc80723762d0be46e7cc54"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -597,9 +597,9 @@ dependencies = [
[[package]] [[package]]
name = "crossbeam-channel" name = "crossbeam-channel"
version = "0.5.4" version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" checksum = "fdbfe11fe19ff083c48923cf179540e8cd0535903dc35e178a1fdeeb59aef51f"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"crossbeam-utils", "crossbeam-utils",
@ -733,9 +733,9 @@ version = "2.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eaed5874effa6cde088c644ddcdcb4ffd1511391c5be4fdd7a5ccd02c7e4a183" checksum = "eaed5874effa6cde088c644ddcdcb4ffd1511391c5be4fdd7a5ccd02c7e4a183"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -873,9 +873,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f86b50932a01e7ec5c06160492ab660fb19b6bb2a7878030dd6cd68d21df9d4d" checksum = "f86b50932a01e7ec5c06160492ab660fb19b6bb2a7878030dd6cd68d21df9d4d"
dependencies = [ dependencies = [
"enum-ordinalize", "enum-ordinalize",
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -923,9 +923,9 @@ version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -936,9 +936,9 @@ checksum = "0b166c9e378360dd5a6666a9604bb4f54ae0cac39023ffbac425e917a2a04fef"
dependencies = [ dependencies = [
"num-bigint", "num-bigint",
"num-traits", "num-traits",
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -1103,9 +1103,9 @@ version = "0.3.21"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -1763,9 +1763,9 @@ version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -1818,9 +1818,9 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c8b15b261814f992e33760b1fca9fe8b693d8a65299f20c9901688636cfb746" checksum = "0c8b15b261814f992e33760b1fca9fe8b693d8a65299f20c9901688636cfb746"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -1869,9 +1869,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1c0fd9eba1d5db0994a239e09c1be402d35622277e35468ba891aa5e3188ce7e" checksum = "1c0fd9eba1d5db0994a239e09c1be402d35622277e35468ba891aa5e3188ce7e"
dependencies = [ dependencies = [
"proc-macro-crate", "proc-macro-crate",
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -1952,9 +1952,9 @@ checksum = "ed9a247206016d424fe8497bc611e510887af5c261fbbf977877c4bb55ca4d82"
dependencies = [ dependencies = [
"Inflector", "Inflector",
"proc-macro-error", "proc-macro-error",
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -2028,9 +2028,9 @@ version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "758669ae3558c6f74bd2a18b41f7ac0b5a195aea6639d6a9b5e5d1ad5ba24c0b" checksum = "758669ae3558c6f74bd2a18b41f7ac0b5a195aea6639d6a9b5e5d1ad5ba24c0b"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -2108,9 +2108,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
dependencies = [ dependencies = [
"proc-macro-error-attr", "proc-macro-error-attr",
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
"version_check", "version_check",
] ]
@ -2120,7 +2120,7 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"version_check", "version_check",
] ]
@ -2136,9 +2136,9 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.36" version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
dependencies = [ dependencies = [
"unicode-xid 0.2.0", "unicode-xid 0.2.0",
] ]
@ -2221,7 +2221,7 @@ version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
] ]
[[package]] [[package]]
@ -2484,7 +2484,7 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
dependencies = [ dependencies = [
"semver 1.0.7", "semver 1.0.6",
] ]
[[package]] [[package]]
@ -2581,9 +2581,9 @@ version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bdbda6ac5cd1321e724fa9cee216f3a61885889b896f073b8f82322789c5250e" checksum = "bdbda6ac5cd1321e724fa9cee216f3a61885889b896f073b8f82322789c5250e"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -2630,9 +2630,9 @@ dependencies = [
[[package]] [[package]]
name = "semver" name = "semver"
version = "1.0.7" version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4" checksum = "a4a3381e03edd24287172047536f20cabde766e2cd3e65e6b00fb3af51c4f38d"
[[package]] [[package]]
name = "semver-parser" name = "semver-parser"
@ -2664,9 +2664,9 @@ version = "1.0.136"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -3336,7 +3336,7 @@ dependencies = [
"humantime", "humantime",
"indicatif", "indicatif",
"pretty-hex", "pretty-hex",
"semver 1.0.7", "semver 1.0.6",
"serde", "serde",
"serde_json", "serde_json",
"solana-account-decoder", "solana-account-decoder",
@ -3376,7 +3376,7 @@ dependencies = [
"rayon", "rayon",
"reqwest", "reqwest",
"rustls", "rustls",
"semver 1.0.7", "semver 1.0.6",
"serde", "serde",
"serde_derive", "serde_derive",
"serde_json", "serde_json",
@ -3487,20 +3487,20 @@ version = "1.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ceac6e8ad1a784c92ff5f3d6ad68a8d664d389b08055b674c38b2b9abb69e6d4" checksum = "ceac6e8ad1a784c92ff5f3d6ad68a8d664d389b08055b674c38b2b9abb69e6d4"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"rustc_version 0.2.3", "rustc_version 0.2.3",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
name = "solana-frozen-abi-macro" name = "solana-frozen-abi-macro"
version = "1.11.0" version = "1.11.0"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"rustc_version 0.4.0", "rustc_version 0.4.0",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -3728,7 +3728,7 @@ dependencies = [
"num-traits", "num-traits",
"parking_lot", "parking_lot",
"qstring", "qstring",
"semver 1.0.7", "semver 1.0.6",
"solana-sdk", "solana-sdk",
"thiserror", "thiserror",
"uriparse", "uriparse",
@ -3844,10 +3844,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84710ce45a21cccd9f2b09d8e9aad529080bb2540f27b1253874b6e732b465b9" checksum = "84710ce45a21cccd9f2b09d8e9aad529080bb2540f27b1253874b6e732b465b9"
dependencies = [ dependencies = [
"bs58 0.3.1", "bs58 0.3.1",
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"rustversion", "rustversion",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -3855,10 +3855,10 @@ name = "solana-sdk-macro"
version = "1.11.0" version = "1.11.0"
dependencies = [ dependencies = [
"bs58 0.4.0", "bs58 0.4.0",
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"rustversion", "rustversion",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -4133,11 +4133,11 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.91" version = "1.0.67"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" checksum = "6498a9efc342871f91cc2d0d694c674368b4ceb40f62b65a7a08c3792935e702"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"unicode-xid 0.2.0", "unicode-xid 0.2.0",
] ]
@ -4148,9 +4148,9 @@ version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" checksum = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
"unicode-xid 0.2.0", "unicode-xid 0.2.0",
] ]
@ -4195,9 +4195,9 @@ version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f" checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -4263,9 +4263,9 @@ version = "1.0.30"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -4357,9 +4357,9 @@ version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -4465,9 +4465,9 @@ version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e" checksum = "f4f480b8f81512e825f337ad51e94c1eb5d3bbdf2b363dcd01e2b19a9ffe3f8e"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
] ]
[[package]] [[package]]
@ -4678,9 +4678,9 @@ checksum = "93c6c3420963c5c64bca373b25e77acb562081b9bb4dd5bb864187742186cea9"
[[package]] [[package]]
name = "wasm-bindgen" name = "wasm-bindgen"
version = "0.2.80" version = "0.2.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce"
dependencies = [ dependencies = [
"cfg-if 1.0.0", "cfg-if 1.0.0",
"wasm-bindgen-macro", "wasm-bindgen-macro",
@ -4688,16 +4688,16 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-backend" name = "wasm-bindgen-backend"
version = "0.2.80" version = "0.2.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"lazy_static", "lazy_static",
"log", "log",
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -4715,9 +4715,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.80" version = "0.2.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9"
dependencies = [ dependencies = [
"quote 1.0.6", "quote 1.0.6",
"wasm-bindgen-macro-support", "wasm-bindgen-macro-support",
@ -4725,22 +4725,22 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro-support" name = "wasm-bindgen-macro-support"
version = "0.2.80" version = "0.2.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
[[package]] [[package]]
name = "wasm-bindgen-shared" name = "wasm-bindgen-shared"
version = "0.2.80" version = "0.2.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc"
[[package]] [[package]]
name = "web-sys" name = "web-sys"
@ -4896,9 +4896,9 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bdff2024a851a322b08f179173ae2ba620445aef1e838f0c196820eade4ae0c7" checksum = "bdff2024a851a322b08f179173ae2ba620445aef1e838f0c196820eade4ae0c7"
dependencies = [ dependencies = [
"proc-macro2 1.0.36", "proc-macro2 1.0.24",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.91", "syn 1.0.67",
"synstructure", "synstructure",
] ]

View File

@ -1326,7 +1326,6 @@ mod tests {
transaction_accounts, transaction_accounts,
instruction_accounts, instruction_accounts,
None, None,
None,
expected_result, expected_result,
super::process_instruction, super::process_instruction,
) )
@ -1588,7 +1587,6 @@ mod tests {
vec![(program_id, program_account.clone())], vec![(program_id, program_account.clone())],
Vec::new(), Vec::new(),
None, None,
None,
Err(InstructionError::ProgramFailedToComplete), Err(InstructionError::ProgramFailedToComplete),
|first_instruction_account: usize, invoke_context: &mut InvokeContext| { |first_instruction_account: usize, invoke_context: &mut InvokeContext| {
invoke_context invoke_context
@ -2854,7 +2852,6 @@ mod tests {
transaction_accounts, transaction_accounts,
instruction_accounts, instruction_accounts,
None, None,
None,
expected_result, expected_result,
super::process_instruction, super::process_instruction,
) )

View File

@ -169,7 +169,6 @@ mod tests {
transaction_accounts, transaction_accounts,
instruction_accounts, instruction_accounts,
None, None,
None,
expected_result, expected_result,
super::process_instruction, super::process_instruction,
) )

View File

@ -538,7 +538,6 @@ mod tests {
transaction_accounts, transaction_accounts,
instruction_accounts, instruction_accounts,
sysvar_cache_override, sysvar_cache_override,
None,
expected_result, expected_result,
super::process_instruction, super::process_instruction,
) )
@ -1924,8 +1923,7 @@ mod tests {
fn test_authorize_delegated_stake() { fn test_authorize_delegated_stake() {
let authority_address = solana_sdk::pubkey::new_rand(); let authority_address = solana_sdk::pubkey::new_rand();
let stake_address = solana_sdk::pubkey::new_rand(); let stake_address = solana_sdk::pubkey::new_rand();
let minimum_delegation = crate::get_minimum_delegation(&FeatureSet::all_enabled()); let stake_lamports = 42;
let stake_lamports = minimum_delegation;
let stake_account = AccountSharedData::new_data_with_space( let stake_account = AccountSharedData::new_data_with_space(
stake_lamports, stake_lamports,
&StakeState::Initialized(Meta::auto(&stake_address)), &StakeState::Initialized(Meta::auto(&stake_address)),
@ -2123,8 +2121,7 @@ mod tests {
vote_account_2 vote_account_2
.set_state(&VoteStateVersions::new_current(vote_state)) .set_state(&VoteStateVersions::new_current(vote_state))
.unwrap(); .unwrap();
let minimum_delegation = crate::get_minimum_delegation(&FeatureSet::all_enabled()); let stake_lamports = 42;
let stake_lamports = minimum_delegation;
let stake_address = solana_sdk::pubkey::new_rand(); let stake_address = solana_sdk::pubkey::new_rand();
let mut stake_account = AccountSharedData::new_data_with_space( let mut stake_account = AccountSharedData::new_data_with_space(
stake_lamports, stake_lamports,
@ -2940,9 +2937,8 @@ mod tests {
fn test_withdraw_stake_before_warmup() { fn test_withdraw_stake_before_warmup() {
let recipient_address = solana_sdk::pubkey::new_rand(); let recipient_address = solana_sdk::pubkey::new_rand();
let stake_address = solana_sdk::pubkey::new_rand(); let stake_address = solana_sdk::pubkey::new_rand();
let minimum_delegation = crate::get_minimum_delegation(&FeatureSet::all_enabled()); let stake_lamports = 42;
let stake_lamports = minimum_delegation; let total_lamports = 100;
let total_lamports = stake_lamports + 33;
let stake_account = AccountSharedData::new_data_with_space( let stake_account = AccountSharedData::new_data_with_space(
total_lamports, total_lamports,
&StakeState::Initialized(Meta::auto(&stake_address)), &StakeState::Initialized(Meta::auto(&stake_address)),
@ -3292,8 +3288,7 @@ mod tests {
#[test] #[test]
fn test_deactivate() { fn test_deactivate() {
let stake_address = solana_sdk::pubkey::new_rand(); let stake_address = solana_sdk::pubkey::new_rand();
let minimum_delegation = crate::get_minimum_delegation(&FeatureSet::all_enabled()); let stake_lamports = 42;
let stake_lamports = minimum_delegation;
let stake_account = AccountSharedData::new_data_with_space( let stake_account = AccountSharedData::new_data_with_space(
stake_lamports, stake_lamports,
&StakeState::Initialized(Meta::auto(&stake_address)), &StakeState::Initialized(Meta::auto(&stake_address)),
@ -4403,7 +4398,6 @@ mod tests {
], ],
Ok(()), Ok(()),
); );
transaction_accounts[0] = (stake_address, accounts[0].clone());
process_instruction( process_instruction(
&serialize(&StakeInstruction::DelegateStake).unwrap(), &serialize(&StakeInstruction::DelegateStake).unwrap(),
@ -6078,7 +6072,6 @@ mod tests {
transaction_accounts, transaction_accounts,
instruction_accounts, instruction_accounts,
None, None,
None,
Ok(()), Ok(()),
|first_instruction_account, invoke_context| { |first_instruction_account, invoke_context| {
super::process_instruction(first_instruction_account, invoke_context)?; super::process_instruction(first_instruction_account, invoke_context)?;
@ -6201,13 +6194,6 @@ mod tests {
Err(InstructionError::NotEnoughAccountKeys), Err(InstructionError::NotEnoughAccountKeys),
), ),
] { ] {
let mut feature_set = FeatureSet::all_enabled();
if !is_feature_enabled {
feature_set.deactivate(
&feature_set::add_get_minimum_delegation_instruction_to_stake_program::id(),
);
}
mock_process_instruction( mock_process_instruction(
&id(), &id(),
Vec::new(), Vec::new(),
@ -6215,9 +6201,19 @@ mod tests {
transaction_accounts.clone(), transaction_accounts.clone(),
instruction_accounts.clone(), instruction_accounts.clone(),
None, None,
Some(Arc::new(feature_set)),
expected_result, expected_result,
super::process_instruction, if is_feature_enabled {
|first_instruction_account, invoke_context| {
super::process_instruction(first_instruction_account, invoke_context)
}
} else {
|first_instruction_account, invoke_context| {
let mut feature_set = FeatureSet::all_enabled();
feature_set.deactivate(&feature_set::add_get_minimum_delegation_instruction_to_stake_program::id());
invoke_context.feature_set = Arc::new(feature_set);
super::process_instruction(first_instruction_account, invoke_context)
}
},
); );
} }
} }

View File

@ -203,7 +203,6 @@ mod tests {
transaction_accounts, transaction_accounts,
instruction_accounts, instruction_accounts,
None, None,
None,
expected_result, expected_result,
super::process_instruction, super::process_instruction,
) )
@ -222,9 +221,11 @@ mod tests {
transaction_accounts, transaction_accounts,
instruction_accounts, instruction_accounts,
None, None,
Some(std::sync::Arc::new(FeatureSet::default())),
expected_result, expected_result,
super::process_instruction, |first_instruction_account: usize, invoke_context: &mut InvokeContext| {
invoke_context.feature_set = std::sync::Arc::new(FeatureSet::default());
super::process_instruction(first_instruction_account, invoke_context)
},
) )
} }

View File

@ -7175,8 +7175,6 @@ impl AccountsDb {
timings.report(); timings.report();
} }
self.accounts_index.log_secondary_indexes();
IndexGenerationInfo { IndexGenerationInfo {
accounts_data_len: accounts_data_len.load(Ordering::Relaxed), accounts_data_len: accounts_data_len.load(Ordering::Relaxed),
} }

View File

@ -1408,22 +1408,6 @@ impl<T: IndexValue> AccountsIndex<T> {
} }
} }
/// log any secondary index counts, if non-zero
pub(crate) fn log_secondary_indexes(&self) {
if !self.program_id_index.index.is_empty() {
info!("secondary index: {:?}", AccountIndex::ProgramId);
self.program_id_index.log_contents();
}
if !self.spl_token_mint_index.index.is_empty() {
info!("secondary index: {:?}", AccountIndex::SplTokenMint);
self.spl_token_mint_index.log_contents();
}
if !self.spl_token_owner_index.index.is_empty() {
info!("secondary index: {:?}", AccountIndex::SplTokenOwner);
self.spl_token_owner_index.log_contents();
}
}
pub(crate) fn update_secondary_indexes( pub(crate) fn update_secondary_indexes(
&self, &self,
pubkey: &Pubkey, pubkey: &Pubkey,

View File

@ -93,8 +93,8 @@ use {
account_utils::StateMut, account_utils::StateMut,
clock::{ clock::{
BankId, Epoch, Slot, SlotCount, SlotIndex, UnixTimestamp, DEFAULT_TICKS_PER_SECOND, BankId, Epoch, Slot, SlotCount, SlotIndex, UnixTimestamp, DEFAULT_TICKS_PER_SECOND,
INITIAL_RENT_EPOCH, MAX_PROCESSING_AGE, MAX_TRANSACTION_FORWARDING_DELAY, INITIAL_RENT_EPOCH, MAX_PROCESSING_AGE, MAX_RECENT_BLOCKHASHES,
SECONDS_PER_DAY, MAX_TRANSACTION_FORWARDING_DELAY, SECONDS_PER_DAY,
}, },
ed25519_program, ed25519_program,
epoch_info::EpochInfo, epoch_info::EpochInfo,
@ -1252,6 +1252,12 @@ pub struct Bank {
pub fee_structure: FeeStructure, pub fee_structure: FeeStructure,
} }
impl Default for BlockhashQueue {
fn default() -> Self {
Self::new(MAX_RECENT_BLOCKHASHES)
}
}
struct VoteWithStakeDelegations { struct VoteWithStakeDelegations {
vote_state: Arc<VoteState>, vote_state: Arc<VoteState>,
vote_account: AccountSharedData, vote_account: AccountSharedData,
@ -3724,10 +3730,6 @@ impl Bank {
.collect() .collect()
} }
pub fn get_hash_age(&self, hash: &Hash) -> Option<u64> {
self.blockhash_queue.read().unwrap().get_hash_age(hash)
}
pub fn check_hash_age(&self, hash: &Hash, max_age: usize) -> Option<bool> { pub fn check_hash_age(&self, hash: &Hash, max_age: usize) -> Option<bool> {
self.blockhash_queue self.blockhash_queue
.read() .read()
@ -6852,7 +6854,7 @@ pub(crate) mod tests {
solana_sdk::{ solana_sdk::{
account::Account, account::Account,
bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable, bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable,
clock::{DEFAULT_SLOTS_PER_EPOCH, DEFAULT_TICKS_PER_SLOT, MAX_RECENT_BLOCKHASHES}, clock::{DEFAULT_SLOTS_PER_EPOCH, DEFAULT_TICKS_PER_SLOT},
compute_budget::ComputeBudgetInstruction, compute_budget::ComputeBudgetInstruction,
epoch_schedule::MINIMUM_SLOTS_PER_EPOCH, epoch_schedule::MINIMUM_SLOTS_PER_EPOCH,
feature::Feature, feature::Feature,

View File

@ -2,9 +2,7 @@
use solana_sdk::sysvar::recent_blockhashes; use solana_sdk::sysvar::recent_blockhashes;
use { use {
serde::{Deserialize, Serialize}, serde::{Deserialize, Serialize},
solana_sdk::{ solana_sdk::{fee_calculator::FeeCalculator, hash::Hash, timing::timestamp},
clock::MAX_RECENT_BLOCKHASHES, fee_calculator::FeeCalculator, hash::Hash, timing::timestamp,
},
std::collections::HashMap, std::collections::HashMap,
}; };
@ -31,12 +29,6 @@ pub struct BlockhashQueue {
max_age: usize, max_age: usize,
} }
impl Default for BlockhashQueue {
fn default() -> Self {
Self::new(MAX_RECENT_BLOCKHASHES)
}
}
impl BlockhashQueue { impl BlockhashQueue {
pub fn new(max_age: usize) -> Self { pub fn new(max_age: usize) -> Self {
Self { Self {

View File

@ -208,72 +208,14 @@ Every highest_root >= 432k * 2 + 80 and < 432k * 3 + 80 is this same result
*/ */
/// specify a slot
/// and keep track of epoch info for that slot
/// The idea is that algorithms often iterate over a storage slot or over a max/bank slot.
/// The epoch info for that slot will be fixed for many pubkeys, so save the calculated results.
/// There are 2 slots required for rent collection algorithms. Some callers have storage slot fixed
/// while others have max/bank slot fixed. 'epoch_info' isn't always needed, so it is optionally
/// specified by caller and only used by callee if necessary.
#[allow(dead_code)]
#[derive(Default, Copy, Clone)]
pub struct SlotInfoInEpoch {
/// the slot
slot: Slot,
/// possible info about this slot
epoch_info: Option<SlotInfoInEpochInner>,
}
/// epoch info for a slot
#[allow(dead_code)]
#[derive(Default, Copy, Clone)]
pub struct SlotInfoInEpochInner {
/// epoch of the slot
epoch: Epoch,
/// partition index of the slot within the epoch
partition_index: PartitionIndex,
/// number of slots in this epoch
slots_in_epoch: Slot,
}
#[allow(dead_code)]
impl SlotInfoInEpoch {
/// create, populating epoch info
pub fn new(slot: Slot, epoch_schedule: &EpochSchedule) -> Self {
let mut result = Self::new_small(slot);
result.epoch_info = Some(result.get_epoch_info(epoch_schedule));
result
}
/// create, without populating epoch info
pub fn new_small(slot: Slot) -> Self {
SlotInfoInEpoch {
slot,
..SlotInfoInEpoch::default()
}
}
/// get epoch info by returning already calculated or by calculating it now
pub fn get_epoch_info(&self, epoch_schedule: &EpochSchedule) -> SlotInfoInEpochInner {
if let Some(inner) = &self.epoch_info {
*inner
} else {
let (epoch, partition_index) = epoch_schedule.get_epoch_and_slot_index(self.slot);
SlotInfoInEpochInner {
epoch,
partition_index,
slots_in_epoch: epoch_schedule.get_slots_in_epoch(epoch),
}
}
}
}
impl ExpectedRentCollection { impl ExpectedRentCollection {
#[allow(dead_code)] #[allow(dead_code)]
/// 'account' is being loaded from 'storage_slot' in 'bank_slot' /// 'account' is being loaded from 'storage_slot' in 'bank_slot'
/// adjusts 'account.rent_epoch' if we skipped the last rewrite on this account /// adjusts 'account.rent_epoch' if we skipped the last rewrite on this account
pub fn maybe_update_rent_epoch_on_load( pub fn maybe_update_rent_epoch_on_load(
account: &mut AccountSharedData, account: &mut AccountSharedData,
storage_slot: &SlotInfoInEpoch, storage_slot: Slot,
bank_slot: &SlotInfoInEpoch, bank_slot: Slot,
epoch_schedule: &EpochSchedule, epoch_schedule: &EpochSchedule,
rent_collector: &RentCollector, rent_collector: &RentCollector,
pubkey: &Pubkey, pubkey: &Pubkey,
@ -299,8 +241,8 @@ impl ExpectedRentCollection {
/// returns None if the account is up to date /// returns None if the account is up to date
fn get_corrected_rent_epoch_on_load( fn get_corrected_rent_epoch_on_load(
account: &AccountSharedData, account: &AccountSharedData,
storage_slot: &SlotInfoInEpoch, storage_slot: Slot,
bank_slot: &SlotInfoInEpoch, bank_slot: Slot,
epoch_schedule: &EpochSchedule, epoch_schedule: &EpochSchedule,
rent_collector: &RentCollector, rent_collector: &RentCollector,
pubkey: &Pubkey, pubkey: &Pubkey,
@ -314,15 +256,14 @@ impl ExpectedRentCollection {
return None; return None;
} }
// grab epoch infno for bank slot and storage slot
let bank_info = bank_slot.get_epoch_info(epoch_schedule);
let (current_epoch, partition_from_current_slot) = let (current_epoch, partition_from_current_slot) =
(bank_info.epoch, bank_info.partition_index); epoch_schedule.get_epoch_and_slot_index(bank_slot);
let storage_info = storage_slot.get_epoch_info(epoch_schedule);
let (storage_epoch, storage_slot_partition) = let (storage_epoch, storage_slot_partition) =
(storage_info.epoch, storage_info.partition_index); epoch_schedule.get_epoch_and_slot_index(storage_slot);
let partition_from_pubkey = let partition_from_pubkey = Bank::partition_from_pubkey(
Bank::partition_from_pubkey(pubkey, bank_info.slots_in_epoch); pubkey,
epoch_schedule.get_slots_in_epoch(current_epoch),
);
let mut possibly_update = true; let mut possibly_update = true;
if current_epoch == storage_epoch { if current_epoch == storage_epoch {
// storage is in same epoch as bank // storage is in same epoch as bank
@ -347,13 +288,13 @@ impl ExpectedRentCollection {
.contains_key(pubkey) .contains_key(pubkey)
}; };
let rent_epoch = account.rent_epoch(); let rent_epoch = account.rent_epoch();
if possibly_update && rent_epoch == 0 && current_epoch > 1 { if possibly_update
if rewrites_skipped_this_pubkey_this_slot() { && rent_epoch == 0
return Some(next_epoch); && current_epoch > 1
} else { && !rewrites_skipped_this_pubkey_this_slot()
// we know we're done {
return None; // we know we're done
} return None;
} }
// if an account was written >= its rent collection slot within the last epoch worth of slots, then we don't want to update it here // if an account was written >= its rent collection slot within the last epoch worth of slots, then we don't want to update it here
@ -1167,87 +1108,77 @@ pub mod tests {
one run without skipping slot 8470, once WITH skipping slot 8470 one run without skipping slot 8470, once WITH skipping slot 8470
*/ */
for new_small in [false, true] { for rewrite_already in [false, true] {
for rewrite_already in [false, true] { // starting at epoch = 0 has issues because of rent_epoch=0 special casing
// starting at epoch = 0 has issues because of rent_epoch=0 special casing for epoch in 1..4 {
for epoch in 1..4 { for partition_index_bank_slot in
for partition_index_bank_slot in partition_from_pubkey - 1..=partition_from_pubkey + 2
partition_from_pubkey - 1..=partition_from_pubkey + 2 {
{ let bank_slot =
let bank_slot = slots_per_epoch * epoch + first_normal_slot + partition_index_bank_slot;
slots_per_epoch * epoch + first_normal_slot + partition_index_bank_slot; if storage_slot > bank_slot {
if storage_slot > bank_slot { continue; // illegal combination
continue; // illegal combination
}
rent_collector.epoch = epoch_schedule.get_epoch(bank_slot);
let first_slot_in_max_epoch = bank_slot - bank_slot % slots_per_epoch;
assert_eq!(
(epoch, partition_index_bank_slot),
epoch_schedule.get_epoch_and_slot_index(bank_slot)
);
assert_eq!(
(epoch, 0),
epoch_schedule.get_epoch_and_slot_index(first_slot_in_max_epoch)
);
account.set_rent_epoch(1);
let rewrites = Rewrites::default();
if rewrite_already {
if partition_index_bank_slot != partition_from_pubkey {
// this is an invalid test occurrence.
// we wouldn't have inserted pubkey into 'rewrite_already' for this slot if the current partition index wasn't at the pubkey's partition idnex yet.
continue;
}
rewrites.write().unwrap().insert(pubkey, Hash::default());
}
let expected_new_rent_epoch =
if partition_index_bank_slot > partition_from_pubkey {
if epoch > account.rent_epoch() {
Some(rent_collector.epoch)
} else {
None
}
} else if partition_index_bank_slot == partition_from_pubkey
&& rewrite_already
{
let expected_rent_epoch = rent_collector.epoch;
if expected_rent_epoch == account.rent_epoch() {
None
} else {
Some(expected_rent_epoch)
}
} else if partition_index_bank_slot <= partition_from_pubkey
&& epoch > account.rent_epoch()
{
let expected_rent_epoch = rent_collector.epoch.saturating_sub(1);
if expected_rent_epoch == account.rent_epoch() {
None
} else {
Some(expected_rent_epoch)
}
} else {
None
};
let get_slot_info = |slot| {
if new_small {
SlotInfoInEpoch::new_small(slot)
} else {
SlotInfoInEpoch::new(slot, &epoch_schedule)
}
};
let new_rent_epoch =
ExpectedRentCollection::get_corrected_rent_epoch_on_load(
&account,
&get_slot_info(storage_slot),
&get_slot_info(bank_slot),
&epoch_schedule,
&rent_collector,
&pubkey,
&rewrites,
);
assert_eq!(new_rent_epoch, expected_new_rent_epoch);
} }
rent_collector.epoch = epoch_schedule.get_epoch(bank_slot);
let first_slot_in_max_epoch = bank_slot - bank_slot % slots_per_epoch;
assert_eq!(
(epoch, partition_index_bank_slot),
epoch_schedule.get_epoch_and_slot_index(bank_slot)
);
assert_eq!(
(epoch, 0),
epoch_schedule.get_epoch_and_slot_index(first_slot_in_max_epoch)
);
account.set_rent_epoch(1);
let rewrites = Rewrites::default();
if rewrite_already {
if partition_index_bank_slot != partition_from_pubkey {
// this is an invalid test occurrence.
// we wouldn't have inserted pubkey into 'rewrite_already' for this slot if the current partition index wasn't at the pubkey's partition idnex yet.
continue;
}
rewrites.write().unwrap().insert(pubkey, Hash::default());
}
let expected_new_rent_epoch = if partition_index_bank_slot
> partition_from_pubkey
{
if epoch > account.rent_epoch() {
Some(rent_collector.epoch)
} else {
None
}
} else if partition_index_bank_slot == partition_from_pubkey && rewrite_already
{
let expected_rent_epoch = rent_collector.epoch;
if expected_rent_epoch == account.rent_epoch() {
None
} else {
Some(expected_rent_epoch)
}
} else if partition_index_bank_slot <= partition_from_pubkey
&& epoch > account.rent_epoch()
{
let expected_rent_epoch = rent_collector.epoch.saturating_sub(1);
if expected_rent_epoch == account.rent_epoch() {
None
} else {
Some(expected_rent_epoch)
}
} else {
None
};
let new_rent_epoch = ExpectedRentCollection::get_corrected_rent_epoch_on_load(
&account,
storage_slot,
bank_slot,
&epoch_schedule,
&rent_collector,
&pubkey,
&rewrites,
);
assert_eq!(new_rent_epoch, expected_new_rent_epoch);
} }
} }
} }

View File

@ -1,6 +1,5 @@
use { use {
dashmap::{mapref::entry::Entry::Occupied, DashMap}, dashmap::{mapref::entry::Entry::Occupied, DashMap},
log::*,
solana_sdk::{pubkey::Pubkey, timing::AtomicInterval}, solana_sdk::{pubkey::Pubkey, timing::AtomicInterval},
std::{ std::{
collections::HashSet, collections::HashSet,
@ -224,19 +223,4 @@ impl<SecondaryIndexEntryType: SecondaryIndexEntry + Default + Sync + Send>
vec![] vec![]
} }
} }
/// log top 20 (owner, # accounts) in descending order of # accounts
pub fn log_contents(&self) {
let mut entries = self
.index
.iter()
.map(|entry| (entry.value().len(), *entry.key()))
.collect::<Vec<_>>();
entries.sort_unstable();
entries
.iter()
.rev()
.take(20)
.for_each(|(v, k)| info!("owner: {}, accounts: {}", k, v));
}
} }

View File

@ -531,7 +531,6 @@ mod tests {
transaction_accounts, transaction_accounts,
instruction_accounts, instruction_accounts,
None, None,
None,
expected_result, expected_result,
process_instruction, process_instruction,
) )

View File

@ -38,19 +38,6 @@ example_helloworld() {
spl() { spl() {
( (
# Mind the order!
PROGRAMS=(
token/program
token/program-2022
token/program-2022-test
associated-token-account/program
feature-proposal/program
governance/addin-mock/program
governance/program
memo/program
name-service/program
stake-pool/program
)
set -x set -x
rm -rf spl rm -rf spl
git clone https://github.com/solana-labs/solana-program-library.git spl git clone https://github.com/solana-labs/solana-program-library.git spl
@ -58,15 +45,10 @@ spl() {
./patch.crates-io.sh "$solana_dir" ./patch.crates-io.sh "$solana_dir"
for program in "${PROGRAMS[@]}"; do
$cargo_test_bpf --manifest-path "$program"/Cargo.toml
done
# TODO better: `build.rs` for spl-token-cli doesn't seem to properly build
# the required programs to run the tests, so instead we run the tests
# after we know programs have been built
$cargo build $cargo build
$cargo test $cargo test
$cargo_build_bpf
$cargo_test_bpf
) )
} }

View File

@ -29,7 +29,6 @@ struct Config<'a> {
offline: bool, offline: bool,
verbose: bool, verbose: bool,
workspace: bool, workspace: bool,
jobs: Option<String>,
} }
impl Default for Config<'_> { impl Default for Config<'_> {
@ -52,7 +51,6 @@ impl Default for Config<'_> {
offline: false, offline: false,
verbose: false, verbose: false,
workspace: false, workspace: false,
jobs: None,
} }
} }
} }
@ -547,10 +545,6 @@ fn build_bpf_package(config: &Config, target_directory: &Path, package: &cargo_m
if config.verbose { if config.verbose {
cargo_build_args.push("--verbose"); cargo_build_args.push("--verbose");
} }
if let Some(jobs) = &config.jobs {
cargo_build_args.push("--jobs");
cargo_build_args.push(jobs);
}
if let Some(args) = &config.cargo_args { if let Some(args) = &config.cargo_args {
for arg in args { for arg in args {
cargo_build_args.push(arg); cargo_build_args.push(arg);
@ -799,15 +793,6 @@ fn main() {
.alias("all") .alias("all")
.help("Build all BPF packages in the workspace"), .help("Build all BPF packages in the workspace"),
) )
.arg(
Arg::new("jobs")
.short('j')
.long("jobs")
.takes_value(true)
.value_name("N")
.validator(|val| val.parse::<usize>().map_err(|e| e.to_string()))
.help("Number of parallel jobs, defaults to # of CPUs"),
)
.get_matches_from(args); .get_matches_from(args);
let bpf_sdk: PathBuf = matches.value_of_t_or_exit("bpf_sdk"); let bpf_sdk: PathBuf = matches.value_of_t_or_exit("bpf_sdk");
@ -842,7 +827,6 @@ fn main() {
offline: matches.is_present("offline"), offline: matches.is_present("offline"),
verbose: matches.is_present("verbose"), verbose: matches.is_present("verbose"),
workspace: matches.is_present("workspace"), workspace: matches.is_present("workspace"),
jobs: matches.value_of_t("jobs").ok(),
}; };
let manifest_path: Option<PathBuf> = matches.value_of_t("manifest_path").ok(); let manifest_path: Option<PathBuf> = matches.value_of_t("manifest_path").ok();
build_bpf(config, manifest_path); build_bpf(config, manifest_path);

View File

@ -24,7 +24,6 @@ struct Config {
offline: bool, offline: bool,
verbose: bool, verbose: bool,
workspace: bool, workspace: bool,
jobs: Option<String>,
} }
impl Default for Config { impl Default for Config {
@ -43,7 +42,6 @@ impl Default for Config {
offline: false, offline: false,
verbose: false, verbose: false,
workspace: false, workspace: false,
jobs: None,
} }
} }
} }
@ -118,10 +116,6 @@ fn test_bpf_package(config: &Config, target_directory: &Path, package: &cargo_me
if config.verbose { if config.verbose {
cargo_args.push("--verbose"); cargo_args.push("--verbose");
} }
if let Some(jobs) = &config.jobs {
cargo_args.push("--jobs");
cargo_args.push(jobs);
}
let mut build_bpf_args = cargo_args.clone(); let mut build_bpf_args = cargo_args.clone();
if let Some(bpf_sdk) = config.bpf_sdk.as_ref() { if let Some(bpf_sdk) = config.bpf_sdk.as_ref() {
@ -300,15 +294,6 @@ fn main() {
.alias("all") .alias("all")
.help("Test all BPF packages in the workspace"), .help("Test all BPF packages in the workspace"),
) )
.arg(
Arg::new("jobs")
.short('j')
.long("jobs")
.takes_value(true)
.value_name("N")
.validator(|val| val.parse::<usize>().map_err(|e| e.to_string()))
.help("Number of parallel jobs, defaults to # of CPUs"),
)
.arg( .arg(
Arg::new("extra_cargo_test_args") Arg::new("extra_cargo_test_args")
.value_name("extra args for cargo test and the test binary") .value_name("extra args for cargo test and the test binary")
@ -334,7 +319,6 @@ fn main() {
offline: matches.is_present("offline"), offline: matches.is_present("offline"),
verbose: matches.is_present("verbose"), verbose: matches.is_present("verbose"),
workspace: matches.is_present("workspace"), workspace: matches.is_present("workspace"),
jobs: matches.value_of_t("jobs").ok(),
..Config::default() ..Config::default()
}; };

View File

@ -198,10 +198,6 @@ impl Parse for RespanInput {
respan_using: ident.span(), respan_using: ident.span(),
}) })
} }
TokenTree::Ident(i) => Ok(RespanInput {
to_respan,
respan_using: i.span(),
}),
val => Err(syn::Error::new_spanned( val => Err(syn::Error::new_spanned(
val, val,
"expected None-delimited group", "expected None-delimited group",

View File

@ -69,9 +69,9 @@ pub fn sol_memcmp(s1: &[u8], s2: &[u8], n: usize) -> i32 {
/// Memset /// Memset
/// ///
/// @param s - Slice to be set /// @param s1 - Slice to be compared
/// @param c - Repeated byte to set /// @param s2 - Slice to be compared
/// @param n - Number of bytes to set /// @param n - Number of bytes to compare
#[inline] #[inline]
pub fn sol_memset(s: &mut [u8], c: u8, n: usize) { pub fn sol_memset(s: &mut [u8], c: u8, n: usize) {
#[cfg(target_arch = "bpf")] #[cfg(target_arch = "bpf")]

View File

@ -3,6 +3,3 @@ pub const QUIC_PORT_OFFSET: u16 = 6;
// that seems to maximize TPS on GCE (higher values don't seem to // that seems to maximize TPS on GCE (higher values don't seem to
// give significant improvement or seem to impact stability) // give significant improvement or seem to impact stability)
pub const QUIC_MAX_CONCURRENT_STREAMS: usize = 2048; pub const QUIC_MAX_CONCURRENT_STREAMS: usize = 2048;
pub const QUIC_MAX_TIMEOUT_MS: u32 = 2_000;
pub const QUIC_KEEP_ALIVE_MS: u64 = 1_000;

View File

@ -3,12 +3,12 @@ use {
futures_util::stream::StreamExt, futures_util::stream::StreamExt,
pem::Pem, pem::Pem,
pkcs8::{der::Document, AlgorithmIdentifier, ObjectIdentifier}, pkcs8::{der::Document, AlgorithmIdentifier, ObjectIdentifier},
quinn::{Endpoint, EndpointConfig, IdleTimeout, IncomingUniStreams, ServerConfig, VarInt}, quinn::{Endpoint, EndpointConfig, IncomingUniStreams, ServerConfig},
rcgen::{CertificateParams, DistinguishedName, DnType, SanType}, rcgen::{CertificateParams, DistinguishedName, DnType, SanType},
solana_perf::packet::PacketBatch, solana_perf::packet::PacketBatch,
solana_sdk::{ solana_sdk::{
packet::{Packet, PACKET_DATA_SIZE}, packet::{Packet, PACKET_DATA_SIZE},
quic::{QUIC_MAX_CONCURRENT_STREAMS, QUIC_MAX_TIMEOUT_MS}, quic::QUIC_MAX_CONCURRENT_STREAMS,
signature::Keypair, signature::Keypair,
timing, timing,
}, },
@ -18,7 +18,7 @@ use {
net::{IpAddr, SocketAddr, UdpSocket}, net::{IpAddr, SocketAddr, UdpSocket},
sync::{ sync::{
atomic::{AtomicBool, AtomicU64, AtomicUsize, Ordering}, atomic::{AtomicBool, AtomicU64, AtomicUsize, Ordering},
Arc, Mutex, RwLock, Arc, Mutex,
}, },
thread, thread,
time::{Duration, Instant}, time::{Duration, Instant},
@ -29,9 +29,6 @@ use {
}, },
}; };
pub const MAX_STAKED_CONNECTIONS: usize = 2000;
pub const MAX_UNSTAKED_CONNECTIONS: usize = 500;
/// Returns default server configuration along with its PEM certificate chain. /// Returns default server configuration along with its PEM certificate chain.
#[allow(clippy::field_reassign_with_default)] // https://github.com/rust-lang/rust-clippy/issues/6527 #[allow(clippy::field_reassign_with_default)] // https://github.com/rust-lang/rust-clippy/issues/6527
fn configure_server( fn configure_server(
@ -58,8 +55,6 @@ fn configure_server(
config.max_concurrent_uni_streams(MAX_CONCURRENT_UNI_STREAMS.into()); config.max_concurrent_uni_streams(MAX_CONCURRENT_UNI_STREAMS.into());
config.stream_receive_window((PACKET_DATA_SIZE as u32).into()); config.stream_receive_window((PACKET_DATA_SIZE as u32).into());
config.receive_window((PACKET_DATA_SIZE as u32 * MAX_CONCURRENT_UNI_STREAMS).into()); config.receive_window((PACKET_DATA_SIZE as u32 * MAX_CONCURRENT_UNI_STREAMS).into());
let timeout = IdleTimeout::from(VarInt::from_u32(QUIC_MAX_TIMEOUT_MS));
config.max_idle_timeout(Some(timeout));
// disable bidi & datagrams // disable bidi & datagrams
const MAX_CONCURRENT_BIDI_STREAMS: u32 = 0; const MAX_CONCURRENT_BIDI_STREAMS: u32 = 0;
@ -404,9 +399,6 @@ pub fn spawn_server(
packet_sender: Sender<PacketBatch>, packet_sender: Sender<PacketBatch>,
exit: Arc<AtomicBool>, exit: Arc<AtomicBool>,
max_connections_per_ip: usize, max_connections_per_ip: usize,
staked_nodes: Arc<RwLock<HashMap<IpAddr, u64>>>,
max_staked_connections: usize,
max_unstaked_connections: usize,
) -> Result<thread::JoinHandle<()>, QuicServerError> { ) -> Result<thread::JoinHandle<()>, QuicServerError> {
let (config, _cert) = configure_server(keypair, gossip_host)?; let (config, _cert) = configure_server(keypair, gossip_host)?;
@ -424,8 +416,6 @@ pub fn spawn_server(
let mut last_datapoint = Instant::now(); let mut last_datapoint = Instant::now();
let connection_table: Arc<Mutex<ConnectionTable>> = let connection_table: Arc<Mutex<ConnectionTable>> =
Arc::new(Mutex::new(ConnectionTable::default())); Arc::new(Mutex::new(ConnectionTable::default()));
let staked_connection_table: Arc<Mutex<ConnectionTable>> =
Arc::new(Mutex::new(ConnectionTable::default()));
while !exit.load(Ordering::Relaxed) { while !exit.load(Ordering::Relaxed) {
const WAIT_FOR_CONNECTION_TIMEOUT_MS: u64 = 1000; const WAIT_FOR_CONNECTION_TIMEOUT_MS: u64 = 1000;
let timeout_connection = timeout( let timeout_connection = timeout(
@ -451,21 +441,10 @@ pub fn spawn_server(
let remote_addr = connection.remote_address(); let remote_addr = connection.remote_address();
let mut connection_table_l = let mut connection_table_l = connection_table.lock().unwrap();
if staked_nodes.read().unwrap().contains_key(&remote_addr.ip()) { const MAX_CONNECTION_TABLE_SIZE: usize = 5000;
let mut connection_table_l = let num_pruned = connection_table_l.prune_oldest(MAX_CONNECTION_TABLE_SIZE);
staked_connection_table.lock().unwrap(); stats.num_evictions.fetch_add(num_pruned, Ordering::Relaxed);
let num_pruned =
connection_table_l.prune_oldest(max_staked_connections);
stats.num_evictions.fetch_add(num_pruned, Ordering::Relaxed);
connection_table_l
} else {
let mut connection_table_l = connection_table.lock().unwrap();
let num_pruned =
connection_table_l.prune_oldest(max_unstaked_connections);
stats.num_evictions.fetch_add(num_pruned, Ordering::Relaxed);
connection_table_l
};
if let Some((last_update, stream_exit)) = connection_table_l if let Some((last_update, stream_exit)) = connection_table_l
.try_add_connection( .try_add_connection(
@ -505,7 +484,6 @@ mod test {
super::*, super::*,
crossbeam_channel::unbounded, crossbeam_channel::unbounded,
quinn::{ClientConfig, NewConnection}, quinn::{ClientConfig, NewConnection},
solana_sdk::quic::QUIC_KEEP_ALIVE_MS,
std::{net::SocketAddr, time::Instant}, std::{net::SocketAddr, time::Instant},
}; };
@ -536,20 +514,17 @@ mod test {
.with_safe_defaults() .with_safe_defaults()
.with_custom_certificate_verifier(SkipServerVerification::new()) .with_custom_certificate_verifier(SkipServerVerification::new())
.with_no_client_auth(); .with_no_client_auth();
let mut config = ClientConfig::new(Arc::new(crypto)); ClientConfig::new(Arc::new(crypto))
let transport_config = Arc::get_mut(&mut config.transport).unwrap();
let timeout = IdleTimeout::from(VarInt::from_u32(QUIC_MAX_TIMEOUT_MS));
transport_config.max_idle_timeout(Some(timeout));
transport_config.keep_alive_interval(Some(Duration::from_millis(QUIC_KEEP_ALIVE_MS)));
config
} }
#[test] #[test]
fn test_quic_server_exit() { fn test_quic_server_exit() {
let (t, exit, _receiver, _server_address) = setup_quic_server(); let s = UdpSocket::bind("127.0.0.1:0").unwrap();
let exit = Arc::new(AtomicBool::new(false));
let (sender, _receiver) = unbounded();
let keypair = Keypair::new();
let ip = "127.0.0.1".parse().unwrap();
let t = spawn_server(s, &keypair, ip, sender, exit.clone(), 1).unwrap();
exit.store(true, Ordering::Relaxed); exit.store(true, Ordering::Relaxed);
t.join().unwrap(); t.join().unwrap();
} }
@ -565,43 +540,16 @@ mod test {
.unwrap() .unwrap()
} }
#[test]
fn test_quic_timeout() {
solana_logger::setup();
let (t, exit, receiver, server_address) = setup_quic_server();
let runtime = rt();
let _rt_guard = runtime.enter();
let conn1 = make_client_endpoint(&runtime, &server_address);
let total = 30;
let handle = runtime.spawn(async move {
for i in 0..total {
let mut s1 = conn1.connection.open_uni().await.unwrap();
s1.write_all(&[0u8]).await.unwrap();
s1.finish().await.unwrap();
info!("done {}", i);
std::thread::sleep(Duration::from_millis(1000));
}
});
let mut received = 0;
loop {
if let Ok(_x) = receiver.recv_timeout(Duration::from_millis(500)) {
received += 1;
info!("got {}", received);
}
if received >= total {
break;
}
}
runtime.block_on(handle).unwrap();
exit.store(true, Ordering::Relaxed);
t.join().unwrap();
}
#[test] #[test]
fn test_quic_server_block_multiple_connections() { fn test_quic_server_block_multiple_connections() {
solana_logger::setup(); solana_logger::setup();
let (t, exit, _receiver, server_address) = setup_quic_server(); let s = UdpSocket::bind("127.0.0.1:0").unwrap();
let exit = Arc::new(AtomicBool::new(false));
let (sender, _receiver) = unbounded();
let keypair = Keypair::new();
let ip = "127.0.0.1".parse().unwrap();
let server_address = s.local_addr().unwrap();
let t = spawn_server(s, &keypair, ip, sender, exit.clone(), 1).unwrap();
let runtime = rt(); let runtime = rt();
let _rt_guard = runtime.enter(); let _rt_guard = runtime.enter();
@ -630,19 +578,7 @@ mod test {
let keypair = Keypair::new(); let keypair = Keypair::new();
let ip = "127.0.0.1".parse().unwrap(); let ip = "127.0.0.1".parse().unwrap();
let server_address = s.local_addr().unwrap(); let server_address = s.local_addr().unwrap();
let staked_nodes = Arc::new(RwLock::new(HashMap::new())); let t = spawn_server(s, &keypair, ip, sender, exit.clone(), 2).unwrap();
let t = spawn_server(
s,
&keypair,
ip,
sender,
exit.clone(),
2,
staked_nodes,
10,
10,
)
.unwrap();
let runtime = rt(); let runtime = rt();
let _rt_guard = runtime.enter(); let _rt_guard = runtime.enter();
@ -688,38 +624,16 @@ mod test {
t.join().unwrap(); t.join().unwrap();
} }
fn setup_quic_server() -> ( #[test]
std::thread::JoinHandle<()>, fn test_quic_server_multiple_writes() {
Arc<AtomicBool>, solana_logger::setup();
crossbeam_channel::Receiver<PacketBatch>,
SocketAddr,
) {
let s = UdpSocket::bind("127.0.0.1:0").unwrap(); let s = UdpSocket::bind("127.0.0.1:0").unwrap();
let exit = Arc::new(AtomicBool::new(false)); let exit = Arc::new(AtomicBool::new(false));
let (sender, receiver) = unbounded(); let (sender, receiver) = unbounded();
let keypair = Keypair::new(); let keypair = Keypair::new();
let ip = "127.0.0.1".parse().unwrap(); let ip = "127.0.0.1".parse().unwrap();
let server_address = s.local_addr().unwrap(); let server_address = s.local_addr().unwrap();
let staked_nodes = Arc::new(RwLock::new(HashMap::new())); let t = spawn_server(s, &keypair, ip, sender, exit.clone(), 1).unwrap();
let t = spawn_server(
s,
&keypair,
ip,
sender,
exit.clone(),
1,
staked_nodes,
MAX_STAKED_CONNECTIONS,
MAX_UNSTAKED_CONNECTIONS,
)
.unwrap();
(t, exit, receiver, server_address)
}
#[test]
fn test_quic_server_multiple_writes() {
solana_logger::setup();
let (t, exit, receiver, server_address) = setup_quic_server();
let runtime = rt(); let runtime = rt();
let _rt_guard = runtime.enter(); let _rt_guard = runtime.enter();

View File

@ -4,6 +4,7 @@
/deploy /deploy
/doc /doc
/lib /lib
/module.flow.js
/.eslintrc.js /.eslintrc.js
/test/.eslintrc.js /test/.eslintrc.js
/test/dist /test/dist

11
web3.js/.flowconfig Normal file
View File

@ -0,0 +1,11 @@
[ignore]
[include]
[libs]
[lints]
[options]
[strict]

View File

@ -1,2 +1,3 @@
test/dist test/dist
module.flow.js
declarations declarations

View File

@ -94,11 +94,10 @@ Example scripts for the Solana Program Library:
- [Token Program Examples](https://github.com/solana-labs/solana-program-library/tree/master/token/js/examples) - [Token Program Examples](https://github.com/solana-labs/solana-program-library/tree/master/token/js/examples)
## Flow Support (Discontinued) ## Flow
Flow types are no longer supported in new releases. The last release with Flow support is v1.37.2 and its A [Flow library definition](https://flow.org/en/docs/libdefs/) is provided at
[Flow library definition](https://flow.org/en/docs/libdefs/) is provided at https://unpkg.com/@solana/web3.js@latest/module.flow.js.
https://unpkg.com/@solana/web3.js@v1.37.2/module.flow.js.
Download the file and add the following line under the [libs] section of your project's `.flowconfig` to Download the file and add the following line under the [libs] section of your project's `.flowconfig` to
activate it: activate it:

View File

@ -63,6 +63,8 @@
"eslint-plugin-mocha": "^9.0.0", "eslint-plugin-mocha": "^9.0.0",
"eslint-plugin-prettier": "^4.0.0", "eslint-plugin-prettier": "^4.0.0",
"esm": "^3.2.25", "esm": "^3.2.25",
"flow-bin": "^0.150.0",
"flowgen": "^1.13.0",
"http-server": "^14.0.0", "http-server": "^14.0.0",
"mocha": "^8.2.1", "mocha": "^8.2.1",
"mockttp": "^2.0.1", "mockttp": "^2.0.1",
@ -4960,6 +4962,15 @@
"node": ">=0.1.90" "node": ">=0.1.90"
} }
}, },
"node_modules/commander": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
"integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
"dev": true,
"engines": {
"node": ">= 6"
}
},
"node_modules/common-tags": { "node_modules/common-tags": {
"version": "1.8.2", "version": "1.8.2",
"resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
@ -6901,6 +6912,50 @@
"integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
"dev": true "dev": true
}, },
"node_modules/flow-bin": {
"version": "0.150.1",
"resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.150.1.tgz",
"integrity": "sha512-YSAB7pJejm+8gTpucaQKrvD+Dvu1RdsAA+L/Vofn0AH1DS+vE2hBeUN+v2pcs5YJU0gjQUw9qO7j3w6KaaCglQ==",
"dev": true,
"bin": {
"flow": "cli.js"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/flowgen": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/flowgen/-/flowgen-1.17.0.tgz",
"integrity": "sha512-cV0ASM71xDIDlEmejjNlVXmXtGOPsbzCm9dtmd4Kbn5y2+onax1W9s1NFZH0c18PuGSfbWjkQdSzbWcHjX/poQ==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.16.7",
"@babel/highlight": "^7.16.7",
"commander": "^6.1.0",
"lodash": "^4.17.20",
"prettier": "^2.5.1",
"shelljs": "^0.8.4",
"typescript": "~4.4.4",
"typescript-compiler": "^1.4.1-2"
},
"bin": {
"flowgen": "lib/cli/index.js"
}
},
"node_modules/flowgen/node_modules/typescript": {
"version": "4.4.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
"integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=4.2.0"
}
},
"node_modules/follow-redirects": { "node_modules/follow-redirects": {
"version": "1.14.9", "version": "1.14.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
@ -7923,6 +7978,15 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/interpret": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
"dev": true,
"engines": {
"node": ">= 0.10"
}
},
"node_modules/into-stream": { "node_modules/into-stream": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz",
@ -10926,7 +10990,6 @@
}, },
"node_modules/npm/node_modules/debug/node_modules/ms": { "node_modules/npm/node_modules/debug/node_modules/ms": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"dev": true, "dev": true,
"inBundle": true, "inBundle": true,
"license": "MIT" "license": "MIT"
@ -12868,7 +12931,6 @@
}, },
"node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"dev": true, "dev": true,
"inBundle": true, "inBundle": true,
"license": "MIT", "license": "MIT",
@ -14612,6 +14674,18 @@
"node": ">=8.10.0" "node": ">=8.10.0"
} }
}, },
"node_modules/rechoir": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
"dev": true,
"dependencies": {
"resolve": "^1.1.6"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/redent": { "node_modules/redent": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
@ -15312,6 +15386,23 @@
"integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true "dev": true
}, },
"node_modules/shelljs": {
"version": "0.8.5",
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
"integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
"dev": true,
"dependencies": {
"glob": "^7.0.0",
"interpret": "^1.0.0",
"rechoir": "^0.6.2"
},
"bin": {
"shjs": "bin/shjs"
},
"engines": {
"node": ">=4"
}
},
"node_modules/shiki": { "node_modules/shiki": {
"version": "0.10.1", "version": "0.10.1",
"resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz", "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz",
@ -16513,6 +16604,12 @@
"node": ">=4.2.0" "node": ">=4.2.0"
} }
}, },
"node_modules/typescript-compiler": {
"version": "1.4.1-2",
"resolved": "https://registry.npmjs.org/typescript-compiler/-/typescript-compiler-1.4.1-2.tgz",
"integrity": "sha1-uk99si2RU0oZKdkACdzhYety/T8=",
"dev": true
},
"node_modules/uglify-js": { "node_modules/uglify-js": {
"version": "3.15.3", "version": "3.15.3",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz",
@ -20841,6 +20938,12 @@
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"commander": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
"integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
"dev": true
},
"common-tags": { "common-tags": {
"version": "1.8.2", "version": "1.8.2",
"resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
@ -22369,6 +22472,36 @@
"integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
"dev": true "dev": true
}, },
"flow-bin": {
"version": "0.150.1",
"resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.150.1.tgz",
"integrity": "sha512-YSAB7pJejm+8gTpucaQKrvD+Dvu1RdsAA+L/Vofn0AH1DS+vE2hBeUN+v2pcs5YJU0gjQUw9qO7j3w6KaaCglQ==",
"dev": true
},
"flowgen": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/flowgen/-/flowgen-1.17.0.tgz",
"integrity": "sha512-cV0ASM71xDIDlEmejjNlVXmXtGOPsbzCm9dtmd4Kbn5y2+onax1W9s1NFZH0c18PuGSfbWjkQdSzbWcHjX/poQ==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.16.7",
"@babel/highlight": "^7.16.7",
"commander": "^6.1.0",
"lodash": "^4.17.20",
"prettier": "^2.5.1",
"shelljs": "^0.8.4",
"typescript": "~4.4.4",
"typescript-compiler": "^1.4.1-2"
},
"dependencies": {
"typescript": {
"version": "4.4.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz",
"integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==",
"dev": true
}
}
},
"follow-redirects": { "follow-redirects": {
"version": "1.14.9", "version": "1.14.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
@ -23127,6 +23260,12 @@
"side-channel": "^1.0.4" "side-channel": "^1.0.4"
} }
}, },
"interpret": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
"dev": true
},
"into-stream": { "into-stream": {
"version": "6.0.0", "version": "6.0.0",
"resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz",
@ -25300,7 +25439,6 @@
"dependencies": { "dependencies": {
"ms": { "ms": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"bundled": true, "bundled": true,
"dev": true "dev": true
} }
@ -26751,7 +26889,6 @@
}, },
"strip-ansi": { "strip-ansi": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"requires": { "requires": {
@ -28150,6 +28287,15 @@
"picomatch": "^2.2.1" "picomatch": "^2.2.1"
} }
}, },
"rechoir": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
"integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
"dev": true,
"requires": {
"resolve": "^1.1.6"
}
},
"redent": { "redent": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
@ -28700,6 +28846,17 @@
"integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true "dev": true
}, },
"shelljs": {
"version": "0.8.5",
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
"integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
"dev": true,
"requires": {
"glob": "^7.0.0",
"interpret": "^1.0.0",
"rechoir": "^0.6.2"
}
},
"shiki": { "shiki": {
"version": "0.10.1", "version": "0.10.1",
"resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz", "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.1.tgz",
@ -29638,6 +29795,12 @@
"integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==",
"dev": true "dev": true
}, },
"typescript-compiler": {
"version": "1.4.1-2",
"resolved": "https://registry.npmjs.org/typescript-compiler/-/typescript-compiler-1.4.1-2.tgz",
"integrity": "sha1-uk99si2RU0oZKdkACdzhYety/T8=",
"dev": true
},
"uglify-js": { "uglify-js": {
"version": "3.15.3", "version": "3.15.3",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.3.tgz",

View File

@ -33,15 +33,18 @@
], ],
"files": [ "files": [
"/lib", "/lib",
"/module.flow.js",
"/src" "/src"
], ],
"scripts": { "scripts": {
"build": "npm run clean; cross-env NODE_ENV=production rollup -c; npm run type:gen", "build": "npm run clean; cross-env NODE_ENV=production rollup -c; npm run type:gen; npm run flow:gen; npm run flow:check",
"build:fixtures": "set -ex; ./test/fixtures/noop-program/build.sh", "build:fixtures": "set -ex; ./test/fixtures/noop-program/build.sh",
"clean": "rimraf ./coverage ./lib", "clean": "rimraf ./coverage ./lib",
"codecov": "set -ex; npm run test:cover; cat ./coverage/lcov.info | codecov", "codecov": "set -ex; npm run test:cover; cat ./coverage/lcov.info | codecov",
"dev": "cross-env NODE_ENV=development rollup -c", "dev": "cross-env NODE_ENV=development rollup -c",
"doc": "set -ex; typedoc --treatWarningsAsErrors", "doc": "set -ex; typedoc --treatWarningsAsErrors",
"flow:check": "flow check-contents < module.flow.js",
"flow:gen": "flowgen lib/index.d.ts -o module.flow.js",
"type:gen": "./scripts/typegen.sh", "type:gen": "./scripts/typegen.sh",
"lint": "set -ex; npm run pretty; eslint . --ext .js,.ts", "lint": "set -ex; npm run pretty; eslint . --ext .js,.ts",
"lint:fix": "npm run pretty:fix && eslint . --fix --ext .js,.ts", "lint:fix": "npm run pretty:fix && eslint . --fix --ext .js,.ts",
@ -110,6 +113,8 @@
"eslint-plugin-mocha": "^9.0.0", "eslint-plugin-mocha": "^9.0.0",
"eslint-plugin-prettier": "^4.0.0", "eslint-plugin-prettier": "^4.0.0",
"esm": "^3.2.25", "esm": "^3.2.25",
"flow-bin": "^0.150.0",
"flowgen": "^1.13.0",
"http-server": "^14.0.0", "http-server": "^14.0.0",
"mocha": "^8.2.1", "mocha": "^8.2.1",
"mockttp": "^2.0.1", "mockttp": "^2.0.1",

View File

@ -1,6 +1,6 @@
import bs58 from 'bs58'; import bs58 from 'bs58';
import {Buffer} from 'buffer'; import {Buffer} from 'buffer';
import crossFetch from 'cross-fetch'; import fetch from 'cross-fetch';
import { import {
type as pick, type as pick,
number, number,
@ -814,11 +814,9 @@ function createRpcClient(
url: string, url: string,
useHttps: boolean, useHttps: boolean,
httpHeaders?: HttpHeaders, httpHeaders?: HttpHeaders,
customFetch?: typeof crossFetch,
fetchMiddleware?: FetchMiddleware, fetchMiddleware?: FetchMiddleware,
disableRetryOnRateLimit?: boolean, disableRetryOnRateLimit?: boolean,
): RpcClient { ): RpcClient {
const fetch = customFetch ? customFetch : crossFetch;
let agentManager: AgentManager | undefined; let agentManager: AgentManager | undefined;
if (!process.env.BROWSER) { if (!process.env.BROWSER) {
agentManager = new AgentManager(useHttps); agentManager = new AgentManager(useHttps);
@ -2110,8 +2108,6 @@ export type ConnectionConfig = {
wsEndpoint?: string; wsEndpoint?: string;
/** Optional HTTP headers object */ /** Optional HTTP headers object */
httpHeaders?: HttpHeaders; httpHeaders?: HttpHeaders;
/** Optional custom fetch function */
fetch?: typeof crossFetch;
/** Optional fetch middleware callback */ /** Optional fetch middleware callback */
fetchMiddleware?: FetchMiddleware; fetchMiddleware?: FetchMiddleware;
/** Optional Disable retrying calls when server responds with HTTP 429 (Too Many Requests) */ /** Optional Disable retrying calls when server responds with HTTP 429 (Too Many Requests) */
@ -2204,7 +2200,6 @@ export class Connection {
let wsEndpoint; let wsEndpoint;
let httpHeaders; let httpHeaders;
let fetch;
let fetchMiddleware; let fetchMiddleware;
let disableRetryOnRateLimit; let disableRetryOnRateLimit;
if (commitmentOrConfig && typeof commitmentOrConfig === 'string') { if (commitmentOrConfig && typeof commitmentOrConfig === 'string') {
@ -2215,7 +2210,6 @@ export class Connection {
commitmentOrConfig.confirmTransactionInitialTimeout; commitmentOrConfig.confirmTransactionInitialTimeout;
wsEndpoint = commitmentOrConfig.wsEndpoint; wsEndpoint = commitmentOrConfig.wsEndpoint;
httpHeaders = commitmentOrConfig.httpHeaders; httpHeaders = commitmentOrConfig.httpHeaders;
fetch = commitmentOrConfig.fetch;
fetchMiddleware = commitmentOrConfig.fetchMiddleware; fetchMiddleware = commitmentOrConfig.fetchMiddleware;
disableRetryOnRateLimit = commitmentOrConfig.disableRetryOnRateLimit; disableRetryOnRateLimit = commitmentOrConfig.disableRetryOnRateLimit;
} }
@ -2227,7 +2221,6 @@ export class Connection {
url.toString(), url.toString(),
useHttps, useHttps,
httpHeaders, httpHeaders,
fetch,
fetchMiddleware, fetchMiddleware,
disableRetryOnRateLimit, disableRetryOnRateLimit,
); );

File diff suppressed because it is too large Load Diff