Skip to content

Commit 72a0f2b

Browse files
authored
Merge pull request #2576 from opentensor/update-rao-sdk
Updates Rao sdk
2 parents 34ef750 + 01ddfc7 commit 72a0f2b

File tree

10 files changed

+533
-164
lines changed

10 files changed

+533
-164
lines changed

bittensor/core/chain_data/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
from .stake_info import StakeInfo
2020
from .subnet_hyperparameters import SubnetHyperparameters
2121
from .subnet_info import SubnetInfo
22+
from .dynamic_info import DynamicInfo
23+
from .subnet_identity import SubnetIdentity
2224
from .utils import custom_rpc_type_registry, decode_account_id, process_stake_data
2325

2426
ProposalCallData = GenericCall
+137
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
"""
2+
This module defines the `DynamicInfo` data class and associated methods for handling and decoding
3+
dynamic information in the Bittensor network.
4+
"""
5+
6+
from dataclasses import dataclass
7+
from typing import Optional, Union
8+
9+
from scalecodec.utils.ss58 import ss58_encode
10+
11+
from bittensor.core.chain_data.utils import (
12+
ChainDataType,
13+
from_scale_encoding,
14+
SS58_FORMAT,
15+
)
16+
from bittensor.core.chain_data.subnet_identity import SubnetIdentity
17+
from bittensor.utils.balance import Balance
18+
19+
20+
@dataclass
21+
class DynamicInfo:
22+
netuid: int
23+
owner_hotkey: str
24+
owner_coldkey: str
25+
subnet_name: str
26+
symbol: str
27+
tempo: int
28+
last_step: int
29+
blocks_since_last_step: int
30+
emission: Balance
31+
alpha_in: Balance
32+
alpha_out: Balance
33+
tao_in: Balance
34+
price: Balance
35+
k: float
36+
is_dynamic: bool
37+
alpha_out_emission: Balance
38+
alpha_in_emission: Balance
39+
tao_in_emission: Balance
40+
pending_alpha_emission: Balance
41+
pending_root_emission: Balance
42+
network_registered_at: int
43+
subnet_identity: Optional[SubnetIdentity]
44+
45+
@classmethod
46+
def from_vec_u8(cls, vec_u8: list[int]) -> Optional["DynamicInfo"]:
47+
if len(vec_u8) == 0:
48+
return None
49+
decoded = from_scale_encoding(vec_u8, ChainDataType.DynamicInfo)
50+
if decoded is None:
51+
return None
52+
return DynamicInfo.fix_decoded_values(decoded)
53+
54+
@classmethod
55+
def list_from_vec_u8(cls, vec_u8: Union[list[int], bytes]) -> list["DynamicInfo"]:
56+
decoded = from_scale_encoding(
57+
vec_u8, ChainDataType.DynamicInfo, is_vec=True, is_option=True
58+
)
59+
if decoded is None:
60+
return []
61+
decoded = [DynamicInfo.fix_decoded_values(d) for d in decoded]
62+
return decoded
63+
64+
@classmethod
65+
def fix_decoded_values(cls, decoded: dict) -> "DynamicInfo":
66+
"""Returns a DynamicInfo object from a decoded DynamicInfo dictionary."""
67+
68+
netuid = int(decoded["netuid"])
69+
symbol = bytes([int(b) for b in decoded["token_symbol"]]).decode()
70+
subnet_name = bytes([int(b) for b in decoded["subnet_name"]]).decode()
71+
72+
is_dynamic = (
73+
True if int(decoded["netuid"]) > 0 else False
74+
) # Root is not dynamic
75+
76+
owner_hotkey = ss58_encode(decoded["owner_hotkey"], SS58_FORMAT)
77+
owner_coldkey = ss58_encode(decoded["owner_coldkey"], SS58_FORMAT)
78+
79+
emission = Balance.from_rao(decoded["emission"]).set_unit(0)
80+
alpha_in = Balance.from_rao(decoded["alpha_in"]).set_unit(netuid)
81+
alpha_out = Balance.from_rao(decoded["alpha_out"]).set_unit(netuid)
82+
tao_in = Balance.from_rao(decoded["tao_in"]).set_unit(0)
83+
alpha_out_emission = Balance.from_rao(decoded["alpha_out_emission"]).set_unit(
84+
netuid
85+
)
86+
alpha_in_emission = Balance.from_rao(decoded["alpha_in_emission"]).set_unit(
87+
netuid
88+
)
89+
tao_in_emission = Balance.from_rao(decoded["tao_in_emission"]).set_unit(0)
90+
pending_alpha_emission = Balance.from_rao(
91+
decoded["pending_alpha_emission"]
92+
).set_unit(netuid)
93+
pending_root_emission = Balance.from_rao(
94+
decoded["pending_root_emission"]
95+
).set_unit(0)
96+
97+
price = (
98+
Balance.from_tao(1.0)
99+
if netuid == 0
100+
else Balance.from_tao(tao_in.tao / alpha_in.tao)
101+
if alpha_in.tao > 0
102+
else Balance.from_tao(1)
103+
) # Root always has 1-1 price
104+
105+
if decoded.get("subnet_identity"):
106+
subnet_identity = SubnetIdentity(
107+
subnet_name=decoded["subnet_identity"]["subnet_name"],
108+
github_repo=decoded["subnet_identity"]["github_repo"],
109+
subnet_contact=decoded["subnet_identity"]["subnet_contact"],
110+
)
111+
else:
112+
subnet_identity = None
113+
114+
return cls(
115+
netuid=netuid,
116+
owner_hotkey=owner_hotkey,
117+
owner_coldkey=owner_coldkey,
118+
subnet_name=subnet_name,
119+
symbol=symbol,
120+
tempo=int(decoded["tempo"]),
121+
last_step=int(decoded["last_step"]),
122+
blocks_since_last_step=int(decoded["blocks_since_last_step"]),
123+
emission=emission,
124+
alpha_in=alpha_in,
125+
alpha_out=alpha_out,
126+
tao_in=tao_in,
127+
k=tao_in.rao * alpha_in.rao,
128+
is_dynamic=is_dynamic,
129+
price=price,
130+
alpha_out_emission=alpha_out_emission,
131+
alpha_in_emission=alpha_in_emission,
132+
tao_in_emission=tao_in_emission,
133+
pending_alpha_emission=pending_alpha_emission,
134+
pending_root_emission=pending_root_emission,
135+
network_registered_at=int(decoded["network_registered_at"]),
136+
subnet_identity=subnet_identity,
137+
)

bittensor/core/chain_data/stake_info.py

+11-1
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,25 @@ class StakeInfo:
2525

2626
hotkey_ss58: str # Hotkey address
2727
coldkey_ss58: str # Coldkey address
28+
netuid: int # Network UID
2829
stake: Balance # Stake for the hotkey-coldkey pair
30+
locked: Balance # Stake which is locked.
31+
emission: Balance # Emission for the hotkey-coldkey pair
32+
drain: int
33+
is_registered: bool
2934

3035
@classmethod
3136
def fix_decoded_values(cls, decoded: Any) -> "StakeInfo":
3237
"""Fixes the decoded values."""
3338
return cls(
3439
hotkey_ss58=ss58_encode(decoded["hotkey"], SS58_FORMAT),
3540
coldkey_ss58=ss58_encode(decoded["coldkey"], SS58_FORMAT),
36-
stake=Balance.from_rao(decoded["stake"]),
41+
netuid=int(decoded["netuid"]),
42+
stake=Balance.from_rao(decoded["stake"]).set_unit(decoded["netuid"]),
43+
locked=Balance.from_rao(decoded["locked"]).set_unit(decoded["netuid"]),
44+
emission=Balance.from_rao(decoded["emission"]).set_unit(decoded["netuid"]),
45+
drain=int(decoded["drain"]),
46+
is_registered=bool(decoded["is_registered"]),
3747
)
3848

3949
@classmethod
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from dataclasses import dataclass
2+
3+
4+
@dataclass
5+
class SubnetIdentity:
6+
"""Dataclass for subnet identity information."""
7+
8+
subnet_name: str
9+
github_repo: str
10+
subnet_contact: str
11+
12+
# TODO: Add other methods when fetching from chain

bittensor/core/chain_data/utils.py

+39
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class ChainDataType(Enum):
2424
AccountId = 10
2525
NeuronCertificate = 11
2626
SubnetState = 12
27+
DynamicInfo = 13
28+
SubnetIdentity = 14
2729

2830

2931
def from_scale_encoding(
@@ -244,7 +246,12 @@ def from_scale_encoding_using_type_string(
244246
"type_mapping": [
245247
["hotkey", "AccountId"],
246248
["coldkey", "AccountId"],
249+
["netuid", "Compact<u16>"],
247250
["stake", "Compact<u64>"],
251+
["locked", "Compact<u64>"],
252+
["emission", "Compact<u64>"],
253+
["drain", "Compact<u64>"],
254+
["is_registered", "bool"],
248255
],
249256
},
250257
"SubnetHyperparameters": {
@@ -287,6 +294,38 @@ def from_scale_encoding_using_type_string(
287294
["arbitration_block", "Compact<u64>"],
288295
],
289296
},
297+
"SubnetIdentity": {
298+
"type": "struct",
299+
"type_mapping": [
300+
["subnet_name", "Vec<u8>"],
301+
["github_repo", "Vec<u8>"],
302+
["subnet_contact", "Vec<u8>"],
303+
],
304+
},
305+
"DynamicInfo": {
306+
"type": "struct",
307+
"type_mapping": [
308+
["netuid", "Compact<u16>"],
309+
["owner_hotkey", "AccountId"],
310+
["owner_coldkey", "AccountId"],
311+
["subnet_name", "Vec<Compact<u8>>"],
312+
["token_symbol", "Vec<Compact<u8>>"],
313+
["tempo", "Compact<u16>"],
314+
["last_step", "Compact<u64>"],
315+
["blocks_since_last_step", "Compact<u64>"],
316+
["emission", "Compact<u64>"],
317+
["alpha_in", "Compact<u64>"],
318+
["alpha_out", "Compact<u64>"],
319+
["tao_in", "Compact<u64>"],
320+
["alpha_out_emission", "Compact<u64>"],
321+
["alpha_in_emission", "Compact<u64>"],
322+
["tao_in_emission", "Compact<u64>"],
323+
["pending_alpha_emission", "Compact<u64>"],
324+
["pending_root_emission", "Compact<u64>"],
325+
["network_registered_at", "Compact<u64>"],
326+
["subnet_identity", "Option<SubnetIdentity>"],
327+
],
328+
},
290329
}
291330
}
292331

0 commit comments

Comments
 (0)