项目 0 类型SDK
一个现代的,型式安全的TypeScript SDK,用于与关于索拉纳的P0协议互动. 借出,借出,并管理以清洁,开发友好的API为杠杆的DeFi位置.
📖 读取完整文档
特征
- 🔒 类型安全: 包含全面类型定义的完整类型脚本支持
- 📦 树能震动:优化的无害环境管理和CJS构建 (<1MB)
- 🧪 测试良好单位和与Vitest合并测试
- 📚 丰富的实例: 7+ 涵盖所有核心特征的可运行实例
- 🔄 现代工具: 由tsup,ESLint,Pretier所建 :
- 🎯 索拉纳本土: 建在Anchor上,并实现全链集成
- ⚡ 生产准备: 用于生产用途
安装
npm install @0dotxyz/p0-ts-sdk
# or
yarn add @0dotxyz/p0-ts-sdk
# or
pnpm add @0dotxyz/p0-ts-sdk
快速启动
1. 客户初始化
import { Connection, PublicKey } from "@solana/web3.js";
import { Project0Client, getConfig } from "@0dotxyz/p0-ts-sdk";
// Connect to Solana
const connection = new Connection("https://api.mainnet-beta.solana.com", "confirmed");
// Get configuration (mainnet-beta)
const config = getConfig("production");
// Initialize the client (loads all banks and oracle prices)
const client = await Project0Client.initialize(connection, config);
console.log(`Loaded ${client.banks.length} banks`);
2. 装入您的账户
import { MarginfiAccount, MarginfiAccountWrapper } from "@0dotxyz/p0-ts-sdk";
const accountAddress = new PublicKey("YOUR_MARGINFI_ACCOUNT_ADDRESS");
// Fetch your account
const account = await MarginfiAccount.fetch(accountAddress, client.program);
// Wrap it for cleaner API
const wrappedAccount = new MarginfiAccountWrapper(account, client);
3. 寻找银行
import { AssetTag } from "@0dotxyz/p0-ts-sdk";
// Option 1: Get bank by address
const bank = client.getBank(new PublicKey("BANK_ADDRESS"));
// Option 2: Get all banks for a mint (e.g., USDC)
const USDC_MINT = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const usdcBanks = client.getBanksByMint(USDC_MINT);
4. 存款托肯
// Build deposit transaction
const depositTx = await wrappedAccount.makeDepositTx(
usdcBank.address,
"100" // Amount in UI units (100 USDC)
);
// Simulate (optional, but recommended)
const simulation = await connection.simulateTransaction(depositTx);
console.log(`Compute units: ${simulation.value.unitsConsumed}`);
// Sign and send
// depositTx.sign([wallet]);
// await connection.sendTransaction(depositTx);
5. 对担保物的借款
// Check how much you can borrow (account health + bank borrow cap + bank liquidity)
const maxBorrow = wrappedAccount.computeMaxBorrowForBank(usdcBank.address);
console.log(`Max borrow: $${maxBorrow.toString()}`);
// Build borrow transaction
const borrowTx = await wrappedAccount.makeBorrowTx(
usdcBank.address,
"100" // Borrow 100 USDC
);
// Send transaction...
6. 监测账户保健
import { MarginRequirementType } from "@0dotxyz/p0-ts-sdk";
// Get free collateral in USD
const freeCollateral = wrappedAccount.computeFreeCollateral();
console.log(`Free collateral: $${freeCollateral.toString()}`);
// Get health components
const health = wrappedAccount.computeHealthComponents(MarginRequirementType.Initial);
const healthFactor = health.assets.div(health.liabilities);
console.log(`Health factor: ${healthFactor.toString()}`);
实例
看看这个 examples/ 完整、可运行的示例目录 :
- 01 - 存储. ts - 存款和赚取利息
- 02-浏览数(ts) - 借你的担保品
- 03- 撤销( ts) - 收回你的存款
- 04还款 - 偿还借入的款项
- 05-oracle-prices.ts (英语) - 与甲骨文价格饲料合作
- 06a -- -- 账户 -- -- 健康模拟 - 监测账户保健
- 06b-账户-健康计算 - 计算健康指标
每个例子包括:
- QQ 完整设置指令
- 详细评论
- QQ 处理出错
- 交易模拟
运行示例
cd examples
cp .env.example .env
# Edit .env with your values
tsx 01-deposit.ts
核心概念
项目0 客户端
管理协议交互的主要SDK客户端.
const client = await Project0Client.initialize(connection, config);
// Pre-loaded data (fetched once at initialization)
client.banks // All available banks
client.bankMap // Banks indexed by address
client.oraclePriceByBank // Latest oracle prices
client.mintDataByBank // Token mint metadata
client.addressLookupTables // For transaction optimization
// Methods
client.getBank(address) // Get bank by address
client.getBanksByMint(mint, tag?) // Get all banks for a mint
福利:
- 单一初始化加载所有链条数据
- 重新使用整个应用程序
- 自动预告价格缓存
- 内建的搜索表支持
边距fi 账户和 Wrapper
你的贷款账户在协议.
// Fetch raw account
const account = await MarginfiAccount.fetch(address, client.program);
// Wrap for clean API (recommended)
const wrapped = new MarginfiAccountWrapper(account, client);
// All methods have access to banks, oracles, etc.
wrapped.computeMaxBorrowForBank(bankAddress);
wrapped.makeDepositTx(bankAddress, amount);
wrapped.computeFreeCollateral();
银行
某地的贷款池.
const bank = client.getBank(bankAddress);
bank.mint; // Token mint address
bank.config; // Interest rates, weights, limits
bank.config.assetWeightInit; // Collateral factor (LTV)
bank.config.liabilityWeightInit; // Borrow weight
余额
你在特定银行的地位.
const balance = account.balances[0];
balance.bankPk; // Bank address
balance.assetShares; // Deposit shares
balance.liabilityShares; // Borrow shares
balance.active; // Is position active?
QQ 软件包结构
SDK提供了优化的切入点:
// Main SDK (core functionality)
import { Project0Client, MarginfiAccount, getConfig } from "@0dotxyz/p0-ts-sdk";
// Vendor utilities (oracle integrations, Jupiter, etc.)
import { fetchOracleData, OraclePrice } from "@0dotxyz/p0-ts-sdk/vendor";
为什么要单独出口供应商?
- 简单使用大小的捆绑大小
- 甲骨文库( Pyth, 范围) 很大
- 树震你不需要的东西
关键特性
类型安全
导出类型的全类型脚本支持 :
import type {
MarginfiAccountType,
BankType,
BalanceType,
OraclePrice,
MarginRequirementType,
Project0Config,
} from "@0dotxyz/p0-ts-sdk";
多重银行支持
处理同一薄荷存在多家银行的案件:
// Get ALL SOL banks (main + Kamino)
const solBanks = client.getBanksByMint(WSOL_MINT);
// Filter by tag
const mainSolBanks = client.getBanksByMint(WSOL_MINT, AssetTag.SOL);
const kaminoBanks = client.getBanksByMint(WSOL_MINT, AssetTag.KAMINO);
健康计算
内建账户健康监测:
import { MarginRequirementType } from "@0dotxyz/p0-ts-sdk";
// Free collateral (how much you can still borrow)
const free = wrapped.computeFreeCollateral();
// Health components (assets vs liabilities)
const health = wrapped.computeHealthComponents(
MarginRequirementType.Initial // or Maintenance
);
// Max amounts — bank-aware:
// borrow = min(health-based, remaining borrow cap, available bank liquidity, rate-limit headroom)
// withdraw = min(health-based, available bank liquidity, rate-limit headroom)
// deposit = remaining deposit cap (optionally min'd with your wallet balance)
// (rate-limit headroom = bank net-outflow limiter in tokens + group USD limiter, if enabled)
const maxBorrow = wrapped.computeMaxBorrowForBank(bankAddress);
const maxWithdraw = wrapped.computeMaxWithdrawForBank(bankAddress);
const maxDeposit = wrapped.computeMaxDepositForBank(bankAddress, { walletBalance: 1_000 });
// Pass { ignoreBankLimits: true } to get the purely health-based borrow/withdraw amount
测试
SDK包括综合测试:
# Unit tests (fast, no RPC needed)
pnpm test:unit
# Integration tests (requires RPC)
SOLANA_RPC_URL=https://api.mainnet-beta.solana.com pnpm test:integration
# All tests
pnpm test
# With coverage
pnpm test:coverage
测试策略 :
- 单位测试: 纯计算,转换,验证
- 融合测试: 真实链数据,交易构建,模拟
见 试验. md 详细情况.
发展
先决条件
- 节点.js 18.0.0
- pnpm(建议)
设置
# Install dependencies
pnpm install
# Build the SDK
pnpm build
# Watch mode (for development)
pnpm dev
# Type check
pnpm typecheck
# Lint and format
pnpm lint
pnpm format
项目结构
p0-ts-sdk/
├── src/
│ ├── index.ts # Main SDK exports
│ ├── vendor/ # Vendor entry point (oracles, etc.)
│ ├── config.ts # Network configurations
│ ├── models/ # Core models
│ │ ├── client.ts # Project0Client
│ │ ├── account.ts # MarginfiAccount
│ │ ├── account-wrapper.ts # MarginfiAccountWrapper
│ │ ├── bank.ts # Bank model
│ │ └── ...
│ ├── services/ # Business logic
│ │ ├── account/ # Account operations
│ │ ├── price/ # Oracle price fetching
│ │ └── ...
│ ├── instructions/ # Transaction builders
│ ├── types/ # TypeScript types
│ ├── idl/ # Anchor IDL
│ └── utils/ # Helpers
├── tests/
│ ├── unit/ # Unit tests (mocked)
│ ├── integration/ # Integration tests (real RPC)
│ └── fixtures/ # Test data
├── examples/ # 7+ runnable examples
└── dist/ # Build output
├── index.js # ESM bundle
├── index.cjs # CJS bundle
├── index.d.ts # Type definitions
└── vendor.* # Vendor bundles
可用的脚本
| 脚本 | 说明 |
|---|---|
pnpm build | 建立无害环境管理+CJS捆绑 |
pnpm dev | 开发的监视模式 |
pnpm test | 运行所有测试 |
pnpm test:unit | 仅运行单元测试 |
pnpm test:integration | 运行集成测试 |
pnpm test:coverage | 生成覆盖报告 |
pnpm lint | 使用 ESLint 键入 |
pnpm format | 格式为 Pretier |
pnpm typecheck | 脚本类型检查 |
pnpm clean | 删除建筑文物 |
pnpm changeset | 创建发行的更改器 |
pnpm version | 从更改中跳出版本 |
pnpm release | 构建并发布到 npm |
· 出版
此软件包使用 更改 用于版本管理和npm出版.
见 相关内容 详细指示,或 变化集/QUICKSTART.md 快速参考.
快速发布 :
npm login
pnpm changeset # Document changes
pnpm version # Bump version
pnpm release # Publish to npm
git push --follow-tags
捐款
我们欢迎捐款! 请参见我们提供的准则:
- 叉子存储器
- 创建特性分支( E)
git checkout -b feature/amazing-feature(中文(简体) ) - 用测试来改变
- 运行
pnpm test财务报告和审定财务报表pnpm lint - 提交更改( E)
git commit -m 'Add amazing feature'(中文(简体) ) - 推向分行(
git push origin feature/amazing-feature(中文(简体) ) - 打开拉请求
发展 工作流量
# 1. Make changes
vim src/models/client.ts
# 2. Add tests
vim tests/unit/models/client.test.ts
# 3. Run tests
pnpm test:unit
# 4. Build
pnpm build
# 5. Test with examples
cd examples && tsx 01-deposit.ts
许可证
这个项目根据麻省理工学院许可证颁发——见 自由主义 详细文件.
承认
这个SDK是建在顶部的 边距协议利用其链上方案和基础设施.
此外,还感谢:
• 免责声明
这个SDK是一次性提供的。 总是:
- 了解 DeFi 协议的风险
- 监控您的账户健康
- 采用适当的风险管理
- 审计您的整合代码
为建筑商建造 🛠️由P0团队出道