This Height Coordinated Upgrade (HCU) delivers EVM fee improvements, Cadence language updates, and important fixes to the networking layer.
⚡ Cheaper EVM Transactions When Multiple EVM Calls Occur in a Single Cadence Transaction
Batched EVM transactions will now be cheaper when multiple EVM calls occur within a single Cadence transaction.
EVM transactions are wrapped in a Cadence transaction. Previously, for every EVM call within a Cadence transaction, there was a read and write of the EVM block proposal to storage. With this change, the block proposal is read once at the start of the Cadence transaction, held in memory across all EVM calls, and written back to storage only once at the end.
The EVM block proposal is now cached in memory for the lifetime of a Cadence transaction, updated in-place for each EVM call, and persisted exactly once at transaction end. On transaction failure, any staged changes are discarded cleanly. The result is that the storage cost of managing the block proposal is amortized across all EVM calls in the transaction rather than paid per call.
The savings scale directly with N, the number of EVM operations in a single Cadence transaction. For example, if a Cadence transaction has 100 EVM calls which do a 1 FLOW transfer each there is 30% reduction in transaction cost.
| Cost | Transaction ID | |
|---|---|---|
| Before Upgrade | 0.03218 FLOW | 403e82ef... |
| After Upgrade | 0.02318 FLOW | c3e889d9... |
Who benefits:
- EVM Gateway users: the Flow EVM Gateway batches multiple incoming user EVM transactions into a single Cadence transaction using
EVM.batchRun. Every batched block of EVM transactions benefits automatically, with no changes required from users or applications. - DeFi and smart contract developers: any Cadence transaction that calls
coaRef.callorEVM.runmore than once per execution (loops, multi-step swaps, batch settlements) will see proportionally lower fees. - Single-EVM-call transactions: unaffected; there is no regression for the common case.
For more details: see issue 6958
Cadence v1.10.3
This upgrade includes Cadence v1.10.3, which improves safety and consistency across the language. Notable changes include updated behavior for filter and map on array references, stricter entitlement handling when upcasting to AnyStruct, and correct authorization intersection for nested references.
For the full list of changes, see the Cadence v1.10.3 release notes.
Network Updates
This release includes several important improvements to the networking layer, addressing reliability across protocol components. See the commit list below for details.
What's Changed
Cadence
- Update to Cadence v1.10.1 by @turbolent in #8516
- Update to Cadence v1.10.2 by @turbolent in #8544
- Update to Cadence v1.10.3 by @turbolent in #8560
Data Availability
- Export scheduled tx extended indexer types by @peterargue in #8506
- add v0.48.0 to AN compatibility map by @j1010001 in #8510
- Fix NFT transfer parsing for collections with duplicate UUIDs by @peterargue in #8514
- Remove panics from legacy handler by @zhangchiqing in #8519
- Improve max stream enforcement by @zhangchiqing in #8521
- Enforce global stream limit per WebSocket subscription by @peterargue in #8536
- Improve logging by @zhangchiqing in #8542
CI
- refactor TestFollowerHappyPath to use synctest by @peterargue in #8474
- Upgrade actions versions to replace deprecated Node.js 20 by @manny-yes in #8497
- Fix secure image build to require single approval for all node types by @j1010001 in #8522
EVM
- Cache EVM block proposal and defer storage writes to commit by @holyfuchs in #8491
- Use optimized byte slice conversion funcs in EVM by @fxamacker in #8508
- Cache EVM drycall results within transactions by @fxamacker in #8511
- Fix audit findings in EVM Cadence contract by @joshuahannan in #8518
- Fix event emission and ABI decoding in EVM Cadence contract by @joshuahannan in #8529
FVM
- Add token movements inspection by @janezpodhostnik in #8424
- Add test for keeping computation kinds constant by @janezpodhostnik in #8515
Networking
- Use role specific unicast limits by @zhangchiqing in #8523
- Add unicast stream pre-authorization by sender/receiver role by @zhangchiqing in #8524
- Enable unicast message rate limit by default by @zhangchiqing in #8525
- Override role based unicast stream authorization on public network by @zhangchiqing in #8526
- Handle ejected node in role based limit checks by @peterargue in #8528
- fix unicast authorizer for observer node by @zhangchiqing in #8552
- Backport 8557 by @zhangchiqing in #8558
Flow Core Contracts
- Update contract dependencies: flow-core-contracts v1.10.1, nft-storefront, flow-evm-bridge v0.2.1 by @joshuahannan in #8541
Util
- Improve remote debugging tooling by @turbolent in #8440
- Improve compare-debug-tx by @turbolent in #8512
Documentation
- Add context7.json by @peterargue in #8548
- docs: add TL;DR, FAQ, and GEO enhancements for discoverability by @Aliserag in #8549
New Contributors
Full Changelog: v0.48.0...v0.49.0