# @blend-money/fe 中文文档

规范地址：https://npmcn.com/package/%40blend-money/fe/

版本：3\.1\.1
npm 元数据更新时间：2026-11-02T17:32:20.394Z
中文译文更新时间：2026-11-08T06:41:11.086Z
软件包许可：MIT

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

原始 npm 页面：https://www.npmjs.com/package/%40blend-money/fe
原文对照：https://npmcn.com/package/%40blend-money/fe/?lang=original
项目主页：https://docs.blend.money/
源码仓库：https://github.com/BlendMoney/sdks

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

- 包体积（解压后）：72.5 kB，6 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：^22\.23\.4 \|\| ^24\.22\.1 \|\| ^26\.12\.1
- 运行依赖：3 个
- 首次发布：2026-05-07T14:31:48.197Z
- 最新版本发布：2026-11-02T17:32:20.233Z
- 近 30 天下载量：3413（2026-10-09 至 2026-11-07，npm 官方下载统计）
- 已发布版本数：15（近 12 个月 15 个）

## 中文简介

B2B新银行整合的混合SDK.

## 安装

```sh
npm install @blend-money/fe
```

也可以使用：`pnpm add @blend-money/fe`、`yarn add @blend-money/fe`、`bun add @blend-money/fe`

## README

# 混合 SDK

[![npm version](https://img.shields.io/npm/v/@blend-money/fe.svg)](https://www.npmjs.com/package/@blend-money/fe) [![npm downloads per week](https://img.shields.io/npm/dw/@blend-money/fe.svg)](https://www.npmjs.com/package/@blend-money/fe) [![npm downloads per month](https://img.shields.io/npm/dm/@blend-money/fe.svg)](https://www.npmjs.com/package/@blend-money/fe)

混合协议的SDK类型。 前端,通过SIWE验证钱包.

## 安装

```bash
pnpm add @blend-money/fe
```

**同伴依赖性 :** `viem`

## 快速启动

```typescript
import { BlendSdk, getPimlicoPaymasterEndpoints } from "@blend-money/fe";

const sdk = new BlendSdk({
  publishableKey: "pk_live_...",
  signMessage: walletClient.signMessage,
  paymaster: getPimlicoPaymasterEndpoints("pim_..."),
});

// 1. Discover what's available
const chains = await sdk.discover.depositChains();
const tokens = await sdk.discover.depositTokens(8453);

// 2. Sign in with SIWE
const session = await sdk.signIn({ address: "0x...", chainId: 8453 });

// 3. Get a quote
const quote = await sdk.quoteDeposit({
  chainId: 8453,
  tokenAddress: "0xA0b86991...",
  amount: "1000000",
});

// 4. Show confirmation UI
console.log(quote.input); // { symbol: "USDC", amount: "1000000", amountUsd: "1" }
console.log(quote.output); // { symbol: "USDC", amount: "1000000", amountUsd: "1" }
console.log(quote.fees); // { totalUsd: "0.01" }

// 5. Execute
const result = await sdk.execute(quote, {
  signerAddress: address,
  deriveSigner: async (chainId) => ({
    signer: getWalletClient({ chainId }),
    publicClient: getPublicClient({ chainId }),
  }),
  onStatusChange: (status) => console.log(status),
});

if (result.status === "settled") {
  console.log("Done!", result.txHashes);
}
```

## 配置

```typescript
const sdk = new BlendSdk({
  // Required
  publishableKey: "pk_live_...", // Safe for client-side code
  signMessage: (msg) => wallet.sign(msg), // SIWE signature function

  // Required — validated at construction; sponsors Safe UserOps in execute()
  paymaster: {
    /* per-chain ERC-4337 bundler/paymaster endpoints — see below */
  },

  // Optional
  baseUrl: "https://...", // API base URL override
  fiatCurrency: "EUR", // ISO 4217 code for multi-currency
  timeoutMs: 15000, // Request timeout (default: 15000)
  retries: 3, // Max retries for 429/5xx (default: 3)
});
```

### 付费服务商

`paymaster` eRC-4337捆绑商/付费主机为每个链条和供应商所需的元数据服务的同步真理源.

单一提供者的设置是一个呼叫—— `chainIds` 默认为提供者服务的每个链条:

```typescript
import {
  getAlchemyPaymasterEndpoints,
  getPimlicoPaymasterEndpoints,
} from "@blend-money/fe";

// Pimlico everywhere
paymaster: getPimlicoPaymasterEndpoints("pim_...");

// Alchemy everywhere
paymaster: getAlchemyPaymasterEndpoints("alch_...", {
  policyId: "your-gas-manager-policy-id",
});
```

混合布局相接而起 后来为同一连锁ID扩展了先前的连锁ID,因此给少数群体提供者一个明确的连锁列表:

```typescript
paymaster: {
  ...getPimlicoPaymasterEndpoints("pim_..."),
  ...getAlchemyPaymasterEndpoints(
    "alch_...",
    { policyId: "your-gas-manager-policy-id" },
    [9745], // Plasma — not served by Pimlico
  ),
},
```

Pimlico端点只需要API密钥(URL既能提供捆绑运输,又能提供支付). 炼金术终点还带有作为ERC-7677付款人背景传送的气体管理器政策ID(`pm_getPaymasterStubData` 编号 : `pm_getPaymasterData`) (中文(简体) ). 在登记册缺失的链上执行会丢出一个验证错误 .

供应商标签还选择了天然气价格来源: 用户操作费从执行时配置的捆绑器中引用,每个供应商遵循其供应商的有记录的食谱——Pimlico端点通过 `pimlico_getUserOperationGasPrice` (快速分级),通过 `rundler_maxPriorityFeePerGas` 引出缓冲+25%加缓冲最新基费. 不需要额外的配置,而Blend API在气体定价中也不起任何作用.

## API 参考

### 认证

```typescript
// Sign in — wallet prompted to sign a SIWE message
const session = await sdk.signIn({ address: "0x...", chainId: 8453 });
// session: { address, accountId, safeAddress, chainsDeployed, expiresAt }

// Sign out
await sdk.signOut();

// Check state
sdk.isSignedIn; // boolean
sdk.session; // AuthSession (throws if not signed in)
```

### 会话持久性

会话默认为内存并丢失在页面重载中 。 使用 `exportSession()` 财务报告和审定财务报表 `restoreSession()` 可以在重新装入时持续。 过期的令牌在下一次API呼叫时自动刷新. 使用 `sessionStorage` (当标签关闭时被清除) 除非你需要跨塔布的坚持- `localStorage` 将 XSS 的曝光范围延伸至符的一生.

```typescript
// After sign-in, save the session
await sdk.signIn({ address: "0x...", chainId: 8453 });
sessionStorage.setItem("blend-session", JSON.stringify(sdk.exportSession()));

// On page load, restore the session
const stored = sessionStorage.getItem("blend-session");
if (stored) {
  try {
    sdk.restoreSession(JSON.parse(stored));
    // sdk.isSignedIn === true — no wallet prompt needed
  } catch {
    // Corrupt data — fall back to signIn
    sessionStorage.removeItem("blend-session");
  }
}
```

### 发现

不需要认证 。 签到后, `depositTokens` 自动过滤以表示钱包持有的符号.

```typescript
const chains = await sdk.discover.depositChains();
// [{ chainId, name, displayName, iconUrl }]

const tokens = await sdk.discover.depositTokens(8453);
// [{ chainId, address, symbol, name, decimals, logoURI, price, balance?, amount? }]

const destinations = await sdk.discover.withdrawDestinations();
// [{ chainId, name, loanTokenAddress }]

const yieldData = await sdk.discover.yield();
// { accountTypeId, yieldBreakdown: [{ chainId, vaultAddress, breakdown, summary }] }
```

### 数额

SDK要求在符的最小单位(例如. `"1000000"` (以美元计) 使用 `parseAmount` 财务报告和审定财务报表 `formatAmount` 可以在人可读和最小单位字符串之间转换,而不发生浮点精度损失.

```typescript
import { parseAmount, formatAmount } from "@blend-money/fe";

// Human-readable → smallest unit
const smallest = parseAmount("100.50", 6); // "100500000" (USDC has 6 decimals)

// Smallest unit → human-readable
const human = formatAmount("100500000", 6); // "100.5"

// Use with discovered tokens
const tokens = await sdk.discover.depositTokens(8453);
const usdc = tokens.find((t) => t.symbol === "USDC")!;
const amount = parseAmount(userInput, usdc.decimals);
const quote = await sdk.quoteDeposit({
  chainId: 8453,
  tokenAddress: usdc.address,
  amount,
});
```

### 引用

需要认证 。 创建或再使用会话,然后引用它。 返回您的确认对象 UI .

```typescript
// Deposit quote
const quote = await sdk.quoteDeposit({
  chainId: 8453,
  tokenAddress: "0xA0b86991...",
  amount: "1000000",
  externalRef: "order-123", // optional — for reconciliation
  forceReset: false, // optional — cancel existing session first (default: false)
});
// DepositQuote: { type, intentId, originChainId, destinationChainId,
//   input, output, fees, estimatedSeconds, expiresAt }

// Withdrawal quote
const quote = await sdk.quoteWithdraw({
  destinationChainId: 8453,
  amount: "1000000",
  isMaxWithdraw: false, // optional — redeem all shares (default: false)
  forceReset: false, // optional
});
// WithdrawQuote: { type, intentId, destinationChainId, totalAmount,
//   totalFeesUsd, estimatedSeconds, sourceChainCount, expiresAt }
```

### 现场引用

通话 `quoteDeposit` 或者说 `quoteWithdraw` 多次重引用相同的开放式会话与新参数。 没必要 `forceReset` 只是为了改变金额或象征.

```typescript
// User types $1
const quote1 = await sdk.quoteDeposit({
  chainId: 8453,
  tokenAddress: "0xA0b86991...",
  amount: parseAmount("1", 6),
});

// User changes to $5 — same session, fresh quote
const quote2 = await sdk.quoteDeposit({
  chainId: 8453,
  tokenAddress: "0xA0b86991...",
  amount: parseAmount("5", 6),
});
// quote2 reflects the updated amount — same intentId, fresh prices

// Switching from withdraw to deposit also works on open sessions
const depositQuote = await sdk.quoteDeposit({ ... });
```

### 执行

通过一个引文、一个签名地址和一个 `deriveSigner` 回调返回给定链条的viem客户端。 SDK处理会话锁定,链上提交(通过付费人安全用户Ops),散列提交,以及内部和解投票. 对于多链取出, `deriveSigner` 每个源链称为一次.

```typescript
const result = await sdk.execute(quote, {
  signerAddress: address, // EOA address (Hex)
  deriveSigner: async (chainId) => ({
    // returns viem clients for the chain
    signer: getWalletClient({ chainId }),
    publicClient: getPublicClient({ chainId }),
  }),
  isContractSigner: false, // optional — for smart contract wallets (e.g. Coinbase)
  onStatusChange: (status) => {
    // optional — "executing" | "confirming" | "settled" | "failed"
    updateUI(status);
  },
  pollIntervalMs: 3000, // optional (default: 3000)
  pollTimeoutMs: 300000, // optional (default: 300000)
});
// ExecuteResult: { status, txHashes, settledAt, error }
```

### 账户数据

需要认证 .

```typescript
const balance = await sdk.account.balance();
// { accountId, safeAddress, perChain, total }

const history = await sdk.account.balanceHistory({ startDate: "2025-01-01" });
// [{ id, createdAt, totalValue, totalYield, breakdown }]

const positions = await sdk.account.positions();
// { accountId, safeAddress, events }

const returns = await sdk.account.returns();
// { current, totalDeposited, totalWithdrawn, netDeposited, returns, returnsPct }
```

### 安全管理

```typescript
// Resolve Safe deployment on a chain (requires auth)
const resolution = await sdk.account.safe.resolve(8453);
// { status: "validated", accountId, userAddress, safeAddress, chainId }

// Request Safe deployment (requires auth)
await sdk.account.safe.request(8453);

// Look up account by EOA (no auth required)
const account = await sdk.account.safe.lookup("0x...");
// { accountId, safeAddress, chainsDeployed }
```

### 电源用户:会话周期

对于先进用途案例,可通过下列途径获得整个意图会话生命周期: `sdk.sessions`数字 :

```typescript
const session = await sdk.sessions.createSession({ forceReset: true });
const quoted = await sdk.sessions.quoteDeposit(session.intentId, { ... });
const locked = await sdk.sessions.lock(session.intentId, { signerAddress: "0x..." });
const submitted = await sdk.sessions.submit(session.intentId, { txHashes: [...] });
const result = await sdk.sessions.execute(session.intentId, { ... });
const sessions = await sdk.sessions.list();
await sdk.sessions.cancel(session.intentId);
```

## 处理错误

```typescript
import { SdkError, SESSION_ERROR_CODES } from "@blend-money/fe";

try {
  await sdk.quoteDeposit({ ... });
} catch (err) {
  if (err instanceof SdkError) {
    console.log(err.code);            // e.g. "AUTH_NOT_SIGNED_IN"
    console.log(err.status);          // HTTP status
    console.log(err.getUserMessage()); // human-readable message
    console.log(err.isRetryable());   // true for 429, 5xx, network errors
  }
}
```

错误代码 : `AUTH_NOT_SIGNED_IN`, (中文(简体) ), `AUTH_CHALLENGE_FAILED`, (中文(简体) ), `AUTH_VERIFICATION_FAILED`, (中文(简体) ), `AUTH_TOKEN_EXPIRED`, (中文(简体) ), `AUTH_INVALID_SESSION`, (中文(简体) ), `INTENT_NOT_FOUND`, (中文(简体) ), `INTENT_EXPIRED`, (中文(简体) ), `INTENT_WRONG_STATUS`, (中文(简体) ), `INTENT_CONCURRENT_TRANSITION`, (中文(简体) ), `SESSION_NOT_QUOTED`, (中文(简体) ), `SESSION_LOCKED_BY_OTHER`, (中文(简体) ), `SETTLEMENT_TIMEOUT`, (中文(简体) ), `FLOWPLAN_CONFLICT`。 。 。 .

## 发展

从单列波根:

```bash
pnpm install                              # Install all dependencies
pnpm --filter @blend-money/fe build      # Build this package
pnpm --filter @blend-money/fe dev        # Watch mode
pnpm --filter @blend-money/fe test       # Run tests (interactive)
pnpm --filter @blend-money/fe test:run   # Run tests (CI)
pnpm --filter @blend-money/fe check-types # Type check
```

或运行 `pnpm build`, (中文(简体) ), `pnpm test:run`等从单列波根运行到所有软件包.

## 许可证

麻省理工学院

## 常见问题

### @blend-money/fe 是什么？

B2B新银行整合的混合SDK\.

### 如何安装 @blend-money/fe？

在项目目录运行 npm install @blend-money/fe，或使用 pnpm add / yarn add / bun add。

### @blend-money/fe 支持 TypeScript 吗？

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

### @blend-money/fe 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @blend-money/fe 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js ^22\.23\.4 \|\| ^24\.22\.1 \|\| ^26\.12\.1。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @blend-money/fe 可以商用吗？

@blend-money/fe 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @blend-money/fe 的下载量有多少？

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

### @blend-money/fe 还在维护吗？

最新版本 3\.1\.1 发布于 2026/11/03（5 天前）；至今共发布 15 个版本，其中过去 12 个月发布了 15 个；首次发布于 2026/05/07。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

