From f939189f8eb30d68dde51d35ffb859b26cdafae2 Mon Sep 17 00:00:00 2001 From: nolash Date: Fri, 30 Apr 2021 13:11:22 +0200 Subject: [PATCH] Separate out interface --- python/eth_contract_registry/__init__.py | 2 +- .../eth_contract_registry/data/Registry.bin | 2 +- .../eth_contract_registry/data/Registry.json | 2 +- python/eth_contract_registry/interface.py | 43 ++++++++++++++++ .../pytest/fixtures_registry.py | 6 +-- python/eth_contract_registry/registry.py | 46 +++++------------- python/gmon.out | Bin 1321884 -> 1323270 bytes python/tests/test_basic.py | 6 ++- solidity/Registry.sol | 14 ++++++ 9 files changed, 79 insertions(+), 42 deletions(-) create mode 100644 python/eth_contract_registry/interface.py diff --git a/python/eth_contract_registry/__init__.py b/python/eth_contract_registry/__init__.py index f9691f6..f780fde 100644 --- a/python/eth_contract_registry/__init__.py +++ b/python/eth_contract_registry/__init__.py @@ -1 +1 @@ -from .registry import Registry +from .interface import Registry diff --git a/python/eth_contract_registry/data/Registry.bin b/python/eth_contract_registry/data/Registry.bin index e958195..64d5f7d 100644 --- a/python/eth_contract_registry/data/Registry.bin +++ b/python/eth_contract_registry/data/Registry.bin @@ -1 +1 @@ -60806040523480156200001157600080fd5b5060405162000b8938038062000b898339818101604052810190620000379190620001c5565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b815181101562000104576001828281518110620000c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558080620000fb90620002ac565b9150506200007a565b505062000383565b6000620001236200011d8462000233565b6200020a565b905080838252602082019050828560208602820111156200014357600080fd5b60005b858110156200017757816200015c8882620001ae565b84526020840193506020830192505060018101905062000146565b5050509392505050565b600082601f8301126200019357600080fd5b8151620001a58482602086016200010c565b91505092915050565b600081519050620001bf8162000369565b92915050565b600060208284031215620001d857600080fd5b600082015167ffffffffffffffff811115620001f357600080fd5b620002018482850162000181565b91505092915050565b60006200021662000229565b905062000224828262000276565b919050565b6000604051905090565b600067ffffffffffffffff82111562000251576200025062000329565b5b602082029050602081019050919050565b6000819050919050565b6000819050919050565b620002818262000358565b810181811067ffffffffffffffff82111715620002a357620002a262000329565b5b80604052505050565b6000620002b9826200026c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620002ef57620002ee620002fa565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b620003748162000262565b81146200038057600080fd5b50565b6107f680620003936000396000f3fe608060405234801561001057600080fd5b506004361061009a576000357c0100000000000000000000000000000000000000000000000000000000900480639648eca2116100785780639648eca21461011d578063bb34534c1461014d578063f0f86f711461017d578063f2fde38b146101ad5761009a565b806328f2d4da1461009f5780635deed44e146100cf5780638da5cb5b146100ff575b600080fd5b6100b960048036038101906100b4919061060a565b6101dd565b6040516100c69190610696565b60405180910390f35b6100e960048036038101906100e4919061057e565b610201565b6040516100f69190610696565b60405180910390f35b61010761021e565b6040516101149190610660565b60405180910390f35b6101376004803603810190610132919061057e565b610242565b6040516101449190610696565b60405180910390f35b6101676004803603810190610162919061057e565b61025f565b6040516101749190610660565b60405180910390f35b610197600480360381019061019291906105a7565b61029c565b6040516101a4919061067b565b60405180910390f35b6101c760048036038101906101c29190610555565b610472565b6040516101d4919061067b565b60405180910390f35b600181815481106101ed57600080fd5b906000526020600020016000915090505481565b600060046000838152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060036000838152602001908152602001600020549050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102f757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166002600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461036357600080fd5b6000805b6001805490508110156103d85786600182815481106103af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015414156103c557600191505b80806103d090610703565b915050610367565b50806103e357600080fd5b846002600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360036000888152602001908152602001600020819055508260046000868152602001908152602001600020819055506001915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104cd57600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000813590506105258161077b565b92915050565b60008135905061053a81610792565b92915050565b60008135905061054f816107a9565b92915050565b60006020828403121561056757600080fd5b600061057584828501610516565b91505092915050565b60006020828403121561059057600080fd5b600061059e8482850161052b565b91505092915050565b600080600080608085870312156105bd57600080fd5b60006105cb8782880161052b565b94505060206105dc87828801610516565b93505060406105ed8782880161052b565b92505060606105fe8782880161052b565b91505092959194509250565b60006020828403121561061c57600080fd5b600061062a84828501610540565b91505092915050565b61063c816106b1565b82525050565b61064b816106c3565b82525050565b61065a816106cf565b82525050565b60006020820190506106756000830184610633565b92915050565b60006020820190506106906000830184610642565b92915050565b60006020820190506106ab6000830184610651565b92915050565b60006106bc826106d9565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061070e826106f9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156107415761074061074c565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b610784816106b1565b811461078f57600080fd5b50565b61079b816106cf565b81146107a657600080fd5b50565b6107b2816106f9565b81146107bd57600080fd5b5056fea26469706673582212202898d5ed10ba7e08345b4c1bd9157618892bc47e48034196efd910944d2f3e3d64736f6c63430008030033 \ No newline at end of file +60806040523480156200001157600080fd5b5060405162000d4a38038062000d4a8339818101604052810190620000379190620001c5565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b815181101562000104576001828281518110620000c0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558080620000fb90620002ac565b9150506200007a565b505062000383565b6000620001236200011d8462000233565b6200020a565b905080838252602082019050828560208602820111156200014357600080fd5b60005b858110156200017757816200015c8882620001ae565b84526020840193506020830192505060018101905062000146565b5050509392505050565b600082601f8301126200019357600080fd5b8151620001a58482602086016200010c565b91505092915050565b600081519050620001bf8162000369565b92915050565b600060208284031215620001d857600080fd5b600082015167ffffffffffffffff811115620001f357600080fd5b620002018482850162000181565b91505092915050565b60006200021662000229565b905062000224828262000276565b919050565b6000604051905090565b600067ffffffffffffffff82111562000251576200025062000329565b5b602082029050602081019050919050565b6000819050919050565b6000819050919050565b620002818262000358565b810181811067ffffffffffffffff82111715620002a357620002a262000329565b5b80604052505050565b6000620002b9826200026c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620002ef57620002ee620002fa565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b620003748162000262565b81146200038057600080fd5b50565b6109b780620003936000396000f3fe608060405234801561001057600080fd5b50600436106100a5576000357c0100000000000000000000000000000000000000000000000000000000900480639648eca2116100785780639648eca214610158578063bb34534c14610188578063f0f86f71146101b8578063f2fde38b146101e8576100a5565b806301ffc9a7146100aa57806328f2d4da146100da5780635deed44e1461010a5780638da5cb5b1461013a575b600080fd5b6100c460048036038101906100bf919061075f565b610218565b6040516100d191906107f9565b60405180910390f35b6100f460048036038101906100ef9190610788565b61031d565b6040516101019190610814565b60405180910390f35b610124600480360381019061011f91906106d3565b610341565b6040516101319190610814565b60405180910390f35b61014261035e565b60405161014f91906107de565b60405180910390f35b610172600480360381019061016d91906106d3565b610382565b60405161017f9190610814565b60405180910390f35b6101a2600480360381019061019d91906106d3565b61039f565b6040516101af91906107de565b60405180910390f35b6101d260048036038101906101cd91906106fc565b6103dc565b6040516101df91906107f9565b60405180910390f35b61020260048036038101906101fd91906106aa565b6105b2565b60405161020f91906107f9565b60405180910390f35b600063bb34534c7c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561026d5760019050610318565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156102c05760019050610318565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156103135760019050610318565b600090505b919050565b6001818154811061032d57600080fd5b906000526020600020016000915090505481565b600060046000838152602001908152602001600020549050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060036000838152602001908152602001600020549050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461043757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff166002600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146104a357600080fd5b6000805b6001805490508110156105185786600182815481106104ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154141561050557600191505b8080610510906108ad565b9150506104a7565b508061052357600080fd5b846002600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360036000888152602001908152602001600020819055508260046000868152602001908152602001600020819055506001915050949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461060d57600080fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008135905061066581610925565b92915050565b60008135905061067a8161093c565b92915050565b60008135905061068f81610953565b92915050565b6000813590506106a48161096a565b92915050565b6000602082840312156106bc57600080fd5b60006106ca84828501610656565b91505092915050565b6000602082840312156106e557600080fd5b60006106f38482850161066b565b91505092915050565b6000806000806080858703121561071257600080fd5b60006107208782880161066b565b945050602061073187828801610656565b93505060406107428782880161066b565b92505060606107538782880161066b565b91505092959194509250565b60006020828403121561077157600080fd5b600061077f84828501610680565b91505092915050565b60006020828403121561079a57600080fd5b60006107a884828501610695565b91505092915050565b6107ba8161082f565b82525050565b6107c981610841565b82525050565b6107d88161084d565b82525050565b60006020820190506107f360008301846107b1565b92915050565b600060208201905061080e60008301846107c0565b92915050565b600060208201905061082960008301846107cf565b92915050565b600061083a82610883565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006108b8826108a3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156108eb576108ea6108f6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b61092e8161082f565b811461093957600080fd5b50565b6109458161084d565b811461095057600080fd5b50565b61095c81610857565b811461096757600080fd5b50565b610973816108a3565b811461097e57600080fd5b5056fea26469706673582212209aec8f03f7dd2f0da35bbb26ca6174db7a60d79848dc0b74c76949c70d59711d64736f6c63430008030033 \ No newline at end of file diff --git a/python/eth_contract_registry/data/Registry.json b/python/eth_contract_registry/data/Registry.json index f2b9db0..50492c5 100644 --- a/python/eth_contract_registry/data/Registry.json +++ b/python/eth_contract_registry/data/Registry.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"bytes32[]","name":"_identifiers","type":"bytes32[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"_identifier","type":"bytes32"}],"name":"addressOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_identifier","type":"bytes32"}],"name":"chainOf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_chain","type":"bytes32"}],"name":"configSumOf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"identifiers","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_identifier","type":"bytes32"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes32","name":"_chainDescriptor","type":"bytes32"},{"internalType":"bytes32","name":"_chainConfig","type":"bytes32"}],"name":"set","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"bytes32[]","name":"_identifiers","type":"bytes32[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"_identifier","type":"bytes32"}],"name":"addressOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_identifier","type":"bytes32"}],"name":"chainOf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_chain","type":"bytes32"}],"name":"configSumOf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"identifiers","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_identifier","type":"bytes32"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes32","name":"_chainDescriptor","type":"bytes32"},{"internalType":"bytes32","name":"_chainConfig","type":"bytes32"}],"name":"set","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/eth_contract_registry/interface.py b/python/eth_contract_registry/interface.py new file mode 100644 index 0000000..27fef9b --- /dev/null +++ b/python/eth_contract_registry/interface.py @@ -0,0 +1,43 @@ +# external imports +from chainlib.jsonrpc import ( + jsonrpc_template, + ) +from chainlib.eth.contract import ( + ABIContractEncoder, + ABIContractType, + abi_decode_single, + ) +from chainlib.eth.tx import TxFactory +from hexathon import ( + add_0x, + ) +from chainlib.eth.constant import ( + ZERO_ADDRESS, + ) + +# local imports +from .encoding import ( + to_identifier, + ) + + +class Registry(TxFactory): + + def address_of(self, contract_address, identifier_string, sender_address=ZERO_ADDRESS): + o = jsonrpc_template() + o['method'] = 'eth_call' + enc = ABIContractEncoder() + enc.method('addressOf') + enc.typ(ABIContractType.BYTES32) + identifier = to_identifier(identifier_string) + enc.bytes32(identifier) + data = add_0x(enc.encode()) + tx = self.template(sender_address, contract_address) + tx = self.set_code(tx, data) + o['params'].append(self.normalize(tx)) + return o + + + @classmethod + def parse_address_of(self, v): + return abi_decode_single(ABIContractType.ADDRESS, v) diff --git a/python/eth_contract_registry/pytest/fixtures_registry.py b/python/eth_contract_registry/pytest/fixtures_registry.py index 2458646..c1a93e9 100644 --- a/python/eth_contract_registry/pytest/fixtures_registry.py +++ b/python/eth_contract_registry/pytest/fixtures_registry.py @@ -11,7 +11,7 @@ from chainlib.eth.tx import receipt from chainlib.eth.nonce import RPCNonceOracle # local imports -from eth_contract_registry.registry import Registry +from eth_contract_registry.registry import ContractRegistry from eth_contract_registry.encoding import to_identifier #logg = logging.getLogger(__name__) @@ -45,7 +45,7 @@ def registry( nonce_oracle = RPCNonceOracle(roles['CONTRACT_DEPLOYER'], eth_rpc) - builder = Registry(default_chain_spec, signer=eth_signer, nonce_oracle=nonce_oracle) + builder = ContractRegistry(default_chain_spec, signer=eth_signer, nonce_oracle=nonce_oracle) logg.info('registering identifiers {} in contract registry'.format(valid_identifiers)) (tx_hash_hex, o) = builder.constructor(roles['CONTRACT_DEPLOYER'], valid_identifiers) r = eth_rpc.do(o) @@ -56,7 +56,7 @@ def registry( registry_address = rcpt['contract_address'] - c = Registry(default_chain_spec, signer=eth_signer, nonce_oracle=nonce_oracle) + c = ContractRegistry(default_chain_spec, signer=eth_signer, nonce_oracle=nonce_oracle) chain_spec_identifier = to_identifier(str(default_chain_spec)) diff --git a/python/eth_contract_registry/registry.py b/python/eth_contract_registry/registry.py index 0816897..3ae8bdb 100644 --- a/python/eth_contract_registry/registry.py +++ b/python/eth_contract_registry/registry.py @@ -13,8 +13,6 @@ from chainlib.eth.contract import ( from chainlib.chain import ChainSpec from chainlib.eth.constant import ( ZERO_ADDRESS, - ZERO_CONTENT, - MAX_UINT, ) from chainlib.jsonrpc import ( jsonrpc_template, @@ -30,6 +28,7 @@ from .encoding import ( to_identifier, from_identifier_hex, ) +from .interface import Registry logg = logging.getLogger(__name__) @@ -37,7 +36,7 @@ moddir = os.path.dirname(__file__) datadir = os.path.join(moddir, 'data') -class Registry(TxFactory): +class ContractRegistry(Registry): default_chain_spec = None __chains_registry = {} @@ -45,30 +44,29 @@ class Registry(TxFactory): __abi = None __bytecode = None - - @staticmethod def abi(): - if Registry.__abi == None: + if ContractRegistry.__abi == None: f = open(os.path.join(datadir, 'Registry.json'), 'r') - Registry.__abi = json.load(f) + ContractRegistry.__abi = json.load(f) f.close() - return Registry.__abi + return ContractRegistry.__abi @staticmethod def bytecode(): - if Registry.__bytecode == None: + if ContractRegistry.__bytecode == None: f = open(os.path.join(datadir, 'Registry.bin')) - Registry.__bytecode = f.read() + ContractRegistry.__bytecode = f.read() f.close() - return Registry.__bytecode + return ContractRegistry.__bytecode @staticmethod def gas(code=None): return 1500000 + def constructor(self, sender_address, identifier_strings=[]): # TODO: handle arrays in chainlib encode instead enc = ABIContractEncoder() @@ -79,15 +77,15 @@ class Registry(TxFactory): data = enc.get_contents() tx = self.template(sender_address, None, use_nonce=True) - tx = self.set_code(tx, Registry.bytecode() + data) - logg.debug('bytecode {}\ndata {}\ntx {}'.format(Registry.bytecode(), data, tx)) + tx = self.set_code(tx, ContractRegistry.bytecode() + data) + logg.debug('bytecode {}\ndata {}\ntx {}'.format(ContractRegistry.bytecode(), data, tx)) return self.build(tx) @staticmethod def address(address=None): if address != None: - Registry.__address = address + ContractRegistry.__address = address return Registry.__address @@ -97,26 +95,6 @@ class Registry(TxFactory): raise NotImplementedError() - def address_of(self, contract_address, identifier_string, sender_address=ZERO_ADDRESS): - o = jsonrpc_template() - o['method'] = 'eth_call' - enc = ABIContractEncoder() - enc.method('addressOf') - enc.typ(ABIContractType.BYTES32) - identifier = to_identifier(identifier_string) - enc.bytes32(identifier) - data = add_0x(enc.encode()) - tx = self.template(sender_address, contract_address) - tx = self.set_code(tx, data) - o['params'].append(self.normalize(tx)) - return o - - - @classmethod - def parse_address_of(self, v): - return abi_decode_single(ABIContractType.ADDRESS, v) - - def set(self, contract_address, sender_address, identifier_string, address, chain_spec, chain_config_hash): enc = ABIContractEncoder() enc.method('set') diff --git a/python/gmon.out b/python/gmon.out index e8895059cac784e3756955baf1ad1df19e73f29e..cd00018f515e7b523ed5bee095b0c430ea0e4e1b 100644 GIT binary patch delta 63862 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 Cw@TUo delta 62919 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 diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py index fa198af..a826e34 100644 --- a/python/tests/test_basic.py +++ b/python/tests/test_basic.py @@ -22,7 +22,8 @@ from hexathon import ( ) # local imports -from eth_contract_registry.registry import Registry +from eth_contract_registry import Registry +from eth_contract_registry.registry import ContractRegistry from eth_contract_registry.encoding import from_identifier_hex from eth_contract_registry.pytest.fixtures_registry import valid_identifiers @@ -46,7 +47,7 @@ def test_set( bogus_hash = add_0x(os.urandom(32).hex()) nonce_oracle = RPCNonceOracle(roles['CONTRACT_DEPLOYER'], eth_rpc) - builder = Registry(default_chain_spec, signer=eth_signer, nonce_oracle=nonce_oracle) + builder = ContractRegistry(default_chain_spec, signer=eth_signer, nonce_oracle=nonce_oracle) o = builder.address_of(registry, 'ContractRegistry', sender_address=eth_accounts[0]) r = eth_rpc.do(o) @@ -65,6 +66,7 @@ def test_set( rcpt = eth_rpc.do(o) assert rcpt['status'] == 1 + builder = Registry(default_chain_spec) o = builder.address_of(registry, 'FooContract', sender_address=eth_accounts[0]) r = eth_rpc.do(o) r = abi_decode_single(ABIContractType.ADDRESS, r) diff --git a/solidity/Registry.sol b/solidity/Registry.sol index 5393150..826c462 100644 --- a/solidity/Registry.sol +++ b/solidity/Registry.sol @@ -58,4 +58,18 @@ contract CICRegistry { function configSumOf(bytes32 _chain) public view returns (bytes32) { return chainConfigs[_chain]; } + + // Implements EIP 165 + function supportsInterface(bytes4 _sum) public pure returns (bool) { + if (_sum == 0xbb34534c) { // Registry + return true; + } + if (_sum == 0x01ffc9a7) { // EIP165 + return true; + } + if (_sum == 0x9493f8b2) { // EIP173 + return true; + } + return false; + } }