Skip to content

Add Solana signing support#3211

Merged
johnnyluo merged 19 commits into
mainfrom
aminsato/3130_i
Feb 17, 2026
Merged

Add Solana signing support#3211
johnnyluo merged 19 commits into
mainfrom
aminsato/3130_i

Conversation

@aminsato
Copy link
Copy Markdown
Collaborator

@aminsato aminsato commented Feb 12, 2026

Description

Fixes #3130

Please include a summary of the change and which issue is fixed.

Sol transfer (legacy):
https://solscan.io/tx/e6BNC4wvRMrZ6N2Na47ZCyeWWksapTiwaJXvWgScZoC945AkniYYbUdpHNQAN5FAnwS9TaEBHa89DBEZ35P8ohD

Sol transfer (version 0):
https://solscan.io/tx/3haNVbcGUBCvyNxMAbhe4UEBGzQTXoSkgjG6kX93MRtGB3PToHwjYK2aMEQrcSGRtoZsTH928RHftkw48KRgFXAe

USDC transfer (legacy):
https://solscan.io/tx/5HyeEasD7TLc5C4JXRCZDq4bNz1T667detXhkki4FAYUThgDYQ4uprVL3VFggiVNTzMZ24cVGhWmwnr538QCar1f

USDC transfer (version 0):
https://solscan.io/tx/3Zat2rNgriQWpYYyX7jYGHNqu5poKfMR59FXSxHNjtJ3xaMzcGrgiTuBtZYCMhHCyjRq7HVtbTPMwrx6Yf2nzmea

Partially sol transfer:
https://solscan.io/tx/3YpUkbF5iTys7F1XBoHAzVBymHN5Cr8hTmGL1PhFf6d6PMwFnNQ33mgstShUyvgPcvLgcydGJoCQZgDgYBEVLk1g

Which feature is affected?

  • Create vault ( Secure / Fast) - Please ensure you created a Secure vault & fast vault
  • Sending - Please attach a tx link here
  • Swap - Please attach a tx link for the swap here
  • New Chain / Chain related feature - Please attach tx link here

Checklist

  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works

Screenshots (if applicable):

Additional context

Summary by CodeRabbit

  • New Features

    • Solana pre-signing/signing support, a parser for Solana transactions, and an expandable Solana raw-transaction viewer in the UI.
  • Refactor

    • Unified transaction/UI models so Solana signing data flows through verify/confirm screens and keysign flows.
  • Tests

    • Updated Solana test fixtures (program_id key and image-hash formatting) and added a Solana send fixture.
  • Localization

    • Added raw-transaction strings for multiple languages.
  • Style

    • New chevron icon and dark background color added.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 12, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds end-to-end Solana signing: new signSolana proto/model fields and mapping, Solana transaction parser and raw-transaction signing helpers, a SignSolana UI component, UI model updates to TransactionDetailsUiModel, test fixture updates, drawable and localized string resources, and renames Solana JSON key has_program_idprogram_id.

Changes

Cohort / File(s) Summary
Android test assets & test model extensions
app/src/androidTest/assets/lifiswap.json, app/src/androidTest/assets/solana.json, app/src/androidTest/java/com/vultisig/wallet/data/blockchain/ChainHelperModels.kt, app/src/androidTest/java/com/vultisig/wallet/data/blockchain/ChainHelperModelExtension.kt
Rename Solana JSON key has_program_idprogram_id in fixtures; wrap some expected_image_hash values in arrays; add a Solana test case; add SignSolana serialization and map signSolana into internal payload mapping.
Domain models & proto mappers
data/src/main/kotlin/com/vultisig/wallet/data/models/Transaction.kt, data/src/main/kotlin/com/vultisig/wallet/data/models/payload/KeysignPayload.kt, data/src/main/kotlin/com/vultisig/wallet/data/mappers/KeysignPayloadProtoMapper.kt, data/src/main/kotlin/com/vultisig/wallet/data/models/proto/v1/Aliases.kt
Add signSolana property to Transaction and KeysignPayload; expose SignSolanaProto alias; propagate signSolana from proto mapper into domain payload.
Solana parsing & signing helpers
data/src/main/kotlin/com/vultisig/wallet/data/chains/helpers/ParsedSolanaTransaction.kt, data/src/main/kotlin/com/vultisig/wallet/data/chains/helpers/SolanaHelper.kt
Add Solana transaction parser (ParsedSolanaTransaction, SolanaTransactionParser) to decode base64 transactions and extract instruction summaries; add pre-sign image-hash and raw-transaction signing flows and route signing when signSolana is present.
UI: SignSolana component
app/src/main/java/com/vultisig/wallet/ui/components/SignSolanaDisplayView.kt
Add composable SignSolanaDisplayView(signSolana: SignSolana, ...) with expandable instructions summary and raw transactions viewer; per-transaction parsing with localized strings and safe error handling.
UI model refactor & mappers
app/src/main/java/com/vultisig/wallet/ui/models/VerifyTransactionViewModel.kt, app/src/main/java/com/vultisig/wallet/ui/models/mappers/TransactionToUiModelMapper.kt
Replace SendTxUiModel usages with TransactionDetailsUiModel; mapper now returns TransactionDetailsUiModel and populates signSolana.
Keysign ViewModels & transaction construction
app/src/main/java/com/vultisig/wallet/ui/models/keysign/JoinKeysignViewModel.kt, app/src/main/java/com/vultisig/wallet/ui/models/keysign/KeysignShareViewModel.kt, app/src/main/java/com/vultisig/wallet/ui/models/keysign/KeysignViewModel.kt
Propagate signSolana from payload into constructed Transaction objects; minor formatting/trailing-comma adjustments.
Screens & previews
app/src/main/java/com/vultisig/wallet/ui/screens/TransactionDoneScreen.kt, app/src/main/java/com/vultisig/wallet/ui/screens/keysign/Keysign.kt, app/src/main/java/com/vultisig/wallet/ui/screens/send/VerifySendScreen.kt
Update imports/usages to TransactionDetailsUiModel; render SignSolanaDisplayView in VerifySendScreen when tx.signSolana is present; update previews and signatures accordingly.
Theme, drawable & resources
app/src/main/java/com/vultisig/wallet/ui/theme/v2/Colors.kt, app/src/main/res/drawable/chevron.xml
Add new dark background color to Backgrounds and add chevron.xml vector drawable used by the new Solana UI.
Localized string resources
app/src/main/res/values/strings.xml, app/src/main/res/values-de/strings.xml, app/src/main/res/values-es/strings.xml, app/src/main/res/values-hr/strings.xml, app/src/main/res/values-it/strings.xml, app/src/main/res/values-nl/strings.xml, app/src/main/res/values-pt/strings.xml, app/src/main/res/values-ru/strings.xml, app/src/main/res/values-zh-rCN/strings.xml
Add raw_transaction_data and solana_raw_transaction string resources across multiple locales.
Formatting & misc adjustments
app/src/..., data/src/...
Minor code style and formatting tweaks across files (imports, trailing commas, spacing); test fixtures and expected hashes updated.
🚥 Pre-merge checks | ✅ 5 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Add Solana signing support' clearly summarizes the main objective of the changeset, which implements comprehensive Solana signing functionality across multiple components.
Linked Issues check ✅ Passed The PR implements Solana transaction signing support aligning with the commondata specification (#64), adding signing data structures, parsing logic, UI components, and cross-platform payload conformance as required by #3130.
Out of Scope Changes check ✅ Passed All changes are scoped to Solana signing implementation: new data models, signing helpers, UI components for transaction display, payload structures, and test assets. A minor UI theme change (Colors.kt) adds a background color used by the new SignSolanaDisplayView component.
Merge Conflict Detection ✅ Passed ✅ No merge conflicts detected when merging into main

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch aminsato/3130_i

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
data/src/main/kotlin/com/vultisig/wallet/data/chains/helpers/SolanaHelper.kt (1)

133-159: ⚠️ Potential issue | 🟠 Major

SignSolana signatures won’t match this signing path.

getPreSignedImageHash now returns hashes derived from signSolana.rawTransactions, but getSignedTransaction still signs the standard SigningInput. That will produce a different pre‑image key, leading to “Signature not found” or verification failure for Solana raw‑tx flows.

💡 Suggested branch (handle raw tx first)
     fun getSignedTransaction(
         keysignPayload: KeysignPayload,
         signatures: Map<String, tss.KeysignResponse>,
     ): SignedTransactionResult {
+        keysignPayload.signSolana?.let { signSolana ->
+            require(signSolana.rawTransactions.size == 1) {
+                "Expected exactly one Solana raw transaction"
+            }
+            return signRawTransaction(
+                coinHexPubKey = vaultHexPublicKey,
+                base64Transaction = signSolana.rawTransactions.first(),
+                signatures = signatures
+            )
+        }
         val publicKey = PublicKey(vaultHexPublicKey.toHexByteArray(), PublicKeyType.ED25519)
         val input = getPreSignedInputData(keysignPayload)
         ...
     }
🤖 Fix all issues with AI agents
In
`@app/src/androidTest/java/com/vultisig/wallet/data/blockchain/ChainHelperModels.kt`:
- Around line 307-311: Update the test data model SignSolana to match production
by changing the property rawTransactions from String to List<String> (i.e., val
rawTransactions: List<String>), keeping `@SerialName`("raw_transactions") and
`@Serializable`; then remove or simplify the workaround in
ChainHelperModelExtension that wraps a String in listOf(...) since the test
model will now deserialize directly to a list and align with usages in
SolanaHelper, SignSolanaDisplayView, and VerifySendScreen which expect a
List<String>.

In
`@app/src/main/java/com/vultisig/wallet/ui/components/SignSolanaDisplayView.kt`:
- Around line 118-186: Replace hardcoded UI strings in the transaction summary
UI with localized resources: in the Composable that renders the summary (the
block that checks allInstructions.isNotEmpty()) and inside
InstructionRow(instruction: ParsedSolanaTransaction.ParsedInstruction, index:
Int), swap literal strings "Transaction Instructions Summary", "Instruction
${index + 1}", "Program: $name", "Program ID: ${instruction.programId}", and the
accounts/data line with stringResource(...) calls using formatted string
resources (e.g. solana_instruction_summary, solana_instruction_label with %1$d,
solana_program_label with %1$s, solana_program_id_label with %1$s,
solana_accounts_data_label with %1$d and %2$d). Add the corresponding entries to
strings.xml matching those resource names and formats, and pass index+1, name,
instruction.programId, instruction.accountsCount and instruction.dataLength as
format arguments to stringResource where needed.

In `@app/src/main/java/com/vultisig/wallet/ui/screens/send/VerifySendScreen.kt`:
- Around line 250-258: The lambda passed to takeIf { it.isNotBlank() } uses
tx.signSolana inside the let block which isn't smart-cast; update the let block
in VerifySendScreen.kt so the SignSolanaDisplayView uses the lambda parameter
(it) instead of tx.signSolana (e.g., rawTransactions = listOf(it)) and keep
VerifyCardDivider and SignSolana construction unchanged.

In
`@data/src/main/kotlin/com/vultisig/wallet/data/chains/helpers/ParsedSolanaTransaction.kt`:
- Around line 30-32: The null-check on the result of android.util.Base64.decode
in ParsedSolanaTransaction.parse is incorrect because decode returns an empty
ByteArray on invalid input rather than null; update the logic around txData in
parse to detect an empty result (txData.isEmpty()) and throw the existing
Exception when empty, or alternatively wrap the decode in a try/catch for
IllegalArgumentException and throw the same Exception with a clear message —
locate the parse function and the txData variable to apply this change.

In
`@data/src/main/kotlin/com/vultisig/wallet/data/chains/helpers/SolanaHelper.kt`:
- Around line 113-121: The function getPreSignedImageHash currently processes
keysignPayload.signSolana without confirming the payload is for Chain.Solana;
update getPreSignedImageHash to first check that keysignPayload.chain ==
Chain.Solana (or equivalent enum/value) before iterating
signSolana.rawTransactions and calling getPreSignedImageHashForRaw, so the logic
mirrors the Chain.Solana guard used in getPreSignedInputData and avoids
computing Solana hashes for non‑Solana payloads.

In `@data/src/main/kotlin/com/vultisig/wallet/data/models/Transaction.kt`:
- Line 6: Remove the unused import "vultisig.keysign.v1.SignSolana" from
Transaction.kt; the model declares the property signSolana as a String? (not
SignSolana), so delete the import to eliminate the unused dependency and any
lint/compile warning referencing SignSolana.
🧹 Nitpick comments (4)
data/src/main/kotlin/com/vultisig/wallet/data/chains/helpers/ParsedSolanaTransaction.kt (1)

87-148: Consider using when expression for program ID matching.

The chained if statements could be consolidated into a when expression for improved readability, though the current implementation is functionally correct.

♻️ Suggested refactor
     private fun getInstructionType(programId: String, instructionData: ByteArray): String? {
         if (instructionData.isEmpty()) return null
 
         val discriminator = instructionData[0].toInt() and 0xFF
 
-        // System Program
-        if (programId == "11111111111111111111111111111111") {
-            return when (discriminator) {
+        return when (programId) {
+            "11111111111111111111111111111111" -> when (discriminator) {
                 0 -> "Create Account"
                 2 -> "Transfer"
                 3 -> "Assign"
                 4 -> "Create Account With Seed"
                 9 -> "Transfer With Seed"
                 else -> "System ($discriminator)"
             }
-        }
-
-        // Token Program
-        if (programId == "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA") {
-            return when (discriminator) {
+            "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" -> when (discriminator) {
                 0 -> "Initialize Mint"
                 1 -> "Initialize Account"
                 3 -> "Transfer"
                 7 -> "Mint To"
                 8 -> "Burn"
                 9 -> "Close Account"
                 12 -> "Transfer Checked"
                 else -> "Token ($discriminator)"
             }
-        }
-
-        // Token-2022 Program
-        if (programId == "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb") {
-            return when (discriminator) {
+            "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" -> when (discriminator) {
                 0 -> "Initialize Mint"
                 1 -> "Initialize Account"
                 3 -> "Transfer"
                 7 -> "Mint To"
                 8 -> "Burn"
                 9 -> "Close Account"
                 12 -> "Transfer Checked"
                 else -> "Token-2022 ($discriminator)"
             }
-        }
-
-        // Associated Token Program
-        if (programId == "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL") {
-            return "Create Associated Token Account"
-        }
-
-        // Compute Budget Program
-        if (programId == "ComputeBudget111111111111111111111111111111") {
-            return when (discriminator) {
+            "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" -> 
+                "Create Associated Token Account"
+            "ComputeBudget111111111111111111111111111111" -> when (discriminator) {
                 0 -> "Request Heap Frame"
                 1 -> "Set Compute Unit Limit"
                 2 -> "Set Compute Unit Price"
                 else -> "Compute Budget ($discriminator)"
             }
+            else -> null
         }
-
-        return null
     }
app/src/androidTest/java/com/vultisig/wallet/data/blockchain/ChainHelperModels.kt (1)

217-218: Consider renaming hasProgramId to match the JSON key semantics.

The property is named hasProgramId (suggesting a boolean "has X" pattern) but the JSON key is now program_id. This creates a semantic mismatch. Consider renaming the property to programId for clarity, or clarify via documentation why this Boolean field uses the program_id key.

app/src/androidTest/java/com/vultisig/wallet/data/blockchain/ChainHelperModelExtension.kt (2)

14-14: Remove unused imports.

The following imports appear to be unused in the active code:

  • androidx.compose.runtime.remember (line 14)
  • com.vultisig.wallet.data.chains.helpers.SolanaTransactionParser (line 18)
  • kotlin.text.flatMap (line 33)

These were likely added for the commented-out code block and should be cleaned up.

♻️ Proposed fix
-import androidx.compose.runtime.remember
 import com.vultisig.wallet.data.models.proto.v1.SignDirectProto
 import com.vultisig.wallet.data.api.models.quotes.EVMSwapQuoteJson
 import com.vultisig.wallet.data.api.models.quotes.OneInchSwapTxJson
-import com.vultisig.wallet.data.chains.helpers.SolanaTransactionParser
 import com.vultisig.wallet.data.models.Chain
...
-import kotlin.text.flatMap

Also applies to: 18-18, 33-33


128-145: Remove commented-out code block.

This commented-out function has multiple issues:

  1. It uses remember from Compose runtime, which only works inside @Composable functions—this is a data mapping extension file
  2. Dead/commented code adds noise and confusion

If this logic is needed in the future, it should be properly designed and implemented in an appropriate location.

🗑️ Proposed fix: remove the commented block
-//internal fun SignSolana.toSignSolana(): vultisig.keysign.v1.SignSolana {
-//    val allInstructions = remember(this) {
-//        this.rawTransactions.map { tx ->
-//            try {
-//                val parsed = SolanaTransactionParser.parse(tx)
-//                parsed.instructions
-//            } catch (e: Exception) {
-//                emptyList()
-//            }
-//        }
-//    }
-//
-//
-//
-//    return SignSolana(
-//        rawTransactions = this.rawTransactions
-//    )
-//}
-

Comment thread app/src/main/java/com/vultisig/wallet/ui/components/SignSolanaDisplayView.kt Outdated
Comment thread data/src/main/kotlin/com/vultisig/wallet/data/models/Transaction.kt Outdated
@aminsato aminsato marked this pull request as draft February 12, 2026 19:05
@aminsato aminsato marked this pull request as ready for review February 13, 2026 19:29
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Fix all issues with AI agents
In
`@app/src/main/java/com/vultisig/wallet/ui/components/SignSolanaDisplayView.kt`:
- Line 236: Rename the misspelled preview function SignSolanaDisplayPrewview to
SignSolanaDisplayPreview and update all references/usages accordingly (e.g., any
`@Preview` annotations, composable calls, or test references) to use the corrected
name to avoid unresolved symbol errors; ensure the function signature and any
imports remain unchanged aside from the identifier rename.
- Around line 109-114: In SignSolanaDisplayView where you call
SolanaTransactionParser.parse(tx) inside the try/catch, stop silently swallowing
exceptions and log them—capture the caught Exception (e) and call an appropriate
logger (e.g., Android Log.e with a clear tag like "SignSolanaDisplayView" or
your app's logger) including a descriptive message and the exception stacktrace,
then continue returning emptyList() as the fallback; this keeps the existing
behavior but surfaces parsing failures for debugging.

In
`@app/src/main/java/com/vultisig/wallet/ui/models/keysign/JoinKeysignViewModel.kt`:
- Around line 922-932: Replace the reflection block that reads rawTransactions
with direct property access on the protobuf SignSolana instance: when handling
payload.signSolana in JoinKeysignViewModel.kt, use signSolana.rawTransactions
(e.g., signSolana.rawTransactions.firstOrNull() as? String ?: "") instead of
getDeclaredField("rawTransactions"); remove the try/catch that swallows
exceptions and, if you keep error handling, log the exception via your logger
(or processLogger) to avoid hiding errors while returning an empty string
fallback.

In
`@data/src/main/kotlin/com/vultisig/wallet/data/chains/helpers/SolanaHelper.kt`:
- Around line 143-152: getPreSignedImageHash iterates all
keysignPayload.signSolana.rawTransactions but getSignedTransaction only signs
the first one; either align by restricting hashing to the first transaction or
sign all transactions. Update getSignedTransaction to iterate over
keysignPayload.signSolana.rawTransactions (use map) and call signRawTransaction
for each raw tx (passing coinHexPubKey, base64Transaction, signatures) returning
a collection of signed transactions, and ensure getPreSignedImageHash remains
consistent (or conversely adjust getPreSignedImageHash to only hash the first
tx) so both functions operate on the same transaction set; modify function
signatures/return types accordingly if needed.
- Around line 283-287: The nullable guard on android.util.Base64.decode is
incorrect because decode never returns null; replace the safe-call/Elvis pattern
around txData (where base64Transaction is decoded) with a try-catch that catches
IllegalArgumentException from android.util.Base64.decode and throws or logs a
clear error (e.g., error("Invalid base64 transaction: <details>") or rethrow a
descriptive exception); update the code in SolanaHelper.kt around the txData
assignment (base64Transaction / txData) to validate input via try-catch rather
than using ?:.
🧹 Nitpick comments (2)
app/src/androidTest/java/com/vultisig/wallet/data/blockchain/ChainHelperModelExtension.kt (1)

129-146: Consider removing the commented-out SignSolana helper block.
It’s currently dead code and makes this mapper harder to scan. If you drop it, you can also remove the related imports.

♻️ Suggested cleanup
-//internal fun SignSolana.toSignSolana(): vultisig.keysign.v1.SignSolana {
-//    val allInstructions = remember(this) {
-//        this.rawTransactions.map { tx ->
-//            try {
-//                val parsed = SolanaTransactionParser.parse(tx)
-//                parsed.instructions
-//            } catch (e: Exception) {
-//                emptyList()
-//            }
-//        }
-//    }
-//
-//
-//
-//    return SignSolana(
-//        rawTransactions = this.rawTransactions
-//    )
-//}
data/src/main/kotlin/com/vultisig/wallet/data/chains/helpers/SolanaHelper.kt (1)

282-398: Consider extracting shared decode/parse logic.

Both getPreSignedImageHashForRaw and signRawTransaction duplicate the base64 decode → TransactionDecoder.decode → error check → hasTransaction check → SigningInput build sequence. Extracting a helper would reduce duplication and centralize error handling.

Comment thread app/src/main/java/com/vultisig/wallet/ui/components/SignSolanaDisplayView.kt Outdated
Comment thread app/src/main/java/com/vultisig/wallet/ui/models/keysign/JoinKeysignViewModel.kt Outdated
Comment thread data/src/main/kotlin/com/vultisig/wallet/data/chains/helpers/SolanaHelper.kt Outdated
Copy link
Copy Markdown
Contributor

@johnnyluo johnnyluo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see comments

Comment thread app/src/androidTest/assets/lifiswap.json
Comment thread app/src/androidTest/java/com/vultisig/wallet/data/blockchain/ChainHelperModels.kt Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
app/src/main/java/com/vultisig/wallet/ui/components/SignSolanaDisplayView.kt (2)

35-35: Redundant import.

flatMap is part of Kotlin's standard library and doesn't need an explicit import.

-import kotlin.collections.flatMap

65-76: Small touch target for the expand/collapse button.

The IconButton is only 10.dp, which is well below Material Design's recommended 48.dp minimum touch target. Users may find it difficult to tap. Consider increasing the button's clickable area while keeping the icon visually small.

Suggested approach
             IconButton(
                 onClick = { isExpanded = !isExpanded },
-                modifier = Modifier.size(10.dp)
+                modifier = Modifier.size(48.dp)
             ) {
                 UiIcon(
                     drawableResId = R.drawable.chevron,

Comment thread app/src/androidTest/java/com/vultisig/wallet/data/blockchain/ChainHelperModels.kt Outdated
Copy link
Copy Markdown
Contributor

@johnnyluo johnnyluo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Comment thread app/src/androidTest/assets/solana.json Outdated
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@johnnyluo johnnyluo enabled auto-merge (squash) February 17, 2026 23:31
@johnnyluo johnnyluo merged commit 74e171b into main Feb 17, 2026
2 checks passed
@johnnyluo johnnyluo deleted the aminsato/3130_i branch February 17, 2026 23:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[ADD] Add Solana signing support

2 participants