@fairmint/canton-node-sdk

中文文档
0.0.277发布于 2026/11/14MITTypeScriptCommonJS构建来源已验证近 30 天下载 3万

Canton Node SDK

原始使用文档
文档目录7 节
  1. Developer documentation
  2. Install
  3. Reading the ledger by interface
  4. Reading as every party
  5. Token actions through a CIP-0103 wallet
  6. Repository setup and checks
  7. LocalNet (owned by @fairmint/canton-dev-tools )

canton-node-sdk

Low-level TypeScript SDK for Canton Network nodes (Ledger JSON API, Validator API, Scan API).

Developer documentation

The public GitHub wiki is the canonical guide for configuration, API boundaries, external signing, LocalNet, examples, and contribution. The public src/index.ts defines the supported package surface; use the installed declarations and public examples/ and test/ for exact methods, request shapes, and error behavior.

Install

npm install @fairmint/canton-node-sdk
import { Canton } from '@fairmint/canton-node-sdk';

async function main(): Promise<void> {
  const canton = new Canton({ network: 'localnet' });
  const version = await canton.ledger.getVersion();
  console.log(version);
}

main().catch((error: unknown) => {
  console.error(error);
  process.exitCode = 1;
});

Reading the ledger by interface

getActiveContracts, subscribeToUpdates, getUpdateById and getUpdateByOffset accept interfaceIds filters, with includeInterfaceView and includeCreatedEventBlob to return each contract's interface view and created-event blob. streamActiveContracts reads a large active contract set without collecting it in memory: it yields items as they arrive, applies back-pressure to the participant, and throws if the connection closes before the snapshot is complete. Its activeAtOffset is the offset to pass to subscribeToUpdates as beginExclusive. See examples/stream-active-contracts.ts.

Reading as every party

A party list is a filter: a party it misses, such as one allocated later, is read as if it did not exist. Every read that builds an event format also takes anyParty: true instead of a party list (subscribeToUpdates, getUpdateById, getActiveContracts, streamActiveContracts, getEventsByContractId, and the buildEventFormat / buildTransactionFormat / buildUpdateFormat builders for getUpdateByOffset and getUpdatesPage, whose any-party parameters are AnyPartyEventFormatBuilderParams and its transaction and update variants). It sends filtersForAnyParty, which covers every party the participant hosts, and needs the user's CanReadAsAnyParty right; assertCanReadAsAnyParty(client) checks it and throws a MissingUserRightError naming the user and the rights it holds. The types reject anyParty together with parties or readAs, and the reads reject the combination at run time. Without anyParty, every read behaves as before.

For an archive of what the ledger said, getRawUpdatesPage and subscribeToRawUpdates return each page, page item or frame as the exact text the participant sent and its JSON.parse value, with no schema normalization, failing instead if parsing would change a number (for example an int64 that JavaScript cannot hold exactly) or drop a repeated key. Store the text of each page item or frame; re-serializing its json would reorder integer-like keys. The stream delivers every kind (transactions, reassignments, topology transactions and offset checkpoints) one at a time and in order, applies back-pressure, ends with reason token-refresh before the access token expires, and exposes lastOffset to resume from. subscribeToRawCompletions reads one user's completions the same way; it requires an explicit userId and a non-empty parties list, as the Ledger API does. See examples/read-any-party.ts.

Token actions through a CIP-0103 wallet

Wallets runs token standard (CIP-56) holder actions on Digital Asset Utility Registry instruments through any CIP-0103 (Canton dApp API) wallet provider: list holdings, mint offers, transfer offers and burn requests; accept a mint offer; preview and send a transfer; accept, reject or withdraw a transfer offer; request a burn; and create a transfer preapproval (experimental). It reads choice contexts from DA's public Utilities API with an injectable fetch, and talks to the wallet only through CIP-0103 (getPrimaryAccount, ledgerApi, prepareExecuteAndWait), so no wallet SDK is involved.

It is browser-safe: import @fairmint/canton-node-sdk/build/src/wallets/index.js, which loads none of the SDK's Node dependencies. The package root also exports it as the Wallets namespace.

import {
  createDaUtilitiesClient,
  createTokenWallet,
  type Cip103Provider,
} from '@fairmint/canton-node-sdk/build/src/wallets/index.js';

async function send(provider: Cip103Provider, receiver: string): Promise<void> {
  const tokens = createTokenWallet({
    provider, // any connected CIP-0103 provider
    registry: createDaUtilitiesClient({ network: 'devnet' }),
  });
  const instrumentId = { admin: 'registrar::1220...', id: 'XMPL' };
  const kind = await tokens.previewTransfer({ receiver, instrumentId, amount: '10' });
  await tokens.transfer({ receiver, instrumentId, amount: '10', expectedKind: kind });
}
  • Writes never retry. A WalletSubmitError has outcome rejected-by-user (CIP-0103 4001), failed (-32003, or a request the wallet refused before taking it on) or unknown (session errors 4100/4900/4901 during a submit, timeouts, anything else): check the wallet before resubmitting.
  • One write at a time per token wallet: a write started while another is in progress is refused with busy before any read, so two writes never pick the same holdings.
  • Holdings count only when their registrar signed them, and offers and requests only when a trusted registry provider signed them. By default a registrar must be its own provider; for a registrar served by another provider pass trustedProviders to createDaUtilitiesClient. Contracts of any other provider are never listed or acted on.
  • Amounts are exact decimals (at most 10 places, within Daml Numeric 10); inputs are picked deterministically. requirePreapproval: true sends only when the receiver pre-approved the transfer, and expectedKind refuses a transfer whose kind changed since the preview.

Repository setup and checks

git submodule update --init --depth 1 libs/splice
git submodule update --init --recursive libs/cn-quickstart
npm install
npm run fix
npm test
npm run build

LocalNet (owned by @fairmint/canton-dev-tools)

LocalNet lifecycle and shared test helpers live in @fairmint/[email protected] (see its COMPATIBILITY.md). This SDK does not publish a LocalNet CLI or scripts/localnet-cloud.sh.

npm install   # installs @fairmint/canton-dev-tools as an exact-pinned devDependency
npm run localnet:start
npm run localnet:readiness   # alias: localnet:smoke
npm run localnet:teardown    # alias: localnet:stop

# Or call the Dev Tools CLI directly:
npx @fairmint/canton-dev-tools start
npx @fairmint/canton-dev-tools readiness
npx @fairmint/canton-dev-tools teardown

Integration helpers:

import {
  buildIntegrationTestClientConfig,
  getLocalnetParticipantAdminLedgerClient,
} from '@fairmint/canton-dev-tools/testing';

See docs/package-boundary.md for what the npm package publishes versus CI-only surfaces (npm run check:package-artifacts).

版本与发布记录

@fairmint/canton-node-sdk 共发布 247 个版本,首次发布于 2025/07/17;过去 12 个月发布了 145 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.0.277latest2026/11/14今天
0.0.2762026/11/121 天前
0.0.2752026/11/113 天前
0.0.2742026/11/103 天前
0.0.2732026/11/104 天前
0.0.2722026/11/068 天前

关于 @fairmint/canton-node-sdk 的常见问题

@fairmint/canton-node-sdk 是什么?

Canton Node SDK

如何安装 @fairmint/canton-node-sdk?

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

@fairmint/canton-node-sdk 支持 TypeScript 吗?

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

@fairmint/canton-node-sdk 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@fairmint/canton-node-sdk 需要什么版本的 Node.js?

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

@fairmint/canton-node-sdk 可以商用吗?

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

@fairmint/canton-node-sdk 的下载量有多少?

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

@fairmint/canton-node-sdk 还在维护吗?

最新版本 0.0.277 发布于 2026/11/14(今天);至今共发布 247 个版本,其中过去 12 个月发布了 145 个;首次发布于 2025/07/17。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。