Skip to content

Releases: ACTA-Team/did-stellar

v0.1.0 — did:stellar SDK + HTTP resolver

Choose a tag to compare

@JosueBrenes JosueBrenes released this 26 May 22:35

Official implementation of the did:stellar v0.1 method
for the Stellar network.

What's live

Component URL Status
HTTP Resolver did.acta.build ✅ Live
npm SDK @acta-team/did-stellar ✅ Published
Testnet contract CB7ATU7SF5QUKJMSULJDJVWJZVDXC23HTZX6NFUDTSFPVT6MA575NNZJ ✅ Deployed

Try it now

Resolve a DID (no install needed):

curl https://did.acta.build/1.0/identifiers/did:stellar:testnet:znfxngsh46vkyqu6inrx4omphi

Install the SDK:

npm install @acta-team/did-stellar

Resolve from code (no HTTP service dependency):

import { resolveDidStellar } from '@acta-team/did-stellar';

const { didDocument } = await resolveDidStellar(
  'did:stellar:testnet:znfxngsh46vkyqu6inrx4omphi'
);

DIF Universal Resolver driver:

import { Resolver } from 'did-resolver';
import { getResolver } from '@acta-team/did-stellar/resolver';

const resolver = new Resolver({ ...getResolver() });
const result = await resolver.resolve('did:stellar:testnet:znfxngsh46vkyqu6inrx4omphi');

Packages

@acta-team/did-stellar — the SDK

npm

TypeScript SDK for did:stellar v0.1. Works in Node.js and browsers.
Trust-minimised: reads directly from Stellar RPC — no ACTA-hosted
service required.

  • Identifier primitivesgenerateDidId, parseDidStellar, buildDidStellar, isValidDidStellar
  • W3C DID Document builder — matches spec vectors A.1–A.3 byte-for-byte
  • Direct Stellar RPC resolverresolveDidStellar() via getLedgerEntries (free, no tx fee)
  • DIF did-resolver drivergetResolver() for multi-method apps
  • Prepare / submit XDR helpersprepareRegisterDidXdr, prepareUpdateDidXdr, prepareTransferControllerXdr, prepareDeactivateDidXdr, submitSignedXdr
  • Proof of Control — RFC 8785 JCS + Ed25519 signature verification (±5 min window, pluggable nonce dedup)
  • React hookuseDid() via @acta-team/did-stellar/hooks
  • Typed errorsDidError + DidErrorCode union (30+ codes covering every on-chain RegistryError)
  • Multikey codec — Ed25519 (z6Mk...) + X25519 (z6LS...)
  • Dual ESM/CJS + .d.ts — tree-shakeable, resolver-only consumers pull ~15 KB

did.acta.build — the HTTP resolver service

Standalone Express 5 server wrapping the SDK. Deployed at
did.acta.build. Trust-minimised: no
auth, no key custody
. Stateless. Designed for
DIF Universal Resolver listing.

Method Endpoint Purpose
GET /health Liveness probe
GET /openapi.json OpenAPI 3.1 spec
GET /1.0/identifiers/{did} DIF resolver — W3C DID Document
GET /v1/dids/stellar/{did} Raw DidRecord
POST /v1/dids/stellar Register DID
PATCH /v1/dids/stellar/{did} Update DID
POST /v1/dids/stellar/{did}/transfer Transfer controller
POST /v1/dids/stellar/{did}/deactivate Deactivate (irreversible)
POST /v1/dids/stellar/submit Submit signed XDR

Features: content negotiation (did+ld+json / did+json), resolver
cache (30s Redis or in-memory), per-IP rate limit with
X-RateLimit-* headers, X-Request-ID correlation, helmet +
CORS, graceful shutdown, multi-stage Dockerfile.


On-chain verification

The full lifecycle (generate → register → resolve → read) was validated
against testnet. Reference transaction:

9c3234a8a9c9b3cc9a24fa7751cd4a4cfda167763343fa5a9888388d4a57119c — ledger 2,661,630

The DID registered in that transaction
(did:stellar:testnet:znfxngsh46vkyqu6inrx4omphi) is permanently
resolvable via:

  • SDK: resolveDidStellar('did:stellar:testnet:znfxngsh46vkyqu6inrx4omphi')
  • HTTP: GET https://did.acta.build/1.0/identifiers/did:stellar:testnet:znfxngsh46vkyqu6inrx4omphi

Tested

  • 93 unit + integration tests (54 SDK + 39 API)
  • Spec vectors A.1, A.2, A.3 verified byte-for-byte
  • End-to-end smoke test against live testnet contract (reproducible via examples/smoke-testnet)
  • ESLint strict-type-checked, zero any, zero @ts-ignore

Links

Resource URL
npm @acta-team/did-stellar
HTTP resolver did.acta.build
Method spec did:stellar v0.1
Registry contract (testnet) CB7ATU7SF5...NNZJ
OpenAPI spec did.acta.build/openapi.json
Full changelog CHANGELOG.md