def _get_params_for_tags_update(self): tags = self._get_converted_tags() params = [ type_converter("bytes32")(self.args.org_id), type_converter("bytes32")(self.args.service_id), tags ] return params
def publish_metadata_in_ipfs_and_update_registration(self): # first we check that we do not change payment_address or group_id in existed payment groups old_metadata = self._get_service_metadata_from_registry() new_metadata = load_mpe_service_metadata(self.args.metadata_file) for old_group in old_metadata["groups"]: if (new_metadata.is_group_name_exists(old_group["group_name"])): new_group = new_metadata.get_group(old_group["group_name"]) if (new_group["group_id"] != old_group["group_id"] or new_group["payment_address"] != old_group["payment_address"]): raise Exception( "\n\nYou are trying to change group_id or payment_address in group '%s'.\n" % old_group["group_name"] + "It would make all open channels invalid.\n" + "You shoudn't use 'metadata-init' for existed service, because it reinitialize group_id\n" + "Please use 'metadata-set-model' for change your protobuf file\n" + "Please use 'metadata-remove-all-endpoints/metadata-add-endpoints to update endpoints'\n\n" ) metadata_uri = hash_to_bytesuri( self._publish_metadata_in_ipfs(self.args.metadata_file)) params = [ type_converter("bytes32")(self.args.org_id), type_converter("bytes32")(self.args.service_id), metadata_uri ] self.transact_contract_command("Registry", "updateServiceRegistration", params)
def delete_service_registration(self): params = [ type_converter("bytes32")(self.args.org_id), type_converter("bytes32")(self.args.service_id) ] self.transact_contract_command("Registry", "deleteServiceRegistration", params)
def _get_service_registration(self): params = [type_converter("bytes32")(self.args.org_id), type_converter( "bytes32")(self.args.service_id)] rez = self.call_contract_command( "Registry", "getServiceRegistrationById", params) if (rez[0] == False): raise Exception("Cannot find Service with id=%s in Organization with id=%s" % ( self.args.service_id, self.args.org_id)) return {"metadataURI": rez[2], "tags": rez[3]}
def publish_service_with_metadata(self): metadata_uri = hash_to_bytesuri( self._publish_metadata_in_ipfs(self.args.metadata_file)) tags = self._get_converted_tags() params = [ type_converter("bytes32")(self.args.org_id), type_converter("bytes32")(self.args.service_id), metadata_uri, tags ] self.transact_contract_command("Registry", "createServiceRegistration", params)
def publish_metadata_in_ipfs_and_update_registration(self): # first we check that we do not change payment_address or group_id in existed payment groups self._validate_service_group_with_org_group_and_update_group_id( self.args.org_id, self.args.metadata_file) metadata_uri = hash_to_bytesuri( self._publish_metadata_in_ipfs(self.args.metadata_file)) params = [type_converter("bytes32")(self.args.org_id), type_converter( "bytes32")(self.args.service_id), metadata_uri] self.transact_contract_command( "Registry", "updateServiceRegistration", params)
def rem_members(self): org_id = self.args.org_id # Check if Organization exists and member is part of it (found, _, _, _, members, _, _) = self._getorganizationbyid(org_id) self.error_organization_not_found(org_id, found) members = [member.lower() for member in members] rem_members = [] for rem_member in self.get_members_from_args(): if rem_member.lower() not in members: self._printout("{} is not a member of organization {}".format( rem_member, org_id)) else: rem_members.append(rem_member) if not rem_members: self._printout("No member was removed from {}!\n".format(org_id)) return params = [type_converter("bytes32")(org_id), rem_members] self._printout( "Creating transaction to remove {} members from organization with id={}...\n" .format(len(rem_members), org_id)) try: self.transact_contract_command("Registry", "removeOrganizationMembers", params) except Exception as e: self._printerr( "\nTransaction error!\nHINT: Check if you are the owner of {}\n" .format(org_id)) raise
def add_members(self): org_id = self.args.org_id # Check if Organization exists and member is not part of it (found, _, _, _, members, _, _) = self._getorganizationbyid(org_id) self.error_organization_not_found(org_id, found) members = [member.lower() for member in members] add_members = [] for add_member in self.get_members_from_args(): if add_member.lower() in members: self._printout( "{} is already a member of organization {}".format( add_member, org_id)) else: add_members.append(add_member) if not add_members: self._printout("No member was added to {}!\n".format(org_id)) return params = [type_converter("bytes32")(org_id), add_members] self._printout( "Creating transaction to add {} members into organization {}...\n". format(len(add_members), org_id)) try: self.transact_contract_command("Registry", "addOrganizationMembers", params) except Exception as e: self._printerr( "\nTransaction error!\nHINT: Check if you are the owner of {}\n" .format(org_id)) raise
def change_owner(self): org_id = self.args.org_id # Check if Organization exists (found, _, _, owner, _, _, _) = self._getorganizationbyid(org_id) self.error_organization_not_found(org_id, found) new_owner = self.args.owner if not is_checksum_address(new_owner): raise Exception( "New owner account %s is not a valid Ethereum checksum address" % new_owner) if new_owner.lower() == owner.lower(): raise Exception( "\n{} is the owner of Organization with id={}!\n".format( new_owner, org_id)) self._printout( "Creating transaction to change organization {}'s owner...\n". format(org_id)) try: self.transact_contract_command( "Registry", "changeOrganizationOwner", [type_converter("bytes32")(org_id), self.args.owner]) except Exception as e: self._printerr( "\nTransaction error!\nHINT: Check if you are the owner of {}\n" .format(org_id)) raise
def _get_organization_registration(self, org_id): params = [type_converter("bytes32")(org_id)] rez = self.call_contract_command( "Registry", "getOrganizationById", params) if (rez[0] == False): raise Exception("Cannot find Organization with id=%s" % ( self.args.org_id)) return {"orgMetadataURI": rez[2]}
def _getorganizationbyid(self, org_id): org_id_bytes32 = type_converter("bytes32")(org_id) if (len(org_id_bytes32) > 32): raise Exception( "Your org_id is too long, it should be 32 bytes or less. len(org_id_bytes32)=%i" % (len(org_id_bytes32))) return self.call_contract_command("Registry", "getOrganizationById", [org_id_bytes32])
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)
def list_services(self): org_id = self.args.org_id (found, org_service_list) = self.call_contract_command( "Registry", "listServicesForOrganization", [type_converter("bytes32")(org_id)]) self.error_organization_not_found(org_id, found) if org_service_list: self._printout("\nList of {}'s Services:".format(org_id)) for idx, org_service in enumerate(org_service_list): self._printout("- {}".format(bytes32_to_str(org_service))) else: self._printout( "Organization with id={} exists but has no registered services." .format(org_id))
def delete(self): org_id = self.args.org_id # Check if Organization exists (found, _, org_name, _, _, _, _) = self._getorganizationbyid(org_id) self.error_organization_not_found(org_id, found) self._printout( "Creating transaction to delete organization with name={} id={}". format(org_name, org_id)) try: self.transact_contract_command("Registry", "deleteOrganization", [type_converter("bytes32")(org_id)]) except Exception as e: self._printerr( "\nTransaction error!\nHINT: Check if you are the owner of organization with id={}\n" .format(org_id)) raise
def create(self): org_id = self.args.org_id # create unique uuid if org_id haven't been specified manualy if (not org_id): alphabet = string.ascii_letters + string.digits org_id = ''.join(secrets.choice(alphabet) for i in range(32)) # Check if Organization already exists found = self._getorganizationbyid(org_id)[0] if found: raise Exception( "\nOrganization with id={} already exists!\n".format(org_id)) members = self.get_members_from_args() params = [ type_converter("bytes32")(org_id), self.args.org_name, members ] self._printout( "Creating transaction to create organization name={} id={}\n". format(self.args.org_name, org_id)) self.transact_contract_command("Registry", "createOrganization", params) self._printout("id:\n%s" % org_id)
def change_name(self): org_id = self.args.org_id new_org_name = self.args.name # Check if Organization exists (found, _, org_name, _, _, _, _) = self._getorganizationbyid(org_id) self.error_organization_not_found(org_id, found) if new_org_name == org_name: raise Exception( "\n{} is already the name of the Organization with id={}!\n". format(new_org_name, org_id)) self._printout( "Creating transaction to change organization {}'s name...\n". format(org_id)) try: self.transact_contract_command( "Registry", "changeOrganizationName", [type_converter("bytes32")(org_id), new_org_name]) except Exception as e: self._printerr( "\nTransaction error!\nHINT: Check if you are the owner of {}\n" .format(org_id)) raise
def update_metadata(self): metadata_file = self.args.metadata_file try: with open(metadata_file, 'r') as f: org_metadata = OrganizationMetadata.from_json(json.load(f)) except Exception as e: print( "Organization metadata json file not found ,Please check --metadata-file path " ) raise e # validate the metadata before updating org_id = self.args.org_id existing_registry_org_metadata = self._get_organization_metadata_from_registry( org_id) org_metadata.validate(existing_registry_org_metadata) # Check if Organization already exists found = self._getorganizationbyid(org_id)[0] if not found: raise Exception( "\nOrganization with id={} does not exists!\n".format(org_id)) ipfs_metatdata_uri = publish_file_in_ipfs(self._get_ipfs_client(), metadata_file, False) params = [ type_converter("bytes32")(org_id), hash_to_bytesuri(ipfs_metatdata_uri) ] self._printout( "Creating transaction to create organization name={} id={}\n". format(org_metadata.org_name, org_id)) self.transact_contract_command("Registry", "changeOrganizationMetadataURI", params) self._printout("id:\n%s" % org_id)
def _get_converted_tags(self): return [type_converter("bytes32")(tag) for tag in self.args.tags]