⚠️ Important Notes
- Contract Changes: Upgrading to
v0.4.0
requires pointing your nodes to new smart contracts. Refer to thexmtpd-infrastructure
repo for updated contract addresses. - Pruning Support: This release introduces database pruning. You can now configure data retention limits and automatically discard older messages.
🧩 Major Features
Multi-Chain Indexing
Indexing support has been expanded to multiple chains, including smart chain selection, deployment-aware block tracking, and support for parameterized chain registries.
Parameter Registry Integration
The RateRegistry and NodeRegistry contracts now integrate with a central Parameter Registry, simplifying on-chain configuration and unifying admin flows.
Pruning and Data Retention
Initial support for node-side data pruning. Operators can configure how much data to retain and initiate pruning cycles via the new CLI tooling.
Improved Indexer + Blockchain Metrics
Even deeper visibility into system behavior with new metrics for the indexer, blockchain backfill, congestion, and storage layer performance.
gRPC Improvements
- gRPC API responses are now sanitized, hiding internal error messages.
- New API:
GetNewestEnvelope
- New API:
GetReaderNode
for payers
CLI & Dev Enhancements
- Added
get rates
andprune
commands to the CLI - Docker Compose and DevContainer improvements for easier local development
- Stress test tooling now includes TPS tracking and concurrency limits
📊 Metrics Additions
- Payer gRPC client metrics
- Indexer stress test metrics (TPS, envelope rate)
- MLS method invocation statistics
- OpenMetrics negotiation format now supported
Stay tuned for the updated Grafana dashboards that incorporate these.
All PR's
- Reentrant add node to network by @fbac in #707
- Add from-0.3.0 upgrade tests by @mkysel in #710
- No more image baking (lets leave that to the bakeoff shows) by @mkysel in #711
- Bump github.com/prometheus/client_golang from 1.21.0 to 1.22.0 in the gomod-updates group by @dependabot in #714
- chore: fix some struct names in comment by @fivecut in #716
- Bump golang.org/x/net from 0.36.0 to 0.38.0 by @dependabot in #718
- chore: fix comment by @closeobserve in #713
- Bump golang.org/x/net from 0.36.0 to 0.38.0 in /tools by @dependabot in #717
- Bump the gomod-updates group with 2 updates by @dependabot in #724
- Generate metrics catalog by @mkysel in #719
- Sanitize gRPC API error responses to prevent exposure of internal error details in the logging interceptor by @mkysel in #728
- Add pkg merkle by @fbac in #712
- Fix docker down by @mkysel in #729
- fix err logging_test.go by @sky-coderay in #731
- Expose MLS method invocation statistics by @mkysel in #730
- docs(readme): add license and twitter badge by @Ocheretovich in #732
- CalculateBalanceNodesCount to handle int by @fbac in #733
- Add Prometheus metrics to Payer gRPC client operations and consolidate MLS validation service initialization by @mkysel in #735
- ci: bump actions/checkout to v4 by @dizer-ti in #737
- Add DevContainer setup by @neekolas in #723
- Even more indexer/blockchain metrics by @mkysel in #736
- Add poor's man identity updates stress test by @fbac in #738
- Handle concurrency limiter in stress test and dump analytics by @mkysel in #739
- Add TPS to stress test by @mkysel in #740
- Do not block forever on read-your-own-commits by @mkysel in #743
- Fix issue with identity update storer by @neekolas in #744
- Do not require 0x prefix for stress tests by @mkysel in #742
- Add GetNewestEnvelope API Endpoint by @neekolas in #741
- Add more test coverage for pkg/merkle by @fbac in #734
- Bump the gomod-updates group with 2 updates by @dependabot in #746
- Teach CLI the get rates command by @mkysel in #748
- Add dummy chain watcher by @fbac in #747
- Add expiry field to gateway envelopes by @mkysel in #752
- Clarify error to help with support by @mkysel in #757
- Manual protos build by @mkysel in #758
- Update docker-compose-register.yml to use latest xmtpd-cli version (sha-a96bf04) by @finnfisher-de in #766
- Add scaffolding for XMTPD DB prune / data retention by @mkysel in #772
- Add GetReaderNode payer API endpoint by @fbac in #771
- Remove nightly PAT by @fbac in #773
- Update Protos by @github-actions in #775
- Bump the gomod-updates group with 2 updates by @dependabot in #776
- Set payer expiration all the way through from client to XMTPD database by @mkysel in #769
- Initial prune implementation by @mkysel in #774
- Update Protos by @github-actions in #782
- Add multi-chain support by @fbac in #755
- Derive DB name from primary key in pruner by @mkysel in #778
- Test pruner and refactor newDB by @mkysel in #788
- Migrate test cleanup functions to use Go's built-in t.Cleanup mechanism across test utilities and test files by @mkysel in #789
- Add prune release to rel from tag by @mkysel in #791
- Fix junit-upload-github-action deprecation warning by @mkysel in #790
- Fix deployments by @fbac in #793
- Require MLS validation service by @fbac in #798
- feat: Matched Sequential Proof Implementation by @deluca-mike in #749
- Validate hex addresses by @fbac in #801
- refactor: replace context.WithCancel with t.Context in tests by @pengqiseven in #799
- Modular multi-chain indexer by @fbac in #800
- Enable openmetrics negotiation format by @mkysel in #809
- Rework compose up/down by @mkysel in #822
- Speed up generation by removing all cruft from builder by @mkysel in #821
- Use pre-baked image for all anvil-based tests by @mkysel in #823
- Propagate ctx cancellation to IndexLogs by @fbac in #811
- Fix problematic tests using risky pattern by @mkysel in #824
- Add header to metrics catalog by @mkysel in #825
- Remove paths from CI by @mkysel in #826
- Speed up CLI container construction in dev/up by @mkysel in #829
- Migrate RateRegistry and NodeRegistry contracts to 0.4.0 version with parameter registry integration and updated data types by @mkysel in #810
- Add parameter registry ABI and implement set maxcanonical by @mkysel in #830
- Migrate to V4 rates contract by @mkysel in #833
- Allow operator defined backfill block size by @mkysel in #834
- Update structure of docs by @jhaaaa in #806
- Do not require BIN for abigen by @mkysel in #853
- Use 040 contracts with ABI and new addresses by @mkysel in #854
- Update Protos by @github-actions in #856
- Add settlement chain and PayerRegistry indexing by @fbac in #847
- Start indexing at custom block height by @fbac in #827
- Load env config via JSON by @mkysel in #855
- Bump github.com/docker/docker from 28.1.1+incompatible to 28.2.2+incompatible in the gomod-updates group by @dependabot in #861
- Update Protos by @github-actions in #859
- Move to 0.4.3 contracts by @mkysel in #864
- Revamped reorg detection by @fbac in #858
- Refactor large options configs using the functional options pattern by @mkysel in #866
- Introduce XDBG integration tests by @mkysel in #865
- Use JSON-RPC wrappers only by @fbac in #871
- Honor start at deployment blocks by @fbac in #873
- Check wallet balance before attempting to execute CLI commands by @mkysel in #874
- Set proper log levels by @fbac in #875
- Nuke RpcURL by @fbac in #876
- Size backfill buffers according to expected messages by @fbac in #877
- Estimate gas before sending tx by @fbac in #878
- Bump the gomod-updates group with 4 updates by @dependabot in #879
- Minor migrator cleanup by @mkysel in #881
New Contributors
- @fivecut made their first contribution in #716
- @closeobserve made their first contribution in #713
- @sky-coderay made their first contribution in #731
- @dizer-ti made their first contribution in #737
- @finnfisher-de made their first contribution in #766
- @pengqiseven made their first contribution in #799
Full Changelog: v0.3.0...v0.4.0