From 6637f5ca7d0adef333706479c67ceacdec7465e9 Mon Sep 17 00:00:00 2001
From: Holger Nahrstaedt <holger@nahrstaedt.de>
Date: Thu, 22 Feb 2018 11:17:40 +0100
Subject: [PATCH] Improve doc Apply fix #42 and #41 from
 https://github.com/xeroc/python-bitshares

---
 .travis.yml                                   |  12 ++-
 Makefile                                      |   4 +
 README.rst                                    |  11 ++
 beem/account.py                               |  52 +--------
 beem/amount.py                                |  12 ++-
 beem/blockchain.py                            |  21 ++++
 beem/instance.py                              |  10 ++
 beem/memo.py                                  |  91 ++++++++++++++++
 beem/notify.py                                |  30 +++---
 beem/transactionbuilder.py                    |  17 +++
 beem/vote.py                                  |   5 +
 beem/wallet.py                                |  42 ++++++++
 beem/witness.py                               |   5 +
 beemapi/steemnoderpc.py                       |   4 +
 beemapi/websocket.py                          |  42 ++++++--
 docs/account.rst                              |  17 ---
 docs/amount.rst                               |  19 ----
 docs/asset.rst                                |   5 -
 docs/beem.account.rst                         |   7 ++
 docs/beem.aes.rst                             |   7 ++
 docs/beem.amount.rst                          |   7 ++
 docs/beem.asset.rst                           |   7 ++
 docs/beem.block.rst                           |   7 ++
 docs/beem.blockchain.rst                      |   7 ++
 docs/beem.comment.rst                         |   7 ++
 docs/beem.exceptions.rst                      |   7 ++
 docs/beem.instances.rst                       |   7 ++
 docs/beem.market.rst                          |   7 ++
 docs/beem.memo.rst                            |   7 ++
 docs/beem.message.rst                         |   7 ++
 docs/beem.notify.rst                          |   7 ++
 docs/beem.price.rst                           |   7 ++
 docs/beem.rst                                 |  38 +++++++
 docs/beem.steem.rst                           |   7 ++
 docs/beem.storage.rst                         |   7 ++
 docs/beem.transactionbuilder.rst              |   7 ++
 docs/beem.utils.rst                           |   7 ++
 docs/beem.vote.rst                            |   7 ++
 docs/beem.wallet.rst                          |   7 ++
 docs/beem.witness.rst                         |   8 ++
 docs/beemapi.exceptions.rst                   |   7 ++
 docs/beemapi.rst                              |  19 ++++
 ...socketrpc.rst => beemapi.steemnoderpc.rst} |   0
 docs/{websocket.rst => beemapi.websocket.rst} |   0
 docs/beembase.account.rst                     |   7 ++
 docs/beembase.bip38.rst                       |   7 ++
 docs/beembase.chains.rst                      |   7 ++
 docs/beembase.memo.rst                        |   7 ++
 docs/beembase.objects.rst                     |   7 ++
 docs/beembase.objecttypes.rst                 |   7 ++
 docs/beembase.operationids.rst                |   7 ++
 docs/beembase.operations.rst                  |   7 ++
 docs/beembase.rst                             |  26 +++++
 docs/beembase.signedtransations.rst           |   7 ++
 docs/beembase.transactions.rst                |   7 ++
 docs/block.rst                                |  13 ---
 docs/blockchain.rst                           |  33 ------
 docs/comment.rst                              |  13 ---
 docs/exceptions.rst                           |   8 --
 docs/index.rst                                |  61 ++++++-----
 docs/instances.rst                            |  16 ---
 docs/market.rst                               |   5 -
 docs/memo.rst                                 | 100 ------------------
 docs/modules.rst                              |   9 ++
 docs/notify.rst                               |   8 --
 docs/price.rst                                |   5 -
 docs/steem.rst                                |  11 --
 docs/storage.rst                              |  17 ---
 docs/transactionbuilder.rst                   |  22 ----
 docs/transactions.rst                         |  64 -----------
 docs/utils.rst                                |   5 -
 docs/vote.rst                                 |  15 ---
 docs/wallet.rst                               |  49 ---------
 docs/witness.rst                              |  28 -----
 requirements.txt                              |   4 +-
 setup.py                                      |   4 +-
 76 files changed, 629 insertions(+), 568 deletions(-)
 delete mode 100644 docs/account.rst
 delete mode 100644 docs/amount.rst
 delete mode 100644 docs/asset.rst
 create mode 100644 docs/beem.account.rst
 create mode 100644 docs/beem.aes.rst
 create mode 100644 docs/beem.amount.rst
 create mode 100644 docs/beem.asset.rst
 create mode 100644 docs/beem.block.rst
 create mode 100644 docs/beem.blockchain.rst
 create mode 100644 docs/beem.comment.rst
 create mode 100644 docs/beem.exceptions.rst
 create mode 100644 docs/beem.instances.rst
 create mode 100644 docs/beem.market.rst
 create mode 100644 docs/beem.memo.rst
 create mode 100644 docs/beem.message.rst
 create mode 100644 docs/beem.notify.rst
 create mode 100644 docs/beem.price.rst
 create mode 100644 docs/beem.rst
 create mode 100644 docs/beem.steem.rst
 create mode 100644 docs/beem.storage.rst
 create mode 100644 docs/beem.transactionbuilder.rst
 create mode 100644 docs/beem.utils.rst
 create mode 100644 docs/beem.vote.rst
 create mode 100644 docs/beem.wallet.rst
 create mode 100644 docs/beem.witness.rst
 create mode 100644 docs/beemapi.exceptions.rst
 create mode 100644 docs/beemapi.rst
 rename docs/{websocketrpc.rst => beemapi.steemnoderpc.rst} (100%)
 rename docs/{websocket.rst => beemapi.websocket.rst} (100%)
 create mode 100644 docs/beembase.account.rst
 create mode 100644 docs/beembase.bip38.rst
 create mode 100644 docs/beembase.chains.rst
 create mode 100644 docs/beembase.memo.rst
 create mode 100644 docs/beembase.objects.rst
 create mode 100644 docs/beembase.objecttypes.rst
 create mode 100644 docs/beembase.operationids.rst
 create mode 100644 docs/beembase.operations.rst
 create mode 100644 docs/beembase.rst
 create mode 100644 docs/beembase.signedtransations.rst
 create mode 100644 docs/beembase.transactions.rst
 delete mode 100644 docs/block.rst
 delete mode 100644 docs/blockchain.rst
 delete mode 100644 docs/comment.rst
 delete mode 100644 docs/exceptions.rst
 delete mode 100644 docs/instances.rst
 delete mode 100644 docs/market.rst
 delete mode 100644 docs/memo.rst
 create mode 100644 docs/modules.rst
 delete mode 100644 docs/notify.rst
 delete mode 100644 docs/price.rst
 delete mode 100644 docs/steem.rst
 delete mode 100644 docs/storage.rst
 delete mode 100644 docs/transactionbuilder.rst
 delete mode 100644 docs/transactions.rst
 delete mode 100644 docs/utils.rst
 delete mode 100644 docs/vote.rst
 delete mode 100644 docs/wallet.rst
 delete mode 100644 docs/witness.rst

diff --git a/.travis.yml b/.travis.yml
index 94ea926d..cca898e6 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -15,8 +15,18 @@ matrix:
         - pip install flake8
       script:
         - flake8
+    - os: linux
+      python: 3.5
+      env:
+        - TOXENV=py35
     - os: linux
       python: 3.6
+      env:
+        - TOXENV=py36
+    # - os: linux
+    #  python: 3.7
+    #  env:
+    #    - TOXENV=py37
     - os: osx
       osx_image: xcode9.2
       language: objective-c
@@ -36,7 +46,7 @@ before_install:
   - pip install --upgrade pip
   - pip install --upgrade wheel
   # Set numpy version first, other packages link against it
-  - pip install six nose coverage codecov tox pytest pytest-cov
+  - pip install six nose coverage codecov tox-travis pytest pytest-cov
 
 script:
  - tox
diff --git a/Makefile b/Makefile
index f71bacf3..808279e4 100644
--- a/Makefile
+++ b/Makefile
@@ -39,4 +39,8 @@ dist:
 	python3 setup.py sdist upload -r pypi
 	python3 setup.py bdist_wheel upload
 
+docs:
+	sphinx-apidoc -d 6 -e -f -o docs beem*
+	make -C docs clean html
+
 release: clean check dist git
diff --git a/README.rst b/README.rst
index f56e1a1f..a686c2a9 100644
--- a/README.rst
+++ b/README.rst
@@ -4,6 +4,11 @@ beem - Unofficial Python 3 Library for Steem
 !!!Alpha-State, be carefull!!!
 
 beem is an unofficial python 3 library for steem, which is created new from scratch from https://github.com/xeroc/python-bitshares.
+The library name is derived from a beam maschine, similar to the analogy between steem and steam. beem depends on 
+
+.. image:: https://img.shields.io/pypi/v/beem.svg
+    :target: https://pypi.python.org/pypi/beem/
+    :alt: Latest Version
 
 .. image:: https://travis-ci.org/holgern/beem.svg?branch=master
     :target: https://travis-ci.org/holgern/beem
@@ -39,6 +44,12 @@ For OSX, please do the following::
     brew install openssl
     export CFLAGS="-I$(brew --prefix openssl)/include $CFLAGS"
     export LDFLAGS="-L$(brew --prefix openssl)/lib $LDFLAGS"
+
+For Termux on Android, please install the following packages:
+
+.. code:: bash
+
+    pkg install clang openssl-dev python-dev
     
 Install beem by pip::
 
diff --git a/beem/account.py b/beem/account.py
index bd09a2c5..63f79b4e 100644
--- a/beem/account.py
+++ b/beem/account.py
@@ -30,6 +30,7 @@ class Account(BlockchainObject):
             from beem.account import Account
             account = Account("test")
             print(account)
+            print(account.balances)
 
         .. note:: This class comes with its own caching function to reduce the
                   load on the API server. Instances of this class can be
@@ -252,54 +253,3 @@ class Account(BlockchainObject):
                 break
             if first < _limit:
                 _limit = first - 1
-
-    # def upgrade(self):
-    #    return self.steem.upgrade_account(account=self)
-
-
-class AccountUpdate(dict):
-    """ This purpose of this class is to keep track of account updates
-        as they are pushed through by :class:`beem.notify.Notify`.
-
-        Instances of this class are dictionaries and take the following
-        form:
-
-        ... code-block: js
-
-            {'name': 'test',
-             'owner': '1.2.29',
-             'pending_fees': 0,
-             'pending_vested_fees': 16310,
-             'total_core_in_orders': '6788845277634',
-             'total_ops': 0}
-
-    """
-
-    def __init__(
-        self,
-        data,
-        steem_instance=None
-    ):
-        self.steem = steem_instance or shared_steem_instance()
-
-        if isinstance(data, dict):
-            super(AccountUpdate, self).__init__(data)
-        else:
-            account = Account(data, steem_instance=self.steem)
-            # update = self.steem.rpc.get_objects([
-            #    "2.6.%s" % (account["id"].split(".")[2])
-            # ])[0]
-            super(AccountUpdate, self).__init__(account)
-
-    @property
-    def account(self):
-        """ In oder to obtain the actual
-            :class:`steem.account.Account` from this class, you can
-            use the ``account`` attribute.
-        """
-        account = Account(self["name"])
-        account.refresh()
-        return account
-
-    def __repr__(self):
-        return "<AccountUpdate: {}>".format(self["name"])
diff --git a/beem/amount.py b/beem/amount.py
index 43a22728..8bc950e3 100644
--- a/beem/amount.py
+++ b/beem/amount.py
@@ -35,8 +35,16 @@ class Amount(dict):
 
         .. code-block:: python
 
-            Amount("1 STEEM") * 2
-            Amount("15 SBD") + Amount("0.5 SBD")
+            from beem.amount import Amount
+            from beem.asset import Asset
+            a = Amount("1 STEEM")
+            b = Amount(1, "STEEM")
+            c = Amount("20", Asset("STEEM"))
+            a + b
+            a * 2
+            a += b
+            a /= 2.0
+
     """
     def __init__(self, *args, amount=None, asset=None, steem_instance=None):
         self["asset"] = {}
diff --git a/beem/blockchain.py b/beem/blockchain.py
index fd73725b..8dc0b382 100644
--- a/beem/blockchain.py
+++ b/beem/blockchain.py
@@ -14,6 +14,27 @@ class Blockchain(object):
                  actual head block (``head``)
 
         This class let's you deal with blockchain related data and methods.
+        Read blockchain related data:
+        .. code-block:: python
+
+            from beem.blockchain import Blockchain
+            chain = Blockchain()
+
+        Read current block and blockchain info
+        .. code-block:: python
+            print(chain.get_current_block())
+            print(chain.info())
+
+        Monitor for new blocks ..
+        .. code-block:: python
+            for block in chain.blocks():
+                print(block)
+
+        or each operation individually:
+        .. code-block:: python
+            for operations in chain.ops():
+                print(operations)
+
     """
     def __init__(
         self,
diff --git a/beem/instance.py b/beem/instance.py
index b50b4fcd..d713eaeb 100644
--- a/beem/instance.py
+++ b/beem/instance.py
@@ -9,6 +9,16 @@ def shared_steem_instance():
     """ This method will initialize ``SharedInstance.instance`` and return it.
         The purpose of this method is to have offer single default
         steem instance that can be reused by multiple classes.
+
+        .. code-block:: python
+
+            from beem.account import Account
+            from beem.instance import shared_steem_instance
+
+            account = Account("test")
+            # is equivalent with
+            account = Account("test", steem_instance=shared_steem_instance())
+
     """
     if not SharedInstance.instance:
         clear_cache()
diff --git a/beem/memo.py b/beem/memo.py
index 58523903..8b554f21 100644
--- a/beem/memo.py
+++ b/beem/memo.py
@@ -41,6 +41,97 @@ class Memo(object):
 
         if ``op_data`` being the payload of a transfer operation.
 
+        Memo Keys
+        #########
+
+        In BitShares, memos are AES-256 encrypted with a shared secret between sender and
+        receiver. It is derived from the memo private key of the sender and the memo
+        publick key of the receiver.
+
+        In order for the receiver to decode the memo, the shared secret has to be
+        derived from the receiver's private key and the senders public key.
+
+        The memo public key is part of the account and can be retreived with the
+        `get_account` call:
+
+        .. code-block:: js
+
+            get_account <accountname>
+            {
+              [...]
+              "options": {
+                "memo_key": "GPH5TPTziKkLexhVKsQKtSpo4bAv5RnB8oXcG4sMHEwCcTf3r7dqE",
+                [...]
+              },
+              [...]
+            }
+
+        while the memo private key can be dumped with `dump_private_keys`
+
+        Memo Message
+        ############
+
+        The take the following form:
+
+        .. code-block:: js
+
+                {
+                  "from": "GPH5mgup8evDqMnT86L7scVebRYDC2fwAWmygPEUL43LjstQegYCC",
+                  "to": "GPH5Ar4j53kFWuEZQ9XhxbAja4YXMPJ2EnUg5QcrdeMFYUNMMNJbe",
+                  "nonce": "13043867485137706821",
+                  "message": "d55524c37320920844ca83bb20c8d008"
+                }
+
+        The fields `from` and `to` contain the memo public key of sender and receiver.
+        The `nonce` is a random integer that is used for the seed of the AES encryption
+        of the message.
+
+        Example
+        #######
+
+        Encrypting a memo
+        ~~~~~~~~~~~~~~~~~
+
+        The high level memo class makes use of the pysteem wallet to obtain keys
+        for the corresponding accounts.
+
+        .. code-block:: python
+
+            from beem.memo import Memo
+            from beem.account import Account
+
+            memoObj = Memo(
+                from_account=Account(from_account),
+                to_account=Account(to_account)
+            )
+            encrypted_memo = memoObj.encrypt(memo)
+
+        Decoding of a received memo
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+        .. code-block:: python
+
+             from getpass import getpass
+             from beem.block import Block
+             from beem.memo import Memo
+
+             # Obtain a transfer from the blockchain
+             block = Block(23755086)                   # block
+             transaction = block["transactions"][3]    # transactions
+             op = transaction["operations"][0]         # operation
+             op_id = op[0]                             # operation type
+             op_data = op[1]                           # operation payload
+
+             # Instantiate Memo for decoding
+             memo = Memo()
+
+             # Unlock wallet
+             memo.unlock_wallet(getpass())
+
+             # Decode memo
+             # Raises exception if required keys not available in the wallet
+             print(memo.decrypt(op_data["memo"]))
+
     """
     def __init__(
         self,
diff --git a/beem/notify.py b/beem/notify.py
index 60823177..24a38fc2 100644
--- a/beem/notify.py
+++ b/beem/notify.py
@@ -4,7 +4,6 @@ from beemapi.websocket import SteemWebsocket
 from beem.instance import shared_steem_instance
 from beem.blockchain import Blockchain
 from beem.price import Order, FilledOrder, UpdateCallOrder
-from beem.account import AccountUpdate
 log = logging.getLogger(__name__)
 # logging.basicConfig(level=logging.DEBUG)
 
@@ -12,10 +11,10 @@ log = logging.getLogger(__name__)
 class Notify(Events):
     """ Notifications on Blockchain events.
 
-        :param list accounts: Account names/ids to be notified about when changing
-        :param fnt on_tx: Callback that will be called for each transaction received
+        This modules allows yout to be notified of events taking place on the
+        blockchain.
+
         :param fnt on_block: Callback that will be called for each block received
-        :param fnt on_account: Callback that will be called for changes of the listed accounts
         :param beem.steem.Steem steem_instance: Steem instance
 
         **Example**
@@ -26,12 +25,10 @@ class Notify(Events):
             from beem.notify import Notify
 
             notify = Notify(
-                accounts=["test"],
                 on_block=print,
             )
             notify.listen()
 
-
     """
 
     __events__ = [
@@ -40,10 +37,11 @@ class Notify(Events):
 
     def __init__(
         self,
-        accounts=[],
+        # accounts=[],
         on_block=None,
         only_block_id=False,
         steem_instance=None,
+        keep_alive=25
     ):
         # Events
         super(Notify, self).__init__()
@@ -51,8 +49,8 @@ class Notify(Events):
 
         # Steem instance
         self.steem = steem_instance or shared_steem_instance()
-        # Callbacks
 
+        # Callbacks
         if on_block:
             self.on_block += on_block
 
@@ -63,16 +61,18 @@ class Notify(Events):
             password=self.steem.rpc.password,
             only_block_id=only_block_id,
             on_block=self.process_block,
+            keep_alive=keep_alive
         )
 
-    def process_account(self, message):
-        """ This is used for processing of account Updates. It will
-            return instances of :class:beem.account.AccountUpdate`
+    def reset_subscriptions(self, accounts=[]):
+        """Change the subscriptions of a running Notify instance
+        """
+        self.websocket.reset_subscriptions(accounts)
+
+    def close(self):
+        """Cleanly close the Notify instance
         """
-        self.on_account(AccountUpdate(
-            message,
-            steem_instance=self.steem
-        ))
+        self.websocket.close()
 
     def process_block(self, message):
         self.on_block(message)
diff --git a/beem/transactionbuilder.py b/beem/transactionbuilder.py
index 7a8e1e14..07a4577c 100644
--- a/beem/transactionbuilder.py
+++ b/beem/transactionbuilder.py
@@ -17,6 +17,23 @@ log = logging.getLogger(__name__)
 class TransactionBuilder(dict):
     """ This class simplifies the creation of transactions by adding
         operations and signers.
+        To build your own transactions and sign them
+
+        .. code-block:: python
+
+           from beem.transactionbuilder import TransactionBuilder
+           from beembase.operations import Transfer
+           tx = TransactionBuilder()
+           tx.appendOps(Transfer(**{
+                    "from": "test",
+                    "to": "test1",
+                    "amount": "1 STEEM",
+                    "memo": ""
+                }))
+           tx.appendSigner("test", "active")
+           tx.sign()
+           tx.broadcast()
+
     """
     def __init__(
         self,
diff --git a/beem/vote.py b/beem/vote.py
index 23fd89df..fc09053e 100644
--- a/beem/vote.py
+++ b/beem/vote.py
@@ -15,6 +15,11 @@ class Vote(BlockchainObject):
         :param str authorperm: perm link to post/comment
         :param steem steem_instance: Steem() instance to use when accesing a RPC
 
+        .. code-block:: python
+
+           from beem.vote import Vote
+           v = Vote("theaussiegame/cryptokittie-giveaway-number-2|")
+
     """
     type_id = 11
 
diff --git a/beem/wallet.py b/beem/wallet.py
index 832116ff..1d957a0e 100644
--- a/beem/wallet.py
+++ b/beem/wallet.py
@@ -41,6 +41,48 @@ class Wallet():
           ``active``, ``owner``, ``posting`` or ``memo`` keys for
           any account. This mode is only used for *foreign*
           signatures!
+
+        Create a new wallet
+        -------------------
+
+        A new wallet can be created by using:
+
+        .. code-block:: python
+
+           from beem import Steem
+           steem = Steem()
+           steem.wallet.create("supersecret-passphrase")
+
+        This will raise an exception if you already have a wallet installed.
+
+        Unlocking the wallet for signing
+        --------------------------------
+
+        The wallet can be unlocked for signing using
+
+        .. code-block:: python
+
+           from beem import Steem
+           steem = Steem()
+           steem.wallet.unlock("supersecret-passphrase")
+
+        Adding a Private Key
+        --------------------
+
+        A private key can be added by using the
+        :func:`steem.wallet.Wallet.addPrivateKey` method that is available
+        **after** unlocking the wallet with the correct passphrase:
+
+        .. code-block:: python
+
+           from beem import Steem
+           steem = Steem()
+           steem.wallet.unlock("supersecret-passphrase")
+           steem.wallet.addPrivateKey("5xxxxxxxxxxxxxxxxxxxx")
+
+        .. note:: The private key has to be either in hexadecimal or in wallet
+                  import format (wif) (starting with a ``5``).
+
     """
     keys = []
     rpc = None
diff --git a/beem/witness.py b/beem/witness.py
index 9534333e..69e3d93c 100644
--- a/beem/witness.py
+++ b/beem/witness.py
@@ -13,6 +13,11 @@ class Witness(BlockchainObject):
         :param steem steem_instance: Steem() instance to use when
                accesing a RPC
 
+        .. code-block:: python
+
+           from beem.witness import Witness
+           Witness("gtg")
+
     """
     type_id = 3
 
diff --git a/beemapi/steemnoderpc.py b/beemapi/steemnoderpc.py
index 3da3a00b..4ccbfe81 100644
--- a/beemapi/steemnoderpc.py
+++ b/beemapi/steemnoderpc.py
@@ -18,6 +18,10 @@ class NumRetriesReached(Exception):
 
 
 class SteemNodeRPC(GrapheneWebsocketRPC):
+    """ This class allows to call API methods exposed by the witness node via
+        websockets.
+
+    """
 
     def __init__(self, *args, **kwargs):
         super(SteemNodeRPC, self).__init__(*args, **kwargs)
diff --git a/beemapi/websocket.py b/beemapi/websocket.py
index 218b6c6c..7c62ce36 100644
--- a/beemapi/websocket.py
+++ b/beemapi/websocket.py
@@ -39,7 +39,6 @@ class SteemWebsocket(Events):
 
         Notices:
 
-
         * ``on_block``:
 
             .. code-block:: js
@@ -58,8 +57,10 @@ class SteemWebsocket(Events):
         user="",
         password="",
         *args,
+        # accounts=[],
         only_block_id=False,
         on_block=None,
+        # on_account=None,
         keep_alive=25,
         num_retries=-1,
         **kwargs
@@ -72,6 +73,7 @@ class SteemWebsocket(Events):
         self.user = user
         self.password = password
         self.keep_alive = keep_alive
+        self.run_event = threading.Event()
         self.only_block_id = only_block_id
         if isinstance(urls, cycle):
             self.urls = urls
@@ -84,8 +86,13 @@ class SteemWebsocket(Events):
         Events.__init__(self)
         self.events = Events()
 
+        # Store the objects we are interested in
+        # self.subscription_accounts = accounts
+
         if on_block:
             self.on_block += on_block
+        # if on_account:
+        #     self.on_account += on_account
 
     def cancel_subscriptions(self):
         # self.cancel_all_subscriptions()
@@ -103,8 +110,18 @@ class SteemWebsocket(Events):
         """
         self.login(self.user, self.password, api_id=1)
         # self.database(api_id=1)
-        # self.cancel_all_subscriptions()
+        self.__set_subscriptions()
+        self.keepalive = threading.Thread(
+            target=self._ping,
+        )
+        self.keepalive.start()
+
+    def reset_subscriptions(self, accounts=[]):
+        # self.subscription_accounts = accounts
+        self.__set_subscriptions()
 
+    def __set_subscriptions(self):
+        # self.cancel_all_subscriptions()
         # Subscribe to events on the Backend and give them a
         # callback number that allows us to identify the event
         # set_pending_transaction_callback is removed from api
@@ -114,18 +131,12 @@ class SteemWebsocket(Events):
             self.set_block_applied_callback(
                 self.__events__.index('on_block'))
 
+    def _ping(self):
         # We keep the connetion alive by requesting a short object
         def ping(self):
-            while 1:
+            while not self.run_event.wait(self.keep_alive):
                 log.debug('Sending ping')
                 self.get_chain_properties()
-                time.sleep(self.keep_alive)
-
-        self.keepalive = threading.Thread(
-            target=ping,
-            args=(self,)
-        )
-        self.keepalive.start()
 
     def process_block(self, data):
         """ This method is called on notices that need processing. Here,
@@ -213,7 +224,7 @@ class SteemWebsocket(Events):
             connected with the provided APIs
         """
         cnt = 0
-        while True:
+        while not self.run_event.is_set():
             cnt += 1
             self.url = next(self.urls)
             log.debug("Trying to connect to node %s" % self.url)
@@ -251,6 +262,15 @@ class SteemWebsocket(Events):
         self._request_id += 1
         return self._request_id
 
+    def close(self):
+        """ Closes the websocket connection and waits for the ping thread to close
+        """
+        self.run_event.set()
+        self.ws.close()
+
+        if self.keepalive and self.keepalive.is_alive():
+            self.keepalive.join()
+
     """ RPC Calls
     """
     def rpcexec(self, payload):
diff --git a/docs/account.rst b/docs/account.rst
deleted file mode 100644
index aa7c9cd5..00000000
--- a/docs/account.rst
+++ /dev/null
@@ -1,17 +0,0 @@
-Account
-~~~~~~~
-
-Obtaining data of an account.
-
-.. code-block:: python
-
-   from beem.account import Account
-   account = Account("test")
-   print(account)
-   print(account.balances)
-
-.. autoclass:: beem.account.Account
-   :members:
-
-.. autoclass:: beem.account.AccountUpdate
-   :members:
diff --git a/docs/amount.rst b/docs/amount.rst
deleted file mode 100644
index a982990a..00000000
--- a/docs/amount.rst
+++ /dev/null
@@ -1,19 +0,0 @@
-Amount
-~~~~~~
-
-For the sake of easier handling of Assets on the blockchain
-
-.. code-block:: python
-
-   from beem.amount import Amount
-   from beem.asset import Asset
-   a = Amount("1 USD")
-   b = Amount(1, "USD")
-   c = Amount("20", Asset("USD"))
-   a + b
-   a * 2
-   a += b
-   a /= 2.0
-
-.. autoclass:: beem.amount.Amount
-   :members:
diff --git a/docs/asset.rst b/docs/asset.rst
deleted file mode 100644
index b9e1b0d4..00000000
--- a/docs/asset.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-Asset
-~~~~~~
-
-.. autoclass:: beem.asset.Asset
-   :members:
diff --git a/docs/beem.account.rst b/docs/beem.account.rst
new file mode 100644
index 00000000..eccc1ae4
--- /dev/null
+++ b/docs/beem.account.rst
@@ -0,0 +1,7 @@
+beem\.account module
+====================
+
+.. automodule:: beem.account
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.aes.rst b/docs/beem.aes.rst
new file mode 100644
index 00000000..2af68299
--- /dev/null
+++ b/docs/beem.aes.rst
@@ -0,0 +1,7 @@
+beem\.aes module
+================
+
+.. automodule:: beem.aes
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.amount.rst b/docs/beem.amount.rst
new file mode 100644
index 00000000..07676b71
--- /dev/null
+++ b/docs/beem.amount.rst
@@ -0,0 +1,7 @@
+beem\.amount module
+===================
+
+.. automodule:: beem.amount
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.asset.rst b/docs/beem.asset.rst
new file mode 100644
index 00000000..93c12ae0
--- /dev/null
+++ b/docs/beem.asset.rst
@@ -0,0 +1,7 @@
+beem\.asset module
+==================
+
+.. automodule:: beem.asset
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.block.rst b/docs/beem.block.rst
new file mode 100644
index 00000000..24c7b18c
--- /dev/null
+++ b/docs/beem.block.rst
@@ -0,0 +1,7 @@
+beem\.block module
+==================
+
+.. automodule:: beem.block
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.blockchain.rst b/docs/beem.blockchain.rst
new file mode 100644
index 00000000..5e63eabc
--- /dev/null
+++ b/docs/beem.blockchain.rst
@@ -0,0 +1,7 @@
+beem\.blockchain module
+=======================
+
+.. automodule:: beem.blockchain
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.comment.rst b/docs/beem.comment.rst
new file mode 100644
index 00000000..d73cf23f
--- /dev/null
+++ b/docs/beem.comment.rst
@@ -0,0 +1,7 @@
+beem\.comment module
+==================
+
+.. automodule:: beem.comment
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.exceptions.rst b/docs/beem.exceptions.rst
new file mode 100644
index 00000000..c0c8b970
--- /dev/null
+++ b/docs/beem.exceptions.rst
@@ -0,0 +1,7 @@
+beem\.exceptions module
+=======================
+
+.. automodule:: beem.exceptions
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.instances.rst b/docs/beem.instances.rst
new file mode 100644
index 00000000..2cdfbe70
--- /dev/null
+++ b/docs/beem.instances.rst
@@ -0,0 +1,7 @@
+beem\.instance module
+=====================
+
+.. automodule:: beem.instance
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.market.rst b/docs/beem.market.rst
new file mode 100644
index 00000000..db64afa9
--- /dev/null
+++ b/docs/beem.market.rst
@@ -0,0 +1,7 @@
+beem\.market module
+===================
+
+.. automodule:: beem.market
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.memo.rst b/docs/beem.memo.rst
new file mode 100644
index 00000000..26b6bd03
--- /dev/null
+++ b/docs/beem.memo.rst
@@ -0,0 +1,7 @@
+beem\.memo module
+=================
+
+.. automodule:: beem.memo
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.message.rst b/docs/beem.message.rst
new file mode 100644
index 00000000..6dc3f825
--- /dev/null
+++ b/docs/beem.message.rst
@@ -0,0 +1,7 @@
+beem\.message module
+====================
+
+.. automodule:: beem.message
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.notify.rst b/docs/beem.notify.rst
new file mode 100644
index 00000000..0a47d5a9
--- /dev/null
+++ b/docs/beem.notify.rst
@@ -0,0 +1,7 @@
+beem\.notify module
+===================
+
+.. automodule:: beem.notify
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.price.rst b/docs/beem.price.rst
new file mode 100644
index 00000000..2da4fcdc
--- /dev/null
+++ b/docs/beem.price.rst
@@ -0,0 +1,7 @@
+beem\.price module
+==================
+
+.. automodule:: beem.price
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.rst b/docs/beem.rst
new file mode 100644
index 00000000..287524e6
--- /dev/null
+++ b/docs/beem.rst
@@ -0,0 +1,38 @@
+beem package
+=================
+
+Submodules
+----------
+
+.. toctree::
+
+   beem.account
+   beem.aes
+   beem.amount
+   beem.asset
+   beem.steem
+   beem.block
+   beem.blockchain
+   beem.blockchainobject
+   beem.comment
+   beem.exceptions
+   beem.instance
+   beem.market
+   beem.memo
+   beem.message
+   beem.notify
+   beem.price
+   beem.storage
+   beem.transactionbuilder
+   beem.utils
+   beem.vote
+   beem.wallet
+   beem.witness
+
+Module contents
+---------------
+
+.. automodule:: beem
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.steem.rst b/docs/beem.steem.rst
new file mode 100644
index 00000000..6d603e9e
--- /dev/null
+++ b/docs/beem.steem.rst
@@ -0,0 +1,7 @@
+beem\.steem module
+==================
+
+.. automodule:: beem.steem
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.storage.rst b/docs/beem.storage.rst
new file mode 100644
index 00000000..3b95ce9d
--- /dev/null
+++ b/docs/beem.storage.rst
@@ -0,0 +1,7 @@
+beem\.storage module
+====================
+
+.. automodule:: beem.storage
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.transactionbuilder.rst b/docs/beem.transactionbuilder.rst
new file mode 100644
index 00000000..00998515
--- /dev/null
+++ b/docs/beem.transactionbuilder.rst
@@ -0,0 +1,7 @@
+beem\.transactionbuilder module
+===============================
+
+.. automodule:: beem.transactionbuilder
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.utils.rst b/docs/beem.utils.rst
new file mode 100644
index 00000000..4983a4bd
--- /dev/null
+++ b/docs/beem.utils.rst
@@ -0,0 +1,7 @@
+beem\.utils module
+==================
+
+.. automodule:: beem.utils
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.vote.rst b/docs/beem.vote.rst
new file mode 100644
index 00000000..b9d76e5f
--- /dev/null
+++ b/docs/beem.vote.rst
@@ -0,0 +1,7 @@
+beem\.vote module
+=================
+
+.. automodule:: beem.vote
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.wallet.rst b/docs/beem.wallet.rst
new file mode 100644
index 00000000..9c393d72
--- /dev/null
+++ b/docs/beem.wallet.rst
@@ -0,0 +1,7 @@
+beem\.wallet module
+===================
+
+.. automodule:: beem.wallet
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beem.witness.rst b/docs/beem.witness.rst
new file mode 100644
index 00000000..15f4120c
--- /dev/null
+++ b/docs/beem.witness.rst
@@ -0,0 +1,8 @@
+beem\.witness module
+====================
+
+.. automodule:: beem.witness
+    :members:
+    :undoc-members:
+    :show-inheritance:
+   
diff --git a/docs/beemapi.exceptions.rst b/docs/beemapi.exceptions.rst
new file mode 100644
index 00000000..07c320d9
--- /dev/null
+++ b/docs/beemapi.exceptions.rst
@@ -0,0 +1,7 @@
+beemapi\.exceptions module
+==========================
+
+.. automodule:: beemapi.exceptions
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beemapi.rst b/docs/beemapi.rst
new file mode 100644
index 00000000..5150dd44
--- /dev/null
+++ b/docs/beemapi.rst
@@ -0,0 +1,19 @@
+beemapi package
+===============
+
+Submodules
+----------
+
+.. toctree::
+
+   beemapi.steemnoderpc
+   beemapi.exceptions
+   beemapi.websocket
+
+Module contents
+---------------
+
+.. automodule:: beemapi
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/docs/websocketrpc.rst b/docs/beemapi.steemnoderpc.rst
similarity index 100%
rename from docs/websocketrpc.rst
rename to docs/beemapi.steemnoderpc.rst
diff --git a/docs/websocket.rst b/docs/beemapi.websocket.rst
similarity index 100%
rename from docs/websocket.rst
rename to docs/beemapi.websocket.rst
diff --git a/docs/beembase.account.rst b/docs/beembase.account.rst
new file mode 100644
index 00000000..046169ac
--- /dev/null
+++ b/docs/beembase.account.rst
@@ -0,0 +1,7 @@
+beembase\.account module
+========================
+
+.. automodule:: beembase.account
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beembase.bip38.rst b/docs/beembase.bip38.rst
new file mode 100644
index 00000000..fc53d02a
--- /dev/null
+++ b/docs/beembase.bip38.rst
@@ -0,0 +1,7 @@
+beembase\.bip38 module
+========================
+
+.. automodule:: beembase.bip38
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beembase.chains.rst b/docs/beembase.chains.rst
new file mode 100644
index 00000000..a7526f6d
--- /dev/null
+++ b/docs/beembase.chains.rst
@@ -0,0 +1,7 @@
+beembase\.chains module
+=======================
+
+.. automodule:: beembase.chains
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beembase.memo.rst b/docs/beembase.memo.rst
new file mode 100644
index 00000000..8708a95b
--- /dev/null
+++ b/docs/beembase.memo.rst
@@ -0,0 +1,7 @@
+beembase\.memo module
+=====================
+
+.. automodule:: beembase.memo
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beembase.objects.rst b/docs/beembase.objects.rst
new file mode 100644
index 00000000..be152cd9
--- /dev/null
+++ b/docs/beembase.objects.rst
@@ -0,0 +1,7 @@
+beembase\.objects module
+========================
+
+.. automodule:: beembase.objects
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beembase.objecttypes.rst b/docs/beembase.objecttypes.rst
new file mode 100644
index 00000000..77bf72dd
--- /dev/null
+++ b/docs/beembase.objecttypes.rst
@@ -0,0 +1,7 @@
+beembase\.objecttypes module
+============================
+
+.. automodule:: beembase.objecttypes
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beembase.operationids.rst b/docs/beembase.operationids.rst
new file mode 100644
index 00000000..b757f3be
--- /dev/null
+++ b/docs/beembase.operationids.rst
@@ -0,0 +1,7 @@
+beembase\.operationids module
+=============================
+
+.. automodule:: beembase.operationids
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beembase.operations.rst b/docs/beembase.operations.rst
new file mode 100644
index 00000000..0fd3b967
--- /dev/null
+++ b/docs/beembase.operations.rst
@@ -0,0 +1,7 @@
+beembase\.operations module
+===========================
+
+.. automodule:: beembase.operationids
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beembase.rst b/docs/beembase.rst
new file mode 100644
index 00000000..534113ee
--- /dev/null
+++ b/docs/beembase.rst
@@ -0,0 +1,26 @@
+beembase package
+================
+
+Submodules
+----------
+
+.. toctree::
+
+   beembase.account
+   beembase.bip38
+   beembase.chains
+   beembase.memo
+   beembase.objects
+   beembase.objecttypes
+   beembase.operationids
+   beembase.operations
+   beembase.signedtransactions
+   beembase.transactions
+
+Module contents
+---------------
+
+.. automodule:: beembase
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beembase.signedtransations.rst b/docs/beembase.signedtransations.rst
new file mode 100644
index 00000000..26baaf36
--- /dev/null
+++ b/docs/beembase.signedtransations.rst
@@ -0,0 +1,7 @@
+beembase\.signedtransactions module
+===================================
+
+.. automodule:: beembase.signedtransactions
+    :members:
+    :undoc-members:
+    :show-inheritance:
\ No newline at end of file
diff --git a/docs/beembase.transactions.rst b/docs/beembase.transactions.rst
new file mode 100644
index 00000000..61cf1eee
--- /dev/null
+++ b/docs/beembase.transactions.rst
@@ -0,0 +1,7 @@
+beembase\.transactions module
+===================================
+
+.. automodule:: beembase.transactions
+    :members:
+    :undoc-members:
+    :show-inheritance:
diff --git a/docs/block.rst b/docs/block.rst
deleted file mode 100644
index ccc63c9b..00000000
--- a/docs/block.rst
+++ /dev/null
@@ -1,13 +0,0 @@
-Block
-~~~~~~
-
-Easily read data in a Block
-
-.. code-block:: python
-
-   from beem.block import Block
-   from pprint import pprint
-   pprint(Block(1))
-
-.. autoclass:: beem.block.Block
-   :members:
diff --git a/docs/blockchain.rst b/docs/blockchain.rst
deleted file mode 100644
index 4ee75051..00000000
--- a/docs/blockchain.rst
+++ /dev/null
@@ -1,33 +0,0 @@
-Blockchain
-~~~~~~~~~~
-
-Read blockchain related data-
-
-.. code-block:: python
-
-   from beem.blockchain import Blockchain
-   chain = Blockchain()
-
-Read current block and blockchain info
-
-.. code-block:: python
-
-   print(chain.get_current_block())
-   print(chain.info())
-
-Monitor for new blocks ..
-
-.. code-block:: python
-
-   for block in chain.blocks():
-       print(block)
-
-... or each operation individually:
-
-.. code-block:: python
-
-   for operations in chain.ops():
-       print(operations)
-
-.. autoclass:: beem.blockchain.Blockchain
-   :members:
diff --git a/docs/comment.rst b/docs/comment.rst
deleted file mode 100644
index 223c26fc..00000000
--- a/docs/comment.rst
+++ /dev/null
@@ -1,13 +0,0 @@
-Comment
-~~~~~~~
-
-Read data about a Comment/Post
-
-.. code-block:: python
-
-   from beem.comment import Comment
-
-.. autoclass:: beem.comment.Comment
-   :members:
-
-
diff --git a/docs/exceptions.rst b/docs/exceptions.rst
deleted file mode 100644
index 36b2e1f5..00000000
--- a/docs/exceptions.rst
+++ /dev/null
@@ -1,8 +0,0 @@
-Exceptions
-~~~~~~~~~~
-
-.. autoclass:: beem.exceptions
-   :members:
-
-.. autoclass:: beemapi.exceptions
-   :members:
diff --git a/docs/index.rst b/docs/index.rst
index 83f62cfe..c8e3c2a5 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -10,7 +10,7 @@
    http://rest-sphinx-memo.readthedocs.org/en/latest/ReST.html
 
 Welcome to beem's documentation!
-===============================================
+================================
 
 Steem is a blockchain-based rewards platform for publishers to monetize 
 content and grow community.
@@ -20,6 +20,13 @@ software) that allows for fast transactions and ascalable blockchain
 solution. In case of Steem, it comes with decentralized publishing of
 content.
 
+The Steem library has been designed to allow developers to easily
+access its routines and make use of the network without dealing with all
+the related blockchain technology and cryptography. This library can be
+used to do anything that is allowed according to the Steem
+blockchain protocol.
+
+
 About this Library
 ------------------
 
@@ -94,7 +101,7 @@ Quickstart
    
 
 General
--------------------------
+-------
 .. toctree::
    :maxdepth: 1
 
@@ -105,42 +112,34 @@ General
    contribute
    support
 
-beem Libraries
---------------------------
+Packages
+--------
+
+
+beem
+~~~~
 
 .. toctree::
-   :maxdepth: 1
+   :maxdepth: 3
+
+   beem
 
-   steem
-   instances
-   account
-   amount
-   asset
-   block
-   blockchain
-   exceptions
-   dex
-   market
-   notify
-   price
-   vesting
-   witness
-
-Low Level Classes
------------------
+beembase
+~~~~~~~~
 
 .. toctree::
-   :maxdepth: 1
+   :maxdepth: 3
+
+   beembase
 
-   storage
-   utils
-   transactionbuilder
-   wallet
-   websocket
-   websocketrpc
-   transactions
-   memo
+beemapi
+~~~~~~~
 
+.. toctree::
+   :maxdepth: 3
+
+   beemapi
+   
 Glossary
 ========
 
diff --git a/docs/instances.rst b/docs/instances.rst
deleted file mode 100644
index 571bd5fa..00000000
--- a/docs/instances.rst
+++ /dev/null
@@ -1,16 +0,0 @@
-Instances
-~~~~~~~~~
-
-Default instance to be used when no ``steem_instance`` is given to
-the Objects!
-
-.. code-block:: python
-
-   from beem.instance import shared_steem_instance
-
-   account = Account("test")
-   # is equivalent with 
-   account = Account("test", steem_instance=shared_steem_instance())
-
-.. automethod:: beem.instance.shared_steem_instance
-.. automethod:: beem.instance.set_shared_steem_instance
diff --git a/docs/market.rst b/docs/market.rst
deleted file mode 100644
index 3a0ec86b..00000000
--- a/docs/market.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-Market
-~~~~~~~
-
-.. autoclass:: beem.market.Market
-    :members:
diff --git a/docs/memo.rst b/docs/memo.rst
deleted file mode 100644
index 6a287ce6..00000000
--- a/docs/memo.rst
+++ /dev/null
@@ -1,100 +0,0 @@
-****
-Memo
-****
-
-Memo Keys
-#########
-
-In BitShares, memos are AES-256 encrypted with a shared secret between sender and
-receiver. It is derived from the memo private key of the sender and the memo
-publick key of the receiver. 
-
-In order for the receiver to decode the memo, the shared secret has to be
-derived from the receiver's private key and the senders public key.
-
-The memo public key is part of the account and can be retreived with the
-`get_account` call:
-
-.. code-block:: js
-
-    get_account <accountname>
-    {
-      [...]
-      "options": {
-        "memo_key": "GPH5TPTziKkLexhVKsQKtSpo4bAv5RnB8oXcG4sMHEwCcTf3r7dqE",
-        [...]
-      },
-      [...]
-    }
-
-while the memo private key can be dumped with `dump_private_keys`
-
-Memo Message
-############
-
-The take the following form:
-
-.. code-block:: js
-
-        {
-          "from": "GPH5mgup8evDqMnT86L7scVebRYDC2fwAWmygPEUL43LjstQegYCC",
-          "to": "GPH5Ar4j53kFWuEZQ9XhxbAja4YXMPJ2EnUg5QcrdeMFYUNMMNJbe",
-          "nonce": "13043867485137706821",
-          "message": "d55524c37320920844ca83bb20c8d008"
-        }
-
-The fields `from` and `to` contain the memo public key of sender and receiver.
-The `nonce` is a random integer that is used for the seed of the AES encryption
-of the message.
-
-Example
-#######
-
-Encrypting a memo
-~~~~~~~~~~~~~~~~~
-
-The high level memo class makes use of the pysteem wallet to obtain keys
-for the corresponding accounts.
-
-.. code-block:: python
-
-    from beem.memo import Memo
-    from beem.account import Account
-
-    memoObj = Memo(
-        from_account=Account(from_account),
-        to_account=Account(to_account)
-    )
-    encrypted_memo = memoObj.encrypt(memo)
-
-Decoding of a received memo
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block:: python
-
-     from getpass import getpass
-     from beem.block import Block
-     from beem.memo import Memo
-
-     # Obtain a transfer from the blockchain
-     block = Block(23755086)                   # block
-     transaction = block["transactions"][3]    # transactions
-     op = transaction["operations"][0]         # operation
-     op_id = op[0]                             # operation type
-     op_data = op[1]                           # operation payload
-
-     # Instantiate Memo for decoding
-     memo = Memo()
-
-     # Unlock wallet
-     memo.unlock_wallet(getpass())
-
-     # Decode memo
-     # Raises exception if required keys not available in the wallet
-     print(memo.decrypt(op_data["memo"]))
-
-API
-###
-
-.. automodule:: beembase.memo
-    :members:
diff --git a/docs/modules.rst b/docs/modules.rst
new file mode 100644
index 00000000..266c622a
--- /dev/null
+++ b/docs/modules.rst
@@ -0,0 +1,9 @@
+beem
+====
+
+.. toctree::
+   :maxdepth: 6
+
+   beem
+   beemapi
+   beembase
\ No newline at end of file
diff --git a/docs/notify.rst b/docs/notify.rst
deleted file mode 100644
index cc6945c9..00000000
--- a/docs/notify.rst
+++ /dev/null
@@ -1,8 +0,0 @@
-Notify
-~~~~~~~
-
-This modules allows yout to be notified of events taking place on the
-blockchain.
-
-.. autoclass:: beem.notify.Notify
-   :members:
diff --git a/docs/price.rst b/docs/price.rst
deleted file mode 100644
index b10a1b59..00000000
--- a/docs/price.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-Price
-~~~~~~
-
-.. autoclass:: beem.price.Price
-   :members:
diff --git a/docs/steem.rst b/docs/steem.rst
deleted file mode 100644
index 7db40e7c..00000000
--- a/docs/steem.rst
+++ /dev/null
@@ -1,11 +0,0 @@
-Steem
-~~~~~~~~~
-
-The Steem library has been designed to allow developers to easily
-access its routines and make use of the network without dealing with all
-the related blockchain technology and cryptography. This library can be
-used to do anything that is allowed according to the Steem
-blockchain protocol.
-
-.. autoclass:: beem.steem.Steem
-   :members:
diff --git a/docs/storage.rst b/docs/storage.rst
deleted file mode 100644
index 102bde85..00000000
--- a/docs/storage.rst
+++ /dev/null
@@ -1,17 +0,0 @@
-*******
-Storage
-*******
-
-These classes are very low level and are not well documented.
-
-API
----
-
-.. autoclass:: beem.storage.DataDir
-   :members:
-
-.. autoclass:: beem.storage.Key
-   :members:
-
-.. autoclass:: beem.storage.MasterPassword
-   :members:
diff --git a/docs/transactionbuilder.rst b/docs/transactionbuilder.rst
deleted file mode 100644
index 4f20f427..00000000
--- a/docs/transactionbuilder.rst
+++ /dev/null
@@ -1,22 +0,0 @@
-Transaction Builder
-~~~~~~~~~~~~~~~~~~~
-
-To build your own transactions and sign them
-
-.. code-block:: python
-
-   from beem.transactionbuilder import TransactionBuilder
-   from beembase.operations import Transfer
-   tx = TransactionBuilder()
-   tx.appendOps(Transfer(**{
-            "from": "test",
-            "to": "test1",
-            "amount": "1 STEEM",
-            "memo": ""
-        }))
-   tx.appendSigner("test", "active")
-   tx.sign()
-   tx.broadcast()
-
-.. autoclass:: beem.transactionbuilder.TransactionBuilder
-   :members:
diff --git a/docs/transactions.rst b/docs/transactions.rst
deleted file mode 100644
index f838aa85..00000000
--- a/docs/transactions.rst
+++ /dev/null
@@ -1,64 +0,0 @@
-***********************************************
-Manual Constructing and Signing of Transactions
-***********************************************
-
-.. warning:: This is a low level class. Do not use this class unless you
-             know what you are doing!
-
-.. note:: This class is under development and meant for people that are
-          looking into the low level construction and signing of various
-          transactions.
-
-Loading Transactions Class
-##########################
-
-We load the class for manual transaction construction via:
-
-.. code-block:: python
-
-    from beembase import transactions, operations
-
-Construction
-############
-
-Now we can use the predefined transaction formats, e.g. ``Transfer`` or
-``limit_order_create`` as follows:
-
-1. define the expiration time
-2. define a JSON object that contains all data for that transaction
-3. load that data into the corresponding **operations** class
-4. collect multiple operations
-5. get some blockchain parameters to prevent replay attack
-6. Construct the actual **transaction** from the list of operations
-7. sign the transaction with the corresponding private key(s)
-
-**Example A: Transfer**
-
-.. code-block:: python
-
-        expiration = transactions.formatTimeFromNow(60)
-        op = operations.Transfer(**{
-            "from": "test",
-            "to": "test1",
-            "amount": "1.000 SBD",
-            "memo": ""
-        })
-        ops    = [transactions.Operation(op)]
-        ref_block_num, ref_block_prefix = transactions.getBlockParams(rpc)
-        tx     = transactions.Signed_Transaction(ref_block_num=ref_block_num,
-                                                 ref_block_prefix=ref_block_prefix,
-                                                 expiration=expiration,
-                                                 operations=ops)
-        tx = tx.sign([wif])
-
-
-Broadcasting
-############
-
-For broadcasting, we first need to convert the transactions class into a
-JSON object. After that, we can broadcast this to the network:
-
-.. code-block:: python
-
-    # Broadcast JSON to network
-    rpc.broadcast_transaction(tx.json(), api="network_broadcast"):
diff --git a/docs/utils.rst b/docs/utils.rst
deleted file mode 100644
index f2962844..00000000
--- a/docs/utils.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-Utilities
-~~~~~~~~~~~~~~~~~~~
-
-.. autoclass:: beem.utils
-   :members:
diff --git a/docs/vote.rst b/docs/vote.rst
deleted file mode 100644
index e1fbf2f0..00000000
--- a/docs/vote.rst
+++ /dev/null
@@ -1,15 +0,0 @@
-Vote
-~~~~
-
-Read data about a vote
-
-.. code-block:: python
-
-   from beem.vote import Vote
-   Witness("gtg")
-
-.. autoclass:: beem.vote.Vote
-   :members:
-
-
-   
diff --git a/docs/wallet.rst b/docs/wallet.rst
deleted file mode 100644
index f6092fae..00000000
--- a/docs/wallet.rst
+++ /dev/null
@@ -1,49 +0,0 @@
-Wallet
-~~~~~~
-
-Create a new wallet
--------------------
-
-A new wallet can be created by using:
-
-.. code-block:: python
-
-   from beem import Steem
-   steem = Steem()
-   steem.wallet.create("supersecret-passphrase")
-
-This will raise an exception if you already have a wallet installed.
-
-Unlocking the wallet for signing
---------------------------------
-
-The wallet can be unlocked for signing using
-
-.. code-block:: python
-
-   from beem import Steem
-   steem = Steem()
-   steem.wallet.unlock("supersecret-passphrase")
-
-Adding a Private Key
---------------------
-
-A private key can be added by using the
-:func:`steem.wallet.Wallet.addPrivateKey` method that is available
-**after** unlocking the wallet with the correct passphrase:
-
-.. code-block:: python
-
-   from beem import Steem
-   steem = Steem()
-   steem.wallet.unlock("supersecret-passphrase")
-   steem.wallet.addPrivateKey("5xxxxxxxxxxxxxxxxxxxx")
-
-.. note:: The private key has to be either in hexadecimal or in wallet
-          import format (wif) (starting with a ``5``).
-
-API
----
-
-.. autoclass:: beem.wallet.Wallet
-   :members:
diff --git a/docs/witness.rst b/docs/witness.rst
deleted file mode 100644
index 55458502..00000000
--- a/docs/witness.rst
+++ /dev/null
@@ -1,28 +0,0 @@
-Witness
-~~~~~~~
-
-Read data about a witness
-
-.. code-block:: python
-
-   from beem.witness import Witness
-   Witness("gtg")
-
-.. autoclass:: beem.witness.Witness
-   :members:
-
-.. autoclass:: beem.witness.Witnesses
-   :members:
-
-.. autoclass:: beem.witness.WitnessesVotedByAccount
-   :members:
-   
-.. autoclass:: beem.witness.WitnessesRankedByVote
-   :members:
-   
-.. autoclass:: beem.witness.WitnessesByIds
-   :members:
-   
-.. autoclass:: beem.witness.LookupWitnesses
-   :members:
-   
diff --git a/requirements.txt b/requirements.txt
index a025cfee..76b9c782 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,5 @@
-graphenelib
-pycryptodomex>=3.4.6
+graphenelib>=0.5.9
+pycryptodome>=3.4.6
 scrypt>=0.7.1
 Events>=0.2.2
 pyyaml
diff --git a/setup.py b/setup.py
index 72d2cc00..9f875fde 100755
--- a/setup.py
+++ b/setup.py
@@ -14,7 +14,7 @@ except LookupError:
     ascii = codecs.lookup('ascii')
     codecs.register(lambda name, enc=ascii: {True: enc}.get(name == 'mbcs'))
 
-VERSION = '0.19.3'
+VERSION = '0.19.4'
 
 
 def write_version_py(filename):
@@ -65,7 +65,7 @@ if __name__ == '__main__':
             "appdirs",
             "Events",
             "scrypt",
-            "pycryptodomex",  # for AES, installed through graphenelib already
+            "pycryptodome",  # for AES, installed through graphenelib already
         ],
         setup_requires=['pytest-runner'],
         tests_require=['pytest'],
-- 
GitLab