1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-02-24 05:12:02 +00:00

fixup! feat(core): add Solana staking layouts

Also, add more test vectors for Solana staking confirmation
This commit is contained in:
Roman Zeyde 2025-02-23 15:48:38 +02:00
parent 4efc51d3b4
commit 4f82374b8a
9 changed files with 214 additions and 68 deletions

View File

@ -92,6 +92,94 @@
"expected_signature": "d38bf15aefa994ec712ae801ce35c6ebd54ef1df46a52e8577376baefefb4e842261e7d4c39f465a38caf9520cbbbd59a94313ccbe4c55ca16721f2f0674af0d"
}
},
{
"description": "Stake instructions with warning",
"parameters": {
"address": "m/44'/501'/0'/0'",
"construct": {
"version": null,
"header": {
"signers": 1,
"readonly_signers": 0,
"readonly_non_signers": 2
},
"accounts": [
"14CCvQzQzHCVgZM3j9soPnXuJXh1RmCfwLVUcdfbZVBS",
"ATFXMD5cYiw9yHkvexgx3nf9LNSouEViB5BZBsgwunAv",
"ETxHeBBcuw9Yu4dGuP3oXrD12V5RECvmi8ogQ9PkjyVF",
"Stake11111111111111111111111111111111111111",
"SysvarC1ock11111111111111111111111111111111",
"ComputeBudget111111111111111111111111111111",
"11111111111111111111111111111111",
"SysvarRent111111111111111111111111111111111",
"SysvarStakeHistory1111111111111111111111111",
"StakeConfig11111111111111111111111111111111"
],
"blockhash": "2p4rYZAaFfV5Uk5ugdG5KPNty9Uda9B3b4gWB8qnNqak",
"instructions": [
{
"program_index": 5,
"accounts": {},
"data": {
"instruction_id": 3,
"lamports": 8000
}
},
{
"program_index": 6,
"accounts": {
"funding_account": 0,
"created_account": 1
},
"data": {
"instruction_id": 3,
"base": "14CCvQzQzHCVgZM3j9soPnXuJXh1RmCfwLVUcdfbZVBS",
"seed": {
"length": 6,
"chars": "seed:1"
},
"lamports": 20000000,
"space": 0,
"owner": "11111111111111111111111111111111"
}
},
{
"program_index": 3,
"accounts": {
"uninitialized_stake_account": 1,
"rent_sysvar": 7
},
"data": {
"instruction_id": 0,
"staker": "14CCvQzQzHCVgZM3j9soPnXuJXh1RmCfwLVUcdfbZVBS",
"withdrawer": "AeDJ1BqA7ruBbd6mEcS1QNxFbT8FQbiBVuN9NqK94Taq",
"unix_timestamp": 0,
"epoch": 0,
"custodian": "11111111111111111111111111111111"
}
},
{
"program_index": 3,
"accounts": {
"initialized_stake_account": 1,
"vote_account": 2,
"clock_sysvar": 4,
"stake_history_sysvar": 8,
"config_account": 9,
"stake_authority": 0
},
"data": {
"instruction_id": 2
}
}
],
"luts": []
}
},
"result": {
"expected_signature": "e4bbe5bec49dbc9d3cdeaa00612facb67e7b1d1b2446600d6c0cddc61a89da4343d62be788ea72734b4a6818471eaf1a37fbbad34b33e7b6cdfe8c705c8c8701"
}
},
{
"description": "Unstake instructions",
"parameters": {
@ -189,6 +277,58 @@
"result": {
"expected_signature": "4edf71d1b4d075c6717617ef43cd896a80153f418dbe4cca5e66ee9f27bd5652bec67d30ee9a14e3bd7062dd72ed619cf238e6f5538b150dae34d24bee650303"
}
},
{
"description": "Claim instructions with warning",
"parameters": {
"address": "m/44'/501'/0'/0'",
"construct": {
"version": null,
"header": {
"signers": 1,
"readonly_signers": 0,
"readonly_non_signers": 3
},
"accounts": [
"14CCvQzQzHCVgZM3j9soPnXuJXh1RmCfwLVUcdfbZVBS",
"ATFXMD5cYiw9yHkvexgx3nf9LNSouEViB5BZBsgwunAv",
"Stake11111111111111111111111111111111111111",
"SysvarC1ock11111111111111111111111111111111",
"ComputeBudget111111111111111111111111111111",
"AeDJ1BqA7ruBbd6mEcS1QNxFbT8FQbiBVuN9NqK94Taq"
],
"blockhash": "2p4rYZAaFfV5Uk5ugdG5KPNty9Uda9B3b4gWB8qnNqak",
"instructions": [
{
"program_index": 4,
"accounts": {},
"data": {
"instruction_id": 3,
"lamports": 8000
}
},
{
"program_index": 2,
"accounts": {
"stake_account": 1,
"recipient_account": 5,
"clock_sysvar": 3,
"stake_history_sysvar": 4,
"withdrawal_authority": 0,
"lockup_authority": 0
},
"data": {
"instruction_id": 4,
"lamports": 1000000
}
}
],
"luts": []
}
},
"result": {
"expected_signature": "53e953033988f8ce3cca4f7d1f94da41d8f3d1467724785f5cd9c4d16250198429a5d27bc474a66d4c1bf4a936c680f51973d54a3b16a2b73e62ecbb1f062104"
}
}
]
}

View File

@ -551,11 +551,11 @@ impl FirmwareUI for UICaesar {
let mut ops = OpTextLayout::new(theme::TEXT_MONO)
.text(amount_label, fonts::FONT_BOLD)
.newline()
.text(amount, fonts::FONT_MONO)
.newline();
.text(amount, fonts::FONT_MONO);
if !fee_label.is_empty() || !fee.is_empty() {
ops = ops
.newline()
.newline()
.text(fee_label, fonts::FONT_BOLD)
.newline()

View File

@ -399,19 +399,12 @@ async def confirm_stake_transaction(
) -> None:
from trezor.ui.layouts import confirm_solana_staking_tx
KNOWN_ACCOUNTS = {
"9QU2QSxhb24FUX3Tu2FpczXjpK3VYrvRudywSZaM29mF": "Everstake",
}
vote_account = base58.encode(delegate.vote_account[0])
vote_account = KNOWN_ACCOUNTS.get(vote_account, vote_account)
await confirm_solana_staking_tx(
title=TR.solana__stake,
message=TR.solana__stake_question,
description=TR.solana__stake_question,
account=_format_path(signer_path),
account_path=address_n_to_str(signer_path),
vote_account=vote_account,
vote_account=base58.encode(delegate.vote_account[0]),
stake_item=(
TR.solana__stake_account,
base58.encode(delegate.initialized_stake_account[0]),
@ -423,7 +416,6 @@ async def confirm_stake_transaction(
fee_item=_fee_summary(fee),
fee_details=_fee_details(fee),
blockhash_item=(TR.words__blockhash, base58.encode(blockhash)),
br_name="confirm_stake_transaction",
)
@ -437,7 +429,7 @@ async def confirm_unstake_transaction(
await confirm_solana_staking_tx(
title=TR.solana__unstake,
message=TR.solana__unstake_question,
description=TR.solana__unstake_question,
account=_format_path(signer_path),
account_path=address_n_to_str(signer_path),
vote_account="",
@ -445,11 +437,10 @@ async def confirm_unstake_transaction(
TR.solana__stake_account,
base58.encode(deactivate.delegated_stake_account[0]),
),
amount_item=("", ""),
fee_item=_fee_summary(fee),
amount_item=_fee_summary(fee),
fee_item=("", ""),
fee_details=_fee_details(fee),
blockhash_item=(TR.words__blockhash, base58.encode(blockhash)),
br_name="confirm_unstake_transaction",
)
@ -463,7 +454,7 @@ async def confirm_claim_transaction(
await confirm_solana_staking_tx(
title=TR.solana__claim,
message=TR.solana__claim_question,
description=TR.solana__claim_question,
account=_format_path(signer_path),
account_path=address_n_to_str(signer_path),
vote_account="",
@ -478,7 +469,6 @@ async def confirm_claim_transaction(
fee_item=_fee_summary(fee),
fee_details=_fee_details(fee),
blockhash_item=(TR.words__blockhash, base58.encode(blockhash)),
br_name="confirm_claim_transaction",
)

View File

@ -952,7 +952,7 @@ if not utils.BITCOIN_ONLY:
async def confirm_solana_staking_tx(
title: str,
message: str,
description: str,
account: str,
account_path: str,
vote_account: str,
@ -961,14 +961,15 @@ if not utils.BITCOIN_ONLY:
fee_item: tuple[str, str],
fee_details: Iterable[tuple[str, str]],
blockhash_item: tuple[str, str],
br_name: str,
br_name: str = "confirm_solana_staking_tx",
br_code: ButtonRequestType = ButtonRequestType.SignTx,
) -> None:
(amount_label, amount) = amount_item
(fee_label, fee) = fee_item
confirm_layout = trezorui_api.confirm_value(
title=title,
description=message,
description=description,
extra=f"{TR.solana__stake_provider}:" if vote_account else None,
value=vote_account,
verb=TR.buttons__continue,
@ -986,7 +987,7 @@ if not utils.BITCOIN_ONLY:
horizontal=True,
)
await with_info(confirm_layout, info_layout, br_name, ButtonRequestType.SignTx)
await with_info(confirm_layout, info_layout, br_name, br_code)
await _confirm_summary(
amount=amount,
@ -998,7 +999,7 @@ if not utils.BITCOIN_ONLY:
extra_title=TR.confirm_total__title_fee,
extra_items=fee_details,
br_name=br_name,
br_code=ButtonRequestType.SignTx,
br_code=br_code,
)
def confirm_cardano_tx(

View File

@ -928,7 +928,7 @@ if not utils.BITCOIN_ONLY:
async def confirm_solana_staking_tx(
title: str,
message: str,
description: str,
account: str,
account_path: str,
vote_account: str,
@ -937,7 +937,8 @@ if not utils.BITCOIN_ONLY:
fee_item: tuple[str, str],
fee_details: Iterable[tuple[str, str]],
blockhash_item: tuple[str, str],
br_name: str,
br_name: str = "confirm_solana_staking_tx",
br_code: ButtonRequestType = ButtonRequestType.SignTx,
) -> None:
(amount_label, amount) = amount_item
(fee_label, fee) = fee_item
@ -948,17 +949,21 @@ if not utils.BITCOIN_ONLY:
stake_item,
blockhash_item,
)
if vote_account:
description = f"{description}\n{TR.solana__stake_provider}:"
else:
description = f"\n\n{description}"
await raise_if_not_confirmed(
trezorui_api.confirm_summary(
amount="",
amount_label=message,
fee=vote_account,
fee_label=f"{TR.solana__stake_provider}:" if vote_account else "",
amount=vote_account,
amount_label=description,
fee="",
fee_label="",
extra_title=title,
extra_items=items,
),
br_name,
ButtonRequestType.SignTx,
br_code,
)
await raise_if_not_confirmed(
@ -973,7 +978,7 @@ if not utils.BITCOIN_ONLY:
extra_items=fee_details,
),
br_name,
ButtonRequestType.SignTx,
br_code,
)
def confirm_cardano_tx(

View File

@ -868,7 +868,7 @@ if not utils.BITCOIN_ONLY:
async def confirm_solana_staking_tx(
title: str,
message: str,
description: str,
account: str,
account_path: str,
vote_account: str,
@ -877,12 +877,11 @@ if not utils.BITCOIN_ONLY:
fee_item: tuple[str, str],
fee_details: Iterable[tuple[str, str]],
blockhash_item: tuple[str, str],
br_name: str,
br_name: str = "confirm_solana_staking_tx",
br_code: ButtonRequestType = ButtonRequestType.SignTx,
) -> None:
description = message
if vote_account:
description = f"{message}\n{TR.solana__stake_provider}:"
description = f"{description}\n\n{TR.solana__stake_provider}:"
await raise_if_not_confirmed(
trezorui_api.flow_confirm_output(
title=title,
@ -894,14 +893,14 @@ if not utils.BITCOIN_ONLY:
text_mono=True,
account=account,
account_path=account_path,
br_code=ButtonRequestType.SignTx,
br_code=br_code,
br_name=br_name,
address_item=stake_item,
extra_item=blockhash_item,
fee_items=fee_details,
summary_title=title,
summary_items=(amount_item, fee_item),
summary_br_name="confirm_solana_staking_tx_total",
summary_br_name="confirm_total",
summary_br_code=ButtonRequestType.SignTx,
cancel_text=TR.buttons__cancel,
),

View File

@ -22,6 +22,7 @@ from trezorlib.solana import sign_tx
from trezorlib.tools import parse_path
from ...common import parametrize_using_common_fixtures
from ...input_flows import InputFlowConfirmAllWarnings
from .construct.instructions import PROGRAMS, UnknownInstruction
from .construct.transaction import Message, RawInstruction
@ -48,28 +49,31 @@ def test_solana_sign_tx(client: Client, parameters, result):
serialized_tx = _serialize_tx(parameters["construct"])
actual_result = sign_tx(
client,
address_n=parse_path(parameters["address"]),
serialized_tx=serialized_tx,
additional_info=(
messages.SolanaTxAdditionalInfo(
token_accounts_infos=[
messages.SolanaTxTokenAccountInfo(
base_address=token_account["base_address"],
token_program=token_account["token_program"],
token_mint=token_account["token_mint"],
token_account=token_account["token_account"],
)
for token_account in parameters["additional_info"][
"token_accounts_infos"
with client:
IF = InputFlowConfirmAllWarnings(client)
client.set_input_flow(IF.get())
actual_result = sign_tx(
client,
address_n=parse_path(parameters["address"]),
serialized_tx=serialized_tx,
additional_info=(
messages.SolanaTxAdditionalInfo(
token_accounts_infos=[
messages.SolanaTxTokenAccountInfo(
base_address=token_account["base_address"],
token_program=token_account["token_program"],
token_mint=token_account["token_mint"],
token_account=token_account["token_account"],
)
for token_account in parameters["additional_info"][
"token_accounts_infos"
]
]
]
)
if "additional_info" in parameters
else None
),
)
)
if "additional_info" in parameters
else None
),
)
assert actual_result == bytes.fromhex(result["expected_signature"])

View File

@ -2274,6 +2274,7 @@ class InputFlowConfirmAllWarnings(InputFlowBase):
# hi priority warning
hi_prio = (
TR.ethereum__unknown_contract_address,
TR.solana__stake_withdrawal_warning,
TR.addr_mismatch__wrong_derivation_path,
TR.send__receiving_to_multisig,
"witness path",

View File

@ -5133,7 +5133,8 @@
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[burn]": "7ae3abe87dcc439d593fff1b5eb49a20ffbd962ef52acc0d1ea6c467c0b2cba0",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[burn_checked]": "8017c70cb7ca945b985210e05195e0b29689527a0bd233ef65e6972a9a5bac20",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[burn_checked_-_multisig]": "7640124cb84555d1ed5abbfcf4098dfb0dbd4cd5461f9694de6518c14fe668c9",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[claim_instructions]": "9c82dde84b33161503de2464e1c890c65c242b54898b67e4662807e4c458603d",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[claim_instructions]": "5d4c657a9d6d2dd260748c452e85657a9c013a15c09a416da054b4f806fd929b",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[claim_instructions_with_warning]": "d6eea8bcac8bc3ee38a2dfb65e4968f211d62ba86de730af6dc0e55cddd2fb0a",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[close_account]": "c003994e4b5f3d8fb3d3273d2db57239aec8dc1e6231ab3d1a2d46e99ce1a575",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[close_account_-_multisig]": "694eca79abd20df9110c32ecb14adc778ffef4e9d4cc8f8553eaa4643e60220b",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[create_account]": "48574562182de66e96b7e2e7cf47d97db60b979ce69331176ac42aec5ecdb631",
@ -5171,7 +5172,8 @@
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[set_lockup_-_with_epoch_only]": "f1c4985080e51dcd6889fc2b2a5ea2502ba44bb4af9fb47656eb2c301395caf5",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[set_lockup_checked]": "6eb89719cacab2d73b0b91484f6f065e2a3445a24d58f1874702981e6ba45707",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[split]": "6068df82ab79eff5dfdf5e57dc8156e50031ee469934ee63a8d5a38e45aa63ac",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[stake_instructions]": "0093adde4ba3e9b0374ee330ebccd360582dd53227a828ce7fcd272ada59a321",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[stake_instructions]": "0a1b9a510f656249a552434fe3b30067e61382a24066ace44e100f488eab2366",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[stake_instructions_with_warning]": "61ce8b6a0e90dfbcd4f9a05b0398b8229df90d71807a9eef027160758a8df6c0",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[sync_native]": "5a5cc506048b5025bac6cf82ef63d6d81be36fa01cef471eb69f9cd526787f96",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[thaw_account]": "0312b269438961cac1d5f8d05414f7a318318c390a235402446788fb59ab26a2",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[thaw_account_-_multisig]": "4613157fbf5d5b48ee47d638a68d814f88bcfa41e88d09e189017fcdeb9fa5f7",
@ -5186,7 +5188,7 @@
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[transfer_with_compute_budget_without_heap_confirmation]": "8845c8f61d4d2fe2d5d68cf8468ae2effdd2f1c4cadad65df1e676066bdb4395",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[transfer_with_seed]": "6d3c2e590a0b91a39e294a6c0d13490f4c6c541617f7b98e0ba241e7dfc76693",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[unknown_instruction]": "f1e96601a1b72ea0a7b0b02d590ba1cdf7c73a9b4b776569a3e2a14632169dcb",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[unstake_instructions]": "105bc5df069c2673da8a1746843ff5457044b75e221542c310b166197dbfadfb",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[unstake_instructions]": "cf1b187032adf39e2289dbd87c2e8cc2629c9c691382b6c3c3fd46bf649217bf",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[upgrade_nonce]": "c5046158a24f6ef8ca43a58d3914a3a3da3fcafd94bdcaaf3cd53c77fa37d0e7",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[withdraw]": "9a1e4083290937d22ed9d2a85b757e495b26a8e9fc37cf501b3450bf5217183b",
"T2T1_en_solana-test_sign_tx.py::test_solana_sign_tx[withdraw_nonce_account]": "25db9577893e79a0823d88eda0b8bfa70ee0125cd574bab912b116f506dbb9c1",
@ -13962,7 +13964,8 @@
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[burn]": "0e61b22a03de7857d11771e71d4c9aa9d3c538e86ca784213e653faf0d5e8883",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[burn_checked]": "f13824278d5cfb30b5154e2bb5a83ccb3dd420ee9aa369b9f303b0fbcf992bf4",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[burn_checked_-_multisig]": "4764b77eac8dfc5ca2a0c90fcb073fbfc187c3f49ad3815737989c9ff17c0090",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[claim_instructions]": "42f916fd2622211058ed7c2f63dea6616843440b8aa22291e964502aaabd7112",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[claim_instructions]": "ce5329dfe7543d9ff0f6c7402885c3ed28616973f66271231cbec2b95f044c91",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[claim_instructions_with_warning]": "2dbe711e39dcca5a7585c8d7c23a28b7b55018f417d679e3d578aa17d43d4129",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[close_account]": "4e60a1f2fd7c2a555aabdb380cd5e3e42238ffb0470908fa69c88741c4837e88",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[close_account_-_multisig]": "f5f8683aa05fbb3a5a157c2faea5d2b19e19c48e78c82bf77210f7cf4b0d3c89",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[create_account]": "534ceb09bd4bcd999be21bde9aa76d5dd1daae339154c0c135231d05d7a86032",
@ -14000,7 +14003,8 @@
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[set_lockup_-_with_epoch_only]": "a1581f15d3de981f3df17feb8e127f2e6c2b16cd3f17a6badfd0c39b14e38033",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[set_lockup_checked]": "644939a485c7005abc6a85f08d76a5cd90690c0b8c62692834a09b42f5b9b1ba",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[split]": "2fecaa57d3448d40d685019aa7b6053706a17e12dc1717f16ca0eaca8324fd85",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[stake_instructions]": "a9a13a7451fb3c33ca491f3986567ff5108fac4d0e4f8689e2de535c10d7ea1f",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[stake_instructions]": "306bdc6bb9e68d77c4987a29c25cf32fe73dc8d06c41187e04489c156026aaec",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[stake_instructions_with_warning]": "55e79d034d7019f53e49f4787db161227cc51ccdc8fbecf76e2510d736ad1dbc",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[sync_native]": "43c5e4cfdbbc29456197ba924c44d082d5153a1188607d5e95f186304c734881",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[thaw_account]": "b1df488b46ad1db517c75d7b4eecc97da4a49c85d0545658331cb830b5cda9e7",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[thaw_account_-_multisig]": "7a800abac1a122b118a78f01a39b3c0079f8dbd3a05048c7beb6c6a491b70af8",
@ -14015,7 +14019,7 @@
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[transfer_with_compute_budget_without_heap_confirmation]": "4cda28586c4c33b0c75087923507838c7f8916f4749076c4d737de5bc09f5434",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[transfer_with_seed]": "e305c57526dc4d8d9d31d2403b751851d1630f457a23e2602e1ac685334ed7f4",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[unknown_instruction]": "3fb9f9929ba7539aca6007e9f7cc7fb2d5527df24949d591a484f30aba475c5d",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[unstake_instructions]": "b83b4312855e9a75fddd4fa891a1bad4b74bffcba1c2ddf86b9b73f40b5adb8e",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[unstake_instructions]": "04f2df8f1b09141244c2daafe1c3bba2ed95b041c0cd4bff3cf36e7d5bc1353b",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[upgrade_nonce]": "99e7087efd53509b067134fb4b9c82dfcf05c9bb8f0bc2e2ad5caa008946ee2d",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[withdraw]": "5bca29906bf6422cad691df82e844a50e639d9186a565fca945b64b1b179ad58",
"T3B1_en_solana-test_sign_tx.py::test_solana_sign_tx[withdraw_nonce_account]": "fa6ec1c23d35127a15f9aae1d36a7ea2472c55339ac15653b89346a2a6b09b49",
@ -22630,7 +22634,8 @@
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[burn]": "efb38859a134aa88820b2004d7f5924ad82103611455182a658cb0bf4bf61d25",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[burn_checked]": "9c9c177956102a54655029b26b4d7445ba1a2fdc245449c06a81c185bbe67e65",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[burn_checked_-_multisig]": "5d2e96e4a827cd7d51ac88cb2e47718bf2f35df0f587588aec5deeaaea2082c6",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[claim_instructions]": "a65e5c5d6286592b86e52b8b29c0145b34382e111ea7c53de9d4e350eaa901f5",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[claim_instructions]": "22c607b61c5dcaf4b85063d505afaa89b41ada761667413aca6a2aa4e535239c",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[claim_instructions_with_warning]": "d24749e2042ab04ab74a5acf92f90d4d4556bbd6a71de0fa0e8642e6366647bb",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[close_account]": "7fb521f59a4b7f4f367766b500477b648b3b14498bce600c61da754f4a44e2e2",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[close_account_-_multisig]": "ae7e0b3ab1a8c52046db8ce51438e4fda6a92a535d87b28bcdf16aea1a1800e2",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[create_account]": "f22cebb39308d26d57d9e9ee3a2658bb18d61f0c6149de164798c86b6ff18acd",
@ -22668,7 +22673,8 @@
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[set_lockup_-_with_epoch_only]": "8fa9a9434ace91ac1df213b4cf37f3aa2b73a1dc7ef4e0218afa29383d7e34a4",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[set_lockup_checked]": "9de53632cbfe2ef5198cb5da00335cf42fdfb4b859f879d0ec1d78ed7a5e7106",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[split]": "f4d4c5cfaec18fc8d8fe324c4443f39656911d0653d8812057147be65d2a19f8",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[stake_instructions]": "56630eb27772c73da7b3e0f8bdd5fdf3014e5f8e6135955df11c77e7f05c9d60",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[stake_instructions]": "5aeb536218701ecff849773ae202ecedc976720f43ab8f280d29b2f371b19889",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[stake_instructions_with_warning]": "833e6a02e4ba228c4a87dc90032bfe50a27ca123697750b67bf3dcbae2883afc",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[sync_native]": "d7c5f749cedc8aff3cab16c85da4a483e8fa8dfa6fb4999cfb62aeeb48ac600f",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[thaw_account]": "0f6339a9a903d36dcc2142ca2ed5909a9794bc9b9d7189f3144a41b67d36f96d",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[thaw_account_-_multisig]": "fa87184a580a5bfbb6de960d844739a8e89dd7aa67472507fff1416c85471fb9",
@ -22683,7 +22689,7 @@
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[transfer_with_compute_budget_without_heap_confirmation]": "92857737c3c221d4486ffa12b0d8668191b7ec473d9060077e104f027a6ae4b6",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[transfer_with_seed]": "648374bd6ebf21edcaae603a53f5d435536065f0988d34b24280d25c4ffee791",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[unknown_instruction]": "2aec3d7f064bb0a43cfdfa17514d9e5e62db98b82842624b9b555ff8d3117c91",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[unstake_instructions]": "3a6f7371fa663f400954ab4138c165bebff1cba9942ea9f037c09f3659358902",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[unstake_instructions]": "8504de9387dcc3f68633d5f49f71702a7f6c0aae0153ec9e952c93ba84b3acca",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[upgrade_nonce]": "68bfd9b9a175c028d78631779bc8ce486b1d17a6d255a2bc66f47a4cc604273b",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[withdraw]": "64230ba3efa3adab7148bc1b3dfb2d1ef270d5a502f3413268ff7ffa3d9a99f2",
"T3T1_en_solana-test_sign_tx.py::test_solana_sign_tx[withdraw_nonce_account]": "3ebe9fbb3e26038c18360bb46fe92665b68c052b3436ce613ad4d11bfb00d068",