Solana’s speed and efficiency make it a prime choice for developing decentralized finance (DeFi) applications. A critical feature in DeFi is seamless token swapping. This guide walks you through building a Node.js backend API to perform token swaps on the Solana blockchain using the Jupiter aggregator.
Designed for clarity, this tutorial covers every step in detail. By the end, you’ll have a functional API ready to handle token swaps and a solid grasp of the underlying mechanics.
Project Setup
Step 1: Initialize the Project
Create a new Node.js project:
mkdir jupiter-swap-api
cd jupiter-swap-api
yarn init -y Step 2: Install Dependencies
Add essential packages:
yarn add @solana/web3.js @solana/spl-token @thewebchimp/primate dotenv Step 3: Project Structure
Organize files for scalability:
jupiter-swap-api/
├── app.js
├── controllers/
│ └── solana.controller.js
├── routes/
│ ├── default.js
│ └── solana.js
├── services/
│ └── solana.service.js
├── .env
├── package.json
└── test.httpWriting the Code
Step 4: Configure Environment Variables
In .env:
SOLANA_RPC_URL=https://api.mainnet-beta.solana.com
JUPITER_QUOTE_API_URL=https://quote-api.jup.ag/v1/quote
JUPITER_SWAP_API_URL=https://swap-api.jup.ag/v1/swap Step 5: Application Entry Point (app.js)
Set up routes and server:
import primate from '@thewebchimp/primate';
import { router as solanaRouter } from './routes/solana.js';
import { router as defaultRouter } from './routes/default.js';
primate.setup();
await primate.start();
primate.app.use('/solana', solanaRouter);
primate.app.use('/', defaultRouter); 👉 Optimize your Solana API performance with these best practices!
Step 6: Solana Service (solana.service.js)
Handles blockchain interactions:
import { Connection, PublicKey } from '@solana/web3.js';
import { getMint } from '@solana/spl-token';
import 'dotenv/config';
const connection = new Connection(process.env.SOLANA_RPC_URL, 'confirmed');
class SolanaService {
static async buildSwapTransaction(publicKey, inputMint, outputMint, amount, slippageBps = 0.5) {
// Logic for fetching mint data, validating slippage, and calling Jupiter API
}
}
export default SolanaService; Step 7: Solana Controller (solana.controller.js)
Manages HTTP requests:
import SolanaService from '../services/solana.service.js';
class SolanaController {
static async swapTokens(req, res) {
// Validates inputs and calls SolanaService
}
}
export default SolanaController; Step 8: Define Routes
routes/solana.js:router.post('/swap', SolanaController.swapTokens);routes/default.js:router.get('/', (req, res) => res.respond({ message: 'API is running!' }));
Step 9: Test the API
Example test.http:
POST http://localhost:1337/solana/swap
Content-Type: application/json
{
"publicKey": "4Nd1mP4F1ZkFb9Ur1Tq69yA4z1A4m2FgYzB7LoN2VZkR",
"inputMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"outputMint": "So11111111111111111111111111111111111111112",
"amount": 0.01
} Conclusion
You’ve built a robust Solana swap API leveraging Jupiter’s aggregator. This foundation enables seamless token swaps and integrates easily into larger DeFi projects.
👉 Explore advanced DeFi integrations to expand your blockchain toolkit!
FAQs
1. What is the Jupiter aggregator?
Jupiter aggregates liquidity across Solana DEXs to provide optimal swap rates.
2. How do I handle slippage?
The API defaults to 0.5% slippage but allows customization via the slippage parameter.
3. Can I use this API for production?
Yes, but ensure error handling and rate-limiting are in place for scalability.
4. What tokens are supported?
Any SPL tokens listed in Jupiter’s liquidity pools.
5. How do I debug transaction failures?
Check Jupiter’s API responses for error details and validate mint addresses.