From 5ea3ebbe5a7bb81d92ef5ead3cca1d9eee5f1e55 Mon Sep 17 00:00:00 2001
From: Holger Nahrstaedt <holger@nahrstaedt.de>
Date: Wed, 11 Apr 2018 15:15:09 +0200
Subject: [PATCH] Improved numerical calculation of votes

Steem
* max_vote_denom is corrected and calculated as in steemit/steem
beemgrapheneapi
* handling of empty replies added
---
 .travis.yml                    |  9 +++++++--
 beem/block.py                  |  4 ++--
 beem/steem.py                  |  6 +++---
 beemgrapheneapi/graphenerpc.py |  7 ++++++-
 tests/beem/test_block.py       |  1 -
 tox.ini                        | 17 +++++++++++++++++
 6 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index ab218429..8ed0348a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -36,7 +36,7 @@ matrix:
     - os: linux
       python: 3.6
       env:
-        - TOXENV=short
+        - TOXENV=py36short
     - os: osx
       osx_image: xcode9.3
       language: objective-c
@@ -56,7 +56,12 @@ 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-travis pytest parameterized secp256k1 cryptography scrypt
+  - pip install six nose coverage codecov tox-travis pytest pytest-cov coveralls codacy-coverage parameterized secp256k1 cryptography scrypt
 
 script:
  - tox
+
+after_success:
+ - coveralls
+  # - codecov 
+  # - python-codacy-coverage -r coverage.xml
diff --git a/beem/block.py b/beem/block.py
index f8deddd0..fb366789 100644
--- a/beem/block.py
+++ b/beem/block.py
@@ -47,7 +47,7 @@ class Block(BlockchainObject):
         else:
             block = self.steem.rpc.get_block(self.identifier)
         if not block:
-            raise BlockDoesNotExistsException
+            raise BlockDoesNotExistsException(str(self.identifier))
         super(Block, self).__init__(block, steem_instance=self.steem)
 
     @property
@@ -98,7 +98,7 @@ class BlockHeader(BlockchainObject):
         else:
             block = self.steem.rpc.get_block_header(self.identifier)
         if not block:
-            raise BlockDoesNotExistsException
+            raise BlockDoesNotExistsException(str(self.identifier))
         super(BlockHeader, self).__init__(
             block,
             steem_instance=self.steem
diff --git a/beem/steem.py b/beem/steem.py
index 8271d74d..09ef7c9b 100644
--- a/beem/steem.py
+++ b/beem/steem.py
@@ -492,12 +492,12 @@ class Steem(object):
         # get props
         global_properties = self.get_dynamic_global_properties()
         vote_power_reserve_rate = global_properties['vote_power_reserve_rate']
-        max_vote_denom = vote_power_reserve_rate * (5 * 60 * 60 * 24) / (60 * 60 * 24)
+        max_vote_denom = vote_power_reserve_rate * (5 * 60 * 60 * 24)
         return max_vote_denom
 
     def _calc_resulting_vote(self, voting_power=10000, vote_pct=10000):
         # determine voting power used
-        used_power = int((voting_power * vote_pct) / 10000)
+        used_power = int((voting_power * vote_pct) / 10000 * (60 * 60 * 24))
         max_vote_denom = self._max_vote_denom()
         used_power = int((used_power + max_vote_denom - 1) / max_vote_denom)
         return used_power
@@ -549,7 +549,7 @@ class Steem(object):
         used_power = int(math.ceil(rshares * 10000 / vests))
         used_power = used_power * max_vote_denom
 
-        vote_pct = int(used_power * 10000 / voting_power)
+        vote_pct = int(used_power * 10000 / (60 * 60 * 24) / voting_power)
         return vote_pct
 
     def get_chain_properties(self, use_stored_data=True):
diff --git a/beemgrapheneapi/graphenerpc.py b/beemgrapheneapi/graphenerpc.py
index f74a2213..e2f83714 100644
--- a/beemgrapheneapi/graphenerpc.py
+++ b/beemgrapheneapi/graphenerpc.py
@@ -259,7 +259,12 @@ class GrapheneRPC(object):
                     reply = self.ws_send(json.dumps(payload, ensure_ascii=False).encode('utf8'))
                 else:
                     reply = self.request_send(json.dumps(payload, ensure_ascii=False).encode('utf8'))
-                break
+                if reply == '':
+                    self.error_cnt[self.url] += 1
+                    sleep_and_check_retries(self.num_retries_call, self.error_cnt_call, self.url, "Emply Reply")
+                    self.rpcconnect()
+                else:
+                    break
             except KeyboardInterrupt:
                 raise
             except WebSocketConnectionClosedException:
diff --git a/tests/beem/test_block.py b/tests/beem/test_block.py
index ec6edf63..6e80684c 100644
--- a/tests/beem/test_block.py
+++ b/tests/beem/test_block.py
@@ -85,4 +85,3 @@ class Testcases(unittest.TestCase):
             exceptions.BlockDoesNotExistsException
         ):
             BlockHeader(0, steem_instance=bts)
-
diff --git a/tox.ini b/tox.ini
index e2f2f2d3..f55118a4 100644
--- a/tox.ini
+++ b/tox.ini
@@ -42,6 +42,23 @@ commands =
     coverage report -m
     coverage xml
 
+[testenv:py36short]
+deps =
+    mock>=2.0.0
+    pytest
+    pytest-mock
+    parameterized
+    coverage
+    cryptography
+    secp256k1
+    scrypt
+commands =
+    coverage run --parallel-mode -m pytest tests/beemapi tests/beembase tests/beemgraphene {posargs}
+    coverage combine
+    coverage report -m
+    coverage xml
+
+
 [testenv:flake8]
 deps=
     flake8
-- 
GitLab