import { CentralServerDrift } from '@drift-labs/common';
import express from 'express';
// Initialize server
const driftServer = new CentralServerDrift({
solanaRpcEndpoint: process.env.RPC_URL,
driftEnv: 'mainnet-beta',
supportedPerpMarkets: [0, 1, 2, 3], // SOL, BTC, ETH, APT
supportedSpotMarkets: [0, 1], // USDC, SOL
});
await driftServer.subscribe();
const app = express();
// Endpoint: Get user data
app.get('/user/:pubkey', async (req, res) => {
try {
const pubkey = new PublicKey(req.params.pubkey);
const user = await driftServer.getUser(pubkey);
res.json({
positions: user.getActivePerpPositions(),
equity: user.getTotalCollateral().toString(),
leverage: user.getLeverage().toString(),
});
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Endpoint: Create deposit transaction
app.post('/deposit', async (req, res) => {
try {
const { userPubkey, amount, marketIndex } = req.body;
const txn = await driftServer.getDepositTxn(
new PublicKey(userPubkey),
new BN(amount),
marketIndex
);
// Serialize transaction for client to sign
const serialized = txn.serialize({
requireAllSignatures: false,
verifySignatures: false,
});
res.json({
transaction: Buffer.from(serialized).toString('base64'),
});
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Endpoint: Open perp order
app.post('/order/perp', async (req, res) => {
try {
const { userPubkey, marketIndex, direction, amount } = req.body;
const txn = await driftServer.getOpenPerpMarketOrderTxn({
userAccountPublicKey: new PublicKey(userPubkey),
useSwift: false,
marketIndex,
direction,
amount: BigNum.from(amount, 9),
assetType: 'base',
positionMaxLeverage: 5,
});
const serialized = txn.serialize({
requireAllSignatures: false,
verifySignatures: false,
});
res.json({
transaction: Buffer.from(serialized).toString('base64'),
});
} catch (error) {
res.status(500).json({ error: error.message });
}
});
app.listen(3000, () => {
console.log('Drift API server running on port 3000');
});
// Cleanup on shutdown
process.on('SIGINT', async () => {
await driftServer.unsubscribe();
process.exit(0);
});