### Breaking changes
- Modified how `mesh_addOrders` treats orders that are already stored on the Mesh node. Previously, they would be rejected with code `OrderAlreadyStored`. Now, if the order is stored and fillable, it will be accepted. If it is stored but unfillable, it will be rejected with `OrderAlreadyStoredAndUnfillable`. We additionally added a `isNew` property to the accepted orderInfos returned, so that callers can discern which orders Mesh already knew about. (#316)
### Features
- Added backup bootstrap nodes provided by the libp2p community
- Improved log formatting and reduced verbosity in a few cases (#314, #287)
- Reduced AdvertiseBootDelay for bootstrap nodes
- Implemented a check that will alerts you when switching to a different Ethereum network ID. (#301 -- special thanks to @hrharder)
- Made environment variable parsing more generous by automatically removing quotes if needed (#306)
- Improved tests by adding timeouts and closing resources where appropriate (#310, #309, #308)
- Increased robustness by removing panics and failing more gracefully (#312)
- RPC server is now started while block event backfilling is happening under the hood instead of waiting for it to complete (#318)
- Added a `mesh_getStats` endpoint which returns a host of useful information about the state of the Mesh node (e.g., number of fillable order stored, number of peers, peerID, etc...) (#322)
### Bug fixes
- Log messages are no longer incorrectly fired when receiving orders which have already been seen (#286)
- Fixed a bug where Mesh was still running after the database was closed (#300)
- Handled Parity "unknown block" error gracefully like we do Geth's (#285)
# TODO:
- [] Merge 2.0.0-beta PR to master
- [x] Publish to docker hub
- [x] Publish TS client to NPM
- [x] Write up and publish release notes
- [x] Update bootstrap nodes
- [x] Update our personal nodes
- [x] Alex
- [x] Announce new version on Discord/Slack