<>ts-stack
Get StartedArchitecturePackagesSpecsGuides
⌘K
Reference
Home
Get StartedOverviewInstallChoose your stackKey concepts
ArchitectureOverviewStack layersBEEF (BRC-62)BRC-100 Wallet InterfaceIdentity & AuthConformance pipeline
PackagesOverviewSDKWalletNetworkOverlays
@bsv/overlay@bsv/overlay-express@bsv/overlay-topics@bsv/overlay-discovery-services@bsv/gasp@bsv/btms-backend
MessagingMiddlewareHelpers
InfrastructureOverviewmessage-box-serveroverlay-serveruhrp-server-basicuhrp-server-cloud-bucketwabwallet-infrachaintracks-server
SpecsOverviewBRC-100 Wallet InterfaceOverlay HTTPMessage-box HTTPAuthsocket (WebSocket)BRC-31 Auth HandshakeBRC-29 Peer PaymentBRC-121 / HTTP 402ARC BroadcastMerkle ServiceStorage AdapterGASP SyncUHRPAir-Gap Optical (BRC-141)
ConformanceOverviewVector catalogTS runnerContributing vectors
GuidesOverviewBuild a wallet-aware appRun an overlay nodePeer-to-peer messagingHTTP 402 payments
ReferenceOverviewBRC indexRepository health
AboutVersioningContributingDoc agentDocumentation sources
v0.1.1experimental
Loading…
Edit this page on GitHub
© 2026 BSV Blockchain. ts-stack is open-source.
GitHubContributingVersioning

@bsv/btms-backend

BTMS (Basic Token Management System) overlay services — topic manager and lookup service for token validation and indexing.

Note: Core BTMS definitions have been consolidated into @bsv/overlay-topics. This package may be transitional or legacy; prefer using @bsv/overlay-topics directly for new projects.

Install

bash
npm install @bsv/btms-backend

Quick start

typescript
import { BTMSTopicManager, BTMSLookupServiceFactory } from '@bsv/btms-backend'
import { MongoClient } from 'mongodb'

const client = new MongoClient('mongodb://localhost:27017')
await client.connect()
const db = client.db('btms')

const topicManager = new BTMSTopicManager()

// Validate a transaction
const result = await topicManager.identifyAdmissibleOutputs(beef, previousCoins)
// Returns: { outputsToAdmit: [0, 1], coinsToRetain: [] }

// Create lookup service
const lookupService = await BTMSLookupServiceFactory(db)

// Query tokens by asset ID
const results = await lookupService.lookup({
  service: 'ls_btms',
  query: { assetId: 'txid.0' }
})

What it provides

  • BTMSTopicManager — Validates token transactions (issuance, transfer, burn)
  • BTMSLookupServiceFactory — Factory for creating MongoDB-backed lookup service
  • Token validation — Enforces BTMS protocol rules (conservation, metadata consistency)
  • Query by asset ID — Find all tokens for a specific asset
  • Query by owner — Find tokens owned by a public key
  • MongoDB storage — Auto-creates indices for efficient queries
  • Type-safe queries — BTMSQuery, BTMSRecord, BTMSLookupResult types

Common patterns

Register in OverlayExpress

typescript
import OverlayExpress from '@bsv/overlay-express'
import { BTMSTopicManager, BTMSLookupServiceFactory } from '@bsv/btms-backend'

const server = new OverlayExpress('mynode', privateKey, 'example.com')

server.configureTopicManager('tm_btms', new BTMSTopicManager())
await server.configureLookupServiceWithMongo('ls_btms', db => BTMSLookupServiceFactory(db))

await server.configureEngine()
await server.start()

Query tokens by owner

typescript
const ownerResults = await lookupService.lookup({
  service: 'ls_btms',
  query: { ownerKey: '025706528f0f6894b2ba505007267ccff1133e004452a1f6b72ac716f246216366' }
})

Retrieve metadata

typescript
const manager = new BTMSTopicManager()
const docs = await manager.getDocumentation()
const metadata = await manager.getMetaData()
// metadata = { name: 'btms', shortDescription: '...', version: '0.1.0', ... }

Key concepts

  • Token issuance — Outputs with assetId = "ISSUE" create new tokens; subsequent transfers reference via txid.outputIndex
  • Token protocol — PushDrop-encoded with fields [assetIdField, amount, metadata?]
  • Conservation law — Sum of input amounts per asset must be >= sum of output amounts (tokens can be burned)
  • Metadata persistence — Optional metadata remains consistent across all transfers if set during issuance
  • Validation modes — Issuance vs Transfer validation ensures protocol integrity

When to use this

  • Running a BTMS overlay node in production
  • Need token metadata and discovery services
  • Building a token registry or explorer
  • Implementing token-based applications with persistent storage
  • Synchronizing token state across nodes with GASP

When NOT to use this

  • For client-side token operations — use @bsv/sdk directly
  • If you don't need persistent storage — use @bsv/overlay-topics without lookup
  • For non-token overlays — use @bsv/overlay or @bsv/overlay-topics for other topics
  • New projects should prefer @bsv/overlay-topics BTMS implementation

Spec conformance

  • BTMS Protocol — Basic Token Management System (BSV token standard)
  • PushDrop encoding — Uses PushDrop format per @bsv/sdk
  • Token conservation — Enforces that output amounts <= input amounts per asset
  • Metadata persistence — Optional metadata tracked across all token transfers

Common pitfalls

  1. Asset ID semantics — "ISSUE" = new token; other values must match previous issuance txid.outputIndex
  2. Amount validation — Must be numeric string and >= 1; non-numeric or negative rejected
  3. Lookup factory is async — BTMSLookupServiceFactory() returns Promise; must await
  4. MongoDB required — No Knex fallback; requires MongoDB for lookup service
  5. Conservation law — Sum of input amounts per asset must >= sum of output amounts
  6. Field count — Accepts 2-4 PushDrop fields ([assetId, amount, metadata?, signature?])
  7. Deprecation — Core BTMS definitions now at @bsv/overlay-topics; prefer that for new projects

Related packages

  • @bsv/overlay-topics — Canonical BTMS implementation (preferred for new projects)
  • @bsv/overlay — Core Engine that uses this topic manager
  • @bsv/overlay-express — HTTP server wrapper
  • @bsv/gasp — Synchronize token state between nodes

Reference

  • API reference (TypeDoc)
  • Source on GitHub
  • npm