diff --git a/steempy/memo.py b/steempy/memo.py index a84d1b73fa8b0ce49cc7e67bff03fc5601329de6..ab1e1eda74e4f7e49b56fe82fe5b9d001405451c 100644 --- a/steempy/memo.py +++ b/steempy/memo.py @@ -34,7 +34,7 @@ class Memo(object): .. code-block:: python - from steem.memo import Memo + from steempy.memo import Memo m = Memo() m.steem.wallet.unlock("secret") print(memo.decrypt(op_data["memo"])) diff --git a/steempy/transactionbuilder.py b/steempy/transactionbuilder.py index ee371ee88d47faf94fe660df7b791fddc8518b53..696f549c5ec59bdbaf211de72fac8283af57288f 100644 --- a/steempy/transactionbuilder.py +++ b/steempy/transactionbuilder.py @@ -101,7 +101,11 @@ class TransactionBuilder(dict): assert permission in ["active", "owner", "posting"], "Invalid permission" account = Account(account, steem_instance=self.steem) if permission not in account: - account = Account(account, steem_instance=self.steem) + account = Account(account, steem_instance=self.steem, lazy=False, full=True) + account.clear_cache() + account.refresh() + if permission not in account: + account = Account(account, steem_instance=self.steem) assert permission in account, "Could not access permission" required_treshold = account[permission]["weight_threshold"] @@ -178,10 +182,10 @@ class TransactionBuilder(dict): ref_block_num, ref_block_prefix = transactions.getBlockParams( self.steem.rpc) self.tx = Signed_Transaction( - ref_block_num=ref_block_num, ref_block_prefix=ref_block_prefix, expiration=expiration, - operations=ops + operations=ops, + ref_block_num=ref_block_num ) super(TransactionBuilder, self).update(self.tx.json()) self._unset_require_reconstruction() diff --git a/steempybase/objects.py b/steempybase/objects.py index 65c63e5006f120ad518beef1631339ebfd9bb4bd..690c496e6674f34996925260d34266700c815aa5 100644 --- a/steempybase/objects.py +++ b/steempybase/objects.py @@ -35,18 +35,19 @@ class ObjectId(GPHObjectId): """ Encodes object/protocol ids """ def __init__(self, object_str, type_verify=None): - # space, type, id = object_str.split(".") - # self.space = int(space) - # self.type = int(type) - self.instance = Id(int(object_str)) - self.Id = object_str - # if type_verify: - # assert object_type[type_verify] == int(type),\ - # "Object id does not match object type! " +\ - # "Excpected %d, got %d" %\ - # (object_type[type_verify], int(type)) - # else: - # raise Exception("Object id is invalid") + if len(object_str.split(".")) == 3: + space, type, id = object_str.split(".") + self.space = int(space) + self.type = int(type) + self.instance = Id(int(id)) + self.Id = object_str + if type_verify: + assert object_type[type_verify] == int(type),\ + "Object id does not match object type! " +\ + "Excpected %d, got %d" %\ + (object_type[type_verify], int(type)) + else: + raise Exception("Object id is invalid") class Amount(): @@ -97,6 +98,14 @@ class Operation(GPHOperation): def json(self): return json.loads(str(self)) + #return json.loads(str(json.dumps([self.name, self.op.toJson()]))) + + def __bytes__(self): + return bytes(Id(self.opId)) + bytes(self.op) + # return bytes(self.op) + + def __str__(self): + return json.dumps([self.name.lower(), self.op.toJson()]) class Transfer(GrapheneObject): @@ -189,7 +198,6 @@ class Permission(GrapheneObject): ('weight_threshold', Uint32(int(kwargs["weight_threshold"]))), ('account_auths', accountAuths), ('key_auths', keyAuths), - ('extensions', Set([])), ])) @@ -216,7 +224,6 @@ class AccountOptions(GrapheneObject): ('num_witness', Uint16(kwargs["num_witness"])), ('num_committee', Uint16(kwargs["num_committee"])), ('votes', Array([VoteId(o) for o in kwargs["votes"]])), - ('extensions', Set([])), ])) diff --git a/steempybase/operations.py b/steempybase/operations.py index 77a9292a6d6375958d108908a28c7618673ea76e..1571392297e0c324925b780115b0c0abb2f425f8 100644 --- a/steempybase/operations.py +++ b/steempybase/operations.py @@ -49,16 +49,17 @@ class Transfer(GrapheneObject): if isinstance(kwargs["memo"], dict): kwargs["memo"]["prefix"] = prefix memo = Optional(Memo(**kwargs["memo"])) + elif isinstance(kwargs["memo"], str): + memo = (String(kwargs["memo"])) else: memo = Optional(Memo(kwargs["memo"])) else: memo = Optional(None) super().__init__(OrderedDict([ - ('from', (kwargs["from"])), - ('to', (kwargs["to"])), + ('from', String(kwargs["from"])), + ('to', String(kwargs["to"])), ('amount', Amount(kwargs["amount"])), ('memo', memo), - ('extensions', Set([])), ])) diff --git a/tests/test_steem.py b/tests/test_steem.py index 74a1b80f05bd327122a8918043a1912d0fa7f791..6a7b4e478b9d38ad0b9cf131c46d90c4fe4f1bc5 100644 --- a/tests/test_steem.py +++ b/tests/test_steem.py @@ -34,7 +34,7 @@ class Testcases(unittest.TestCase): tx = bts.transfer( "test", 1.33, "SBD", memo="Foobar", account="test1") self.assertEqual( - getOperationNameForId(tx["operations"][0][0]), + tx["operations"][0][0], "transfer" ) op = tx["operations"][0][1] diff --git a/tests/test_steem_testnet.py b/tests/test_steem_testnet.py index 9b41051e5e0dbf1c827bd9af804ab4b38daafe26..abccbc9caa6806e8f90917c272b1a8363ff59dca 100644 --- a/tests/test_steem_testnet.py +++ b/tests/test_steem_testnet.py @@ -51,7 +51,7 @@ class Testcases(unittest.TestCase): storekeys=False ) self.assertEqual( - getOperationNameForId(tx["operations"][0][0]), + tx["operations"][0][0], "account_create" ) op = tx["operations"][0][1] diff --git a/tests/test_transactions.py b/tests/test_transactions.py index b996c6aa4e43edea566e87e7a9b4a470d2601905..93323daf2a8f5f6109eed90af0c68d06f26d47c5 100644 --- a/tests/test_transactions.py +++ b/tests/test_transactions.py @@ -8,6 +8,9 @@ from steempybase import ( from steempybase.objects import Operation from steempybase.signedtransactions import Signed_Transaction from steempybase.account import PrivateKey +from steempybase.operationids import getOperationNameForId +from steempy.amount import Amount +from steempy.asset import Asset import random import unittest from pprint import pprint @@ -15,7 +18,7 @@ from binascii import hexlify TEST_AGAINST_CLI_WALLET = False -prefix = "STM" +prefix = "STEEM" wif = "5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3" ref_block_num = 34294 ref_block_prefix = 3707022213 @@ -24,12 +27,16 @@ expiration = "2016-04-06T08:29:27" class Testcases(unittest.TestCase): - def doit(self, printWire=False): - ops = [Operation(self.op)] + def doit(self, printWire=False, ops=None): + if ops is None: + ops = [Operation(self.op)] + if len(ops) > 0: + txWire_ops = hexlify(bytes(ops[0])).decode("ascii") tx = Signed_Transaction(ref_block_num=ref_block_num, ref_block_prefix=ref_block_prefix, expiration=expiration, operations=ops) + txWire_Unsigned = hexlify(bytes(tx)).decode("ascii") tx = tx.sign([wif], chain=prefix) tx.verify([PrivateKey(wif).pubkey], prefix) txWire = hexlify(bytes(tx)).decode("ascii") @@ -37,7 +44,12 @@ class Testcases(unittest.TestCase): print() print(txWire) print() + if self.cm_op != '' and len(ops) > 0: + self.assertEqual(self.cm_op, txWire_ops) + if self.cm_unsigned != '': + self.assertEqual(self.cm_unsigned, txWire_Unsigned) self.assertEqual(self.cm[:-130], txWire[:-130]) + if TEST_AGAINST_CLI_WALLET: from grapheneapi.grapheneapi import GrapheneAPI @@ -48,6 +60,32 @@ class Testcases(unittest.TestCase): # print(txWire[:-130] == self.cm[:-130]) self.assertEqual(self.cm[:-130], txWire[:-130]) + def test_Empty_Op(self): + self.cm = ("f68585abf4dce7c8045700000120020c2218cd5bcbaf3bdaba2f192a7" + "a69cb2307fcc6be2c09e45e204d175fc5fb715df86fcccfa1235babe6" + "09461cc9fdfadbae06381d711576fb4265bd832008") + self.cm_unsigned = ("f68585abf4dce7c80457000000") + self.cm_op = ("") + self.doit(ops=[]) + + def test_Transfer(self): + self.op = operations.Transfer(**{ + "from": "foo", + "to": "baar", + "amount": Amount("111.110 STEEM"), + "memo": "Fooo" + }) + self.op = [2, {'from': 'foo', 'to': 'baar', 'amount': '111.110 STEEM', 'memo': 'Fooo'}] + self.cm_op = ("") # ("03666f6f046261617206b201000000000003535445454d000004466f6f6f") + self.cm = ("f68585abf4dce7c80457010203666f6f046261617206b201000000" + "000003535445454d000004466f6f6f00012025416c234dd5ff15d8" + "b45486833443c128002bcafa57269cada3ad213ef88adb5831f63a" + "58d8b81bbdd92d494da01eeb13ee1786d02ce075228b25d7132f8f" + "3e") + self.cm_unsigned = ("f68585abf4dce7c80457010203666f6f046261617206b201" + "000000000003535445454d000004466f6f6f0000") + self.doit() + """ def test_call_update(self):