diff --git a/beem/version.py b/beem/version.py
index a8090c25a1b0f6638169f3b47c028263b00726e7..8161bb5182795f442f3293d39f84b4d89ae64060 100644
--- a/beem/version.py
+++ b/beem/version.py
@@ -1,2 +1,2 @@
 """THIS FILE IS GENERATED FROM beem SETUP.PY."""
-version = '0.24.19'
+version = '0.24.21'
diff --git a/beemapi/version.py b/beemapi/version.py
index a8090c25a1b0f6638169f3b47c028263b00726e7..8161bb5182795f442f3293d39f84b4d89ae64060 100644
--- a/beemapi/version.py
+++ b/beemapi/version.py
@@ -1,2 +1,2 @@
 """THIS FILE IS GENERATED FROM beem SETUP.PY."""
-version = '0.24.19'
+version = '0.24.21'
diff --git a/beembase/version.py b/beembase/version.py
index a8090c25a1b0f6638169f3b47c028263b00726e7..8161bb5182795f442f3293d39f84b4d89ae64060 100644
--- a/beembase/version.py
+++ b/beembase/version.py
@@ -1,2 +1,2 @@
 """THIS FILE IS GENERATED FROM beem SETUP.PY."""
-version = '0.24.19'
+version = '0.24.21'
diff --git a/beemgraphenebase/version.py b/beemgraphenebase/version.py
index a8090c25a1b0f6638169f3b47c028263b00726e7..8161bb5182795f442f3293d39f84b4d89ae64060 100644
--- a/beemgraphenebase/version.py
+++ b/beemgraphenebase/version.py
@@ -1,2 +1,2 @@
 """THIS FILE IS GENERATED FROM beem SETUP.PY."""
-version = '0.24.19'
+version = '0.24.21'
diff --git a/examples/blockactivity.py b/examples/blockactivity.py
new file mode 100644
index 0000000000000000000000000000000000000000..ebff3af241fe3c8e25af846fc46c9ff33f684374
--- /dev/null
+++ b/examples/blockactivity.py
@@ -0,0 +1,97 @@
+import sys
+from datetime import datetime, timedelta
+import argparse
+from timeit import default_timer as timer
+import logging
+from beem.blockchain import Blockchain
+from beem.block import Block
+from beem import Hive, Blurt, Steem
+from beem.utils import parse_time
+from beem.nodelist import NodeList
+
+log = logging.getLogger(__name__)
+logging.basicConfig(level=logging.INFO)
+
+
+def parse_args(args=None):
+    d = 'Verify blocktivity by counting operations and trx for the last 24 hours.'
+    parser = argparse.ArgumentParser(description=d)
+    parser.add_argument('blockchain', type=str, nargs='?',
+                        default=sys.stdin,
+                        help='Blockchain (hive, blurt or steem)')
+    return parser.parse_args(args)
+
+
+def main(args=None):
+    
+    args = parse_args(args)
+    blockchain = args.blockchain
+    
+    nodelist = NodeList()
+    nodelist.update_nodes(weights={"block": 1})
+    
+    if blockchain == "hive" or blockchain is None:
+        max_batch_size = 50
+        threading = False
+        thread_num = 16
+        block_debug = 1000
+        
+        nodes = nodelist.get_hive_nodes()
+        blk_inst = Hive(node=nodes, num_retries=3, num_retries_call=3, timeout=30)
+    elif blockchain == "blurt":
+        max_batch_size = None
+        threading = False
+        thread_num = 8
+        block_debug = 20
+        nodes = ["https://api.blurt.blog", "https://rpc.blurtworld.com", "https://rpc.blurtworld.com"]
+        blk_inst = Blurt(node=nodes, num_retries=3, num_retries_call=3, timeout=30)
+    elif blockchain == "steem":
+        max_batch_size = 50
+        threading = False
+        thread_num = 16
+        block_debug = 1000
+        nodes = nodelist.get_steem_nodes()
+        blk_inst = Steem(node=nodes, num_retries=3, num_retries_call=3, timeout=30)
+    else:
+        raise Exception("Wrong parameter, can be hive, blurt or steem")
+    print(blk_inst)
+    block_count = 0
+    total_ops = 0
+    total_trx = 0
+    blocksperday = 20 * 60 * 24
+    
+    blockchain = Blockchain(blockchain_instance=blk_inst)
+    last_block_id = blockchain.get_current_block_num() - blocksperday
+
+    last_block = Block(last_block_id, blockchain_instance=blk_inst)
+
+    stopTime = last_block.time() + timedelta(seconds=60 * 60 * 24)
+
+    start = timer()
+    for entry in blockchain.blocks(start=last_block_id, max_batch_size=max_batch_size, threading=threading, thread_num=thread_num):
+        block_count += 1
+        if "block" in entry:
+            trxs = entry["block"]["transactions"]
+        else:
+            trxs = entry["transactions"]
+        for tx in trxs:
+            total_trx += 1
+            for op in tx["operations"]:
+                total_ops += 1
+        if "block" in entry:
+            block_time = parse_time(entry["block"]["timestamp"])
+        else:
+            block_time = entry["timestamp"]
+        ops_per_day = total_ops / block_count * blocksperday
+        if block_count % (block_debug) == 0:
+            print("%d blocks remaining... estimated ops per day: %.1f" % (blocksperday - block_count, ops_per_day))
+        if block_time > stopTime:
+            break
+    duration = timer() - start
+    print("Received %.2f blocks/s." % (block_count / duration))
+    print("Bocks: %d, duration %.3f s" % (block_count, duration))
+    print("Operations per day: %d" % total_ops)
+    print("Trx per day: %d" % total_trx)
+
+if __name__ == '__main__':
+    sys.exit(main())
diff --git a/setup.py b/setup.py
index 107cf76bf075a261b4203ccc1e372c4db2a2a10d..f5358360881658af7938f2f6d6c08fe3b87875ce 100755
--- a/setup.py
+++ b/setup.py
@@ -16,7 +16,7 @@ except LookupError:
     ascii = codecs.lookup('ascii')
     codecs.register(lambda name, enc=ascii: {True: enc}.get(name == 'mbcs'))
 
-VERSION = '0.24.20'
+VERSION = '0.24.21'
 
 tests_require = ['mock >= 2.0.0', 'pytest', 'pytest-mock', 'parameterized']