Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ on:
push:
branches: [main]

permissions:
contents: read

jobs:
build:
runs-on: ubuntu-latest
Expand Down
30 changes: 23 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,27 @@ of your own.

```
src/
├── App.tsx single-page UI
├── localSign.ts v1 + raw-scalar decoders, RFC-8032 Ed25519 signing
├── solana.ts RPC, balance/holdings, SOL + SPL transfer builders
├── polyfills.ts Buffer global (required by @solana/spl-token at module-eval)
├── main.tsx React root
├── styles.css Para design tokens
└── vite-env.d.ts VITE_SOLANA_*_RPC_URL types
├── localSign.ts v1 + raw-scalar decoders, RFC-8032 Ed25519 signing
├── solana.ts RPC, balance/holdings, SOL + SPL transfer builders
├── polyfills.ts Buffer global (required by @solana/spl-token at module-eval)
├── main.tsx React root
├── App.tsx top-level shell + AccountProvider
├── global.css Tailwind v4 entry
├── theme.css Para design tokens
├── vite-env.d.ts VITE_SOLANA_*_RPC_URL types
├── lib/
│ └── utils.ts cn() class-name helper
├── state/
│ └── account.tsx AccountProvider — the only place the decoded key lives
└── components/
├── ImportForm.tsx pre-import paste-the-key screen
├── AccountHeader.tsx address, network toggle, custom RPC, key details
├── BalanceCard.tsx SOL + SPL balances
├── SendSolCard.tsx SOL transfer form
├── SendSplCard.tsx SPL transfer form
├── SignMessageCard.tsx arbitrary-message signing
├── TransactionsCard.tsx submitted-tx history
├── NetworkToggle.tsx mainnet / devnet switch
├── Footer.tsx repo + license links
└── base/ shadcn primitives (button, card, input, …)
```
2 changes: 1 addition & 1 deletion src/components/AccountHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ export function AccountHeader() {
onClick={() => window.open(explorerAccountUrl(address, network), '_blank', 'noreferrer')}
>
<ExternalLink className="para:size-4" />
View on Solana Explorer
View on Solscan
</Button>
<Button variant="outline" size="sm" onClick={resetSession}>
<LogOut className="para:size-4" />
Expand Down
17 changes: 5 additions & 12 deletions src/components/ImportForm.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useState } from 'react';
import { BookOpen, Eye, EyeOff, KeyRound } from 'lucide-react';
import { Eye, EyeOff, KeyRound } from 'lucide-react';
import { Button } from '@/components/base/button';
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/base/card';
import { Input } from '@/components/base/input';
Expand Down Expand Up @@ -47,17 +47,10 @@ export function ImportForm() {
<div className="para:flex para:flex-1 para:items-center para:justify-center para:py-6">
<Card className="para:w-full para:max-w-xl">
<CardHeader>
<div className="para:flex para:items-center para:justify-between para:gap-4">
<CardTitle className="para:flex para:items-center para:gap-2 para:text-2xl">
<KeyRound className="para:size-6 para:text-primary" />
Import Solana private key
</CardTitle>
{/* TODO: point at the published docs URL once available. */}
<Button variant="outline" size="sm" onClick={() => window.open('#', '_blank', 'noreferrer')}>
<BookOpen className="para:size-4" />
Guide
</Button>
</div>
<CardTitle className="para:flex para:items-center para:gap-2 para:text-2xl">
<KeyRound className="para:size-6 para:text-primary" />
Import Solana private key
</CardTitle>
<CardDescription>
Paste the Solana private key that you exported from Para into the field below. The key is held in this
browser tab only — never sent to any server, stored in your browser, or shared with Para.
Expand Down
Loading