From ea12087de7a407161059fd7e74b81a8fd77e3d82 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Wed, 16 Nov 2016 01:39:31 +0100 Subject: [PATCH] apps.common: add op_return to signtx --- src/apps/common/signtx.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/apps/common/signtx.py b/src/apps/common/signtx.py index f6ddffe8..aea204f3 100644 --- a/src/apps/common/signtx.py +++ b/src/apps/common/signtx.py @@ -144,9 +144,10 @@ async def sign_tx(tx: SignTx, root): 'Only one change output is valid') change_out = txo.amount else: - if not await confirm_output(txo, coin): - raise SigningError(FailureType.ActionCancelled, - 'Output cancelled') + if txo.script_type != OutputScriptType.PAYTOOPRETURN: + if not await confirm_output(txo, coin): + raise SigningError(FailureType.ActionCancelled, + 'Output cancelled') txo_bin.amount = txo.amount txo_bin.script_pubkey = output_derive_script(txo, coin, root) write_tx_output(h_first, txo_bin) @@ -319,6 +320,12 @@ def output_derive_script(o: TxOutputType, coin: CoinType, root) -> bytes: elif o.script_type == OutputScriptType.PAYTOSCRIPTHASH: ra = output_paytoaddress_extract_raw_address(o, coin, root, p2sh=True) return script_paytoscripthash_new(ra[1:]) + elif o.script_type == OutputScriptType.PAYTOOPRETURN: + if o.amount == 0: + return script_paytoopreturn_new(o.op_return_data) + else: + raise SigningError(FailureType.SyntaxError, + 'OP_RETURN output with non-zero amount') else: raise SigningError(FailureType.SyntaxError, 'Invalid output script type') @@ -421,6 +428,13 @@ def script_paytoscripthash_new(scripthash: bytes) -> bytearray: s[22] = 0x87 # OP_EQUAL return s +def script_paytoopreturn_new(data: bytes) -> bytearray: + w = bytearray() + w.append(0x6A) # OP_RETURN + write_op_push(w, len(data)) + w.extend(data) + return w + def script_spendaddress_new(pubkey: bytes, signature: bytes) -> bytearray: w = bytearray() write_op_push(w, len(signature) + 1)