meshtensor-cli 9.20.0__tar.gz → 9.22.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/PKG-INFO +1 -1
  2. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/cli.py +120 -0
  3. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/governance/governance.py +161 -0
  4. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/pyproject.toml +1 -1
  5. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/README.md +0 -0
  6. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/__init__.py +0 -0
  7. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/doc_generation_helper.py +0 -0
  8. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/__init__.py +0 -0
  9. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/__init__.py +0 -0
  10. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/axon/__init__.py +0 -0
  11. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/axon/axon.py +0 -0
  12. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/crowd/__init__.py +0 -0
  13. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/crowd/contribute.py +0 -0
  14. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/crowd/contributors.py +0 -0
  15. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/crowd/create.py +0 -0
  16. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/crowd/dissolve.py +0 -0
  17. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/crowd/refund.py +0 -0
  18. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/crowd/update.py +0 -0
  19. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/crowd/utils.py +0 -0
  20. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/crowd/view.py +0 -0
  21. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/governance/__init__.py +0 -0
  22. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/liquidity/__init__.py +0 -0
  23. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/liquidity/liquidity.py +0 -0
  24. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/liquidity/utils.py +0 -0
  25. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/proxy.py +0 -0
  26. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/stake/__init__.py +0 -0
  27. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/stake/add.py +0 -0
  28. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/stake/auto_staking.py +0 -0
  29. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/stake/children_hotkeys.py +0 -0
  30. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/stake/claim.py +0 -0
  31. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/stake/list.py +0 -0
  32. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/stake/move.py +0 -0
  33. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/stake/remove.py +0 -0
  34. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/stake/wizard.py +0 -0
  35. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/subnets/__init__.py +0 -0
  36. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/subnets/mechanisms.py +0 -0
  37. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/subnets/price.py +0 -0
  38. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/subnets/subnets.py +0 -0
  39. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/sudo.py +0 -0
  40. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/tc/__init__.py +0 -0
  41. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/tc/tc.py +0 -0
  42. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/treasury/__init__.py +0 -0
  43. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/treasury/treasury.py +0 -0
  44. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/view.py +0 -0
  45. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/wallets.py +0 -0
  46. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/commands/weights.py +0 -0
  47. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/__init__.py +0 -0
  48. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/balances.py +0 -0
  49. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/chain_data.py +0 -0
  50. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/extrinsics/__init__.py +0 -0
  51. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/extrinsics/mev_shield.py +0 -0
  52. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/extrinsics/registration.py +0 -0
  53. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/extrinsics/root.py +0 -0
  54. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/extrinsics/serving.py +0 -0
  55. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/extrinsics/transfer.py +0 -0
  56. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/meshtensor_interface.py +0 -0
  57. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/minigraph.py +0 -0
  58. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/networking.py +0 -0
  59. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/templates/main-filters.j2 +0 -0
  60. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/templates/main-header.j2 +0 -0
  61. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/templates/neuron-details.j2 +0 -0
  62. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/templates/price-multi.j2 +0 -0
  63. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/templates/price-single.j2 +0 -0
  64. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/templates/subnet-details-header.j2 +0 -0
  65. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/templates/subnet-details.j2 +0 -0
  66. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/templates/subnet-metrics.j2 +0 -0
  67. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/templates/subnets-table.j2 +0 -0
  68. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/templates/table.j2 +0 -0
  69. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/templates/view.css +0 -0
  70. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/templates/view.j2 +0 -0
  71. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/templates/view.js +0 -0
  72. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/src/meshtensor/utils.py +0 -0
  73. {meshtensor_cli-9.20.0 → meshtensor_cli-9.22.0}/meshtensor_cli/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshtensor-cli
3
- Version: 9.20.0
3
+ Version: 9.22.0
4
4
  Summary: Meshtensor CLI
5
5
  Author: meshtensor.com
6
6
  Requires-Python: >=3.9
@@ -1437,6 +1437,10 @@ class CLIManager:
1437
1437
  self.governance_app.command("set-track-coefficients")(self.governance_set_track_coefficients)
1438
1438
  self.governance_app.command("set-config")(self.governance_set_config)
1439
1439
  self.governance_app.command("set-golr-config")(self.governance_set_golr_config)
1440
+ self.governance_app.command("prune-accounts")(self.governance_prune_accounts)
1441
+ self.governance_app.command("endorse")(self.governance_endorse)
1442
+ self.governance_app.command("cancel")(self.governance_cancel)
1443
+ self.governance_app.command("approve-treasury")(self.governance_approve_treasury)
1440
1444
 
1441
1445
  # Treasury commands
1442
1446
  self.treasury_app.command("propose")(self.treasury_propose)
@@ -10734,6 +10738,122 @@ class CLIManager:
10734
10738
  )
10735
10739
  )
10736
10740
 
10741
+ def governance_prune_accounts(
10742
+ self,
10743
+ accounts: list[str] = typer.Option(
10744
+ ..., "--accounts", help="SS58 addresses to prune (max 500)."
10745
+ ),
10746
+ network: Optional[list[str]] = Options.network,
10747
+ wallet_name: str = Options.wallet_name,
10748
+ wallet_path: str = Options.wallet_path,
10749
+ quiet: bool = Options.quiet,
10750
+ verbose: bool = Options.verbose,
10751
+ ):
10752
+ """Prune governance storage for zero-balance accounts (Root-only)."""
10753
+ self.verbosity_handler(quiet, verbose)
10754
+ wallet = self.wallet_ask(
10755
+ wallet_name,
10756
+ wallet_path,
10757
+ ask_for=[WO.NAME, WO.PATH],
10758
+ validate=WV.WALLET,
10759
+ )
10760
+ return self._run_command(
10761
+ governance.governance_prune_accounts(
10762
+ subtensor=self.initialize_chain(network),
10763
+ wallet=wallet,
10764
+ accounts=accounts,
10765
+ quiet=quiet,
10766
+ verbose=verbose,
10767
+ )
10768
+ )
10769
+
10770
+ def governance_endorse(
10771
+ self,
10772
+ ref_index: int = typer.Option(
10773
+ ..., "--ref-index", help="Referendum index to endorse."
10774
+ ),
10775
+ network: Optional[list[str]] = Options.network,
10776
+ wallet_name: str = Options.wallet_name,
10777
+ wallet_path: str = Options.wallet_path,
10778
+ quiet: bool = Options.quiet,
10779
+ verbose: bool = Options.verbose,
10780
+ ):
10781
+ """Endorse a referendum as a Technical Committee member."""
10782
+ self.verbosity_handler(quiet, verbose)
10783
+ wallet = self.wallet_ask(
10784
+ wallet_name,
10785
+ wallet_path,
10786
+ ask_for=[WO.NAME, WO.PATH],
10787
+ validate=WV.WALLET,
10788
+ )
10789
+ return self._run_command(
10790
+ governance.governance_endorse(
10791
+ subtensor=self.initialize_chain(network),
10792
+ wallet=wallet,
10793
+ ref_index=ref_index,
10794
+ quiet=quiet,
10795
+ verbose=verbose,
10796
+ )
10797
+ )
10798
+
10799
+ def governance_cancel(
10800
+ self,
10801
+ ref_index: int = typer.Option(
10802
+ ..., "--ref-index", help="Referendum index to cancel."
10803
+ ),
10804
+ network: Optional[list[str]] = Options.network,
10805
+ wallet_name: str = Options.wallet_name,
10806
+ wallet_path: str = Options.wallet_path,
10807
+ quiet: bool = Options.quiet,
10808
+ verbose: bool = Options.verbose,
10809
+ ):
10810
+ """Cancel an active referendum (requires root origin)."""
10811
+ self.verbosity_handler(quiet, verbose)
10812
+ wallet = self.wallet_ask(
10813
+ wallet_name,
10814
+ wallet_path,
10815
+ ask_for=[WO.NAME, WO.PATH],
10816
+ validate=WV.WALLET,
10817
+ )
10818
+ return self._run_command(
10819
+ governance.governance_cancel(
10820
+ subtensor=self.initialize_chain(network),
10821
+ wallet=wallet,
10822
+ ref_index=ref_index,
10823
+ quiet=quiet,
10824
+ verbose=verbose,
10825
+ )
10826
+ )
10827
+
10828
+ def governance_approve_treasury(
10829
+ self,
10830
+ proposal_id: int = typer.Option(
10831
+ ..., "--proposal-id", help="Treasury proposal ID to approve."
10832
+ ),
10833
+ network: Optional[list[str]] = Options.network,
10834
+ wallet_name: str = Options.wallet_name,
10835
+ wallet_path: str = Options.wallet_path,
10836
+ quiet: bool = Options.quiet,
10837
+ verbose: bool = Options.verbose,
10838
+ ):
10839
+ """Approve a treasury proposal (requires root origin)."""
10840
+ self.verbosity_handler(quiet, verbose)
10841
+ wallet = self.wallet_ask(
10842
+ wallet_name,
10843
+ wallet_path,
10844
+ ask_for=[WO.NAME, WO.PATH],
10845
+ validate=WV.WALLET,
10846
+ )
10847
+ return self._run_command(
10848
+ governance.governance_approve_treasury(
10849
+ subtensor=self.initialize_chain(network),
10850
+ wallet=wallet,
10851
+ proposal_id=proposal_id,
10852
+ quiet=quiet,
10853
+ verbose=verbose,
10854
+ )
10855
+ )
10856
+
10737
10857
  # =========================================================================
10738
10858
  # Treasury commands
10739
10859
  # =========================================================================
@@ -1071,3 +1071,164 @@ async def governance_set_golr_config(
1071
1071
  print_error(f"Failed to set GoLR config: {response.error_message}")
1072
1072
  except Exception as e:
1073
1073
  print_error(f"Error setting GoLR config: {e}")
1074
+
1075
+
1076
+ # ============================================================================
1077
+ # meshcli governance prune-accounts
1078
+ # ============================================================================
1079
+
1080
+ async def governance_prune_accounts(
1081
+ subtensor: "MeshtensorInterface",
1082
+ wallet: Wallet,
1083
+ accounts: list[str],
1084
+ quiet: bool = False,
1085
+ verbose: bool = False,
1086
+ ):
1087
+ """Prune governance storage for zero-balance accounts.
1088
+
1089
+ Root-only: must be submitted through a governance referendum.
1090
+ Removes ContributionScore, GovernanceVoteCount, StakeDepositBlock,
1091
+ HasVotedThisEpoch, and PendingRewards for the specified accounts
1092
+ (only if their free balance is zero). Max 500 per call.
1093
+ """
1094
+
1095
+ if not quiet:
1096
+ console.print(f"\n[bold]Pruning {len(accounts)} Stale Accounts[/bold]")
1097
+
1098
+ if not confirm_action(f"Prune governance data for {len(accounts)} accounts?"):
1099
+ return
1100
+
1101
+ if not unlock_key(wallet):
1102
+ return
1103
+
1104
+ try:
1105
+ call = await subtensor.substrate.compose_call(
1106
+ call_module="MeshtensorGovernance",
1107
+ call_function="prune_stale_accounts",
1108
+ call_params={
1109
+ "accounts": accounts,
1110
+ },
1111
+ )
1112
+
1113
+ extrinsic = await subtensor.substrate.create_signed_extrinsic(
1114
+ call=call, keypair=wallet.coldkey
1115
+ )
1116
+ response = await subtensor.substrate.submit_extrinsic(
1117
+ extrinsic, wait_for_inclusion=True
1118
+ )
1119
+
1120
+ if response.is_success:
1121
+ print_success(f"Pruned governance data for stale accounts")
1122
+ print_extrinsic_id(response)
1123
+ else:
1124
+ print_error(f"Failed to prune accounts: {response.error_message}")
1125
+ except Exception as e:
1126
+ print_error(f"Error pruning accounts: {e}")
1127
+
1128
+
1129
+ # ============================================================================
1130
+ # meshcli governance endorse
1131
+ # ============================================================================
1132
+
1133
+ async def governance_endorse(
1134
+ subtensor: "MeshtensorInterface",
1135
+ wallet: Wallet,
1136
+ ref_index: int,
1137
+ quiet: bool = False,
1138
+ verbose: bool = False,
1139
+ ):
1140
+ """Endorse a referendum as a Technical Committee member.
1141
+
1142
+ TC endorsement is required for Emergency track referenda.
1143
+ """
1144
+
1145
+ if not quiet:
1146
+ console.print(f"\n[bold]Endorsing Referendum #{ref_index}[/bold]")
1147
+
1148
+ if not confirm_action(f"Endorse referendum #{ref_index}?"):
1149
+ return
1150
+
1151
+ if not unlock_key(wallet):
1152
+ return
1153
+
1154
+ try:
1155
+ from meshtensor.core.extrinsics.governance import endorse_referendum_extrinsic
1156
+ success = await endorse_referendum_extrinsic(
1157
+ subtensor, wallet, ref_index=ref_index,
1158
+ )
1159
+ if success:
1160
+ print_success(f"Endorsed referendum #{ref_index}")
1161
+ else:
1162
+ print_error(f"Failed to endorse referendum #{ref_index}")
1163
+ except Exception as e:
1164
+ print_error(f"Error endorsing referendum: {e}")
1165
+
1166
+
1167
+ # ============================================================================
1168
+ # meshcli governance cancel
1169
+ # ============================================================================
1170
+
1171
+ async def governance_cancel(
1172
+ subtensor: "MeshtensorInterface",
1173
+ wallet: Wallet,
1174
+ ref_index: int,
1175
+ quiet: bool = False,
1176
+ verbose: bool = False,
1177
+ ):
1178
+ """Cancel an active referendum. Requires root origin (governance vote)."""
1179
+
1180
+ if not quiet:
1181
+ console.print(f"\n[bold]Cancelling Referendum #{ref_index}[/bold]")
1182
+
1183
+ if not confirm_action(f"Cancel referendum #{ref_index}? This is irreversible."):
1184
+ return
1185
+
1186
+ if not unlock_key(wallet):
1187
+ return
1188
+
1189
+ try:
1190
+ from meshtensor.core.extrinsics.governance import cancel_referendum_extrinsic
1191
+ success = await cancel_referendum_extrinsic(
1192
+ subtensor, wallet, ref_index=ref_index,
1193
+ )
1194
+ if success:
1195
+ print_success(f"Cancelled referendum #{ref_index}")
1196
+ else:
1197
+ print_error(f"Failed to cancel referendum #{ref_index}")
1198
+ except Exception as e:
1199
+ print_error(f"Error cancelling referendum: {e}")
1200
+
1201
+
1202
+ # ============================================================================
1203
+ # meshcli governance approve-treasury
1204
+ # ============================================================================
1205
+
1206
+ async def governance_approve_treasury(
1207
+ subtensor: "MeshtensorInterface",
1208
+ wallet: Wallet,
1209
+ proposal_id: int,
1210
+ quiet: bool = False,
1211
+ verbose: bool = False,
1212
+ ):
1213
+ """Approve a treasury proposal. Requires root origin (governance vote)."""
1214
+
1215
+ if not quiet:
1216
+ console.print(f"\n[bold]Approving Treasury Proposal #{proposal_id}[/bold]")
1217
+
1218
+ if not confirm_action(f"Approve treasury proposal #{proposal_id}?"):
1219
+ return
1220
+
1221
+ if not unlock_key(wallet):
1222
+ return
1223
+
1224
+ try:
1225
+ from meshtensor.core.extrinsics.governance import approve_treasury_proposal_extrinsic
1226
+ success = await approve_treasury_proposal_extrinsic(
1227
+ subtensor, wallet, proposal_id=proposal_id,
1228
+ )
1229
+ if success:
1230
+ print_success(f"Approved treasury proposal #{proposal_id}")
1231
+ else:
1232
+ print_error(f"Failed to approve treasury proposal #{proposal_id}")
1233
+ except Exception as e:
1234
+ print_error(f"Error approving treasury proposal: {e}")
@@ -4,7 +4,7 @@ build-backend = "flit_core.buildapi"
4
4
 
5
5
  [project]
6
6
  name = "meshtensor-cli"
7
- version = "9.20.0"
7
+ version = "9.22.0"
8
8
  description = "Meshtensor CLI"
9
9
  readme = "README.md"
10
10
  authors = [