proto.btc: use match statement where practicable (4 files)

This commit is contained in:
The MMGen Project 2025-09-23 09:20:55 +00:00
commit 669edf9bcb
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
4 changed files with 42 additions and 38 deletions

View file

@ -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],

View file

@ -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)

View file

@ -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!')

View file

@ -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):