Ejemplo n.º 1
0
    def delete(self):
        try:
            # Check if Organization exists
            (found, _, _, _, _, _) = self._getorganizationbyname()
            if not found:
                self._printerr("\n{} doesn't exist!\n".format(self.args.name))
                return

            registry_contract_def = get_contract_def("Registry")
            registry_address = self._getstring("registry_at")
            cmd = ContractCommand(config=self.config,
                                  args=self.get_contract_argser(
                                      contract_address=registry_address,
                                      contract_function="deleteOrganization",
                                      contract_def=registry_contract_def)(
                                          type_converter("bytes32")(
                                              self.args.name)),
                                  out_f=self.err_f,
                                  err_f=self.err_f,
                                  w3=self.w3,
                                  ident=self.ident)
            self._printerr(
                "Creating transaction to delete organization {}...\n".format(
                    self.args.name))
            try:
                cmd.transact()
            except Exception as e:
                self._printerr(
                    "\nTransaction error!\nHINT: Check if {} exists and you are its owner.\n"
                    .format(self.args.name))
                self._error(e)

        except Exception as e:
            self._printerr("\nTransaction error!\nHINT: Check ORG_NAME.\n")
            self._error(e)
Ejemplo n.º 2
0
def get_contract_address(cmd, contract_name, error_message=None):

    # try to get from command line argument at or contractname_at
    a = "at"
    if (hasattr(cmd.args, a) and getattr(cmd.args, a)):
        return cmd.w3.toChecksumAddress(getattr(cmd.args, a))

    # try to get from command line argument contractname_at
    a = "%s_at" % contract_name.lower()
    if (hasattr(cmd.args, a) and getattr(cmd.args, a)):
        return cmd.w3.toChecksumAddress(getattr(cmd.args, a))

    # try to get from current session configuration
    rez = cmd.config.get_session_field("current_%s_at" %
                                       (contract_name.lower()),
                                       exception_if_not_found=False)
    if rez:
        return cmd.w3.toChecksumAddress(rez)

    error_message = error_message or "Fail to read %s address from \"networks\", you should specify address by yourself via --%s_at parameter" % (
        contract_name, contract_name.lower())
    chain_id = cmd.w3.version.network  # this will raise exception if endpoint is invalid
    # try to take address from networks
    try:
        contract_def = get_contract_def(contract_name)
        networks = contract_def["networks"]
        contract_address = networks.get(chain_id, {}).get("address", None)
        if (not contract_address):
            raise Exception()
        contract_address = cmd.w3.toChecksumAddress(contract_address)
    except:
        raise Exception(error_message)

    return contract_address
Ejemplo n.º 3
0
def add_contract_function_options(parser, contract_name):
    add_contract_identity_arguments(parser)

    contract_def = get_contract_def(contract_name)
    parser.set_defaults(contract_def=contract_def)

    fns = []
    for fn in filter(lambda e: e["type"] == "function", contract_def["abi"]):
        fns.append({
            "name": fn["name"],
            "named_inputs": [(i["name"], i["type"]) for i in fn["inputs"] if i["name"] != ""],
            "positional_inputs": [i["type"] for i in fn["inputs"] if i["name"] == ""]
        })

    if len(fns) > 0:
        subparsers = parser.add_subparsers(title="{} functions".format(contract_name), metavar="FUNCTION")
        subparsers.required = True

        for fn in fns:
            fn_p = subparsers.add_parser(fn["name"], help="{} function".format(fn["name"]))
            fn_p.set_defaults(fn="call")
            fn_p.set_defaults(contract_function=fn["name"])
            for i in fn["positional_inputs"]:
                fn_p.add_argument(i, action=AppendPositionalAction, type=type_converter(i), metavar=i.upper())
            for i in fn["named_inputs"]:
                fn_p.add_argument("contract_named_input_{}".format(i[0]), type=type_converter(i[1]),
                                  metavar="{}_{}".format(i[0].lstrip("_"), i[1].upper()))
            fn_p.add_argument("--transact", action="store_const", const="transact", dest="fn",
                              help="invoke contract function as transaction")
            add_transaction_arguments(fn_p)
Ejemplo n.º 4
0
 def _get_channel_state_from_blockchain(self, channel_id):
     abi = get_contract_def("MultiPartyEscrow")
     channel_abi = abi_get_element_by_name(abi, "channels")
     channel = self.call_contract_command("MultiPartyEscrow", "channels",
                                          [channel_id])
     channel = abi_decode_struct_to_dict(channel_abi, channel)
     return channel
Ejemplo n.º 5
0
 def _get_channel_state_from_blockchain(self, channel_id):
     abi         = get_contract_def("MultiPartyEscrow")
     channel_abi = abi_get_element_by_name(abi, "channels")
     channel     = self.call_contract_command("MultiPartyEscrow",  "channels", [channel_id])
     channel     = abi_decode_struct_to_dict(channel_abi, channel)
     channel["channelId"] = channel_id
     return channel
Ejemplo n.º 6
0
 def _get_all_filtered_channels(self, topics_without_signature):
     """ get all filtered chanels from blockchain logs """
     mpe_address     = self.get_mpe_address()
     event_signature = self.ident.w3.sha3(text="ChannelOpen(uint256,uint256,address,address,address,bytes32,uint256,uint256)").hex()
     topics = [event_signature] + topics_without_signature
     logs = self.ident.w3.eth.getLogs({"fromBlock" : self.args.from_block, "address"   : mpe_address, "topics"    : topics})
     abi           = get_contract_def("MultiPartyEscrow")
     event_abi     = abi_get_element_by_name(abi, "ChannelOpen")
     channels_ids  = [get_event_data(event_abi, l)["args"]["channelId"] for l in logs]
     return channels_ids
Ejemplo n.º 7
0
def read_default_contract_address(w3, contract_name):
    try :
        chain_id         = w3.version.network  # this will raise exception if endpoint is invalid
        contract_def     = get_contract_def(contract_name)
        networks         = contract_def["networks"]
        contract_address = networks.get(chain_id, {}).get("address", None)
        if (not contract_address):
            raise Exception()
        contract_address = w3.toChecksumAddress(contract_address)
    except:
        raise Exception()

    return contract_address
Ejemplo n.º 8
0
def read_default_contract_address(w3, contract_name):
    try:
        chain_id = w3.version.network  # this will raise exception if endpoint is invalid
        contract_def = get_contract_def(contract_name)
        networks = contract_def["networks"]
        contract_address = networks.get(chain_id, {}).get("address", None)
        if (not contract_address):
            raise Exception()
        contract_address = w3.toChecksumAddress(contract_address)
    except:
        raise Exception()

    return contract_address
Ejemplo n.º 9
0
    def create(self):
        try:
            # Check if Organization already exists
            (found, _, _, _, _, _) = self._getorganizationbyname()
            if found:
                self._printerr("\n{} already exists!\n".format(self.args.name))
                return

            members = []
            if self.args.members:
                members_split = self.args.members.split(',')
                for idx, m in enumerate(members_split):
                    members.append(
                        str(m).replace("[", "").replace("]", "").lower())

            registry_contract_def = get_contract_def("Registry")
            registry_address = self._getstring("registry_at")
            cmd = ContractCommand(
                config=self.config,
                args=self.get_contract_argser(
                    contract_address=registry_address,
                    contract_function="createOrganization",
                    contract_def=registry_contract_def)(
                        type_converter("bytes32")(self.args.name), [
                            type_converter("address")(member)
                            for member in members
                        ]),
                out_f=self.err_f,
                err_f=self.err_f,
                w3=self.w3,
                ident=self.ident)
            self._printerr(
                "Creating transaction to create organization {}...\n".format(
                    self.args.name))
            try:
                cmd.transact()
            except Exception as e:
                self._printerr(
                    "\nTransaction error!\nHINT: Check if {} already exists.\n"
                    .format(self.args.name))
                self._error(e)

        except Exception as e:
            self._printerr(
                "\nTransaction error!\nHINT: Check if address is a 40-length hexadecimal.\n"
            )
            self._error(e)
Ejemplo n.º 10
0
def get_organization_list(iblockchain):
    response = None
    try:
        registry_contract_def = get_contract_def("Registry")
        registry_address = iblockchain._getstring("registry_at")
        response = ContractCommand(config=iblockchain.config,
                                   args=iblockchain.get_contract_argser(
                                       contract_address=registry_address,
                                       contract_function="listOrganizations",
                                       contract_def=registry_contract_def)(),
                                   out_f=None,
                                   err_f=None,
                                   w3=iblockchain.w3,
                                   ident=iblockchain.ident).call()
    except Exception as e:
        print(e)
    return response
Ejemplo n.º 11
0
    def change_owner(self):
        try:
            # Check if Organization exists
            (found, _, owner, _, _, _) = self._getorganizationbyname()
            if not found:
                self._printerr("\n{} doesn't exist!\n".format(self.args.name))
                return

            new_owner = self.args.owner.lower()
            new_owner = new_owner if new_owner.startswith(
                "0x") else "0x" + new_owner
            if new_owner == owner:
                self._printerr("\n{} is the owner of!\n".format(
                    self.args.owner, self.args.name))
                return

            registry_contract_def = get_contract_def("Registry")
            registry_address = self._getstring("registry_at")
            cmd = ContractCommand(
                config=self.config,
                args=self.get_contract_argser(
                    contract_address=registry_address,
                    contract_function="changeOrganizationOwner",
                    contract_def=registry_contract_def)(
                        type_converter("bytes32")(self.args.name),
                        type_converter("address")(self.args.owner)),
                out_f=self.err_f,
                err_f=self.err_f,
                w3=self.w3,
                ident=self.ident)
            self._printerr(
                "Creating transaction to change organization {}'s owner...\n".
                format(self.args.name))
            try:
                cmd.transact()
            except Exception as e:
                self._printerr(
                    "\nTransaction error!\nHINT: Check if {} already exists.\n"
                    .format(self.args.name))
                self._error(e)

        except Exception as e:
            self._printerr(
                "\nTransaction error!\nHINT: Check if address is a 40-length hexadecimal.\n"
            )
            self._error(e)
Ejemplo n.º 12
0
def get_service_price(iblockchain):
    current_price = None
    try:
        agent_contract_def = get_contract_def("Agent")
        agent_address = iblockchain.args.agent_address
        current_price = ContractCommand(
            config=iblockchain.config,
            args=iblockchain.get_contract_argser(
                contract_address=agent_address,
                contract_function="currentPrice",
                contract_def=agent_contract_def)(),
            out_f=None,
            err_f=None,
            w3=iblockchain.w3,
            ident=iblockchain.ident).call()
    except Exception as e:
        print(e)
    return current_price
Ejemplo n.º 13
0
 def get_ContractCommand(self, contract_name, contract_address, contract_fn, contract_params, is_silent = True):
     contract_def = get_contract_def(contract_name)
     if (is_silent):
         out_f = None
         err_f = None
     else:
         out_f = self.out_f
         err_f = self.err_f
     return ContractCommand(config= self.config,
                            args  = self.get_contract_argser(
                                          contract_address  = contract_address,
                                          contract_function = contract_fn,
                                          contract_def      = contract_def,
                                          contract_name     = contract_name)(*contract_params),
                            out_f = out_f,
                            err_f = err_f,
                            w3    = self.w3,
                            ident = self.ident)
Ejemplo n.º 14
0
def get_metadata_uri(iblockchain):
    response = None
    try:
        agent_contract_def = get_contract_def("Agent")
        agent_address = iblockchain.args.agent_address
        response = ContractCommand(config=iblockchain.config,
                                   args=iblockchain.get_contract_argser(
                                       contract_address=agent_address,
                                       contract_function="metadataURI",
                                       contract_def=agent_contract_def)(),
                                   out_f=None,
                                   err_f=None,
                                   w3=iblockchain.w3,
                                   ident=iblockchain.ident).call()
        return response
    except Exception as e:
        print(e)
    return response
Ejemplo n.º 15
0
 def _get_all_filtered_channels(self, topics_without_signature):
     """ get all filtered chanels from blockchain logs """
     mpe_address = self.get_mpe_address()
     event_signature = self.ident.w3.sha3(
         text=
         "ChannelOpen(uint256,uint256,address,address,address,bytes32,uint256,uint256)"
     ).hex()
     topics = [event_signature] + topics_without_signature
     logs = self.ident.w3.eth.getLogs({
         "fromBlock": self.args.from_block,
         "address": mpe_address,
         "topics": topics
     })
     abi = get_contract_def("MultiPartyEscrow")
     event_abi = abi_get_element_by_name(abi, "ChannelOpen")
     channels_ids = [
         get_event_data(event_abi, l)["args"]["channelId"] for l in logs
     ]
     return channels_ids
Ejemplo n.º 16
0
    def list_services(self):
        try:
            registry_contract_def = get_contract_def("Registry")
            registry_address = self._getstring("registry_at")
            try:
                (found, org_service_list) = ContractCommand(
                    config=self.config,
                    args=self.get_contract_argser(
                        contract_address=registry_address,
                        contract_function="listServicesForOrganization",
                        contract_def=registry_contract_def)(
                            type_converter("bytes32")(self.args.name)),
                    out_f=None,
                    err_f=None,
                    w3=self.w3,
                    ident=self.ident).call()

                if found:
                    if org_service_list:
                        self._printerr("\nList of {}'s Services:".format(
                            self.args.name))
                        for idx, org_service in enumerate(org_service_list):
                            self._printerr("- {}".format(
                                org_service.partition(b"\0")[0].decode(
                                    "utf-8")))
                    else:
                        self._printerr(
                            "\n{} exists but has no registered services.".
                            format(self.args.name))
                else:
                    self._printerr("\n{} not registered on network.".format(
                        self.args.name))

            except Exception as e:
                self._printerr(
                    "\nCall error!\nHINT: Check your identity and session.\n")
                self._error(e)

        except Exception as e:
            self._printerr("\nTransaction error!\nHINT: Check ORG_NAME.\n")
            self._error(e)
Ejemplo n.º 17
0
def get_service_registration(iblockchain):
    response = None
    try:
        registry_contract_def = get_contract_def("Registry")
        registry_address = iblockchain._getstring("registry_at")
        org_name = iblockchain.args.organization_name
        serv_name = iblockchain.args.service_name
        return ContractCommand(
            config=iblockchain.config,
            args=iblockchain.get_contract_argser(
                contract_address=registry_address,
                contract_function="getServiceRegistrationByName",
                contract_def=registry_contract_def)(org_name,
                                                    serv_name),
            out_f=None,
            err_f=None,
            w3=iblockchain.w3,
            ident=iblockchain.ident).call()
    except Exception as e:
        print(e)
    return response
Ejemplo n.º 18
0
    def _getorganizationbyname(self):
        registry_contract_def = get_contract_def("Registry")
        registry_address = self._getstring("registry_at")
        try:
            return ContractCommand(
                config=self.config,
                args=self.get_contract_argser(
                    contract_address=registry_address,
                    contract_function="getOrganizationByName",
                    contract_def=registry_contract_def)(
                        type_converter("bytes32")(self.args.name)),
                out_f=None,
                err_f=None,
                w3=self.w3,
                ident=self.ident).call()

        except Exception as e:
            self._printerr(
                "\nCall _getorganizationbyname() error!\nHINT: Check your identity and session.\n"
            )
            self._error(e)
Ejemplo n.º 19
0
 def print_my_channels(self):
     # TODO: check that it is faster to use events to get all channels with the given sender (instead of using channels directly)
     event_signature   = self.ident.w3.sha3(text="EventChannelOpen(uint256,address,address,uint256)").hex()
     my_address_padded = pad_hex(self.ident.address.lower(), 256)
     logs = self.ident.w3.eth.getLogs({"fromBlock" : self.args.from_block,
                                       "address"   : self.args.mpe_address.lower(),
                                       "topics"    : [event_signature,  my_address_padded]})
     
     # If we are sure that ABI will be fixed forever we can do like this:
     # channels_ids = [int(l['data'],16) for l in logs]
     abi           = get_contract_def("MultiPartyEscrow")
     event_abi     = abi_get_element_by_name(abi, "EventChannelOpen")
     channels_ids  = [get_event_data(event_abi, l)["args"]["channelId"] for l in logs]
     
     channel_abi = abi_get_element_by_name(abi, "channels")
     
     self._printout("#id nonce recipient  groupId  value   expiration(blocks)")
     for i in channels_ids:
         channel = self.call_contract_command("MultiPartyEscrow", self.args.mpe_address, "channels", [i])
         channel = abi_decode_struct_to_dict(channel_abi, channel)
         self._printout("%i %i %s %i %i %i"%(i, channel["nonce"], channel["recipient"], channel["groupId"],
                                             channel["value"], channel["expiration"]))
Ejemplo n.º 20
0
def add_contract_function_options(parser, contract_name):
    add_contract_identity_arguments(parser)

    contract_def = get_contract_def(contract_name)
    parser.set_defaults(contract_def=contract_def)
    parser.set_defaults(contract_name=contract_name)

    fns = []
    for fn in filter(lambda e: e["type"] == "function", contract_def["abi"]):
        fns.append({
            "name": fn["name"],
            "named_inputs": [(i["name"], i["type"]) for i in fn["inputs"] if i["name"] != ""],
            "positional_inputs": [i["type"] for i in fn["inputs"] if i["name"] == ""]
        })

    if len(fns) > 0:
        subparsers = parser.add_subparsers(title="{} functions".format(contract_name), metavar="FUNCTION")
        subparsers.required = True

        for fn in fns:
            fn_p = subparsers.add_parser(fn["name"], help="{} function".format(fn["name"]))
            fn_p.set_defaults(fn="call")
            fn_p.set_defaults(contract_function=fn["name"])
            for i in fn["positional_inputs"]:
                fn_p.add_argument(i,
                                  action=AppendPositionalAction,
                                  type=type_converter(i),
                                  metavar=i.upper())
            for i in fn["named_inputs"]:
                fn_p.add_argument("contract_named_input_{}".format(i[0]),
                                  type=type_converter(i[1]),
                                  metavar="{}_{}".format(i[0].lstrip("_"), i[1].upper()))
            fn_p.add_argument("--transact",
                              action="store_const",
                              const="transact",
                              dest="fn",
                              help="Invoke contract function as transaction")
            add_transaction_arguments(fn_p)
Ejemplo n.º 21
0
    def print_all_channels_my(self):
        # TODO: check that it is faster to use events to get all channels with the given sender (instead of using channels directly)
        mpe_address = self.get_mpe_address()
        event_signature = self.ident.w3.sha3(
            text=
            "ChannelOpen(uint256,address,address,bytes32,address,uint256,uint256)"
        ).hex()
        my_address_padded = pad_hex(self.ident.address.lower(), 256)
        logs = self.ident.w3.eth.getLogs({
            "fromBlock":
            self.args.from_block,
            "address":
            mpe_address,
            "topics": [event_signature, my_address_padded]
        })
        # If we are sure that ABI will be fixed forever we can do like this:
        # channels_ids = [int(l['data'],16) for l in logs]
        abi = get_contract_def("MultiPartyEscrow")
        event_abi = abi_get_element_by_name(abi, "ChannelOpen")
        channels_ids = [
            get_event_data(event_abi, l)["args"]["channelId"] for l in logs
        ]

        self._print_channels_from_blockchain(channels_ids)
Ejemplo n.º 22
0
    def list(self):
        try:
            registry_contract_def = get_contract_def("Registry")
            registry_address = self._getstring("registry_at")
            org_list = ContractCommand(
                config=self.config,
                args=self.get_contract_argser(
                    contract_address=registry_address,
                    contract_function="listOrganizations",
                    contract_def=registry_contract_def)(),
                out_f=None,
                err_f=None,
                w3=self.w3,
                ident=self.ident).call()

            self._printerr("\nList of Organizations:")
            for idx, organization in enumerate(org_list):
                self._printerr("- {}".format(
                    organization.partition(b"\0")[0].decode("utf-8")))

        except Exception as e:
            self._printerr(
                "\nCall error!\nHINT: Check your identity and session.\n")
            self._error(e)
Ejemplo n.º 23
0
    def rem_members(self):
        try:
            # Check if Organization exists and member is part of it
            (found, _, _, members, _, _) = self._getorganizationbyname()
            if not found:
                self._printerr("\n{} doesn't exist!\n".format(self.args.name))
                return

            rem_members = []
            members_split = self.args.members.split(',')
            for idx, m in enumerate(members_split):
                member_tmp = str(m).replace("[", "").replace("]", "").lower()
                member_tmp = member_tmp if member_tmp.startswith(
                    "0x") else "0x" + member_tmp
                rem_members.append(member_tmp)

            members = [member.lower() for member in members]

            for idx, rem_member in enumerate(rem_members[:]):
                if rem_member not in members:
                    self._printerr(
                        "{} is not a member of organization {}".format(
                            rem_member, self.args.name))
                    rem_members.remove(rem_member)

            if rem_members:
                registry_contract_def = get_contract_def("Registry")
                registry_address = self._getstring("registry_at")
                cmd = ContractCommand(
                    config=self.config,
                    args=self.get_contract_argser(
                        contract_address=registry_address,
                        contract_function="removeOrganizationMembers",
                        contract_def=registry_contract_def)(
                            type_converter("bytes32")(self.args.name), [
                                type_converter("address")(member)
                                for member in rem_members
                            ]),
                    out_f=self.err_f,
                    err_f=self.err_f,
                    w3=self.w3,
                    ident=self.ident)
                self._printerr(
                    "Creating transaction to remove {} members from organization {}...\n"
                    .format(len(rem_members), self.args.name))
                try:
                    cmd.transact()
                except Exception as e:
                    self._printerr(
                        "\nTransaction error!\nHINT: Check if {} already exists and you are its owner.\n"
                        .format(self.args.name))
                    self._error(e)
            else:
                self._printerr("No member was removed from {}!\n".format(
                    self.args.name))

        except Exception as e:
            self._printerr(
                "\nTransaction error!\nHINT: Check if address is a 40-length hexadecimal.\n"
            )
            self._error(e)