Source code for bittensor.utils.balance

import warnings
from typing import Union, TypedDict, Optional

from scalecodec import ScaleType

from bittensor.core import settings


def _check_currencies(self, other):
    """Checks that Balance objects have the same netuids to perform arithmetic operations.

    A warning is raised if the netuids differ.

    Example:
        >>> balance1 = Balance.from_rao(1000).set_unit(12)
        >>> balance2 = Balance.from_rao(500).set_unit(12)
        >>> balance1 + balance2  # No warning

        >>> balance3 = Balance.from_rao(200).set_unit(15)
        >>> balance1 + balance3  # Raises DeprecationWarning

    In this example:
        - `from_rao` creates a Balance instance from the amount in rao (smallest unit).
        - `set_unit(12)` sets the unit to correspond to subnet 12 (i.e., Alpha from netuid 12).
    """
    if self.netuid != other.netuid:
        warnings.simplefilter("default", DeprecationWarning)
        warnings.warn(
            "Balance objects must have the same netuid (Alpha currency) to perform arithmetic operations.\n"
            f"First balance is `{self}`.  Second balance is `{other}`.\n\n"
            "To create a Balance instance with the correct netuid, use:\n"
            "Balance.from_rao(1000).set_unit(12)  # 1000 rao in subnet 12",
            category=DeprecationWarning,
            stacklevel=2,
        )


[docs] class Balance: """ Represents the bittensor balance of the wallet, stored as rao (int). This class provides a way to interact with balances in two different units: rao and tao. It provides methods to convert between these units, as well as to perform arithmetic and comparison operations. Attributes: unit (str): A string representing the symbol for the tao unit. rao_unit (str): A string representing the symbol for the rao unit. rao (int): An integer that stores the balance in rao units. tao (float): A float property that gives the balance in tao units. """ unit: str = settings.TAO_SYMBOL # This is the tao unit rao_unit: str = settings.RAO_SYMBOL # This is the rao unit rao: int tao: float netuid: int = 0 def __init__(self, balance: Union[int, float]): """ Initialize a Balance object. If balance is an int, it's assumed to be in rao. If balance is a float, it's assumed to be in tao. Args: balance: The initial balance, in either rao (if an int) or tao (if a float). """ if isinstance(balance, int): self.rao = balance elif isinstance(balance, float): # Assume tao value for the float self.rao = int(balance * pow(10, 9)) else: raise TypeError( f"Balance must be an int (rao) or a float (tao), not `{type(balance)}`." ) @property def tao(self): return self.rao / pow(10, 9) def __int__(self): """Convert the Balance object to an int. The resulting value is in rao.""" return self.rao def __float__(self): """Convert the Balance object to a float. The resulting value is in tao.""" return self.tao def __str__(self): """ Returns the Balance object as a string in the format "symbolvalue", where the value is in tao. """ if self.unit == UNITS[0]: return f"{self.unit}{float(self.tao):,.9f}" else: return f"\u200e{float(self.tao):,.9f}{self.unit}\u200e" def __rich__(self): int_tao, fract_tao = format(float(self.tao), "f").split(".") return f"[green]{self.unit}{int_tao}.{fract_tao}[/green]" def __str_rao__(self): return f"{self.rao_unit}{int(self.rao)}" def __rich_rao__(self): return f"[green]{self.rao_unit}{int(self.rao)}[/green]" def __repr__(self): return self.__str__() def __eq__(self, other: Union[int, float, "Balance"]): if other is None: return False if isinstance(other, Balance): _check_currencies(self, other) return self.rao == other.rao else: try: # Attempt to cast to int from rao other_rao = int(other) return self.rao == other_rao except (TypeError, ValueError): raise NotImplementedError("Unsupported type") def __ne__(self, other: Union[int, float, "Balance"]): return not self == other def __gt__(self, other: Union[int, float, "Balance"]): if isinstance(other, Balance): _check_currencies(self, other) return self.rao > other.rao else: try: # Attempt to cast to int from rao other_rao = int(other) return self.rao > other_rao except ValueError: raise NotImplementedError("Unsupported type") def __lt__(self, other: Union[int, float, "Balance"]): if isinstance(other, Balance): _check_currencies(self, other) return self.rao < other.rao else: try: # Attempt to cast to int from rao other_rao = int(other) return self.rao < other_rao except ValueError: raise NotImplementedError("Unsupported type") def __le__(self, other: Union[int, float, "Balance"]): try: if isinstance(other, Balance): _check_currencies(self, other) return self < other or self == other except TypeError: raise NotImplementedError("Unsupported type") def __ge__(self, other: Union[int, float, "Balance"]): try: if isinstance(other, Balance): _check_currencies(self, other) return self > other or self == other except TypeError: raise NotImplementedError("Unsupported type") def __add__(self, other: Union[int, float, "Balance"]): if isinstance(other, Balance): _check_currencies(self, other) return Balance.from_rao(int(self.rao + other.rao)).set_unit(self.netuid) else: try: # Attempt to cast to int from rao return Balance.from_rao(int(self.rao + other)).set_unit(self.netuid) except (ValueError, TypeError): raise NotImplementedError("Unsupported type") def __radd__(self, other: Union[int, float, "Balance"]): try: if isinstance(other, Balance): _check_currencies(self, other) return self + other except TypeError: raise NotImplementedError("Unsupported type") def __sub__(self, other: Union[int, float, "Balance"]): try: if isinstance(other, Balance): _check_currencies(self, other) return self + -other except TypeError: raise NotImplementedError("Unsupported type") def __rsub__(self, other: Union[int, float, "Balance"]): try: if isinstance(other, Balance): _check_currencies(self, other) return -self + other except TypeError: raise NotImplementedError("Unsupported type") def __mul__(self, other: Union[int, float, "Balance"]): if isinstance(other, Balance): _check_currencies(self, other) return Balance.from_rao(int(self.rao * other.rao)).set_unit(self.netuid) else: try: # Attempt to cast to int from rao return Balance.from_rao(int(self.rao * other)).set_unit(self.netuid) except (ValueError, TypeError): raise NotImplementedError("Unsupported type") def __rmul__(self, other: Union[int, float, "Balance"]): if isinstance(other, Balance): _check_currencies(self, other) return self * other def __truediv__(self, other: Union[int, float, "Balance"]): if isinstance(other, Balance): _check_currencies(self, other) return Balance.from_rao(int(self.rao / other.rao)).set_unit(self.netuid) else: try: # Attempt to cast to int from rao return Balance.from_rao(int(self.rao / other)).set_unit(self.netuid) except (ValueError, TypeError): raise NotImplementedError("Unsupported type") def __rtruediv__(self, other: Union[int, float, "Balance"]): if isinstance(other, Balance): _check_currencies(self, other) return Balance.from_rao(int(other.rao / self.rao)).set_unit(self.netuid) else: try: # Attempt to cast to int from rao return Balance.from_rao(int(other / self.rao)).set_unit(self.netuid) except (ValueError, TypeError): raise NotImplementedError("Unsupported type") def __floordiv__(self, other: Union[int, float, "Balance"]): if isinstance(other, Balance): _check_currencies(self, other) return Balance.from_rao(int(self.tao // other.tao)).set_unit(self.netuid) else: try: # Attempt to cast to int from rao return Balance.from_rao(int(self.rao // other)).set_unit(self.netuid) except (ValueError, TypeError): raise NotImplementedError("Unsupported type") def __rfloordiv__(self, other: Union[int, float, "Balance"]): if isinstance(other, Balance): _check_currencies(self, other) return Balance.from_rao(int(other.rao // self.rao)).set_unit(self.netuid) else: try: # Attempt to cast to int from rao return Balance.from_rao(int(other // self.rao)).set_unit(self.netuid) except (ValueError, TypeError): raise NotImplementedError("Unsupported type") def __nonzero__(self) -> bool: return bool(self.rao) def __neg__(self): return Balance.from_rao(-self.rao).set_unit(self.netuid) def __pos__(self): return Balance.from_rao(self.rao).set_unit(self.netuid) def __abs__(self): return Balance.from_rao(abs(self.rao)).set_unit(self.netuid)
[docs] @staticmethod def from_float(amount: float, netuid: int = 0) -> "Balance": """ Given tao, return :func:`Balance` object with rao(``int``) and tao(``float``), where rao = int(tao*pow(10,9)) Args: amount (float): The amount in tao. netuid (int): The subnet uid for set currency unit. Defaults to `0`. Returns: A Balance object representing the given amount. """ rao_ = int(amount * pow(10, 9)) return Balance(rao_).set_unit(netuid)
[docs] @staticmethod def from_tao(amount: float, netuid: int = 0) -> "Balance": """ Given tao, return Balance object with rao(``int``) and tao(``float``), where rao = int(tao*pow(10,9)) Args: amount (float): The amount in tao. netuid (int): The subnet uid for set currency unit. Defaults to `0`. Returns: A Balance object representing the given amount. """ rao_ = int(amount * pow(10, 9)) return Balance(rao_).set_unit(netuid)
[docs] @staticmethod def from_rao(amount: int, netuid: int = 0) -> "Balance": """ Given rao, return Balance object with rao(``int``) and tao(``float``), where rao = int(tao*pow(10,9)) Args: amount (int): The amount in rao. netuid (int): The subnet uid for set currency unit. Defaults to `0`. Returns: A Balance object representing the given amount. """ return Balance(amount).set_unit(netuid)
[docs] @staticmethod def get_unit(netuid: int) -> str: base = len(UNITS) if netuid < base: return UNITS[netuid] else: result = "" while netuid > 0: result = UNITS[netuid % base] + result netuid //= base return result
[docs] def set_unit(self, netuid: int): self.netuid = netuid self.unit = Balance.get_unit(netuid) self.rao_unit = Balance.get_unit(netuid) return self
[docs] class FixedPoint(TypedDict): """ Represents a fixed point ``U64F64`` number. Where ``bits`` is a U128 representation of the fixed point number. This matches the type of the Alpha shares. """ bits: int
[docs] def fixed_to_float( fixed: Union[FixedPoint, ScaleType], frac_bits: int = 64, total_bits: int = 128 ) -> float: # By default, this is a U64F64 # which is 64 bits of integer and 64 bits of fractional data: int = fixed["bits"] # Logical and to get the fractional part; remaining is the integer part fractional_part = data & (2**frac_bits - 1) # Shift to get the integer part from the remaining bits integer_part = data >> (total_bits - frac_bits) frac_float = fractional_part / (2**frac_bits) return integer_part + frac_float
# lowercase is added for backwards compatibility to not break API units = UNITS = [ chr( 0x03C4 ), # τ Note: the subnet symbol for sn 0 is b"\xce\xa4" / Τ / Tau — however the currency/balance is τ (Tao) b"\xce\xb1".decode(), # α (Alpha, 1) b"\xce\xb2".decode(), # β (Beta, 2) b"\xce\xb3".decode(), # γ (Gamma, 3) b"\xce\xb4".decode(), # δ (Delta, 4) b"\xce\xb5".decode(), # ε (Epsilon, 5) b"\xce\xb6".decode(), # ζ (Zeta, 6) b"\xce\xb7".decode(), # η (Eta, 7) b"\xce\xb8".decode(), # θ (Theta, 8) b"\xce\xb9".decode(), # ι (Iota, 9) b"\xce\xba".decode(), # κ (Kappa, 10) b"\xce\xbb".decode(), # λ (Lambda, 11) b"\xce\xbc".decode(), # μ (Mu, 12) b"\xce\xbd".decode(), # ν (Nu, 13) b"\xce\xbe".decode(), # ξ (Xi, 14) b"\xce\xbf".decode(), # ο (Omicron, 15) b"\xcf\x80".decode(), # π (Pi, 16) b"\xcf\x81".decode(), # ρ (Rho, 17) b"\xcf\x83".decode(), # σ (Sigma, 18) "t", # t (Tau, 19) b"\xcf\x85".decode(), # υ (Upsilon, 20) b"\xcf\x86".decode(), # φ (Phi, 21) b"\xcf\x87".decode(), # χ (Chi, 22) b"\xcf\x88".decode(), # ψ (Psi, 23) b"\xcf\x89".decode(), # ω (Omega, 24) b"\xd7\x90".decode(), # א (Aleph, 25) b"\xd7\x91".decode(), # ב (Bet, 26) b"\xd7\x92".decode(), # ג (Gimel, 27) b"\xd7\x93".decode(), # ד (Dalet, 28) b"\xd7\x94".decode(), # ה (He, 29) b"\xd7\x95".decode(), # ו (Vav, 30) b"\xd7\x96".decode(), # ז (Zayin, 31) b"\xd7\x97".decode(), # ח (Het, 32) b"\xd7\x98".decode(), # ט (Tet, 33) b"\xd7\x99".decode(), # י (Yod, 34) b"\xd7\x9a".decode(), # ך (Final Kaf, 35) b"\xd7\x9b".decode(), # כ (Kaf, 36) b"\xd7\x9c".decode(), # ל (Lamed, 37) b"\xd7\x9d".decode(), # ם (Final Mem, 38) b"\xd7\x9e".decode(), # מ (Mem, 39) b"\xd7\x9f".decode(), # ן (Final Nun, 40) b"\xd7\xa0".decode(), # נ (Nun, 41) b"\xd7\xa1".decode(), # ס (Samekh, 42) b"\xd7\xa2".decode(), # ע (Ayin, 43) b"\xd7\xa3".decode(), # ף (Final Pe, 44) b"\xd7\xa4".decode(), # פ (Pe, 45) b"\xd7\xa5".decode(), # ץ (Final Tsadi, 46) b"\xd7\xa6".decode(), # צ (Tsadi, 47) b"\xd7\xa7".decode(), # ק (Qof, 48) b"\xd7\xa8".decode(), # ר (Resh, 49) b"\xd7\xa9".decode(), # ש (Shin, 50) b"\xd7\xaa".decode(), # ת (Tav, 51) b"\xd8\xa7".decode(), # ا (Alif, 52) b"\xd8\xa8".decode(), # ب (Ba, 53) b"\xd8\xaa".decode(), # ت (Ta, 54) b"\xd8\xab".decode(), # ث (Tha, 55) b"\xd8\xac".decode(), # ج (Jim, 56) b"\xd8\xad".decode(), # ح (Ha, 57) b"\xd8\xae".decode(), # خ (Kha, 58) b"\xd8\xaf".decode(), # د (Dal, 59) b"\xd8\xb0".decode(), # ذ (Dhal, 60) b"\xd8\xb1".decode(), # ر (Ra, 61) b"\xd8\xb2".decode(), # ز (Zay, 62) b"\xd8\xb3".decode(), # س (Sin, 63) b"\xd8\xb4".decode(), # ش (Shin, 64) b"\xd8\xb5".decode(), # ص (Sad, 65) b"\xd8\xb6".decode(), # ض (Dad, 66) b"\xd8\xb7".decode(), # ط (Ta, 67) b"\xd8\xb8".decode(), # ظ (Dha, 68) b"\xd8\xb9".decode(), # ع (Ain, 69) b"\xd8\xba".decode(), # غ (Ghayn, 70) b"\xd9\x81".decode(), # ف (Fa, 71) b"\xd9\x82".decode(), # ق (Qaf, 72) b"\xd9\x83".decode(), # ك (Kaf, 73) b"\xd9\x84".decode(), # ل (Lam, 74) b"\xd9\x85".decode(), # م (Mim, 75) b"\xd9\x86".decode(), # ن (Nun, 76) b"\xd9\x87".decode(), # ه (Ha, 77) b"\xd9\x88".decode(), # و (Waw, 78) b"\xd9\x8a".decode(), # ي (Ya, 79) b"\xd9\x89".decode(), # ى (Alef Maksura, 80) b"\xe1\x9a\xa0".decode(), # ᚠ (Fehu, wealth, 81) b"\xe1\x9a\xa2".decode(), # ᚢ (Uruz, strength, 82) b"\xe1\x9a\xa6".decode(), # ᚦ (Thurisaz, giant, 83) b"\xe1\x9a\xa8".decode(), # ᚨ (Ansuz, god, 84) b"\xe1\x9a\xb1".decode(), # ᚱ (Raidho, ride, 85) b"\xe1\x9a\xb3".decode(), # ᚲ (Kaunan, ulcer, 86) b"\xd0\xab".decode(), # Ы (Cyrillic Yeru, 87) b"\xe1\x9b\x89".decode(), # ᛉ (Algiz, protection, 88) b"\xe1\x9b\x92".decode(), # ᛒ (Berkanan, birch, 89) b"\xe1\x9a\x80".decode(), #   (Space, 90) b"\xe1\x9a\x81".decode(), # ᚁ (Beith, birch, 91) b"\xe1\x9a\x82".decode(), # ᚂ (Luis, rowan, 92) b"\xe1\x9a\x83".decode(), # ᚃ (Fearn, alder, 93) b"\xe1\x9a\x84".decode(), # ᚄ (Sail, willow, 94) b"\xe1\x9a\x85".decode(), # ᚅ (Nion, ash, 95) b"\xe1\x9a\x9b".decode(), # ᚛ (Forfeda, 96) b"\xe1\x83\x90".decode(), # ა (Ani, 97) b"\xe1\x83\x91".decode(), # ბ (Bani, 98) b"\xe1\x83\x92".decode(), # გ (Gani, 99) b"\xe1\x83\x93".decode(), # დ (Doni, 100) b"\xe1\x83\x94".decode(), # ე (Eni, 101) b"\xe1\x83\x95".decode(), # ვ (Vini, 102) b"\xd4\xb1".decode(), # Ա (Ayp, 103) b"\xd4\xb2".decode(), # Բ (Ben, 104) b"\xd4\xb3".decode(), # Գ (Gim, 105) b"\xd4\xb4".decode(), # Դ (Da, 106) b"\xd4\xb5".decode(), # Ե (Ech, 107) b"\xd4\xb6".decode(), # Զ (Za, 108) b"\xd5\x9e".decode(), # ՞ (Question mark, 109) b"\xd0\x80".decode(), # Ѐ (Ie with grave, 110) b"\xd0\x81".decode(), # Ё (Io, 111) b"\xd0\x82".decode(), # Ђ (Dje, 112) b"\xd0\x83".decode(), # Ѓ (Gje, 113) b"\xd0\x84".decode(), # Є (Ukrainian Ie, 114) b"\xd0\x85".decode(), # Ѕ (Dze, 115) b"\xd1\x8a".decode(), # Ъ (Hard sign, 116) b"\xe2\xb2\x80".decode(), # Ⲁ (Alfa, 117) b"\xe2\xb2\x81".decode(), # ⲁ (Small Alfa, 118) b"\xe2\xb2\x82".decode(), # Ⲃ (Vida, 119) b"\xe2\xb2\x83".decode(), # ⲃ (Small Vida, 120) b"\xe2\xb2\x84".decode(), # Ⲅ (Gamma, 121) b"\xe2\xb2\x85".decode(), # ⲅ (Small Gamma, 122) b"\xf0\x91\x80\x80".decode(), # 𑀀 (A, 123) b"\xf0\x91\x80\x81".decode(), # 𑀁 (Aa, 124) b"\xf0\x91\x80\x82".decode(), # 𑀂 (I, 125) b"\xf0\x91\x80\x83".decode(), # 𑀃 (Ii, 126) b"\xf0\x91\x80\x85".decode(), # 𑀅 (U, 127) b"\xe0\xb6\xb1".decode(), # ඲ (La, 128) b"\xe0\xb6\xb2".decode(), # ඳ (Va, 129) b"\xe0\xb6\xb3".decode(), # ප (Sha, 130) b"\xe0\xb6\xb4".decode(), # ඵ (Ssa, 131) b"\xe0\xb6\xb5".decode(), # බ (Sa, 132) b"\xe0\xb6\xb6".decode(), # භ (Ha, 133) b"\xe2\xb0\x80".decode(), # Ⰰ (Az, 134) b"\xe2\xb0\x81".decode(), # Ⰱ (Buky, 135) b"\xe2\xb0\x82".decode(), # Ⰲ (Vede, 136) b"\xe2\xb0\x83".decode(), # Ⰳ (Glagoli, 137) b"\xe2\xb0\x84".decode(), # Ⰴ (Dobro, 138) b"\xe2\xb0\x85".decode(), # Ⰵ (Yest, 139) b"\xe2\xb0\x86".decode(), # Ⰶ (Zhivete, 140) b"\xe2\xb0\x87".decode(), # Ⰷ (Zemlja, 141) b"\xe2\xb0\x88".decode(), # Ⰸ (Izhe, 142) b"\xe2\xb0\x89".decode(), # Ⰹ (Initial Izhe, 143) b"\xe2\xb0\x8a".decode(), # Ⰺ (I, 144) b"\xe2\xb0\x8b".decode(), # Ⰻ (Djerv, 145) b"\xe2\xb0\x8c".decode(), # Ⰼ (Kako, 146) b"\xe2\xb0\x8d".decode(), # Ⰽ (Ljudije, 147) b"\xe2\xb0\x8e".decode(), # Ⰾ (Myse, 148) b"\xe2\xb0\x8f".decode(), # Ⰿ (Nash, 149) b"\xe2\xb0\x90".decode(), # Ⱀ (On, 150) b"\xe2\xb0\x91".decode(), # Ⱁ (Pokoj, 151) b"\xe2\xb0\x92".decode(), # Ⱂ (Rtsy, 152) b"\xe2\xb0\x93".decode(), # Ⱃ (Slovo, 153) b"\xe2\xb0\x94".decode(), # Ⱄ (Tvrido, 154) b"\xe2\xb0\x95".decode(), # Ⱅ (Uku, 155) b"\xe2\xb0\x96".decode(), # Ⱆ (Fert, 156) b"\xe2\xb0\x97".decode(), # Ⱇ (Xrivi, 157) b"\xe2\xb0\x98".decode(), # Ⱈ (Ot, 158) b"\xe2\xb0\x99".decode(), # Ⱉ (Cy, 159) b"\xe2\xb0\x9a".decode(), # Ⱊ (Shcha, 160) b"\xe2\xb0\x9b".decode(), # Ⱋ (Er, 161) b"\xe2\xb0\x9c".decode(), # Ⱌ (Yeru, 162) b"\xe2\xb0\x9d".decode(), # Ⱍ (Small Yer, 163) b"\xe2\xb0\x9e".decode(), # Ⱎ (Yo, 164) b"\xe2\xb0\x9f".decode(), # Ⱏ (Yu, 165) b"\xe2\xb0\xa0".decode(), # Ⱐ (Ja, 166) b"\xe0\xb8\x81".decode(), # ก (Ko Kai, 167) b"\xe0\xb8\x82".decode(), # ข (Kho Khai, 168) b"\xe0\xb8\x83".decode(), # ฃ (Kho Khuat, 169) b"\xe0\xb8\x84".decode(), # ค (Kho Khon, 170) b"\xe0\xb8\x85".decode(), # ฅ (Kho Rakhang, 171) b"\xe0\xb8\x86".decode(), # ฆ (Kho Khwai, 172) b"\xe0\xb8\x87".decode(), # ง (Ngo Ngu, 173) b"\xe0\xb8\x88".decode(), # จ (Cho Chan, 174) b"\xe0\xb8\x89".decode(), # ฉ (Cho Ching, 175) b"\xe0\xb8\x8a".decode(), # ช (Cho Chang, 176) b"\xe0\xb8\x8b".decode(), # ซ (So So, 177) b"\xe0\xb8\x8c".decode(), # ฌ (Cho Choe, 178) b"\xe0\xb8\x8d".decode(), # ญ (Yo Ying, 179) b"\xe0\xb8\x8e".decode(), # ฎ (Do Chada, 180) b"\xe0\xb8\x8f".decode(), # ฏ (To Patak, 181) b"\xe0\xb8\x90".decode(), # ฐ (Tho Than, 182) b"\xe0\xb8\x91".decode(), # ฑ (Tho Nangmontho, 183) b"\xe0\xb8\x92".decode(), # ฒ (Tho Phuthao, 184) b"\xe0\xb8\x93".decode(), # ณ (No Nen, 185) b"\xe0\xb8\x94".decode(), # ด (Do Dek, 186) b"\xe0\xb8\x95".decode(), # ต (To Tao, 187) b"\xe0\xb8\x96".decode(), # ถ (Tho Thung, 188) b"\xe0\xb8\x97".decode(), # ท (Tho Thahan, 189) b"\xe0\xb8\x98".decode(), # ธ (Tho Thong, 190) b"\xe0\xb8\x99".decode(), # น (No Nu, 191) b"\xe0\xb8\x9a".decode(), # บ (Bo Baimai, 192) b"\xe0\xb8\x9b".decode(), # ป (Po Pla, 193) b"\xe0\xb8\x9c".decode(), # ผ (Pho Phung, 194) b"\xe0\xb8\x9d".decode(), # ฝ (Fo Fa, 195) b"\xe0\xb8\x9e".decode(), # พ (Pho Phan, 196) b"\xe0\xb8\x9f".decode(), # ฟ (Fo Fan, 197) b"\xe0\xb8\xa0".decode(), # ภ (Pho Samphao, 198) b"\xe0\xb8\xa1".decode(), # ม (Mo Ma, 199) b"\xe0\xb8\xa2".decode(), # ย (Yo Yak, 200) b"\xe0\xb8\xa3".decode(), # ร (Ro Rua, 201) b"\xe0\xb8\xa5".decode(), # ล (Lo Ling, 202) b"\xe0\xb8\xa7".decode(), # ว (Wo Waen, 203) b"\xe0\xb8\xa8".decode(), # ศ (So Sala, 204) b"\xe0\xb8\xa9".decode(), # ษ (So Rusi, 205) b"\xe0\xb8\xaa".decode(), # ส (So Sua, 206) b"\xe0\xb8\xab".decode(), # ห (Ho Hip, 207) b"\xe0\xb8\xac".decode(), # ฬ (Lo Chula, 208) b"\xe0\xb8\xad".decode(), # อ (O Ang, 209) b"\xe0\xb8\xae".decode(), # ฮ (Ho Nokhuk, 210) b"\xe1\x84\x80".decode(), # ㄱ (Giyeok, 211) b"\xe1\x84\x81".decode(), # ㄴ (Nieun, 212) b"\xe1\x84\x82".decode(), # ㄷ (Digeut, 213) b"\xe1\x84\x83".decode(), # ㄹ (Rieul, 214) b"\xe1\x84\x84".decode(), # ㅁ (Mieum, 215) b"\xe1\x84\x85".decode(), # ㅂ (Bieup, 216) b"\xe1\x84\x86".decode(), # ㅅ (Siot, 217) b"\xe1\x84\x87".decode(), # ㅇ (Ieung, 218) b"\xe1\x84\x88".decode(), # ㅈ (Jieut, 219) b"\xe1\x84\x89".decode(), # ㅊ (Chieut, 220) b"\xe1\x84\x8a".decode(), # ㅋ (Kieuk, 221) b"\xe1\x84\x8b".decode(), # ㅌ (Tieut, 222) b"\xe1\x84\x8c".decode(), # ㅍ (Pieup, 223) b"\xe1\x84\x8d".decode(), # ㅎ (Hieut, 224) b"\xe1\x85\xa1".decode(), # ㅏ (A, 225) b"\xe1\x85\xa2".decode(), # ㅐ (Ae, 226) b"\xe1\x85\xa3".decode(), # ㅑ (Ya, 227) b"\xe1\x85\xa4".decode(), # ㅒ (Yae, 228) b"\xe1\x85\xa5".decode(), # ㅓ (Eo, 229) b"\xe1\x85\xa6".decode(), # ㅔ (E, 230) b"\xe1\x85\xa7".decode(), # ㅕ (Yeo, 231) b"\xe1\x85\xa8".decode(), # ㅖ (Ye, 232) b"\xe1\x85\xa9".decode(), # ㅗ (O, 233) b"\xe1\x85\xaa".decode(), # ㅘ (Wa, 234) b"\xe1\x85\xab".decode(), # ㅙ (Wae, 235) b"\xe1\x85\xac".decode(), # ㅚ (Oe, 236) b"\xe1\x85\xad".decode(), # ㅛ (Yo, 237) b"\xe1\x85\xae".decode(), # ㅜ (U, 238) b"\xe1\x85\xaf".decode(), # ㅝ (Weo, 239) b"\xe1\x85\xb0".decode(), # ㅞ (We, 240) b"\xe1\x85\xb1".decode(), # ㅟ (Wi, 241) b"\xe1\x85\xb2".decode(), # ㅠ (Yu, 242) b"\xe1\x85\xb3".decode(), # ㅡ (Eu, 243) b"\xe1\x85\xb4".decode(), # ㅢ (Ui, 244) b"\xe1\x85\xb5".decode(), # ㅣ (I, 245) b"\xe1\x8a\xa0".decode(), # አ (Glottal A, 246) b"\xe1\x8a\xa1".decode(), # ኡ (Glottal U, 247) b"\xe1\x8a\xa2".decode(), # ኢ (Glottal I, 248) b"\xe1\x8a\xa3".decode(), # ኣ (Glottal Aa, 249) b"\xe1\x8a\xa4".decode(), # ኤ (Glottal E, 250) b"\xe1\x8a\xa5".decode(), # እ (Glottal Ie, 251) b"\xe1\x8a\xa6".decode(), # ኦ (Glottal O, 252) b"\xe1\x8a\xa7".decode(), # ኧ (Glottal Wa, 253) b"\xe1\x8b\x88".decode(), # ወ (Wa, 254) b"\xe1\x8b\x89".decode(), # ዉ (Wu, 255) b"\xe1\x8b\x8a".decode(), # ዊ (Wi, 256) b"\xe1\x8b\x8b".decode(), # ዋ (Waa, 257) b"\xe1\x8b\x8c".decode(), # ዌ (We, 258) b"\xe1\x8b\x8d".decode(), # ው (Wye, 259) b"\xe1\x8b\x8e".decode(), # ዎ (Wo, 260) b"\xe1\x8a\xb0".decode(), # ኰ (Ko, 261) b"\xe1\x8a\xb1".decode(), # ኱ (Ku, 262) b"\xe1\x8a\xb2".decode(), # ኲ (Ki, 263) b"\xe1\x8a\xb3".decode(), # ኳ (Kua, 264) b"\xe1\x8a\xb4".decode(), # ኴ (Ke, 265) b"\xe1\x8a\xb5".decode(), # ኵ (Kwe, 266) b"\xe1\x8a\xb6".decode(), # ኶ (Ko, 267) b"\xe1\x8a\x90".decode(), # ጐ (Go, 268) b"\xe1\x8a\x91".decode(), # ጑ (Gu, 269) b"\xe1\x8a\x92".decode(), # ጒ (Gi, 270) b"\xe1\x8a\x93".decode(), # መ (Gua, 271) b"\xe1\x8a\x94".decode(), # ጔ (Ge, 272) b"\xe1\x8a\x95".decode(), # ጕ (Gwe, 273) b"\xe1\x8a\x96".decode(), # ጖ (Go, 274) b"\xe0\xa4\x85".decode(), # अ (A, 275) b"\xe0\xa4\x86".decode(), # आ (Aa, 276) b"\xe0\xa4\x87".decode(), # इ (I, 277) b"\xe0\xa4\x88".decode(), # ई (Ii, 278) b"\xe0\xa4\x89".decode(), # उ (U, 279) b"\xe0\xa4\x8a".decode(), # ऊ (Uu, 280) b"\xe0\xa4\x8b".decode(), # ऋ (R, 281) b"\xe0\xa4\x8f".decode(), # ए (E, 282) b"\xe0\xa4\x90".decode(), # ऐ (Ai, 283) b"\xe0\xa4\x93".decode(), # ओ (O, 284) b"\xe0\xa4\x94".decode(), # औ (Au, 285) b"\xe0\xa4\x95".decode(), # क (Ka, 286) b"\xe0\xa4\x96".decode(), # ख (Kha, 287) b"\xe0\xa4\x97".decode(), # ग (Ga, 288) b"\xe0\xa4\x98".decode(), # घ (Gha, 289) b"\xe0\xa4\x99".decode(), # ङ (Nga, 290) b"\xe0\xa4\x9a".decode(), # च (Cha, 291) b"\xe0\xa4\x9b".decode(), # छ (Chha, 292) b"\xe0\xa4\x9c".decode(), # ज (Ja, 293) b"\xe0\xa4\x9d".decode(), # झ (Jha, 294) b"\xe0\xa4\x9e".decode(), # ञ (Nya, 295) b"\xe0\xa4\x9f".decode(), # ट (Ta, 296) b"\xe0\xa4\xa0".decode(), # ठ (Tha, 297) b"\xe0\xa4\xa1".decode(), # ड (Da, 298) b"\xe0\xa4\xa2".decode(), # ढ (Dha, 299) b"\xe0\xa4\xa3".decode(), # ण (Na, 300) b"\xe0\xa4\xa4".decode(), # त (Ta, 301) b"\xe0\xa4\xa5".decode(), # थ (Tha, 302) b"\xe0\xa4\xa6".decode(), # द (Da, 303) b"\xe0\xa4\xa7".decode(), # ध (Dha, 304) b"\xe0\xa4\xa8".decode(), # न (Na, 305) b"\xe0\xa4\xaa".decode(), # प (Pa, 306) b"\xe0\xa4\xab".decode(), # फ (Pha, 307) b"\xe0\xa4\xac".decode(), # ब (Ba, 308) b"\xe0\xa4\xad".decode(), # भ (Bha, 309) b"\xe0\xa4\xae".decode(), # म (Ma, 310) b"\xe0\xa4\xaf".decode(), # य (Ya, 311) b"\xe0\xa4\xb0".decode(), # र (Ra, 312) b"\xe0\xa4\xb2".decode(), # ल (La, 313) b"\xe0\xa4\xb5".decode(), # व (Va, 314) b"\xe0\xa4\xb6".decode(), # श (Sha, 315) b"\xe0\xa4\xb7".decode(), # ष (Ssa, 316) b"\xe0\xa4\xb8".decode(), # स (Sa, 317) b"\xe0\xa4\xb9".decode(), # ह (Ha, 318) b"\xe3\x82\xa2".decode(), # ア (A, 319) b"\xe3\x82\xa4".decode(), # イ (I, 320) b"\xe3\x82\xa6".decode(), # ウ (U, 321) b"\xe3\x82\xa8".decode(), # エ (E, 322) b"\xe3\x82\xaa".decode(), # オ (O, 323) b"\xe3\x82\xab".decode(), # カ (Ka, 324) b"\xe3\x82\xad".decode(), # キ (Ki, 325) b"\xe3\x82\xaf".decode(), # ク (Ku, 326) b"\xe3\x82\xb1".decode(), # ケ (Ke, 327) b"\xe3\x82\xb3".decode(), # コ (Ko, 328) b"\xe3\x82\xb5".decode(), # サ (Sa, 329) b"\xe3\x82\xb7".decode(), # シ (Shi, 330) b"\xe3\x82\xb9".decode(), # ス (Su, 331) b"\xe3\x82\xbb".decode(), # セ (Se, 332) b"\xe3\x82\xbd".decode(), # ソ (So, 333) b"\xe3\x82\xbf".decode(), # タ (Ta, 334) b"\xe3\x83\x81".decode(), # チ (Chi, 335) b"\xe3\x83\x84".decode(), # ツ (Tsu, 336) b"\xe3\x83\x86".decode(), # テ (Te, 337) b"\xe3\x83\x88".decode(), # ト (To, 338) b"\xe3\x83\x8a".decode(), # ナ (Na, 339) b"\xe3\x83\x8b".decode(), # ニ (Ni, 340) b"\xe3\x83\x8c".decode(), # ヌ (Nu, 341) b"\xe3\x83\x8d".decode(), # ネ (Ne, 342) b"\xe3\x83\x8e".decode(), # ノ (No, 343) b"\xe3\x83\x8f".decode(), # ハ (Ha, 344) b"\xe3\x83\x92".decode(), # ヒ (Hi, 345) b"\xe3\x83\x95".decode(), # フ (Fu, 346) b"\xe3\x83\x98".decode(), # ヘ (He, 347) b"\xe3\x83\x9b".decode(), # ホ (Ho, 348) b"\xe3\x83\x9e".decode(), # マ (Ma, 349) b"\xe3\x83\x9f".decode(), # ミ (Mi, 350) b"\xe3\x83\xa0".decode(), # ム (Mu, 351) b"\xe3\x83\xa1".decode(), # メ (Me, 352) b"\xe3\x83\xa2".decode(), # モ (Mo, 353) b"\xe3\x83\xa4".decode(), # ヤ (Ya, 354) b"\xe3\x83\xa6".decode(), # ユ (Yu, 355) b"\xe3\x83\xa8".decode(), # ヨ (Yo, 356) b"\xe3\x83\xa9".decode(), # ラ (Ra, 357) b"\xe3\x83\xaa".decode(), # リ (Ri, 358) b"\xe3\x83\xab".decode(), # ル (Ru, 359) b"\xe3\x83\xac".decode(), # レ (Re, 360) b"\xe3\x83\xad".decode(), # ロ (Ro, 361) b"\xe3\x83\xaf".decode(), # ワ (Wa, 362) b"\xe3\x83\xb2".decode(), # ヲ (Wo, 363) b"\xe3\x83\xb3".decode(), # ン (N, 364) b"\xe2\xb4\xb0".decode(), # ⴰ (Ya, 365) b"\xe2\xb4\xb1".decode(), # ⴱ (Yab, 366) b"\xe2\xb4\xb2".decode(), # ⴲ (Yabh, 367) b"\xe2\xb4\xb3".decode(), # ⴳ (Yag, 368) b"\xe2\xb4\xb4".decode(), # ⴴ (Yagh, 369) b"\xe2\xb4\xb5".decode(), # ⴵ (Yaj, 370) b"\xe2\xb4\xb6".decode(), # ⴶ (Yach, 371) b"\xe2\xb4\xb7".decode(), # ⴷ (Yad, 372) b"\xe2\xb4\xb8".decode(), # ⴸ (Yadh, 373) b"\xe2\xb4\xb9".decode(), # ⴹ (Yadh, emphatic, 374) b"\xe2\xb4\xba".decode(), # ⴺ (Yaz, 375) b"\xe2\xb4\xbb".decode(), # ⴻ (Yazh, 376) b"\xe2\xb4\xbc".decode(), # ⴼ (Yaf, 377) b"\xe2\xb4\xbd".decode(), # ⴽ (Yak, 378) b"\xe2\xb4\xbe".decode(), # ⴾ (Yak, variant, 379) b"\xe2\xb4\xbf".decode(), # ⴿ (Yaq, 380) b"\xe2\xb5\x80".decode(), # ⵀ (Yah, 381) b"\xe2\xb5\x81".decode(), # ⵁ (Yahh, 382) b"\xe2\xb5\x82".decode(), # ⵂ (Yahl, 383) b"\xe2\xb5\x83".decode(), # ⵃ (Yahm, 384) b"\xe2\xb5\x84".decode(), # ⵄ (Yayn, 385) b"\xe2\xb5\x85".decode(), # ⵅ (Yakh, 386) b"\xe2\xb5\x86".decode(), # ⵆ (Yakl, 387) b"\xe2\xb5\x87".decode(), # ⵇ (Yahq, 388) b"\xe2\xb5\x88".decode(), # ⵈ (Yash, 389) b"\xe2\xb5\x89".decode(), # ⵉ (Yi, 390) b"\xe2\xb5\x8a".decode(), # ⵊ (Yij, 391) b"\xe2\xb5\x8b".decode(), # ⵋ (Yizh, 392) b"\xe2\xb5\x8c".decode(), # ⵌ (Yink, 393) b"\xe2\xb5\x8d".decode(), # ⵍ (Yal, 394) b"\xe2\xb5\x8e".decode(), # ⵎ (Yam, 395) b"\xe2\xb5\x8f".decode(), # ⵏ (Yan, 396) b"\xe2\xb5\x90".decode(), # ⵐ (Yang, 397) b"\xe2\xb5\x91".decode(), # ⵑ (Yany, 398) b"\xe2\xb5\x92".decode(), # ⵒ (Yap, 399) b"\xe2\xb5\x93".decode(), # ⵓ (Yu, 400) b"\xe0\xb6\x85".decode(), # අ (A, 401) b"\xe0\xb6\x86".decode(), # ආ (Aa, 402) b"\xe0\xb6\x87".decode(), # ඉ (I, 403) b"\xe0\xb6\x88".decode(), # ඊ (Ii, 404) b"\xe0\xb6\x89".decode(), # උ (U, 405) b"\xe0\xb6\x8a".decode(), # ඌ (Uu, 406) b"\xe0\xb6\x8b".decode(), # ඍ (R, 407) b"\xe0\xb6\x8c".decode(), # ඎ (Rr, 408) b"\xe0\xb6\x8f".decode(), # ඏ (L, 409) b"\xe0\xb6\x90".decode(), # ඐ (Ll, 410) b"\xe0\xb6\x91".decode(), # එ (E, 411) b"\xe0\xb6\x92".decode(), # ඒ (Ee, 412) b"\xe0\xb6\x93".decode(), # ඓ (Ai, 413) b"\xe0\xb6\x94".decode(), # ඔ (O, 414) b"\xe0\xb6\x95".decode(), # ඕ (Oo, 415) b"\xe0\xb6\x96".decode(), # ඖ (Au, 416) b"\xe0\xb6\x9a".decode(), # ක (Ka, 417) b"\xe0\xb6\x9b".decode(), # ඛ (Kha, 418) b"\xe0\xb6\x9c".decode(), # ග (Ga, 419) b"\xe0\xb6\x9d".decode(), # ඝ (Gha, 420) b"\xe0\xb6\x9e".decode(), # ඞ (Nga, 421) b"\xe0\xb6\x9f".decode(), # ච (Cha, 422) b"\xe0\xb6\xa0".decode(), # ඡ (Chha, 423) b"\xe0\xb6\xa1".decode(), # ජ (Ja, 424) b"\xe0\xb6\xa2".decode(), # ඣ (Jha, 425) b"\xe0\xb6\xa3".decode(), # ඤ (Nya, 426) b"\xe0\xb6\xa4".decode(), # ට (Ta, 427) b"\xe0\xb6\xa5".decode(), # ඥ (Tha, 428) b"\xe0\xb6\xa6".decode(), # ඦ (Da, 429) b"\xe0\xb6\xa7".decode(), # ට (Dha, 430) b"\xe0\xb6\xa8".decode(), # ඨ (Na, 431) b"\xe0\xb6\xaa".decode(), # ඪ (Pa, 432) b"\xe0\xb6\xab".decode(), # ණ (Pha, 433) b"\xe0\xb6\xac".decode(), # ඬ (Ba, 434) b"\xe0\xb6\xad".decode(), # ත (Bha, 435) b"\xe0\xb6\xae".decode(), # ථ (Ma, 436) b"\xe0\xb6\xaf".decode(), # ද (Ya, 437) b"\xe0\xb6\xb0".decode(), # ධ (Ra, 438) ]
[docs] def tao(amount: float, netuid: int = 0) -> Balance: """ Helper function to create a Balance object from a float (Tao) """ return Balance.from_tao(amount).set_unit(netuid)
[docs] def rao(amount: int, netuid: int = 0) -> Balance: """ Helper function to create a Balance object from an int (Rao) """ return Balance.from_rao(amount).set_unit(netuid)
[docs] def check_and_convert_to_balance( amount: Union[float, int, Optional[Balance]], ) -> Balance: """ Helper function to check and convert the amount type to a Balance object. This is used to support backwards compatibility while also providing a deprecation notice. """ if isinstance(amount, (float, int)): warnings.simplefilter("default", DeprecationWarning) warnings.warn( "Detected a non-balance amount. Converting to Balance from Tao for backwards compatibility." "Please update your code to use tao(amount) or Balance.from_tao(amount) for the main release 9.0.0.", category=DeprecationWarning, stacklevel=2, ) amount = tao(amount) return amount