1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-18 04:18:10 +00:00

chore(legacy): Recognize Taproot script types.

This commit is contained in:
Andrew Kozlik 2021-11-10 13:51:03 +01:00 committed by Andrew Kozlik
parent 6c9c727359
commit aed79eec65
2 changed files with 47 additions and 5 deletions

View File

@ -920,6 +920,7 @@ void signing_init(const SignTx *msg, const CoinInfo *_coin,
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
static bool is_multisig_input_script_type(const TxInputType *txinput) {
// we do not support Multisig with Taproot yet
if (txinput->script_type == InputScriptType_SPENDMULTISIG ||
txinput->script_type == InputScriptType_SPENDP2SHWITNESS ||
txinput->script_type == InputScriptType_SPENDWITNESS) {
@ -929,6 +930,7 @@ static bool is_multisig_input_script_type(const TxInputType *txinput) {
}
static bool is_multisig_output_script_type(const TxOutputType *txoutput) {
// we do not support Multisig with Taproot yet
if (txoutput->script_type == OutputScriptType_PAYTOMULTISIG ||
txoutput->script_type == OutputScriptType_PAYTOP2SHWITNESS ||
txoutput->script_type == OutputScriptType_PAYTOWITNESS) {
@ -941,7 +943,8 @@ static bool is_internal_input_script_type(const TxInputType *txinput) {
if (txinput->script_type == InputScriptType_SPENDADDRESS ||
txinput->script_type == InputScriptType_SPENDMULTISIG ||
txinput->script_type == InputScriptType_SPENDP2SHWITNESS ||
txinput->script_type == InputScriptType_SPENDWITNESS) {
txinput->script_type == InputScriptType_SPENDWITNESS ||
txinput->script_type == InputScriptType_SPENDTAPROOT) {
return true;
}
return false;
@ -951,7 +954,8 @@ static bool is_change_output_script_type(const TxOutputType *txoutput) {
if (txoutput->script_type == OutputScriptType_PAYTOADDRESS ||
txoutput->script_type == OutputScriptType_PAYTOMULTISIG ||
txoutput->script_type == OutputScriptType_PAYTOP2SHWITNESS ||
txoutput->script_type == OutputScriptType_PAYTOWITNESS) {
txoutput->script_type == OutputScriptType_PAYTOWITNESS ||
txoutput->script_type == OutputScriptType_PAYTOTAPROOT) {
return true;
}
return false;
@ -959,7 +963,17 @@ static bool is_change_output_script_type(const TxOutputType *txoutput) {
static bool is_segwit_input_script_type(const TxInputType *txinput) {
if (txinput->script_type == InputScriptType_SPENDP2SHWITNESS ||
txinput->script_type == InputScriptType_SPENDWITNESS) {
txinput->script_type == InputScriptType_SPENDWITNESS ||
txinput->script_type == InputScriptType_SPENDTAPROOT) {
return true;
}
return false;
}
static bool is_segwit_output_script_type(const TxOutputType *txoutput) {
if (txoutput->script_type == OutputScriptType_PAYTOP2SHWITNESS ||
txoutput->script_type == OutputScriptType_PAYTOWITNESS ||
txoutput->script_type == OutputScriptType_PAYTOTAPROOT) {
return true;
}
return false;
@ -980,9 +994,9 @@ static bool signing_validate_input(const TxInputType *txinput) {
return false;
}
if (txinput->address_n_count > 0 && !is_internal_input_script_type(txinput)) {
if (!is_internal_input_script_type(txinput)) {
fsm_sendFailure(FailureType_Failure_DataError,
"Input's address_n provided but not expected.");
_("Unsupported script type."));
signing_abort();
return false;
}
@ -996,6 +1010,14 @@ static bool signing_validate_input(const TxInputType *txinput) {
}
}
if (txinput->script_type == InputScriptType_SPENDTAPROOT &&
!coin->has_taproot) {
fsm_sendFailure(FailureType_Failure_DataError,
_("Taproot not enabled on this coin."));
signing_abort();
return false;
}
if (txinput->has_orig_hash) {
if (!txinput->has_orig_index) {
fsm_sendFailure(FailureType_Failure_DataError,
@ -1065,6 +1087,23 @@ static bool signing_validate_output(TxOutputType *txoutput) {
}
}
if (is_segwit_output_script_type(txoutput)) {
if (!coin->has_segwit) {
fsm_sendFailure(FailureType_Failure_DataError,
_("Segwit not enabled on this coin"));
signing_abort();
return false;
}
}
if (txoutput->script_type == OutputScriptType_PAYTOTAPROOT &&
!coin->has_taproot) {
fsm_sendFailure(FailureType_Failure_DataError,
_("Taproot not enabled on this coin."));
signing_abort();
return false;
}
if (txoutput->has_orig_hash) {
if (!txoutput->has_orig_index) {
fsm_sendFailure(FailureType_Failure_DataError,

View File

@ -273,6 +273,9 @@ int compile_output(const CoinInfo *coin, AmountUnit amount_unit,
case OutputScriptType_PAYTOP2SHWITNESS:
input_script_type = InputScriptType_SPENDP2SHWITNESS;
break;
case OutputScriptType_PAYTOTAPROOT:
input_script_type = InputScriptType_SPENDTAPROOT;
break;
default:
return 0; // failed to compile output
}