diff --git a/substrate/client/consensus/manual-seal/src/lib.rs b/substrate/client/consensus/manual-seal/src/lib.rs
index c3b891b84e8934f57b11c604afd13ac8c8a8f882..1e5db966e66dbdbc453f9cdc04ff80d2f15ad9b2 100644
--- a/substrate/client/consensus/manual-seal/src/lib.rs
+++ b/substrate/client/consensus/manual-seal/src/lib.rs
@@ -173,7 +173,7 @@ pub async fn run_manual_seal<B, BI, CB, E, C, TP, SC, CS, CIDP, P>(
 	SC: SelectChain<B> + 'static,
 	TP: TransactionPool<Block = B>,
 	CIDP: CreateInherentDataProviders<B, ()>,
-	P: Send + Sync + 'static,
+	P: codec::Encode + Send + Sync + 'static,
 {
 	while let Some(command) = commands_stream.next().await {
 		match command {
@@ -231,7 +231,7 @@ pub async fn run_instant_seal<B, BI, CB, E, C, TP, SC, CIDP, P>(
 	SC: SelectChain<B> + 'static,
 	TP: TransactionPool<Block = B>,
 	CIDP: CreateInherentDataProviders<B, ()>,
-	P: Send + Sync + 'static,
+	P: codec::Encode + Send + Sync + 'static,
 {
 	// instant-seal creates blocks as soon as transactions are imported
 	// into the transaction pool.
@@ -281,7 +281,7 @@ pub async fn run_instant_seal_and_finalize<B, BI, CB, E, C, TP, SC, CIDP, P>(
 	SC: SelectChain<B> + 'static,
 	TP: TransactionPool<Block = B>,
 	CIDP: CreateInherentDataProviders<B, ()>,
-	P: Send + Sync + 'static,
+	P: codec::Encode + Send + Sync + 'static,
 {
 	// Creates and finalizes blocks as soon as transactions are imported
 	// into the transaction pool.
@@ -459,7 +459,8 @@ mod tests {
 					needs_justification: false,
 					bad_justification: false,
 					is_new_best: true,
-				}
+				},
+				proof_size: 0
 			}
 		);
 		// assert that there's a new block in the db.
@@ -549,7 +550,8 @@ mod tests {
 					needs_justification: false,
 					bad_justification: false,
 					is_new_best: true,
-				}
+				},
+				proof_size: created_block.proof_size
 			}
 		);
 		// assert that there's a new block in the db.
@@ -625,7 +627,8 @@ mod tests {
 					needs_justification: false,
 					bad_justification: false,
 					is_new_best: true,
-				}
+				},
+				proof_size: 0
 			}
 		);
 		// assert that there's a new block in the db.
@@ -711,7 +714,8 @@ mod tests {
 					needs_justification: false,
 					bad_justification: false,
 					is_new_best: true
-				}
+				},
+				proof_size: 0
 			}
 		);
 
diff --git a/substrate/client/consensus/manual-seal/src/rpc.rs b/substrate/client/consensus/manual-seal/src/rpc.rs
index 85abcdc08574bf43f4b622ba77ea79dee0874f13..c0b3af69bedf40884598c19eea16defbdf1ae679 100644
--- a/substrate/client/consensus/manual-seal/src/rpc.rs
+++ b/substrate/client/consensus/manual-seal/src/rpc.rs
@@ -97,6 +97,8 @@ pub struct CreatedBlock<Hash> {
 	pub hash: Hash,
 	/// some extra details about the import operation
 	pub aux: ImportedAux,
+	/// uncompacted storage proof size (zero mean that there is no proof)
+	pub proof_size: usize,
 }
 
 impl<Hash> ManualSeal<Hash> {
diff --git a/substrate/client/consensus/manual-seal/src/seal_block.rs b/substrate/client/consensus/manual-seal/src/seal_block.rs
index 4b6230c3efc3d8475b3c7ee44d1dd413bc9a4a54..716e889ec0395436a2e0a2cdc7a4a5cd056bdc28 100644
--- a/substrate/client/consensus/manual-seal/src/seal_block.rs
+++ b/substrate/client/consensus/manual-seal/src/seal_block.rs
@@ -83,7 +83,7 @@ pub async fn seal_block<B, BI, SC, C, E, TP, CIDP, P>(
 	TP: TransactionPool<Block = B>,
 	SC: SelectChain<B>,
 	CIDP: CreateInherentDataProviders<B, ()>,
-	P: Send + Sync + 'static,
+	P: codec::Encode + Send + Sync + 'static,
 {
 	let future = async {
 		if pool.status().ready == 0 && !create_empty {
@@ -131,6 +131,7 @@ pub async fn seal_block<B, BI, SC, C, E, TP, CIDP, P>(
 
 		let (header, body) = proposal.block.deconstruct();
 		let proof = proposal.proof;
+		let proof_size = proof.encoded_size();
 		let mut params = BlockImportParams::new(BlockOrigin::Own, header.clone());
 		params.body = Some(body);
 		params.finalized = finalize;
@@ -149,8 +150,11 @@ pub async fn seal_block<B, BI, SC, C, E, TP, CIDP, P>(
 		post_header.digest_mut().logs.extend(params.post_digests.iter().cloned());
 
 		match block_import.import_block(params).await? {
-			ImportResult::Imported(aux) =>
-				Ok(CreatedBlock { hash: <B as BlockT>::Header::hash(&post_header), aux }),
+			ImportResult::Imported(aux) => Ok(CreatedBlock {
+				hash: <B as BlockT>::Header::hash(&post_header),
+				aux,
+				proof_size,
+			}),
 			other => Err(other.into()),
 		}
 	};