Releases: subsquid/pipes-sdk
Release list
@subsquid/pipes v1.0.0-beta.2
PubSub changelog target
This release adds a Google PubSub target that turns a pipe into a durable, sequenced changelog feed for downstream consumers, makes finalized-only targets pin the finalized stream so they can never hold back an uncommitted tail, and fixes fork detection when the portal answers 409 without a fork context.
Highlights
- New target: Google PubSub (
@subsquid/pipes/targets/pubsub) —pubsubTargetpublishes the decoded stream to PubSub topics as a sequenced changelog. Delivery is durable: a SQLite-backed outbox survives crashes and resumes without gaps or duplicates, and chain reorgs are compensated with rollback messages instead of silent rewrites. Topic routing, delivery profiles, optional topic validation, andwindowTopicfor windowed views are included; target errors carry the newE24xxband. See the example.
Core
- Finalized-only targets now pin the finalized stream. Parquet and the memory target declare
requiresFinalizedStream, and the source reads/finalized-streamregardless of portal options (warning when it overrides them). The finalization buffer is gone — every delivered block is final, so a bounded range ending above the finalized head can no longer leave an uncommitted tail behind a successfully resolvedpipeTo(), and the Parquet cursor no longer lags when finality advances inside one response.
Portal client
- A 409 without
previousBlocksis no longer misread as a fork. The portal may answer 409 with the error envelope alone; the client used to crash inside the fork handler and bury the original response. The 409 now reaches the caller intact.
Full Changelog: pipes-v1.0.0-beta.1...pipes-v1.0.0-beta.2
@subsquid/pipes-cli v1.0.0-beta.2
What's Changed
- fix(cli): keep the pipe id stable across regenerates by @abernatskiy in #141
Full Changelog: pipes-cli-v1.0.0-beta.1...pipes-cli-v1.0.0-beta.2
@subsquid/pipes v1.0.0-beta.1
TRON: tolerate the full int64 range on transaction fields
Synchronizes the TRON portal client validation (portal-client/query/tron.ts) with the Rust query API and the java-tron wire types. Two decoders were stricter than what the portal actually serves, so valid blocks halted the stream mid-batch:
| Fields | Codec (Rust) | Proto type | Before | After |
|---|---|---|---|---|
tx expiration, tx timestamp, block timestamp |
TimestampMillisecond (JSON number) |
int64 |
NAT (safe-int only) |
TIMESTAMP_MS (any integer number) |
fee, withdrawAmount, unfreezeAmount, withdrawExpireAmount, energyFee, energyUsage, energyUsageTotal, netUsage, netFee, originEnergyUsage, energyPenaltyTotal |
BigNum (decimal string) |
int64 |
BIG_NAT (unsigned) |
BIG_INT (signed) |
feeLimit was already signed (#137); this generalizes that fix to every int64 amount field, since they share the same BigNum codec and can all be negative. No public types change: timestamp fields stay number, amount fields stay bigint.
Full Changelog: pipes-v1.0.0-alpha.21...pipes-v1.0.0-beta.1
@subsquid/pipes-ui v1.0.0-beta.1
@subsquid/pipes-cli v1.0.0-beta.1
@subsquid/pipes v1.0.0-alpha.21
@subsquid/pipes-ui v1.0.0-alpha.8
Fleet overview and a command palette
The dashboard now opens on a fleet-wide view — every configured server at a glance — and a cmd/ctrl+K palette lets you jump anywhere without reaching for the mouse.
Dashboard
- Fleet overview is the landing view — per-pipe cards with live stats polled across all configured servers, so you see the whole fleet before drilling into a single pipe.
- Atomic multi-param navigation — server, pipe, and tab selection move together in one URL update, with hardened numeric param parsing so deep links and refreshes land exactly where you expect.
Command palette
- cmd/ctrl+K opens a command palette built on dialog/command primitives with a tested command registry. Pipes rank first, and per-pipe shortcuts jump straight to that pipe's Profiler, Data samples, or Query tab.
Full Changelog: 6279b63...pipes-ui-v1.0.0-alpha.8
Resume no longer takes a false fork on multi-range queries
Resume no longer takes a false fork on multi-range queries
Core
- Resuming a query with disjoint ranges no longer forks spuriously — the recovered cursor's hash was sent as the parent-linkage anchor for every configured range. For a later, disjoint range the cursor is not the predecessor of that range's first block, so the portal answered a linkage mismatch and the run took a false fork. The anchor is now carried only on the range that continues directly from the cursor; later ranges start unanchored and re-establish the anchor from their own first block.
- A cyclic or deeply nested payload no longer crash-loops the pipe — the metrics preview packer recursed with no depth or cycle guard and overflowed the stack. It now truncates beyond depth 8.
Chains (EVM)
- Pre-London and pre-Cancun blocks decode again —
baseFeePerGas,blobGasUsedandexcessBlobGasare absent on older blocks and on some chains, but the header codec required them and rejected otherwise valid headers. All three are optional now, and tolerate an explicitlynullvalue. - Per-transaction
blobGasUsedandblobGasPrice(EIP-4844) can be selected and decoded — the portal served them, the transaction shape omitted them.
Targets
- The Parquet target reports profiler spans — the user
onDatahandler, the finalized-row flush, and each checkpoint's publish and cursor write now appear in the flame chart, the/profilerendpoint and OTEL, as they already did for the ClickHouse, BigQuery and Postgres targets.
Full Changelog: pipes-v1.0.0-alpha.19...pipes-v1.0.0-alpha.20
@subsquid/pipes v1.0.0-alpha.19
Prerelease. Install with npm i @subsquid/pipes@alpha.
EVM
- Portal trace results accept null
gasUsedon failed/reverted CREATE and CALL frames. Such a frame carries a result envelope with no gas attributed to it, sogasUsedlegitimately comes through null — the same family as the reverted-CREATE nulladdressrelaxed in alpha.18. The strict validator previously rejected these real mainnet traces;TraceCreateResult.gasUsed/TraceCallResult.gasUsedare now nullable. Block- and transaction-levelgasUsedare unchanged (always present).
ClickHouse
- A missing class-A repair hook is now surfaced as an error instead of letting the target diverge silently.
What to test
Any EVM traces pipeline that touches reverted/failed CREATE or CALL frames (previously a validation throw on null gasUsed).
@subsquid/pipes v1.0.0-alpha.18
Prerelease. Install with npm i @subsquid/pipes@alpha.
Parquet target
- Pluggable segment-writer engine (#124).
settings.engineonparquetTargetnow accepts anyParquetEngineimplementation; the SDK shipsparquetjsEngineas the built-in, zero-config default. The target owns staging, coverage-window naming, output verification, publication and crash recovery; an engine owns only the rows→Parquet-file step, so alternative encoders (e.g. a DuckDB-backed engine) can plug in without touching durability or recovery. - Encoding options moved to the engine factory.
settings.rowGroupSizeandsettings.compressionare removed — pass them to the engine instead:parquetjsEngine({ rowGroupSize, compression }). Zero-config behaviour is unchanged (same 100k / SNAPPY defaults). - Files are named for the block window they cover (#123),
<from>-<to>.parquet, not for the min/max block of the rows inside them. A range absent from a table's filenames now means "not indexed" rather than "indexed, no data". Locate a block's rows via the row-group footer statistics, not the filename. This changes on-disk layout; existing datasets are read back correctly, but contiguity begins from the upgrade point.
EVM
- Portal trace shapes accept nulls that occur on-chain: a reverted
CREATEwhoseresult.addressis null, andsuicidetraces carrying a nulladdress/balance. Previously these made trace validation throw.
Solana
- A decoder now covers exactly one program/ABI, making multi-program decode wiring explicit.
Decoding (EVM + Solana)
- Unified decode-error hook policy across EVM and Solana, so both surface decode failures through the same mechanism.
Breaking changes
parquetTarget:settings.rowGroupSize/settings.compressionremoved — use the engine factory. The exportedParquetStoreconstructor now takes anengine.- Parquet on-disk file naming changed to coverage windows (see above).
What to test
Parquet backfills end to end — file naming, rollover, and crash-recovery — plus any EVM traces pipeline that touches reverted CREATE / self-destruct traces.