All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project follows Semantic Versioning.
This file rolls up changes across the public packages: @orbital-stellar/pulse-core,
@orbital-stellar/pulse-webhooks, @orbital-stellar/pulse-notify, and @orbital-stellar/abi-registry.
Per-package changelogs live in each package directory.
STABILITY.md- strict semver on the public API of all@orbital-stellar/*packages, wire/data contracts covered (webhook headers, HMAC scheme, retry semantics,NormalizedEventJSON shape, cursor format, registry schema format), a 6-month deprecation window, and a documented security exception. Closes the outstanding Wave 1.5 release-gate item.docs/migration/0.1-to-1.0.md- procedural before/after migration guide for the0.1.0→1.0.0bump (breakingabiRegistrydefault,decodedDatashape, Wave 8 registry configuration). Narrative release notes remain in this file’s[1.0.0]entry when cut; do not duplicate them into the guide.
- Roadmap refocused on the decoding standard. Maintainer sign-off for
scope removal per
ROADMAP.md's own contribution rules. The former Phase 2 (SDK Ecosystem) is replaced by Phase 2 - The Decoding Standard (SEP draft,orbital codegen, semantic layer, hosted registry).@orbital-stellar/anchor-sdkis pulled forward into a new Phase 3 - Anchor Events. The former Phase 3 (Trust & Agent Layer: x402, agent-sdk, intent compiler, shadow-fork) and Phase 4 (Protocol Permanence: identity layer, reactor library, 10+ SEPs) are frozen and moved to an explicit Frozen section inROADMAP.mdwith per-item rationale and an unfreeze procedure. No shipped code is removed - planned scope only. - Docs aligned with the refocused roadmap: README reframed around the decoding standard; open-source-policy and proposal forward-references updated; frozen-scope references removed from forward-looking docs.
-
@orbital-stellar/anchor-sdk0.1.0 does not validate SEP-10 challenges before signing them.Sep10Client.authenticate()passed the anchor's challenge XDR straight to the caller-suppliedsigncallback with no checks: no verification of the anchor's signature, no source-account orsequence == 0check, no<home_domain> authManage Data check, no time bounds. Thenetwork_passphrasein the response was parsed and then ignored, andSIGNING_KEY— the one value that can attribute a challenge to an anchor — was read fromstellar.tomland never used.A hostile or compromised anchor, or an on-path attacker against a plain-
httpWEB_AUTH_ENDPOINT, could return an ordinary transaction (a payment, or aset_optionsadding a signer) and have it blind-signed by the consumer's wallet, hardware device, or KMS.Fixed in 0.2.0.
Sep10Clientnow verifies every challenge withWebAuth.readChallengeTxbeforesignis invoked, rejects anetwork_passphrasethat disagrees with the configured network, and refuses a non-httpsendpoint at construction.This is a breaking change to a surface that was itself the vulnerability, taken under the security exception in
STABILITY.md. A GitHub Security Advisory is to be published perSECURITY.md.Migration.
Sep10Clientnow requires the anchor's identity. The smallest change is to build it from the anchor's ownstellar.toml:// before - no way to tell whose challenge you were signing const client = new Sep10Client(toml.WEB_AUTH_ENDPOINT); // after - SIGNING_KEY and NETWORK_PASSPHRASE come from the toml you already fetch const toml = await discoverAnchor("anchor.example"); const client = Sep10Client.fromToml(toml, "anchor.example");
Or pass them explicitly:
new Sep10Client(endpoint, { serverAccountId, networkPassphrase, homeDomain, webAuthDomain }). Anchors that publish noSIGNING_KEYare now refused rather than trusted.
First versioned release. The three packages cover the full Stellar classic
operation taxonomy and are stable for testnet development today. Soroban
event subscription, cursor persistence, and the v1.0 stability pledge ship
in Phase 1 (Q2–Q3 2026).
@orbital-stellar/pulse-core:EventEngine- Horizon SSE subscription with AWS Full-Jitter exponential backoff, automatic reconnection, and a per-addressWatcherpub/sub model built on Node'sEventEmitter.@orbital-stellar/pulse-core: full classic operation taxonomy normalized into a typedNormalizedEventdiscriminated union:- Payments:
payment.received,payment.sent,payment.self - Accounts:
account.created,account.merged,account.options_changed,account.bump_sequence - Trustlines:
trustline.added,trustline.updated,trustline.removed,trustline.authorized,trustline.deauthorized - DEX offers:
offer.created,offer.updated,offer.deleted - Claimable balances:
claimable.created,claimable.claimed - Liquidity pools:
lp.deposited,lp.withdrawn - Data entries:
data.set,data.cleared
- Payments:
@orbital-stellar/pulse-core: lifecycle notifications -engine.reconnecting,engine.reconnected,engine.rate_limited(with parsedRetry-After), andengine.stopped.@orbital-stellar/pulse-core:CoreConfig.horizonUrloverride for self-hosted Horizon nodes, regional mirrors, and futurenet.@orbital-stellar/pulse-core:EventEngine.unsubscribeAll()to drain watchers without closing the SSE stream.@orbital-stellar/pulse-core: optionalfilterpredicate onEventEngine.subscribe()for per-watcher event suppression.@orbital-stellar/pulse-webhooks:WebhookDeliverywith HMAC-SHA256 signing (x-orbital-signature,x-orbital-timestamp,x-orbital-attempt), exponential-backoff retry with jitter, per-attemptAbortControllertimeout, and a concurrent-retry cap.@orbital-stellar/pulse-webhooks:verifyWebhook(Nodecrypto, timing-safe comparison) andverifyWebhookEdge(Web Crypto) for Cloudflare Workers, Vercel Edge, Deno, and browsers.@orbital-stellar/pulse-notify:useStellarEvent<T>with generic type narrowing, positional and config-object call signatures, and stable dep-array keys for array event allowlists.@orbital-stellar/pulse-notify:useStellarPaymentanduseStellarActivityconvenience hooks.@orbital-stellar/pulse-core: testnet + mainnet network selectors vianetwork: "mainnet" | "testnet".
@orbital-stellar/pulse-core:EventEngine.start()now returns a boolean (trueon a fresh start,falseif the engine was already running). Pass{ strict: true }to throwEngineAlreadyStartedErrorinstead.@orbital-stellar/pulse-core:WatcherNotification.timestamprenamed toemittedAtto distinguish it from the on-chaincreated_attimestamp used in operation events.@orbital-stellar/pulse-core: self-payments wherefrom === tonow emit a singlepayment.selfevent instead of separatepayment.receivedandpayment.sentevents.
@orbital-stellar/pulse-webhooks: cap concurrent retries to prevent unbounded memory growth when consumer endpoints are unreachable.@orbital-stellar/pulse-core: align reconnect attempt numbers across logs andengine.reconnectingnotifications.@orbital-stellar/pulse-core: warn when listeners are added afterWatcher.stop().
@orbital-stellar/pulse-webhooks: timing-safe HMAC comparison viacrypto.timingSafeEqual(Node) and constant-time XOR (Web Crypto).@orbital-stellar/pulse-webhooks: SSRF hardening on delivery targets - private, loopback, and link-local IP ranges are blocked by default, with DNS rebinding defense.- Strict TypeScript across all packages (
noUncheckedIndexedAccess,strict, NodeNext module resolution). - CI matrix runs on Node 20 and Node 22 with CodeQL static analysis and Dependabot CVE tracking.
- Stellar developers can subscribe to every classic operation type with one typed API, deliver events to HTTPS endpoints with retry and signature verification baked in, and render live data in React without writing SSE plumbing.
- Edge-runtime verification unblocks webhook receivers on Cloudflare Workers and Vercel Edge - a deployment surface QuickNode and Moralis do not natively support for Stellar.
- The reference composition (
apps/web/app/api/events/[address]/route.ts) is now a single Next.js file rather than a separate Express server, so there is one runtime to deploy when self-hosting the SDKs end-to-end.
- Soroban contract events (
invoke_host_function) are not yet normalized- Phase 1.
- Webhook retries are in-process; restarting loses pending retries. Persistent retry queues ship in Phase 1 alongside cursor persistence.
- Packages are not yet published to npm. Until
v0.1.0is tagged and released, consume viapnpm installagainst the workspace.
Update (2026-07-06): all three limitations above have since been resolved - Soroban event subscription, durable retry queues, and cursor persistence shipped (see
ROADMAP.mdWave 1.1–1.3), and all four packages are now published to npm under the@orbital-stellarscope (published out-of-band; therelease.ymlnpm-publish step is now uncommented for future version bumps).