Drift Protocol v2

โŒ˜K
๐Ÿ‘พWelcome to Drift Protocol
๐ŸงฎDrift DEX
๐Ÿ‘‹Getting Started
๐Ÿ“ˆPerpetual Futures
๐Ÿ“ŠSpot Margin Trading
๐ŸฆBorrow & Lend
๐Ÿ›๏ธStaking
๐ŸชMarket Makers
๐Ÿ”ฌTechnical Explanations
๐Ÿ“Accounting and Settlement
โž—Borrow Interest Rate
๐Ÿ“œDelisting Process
โ›ฒDrift AMM
๐ŸƒJust-In-Time (JIT) Auctions
๐Ÿ“šKeepers & Decentralised Orderbook
โ˜ ๏ธLiquidators
๐Ÿ’งLiquidity Providers (LPs)
๐Ÿ“‹Protocol Guard Rails
๐Ÿ“Risks
๐Ÿ–ฅ๏ธDeveloper Resources
๐Ÿ“”Program/Vault Addresses
โŒจ๏ธSDK Documentation
โŒจ๏ธTutorial: Bots
โš ๏ธTroubleshooting
๐Ÿ› ๏ธKeeper Bots
๐Ÿ› ๏ธTrading Bots
โŒจ๏ธHistorical Data (v1)
โŒจ๏ธAPI
๐Ÿ›ก๏ธSecurity
๐Ÿ›ก๏ธAudits
๐Ÿ›ก๏ธBug Bounty
โš–๏ธLegal and Regulations
๐Ÿ“Terms of Use
๐Ÿ“Disclaimer
๐Ÿ“Privacy Policy
๐Ÿ“Competition Terms and Conditions
๐Ÿ“šGlossary
Docs powered byย archbeeย 

Tutorial: Arbitrage Bot

7min

View Full GitHub example:

๏ปฟhttps://github.com/drift-labs/example-bots/blob/master/src/arbitrage-bot.ts๏ปฟ

Getting Started

1. Create a connection and wallet object.

It's important to safely load your private key outside of the code to ensure privacy.

JS
|
import { Connection, Keypair, PublicKey } from '@solana/web3.js';

// todo: rename to env variable with key
const privateKey = process.env.SOLANA_PRIVATE_KEY; 
const keypair = Keypair.fromSecretKey(
			Uint8Array.from(privateKey.split(',').map((val) => Number(val)))
		);
const wallet = new Wallet(keypair);
const connection = new Connection(endpoint);
๏ปฟ

2. Install the @drift-labs/sdk.

For more details, peek through ๏ปฟSDK Documentation.

JS
|
import {
	convertToNumber,
	DriftClient,
	initialize,
	PositionDirection,
} from '@drift-labs/sdk';

const sdkConfig = initialize({ env: 'mainnet-beta' });
const driftClientPublicKey = new PublicKey(
    sdkConfig.DRIFT_PROGRAM_ID
);

const driftClient = DriftClient.from(
    connection,
    wallet,
    driftClientPublicKey
);
๏ปฟ

2. Initialize an account and deposit collateral (USDC) on Drift.

JS
|
[, userAccountPublicKey] =
			await driftClient.initializeUserAccountAndDepositCollateral(
				usdcAmount,
				userUSDCAccount.publicKey
			);
๏ปฟ

3. Pick a market and load the price.

JS
|
const marketIndex = new BN(0); // SOL
markPrice = calculateMarkPrice(clearingHouse.getMarket(marketIndexBN))
console.log(convertToNum(markPrice))
๏ปฟ

4. Based on the current price, make a trade by passing a direction (LONG, SHORT) and size (USDC notional).

Optionally: You can set a limitPrice to place an Immediate or Cancel (IOC) order to help ensure your entryPrice comes as expected.

JS
|
const direction = PositionDirection.LONG(); // LONG
const amount = new BN(100000); // $1 (1e6 precision)
const limitPrice = markPrice.mul(1001).div(1000) // .1% tolerance (1e10 precision)

await clearingHouse.openPosition(
	direction,
	amount,
	marketIndex,
	limitPrice
);
๏ปฟ

Advanced

Take advantage of the SDK helpers that we've written for more measured trading:

For instance,calculateTargetPriceTradecalculate the liquidity available between the current markPrice to your targetPrice.

This function is highly recommended for arbitrageurs.

JS
|
const marketIndex = new BN(0);
const market = clearingHouse.getMarket(marketIndex);
const targetPrice = new BN(250.169 * MARK_PRICE_PRECISION);

const [direction, amount, entryPrice, newMarkPrice] =
						calculateTargetPriceTrade(
							market,
							targetPrice,
						);
						
await clearingHouse.openPosition(
	direction,
	amount,
	marketIndex,
	entryPrice
);
	
๏ปฟ

๏ปฟ

Updated 15 May 2023
Did this page help you?
Yes
No
PREVIOUS
Trading Bots
NEXT
Tutorial: JIT Maker Bot
Docs powered byย archbeeย 
TABLE OF CONTENTS
View Full GitHub example:
Getting Started
Advanced