Esempio n. 1
0
    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)
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
    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
Esempio n. 5
0
    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"]
            }
        }