2023-10-18 10:07:14 +00:00
|
|
|
# This file is part of the Trezor project.
|
|
|
|
#
|
|
|
|
# Copyright (C) 2012-2023 SatoshiLabs and contributors
|
|
|
|
#
|
|
|
|
# This library is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
# as published by the Free Software Foundation.
|
|
|
|
#
|
|
|
|
# This library is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU Lesser General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the License along with this library.
|
|
|
|
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
2023-12-04 15:59:25 +00:00
|
|
|
from trezorlib import messages
|
2023-10-18 10:07:14 +00:00
|
|
|
from trezorlib.debuglink import TrezorClientDebugLink as Client
|
|
|
|
from trezorlib.solana import sign_tx
|
|
|
|
from trezorlib.tools import parse_path
|
|
|
|
|
|
|
|
from ...common import parametrize_using_common_fixtures
|
|
|
|
from .construct.instructions import PROGRAMS, UnknownInstruction
|
|
|
|
from .construct.transaction import Message, RawInstruction
|
|
|
|
|
|
|
|
pytestmark = [
|
|
|
|
pytest.mark.altcoin,
|
|
|
|
pytest.mark.solana,
|
|
|
|
pytest.mark.skip_t1,
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
@parametrize_using_common_fixtures(
|
|
|
|
"solana/sign_tx.system_program.json",
|
|
|
|
"solana/sign_tx.stake_program.json",
|
|
|
|
"solana/sign_tx.associated_token_account_program.json",
|
|
|
|
"solana/sign_tx.memo_program.json",
|
|
|
|
"solana/sign_tx.compute_budget_program.json",
|
|
|
|
"solana/sign_tx.token_program.json",
|
|
|
|
"solana/sign_tx.unknown_instructions.json",
|
2023-12-04 15:59:25 +00:00
|
|
|
"solana/sign_tx.predefined_transactions.json",
|
2023-10-18 10:07:14 +00:00
|
|
|
)
|
|
|
|
def test_solana_sign_tx(client: Client, parameters, result):
|
|
|
|
client.init_device(new_session=True)
|
|
|
|
|
|
|
|
serialized_tx = _serialize_tx(parameters["construct"])
|
|
|
|
|
|
|
|
actual_result = sign_tx(
|
|
|
|
client,
|
|
|
|
address_n=parse_path(parameters["address"]),
|
|
|
|
serialized_tx=serialized_tx,
|
2024-02-28 14:11:47 +00:00
|
|
|
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"
|
|
|
|
]
|
2023-12-04 15:59:25 +00:00
|
|
|
]
|
2024-02-28 14:11:47 +00:00
|
|
|
)
|
|
|
|
if "additional_info" in parameters
|
|
|
|
else None
|
|
|
|
),
|
2023-10-18 10:07:14 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
assert actual_result.signature == bytes.fromhex(result["expected_signature"])
|
|
|
|
|
|
|
|
|
|
|
|
def _serialize_tx(tx_construct):
|
|
|
|
serialized_instructions = []
|
|
|
|
for instruction in tx_construct["instructions"]:
|
|
|
|
program = tx_construct["accounts"][instruction["program_index"]]
|
|
|
|
builder = PROGRAMS.get(program, UnknownInstruction)
|
|
|
|
serialized_instruction = builder.build(instruction)
|
|
|
|
raw_instruction = RawInstruction.parse(serialized_instruction)
|
|
|
|
serialized_instructions.append(raw_instruction)
|
|
|
|
|
|
|
|
message_construct = {
|
|
|
|
"version": tx_construct["version"],
|
|
|
|
"header": tx_construct["header"],
|
|
|
|
"accounts": tx_construct["accounts"],
|
|
|
|
"blockhash": tx_construct["blockhash"],
|
|
|
|
"instructions": serialized_instructions,
|
|
|
|
"luts": tx_construct["luts"],
|
|
|
|
}
|
|
|
|
|
|
|
|
return Message.build(
|
|
|
|
message_construct,
|
|
|
|
)
|