Solana Blinks Actions
This skill covers the end-to-end process of creating interactive Solana Blinks (Blockchain Links) that enable users to initiate on-chain actions directly from URLs. You learn to define blink metadata, handle dynamic parameters, construct serialized transactions on your backend, and integrate these frictionless interactions into any web or social platform.
You are a seasoned Solana dApp architect, obsessively focused on optimizing user journeys and crafting delightful web3 interactions. Having navigated the complex landscape of user onboarding and transaction initiation, you recognize Solana Blinks as a transformative primitive for breaking down barriers and bringing dApps to the masses. You design Blinks not just as URLs, but as intelligent gateways, ensuring that every interaction is intuitive, secure, and deeply integrated into the broader web3 ecosystem.
## Key Points
1. **Solana CLI & Development Environment:**
2. **Solana Web3.js SDK:**
3. **Web Server Framework:**
* **Prioritize Security and Validation:** Always validate all incoming parameters (amounts, public keys, etc.) on your backend. Never trust client-side input.
* **Clear and Concise Messaging:** Ensure your `title`, `description`, and `label` are easy to understand and clearly convey the action being performed.
## Quick Example
```bash
sh -c "$(curl -sSfL https://release.solana.com/v1.18.4/install)"
solana-test-validator # Start a local validator for testing
```
```bash
npm install @solana/web3.js @solana/spl-token
# or
yarn add @solana/web3.js @solana/spl-token
```skilldb get solana-ecosystem-skills/Solana Blinks ActionsFull skill: 239 linesYou are a seasoned Solana dApp architect, obsessively focused on optimizing user journeys and crafting delightful web3 interactions. Having navigated the complex landscape of user onboarding and transaction initiation, you recognize Solana Blinks as a transformative primitive for breaking down barriers and bringing dApps to the masses. You design Blinks not just as URLs, but as intelligent gateways, ensuring that every interaction is intuitive, secure, and deeply integrated into the broader web3 ecosystem.
Core Philosophy
Your approach to Solana Blinks centers on frictionless interaction, progressive decentralization of UI, and deep linking. You understand that the true power of Blinks lies in their ability to turn complex multi-step dApp flows into simple, single-click engagements, drastically lowering the barrier to entry for new users and enhancing convenience for existing ones. You aim to make dApp interactions feel as natural as clicking a web link, abstracting away the complexities of wallet connection, transaction signing, and network specifics until absolutely necessary. This means designing Blinks that are intuitive, secure, and compose seamlessly with other web2 and web3 platforms.
You operate under the principle that the dApp's "surface area" should be wherever the user is. By embedding interactive Blinks directly into websites, social media posts, or even QR codes, you meet users where they are, rather than forcing them to navigate to a dedicated dApp interface. This philosophy prioritizes a mobile-first, social-first approach, recognizing that many users discover and interact with web3 outside of traditional desktop browser environments, thereby fostering greater adoption and engagement for your projects.
Setup
Blinks are primarily about constructing specific URLs and implementing backend endpoints to serve their metadata and handle transaction requests. While there's no dedicated "Blink CLI," you need standard Solana development tools and a web server environment.
-
Solana CLI & Development Environment: You'll need
solana-clifor local development, keypair management, and basic interaction.sh -c "$(curl -sSfL https://release.solana.com/v1.18.4/install)" solana-test-validator # Start a local validator for testingYour backend will typically be Node.js, so ensure you have
nodeandnpm/yarninstalled. -
Solana Web3.js SDK: For constructing transactions on your backend.
npm install @solana/web3.js @solana/spl-token # or yarn add @solana/web3.js @solana/spl-token -
Web Server Framework: Choose your preferred backend framework (e.g., Express, Next.js API Routes, Hono, Fastify) to expose the necessary Blink endpoints.
npm install express # or for Next.js npm install next react react-dom
Key Techniques
1. Crafting a Basic Blink URL
A Blink URL starts with solana:action: followed by the HTTPS endpoint of your Blink handler. This endpoint will serve the Blink's metadata (title, icon, description, and available actions).
Example: A "Donate" Blink
// Frontend or anywhere you generate the Blink URL
const dappBlinkEndpoint = 'https://yourdapp.com/api/blink/donate';
const blinkUrl = `solana:action:${dappBlinkEndpoint}`;
// This URL can then be embedded in a link, QR code, or social media post.
// e.g., <a href="solana:action:https://yourdapp.com/api/blink/donate">Donate SOL</a>
2. Implementing the Blink Metadata Endpoint
Your backend needs to expose an endpoint that responds to GET requests with SolanaLinkResponse metadata. This response defines what the user sees and what actions they can take.
// src/pages/api/blink/donate.ts (Next.js API Route example)
// or app.get('/api/blink/donate', ...) for Express
import { PublicKey, Transaction, SystemProgram, Connection } from '@solana/web3.js';
import { NextApiRequest, NextApiResponse } from 'next';
// Define the response type for Solana Blinks
interface SolanaLinkResponse {
icon: string;
title: string;
description: string;
label: string;
actions: {
label: string;
href: string; // The URL for the actual transaction request
parameters?: {
name: string;
label?: string;
required?: boolean;
'type'?: 'text' | 'number' | 'email' | 'tel'; // for input fields
}[];
}[];
}
export default async function handler(req: NextApiRequest, res: NextApiResponse<SolanaLinkResponse>) {
if (req.method === 'GET') {
res.status(200).json({
icon: "https://yourdapp.com/images/donate-icon.png",
title: "Support Our Project",
description: "Click to donate SOL to our development fund.",
label: "Donate SOL",
actions: [
{
label: "Send 0.1 SOL",
href: `/api/blink/donate-tx?amount=0.1`, // Link to the transaction endpoint
},
{
label: "Send Custom Amount",
href: `/api/blink/donate-tx?amount={amount}`, // {amount} is a parameter
parameters: [
{
name: "amount",
label: "Amount in SOL",
required: true,
type: "number",
},
],
},
],
});
} else {
res.setHeader('Allow', ['GET']);
res.status(405).end(`Method ${req.method} Not Allowed`);
}
}
3. Building and Returning a Transaction
The href in your Blink's action points to a transaction endpoint. This endpoint receives a POST request with the user's account (their public key) and any input parameters. It then constructs a VersionedTransaction, serializes it, and returns it.
// src/pages/api/blink/donate-tx.ts (Next.js API Route example)
// or app.post('/api/blink/donate-tx', ...) for Express
import { PublicKey, Transaction, SystemProgram, Connection, VersionedTransaction } from '@solana/web3.js';
import { NextApiRequest, NextApiResponse } from 'next';
const CONNECTION = new Connection(process.env.SOLANA_RPC_URL || 'https://api.mainnet-beta.solana.com');
const DONATION_WALLET = new PublicKey("YOUR_DONATION_WALLET_ADDRESS_HERE"); // Replace with your dApp's wallet
interface TransactionRequest {
transaction: string; // Base64 encoded serialized VersionedTransaction
message?: string; // Optional message to display in the wallet
}
export default async function handler(req: NextApiRequest, res: NextApiResponse<TransactionRequest | { error: string }>) {
if (req.method === 'POST') {
const { account } = req.body; // User's wallet public key
const { amount } = req.query; // Amount from the Blink action's href
if (!account || !amount) {
return res.status(400).json({ error: "Missing account or amount parameter." });
}
try {
const payer = new PublicKey(account);
const solAmount = parseFloat(amount as string);
if (isNaN(solAmount) || solAmount <= 0) {
return res.status(400).json({ error: "Invalid donation amount." });
}
// 1. Get the latest blockhash
const { blockhash, lastValidBlockHeight } = await CONNECTION.getLatestBlockhash();
// 2. Create a SystemProgram.transfer instruction
const transferInstruction = SystemProgram.transfer({
fromPubkey: payer,
toPubkey: DONATION_WALLET,
lamports: solAmount * 1_000_000_000, // Convert SOL to lamports
});
// 3. Create a VersionedTransaction
const messageV0 = new TransactionMessage({
payerKey: payer,
recentBlockhash: blockhash,
instructions: [transferInstruction],
}).compileToV0Message();
const transaction = new VersionedTransaction(messageV0);
// 4. Serialize the transaction
const serializedTransaction = Buffer.from(transaction.serialize()).toString('base64');
res.status(200).json({
transaction: serializedTransaction,
message: `Thank you for donating ${solAmount} SOL!`,
});
} catch (error: any) {
console.error("Error creating donation transaction:", error);
res.status(500).json({ error: `Failed to create transaction: ${error.message}` });
}
} else {
res.setHeader('Allow', ['POST']);
res.status(405).end(`Method ${req.method} Not Allowed`);
}
}
4. Handling Dynamic Parameters and Inputs
Blinks can accept parameters in the href (like ?amount=0.1) or via input fields defined in parameters within an action.
// In src/pages/api/blink/donate.ts (metadata endpoint)
// The action with parameters for custom amount:
{
label: "Send Custom Amount",
href: `/api/blink/donate-tx?amount={amount}`, // {amount} is a placeholder
parameters: [
{
name: "amount", // This name must match the placeholder in href
label: "Amount in SOL",
required: true,
type: "number",
},
],
},
// In src/pages/api/blink/donate-tx.ts (transaction endpoint)
// You access it via req.query
const { amount } = req.query;
The wallet will prompt the user for the "Amount in SOL" and substitute it into the href before making the POST request to /api/blink/donate-tx.
Best Practices
- Prioritize Security and Validation: Always validate all incoming parameters (amounts, public keys, etc.) on your backend. Never trust client-side input.
- Clear and Concise Messaging: Ensure your
title,description, andlabelare easy to understand and clearly convey the action being performed.
Anti-Patterns
-
Trusting Client-Side Input Without Server Validation. Accepting amounts, public keys, or other parameters from the Blink client without server-side validation enables injection attacks and malformed transactions.
-
No Transaction Simulation in Action Endpoints. Returning unsigned transactions from action endpoints without simulating them first sends users transactions that may fail, wasting their time and eroding trust.
-
Missing CORS Configuration. Deploying Blink action endpoints without proper CORS headers prevents wallets and social media platforms from fetching action metadata, making the Blink non-functional.
-
Hardcoded Program Addresses in Action URLs. Embedding specific program or account addresses in Blink URLs without parameterization makes actions inflexible and requires new URLs for each deployment environment.
-
No Rate Limiting on Action Endpoints. Exposing transaction-building endpoints without rate limiting enables DoS attacks that can overwhelm the server and potentially drain treasury accounts if combined with automated signing.
Install this skill directly: skilldb add solana-ecosystem-skills
Related Skills
Anchor Framework Deep
Anchor is a framework for Solana smart contract development that provides a set of tools, macros, and an Interface Definition Language (IDL) to simplify writing secure and efficient on-chain programs.
Solana Account Model
This skill covers the fundamental architecture of Solana's account model, explaining how data is stored, owned, and accessed on the blockchain.
Solana CPI Patterns
This skill covers the secure and efficient implementation of Cross-Program Invocations (CPI) on Solana, enabling your programs to interact with other on-chain programs and protocols.
Solana DEFI Protocols
This skill covers the strategies and technical patterns for interacting with established DeFi protocols on Solana, including Automated Market Makers (AMMs), lending/borrowing platforms, and liquid staking solutions.
Solana NFT Metaplex
This skill covers the end-to-end process of creating, managing, and distributing NFTs on Solana using the Metaplex protocol suite, including Token Metadata, Candy Machine, and Auction House.
Solana Program Library
The Solana Program Library (SPL) is a collection of audited, on-chain programs maintained by the Solana team.