def process(self): conf_obj = self.get_conf_obj() conf_obj[FULL_SUPPORTERS_SET] = set( conf_obj[SUPPORTERS_SET] | set(conf_obj[FOUNDERS_MAP].keys()) | set(conf_obj[OWNERS_MAP].keys())) conf_obj[EXCLUDED_DELEGATORS_SET_TOE] = set( [k for k, v in conf_obj[RULES_MAP].items() if v == TOE]) conf_obj[EXCLUDED_DELEGATORS_SET_TOF] = set( [k for k, v in conf_obj[RULES_MAP].items() if v == TOF]) conf_obj[EXCLUDED_DELEGATORS_SET_TOB] = set( [k for k, v in conf_obj[RULES_MAP].items() if v == TOB]) addr_validator = AddressValidator("dest_map") conf_obj[DEST_MAP] = { k: v for k, v in conf_obj[RULES_MAP].items() if addr_validator.isaddress(v) } conf_obj[CONTRACTS_SET] = set( [k for k, v in conf_obj[RULES_MAP].items() if v.lower() == DEXTER]) # default destination for min_delegation filtered account rewards if MIN_DELEGATION_KEY not in conf_obj[RULES_MAP]: conf_obj[EXCLUDED_DELEGATORS_SET_TOB].add(MIN_DELEGATION_KEY)
def validate_address_set(self, conf_obj, set_name): if set_name not in conf_obj: conf_obj[set_name] = set() return if isinstance(conf_obj[set_name], str) and conf_obj[set_name].lower() == 'none': conf_obj[set_name] = set() return # empty sets are evaluated as dict if not conf_obj[set_name] and (isinstance(conf_obj[set_name], dict) or isinstance(conf_obj[set_name], list)): conf_obj[set_name] = set() return # {KT*****,KT****} are loaded as {KT*****:None,KT****:None} # convert to set if isinstance(conf_obj[set_name], dict) and set( conf_obj[set_name].values()) == {None}: conf_obj[set_name] = set(conf_obj[set_name].keys()) validator = AddressValidator(set_name) for addr in conf_obj[set_name]: validator.validate(addr)
def __validate_share_map(self, conf_obj, map_name): """ all shares in the map must sum up to 1 :param conf_obj: configuration object :param map_name: name of the map to validate :return: None """ if map_name not in conf_obj: conf_obj[map_name] = dict() return if isinstance(conf_obj[map_name], str) and conf_obj[map_name].lower() == 'none': conf_obj[map_name] = dict() return if not conf_obj[map_name]: return share_map = conf_obj[map_name] validator = AddressValidator(map_name) for key, value in share_map.items(): validator.validate(key) if len(share_map) > 0: try: if abs(1 - sum(share_map.values()) > 1e-4): # a zero check actually raise ConfigurationException("Map '{}' shares does not sum up to 1!".format(map_name)) except TypeError: raise ConfigurationException("Map '{}' values must be number!".format(map_name))
def onexclude(input): if not input: fsm.go() return try: address_target = input.split(',') address = address_target[0].strip() target = address_target[1].strip() AddressValidator("excluded address").validate(address) options = ['TOB', 'TOE', 'TOF'] if target not in options: printe("Invalid target, available options are {}".format(options)) return global parser conf_obj = parser.get_conf_obj() if RULES_MAP not in conf_obj: conf_obj[RULES_MAP] = dict() conf_obj[RULES_MAP][address] = target parser.validate_dest_map(parser.get_conf_obj()) except Exception: printe("Invalid exclusion entry: " + traceback.format_exc()) return
def __validate_specials_map(self, conf_obj): if SPECIALS_MAP not in conf_obj: conf_obj[SPECIALS_MAP] = dict() return if isinstance(conf_obj[SPECIALS_MAP], str) and conf_obj[SPECIALS_MAP].lower() == 'none': conf_obj[SPECIALS_MAP] = dict() return if not conf_obj[SPECIALS_MAP]: return addr_validator = AddressValidator(SPECIALS_MAP) for key, value in conf_obj[SPECIALS_MAP].items(): addr_validator.validate(key) FeeValidator("specials_map:" + key).validate(value)
def __validate_address_set(self, conf_obj, set_name): if set_name not in conf_obj: conf_obj[set_name] = set() return if isinstance(conf_obj[set_name], str) and conf_obj[set_name].lower() == 'none': conf_obj[set_name] = set() return # empty sets are evaluated as dict if not conf_obj[set_name] and (isinstance(conf_obj[set_name], dict) or isinstance(conf_obj[set_name], list)): conf_obj[set_name] = set() return validator = AddressValidator(set_name) for addr in conf_obj[set_name]: validator.validate(addr)
def __list_known_contracts_by_alias(self): _, response = self.send_request(" list known contracts") dict = self.parse_list_known_contracts_response(response) for alias, pkh in dict.items(): try: AddressValidator("known_contract").validate(pkh) except Exception as e: raise ClientException("Invalid response from client '{}'".format(response), e) return dict
def onpaymentaddress(input): try: AddressValidator("payouts address").validate(input) global parser parser.set(PAYMENT_ADDRESS, input) parser.validate_payment_address(parser.get_conf_obj()) except Exception as e: printe(f"Invalid payouts address: {str(e)}") return fsm.go()
def __list_known_addresses_by_pkh(self): _, response = self.send_request("list known addresses") dict = self.parse_list_known_addresses_response(response) for pkh, dict_alias_sk in dict.items(): try: AddressValidator("known_address").validate(pkh) except Exception as e: raise ClientException( "Invalid response from client '{}'".format(response), e) return dict
def onredirect(input): if not input: fsm.go() return try: address1_address2 = input.split(',') address1 = address1_address2[0].strip() address2 = address1_address2[1].strip() AddressValidator("redirected source address").validate(address1) AddressValidator("redirected target address").validate(address2) global parser conf_obj = parser.get_conf_obj() if RULES_MAP not in conf_obj: conf_obj[RULES_MAP] = dict() conf_obj[RULES_MAP][address1] = address2 parser.validate_dest_map(parser.get_conf_obj()) except Exception: printe("Invalid redirection entry: " + traceback.format_exc()) return
def onbakingaddress(input): try: AddressValidator("baking address").validate(input) except Exception as e: printe(f"Invalid baking address: {str(e)}") return if not input.startswith("tz"): printe("Only tz addresses are allowed") return provider_factory = ProviderFactory(args.reward_data_provider) global parser parser = BakingYamlConfParser(None, client_manager, provider_factory, network_config, args.node_endpoint, api_base_url=args.api_base_url) parser.set(BAKING_ADDRESS, input) fsm.go()
def onbakingaddress(input): try: AddressValidator("bakingaddress").validate(input) except Exception as e: printe("Invalid baking address: " + traceback.format_exc()) return if not input.startswith("tz"): printe("Only tz addresses are allowed") return provider_factory = ProviderFactory(args.reward_data_provider) global parser parser = BakingYamlConfParser(None, wllt_clnt_mngr, provider_factory, network_config, args.node_addr) parser.set(BAKING_ADDRESS, input) messages['paymentaddress']=messages['paymentaddress'].format([v['alias'] for k,v in wllt_clnt_mngr.get_addr_dict().items() if v['sk']])+" (without quotes)" fsm.go()
def onsupporters(input): if not input: fsm.go() return try: AddressValidator("supporter address").validate(input) global parser conf_obj = parser.get_conf_obj() if SUPPORTERS_SET not in conf_obj: conf_obj[SUPPORTERS_SET] = set() conf_obj[SUPPORTERS_SET].add(input) parser.validate_address_set(parser.get_conf_obj(), SUPPORTERS_SET) except Exception: printe("Invalid supporter entry: " + traceback.format_exc()) return
def get_manager_for_contract(self, pkh): if pkh.startswith('dn'): return pkh if pkh in self.managers: return self.managers[pkh] _, response = self.send_request(" get manager for " + pkh) manager = self.parse_get_manager_for_contract_response(response) try: AddressValidator("manager").validate(manager) except Exception as e: raise ClientException("Invalid response from client '{}'".format(response), e) self.managers[pkh] = manager return manager
def onspecials(input): if not input: fsm.go() return try: address_target = input.split(',') address = address_target[0].strip() fee = float(address_target[1].strip()) AddressValidator("special address").validate(address) FeeValidator("special_fee").validate(fee) global parser conf_obj = parser.get_conf_obj() if SPECIALS_MAP not in conf_obj: conf_obj[SPECIALS_MAP] = dict() conf_obj[SPECIALS_MAP][address] = fee parser.validate_specials_map(parser.get_conf_obj()) except Exception: printe("Invalid specials entry: " + traceback.format_exc()) return
def validate_dest_map(self, conf_obj): if RULES_MAP not in conf_obj: conf_obj[RULES_MAP] = dict() return if isinstance(conf_obj[RULES_MAP], str) and conf_obj[SPECIALS_MAP].lower() == 'none': conf_obj[RULES_MAP] = dict() return if not conf_obj[RULES_MAP]: return addr_validator = AddressValidator(RULES_MAP) for key, value in conf_obj[RULES_MAP].items(): # validate key (and address or MINDELEGATION) if key != MIN_DELEGATION_KEY: addr_validator.validate(key) # validate destination value (An address OR TOF OR TOB OR TOE) if value not in [TOF, TOB, TOE]: addr_validator.validate(key)