From 18bc964d40e867a789b62b93043941e6452ccd1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20=C5=BBebrak?= Date: Wed, 7 Jan 2026 11:07:06 +0000 Subject: [PATCH 01/11] Fix: create venv in python_installer stage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Python 3.14 upgrade changed the base image from python_development (which had a pre-created venv) to wax/ci-base-image (which doesn't). This caused CI builds to fail with "No such file or directory" when trying to activate /python_venv/bin/activate. See: https://gitlab.syncad.com/hive/clive/-/merge_requests/812 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- docker/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index 4faf4b9e13..764289dca5 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -85,6 +85,9 @@ WORKDIR /clive SHELL ["/bin/bash", "-c"] +# Create the virtual environment (not pre-existing in the base image) +RUN python3 -m venv "${PYTHON_VENV_PATH}" + # Project IDS: # - 198 -> hive (generated APIs) # - 362 -> schemas -- GitLab From 88813b0ed4ab2c0e0dea012b8db532194606e2ca Mon Sep 17 00:00:00 2001 From: Marcin Sobczyk Date: Tue, 16 Dec 2025 10:55:49 +0000 Subject: [PATCH 02/11] Add `clive process claim rewards` command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a CLI command to claim all pending blockchain rewards (HIVE, HBD, and VESTS) for an account. The command fetches the account's current reward balances and creates a ClaimRewardBalanceOperation to claim them. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../commands/process/process_claim_rewards.py | 53 +++++++++++++++++++ clive/__private/cli/process/claim.py | 20 +++++++ pydoclint-errors-baseline.txt | 2 + 3 files changed, 75 insertions(+) create mode 100644 clive/__private/cli/commands/process/process_claim_rewards.py diff --git a/clive/__private/cli/commands/process/process_claim_rewards.py b/clive/__private/cli/commands/process/process_claim_rewards.py new file mode 100644 index 0000000000..56d91bc7f3 --- /dev/null +++ b/clive/__private/cli/commands/process/process_claim_rewards.py @@ -0,0 +1,53 @@ +from __future__ import annotations + +import errno +from dataclasses import dataclass, field +from typing import TYPE_CHECKING, override + +from clive.__private.cli.commands.abc.operation_command import OperationCommand +from clive.__private.cli.exceptions import CLIPrettyError +from clive.__private.models.schemas import ClaimRewardBalanceOperation + +if TYPE_CHECKING: + from clive.__private.cli.types import ComposeTransaction + from clive.__private.models.schemas import Account + + +class CLIClaimRewardsZeroBalanceError(CLIPrettyError): + def __init__(self, account_name: str) -> None: + self.account_name = account_name + message = f"Account `{account_name}` has no rewards to claim." + super().__init__(message, errno.ENODATA) + + +@dataclass(kw_only=True) +class ProcessClaimRewards(OperationCommand): + account_name: str + _account: Account = field(init=False) + + @override + async def fetch_data(self) -> None: + accounts = (await self.world.commands.find_accounts(accounts=[self.account_name])).result_or_raise + assert len(accounts) == 1, f"Expected exactly one account, got {len(accounts)}" + self._account = accounts[0] + + @override + async def validate_inside_context_manager(self) -> None: + if self._has_zero_rewards(): + raise CLIClaimRewardsZeroBalanceError(self.account_name) + await super().validate_inside_context_manager() + + async def _create_operations(self) -> ComposeTransaction: + yield ClaimRewardBalanceOperation( + account=self.account_name, + reward_hive=self._account.reward_hive_balance, + reward_hbd=self._account.reward_hbd_balance, + reward_vests=self._account.reward_vesting_balance, + ) + + def _has_zero_rewards(self) -> bool: + return ( + self._account.reward_hive_balance.amount == 0 + and self._account.reward_hbd_balance.amount == 0 + and self._account.reward_vesting_balance.amount == 0 + ) diff --git a/clive/__private/cli/process/claim.py b/clive/__private/cli/process/claim.py index 02ea81f8c4..37da28f9ed 100644 --- a/clive/__private/cli/process/claim.py +++ b/clive/__private/cli/process/claim.py @@ -42,3 +42,23 @@ async def process_claim_new_account_token( # noqa: PLR0913 save_file=save_file, autosign=autosign, ).run() + + +@claim.command(name="rewards") +async def process_claim_rewards( + account_name: str = options.account_name, + sign_with: str | None = options.sign_with, + autosign: bool | None = options.autosign, # noqa: FBT001 + broadcast: bool | None = options.broadcast, # noqa: FBT001 + save_file: str | None = options.save_file, +) -> None: + """Claim all pending blockchain rewards in HBD, HP (VESTS), and HIVE.""" + from clive.__private.cli.commands.process.process_claim_rewards import ProcessClaimRewards # noqa: PLC0415 + + await ProcessClaimRewards( + account_name=account_name, + sign_with=sign_with, + broadcast=broadcast, + save_file=save_file, + autosign=autosign, + ).run() diff --git a/pydoclint-errors-baseline.txt b/pydoclint-errors-baseline.txt index cde6ffd639..8d038921e2 100644 --- a/pydoclint-errors-baseline.txt +++ b/pydoclint-errors-baseline.txt @@ -104,6 +104,8 @@ clive/__private/cli/main.py clive/__private/cli/process/claim.py DOC101: Function `process_claim_new_account_token`: Docstring contains fewer arguments than in function signature. DOC103: Function `process_claim_new_account_token`: Docstring arguments are different from function arguments. (Or could be other formatting issues: https://jsh9.github.io/pydoclint/violation_codes.html#notes-on-doc103 ). Arguments in the function signature but not in the docstring: [autosign: bool | None, broadcast: bool | None, creator: str, fee: str | None, save_file: str | None, sign_with: str | None]. + DOC101: Function `process_claim_rewards`: Docstring contains fewer arguments than in function signature. + DOC103: Function `process_claim_rewards`: Docstring arguments are different from function arguments. (Or could be other formatting issues: https://jsh9.github.io/pydoclint/violation_codes.html#notes-on-doc103 ). Arguments in the function signature but not in the docstring: [account_name: str, autosign: bool | None, broadcast: bool | None, save_file: str | None, sign_with: str | None]. -------------------- clive/__private/cli/process/custom_operations/custom_json.py DOC101: Function `process_custom_json`: Docstring contains fewer arguments than in function signature. -- GitLab From 67344423869fcf2b3c07b18951dc384105f285d9 Mon Sep 17 00:00:00 2001 From: Marcin Sobczyk Date: Tue, 16 Dec 2025 11:19:43 +0000 Subject: [PATCH 03/11] Add example post and vote to block_log generation script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../testnet_block_log/generate_block_log.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/clive-local-tools/clive_local_tools/testnet_block_log/generate_block_log.py b/tests/clive-local-tools/clive_local_tools/testnet_block_log/generate_block_log.py index fc76c6aa88..0aedb6f592 100644 --- a/tests/clive-local-tools/clive_local_tools/testnet_block_log/generate_block_log.py +++ b/tests/clive-local-tools/clive_local_tools/testnet_block_log/generate_block_log.py @@ -198,6 +198,25 @@ def prepare_votes_for_witnesses(wallet: tt.Wallet) -> None: wallet.api.vote_for_witness(ALT_WORKING_ACCOUNT2_DATA.account.name, WITNESSES[i].name, approve=True) +def create_example_post_and_vote(wallet: tt.Wallet) -> None: + tt.logger.info("Creating example post and vote for alice...") + wallet.api.post_comment( + WORKING_ACCOUNT_DATA.account.name, + "example-post", + "", + "parent-example-post", + "Example Post Title", + "This is an example post body.", + "{}", + ) + wallet.api.vote( + WORKING_ACCOUNT_DATA.account.name, + WORKING_ACCOUNT_DATA.account.name, + "example-post", + 100, + ) + + def main() -> None: node = tt.InitNode() configure(node) @@ -215,6 +234,7 @@ def main() -> None: create_watched_accounts(wallet) prepare_savings(wallet) prepare_votes_for_witnesses(wallet) + create_example_post_and_vote(wallet) create_empty_account(wallet) create_known_exchange_accounts(wallet) -- GitLab From 322ed70892151a210edc8c32ca2a044a56372c66 Mon Sep 17 00:00:00 2001 From: Marcin Sobczyk Date: Tue, 16 Dec 2025 11:31:42 +0000 Subject: [PATCH 04/11] Regenerate block_log for old repo you might need remove old *artifacts file when checking out this branch --- .../block_log_with_config/.gitignore | 1 + .../alternate-chain-spec.json | 2 +- .../block_log_with_config/block_log_part.0001 | Bin 25867 -> 26252 bytes .../block_log_part.0001.artifacts | Bin 1808 -> 0 bytes .../block_log_with_config/config.ini | 2 +- 5 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 tests/clive-local-tools/clive_local_tools/testnet_block_log/block_log_with_config/.gitignore delete mode 100644 tests/clive-local-tools/clive_local_tools/testnet_block_log/block_log_with_config/block_log_part.0001.artifacts diff --git a/tests/clive-local-tools/clive_local_tools/testnet_block_log/block_log_with_config/.gitignore b/tests/clive-local-tools/clive_local_tools/testnet_block_log/block_log_with_config/.gitignore new file mode 100644 index 0000000000..2db9f3eea5 --- /dev/null +++ b/tests/clive-local-tools/clive_local_tools/testnet_block_log/block_log_with_config/.gitignore @@ -0,0 +1 @@ +*.artifacts diff --git a/tests/clive-local-tools/clive_local_tools/testnet_block_log/block_log_with_config/alternate-chain-spec.json b/tests/clive-local-tools/clive_local_tools/testnet_block_log/block_log_with_config/alternate-chain-spec.json index 473cd2c7d8..7c1dc81f65 100644 --- a/tests/clive-local-tools/clive_local_tools/testnet_block_log/block_log_with_config/alternate-chain-spec.json +++ b/tests/clive-local-tools/clive_local_tools/testnet_block_log/block_log_with_config/alternate-chain-spec.json @@ -1,5 +1,5 @@ { - "genesis_time": 1749451951, + "genesis_time": 1765888694, "hardfork_schedule": [ { "block_num": 1, diff --git a/tests/clive-local-tools/clive_local_tools/testnet_block_log/block_log_with_config/block_log_part.0001 b/tests/clive-local-tools/clive_local_tools/testnet_block_log/block_log_with_config/block_log_part.0001 index e71cd96615740cfa53d0e5fa665eb046a58bb4aa..375901127a556a538010c86a0d26d8a6e160e0ae 100644 GIT binary patch delta 19425 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 Y&fLzx{70c@QKyW{f!R}pr$Vg-0I0}f^Z)<= diff --git a/tests/clive-local-tools/clive_local_tools/testnet_block_log/block_log_with_config/block_log_part.0001.artifacts b/tests/clive-local-tools/clive_local_tools/testnet_block_log/block_log_with_config/block_log_part.0001.artifacts deleted file mode 100644 index 5b94ecd488616ca0ef78c9f28a2a3715e2e991ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1808 zcmeZdU|=vevouXLHBC-Ru{5SPxL50B^$Zn zf5Dw;%iiaFJ`rgQ5nmTRvE9`oy~uk;zv0okOZ)fOK*YJuezrKYt>l4Rvczxuu%P}Y zwh-}B<)Eak{O_#Nxps@lpWo>(ZVwU9opZ9S?sn1lti?NQeot#z?&|;%pBV7uS>Mis z&o}>P*eJ!-F}KtaB7XJwg^K)phqiscZ~VaG;OyrMoFL-o^c3^f-pY=N<-hAvnx__rDMEnigk?UTu z5(>U@HNQ;0hpKFLgNR!TBwTvc*KoY;beFh$?814|-67(k4mRicPemS;)9~hbx8C;1 z1rLb$0+Ii3ls@l}ocnL)@A%cx6CQyQ3shI?wV7;`^E-JG<99EJ`aJjj zQ)}Ncevn+8yGigS?;?I5h`92ZsbO<%zDtGu2;OxvYpuSzFGO5&&rb%EKnpg>6FI>v zSr;s~^Mi;tT~ymT>u{jc!5spLq3$XoA^s5Y&#FF4MZQ)!$3Cw5mr%P->N*7h%_P#{v zl1Ly#y->@t)D6s@@|#Zu-j#RQYuo}A4_Ntn{i78TYrc6uWGPJVU;G&=?)H1*mUO0* z^TN|x+4nB!eVY^nG3TK68F%*IYm%c}0(|*2J47x)#lJO9cMgd3S$A>v&sFQ&!lj&o zA?np$H~DF>I~@7Q(^7o*1?I_HWh?{YdMwu2)t6k^Ua zhV!}K&p5QnrkI?FSGIj}4=Qf;aAQkERde03ph>$7^U7;{!yxKcM}AqjOe{KR9*d^j zgcq*rC!ykLRT4iQUOL^t^klW-y@xCdUBe;j^Y(sEIbHr)!F}7So(DO1L=Hm59|b&~ zJkLs{;GJS)+Ziq&Er$q*`h&AA%wDWqUCW%@=HcST&$I_BK6BUcn;|jr&(bZN*JNid zn`;pXQJ=oD-u#D-C-ddD`u9)n<<)J0itBw1JIf+>YHjwiv&()hnsVD93Znk7WD)BI z-o9eqbq>E|dD1P{K*a-9vY428c^qTB+ZTVxFX5MohNy4bdUk6ZZ#@rBnPa}4?}_=- zq2k68KUN$lh_^VjVW0bKOA$Z87>N2KlN_~vZV0~KA|uvky7qHi4^&)g&3AeJAKN;d z=KN!k-1DoQGZvyg@0rt2QQyZuxu0+FUesQ;y%j1xC4*m#hTdOzN%|}np>;zyXGth-p!H%%W@MS>i0~3 zEmbYeUcz4WWntB$$W@P^;s;)ORjIY<^!6~up6U^JJ1-&;qTXe*<*6x}3kyuTpEIAm znVEbJDjraA?8?7eYxy(T?`B^2n)k~o38Fsp*CC1i$PQWEKBi|JH7AX?L&a}oP td Date: Tue, 16 Dec 2025 12:50:50 +0000 Subject: [PATCH 05/11] Rename EXTRA_TIME_SHIFT_FOR_GOVERNANCE to EXTRA_TIME_SHIFT_FOR_GOVERNANCE_AND_REWARDS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The constant is used for both governance voting and rewards claiming, so the name now reflects both use cases. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../clive_local_tools/testnet_block_log/constants.py | 2 +- .../clive_local_tools/testnet_block_log/prepared_data.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/clive-local-tools/clive_local_tools/testnet_block_log/constants.py b/tests/clive-local-tools/clive_local_tools/testnet_block_log/constants.py index 8545f6c4ee..1b45bb5b4a 100644 --- a/tests/clive-local-tools/clive_local_tools/testnet_block_log/constants.py +++ b/tests/clive-local-tools/clive_local_tools/testnet_block_log/constants.py @@ -14,7 +14,7 @@ if TYPE_CHECKING: from datetime import timedelta BLOCK_LOG_WITH_CONFIG_DIRECTORY: Final[Path] = Path(__file__).parent / "block_log_with_config" -EXTRA_TIME_SHIFT_FOR_GOVERNANCE: Final[timedelta] = tt.Time.days(1) +EXTRA_TIME_SHIFT_FOR_GOVERNANCE_AND_REWARDS: Final[timedelta] = tt.Time.days(1) WITNESSES: Final[list[tt.Account]] = [tt.Account(name) for name in [generate_witness_name(i) for i in range(60)]] diff --git a/tests/clive-local-tools/clive_local_tools/testnet_block_log/prepared_data.py b/tests/clive-local-tools/clive_local_tools/testnet_block_log/prepared_data.py index 647c5387c8..432cb7b675 100644 --- a/tests/clive-local-tools/clive_local_tools/testnet_block_log/prepared_data.py +++ b/tests/clive-local-tools/clive_local_tools/testnet_block_log/prepared_data.py @@ -6,7 +6,7 @@ import test_tools as tt from clive_local_tools.testnet_block_log.constants import ( BLOCK_LOG_WITH_CONFIG_DIRECTORY, - EXTRA_TIME_SHIFT_FOR_GOVERNANCE, + EXTRA_TIME_SHIFT_FOR_GOVERNANCE_AND_REWARDS, ) if TYPE_CHECKING: @@ -30,7 +30,7 @@ def get_block_log() -> tt.BlockLog: def get_time_control(block_log: tt.BlockLog) -> tt.StartTimeControl: block_log_time = block_log.get_head_block_time() - return tt.StartTimeControl(start_time=block_log_time + EXTRA_TIME_SHIFT_FOR_GOVERNANCE) + return tt.StartTimeControl(start_time=block_log_time + EXTRA_TIME_SHIFT_FOR_GOVERNANCE_AND_REWARDS) def run_node(webserver_http_endpoint: HttpUrl | None = None) -> tt.RawNode: -- GitLab From 2613458510b0f77a90180b330b6a0ada70e58edc Mon Sep 17 00:00:00 2001 From: Marcin Sobczyk Date: Tue, 16 Dec 2025 13:12:22 +0000 Subject: [PATCH 06/11] Add tests for `clive process claim rewards` command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tests cover: - Successful claiming of rewards for alice account (with non-zero rewards) - Failure case when account has no rewards to claim 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../clive_local_tools/cli/cli_tester.py | 11 ++++ .../cli/process/test_process_claim_rewards.py | 58 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 tests/functional/cli/process/test_process_claim_rewards.py diff --git a/tests/clive-local-tools/clive_local_tools/cli/cli_tester.py b/tests/clive-local-tools/clive_local_tools/cli/cli_tester.py index 0efa119635..b5d65fd240 100644 --- a/tests/clive-local-tools/clive_local_tools/cli/cli_tester.py +++ b/tests/clive-local-tools/clive_local_tools/cli/cli_tester.py @@ -687,3 +687,14 @@ class CLITester: return self.__invoke_command_with_options( ["show", "pending", "decline-voting-rights"], account_name=account_name ) + + def process_claim_rewards( + self, + *, + account_name: str | None = None, + sign_with: str | None = None, + broadcast: bool | None = None, + save_file: Path | None = None, + autosign: bool | None = None, + ) -> CLITestResult: + return self.__invoke_command_with_options(["process", "claim", "rewards"], **extract_params(locals())) diff --git a/tests/functional/cli/process/test_process_claim_rewards.py b/tests/functional/cli/process/test_process_claim_rewards.py new file mode 100644 index 0000000000..5ae014e5b6 --- /dev/null +++ b/tests/functional/cli/process/test_process_claim_rewards.py @@ -0,0 +1,58 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pytest + +from clive.__private.cli.commands.process.process_claim_rewards import CLIClaimRewardsZeroBalanceError +from clive.__private.models.schemas import ClaimRewardBalanceOperation +from clive_local_tools.checkers.blockchain_checkers import assert_operations_placed_in_blockchain +from clive_local_tools.cli.exceptions import CLITestCommandError +from clive_local_tools.data.constants import WORKING_ACCOUNT_KEY_ALIAS +from clive_local_tools.helpers import get_formatted_error_message +from clive_local_tools.testnet_block_log.constants import EMPTY_ACCOUNT, WORKING_ACCOUNT_DATA + +if TYPE_CHECKING: + import test_tools as tt + + from clive_local_tools.cli.cli_tester import CLITester + + +async def test_claim_rewards_success(node: tt.RawNode, cli_tester: CLITester) -> None: + """Test claiming rewards for alice account which has non-zero rewards from block log.""" + # ARRANGE + account_name = WORKING_ACCOUNT_DATA.account.name + accounts = node.api.database.find_accounts(accounts=[account_name]) + account = accounts.accounts[0] + + # ASSERT precondition - alice should have some rewards to claim + has_rewards = ( + int(account.reward_hive_balance.amount) > 0 + or int(account.reward_hbd_balance.amount) > 0 + or int(account.reward_vesting_balance.amount) > 0 + ) + assert has_rewards, f"Account {account_name} should have rewards to claim for this test" + + operation = ClaimRewardBalanceOperation( + account=account_name, + reward_hive=account.reward_hive_balance, + reward_hbd=account.reward_hbd_balance, + reward_vests=account.reward_vesting_balance, + ) + + # ACT + result = cli_tester.process_claim_rewards(sign_with=WORKING_ACCOUNT_KEY_ALIAS) + + # ASSERT + assert_operations_placed_in_blockchain(node, result, operation) + + +async def test_negative_claim_rewards_fails_with_zero_balance(cli_tester: CLITester) -> None: + """Test that claiming rewards fails when account has no rewards to claim.""" + # ARRANGE + account_name = EMPTY_ACCOUNT.name + expected_error_message = get_formatted_error_message(CLIClaimRewardsZeroBalanceError(account_name)) + + # ACT & ASSERT + with pytest.raises(CLITestCommandError, match=expected_error_message): + cli_tester.process_claim_rewards(account_name=account_name, sign_with=WORKING_ACCOUNT_KEY_ALIAS) -- GitLab From 0b10d0b4b1a8e6f368d1bc4fee52790d46db8753 Mon Sep 17 00:00:00 2001 From: Marcin Sobczyk Date: Tue, 16 Dec 2025 13:12:28 +0000 Subject: [PATCH 07/11] Add HP Owned and HP Unclaimed rows to `clive show balances` output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- clive/__private/cli/commands/show/show_balances.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clive/__private/cli/commands/show/show_balances.py b/clive/__private/cli/commands/show/show_balances.py index 713ead2659..281b09464c 100644 --- a/clive/__private/cli/commands/show/show_balances.py +++ b/clive/__private/cli/commands/show/show_balances.py @@ -30,5 +30,7 @@ class ShowBalances(WorldBasedCommand): table.add_row("HIVE Liquid", f"{Asset.pretty_amount(data.hive_balance)}") table.add_row("HIVE Savings", f"{Asset.pretty_amount(data.hive_savings)}") table.add_row("HIVE Unclaimed", f"{Asset.pretty_amount(data.hive_unclaimed)}") + table.add_row("STAKE Owned", f"{Asset.pretty_amount(data.owned_hp_balance.hp_balance)}") + table.add_row("STAKE Unclaimed", f"{Asset.pretty_amount(data.unclaimed_hp_balance.hp_balance)}") print_cli(table) -- GitLab From 9d24f6182511c60e36a005c3303c9444cc129fbd Mon Sep 17 00:00:00 2001 From: Marcin Sobczyk Date: Wed, 17 Dec 2025 11:22:22 +0000 Subject: [PATCH 08/11] Update CLI documentation --- docs/cli_commands_structure.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/cli_commands_structure.md b/docs/cli_commands_structure.md index 1775751684..cf5fd0f84f 100644 --- a/docs/cli_commands_structure.md +++ b/docs/cli_commands_structure.md @@ -73,7 +73,8 @@ clive │ ├── account-creation │ ├── change-recovery-account │ ├── claim -│ │ └── new-account-token +│ │ ├── new-account-token +│ │ └── rewards │ ├── custom-json │ ├── delegations │ │ ├── remove -- GitLab From 114262e97823de350900ddc3dd40b50a99a95e5d Mon Sep 17 00:00:00 2001 From: Marcin Sobczyk Date: Fri, 19 Dec 2025 10:35:29 +0000 Subject: [PATCH 09/11] Exclude artifacts when using generated testnet block_log --- .../clive_local_tools/testnet_block_log/prepared_data.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/clive-local-tools/clive_local_tools/testnet_block_log/prepared_data.py b/tests/clive-local-tools/clive_local_tools/testnet_block_log/prepared_data.py index 432cb7b675..83953609c9 100644 --- a/tests/clive-local-tools/clive_local_tools/testnet_block_log/prepared_data.py +++ b/tests/clive-local-tools/clive_local_tools/testnet_block_log/prepared_data.py @@ -25,7 +25,11 @@ def get_alternate_chain_spec() -> tt.AlternateChainSpecs: def get_block_log() -> tt.BlockLog: - return tt.BlockLog(BLOCK_LOG_WITH_CONFIG_DIRECTORY) + """Makes copy of block_log, ensuring artifacts are excluded.""" + block_log = tt.BlockLog(BLOCK_LOG_WITH_CONFIG_DIRECTORY) + directory = tt.context.get_current_directory() / "block_log_copy" + directory.mkdir(exist_ok=True) + return block_log.copy_to(directory, artifacts="excluded") def get_time_control(block_log: tt.BlockLog) -> tt.StartTimeControl: -- GitLab From c29c34a81c81fc2323a08624ac0108cc7152dd0c Mon Sep 17 00:00:00 2001 From: Marcin Sobczyk Date: Wed, 7 Jan 2026 15:06:36 +0000 Subject: [PATCH 10/11] fixup! Add `clive process claim rewards` command --- clive/__private/cli/process/claim.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clive/__private/cli/process/claim.py b/clive/__private/cli/process/claim.py index 37da28f9ed..9ae6b38ea3 100644 --- a/clive/__private/cli/process/claim.py +++ b/clive/__private/cli/process/claim.py @@ -52,7 +52,7 @@ async def process_claim_rewards( broadcast: bool | None = options.broadcast, # noqa: FBT001 save_file: str | None = options.save_file, ) -> None: - """Claim all pending blockchain rewards in HBD, HP (VESTS), and HIVE.""" + """Claim all pending blockchain rewards in HBD, HP (VESTS), and HIVE. Requires posting authority""" from clive.__private.cli.commands.process.process_claim_rewards import ProcessClaimRewards # noqa: PLC0415 await ProcessClaimRewards( -- GitLab From 5a27e9988ed80fa93c41b9ce81e28aa1d2cc88d0 Mon Sep 17 00:00:00 2001 From: Marcin Sobczyk Date: Wed, 7 Jan 2026 15:13:14 +0000 Subject: [PATCH 11/11] fixup! fixup! Add `clive process claim rewards` command --- clive/__private/cli/process/claim.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clive/__private/cli/process/claim.py b/clive/__private/cli/process/claim.py index 9ae6b38ea3..444ac03088 100644 --- a/clive/__private/cli/process/claim.py +++ b/clive/__private/cli/process/claim.py @@ -52,7 +52,7 @@ async def process_claim_rewards( broadcast: bool | None = options.broadcast, # noqa: FBT001 save_file: str | None = options.save_file, ) -> None: - """Claim all pending blockchain rewards in HBD, HP (VESTS), and HIVE. Requires posting authority""" + """Claim all pending blockchain rewards in HBD, HP (VESTS), and HIVE. Requires posting authority.""" from clive.__private.cli.commands.process.process_claim_rewards import ProcessClaimRewards # noqa: PLC0415 await ProcessClaimRewards( -- GitLab