feat(Ripple): Support AccountDelete Transaction
What changed, and why it matters
This commit adds support for a new Ripple transaction type called AccountDelete to Trezor hardware wallets. It is a feature addition, not a security patch. The change lets users sign transactions that delete a Ripple account and send any remaining balance to a chosen destination. The code adds user-facing confirmation screens and enforces that a transaction cannot be both a payment and an account deletion. There is no direct evidence in the commit of a security vulnerability, but any new signing path deserves careful review because bugs could let an attacker trick a user into deleting an account or signing an unintended transaction.
Review the new AccountDelete signing path for correct serialization ordering, field presence checks, and user-interface clarity. Verify that the mutual-exclusion check cannot be bypassed by malformed protobuf input, and confirm that the destination address is validated and chunked consistently with existing payment flows. Consider whether the AccountDelete flow needs an explicit total-value confirmation beyond the fee, since the remaining account balance is not shown.
Security signals we found
New transaction signing path added for Ripple AccountDelete
Mutual-exclusion check added between payment and account_delete fields
User confirmation screens added for account deletion
Transaction type constant 21 introduced in serialization
Protobuf required/optional flags changed: payment becomes optional, account_delete optional
Host library validation added to reject unsupported transaction types and missing fields
Evidence from the diff
The commit extends Ripple transaction signing in Trezor firmware to support the XRP Ledger AccountDelete transaction type (transaction type 21). It modifies the protobuf definition so RippleSignTx can carry either a RipplePayment or a RippleAccountDelete, but not both. The firmware now branches in apps/ripple/sign_tx.py and apps/ripple/serialize.py to validate, display, and serialize AccountDelete transactions. A new layout flow in apps/ripple/layout.py shows a warning, the account to be deleted, the recipient address, and the fee. The host-side Python and Rust protobuf bindings are regenerated, and tests plus translation strings are added. A small unrelated UI change in core/src/trezor/ui/layouts/caesar/init.py stops passing a description value in one menu helper, which appears to be a cleanup rather than a security fix.
Changed components
core/src/apps/ripple/sign_tx.pycore/src/apps/ripple/serialize.pycore/src/apps/ripple/layout.pycommon/protob/messages-ripple.protocore/src/trezor/messages.pypython/src/trezorlib/messages.pypython/src/trezorlib/ripple.pyrust/trezor-client/src/protos/generated/messages_ripple.rscore/src/trezor/ui/layouts/caesar/__init__.pyInspect captured patch +665 / −101
diff --git a/common/protob/messages-ripple.proto b/common/protob/messages-ripple.proto
index 1bc5bc85..2afdb0c4 100644
--- a/common/protob/messages-ripple.proto
+++ b/common/protob/messages-ripple.proto
@@ -35,13 +35,14 @@ message RippleAddress {
message RippleSignTx {
repeated uint32 address_n = 1; // BIP-32 path. For compatibility with other wallets, must be m/44'/144'/index'
required uint64 fee = 2; // fee (in drops) for the transaction
- optional uint32 flags = 3 [default = 0]; // transaction flags
- required uint32 sequence = 4; // transaction sequence number
- optional uint32 last_ledger_sequence = 5; // see
- // https://developers.ripple.com/reliable-transaction-submission.html#lastledgersequence
- required RipplePayment payment = 6; // Payment transaction type
+ optional uint32 flags = 3 [default = 0]; // transaction flags
+ required uint32 sequence = 4; // transaction sequence number
+ optional uint32 last_ledger_sequence =
+ 5; // see https://developers.ripple.com/reliable-transaction-submission.html#lastledgersequence
+ optional RipplePayment payment = 6; // Payment transaction type. Mutually exclusive with account_delete
optional bool chunkify = 7; // display the address in chunks of 4 characters
optional common.PaymentRequest payment_req = 8; // SLIP-24 payment request
+ optional RippleAccountDelete account_delete = 9; // AccountDelete transaction type. Mutually exclusive with payment
/**
* Payment transaction type
@@ -54,6 +55,15 @@ message RippleSignTx {
required string destination = 2; // destination account address
optional uint32 destination_tag = 3; // destination tag to identify payments
}
+
+ /**
+ * AccountDelete transaction type
+ * - deletes an account and sends remaining XRP to the destination account
+ * - see https://xrpl.org/docs/references/protocol/transactions/types/accountdelete
+ */
+ message RippleAccountDelete {
+ required string destination = 1; // destination account address
+ }
}
/**
diff --git a/core/.changelog.d/6370.added b/core/.changelog.d/6370.added
new file mode 100644
index 00000000..859089d5
--- /dev/null
+++ b/core/.changelog.d/6370.added
@@ -0,0 +1 @@
+Added support for `AccountDelete` transaction in Ripple.
diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h
index fbee667e..7883accc 100644
--- a/core/embed/rust/librust_qstr.h
+++ b/core/embed/rust/librust_qstr.h
@@ -975,6 +975,7 @@ static void _librust_qstrs(void) {
MP_QSTR_words__about;
MP_QSTR_words__account;
MP_QSTR_words__account_colon;
+ MP_QSTR_words__account_deletion;
MP_QSTR_words__address;
MP_QSTR_words__amount;
MP_QSTR_words__are_you_sure;
@@ -1397,6 +1398,8 @@ static void _librust_qstrs(void) {
MP_QSTR_nem__unencrypted;
MP_QSTR_nem__unknown_mosaic;
MP_QSTR_nostr__event_kind_template;
+ MP_QSTR_ripple__account_deletion_warning;
+ MP_QSTR_ripple__account_to_be_deleted;
MP_QSTR_ripple__confirm_tag;
MP_QSTR_ripple__destination_tag_missing;
MP_QSTR_ripple__destination_tag_template;
diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs
index 097e0518..4497ae76 100644
--- a/core/embed/rust/src/translations/generated/translated_string.rs
+++ b/core/embed/rust/src/translations/generated/translated_string.rs
@@ -1616,7 +1616,12 @@ pub enum TranslatedString {
n4w1__err_empty = 1223, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "This tag is empty. Continue to scan a different tag."}
n4w1__err_nonempty = 1224, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "Non-empty N4W1 tag."}
n4w1__err_damaged = 1225, // {"Bolt": "", "Caesar": "", "Delizia": "", "Eckhart": "This tag is damaged. Continue to try again or scan the next tag."}
- words__tap_to_wake = 1226, // "Tap to wake"
+ #[cfg(feature = "universal_fw")]
+ ripple__account_deletion_warning = 1226, // "Delete Ripple account?"
+ #[cfg(feature = "universal_fw")]
+ ripple__account_to_be_deleted = 1227, // "To be deleted:"
+ words__account_deletion = 1228, // "Account deletion"
+ words__tap_to_wake = 1229, // "Tap to wake"
}
impl TranslatedString {
@@ -2850,6 +2855,9 @@ impl TranslatedString {
"",
"",
"",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -4082,7 +4090,10 @@ impl TranslatedString {
19800,
19800,
19800,
- 19811,
+ 19822,
+ 19836,
+ 19852,
+ 19863,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -5313,6 +5324,9 @@ impl TranslatedString {
"",
"",
"",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -6545,7 +6559,10 @@ impl TranslatedString {
19800,
19800,
19800,
- 19811,
+ 19822,
+ 19836,
+ 19852,
+ 19863,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -7776,6 +7793,9 @@ impl TranslatedString {
"",
"",
"",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -9008,7 +9028,10 @@ impl TranslatedString {
19800,
19800,
19800,
- 19811,
+ 19822,
+ 19836,
+ 19852,
+ 19863,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -10239,6 +10262,9 @@ impl TranslatedString {
"",
"",
"",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -11471,7 +11497,10 @@ impl TranslatedString {
19800,
19800,
19800,
- 19811,
+ 19822,
+ 19836,
+ 19852,
+ 19863,
];
} else if #[cfg(feature = "layout_caesar")] {
@@ -12703,6 +12732,9 @@ impl TranslatedString {
"",
"",
"",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -13935,7 +13967,10 @@ impl TranslatedString {
17734,
17734,
17734,
- 17745,
+ 17756,
+ 17770,
+ 17786,
+ 17797,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -15166,6 +15201,9 @@ impl TranslatedString {
"",
"",
"",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -16398,7 +16436,10 @@ impl TranslatedString {
17734,
17734,
17734,
- 17745,
+ 17756,
+ 17770,
+ 17786,
+ 17797,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -17629,6 +17670,9 @@ impl TranslatedString {
"",
"",
"",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -18861,7 +18905,10 @@ impl TranslatedString {
17734,
17734,
17734,
- 17745,
+ 17756,
+ 17770,
+ 17786,
+ 17797,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -20092,6 +20139,9 @@ impl TranslatedString {
"",
"",
"",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -21324,7 +21374,10 @@ impl TranslatedString {
17734,
17734,
17734,
- 17745,
+ 17756,
+ 17770,
+ 17786,
+ 17797,
];
} else if #[cfg(feature = "layout_delizia")] {
@@ -22556,6 +22609,9 @@ impl TranslatedString {
"",
"",
"",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -23788,7 +23844,10 @@ impl TranslatedString {
19154,
19154,
19154,
- 19165,
+ 19176,
+ 19190,
+ 19206,
+ 19217,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -25019,6 +25078,9 @@ impl TranslatedString {
"",
"",
"",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -26251,7 +26313,10 @@ impl TranslatedString {
19154,
19154,
19154,
- 19165,
+ 19176,
+ 19190,
+ 19206,
+ 19217,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -27482,6 +27547,9 @@ impl TranslatedString {
"",
"",
"",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -28714,7 +28782,10 @@ impl TranslatedString {
19154,
19154,
19154,
- 19165,
+ 19176,
+ 19190,
+ 19206,
+ 19217,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -29945,6 +30016,9 @@ impl TranslatedString {
"",
"",
"",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -31177,7 +31251,10 @@ impl TranslatedString {
19154,
19154,
19154,
- 19165,
+ 19176,
+ 19190,
+ 19206,
+ 19217,
];
} else if #[cfg(feature = "layout_eckhart")] {
@@ -32409,6 +32486,9 @@ impl TranslatedString {
"This tag is empty. Continue to scan a different tag.",
"Non-empty N4W1 tag.",
"This tag is damaged. Continue to try again or scan the next tag.",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -33641,7 +33721,10 @@ impl TranslatedString {
20418,
20437,
20501,
- 20512,
+ 20523,
+ 20537,
+ 20553,
+ 20564,
];
#[cfg(all(feature = "debug", not(feature = "universal_fw")))]
@@ -34872,6 +34955,9 @@ impl TranslatedString {
"This tag is empty. Continue to scan a different tag.",
"Non-empty N4W1 tag.",
"This tag is damaged. Continue to try again or scan the next tag.",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -36104,7 +36190,10 @@ impl TranslatedString {
20418,
20437,
20501,
- 20512,
+ 20523,
+ 20537,
+ 20553,
+ 20564,
];
#[cfg(all(not(feature = "debug"), feature = "universal_fw"))]
@@ -37335,6 +37424,9 @@ impl TranslatedString {
"This tag is empty. Continue to scan a different tag.",
"Non-empty N4W1 tag.",
"This tag is damaged. Continue to try again or scan the next tag.",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -38567,7 +38659,10 @@ impl TranslatedString {
20418,
20437,
20501,
- 20512,
+ 20523,
+ 20537,
+ 20553,
+ 20564,
];
#[cfg(all(not(feature = "debug"), not(feature = "universal_fw")))]
@@ -39798,6 +39893,9 @@ impl TranslatedString {
"This tag is empty. Continue to scan a different tag.",
"Non-empty N4W1 tag.",
"This tag is damaged. Continue to try again or scan the next tag.",
+ "Delete Ripple account?",
+ "To be deleted:",
+ "Account deletion",
"Tap to wake",
);
@@ -41030,7 +41128,10 @@ impl TranslatedString {
20418,
20437,
20501,
- 20512,
+ 20523,
+ 20537,
+ 20553,
+ 20564,
];
}
@@ -42169,6 +42270,10 @@ impl TranslatedString {
(Qstr::MP_QSTR_reset__you_need_one_share, Self::reset__you_need_one_share),
(Qstr::MP_QSTR_reset__your_backup_is_done, Self::reset__your_backup_is_done),
#[cfg(feature = "universal_fw")]
+ (Qstr::MP_QSTR_ripple__account_deletion_warning, Self::ripple__account_deletion_warning),
+ #[cfg(feature = "universal_fw")]
+ (Qstr::MP_QSTR_ripple__account_to_be_deleted, Self::ripple__account_to_be_deleted),
+ #[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_ripple__confirm_tag, Self::ripple__confirm_tag),
#[cfg(feature = "universal_fw")]
(Qstr::MP_QSTR_ripple__destination_tag_missing, Self::ripple__destination_tag_missing),
@@ -42552,6 +42657,7 @@ impl TranslatedString {
(Qstr::MP_QSTR_words__about, Self::words__about),
(Qstr::MP_QSTR_words__account, Self::words__account),
(Qstr::MP_QSTR_words__account_colon, Self::words__account_colon),
+ (Qstr::MP_QSTR_words__account_deletion, Self::words__account_deletion),
(Qstr::MP_QSTR_words__address, Self::words__address),
(Qstr::MP_QSTR_words__amount, Self::words__amount),
(Qstr::MP_QSTR_words__are_you_sure, Self::words__are_you_sure),
diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi
index bdc87ea1..380742bf 100644
--- a/core/mocks/trezortranslate_keys.pyi
+++ b/core/mocks/trezortranslate_keys.pyi
@@ -803,6 +803,8 @@ class TR:
reset__wrong_word_selected: str = "Wrong word selected!"
reset__you_need_one_share: str = "For recovery you need 1 share."
reset__your_backup_is_done: str = "Your backup is done."
+ ripple__account_deletion_warning: str = "Delete Ripple account?"
+ ripple__account_to_be_deleted: str = "To be deleted:"
ripple__confirm_tag: str = "Confirm tag"
ripple__destination_tag_missing: str = "Destination tag is not set. Typically needed when sending to exchanges."
ripple__destination_tag_template: str = "Destination tag:\n{0}"
@@ -1074,6 +1076,7 @@ class TR:
words__about: str = "About"
words__account: str = "Account"
words__account_colon: str = "Account:"
+ words__account_deletion: str = "Account deletion"
words__address: str = "Address"
words__amount: str = "Amount"
words__are_you_sure: str = "Are you sure?"
diff --git a/core/src/apps/ripple/layout.py b/core/src/apps/ripple/layout.py
index 8dd7286b..b18de6ad 100644
--- a/core/src/apps/ripple/layout.py
+++ b/core/src/apps/ripple/layout.py
@@ -99,3 +99,48 @@ async def require_confirm_payment_request(
None,
None,
)
+
+
+async def confirm_account_deletion(
+ source_address: str,
+ source_account_path: list[int],
+ destination_address: str,
+ fee: int,
+ chunkify: bool,
+) -> None:
+ from trezor import TR
+ from trezor.ui.layouts import confirm_address, confirm_value, show_warning
+
+ from apps.common.paths import address_n_to_str
+
+ await show_warning(
+ br_name="account_deletion_warning",
+ content=TR.ripple__account_deletion_warning,
+ )
+ await confirm_address(
+ title=TR.words__account_deletion,
+ subtitle=TR.ripple__account_to_be_deleted,
+ address=source_address,
+ chunkify=chunkify,
+ br_name="ripple/AccountDelete/source_address",
+ )
+ await confirm_address(
+ title=TR.words__account_deletion,
+ subtitle=TR.words__recipient,
+ address=destination_address,
+ chunkify=chunkify,
+ br_name="ripple/AccountDelete/recipient_address",
+ )
+ await confirm_value(
+ title=TR.words__account_deletion,
+ value=format_amount_unit(format_amount(fee, DECIMALS), "XRP"),
+ br_name="ripple/AccountDelete/fee",
+ description=TR.words__fee_limit,
+ info_items=[
+ (
+ TR.address_details__derivation_path,
+ address_n_to_str(source_account_path),
+ False,
+ )
+ ],
+ )
diff --git a/core/src/apps/ripple/serialize.py b/core/src/apps/ripple/serialize.py
index f18f4a3d..5283828b 100644
--- a/core/src/apps/ripple/serialize.py
+++ b/core/src/apps/ripple/serialize.py
@@ -31,20 +31,37 @@ def serialize(
pubkey: AnyBytes,
signature: AnyBytes | None = None,
) -> bytearray:
+ payment = msg.payment
+ account_delete = msg.account_delete
# must be sorted numerically first by type and then by name
- fields_to_write = ( # field_type, field_key, value
- (_FIELD_TYPE_INT16, 2, 0), # payment type is 0
- (_FIELD_TYPE_INT32, 2, msg.flags), # flags
- (_FIELD_TYPE_INT32, 4, msg.sequence), # sequence
- (_FIELD_TYPE_INT32, 14, msg.payment.destination_tag), # destinationTag
- (_FIELD_TYPE_INT32, 27, msg.last_ledger_sequence), # lastLedgerSequence
- (_FIELD_TYPE_AMOUNT, 1, msg.payment.amount), # amount
- (_FIELD_TYPE_AMOUNT, 8, msg.fee), # fee
- (_FIELD_TYPE_VL, 3, pubkey), # signingPubKey
- (_FIELD_TYPE_VL, 4, signature), # txnSignature
- (_FIELD_TYPE_ACCOUNT, 1, source_address), # account
- (_FIELD_TYPE_ACCOUNT, 3, msg.payment.destination), # destination
- )
+ if payment is not None:
+ fields_to_write = ( # field_type, field_key, value
+ (_FIELD_TYPE_INT16, 2, 0), # payment type is 0
+ (_FIELD_TYPE_INT32, 2, msg.flags), # flags
+ (_FIELD_TYPE_INT32, 4, msg.sequence), # sequence
+ (_FIELD_TYPE_INT32, 14, payment.destination_tag), # destinationTag
+ (_FIELD_TYPE_INT32, 27, msg.last_ledger_sequence), # lastLedgerSequence
+ (_FIELD_TYPE_AMOUNT, 1, payment.amount), # amount
+ (_FIELD_TYPE_AMOUNT, 8, msg.fee), # fee
+ (_FIELD_TYPE_VL, 3, pubkey), # signingPubKey
+ (_FIELD_TYPE_VL, 4, signature), # txnSignature
+ (_FIELD_TYPE_ACCOUNT, 1, source_address), # account
+ (_FIELD_TYPE_ACCOUNT, 3, payment.destination), # destination
+ )
+ else:
+ assert account_delete is not None
+ fields_to_write = ( # AccountDelete transaction
+ (_FIELD_TYPE_INT16, 2, 21), # accountDelete type is 21
+ (_FIELD_TYPE_INT32, 2, msg.flags), # flags
+ (_FIELD_TYPE_INT32, 4, msg.sequence), # sequence
+ (_FIELD_TYPE_INT32, 27, msg.last_ledger_sequence), # lastLedgerSequence
+ (_FIELD_TYPE_AMOUNT, 8, msg.fee), # fee
+ (_FIELD_TYPE_VL, 3, pubkey), # signingPubKey
+ (_FIELD_TYPE_VL, 4, signature), # txnSignature
+ (_FIELD_TYPE_ACCOUNT, 1, source_address), # Holder account
+ # Destination account for remaining XRP
+ (_FIELD_TYPE_ACCOUNT, 3, account_delete.destination),
+ )
w = bytearray()
for field_type, field_key, value in fields_to_write:
diff --git a/core/src/apps/ripple/sign_tx.py b/core/src/apps/ripple/sign_tx.py
index d332f13f..c1e12870 100644
--- a/core/src/apps/ripple/sign_tx.py
+++ b/core/src/apps/ripple/sign_tx.py
@@ -11,7 +11,7 @@ if TYPE_CHECKING:
# NOTE: it is one big function because that way it is the most flash-space-efficient
@auto_keychain(__name__, slip21_namespaces=[[b"SLIP-0024"]])
async def sign_tx(msg: RippleSignTx, keychain: Keychain) -> RippleSignedTx:
- from trezor import TR
+ from trezor import TR, wire
from trezor.crypto import der
from trezor.crypto.curve import secp256k1
from trezor.crypto.hashlib import sha512
@@ -24,15 +24,19 @@ async def sign_tx(msg: RippleSignTx, keychain: Keychain) -> RippleSignedTx:
from . import SLIP44_ID, helpers, layout
from .serialize import serialize
- payment = msg.payment # local_cache_attribute
+ payment = msg.payment
+ account_delete = msg.account_delete
+ if (payment is None) == (account_delete is None):
+ raise wire.DataError("Transaction cannot be both payment and account delete.")
- if payment.amount > helpers.MAX_ALLOWED_AMOUNT:
- raise ProcessError("Amount exceeds maximum allowed amount.")
await paths.validate_path(keychain, msg.address_n)
node = keychain.derive(msg.address_n)
source_address = helpers.address_from_public_key(node.public_key())
+ if payment is not None and payment.amount > helpers.MAX_ALLOWED_AMOUNT:
+ raise ProcessError("Amount exceeds maximum allowed amount.")
+
# Setting canonical flag
# Our ECDSA implementation already returns fully-canonical signatures,
# so we're enforcing it in the transaction using the designated flag
@@ -48,6 +52,7 @@ async def sign_tx(msg: RippleSignTx, keychain: Keychain) -> RippleSignedTx:
raise ProcessError("Fee must be in the range of 10 to 10,000 drops")
if msg.payment_req:
+ assert payment is not None # payment_req implies payment
from apps.common.payment_request import PaymentRequestVerifier
verifier = PaymentRequestVerifier(msg.payment_req, SLIP44_ID, keychain)
@@ -59,7 +64,8 @@ async def sign_tx(msg: RippleSignTx, keychain: Keychain) -> RippleSignedTx:
await layout.require_confirm_payment_request(
address, msg.payment_req, msg.address_n
)
- else:
+ await layout.require_confirm_total(payment.amount + msg.fee, msg.fee)
+ elif payment is not None:
if payment.destination_tag is not None:
await layout.require_confirm_destination_tag(payment.destination_tag)
else:
@@ -72,7 +78,16 @@ async def sign_tx(msg: RippleSignTx, keychain: Keychain) -> RippleSignedTx:
payment.destination, payment.amount, chunkify=bool(msg.chunkify)
)
- await layout.require_confirm_total(payment.amount + msg.fee, msg.fee)
+ await layout.require_confirm_total(payment.amount + msg.fee, msg.fee)
+ else:
+ assert account_delete is not None
+ await layout.confirm_account_deletion(
+ source_address,
+ msg.address_n,
+ account_delete.destination,
+ msg.fee,
+ bool(msg.chunkify),
+ )
# Signs and encodes signature into DER format
first_half_of_sha512 = sha512(to_sign).digest()[:32]
diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py
index 40e23388..3109530d 100644
--- a/core/src/trezor/messages.py
+++ b/core/src/trezor/messages.py
@@ -5789,21 +5789,23 @@ if TYPE_CHECKING:
flags: "int"
sequence: "int"
last_ledger_sequence: "int | None"
- payment: "RipplePayment"
+ payment: "RipplePayment | None"
chunkify: "bool | None"
payment_req: "PaymentRequest | None"
+ account_delete: "RippleAccountDelete | None"
def __init__(
self,
*,
fee: "int",
sequence: "int",
- payment: "RipplePayment",
address_n: "list[int] | None" = None,
flags: "int | None" = None,
last_ledger_sequence: "int | None" = None,
+ payment: "RipplePayment | None" = None,
chunkify: "bool | None" = None,
payment_req: "PaymentRequest | None" = None,
+ account_delete: "RippleAccountDelete | None" = None,
) -> None:
pass
@@ -5845,6 +5847,20 @@ if TYPE_CHECKING:
def is_type_of(cls, msg: Any) -> TypeGuard["RipplePayment"]:
return isinstance(msg, cls)
+ class RippleAccountDelete(protobuf.MessageType):
+ destination: "str"
+
+ def __init__(
+ self,
+ *,
+ destination: "str",
+ ) -> None:
+ pass
+
+ @classmethod
+ def is_type_of(cls, msg: Any) -> TypeGuard["RippleAccountDelete"]:
+ return isinstance(msg, cls)
+
class SolanaGetPublicKey(protobuf.MessageType):
address_n: "list[int]"
show_display: "bool | None"
diff --git a/core/src/trezor/ui/layouts/caesar/__init__.py b/core/src/trezor/ui/layouts/caesar/__init__.py
index 2ecfe9f9..6e02a439 100644
--- a/core/src/trezor/ui/layouts/caesar/__init__.py
+++ b/core/src/trezor/ui/layouts/caesar/__init__.py
@@ -992,7 +992,7 @@ def confirm_value(
return lambda: trezorui_api.confirm_value(
title=info_title,
value=info_value,
- description=description,
+ description=None,
verb="",
verb_cancel="",
is_data=is_data,
diff --git a/core/translations/en.json b/core/translations/en.json
index f9fdd09c..68648359 100644
--- a/core/translations/en.json
+++ b/core/translations/en.json
@@ -2350,6 +2350,8 @@
"Eckhart": ""
},
"reset__your_backup_is_done": "Your backup is done.",
+ "ripple__account_deletion_warning": "Delete Ripple account?",
+ "ripple__account_to_be_deleted": "To be deleted:",
"ripple__confirm_tag": "Confirm tag",
"ripple__destination_tag_missing": "Destination tag is not set. Typically needed when sending to exchanges.",
"ripple__destination_tag_template": "Destination tag:\n{0}",
@@ -3056,6 +3058,7 @@
"words__about": "About",
"words__account": "Account",
"words__account_colon": "Account:",
+ "words__account_deletion": "Account deletion",
"words__address": "Address",
"words__amount": "Amount",
"words__are_you_sure": "Are you sure?",
diff --git a/core/translations/order.json b/core/translations/order.json
index d4d91744..a765c468 100644
--- a/core/translations/order.json
+++ b/core/translations/order.json
@@ -1225,5 +1225,8 @@
"1223": "n4w1__err_empty",
"1224": "n4w1__err_nonempty",
"1225": "n4w1__err_damaged",
- "1226": "words__tap_to_wake"
+ "1226": "ripple__account_deletion_warning",
+ "1227": "ripple__account_to_be_deleted",
+ "1228": "words__account_deletion",
+ "1229": "words__tap_to_wake"
}
diff --git a/core/translations/signatures.json b/core/translations/signatures.json
index 2b62e19e..ad061031 100644
--- a/core/translations/signatures.json
+++ b/core/translations/signatures.json
@@ -1,8 +1,8 @@
{
"current": {
- "merkle_root": "03e72560bfe641e7e6ecabc1283d7f65f4bdef67d606ca1b4f987d24c99996e8",
- "datetime": "2026-05-21T13:53:28.778228+00:00",
- "commit": "9dc08577d1b60a5b3765b9be4109bc29436a5d7d"
+ "merkle_root": "cc8d3264ce78dfbb132864ec2dc4b6effb9aa5f57ad69b488013bda77027336c",
+ "datetime": "2026-05-22T13:45:57.367319+00:00",
+ "commit": "fb9f5e5cbd91de026cc839738854ecc177609a31"
},
"history": [
{
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index a6a9903f..9e4efb09 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -7531,9 +7531,10 @@ class RippleSignTx(protobuf.MessageType):
3: protobuf.Field("flags", "uint32", repeated=False, required=False, default=0),
4: protobuf.Field("sequence", "uint32", repeated=False, required=True),
5: protobuf.Field("last_ledger_sequence", "uint32", repeated=False, required=False, default=None),
- 6: protobuf.Field("payment", "RipplePayment", repeated=False, required=True),
+ 6: protobuf.Field("payment", "RipplePayment", repeated=False, required=False, default=None),
7: protobuf.Field("chunkify", "bool", repeated=False, required=False, default=None),
8: protobuf.Field("payment_req", "PaymentRequest", repeated=False, required=False, default=None),
+ 9: protobuf.Field("account_delete", "RippleAccountDelete", repeated=False, required=False, default=None),
}
def __init__(
@@ -7541,21 +7542,23 @@ class RippleSignTx(protobuf.MessageType):
*,
fee: "int",
sequence: "int",
- payment: "RipplePayment",
address_n: Optional[Sequence["int"]] = None,
flags: Optional["int"] = 0,
last_ledger_sequence: Optional["int"] = None,
+ payment: Optional["RipplePayment"] = None,
chunkify: Optional["bool"] = None,
payment_req: Optional["PaymentRequest"] = None,
+ account_delete: Optional["RippleAccountDelete"] = None,
) -> None:
self.address_n: Sequence["int"] = address_n if address_n is not None else []
self.fee = fee
self.sequence = sequence
- self.payment = payment
self.flags = flags
self.last_ledger_sequence = last_ledger_sequence
+ self.payment = payment
self.chunkify = chunkify
self.payment_req = payment_req
+ self.account_delete = account_delete
class RippleSignedTx(protobuf.MessageType):
@@ -7595,6 +7598,20 @@ class RipplePayment(protobuf.MessageType):
self.destination_tag = destination_tag
+class RippleAccountDelete(protobuf.MessageType):
+ MESSAGE_WIRE_TYPE = None
+ FIELDS = {
+ 1: protobuf.Field("destination", "string", repeated=False, required=True),
+ }
+
+ def __init__(
+ self,
+ *,
+ destination: "str",
+ ) -> None:
+ self.destination = destination
+
+
class SolanaGetPublicKey(protobuf.MessageType):
MESSAGE_WIRE_TYPE = 900
FIELDS = {
diff --git a/python/src/trezorlib/ripple.py b/python/src/trezorlib/ripple.py
index c6b20a77..e9fee690 100644
--- a/python/src/trezorlib/ripple.py
+++ b/python/src/trezorlib/ripple.py
@@ -24,8 +24,9 @@ if TYPE_CHECKING:
from .client import Session
from .tools import Address
-REQUIRED_FIELDS = ("Fee", "Sequence", "TransactionType", "Payment")
+REQUIRED_FIELDS = ("Fee", "Sequence", "TransactionType")
REQUIRED_PAYMENT_FIELDS = ("Amount", "Destination")
+REQUIRED_ACCOUNT_DELETE_FIELDS = ("Destination",)
def get_address(*args: Any, **kwargs: Any) -> str:
@@ -64,10 +65,25 @@ def sign_tx(
def create_sign_tx_msg(transaction: dict) -> messages.RippleSignTx:
if not all(transaction.get(k) for k in REQUIRED_FIELDS):
raise ValueError("Some of the required fields missing")
- if not all(transaction["Payment"].get(k) for k in REQUIRED_PAYMENT_FIELDS):
- raise ValueError("Some of the required payment fields missing")
- if transaction["TransactionType"] != "Payment":
- raise ValueError("Only Payment transaction type is supported")
+ tx_type = transaction["TransactionType"]
+ if tx_type not in ("Payment", "AccountDelete"):
+ raise ValueError(
+ "Only Payment and AccountDelete transaction types are supported"
+ )
+ if "Payment" in transaction and "AccountDelete" in transaction:
+ raise ValueError("Transaction cannot contain both Payment and AccountDelete")
+ if tx_type == "Payment":
+ if "Payment" not in transaction:
+ raise ValueError("Payment transaction missing Payment object")
+ if not all(transaction["Payment"].get(k) for k in REQUIRED_PAYMENT_FIELDS):
+ raise ValueError("Some of the required payment fields missing")
+ elif tx_type == "AccountDelete":
+ if "AccountDelete" not in transaction:
+ raise ValueError("AccountDelete transaction missing AccountDelete object")
+ if not all(
+ transaction["AccountDelete"].get(k) for k in REQUIRED_ACCOUNT_DELETE_FIELDS
+ ):
+ raise ValueError("Some of the required account delete fields missing")
converted = dict_from_camelcase(transaction)
return dict_to_proto(messages.RippleSignTx, converted)
diff --git a/rust/trezor-client/src/protos/generated/messages_ripple.rs b/rust/trezor-client/src/protos/generated/messages_ripple.rs
index f5859cf6..e7aa4a49 100644
--- a/rust/trezor-client/src/protos/generated/messages_ripple.rs
+++ b/rust/trezor-client/src/protos/generated/messages_ripple.rs
@@ -458,6 +458,8 @@ pub struct RippleSignTx {
pub chunkify: ::std::option::Option<bool>,
// @@protoc_insertion_point(field:hw.trezor.messages.ripple.RippleSignTx.payment_req)
pub payment_req: ::protobuf::MessageField<super::messages_common::PaymentRequest>,
+ // @@protoc_insertion_point(field:hw.trezor.messages.ripple.RippleSignTx.account_delete)
+ pub account_delete: ::protobuf::MessageField<ripple_sign_tx::RippleAccountDelete>,
// special fields
// @@protoc_insertion_point(special_field:hw.trezor.messages.ripple.RippleSignTx.special_fields)
pub special_fields: ::protobuf::SpecialFields,
@@ -570,7 +572,7 @@ impl RippleSignTx {
}
fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
- let mut fields = ::std::vec::Vec::with_capacity(8);
+ let mut fields = ::std::vec::Vec::with_capacity(9);
let mut oneofs = ::std::vec::Vec::with_capacity(0);
fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
"address_n",
@@ -612,6 +614,11 @@ impl RippleSignTx {
|m: &RippleSignTx| { &m.payment_req },
|m: &mut RippleSignTx| { &mut m.payment_req },
));
+ fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, ripple_sign_tx::RippleAccountDelete>(
+ "account_delete",
+ |m: &RippleSignTx| { &m.account_delete },
+ |m: &mut RippleSignTx| { &mut m.account_delete },
+ ));
::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<RippleSignTx>(
"RippleSignTx",
fields,
@@ -630,9 +637,6 @@ impl ::protobuf::Message for RippleSignTx {
if self.sequence.is_none() {
return false;
}
- if self.payment.is_none() {
- return false;
- }
for v in &self.payment {
if !v.is_initialized() {
return false;
@@ -643,6 +647,11 @@ impl ::protobuf::Message for RippleSignTx {
return false;
}
};
+ for v in &self.account_delete {
+ if !v.is_initialized() {
+ return false;
+ }
+ };
true
}
@@ -676,6 +685,9 @@ impl ::protobuf::Message for RippleSignTx {
66 => {
::protobuf::rt::read_singular_message_into_field(is, &mut self.payment_req)?;
},
+ 74 => {
+ ::protobuf::rt::read_singular_message_into_field(is, &mut self.account_delete)?;
+ },
tag => {
::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
},
@@ -714,6 +726,10 @@ impl ::protobuf::Message for RippleSignTx {
let len = v.compute_size();
my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
}
+ if let Some(v) = self.account_delete.as_ref() {
+ let len = v.compute_size();
+ my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
+ }
my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
self.special_fields.cached_size().set(my_size as u32);
my_size
@@ -744,6 +760,9 @@ impl ::protobuf::Message for RippleSignTx {
if let Some(v) = self.payment_req.as_ref() {
::protobuf::rt::write_message_field_with_cached_size(8, v, os)?;
}
+ if let Some(v) = self.account_delete.as_ref() {
+ ::protobuf::rt::write_message_field_with_cached_size(9, v, os)?;
+ }
os.write_unknown_fields(self.special_fields.unknown_fields())?;
::std::result::Result::Ok(())
}
@@ -769,6 +788,7 @@ impl ::protobuf::Message for RippleSignTx {
self.payment.clear();
self.chunkify = ::std::option::Option::None;
self.payment_req.clear();
+ self.account_delete.clear();
self.special_fields.clear();
}
@@ -782,6 +802,7 @@ impl ::protobuf::Message for RippleSignTx {
payment: ::protobuf::MessageField::none(),
chunkify: ::std::option::Option::None,
payment_req: ::protobuf::MessageField::none(),
+ account_delete: ::protobuf::MessageField::none(),
special_fields: ::protobuf::SpecialFields::new(),
};
&instance
@@ -1044,6 +1065,167 @@ pub mod ripple_sign_tx {
impl ::protobuf::reflect::ProtobufValue for RipplePayment {
type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
}
+
+ // @@protoc_insertion_point(message:hw.trezor.messages.ripple.RippleSignTx.RippleAccountDelete)
+ #[derive(PartialEq,Clone,Default,Debug)]
+ pub struct RippleAccountDelete {
+ // message fields
+ // @@protoc_insertion_point(field:hw.trezor.messages.ripple.RippleSignTx.RippleAccountDelete.destination)
+ pub destination: ::std::option::Option<::std::string::String>,
+ // special fields
+ // @@protoc_insertion_point(special_field:hw.trezor.messages.ripple.RippleSignTx.RippleAccountDelete.special_fields)
+ pub special_fields: ::protobuf::SpecialFields,
+ }
+
+ impl<'a> ::std::default::Default for &'a RippleAccountDelete {
+ fn default() -> &'a RippleAccountDelete {
+ <RippleAccountDelete as ::protobuf::Message>::default_instance()
+ }
+ }
+
+ impl RippleAccountDelete {
+ pub fn new() -> RippleAccountDelete {
+ ::std::default::Default::default()
+ }
+
+ // required string destination = 1;
+
+ pub fn destination(&self) -> &str {
+ match self.destination.as_ref() {
+ Some(v) => v,
+ None => "",
+ }
+ }
+
+ pub fn clear_destination(&mut self) {
+ self.destination = ::std::option::Option::None;
+ }
+
+ pub fn has_destination(&self) -> bool {
+ self.destination.is_some()
+ }
+
+ // Param is passed by value, moved
+ pub fn set_destination(&mut self, v: ::std::string::String) {
+ self.destination = ::std::option::Option::Some(v);
+ }
+
+ // Mutable pointer to the field.
+ // If field is not initialized, it is initialized with default value first.
+ pub fn mut_destination(&mut self) -> &mut ::std::string::String {
+ if self.destination.is_none() {
+ self.destination = ::std::option::Option::Some(::std::string::String::new());
+ }
+ self.destination.as_mut().unwrap()
+ }
+
+ // Take field
+ pub fn take_destination(&mut self) -> ::std::string::String {
+ self.destination.take().unwrap_or_else(|| ::std::string::String::new())
+ }
+
+ pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+ let mut fields = ::std::vec::Vec::with_capacity(1);
+ let mut oneofs = ::std::vec::Vec::with_capacity(0);
+ fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
+ "destination",
+ |m: &RippleAccountDelete| { &m.destination },
+ |m: &mut RippleAccountDelete| { &mut m.destination },
+ ));
+ ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<RippleAccountDelete>(
+ "RippleSignTx.RippleAccountDelete",
+ fields,
+ oneofs,
+ )
+ }
+ }
+
+ impl ::protobuf::Message for RippleAccountDelete {
+ const NAME: &'static str = "RippleAccountDelete";
+
+ fn is_initialized(&self) -> bool {
+ if self.destination.is_none() {
+ return false;
+ }
+ true
+ }
+
+ fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+ while let Some(tag) = is.read_raw_tag_or_eof()? {
+ match tag {
+ 10 => {
+ self.destination = ::std::option::Option::Some(is.read_string()?);
+ },
+ tag => {
+ ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+ },
+ };
+ }
+ ::std::result::Result::Ok(())
+ }
+
+ // Compute sizes of nested messages
+ #[allow(unused_variables)]
+ fn compute_size(&self) -> u64 {
+ let mut my_size = 0;
+ if let Some(v) = self.destination.as_ref() {
+ my_size += ::protobuf::rt::string_size(1, &v);
+ }
+ my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+ self.special_fields.cached_size().set(my_size as u32);
+ my_size
+ }
+
+ fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+ if let Some(v) = self.destination.as_ref() {
+ os.write_string(1, v)?;
+ }
+ os.write_unknown_fields(self.special_fields.unknown_fields())?;
+ ::std::result::Result::Ok(())
+ }
+
+ fn special_fields(&self) -> &::protobuf::SpecialFields {
+ &self.special_fields
+ }
+
+ fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+ &mut self.special_fields
+ }
+
+ fn new() -> RippleAccountDelete {
+ RippleAccountDelete::new()
+ }
+
+ fn clear(&mut self) {
+ self.destination = ::std::option::Option::None;
+ self.special_fields.clear();
+ }
+
+ fn default_instance() -> &'static RippleAccountDelete {
+ static instance: RippleAccountDelete = RippleAccountDelete {
+ destination: ::std::option::Option::None,
+ special_fields: ::protobuf::SpecialFields::new(),
+ };
+ &instance
+ }
+ }
+
+ impl ::protobuf::MessageFull for RippleAccountDelete {
+ fn descriptor() -> ::protobuf::reflect::MessageDescriptor {
+ static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();
+ descriptor.get(|| super::file_descriptor().message_by_package_relative_name("RippleSignTx.RippleAccountDelete").unwrap()).clone()
+ }
+ }
+
+ impl ::std::fmt::Display for RippleAccountDelete {
+ fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+ ::protobuf::text_format::fmt(self, f)
+ }
+ }
+
+ impl ::protobuf::reflect::ProtobufValue for RippleAccountDelete {
+ type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+ }
}
// @@protoc_insertion_point(message:hw.trezor.messages.ripple.RippleSignedTx)
@@ -1270,21 +1452,24 @@ static file_descriptor_proto_data: &'static [u8] = b"\
\x20\x03(\rR\x08addressN\x12!\n\x0cshow_display\x18\x02\x20\x01(\x08R\
\x0bshowDisplay\x12\x1a\n\x08chunkify\x18\x03\x20\x01(\x08R\x08chunkify\
\";\n\rRippleAddress\x12\x18\n\x07address\x18\x01\x20\x02(\tR\x07address\
- \x12\x10\n\x03mac\x18\x02\x20\x01(\x0cR\x03mac\"\xd1\x03\n\x0cRippleSign\
+ \x12\x10\n\x03mac\x18\x02\x20\x01(\x0cR\x03mac\"\xee\x04\n\x0cRippleSign\
Tx\x12\x1b\n\taddress_n\x18\x01\x20\x03(\rR\x08addressN\x12\x10\n\x03fee\
\x18\x02\x20\x02(\x04R\x03fee\x12\x17\n\x05flags\x18\x03\x20\x01(\r:\x01\
0R\x05flags\x12\x1a\n\x08sequence\x18\x04\x20\x02(\rR\x08sequence\x120\n\
\x14last_ledger_sequence\x18\x05\x20\x01(\rR\x12lastLedgerSequence\x12O\
- \n\x07payment\x18\x06\x20\x02(\x0b25.hw.trezor.messages.ripple.RippleSig\
+ \n\x07payment\x18\x06\x20\x01(\x0b25.hw.trezor.messages.ripple.RippleSig\
nTx.RipplePaymentR\x07payment\x12\x1a\n\x08chunkify\x18\x07\x20\x01(\x08\
R\x08chunkify\x12J\n\x0bpayment_req\x18\x08\x20\x01(\x0b2).hw.trezor.mes\
- sages.common.PaymentRequestR\npaymentReq\x1ar\n\rRipplePayment\x12\x16\n\
- \x06amount\x18\x01\x20\x02(\x04R\x06amount\x12\x20\n\x0bdestination\x18\
- \x02\x20\x02(\tR\x0bdestination\x12'\n\x0fdestination_tag\x18\x03\x20\
- \x01(\rR\x0edestinationTag\"S\n\x0eRippleSignedTx\x12\x1c\n\tsignature\
- \x18\x01\x20\x02(\x0cR\tsignature\x12#\n\rserialized_tx\x18\x02\x20\x02(\
- \x0cR\x0cserializedTxB:\n#com.satoshilabs.trezor.lib.protobufB\x13Trezor\
- MessageRipple\
+ sages.common.PaymentRequestR\npaymentReq\x12b\n\x0eaccount_delete\x18\t\
+ \x20\x01(\x0b2;.hw.trezor.messages.ripple.RippleSignTx.RippleAccountDele\
+ teR\raccountDelete\x1ar\n\rRipplePayment\x12\x16\n\x06amount\x18\x01\x20\
+ \x02(\x04R\x06amount\x12\x20\n\x0bdestination\x18\x02\x20\x02(\tR\x0bdes\
+ tination\x12'\n\x0fdestination_tag\x18\x03\x20\x01(\rR\x0edestinationTag\
+ \x1a7\n\x13RippleAccountDelete\x12\x20\n\x0bdestination\x18\x01\x20\x02(\
+ \tR\x0bdestination\"S\n\x0eRippleSignedTx\x12\x1c\n\tsignature\x18\x01\
+ \x20\x02(\x0cR\tsignature\x12#\n\rserialized_tx\x18\x02\x20\x02(\x0cR\
+ \x0cserializedTxB:\n#com.satoshilabs.trezor.lib.protobufB\x13TrezorMessa\
+ geRipple\
";
/// `FileDescriptorProto` object which was a source for this generated file
@@ -1303,12 +1488,13 @@ pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {
let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
let mut deps = ::std::vec::Vec::with_capacity(1);
deps.push(super::messages_common::file_descriptor().clone());
- let mut messages = ::std::vec::Vec::with_capacity(5);
+ let mut messages = ::std::vec::Vec::with_capacity(6);
messages.push(RippleGetAddress::generated_message_descriptor_data());
messages.push(RippleAddress::generated_message_descriptor_data());
messages.push(RippleSignTx::generated_message_descriptor_data());
messages.push(RippleSignedTx::generated_message_descriptor_data());
messages.push(ripple_sign_tx::RipplePayment::generated_message_descriptor_data());
+ messages.push(ripple_sign_tx::RippleAccountDelete::generated_message_descriptor_data());
let mut enums = ::std::vec::Vec::with_capacity(0);
::protobuf::reflect::GeneratedFileDescriptor::new_generated(
file_descriptor_proto(),
diff --git a/tests/device_tests/ripple/test_sign_tx.py b/tests/device_tests/ripple/test_sign_tx.py
index f6ce06a6..995fac9d 100644
--- a/tests/device_tests/ripple/test_sign_tx.py
+++ b/tests/device_tests/ripple/test_sign_tx.py
@@ -18,7 +18,7 @@ import pytest
from trezorlib import ripple
from trezorlib.debuglink import DebugSession as Session
-from trezorlib.exceptions import TrezorFailure
+from trezorlib.exceptions import Cancelled, TrezorFailure
from trezorlib.tools import parse_path
pytestmark = [pytest.mark.altcoin, pytest.mark.ripple, pytest.mark.models("core")]
@@ -202,3 +202,54 @@ def test_signtx_payment_req(session: Session):
resp.serialized_tx.hex()
== "120000228000000024000000642e0001e240201b00051537614000000005f5e109684000000000000064732103dbed1e77cb91a005e2ec71afbccce5444c9be58276665a3859040f692de8fed2744730450221008770743a472bb2d1c746a53ef131cc17cc118d538ec910ca928d221db4494cf702201e4ef242d6c3bff110c3cc3897a471fed0f5ac10987ea57da63f98dfa01e94df8114bdf86f3ae715ba346b7772ea0e133f48828b766483148fb40e1ffa5d557ce9851a535af94965e0dd0988"
)
+
+
+@pytest.mark.parametrize("chunkify", (True, False))
+def test_signtx_account_delete(session: Session, chunkify: bool):
+ msg = ripple.create_sign_tx_msg(
+ {
+ "TransactionType": "AccountDelete",
+ "AccountDelete": {
+ "Destination": "rNaqKtKrMSwpwZSzRckPf7S96DkimjkF4H",
+ },
+ "Flags": 0,
+ "Fee": 100,
+ "Sequence": 100,
+ "LastLedgerSequence": 333111,
+ }
+ )
+ resp = ripple.sign_tx(
+ session, parse_path("m/44h/144h/0h/0/2"), msg, chunkify=chunkify
+ )
+ assert (
+ resp.signature.hex()
+ == "304402204e5380e0d81f20c45b92710ec27a214e2f0650e315f0ef737754bba418f7cca902202e77c5fcb7443b648f09e8089ca24f1b8cd1ade51713fd1f1163d29ff6a489d5"
+ )
+ assert (
+ resp.serialized_tx.hex()
+ == "12001522800000002400000064201b00051537684000000000000064732103dbed1e77cb91a005e2ec71afbccce5444c9be58276665a3859040f692de8fed27446304402204e5380e0d81f20c45b92710ec27a214e2f0650e315f0ef737754bba418f7cca902202e77c5fcb7443b648f09e8089ca24f1b8cd1ade51713fd1f1163d29ff6a489d58114bdf86f3ae715ba346b7772ea0e133f48828b766483148fb40e1ffa5d557ce9851a535af94965e0dd0988"
+ )
+
+
+def test_signtx_cancel(session: Session):
+
+ msg = ripple.create_sign_tx_msg(
+ {
+ "TransactionType": "AccountDelete",
+ "AccountDelete": {
+ "Destination": "rNaqKtKrMSwpwZSzRckPf7S96DkimjkF4H",
+ },
+ "Flags": 0,
+ "Fee": 100,
+ "Sequence": 100,
+ "LastLedgerSequence": 333111,
+ }
+ )
+
+ def input_flow():
+ yield
+ session.cancel()
+
+ with pytest.raises(Cancelled), session.test_ctx as client:
+ client.set_input_flow(input_flow)
+ ripple.sign_tx(session, parse_path("m/44h/144h/0h/0/2"), msg)
diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json
index 29339bbd..1139c2d9 100644
--- a/tests/ui_tests/fixtures.json
+++ b/tests/ui_tests/fixtures.json
@@ -2550,6 +2550,9 @@
"T2T1_cs_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "f2b80196c81ce473b7f24f16f6192ac76d9d2ca23fb0b40053c00d02b53d5111",
"T2T1_cs_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "43460d955f7816736520f785ccd4b31182e546eec5ac7ff708cb314d71e33494",
"T2T1_cs_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "ecc9be737e2e74c7155b46b302493e1d4c6a300a3860cd3e543a7733649f687f",
+"T2T1_cs_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "205a8f542923c3c7f8df93549a524c8e9061af94ff411fa2f9ddf71df48974b1",
+"T2T1_cs_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "7dde9a431c2e67cd8867f396a9a376aa7dde8950d5eebdafb690091677a08b0e",
+"T2T1_cs_ripple-test_sign_tx.py::test_signtx_cancel": "69617e2858f6c7b62ebe2b3418761b9442457df3b06760323a560970f20d875d",
"T2T1_cs_ripple-test_sign_tx.py::test_signtx_payment_req": "f2bb7a751aa39b4a34c1cc8fc78a390f9483a77e7ee9474041b2fb4ef0303e40",
"T2T1_cs_solana-test_address.py::test_solana_get_address[parameters0-result0]": "a299de9dd13d49051b6abd4cc937483963899f8d81f7b798051e10026997cd37",
"T2T1_cs_solana-test_address.py::test_solana_get_address[parameters1-result1]": "973116ce3dbbe1bae4ed583e0533979ae857beb673a37cde9bf7999cfc49b39f",
@@ -4299,6 +4302,9 @@
"T2T1_de_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "efeaf51fe18b983e9b1a6947a939ad305a92e57798fe07110bb61c0f65755881",
"T2T1_de_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "57385f130ff9a8cd7f5f2f99565720282c7de91f243d6e60ca183a289def5d81",
"T2T1_de_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "92dd8385c316634b34ba2488958ebd7eae776b58a7bc00b414686293c6657801",
+"T2T1_de_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "9e25c9650cf58c126a4e3caaefd0bece6fab768d7043c2c1a837469f79774b74",
+"T2T1_de_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "e73c0d0457703c782e8045a096a7b0814231afefeeb6653efb194a531e229d6e",
+"T2T1_de_ripple-test_sign_tx.py::test_signtx_cancel": "b328882fcab380dd4aa211c60ee868944d7f41996fdac19d8a7175fab2476c48",
"T2T1_de_ripple-test_sign_tx.py::test_signtx_payment_req": "b5c207c5de77475ab7bae650699358dccb6bfeb50932b57f9b099e9eaa4a590a",
"T2T1_de_solana-test_address.py::test_solana_get_address[parameters0-result0]": "feb055cc862c927690ec863a5fe79a79045a344898a7c06bdb8ef990a1e88e9e",
"T2T1_de_solana-test_address.py::test_solana_get_address[parameters1-result1]": "d6a604858896bb36203a3614a50f520e69aa02b3cc5eb523fc385d5006b2dcf7",
@@ -6048,6 +6054,9 @@
"T2T1_en_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "8aa7c68cd09e700e8c6903dcfc39c4a66214481c12c34dc56762829478399b79",
"T2T1_en_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "28cb6be43bf4ba11f28582321d89d9bc3002bb1051d2129d5a36700811b29a4a",
"T2T1_en_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "8a443b8844610022f1e3ee4a8a91f1edb2dc29e7d5e6447bc07f1fd252a176b9",
+"T2T1_en_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "0a7317f265557dd35ad5326ac48d8b29022fd0c36cb409c73cb06d1f9322539f",
+"T2T1_en_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "138798470733165983f390e4998ad2b01579a851c0a4fe719283e332ed09c5c2",
+"T2T1_en_ripple-test_sign_tx.py::test_signtx_cancel": "40734d435ab258f71ab9d1fc27627c0347d337e2a55d33fcb592a3cfd5457355",
"T2T1_en_ripple-test_sign_tx.py::test_signtx_payment_req": "43bdddfedc632f470fa98981f7493272b97ac0fe1d66aaedc2b774e4683670b1",
"T2T1_en_solana-test_address.py::test_solana_get_address[parameters0-result0]": "0d6748fbda84de8c3e99b7ccd3c8a8aa1f43c9a43620687f87c22334187e600d",
"T2T1_en_solana-test_address.py::test_solana_get_address[parameters1-result1]": "9d7e2a814019141d8897a0b91b4f224d541777430d42e5cc282351d6f73d3067",
@@ -7815,6 +7824,9 @@
"T2T1_es_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "17d836396f272c01cafa175aa87b0c076aedf7698c935d1921c7d3d7e8911903",
"T2T1_es_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "cd6d4c3900f861cb3645675525b6cc20d9a5185305aea9aca61cb9ef78850cb4",
"T2T1_es_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "987c542b41867521498f0f005095c377466fb243234411c8124cc11d2ba48e3d",
+"T2T1_es_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "ee580bcbef5e10eeb21b4224b3166588c0dfd026c1904744291f1efa9f4fcd70",
+"T2T1_es_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "a84fb2477e1e22e02f5be2672a32e0d3d0008800fb1a0ca06deaa4d30c481282",
+"T2T1_es_ripple-test_sign_tx.py::test_signtx_cancel": "ccd5ced589b2bfd04611a94e9e696bfa7decd7083c314ceaf2b1a877d334a0a3",
"T2T1_es_ripple-test_sign_tx.py::test_signtx_payment_req": "f4f88f29248904c392b78ea851b0d4ac8f81c6c5f0e91a8fe1eadb3bf195e759",
"T2T1_es_solana-test_address.py::test_solana_get_address[parameters0-result0]": "680811fcf93735a2b3efb778a5f89c182994f3e1051ba775b05f4a545420f1da",
"T2T1_es_solana-test_address.py::test_solana_get_address[parameters1-result1]": "ab402876d22c414e7269c141c9e041329537a68b47095191d3c6a7cc8bd9d5fa",
@@ -9564,6 +9576,9 @@
"T2T1_fr_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "7e5a99a4b6aad4cdf7a9f9aecf483faa381108ee2108efaba88f261e29ac1f8a",
"T2T1_fr_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "528a47d9c5e2c13c8e884eff91b9ba1d3a551f4e027fa1b70d279d01145da927",
"T2T1_fr_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "95955728e32ed90fd931a61ec03c13adc59cbd9e71c67d2a406b692d3a3476ec",
+"T2T1_fr_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "478a7aa6a3bb8c29fde994f7327e3a47a2e724db80fd18b57ff68501bcc769bd",
+"T2T1_fr_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "66cb43606e50a2d23d899ef0a0e4d6ae279028bfa50043797cbe735983ae7e35",
+"T2T1_fr_ripple-test_sign_tx.py::test_signtx_cancel": "84a7302dfe17df9b770db616346de2e3da52da3c9c856fa6844b2414be36d42a",
"T2T1_fr_ripple-test_sign_tx.py::test_signtx_payment_req": "c4f94de2219bb607db6676716d056b43169e807272cf4116fad8eb00ec92ab25",
"T2T1_fr_solana-test_address.py::test_solana_get_address[parameters0-result0]": "0c550908b7c7ac857cf70c359037357c3bb2f28f78d95caaf25a65f530eea9ca",
"T2T1_fr_solana-test_address.py::test_solana_get_address[parameters1-result1]": "77920d6f87533f092ee7a1a6575bfd7b04cca5e13427caa63e74224993c9bd9f",
@@ -11313,6 +11328,9 @@
"T2T1_pt_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "020b255e04b59e53d2aa87ae960038f4538d350de28df15a1ac41b376e9d04f2",
"T2T1_pt_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "4f7dbf1c727a7007774391e92c60009b7f6704d4de60ce15b61d7c6e823dd848",
"T2T1_pt_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "22d93eb48787bb28bfc48a32a9317896408c1d5eb246dc00893c36942d53f63a",
+"T2T1_pt_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "b1cbedf8e6cfa7a8cd543dc802eee8638395f7a6122355cf8bdbcef6db0476b2",
+"T2T1_pt_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "764bfea7a0eeef7645ab2e1941ce5e4160107ad026694c93c50aa0210d7b237c",
+"T2T1_pt_ripple-test_sign_tx.py::test_signtx_cancel": "661468cffbe5a115e98c4e47540a6e73952fb77240b2a01482f118d0478043de",
"T2T1_pt_ripple-test_sign_tx.py::test_signtx_payment_req": "1d105799a4df04f6682dbc7573d0bd4b068ef671973bf1585ef3534f7d8852fd",
"T2T1_pt_solana-test_address.py::test_solana_get_address[parameters0-result0]": "033a7fd20aab2d09e0a7c8851019d6ffde7a135c370bb81854e2c3d092b8269c",
"T2T1_pt_solana-test_address.py::test_solana_get_address[parameters1-result1]": "f7795adfa8040079b9fbc6d7b87caaf78c1bc867afb359e4278e1ec0758f0da9",
@@ -13302,6 +13320,9 @@
"T3B1_cs_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "aec89f6952811bcfa54db3842b2e2e24d7ae162a65bf19424b4e6b6620fe70bb",
"T3B1_cs_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "dcf6dfad01d450cfdfe0aeccf0399d586c9a2f9ecc1cc2bc5915ef2580e410fe",
"T3B1_cs_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "3d325a0fbca0e29690cc14b7565f2c6d40b56e4b7f5af587ef0cb7dc3d0739ab",
+"T3B1_cs_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "25ab9691a5c5c43b01ef6992deeb477b0b02e4be7e1bfbe3f8575291bdf938c2",
+"T3B1_cs_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "3db9d9f4f85d3e8ca45f41bd99b56c8cb00bc5014e8c3ca3d3bde599901060b2",
+"T3B1_cs_ripple-test_sign_tx.py::test_signtx_cancel": "ec46964a6dcf2f11ab9ca6aa0d7a8be40d66591528109265c2e1b93f26a74c8d",
"T3B1_cs_ripple-test_sign_tx.py::test_signtx_payment_req": "f81348d0c8c26be69e742c59ce16e0ddfbf45d44555a2f16bb1eca716ac0dcbc",
"T3B1_cs_solana-test_address.py::test_solana_get_address[parameters0-result0]": "412859348e124a13ea9fa2680f08268d6844bd5e815481f8698bade03dd46360",
"T3B1_cs_solana-test_address.py::test_solana_get_address[parameters1-result1]": "2210516555c07df1d9f9fe5ccc2e35a5e8942cc55121a9f81a27b375d4b91591",
@@ -13430,10 +13451,10 @@
"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarManageBuyOfferOp]": "92387a8fa177e6b6616a47b68401de8bc77a96109953d9a7408198ab8d4ed3b3",
"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarManageDataOp]": "0728bd5fe033df8a238fe391c5f93d5defd1f983b9f66a18e6552241d93942f0",
"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarManageSellOfferOp]": "77aaac7560058d1cc1fa57f6f6035b28ed82cd41a271efab8f1b58628ac18710",
-"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "ff3155d13f3d1fd31df2aad193c692f169fbd8a6e1ec890898766084781516b6",
-"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictSendOp]": "c235ab1b1c17ca0e74f38cb286249666bfecaf3f5605ac0a03cbf4253a8374e3",
-"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset12]": "a3a3fa3ef3ad4b70fd0d29e2d5983b9556d781cc2bf5208c56cbb174eea290a0",
-"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset4]": "c141e5eb5db14fa273b51e289f140e14892647d19e3707c65fdedc76745ae2e1",
+"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "3c1c7f2e50653de7935fc707e73967130c7ae6ddb0f40e2f6e89ef70fefd6d26",
+"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictSendOp]": "7616141664774858013ba25a9b9b9bd8aff71b1abdaa93024d0112ff424667d9",
+"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset12]": "61979b4a6d3d65fe67d0aa8df59a97affbad8047c32579f9f6fe342df8be0b6d",
+"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset4]": "ae8a2c4def7afa507abcaacb63e40bfe12af09055e5a171d0dfc5cab37b3c08a",
"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-memo-and-payment-request]": "a2f595a0b17b5181251b8dcc1dd72cb19bf7bf7902c2ed659203e209a0f5898f",
"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-native_asset]": "0a0d6a92d847e2461fb53ff1e08acfa8630aca80cf4f3659fb027c567075802b",
"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-payment-request-multiple-operations]": "ef50d3ecde006bf88748d5c8c484cc3afba951a417ca1cc027ff0aa438d87f2f",
@@ -13441,7 +13462,7 @@
"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-all]": "c6f89df8aea386974fc1f0d5192ab0750bcd7b55dd7577d510f9aca272c2e1a3",
"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-one]": "c1c3521e2f899b1b67226cddc9d4a14943826f878865d6400db66b9b04eee376",
"T3B1_cs_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-some]": "fbb3f3394436e2cecb48fb779dba051fc162e83e8371ff054c016c510815cf1d",
-"T3B1_cs_stellar-test_stellar.py::test_sign_tx[all_sending_like_operations]": "2c1b85808fdd4f66b60639556049c1fd151777953d35265cd5d957fa89d8bb35",
+"T3B1_cs_stellar-test_stellar.py::test_sign_tx[all_sending_like_operations]": "c0fb9cf736bb99475b2ca7e10d0ae936e88888065407aa1998d88e862e3e818e",
"T3B1_cs_stellar-test_stellar.py::test_sign_tx[memo_hash]": "82592d0fd13b909f124c0699ca3b08e718ec3f35d6afe342064e776bbf2b159a",
"T3B1_cs_stellar-test_stellar.py::test_sign_tx[memo_id]": "5ac72c2b0fa4eb9dd2df65a17755cdd1fe1ba77911710986720661e91ba1834d",
"T3B1_cs_stellar-test_stellar.py::test_sign_tx[memo_return]": "81aafb1723719a05d0fa77e7867c026676af2a47c1f0bce2c4f7c65316b40c51",
@@ -14979,6 +15000,9 @@
"T3B1_de_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "14dfefb39e3707b5294815085c5d94626e4e632f7fd9ca60df4b28e57d015dde",
"T3B1_de_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "1a419549064e2240923fed61797ad4d0ddabdce076f466d8cf5076528eef1991",
"T3B1_de_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "e9d0554d52df540c7e1d8d0247eaad53836ddfc6ccd5318432bf138b67720f2a",
+"T3B1_de_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "fcfc0abc996f2833603c41ebccf6725a4352bf3dff31f0c260737a72a8c626e5",
+"T3B1_de_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "ffaaeeb84d2aeea786f7698f9ab24ade85efd516c06eac9897188c76f151015b",
+"T3B1_de_ripple-test_sign_tx.py::test_signtx_cancel": "f4fd94404d80800a97bd3c07868d7572f7e2b39b4cebd2c3d7c56f9a35a410b6",
"T3B1_de_ripple-test_sign_tx.py::test_signtx_payment_req": "811e1907ad4359243ec815b9fbb9d5cb52440f2a0e4d611cb2bf22610b9d02f7",
"T3B1_de_solana-test_address.py::test_solana_get_address[parameters0-result0]": "5e8ce4d794ef70961f4c7ef57df9f71a02ac9bc5bbd4aaff956303c30eaa833a",
"T3B1_de_solana-test_address.py::test_solana_get_address[parameters1-result1]": "a6a611bdf50e1eb412cbaf6406d815b42fe022318c5ae7329a045ee501b35b57",
@@ -15107,10 +15131,10 @@
"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarManageBuyOfferOp]": "de1c08ffa3f63d90c536ba9c68628132150b841377bc3198c3c7cc4913a8a4db",
"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarManageDataOp]": "4aa9152b68765c9a6a6cbd6a34b143e2a11c1b30fd8a4fb20c11f7b6eb20e4f3",
"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarManageSellOfferOp]": "4a35f5988211a80b64523699f900ce10f5dc61f28ae6cfdd6ba214c04b816bf6",
-"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "dd93ad6a8c740dde32dd2d49bdfbb3a9d6b1de65d2cb72d4d8d9315ce08d048c",
-"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictSendOp]": "9e6b36a4244fd819ddf176165b60431bf9e8709dd8db79e6040c26ce9c278ead",
-"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset12]": "de93ddece326fbe3c85f3b66ff19b5e261667564c5943dc042396842648f5871",
-"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset4]": "a18e7025b9a3786275f44415d14360d0410670061c7e336ff1a624b29370346a",
+"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "501f56d7281d3a15272671f435eb42ebbeebaee67597ed0dfad20edc7d93329f",
+"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictSendOp]": "07e281e8754218824994a028f2105b0f517072badd6d0e395890180c285367c3",
+"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset12]": "078d80f2d2360da4f68b381682e57b7f8e0da365f8cc29b2c473f74d45dc6ae3",
+"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset4]": "a82f2b50f45acde87de3e80518e29467b10f5c2e02d7a95d9729722d047b1949",
"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-memo-and-payment-request]": "937e9d621eabd34740d4a41eb9f410e64711e9a7e4f5555219d07c9c3c7d65ed",
"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-native_asset]": "fdf51240d9f3cb9cefa28dcb25e554b262b47aa0de86abab9e005274a63bbe92",
"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-payment-request-multiple-operations]": "5619ec9a7cdcc2021766954e996e4d760efecd25bd9e7e524702a7e7e3e6dfe5",
@@ -15118,7 +15142,7 @@
"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-all]": "505a6b8735dc6c41b9235153b2743427ca4980fb5e0a3f552b286a76beac1a42",
"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-one]": "0d6108035d41821b4b0fe201299c594d3f2d21970272bd7d2d98719a41c69cc3",
"T3B1_de_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-some]": "6d54bc6f93f6d4fce5fc2a896be6f049b13fc33eaba27acdd48ee9a98a1f1b92",
-"T3B1_de_stellar-test_stellar.py::test_sign_tx[all_sending_like_operations]": "4bb01ca5fdd3ac29c19a228b254c3b4416d45ac766bf9536f344235790b4d66f",
+"T3B1_de_stellar-test_stellar.py::test_sign_tx[all_sending_like_operations]": "99528ca5a6840654c356895033540a634bc72363ce9c56d8f6f48936295f1e01",
"T3B1_de_stellar-test_stellar.py::test_sign_tx[memo_hash]": "88e329b10b40d1feca8389f18b9ee228e4882433697573448e8d04669ea59450",
"T3B1_de_stellar-test_stellar.py::test_sign_tx[memo_id]": "431ef30d9d635a2f579b30165a27fb41c8ca2962f37dcd5005abba9a86d833c9",
"T3B1_de_stellar-test_stellar.py::test_sign_tx[memo_return]": "ba97932e22cf8aaf4174e6e071b47ddadb833b1765712c9f9300550cb56d7890",
@@ -16656,6 +16680,9 @@
"T3B1_en_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "7945fdf0623a34efada654fe62a57fa06c6ab0cf4383bc14c6b7acd594b10596",
"T3B1_en_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "59838cc18104f88a164df6673664630426cce65066599859dd07f7b77da52362",
"T3B1_en_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "fc0184dccfdf45a39859cdbe8995fce54ccdd4dc02735b8430a6afa960bde48a",
+"T3B1_en_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "c0f166a46d0abb0d9bd115e319379f7e9a54994c4d45b2a44931833974dffe6c",
+"T3B1_en_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "d4976ab0b41a297a9d3880c6a9e354c4baf3ec08f887bda30088fb2fbaf7d2a3",
+"T3B1_en_ripple-test_sign_tx.py::test_signtx_cancel": "85aff5e5bdf5e378d1afdd1290172fb5f082860f2df02a9fd5ea9cb24dee90db",
"T3B1_en_ripple-test_sign_tx.py::test_signtx_payment_req": "f7f545a3af28ddca805029f333fc54ed410c92e870bf3d9c9f4047d77b670bbb",
"T3B1_en_solana-test_address.py::test_solana_get_address[parameters0-result0]": "bfbc93cf93bb35254e120a06003e9632537f290fe21e93978f15a448fd7f692b",
"T3B1_en_solana-test_address.py::test_solana_get_address[parameters1-result1]": "47318ca86b9c580a5ca41796c608c822eb61a6d5ac96cfa9479ec76c65a24739",
@@ -16784,10 +16811,10 @@
"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarManageBuyOfferOp]": "9f5c3c66f0d5e2e16a10b1b11ab6e1f1838dc80e938fbab7a766328cdd71b5bd",
"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarManageDataOp]": "a32c08d9a4c820a3cbda86558290949c9f98d807aaee34306a4d2f9e69f6406f",
"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarManageSellOfferOp]": "54bbcd5d763c42e25ecf089b4252577f038d5f3e8882f8b6208820c7c01bcf71",
-"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "bd3eab192c0a625fd07b19eb04b01b001e3ec3caac50f3040b0ac7ef5c37fae2",
-"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictSendOp]": "cc6387d41f1d9e64a5309b0f091a4cfcd64f09e29cbf71167f2ee3ba6e0e5e99",
-"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset12]": "49a48389cc8bc16aa25010d4e24c1b700119e3a60a5939ea4638447718888e89",
-"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset4]": "d7d09a4d1e0b6e233765b51b24ad830f1979305a36c9b5b7f21365184f66ce66",
+"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "da8dddcf2010af35444c97a9c830f1e11512aee6b1c33c91ec13b9dbc17fa49f",
+"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictSendOp]": "f2f46c6e46b89fab15723965871145f90e06d8c3db1efd9880df2e4475f9ed2b",
+"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset12]": "5b5ceb6375e8039aae8978675d3468574f3a3e225095ab9b0d8f46ffa90e3501",
+"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset4]": "0503f74b472ae1978f9d11ede19d76f108ba5eeb8bec9499e164650e741b129a",
"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-memo-and-payment-request]": "b688d240813af1efee69fea15790471df605ac14bd08596a8fe179b8f13f0ea0",
"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-native_asset]": "e0944df115a85e10bcb4c1062bf22cc4e3cba743e348e0608cfe452adc2836ae",
"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-payment-request-multiple-operations]": "93465d864d4b28b6d8c2abc6b9af819d3b2470cabd1108c90a2836d3c755fa4e",
@@ -16795,7 +16822,7 @@
"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-all]": "410f26f54b44d184fef41871fcc9343b98c68bcab489a315834239a91752cabd",
"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-one]": "0dc4dc3af157e6efad607d19713ddf9b67e30f977fab9ee9ac0d6dd314832fef",
"T3B1_en_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-some]": "8951c1b934cf442d8ce292030b42dddeed573f78f95cf06bcd7de620cde00ec7",
-"T3B1_en_stellar-test_stellar.py::test_sign_tx[all_sending_like_operations]": "800164e139d2783d8815a22f57df369251dbc2b1438560513128e9074c212fdd",
+"T3B1_en_stellar-test_stellar.py::test_sign_tx[all_sending_like_operations]": "8de531acf139b47c372960cdbcac0b407b3050e808065c7e717e513e47e8af52",
"T3B1_en_stellar-test_stellar.py::test_sign_tx[memo_hash]": "a0b357540c01816aa58a6220ff9589fc3f6f15fb2e21b02d8bc55784fdc862a5",
"T3B1_en_stellar-test_stellar.py::test_sign_tx[memo_id]": "9b7ac3af473075208a1750c61a9de3dd5dfa83c0777494e553284a55c0ee2f35",
"T3B1_en_stellar-test_stellar.py::test_sign_tx[memo_return]": "0c363a886ae5360d4af585d90b8c6346d8e50918c0629eb8578d7ae74c3c149e",
@@ -18333,6 +18360,9 @@
"T3B1_es_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "1c43a01a3864c17b781e3a68121bb7c4378f858ab5c4db5b3d012f138eba5fb8",
"T3B1_es_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "ffcbaeffdd57c01b904ef4ffd3fd47bdddb2588f542d241b227dbd5870f59007",
"T3B1_es_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "d3b27c72f97ab1e98c8bacc3642913616a9daf1079fc29920ced9571a550af8f",
+"T3B1_es_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "13cb8dd46f126349b7d7c4987fabf3ef5b3cb05c75a3ab72350bc6bc8b31c3fd",
+"T3B1_es_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "f189cd2e2fb20af22c05edf0521ad924b29e82f8453033d3f90fafdffe2ffd87",
+"T3B1_es_ripple-test_sign_tx.py::test_signtx_cancel": "570754be36900527c615416fd19f00b16b7a77f30f753df226d46b8912f24cee",
"T3B1_es_ripple-test_sign_tx.py::test_signtx_payment_req": "9c601767619fb86b5fba4694a130ca17c89e77a98c8f9747951f107263697e88",
"T3B1_es_solana-test_address.py::test_solana_get_address[parameters0-result0]": "6990050cdf4361dac9b54b1dda135e5a93346c984520691091d7e7cb66a3932a",
"T3B1_es_solana-test_address.py::test_solana_get_address[parameters1-result1]": "97cefc796f7d1abb44845775ac92c7b431a266ec08f47fad94b846383ca11616",
@@ -18461,10 +18491,10 @@
"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarManageBuyOfferOp]": "0560c3feea05f277fba4864da99ae08253658ba4c316c46f4811c1bf0429da4d",
"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarManageDataOp]": "e3997d43ee3ca1f0ead455422b641e011e714e177ea089a81b13beb691c15efe",
"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarManageSellOfferOp]": "88ffe50585a3998b520a56fb21acc3ccd0e26a431f11cc72ded665000816ede4",
-"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "628728016de8c54aec1921fc25223e41c2fa8a56c0e0acd404784aa79e0799bf",
-"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictSendOp]": "1688459e35a02bfedc7b33588239a24553147c74e6875db53423cee699bb4689",
-"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset12]": "dcd038921447f4fcf870b44558766e4df8fef01a4afeab8fe6dcea3d69b1d1da",
-"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset4]": "06b71048fb5ca8ed9abb0656daa3f1dc7f67c4162d6087792a1bd01709bacc78",
+"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "6f875a5f859dc82615896478a5265d5caffcb88c0093981fa98c9b1559780353",
+"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictSendOp]": "4b793e32a610375d7695f2f582dab4d4cc2ffc4343926be56e9a35e059e24bdc",
+"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset12]": "cfe8d20eedb09da4550144675a9d35282c43ee24384b2bb551e94ad3df8aa7c1",
+"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset4]": "cfc26492b5836b2ee0c87676167638166a84ac3cae6278e6ad7d3547374398e9",
"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-memo-and-payment-request]": "b289723921d8c66071bc59077df054a406212b6e9f468ba797db07536f9f5c63",
"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-native_asset]": "20308d2f4f0f25e8cc29704bf4ab2cf1799d26a9d47674280199a59e372e12d1",
"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-payment-request-multiple-operations]": "0ac4d90a4ea83c0886e4fbfed15315470e605ba26a4d056ff002b0a6c004bfe6",
@@ -18472,7 +18502,7 @@
"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-all]": "31677e55aa0a97b880f09a2d3566d09a55f8c0237646cac4d1d47086b41317a5",
"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-one]": "2ee2bd4caa97b078b2dd824211be9aa1a0b1254359d801d894bb8a821ade0965",
"T3B1_es_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-some]": "e4cfc1a7d7cfa15eeb70f198c1de661506e86391c9c3142f7a0fab8adf834cd3",
-"T3B1_es_stellar-test_stellar.py::test_sign_tx[all_sending_like_operations]": "b90c4bb41ca46cc95e2fadd44d87226a06090ac2f495f0c637ce964e9262501f",
+"T3B1_es_stellar-test_stellar.py::test_sign_tx[all_sending_like_operations]": "9037dfa052cb61b5817fcd2195b68deaa95eb46907aeab68a87baeb595f3df33",
"T3B1_es_stellar-test_stellar.py::test_sign_tx[memo_hash]": "51318ecd2d850a90a018c1478f334da457776a391d365e0db271a44a63c01f6e",
"T3B1_es_stellar-test_stellar.py::test_sign_tx[memo_id]": "df1054a87861135cbe8f0f3c95af2f5761d8c97f3bdad277f10ac57d22b3dd90",
"T3B1_es_stellar-test_stellar.py::test_sign_tx[memo_return]": "a323f76e6c57a09e7f188afe47ceb3a9e8287f818b8192d92d9545a566077ff2",
@@ -20010,6 +20040,9 @@
"T3B1_fr_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "979886e5de665a0a5bd752457a29ad2bd0aad9d94702754cb351dc7d31979b42",
"T3B1_fr_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "01749f46c07837fa100f98fbb7872646acead57a936ea1d5dc0edd1980f731aa",
"T3B1_fr_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "5d4ed0acdd05c32da9392cdad755c5d658831d91b20688d28b1cdde5822ad80a",
+"T3B1_fr_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "efc9730ac87c96d89a21857a5cce9b2ba5f89cbaaec71105e69ab8fb0857b704",
+"T3B1_fr_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "e7a8f383a9564b594ebe8d35cb42c0d05ac56b1a41c2f32819031e83a4dc91f1",
+"T3B1_fr_ripple-test_sign_tx.py::test_signtx_cancel": "431299fbde96a8e1114a2107f175c17668c06dcf3dab90ba393e4b919f4c50f5",
"T3B1_fr_ripple-test_sign_tx.py::test_signtx_payment_req": "2526d8e04d13ac616fa0a96bd025464644b2fc1a3a7b8a22cebd67d5bc8a71d1",
"T3B1_fr_solana-test_address.py::test_solana_get_address[parameters0-result0]": "71bfd41e4d1c03b425bdee8265ea710d955bf947ea4eddf5aa019797a942add1",
"T3B1_fr_solana-test_address.py::test_solana_get_address[parameters1-result1]": "8e863b123ef1b96113b798fea788d1286c29b4f7b77cb16f86bacb1fcd76d06d",
@@ -20138,10 +20171,10 @@
"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarManageBuyOfferOp]": "bc44b898f196c4d66c4a3fb198e23aa5f194192aee1e075be599a25b52a54400",
"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarManageDataOp]": "30a58c817e8c01ae66eaa2c055daffff2c49468101b67facda8badb1c0e1cb4d",
"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarManageSellOfferOp]": "ab5efd45879946efeeb81439300388239a663bd37d67434cf42d5725ba77e390",
-"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "30eb11888c51ecb8b3e418ae7c374e63e6a91fae7a526117b67326f6dd88111a",
-"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictSendOp]": "0c9fbbfa21b5c234465e3e2e1fc1d624215f1589252e6cd00ed7d070309de615",
-"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset12]": "845f44520dccc2c2f3cb7719dbd8c37b5b952406ffc76ae39155ddc138c6d3b0",
-"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset4]": "79271ad540c86f5ddd30530cb75ecb57020d7d8063449f81d4c9adf09c709667",
+"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "a47b0bda5d3ceca7a71399de765044d78997ca7d27d4270cef5e5a3d85595d2e",
+"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictSendOp]": "eb7e0c1aeb6305912a0350bddbb0369f24c3c8c60b60f9a974ec52733af5b21c",
+"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset12]": "94f213f489892b20eb9656f40a2990b363839de20968d71170ecde5743f592c3",
+"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset4]": "5655eeb0dbfd731f7c2f8710ae55dc216796636cdfde8c55e31c45b3fdfdd106",
"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-memo-and-payment-request]": "84da293544b7745d6abbe056e844fee313b46a3f13d347321f258fb5b9d8c14f",
"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-native_asset]": "1091c72ac5c8e81d82ae12d48439f8420cad35261ed0fced9165482d15d50e0e",
"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-payment-request-multiple-operations]": "3d96d598c1aad4bd715783f0323f9d30bc1d6f11d4e32b90b399cc30f6cd95ff",
@@ -20149,7 +20182,7 @@
"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-all]": "946a06d57a086f81f661980ee15f071c35869ee807f161ed183329d6c5b5b0d3",
"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-one]": "a7cf9d3fa8818d07ddce5aa07923efac02135add07cf98a470a9792cb0eabf77",
"T3B1_fr_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-some]": "2134a9ba59edf0b99522c759898a60daec34ac96112ea35df7687e45aaf4ca0a",
-"T3B1_fr_stellar-test_stellar.py::test_sign_tx[all_sending_like_operations]": "33a93d2788d5c8e1226eaaf6c9e8399e6b977f311ec377698ac97d3516493250",
+"T3B1_fr_stellar-test_stellar.py::test_sign_tx[all_sending_like_operations]": "cbca91ed15c54f65ebb55354c53297b2d787ac97d4fb58d3c9f58e32adfee74f",
"T3B1_fr_stellar-test_stellar.py::test_sign_tx[memo_hash]": "4cff4f1da991881684786acb0220c047091fa2b44403a21a95219b71b4a57380",
"T3B1_fr_stellar-test_stellar.py::test_sign_tx[memo_id]": "316053c54e801417b461d2c4a48c4bd19d625e5a680ccf571cd7e273e1d4a680",
"T3B1_fr_stellar-test_stellar.py::test_sign_tx[memo_return]": "7818e6c4d1d228d63589ae3416f80e4e5130d195a5b741f2e75e50f18c74a92e",
@@ -21687,6 +21720,9 @@
"T3B1_pt_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "bbd866375fe164eb4caaddceb8a49d710b09ad01ca2cf67a0006d3a0d3ecb121",
"T3B1_pt_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "67ab04a89d931cee8a063b2b1aec8234c3bb7ea7d2459064b84205bb3b4a4679",
"T3B1_pt_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "26c37d6ea6e34d67f1e07af60e4bbbeae845f3677c6b74b9b7591ccbaee47f9f",
+"T3B1_pt_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "edf701926d1630dce26346aa5659beb788821217629123312a43083b9f2f2602",
+"T3B1_pt_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "a29ac17af6d302621a39ccf6acfe2a3e7b4641e81fd9f617b5093da852ed469f",
+"T3B1_pt_ripple-test_sign_tx.py::test_signtx_cancel": "eca9ce866f34b79bb1bdea7a1f787f4e0f48ecac766b6cd376adf4574533be05",
"T3B1_pt_ripple-test_sign_tx.py::test_signtx_payment_req": "a8ead4f7a532653e260ce1dd9034892f356c3474bb4e9918b1c31673b33d2e22",
"T3B1_pt_solana-test_address.py::test_solana_get_address[parameters0-result0]": "631ed5cac4f18291cb1cdaf311a5930f573d0b30f65f19eee9e085afe9d1a420",
"T3B1_pt_solana-test_address.py::test_solana_get_address[parameters1-result1]": "929fe3516b297ea565ba8b0dd7bed35f70f3cff1c4c9c358be0ff8f3d29f1f3b",
@@ -21815,10 +21851,10 @@
"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarManageBuyOfferOp]": "4219f9a7d7d6718cbab68a304784f3a8c75ceefdd14cf2cbf86b2f524179bf84",
"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarManageDataOp]": "bc470832f3615f713b4ac0394e4cfee9e7c33030fb813f6c96a56a43a07b9acf",
"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarManageSellOfferOp]": "87d9caf1b18c1617aa1e866cf333a8f2605241feec897f24aa20004469721c35",
-"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "fe43236e514ed8af44bcddf4ae16d6a564d59cb408e1105056bfb66214f77444",
-"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictSendOp]": "e6f901c9cefa13b55527f239df85b6908493585ea0158b8cdf94819569a27ba2",
-"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset12]": "9ec329890f41bbd9711519bd577efdcf3a0c1356fa73f71cdd0ee4e93ac4cdcf",
-"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset4]": "d64c3bb731954fbc9270b9b4b879d1e3f7401733273d37599ace06352360bb3d",
+"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictReceiveOp]": "511b7cfe45c35687498355b698091a32173bd736c9da4d693df382012dabf892",
+"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarPathPaymentStrictSendOp]": "bf422e6e787c0fa24253d649ee1310831117bb5111899c95110a3456d06fbb47",
+"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset12]": "76eccc5b2f255ecca55df4ce1e254b184919462da928ffb3309a3a03425584df",
+"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-asset4]": "453211159985a9a7aabd880ead1590bae7b9d272941c7a45762c5e33f348b590",
"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-memo-and-payment-request]": "f902d56b7f21f4831c27379dd878a59baf55c1cc68c87d71b486b3e1d790031c",
"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-native_asset]": "614e1f1bbc9b90ff4fcd8bc7b151caee86b5819aeb37c3079355f575a800ba75",
"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarPaymentOp-payment-request-multiple-operations]": "eb55e60d5da253c4820b2605f61e17e9279dc9cf476cf7cb6138a8e92fb5b36d",
@@ -21826,7 +21862,7 @@
"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-all]": "7dcf8818274ba81f502d9b564d4746196c7dca56256eb6fcfa9c68674a1e0d15",
"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-one]": "4f1e6445b9b9817e7590f22d1a396042bb90b7f053f03e085ce529602f52dbd2",
"T3B1_pt_stellar-test_stellar.py::test_sign_tx[StellarSetOptionsOp-some]": "855e0e6335c3bd50c3eb2114a9c3c4cb20052c627c98206cf80bdd5242eef1e8",
-"T3B1_pt_stellar-test_stellar.py::test_sign_tx[all_sending_like_operations]": "6fe51bcdcba4dbc8c0e15c53efd3312ec5cf306f33d0f51197604f973831efb2",
+"T3B1_pt_stellar-test_stellar.py::test_sign_tx[all_sending_like_operations]": "2dee9e4d81346fa2790992dec4d0ba1834cfc7e9c968410041420f3047e6dfad",
"T3B1_pt_stellar-test_stellar.py::test_sign_tx[memo_hash]": "3f48eb12f91f23eb62ec820f9d565f143eecbd5e944dbddd1928fb97600cf8b4",
"T3B1_pt_stellar-test_stellar.py::test_sign_tx[memo_id]": "381cc1cae148c3899e583520227cd133eb01deca8f2b3213e60dad2ecf657eb5",
"T3B1_pt_stellar-test_stellar.py::test_sign_tx[memo_return]": "38f1832f0678dcb559b7570a70f2a90cc5feda6458181ce5da2e2a43093f54d6",
@@ -23761,6 +23797,9 @@
"T3T1_cs_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "9c20243bc5dacf2442af5a8778b66a0ab7cb978e11c02fec371f109fbc9d55f6",
"T3T1_cs_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "6e4db3f7bdb11f0854815960b7891a078f68d3dfba858ff551462a37e5b99f65",
"T3T1_cs_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "b32f7de50e452374b3e4840a951b1f51d46bb2be587e94994902f6a4ff1cd5ba",
+"T3T1_cs_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "a98410bc76b3b3a0d5a0550bcf166831af25b41103c840ec5299ed8c95def162",
+"T3T1_cs_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "1320b8edec43b3e116a8575787aefa95ad0cac1fbe68febdceba561eea1933d2",
+"T3T1_cs_ripple-test_sign_tx.py::test_signtx_cancel": "ef1f7b75b5d0a2a203e284c78561e894dbc52b4bf90935f4944249c39492d819",
"T3T1_cs_ripple-test_sign_tx.py::test_signtx_payment_req": "ad10672d93da247aa92114e3df08a77b8ebb66a2e4dce78e0430caf90e9439c3",
"T3T1_cs_solana-test_address.py::test_solana_get_address[parameters0-result0]": "efe765a7e1aa156b36017b0c0693e6c47291f336aef27aa72ad8757fd431679b",
"T3T1_cs_solana-test_address.py::test_solana_get_address[parameters1-result1]": "30ef8bf7e9b16de26cf78e4d7bffbe43681bbbc47c9ca417e029fbb2a5dc2af1",
@@ -25471,6 +25510,9 @@
"T3T1_de_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "68c146f13417be0845fee20b1d8de4a05e0844608c2efb3cfae9f573be39f0c4",
"T3T1_de_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "2582f71eae46a5c59404f5ba15e415789f642f827693613dc2644fed67b4302b",
"T3T1_de_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "b6d84e539068002a5c4add1f393d4519c7d1678fdd97e6f4cad11b40d65f623c",
+"T3T1_de_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "bc65e66faf2a42c06a9c983085a67460250286d263c1b680638af6db31b12a6c",
+"T3T1_de_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "cd5c04c140a5d8ac303a99bcb9674e7ab79873642f99a16d62288cc0d7d28857",
+"T3T1_de_ripple-test_sign_tx.py::test_signtx_cancel": "1e54f0a66a39b1e38ba460306a2d92da5c30731aa19cd803000f73311f20006e",
"T3T1_de_ripple-test_sign_tx.py::test_signtx_payment_req": "8d4a6c2aafb228a342734403d1bf0fe87c21effc446bfced4d2a494cc9af2bb0",
"T3T1_de_solana-test_address.py::test_solana_get_address[parameters0-result0]": "d7dc2013a91695f09308eb60b1ea445f854bc827c7b3cd4858fbb6ec9213c157",
"T3T1_de_solana-test_address.py::test_solana_get_address[parameters1-result1]": "8882716dd0a48a4e9559290c66574ea15831a6fe56b01e24becedbfeb3524738",
@@ -27181,6 +27223,9 @@
"T3T1_en_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "0064e8a52b9bff0c2a31432fa781b800afb21e8910d60f303671bdfc8d8425fc",
"T3T1_en_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "eccb47782f47ec4d89c7a30760a6bf3c254ff1e4ceedfad77de0491de25506e5",
"T3T1_en_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "d7de8bacb12009f873b2f782acc3cc9e1e27404e428ec0fd37964b67fe932aec",
+"T3T1_en_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "a3674b5911d655e7bc7e73e49b3beaab132b473f2076fc1a5e0c6b81f767c9f2",
+"T3T1_en_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "4bb8f6bbed5340fed2f8a6802684154144e68fbf4a06231d6798a4cd1f96db73",
+"T3T1_en_ripple-test_sign_tx.py::test_signtx_cancel": "5138bd717b841cd06dc90a77f626ecba42e30b0d431f13ed76c23b64b3c363b5",
"T3T1_en_ripple-test_sign_tx.py::test_signtx_payment_req": "59b5b7c5590d0153a7cc3b9ce8e59b3cf57f64449f123c7c1c44072879fcfdec",
"T3T1_en_solana-test_address.py::test_solana_get_address[parameters0-result0]": "903927e0cc65db6895779be62a58514b15a347061c08e1fb38b4cedea007d85e",
"T3T1_en_solana-test_address.py::test_solana_get_address[parameters1-result1]": "bfc693009d75e9b7e731396726491b1c8b9f6116b192e662d0dad27449ab62bd",
@@ -28891,6 +28936,9 @@
"T3T1_es_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "41b9c9e85d64891dcfd03d675df77c533f035a2d191b161144d00afab69a589d",
"T3T1_es_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "77886e30f07f6482f7370f54e770215e41aeee59fb8b0f2003a33973df9b83c2",
"T3T1_es_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "04d2b0e301be6809441d8992260a8ccdc0b9e86c68adf3409c4327a271215c38",
+"T3T1_es_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "763c21925ee616d5ae34f241a92554191c1adcaa0c6fa8ac4ee45d4feffedc7b",
+"T3T1_es_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "016935747f2746c560d89b9c9f04431ebc17390777cc89e0d31496c562dc5eac",
+"T3T1_es_ripple-test_sign_tx.py::test_signtx_cancel": "b557efb810671066a5177bc7cd6f8a2ac4e7274fe637edfc4b581dc3f092f8c5",
"T3T1_es_ripple-test_sign_tx.py::test_signtx_payment_req": "d4f846d1c38deb30c0abd35f35bc8c6834ed974dd00a0ad7ed37536aed65df79",
"T3T1_es_solana-test_address.py::test_solana_get_address[parameters0-result0]": "554825947a400e8498b2a3efbd14d9215fead1c20f9dc3df41f42745f3abc73a",
"T3T1_es_solana-test_address.py::test_solana_get_address[parameters1-result1]": "e9b17cf4eaeff97d981b2087adee47daf6dc3065487a654e1b3f00d2b2444a34",
@@ -30601,6 +30649,9 @@
"T3T1_fr_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "116c64aa168d12181b7a5317677ddf135d739fdac22d38ff08571dc3301c2f47",
"T3T1_fr_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "e76a7832add7ad3f115f5cd06dc3734fa4aebd5465cbe91fca7df70e1076b21a",
"T3T1_fr_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "465e56fe8261b55148b8ae86b81d677289a57ad0ae350530a49d64186cc7fb28",
+"T3T1_fr_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "fdb1f8dc1fc2d3c74b73619d41efa745749109f250cc3fb2719faa11b3f62d00",
+"T3T1_fr_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "96ed04708acf20c2a8bd0b9d8cefe4ef04c5fdbb7ad8fc84afd13238237c6b0f",
+"T3T1_fr_ripple-test_sign_tx.py::test_signtx_cancel": "db3f71b87261c4e07c61e2b9a7f8aa5b82b350be3d9a3020c7877809a3e9d197",
"T3T1_fr_ripple-test_sign_tx.py::test_signtx_payment_req": "a1cc5c25c3a9f3d19cb840f83b6e215c708924613dff13aa7158d0d49043d236",
"T3T1_fr_solana-test_address.py::test_solana_get_address[parameters0-result0]": "9091fe53e878af05c3b0952d7da9c0550fa35028ab45df9008864e52122775b5",
"T3T1_fr_solana-test_address.py::test_solana_get_address[parameters1-result1]": "47fa10c859909bf280d06e1111719a650bc6c854f91feb663eee58308a79eae2",
@@ -32311,6 +32362,9 @@
"T3T1_pt_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "14256cd1b801d1b67a37de1198d61a80d342f39e5c5d6fa991ec7fb526d683be",
"T3T1_pt_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "ab5c296ab11fff858444bb61b97f9eefc626221af0a033616d7f3cd04f3cf86b",
"T3T1_pt_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "d349e9d376f8085c90a7aa897c556989476f644d44394d1bd3b99501324dd362",
+"T3T1_pt_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "34f07bf5b5389649f322b08a9d097795b9cbb1809122f54cb1d51fe80e32fdc7",
+"T3T1_pt_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "b2746c798cb5810f1ebe6762386b469b040b9ebe2b501db11aaec645d04976c0",
+"T3T1_pt_ripple-test_sign_tx.py::test_signtx_cancel": "f2ebc9a51624d8c29eccd86b3217717dce5f7baf6f9c9c8669ea5396bf992d6b",
"T3T1_pt_ripple-test_sign_tx.py::test_signtx_payment_req": "7946eaa673f1c7ebb3de26cf1a1963dce06359cc6d0bdde0c04ca75a86591563",
"T3T1_pt_solana-test_address.py::test_solana_get_address[parameters0-result0]": "00ab18e1d7426f4b73ad9e4a61b55c6306eaca631fc75cb6690137eb8ec64200",
"T3T1_pt_solana-test_address.py::test_solana_get_address[parameters1-result1]": "94ec25676561725b62abb7db4f70187cb5f61723fe81df345092135905112009",
@@ -34670,6 +34724,9 @@
"T3W1_cs_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "25675032fe6b1628161f0cd2398edae2feace6873ae31c44ce545c91f7ced796",
"T3W1_cs_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "edfcb8ccdbffac30a9ce6c67e5865ecf6756fd6ef63261a858200e89fd9f4756",
"T3W1_cs_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "57c9f9fec88ba69ddaf1152a5ce6b9a3c6f0cfd99c97d006dca9aa59b789533a",
+"T3W1_cs_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "ca919ad2da1ef0784a54ab26a66beb4c1a2eef8de884a6378060fe154981a048",
+"T3W1_cs_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "59ec66acc22cae9f41306abc906e67871ea20929be21dde415f65dc550c00d27",
+"T3W1_cs_ripple-test_sign_tx.py::test_signtx_cancel": "09afc958341ed40e301b6bb51b12f29e341cdbf3d3424e9b9561d6e87468f531",
"T3W1_cs_ripple-test_sign_tx.py::test_signtx_payment_req": "de1878f88f3cdd094ff5b0d153aab16451c1a06927e7c65e6bf8e9224a575a1a",
"T3W1_cs_solana-test_address.py::test_solana_get_address[parameters0-result0]": "69739d482bd5704112ce85213f483e50f0ba17ee1b490945b0a04c5084af2cb4",
"T3W1_cs_solana-test_address.py::test_solana_get_address[parameters1-result1]": "e9508d8a194b3ffa820613482ea9663a52216434cb3248a834427398265a8361",
@@ -36390,6 +36447,9 @@
"T3W1_de_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "aaafdc361a1d1494db1b142427ede204b978fbde090811b1ff02e54df49414f9",
"T3W1_de_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "9608a893e7405952cbd0edde360c344922b101e4c177cd82cd557f1bbc39135b",
"T3W1_de_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "0aadfa1088362adc885e7659bd5483bf71eb6e6a06d4423beb909cdcdd3a5573",
+"T3W1_de_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "1ec086550c83080a4e18d01e1e37038e0688f9f4bc4d97887cfd0833dd03c5af",
+"T3W1_de_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "1f3820171dbd17293d1fe5e6858d02a5bbdc1b4c94fea8428d0f8079e476b6cd",
+"T3W1_de_ripple-test_sign_tx.py::test_signtx_cancel": "259635c80cde3e15166a2ab8905d0accf2cbcd6a12d5745f060554bf34e51e40",
"T3W1_de_ripple-test_sign_tx.py::test_signtx_payment_req": "8d9c327e6ba3de64a47aa139e2862608c4577cd21590721541b4154a55b14c94",
"T3W1_de_solana-test_address.py::test_solana_get_address[parameters0-result0]": "9dd063c685cffea3d04cdbbd4680ff5260c94505329ecd0833590bae01c3d80b",
"T3W1_de_solana-test_address.py::test_solana_get_address[parameters1-result1]": "8d00f8e8b361d6307aa375ca5b762c984e9027a008e872f32d56a70456170dc5",
@@ -38110,6 +38170,9 @@
"T3W1_en_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "778dbcfb96e575c652b06902ef2842f6cc261dd3d457cc66b8b6c9338e82e1fb",
"T3W1_en_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "5eab3afa39f5da65b8b0fae62073ce47655ab07678ad90d234ca4a60bfdde6d2",
"T3W1_en_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "bbe1fc245a7633c86a0f1d79fc5049a794db3af5811287c087e261bcb821fdc7",
+"T3W1_en_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "f8d7ded9b48008f421c7b8114207c9e8d319a43468b221966e4b83e2f908bd8f",
+"T3W1_en_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "bdb268ed584fc243e4bb56e1d0f00ec6ded2fd079fbcadec74ab597e30a1404f",
+"T3W1_en_ripple-test_sign_tx.py::test_signtx_cancel": "cd446b5f7fbf76f4db7ec8e597a392e55dbf32ae5fabce75a5817c736123549d",
"T3W1_en_ripple-test_sign_tx.py::test_signtx_payment_req": "dae86b90b25de9f68f8a933f995d8427c3280ca2d35025f6ed1a68b131014b78",
"T3W1_en_solana-test_address.py::test_solana_get_address[parameters0-result0]": "5df5652927f6f0a002a5e3f72a1fcdaba30b1ae1af067fd1fa51a981c7a9974f",
"T3W1_en_solana-test_address.py::test_solana_get_address[parameters1-result1]": "a666c928b244f12240f17ebd1f2a924fed7d8c9ca721cf6473929fe24da57b47",
@@ -39830,6 +39893,9 @@
"T3W1_es_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "ea59c9d24216e9bad1b1fdd99068e34dbc5beeea54b06c34219d37720f17a470",
"T3W1_es_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "b161769a7d1c25d53039f25cb92acb17ecbe05848823601124838c6f500bfb65",
"T3W1_es_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "e424ee0c0e0c5b7bb1c3e71dce037be763b66b18e7525405d0875664ab14f7ff",
+"T3W1_es_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "00c6fc98765d4f25e5ce4cd81b5a67efbb09855235fcd3207164363a92d1863d",
+"T3W1_es_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "a7a2e0751ae78c85edfce42e1e21cf601f80b570cfbf2a6eb2fbb2a3ca88f08a",
+"T3W1_es_ripple-test_sign_tx.py::test_signtx_cancel": "94f1abafed92c6e3284369bf34ea4da7f5d0da333e9dafd216772592a5da6216",
"T3W1_es_ripple-test_sign_tx.py::test_signtx_payment_req": "b5c2d921f44190f7a1e26914d703650e7594699af236872c1cd84b2d1fa6c854",
"T3W1_es_solana-test_address.py::test_solana_get_address[parameters0-result0]": "03dbe15e2300664d4b984427e6f7289579236590e0ba2e32ef60e66949b2bc7b",
"T3W1_es_solana-test_address.py::test_solana_get_address[parameters1-result1]": "5a1d1c93c3cbcaf649f2874531252e0bb0aa651267a839b4eaf629d1b1a8e4c9",
@@ -41550,6 +41616,9 @@
"T3W1_fr_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "1cceb37657549d7798a606fb01cffd95cdd3ab59cda2e25228d11f1bb906cd31",
"T3W1_fr_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "8e0075ae8236adf25de6033da51b5877c29795b8ec892e7ca3e3a72f422a044b",
"T3W1_fr_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "7022a676bfeb1ca2295b72c4d19ab9a9abc4ed1b1806042599b8f714bf6e4a97",
+"T3W1_fr_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "cb11a987045a5cabe46c5540e6e3d7925bc4ffa8f332717b3b4e5b775041a0b1",
+"T3W1_fr_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "2aa6d2d87fea630bb93295cb8fb35d6aabf8b34fd4636d4136b70739e45dc451",
+"T3W1_fr_ripple-test_sign_tx.py::test_signtx_cancel": "f1ad6d3fd07fff64ed35e70568c582b095969e8bd8076002b8b29822b40e9fe5",
"T3W1_fr_ripple-test_sign_tx.py::test_signtx_payment_req": "89f5f1e488e9e412bdeb582fd337ba180ca9c027cd7b07ff89ffc3ab002affde",
"T3W1_fr_solana-test_address.py::test_solana_get_address[parameters0-result0]": "3b2d9464831722349d02e3294e217f6e7677d77a14add040b2477c23e1c7d42c",
"T3W1_fr_solana-test_address.py::test_solana_get_address[parameters1-result1]": "4459c664a4ac320cfe11dd33426b86ad475fc0e15434958495000082a6039c06",
@@ -43275,6 +43344,9 @@
"T3W1_pt_ripple-test_sign_tx.py::test_ripple_sign_invalid_fee": "67695a9de4ea2860aa20568a42ba0dd34e1fdf983ff4cf32347e6dd81e79c6e3",
"T3W1_pt_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[False]": "83cc3a9bae3bdf18609f940ee2835eae2ed5a7ce2d692c7fe717ef13eb133b01",
"T3W1_pt_ripple-test_sign_tx.py::test_ripple_sign_simple_tx[True]": "92749a2c4e224d70efcde7ca50d4aa1e8246c698a6c1ab72eb736b37aa21166a",
+"T3W1_pt_ripple-test_sign_tx.py::test_signtx_account_delete[False]": "f75084e0bba82228c5ed677ea671440a920e9282457915be6d1dd2a36cc2b622",
+"T3W1_pt_ripple-test_sign_tx.py::test_signtx_account_delete[True]": "8a1b37e9d61a4237a37ae6833d422baa3cabd40d00ce8a7c0fabbeced8bce916",
+"T3W1_pt_ripple-test_sign_tx.py::test_signtx_cancel": "dc32c2bb3e453884348c1b3188be5abcccf4c0482ce6da71772609fa6a2b74f3",
"T3W1_pt_ripple-test_sign_tx.py::test_signtx_payment_req": "1aaabb445488ddfcc1d5a9496d34ff2561890cffc7fe0fc8d692ef7e75f70ddb",
"T3W1_pt_solana-test_address.py::test_solana_get_address[parameters0-result0]": "9e85a57afa73e5f83f65e0866840389a33ee5bcd65fbf0ac6af842da3c8b7d3e",
"T3W1_pt_solana-test_address.py::test_solana_get_address[parameters1-result1]": "e98234ee6b757e8ef6c0101de3a7c634b4ebcc6099a15d19de4e4556987212b9",
Why this scored 30/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.