From 669edf9bcba9891e9fd84ff865363acc076a4bac Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Tue, 23 Sep 2025 09:20:55 +0000 Subject: [PATCH] proto.btc: use match statement where practicable (4 files) --- mmgen/proto/btc/params.py | 11 +++++++---- mmgen/proto/btc/tw/txhistory.py | 19 ++++++++++--------- mmgen/proto/btc/tx/info.py | 24 ++++++++++++------------ mmgen/proto/btc/tx/new.py | 26 +++++++++++++------------- 4 files changed, 42 insertions(+), 38 deletions(-) diff --git a/mmgen/proto/btc/params.py b/mmgen/proto/btc/params.py index 036d5588..4077a7e6 100755 --- a/mmgen/proto/btc/params.py +++ b/mmgen/proto/btc/params.py @@ -80,10 +80,13 @@ class mainnet(CoinProtocol.Secp256k1): # chainparams.cpp vlen = self.wif_ver_bytes_len or self.get_wif_ver_bytes_len(key_data) key = key_data[vlen:] - if len(key) == self.privkey_len + 1: - assert key[-1] == 0x01, f'{key[-1]!r}: invalid compressed key suffix byte' - elif len(key) != self.privkey_len: - raise ValueError(f'{len(key)}: invalid key length') + match len(key): + case x if x == self.privkey_len + 1: + assert key[-1] == 0x01, f'{key[-1]!r}: invalid compressed key suffix byte' + case self.privkey_len: + pass + case x: + raise ValueError(f'{x}: invalid key length') return decoded_wif( sec = key[:self.privkey_len], diff --git a/mmgen/proto/btc/tw/txhistory.py b/mmgen/proto/btc/tw/txhistory.py index 1af5c524..90899f45 100755 --- a/mmgen/proto/btc/tw/txhistory.py +++ b/mmgen/proto/btc/tw/txhistory.py @@ -137,15 +137,16 @@ class BitcoinTwTransaction: if self.confirmations > 0 else None) def age_disp(self, age_fmt, *, width, color): - if age_fmt == 'confs': - ret_str = str(self.confirmations).ljust(width) - return gray(ret_str) if self.confirmations < 0 and color else ret_str - elif age_fmt == 'block': - ret = (self.rpc.blockcount - (abs(self.confirmations) - 1)) * (-1 if self.confirmations < 0 else 1) - ret_str = str(ret).ljust(width) - return gray(ret_str) if ret < 0 and color else ret_str - else: - return self.parent.date_formatter[age_fmt](self.rpc, self.tx.get('blocktime', 0)) + match age_fmt: + case 'confs': + ret_str = str(self.confirmations).ljust(width) + return gray(ret_str) if self.confirmations < 0 and color else ret_str + case 'block': + ret = (self.rpc.blockcount - (abs(self.confirmations) - 1)) * (-1 if self.confirmations < 0 else 1) + ret_str = str(ret).ljust(width) + return gray(ret_str) if ret < 0 and color else ret_str + case _: + return self.parent.date_formatter[age_fmt](self.rpc, self.tx.get('blocktime', 0)) def txdate_disp(self, age_fmt): return self.parent.date_formatter[age_fmt](self.rpc, self.time) diff --git a/mmgen/proto/btc/tx/info.py b/mmgen/proto/btc/tx/info.py index 519218a0..226dc112 100755 --- a/mmgen/proto/btc/tx/info.py +++ b/mmgen/proto/btc/tx/info.py @@ -156,15 +156,15 @@ class TxInfo(TxInfo): # If greater than or equal to 500 million, locktime is parsed using the Unix epoch time # format (the number of seconds elapsed since 1970-01-01T00:00 UTC). The transaction can be # added to any block whose block time is greater than the locktime. - num = locktime or self.tx.locktime - if num is None: - return '(None)' - elif num.bit_length() > 32: - die(2, f'{num!r}: invalid nLockTime value (integer size greater than 4 bytes)!') - elif num >= 500_000_000: - import time - return ' '.join(time.strftime('%c', time.gmtime(num)).split()[1:]) - elif num > 0: - return '{}{}'.format(('block height ', '')[terse], num) - else: - die(2, f'{num!r}: invalid nLockTime value!') + match locktime or self.tx.locktime: + case None: + return '(None)' + case num if num.bit_length() > 32: + die(2, f'{num!r}: invalid nLockTime value (integer size greater than 4 bytes)!') + case num if num >= 500_000_000: + import time + return ' '.join(time.strftime('%c', time.gmtime(num)).split()[1:]) + case num if num > 0: + return '{}{}'.format(('block height ', '')[terse], num) + case num: + die(2, f'{num!r}: invalid nLockTime value!') diff --git a/mmgen/proto/btc/tx/new.py b/mmgen/proto/btc/tx/new.py index 1d502fef..e3177c88 100755 --- a/mmgen/proto/btc/tx/new.py +++ b/mmgen/proto/btc/tx/new.py @@ -97,19 +97,19 @@ class New(Base, TxNew): return ret def convert_and_check_fee(self, fee, desc): - abs_fee = self.feespec2abs(fee, self.estimate_size()) - if abs_fee is None: - raise ValueError(f'{fee}: cannot convert {self.rel_fee_desc} to {self.coin}' - + ' because transaction size is unknown') - if abs_fee is False: - err = f'{fee!r}: invalid TX fee (not a {self.coin} amount or {self.rel_fee_desc} specification)' - elif abs_fee > self.proto.max_tx_fee: - err = f'{abs_fee} {self.coin}: {desc} fee too large (maximum fee: {self.proto.max_tx_fee} {self.coin})' - elif abs_fee < self.relay_fee: - err = f'{abs_fee} {self.coin}: {desc} fee too small (less than relay fee of {self.relay_fee} {self.coin})' - else: - return abs_fee - msg(err) + match self.feespec2abs(fee, self.estimate_size()): # abs_fee + case None: + raise ValueError( + f'{fee}: cannot convert {self.rel_fee_desc} to {self.coin} ' + + 'because transaction size is unknown') + case False: + msg(f'{fee!r}: invalid TX fee (not a {self.coin} amount or {self.rel_fee_desc} specification)') + case x if x > self.proto.max_tx_fee: + msg(f'{x} {self.coin}: {desc} fee too large (maximum fee: {self.proto.max_tx_fee} {self.coin})') + case x if x < self.relay_fee: + msg(f'{x} {self.coin}: {desc} fee too small (less than relay fee of {self.relay_fee} {self.coin})') + case x: + return x return False async def get_input_addrs_from_inputs_opt(self):