A beginner-friendly template for building applications (dApps) on Solana using Anchor and Next.js. This template implements a counter program that demonstrates essential Solana development concepts including PDAs (Program Derived Addresses), CPIs (Cross-Program Invocations), and state management.
demo.mp4
To try the demo, make sure to use a test wallet connected to devnet.
Phantom | Solflare |
---|---|
phantom.mp4 |
solflare.mp4 |
This template is for educational purposes and set up for devnet use only.
This template is designed for developers who want to learn:
- How to build Solana programs using the Anchor framework
- How to work with PDAs for state management and program signing
- How to perform Cross-Program Invocations (CPIs)
- How to create frontends that interact with Solana programs
- How to handle wallet connections and transactions on a frontend
The Solana program in this template demonstrates several core concepts through a simple counter application:
-
Counter PDA
- Stores the counter's current value
- Derived using the seed "counter"
- Global state accessible to all users
- Automatically initialized on first increment
-
Vault PDA
- Holds SOL tokens from user transactions
- Derived using:
- Seed "vault"
- User's public key
- Each user gets their own vault
- Demonstrates using PDAs for CPI signing
-
Increment
- Increases counter value by 1
- Performs CPI to transfer 0.001 SOL from user to vault
- Creates counter PDA if it doesn't exist
- Demonstrates:
- PDA initialization
- System program CPI for SOL transfer
- State management
-
Decrement
- Decreases counter value by 1
- Performs CPI to transfer 0.001 SOL from vault back to user
- Demonstrates:
- PDA signing (vault)
- System program CPI with PDA as signer
The program demonstrates CPIs through SOL transfers:
- User → Vault (increment): Basic CPI to system program
- Vault → User (decrement): CPI with PDA signing
├── program/ # Solana program (smart contract)
│ ├── programs/ # Program source code
│ ├── tests/ # Program tests
│ └── Anchor.toml # Anchor configuration
│
└── frontend/ # Next.js frontend
├── app/ # app router page and layout
├── components/ # React components
└── anchor-idl/ # Program IDL
-
Solana Program
- Counter state management using PDA
- Vault system using user-specific PDAs
- SOL transfer demonstration using CPIs
- PDA initialization and signing
-
Frontend Application
- Wallet adapter integration
- Real-time counter updates
- Transaction toast notifications
- UI with Tailwind CSS and shadcn/ui
- Node.js 18+ and pnpm
- Rust and Solana CLI tools
- Anchor Framework
- Clone the repository:
git clone <repository-url>
- Install program dependencies:
cd program
pnpm install
anchor build
anchor keys sync
- Install frontend dependencies:
cd frontend
pnpm install
- Test the program:
cd program
anchor test
- Run the frontend:
cd frontend
pnpm dev
program/programs/counter/src/lib.rs
: Core program logic- Instruction handling
- PDA creation and management
- CPI implementation
frontend/components/counter/
: Main dApp componentsCounterDisplay.tsx
: Real-time data updatesIncrementButton.tsx
&DecrementButton.tsx
: Transaction handlingWalletButton.tsx
: Wallet adapter button
frontend/components/counter/hooks/
:useProgram.tsx
: Program initialization and wallet managementuseTransactionToast.tsx
: Transaction notification
-
Program Development
- PDA creation and management
- Counter state PDA
- User-specific vault PDAs
- Cross-Program Invocations (CPIs)
- Basic transfers (user to vault)
- PDA signing (vault to user)
- State management
- Initialize-if-needed pattern
- Program state updates
- PDA creation and management
-
Frontend Development
- Wallet integration and connection
- Transaction building and signing
- Account subscription for real-time updates
- Toast notifications for transaction feedback