new BitcoinDataOutput class

This commit is contained in:
The MMGen Project 2026-09-06 10:08:41 +00:00
commit 4d1e17865b
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
4 changed files with 37 additions and 13 deletions

View file

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

View file

@ -0,0 +1,23 @@
#!/usr/bin/env python3
#
# MMGen Wallet, a terminal-based cryptocurrency wallet
# Copyright (C)2013-2026 The MMGen Project <mmgen@tuta.io>
# 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

View file

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

View file

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