XMTPD v1.3.0 Release Summary
🚀 Highlights
🛡️ Stability & Reliability
- Fixed nonce management issues in Redis-based limiter, preventing slot stalling during cancel/consume flows.
- Improved transaction correctness:
- Proper handling of replacement-underpriced transactions
- Fixed inconsistent fee calculations and gas mispricing (notably on Arbitrum)
- Strengthened validation and safety:
- Enforced positive payer balances on publish
- Prevented duplicate submission of already-submitted payer reports
- Added overflow protection in currency conversions
⚡ Performance & Scalability
- Improved throughput via batching and caching:
- Batch inserts for envelopes and publish workers
- Cached payer IDs to reduce redundant DB writes
- Reduced overhead in critical paths:
- Removed unnecessary calculations from insert path
- Increased sync queue buffering for better batching alignment
- Faster conflict resolution in payer report processing
🔁 Migrator & Data Pipeline
- Simplified migrator logic and removed redundant checks
- Improved correctness:
- Migrator now consistently pays fees where required
- Better handling of edge cases through expanded test coverage
- Additional logging and observability for migrator operations
📡 API & Networking
- Added
SubscribeAllendpoint for full stream subscriptions - Improved stream handling metrics and gRPC performance tracking
- Enhanced separation of out-of-order vs gap errors for clearer debugging
📊 Observability
- Added APM support to XMTPD
- Higher precision performance metrics
- Improved logging across submitter and payer report flows
- Added chain watcher for payer report observability
🗄️ Storage & Pruning
- Improved pruning behavior:
- Partition-based pruning support
- Automatic cleanup of empty partitions
🧪 Testing & Tooling
- Introduced E2E test suite and CLI for XMTPD
- Eliminated flaky tests across CI
- Added additional benchmark tooling for database and batch operations
⬆️ Platform & Dependencies
- Updated gRPC and core dependencies
- Various dependency upgrades and lint improvements
- Minor documentation fixes and repository cleanup
Changelog
- 9add258 Fix Redis NonceManager limiter slot stalling during Cancel/Consume (#1897)
- 1325275 fix: cancel nonce on replacement-underpriced instead of consuming it (#1893)
- 6bfef23 Fix Zap logger NameKey/CallerKey misconfiguration (#1894)
- 3e94abd Fix silent error in Arbitrum chain detection causing gas mispricing (#1899)
- 0344600 Migrator: remove redundant check (#1850)
- 726754d docs: fix typo in README.md (#1847)
- a3793c0 docs: fix typo in README.md (#1848)
- 50a1a50 Bump the gomod-updates group with 3 updates (#1849)
- 5810d38 Add chain watcher for payer report observability (#1843)
- 2b6c82d fix(currency): detect int64 overflow in microdollar→picodollar conversion (#1845)
- 40a8afb test(migrator): add coverage for transformer edge cases, reader lower limits, and migration mode sync (#1838)
- 28ed8f0 Avoid rejecting already submitted payer reports (#1831)
- 9b6ea1d Bump google.golang.org/grpc from 1.79.1 to 1.79.3 (#1842)
- 0e8662a Bump google.golang.org/grpc from 1.77.0 to 1.79.3 in /tools (#1841)
- 1ffe252 Ignore Claude worktrees (#1844)
- 125d658 fix: remove peer IP from JWT validation logs, include node ID instead (#1837)
- 2b489ea add go sidecar build (#1622)
- 45a1cf7 Claim Protocol Fees CLI (#1833)
- 0fccd71 Submitter worker missing log (#1830)
- 326da30 Enforce positive payer balance on publish (#1800)
- d0397b3 Send proposals over the blockchain (#1828)
- a51e3d5 Fix getProtocolError (#1825)
- b5442cb Fix issue with inconsistent fee calculation (#1820)
- 00a2964 Pruner: Drop empty partitions (#1819)
- 05c88bb Fix TestSubscribeVariableEnvelopesPerOriginator (#1823)
- 3d47fc0 Add prepared plans option to bench database tests (#1815)
- 5af0188 chore: remove extra import package (#1822)
- 2c307fd Bump the gomod-updates group with 4 updates (#1821)
- 34646fe Suite of payer report e2e tests using new xmtpd E2E test framework (#1809)
- 2b8f289 Speed up payer report conflict resolution (#1810)
- e2f9d6e Automatically collapse generated code files (#1813)
- 07bf2be Upgrade golangci-lint (#1811)
- dde9411 Higher precision perf metrics (#1808)
- 02e8690 Prune by partitioned table (#1805)
- e6ce469 Add xmtpd-e2e test suite and cli (#1794)
- 6f3994e Update Protos (#1806)
- d086da3 Remove cursor support for
SubscribeAll(#1804) - bde9952 fix: eliminate flaky tests across CI suite (#1801)
- eba2372 devcontainer improvements (#1791)
- 84e89d7 Implement "SubscribeAll" endpoint (#1778)
- a465ba6 Remove unnecessary calculations from insert critical path (#1787)
- 04b61d8 Migrator has to pay (#1796)
- 81b9beb Bump the gomod-updates group with 9 updates (#1793)
- 174d4c0 Update Protos (#1792)
- acb33dc Fix issue with FindOrCreatePayer (#1774)
- 82219ba Batch publish worker inserts (#1767)
- f7df40e Batch envelope inserts in benchmarks (#1766)
- b582e76 fix: replace minor-locked semver constraint with MinCompatibleVersion floor (#1780)
- 9e9a344 Update Protos (#1729)
- b915aa9 Add APM support to XMTPD (#1589)
- 3323ecc Bump github.com/docker/cli from 28.3.3+incompatible to 29.2.0+incompatible in /tools (#1779)
- 63ab432 Fix grpc_server_handling_seconds in streams (#1775)
- ca8a75d Cache payer IDs in EnvelopeSink to skip redundant DB writes (#1770)
- c5bba82 Increase sync writeQueue buffer to match server batch size (#1769)
- 82d274d Add git skill for consistent branch and PR conventions (#1771)
- 779bd5a chore: fix some minor issues in the comments (#1773)
- 1def40f Separate out-of-order errors from gaps (#1776)