diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index a64c545b23c972e948a6ad52186e70b2da3a9476..74f8cd808347e3a8714e78d34d4b319ba1b4c985 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -1,5 +1,11 @@
 Changelog
 =========
+0.23.12
+-------
+* add participation_rate to Blockchain
+* beembase.transactions is deprecated
+* get_block_params added to TransactionBuilder
+
 0.23.11
 -------
 * replace asn1 by asn1crypto
diff --git a/beem/blockchain.py b/beem/blockchain.py
index 21ca5e127cbd1bfa310ed6a9674d71fab49f5176..6e90f2bafcbd5b51ff62e86c6459f2a67d5bc81a 100644
--- a/beem/blockchain.py
+++ b/beem/blockchain.py
@@ -390,6 +390,11 @@ class Blockchain(object):
         ).time()
         return int(time.mktime(block_time.timetuple()))
 
+    @property
+    def participation_rate(self):
+        """ Returns the witness participation rate in a range from 0 to 1"""
+        return bin(int(self.blockchain.get_dynamic_global_properties(use_stored_data=False)["recent_slots_filled"])).count("1") / 128
+
     def blocks(self, start=None, stop=None, max_batch_size=None, threading=False, thread_num=8, only_ops=False, only_virtual_ops=False):
         """ Yields blocks starting from ``start``.
 
diff --git a/beem/transactionbuilder.py b/beem/transactionbuilder.py
index 2a91dd4157fce10e5af1d20c8aacfb800ad5eb77..4ed74f7922f0c907159bb6ae092414579e11b4d0 100644
--- a/beem/transactionbuilder.py
+++ b/beem/transactionbuilder.py
@@ -6,6 +6,8 @@ from __future__ import unicode_literals
 from builtins import str
 from future.utils import python_2_unicode_compatible
 import logging
+import struct
+from binascii import unhexlify
 from beemgraphenebase.py23 import bytes_types, integer_types, string_types, text_type
 from .account import Account
 from .utils import formatTimeFromNow
@@ -314,8 +316,7 @@ class TransactionBuilder(dict):
             self.expiration or self.blockchain.expiration
         )
         if ref_block_num is None or ref_block_prefix is None:
-            ref_block_num, ref_block_prefix = transactions.getBlockParams(
-                self.blockchain.rpc)
+            ref_block_num, ref_block_prefix = self.get_block_params()
         if self._use_ledger:
             self.ledgertx = Ledger_Transaction(
                 ref_block_prefix=ref_block_prefix,
@@ -338,6 +339,28 @@ class TransactionBuilder(dict):
         super(TransactionBuilder, self).update(self.tx.json())
         self._unset_require_reconstruction()
 
+    def get_block_params(self, use_head_block=False):
+        """ Auxiliary method to obtain ``ref_block_num`` and
+            ``ref_block_prefix``. Requires a connection to a
+            node!
+        """
+
+        dynBCParams = self.blockchain.get_dynamic_global_properties(use_stored_data=False)
+        if use_head_block:
+            ref_block_num = dynBCParams["head_block_number"] & 0xFFFF
+            ref_block_prefix = struct.unpack_from(
+                "<I", unhexlify(dynBCParams["head_block_id"]), 4
+            )[0]
+        else:
+            # need to get subsequent block because block head doesn't return 'id' - stupid
+            from .block import BlockHeader
+            block = BlockHeader(int(dynBCParams["last_irreversible_block_num"]) + 1, blockchain_instance=self.blockchain)
+            ref_block_num = dynBCParams["last_irreversible_block_num"] & 0xFFFF
+            ref_block_prefix = struct.unpack_from(
+                "<I", unhexlify(block["previous"]), 4
+            )[0]
+        return ref_block_num, ref_block_prefix
+
     def sign(self, reconstruct_tx=True):
         """ Sign a provided transaction with the provided key(s)
             One or many wif keys to use for signing a transaction.
diff --git a/beembase/ledgertransactions.py b/beembase/ledgertransactions.py
index e6e2a82e987e0252c42dc048927062cb6bc10905..d5601206b0f488b784ca082f0b2473dd578a3cc6 100644
--- a/beembase/ledgertransactions.py
+++ b/beembase/ledgertransactions.py
@@ -20,8 +20,8 @@ log = logging.getLogger(__name__)
 class Ledger_Transaction(GrapheneUnsigned_Transaction):
     """ Create an unsigned transaction and offer method to send it to a ledger device for signing
 
-        :param num refNum: parameter ref_block_num (see :func:`beembase.transactions.getBlockParams`)
-        :param num refPrefix: parameter ref_block_prefix (see :func:`beembase.transactions.getBlockParams`)
+        :param num ref_block_num:
+        :param num ref_block_prefix:
         :param str expiration: expiration date
         :param array operations:  array of operations
         :param dict custom_chains: custom chain which should be added to the known chains
diff --git a/beembase/transactions.py b/beembase/transactions.py
index 00d831ffc8af544acdf86a42c2ec5fe93c11b99f..53182e8b4ecb13b6fa06b4421b73b147c99be5e8 100644
--- a/beembase/transactions.py
+++ b/beembase/transactions.py
@@ -2,14 +2,6 @@ from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
 from __future__ import unicode_literals
-from binascii import hexlify, unhexlify
-import struct
-from beemgraphenebase.account import PublicKey
-from .signedtransactions import Signed_Transaction
-from .operations import (
-    Op_wrapper,
-    Account_create,
-)
 
 
 def getBlockParams(ws):
@@ -17,7 +9,7 @@ def getBlockParams(ws):
         ``ref_block_prefix``. Requires a websocket connection to a
         witness node!
     """
-    dynBCParams = ws.get_dynamic_global_properties()
-    ref_block_num = dynBCParams["head_block_number"] & 0xFFFF
-    ref_block_prefix = struct.unpack_from("<I", unhexlify(dynBCParams["head_block_id"]), 4)[0]
-    return ref_block_num, ref_block_prefix
+    raise DeprecationWarning(
+        "This method shouldn't be called anymore. It is part of "
+        "transactionbuilder now"
+    )
diff --git a/beemgraphenebase/unsignedtransactions.py b/beemgraphenebase/unsignedtransactions.py
index 5511c0d65fe9ebd13c39efce0df2ef03ab3f1547..8d086bdb645cb60a85a178641abcdaef8238a451 100644
--- a/beemgraphenebase/unsignedtransactions.py
+++ b/beemgraphenebase/unsignedtransactions.py
@@ -119,8 +119,8 @@ class GrapheneObjectASN1(object):
 class Unsigned_Transaction(GrapheneObjectASN1):
     """ Create an unsigned transaction with ASN1 encoder for using it with ledger
 
-        :param num refNum: parameter ref_block_num (see :func:`beembase.transactions.getBlockParams`)
-        :param num refPrefix: parameter ref_block_prefix (see :func:`beembase.transactions.getBlockParams`)
+        :param num ref_block_num:
+        :param num ref_block_prefix:
         :param str expiration: expiration date
         :param array operations:  array of operations
     """
diff --git a/examples/using_steem_offline.py b/examples/using_steem_offline.py
index e129060110eef0c66d0d1dec0226eb7c672b8fea..1bb467c845ff9c09d6e2294a0667dc9560a4ff81 100644
--- a/examples/using_steem_offline.py
+++ b/examples/using_steem_offline.py
@@ -19,7 +19,7 @@ from beem.steem import Steem
 from beem.utils import parse_time, formatTimedelta
 from beemapi.exceptions import NumRetriesReached
 from beem.nodelist import NodeList
-from beembase.transactions import getBlockParams
+from beem.transactionbuilder import TransactionBuilder
 log = logging.getLogger(__name__)
 logging.basicConfig(level=logging.INFO)
 
@@ -29,7 +29,8 @@ wif = "5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
 
 if __name__ == "__main__":
     stm_online = Steem()
-    ref_block_num, ref_block_prefix = getBlockParams(stm_online)
+    trx_builder = TransactionBuilder(blockchain_instance=stm_online)
+    ref_block_num, ref_block_prefix = trx_builder.get_block_params()
     print("ref_block_num %d - ref_block_prefix %d" % (ref_block_num, ref_block_prefix))
 
     stm = Steem(offline=True)