diff --git a/Cargo.lock b/Cargo.lock
index 0a2a8d3de..dfc60d6f6 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4376,6 +4376,7 @@ dependencies = [
"static_assertions",
"subtle",
"thiserror",
+ "tokio",
"tracing",
"uint",
"x25519-dalek",
@@ -4564,6 +4565,7 @@ dependencies = [
"futures",
"gumdrop",
"hyper",
+ "indexmap",
"inferno",
"lazy_static",
"metrics",
diff --git a/zebra-chain/Cargo.toml b/zebra-chain/Cargo.toml
index 1d2a742c0..45187d9d4 100644
--- a/zebra-chain/Cargo.toml
+++ b/zebra-chain/Cargo.toml
@@ -9,7 +9,7 @@ edition = "2018"
[features]
default = []
-proptest-impl = ["proptest", "proptest-derive", "zebra-test", "rand", "rand_chacha"]
+proptest-impl = ["proptest", "proptest-derive", "zebra-test", "rand", "rand_chacha", "tokio"]
bench = ["zebra-test"]
[dependencies]
@@ -60,6 +60,7 @@ proptest-derive = { version = "0.3.0", optional = true }
rand = { version = "0.8", optional = true }
rand_chacha = { version = "0.3", optional = true }
+tokio = { version = "1.15.0", optional = true }
# ZF deps
ed25519-zebra = "3.0.0"
diff --git a/zebra-chain/src/chain_tip.rs b/zebra-chain/src/chain_tip.rs
index becf414a8..3ad4624d3 100644
--- a/zebra-chain/src/chain_tip.rs
+++ b/zebra-chain/src/chain_tip.rs
@@ -4,6 +4,9 @@ use std::sync::Arc;
use crate::{block, transaction};
+#[cfg(any(test, feature = "proptest-impl"))]
+pub mod mock;
+
/// An interface for querying the chain tip.
///
/// This trait helps avoid dependencies between:
diff --git a/zebra-chain/src/chain_tip/mock.rs b/zebra-chain/src/chain_tip/mock.rs
new file mode 100644
index 000000000..fe84362c3
--- /dev/null
+++ b/zebra-chain/src/chain_tip/mock.rs
@@ -0,0 +1,48 @@
+//! Mock [`ChainTip`]s for use in tests.
+
+use std::sync::Arc;
+
+use tokio::sync::watch;
+
+use crate::{block, chain_tip::ChainTip, transaction};
+
+/// A sender that sets the `best_tip_height` of a [`MockChainTip`].]
+pub type MockChainTipSender = watch::Sender