3
3
from typing import Optional
4
4
5
5
from bittensor_wallet import Wallet
6
- from rich .prompt import Confirm , Prompt , IntPrompt
6
+ from rich .prompt import Confirm , IntPrompt , FloatPrompt
7
7
from rich .table import Table
8
8
from rich .text import Text
9
9
from async_substrate_interface .errors import SubstrateRequestException
@@ -671,8 +671,13 @@ async def childkey_take(
671
671
wait_for_inclusion : bool = True ,
672
672
wait_for_finalization : bool = True ,
673
673
prompt : bool = True ,
674
- ):
675
- """Get or Set childkey take."""
674
+ ) -> list [tuple [Optional [int ], bool ]]:
675
+ """
676
+ Get or Set childkey take.
677
+
678
+ Returns:
679
+ List of (netuid, success) for specified netuid (or all) and their success in setting take
680
+ """
676
681
677
682
def validate_take_value (take_value : float ) -> bool :
678
683
if not (0 <= take_value <= 0.18 ):
@@ -682,20 +687,7 @@ def validate_take_value(take_value: float) -> bool:
682
687
return False
683
688
return True
684
689
685
- def print_all_takes (takes : list [tuple [int , float ]], ss58 : str ):
686
- """Print table with netuids and Takes"""
687
- table = Table (
688
- title = f"Current Child Takes for [bright_magenta]{ ss58 } [/bright_magenta]"
689
- )
690
- table .add_column ("Netuid" , justify = "center" , style = "cyan" )
691
- table .add_column ("Take (%)" , justify = "right" , style = "magenta" )
692
-
693
- for take_netuid , take_value in takes :
694
- table .add_row (str (take_netuid ), f"{ take_value :.2f} %" )
695
-
696
- console .print (table )
697
-
698
- async def display_chk_take (ss58 , take_netuid ):
690
+ async def display_chk_take (ss58 , take_netuid ) -> float :
699
691
"""Print single key take for hotkey and netuid"""
700
692
chk_take = await get_childkey_take (
701
693
subtensor = subtensor , netuid = take_netuid , hotkey = ss58
@@ -706,6 +698,7 @@ async def display_chk_take(ss58, take_netuid):
706
698
console .print (
707
699
f"Child take for { ss58 } is: { chk_take * 100 :.2f} % on netuid { take_netuid } ."
708
700
)
701
+ return chk_take
709
702
710
703
async def chk_all_subnets (ss58 ):
711
704
"""Aggregate data for childkey take from all subnets"""
@@ -720,10 +713,18 @@ async def chk_all_subnets(ss58):
720
713
if curr_take is not None :
721
714
take_value = u16_to_float (curr_take )
722
715
takes .append ((subnet , take_value * 100 ))
716
+ table = Table (
717
+ title = f"Current Child Takes for [bright_magenta]{ ss58 } [/bright_magenta]"
718
+ )
719
+ table .add_column ("Netuid" , justify = "center" , style = "cyan" )
720
+ table .add_column ("Take (%)" , justify = "right" , style = "magenta" )
721
+
722
+ for take_netuid , take_value in takes :
723
+ table .add_row (str (take_netuid ), f"{ take_value :.2f} %" )
723
724
724
- print_all_takes ( takes , ss58 )
725
+ console . print ( table )
725
726
726
- async def set_chk_take_subnet (subnet , chk_take ) :
727
+ async def set_chk_take_subnet (subnet : int , chk_take : float ) -> bool :
727
728
"""Set the childkey take for a single subnet"""
728
729
success , message = await set_childkey_take_extrinsic (
729
730
subtensor = subtensor ,
@@ -741,84 +742,82 @@ async def set_chk_take_subnet(subnet, chk_take):
741
742
console .print (
742
743
f"The childkey take for { wallet .hotkey .ss58_address } is now set to { take * 100 :.2f} %."
743
744
)
745
+ return True
744
746
else :
745
747
console .print (
746
748
f":cross_mark:[red] Unable to set childkey take.[/red] { message } "
747
749
)
750
+ return False
748
751
749
752
# Print childkey take for other user and return (dont offer to change take rate)
750
- if hotkey and hotkey != wallet .hotkey .ss58_address :
753
+ if not hotkey or hotkey == wallet .hotkey .ss58_address :
754
+ hotkey = wallet .hotkey .ss58_address
755
+ if hotkey != wallet .hotkey .ss58_address or not take :
751
756
# display childkey take for other users
752
757
if netuid :
753
758
await display_chk_take (hotkey , netuid )
754
759
if take :
755
760
console .print (
756
761
f"Hotkey { hotkey } not associated with wallet { wallet .name } ."
757
762
)
758
- return
763
+ return [( netuid , False )]
759
764
else :
760
- # show childhotkey take on all subnets
765
+ # show child hotkey take on all subnets
761
766
await chk_all_subnets (hotkey )
762
767
if take :
763
768
console .print (
764
769
f"Hotkey { hotkey } not associated with wallet { wallet .name } ."
765
770
)
766
- return
771
+ return [( netuid , False )]
767
772
768
773
# Validate child SS58 addresses
769
774
if not take :
770
- # print current Take, ask if change
771
- if netuid :
772
- await display_chk_take (wallet .hotkey .ss58_address , netuid )
773
- else :
774
- # print take from all netuids
775
- await chk_all_subnets (wallet .hotkey .ss58_address )
776
-
777
775
if not Confirm .ask ("Would you like to change the child take?" ):
778
- return
779
- new_take_str = Prompt .ask ("Enter the new take value (between 0 and 0.18)" )
780
- try :
781
- new_take_value = float (new_take_str )
782
- if not validate_take_value (new_take_value ):
783
- return
784
- except ValueError :
785
- err_console .print (
786
- ":cross_mark:[red] Invalid input. Please enter a number between 0 and 0.18.[/red]"
776
+ return [(netuid , False )]
777
+ new_take_value = - 1.0
778
+ while not validate_take_value (new_take_value ):
779
+ new_take_value = FloatPrompt .ask (
780
+ "Enter the new take value (between 0 and 0.18)"
787
781
)
788
- return
789
782
take = new_take_value
790
783
else :
791
784
if not validate_take_value (take ):
792
- return
785
+ return [( netuid , False )]
793
786
794
787
if netuid :
795
- await set_chk_take_subnet (subnet = netuid , chk_take = take )
796
- return
788
+ return [(netuid , await set_chk_take_subnet (subnet = netuid , chk_take = take ))]
797
789
else :
798
790
new_take_netuids = IntPrompt .ask (
799
791
"Enter netuid (leave blank for all)" , default = None , show_default = True
800
792
)
801
793
802
794
if new_take_netuids :
803
- await set_chk_take_subnet (subnet = new_take_netuids , chk_take = take )
804
- return
795
+ return [
796
+ (
797
+ new_take_netuids ,
798
+ await set_chk_take_subnet (subnet = new_take_netuids , chk_take = take ),
799
+ )
800
+ ]
805
801
806
802
else :
807
803
netuids = await subtensor .get_all_subnet_netuids ()
808
- for netuid in netuids :
809
- if netuid == 0 :
804
+ output_list = []
805
+ for netuid_ in netuids :
806
+ if netuid_ == 0 :
810
807
continue
811
- console .print (f"Sending to netuid { netuid } take of { take * 100 :.2f} %" )
812
- await set_childkey_take_extrinsic (
808
+ console .print (f"Sending to netuid { netuid_ } take of { take * 100 :.2f} %" )
809
+ result = await set_childkey_take_extrinsic (
813
810
subtensor = subtensor ,
814
811
wallet = wallet ,
815
- netuid = netuid ,
812
+ netuid = netuid_ ,
816
813
hotkey = wallet .hotkey .ss58_address ,
817
814
take = take ,
818
815
prompt = prompt ,
819
816
wait_for_inclusion = True ,
820
817
wait_for_finalization = False ,
821
818
)
819
+ output_list .append ((netuid_ , result ))
822
820
console .print (
823
821
f":white_heavy_check_mark: [green]Sent childkey take of { take * 100 :.2f} % to all subnets.[/green]"
824
822
)
823
+ return output_list
0 commit comments