@blend-money/fe

中文文档
3.1.1发布于 2026/11/03MITTypeScriptES Module近 30 天下载 3413

B2B新银行整合的混合SDK.

中文使用文档
文档目录18 节
  1. 安装
  2. 快速启动
  3. 配置
  4. 付费服务商
  5. API 参考
  6. 认证
  7. 会话持久性
  8. 发现
  9. 数额
  10. 引用
  11. 现场引用
  12. 执行
  13. 账户数据
  14. 安全管理
  15. 电源用户:会话周期
  16. 处理错误
  17. 发展
  18. 许可证

混合 SDK

npm version npm downloads per week npm downloads per month

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

安装

pnpm add @blend-money/fe

同伴依赖性 : viem

快速启动

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);
}

配置

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 默认为提供者服务的每个链条:

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,因此给少数群体提供者一个明确的连锁列表:

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 参考

认证

// 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 的曝光范围延伸至符的一生.

// 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 自动过滤以表示钱包持有的符号.

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 可以在人可读和最小单位字符串之间转换,而不发生浮点精度损失.

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 .

// 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 只是为了改变金额或象征.

// 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 每个源链称为一次.

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 }

账户数据

需要认证 .

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 }

安全管理

// 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数字 :

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);

处理错误

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。 。 。 .

发展

从单列波根:

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 共发布 15 个版本,首次发布于 2026/05/07;过去 12 个月发布了 15 个版本。

版本发布日期距今
3.1.1latest2026/11/035 天前
3.1.02026/10/051 个月前
3.0.12026/07/243 个月前
3.0.02026/07/233 个月前
2.0.02026/07/143 个月前
1.2.12026/07/044 个月前

关于 @blend-money/fe 的常见问题

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