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