Skip to content

feat: add Solana Wallet Standard support#31

Merged
BitHighlander merged 2 commits intodevelopfrom
feature-solana-clean
Feb 28, 2026
Merged

feat: add Solana Wallet Standard support#31
BitHighlander merged 2 commits intodevelopfrom
feature-solana-clean

Conversation

@BitHighlander
Copy link
Collaborator

Summary

  • Adds Solana chain support via Wallet Standard protocol (no window.solana — avoids Phantom conflicts)
  • Signs transactions through vault v11 REST API (POST /solana/sign-transaction)
  • Broadcasts client-side via Solana JSON-RPC (vault has no broadcast endpoint)
  • Increases content script timeout to 5 minutes for hardware wallet signing

New Files

File Purpose
solanaHandler.ts Background chain handler — vault v11 sign + client-side broadcast
solana-wallet-standard.ts KeepKeySolanaWallet class with 5 standard features
solana-wallet-register.ts Event-based wallet registration (callback pattern)

Modified Files

File Change
injected.ts Import + register Solana wallet, version 2.1.0, 5min timeout
methods.ts Route solana chain to handleSolanaRequest
types.ts Add 'solana' to ChainType union
content/index.ts Timeout 30s → 300s for hardware signing
Transaction.tsx Handle 'solana' as 'other' transaction type
package.json Add @wallet-standard/* and @solana/wallet-standard-features deps

Architecture

dApp → wallet-standard:register-wallet event
     → KeepKeySolanaWallet (injected.ts)
     → content script relay
     → background solanaHandler
     → vault v11: POST /solana/sign-transaction { raw_tx: base64 }
     → client-side broadcast via Solana JSON-RPC

Key Design Decisions

  1. Wallet Standard only — never mounts window.solana (conflicts with Phantom)
  2. accounts is a getter — required by StandardWalletAdapter (arraysEqual2 crashes on undefined)
  3. Event detail is a callback({register}) => register(wallet), not an object
  4. No sign-message endpoint — reuses /solana/sign-transaction with raw message bytes
  5. Client-side broadcast — vault v11 has no broadcast endpoint; sends directly to api.mainnet-beta.solana.com
  6. Inline base58 — no external dependency for address decoding

Test plan

  • Load extension in Chrome, verify KeepKey appears in Solana dApp wallet picker
  • Connect to a Solana dApp (e.g., Jupiter, Raydium) — should return device address
  • Sign a transaction — vault should prompt on device, return signed tx
  • Sign and send — should broadcast via Solana RPC and return tx signature
  • Verify Ethereum/EVM functionality is unaffected
  • Verify no window.solana in browser console

🤖 Generated with Claude Code

Integrate Solana via Wallet Standard protocol — no window.solana
(avoids Phantom conflicts). Signs transactions through vault v11
REST API and broadcasts client-side via Solana JSON-RPC.

New files:
- solanaHandler.ts: background handler matching vault v11 endpoints
- solana-wallet-standard.ts: KeepKeySolanaWallet class (5 features)
- solana-wallet-register.ts: wallet-standard event registration

Modified:
- injected.ts: register Solana wallet, bump version, 5min timeout
- methods.ts: route 'solana' chain to handler
- types.ts: add 'solana' to ChainType union
- content/index.ts: 5min timeout for hardware signing
- Transaction.tsx: handle 'solana' chain type

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…utils

- Delete empty networks.ts and stale PIONEER_SDK_INTEGRATION.md
- Remove duplicate ProviderRpcError/createProviderRpcError from methods.ts
  and ethereumHandler.ts, import from canonical utils.ts
- Remove PioneerStorage type, createPioneerStorage(), and pioneerKeyStorage
  exports (4 dead chrome.storage keys)
- Fix toBase64 call-stack limit on large Solana transactions (chunked)
- Fix supportedTransactionVersions to use Set per Wallet Standard spec
- Rebuild injected.js bundle

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@BitHighlander BitHighlander merged commit a08763f into develop Feb 28, 2026
3 of 4 checks passed
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.

1 participant