commit 8649775406d3eccc030a78aac3deb8e7a3dad342
parent 24c707e60904409e68e22d8546dea8f73447c4b9
Author: nolash <dev@holbrook.no>
Date:   Fri,  7 May 2021 22:06:08 +0200
Parse token owner address
Diffstat:
2 files changed, 48 insertions(+), 3 deletions(-)
diff --git a/python/eth_devbadge/token.py b/python/eth_devbadge/token.py
@@ -9,6 +9,13 @@ from chainlib.eth.tx import (
 from chainlib.eth.contract import (
         ABIContractEncoder,
         ABIContractType,
+        abi_decode_single,
+        )
+from chainlib.jsonrpc import jsonrpc_template
+from chainlib.eth.constant import ZERO_ADDRESS
+from hexathon import (
+        add_0x,
+        strip_0x,
         )
 
 # local imports
@@ -70,3 +77,23 @@ class BadgeToken(TxFactory):
         tx = self.set_code(tx, data)
         tx = self.finalize(tx, tx_format)
         return tx
+
+
+    def owner_of(self, contract_address, token_id, sender_address=ZERO_ADDRESS):
+        o = jsonrpc_template()
+        o['method'] = 'eth_call'
+        enc = ABIContractEncoder()
+        enc.method('ownerOf')
+        enc.typ(ABIContractType.UINT256)
+        enc.uint256(token_id)
+        data = add_0x(enc.get())
+        tx = self.template(sender_address, contract_address)
+        tx = self.set_code(tx, data)
+        o['params'].append(self.normalize(tx))
+        o['params'].append('latest')
+        return o
+
+
+    @classmethod
+    def parse_owner_of(self, v):
+        return abi_decode_single(ABIContractType.ADDRESS, v)
diff --git a/python/tests/test_app.py b/python/tests/test_app.py
@@ -43,17 +43,35 @@ class Test(EthTesterCase):
         r = self.conn.do(o)
         self.address = to_checksum_address(r['contract_address'])
 
-    
-    def test_mint(self):
+
+    def _mint(self, recipient, token_id):
         nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc)
         c = BadgeToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
-        (tx_hash_hex, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], int.from_bytes(b'\xee' * 32, byteorder='big'))
+        (tx_hash_hex, o) = c.mint_to(self.address, self.accounts[0], recipient, token_id)
         r = self.rpc.do(o)
 
         o = receipt(tx_hash_hex)
         r = self.conn.do(o)
         self.assertEqual(r['status'], 1)
 
+        return c
+
+
+    def test_mint(self):
+        token_id = int.from_bytes(b'\xee' * 32, byteorder='big')
+        c = self._mint(self.accounts[1], token_id)
+
+
+    def test_owner(self):
+        token_id = int.from_bytes(b'\xee' * 32, byteorder='big')
+        c = self._mint(self.accounts[1], token_id)
+
+        o = c.owner_of(self.address, token_id, sender_address=self.accounts[0])
+        r = self.rpc.do(o)
+        owner_address = c.parse_owner_of(r)
+
+        self.assertEqual(self.accounts[1], owner_address)
+
 
 if __name__ == '__main__':
     unittest.main()