🎵 Crescendo (Mainnet25)
Crescendo is the most significant upgrade to the Flow network since genesis that both supercharges Cadence and brings Flow closer to the rest of the web3 ecosystem. Crescendo includes the following major changes:
Full EVM Equivalence
This upgrade makes Flow fully EVM equivalent. Full EVM equivalence means any smart contract, protocol, or tooling that works on Ethereum Mainnet will work out of the box on Flow, without requiring any additional configuration - similar to an EVM L2. With Flow, developers can unlock massive value atop their existing solidity contracts by using Cadence to access Flow-native features and benefit from a game-changing user experience with improved performance. This includes creating gasless experiences in apps through sponsored transactions for mainstream onboarding, accessing protocol-level verified random functions for games, and making multicall transactions requiring a single approval for complex DeFi strategies. More on this here.
Upgrade to Cadence 1.0
Cadence 1.0 represents the most significant upgrade to the language yet, introducing numerous UX, security and functional enhancements that bring Cadence to a new level of maturity. Attachments which allow developers to permisisonlessly extend another author’s contracts will also be shipped with the upgrade, allowing for exciting opportunities to turn products into platforms with use cases from moddable games to nestled NFTs with intelligent interactions. More on this here.
Improving data availability
Flow's long-term vision for data availability is to enable clients and developers to reliably and trustlessly query and replicate the specific portions of the global state that are relevant to them. This upgrade marks a significant first step toward realizing that vision by making all chain data accessible on edge nodes, also known as access nodes. This enhancement allows self-hosted and managed services to provide unrestricted, non-rate-limited access to chain data, including script execution.
Enhancing Network Security with Dynamic Protocol State
This network upgrade introduces the 'Dynamic Protocol State,' a foundational framework for enabling all node types to operate permissionlessly. In the short term, Dynamic Protocol State allows for the immediate ejection of misbehaving nodes within an epoch. Additionally, it lays the groundwork for implementing automatic countermeasures, such as algorithmically slashing misbehaving nodes or entirely revoking their authorization to participate. You can learn more about this feature here.
Improving network scalability with Atree inlining
One of Flow's goals is to support more than a Petabyte on-chain state storage. This upgrade includes a major step towards that goal by vastly improving the memory usage of execution nodes, reducing the current usage by 50% and making future growth far more efficient by revamping how state data is stored in memory on the Execution node using the new Atree register inlining. More on this here.
Faster time to finality for transactions
Over the past year, the Flow Foundation and Flow's community at large have made significant enhancements to the node software, improving performance across most key metrics. Some highlights include:
- Networking layer improvements
- Update to Jolteon consensus algorithm
- Update to the consensus follower.
- A recent major improvement was to streamline Flow’s cryptography stack and switch the low-level library from ‘relic’ to BLST (see change).
Collectively, these changes have significantly reduced block time — the time required for consensus nodes to decide on the next block. As part of the Crescendo upgrade, optimized timing dynamics will improve Flow's central consensus, reducing Time to Finality by 18% and notably enhancing the responsiveness of applications built on Flow. Additionally, the impact of offline nodes and the risk of timing attacks will be reduced by half.
Building blocks for further improving network availability
Flow has made substantial progress in enhancing network availability by reducing the frequency of planned network upgrades that require downtime from four or more per year in the past to just one this year. The amount of unplanned downtime (incidents) has also decreased significantly, with only one incident year-to-date [YTD] in 2024. Flow's current YTD uptime is well above 99.9%.
As part of this ongoing effort, the Crescendo upgrade will introduce key building blocks that enable the network to recover from a failed epoch transition without requiring a coordinated manual override by all node operators, which previously led to downtime. If the automatic setup of a new epoch fails, the network will enter a dedicated state called Epoch Fallback Mode [EFM], where transactions continue to be processed normally, but further epoch progression (ability for staked nodes to join and leave the network) is suspended. Normal operations can be fully restored with a simple governance transaction. More details can be found here.
Breaking changes
While there are no breaking changes as far as the node software and the access API are concerned, the upgrade to Cadence 1.0 introduces a breaking change for ALL contracts currently deployed on testnet and mainnet. Developers must ensure they are ready for Crescendo ahead of time and can find full details on how to stage, upgrade, and verify contracts on the Flow Migration Hub.
Commit list
Cadence 1.0 (update and migration)
- Add cadence values migration by @SupunS in #5192
- Update to Stable Cadence preview 2 by @dsainati1 in #5246
- Update event validation logic to account for the
evm.*
events by @m-Peter in #5262 - Cadence 1.0 state migrations: Update to new static types migration by @turbolent in #5286
- Add staged contract migration by @SupunS in #5300
- Type check staged contract during migration by @SupunS in #5333
- Support emulator in migrations by @SupunS in #5345
- Improve Cadence 1.0 migration by @turbolent in #5353
- Optimize migration by adding ability to read or extract payloads from state by @fxamacker in #5386
- Improve Cadence 1.0 migration by @turbolent in #5388
- Unify system-contracts migration and staged-contracts migration by @SupunS in #5405
- Read staged contracts from CSV file by @SupunS in #5425
- Add value migration test for untyped capabilities by @SupunS in #5434
- Add version, partial state indicator, and checksum to payload file (intermediate migration file) by @fxamacker in #5438
- Add sub-command to generate addresses for a chain by @turbolent in #5453
- Optimize deployment migration by @turbolent in #5470
- Export migrator runtime constructor by @SupunS in #5475
- Update to SDK v1.0.0-M7 by @turbolent in #5478
- Improve Migration by @turbolent in #5479
- Fix data race in account grouping for account based migration by @fxamacker in #5488
- Sync with master by @turbolent in #5493
- Add migration diff util for testing and debugging migrations by @fxamacker in #5499
- Improve migrations by @turbolent in #5533
- Add missing rule for NonFungibleToken.Collection type by @turbolent in #5541
- Fix import resolving during staged contract updates by @SupunS in #5551
- Improve cadence migrations by @SupunS in #5564
- Make contract update validation thread safe by @SupunS in #5565
- Revert "Optimise merge registers for migrations" by @turbolent in #5594
- Improve error printing in contract validator by @SupunS in #5596
- Fix data races in tests by @turbolent in #5599
- Fix storage map key conversion in atree migration by @fxamacker in #5605
- Add util command to extract payload by address by @fxamacker in #5608
- Fix and improve state migration by @turbolent in #5618
- Fix storage health check in Cadence 1.0 migration by @fxamacker in #5622
- Simplify migration runtime, no need for interface and environment by @turbolent in #5651
- Improve naming for migrator runtime by @turbolent in #5652
- Collect staged contracts from the storage itself by @SupunS in #5659
- Log the checkpoint file when generating protocol snapshot by @zhangchiqing in #5679
- Add migration to fix refs to non-existent registers by @fxamacker in #5755
- Use existing storage health check by @turbolent in #5756
- Test the migration of &NonFungibleToken.Provider by @turbolent in #5807
- Improve scheduling in account-based migration by @turbolent in #5901
- Update to Cadence v1.0.0-preview.30 by @turbolent in #5987
- Report storage traversing errors during metrics collection by @SupunS in #5997
- Fix migration of storage path capabilities by @turbolent in #6306
- Report and skip storage caps with no borrow type by @SupunS in #6312
- Merge and commit changes after issuing cap cons by @turbolent in #6315
- Improve storage capability migration by @SupunS in #6322
- Update to Cadence v1.0.0-preview.47 by @turbolent in #6326
- Report the stored path of the untyped-capability by @SupunS in #6328
- Export type requirement extraction by @turbolent in #6395
- Update to Cadence v1.0.0-preview.52 by @turbolent in #6427
- Move and export some migration funcs to util package for reuse by @fxamacker in #6363
- Add check-storage command to util program to check storage health of execution state by @fxamacker in #6364
- Allow using interface-converted type-requirement in fields by @SupunS in #6341
- Add test for storage capability migration determinism by @SupunS in #6375
- Skip EVM storage account in
check-storage
command by @fxamacker in #6399
Atree inlining (implementation and migration)
- Atree storage migration by @janezpodhostnik in #4633
- Remove cricket moments references from atree migration by @janezpodhostnik in #5242
- Atree Migration cleanup by @janezpodhostnik in #5284
- Atree Inlining & Deduplication with Cadence v1.0 by @fxamacker in #5554
- Optionally check atree storage health before migration by @turbolent in #5591
Dynamic Protocol State
- Split
flow.Identity
inflow.IdentitySkeleton
andflow.DynamicIdentity
by @durkmurder in #4545 - Protocol state storage by @durkmurder in #4559
- Sync master to
feature/dynamic-protocol-state
by @durkmurder in #4578 - Read-only interfaces of protocol state by @durkmurder in #4579
- Protocol State Updater by @durkmurder in #4594
- Protocol State Mutator by @durkmurder in #4597
- Protocol state used in
FollowerState
andParticipantState
by @durkmurder in #4613 badger.Snapshot
uses dynamic protocol state by @durkmurder in #4625- Sync
master
to feature branch by @durkmurder in #4694 ProtocolStateEntry
refactoring by @durkmurder in #4721- Sync
master
tofeature/dynamic-protocol-state
by @durkmurder in #4814 - Block payload contains protocol state ID by @durkmurder in #4868
- Sync
master
tofeature/dynamic-protocol-state
by @durkmurder in #5007 - TODOs and refactoring, part 2 by @durkmurder in #5080
- Refactor Epoch Commitment Deadline Enforcement by @jordanschalm in #5108
InstanceParams
refactoring by @durkmurder in #5113- Sync master to
feature/dynamic-protocol-state
by @durkmurder in #5117 - Refactor bootstrapping and update Benchnet2 automations by @jordanschalm in #5136
- Sync
master
tofeature/dynamic-protocol-state
by @durkmurder in #5190 - Storage layer for KV store by @durkmurder in #5383
ProtocolStateVersionUpgrade
Service Event by @jordanschalm in #5428- Integration test for version upgrade by @jordanschalm in #5477
- KV store state machine by @durkmurder in #5513
- Refactoring to support orthogonal state machine operating on sub-states by @durkmurder in #5616
- hierarchical state machines follow up by @AlexHentschel in #5644
- Querying of KV Store using
Snapshot
API by @durkmurder in #5650 - Support changing protocol state ID in sealing segment by @jordanschalm in #5656
- Reducing duplicated data in the
Snapshot
data structure (removeEncodableEpoch
) by @jordanschalm in #5682
Data Availability
- Add execution state sync to public network by @UlyanaAndrukhiv in #5253
- Add support for indexing execution data on Observers by @AndriiDiachuk in #5256
- Add config to limit script execution range - master by @peterargue in #5283
- Add implementation for usage of the local transaction result in Access API by @Guitarheroua in #5306
- Implement gRPC streaming endpoint SubscribeBlocks by @UlyanaAndrukhiv in #5307
- SendAndSubscribeTransactionStatuses endpoint implementation for Access Streaming API by @Guitarheroua in #5310
- Fix event index bounds checking in Access APIs by @peterargue in #5321
- Refactor access connection cache by @peterargue in #5334
- Add standard Access API implementations on Observer by @AndriiDiachuk in #5358
- Add state streaming API to observers by @UlyanaAndrukhiv in #5368
- Fixed public network execution data service component by @UlyanaAndrukhiv in #5375
- Implement gRPC streaming endpoint SubscribeAccountStatuses by @AndriiDiachuk in #5406
- Sort events returned from index in tx index order - backport by @peterargue in #5444
- Handle system transaction in local result mode by @peterargue in #5532
- Fix event conversion in local TxResults endpoint by @peterargue in #5582
- Unify Event streaming endpoint on the execution data gRPC API by @UlyanaAndrukhiv in #5602
- Extend observer Access API integration tests for local data by @AndriiDiachuk in #5612
- Clean up blockID argument from deriveTransactionStatus by @AndriiDiachuk in #5619
- Added transaction result in SendAndSubscribeTransactionStatuses response by @Guitarheroua in #5620
- Add integration tests covering the 3 streaming blocks endpoints by @UlyanaAndrukhiv in #5624
- Convert Ping engine to component by @peterargue in #5649
- Unify execution data streaming endpoint by @illia-malachyn in #5672
- Ingestion engine may fail to create block/result index mapping by @UlyanaAndrukhiv in #5714
- Update ingestion engine's LastFullBlockHeight to use ConsumerProgress by @UlyanaAndrukhiv in #5752
- Update ipfs libraries to the new boxo version by @peterargue in #5774
- Support fetching system tx result from cache by @illia-malachyn in #5802
- Add increment method for monotonous counter by @illia-malachyn in #5814
- rollback boxo to 0.17 by @peterargue in #5822
- Backport register and program cache to master by @peterargue in #5826
- Add options to disable DHT and bitswap reproviding by @peterargue in #5827
- Fixed initial block height value for execution data requester by @AndriiDiachuk in #5888
- Failover when script exceeds computation or memory limit - backport by @peterargue in #5893
- Access-Cohort3 integration tests are flaky by @AndriiDiachuk in #5953
- Reduce logging from version control by @peterargue in #6342
- Reduce logging on some access endpoints by @peterargue in #6340
- Update event parsing validator to support ResourceDestroyed events by @peterargue in #6356
Core Contracts
- Update core-contracts to latest cadence 1.0 version by @joshuahannan in #5064
- Update core contracts dependencies to not use custom destructors by @joshuahannan in #5135
- Updates Contract dependencies and reorganize deployments by @joshuahannan in #5340
- Use core-contracts templates that use Environment by @joshuahannan in #5401
- Update to Latest versions of core contracts by @joshuahannan in #5517
- Update Core Contracts by @janezpodhostnik in #5579
- Update core contract dependencies by @joshuahannan in #5617
- Updates Core Contracts dependencies by @joshuahannan in #5771
- Update core contracts by @joshuahannan in #5808
- Use tagged versions of core contract repos by @joshuahannan in #5867
- Updates core contract deps by @joshuahannan in #5947
- select option in rest api causes invalid results by @UlyanaAndrukhiv in #6300
Admin Server
- Add support for CPU profiles via admin server - master backport by @peterargue in #5545
- Creating protocol snapshot from checkpoint file by @zhangchiqing in #5604
Database
- Clean up database prefixes by @jordanschalm in #5134
FLIP 204: Add TargetDuration to Epoch models and API
- Smart-contract Defines target duration and end time for epochs by @jordanschalm in #5071
Collection
- Rate limiting transaction by payer by @zhangchiqing in #5218
EFM Recovery
- Extend tests for
EpochStateMachine
by @durkmurder in #5681 - Changing structure of participants in
EpochSetup
by @durkmurder in #4726 - Dynamic Protocol State injects
EpochExtension
s by @durkmurder in #5773 EpochStateContainer
stores epoch active identities by @durkmurder in #4834- Replace dynamic weight and ejection flag with 'epoch participation status' by @durkmurder in #5039
- Remove
EpochStatus
by @jordanschalm in #5089 - Sync master to feature branch by @durkmurder in #5881
- Transition to the committed epoch in EFM by @durkmurder in #5898
- Dedicated protocol state machine for epoch fallback by @durkmurder in #4931
- Added new service event
EpochRecover
by @durkmurder in #5943 - Sync
master
to feature branch by @durkmurder in #5944 - Fix
EpochRecover
processing in EFM by @durkmurder in #6313 - Rename
EpochCommitSafetyThreshold
->FinalizationSafetyThreshold
by @durkmurder in #6323
FVM
- UUID partition change by @bluesign in #4914
- Handle cadence ParentErrors by @peterargue in #5272
- Add normalised time per computation logs to transaction execution by @janezpodhostnik in #5385
- Add DefaultFVMOptions to verification builder by @janezpodhostnik in #5439
- Add system TX hash to test by @janezpodhostnik in #5466
- Meter computation in the account storage check by @janezpodhostnik in #5497
- Enable program recovery by @turbolent in #6336
- Update fee related constants by @janezpodhostnik in #6349
- Let the system transaction report metrics by @ramtinms in #6362
- Recover NFT contract by @turbolent in #6388
- Recover NFT Collections by @turbolent in #6394
Flow EVM
- Add EVM type ID by @sideninja in #5091
- Add feature flag for deploying
EVM
contract only with ABI functionality by @m-Peter in #5230 - extend EVM precompiles with cadence arch by @ramtinms in #5233
- update StateDB to store codes by code hash by @ramtinms in #5235
- use
big.Int
for any balance related fields by @ramtinms in #5236 - Fix order of fields in the event by @sideninja in #5237
- Include the block hash in
evm.BlockExecuted
event payload by @m-Peter in #5245 - smart contract deployment for COAs by @ramtinms in #5269
- balance type improvement by @ramtinms in #5271
- Selfdesctruct test by @sideninja in #5273
- Updating COA address allocation by @ramtinms in #5276
- reducing the scope of deposit to COAs only by @ramtinms in #5280
- populate PREVRANDAO with a random value from the FVM random generator by @ramtinms in #5281
- update stdlib balance to use UInt instead of UFix64 by @ramtinms in #5303
- keep the last 256 block hashes for EVM look up by @ramtinms in #5304
- COA ownership proofs - part 1 by @ramtinms in #5341
- COA ownership proof - part 2 by @ramtinms in #5342
- COA ownership proof - part 3 by @ramtinms in #5343
- update error handling by @ramtinms in #5357
- Direct call hash calculation by @sideninja in #5369
- improvements to COA proof verification by @ramtinms in #5379
- rename bridged accounts to COAs by @ramtinms in #5381
- Add tests to assert that Flow EVM events can be properly CCF encoded/decoded by @m-Peter in #5384
- add blockHash and txHash to tx executed events by @ramtinms in #5387
- Update EVM contract for Cadence 1.0 by @sisyphusSmiling in #5390
- Reporting results for evm.Run and evm.coa.Call by @ramtinms in #5397
- Fix block hash calculation by @sideninja in #5408
- Add more test assertions for EVM events by @m-Peter in #5416
- Updating chain IDs by @ramtinms in #5421
- Improving evm integration tests by @ramtinms in #5431
- Add test for tx with zero fee or dynamic fees by @ramtinms in #5432
- Fix the evm chainID bug for mainnet by @ramtinms in #5443
- fix tx hash bug for direct calls (deposit, withdraw) by @ramtinms in #5454
- fix empty tx hash bug for some transactions by @ramtinms in #5455
- return empty string when deployed address is empty by @ramtinms in #5456
- make EVM address' code/codeHash/nonce accessible by @ramtinms in #5460
- use transfer from/to a fixed native token bridge address for deposit/withdraw calls by @ramtinms in #5469
- make deposit available for all EVM addresses by @ramtinms in #5473
- Fix withdraw: set UUID of returned FlowToken.Vault by @turbolent in #5515
- improve handler by @ramtinms in #5516
- update EVM version to the one supporting configurable precompiles by @ramtinms in #5524
- add testnet chainID by @ramtinms in #5527
- Adding FLOW token bridge event by @ramtinms in #5538
- populate receipt root hash in blocks by @ramtinms in #5542
- prepare the StateDB and the Emulator to support batch run operations by @ramtinms in #5577
- Contract deploy change return value by @sideninja in #5606
- Batch run transactions by @sideninja in #5614
- Block timestamp by @sideninja in #5660
- Add bridging interface to EVM contract by @sisyphusSmiling in #5677
- Add bridging interface to EVM contract - stable cadence port by @janezpodhostnik in #5716
- Fix EVM load test by @turbolent in #5737
- Add get random source to Cadence Arch by @sideninja in #5742
- Dry-run function by @sideninja in #5749
- Optimize event data by @sideninja in #5779
- Remove special EVM type by @sideninja in #5791
- Skip nonce check on dry runs by @sideninja in #5816
- Add transaction index to result by @sideninja in #5818
- Add decoder for blocks without timestamp by @sideninja in #5848
- Fix decoding blocks with no total gas used by @sideninja in #5872
- Support decoding of all previous block types by @sideninja in #5875
- Return result on validation error by @sideninja in #5909
- EVMAddress de/serialization follow up by @sisyphusSmiling in #5932
- Event addresses hex-encoded by @sideninja in #5933
- Revertible random Cadence arch function by @sideninja in #5934
- EVM setup cleanup by @sideninja in #5978
- improve debug tracing by @ramtinms in #6299
- Populate all fields for the genesis block by @ramtinms in #6325
- patch evm debug tracer to collect results and reset internal state after each tx execution by @ramtinms in #6327
- Legacy migrations removed by @sideninja in #6369
- Split contract implementation into separate package by @turbolent in #6396
- Improve EVM addresses in tests by @turbolent in #6400
- skip debug trace uploading step if bucket name is empty by @ramtinms in #6335
- Expose logger to the EVM environment by @ramtinms in #6343
- Set prevrandao value on block level by @ramtinms in #6378
- Use a fixed coinbase address for Run and BatchRun and transfer gas fees afterward by @ramtinms in #6380
Execution
- Remove module.Local from ingestion engine by @zhangchiqing in #5243
- Move maxCollectionHeight to metrics by @zhangchiqing in #5244
- Ingestion Block Queue by @zhangchiqing in #5248
- Ingestion - add ingestion core by @zhangchiqing in #5288
- expose computation usage for scripts by @ramtinms in #5299
- Fix stop control by @zhangchiqing in #5327
- Add ingestion throttle by @zhangchiqing in #5337
- Shadow Execution node implementation by @zhangchiqing in #5411
- Disable execution data pruner by @zhangchiqing in #5463
- Remove duplicated observer collection indexer by @zhangchiqing in #5521
- New ingestion engine by @zhangchiqing in #5593
- Check local collection exists before fetching by @zhangchiqing in #5838
- Fix throttle by @zhangchiqing in #5863
- Add ingestion core tests by @zhangchiqing in #5871
- Fix request collection by @zhangchiqing in #5960
Observability and Logging
- Update Machine Account Status Reporting for FLIP 74 by @jordanschalm in #5568
- Log configuration loaded message at error level by @peterargue in #5785
Networking
- Apply GossipSub Spam Penalty to Misbehaving Peers Based on
Count
andErr
inInvCtrlMsgNotif
by @kc1116 in #4978 - GossipSub Replay Message Mitigation by @kc1116 in #5058
- Enhance RPC Inspection with Configurable Thresholds and Granular Metrics Collection by @yhassanzadeh13 in #5234
- Reverting 4978 by @yhassanzadeh13 in #5252
- Enhance Gossipsub Scoring Mechanism for Configurable RPC Inspection enable/disable via configs by @kc1116 in #5257
- Relaxes invalid message delivery penalty by @yhassanzadeh13 in #5265
- Fixes map-based backend concurrent adjust-with-init test by @yhassanzadeh13 in #5275
- Adds libp2p resource manager doc by @yhassanzadeh13 in #5308
- Khalil/1908 fix gossipsub integration test by @kc1116 in #5323
- Fix gossipsub integration test by @kc1116 in #5323
- Update bitswap to use new boxo repo by @peterargue in #5339
- improve subscription validator integration test by @kc1116 in #5355
- Adds GossipSub RPC inspection documentation by @yhassanzadeh13 in #5362
- Event-based test refactoring for GossipSub RPC inspection unit tests by @kc1116 in #5374
- Enhance Gossipsub Resilience: Configurable Threshold for Invalid Topic IDs in Control Messages by @kc1116 in #5391
- Simplifies RPC inspection misbehavior notification handling by @yhassanzadeh13 in #5398
- Upgrades libp2p to v0.32.2 by @yhassanzadeh13 in #5417
- Reject Gossipsub RPC from unstaked peers by @kc1116 in #5449
- Herostore message entity nonce by @kc1116 in #5452
- Fix Flakey Networking Tests and Improve CI by @kc1116 in #5495
- Use string concatenation in rpc tracer ID by @peterargue in #5641
Observer
- Add GRPC requester to fetch collections by @zhangchiqing in #5961
Testing
- Fix integration test by @janezpodhostnik in #5510
- Fix missing mock generation by @janezpodhostnik in #5928
Support for Previewnet
- Add preview net ID by @Kay-Zee in #5396
- Add osusergo flag and missing previewnet case by @turbolent in #5418
- Mark previewnet as transient by @janezpodhostnik in #5448
CI/CD
- Revert change to use semver build for without-netgo images by @peterargue in #5267
- Add timeout to codecov by @peterargue in #5770
- Add static port for observer bind address in integration tests by @peterargue in #5801
- Reduce log level in integration tests by @peterargue in #5824
- adding a new target in the Makefile to generate a binary for the access node by @vishalchangrani in #6359
Utils
- Find block ID by state commitment by @zhangchiqing in #5240
- Create snapshot map with multiple goroutines by @janezpodhostnik in #5646
- add util cmd to find mismatch result by @zhangchiqing in #5883
- Add a command to print all system addresses by @turbolent in #6339
Code clarity and extendability
- minor doc update for Chunk Data Pack by @AlexHentschel in #5378
- Rename
EpochCommitSafetyThreshold
->FinalizationSafetyThreshold
by @durkmurder in #6323
Misc
- cruisectl delay implementation bias (fix for deployment branch
v0.37
) by @AlexHentschel in #6379
New Contributors
- @sisyphusSmiling made their first contribution in #5390
- @bjartek made their first contribution in #5740
- @dependabot made their first contribution in #5859
Full Changelog: v0.33.37...v0.37.1