From 4d1e17865b09216a977e4cbfcde64362eb832356 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Sun, 6 Sep 2026 10:08:41 +0000 Subject: [PATCH] new BitcoinDataOutput class --- mmgen/proto/btc/tx/base.py | 2 +- mmgen/proto/btc/tx/data_output.py | 23 +++++++++++++++++++++++ mmgen/tx/data_output.py | 8 ++------ test/modtest_d/tx.py | 17 +++++++++++------ 4 files changed, 37 insertions(+), 13 deletions(-) create mode 100755 mmgen/proto/btc/tx/data_output.py diff --git a/mmgen/proto/btc/tx/base.py b/mmgen/proto/btc/tx/base.py index c824ada0..b496c83f 100755 --- a/mmgen/proto/btc/tx/base.py +++ b/mmgen/proto/btc/tx/base.py @@ -18,7 +18,7 @@ from ....tx.base import Base as TxBase from ....obj import MMGenList, HexStr, ListItemAttr from ....util import msg, make_chksum_6, die, pp_fmt -from ....tx.data_output import DataOutput +from .data_output import DataOutput def data2scriptPubKey(data): return '6a' + '{:02x}'.format(len(data)) + data.hex() # OP_RETURN data diff --git a/mmgen/proto/btc/tx/data_output.py b/mmgen/proto/btc/tx/data_output.py new file mode 100755 index 00000000..3b716387 --- /dev/null +++ b/mmgen/proto/btc/tx/data_output.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python3 +# +# MMGen Wallet, a terminal-based cryptocurrency wallet +# Copyright (C)2013-2026 The MMGen Project +# Licensed under the GNU General Public License, Version 3: +# https://www.gnu.org/licenses +# Public project repositories: +# https://github.com/mmgen/mmgen-wallet +# https://gitlab.com/mmgen/mmgen-wallet + +""" +proto.btc.tx.data_output: Bitcoin data output class +""" + +from ....tx.data_output import DataOutput + +class BitcoinDataOutput(DataOutput): + + desc = 'OP_RETURN data' + + @property + def max_len(self): + return self.proto.max_op_return_data_len diff --git a/mmgen/tx/data_output.py b/mmgen/tx/data_output.py index b155e21a..b01a35df 100755 --- a/mmgen/tx/data_output.py +++ b/mmgen/tx/data_output.py @@ -16,13 +16,9 @@ from ..obj import InitErrors class DataOutput(bytes, InitErrors): - desc = 'OP_RETURN data' + def __new__(base_cls, proto, data_spec): - @property - def max_len(self): - return self.proto.max_op_return_data_len - - def __new__(cls, proto, data_spec): + cls = proto.base_proto_subclass(base_cls, 'tx.data_output') assert isinstance(data_spec, str), f'{cls.desc} argument must be a string' diff --git a/test/modtest_d/tx.py b/test/modtest_d/tx.py index 55b3737e..2e97de97 100755 --- a/test/modtest_d/tx.py +++ b/test/modtest_d/tx.py @@ -9,6 +9,7 @@ import os from mmgen.tx import CompletedTX, UnsignedTX from mmgen.tx.file import MMGenTxFile from mmgen.cfg import Config +from mmgen.protocol import init_proto from ..include.common import cfg, qmsg, vmsg, gr_uc @@ -112,9 +113,13 @@ class unit_tests: ut.process_bad_data(bad_data) return True - def data_output(self, name, ut, desc='DataOutput class'): - max_len = cfg._proto.max_op_return_data_len + def data_output_btc(self, name, ut, desc='BitcoinDataOutput class'): + return self._data_output(ut, 'btc') + + def _data_output(self, ut, coin): + proto = init_proto(cfg, coin) from mmgen.tx.data_output import DataOutput + max_len = DataOutput(proto, 'data:abc').max_len vecs = [ 'data:=:ETH.ETH:0x86d526d6624AbC0178cF7296cD538Ecc080A95F1:0/1/0', 'hexdata:3d3a4554482e4554483a30783836643532366436363234416243303137' @@ -128,11 +133,11 @@ class unit_tests: 'data:' + gr_uc[:24], ] - assert DataOutput(cfg._proto, vecs[0]) == DataOutput(cfg._proto, vecs[1]) + assert DataOutput(proto, vecs[0]) == DataOutput(proto, vecs[1]) for vec in vecs: - d = DataOutput(cfg._proto, vec) - assert d == DataOutput(cfg._proto, repr(d)) # repr() must return a valid initializer + d = DataOutput(proto, vec) + assert d == DataOutput(proto, repr(d)) # repr() must return a valid initializer assert isinstance(d, bytes) assert isinstance(str(d), str) vmsg('-' * 80) @@ -156,7 +161,7 @@ class unit_tests: ] def bad(n): - return lambda: DataOutput(cfg._proto, bad_data[n]) + return lambda: DataOutput(proto, bad_data[n]) vmsg('-' * 80) vmsg('Testing error handling:')