commit 1f19aecd0e827da1a045b123b779d83745b4ad34
parent 17431dc0008c7c6355cd0d127a24e20299203dcc
Author: nolash <dev@holbrook.no>
Date:   Wed, 24 Feb 2021 22:38:56 +0100
Accept none value in build raw for to address
Diffstat:
6 files changed, 63 insertions(+), 4 deletions(-)
diff --git a/chainlib/eth/address.py b/chainlib/eth/address.py
@@ -6,9 +6,29 @@ from hexathon import (
     )
 
 
+def is_address(address_hex):
+    try:
+        address_hex = strip_0x(address_hex)    
+    except ValueError:
+        return False
+    return len(address_hex) == 40
+
+
+def is_checksum_address(address_hex):
+    hx = None
+    try:
+        hx = to_checksum(address_hex)
+    except ValueError:
+        return False
+    print('{} {}'.format(hx, address_hex))
+    return hx == address_hex
+
+
 def to_checksum(address_hex):
         address_hex = strip_0x(address_hex)
         address_hex = uniform(address_hex)
+        if len(address_hex) != 40:
+            raise ValueError('Invalid address length')
         h = sha3.keccak_256()
         h.update(address_hex.encode('utf-8'))
         z = h.digest()
diff --git a/chainlib/eth/connection.py b/chainlib/eth/connection.py
@@ -44,6 +44,7 @@ class HTTPConnection:
         logg.debug('(HTTP) send {}'.format(data))
         res = urlopen(req, data=data.encode('utf-8'))
         o = json.load(res)
+        logg.debug('(HTTP) recv {}'.format(o))
         return jsonrpc_result(o, error_parser)
 
     
diff --git a/chainlib/eth/runnable/get.py b/chainlib/eth/runnable/get.py
@@ -73,6 +73,7 @@ def main():
 
     tx = None
     status = -1
+    rcpt = None
     if tx_src['blockHash'] != None:
         o = jsonrpc_template()
         o['method'] = 'eth_getBlockByHash'
@@ -88,13 +89,13 @@ def main():
         o['method'] = 'eth_getTransactionReceipt'
         o['params'].append(tx_hash)
         rcpt = conn.do(o)
-        status = int(strip_0x(rcpt['status']), 16)
+        #status = int(strip_0x(rcpt['status']), 16)
 
     if tx == None:
         tx = Tx(tx_src)
+    if rcpt != None:
+        tx.apply_receipt(rcpt)
     print(tx)
-    status_name = Status(status).name
-    print('status {}'.format(status_name))
 
 
 if __name__ == '__main__':
diff --git a/chainlib/eth/tx.py b/chainlib/eth/tx.py
@@ -112,6 +112,8 @@ class TxFactory:
 
 
     def build_raw(self, tx):
+        if tx['to'] == None or tx['to'] == '':
+            tx['to'] = '0x'
         txe = EIP155Transaction(tx, tx['nonce'], tx['chainId'])
         self.signer.signTransaction(txe)
         tx_raw = txe.rlp_serialize()
diff --git a/setup.cfg b/setup.cfg
@@ -1,6 +1,6 @@
 [metadata]
 name = chainlib
-version = 0.0.1a18
+version = 0.0.1a19
 description = Generic blockchain access library and tooling
 author = Louis Holbrook
 author_email = dev@holbrook.no
diff --git a/tests/test_address.py b/tests/test_address.py
@@ -0,0 +1,35 @@
+import unittest
+
+from chainlib.eth.address import (
+        is_address,
+        is_checksum_address,
+        to_checksum,
+        )
+
+from tests.base import TestBase
+
+
+class TestChain(TestBase):
+
+    def test_chain_spec(self):
+        checksum_address = '0xEb3907eCad74a0013c259D5874AE7f22DcBcC95C'
+        plain_address = checksum_address.lower()
+
+        self.assertEqual(checksum_address, to_checksum(checksum_address))
+
+        self.assertTrue(is_address(plain_address))
+        self.assertFalse(is_checksum_address(plain_address))
+        self.assertTrue(is_checksum_address(checksum_address))
+
+        self.assertFalse(is_address(plain_address + "00"))
+        self.assertFalse(is_address(plain_address[:len(plain_address)-2]))
+
+        with self.assertRaises(ValueError):
+            to_checksum(plain_address + "00")
+
+        with self.assertRaises(ValueError):
+            to_checksum(plain_address[:len(plain_address)-2])
+
+
+if __name__ == '__main__':
+    unittest.main()