Add full deployment test

This commit is contained in:
nolash 2021-10-11 08:57:03 +02:00
parent 86edabbb5f
commit 3da923481f
Signed by: lash
GPG Key ID: 21D2E7BB88C2A746
9 changed files with 206 additions and 26 deletions

View File

@ -7,22 +7,27 @@ from chainlib.chain import ChainSpec
from chainlib.eth.tx import (
TxFormat,
TxFactory,
Tx,
receipt,
)
from chainlib.eth.connection import RPCConnection
from chainlib.eth.contract import (
ABIContractEncoder,
ABIContractType
)
from chainlib.eth.gas import OverrideGasOracle
from chainlib.eth.nonce import RPCNonceOracle
from chainlib.eth.address import is_address
from eth_token_index import TokenUniqueSymbolIndex
from eth_address_declarator import Declarator
from eth_address_declarator.declarator import AddressDeclarator
logg = logging.getLogger(__name__)
class CICEth:
def __init__(self, chain_spec, resources, proof, signer=None, rpc=None, nonce_oracle=None, fee_oracle=None):
def __init__(self, chain_spec, resources, proof, signer=None, rpc=None, fee_oracle=None):
"""resources will be modified
"""
self.resources = resources
@ -30,7 +35,6 @@ class CICEth:
self.chain_spec = chain_spec
self.signer = signer
self.rpc = rpc
self.nonce_oracle = nonce_oracle
self.fee_oracle = fee_oracle
self.token_details = None
self.token_address = None
@ -127,7 +131,9 @@ class CICEth:
code = self.token_details['code'] + enc.get()
signer_address = self.resources['token']['key_address']
c = TxFactory(self.chain_spec, signer=self.signer, nonce_oracle=self.nonce_oracle, gas_oracle=self.fee_oracle)
nonce_oracle = RPCNonceOracle(signer_address, conn=self.rpc)
c = TxFactory(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle, gas_oracle=self.fee_oracle)
tx = c.template(signer_address, None, use_nonce=True)
tx = c.set_code(tx, code)
o = c.finalize(tx, self.tx_format)
@ -135,6 +141,10 @@ class CICEth:
r = None
if self.rpc != None:
r = self.rpc.do(o[1])
ro = receipt(r)
rr = self.rpc.do(ro)
rr = Tx.src_normalize(rr)
self.token_address = rr['contract_address']
elif self.signer != None:
r = o[1]
@ -146,10 +156,12 @@ class CICEth:
def process_token_index(self):
c = TokenUniqueSymbolIndex(self.chain_spec, signer=self.signer, nonce_oracle=self.nonce_oracle, gas_oracle=self.fee_oracle)
contract_address = self.resources['token_index']['reference']
signer_address = self.resources['token_index']['key_address']
contract_address = self.resources['token_index']['reference']
gas_oracle = OverrideGasOracle(limit=TokenUniqueSymbolIndex.gas(), conn=self.rpc)
nonce_oracle = RPCNonceOracle(signer_address, conn=self.rpc)
c = TokenUniqueSymbolIndex(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle)
o = c.register(contract_address, signer_address, self.token_address, tx_format=self.tx_format)
r = None
@ -165,10 +177,12 @@ class CICEth:
def process_address_declarator(self):
c = Declarator(self.chain_spec, signer=self.signer, nonce_oracle=self.nonce_oracle, gas_oracle=self.fee_oracle)
contract_address = self.resources['address_declarator']['reference']
signer_address = self.resources['address_declarator']['key_address']
contract_address = self.resources['address_declarator']['reference']
gas_oracle = OverrideGasOracle(limit=AddressDeclarator.gas(), conn=self.rpc)
nonce_oracle = RPCNonceOracle(signer_address, conn=self.rpc)
c = Declarator(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle)
r = []
for proof in self.proof.get():
@ -187,6 +201,7 @@ class CICEth:
def process(self):
tasks = []
self.token_address = self.resources['token']['reference']
if self.token_address == None:
tasks.append('token')
@ -197,7 +212,9 @@ class CICEth:
tasks.append(k)
for task in tasks:
getattr(self, 'process_' + task)()
r = getattr(self, 'process_' + task)()
return self.outputs
def new(resources, proof, signer_hint=None):

10
cic/hash.py Normal file
View File

@ -0,0 +1,10 @@
class Hasher:
def __basehasher(self, v):
h = hashlib.sha256()
h.update(v)
return h.digest()
def hash(self, v):
return self.__basehasher(v)

View File

@ -31,4 +31,4 @@ packages =
cic.ext.eth
[options.extras_require]
eth = chainlib-eth>=0.0.10a1,<0.1.0; funga-eth>=0.5.1a1,<0.6.0; eth-token-index>=0.2.4a1,<0.3.0; eth-address-index>=0.2.4a1,<0.3.0
eth = chainlib-eth>=0.0.10a1,<0.1.0; funga-eth>=0.5.1a1,<0.6.0; eth-token-index>=0.2.4a1,<0.3.0; eth-address-index>=0.2.4a1,<0.3.0, okota>=0.2.4a6,<0.3.0

View File

@ -6,11 +6,19 @@ import logging
# external imports
from chainlib.chain import ChainSpec
from chainlib.eth.unittest.ethtester import EthTesterCase
from chainlib.eth.tx import (
Tx,
receipt,
)
from chainlib.eth.gas import OverrideGasOracle
from chainlib.eth.nonce import RPCNonceOracle
from hexathon import (
add_0x,
strip_0x,
)
from funga.eth.keystore.dict import DictKeystore
from eth_address_declarator.declarator import AddressDeclarator
from okota.token_index.index import TokenUniqueSymbolIndexAddressDeclarator
# local imports
from cic.ext.eth import CICEth
@ -28,9 +36,35 @@ class TestCICEthBase(EthTesterCase):
def setUp(self):
super(TestCICEthBase, self).setUp()
random.seed(42)
self.initial_description = add_0x(random.randbytes(32).hex())
self.token_address = add_0x(random.randbytes(20).hex())
self.token_index_address = add_0x(random.randbytes(20).hex())
addresses = self.keystore.list()
nonce_oracle = RPCNonceOracle(addresses[2], self.rpc)
gas_oracle = OverrideGasOracle(limit=AddressDeclarator.gas(), conn=self.rpc)
c = AddressDeclarator(self.chain_spec, self.signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle)
(tx_hash_hex, o) = c.constructor(addresses[2], self.initial_description)
r = self.rpc.do(o)
o = receipt(r)
r = self.rpc.do(o)
Tx.src_normalize(r)
self.assertEqual(r['status'], 1)
self.address_declarator_address = r['contract_address']
logg.debug('address declarator deployed at {}'.format(self.address_declarator_address))
nonce_oracle = RPCNonceOracle(addresses[1], self.rpc)
gas_oracle = OverrideGasOracle(limit=TokenUniqueSymbolIndexAddressDeclarator.gas(), conn=self.rpc)
c = TokenUniqueSymbolIndexAddressDeclarator(self.chain_spec, self.signer, nonce_oracle=nonce_oracle, gas_oracle=gas_oracle)
(tx_hash_hex, o) = c.constructor(addresses[1], self.address_declarator_address)
r = self.rpc.do(o)
o = receipt(r)
r = self.rpc.do(o)
Tx.src_normalize(r)
self.assertEqual(r['status'], 1)
self.token_index_address = r['contract_address']
logg.debug('token index deployed at {}'.format(self.token_index_address))
self.resources = {
'token': {
'reference': self.token_address,
@ -41,7 +75,7 @@ class TestCICEthBase(EthTesterCase):
'key_address': addresses[1],
},
'address_declarator': {
'reference': self.token_index_address,
'reference': self.address_declarator_address,
'key_address': addresses[2],
},
}
@ -50,3 +84,14 @@ class TestCICEthBase(EthTesterCase):
attach.load()
self.proofs = Proof(proof_dir, attachments=attach)
self.proofs.load()
class TestCICEthTokenBase(TestCICEthBase):
def setUp(self):
super(TestCICEthTokenBase, self).setUp()
self.resources['token']['reference'] = None
self.adapter = CICEth(self.chain_spec, self.resources, self.proofs)
self.token_name = 'FOotoken'
self.token_symbol = 'FOO'
self.token_precision = 8

View File

@ -0,0 +1,74 @@
# standard imports
import unittest
import logging
# external imports
from chainlib.eth.nonce import (
RPCNonceOracle,
nonce,
)
from chainlib.eth.gas import (
RPCGasOracle,
OverrideGasOracle,
)
from chainlib.eth.tx import (
TxFormat,
unpack,
receipt,
)
from hexathon import strip_0x
from giftable_erc20_token import GiftableToken
from eth_token_index import TokenUniqueSymbolIndex
# local imports
from cic.ext.eth import CICEth
# test imports
from tests.eth.base_eth import TestCICEthTokenBase
logging.basicConfig(level=logging.DEBUG)
logg = logging.getLogger()
class TestCICEthRPC(TestCICEthTokenBase):
def setUp(self):
super(TestCICEthRPC, self).setUp()
nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc)
gas_oracle = RPCGasOracle(self.rpc)
self.adapter = CICEth(self.chain_spec, self.resources, self.proofs, signer=self.signer, rpc=self.rpc, fee_oracle=gas_oracle)
def test_rpc_process_notoken(self):
results = self.adapter.process()
for hsh in results:
logg.debug('hsh {}'.format(hsh))
o = receipt(hsh)
r = self.rpc.do(o)
self.assertEqual(r['status'], 1)
def test_rpc_process_withtoken(self):
self.adapter.fee_oracle = OverrideGasOracle(limit=GiftableToken.gas(), conn=self.rpc)
self.adapter.prepare_token(self.token_name, self.token_symbol, self.token_precision, GiftableToken.bytecode())
results = self.adapter.process()
for hsh in results:
logg.debug('hsh {}'.format(hsh))
o = receipt(hsh)
r = self.rpc.do(o)
self.assertEqual(r['status'], 1)
o = receipt(results[0])
r = self.rpc.do(o)
token_contract_address = r['contract_address']
c = TokenUniqueSymbolIndex(self.chain_spec)
o = c.address_of(self.token_index_address, 'FOO', sender_address=self.accounts[0])
r = self.rpc.do(o)
token_contract_address_lookup = c.parse_address_of(r)
self.assertEqual(strip_0x(token_contract_address), strip_0x(token_contract_address_lookup))
if __name__ == '__main__':
unittest.main()

View File

@ -15,6 +15,8 @@ from chainlib.eth.contract import (
)
from chainlib.jsonrpc import JSONRPCRequest
from hexathon import add_0x
from giftable_erc20_token import GiftableToken
from eth_erc20 import ERC20
# local imports
from cic.ext.eth import CICEth
@ -22,22 +24,12 @@ from cic.ext.eth import CICEth
# tests imports
from tests.eth.base_eth import TestCICEthBase
from tests.base_cic import test_data_dir
from giftable_erc20_token import GiftableToken
from eth_erc20 import ERC20
logging.basicConfig(level=logging.DEBUG)
logg = logging.getLogger()
class TestCICEthToken(TestCICEthBase):
def setUp(self):
super(TestCICEthToken, self).setUp()
self.resources['token']['reference'] = None
self.adapter = CICEth(self.chain_spec, self.resources, self.proofs)
self.token_name = 'FOotoken'
self.token_symbol = 'FOO'
self.token_precision = 8
class TestCICEthToken(TestCICEthTokenBase):
def test_token_nobackend(self):
@ -48,7 +40,7 @@ class TestCICEthToken(TestCICEthBase):
def test_token_sign(self):
self.adapter.signer = self.signer
self.adapter.tx_format = TxFormat.RLP_SIGNED
self.adapter.prepare_token('FOoToken', 'FOO', 8, GiftableToken.bytecode())
self.adapter.prepare_token(self.token_name, self.token_symbol, self.token_precision, GiftableToken.bytecode())
v = self.adapter.process_token()
@ -56,7 +48,7 @@ class TestCICEthToken(TestCICEthBase):
self.adapter.signer = self.signer
self.adapter.rpc = self.rpc
self.adapter.tx_format = TxFormat.JSONRPC
self.adapter.prepare_token('FOoToken', 'FOO', 8, GiftableToken.bytecode())
self.adapter.prepare_token(self.token_name, self.token_symbol, self.token_precision, GiftableToken.bytecode())
v = self.adapter.process_token()
o = receipt(v)
r = self.rpc.do(o)

40
tests/test_proof.py Normal file
View File

@ -0,0 +1,40 @@
# standard imports
import os
import unittest
import logging
# local imports
from cic import Proof
from cic.attachment import Attachment
# test imports
from tests.base_cic import test_data_dir
logging.basicConfig(level=logging.DEBUG)
logg = logging.getLogger()
foo_hash = '2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae'
bar_hash = 'fcde2b2edba56bf408601fb721fe9b5c338d10ee429ea04fae5511b68fbf8fb9'
class TestProof(unittest.TestCase):
def test_proof_serialize(self):
proof_path = os.path.join(test_data_dir, 'proof')
c = Proof(path=proof_path)
v = c.get()
logg.debug('v {}'.format(v))
def test_proof_serialize_merge(self):
proof_path = os.path.join(test_data_dir, 'proof')
attach = Attachment(proof_path)
attach.load()
c = Proof(path=proof_path, attachments=attach)
v = c.get()
if __name__ == '__main__':
unittest.main()

View File

@ -0,0 +1 @@
bar

View File

@ -0,0 +1 @@
foo