def prepare_dependency(self, config): deps_count = len(self.intent_dependencies) if deps_count == 0: # No intent_dependencies, no dependency return "0x" elif deps_count == 1: # Single dependency, call waller directly relayed_at_abi = { 'name': 'relayedAt', 'inputs': [{ 'type': 'bytes32', 'name': '_id' }] } to = to_bytes(self.intent_dependencies[0]['address']) data_signature = function_abi_to_4byte_selector(relayed_at_abi) data_params = to_bytes( Web3Contract._encode_abi( relayed_at_abi, [to_bytes(self.intent_dependencies[0]['id'])])) return from_bytes(to + data_signature + data_params) else: # Multiple dependencies, using DepsUtils contract multiple_deps_abi = { 'name': 'multipleDeps', 'inputs': [{ 'type': 'address[]', 'name': '_wallets' }, { 'type': 'bytes32[]', 'name': '_ids' }] } to = to_bytes(config.dependency_utils) data_signature = function_abi_to_4byte_selector(multiple_deps_abi) data_params = to_bytes( Web3Contract._encode_abi(multiple_deps_abi, [ list(map(lambda x: x["address"], self.intent_dependencies)), list( map(lambda x: to_bytes(x["id"]), self.intent_dependencies)) ])) return from_bytes(to + data_signature + data_params)
def get_constructor_arguments(contract: Contract, args: Optional[list]=None, kwargs: Optional[dict]=None): """Get constructor arguments for Etherscan verify. https://etherscanio.freshdesk.com/support/solutions/articles/16000053599-contract-verification-constructor-arguments """ constructor_abi = get_constructor_abi(contract.abi) if args is not None: return contract._encode_abi(constructor_abi, args)[2:] # No 0x else: constructor_abi = get_constructor_abi(contract.abi) arguments = merge_args_and_kwargs(constructor_abi, [], kwargs) deploy_data = add_0x_prefix( contract._encode_abi(constructor_abi, arguments) ) return deploy_data
def get_constructor_arguments(contract: Contract, args: Optional[list] = None, kwargs: Optional[dict] = None): """Get constructor arguments for Etherscan verify. https://etherscanio.freshdesk.com/support/solutions/articles/16000053599-contract-verification-constructor-arguments """ # return contract._encode_constructor_data(args=args, kwargs=kwargs) constructor_abi = get_constructor_abi(contract.abi) # constructor_abi can be none in case of libraries if constructor_abi is None: return to_hex(contract.bytecode) if args is not None: return contract._encode_abi(constructor_abi, args)[2:] # No 0x else: constructor_abi = get_constructor_abi(contract.abi) kwargs = kwargs or {} arguments = merge_args_and_kwargs(constructor_abi, [], kwargs) # deploy_data = add_0x_prefix( # contract._encode_abi(constructor_abi, arguments) #) # TODO: Looks like recent Web3.py ABI change deploy_data = encode_abi(contract.web3, constructor_abi, arguments) return deploy_data
def __call__(self, instance, *args, **kwargs): for attr, value in instance.__dict__.items(): setattr(self, attr, value) data = encode_hex(function_abi_to_4byte_selector(self.abi)) self.abi['outputs'] = [{'name': '', 'type': self.function(instance, args)}] self.encoded = Contract._encode_abi(self.abi, args, data).decode() self.arguments = dict(zip([arg['name'] for arg in self.abi['inputs']], args)) self.value = 0 return self
def __call__(self, instance, *args, **kwargs): selector = encode_hex(function_abi_to_4byte_selector(self.abi)) if len(args) != 0 and isinstance(args[0], dict): params = self.__order_dict_args(args[0]) else: params = args return { "to": instance.address, "value": 0, "data": Contract._encode_abi(self.abi, params, selector).decode(), "parent": { "inputs": self.abi["inputs"], "outputs": self.abi["outputs"] } }