JavaScript/TypeScript
Complete examples for integrating Turnpike API with JavaScript and TypeScript.
Installation
npm install @solana/web3.js
# Optional: for WebSocket reconnection
npm install wsLightning API Examples
Execute Buy Trade
import fetch from 'node-fetch';
interface BuyTradeParams {
publicKey: string;
mint: string;
amount: number;
slippage?: number;
priorityFee?: number;
}
async function executeBuyTrade(params: BuyTradeParams) {
try {
const response = await fetch('https://api.turnpike.dev/trade/buy', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.TURNPIKE_API_KEY}`
},
body: JSON.stringify({
...params,
slippage: params.slippage || 10,
priorityFee: params.priorityFee || 0.0001
})
});
if (!response.ok) {
const error = await response.json();
throw new Error(`Trade failed: ${error.error.message}`);
}
const data = await response.json();
console.log('Trade successful!');
console.log('Signature:', data.signature);
console.log('Tokens received:', data.tokensReceived);
console.log('Effective price:', data.effectivePrice);
return data;
} catch (error) {
console.error('Error executing trade:', error);
throw error;
}
}
// Usage
executeBuyTrade({
publicKey: 'YOUR_WALLET_PUBLIC_KEY',
mint: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
amount: 0.01
});Get Token Information
async function getTokenInfo(mint: string) {
const response = await fetch(
`https://api.turnpike.dev/token/info/${mint}`,
{
headers: {
'Authorization': `Bearer ${process.env.TURNPIKE_API_KEY}`
}
}
);
if (!response.ok) {
throw new Error('Failed to fetch token info');
}
const data = await response.json();
return data;
}
// Usage
const tokenInfo = await getTokenInfo('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v');
console.log(`${tokenInfo.symbol}: $${tokenInfo.price}`);Get Portfolio
async function getPortfolio(publicKey: string) {
const response = await fetch(
`https://api.turnpike.dev/portfolio/${publicKey}`,
{
headers: {
'Authorization': `Bearer ${process.env.TURNPIKE_API_KEY}`
}
}
);
const data = await response.json();
console.log('Total value:', data.totalValueUsd);
console.log('Tokens:', data.tokens.length);
return data;
}Local Transaction API Examples
Build and Sign Transaction
import { Connection, Transaction, Keypair } from '@solana/web3.js';
import * as bs58 from 'bs58';
async function buildAndSignTrade() {
// Your wallet (load from secure storage)
const secretKey = bs58.decode(process.env.WALLET_PRIVATE_KEY);
const wallet = Keypair.fromSecretKey(secretKey);
// 1. Build transaction via API
const response = await fetch('https://api.turnpike.dev/transaction/buy', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.TURNPIKE_API_KEY}`
},
body: JSON.stringify({
publicKey: wallet.publicKey.toBase58(),
mint: 'TOKEN_MINT_ADDRESS',
amount: 0.01,
slippage: 10
})
});
const data = await response.json();
// 2. Deserialize transaction
const transaction = Transaction.from(
Buffer.from(data.transaction, 'base64')
);
// 3. Connect to RPC
const connection = new Connection('https://api.mainnet-beta.solana.com');
// 4. Sign transaction
transaction.sign(wallet);
// 5. Send transaction
const signature = await connection.sendRawTransaction(
transaction.serialize()
);
console.log('Transaction sent:', signature);
// 6. Confirm transaction
const confirmation = await connection.confirmTransaction(signature);
console.log('Transaction confirmed:', confirmation);
return signature;
}Browser Wallet Integration
import { useWallet, useConnection } from '@solana/wallet-adapter-react';
import { Transaction } from '@solana/web3.js';
function TradingComponent() {
const { publicKey, signTransaction } = useWallet();
const { connection } = useConnection();
const executeTrade = async () => {
if (!publicKey || !signTransaction) {
throw new Error('Wallet not connected');
}
// Build transaction
const response = await fetch('https://api.turnpike.dev/transaction/buy', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.NEXT_PUBLIC_TURNPIKE_API_KEY}`
},
body: JSON.stringify({
publicKey: publicKey.toBase58(),
mint: 'TOKEN_MINT_ADDRESS',
amount: 0.01,
slippage: 10
})
});
const data = await response.json();
// Deserialize and sign
const transaction = Transaction.from(
Buffer.from(data.transaction, 'base64')
);
const signedTx = await signTransaction(transaction);
// Send
const signature = await connection.sendRawTransaction(
signedTx.serialize()
);
// Confirm
await connection.confirmTransaction(signature);
return signature;
};
return (
<button onClick={executeTrade} disabled={!publicKey}>
Execute Trade
</button>
);
}WebSocket Examples
Basic WebSocket Connection
class TurnpikeStream {
private ws: WebSocket | null = null;
private apiKey: string;
constructor(apiKey: string) {
this.apiKey = apiKey;
}
connect() {
this.ws = new WebSocket('wss://turnpike.dev/api/data');
this.ws.onopen = () => {
console.log('Connected');
// Authenticate
this.send({
method: 'authenticate',
apiKey: this.apiKey
});
// Subscribe to trades
this.send({
method: 'subscribe',
keys: ['trades']
});
};
this.ws.onmessage = (event) => {
const data = JSON.parse(event.data);
this.handleMessage(data);
};
this.ws.onerror = (error) => {
console.error('Error:', error);
};
this.ws.onclose = () => {
console.log('Disconnected');
// Reconnect after 5 seconds
setTimeout(() => this.connect(), 5000);
};
}
private send(data: any) {
if (this.ws?.readyState === WebSocket.OPEN) {
this.ws.send(JSON.stringify(data));
}
}
private handleMessage(data: any) {
if (data.type === 'trade') {
console.log('Trade:', {
mint: data.mint,
side: data.side,
amount: data.amount,
price: data.price
});
}
}
disconnect() {
this.ws?.close();
}
}
// Usage
const stream = new TurnpikeStream(process.env.TURNPIKE_API_KEY);
stream.connect();React Hook for WebSocket
import { useEffect, useState } from 'react';
interface Trade {
mint: string;
signature: string;
amount: number;
price: number;
side: 'buy' | 'sell';
timestamp: number;
}
export function useTurnpikeTrades(apiKey: string) {
const [trades, setTrades] = useState<Trade[]>([]);
const [connected, setConnected] = useState(false);
useEffect(() => {
const ws = new WebSocket('wss://turnpike.dev/api/data');
ws.onopen = () => {
setConnected(true);
ws.send(JSON.stringify({
method: 'authenticate',
apiKey
}));
ws.send(JSON.stringify({
method: 'subscribe',
keys: ['trades']
}));
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'trade') {
setTrades(prev => [data, ...prev].slice(0, 50));
}
};
ws.onclose = () => {
setConnected(false);
};
return () => ws.close();
}, [apiKey]);
return { trades, connected };
}
// Usage in component
function TradeFeed() {
const { trades, connected } = useTurnpikeTrades(
process.env.NEXT_PUBLIC_TURNPIKE_API_KEY
);
return (
<div>
<div>Status: {connected ? 'Connected' : 'Disconnected'}</div>
<ul>
{trades.map(trade => (
<li key={trade.signature}>
{trade.side} {trade.amount} @ ${trade.price}
</li>
))}
</ul>
</div>
);
}Complete Trading Bot Example
import { Connection, Keypair } from '@solana/web3.js';
class TradingBot {
private apiKey: string;
private wallet: Keypair;
private ws: WebSocket | null = null;
constructor(apiKey: string, wallet: Keypair) {
this.apiKey = apiKey;
this.wallet = wallet;
}
async start() {
// Connect to WebSocket for price monitoring
this.ws = new WebSocket('wss://turnpike.dev/api/data');
this.ws.onopen = () => {
this.ws?.send(JSON.stringify({
method: 'authenticate',
apiKey: this.apiKey
}));
this.ws?.send(JSON.stringify({
method: 'subscribe',
keys: ['priceUpdates']
}));
};
this.ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.type === 'priceUpdate') {
this.onPriceUpdate(data);
}
};
}
private async onPriceUpdate(data: any) {
// Simple strategy: buy on 5% dip
if (data.priceChange < -5) {
console.log('Price dipped, buying...');
await this.executeBuy(data.mint, 0.01);
}
}
private async executeBuy(mint: string, amount: number) {
try {
const response = await fetch('https://api.turnpike.dev/trade/buy', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${this.apiKey}`
},
body: JSON.stringify({
publicKey: this.wallet.publicKey.toBase58(),
mint,
amount,
slippage: 15
})
});
const data = await response.json();
console.log('Buy executed:', data.signature);
} catch (error) {
console.error('Buy failed:', error);
}
}
stop() {
this.ws?.close();
}
}
// Usage
const bot = new TradingBot(
process.env.TURNPIKE_API_KEY,
wallet
);
bot.start();Error Handling Example
class APIError extends Error {
code: string;
details: any;
constructor(error: any) {
super(error.message);
this.code = error.code;
this.details = error.details;
}
}
async function safeExecuteTrade(params: any, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const response = await fetch('https://api.turnpike.dev/trade/buy', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.TURNPIKE_API_KEY}`
},
body: JSON.stringify(params)
});
const data = await response.json();
if (!response.ok) {
throw new APIError(data.error);
}
return data;
} catch (error) {
if (error instanceof APIError) {
if (error.code === 'RATE_LIMIT_EXCEEDED') {
await new Promise(resolve => setTimeout(resolve, 2000 * (attempt + 1)));
continue;
} else if (error.code === 'SLIPPAGE_EXCEEDED' && attempt < maxRetries - 1) {
params.slippage *= 1.5;
continue;
}
}
throw error;
}
}
}Last updated