Add full deployment test
This commit is contained in:
parent
86edabbb5f
commit
3da923481f
@ -7,22 +7,27 @@ from chainlib.chain import ChainSpec
|
|||||||
from chainlib.eth.tx import (
|
from chainlib.eth.tx import (
|
||||||
TxFormat,
|
TxFormat,
|
||||||
TxFactory,
|
TxFactory,
|
||||||
|
Tx,
|
||||||
|
receipt,
|
||||||
)
|
)
|
||||||
from chainlib.eth.connection import RPCConnection
|
from chainlib.eth.connection import RPCConnection
|
||||||
from chainlib.eth.contract import (
|
from chainlib.eth.contract import (
|
||||||
ABIContractEncoder,
|
ABIContractEncoder,
|
||||||
ABIContractType
|
ABIContractType
|
||||||
)
|
)
|
||||||
|
from chainlib.eth.gas import OverrideGasOracle
|
||||||
|
from chainlib.eth.nonce import RPCNonceOracle
|
||||||
from chainlib.eth.address import is_address
|
from chainlib.eth.address import is_address
|
||||||
from eth_token_index import TokenUniqueSymbolIndex
|
from eth_token_index import TokenUniqueSymbolIndex
|
||||||
from eth_address_declarator import Declarator
|
from eth_address_declarator import Declarator
|
||||||
|
from eth_address_declarator.declarator import AddressDeclarator
|
||||||
|
|
||||||
logg = logging.getLogger(__name__)
|
logg = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class CICEth:
|
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
|
"""resources will be modified
|
||||||
"""
|
"""
|
||||||
self.resources = resources
|
self.resources = resources
|
||||||
@ -30,7 +35,6 @@ class CICEth:
|
|||||||
self.chain_spec = chain_spec
|
self.chain_spec = chain_spec
|
||||||
self.signer = signer
|
self.signer = signer
|
||||||
self.rpc = rpc
|
self.rpc = rpc
|
||||||
self.nonce_oracle = nonce_oracle
|
|
||||||
self.fee_oracle = fee_oracle
|
self.fee_oracle = fee_oracle
|
||||||
self.token_details = None
|
self.token_details = None
|
||||||
self.token_address = None
|
self.token_address = None
|
||||||
@ -127,7 +131,9 @@ class CICEth:
|
|||||||
code = self.token_details['code'] + enc.get()
|
code = self.token_details['code'] + enc.get()
|
||||||
|
|
||||||
signer_address = self.resources['token']['key_address']
|
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.template(signer_address, None, use_nonce=True)
|
||||||
tx = c.set_code(tx, code)
|
tx = c.set_code(tx, code)
|
||||||
o = c.finalize(tx, self.tx_format)
|
o = c.finalize(tx, self.tx_format)
|
||||||
@ -135,6 +141,10 @@ class CICEth:
|
|||||||
r = None
|
r = None
|
||||||
if self.rpc != None:
|
if self.rpc != None:
|
||||||
r = self.rpc.do(o[1])
|
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:
|
elif self.signer != None:
|
||||||
r = o[1]
|
r = o[1]
|
||||||
|
|
||||||
@ -146,10 +156,12 @@ class CICEth:
|
|||||||
|
|
||||||
|
|
||||||
def process_token_index(self):
|
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']
|
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)
|
o = c.register(contract_address, signer_address, self.token_address, tx_format=self.tx_format)
|
||||||
r = None
|
r = None
|
||||||
@ -165,10 +177,12 @@ class CICEth:
|
|||||||
|
|
||||||
|
|
||||||
def process_address_declarator(self):
|
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']
|
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 = []
|
r = []
|
||||||
for proof in self.proof.get():
|
for proof in self.proof.get():
|
||||||
@ -187,6 +201,7 @@ class CICEth:
|
|||||||
def process(self):
|
def process(self):
|
||||||
tasks = []
|
tasks = []
|
||||||
self.token_address = self.resources['token']['reference']
|
self.token_address = self.resources['token']['reference']
|
||||||
|
|
||||||
if self.token_address == None:
|
if self.token_address == None:
|
||||||
tasks.append('token')
|
tasks.append('token')
|
||||||
|
|
||||||
@ -197,7 +212,9 @@ class CICEth:
|
|||||||
tasks.append(k)
|
tasks.append(k)
|
||||||
|
|
||||||
for task in tasks:
|
for task in tasks:
|
||||||
getattr(self, 'process_' + task)()
|
r = getattr(self, 'process_' + task)()
|
||||||
|
|
||||||
|
return self.outputs
|
||||||
|
|
||||||
|
|
||||||
def new(resources, proof, signer_hint=None):
|
def new(resources, proof, signer_hint=None):
|
||||||
|
10
cic/hash.py
Normal file
10
cic/hash.py
Normal 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)
|
@ -31,4 +31,4 @@ packages =
|
|||||||
cic.ext.eth
|
cic.ext.eth
|
||||||
|
|
||||||
[options.extras_require]
|
[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
|
||||||
|
@ -6,11 +6,19 @@ import logging
|
|||||||
# external imports
|
# external imports
|
||||||
from chainlib.chain import ChainSpec
|
from chainlib.chain import ChainSpec
|
||||||
from chainlib.eth.unittest.ethtester import EthTesterCase
|
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 (
|
from hexathon import (
|
||||||
add_0x,
|
add_0x,
|
||||||
strip_0x,
|
strip_0x,
|
||||||
)
|
)
|
||||||
from funga.eth.keystore.dict import DictKeystore
|
from funga.eth.keystore.dict import DictKeystore
|
||||||
|
from eth_address_declarator.declarator import AddressDeclarator
|
||||||
|
from okota.token_index.index import TokenUniqueSymbolIndexAddressDeclarator
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic.ext.eth import CICEth
|
from cic.ext.eth import CICEth
|
||||||
@ -28,9 +36,35 @@ class TestCICEthBase(EthTesterCase):
|
|||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestCICEthBase, self).setUp()
|
super(TestCICEthBase, self).setUp()
|
||||||
random.seed(42)
|
random.seed(42)
|
||||||
|
self.initial_description = add_0x(random.randbytes(32).hex())
|
||||||
self.token_address = add_0x(random.randbytes(20).hex())
|
self.token_address = add_0x(random.randbytes(20).hex())
|
||||||
self.token_index_address = add_0x(random.randbytes(20).hex())
|
|
||||||
addresses = self.keystore.list()
|
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 = {
|
self.resources = {
|
||||||
'token': {
|
'token': {
|
||||||
'reference': self.token_address,
|
'reference': self.token_address,
|
||||||
@ -41,7 +75,7 @@ class TestCICEthBase(EthTesterCase):
|
|||||||
'key_address': addresses[1],
|
'key_address': addresses[1],
|
||||||
},
|
},
|
||||||
'address_declarator': {
|
'address_declarator': {
|
||||||
'reference': self.token_index_address,
|
'reference': self.address_declarator_address,
|
||||||
'key_address': addresses[2],
|
'key_address': addresses[2],
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -50,3 +84,14 @@ class TestCICEthBase(EthTesterCase):
|
|||||||
attach.load()
|
attach.load()
|
||||||
self.proofs = Proof(proof_dir, attachments=attach)
|
self.proofs = Proof(proof_dir, attachments=attach)
|
||||||
self.proofs.load()
|
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
|
||||||
|
74
tests/eth/test_eth_full.py
Normal file
74
tests/eth/test_eth_full.py
Normal 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()
|
@ -15,6 +15,8 @@ from chainlib.eth.contract import (
|
|||||||
)
|
)
|
||||||
from chainlib.jsonrpc import JSONRPCRequest
|
from chainlib.jsonrpc import JSONRPCRequest
|
||||||
from hexathon import add_0x
|
from hexathon import add_0x
|
||||||
|
from giftable_erc20_token import GiftableToken
|
||||||
|
from eth_erc20 import ERC20
|
||||||
|
|
||||||
# local imports
|
# local imports
|
||||||
from cic.ext.eth import CICEth
|
from cic.ext.eth import CICEth
|
||||||
@ -22,22 +24,12 @@ from cic.ext.eth import CICEth
|
|||||||
# tests imports
|
# tests imports
|
||||||
from tests.eth.base_eth import TestCICEthBase
|
from tests.eth.base_eth import TestCICEthBase
|
||||||
from tests.base_cic import test_data_dir
|
from tests.base_cic import test_data_dir
|
||||||
from giftable_erc20_token import GiftableToken
|
|
||||||
from eth_erc20 import ERC20
|
|
||||||
|
|
||||||
logging.basicConfig(level=logging.DEBUG)
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
logg = logging.getLogger()
|
logg = logging.getLogger()
|
||||||
|
|
||||||
|
|
||||||
class TestCICEthToken(TestCICEthBase):
|
class TestCICEthToken(TestCICEthTokenBase):
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
def test_token_nobackend(self):
|
def test_token_nobackend(self):
|
||||||
@ -48,7 +40,7 @@ class TestCICEthToken(TestCICEthBase):
|
|||||||
def test_token_sign(self):
|
def test_token_sign(self):
|
||||||
self.adapter.signer = self.signer
|
self.adapter.signer = self.signer
|
||||||
self.adapter.tx_format = TxFormat.RLP_SIGNED
|
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()
|
v = self.adapter.process_token()
|
||||||
|
|
||||||
|
|
||||||
@ -56,7 +48,7 @@ class TestCICEthToken(TestCICEthBase):
|
|||||||
self.adapter.signer = self.signer
|
self.adapter.signer = self.signer
|
||||||
self.adapter.rpc = self.rpc
|
self.adapter.rpc = self.rpc
|
||||||
self.adapter.tx_format = TxFormat.JSONRPC
|
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()
|
v = self.adapter.process_token()
|
||||||
o = receipt(v)
|
o = receipt(v)
|
||||||
r = self.rpc.do(o)
|
r = self.rpc.do(o)
|
||||||
|
40
tests/test_proof.py
Normal file
40
tests/test_proof.py
Normal 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()
|
1
tests/testdata/proof/attachments/bar.txt
vendored
Normal file
1
tests/testdata/proof/attachments/bar.txt
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
bar
|
1
tests/testdata/proof/attachments/foo.txt
vendored
Normal file
1
tests/testdata/proof/attachments/foo.txt
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
foo
|
Loading…
Reference in New Issue
Block a user