@drift-labs/sdk

中文文档
2.163.0-beta.13发布于 2026/05/12Apache-2.0TypeScriptESM + CJS近 30 天下载 6.5万

漂流协议的 SDK

中文使用文档
文档目录8 节
  1. 安装
  2. 开始
  3. 为您的程序设置钱包
  4. 概念
  5. BN / 精确度
  6. 实例
  7. 设立账户和进行交易
  8. 许可证

漂流议定书v2

SDK npm package Docs Discord Chat License

安装

npm i @drift-labs/sdk

开始

如果你是和"漂流"融合的话,从这里开始!


下面是使用索拉纳和德利夫特的打字机sdk的轻快概览. 如果您想要综合文件, 并举例说明如何与漂流融合, 请使用 v2 教师文件。 。 。 .

为您的程序设置钱包

# Generate a keypair
solana-keygen new

# Get the pubkey for the new wallet (You will need to send USDC to this address to Deposit into Drift (only on mainnet - devnet has a faucet for USDC))
solana address

# Put the private key into your .env to be used by your bot
cd {projectLocation}
echo BOT_PRIVATE_KEY=`cat ~/.config/solana/id.json` >> .env

概念

BN / 精确度

漂流 SDK 使用 BigNum (BN), 使用 此软件包,以表示数值。 这是因为索拉纳令牌倾向于使用精度水平,而精度水平对于标准的Javascript浮点数来说过于精确而难以处理. BN中的所有数字都以整数表示,我们将经常表示 precision 中的数字,以便将其转换回正数.

Example:
a BigNum: 10,500,000, with precision 10^6, is equal to 10.5 because 10,500,000 / 10^6 = 10.5.

Drift SDK使用一些常见的精度,这些精度可以作为常数从SDK导入.

精密名称数值
筹资 资金 资金第10^3号
卡塔尔 棱镜第10^6号
图片第10^6号
定价第10^6号
(法语)第10^9号
贝斯-棱镜第10^9号

BigNum 分区的重要说明

因为BN只支持整数,所以要注意除去时所使用的数字. BN在使用正则分函数时会返回地层;如果想要得到准确的分出,需要也添加两个数字的模组. 有一个助手函数 convertToNumber 在SDK里会为你做这个.

import {convertToNumber} from @drift-labs/sdk

// Gets the floor value
new BN(10500).div(new BN(1000)).toNumber(); // = 10

// Gets the exact value
new BN(10500).div(new BN(1000)).toNumber() + BN(10500).mod(new BN(1000)).toNumber(); // = 10.5

// Also gets the exact value
convertToNumber(new BN(10500), new BN(1000)); // = 10.5

实例

设立账户和进行交易

import * as anchor from '@coral-xyz/anchor';
import { AnchorProvider } from '@coral-xyz/anchor';
import { getAssociatedTokenAddress, TOKEN_PROGRAM_ID } from '@solana/spl-token';

import { Connection, Keypair, PublicKey } from '@solana/web3.js';
import {
    calculateReservePrice,
    DriftClient,
    User,
    initialize,
    PositionDirection,
    convertToNumber,
    calculateTradeSlippage,
    PRICE_PRECISION,
    QUOTE_PRECISION,
    Wallet,
    PerpMarkets,
    BASE_PRECISION,
    getMarketOrderParams,
    BulkAccountLoader,
    BN,
    calculateBidAskPrice,
    getMarketsAndOraclesForSubscription,
    calculateEstimatedPerpEntryPrice,
} from '../sdk';

export const getTokenAddress = (
    mintAddress: string,
    userPubKey: string
): Promise<PublicKey> => {
    return getAssociatedTokenAddress(
        new PublicKey(mintAddress),
        new PublicKey(userPubKey)
    );
};

const main = async () => {
    const env = 'devnet';
    // const env = 'mainnet-beta';

    // Initialize Drift SDK
    const sdkConfig = initialize({ env });

    // Set up the Wallet and Provider
    if (!process.env.ANCHOR_WALLET) {
        throw new Error('ANCHOR_WALLET env var must be set.');
    }

    if (!process.env.ANCHOR_PROVIDER_URL) {
        throw new Error('ANCHOR_PROVIDER_URL env var must be set.');
    }

    const provider = anchor.AnchorProvider.local(
        process.env.ANCHOR_PROVIDER_URL,
        {
            preflightCommitment: 'confirmed',
            skipPreflight: false,
            commitment: 'confirmed',
        }
    );
    // Check SOL Balance
    const lamportsBalance = await provider.connection.getBalance(
        provider.wallet.publicKey
    );
    console.log(
        provider.wallet.publicKey.toString(),
        env,
        'SOL balance:',
        lamportsBalance / 10 ** 9
    );

    // Misc. other things to set up
    const quoteTokenAddress = await getTokenAddress(
        sdkConfig.QUOTE_MINT_ADDRESS,
        provider.wallet.publicKey.toString()
    );

    // Set up the Drift Client
    const driftPublicKey = new PublicKey(sdkConfig.DRIFT_PROGRAM_ID);
    const bulkAccountLoader = new BulkAccountLoader(
        provider.connection,
        'confirmed',
        1000
    );
    const driftClient = new DriftClient({
        connection: provider.connection,
        wallet: provider.wallet,
        programID: driftPublicKey,
        accountSubscription: {
            type: 'polling',
            accountLoader: bulkAccountLoader,
        },
    });
    await driftClient.subscribe();

    console.log('subscribed to driftClient');

    // Set up user client
    const user = new User({
        driftClient: driftClient,
        userAccountPublicKey: await driftClient.getUserAccountPublicKey(),
        accountSubscription: {
            type: 'polling',
            accountLoader: bulkAccountLoader,
        },
    });

    //// Check if user account exists for the current wallet
    const userAccountExists = await user.exists();

    if (!userAccountExists) {
        console.log(
            'initializing to',
            env,
            ' drift account for',
            provider.wallet.publicKey.toString()
        );

        //// Create a Drift V2 account by Depositing some USDC ($10,000 in this case)
        const depositAmount = new BN(10000).mul(QUOTE_PRECISION);
        await driftClient.initializeUserAccountAndDepositCollateral(
            depositAmount,
            await getTokenAddress(
                usdcTokenAddress.toString(),
                provider.wallet.publicKey.toString()
            )
        );
    }

    await user.subscribe();

    // Get current price
    const solMarketInfo = PerpMarkets[env].find(
        (market) => market.baseAssetSymbol === 'SOL'
    );

    const marketIndex = solMarketInfo.marketIndex;

    // Get vAMM bid and ask price
    const [bid, ask] = calculateBidAskPrice(
        driftClient.getPerpMarketAccount(marketIndex).amm,
        driftClient.getOracleDataForPerpMarket(marketIndex)
    );

    const formattedBidPrice = convertToNumber(bid, PRICE_PRECISION);
    const formattedAskPrice = convertToNumber(ask, PRICE_PRECISION);

    console.log(
        env,
        `vAMM bid: $${formattedBidPrice} and ask: $${formattedAskPrice}`
    );

    const solMarketAccount = driftClient.getPerpMarketAccount(
        solMarketInfo.marketIndex
    );
    console.log(env, `Placing a 1 SOL-PERP LONG order`);

    const txSig = await driftClient.placePerpOrder(
        getMarketOrderParams({
            baseAssetAmount: new BN(1).mul(BASE_PRECISION),
            direction: PositionDirection.LONG,
            marketIndex: solMarketAccount.marketIndex,
        })
    );
    console.log(
        env,
        `Placed a 1 SOL-PERP LONG order. Tranaction signature: ${txSig}`
    );
};

main();

许可证

《漂流议定书》v2根据 Apache 2.0 (英语)。 。 。 .

除非您另有明确声明,否则有意提交的任何捐款 如Apache-2.0许可证所定义,由您列入漂流式SDK,应为 (b) 在不附加任何条件的情况下,获得上述许可.

版本与发布记录

@drift-labs/sdk 共发布 1,598 个版本,首次发布于 2021/11/05;过去 12 个月发布了 86 个版本。

版本发布日期距今
2.163.0-beta.13latest2026/05/126 个月前
2.163.0-beta.122026/05/066 个月前
2.163.0-beta.112026/05/056 个月前
2.163.0-beta.102026/04/286 个月前
2.163.0-beta.92026/04/286 个月前
2.163.0-beta.02026/04/027 个月前

其他发布通道:browser → 2.104.0-beta.20,alpha → 2.150.0-alpha.0,beta → 2.156.0-beta.4,stable → 2.156.0。

关于 @drift-labs/sdk 的常见问题

@drift-labs/sdk 是什么?

漂流协议的 SDK

如何安装 @drift-labs/sdk?

在项目目录运行 npm install @drift-labs/sdk,或使用 pnpm add / yarn add / bun add。

@drift-labs/sdk 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@drift-labs/sdk 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@drift-labs/sdk 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js ^24.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@drift-labs/sdk 可以商用吗?

@drift-labs/sdk 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@drift-labs/sdk 的下载量有多少?

根据 npm 官方下载统计,@drift-labs/sdk 在 2026/10/13 – 2026/11/11 这 30 天内被下载 64,846 次,日均约 2,162 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@drift-labs/sdk 还在维护吗?

最新版本 2.163.0-beta.13 发布于 2026/05/12(6 个月前);至今共发布 1598 个版本,其中过去 12 个月发布了 86 个;首次发布于 2021/11/05。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。