Skip to content

refactor(contract_client): fold remaining extension-flow wrappers through _exec_logged #305

@web-dev0521

Description

@web-dev0521

Problem

Six write wrappers on AllwaysContractClient in allways/contract_client.py still hand-roll the four-line body that PR #91 standardized for the other 23 — the propose / challenge / finalize triples for reservation and swap-timeout extensions. They were left out because four of them pass wait_for_inclusion=False, a parameter _exec_logged doesn't currently accept:

def propose_extend_reservation(self, wallet, miner_hotkey, from_tx_hash, target_block):
    self.ensure_initialized()
    tx_hash = self.exec_contract_raw(
        'propose_extend_reservation',
        args={'miner': miner_hotkey, 'from_tx_hash': from_tx_hash, 'target_block': target_block},
        keypair=wallet.hotkey,
        wait_for_inclusion=False,
    )
    bt.logging.info(f'Propose extend reservation miner={miner_hotkey} target={target_block}: {tx_hash}')
    return tx_hash

Six wrappers, same ensure_initialized → exec_contract_raw → bt.logging.info → return shape _exec_logged already standardizes elsewhere. Each new propose/challenge/finalize flow (future extension types) resurrects the same five-line block.

Proposal

Extend _exec_logged (allways/contract_client.py:1009) with the one parameter that's keeping these six wrappers off the helper:

def _exec_logged(
    self,
    method: str,
    wallet: bt.Wallet,
    log_msg: str,
    args: Optional[dict] = None,
    value: int = 0,
    wait_for_inclusion: bool = True,
) -> str:
    self.ensure_initialized()
    tx_hash = self.exec_contract_raw(
        method, args=args, keypair=wallet.hotkey, value=value,
        wait_for_inclusion=wait_for_inclusion,
    )
    bt.logging.info(f'{log_msg}: {tx_hash}')
    return tx_hash

Then collapse each wrapper to a single delegation:

def propose_extend_reservation(self, wallet, miner_hotkey, from_tx_hash, target_block):
    return self._exec_logged(
        'propose_extend_reservation', wallet,
        f'Propose extend reservation miner={miner_hotkey} target={target_block}',
        {'miner': miner_hotkey, 'from_tx_hash': from_tx_hash, 'target_block': target_block},
        wait_for_inclusion=False,
    )

Reservation extension: propose_extend_reservation (no-wait), challenge_extend_reservation (no-wait), finalize_extend_reservation (waits)
Timeout extension: propose_extend_timeout (no-wait), challenge_extend_timeout (no-wait), finalize_extend_timeout (waits)

Default wait_for_inclusion=True preserves behavior for the 23 wrappers already routed through _exec_logged. The wait_for_inclusion=False cases are documented at allways/contract_client.py:529-535 as deliberate — idempotent calls deduped contract-side via ProposalAlreadyPending / ChallengeWindow*.

Why

  • Direct follow-on to refactor: fold extrinsic wrappers through a shared _exec_logged helper refactor: fold extrinsic wrappers through a shared _exec_logged helper #91 — these six fell out of scope only because the helper lacked the kwarg they needed.
  • Single source of truth for write-side extrinsic submission — today these six are the only write paths that can drift independently from _exec_logged (e.g., if pre-flight balance probing or log wording evolves).
  • Lower-friction extension — future propose/challenge/finalize triples inherit the one-line shape instead of resurrecting the 5-line body.
  • Smaller surface area — ~20-25 net LOC removed, single file, no behavior change.

Metadata

Metadata

Assignees

No one assigned

    Labels

    refactorRestructures code without changing behavior

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions