From e61c802c4fc1e4fe9f6a6dad7e2abe0fb4a813ab Mon Sep 17 00:00:00 2001
From: Holger <holger@nahrstaedt.de>
Date: Sun, 23 Sep 2018 22:05:41 +0200
Subject: [PATCH] Add Witness_set_properties to operations and add Offline
 constructTx

Example for using offline signing is provided
Next release prepared
---
 CHANGELOG.rst                   |  1 -
 beem/account.py                 |  3 ++-
 beem/version.py                 |  2 +-
 beemapi/version.py              |  2 +-
 beembase/operationids.py        |  1 +
 beembase/operations.py          | 29 ++++++++++++++++++++
 beembase/version.py             |  2 +-
 beemgraphenebase/chains.py      | 17 +++---------
 beemgraphenebase/version.py     |  2 +-
 examples/using_steem_offline.py | 47 +++++++++++++++++++++++++++++++++
 setup.py                        |  2 +-
 tests/beem/test_cli.py          |  4 +--
 tests/beem/test_testnet.py      | 42 ++++++++++++++---------------
 13 files changed, 110 insertions(+), 44 deletions(-)
 create mode 100644 examples/using_steem_offline.py

diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index d5301463..d33cd2c7 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -2,7 +2,6 @@ Changelog
 =========
 0.19.56
 -------
-* Issue
 * adding methods to claim and create discounted accouts (PR #84) by crokkon
 * Make vote rshare calculations HF20 ready (PR #85) by flugschwein
 * Issue #80 fixed
diff --git a/beem/account.py b/beem/account.py
index abb3df3d..ee0dd4fa 100644
--- a/beem/account.py
+++ b/beem/account.py
@@ -213,7 +213,8 @@ class Account(BlockchainObject):
         ]
         for p in amounts:
             if p in output:
-                output[p] = output.get(p, Amount("0.000 SBD", steem_instance=self.steem)).json()
+                if p in output:
+                    output[p] = output.get(p).json()
         return json.loads(str(json.dumps(output)))
 
     def getSimilarAccountNames(self, limit=5):
diff --git a/beem/version.py b/beem/version.py
index 4e90f950..6fa67243 100644
--- a/beem/version.py
+++ b/beem/version.py
@@ -1,2 +1,2 @@
 """THIS FILE IS GENERATED FROM beem SETUP.PY."""
-version = '0.19.56'
+version = '0.19.57'
diff --git a/beemapi/version.py b/beemapi/version.py
index 4e90f950..6fa67243 100644
--- a/beemapi/version.py
+++ b/beemapi/version.py
@@ -1,2 +1,2 @@
 """THIS FILE IS GENERATED FROM beem SETUP.PY."""
-version = '0.19.56'
+version = '0.19.57'
diff --git a/beembase/operationids.py b/beembase/operationids.py
index d44f3c19..c83f9654 100644
--- a/beembase/operationids.py
+++ b/beembase/operationids.py
@@ -61,6 +61,7 @@ ops = [
     'comment_payout_update',
     'return_vesting_delegation',
     'comment_benefactor_reward',
+    'witness_set_properties'
 ]
 operations = {o: ops.index(o) for o in ops}
 
diff --git a/beembase/operations.py b/beembase/operations.py
index bf31c339..918f3f91 100644
--- a/beembase/operations.py
+++ b/beembase/operations.py
@@ -272,6 +272,35 @@ class Account_update(GrapheneObject):
         ]))
 
 
+class Witness_set_properties(GrapheneObject):
+    def __init__(self, *args, **kwargs):
+        if check_for_class(self, args):
+            return
+        if len(args) == 1 and len(kwargs) == 0:
+            kwargs = args[0]
+        prefix = kwargs.pop("prefix", default_prefix)
+        extensions = Array([])
+        props = {}
+        for k in kwargs["props"]:
+            if "key" == k[0]:
+                block_signing_key = (PublicKey(k[1], prefix=prefix))
+                props["key"] = repr(block_signing_key)
+        for k in kwargs["props"]:
+            if k[0] == "key":
+                continue
+            props[k[0]] = (k[1])
+        props_list = []
+        for k in props:
+            props_list.append(Array([String(k), String(props[k])]))
+        map_props = Array(props_list)
+
+        super(Witness_set_properties, self).__init__(OrderedDict([
+            ('owner', String(kwargs["owner"])),
+            ('props', map_props),
+            ('extensions', extensions),
+        ]))
+
+
 class Witness_update(GrapheneObject):
     def __init__(self, *args, **kwargs):
         if check_for_class(self, args):
diff --git a/beembase/version.py b/beembase/version.py
index 4e90f950..6fa67243 100644
--- a/beembase/version.py
+++ b/beembase/version.py
@@ -1,2 +1,2 @@
 """THIS FILE IS GENERATED FROM beem SETUP.PY."""
-version = '0.19.56'
+version = '0.19.57'
diff --git a/beemgraphenebase/chains.py b/beemgraphenebase/chains.py
index cf77df5d..1c49021f 100644
--- a/beemgraphenebase/chains.py
+++ b/beemgraphenebase/chains.py
@@ -39,20 +39,9 @@ known_chains = {
         "min_version": '0.0.0',
         "prefix": "STX",
         "chain_assets": [
-            {"asset": "SBD", "symbol": "SBD", "precision": 3, "id": 0},
-            {"asset": "STEEM", "symbol": "STEEM", "precision": 3, "id": 1},
-            {"asset": "VESTS", "symbol": "VESTS", "precision": 6, "id": 2}
-        ],
-    },
-    "TEST": {
-        "chain_id":
-        "9afbce9f2416520733bacb370315d32b6b2c43d6097576df1c1222859d91eecc",
-        "min_version": '0.0.0',
-        "prefix": "TST",
-        "chain_assets": [
-            {"asset": "SBD", "symbol": "TBD", "precision": 3, "id": 0},
-            {"asset": "STEEM", "symbol": "TESTS", "precision": 3, "id": 1},
-            {"asset": "VESTS", "symbol": "VESTS", "precision": 6, "id": 2}
+            {"asset": "@@000000013", "symbol": "SBD", "precision": 3, "id": 0},
+            {"asset": "@@000000021", "symbol": "STEEM", "precision": 3, "id": 1},
+            {"asset": "@@000000037", "symbol": "VESTS", "precision": 6, "id": 2}
         ],
     },
     "TESTDEV": {
diff --git a/beemgraphenebase/version.py b/beemgraphenebase/version.py
index 4e90f950..6fa67243 100644
--- a/beemgraphenebase/version.py
+++ b/beemgraphenebase/version.py
@@ -1,2 +1,2 @@
 """THIS FILE IS GENERATED FROM beem SETUP.PY."""
-version = '0.19.56'
+version = '0.19.57'
diff --git a/examples/using_steem_offline.py b/examples/using_steem_offline.py
new file mode 100644
index 00000000..e1290601
--- /dev/null
+++ b/examples/using_steem_offline.py
@@ -0,0 +1,47 @@
+from __future__ import division
+from __future__ import print_function
+from __future__ import unicode_literals
+import sys
+from datetime import datetime, timedelta
+import time
+import io
+import logging
+
+from beem.blockchain import Blockchain
+from beem.block import Block
+from beem.account import Account
+from beem.amount import Amount
+from beem.witness import Witness
+from beembase import operations
+from beem.transactionbuilder import TransactionBuilder
+from beemgraphenebase.account import PasswordKey, PrivateKey, PublicKey
+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
+log = logging.getLogger(__name__)
+logging.basicConfig(level=logging.INFO)
+
+# example wif
+wif = "5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
+
+
+if __name__ == "__main__":
+    stm_online = Steem()
+    ref_block_num, ref_block_prefix = getBlockParams(stm_online)
+    print("ref_block_num %d - ref_block_prefix %d" % (ref_block_num, ref_block_prefix))
+
+    stm = Steem(offline=True)
+
+    op = operations.Transfer({'from': 'beembot',
+                              'to': 'holger80',
+                              'amount': "0.001 SBD",
+                              'memo': ""})
+    tb = TransactionBuilder(steem_instance=stm)
+
+    tb.appendOps([op])
+    tb.appendWif(wif)
+    tb.constructTx(ref_block_num=ref_block_num, ref_block_prefix=ref_block_prefix)
+    tx = tb.sign(reconstruct_tx=False)
+    print(tx.json())
diff --git a/setup.py b/setup.py
index 1814091f..945034a1 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.19.56'
+VERSION = '0.19.57'
 
 tests_require = ['mock >= 2.0.0', 'pytest', 'pytest-mock', 'parameterized']
 
diff --git a/tests/beem/test_cli.py b/tests/beem/test_cli.py
index ae095e5e..f32ec483 100644
--- a/tests/beem/test_cli.py
+++ b/tests/beem/test_cli.py
@@ -30,8 +30,8 @@ class Testcases(unittest.TestCase):
         cls.nodelist = NodeList()
         cls.nodelist.update_nodes()
         cls.nodelist.update_nodes(steem_instance=Steem(node=cls.nodelist.get_nodes(normal=True, appbase=True), num_retries=10))
-        stm = shared_steem_instance()
-        stm.config.refreshBackup()
+        # stm = shared_steem_instance()
+        # stm.config.refreshBackup()
         runner = CliRunner()
         result = runner.invoke(cli, ['-o', 'set', 'default_vote_weight', '100'])
         if result.exit_code != 0:
diff --git a/tests/beem/test_testnet.py b/tests/beem/test_testnet.py
index d3700969..92be879f 100644
--- a/tests/beem/test_testnet.py
+++ b/tests/beem/test_testnet.py
@@ -41,8 +41,8 @@ class Testcases(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
         nodelist = NodeList()
-        stm = shared_steem_instance()
-        stm.config.refreshBackup()
+        # stm = shared_steem_instance()
+        # stm.config.refreshBackup()
         cls.bts = Steem(
             node=nodelist.get_testnet(),
             nobroadcast=True,
@@ -156,10 +156,10 @@ class Testcases(unittest.TestCase):
     def test_transfer_1of1(self):
         steem = self.bts
         steem.nobroadcast = False
-        tx = TransactionBuilder(steem_instance=steem)
+        tx = TransactionBuilder(use_condenser_api=False, steem_instance=steem)
         tx.appendOps(Transfer(**{"from": 'beem',
                                  "to": 'beem1',
-                                 "amount": '0.01 SBD',
+                                 "amount": {"amount": "10", "precision": 3, "nai": "@@000000017"},
                                  "memo": '1 of 1 transaction'}))
         self.assertEqual(
             tx["operations"][0][0],
@@ -176,10 +176,10 @@ class Testcases(unittest.TestCase):
         # Send a 2 of 2 transaction from elf which needs beem4's cosign to send funds
         steem = self.bts
         steem.nobroadcast = False
-        tx = TransactionBuilder(steem_instance=steem)
+        tx = TransactionBuilder(use_condenser_api=False, steem_instance=steem)
         tx.appendOps(Transfer(**{"from": 'beem5',
                                  "to": 'beem1',
-                                 "amount": '0.01 SBD',
+                                 "amount": {"amount": "10", "precision": 3, "nai": "@@000000017"},
                                  "memo": '2 of 2 simple transaction'}))
 
         tx.appendWif(self.active_private_key_of_beem5)
@@ -199,10 +199,10 @@ class Testcases(unittest.TestCase):
         steem.nobroadcast = False
         steem.wallet.unlock("123")
 
-        tx = TransactionBuilder(steem_instance=steem)
+        tx = TransactionBuilder(use_condenser_api=False, steem_instance=steem)
         tx.appendOps(Transfer(**{"from": 'beem5',
                                  "to": 'beem1',
-                                 "amount": '0.01 SBD',
+                                 "amount": {"amount": "10", "precision": 3, "nai": "@@000000017"},
                                  "memo": '2 of 2 serialized/deserialized transaction'}))
 
         tx.appendSigner("beem5", "active")
@@ -220,10 +220,10 @@ class Testcases(unittest.TestCase):
         steem.wallet.unlock("123")
         steem.wallet.removeAccount("beem4")
 
-        tx = TransactionBuilder(steem_instance=steem)
+        tx = TransactionBuilder(use_condenser_api=False, steem_instance=steem)
         tx.appendOps(Transfer(**{"from": 'beem5',
                                  "to": 'beem1',
-                                 "amount": '0.01 SBD',
+                                 "amount": {"amount": "10", "precision": 3, "nai": "@@000000017"},
                                  "memo": '2 of 2 serialized/deserialized transaction'}))
 
         tx.appendSigner("beem5", "active")
@@ -252,10 +252,10 @@ class Testcases(unittest.TestCase):
         steem.wallet.unlock("123")
         steem.wallet.removeAccount("beem4")
 
-        tx = TransactionBuilder(steem_instance=steem)
+        tx = TransactionBuilder(use_condenser_api=False, steem_instance=steem)
         tx.appendOps(Transfer(**{"from": 'beem5',
                                  "to": 'beem',
-                                 "amount": '0.01 SBD',
+                                 "amount": {"amount": "10", "precision": 3, "nai": "@@000000017"},
                                  "memo": '2 of 2 serialized/deserialized transaction'}))
 
         tx.appendSigner("beem5", "active")
@@ -284,10 +284,10 @@ class Testcases(unittest.TestCase):
             expiration=360,
         )
 
-        tx = TransactionBuilder(steem_instance=steem)
+        tx = TransactionBuilder(use_condenser_api=False, steem_instance=steem)
         tx.appendOps(Transfer(**{"from": 'beem5',
                                  "to": 'beem',
-                                 "amount": '0.01 SBD',
+                                 "amount": {"amount": "10", "precision": 3, "nai": "@@000000017"},
                                  "memo": '2 of 2 serialized/deserialized transaction'}))
 
         tx.appendSigner("beem5", "active")
@@ -314,10 +314,10 @@ class Testcases(unittest.TestCase):
     def test_verifyAuthority(self):
         stm = self.bts
         stm.wallet.unlock("123")
-        tx = TransactionBuilder(steem_instance=stm)
+        tx = TransactionBuilder(use_condenser_api=False, steem_instance=stm)
         tx.appendOps(Transfer(**{"from": "beem",
                                  "to": "beem1",
-                                 "amount": "1.33 STEEM",
+                                 "amount": {"amount": "1300", "precision": 3, "nai": "@@000000013"},
                                  "memo": "Foobar"}))
         account = Account("beem", steem_instance=stm)
         tx.appendSigner(account, "active")
@@ -511,7 +511,7 @@ class Testcases(unittest.TestCase):
                     nobroadcast=True,
                     expiration=120,
                     num_retries=10)
-        tx = TransactionBuilder(steem_instance=stm)
+        tx = TransactionBuilder(use_condenser_api=False, steem_instance=stm)
         tx.appendOps(Transfer(**{"from": "beem",
                                  "to": "beem1",
                                  "amount": Amount("1 STEEM", steem_instance=stm),
@@ -535,7 +535,7 @@ class Testcases(unittest.TestCase):
                     nobroadcast=True,
                     expiration=120,
                     num_retries=10)
-        tx = TransactionBuilder(steem_instance=stm)
+        tx = TransactionBuilder(use_condenser_api=False, steem_instance=stm)
         tx.appendOps(Transfer(**{"from": "beem",
                                  "to": "beem1",
                                  "amount": Amount("1 STEEM", steem_instance=stm),
@@ -557,7 +557,7 @@ class Testcases(unittest.TestCase):
                     nobroadcast=True,
                     expiration=120,
                     num_retries=10)
-        tx = TransactionBuilder(steem_instance=stm)
+        tx = TransactionBuilder(use_condenser_api=False, steem_instance=stm)
         tx.appendOps(Transfer(**{"from": "beem",
                                  "to": "beem1",
                                  "amount": Amount("1 STEEM", steem_instance=stm),
@@ -581,7 +581,7 @@ class Testcases(unittest.TestCase):
                     expiration=120,
                     num_retries=10)
 
-        tx = TransactionBuilder(expiration=10, steem_instance=stm)
+        tx = TransactionBuilder(use_condenser_api=False, expiration=10, steem_instance=stm)
         tx.appendOps(Transfer(**{"from": "beem",
                                  "to": "beem1",
                                  "amount": Amount("1 STEEM", steem_instance=stm),
@@ -596,7 +596,7 @@ class Testcases(unittest.TestCase):
                                  "to": "beem1",
                                  "amount": Amount("1 STEEM", steem_instance=stm),
                                  "memo": ""})
-        tx1 = TransactionBuilder(steem_instance=stm)
+        tx1 = TransactionBuilder(use_condenser_api=False, steem_instance=stm)
         tx1.appendOps(opTransfer)
         tx = TransactionBuilder(tx1, steem_instance=stm)
         self.assertFalse(tx.is_empty())
-- 
GitLab