# @drift-labs/sdk 中文文档

规范地址：https://npmcn.com/package/%40drift-labs/sdk/

版本：2\.163\.0-beta\.13
npm 元数据更新时间：2026-05-18T02:56:31.901Z
中文译文更新时间：2026-11-12T20:00:55.850Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40drift-labs/sdk
原文对照：https://npmcn.com/package/%40drift-labs/sdk/?lang=original
项目主页：https://www.drift.trade/
源码仓库：https://github.com/drift-labs/protocol-v2

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：14.6 MB，1439 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：包内自带
- Node.js 要求：^24\.0\.0
- 运行依赖：25 个
- 首次发布：2021-11-05T13:22:25.670Z
- 最新版本发布：2026-05-11T16:01:14.088Z
- 近 30 天下载量：64846（2026-10-13 至 2026-11-11，npm 官方下载统计）
- 已发布版本数：1598（近 12 个月 86 个）

## 中文简介

漂流协议的 SDK

## 安装

```sh
npm install @drift-labs/sdk
```

也可以使用：`pnpm add @drift-labs/sdk`、`yarn add @drift-labs/sdk`、`bun add @drift-labs/sdk`

## README

![](https://uploads-ssl.webflow.com/611580035ad59b20437eb024/616f97a42f5637c4517d0193_Logo%20\(1\)%20\(1\).png)

# 漂流议定书v2

[![SDK npm package](https://img.shields.io/npm/v/@drift-labs/sdk)](https://www.npmjs.com/package/@drift-labs/sdk) [![Docs](https://img.shields.io/badge/docs-tutorials-blueviolet)](https://drift-labs.github.io/protocol-v2/sdk/) [![Discord Chat](https://img.shields.io/discord/889577356681945098?color=blueviolet)](https://discord.com/channels/849494028176588802/878700556904980500) [![License](https://img.shields.io/github/license/project-serum/anchor?color=blueviolet)](https://opensource.org/licenses/Apache-2.0)

## 安装

```
npm i @drift-labs/sdk
```

## 开始

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

-   [漂流 v2- 老师 + API Docs](https://drift-labs.github.io/v2-teacher/)
    -   在 Typescript 和 Python 中使用 SDK 的文档和示例
    -   整合漂流时有用的概念和实例
    -   为 Drift 的“ Data API” 提供文档
-   [打印 API 文件](https://drift-labs.github.io/protocol-v2/sdk/)
    -   JSDoc 漂流v2 Typescript SDK 的自动文档
-   [漂移文件](https://docs.drift.trade/)
    -   漂流综合通用文件

* * *

下面是使用索拉纳和德利夫特的打字机sdk的轻快概览. 如果您想要综合文件, 并举例说明如何与漂流融合, 请使用 [v2 教师文件](https://drift-labs.github.io/v2-teacher/)。 。 。 .

### 为您的程序设置钱包

```bash
# 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), 使用 [此软件包](https://github.com/indutny/bn.js/),以表示数值。 这是因为索拉纳令牌倾向于使用精度水平,而精度水平对于标准的Javascript浮点数来说过于精确而难以处理. BN中的所有数字都以整数表示,我们将经常表示 `precision` 中的数字,以便将其转换回正数.

```bash
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里会为你做这个.

```typescript
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
```

## 实例

### 设立账户和进行交易

```typescript
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 (英语)](https://npmcn.com/package/%40drift-labs/sdk/LICENSE)。 。 。 .

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

## 常见问题

### @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 和提交记录判断。

