Add CIC package

Add abi signature encoding list

Add cic package
This commit is contained in:
lash
2023-10-29 10:52:11 +00:00
parent b1c03932ad
commit 3d2b2fa612
197 changed files with 824 additions and 1359 deletions

View File

@@ -0,0 +1 @@
from .interface import *

View File

@@ -0,0 +1,44 @@
# external imports
from chainlib.eth.tx import TxFormat
from chainlib.eth.tx import TxFactory
from chainlib.jsonrpc import JSONRPCRequest
from chainlib.eth.constant import ZERO_ADDRESS
from chainlib.eth.contract import ABIContractEncoder
from chainlib.eth.contract import ABIContractType
from hexathon import add_0x
class EthWriter(TxFactory):
def __single_address_method(self, method, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC):
enc = ABIContractEncoder()
enc.method(method)
enc.typ(ABIContractType.ADDRESS)
enc.address(address)
data = enc.get()
tx = self.template(sender_address, contract_address, use_nonce=True)
tx = self.set_code(tx, data)
tx = self.finalize(tx, tx_format)
return tx
def add_writer(self, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC):
return self.__single_address_method('addWriter', contract_address, sender_address, address, tx_format)
def delete_writer(self, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC):
return self.__single_address_method('deleteWriter', contract_address, sender_address, address, tx_format)
def is_writer(self, contract_address, address, sender_address=ZERO_ADDRESS, id_generator=None):
j = JSONRPCRequest(id_generator)
o = j.template()
o['method'] = 'eth_call'
enc = ABIContractEncoder()
enc.method('isWriter')
enc.typ(ABIContractType.ADDRESS)
enc.address(address)
data = add_0x(enc.get())
tx = self.template(sender_address, contract_address)
tx = self.set_code(tx, data)
o['params'].append(self.normalize(tx))
return o

View File

@@ -0,0 +1 @@
from .interface import TestEthWriterInterface

View File

@@ -0,0 +1,58 @@
# standard imports
import os
import logging
# external imports
from chainlib.eth.unittest.ethtester import EthTesterCase
from chainlib.connection import RPCConnection
from chainlib.eth.nonce import RPCNonceOracle
from chainlib.eth.tx import receipt
from chainlib.eth.tx import TxFactory
from chainlib.eth.tx import TxFormat
from chainlib.eth.contract import ABIContractEncoder
from chainlib.eth.contract import ABIContractType
from cic_contracts.unittest import bytecode
from cic_contracts import Name
# local imports
from eth_writer import EthWriter
script_dir = os.path.dirname(os.path.realpath(__file__))
contract_dir = os.path.join(script_dir, '..', '..', 'solidity')
logg = logging.getLogger(__name__)
class TestEthWriter(EthTesterCase):
def setUp(self):
super(TestEthWriter, self).setUp()
self.set_method = None
self.conn = RPCConnection.connect(self.chain_spec, 'default')
nonce_oracle = RPCNonceOracle(self.accounts[0], self.conn)
code = bytecode(Name.WRITER)
txf = TxFactory(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
tx = txf.template(self.accounts[0], None, use_nonce=True)
tx = txf.set_code(tx, code)
(tx_hash_hex, o) = txf.build(tx)
self.conn.do(o)
o = receipt(tx_hash_hex)
r = self.conn.do(o)
self.assertEqual(r['status'], 1)
self.address = r['contract_address']
self.contracts['writer'] = self.address
self.roles['publisher'] = self.accounts[0]
self.roles['writer'] = self.accounts[1]
logg.debug('published writer test contract with hash {}'.format(r))
c = EthWriter(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
(tx_hash, o) = c.add_writer(self.address, self.accounts[0], self.accounts[0])
self.rpc.do(o)
o = receipt(tx_hash)
r = self.rpc.do(o)
self.assertEqual(r['status'], 1)

View File

@@ -0,0 +1,45 @@
# external imports
from chainlib.eth.unittest.ethtester import EthTesterCase
from chainlib.connection import RPCConnection
from chainlib.eth.nonce import RPCNonceOracle
from chainlib.eth.tx import receipt
# local imports
from eth_writer import EthWriter
class TestEthWriterInterface:
def test_add_delete(self):
writer_contract_address = self.contracts['writer']
publisher_address = self.roles.get('publisher')
writer_account = self.roles['writer']
nonce_oracle = RPCNonceOracle(self.publisher, conn=self.conn)
c = EthWriter(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle)
o = c.is_writer(writer_contract_address, publisher_address, sender_address=publisher_address)
r = self.rpc.do(o)
self.assertEqual(int(r, 16), 1)
self.alice = self.accounts[1]
(tx_hash, o) = c.add_writer(writer_contract_address, publisher_address, writer_account)
self.rpc.do(o)
o = receipt(tx_hash)
r = self.rpc.do(o)
self.assertEqual(r['status'], 1)
o = c.is_writer(writer_contract_address, writer_account, sender_address=publisher_address)
r = self.rpc.do(o)
self.assertEqual(int(r, 16), 1)
self.alice = self.accounts[1]
(tx_hash, o) = c.delete_writer(writer_contract_address, publisher_address, writer_account)
self.rpc.do(o)
o = receipt(tx_hash)
r = self.rpc.do(o)
self.assertEqual(r['status'], 1)
o = c.is_writer(writer_contract_address, self.alice, sender_address=publisher_address)
r = self.rpc.do(o)
self.assertEqual(int(r, 16), 0)