> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sei.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> Track the latest updates, improvements, and changes to Sei Chain. Stay informed about new features, bug fixes, and protocol upgrades.

export const Changelog = props => {
  const STATIC_CHANGELOG = [{
    version: 'v5.9.0',
    body: `sei-chain
* [#1867](https://github.com/sei-protocol/sei-chain/pull/1867) Add synthetic events in separate sei endpoints
* [#1861](https://github.com/sei-protocol/sei-chain/pull/1861) Revert showing wasm txs in EVM RPCs
* [#1857](https://github.com/sei-protocol/sei-chain/pull/1857) Fix events in 2-hop scenarios
* [#1856](https://github.com/sei-protocol/sei-chain/pull/1856) Add delegatecall flag to properly detect delegatecalls
* [#1850](https://github.com/sei-protocol/sei-chain/pull/1853) Fix websocket from_height
* [#1849](https://github.com/sei-protocol/sei-chain/pull/1849) Reduce block bloom storage
* [#1844](https://github.com/sei-protocol/sei-chain/pull/1844) Allowlist for token extensions

sei-iavl
* [#41](https://github.com/sei-protocol/sei-iavl/pull/41) Fix tree versions causing slow restart and OOM`
  }, {
    version: 'v5.8.0',
    body: `sei-chain
* [#1840](https://github.com/sei-protocol/sei-chain/pull/1840) Add migration for new params
* [#1837](https://github.com/sei-protocol/sei-chain/pull/1837) Move token id from Data to Topic in ERC721 Event
* [#1836](https://github.com/sei-protocol/sei-chain/pull/1836) Properly handle gas in pointer precompile
* [#1835](https://github.com/sei-protocol/sei-chain/pull/1835) Check TX nonce before registering hook to bump nonce for failed tx
* [#1832](https://github.com/sei-protocol/sei-chain/pull/1832) Show CW transactions that have synthetic EVM events in eth_getBlock response
* [#1831](https://github.com/sei-protocol/sei-chain/pull/1831) Fork event manager when creating EVM snapshots
* [#1830](https://github.com/sei-protocol/sei-chain/pull/1830) Add wasm contract query gas limit
* [#1826](https://github.com/sei-protocol/sei-chain/pull/1826) limit MsgExec max nested level
* [#1821](https://github.com/sei-protocol/sei-chain/pull/1821) Add antehandler for EVM to check gas exceed limit or not
* [#1818](https://github.com/sei-protocol/sei-chain/pull/1818) Prevent ddos against associate msgs
* [#1816](https://github.com/sei-protocol/sei-chain/pull/1816) Actually remove dex module
* [#1813](https://github.com/sei-protocol/sei-chain/pull/1813) Tune Configs
* [#1812](https://github.com/sei-protocol/sei-chain/pull/1812) Evidence Max Bytes Update
* [#1785](https://github.com/sei-protocol/sei-chain/pull/1785) Allow CW->ERC pointers to be called through wasmd precompile
* [#1778](https://github.com/sei-protocol/sei-chain/pull/1778) Bump nonce even if tx fails

sei-cosmos
* [#535](https://github.com/sei-protocol/sei-cosmos/pull/535) init app earliest version correctly after state sync
* [#534](https://github.com/sei-protocol/sei-cosmos/pull/534) Stop executing the handler when proposal is submitted
* [#533](https://github.com/sei-protocol/sei-cosmos/pull/533) Delete kvstore specified in store upgrades
* [#532](https://github.com/sei-protocol/sei-cosmos/pull/532) Add max gas limit check in ante handler
* [#528](https://github.com/sei-protocol/sei-cosmos/pull/528) Add logs for snapshot export and import

sei-wasmd
* [#63](https://github.com/sei-protocol/sei-wasmd/pull/63) Add CW dispatch call depth
* [#62](https://github.com/sei-protocol/sei-wasmd/pull/62) Patch Gas mispricing in CW VM

sei-tendermint
* [#242](https://github.com/sei-protocol/sei-tendermint/pull/242) Allow hyphen in event query`
  }, {
    version: 'v5.7.5',
    body: `sei-chain
* [#1795](https://github.com/sei-protocol/sei-chain/pull/1795) Do not charge gas for feecollector address query
* [#1782](https://github.com/sei-protocol/sei-chain/pull/1782) Update excessBlobGas and BlobBaseFee to fix simulate evmcontext

sei-cosmos
* [#530](https://github.com/sei-protocol/sei-cosmos/pull/530) Add EVMEntryViaWasmdPrecompile flag
* [#519](https://github.com/sei-protocol/sei-cosmos/pull/519) Genesis export stream
* [#529](https://github.com/sei-protocol/sei-cosmos/pull/529) Add DeliverTx callback
* [#528](https://github.com/sei-protocol/sei-cosmos/pull/528) Add logs for snapshot export and import

sei-wasmd
* [#58](https://github.com/sei-protocol/sei-wasmd/pull/58) Genesis Export OOM

sei-tendermint
* [#239](https://github.com/sei-protocol/sei-tendermint/pull/239) Use Marshal and UnmarshalJSON For HexBytes`
  }, {
    version: 'v5.7.1 & v5.7.2',
    body: `sei-chain
* [#1779](https://github.com/sei-protocol/sei-chain/pull/1779) Fix subscribe logs empty params crash
* [#1783](https://github.com/sei-protocol/sei-chain/pull/1783) Add meaningful message for eth_call balance override overflow
* [#1783](https://github.com/sei-protocol/sei-chain/pull/1784) Fix log index on synthetic receipt
* [#1775](https://github.com/sei-protocol/sei-chain/pull/1775) Disallow sending to direct cast addr after association

sei-wasmd
* [#60](https://github.com/sei-protocol/sei-wasmd/pull/60) Query penalty fixes

sei-tendermint
* [#237](https://github.com/sei-protocol/sei-tendermint/pull/237) Add metrics for total txs bytes in mempool`
  }, {
    version: 'v5.7.0',
    body: `sei-chain
* [#1731](https://github.com/sei-protocol/sei-chain/pull/1731) Remove 1-hop limit
* [#1663](https://github.com/sei-protocol/sei-chain/pull/1663) Retain pointer address on upgrade`
  }, {
    version: 'v5.6.0',
    body: `sei-chain
* [#1690](https://github.com/sei-protocol/sei-chain/pull/1690) Use transient store for EVM deferred info
* [#1742](https://github.com/sei-protocol/sei-chain/pull/1742) Add transient receipts with eventual flush to store
* [#1744](https://github.com/sei-protocol/sei-chain/pull/1744) Only emit cosmos events if no error in precompiles
* [#1737](https://github.com/sei-protocol/sei-chain/pull/1737) Only send unlocked tokens upon address association
* [#1740](https://github.com/sei-protocol/sei-chain/pull/1740) Update Random to Hash of Block Timestamp
* [#1734](https://github.com/sei-protocol/sei-chain/pull/1734) Add migration to unwind dex state
* [#1736](https://github.com/sei-protocol/sei-chain/pull/1736) Create account for sendNative receiver
* [#1738](https://github.com/sei-protocol/sei-chain/pull/1738) Reduce Default TTL configs
* [#1733](https://github.com/sei-protocol/sei-chain/pull/1733) Update getBlockReceipts to accept block hash
* [#1732](https://github.com/sei-protocol/sei-chain/pull/1732) Show empty trace on insufficient funds error
* [#1727](https://github.com/sei-protocol/sei-chain/pull/1727) Add association error metric
* [#1728](https://github.com/sei-protocol/sei-chain/pull/1728) Make occ caused evm panics less noisy
* [#1719](https://github.com/sei-protocol/sei-chain/pull/1719) Fixes local network in /scripts/run-node.py

sei-cosmos
* [#521](https://github.com/sei-protocol/sei-cosmos/pull/521) add DeliverTx hook
* [#520](https://github.com/sei-protocol/sei-cosmos/pull/520) Add callback for receipt storage
* [#517](https://github.com/sei-protocol/sei-cosmos/pull/517) Fix metric name for chain state size
* [#516](https://github.com/sei-protocol/sei-cosmos/pull/516) add EVM event manager to context

sei-wasmd
* [#54](https://github.com/sei-protocol/sei-wasmd/pull/54) Update wasm query behavior upon error

sei-tendermint
* [#238](https://github.com/sei-protocol/sei-tendermint/pull/238) Make RPC timeout configurable
* [#219](https://github.com/sei-protocol/sei-tendermint/pull/219) Add metrics for mempool change`
  }, {
    version: 'v5.5.5',
    body: `sei-chain
* [#1726](https://github.com/sei-protocol/sei-chain/pull/1726) Handle VM error code properly
* [#1713](https://github.com/sei-protocol/sei-chain/pull/1713) RPC Get Evm Hash
* [#1711](https://github.com/sei-protocol/sei-chain/pull/1711) Add gov proposal v2 for native pointer
* [#1694](https://github.com/sei-protocol/sei-chain/pull/1694) Add native associate tx type

sei-cosmos
* [#511](https://github.com/sei-protocol/sei-cosmos/pull/511) Add error for evm revert`
  }, {
    version: 'v5.5.2',
    body: `sei-chain
* [#1685](https://github.com/sei-protocol/sei-chain/pull/1685) Add EVM support to v5.5.2`
  }, {
    version: 'v5.4.0',
    body: `sei-chain
* [#1671](https://github.com/sei-protocol/sei-chain/pull/1671) Update and fixes to ERC721 contract
* [#1672](https://github.com/sei-protocol/sei-chain/pull/1672) Add sei_getCosmosTx endpoint
* [#1669](https://github.com/sei-protocol/sei-chain/pull/1669) Add ERC/CW 2981 in pointer
* [#1668](https://github.com/sei-protocol/sei-chain/pull/1673) Bring CW721 pointer contract up to spec
* [#1662](https://github.com/sei-protocol/sei-chain/pull/1662) Add memo support to ibc compiles
* [#1661](https://github.com/sei-protocol/sei-chain/pull/1661) Do not modify original value passed in executeBatch call

sei-cosmos
* [#505](https://github.com/sei-protocol/sei-cosmos/pull/505) Fix export genesis for historical height
* [#506](https://github.com/sei-protocol/sei-cosmos/pull/506) Allow reading pairs in changeset before flush

sei-wasmd
* [#50](https://github.com/sei-protocol/sei-wasmd/pull/50) Changes to fix runtime gas and add paramsKeeper to wasmKeeper for query gas multiplier`
  }, {
    version: 'v5.2.0',
    body: `sei-chain
* [#1621](https://github.com/sei-protocol/sei-chain/pull/1621) Add websocket metrics
* [#1619](https://github.com/sei-protocol/sei-chain/pull/1619) Limit number of subscriptions
* [#1618](https://github.com/sei-protocol/sei-chain/pull/1618) Fix contract deploy receipts
* [#1615](https://github.com/sei-protocol/sei-chain/pull/1615) Optimize websocket newHead by reusing tendermint subscription
* [#1609](https://github.com/sei-protocol/sei-chain/pull/1609) Add association logic to simulate endpoints
* [#1605](https://github.com/sei-protocol/sei-chain/pull/1605) Disallow sr25519 addresses for evm functions
* [#1606](https://github.com/sei-protocol/sei-chain/pull/1606) Skip evm antehandler on sr25519 signatures

sei-cosmos
* [#495](https://github.com/sei-protocol/sei-cosmos/pull/495) Fix seid keys list by ignoring evm-addr for sr25519
* [#493](https://github.com/sei-protocol/sei-cosmos/pull/493) Remove non-multiplier gas meter

sei-tendermint
* [#235](https://github.com/sei-protocol/sei-tendermint/pull/235) Check removed including wrapped tx state

sei-db
* [#63](https://github.com/sei-protocol/sei-db/pull/63) Fix edge case for iterating over tombstoned value`
  }, {
    version: 'v5.0.1',
    body: `sei-chain
* [#1577](https://github.com/sei-protocol/sei-chain/pull/1577) Re-enable Cancun`
  }, {
    version: 'v5.0.0',
    body: `sei-chain
* [Compare v3.9.0 → v5.0.0](https://github.com/sei-protocol/sei-chain/compare/v3.9.0...008ff68)

sei-cosmos
* [Compare v0.2.84 → v0.3.1](https://github.com/sei-protocol/sei-cosmos/compare/v0.2.83...v0.3.1)

sei-tendermint
* [Compare v0.2.40 → v0.3.0](https://github.com/sei-protocol/sei-tendermint/compare/v0.2.40...v0.3.0)`
  }, {
    version: 'v3.9.0',
    body: `sei-chain
* [#1565](https://github.com/sei-protocol/sei-chain/pull/1565) Cosmos Gas Multiplier Params
* [#1444](https://github.com/sei-protocol/sei-chain/pull/1444) Adding tokenfactory denom metadata endpoint

sei-cosmos
* [#489](https://github.com/sei-protocol/sei-cosmos/pull/489) Cosmos Gas Multiplier Params
* [#477](https://github.com/sei-protocol/sei-cosmos/pull/477) OCC if synchronous, reset non-pending

sei-tendermint
* [#211](https://github.com/sei-protocol/sei-tendermint/pull/211) Replay events during restart to avoid tx missing

sei-db
* [#62](https://github.com/sei-protocol/sei-db/pull/62) Set CreateIfMissing to false when copyExisting

sei-wasmd
* [#45](https://github.com/sei-protocol/sei-wasmd/pull/45) Update LimitSimulationGasDecorator with custom Gas Meter Setter
* [#44](https://github.com/sei-protocol/sei-wasmd/pull/44) Bump wasmvm to v1.5.2`
  }, {
    version: 'v3.8.0',
    body: `sei-tendermint
* [#209](https://github.com/sei-protocol/sei-tendermint/pull/209) Use write-lock in (*TxPriorityQueue).ReapMax funcs

sei-db
* [#61](https://github.com/sei-protocol/sei-db/pull/61) LoadVersion should open DB with read only

sei-wasmd
* [#41](https://github.com/sei-protocol/sei-wasmd/pull/42) Bump wasmd version`
  }, {
    version: 'v3.7.0',
    body: `sei-chain
* [#1283](https://github.com/sei-protocol/sei-chain/pull/1283) Update synchronous execution to set tx indices properly
* [#1325](https://github.com/sei-protocol/sei-chain/pull/1325) Oracle price feeder ignore error for vote already exist

sei-cosmos
* [#401](https://github.com/sei-protocol/sei-cosmos/pull/401) Ensure Panic Recovery in Prepare & Process Handlers
* [#404](https://github.com/sei-protocol/sei-cosmos/pull/404) No longer disable dynamic dep generation
* [#411](https://github.com/sei-protocol/sei-cosmos/pull/411) Fix concurrent map access for seidb
* [#424](https://github.com/sei-protocol/sei-cosmos/pull/424) Fix SS apply changeset version off by 1`
  }, {
    version: 'v3.6.1',
    body: `sei-chain
* [#1204](https://github.com/sei-protocol/sei-chain/pull/1204) Cleanup removed oracle feeds
* [#1196](https://github.com/sei-protocol/sei-chain/pull/1196) Add panic handler in dex endblock
* [#1170](https://github.com/sei-protocol/sei-chain/pull/1170) Integrate SeiDB into Sei Chain

sei-cosmos
* [#391](https://github.com/sei-protocol/sei-cosmos/pull/391) Fix potential memory leak due to emitting events
* [#388](https://github.com/sei-protocol/sei-cosmos/pull/388) Improve cachekv write performance
* [#385](https://github.com/sei-protocol/sei-cosmos/pull/385) Add params to disable seqno
* [#373](https://github.com/sei-protocol/sei-cosmos/pull/373) Add root multistore v2 for SeiDB

sei-tendermint
* [#175](https://github.com/sei-protocol/sei-tendermint/pull/175) Fix self remediation bug for block sync`
  }, {
    version: 'v3.5.0',
    body: `sei-chain
* [#1164](https://github.com/sei-protocol/sei-chain/pull/1164) Bump wasmd
* [#1163](https://github.com/sei-protocol/sei-chain/pull/1163) Update antehandler
* [#1160](https://github.com/sei-protocol/sei-chain/pull/1160) Allow metrics script to query remote
* [#1156](https://github.com/sei-protocol/sei-chain/pull/1156) Bump ledger version to support nano s
* [#1155](https://github.com/sei-protocol/sei-chain/pull/1155) Allow loadtest client to take a list of grpc endpoints

sei-cosmos
* [#383](https://github.com/sei-protocol/sei-cosmos/pull/383) Refactor wasm dependency behavior
* [#353](https://github.com/sei-protocol/sei-cosmos/pull/353) Perf: Relax locking contention for cache and cachekv
* [#331](https://github.com/sei-protocol/sei-cosmos/pull/331) Fast reject invalid consensus params

sei-tendermint
* [#170](https://github.com/sei-protocol/sei-tendermint/pull/170) P2P: Optimize block pool requester retry and peer pick up logic
* [#167](https://github.com/sei-protocol/sei-tendermint/pull/167) Perf: Increase buffer size for pubsub server to boost performance
* [#164](https://github.com/sei-protocol/sei-tendermint/pull/164) Add regex support to query syntax
* [#163](https://github.com/sei-protocol/sei-tendermint/pull/163) Reduce noisy tendermint logs
* [#162](https://github.com/sei-protocol/sei-tendermint/pull/162) Use peermanager scores for blocksync peers and don't error out on block mismatch`
  }, {
    version: 'v3.3.0',
    body: `sei-ibc-go
* [#35](https://github.com/sei-protocol/sei-ibc-go/pull/35) Upgrade to Ibc v3.4.0`
  }, {
    version: 'v3.2.1',
    body: `sei-chain
* [#1073](https://github.com/sei-protocol/sei-chain/pull/1073) Add timestamp to oracle exchange rates

sei-cosmos
* [#320](https://github.com/sei-protocol/sei-cosmos/pull/320) Allow minor release upgrades prior to upgrade height

sei-tendermint
* [#158](https://github.com/sei-protocol/sei-tendermint/pull/158) Add metrics for peermanager scores
* [#157](https://github.com/sei-protocol/sei-tendermint/pull/157) Fix findNewPrimary never timing out upon encountering poor witnesses
* [#156](https://github.com/sei-protocol/sei-tendermint/pull/156) Remove bad witness and don't block on all witnesses for ConsensusParams`
  }, {
    version: 'v3.1.1',
    body: `sei-ibc-go
* [#34](https://github.com/sei-protocol/sei-ibc-go/pull/34) Upgrade to Ibc v3.2.0`
  }, {
    version: 'v3.0.9',
    body: `sei-tendermint
* [#154](https://github.com/sei-protocol/sei-tendermint/pull/154) Fix empty prevote latency metrics`
  }, {
    version: '3.0.8',
    body: `sei-chain
* [#1018](https://github.com/sei-protocol/sei-chain/pull/1018) Reorder tx results into absolute order`
  }, {
    version: '3.0.7',
    body: `sei-chain
* [#1002](https://github.com/sei-protocol/sei-chain/pull/1002) Tokenfactory Query Wasmbindings
* [#989](https://github.com/sei-protocol/sei-chain/pull/989) Add CLI/wasmbinding to set tokenfactory metadata
* [#963](https://github.com/sei-protocol/sei-chain/pull/963) Add SetMetadata to tokenfactory

sei-cosmos
* [#308](https://github.com/sei-protocol/sei-cosmos/pull/308) Add NoConsumptionInfiniteGasMeter`
  }, {
    version: '3.0.6',
    body: `sei-chain
* [#944](https://github.com/sei-protocol/sei-chain/pull/944) Add new configuration for snapshot directory
* [#940](https://github.com/sei-protocol/sei-chain/pull/940) Use ImmutableAppend for v16 to v17 dex migration

sei-cosmos
* [#306](https://github.com/sei-protocol/sei-cosmos/pull/306) Fix dryRun for seid tx`
  }, {
    version: '3.0.5',
    body: `sei-chain
* [#878](https://github.com/sei-protocol/sei-chain/pull/878) Fix denom key collision

sei-tendermint
* [#149](https://github.com/sei-protocol/sei-tendermint/pull/149) Fix condition for tx key dissemination

sei-iavl
* [#32](https://github.com/sei-protocol/sei-iavl/pull/32) Separate orphan storage`
  }, {
    version: '3.0.4',
    body: `sei-chain
* [#874](https://github.com/sei-protocol/sei-chain/pull/874) Charge rent after failed Sudo call
* [#869](https://github.com/sei-protocol/sei-chain/pull/869) Require fee per byte in order data
* [#861](https://github.com/sei-protocol/sei-chain/pull/861) Fix tokenfactory metadata

sei-cosmos
* [#287](https://github.com/sei-protocol/sei-cosmos/pull/287) Refactor deferred balance to use memkv
* [#286](https://github.com/sei-protocol/sei-cosmos/pull/286) Prevent multisig sign with wrong key
* [#284](https://github.com/sei-protocol/sei-cosmos/pull/284) Fix allowed_msg uncapped spend limit
* [#280](https://github.com/sei-protocol/sei-cosmos/pull/280) Barberry patch

sei-tendermint
* [#148](https://github.com/sei-protocol/sei-tendermint/pull/148) Add sleep to avoid consensus reactor retrying too quickly`
  }, {
    version: '3.0.3',
    body: `sei-chain
* [#816](https://github.com/sei-protocol/sei-chain/pull/816) Reenable tx concurrency for non oracle/priority txs

sei-cosmos
* [#254](https://github.com/sei-protocol/sei-cosmos/pull/254) Use sequential searching instead of binary search for coins

sei-tendermint
* [#143](https://github.com/sei-protocol/sei-tendermint/pull/143) Fix cpu leak for simple pq but stopping timer
* [#140](https://github.com/sei-protocol/sei-tendermint/pull/140) Add raw logs to tx output`
  }, {
    version: '3.0.2',
    body: `sei-chain
* [#810](https://github.com/sei-protocol/sei-chain/pull/810) Disable FOK orders
* [#809](https://github.com/sei-protocol/sei-chain/pull/809) Huckleberry patch
* [#808](https://github.com/sei-protocol/sei-chain/pull/808) Add global min fees as a param`
  }, {
    version: '3.0.1',
    body: `sei-chain
* [#797](https://github.com/sei-protocol/sei-chain/pull/797) Don't charge gas for loading contract dependencies
* [#792](https://github.com/sei-protocol/sei-chain/pull/792) Reset block gas meter if concurrent processing fails
* [#791](https://github.com/sei-protocol/sei-chain/pull/791) Disable skipFastStorageUpgrade to make iavl dump faster
* [#790](https://github.com/sei-protocol/sei-chain/pull/790) Disable non-prioritized tx concurrency
* [#789](https://github.com/sei-protocol/sei-chain/pull/789) Adds appropriate READ access for dex contract in antehandler
* [#788](https://github.com/sei-protocol/sei-chain/pull/788) Clear dex memstate cache when falling back to sequential processing
* [#786](https://github.com/sei-protocol/sei-chain/pull/786) Add NoVersioning to seid command
* [#781](https://github.com/sei-protocol/sei-chain/pull/781) Add order limit for price level and pair limit for contracts

tm-db
* [#2](https://github.com/sei-protocol/tm-db/pull/2) Load items eagerly to memdb_iterator to avoid deadlock

sei-tendermint
* [#137](https://github.com/sei-protocol/sei-tendermint/pull/137) New endpoint to expose lag`
  }, {
    version: '3.0.0',
    body: `sei-chain
* [#777](https://github.com/sei-protocol/sei-chain/pull/777) Parallelize Sudo Deposit
* [#771](https://github.com/sei-protocol/sei-chain/pull/771) Parallelize BeginBlock for x/dex
* [#768](https://github.com/sei-protocol/sei-chain/pull/768) Add FOK back to order match result
* [#763](https://github.com/sei-protocol/sei-chain/pull/763) Refactor dex EndBlock to optimize store access

sei-cosmos
* [#240](https://github.com/sei-protocol/sei-cosmos/pull/239) Add dex contract ACL type
* [#237](https://github.com/sei-protocol/sei-cosmos/pull/237) Add next-account-numnber cli

sei-tendermint
* [#136](https://github.com/sei-protocol/sei-tendermint/pull/136) Revert block.Evidence to nested block.Evidence.Evidence
* [#135](https://github.com/sei-protocol/sei-tendermint/pull/135) Auto switch to blocksync should only start in consensus mode`
  }, {
    version: '2.0.48beta',
    body: `sei-chain
* [#743](https://github.com/sei-protocol/sei-chain/pull/743) Do not unregister contract if out of rent
* [#742](https://github.com/sei-protocol/sei-chain/pull/742) Add more metrics to dex module
* [#733](https://github.com/sei-protocol/sei-chain/pull/733) Remove liquidation logic from dex

sei-cosmos
* [#235](https://github.com/sei-protocol/sei-cosmos/pull/235) Fix x/simulation fee check
* [#234](https://github.com/sei-protocol/sei-cosmos/pull/234) Add more metrics for Begin/Mid/End Block

sei-tendermint
* [#134](https://github.com/sei-protocol/sei-tendermint/pull/134) Fix nil peer address map`
  }, {
    version: '2.0.47beta',
    body: `sei-chain
* [#726](https://github.com/sei-protocol/sei-chain/pull/726) Fix of dex rent transfer issue
* [#723](https://github.com/sei-protocol/sei-chain/pull/723) Security CW Patch Cherry
* [#699](https://github.com/sei-protocol/sei-chain/pull/699) Loadtest update
* [#716](https://github.com/sei-protocol/sei-chain/pull/716) Sei cluster init script update
* [#725](https://github.com/sei-protocol/sei-chain/pull/725) DBSync config update
* [#718](https://github.com/sei-protocol/sei-chain/pull/718) Update mint distribution to be daily
* [#729](https://github.com/sei-protocol/sei-chain/pull/729) Add gov prop handler for updating current minter
* [#730](https://github.com/sei-protocol/sei-chain/pull/730) Add README.md for epoch module
* [#727](https://github.com/sei-protocol/sei-chain/pull/727) Bump max wasm file size to 2MB
* [#731](https://github.com/sei-protocol/sei-chain/pull/731) Bump for module to module debug logs
* [#732](https://github.com/sei-protocol/sei-chain/pull/732) Remove x/nitro from genesis version

sei-cosmos
* [#231](https://github.com/sei-protocol/sei-cosmos/pull/231) Typo for m2m debug message
* [#230](https://github.com/sei-protocol/sei-cosmos/pull/230) Add debug message for module to module transactions
* [#228](https://github.com/sei-protocol/sei-cosmos/pull/228) Deprecate LoadLatest flag
* [#229](https://github.com/sei-protocol/sei-cosmos/pull/229) Replace snapshot manager multistore with new one after DBSync

sei-tendermint
* [#130](https://github.com/sei-protocol/sei-tendermint/pull/130) Do not run DBSync if there is already a readable app version`
  }, {
    version: '2.0.46beta',
    body: `sei-chain
* [#694](https://github.com/sei-protocol/sei-chain/pull/694) Register prune command
* [#702](https://github.com/sei-protocol/sei-chain/pull/702) Change tick failure log to warning

sei-cosmos
* [#227](https://github.com/sei-protocol/sei-cosmos/pull/227) Add checkTxResponse log to RPCResponse
* [#224](https://github.com/sei-protocol/sei-cosmos/pull/224) Default to secp256k1
* [#220](https://github.com/sei-protocol/sei-cosmos/pull/220) Add admin field to base vesting account
* [#218](https://github.com/sei-protocol/sei-cosmos/pull/218) Restart node instead of panicking
* [#216](https://github.com/sei-protocol/sei-cosmos/pull/216) Fix pruning command

sei-tendermint
* [#118](https://github.com/sei-protocol/sei-tendermint/pull/118) Add DBSync module`
  }, {
    version: '2.0.45beta',
    body: `sei-chain
* [#666](https://github.com/sei-protocol/sei-chain/pull/666) DEX remove BeginBlock/FinalizeBlock sudo hooks
* [#674](https://github.com/sei-protocol/sei-chain/pull/674) Longterm fix for max gas enforcement

sei-cosmos
* [#210](https://github.com/sei-protocol/sei-cosmos/pull/210) Add levelDB compaction goroutine

sei-tendermint
* [#110](https://github.com/sei-protocol/sei-tendermint/pull/110) Add more granular buckets for block interval
* [#111](https://github.com/sei-protocol/sei-tendermint/pull/111) Add unused prival pubKey back to node info - fix for IBC on full nodes
* [#113](https://github.com/sei-protocol/sei-tendermint/pull/113) Add metrics label for missing val power`
  }, {
    version: '2.0.44beta',
    body: `sei-chain
* [#658](https://github.com/sei-protocol/sei-chain/pull/658) Revert EventAttribute fields to byte array

sei-cosmos
* [#204](https://github.com/sei-protocol/sei-cosmos/pull/204) IBC Compatibility Fix

sei-tendermint
* IBC Compatibility Fix, Bump default max gas limit, Add metrics & visibility for high block time`
  }, {
    version: '2.0.42beta',
    body: `sei-chain
* [#670](https://github.com/sei-protocol/sei-chain/pull/670) Add add-wasm-genesis-message to seid
* [#654](https://github.com/sei-protocol/sei-chain/pull/654) Improve endblock performance and fix trace

sei-cosmos
* improvements around monitoring for sei-cosmos, dont enforce gas limit on deliverTx, refactor slashing module

sei-tendermint
* [#95](https://github.com/sei-protocol/sei-tendermint/pull/95) Patch forging empty merkle tree attack vector, set default max gas param to 6mil, log tunning for p2p`
  }, {
    version: '2.0.40beta - 2023-03-10',
    body: `sei-chain
* [#646](https://github.com/sei-protocol/sei-chain/pull/646) Optimizations for FinalizeBlock
* [#644](https://github.com/sei-protocol/sei-chain/pull/644) Oak Audit: Add check for non-existent transaction
* [#647](https://github.com/sei-protocol/sei-chain/pull/647) Fixes to race conditions
* [#638](https://github.com/sei-protocol/sei-chain/pull/638) Emit Version Related Metrics
* [#636](https://github.com/sei-protocol/sei-chain/pull/636) Fix deadlock with upgrades
* [#635](https://github.com/sei-protocol/sei-chain/pull/635) Add event to dex messages`
  }, {
    version: '2.0.39beta - 2023-03-06',
    body: `sei-chain
* [#632](https://github.com/sei-protocol/sei-chain/pull/632) Bump Sei-tendermint to reduce log volume
* [#631](https://github.com/sei-protocol/sei-chain/pull/631) Nondeterminism deadlock fixes
* [#630](https://github.com/sei-protocol/sei-chain/pull/630) Mempool configs to avoid node slow down`
  }, {
    version: '2.0.38beta - 2023-03-04',
    body: `sei-chain
* [#623](https://github.com/sei-protocol/sei-chain/pull/623) Add new epoch events
* [#624](https://github.com/sei-protocol/sei-chain/pull/624) Add long messages for dex and mint
* [#588](https://github.com/sei-protocol/sei-chain/pull/588) Send deposit funds in message server instead of EndBlock
* [#627](https://github.com/sei-protocol/sei-chain/pull/627) Add slash window progress query
* [#625](https://github.com/sei-protocol/sei-chain/pull/625) Update contract rent deposit logic + add query endpoint`
  }, {
    version: '2.0.37beta - 2023-02-27',
    body: `sei-chain
* [#621](https://github.com/sei-protocol/sei-chain/pull/621) Add success count to the oracle query
* [#600](https://github.com/sei-protocol/sei-chain/pull/600) Add params to guard Nitro fraud challenge
* [#617](https://github.com/sei-protocol/sei-chain/pull/617) gracefully handle nil response for new provider
* [#619](https://github.com/sei-protocol/sei-chain/pull/619) Move store operations outside of iterator

sei-tendermint
* [#73](https://github.com/sei-protocol/sei-tendermint/pull/73) reduce checktx log noise`
  }, {
    version: '2.0.36beta - 2023-02-27',
    body: `sei-chain
* [#603](https://github.com/sei-protocol/sei-chain/pull/603) Set mempool ttl
* [#612](https://github.com/sei-protocol/sei-chain/pull/612) Optimistic Processing should finish before main goroutine
* [#613](https://github.com/sei-protocol/sei-chain/pull/613) Incorporate IAVL change that removes mutex locking
* Various audit fixes`
  }];
  const normVersion = s => (s || '').toLowerCase().replace(/\s+/g, '').replace(/^v/, '');
  const STATIC_VERSION_NAMES = new Set(STATIC_CHANGELOG.map(entry => normVersion(entry.version)));
  const [dynamicVersions, setDynamicVersions] = useState([]);
  const [error, setError] = useState(null);
  const [loading, setLoading] = useState(true);
  const [isDark, setIsDark] = useState(false);
  useEffect(() => {
    const el = document.documentElement;
    const update = () => setIsDark(el.classList.contains('dark'));
    update();
    const obs = new MutationObserver(update);
    obs.observe(el, {
      attributes: true,
      attributeFilter: ['class']
    });
    return () => obs.disconnect();
  }, []);
  const parseContent = rawContent => {
    if (!rawContent) return [];
    const sections = rawContent.split(/^## /gm).slice(1);
    const merged = new Map();
    const order = [];
    for (const section of sections) {
      const lines = section.split('\n');
      const version = lines[0]?.trim() || '';
      const body = lines.slice(1).join('\n').trim();
      if (!version || STATIC_VERSION_NAMES.has(normVersion(version))) continue;
      if (merged.has(version)) {
        const existing = merged.get(version);
        existing.body += `\n\n${body}`;
      } else {
        merged.set(version, {
          version,
          body
        });
        order.push(version);
      }
    }
    return order.map(v => merged.get(v));
  };
  useEffect(() => {
    fetch('https://raw.githubusercontent.com/sei-protocol/sei-chain/main/CHANGELOG.md').then(res => {
      if (!res.ok) throw new Error(`Failed to fetch: ${res.status}`);
      return res.text();
    }).then(content => {
      setDynamicVersions(parseContent(content));
      setLoading(false);
    }).catch(err => {
      setError(err.message);
      setLoading(false);
    });
  }, []);
  const linkBaseStyle = () => ({
    color: isDark ? 'var(--sei-maroon-25)' : 'var(--sei-maroon-100)',
    backgroundColor: isDark ? 'rgba(96, 0, 20, 0.2)' : 'var(--sei-grey-25)',
    fontFamily: 'var(--sei-font-mono)',
    transition: 'color 0.15s, background-color 0.15s'
  });
  const applyLinkHover = (e, hovering) => {
    if (hovering) {
      e.currentTarget.style.color = isDark ? 'var(--sei-cream)' : 'var(--sei-maroon-200)';
      e.currentTarget.style.backgroundColor = isDark ? 'rgba(96, 0, 20, 0.3)' : 'var(--sei-grey-30)';
    } else {
      e.currentTarget.style.color = isDark ? 'var(--sei-maroon-25)' : 'var(--sei-maroon-100)';
      e.currentTarget.style.backgroundColor = isDark ? 'rgba(96, 0, 20, 0.2)' : 'var(--sei-grey-25)';
    }
  };
  const TextWithLinks = ({content, componentName}) => {
    if (!content) {
      return <span className="text-base">{content}</span>;
    }
    const getRepoUrl = compName => {
      const repoMap = {
        'sei-chain': 'sei-protocol/sei-chain',
        'sei-tendermint': 'sei-protocol/sei-tendermint',
        'sei-cosmos': 'sei-protocol/sei-cosmos',
        'sei-db': 'sei-protocol/sei-db',
        'sei-wasmd': 'sei-protocol/sei-wasmd',
        'sei-iavl': 'sei-protocol/sei-iavl',
        'sei-ibc-go': 'sei-protocol/sei-ibc-go',
        'tm-db': 'sei-protocol/tm-db'
      };
      return repoMap[compName] || 'sei-protocol/sei-chain';
    };
    const renderLink = (key, href, text, marginClass = 'ml-1') => <a key={key} href={href} target="_blank" rel="noopener noreferrer" className={`px-2 py-0.5 text-sm font-medium no-underline ${marginClass}`} style={linkBaseStyle()} onMouseEnter={e => applyLinkHover(e, true)} onMouseLeave={e => applyLinkHover(e, false)}>
        {text}
      </a>;
    const labelForUrl = url => {
      if (url.includes('/compare/')) {
        const m = url.match(/\/compare\/([^/\s]+)/);
        if (m) return `Compare ${m[1].replace('...', ' → ')}`;
      } else if (url.includes('/releases/tag/')) {
        const m = url.match(/\/releases\/tag\/([^/\s]+)/);
        if (m) return `Release ${m[1]}`;
      } else if (url.includes('/pull/')) {
        const m = url.match(/\/pull\/(\d+)/);
        if (m) return `#${m[1]}`;
      }
      return url;
    };
    const renderPlainSegment = (text, keyPrefix) => {
      const stripped = text.replace(/\[/g, '').replace(/\]/g, '');
      const urlPattern = /(https:\/\/github\.com\/[^\s)]+)/g;
      const parts = stripped.split(urlPattern);
      return parts.map((part, i) => {
        const key = `${keyPrefix}-${i}`;
        if (part.match(urlPattern)) {
          return renderLink(key, part, labelForUrl(part));
        }
        const compareMatch = part.match(/Compare\s+((?:sei-[a-z]+-)?(v?\d+\.\d+\.\d+(?:\.\d+)?(?:beta|alpha|rc\d*)?(?:-release)?))(?:\s*[→-]\s*|\.\.\.)+(v?\d+\.\d+\.\d+(?:\.\d+)?(?:beta|alpha|rc\d*)?(?:-release)?)/i);
        if (compareMatch) {
          const [fullMatch, fromVersion, , toVersion] = compareMatch;
          const cleanFromVersion = fromVersion.replace(/^sei-[a-z]+-/, '');
          const cleanToVersion = toVersion.replace(/^sei-[a-z]+-/, '');
          const repoPath = getRepoUrl(componentName);
          const compareUrl = `https://github.com/${repoPath}/compare/${cleanFromVersion}...${cleanToVersion}`;
          return <span key={key}>
              {part.replace(fullMatch, '')}
              {renderLink(`${key}-cmp`, compareUrl, `Compare ${cleanFromVersion} → ${cleanToVersion}`)}
            </span>;
        }
        const prParts = part.split(/(\b\d{1,4}\b|#\d+)/g);
        return <span key={key}>
            {prParts.map((subPart, j) => {
          const trimmedPart = subPart.trim();
          if (trimmedPart.match(/^#\d+$/)) {
            const num = trimmedPart.slice(1);
            const prevParts = prParts.slice(0, j).join('');
            const inlineComponentMatch = prevParts.match(/\b(sei-chain|sei-tendermint|sei-cosmos|sei-db|sei-wasmd|sei-iavl|sei-ibc-go|tm-db)\s*$/i);
            const effectiveComponent = inlineComponentMatch ? inlineComponentMatch[1] : componentName;
            const repoPath = getRepoUrl(effectiveComponent);
            return renderLink(`${key}-${j}`, `https://github.com/${repoPath}/pull/${num}`, `#${num}`);
          } else if (trimmedPart.match(/^\d{1,4}$/) && parseInt(trimmedPart, 10) > 0) {
            const prevPart = prParts[j - 1] || '';
            const nextPart = prParts[j + 1] || '';
            const followedByNonPR = nextPart.match(/^\s*(hop|limit|version|v\d|\.\d|px|ms|s\b|mb|gb|kb)/i);
            const precededByNonPR = prevPart.match(/(v|version|\d\.)\s*$/i);
            const isLikelyPRNumber = (j < 3 || prevPart.includes('•') || prevPart.includes('\n') || prevPart.includes('#')) && !followedByNonPR && !precededByNonPR && parseInt(trimmedPart, 10) >= 10;
            if (isLikelyPRNumber) {
              const prevParts = prParts.slice(0, j).join('');
              const inlineComponentMatch = prevParts.match(/\b(sei-chain|sei-tendermint|sei-cosmos|sei-db|sei-wasmd|sei-iavl|sei-ibc-go|tm-db)\s*$/i);
              const effectiveComponent = inlineComponentMatch ? inlineComponentMatch[1] : componentName;
              const repoPath = getRepoUrl(effectiveComponent);
              return renderLink(`${key}-${j}`, `https://github.com/${repoPath}/pull/${trimmedPart}`, `#${trimmedPart}`, 'mr-1');
            }
          }
          return <span key={`${key}-${j}`}>{subPart}</span>;
        })}
          </span>;
      });
    };
    const markdownLinkPattern = /\[([^\]]+)\]\((https?:\/\/[^)]+)\)/g;
    const tokens = content.split(markdownLinkPattern);
    const nodes = [];
    for (let i = 0; i < tokens.length; i++) {
      const mod = i % 3;
      if (mod === 0) {
        if (tokens[i]) {
          nodes.push(<span key={`seg-${i}`}>{renderPlainSegment(tokens[i], `seg-${i}`)}</span>);
        }
      } else if (mod === 1) {
        const label = tokens[i];
        const url = tokens[i + 1] || '';
        nodes.push(renderLink(`md-${i}`, url, label));
      }
    }
    return <span className="text-base">{nodes}</span>;
  };
  const renderContent = body => {
    if (!body) {
      return <div className="text-gray-500 dark:text-white italic py-4">No changes listed</div>;
    }
    const sectionComponents = [];
    const sections = body.split(/^### /gm);
    for (let i = 1; i < sections.length; i++) {
      const section = sections[i];
      const lines = section.split('\n');
      const sectionName = lines[0]?.trim();
      if (sectionName) {
        const bulletPoints = [];
        for (let j = 1; j < lines.length; j++) {
          const line = lines[j].trim();
          if (line.startsWith('*') || line.startsWith('-') || line.startsWith('•')) {
            const cleanLine = line.replace(/^\*\s*/, '').replace(/^-\s*/, '').replace(/^•\s*/, '');
            bulletPoints.push(cleanLine);
          }
        }
        if (bulletPoints.length > 0) {
          sectionComponents.push({
            name: sectionName,
            changes: bulletPoints.join('\n* ').replace(/^\* /, '')
          });
        }
      }
    }
    if (sectionComponents.length > 0) {
      return <div className="space-y-6">
          {sectionComponents.map((comp, i) => <div key={i}>
              <div className="flex items-center gap-2 mb-3">
                <div className="flex items-center gap-2 bg-gray-100 px-3 py-1.5">
                  <div className="w-2 h-2 rounded-full" style={{
        backgroundColor: 'var(--sei-maroon-100)'
      }}></div>
                  <span className="font-medium text-gray-700 dark:text-white text-sm">{comp.name}</span>
                </div>
              </div>
              <div className="space-y-2">
                {comp.changes.split(/\s*\*\s+/).filter(c => c.trim()).map((change, j) => <div key={j} className="flex items-start gap-3 py-2">
                      <span className="text-base mt-0.5 text-gray-400">•</span>
                      <div className="flex-1">
                        <TextWithLinks content={change.trim()} componentName={comp.name} />
                      </div>
                    </div>)}
              </div>
            </div>)}
        </div>;
    }
    const componentPattern = /^([a-zA-Z][a-zA-Z0-9-]*):?\s*(?:\(.*\))?\s*$/gm;
    const componentMatches = Array.from(body.matchAll(componentPattern));
    const components = [];
    if (componentMatches.length > 0) {
      const parts = body.split(/^([a-zA-Z][a-zA-Z0-9-]*):?\s*(?:\(.*\))?\s*$/gm);
      for (let i = 1; i < parts.length; i += 2) {
        const compName = parts[i]?.trim().replace(':', '');
        const compContent = parts[i + 1]?.trim();
        if (compName && compContent) {
          const bulletPoints = [];
          for (const line of compContent.split('\n')) {
            const trimmedLine = line.trim();
            if (trimmedLine.startsWith('*') || trimmedLine.startsWith('-') || trimmedLine.startsWith('•')) {
              const cleanLine = trimmedLine.replace(/^\*\s*/, '').replace(/^-\s*/, '').replace(/^•\s*/, '');
              bulletPoints.push(cleanLine);
            } else if (trimmedLine && !trimmedLine.match(/^[a-zA-Z][a-zA-Z0-9-]*:?\s*(?:\(.*\))?\s*$/)) {
              bulletPoints.push(trimmedLine);
            }
          }
          if (bulletPoints.length > 0) {
            components.push({
              name: compName,
              changes: bulletPoints.join('\n* ').replace(/^\* /, '')
            });
          }
        }
      }
    }
    if (components.length > 0) {
      return <div className="space-y-6">
          {components.map((comp, i) => <div key={i}>
              <div className="flex items-center gap-2 mb-3">
                <div className="flex items-center gap-2 bg-slate-100 px-3 py-1.5">
                  <div className="w-2 h-2 rounded-full" style={{
        backgroundColor: 'var(--sei-maroon-100)'
      }}></div>
                  <span className="font-medium text-slate-700 text-sm">{comp.name}</span>
                </div>
              </div>
              <div className="space-y-2">
                {comp.changes.split(/\s*\*\s+/).filter(c => c.trim()).map((change, j) => <div key={j} className="flex items-start gap-3 py-2">
                      <span className="text-base mt-0.5 text-gray-400">•</span>
                      <div className="flex-1">
                        <TextWithLinks content={change.trim()} componentName={comp.name} />
                      </div>
                    </div>)}
              </div>
            </div>)}
        </div>;
    }
    const fallbackLines = body.split('\n').map(l => l.trim().replace(/^\*\s*/, '').replace(/^-\s*/, '').replace(/^•\s*/, '')).filter(l => l);
    return <div className="space-y-2">
        {fallbackLines.map((line, i) => <div key={i} className="flex items-start gap-3 py-2">
            <span className="text-base mt-0.5 text-gray-400">•</span>
            <div className="flex-1">
              <TextWithLinks content={line} componentName="sei-chain" />
            </div>
          </div>)}
      </div>;
  };
  const staticVersions = STATIC_CHANGELOG.map(entry => ({
    version: entry.version,
    body: entry.body
  }));
  const versions = [...dynamicVersions, ...staticVersions];
  if (error) {
    return <div>
        <div className="my-4 p-4 border border-red-300 dark:border-red-700 bg-red-50 dark:bg-red-900/20 text-red-800 dark:text-red-200 text-sm">
          Failed to load latest changelog: {error}. Showing cached versions below.
        </div>
        <div className="changelog-content">
          {staticVersions.map(version => <div key={version.version} className="mb-8">
              <div className="flex items-center gap-3 mb-4">
                <h2 className="text-xl font-bold text-gray-900 dark:text-white m-0">{version.version}</h2>
                <span className="text-xs text-gray-500 bg-gray-100 px-2 py-1 rounded-full">Release</span>
              </div>
              <div className="space-y-4">{renderContent(version.body)}</div>
            </div>)}
        </div>
      </div>;
  }
  return <div>
      <div className="flex items-center justify-between mb-2 pb-4 mt-4">
        <a href="https://github.com/sei-protocol/sei-chain/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" className="inline-flex items-center gap-2 text-sm px-3 py-1.5 font-medium no-underline" style={{
    color: isDark ? 'var(--sei-maroon-25)' : 'var(--sei-maroon-100)',
    backgroundColor: isDark ? 'rgba(96, 0, 20, 0.2)' : 'var(--sei-grey-25)',
    transition: 'color 0.15s, background-color 0.15s'
  }} onMouseEnter={e => {
    e.currentTarget.style.color = isDark ? 'var(--sei-cream)' : 'var(--sei-maroon-200)';
    e.currentTarget.style.backgroundColor = isDark ? 'rgba(96, 0, 20, 0.3)' : 'var(--sei-grey-30)';
  }} onMouseLeave={e => {
    e.currentTarget.style.color = isDark ? 'var(--sei-maroon-25)' : 'var(--sei-maroon-100)';
    e.currentTarget.style.backgroundColor = isDark ? 'rgba(96, 0, 20, 0.2)' : 'var(--sei-grey-25)';
  }}>
          <svg className="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
            <path fillRule="evenodd" d="M10 0C4.477 0 0 4.484 0 10.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0110 4.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.203 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.942.359.31.678.921.678 1.856 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0020 10.017C20 4.484 15.522 0 10 0z" clipRule="evenodd" />
          </svg>
          View on GitHub
        </a>
        {loading && <span className="inline-flex items-center text-xs text-neutral-500 dark:text-neutral-400">
            <span className="inline-block h-3 w-3 animate-spin rounded-full border-2 border-current border-r-transparent mr-2" />
            Checking for the latest releases…
          </span>}
      </div>

      <div className="changelog-content">
        {versions.map(version => <div key={version.version} className="mb-8">
            <div className="flex items-center gap-3 mb-4">
              <h2 className="text-xl font-bold text-gray-900 dark:text-white m-0">{version.version}</h2>
              <span className="text-xs text-gray-500 bg-gray-100 px-2 py-1 rounded-full">Release</span>
            </div>
            <div className="space-y-4">{renderContent(version.body)}</div>
          </div>)}
      </div>
    </div>;
};

Stay up-to-date with the latest changes, improvements, and new features in Sei.

<Info>This changelog is automatically synced from the [sei-chain repository](https://github.com/sei-protocol/sei-chain/blob/main/CHANGELOG.md). For the most up-to-date information, you can also view the changelog directly on GitHub.</Info>

<Info>
  **Stay Updated**

  Want to be notified of new releases? **Watch** the [sei-protocol/sei-chain](https://github.com/sei-protocol/sei-chain) repository on GitHub or follow the release announcements in the [Sei Tech Chat](https://t.me/+KZdhZ1eE-G01NmZk).
</Info>

## Latest Changes

<Changelog />
