Skip to content

Commit 91e10ab

Browse files
authored
Merge pull request #2397 from opentensor/release/8.2.1
Release/8.2.1
2 parents 5edcee4 + 39d4681 commit 91e10ab

39 files changed

+3623
-1228
lines changed

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,23 @@
11
# Changelog
22

3+
## 8.2.1 /2024-11-06
4+
5+
## What's Changed
6+
7+
* Expands the type registry to include all the available options by @thewhaleking in https://github.com/opentensor/bittensor/pull/2353
8+
* add `Subtensor.register`, `Subtensor.difficulty` and related staff with tests by @roman-opentensor in https://github.com/opentensor/bittensor/pull/2352
9+
* added to Subtensor: `burned_register`, `get_subnet_burn_cost`, `recycle` and related extrinsics by @roman-opentensor in https://github.com/opentensor/bittensor/pull/2359
10+
* Poem "Risen from the Past". Act 3. by @roman-opentensor in https://github.com/opentensor/bittensor/pull/2363
11+
* default port from 9946 to 9944 by @roman-opentensor in https://github.com/opentensor/bittensor/pull/2376
12+
* remove unused prometheus extrinsic by @roman-opentensor in https://github.com/opentensor/bittensor/pull/2378
13+
* Replace rich.console to btlogging.loggin by @roman-opentensor in https://github.com/opentensor/bittensor/pull/2377
14+
* Backmerge 8.2.0 by @ibraheem-opentensor in https://github.com/opentensor/bittensor/pull/2389
15+
* Add subvortex subnet and tests by @roman-opentensor in https://github.com/opentensor/bittensor/pull/2395
16+
* Handle SSL Error on Connection by @thewhaleking in https://github.com/opentensor/bittensor/pull/2384
17+
* Avoid using prompt in SDK by @roman-opentensor in https://github.com/opentensor/bittensor/pull/2382
18+
19+
**Full Changelog**: https://github.com/opentensor/bittensor/compare/v8.2.0...v8.2.1
20+
321
## 8.2.0 /2024-10-10
422

523
## What's Changed
Lines changed: 69 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
from dataclasses import dataclass
2-
from typing import Optional, Any
1+
import bt_decode
32

4-
from scalecodec.utils.ss58 import ss58_encode
3+
from dataclasses import dataclass
4+
from typing import Optional
55

6-
from bittensor.core.chain_data.utils import from_scale_encoding, ChainDataType
7-
from bittensor.core.settings import SS58_FORMAT
6+
from bittensor.core.chain_data.utils import decode_account_id
87
from bittensor.utils import u16_normalized_float
98
from bittensor.utils.balance import Balance
109

@@ -24,7 +23,6 @@ class DelegateInfo:
2423
validator_permits (list[int]): List of subnets that the delegate is allowed to validate on.
2524
return_per_1000 (int): Return per 1000 TAO, for the delegate over a day.
2625
total_daily_return (int): Total daily return of the delegate.
27-
2826
"""
2927

3028
hotkey_ss58: str # Hotkey of delegate
@@ -37,69 +35,78 @@ class DelegateInfo:
3735
validator_permits: list[
3836
int
3937
] # List of subnets that the delegate is allowed to validate on
40-
registrations: tuple[int] # List of subnets that the delegate is registered on
38+
registrations: list[int] # list of subnets that the delegate is registered on
4139
return_per_1000: Balance # Return per 1000 tao of the delegate over a day
4240
total_daily_return: Balance # Total daily return of the delegate
4341

4442
@classmethod
45-
def fix_decoded_values(cls, decoded: Any) -> "DelegateInfo":
46-
"""Fixes the decoded values."""
47-
48-
return cls(
49-
hotkey_ss58=ss58_encode(decoded["delegate_ss58"], SS58_FORMAT),
50-
owner_ss58=ss58_encode(decoded["owner_ss58"], SS58_FORMAT),
51-
take=u16_normalized_float(decoded["take"]),
52-
nominators=[
53-
(
54-
ss58_encode(nom[0], SS58_FORMAT),
55-
Balance.from_rao(nom[1]),
56-
)
57-
for nom in decoded["nominators"]
58-
],
59-
total_stake=Balance.from_rao(
60-
sum([nom[1] for nom in decoded["nominators"]])
61-
),
62-
validator_permits=decoded["validator_permits"],
63-
registrations=decoded["registrations"],
64-
return_per_1000=Balance.from_rao(decoded["return_per_1000"]),
65-
total_daily_return=Balance.from_rao(decoded["total_daily_return"]),
43+
def from_vec_u8(cls, vec_u8: bytes) -> Optional["DelegateInfo"]:
44+
decoded = bt_decode.DelegateInfo.decode(vec_u8)
45+
hotkey = decode_account_id(decoded.delegate_ss58)
46+
owner = decode_account_id(decoded.owner_ss58)
47+
nominators = [
48+
(decode_account_id(x), Balance.from_rao(y)) for x, y in decoded.nominators
49+
]
50+
total_stake = sum((x[1] for x in nominators)) if nominators else Balance(0)
51+
return DelegateInfo(
52+
hotkey_ss58=hotkey,
53+
total_stake=total_stake,
54+
nominators=nominators,
55+
owner_ss58=owner,
56+
take=u16_normalized_float(decoded.take),
57+
validator_permits=decoded.validator_permits,
58+
registrations=decoded.registrations,
59+
return_per_1000=Balance.from_rao(decoded.return_per_1000),
60+
total_daily_return=Balance.from_rao(decoded.total_daily_return),
6661
)
6762

6863
@classmethod
69-
def from_vec_u8(cls, vec_u8: list[int]) -> Optional["DelegateInfo"]:
70-
"""Returns a DelegateInfo object from a ``vec_u8``."""
71-
if len(vec_u8) == 0:
72-
return None
73-
74-
decoded = from_scale_encoding(vec_u8, ChainDataType.DelegateInfo)
75-
if decoded is None:
76-
return None
77-
78-
return DelegateInfo.fix_decoded_values(decoded)
79-
80-
@classmethod
81-
def list_from_vec_u8(cls, vec_u8: list[int]) -> list["DelegateInfo"]:
82-
"""Returns a list of DelegateInfo objects from a ``vec_u8``."""
83-
decoded = from_scale_encoding(vec_u8, ChainDataType.DelegateInfo, is_vec=True)
84-
85-
if decoded is None:
86-
return []
87-
88-
return [DelegateInfo.fix_decoded_values(d) for d in decoded]
64+
def list_from_vec_u8(cls, vec_u8: bytes) -> list["DelegateInfo"]:
65+
decoded = bt_decode.DelegateInfo.decode_vec(vec_u8)
66+
results = []
67+
for d in decoded:
68+
hotkey = decode_account_id(d.delegate_ss58)
69+
owner = decode_account_id(d.owner_ss58)
70+
nominators = [
71+
(decode_account_id(x), Balance.from_rao(y)) for x, y in d.nominators
72+
]
73+
total_stake = sum((x[1] for x in nominators)) if nominators else Balance(0)
74+
results.append(
75+
DelegateInfo(
76+
hotkey_ss58=hotkey,
77+
total_stake=total_stake,
78+
nominators=nominators,
79+
owner_ss58=owner,
80+
take=u16_normalized_float(d.take),
81+
validator_permits=d.validator_permits,
82+
registrations=d.registrations,
83+
return_per_1000=Balance.from_rao(d.return_per_1000),
84+
total_daily_return=Balance.from_rao(d.total_daily_return),
85+
)
86+
)
87+
return results
8988

9089
@classmethod
9190
def delegated_list_from_vec_u8(
92-
cls, vec_u8: list[int]
93-
) -> list[tuple["DelegateInfo", "Balance"]]:
94-
"""Returns a list of Tuples of DelegateInfo objects, and Balance, from a ``vec_u8``.
95-
96-
This is the list of delegates that the user has delegated to, and the amount of stake delegated.
97-
"""
98-
decoded = from_scale_encoding(vec_u8, ChainDataType.DelegatedInfo, is_vec=True)
99-
if decoded is None:
100-
return []
101-
102-
return [
103-
(DelegateInfo.fix_decoded_values(d), Balance.from_rao(s))
104-
for d, s in decoded
105-
]
91+
cls, vec_u8: bytes
92+
) -> list[tuple["DelegateInfo", Balance]]:
93+
decoded = bt_decode.DelegateInfo.decode_delegated(vec_u8)
94+
results = []
95+
for d, b in decoded:
96+
nominators = [
97+
(decode_account_id(x), Balance.from_rao(y)) for x, y in d.nominators
98+
]
99+
total_stake = sum((x[1] for x in nominators)) if nominators else Balance(0)
100+
delegate = DelegateInfo(
101+
hotkey_ss58=decode_account_id(d.delegate_ss58),
102+
total_stake=total_stake,
103+
nominators=nominators,
104+
owner_ss58=decode_account_id(d.owner_ss58),
105+
take=u16_normalized_float(d.take),
106+
validator_permits=d.validator_permits,
107+
registrations=d.registrations,
108+
return_per_1000=Balance.from_rao(d.return_per_1000),
109+
total_daily_return=Balance.from_rao(d.total_daily_return),
110+
)
111+
results.append((delegate, Balance.from_rao(b)))
112+
return results
Lines changed: 32 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
from dataclasses import dataclass
2-
from typing import Any, Optional, Union
32

4-
from scalecodec.utils.ss58 import ss58_encode
3+
import bt_decode
54

6-
from bittensor.core.chain_data.utils import from_scale_encoding, ChainDataType
7-
from bittensor.core.settings import SS58_FORMAT
5+
from bittensor.core.chain_data.utils import decode_account_id
86
from bittensor.utils import u16_normalized_float
97
from bittensor.utils.balance import Balance
10-
from bittensor.utils.registration import torch, use_torch
118

129

1310
@dataclass
@@ -28,76 +25,39 @@ class SubnetInfo:
2825
blocks_since_epoch: int
2926
tempo: int
3027
modality: int
31-
# netuid -> topk percentile prunning score requirement (u16:MAX normalized.)
3228
connection_requirements: dict[str, float]
3329
emission_value: float
3430
burn: Balance
3531
owner_ss58: str
3632

3733
@classmethod
38-
def from_vec_u8(cls, vec_u8: list[int]) -> Optional["SubnetInfo"]:
39-
"""Returns a SubnetInfo object from a ``vec_u8``."""
40-
if len(vec_u8) == 0:
41-
return None
42-
43-
decoded = from_scale_encoding(vec_u8, ChainDataType.SubnetInfo)
44-
if decoded is None:
45-
return None
46-
47-
return SubnetInfo.fix_decoded_values(decoded)
48-
49-
@classmethod
50-
def list_from_vec_u8(cls, vec_u8: list[int]) -> list["SubnetInfo"]:
51-
"""Returns a list of SubnetInfo objects from a ``vec_u8``."""
52-
decoded = from_scale_encoding(
53-
vec_u8, ChainDataType.SubnetInfo, is_vec=True, is_option=True
54-
)
55-
56-
if decoded is None:
57-
return []
58-
59-
return [SubnetInfo.fix_decoded_values(d) for d in decoded]
60-
61-
@classmethod
62-
def fix_decoded_values(cls, decoded: dict) -> "SubnetInfo":
63-
"""Returns a SubnetInfo object from a decoded SubnetInfo dictionary."""
64-
return SubnetInfo(
65-
netuid=decoded["netuid"],
66-
rho=decoded["rho"],
67-
kappa=decoded["kappa"],
68-
difficulty=decoded["difficulty"],
69-
immunity_period=decoded["immunity_period"],
70-
max_allowed_validators=decoded["max_allowed_validators"],
71-
min_allowed_weights=decoded["min_allowed_weights"],
72-
max_weight_limit=decoded["max_weights_limit"],
73-
scaling_law_power=decoded["scaling_law_power"],
74-
subnetwork_n=decoded["subnetwork_n"],
75-
max_n=decoded["max_allowed_uids"],
76-
blocks_since_epoch=decoded["blocks_since_last_step"],
77-
tempo=decoded["tempo"],
78-
modality=decoded["network_modality"],
79-
connection_requirements={
80-
str(int(netuid)): u16_normalized_float(int(req))
81-
for netuid, req in decoded["network_connect"]
82-
},
83-
emission_value=decoded["emission_values"],
84-
burn=Balance.from_rao(decoded["burn"]),
85-
owner_ss58=ss58_encode(decoded["owner"], SS58_FORMAT),
86-
)
87-
88-
def to_parameter_dict(self) -> Union[dict[str, Any], "torch.nn.ParameterDict"]:
89-
"""Returns a torch tensor or dict of the subnet info."""
90-
if use_torch():
91-
return torch.nn.ParameterDict(self.__dict__)
92-
else:
93-
return self.__dict__
94-
95-
@classmethod
96-
def from_parameter_dict(
97-
cls, parameter_dict: Union[dict[str, Any], "torch.nn.ParameterDict"]
98-
) -> "SubnetInfo":
99-
"""Creates a SubnetInfo instance from a parameter dictionary."""
100-
if use_torch():
101-
return cls(**dict(parameter_dict))
102-
else:
103-
return cls(**parameter_dict)
34+
def list_from_vec_u8(cls, vec_u8: bytes) -> list["SubnetInfo"]:
35+
decoded = bt_decode.SubnetInfo.decode_vec_option(vec_u8)
36+
result = []
37+
for d in decoded:
38+
result.append(
39+
SubnetInfo(
40+
netuid=d.netuid,
41+
rho=d.rho,
42+
kappa=d.kappa,
43+
difficulty=d.difficulty,
44+
immunity_period=d.immunity_period,
45+
max_allowed_validators=d.max_allowed_validators,
46+
min_allowed_weights=d.min_allowed_weights,
47+
max_weight_limit=d.max_weights_limit,
48+
scaling_law_power=d.scaling_law_power,
49+
subnetwork_n=d.subnetwork_n,
50+
max_n=d.max_allowed_uids,
51+
blocks_since_epoch=d.blocks_since_last_step,
52+
tempo=d.tempo,
53+
modality=d.network_modality,
54+
connection_requirements={
55+
str(int(netuid)): u16_normalized_float(int(req))
56+
for (netuid, req) in d.network_connect
57+
},
58+
emission_value=d.emission_values,
59+
burn=Balance.from_rao(d.burn),
60+
owner_ss58=decode_account_id(d.owner),
61+
)
62+
)
63+
return result

bittensor/core/chain_data/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ def from_scale_encoding_using_type_string(
260260
}
261261

262262

263-
def decode_account_id(account_id_bytes: list) -> str:
263+
def decode_account_id(account_id_bytes: Union[bytes, str]) -> str:
264264
"""
265265
Decodes an AccountId from bytes to a Base64 string using SS58 encoding.
266266

bittensor/core/config.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -97,18 +97,6 @@ def __init__(
9797
# this can fail if --no_version_checking has already been added.
9898
pass
9999

100-
try:
101-
parser.add_argument(
102-
"--no_prompt",
103-
dest="no_prompt",
104-
action="store_true",
105-
help="Set ``true`` to stop cli from prompting the user.",
106-
default=False,
107-
)
108-
except Exception:
109-
# this can fail if --no_version_checking has already been added.
110-
pass
111-
112100
# Get args from argv if not passed in.
113101
if args is None:
114102
args = sys.argv[1:]

0 commit comments

Comments
 (0)