rust sdk to interact with drift v2
drift-rs
Experimental, high performance Rust SDK for building offchain clients for Drift V2 protocol.
See the official docs
Install
drift-rs = { git = "https://github.com/velocity-exchange/drift-rs", tag = "v1.0.0" }
* crates.io requires libdrift is installed and linked locally
Use
TheDriftClient struct provides methods for reading drift program accounts and crafting transactions.
It is built on a subscription model where live account updates are transparently cached and made accessible via accessor methods.
The client may be subscribed either via Ws or gRPC.
use drift_rs::{AccountFilter, DriftClient, Wallet, grpc::GrpcSubscribeOpts};
use solana_sdk::signature::Keypair;
async fn main() { let client = DriftClient::new( Context::MainNet, RpcClient::new("https://rpc-provider.com"), Keypair::new().into(), ) .await .expect("connects");
// Subscribe via WebSocket // // 1) Ws-based live market and price changes let markets = [MarketId::spot(1), MarketId::perp(0)]; client.subscribe_markets(&markets).await.unwrap(); client.subscribe_oracles(&markets).await.unwrap(); client.subscribeaccount("SUBACCOUNT1");
// OR 2) subscribe via gRPC (advanced) // gRPC automatically subscribes to all markets and oracles client.grpc_subscribe( "https://grpc.example.com".into(), "API-X-TOKEN".into(), GrpcSubscribeOpts::default() .useraccounts("SUBACCOUNT1", "SUBACCOUNT2") .onslot(move |newslot| { // do something on slot }) .on_account( AccountFilter::partial().with_discriminator(User::DISCRIMINATOR), move |account| { // do something on user account updates }) ).await;
// // Fetch latest values /// let solperpprice = client.oracle_price(MarketId::perp(0)); let subaccount1: User = client.trygetaccount("SUBACCOUNT1"));
Setup
Mac
Install rosetta (m-series only) and configure Rust toolchain for x86_64 ⚠️ 1.76.0-x86_64 must also be installed alongside latest stable rust
softwareupdate --install-rosetta
replace '1.85.0' with preferred latest stable version
rustup install 1.85.0-x8664-apple-darwin 1.76.0-x8664-apple-darwin --force-non-host
rustup override set 1.85.0-x86_64-apple-darwin
Linux
# replace '1.85.0' with preferred latest stable version
rustup install 1.85.0-x8664-unknown-linux-gnu 1.76.0-x8664-unknown-linux-gnu --force-non-host
rustup override set 1.85.0-x86_64-unknown-linux-gnu
⚠️ the non-x86_64 toolchains are incompatible due to memory layout differences between solana program (BPF) and aarch64 and will fail at runtime with deserialization errors like: InvalidSize.
Local Development
drift-rs links to the drift program crate via FFI, build from source (default) by cloning git submodule or dynamically link with a version from drift-ffi-sysclone repo and submodules
git clone https://github.com/velocity-exchange/drift-rs &&\ cd drift-rs &&\ git submodule update --init --recursive
build
# Build from source (default) CARGODRIFTFFI_STATIC=1
Provide a prebuilt driftffisys lib
CARGODRIFTFFIPATH="/path/to/libdriftffi_sys"
Development
Release
git tag v<MAJOR.MINOR.PATCH> && git push
Updating IDL types
from repo root dir:./scripts/idl-update.sh
cargo check # build new IDL types
commit changes...