This release launches the Moderato testnet, replacing the original Andantino testnet (will be deprecated March 8th, 2025). Moderato closely mirrors the mainnet release candidate with improved infrastructure and reliability. v1.0.0-rc.1 comes with major improvements on node operator UX, focuses on stabilization and bug fixes.
Migration Required
If you were using the Tempo testnet before January 8th, 2025, see the Network Upgrades documentation for migration steps. Update RPC URL to https://rpc.moderato.tempo.xyz and Chain ID to 42431. See our docs for more detailed information.
Node operators: Please note the --follow flag currently defaults to the old Andantino RPC. Pass the Moderato URL explicitly until the next release:
--follow wss://rpc.moderato.tempo.xyzBreaking Changes
This release removes all previous hardfork logic and updates to the latest commonware version (PR #1928).
-
Consolidated DEX Events: OrderPlaced and FlipOrderPlaced events are now consolidated into a single OrderPlaced event with isFlipOrder and flipTick fields. For regular orders, isFlipOrder is false and flipTick is 0.
-
Consistent Naming: Stablecoin Exchange → Stablecoin DEX: All references to "stablecoin exchange" have been renamed to "stablecoin DEX" for consistency.
-
TIP20 Deployment Scheme: Token addresses now include the deployer in the address calculation, preventing front-running attacks on token deployments (PR #1819).
-
TIPFeeManager API: Removed get_fee_token_balance() to prevent misleading balance queries. Use balanceOf on the TIP20 token directly (PR #1874).
Features
This release brings major improvements for node operators and network security. Nodes can now near-instantly start syncing from the network tip (fast sync), dramatically reducing time-to-sync for new or recovering validators. Additionally, the network can now refresh its cryptographic identity when validators change (re-DKG), eliminating historical key material and strengthening security.
-
Fast Sync: Validators will skip to the network tip without finalizing every block in between if they fell too many epochs behind. Security is maintained by verifying all network identities at epoch boundaries. This works without operator intervention (PR #1822).
-
Snapshot sync: Validators can now join a network from a snapshot. If a trusted snapshot is provided at startup, the node will read the latest available network identity instead of syncing from genesis (PR #1838).
-
Re-DKG: added a trigger to the validator-config precompile to generate a new network identity via the DKG mechanism. This invalidates historic threshold key shares and addresses the toxic waste problem (PR #1821, #1680).
-
Consensus RPC: Added consensus_ RPC namespace for querying finalization status and subscribing to consensus events (PR #1868).
-
TIP20 Pending Rewards: Added getPendingRewards view function to query claimable rewards without state change (PR #1632).
-
Stablecoin DEX: Increased minimum order amount for stablecoin DEX orders (PR #1802).
Bug Fixes
This release includes security hardening (DOS prevention, gas calculation fixes) and correctness improvements for contract deployments and DEX operations.
- PR #1888+ PR #1899: Drop transactions above gas budget to prevent DOS attacks
- PR #1792: Fixed contract address calculations for CREATE operations; addresses now correctly match receipt contractAddress
- PR #1851: Fixed unnecessary protocol nonce bumping on CREATE revert when using 2D nonces
- PR #1941: Fixed multicall gas calculation in revm handler that was over-refunding gas
- PR #1936: Fixed FeeAMM to handle zero amounts gracefully
- PR #1903: Updated DEX reference implementation to round up escrow amounts
- PR #1932: Fixed allocator initialization
Full Changelog
- chore: rename bench.nu to tempo.nu by @shekhirin in #1698
- feat(docs): add validator guide by @Zygimantass in #1559
- chore(llm): add amp tools for tempo.nu by @Zygimantass in #1704
- feat(docs): allegro moderato by @jenpaff in #1653
- Fix the Artemis Tempo link by @akegaviar in #1584
- feat: implement PostHog custom event tracking for docs by @juandolealt in #1687
- chore(deps): run cargo shear by @DaniPopes in #1691
- feat(xtask): move generate-signing-key to consensus subcmd by @Zygimantass in #1551
- Add
stableDocker tag for tag-triggered builds by @Zygimantass in #1737 - fix: propagate features correctly by @klkvr in #1731
- fix: clean-up 2d nonce pool tracker by @klkvr in #1738
- chore: add RUSTSEC-2025-0137 to deny.toml by @0xKitsune in #1745
- feat!(consensus): remove all pre-allegretto logic by @SuperFluffy in #1671
- Partition
cargo hack checkinto 2 CI matrix jobs by @Zygimantass in #1748 - docs: add dRPC in Developer tools by @joshitzko in #1747
- docs: add theta and path USD to fee token guide by @struong in #1754
- docs: Tempo Transaction guide in nav by @struong in #1756
- chore: bump commonware to 4a5fca0 by @SuperFluffy in #1678
- fix(stablecoin-exchange): use centralized price conversion functions by @fgimenez in #1763
- faucet fix by @malleshpai in #1771
- fix(docs): correct safe deployer repo by @Zygimantass in #1728
- fix: catch slot collisions when using
base_slotattrib by @0xrusowsky in #1777 - fix: support UP/UV validation sigs to always accept UV=1 by @0xrusowsky in #1652
- refactor!(consensus): standardize dkg with upstream commonware by @SuperFluffy in #1759
- chore!: bump commonware to v0.0.64 by @SuperFluffy in #1778
- feat!: remove hardfork logic by @0xrusowsky in #1707
- feat(tip20): add getPendingRewards view function to query claimable rewards without state change by @fgimenez in #1632
- fix(precompiles): reject zero public key in ValidatorConfig to prevent non-existent validators by @fgimenez in #1630
- feat(consensus): backfill missing execution layer blocks by @SuperFluffy in #1781
- perf(orderbook): optimize tick bitmap traversal using word-level bit manipulation by @fgimenez in #1622
- perf: remove redundant balance read in transfer by @legion2002 in #1793
- fix(stablecoin-exchange): use consistent rounding for bid order cancel refunds by @fgimenez in #1795
- fix(specs): update reference implementation of stablecoin DEX by @danrobinson in #1796
- fix(rpc): mitigate subblock tx DoS via early validator filtering and increased channel capacity by @fgimenez in #1628
- fix: add pause check to transfer_fee_pre_tx by @legion2002 in #1799
- fix: validator fee tracking by token by @legion2002 in #1798
- fix: update auth checks when claiming rewards by @0xKitsune in #1800
- Bump commonware to d16c7481c72cf6f19b77e1435f1e5dd8e32a1aac by @kamsz in #1804
- feat: increase min order amount for stable dex orders by @0xKitsune in #1802
- fix: add revert if policy doesn't exist by @legion2002 in #1801
- docs: remove outdated pending swaps claim from burn function by @yongkangc in #1810
- feat: add new MintWithValidatorToken event with field by @howydev in #1466
- fix(dex): have flip orders only draw from internal balances by @danrobinson in #1806
- fix(specs): function to cancel stale order by @danrobinson in #1794
- fix(executor): propagate fork choice update errors by @fgimenez in #1774
- docs(specs): change DEX pair storage layout to be order-sensitive by @danrobinson in #1791
- fix(specs): check 403 policy on both tokens in stablecoin DEX by @danrobinson in #1805
- chore: remove compact hack for mainnet by @legion2002 in #1814
- fix: std
get_validator_tokento return the default token when unset by @0xrusowsky in #1651 - fix: intrinsic gas checks in validator by @legion2002 in #1666
- fix: incorrect permit2 bytecode by @howydev in #1789
- chore(audit): misc comments from auditors by @0xrusowsky in #1662
- Add info on supported platforms by @jenpaff in #1837
- fix(dex): upcast to U256 before mulDiv in base_to_quote and quote_to_base by @fgimenez in #1835
- fix: prevent index overflow in
VecHandlerby @0xrusowsky in #1631 - fix: ensure mutable TIP20Token calls point to initialized addresses by @0xrusowsky in #1790
- docs(alloy): add tip20 example in crate docs by @onbjerg in #1830
- fix: monitor pool creation by listening events + use token WL by @fgimenez in #1820
- fix(dex): round up baseNeeded in exactOut for bids by @danrobinson in #1823
- use a larger runner for docs generation by @brendanjryan in #1840
- feat: add re-dkg trigger methods to validator precompile by @joshieDo in #1680
- feat!(consensus): fast sync by @SuperFluffy in #1822
- feat(consensus): start at the latest finalized height, not at genesis by @SuperFluffy in #1838
- fix: create address calculations + restrictions by @legion2002 in #1792
- chore: remove TODOs, FIXMEs by @SuperFluffy in #1843
- feat: add full dkg mechanism by @joshieDo in #1821
- add missing article to tempo txn docs by @brendanjryan in #1850
- fix(docs): bump viem to 2.43.5 by @struong in #1849
- feat(xtask): add genesis customization options by @Zygimantass in #1836
- fix: validate calls inside handler by @legion2002 in #1845
- fix(revm): don't re-bump nonce on CREATE revert with 2D nonces by @legion2002 in #1851
- fix(precompiles-macros): account for last field
SLOTSby @0xrusowsky in #1847 - feat!: change tip20 deployment scheme by @howydev in #1819
- fix: properly check if an account is cold when loading its info by @0xrusowsky in #1855
- feat(precompiles): impl
IndexandIndexMuttraits by @0xrusowsky in #1488 - perf(precompiles)!: use efficient packing strategy by @0xrusowsky in #1848
- fix: review fixes by @howydev in #1859
- chore(docs): add AGENTS.md by @struong in #1852
- feat(xtask): add get-dkg-outcome command by @kuyziss in #1858
- refactor(consensus): surface the executor actor by @SuperFluffy in #1861
- docs: remove deadlink from nav by @malleshpai in #1863
- fix: update
swap_exact_amount_outto use saturating sub by @0xKitsune in #1867 - fix: remove unnecessary checks on
TIPFeeManager.burn()by @0xKitsune in #1871 - fix: update min/max price in spec by @0xKitsune in #1869
- chore: bump msrv to 1.91 by @SuperFluffy in #1877
- docs: tempo.ts/wagmi -> wagmi/tempo by @tmm in #1873
- feat(specs): remove
FeeSwapevent to align with precompile impl by @0xKitsune in #1880 - chore(test): add
validator_can_fast_sync_after_full_dkgtest by @joshieDo in #1883 - ci: use Rust 1.91 in Docker by @shekhirin in #1885
- docs: restore guide template by @struong in #1887
- fix: emit event for tip20 default admin role initialization by @howydev in #1870
- fix!(precompiles): fix capitalization for pathusd name by @danrobinson in #1893
- fix(dex): fix stablecoin DEX to round up without adding 1, and revert compensatory fixes by @danrobinson in #1895
- fix(specs): update
isTIP20()inTempoUtilsto matchis_tip20in precompiles by @0xKitsune in #1881 - fix(precompiles): remove usd check to align precompile with spec by @0xKitsune in #1872
- docs(precompiles): remove stale comment in
set_validator_tokenby @0xKitsune in #1875 - chore!(consensus): reindex p2p channels by @SuperFluffy in #1902
- chore(consensus): use recommended p2p defaults by @SuperFluffy in #1901
- feat!(precompiles): remove
TIPFeeManager.get_fee_token_balance()by @0xKitsune in #1874 - fix(subblock): [build] drop txs above gas budget to prevent DOS by @0xrusowsky in #1888
- feat(alloy): add runnable examples by @onbjerg in #1832
- Add Moderato testnet support by @kamsz in #1876
- feat!(precompiles): add public getters to
ValidatorConfigprecompile to match spec impl by @0xKitsune in #1878 - chore(feeAMM): align spec with rust implementation, remove unused custom errors by @zerosnacks in #1904
- chore(precompiles): remove
sqrtfromFeeAMM.solspec, makesqrtprivate test helper, remove unusedSQRT_SCALEconstant by @zerosnacks in #1879 - chore(consensus): remove unused
--consensus.delete-sigining-shareby @SuperFluffy in #1905 - fix(subblock): [validation] drop txs above gas budget by @0xrusowsky in #1899
- chore: bump alloy-chains with tempo moderato by @mattsse in #1906
- feat: add
consensus_namespace to RPC by @joshieDo in #1868 - test(e2e): reactivate ignored subblocks test by @SuperFluffy in #1862
- chore(precompiles): match against
SolCallenum by @0xrusowsky in #1890 - fix(consensus/p2p): enable private ip connections by @Zygimantass in #1911
- test(specs): always check event emission order regardless of isTempo by @onbjerg in #1908
- feat: Add info note on fee atomicity by @gorried in #1897
- chore!(consensus): bump commonware to latest main by @SuperFluffy in #1882
- feat(consensus/p2p): allow switching to local defaults by @Zygimantass in #1915
- chore: ignore
lruandbincodeby @0xrusowsky in #1916 - feat!: consolidtate
OrderPlaced,FlipOrderPlacedevents by @0xKitsune in #1910 - chore!: rename stablecoin exchange to stablecoin dex by @0xKitsune in #1913
- chore(docs): bump vocs to 1.4.1 by @snario in #1921
- warns ci on unformatted docs by @brendanjryan in #1922
- fix(spec): update dex reference implementation with escrow rounding up by @danrobinson in #1903
- feat: add fuzz tests for fee amm + fee manager by @howydev in #1552
- test(consensus): update
consensustest coverage by @0xKitsune in #1894 - test(evm): expand test coverage for
evmcrate by @0xKitsune in #1892 - chore: fix genesis generation in Justfile and tempo.nu by @shekhirin in #1931
- fix(feeAMM): handle zero amounts gracefully by @zerosnacks in #1936
- chore: bump commonware to latest main by @SuperFluffy in #1928
New Contributors
- @akegaviar made their first contribution in #1584
- @juandolealt made their first contribution in #1687
- @kamsz made their first contribution in #1804
- @brendanjryan made their first contribution in #1840
Full Changelog: v0.8.1...v1.0.0-rc1