diff --git a/.changeset/beige-pears-exercise.md b/.changeset/beige-pears-exercise.md
deleted file mode 100644
index 0790803033..0000000000
--- a/.changeset/beige-pears-exercise.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/world": patch
----
-
-Fixed an issue in system resolving helper used by CLI was not correctly comparing `namespaceLabel`s.
diff --git a/.changeset/cuddly-pugs-cough.md b/.changeset/cuddly-pugs-cough.md
deleted file mode 100644
index 00de7fe84b..0000000000
--- a/.changeset/cuddly-pugs-cough.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/entrykit": patch
----
-
-Bumped react-error-boundary dependency.
diff --git a/.changeset/curvy-beds-mix.md b/.changeset/curvy-beds-mix.md
deleted file mode 100644
index c5008bf090..0000000000
--- a/.changeset/curvy-beds-mix.md
+++ /dev/null
@@ -1,9 +0,0 @@
----
-"@latticexyz/store-indexer": patch
----
-
-Added an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.
-
-To enable this, use `INTERNAL__VALIDATE_BLOCK_RANGE=true` environment variable when starting up any of the indexers. This requires `RPC_HTTP_URL` to also be set.
-
-Note that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.
diff --git a/.changeset/eighty-cooks-smile.md b/.changeset/eighty-cooks-smile.md
deleted file mode 100644
index f1f17f7184..0000000000
--- a/.changeset/eighty-cooks-smile.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/explorer": patch
----
-
-The context for the searched namespace and selected table is now preserved when reopening the table search and selection menu.
diff --git a/.changeset/empty-shoes-thank.md b/.changeset/empty-shoes-thank.md
deleted file mode 100644
index 6223f6d068..0000000000
--- a/.changeset/empty-shoes-thank.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/store-sync": patch
----
-
-Updated `waitForTransaction` to handle receipt status for user operations.
diff --git a/.changeset/famous-doors-listen.md b/.changeset/famous-doors-listen.md
deleted file mode 100644
index 126f466b1f..0000000000
--- a/.changeset/famous-doors-listen.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/cli": patch
----
-
-The `verify` command should now be able to correctly verify systems using public libraries.
diff --git a/.changeset/five-bats-live.md b/.changeset/five-bats-live.md
deleted file mode 100644
index d9cacf7466..0000000000
--- a/.changeset/five-bats-live.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"create-mud": patch
----
-
-Updated React template with Stash client state library, EntryKit for wallet support, and a cleaned up app structure.
diff --git a/.changeset/fluffy-falcons-hide.md b/.changeset/fluffy-falcons-hide.md
deleted file mode 100644
index 1582914091..0000000000
--- a/.changeset/fluffy-falcons-hide.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-"@latticexyz/block-logs-stream": patch
-"@latticexyz/store-sync": patch
----
-
-Added an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.
-
-To enable this, replace `publicClient: Client` with `internal_clientOptions: { chain: Chain, validateBlockRange: true }` when calling any sync method (e.g. `syncToStash`). For `<SyncProvider>`, only a `internal_validateBlockRange` prop is needed.
-
-```diff
--syncToStash({ publicClient, ... });
-+syncToStash({ internal_clientOptions: { chain, validateBlockRange: true }, ... });
-```
-
-```diff
--<SyncProvider adapter={createSyncAdapter(...)}>
-+<SyncProvider adapter={createSyncAdapter(...)} internal_validateBlockRange>
-```
-
-Note that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.
diff --git a/.changeset/gold-baboons-buy.md b/.changeset/gold-baboons-buy.md
deleted file mode 100644
index a6db2c6783..0000000000
--- a/.changeset/gold-baboons-buy.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/common": patch
----
-
-Improved approach for checking for nonce errors.
diff --git a/.changeset/hip-pugs-tease.md b/.changeset/hip-pugs-tease.md
deleted file mode 100644
index 671b945b3a..0000000000
--- a/.changeset/hip-pugs-tease.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"create-mud": patch
----
-
-Updated React ECS template with EntryKit for wallet support and a cleaned up app structure.
diff --git a/.changeset/hip-spoons-confess.md b/.changeset/hip-spoons-confess.md
deleted file mode 100644
index 25c47fdbba..0000000000
--- a/.changeset/hip-spoons-confess.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"create-mud": patch
----
-
-Replaced internal usage of `create-create-app` with a simpler recursive copy operation.
diff --git a/.changeset/large-days-confess.md b/.changeset/large-days-confess.md
deleted file mode 100644
index c5d10bf7bb..0000000000
--- a/.changeset/large-days-confess.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-"@latticexyz/world": patch
----
-
-Using `encodeSystemCall` (and others) with a world ABI and namespace-prefixed function name will now attempt to strip the prefix when encoding it as a system call.
-
-It's recommended to use a system ABI with these functions rather than a world ABI.
-
-```ts
-import systemAbi from "contracts/out/ISomeSystem.sol/ISomeSystem.sol.abi.json";
-encodeSystemCall({ abi: systemAbi, ... });
-```
diff --git a/.changeset/large-moles-rule.md b/.changeset/large-moles-rule.md
deleted file mode 100644
index eab9981c11..0000000000
--- a/.changeset/large-moles-rule.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-"@latticexyz/entrykit": patch
----
-
-Renamed `deploy-local-prereqs` bin to `entrykit-deploy`, which now accepts an RPC URL so that you can deploy the EntryKit prerequisites to your chain of choice.
-
-```
-RPC_URL=http://rpc.garnetchain.com pnpm entrykit-deploy
-```
-
-This bin supports specifying the RPC URL via `RPC_URL`, `RPC_HTTP_URL`, `FOUNDRY_ETH_RPC_URL` environment variables or `FOUNDRY_PROFILE` if using `eth_rpc_url` in `foundry.toml`.
diff --git a/.changeset/lemon-nails-bake.md b/.changeset/lemon-nails-bake.md
deleted file mode 100644
index 483850c2ac..0000000000
--- a/.changeset/lemon-nails-bake.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-"@latticexyz/block-logs-stream": patch
----
-
-Added an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.
-
-To enable this, replace `publicClient: Client` with `internal_clientOptions: { chain: Chain, validateBlockRange: true }` when calling `fetchLogs` or `fetchBlockLogs`.
-
-```diff
--fetchLogs({ publicClient, ... });
-+fetchLogs({ internal_clientOptions: { chain, validateBlockRange: true }, ... });
-```
-
-Note that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.
diff --git a/.changeset/lucky-maps-tell.md b/.changeset/lucky-maps-tell.md
deleted file mode 100644
index b9a7e59114..0000000000
--- a/.changeset/lucky-maps-tell.md
+++ /dev/null
@@ -1,29 +0,0 @@
----
-"@latticexyz/store-sync": patch
----
-
-Added an RECS sync adapter to be used with `SyncProvider` in React apps.
-
-```tsx
-import { WagmiProvider } from "wagmi";
-import { QueryClientProvider } from "@tanstack/react-query";
-import { SyncProvider } from "@latticexyz/store-sync/react";
-import { createSyncAdapter } from "@latticexyz/store-sync/recs";
-import { createWorld } from "@latticexyz/recs";
-import config from "./mud.config";
-
-const world = createWorld();
-const { syncAdapter, components } = createSyncAdapter({ world, config });
-
-export function App() {
-  return (
-    <WagmiProvider config={wagmiConfig}>
-      <QueryClientProvider client={queryClient}>
-        <SyncProvider chainId={chainId} address={worldAddress} startBlock={startBlock} adapter={syncAdapter}>
-          {children}
-        </SyncProvider>
-      </QueryClientProvider>
-    </WagmiProvider>
-  );
-}
-```
diff --git a/.changeset/modern-parrots-shave.md b/.changeset/modern-parrots-shave.md
deleted file mode 100644
index db96338cf6..0000000000
--- a/.changeset/modern-parrots-shave.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/explorer": patch
----
-
-Add a separate flag and port for the indexer created by the Explorer.
diff --git a/.changeset/neat-taxis-behave.md b/.changeset/neat-taxis-behave.md
deleted file mode 100644
index 421dcd5161..0000000000
--- a/.changeset/neat-taxis-behave.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-"@latticexyz/cli": patch
----
-
-Added an empty line to the end of `.json` output files for consistency.
-Removed some unnecessary defaults to allow them to pass through via environment variables.
diff --git a/.changeset/olive-countries-visit.md b/.changeset/olive-countries-visit.md
deleted file mode 100644
index b1985b3d5c..0000000000
--- a/.changeset/olive-countries-visit.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/explorer": patch
----
-
-Previously, queries could only be executed if they had changed, as data fetching was tied to query updates. Now, it’s possible to trigger a new table data fetch explicitly, regardless of whether the query has changed.
diff --git a/.changeset/shaggy-shirts-work.md b/.changeset/shaggy-shirts-work.md
deleted file mode 100644
index 8cd1467227..0000000000
--- a/.changeset/shaggy-shirts-work.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/protocol-parser": patch
----
-
-Added padding to make sure the `encodedLengths` field of a Store log is always 32 bytes.
diff --git a/.changeset/shy-poets-battle.md b/.changeset/shy-poets-battle.md
deleted file mode 100644
index f9da606e53..0000000000
--- a/.changeset/shy-poets-battle.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-"@latticexyz/world": patch
----
-
-Updated `callFrom` action to automatically translate `batchCall` to `batchCallFrom`.
-Also fixed `encodeSystemCallFrom` and `encodeSystemCallsFrom` to return the right format for use with `batchCall` and `batchCallFrom` respectively.
diff --git a/.changeset/silly-kids-enjoy.md b/.changeset/silly-kids-enjoy.md
deleted file mode 100644
index 7cb26b7e78..0000000000
--- a/.changeset/silly-kids-enjoy.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/cli": patch
----
-
-Fixed an issue with `mud verify` where system contract artifacts were being resolved incorrectly.
diff --git a/.changeset/tender-frogs-share.md b/.changeset/tender-frogs-share.md
deleted file mode 100644
index 6568f4a3de..0000000000
--- a/.changeset/tender-frogs-share.md
+++ /dev/null
@@ -1,25 +0,0 @@
----
-"@latticexyz/cli": patch
-"@latticexyz/entrykit": patch
-"@latticexyz/world-module-callwithsignature": patch
-"@latticexyz/world-modules": patch
----
-
-`CallWithSignature` module has been moved out of `@latticexyz/world-modules` and into its own package at `@latticexyz/world-module-callwithsignature`. This module is now installed by default during deploy as its needed by EntryKit.
-
-If you previously had this module installed in your MUD config, you can now remove it.
-
-```diff
- export default defineConfig({
-   tables: {
-     ...
-   },
--  modules: [
--    {
--      artifactPath:
--        "@latticexyz/world-modules/out/Unstable_CallWithSignatureModule.sol/Unstable_CallWithSignatureModule.json",
--      root: true,
--    },
--  ],
- });
-```
diff --git a/.changeset/thin-pianos-repair.md b/.changeset/thin-pianos-repair.md
deleted file mode 100644
index 8e1e46f633..0000000000
--- a/.changeset/thin-pianos-repair.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/explorer": patch
----
-
-The Explorer now returns an empty array for empty results, instead of throwing an error, when using the local indexer.
diff --git a/.changeset/three-seals-hear.md b/.changeset/three-seals-hear.md
deleted file mode 100644
index b43f6a71e6..0000000000
--- a/.changeset/three-seals-hear.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/explorer": patch
----
-
-The loader in the Explore table now appears only during the initial data load. Additionally, a loading spinner has been added to the query submit button for non-live queries to indicate when a query is being refetched.
diff --git a/.changeset/tiny-moles-rule.md b/.changeset/tiny-moles-rule.md
deleted file mode 100644
index 3fd40a4b7f..0000000000
--- a/.changeset/tiny-moles-rule.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/common": patch
----
-
-Updated Rhodolite chain config with new contract addresses.
diff --git a/.changeset/warm-rules-listen.md b/.changeset/warm-rules-listen.md
deleted file mode 100644
index b242d50215..0000000000
--- a/.changeset/warm-rules-listen.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/cli": patch
----
-
-The world address stored in `worlds.json` and `deploys/latest.json` is now checksummed.
diff --git a/.changeset/wild-starfishes-yell.md b/.changeset/wild-starfishes-yell.md
deleted file mode 100644
index debf8bd706..0000000000
--- a/.changeset/wild-starfishes-yell.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@latticexyz/cli": patch
----
-
-Deploy now prints the current MUD CLI version for easier debugging.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9428da2ee8..88093f7ed7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,202 @@
+## Version 2.2.17
+
+Release date: Thu Jan 30 2025
+
+### Patch changes
+
+**[fix(world): namespaceLabel should be compared to namespaceLabel not namespace (#3515)](https://github.com/latticexyz/mud/commit/94d82cfafbdbee448884643681b0b8db53eedfda)** (@latticexyz/world)
+
+Fixed an issue in system resolving helper used by CLI was not correctly comparing `namespaceLabel`s.
+
+**[feat(create-mud): new react template with stash/entrykit (#3478)](https://github.com/latticexyz/mud/commit/d5f4e1e44bbc260ff21dacdfab0e0f8389e9f304)** (@latticexyz/entrykit)
+
+Bumped react-error-boundary dependency.
+
+**[feat(store-indexer): add flag to validate block ranges (#3531)](https://github.com/latticexyz/mud/commit/40aaf970a122151852d3d3f02383f44bffed85b9)** (@latticexyz/store-indexer)
+
+Added an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.
+
+To enable this, use `INTERNAL__VALIDATE_BLOCK_RANGE=true` environment variable when starting up any of the indexers. This requires `RPC_HTTP_URL` to also be set.
+
+Note that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.
+
+**[feat(explorer): save searched namespace (#3470)](https://github.com/latticexyz/mud/commit/dab0d08d3c8f18adcab7bcd4a6a7eafc941ac4e6)** (@latticexyz/explorer)
+
+The context for the searched namespace and selected table is now preserved when reopening the table search and selection menu.
+
+**[fix(store-sync): handle user ops in waitForTransaction (#3518)](https://github.com/latticexyz/mud/commit/5a9e238e660bfa670cef673b2e34bbde7f860720)** (@latticexyz/store-sync)
+
+Updated `waitForTransaction` to handle receipt status for user operations.
+
+**[fix(cli): support verifying systems with linked libraries (#3514)](https://github.com/latticexyz/mud/commit/452d3e53db2768f2e296ea7560c9bdd6560cd797)** (@latticexyz/cli)
+
+The `verify` command should now be able to correctly verify systems using public libraries.
+
+**[feat(create-mud): new react template with stash/entrykit (#3478)](https://github.com/latticexyz/mud/commit/d5f4e1e44bbc260ff21dacdfab0e0f8389e9f304)** (create-mud)
+
+Updated React template with Stash client state library, EntryKit for wallet support, and a cleaned up app structure.
+
+**[feat(store-indexer): add flag to validate block ranges (#3531)](https://github.com/latticexyz/mud/commit/40aaf970a122151852d3d3f02383f44bffed85b9)** (@latticexyz/block-logs-stream, @latticexyz/store-sync)
+
+Added an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.
+
+To enable this, replace `publicClient: Client` with `internal_clientOptions: { chain: Chain, validateBlockRange: true }` when calling any sync method (e.g. `syncToStash`). For `<SyncProvider>`, only a `internal_validateBlockRange` prop is needed.
+
+```diff
+-syncToStash({ publicClient, ... });
++syncToStash({ internal_clientOptions: { chain, validateBlockRange: true }, ... });
+```
+
+```diff
+-<SyncProvider adapter={createSyncAdapter(...)}>
++<SyncProvider adapter={createSyncAdapter(...)} internal_validateBlockRange>
+```
+
+Note that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.
+
+**[docs: changeset for #3538 (#3539)](https://github.com/latticexyz/mud/commit/589fd3ae0e2dde80d259e64ac0d4f7f17a43afdc)** (@latticexyz/common)
+
+Improved approach for checking for nonce errors.
+
+**[feat(create-mud): new react-ecs template (#3485)](https://github.com/latticexyz/mud/commit/09846f2926132e17477b4d0d1e64b795fbd4485f)** (create-mud)
+
+Updated React ECS template with EntryKit for wallet support and a cleaned up app structure.
+
+**[feat(create-mud): rip out create-create-app (#3479)](https://github.com/latticexyz/mud/commit/e45e3751c0ea10c7b1f0088d674121419b0d0acb)** (create-mud)
+
+Replaced internal usage of `create-create-app` with a simpler recursive copy operation.
+
+**[feat(world): strip world prefix from function names when encoding system calls (#3527)](https://github.com/latticexyz/mud/commit/7c3df691b30f031202ab184345cbb76bb113c2cd)** (@latticexyz/world)
+
+Using `encodeSystemCall` (and others) with a world ABI and namespace-prefixed function name will now attempt to strip the prefix when encoding it as a system call.
+
+It's recommended to use a system ABI with these functions rather than a world ABI.
+
+```ts
+import systemAbi from "contracts/out/ISomeSystem.sol/ISomeSystem.sol.abi.json";
+encodeSystemCall({ abi: systemAbi, ... });
+```
+
+**[feat(entrykit): deploy prereqs to any chain (#3529)](https://github.com/latticexyz/mud/commit/73859484bb53c1a4066de028a3ad7d3a4284e4da)** (@latticexyz/entrykit)
+
+Renamed `deploy-local-prereqs` bin to `entrykit-deploy`, which now accepts an RPC URL so that you can deploy the EntryKit prerequisites to your chain of choice.
+
+```
+RPC_URL=http://rpc.garnetchain.com pnpm entrykit-deploy
+```
+
+This bin supports specifying the RPC URL via `RPC_URL`, `RPC_HTTP_URL`, `FOUNDRY_ETH_RPC_URL` environment variables or `FOUNDRY_PROFILE` if using `eth_rpc_url` in `foundry.toml`.
+
+**[feat(store-indexer): add flag to validate block ranges (#3531)](https://github.com/latticexyz/mud/commit/40aaf970a122151852d3d3f02383f44bffed85b9)** (@latticexyz/block-logs-stream)
+
+Added an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.
+
+To enable this, replace `publicClient: Client` with `internal_clientOptions: { chain: Chain, validateBlockRange: true }` when calling `fetchLogs` or `fetchBlockLogs`.
+
+```diff
+-fetchLogs({ publicClient, ... });
++fetchLogs({ internal_clientOptions: { chain, validateBlockRange: true }, ... });
+```
+
+Note that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.
+
+**[feat(store-sync): recs sync adapter (#3486)](https://github.com/latticexyz/mud/commit/227db4d37db5dd26607f77e805d91701ba2e38db)** (@latticexyz/store-sync)
+
+Added an RECS sync adapter to be used with `SyncProvider` in React apps.
+
+```tsx
+import { WagmiProvider } from "wagmi";
+import { QueryClientProvider } from "@tanstack/react-query";
+import { SyncProvider } from "@latticexyz/store-sync/react";
+import { createSyncAdapter } from "@latticexyz/store-sync/recs";
+import { createWorld } from "@latticexyz/recs";
+import config from "./mud.config";
+
+const world = createWorld();
+const { syncAdapter, components } = createSyncAdapter({ world, config });
+
+export function App() {
+  return (
+    <WagmiProvider config={wagmiConfig}>
+      <QueryClientProvider client={queryClient}>
+        <SyncProvider chainId={chainId} address={worldAddress} startBlock={startBlock} adapter={syncAdapter}>
+          {children}
+        </SyncProvider>
+      </QueryClientProvider>
+    </WagmiProvider>
+  );
+}
+```
+
+**[fix(explorer): create a separate flag and port for the indexer created by the explorer (#3511)](https://github.com/latticexyz/mud/commit/3d5b7b75c5c68f4c7499ecd2fcf6e3b2b40c6ad5)** (@latticexyz/explorer)
+
+Add a separate flag and port for the indexer created by the Explorer.
+
+**[feat(entrykit): deploy prereqs to any chain (#3529)](https://github.com/latticexyz/mud/commit/73859484bb53c1a4066de028a3ad7d3a4284e4da)** (@latticexyz/cli)
+
+Added an empty line to the end of `.json` output files for consistency.
+Removed some unnecessary defaults to allow them to pass through via environment variables.
+
+**[feat(explorer): enable re-executing query (#3471)](https://github.com/latticexyz/mud/commit/32649080323d2a27cdf4a189917a70b958d062da)** (@latticexyz/explorer)
+
+Previously, queries could only be executed if they had changed, as data fetching was tied to query updates. Now, it’s possible to trigger a new table data fetch explicitly, regardless of whether the query has changed.
+
+**[fix(protocol-parser): add padding for encodedLengths (#3507)](https://github.com/latticexyz/mud/commit/dead80e682bfa1bd23f4d3b9bac338aee38c281e)** (@latticexyz/protocol-parser)
+
+Added padding to make sure the `encodedLengths` field of a Store log is always 32 bytes.
+
+**[feat(world): support batchCall in callFrom action (#2796)](https://github.com/latticexyz/mud/commit/56e65f64186741cf38a7dc0bf62e2d22bbe8fed2)** (@latticexyz/world)
+
+Updated `callFrom` action to automatically translate `batchCall` to `batchCallFrom`.
+Also fixed `encodeSystemCallFrom` and `encodeSystemCallsFrom` to return the right format for use with `batchCall` and `batchCallFrom` respectively.
+
+**[fix(cli): use system label when verifying (#3503)](https://github.com/latticexyz/mud/commit/5aa8a3ad00aa591f9c3a60526b045257dc8a0bb5)** (@latticexyz/cli)
+
+Fixed an issue with `mud verify` where system contract artifacts were being resolved incorrectly.
+
+**[feat: move CallWithSignature module to its own package (#3491)](https://github.com/latticexyz/mud/commit/ffefc8f000769d5ca625dd19290007a853a21788)** (@latticexyz/cli, @latticexyz/entrykit, @latticexyz/world-module-callwithsignature, @latticexyz/world-modules)
+
+`CallWithSignature` module has been moved out of `@latticexyz/world-modules` and into its own package at `@latticexyz/world-module-callwithsignature`. This module is now installed by default during deploy as its needed by EntryKit.
+
+If you previously had this module installed in your MUD config, you can now remove it.
+
+```diff
+ export default defineConfig({
+   tables: {
+     ...
+   },
+-  modules: [
+-    {
+-      artifactPath:
+-        "@latticexyz/world-modules/out/Unstable_CallWithSignatureModule.sol/Unstable_CallWithSignatureModule.json",
+-      root: true,
+-    },
+-  ],
+ });
+```
+
+**[fix(explorer): return empty array for empty results (sqlite indexer) (#3469)](https://github.com/latticexyz/mud/commit/0812178a8a873aa728358040d1d494385f78566f)** (@latticexyz/explorer)
+
+The Explorer now returns an empty array for empty results, instead of throwing an error, when using the local indexer.
+
+**[fix(explorer): show loader only on initial table data load (#3517)](https://github.com/latticexyz/mud/commit/0ea31c36119277e7f6cad3c71ef2b012856ead41)** (@latticexyz/explorer)
+
+The loader in the Explore table now appears only during the initial data load. Additionally, a loading spinner has been added to the query submit button for non-live queries to indicate when a query is being refetched.
+
+**[feat(entrykit): deploy prereqs to any chain (#3529)](https://github.com/latticexyz/mud/commit/73859484bb53c1a4066de028a3ad7d3a4284e4da)** (@latticexyz/common)
+
+Updated Rhodolite chain config with new contract addresses.
+
+**[fix(cli): checksum deployed world addresses (#3465)](https://github.com/latticexyz/mud/commit/090c9224b80ab949997e0463f9ec0df953c731b5)** (@latticexyz/cli)
+
+The world address stored in `worlds.json` and `deploys/latest.json` is now checksummed.
+
+**[chore(cli): print mud version in deploy (#3476)](https://github.com/latticexyz/mud/commit/f52b1476f04ce0be68691e3b021a81e0fb9cce99)** (@latticexyz/cli)
+
+Deploy now prints the current MUD CLI version for easier debugging.
+
+---
+
 ## Version 2.2.16
 
 Release date: Fri Jan 17 2025
diff --git a/docs/data/changelog.json b/docs/data/changelog.json
index 26e3acb5af..4cdb6e82ab 100644
--- a/docs/data/changelog.json
+++ b/docs/data/changelog.json
@@ -1,4 +1,408 @@
 [
+  {
+    "version": "2.2.17",
+    "date": "2025-01-30T10:57:44.407Z",
+    "changes": {
+      "patch": [
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/world",
+              "type": "patch"
+            }
+          ],
+          "description": "\nFixed an issue in system resolving helper used by CLI was not correctly comparing `namespaceLabel`s.",
+          "type": 0,
+          "commitHash": "94d82cfafbdbee448884643681b0b8db53eedfda",
+          "authorName": "Dhvani Patel",
+          "authorEmail": "dhvani.patel@uwaterloo.ca",
+          "title": "fix(world): namespaceLabel should be compared to namespaceLabel not namespace (#3515)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/entrykit",
+              "type": "patch"
+            }
+          ],
+          "description": "\nBumped react-error-boundary dependency.",
+          "type": 0,
+          "commitHash": "d5f4e1e44bbc260ff21dacdfab0e0f8389e9f304",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "feat(create-mud): new react template with stash/entrykit (#3478)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/store-indexer",
+              "type": "patch"
+            }
+          ],
+          "description": "\nAdded an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.\n\nTo enable this, use `INTERNAL__VALIDATE_BLOCK_RANGE=true` environment variable when starting up any of the indexers. This requires `RPC_HTTP_URL` to also be set.\n\nNote that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.",
+          "type": 0,
+          "commitHash": "40aaf970a122151852d3d3f02383f44bffed85b9",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "feat(store-indexer): add flag to validate block ranges (#3531)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/explorer",
+              "type": "patch"
+            }
+          ],
+          "description": "\nThe context for the searched namespace and selected table is now preserved when reopening the table search and selection menu.",
+          "type": 0,
+          "commitHash": "dab0d08d3c8f18adcab7bcd4a6a7eafc941ac4e6",
+          "authorName": "Karolis Ramanauskas",
+          "authorEmail": "hello@karolisram.com",
+          "title": "feat(explorer): save searched namespace (#3470)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/store-sync",
+              "type": "patch"
+            }
+          ],
+          "description": "\nUpdated `waitForTransaction` to handle receipt status for user operations.",
+          "type": 0,
+          "commitHash": "5a9e238e660bfa670cef673b2e34bbde7f860720",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "fix(store-sync): handle user ops in waitForTransaction (#3518)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/cli",
+              "type": "patch"
+            }
+          ],
+          "description": "\nThe `verify` command should now be able to correctly verify systems using public libraries.",
+          "type": 0,
+          "commitHash": "452d3e53db2768f2e296ea7560c9bdd6560cd797",
+          "authorName": "Jackson Ernst - jaxer.eth",
+          "authorEmail": "51183683+jaxernst@users.noreply.github.com",
+          "title": "fix(cli): support verifying systems with linked libraries (#3514)"
+        },
+        {
+          "packages": [
+            {
+              "package": "create-mud",
+              "type": "patch"
+            }
+          ],
+          "description": "\nUpdated React template with Stash client state library, EntryKit for wallet support, and a cleaned up app structure.",
+          "type": 0,
+          "commitHash": "d5f4e1e44bbc260ff21dacdfab0e0f8389e9f304",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "feat(create-mud): new react template with stash/entrykit (#3478)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/block-logs-stream",
+              "type": "patch"
+            },
+            {
+              "package": "@latticexyz/store-sync",
+              "type": "patch"
+            }
+          ],
+          "description": "\nAdded an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.\n\nTo enable this, replace `publicClient: Client` with `internal_clientOptions: { chain: Chain, validateBlockRange: true }` when calling any sync method (e.g. `syncToStash`). For `<SyncProvider>`, only a `internal_validateBlockRange` prop is needed.\n\n```diff\n-syncToStash({ publicClient, ... });\n+syncToStash({ internal_clientOptions: { chain, validateBlockRange: true }, ... });\n```\n\n```diff\n-<SyncProvider adapter={createSyncAdapter(...)}>\n+<SyncProvider adapter={createSyncAdapter(...)} internal_validateBlockRange>\n```\n\nNote that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.",
+          "type": 0,
+          "commitHash": "40aaf970a122151852d3d3f02383f44bffed85b9",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "feat(store-indexer): add flag to validate block ranges (#3531)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/common",
+              "type": "patch"
+            }
+          ],
+          "description": "\nImproved approach for checking for nonce errors.",
+          "type": 0,
+          "commitHash": "589fd3ae0e2dde80d259e64ac0d4f7f17a43afdc",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "docs: changeset for #3538 (#3539)"
+        },
+        {
+          "packages": [
+            {
+              "package": "create-mud",
+              "type": "patch"
+            }
+          ],
+          "description": "\nUpdated React ECS template with EntryKit for wallet support and a cleaned up app structure.",
+          "type": 0,
+          "commitHash": "09846f2926132e17477b4d0d1e64b795fbd4485f",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "feat(create-mud): new react-ecs template (#3485)"
+        },
+        {
+          "packages": [
+            {
+              "package": "create-mud",
+              "type": "patch"
+            }
+          ],
+          "description": "\nReplaced internal usage of `create-create-app` with a simpler recursive copy operation.",
+          "type": 0,
+          "commitHash": "e45e3751c0ea10c7b1f0088d674121419b0d0acb",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "feat(create-mud): rip out create-create-app (#3479)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/world",
+              "type": "patch"
+            }
+          ],
+          "description": "\nUsing `encodeSystemCall` (and others) with a world ABI and namespace-prefixed function name will now attempt to strip the prefix when encoding it as a system call.\n\nIt's recommended to use a system ABI with these functions rather than a world ABI.\n\n```ts\nimport systemAbi from \"contracts/out/ISomeSystem.sol/ISomeSystem.sol.abi.json\";\nencodeSystemCall({ abi: systemAbi, ... });\n```",
+          "type": 0,
+          "commitHash": "7c3df691b30f031202ab184345cbb76bb113c2cd",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "feat(world): strip world prefix from function names when encoding system calls (#3527)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/entrykit",
+              "type": "patch"
+            }
+          ],
+          "description": "\nRenamed `deploy-local-prereqs` bin to `entrykit-deploy`, which now accepts an RPC URL so that you can deploy the EntryKit prerequisites to your chain of choice.\n\n```\nRPC_URL=http://rpc.garnetchain.com pnpm entrykit-deploy\n```\n\nThis bin supports specifying the RPC URL via `RPC_URL`, `RPC_HTTP_URL`, `FOUNDRY_ETH_RPC_URL` environment variables or `FOUNDRY_PROFILE` if using `eth_rpc_url` in `foundry.toml`.",
+          "type": 0,
+          "commitHash": "73859484bb53c1a4066de028a3ad7d3a4284e4da",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "feat(entrykit): deploy prereqs to any chain (#3529)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/block-logs-stream",
+              "type": "patch"
+            }
+          ],
+          "description": "\nAdded an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.\n\nTo enable this, replace `publicClient: Client` with `internal_clientOptions: { chain: Chain, validateBlockRange: true }` when calling `fetchLogs` or `fetchBlockLogs`.\n\n```diff\n-fetchLogs({ publicClient, ... });\n+fetchLogs({ internal_clientOptions: { chain, validateBlockRange: true }, ... });\n```\n\nNote that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.",
+          "type": 0,
+          "commitHash": "40aaf970a122151852d3d3f02383f44bffed85b9",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "feat(store-indexer): add flag to validate block ranges (#3531)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/store-sync",
+              "type": "patch"
+            }
+          ],
+          "description": "\nAdded an RECS sync adapter to be used with `SyncProvider` in React apps.\n\n```tsx\nimport { WagmiProvider } from \"wagmi\";\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport { SyncProvider } from \"@latticexyz/store-sync/react\";\nimport { createSyncAdapter } from \"@latticexyz/store-sync/recs\";\nimport { createWorld } from \"@latticexyz/recs\";\nimport config from \"./mud.config\";\n\nconst world = createWorld();\nconst { syncAdapter, components } = createSyncAdapter({ world, config });\n\nexport function App() {\n  return (\n    <WagmiProvider config={wagmiConfig}>\n      <QueryClientProvider client={queryClient}>\n        <SyncProvider chainId={chainId} address={worldAddress} startBlock={startBlock} adapter={syncAdapter}>\n          {children}\n        </SyncProvider>\n      </QueryClientProvider>\n    </WagmiProvider>\n  );\n}\n```",
+          "type": 0,
+          "commitHash": "227db4d37db5dd26607f77e805d91701ba2e38db",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "feat(store-sync): recs sync adapter (#3486)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/explorer",
+              "type": "patch"
+            }
+          ],
+          "description": "\nAdd a separate flag and port for the indexer created by the Explorer.",
+          "type": 0,
+          "commitHash": "3d5b7b75c5c68f4c7499ecd2fcf6e3b2b40c6ad5",
+          "authorName": "Dhvani Patel",
+          "authorEmail": "dhvani.patel@uwaterloo.ca",
+          "title": "fix(explorer): create a separate flag and port for the indexer created by the explorer (#3511)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/cli",
+              "type": "patch"
+            }
+          ],
+          "description": "\nAdded an empty line to the end of `.json` output files for consistency.\nRemoved some unnecessary defaults to allow them to pass through via environment variables.",
+          "type": 0,
+          "commitHash": "73859484bb53c1a4066de028a3ad7d3a4284e4da",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "feat(entrykit): deploy prereqs to any chain (#3529)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/explorer",
+              "type": "patch"
+            }
+          ],
+          "description": "\nPreviously, queries could only be executed if they had changed, as data fetching was tied to query updates. Now, it’s possible to trigger a new table data fetch explicitly, regardless of whether the query has changed.",
+          "type": 0,
+          "commitHash": "32649080323d2a27cdf4a189917a70b958d062da",
+          "authorName": "Karolis Ramanauskas",
+          "authorEmail": "hello@karolisram.com",
+          "title": "feat(explorer): enable re-executing query (#3471)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/protocol-parser",
+              "type": "patch"
+            }
+          ],
+          "description": "\nAdded padding to make sure the `encodedLengths` field of a Store log is always 32 bytes.",
+          "type": 0,
+          "commitHash": "dead80e682bfa1bd23f4d3b9bac338aee38c281e",
+          "authorName": "alvarius",
+          "authorEmail": "alvarius@lattice.xyz",
+          "title": "fix(protocol-parser): add padding for encodedLengths (#3507)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/world",
+              "type": "patch"
+            }
+          ],
+          "description": "\nUpdated `callFrom` action to automatically translate `batchCall` to `batchCallFrom`.\nAlso fixed `encodeSystemCallFrom` and `encodeSystemCallsFrom` to return the right format for use with `batchCall` and `batchCallFrom` respectively.",
+          "type": 0,
+          "commitHash": "56e65f64186741cf38a7dc0bf62e2d22bbe8fed2",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "feat(world): support batchCall in callFrom action (#2796)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/cli",
+              "type": "patch"
+            }
+          ],
+          "description": "\nFixed an issue with `mud verify` where system contract artifacts were being resolved incorrectly.",
+          "type": 0,
+          "commitHash": "5aa8a3ad00aa591f9c3a60526b045257dc8a0bb5",
+          "authorName": "Jackson Ernst - jaxer.eth",
+          "authorEmail": "51183683+jaxernst@users.noreply.github.com",
+          "title": "fix(cli): use system label when verifying (#3503)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/cli",
+              "type": "patch"
+            },
+            {
+              "package": "@latticexyz/entrykit",
+              "type": "patch"
+            },
+            {
+              "package": "@latticexyz/world-module-callwithsignature",
+              "type": "patch"
+            },
+            {
+              "package": "@latticexyz/world-modules",
+              "type": "patch"
+            }
+          ],
+          "description": "\n`CallWithSignature` module has been moved out of `@latticexyz/world-modules` and into its own package at `@latticexyz/world-module-callwithsignature`. This module is now installed by default during deploy as its needed by EntryKit.\n\nIf you previously had this module installed in your MUD config, you can now remove it.\n\n```diff\n export default defineConfig({\n   tables: {\n     ...\n   },\n-  modules: [\n-    {\n-      artifactPath:\n-        \"@latticexyz/world-modules/out/Unstable_CallWithSignatureModule.sol/Unstable_CallWithSignatureModule.json\",\n-      root: true,\n-    },\n-  ],\n });\n```",
+          "type": 0,
+          "commitHash": "ffefc8f000769d5ca625dd19290007a853a21788",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "feat: move CallWithSignature module to its own package (#3491)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/explorer",
+              "type": "patch"
+            }
+          ],
+          "description": "\nThe Explorer now returns an empty array for empty results, instead of throwing an error, when using the local indexer.",
+          "type": 0,
+          "commitHash": "0812178a8a873aa728358040d1d494385f78566f",
+          "authorName": "Karolis Ramanauskas",
+          "authorEmail": "hello@karolisram.com",
+          "title": "fix(explorer): return empty array for empty results (sqlite indexer) (#3469)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/explorer",
+              "type": "patch"
+            }
+          ],
+          "description": "\nThe loader in the Explore table now appears only during the initial data load. Additionally, a loading spinner has been added to the query submit button for non-live queries to indicate when a query is being refetched.",
+          "type": 0,
+          "commitHash": "0ea31c36119277e7f6cad3c71ef2b012856ead41",
+          "authorName": "Karolis Ramanauskas",
+          "authorEmail": "hello@karolisram.com",
+          "title": "fix(explorer): show loader only on initial table data load (#3517)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/common",
+              "type": "patch"
+            }
+          ],
+          "description": "\nUpdated Rhodolite chain config with new contract addresses.",
+          "type": 0,
+          "commitHash": "73859484bb53c1a4066de028a3ad7d3a4284e4da",
+          "authorName": "Kevin Ingersoll",
+          "authorEmail": "kingersoll@gmail.com",
+          "title": "feat(entrykit): deploy prereqs to any chain (#3529)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/cli",
+              "type": "patch"
+            }
+          ],
+          "description": "\nThe world address stored in `worlds.json` and `deploys/latest.json` is now checksummed.",
+          "type": 0,
+          "commitHash": "090c9224b80ab949997e0463f9ec0df953c731b5",
+          "authorName": "James Lefrère",
+          "authorEmail": "james@lefrere.com",
+          "title": "fix(cli): checksum deployed world addresses (#3465)"
+        },
+        {
+          "packages": [
+            {
+              "package": "@latticexyz/cli",
+              "type": "patch"
+            }
+          ],
+          "description": "\nDeploy now prints the current MUD CLI version for easier debugging.",
+          "type": 0,
+          "commitHash": "f52b1476f04ce0be68691e3b021a81e0fb9cce99",
+          "authorName": "James Lefrère",
+          "authorEmail": "james@lefrere.com",
+          "title": "chore(cli): print mud version in deploy (#3476)"
+        }
+      ],
+      "minor": [],
+      "major": []
+    }
+  },
   {
     "version": "2.2.16",
     "date": "2025-01-17T16:14:48.470Z",
diff --git a/docs/pages/changelog.mdx b/docs/pages/changelog.mdx
index 9428da2ee8..88093f7ed7 100644
--- a/docs/pages/changelog.mdx
+++ b/docs/pages/changelog.mdx
@@ -1,3 +1,202 @@
+## Version 2.2.17
+
+Release date: Thu Jan 30 2025
+
+### Patch changes
+
+**[fix(world): namespaceLabel should be compared to namespaceLabel not namespace (#3515)](https://github.com/latticexyz/mud/commit/94d82cfafbdbee448884643681b0b8db53eedfda)** (@latticexyz/world)
+
+Fixed an issue in system resolving helper used by CLI was not correctly comparing `namespaceLabel`s.
+
+**[feat(create-mud): new react template with stash/entrykit (#3478)](https://github.com/latticexyz/mud/commit/d5f4e1e44bbc260ff21dacdfab0e0f8389e9f304)** (@latticexyz/entrykit)
+
+Bumped react-error-boundary dependency.
+
+**[feat(store-indexer): add flag to validate block ranges (#3531)](https://github.com/latticexyz/mud/commit/40aaf970a122151852d3d3f02383f44bffed85b9)** (@latticexyz/store-indexer)
+
+Added an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.
+
+To enable this, use `INTERNAL__VALIDATE_BLOCK_RANGE=true` environment variable when starting up any of the indexers. This requires `RPC_HTTP_URL` to also be set.
+
+Note that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.
+
+**[feat(explorer): save searched namespace (#3470)](https://github.com/latticexyz/mud/commit/dab0d08d3c8f18adcab7bcd4a6a7eafc941ac4e6)** (@latticexyz/explorer)
+
+The context for the searched namespace and selected table is now preserved when reopening the table search and selection menu.
+
+**[fix(store-sync): handle user ops in waitForTransaction (#3518)](https://github.com/latticexyz/mud/commit/5a9e238e660bfa670cef673b2e34bbde7f860720)** (@latticexyz/store-sync)
+
+Updated `waitForTransaction` to handle receipt status for user operations.
+
+**[fix(cli): support verifying systems with linked libraries (#3514)](https://github.com/latticexyz/mud/commit/452d3e53db2768f2e296ea7560c9bdd6560cd797)** (@latticexyz/cli)
+
+The `verify` command should now be able to correctly verify systems using public libraries.
+
+**[feat(create-mud): new react template with stash/entrykit (#3478)](https://github.com/latticexyz/mud/commit/d5f4e1e44bbc260ff21dacdfab0e0f8389e9f304)** (create-mud)
+
+Updated React template with Stash client state library, EntryKit for wallet support, and a cleaned up app structure.
+
+**[feat(store-indexer): add flag to validate block ranges (#3531)](https://github.com/latticexyz/mud/commit/40aaf970a122151852d3d3f02383f44bffed85b9)** (@latticexyz/block-logs-stream, @latticexyz/store-sync)
+
+Added an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.
+
+To enable this, replace `publicClient: Client` with `internal_clientOptions: { chain: Chain, validateBlockRange: true }` when calling any sync method (e.g. `syncToStash`). For `<SyncProvider>`, only a `internal_validateBlockRange` prop is needed.
+
+```diff
+-syncToStash({ publicClient, ... });
++syncToStash({ internal_clientOptions: { chain, validateBlockRange: true }, ... });
+```
+
+```diff
+-<SyncProvider adapter={createSyncAdapter(...)}>
++<SyncProvider adapter={createSyncAdapter(...)} internal_validateBlockRange>
+```
+
+Note that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.
+
+**[docs: changeset for #3538 (#3539)](https://github.com/latticexyz/mud/commit/589fd3ae0e2dde80d259e64ac0d4f7f17a43afdc)** (@latticexyz/common)
+
+Improved approach for checking for nonce errors.
+
+**[feat(create-mud): new react-ecs template (#3485)](https://github.com/latticexyz/mud/commit/09846f2926132e17477b4d0d1e64b795fbd4485f)** (create-mud)
+
+Updated React ECS template with EntryKit for wallet support and a cleaned up app structure.
+
+**[feat(create-mud): rip out create-create-app (#3479)](https://github.com/latticexyz/mud/commit/e45e3751c0ea10c7b1f0088d674121419b0d0acb)** (create-mud)
+
+Replaced internal usage of `create-create-app` with a simpler recursive copy operation.
+
+**[feat(world): strip world prefix from function names when encoding system calls (#3527)](https://github.com/latticexyz/mud/commit/7c3df691b30f031202ab184345cbb76bb113c2cd)** (@latticexyz/world)
+
+Using `encodeSystemCall` (and others) with a world ABI and namespace-prefixed function name will now attempt to strip the prefix when encoding it as a system call.
+
+It's recommended to use a system ABI with these functions rather than a world ABI.
+
+```ts
+import systemAbi from "contracts/out/ISomeSystem.sol/ISomeSystem.sol.abi.json";
+encodeSystemCall({ abi: systemAbi, ... });
+```
+
+**[feat(entrykit): deploy prereqs to any chain (#3529)](https://github.com/latticexyz/mud/commit/73859484bb53c1a4066de028a3ad7d3a4284e4da)** (@latticexyz/entrykit)
+
+Renamed `deploy-local-prereqs` bin to `entrykit-deploy`, which now accepts an RPC URL so that you can deploy the EntryKit prerequisites to your chain of choice.
+
+```
+RPC_URL=http://rpc.garnetchain.com pnpm entrykit-deploy
+```
+
+This bin supports specifying the RPC URL via `RPC_URL`, `RPC_HTTP_URL`, `FOUNDRY_ETH_RPC_URL` environment variables or `FOUNDRY_PROFILE` if using `eth_rpc_url` in `foundry.toml`.
+
+**[feat(store-indexer): add flag to validate block ranges (#3531)](https://github.com/latticexyz/mud/commit/40aaf970a122151852d3d3f02383f44bffed85b9)** (@latticexyz/block-logs-stream)
+
+Added an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.
+
+To enable this, replace `publicClient: Client` with `internal_clientOptions: { chain: Chain, validateBlockRange: true }` when calling `fetchLogs` or `fetchBlockLogs`.
+
+```diff
+-fetchLogs({ publicClient, ... });
++fetchLogs({ internal_clientOptions: { chain, validateBlockRange: true }, ... });
+```
+
+Note that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.
+
+**[feat(store-sync): recs sync adapter (#3486)](https://github.com/latticexyz/mud/commit/227db4d37db5dd26607f77e805d91701ba2e38db)** (@latticexyz/store-sync)
+
+Added an RECS sync adapter to be used with `SyncProvider` in React apps.
+
+```tsx
+import { WagmiProvider } from "wagmi";
+import { QueryClientProvider } from "@tanstack/react-query";
+import { SyncProvider } from "@latticexyz/store-sync/react";
+import { createSyncAdapter } from "@latticexyz/store-sync/recs";
+import { createWorld } from "@latticexyz/recs";
+import config from "./mud.config";
+
+const world = createWorld();
+const { syncAdapter, components } = createSyncAdapter({ world, config });
+
+export function App() {
+  return (
+    <WagmiProvider config={wagmiConfig}>
+      <QueryClientProvider client={queryClient}>
+        <SyncProvider chainId={chainId} address={worldAddress} startBlock={startBlock} adapter={syncAdapter}>
+          {children}
+        </SyncProvider>
+      </QueryClientProvider>
+    </WagmiProvider>
+  );
+}
+```
+
+**[fix(explorer): create a separate flag and port for the indexer created by the explorer (#3511)](https://github.com/latticexyz/mud/commit/3d5b7b75c5c68f4c7499ecd2fcf6e3b2b40c6ad5)** (@latticexyz/explorer)
+
+Add a separate flag and port for the indexer created by the Explorer.
+
+**[feat(entrykit): deploy prereqs to any chain (#3529)](https://github.com/latticexyz/mud/commit/73859484bb53c1a4066de028a3ad7d3a4284e4da)** (@latticexyz/cli)
+
+Added an empty line to the end of `.json` output files for consistency.
+Removed some unnecessary defaults to allow them to pass through via environment variables.
+
+**[feat(explorer): enable re-executing query (#3471)](https://github.com/latticexyz/mud/commit/32649080323d2a27cdf4a189917a70b958d062da)** (@latticexyz/explorer)
+
+Previously, queries could only be executed if they had changed, as data fetching was tied to query updates. Now, it’s possible to trigger a new table data fetch explicitly, regardless of whether the query has changed.
+
+**[fix(protocol-parser): add padding for encodedLengths (#3507)](https://github.com/latticexyz/mud/commit/dead80e682bfa1bd23f4d3b9bac338aee38c281e)** (@latticexyz/protocol-parser)
+
+Added padding to make sure the `encodedLengths` field of a Store log is always 32 bytes.
+
+**[feat(world): support batchCall in callFrom action (#2796)](https://github.com/latticexyz/mud/commit/56e65f64186741cf38a7dc0bf62e2d22bbe8fed2)** (@latticexyz/world)
+
+Updated `callFrom` action to automatically translate `batchCall` to `batchCallFrom`.
+Also fixed `encodeSystemCallFrom` and `encodeSystemCallsFrom` to return the right format for use with `batchCall` and `batchCallFrom` respectively.
+
+**[fix(cli): use system label when verifying (#3503)](https://github.com/latticexyz/mud/commit/5aa8a3ad00aa591f9c3a60526b045257dc8a0bb5)** (@latticexyz/cli)
+
+Fixed an issue with `mud verify` where system contract artifacts were being resolved incorrectly.
+
+**[feat: move CallWithSignature module to its own package (#3491)](https://github.com/latticexyz/mud/commit/ffefc8f000769d5ca625dd19290007a853a21788)** (@latticexyz/cli, @latticexyz/entrykit, @latticexyz/world-module-callwithsignature, @latticexyz/world-modules)
+
+`CallWithSignature` module has been moved out of `@latticexyz/world-modules` and into its own package at `@latticexyz/world-module-callwithsignature`. This module is now installed by default during deploy as its needed by EntryKit.
+
+If you previously had this module installed in your MUD config, you can now remove it.
+
+```diff
+ export default defineConfig({
+   tables: {
+     ...
+   },
+-  modules: [
+-    {
+-      artifactPath:
+-        "@latticexyz/world-modules/out/Unstable_CallWithSignatureModule.sol/Unstable_CallWithSignatureModule.json",
+-      root: true,
+-    },
+-  ],
+ });
+```
+
+**[fix(explorer): return empty array for empty results (sqlite indexer) (#3469)](https://github.com/latticexyz/mud/commit/0812178a8a873aa728358040d1d494385f78566f)** (@latticexyz/explorer)
+
+The Explorer now returns an empty array for empty results, instead of throwing an error, when using the local indexer.
+
+**[fix(explorer): show loader only on initial table data load (#3517)](https://github.com/latticexyz/mud/commit/0ea31c36119277e7f6cad3c71ef2b012856ead41)** (@latticexyz/explorer)
+
+The loader in the Explore table now appears only during the initial data load. Additionally, a loading spinner has been added to the query submit button for non-live queries to indicate when a query is being refetched.
+
+**[feat(entrykit): deploy prereqs to any chain (#3529)](https://github.com/latticexyz/mud/commit/73859484bb53c1a4066de028a3ad7d3a4284e4da)** (@latticexyz/common)
+
+Updated Rhodolite chain config with new contract addresses.
+
+**[fix(cli): checksum deployed world addresses (#3465)](https://github.com/latticexyz/mud/commit/090c9224b80ab949997e0463f9ec0df953c731b5)** (@latticexyz/cli)
+
+The world address stored in `worlds.json` and `deploys/latest.json` is now checksummed.
+
+**[chore(cli): print mud version in deploy (#3476)](https://github.com/latticexyz/mud/commit/f52b1476f04ce0be68691e3b021a81e0fb9cce99)** (@latticexyz/cli)
+
+Deploy now prints the current MUD CLI version for easier debugging.
+
+---
+
 ## Version 2.2.16
 
 Release date: Fri Jan 17 2025
diff --git a/packages/abi-ts/CHANGELOG.md b/packages/abi-ts/CHANGELOG.md
index 7e4a7d6984..da74da8114 100644
--- a/packages/abi-ts/CHANGELOG.md
+++ b/packages/abi-ts/CHANGELOG.md
@@ -1,5 +1,7 @@
 # @latticexyz/abi-ts
 
+## 2.2.17
+
 ## 2.2.16
 
 ## 2.2.15
diff --git a/packages/abi-ts/package.json b/packages/abi-ts/package.json
index 0fff1cedc5..172024ff0d 100644
--- a/packages/abi-ts/package.json
+++ b/packages/abi-ts/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/abi-ts",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Create TypeScript type declaration files (`.d.ts`) for your ABI JSON files.",
   "repository": {
     "type": "git",
diff --git a/packages/block-logs-stream/CHANGELOG.md b/packages/block-logs-stream/CHANGELOG.md
index 4de4198225..77b0ddaa65 100644
--- a/packages/block-logs-stream/CHANGELOG.md
+++ b/packages/block-logs-stream/CHANGELOG.md
@@ -1,5 +1,40 @@
 # @latticexyz/block-logs-stream
 
+## 2.2.17
+
+### Patch Changes
+
+- 9321a5c: Added an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.
+
+  To enable this, replace `publicClient: Client` with `internal_clientOptions: { chain: Chain, validateBlockRange: true }` when calling any sync method (e.g. `syncToStash`). For `<SyncProvider>`, only a `internal_validateBlockRange` prop is needed.
+
+  ```diff
+  -syncToStash({ publicClient, ... });
+  +syncToStash({ internal_clientOptions: { chain, validateBlockRange: true }, ... });
+  ```
+
+  ```diff
+  -<SyncProvider adapter={createSyncAdapter(...)}>
+  +<SyncProvider adapter={createSyncAdapter(...)} internal_validateBlockRange>
+  ```
+
+  Note that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.
+
+- 40aaf97: Added an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.
+
+  To enable this, replace `publicClient: Client` with `internal_clientOptions: { chain: Chain, validateBlockRange: true }` when calling `fetchLogs` or `fetchBlockLogs`.
+
+  ```diff
+  -fetchLogs({ publicClient, ... });
+  +fetchLogs({ internal_clientOptions: { chain, validateBlockRange: true }, ... });
+  ```
+
+  Note that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.
+
+- Updated dependencies [589fd3a]
+- Updated dependencies [7385948]
+  - @latticexyz/common@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/block-logs-stream/package.json b/packages/block-logs-stream/package.json
index 64d2bbf4b7..e5f27340d6 100644
--- a/packages/block-logs-stream/package.json
+++ b/packages/block-logs-stream/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/block-logs-stream",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Create a stream of EVM block logs for events",
   "repository": {
     "type": "git",
diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md
index 399ac1a67e..e8cea43f27 100644
--- a/packages/cli/CHANGELOG.md
+++ b/packages/cli/CHANGELOG.md
@@ -1,5 +1,59 @@
 # Change Log
 
+## 2.2.17
+
+### Patch Changes
+
+- 452d3e5: The `verify` command should now be able to correctly verify systems using public libraries.
+- 7385948: Added an empty line to the end of `.json` output files for consistency.
+  Removed some unnecessary defaults to allow them to pass through via environment variables.
+- 5aa8a3a: Fixed an issue with `mud verify` where system contract artifacts were being resolved incorrectly.
+- ffefc8f: `CallWithSignature` module has been moved out of `@latticexyz/world-modules` and into its own package at `@latticexyz/world-module-callwithsignature`. This module is now installed by default during deploy as its needed by EntryKit.
+
+  If you previously had this module installed in your MUD config, you can now remove it.
+
+  ```diff
+   export default defineConfig({
+     tables: {
+       ...
+     },
+  -  modules: [
+  -    {
+  -      artifactPath:
+  -        "@latticexyz/world-modules/out/Unstable_CallWithSignatureModule.sol/Unstable_CallWithSignatureModule.json",
+  -      root: true,
+  -    },
+  -  ],
+   });
+  ```
+
+- 090c922: The world address stored in `worlds.json` and `deploys/latest.json` is now checksummed.
+- f52b147: Deploy now prints the current MUD CLI version for easier debugging.
+- Updated dependencies [94d82cf]
+- Updated dependencies [5a9e238]
+- Updated dependencies [9321a5c]
+- Updated dependencies [589fd3a]
+- Updated dependencies [7c3df69]
+- Updated dependencies [40aaf97]
+- Updated dependencies [227db4d]
+- Updated dependencies [dead80e]
+- Updated dependencies [56e65f6]
+- Updated dependencies [ffefc8f]
+- Updated dependencies [7385948]
+  - @latticexyz/world@2.2.17
+  - @latticexyz/store-sync@2.2.17
+  - @latticexyz/block-logs-stream@2.2.17
+  - @latticexyz/common@2.2.17
+  - @latticexyz/protocol-parser@2.2.17
+  - @latticexyz/world-module-callwithsignature@2.2.17
+  - @latticexyz/world-module-metadata@2.2.17
+  - @latticexyz/config@2.2.17
+  - @latticexyz/store@2.2.17
+  - @latticexyz/abi-ts@2.2.17
+  - @latticexyz/gas-report@2.2.17
+  - @latticexyz/schema-type@2.2.17
+  - @latticexyz/utils@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/cli/package.json b/packages/cli/package.json
index 7599769b9e..c4a994540c 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/cli",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Command line interface for mud",
   "repository": {
     "type": "git",
diff --git a/packages/common/CHANGELOG.md b/packages/common/CHANGELOG.md
index 721a9f59ce..dc07e42bde 100644
--- a/packages/common/CHANGELOG.md
+++ b/packages/common/CHANGELOG.md
@@ -1,5 +1,13 @@
 # Change Log
 
+## 2.2.17
+
+### Patch Changes
+
+- 589fd3a: Improved approach for checking for nonce errors.
+- 7385948: Updated Rhodolite chain config with new contract addresses.
+  - @latticexyz/schema-type@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/common/package.json b/packages/common/package.json
index fbedbc31c7..25918fed66 100644
--- a/packages/common/package.json
+++ b/packages/common/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/common",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Common low level logic shared between packages",
   "repository": {
     "type": "git",
diff --git a/packages/config/CHANGELOG.md b/packages/config/CHANGELOG.md
index aa14d60871..e1dd964f3a 100644
--- a/packages/config/CHANGELOG.md
+++ b/packages/config/CHANGELOG.md
@@ -1,5 +1,14 @@
 # Change Log
 
+## 2.2.17
+
+### Patch Changes
+
+- Updated dependencies [589fd3a]
+- Updated dependencies [7385948]
+  - @latticexyz/common@2.2.17
+  - @latticexyz/schema-type@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/config/package.json b/packages/config/package.json
index 94ff778d5b..05aa45c9b7 100644
--- a/packages/config/package.json
+++ b/packages/config/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/config",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Config for Store and World",
   "repository": {
     "type": "git",
diff --git a/packages/create-mud/CHANGELOG.md b/packages/create-mud/CHANGELOG.md
index d66ce77caf..14344d428a 100644
--- a/packages/create-mud/CHANGELOG.md
+++ b/packages/create-mud/CHANGELOG.md
@@ -1,5 +1,13 @@
 # Change Log
 
+## 2.2.17
+
+### Patch Changes
+
+- d5f4e1e: Updated React template with Stash client state library, EntryKit for wallet support, and a cleaned up app structure.
+- 09846f2: Updated React ECS template with EntryKit for wallet support and a cleaned up app structure.
+- e45e375: Replaced internal usage of `create-create-app` with a simpler recursive copy operation.
+
 ## 2.2.16
 
 ## 2.2.15
diff --git a/packages/create-mud/package.json b/packages/create-mud/package.json
index 66e7309f34..e8bfc7af8e 100644
--- a/packages/create-mud/package.json
+++ b/packages/create-mud/package.json
@@ -1,6 +1,6 @@
 {
   "name": "create-mud",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Create a new MUD project",
   "license": "MIT",
   "author": "Lattice <mud@lattice.xyz>",
diff --git a/packages/dev-tools/CHANGELOG.md b/packages/dev-tools/CHANGELOG.md
index e3a68a91bb..a145ef0df1 100644
--- a/packages/dev-tools/CHANGELOG.md
+++ b/packages/dev-tools/CHANGELOG.md
@@ -1,5 +1,26 @@
 # @latticexyz/dev-tools
 
+## 2.2.17
+
+### Patch Changes
+
+- Updated dependencies [94d82cf]
+- Updated dependencies [5a9e238]
+- Updated dependencies [9321a5c]
+- Updated dependencies [589fd3a]
+- Updated dependencies [7c3df69]
+- Updated dependencies [227db4d]
+- Updated dependencies [56e65f6]
+- Updated dependencies [7385948]
+  - @latticexyz/world@2.2.17
+  - @latticexyz/store-sync@2.2.17
+  - @latticexyz/common@2.2.17
+  - @latticexyz/store@2.2.17
+  - @latticexyz/react@2.2.17
+  - @latticexyz/recs@2.2.17
+  - @latticexyz/schema-type@2.2.17
+  - @latticexyz/utils@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/dev-tools/package.json b/packages/dev-tools/package.json
index d75a1b0f91..9832212a6a 100644
--- a/packages/dev-tools/package.json
+++ b/packages/dev-tools/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/dev-tools",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "MUD developer tools",
   "repository": {
     "type": "git",
diff --git a/packages/entrykit/CHANGELOG.md b/packages/entrykit/CHANGELOG.md
index f9d10473b4..7cf2c9a7e6 100644
--- a/packages/entrykit/CHANGELOG.md
+++ b/packages/entrykit/CHANGELOG.md
@@ -1,5 +1,52 @@
 # @latticexyz/entrykit
 
+## 2.2.17
+
+### Patch Changes
+
+- d5f4e1e: Bumped react-error-boundary dependency.
+- 7385948: Renamed `deploy-local-prereqs` bin to `entrykit-deploy`, which now accepts an RPC URL so that you can deploy the EntryKit prerequisites to your chain of choice.
+
+  ```
+  RPC_URL=http://rpc.garnetchain.com pnpm entrykit-deploy
+  ```
+
+  This bin supports specifying the RPC URL via `RPC_URL`, `RPC_HTTP_URL`, `FOUNDRY_ETH_RPC_URL` environment variables or `FOUNDRY_PROFILE` if using `eth_rpc_url` in `foundry.toml`.
+
+- ffefc8f: `CallWithSignature` module has been moved out of `@latticexyz/world-modules` and into its own package at `@latticexyz/world-module-callwithsignature`. This module is now installed by default during deploy as its needed by EntryKit.
+
+  If you previously had this module installed in your MUD config, you can now remove it.
+
+  ```diff
+   export default defineConfig({
+     tables: {
+       ...
+     },
+  -  modules: [
+  -    {
+  -      artifactPath:
+  -        "@latticexyz/world-modules/out/Unstable_CallWithSignatureModule.sol/Unstable_CallWithSignatureModule.json",
+  -      root: true,
+  -    },
+  -  ],
+   });
+  ```
+
+- Updated dependencies [94d82cf]
+- Updated dependencies [589fd3a]
+- Updated dependencies [7c3df69]
+- Updated dependencies [dead80e]
+- Updated dependencies [56e65f6]
+- Updated dependencies [ffefc8f]
+- Updated dependencies [7385948]
+  - @latticexyz/world@2.2.17
+  - @latticexyz/common@2.2.17
+  - @latticexyz/protocol-parser@2.2.17
+  - @latticexyz/world-module-callwithsignature@2.2.17
+  - @latticexyz/config@2.2.17
+  - @latticexyz/store@2.2.17
+  - @latticexyz/paymaster@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/entrykit/package.json b/packages/entrykit/package.json
index f134757357..ad06282618 100644
--- a/packages/entrykit/package.json
+++ b/packages/entrykit/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/entrykit",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "User onboarding flows for MUD apps",
   "repository": {
     "type": "git",
diff --git a/packages/explorer/CHANGELOG.md b/packages/explorer/CHANGELOG.md
index 95fc150352..7b1f7d5676 100644
--- a/packages/explorer/CHANGELOG.md
+++ b/packages/explorer/CHANGELOG.md
@@ -1,5 +1,35 @@
 # @latticexyz/explorer
 
+## 2.2.17
+
+### Patch Changes
+
+- dab0d08: The context for the searched namespace and selected table is now preserved when reopening the table search and selection menu.
+- 3d5b7b7: Add a separate flag and port for the indexer created by the Explorer.
+- 3264908: Previously, queries could only be executed if they had changed, as data fetching was tied to query updates. Now, it’s possible to trigger a new table data fetch explicitly, regardless of whether the query has changed.
+- 0812178: The Explorer now returns an empty array for empty results, instead of throwing an error, when using the local indexer.
+- 0ea31c3: The loader in the Explore table now appears only during the initial data load. Additionally, a loading spinner has been added to the query submit button for non-live queries to indicate when a query is being refetched.
+- Updated dependencies [94d82cf]
+- Updated dependencies [40aaf97]
+- Updated dependencies [5a9e238]
+- Updated dependencies [9321a5c]
+- Updated dependencies [589fd3a]
+- Updated dependencies [7c3df69]
+- Updated dependencies [40aaf97]
+- Updated dependencies [227db4d]
+- Updated dependencies [dead80e]
+- Updated dependencies [56e65f6]
+- Updated dependencies [7385948]
+  - @latticexyz/world@2.2.17
+  - @latticexyz/store-indexer@2.2.17
+  - @latticexyz/store-sync@2.2.17
+  - @latticexyz/block-logs-stream@2.2.17
+  - @latticexyz/common@2.2.17
+  - @latticexyz/protocol-parser@2.2.17
+  - @latticexyz/config@2.2.17
+  - @latticexyz/store@2.2.17
+  - @latticexyz/schema-type@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/explorer/package.json b/packages/explorer/package.json
index 2cccd46039..eae7ee676a 100644
--- a/packages/explorer/package.json
+++ b/packages/explorer/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/explorer",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "World Explorer is a tool for visually exploring and manipulating the state of worlds",
   "type": "module",
   "exports": {
diff --git a/packages/faucet/CHANGELOG.md b/packages/faucet/CHANGELOG.md
index d5e396210c..e32eb2617a 100644
--- a/packages/faucet/CHANGELOG.md
+++ b/packages/faucet/CHANGELOG.md
@@ -1,5 +1,13 @@
 # @latticexyz/faucet
 
+## 2.2.17
+
+### Patch Changes
+
+- Updated dependencies [589fd3a]
+- Updated dependencies [7385948]
+  - @latticexyz/common@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/faucet/package.json b/packages/faucet/package.json
index 56ccee1812..2da4ee6374 100644
--- a/packages/faucet/package.json
+++ b/packages/faucet/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/faucet",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Faucet API for Lattice testnet",
   "repository": {
     "type": "git",
diff --git a/packages/gas-report/CHANGELOG.md b/packages/gas-report/CHANGELOG.md
index a0428e6e46..c35de2b5f3 100644
--- a/packages/gas-report/CHANGELOG.md
+++ b/packages/gas-report/CHANGELOG.md
@@ -1,5 +1,7 @@
 # Change Log
 
+## 2.2.17
+
 ## 2.2.16
 
 ## 2.2.15
diff --git a/packages/gas-report/package.json b/packages/gas-report/package.json
index 20860f6d52..790a884f0b 100644
--- a/packages/gas-report/package.json
+++ b/packages/gas-report/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/gas-report",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Gas reporter for specific lines within forge tests",
   "repository": {
     "type": "git",
diff --git a/packages/paymaster/CHANGELOG.md b/packages/paymaster/CHANGELOG.md
index 7760fc1adb..c8d355e230 100644
--- a/packages/paymaster/CHANGELOG.md
+++ b/packages/paymaster/CHANGELOG.md
@@ -1,5 +1,7 @@
 # @latticexyz/paymaster
 
+## 2.2.17
+
 ## 2.2.16
 
 ## 2.2.15
diff --git a/packages/paymaster/package.json b/packages/paymaster/package.json
index 94b5848920..7688e9d782 100644
--- a/packages/paymaster/package.json
+++ b/packages/paymaster/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/paymaster",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Paymaster contracts",
   "repository": {
     "type": "git",
diff --git a/packages/protocol-parser/CHANGELOG.md b/packages/protocol-parser/CHANGELOG.md
index 45e9bd7194..6e9881971f 100644
--- a/packages/protocol-parser/CHANGELOG.md
+++ b/packages/protocol-parser/CHANGELOG.md
@@ -1,5 +1,16 @@
 # @latticexyz/protocol-parser
 
+## 2.2.17
+
+### Patch Changes
+
+- dead80e: Added padding to make sure the `encodedLengths` field of a Store log is always 32 bytes.
+- Updated dependencies [589fd3a]
+- Updated dependencies [7385948]
+  - @latticexyz/common@2.2.17
+  - @latticexyz/config@2.2.17
+  - @latticexyz/schema-type@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/protocol-parser/package.json b/packages/protocol-parser/package.json
index 58fd276015..00dbf9651e 100644
--- a/packages/protocol-parser/package.json
+++ b/packages/protocol-parser/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/protocol-parser",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Parser utilities for the MUD protocol",
   "repository": {
     "type": "git",
diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md
index cb42d6c9b0..a416b03232 100644
--- a/packages/react/CHANGELOG.md
+++ b/packages/react/CHANGELOG.md
@@ -1,5 +1,12 @@
 # Change Log
 
+## 2.2.17
+
+### Patch Changes
+
+- @latticexyz/store@2.2.17
+- @latticexyz/recs@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/react/package.json b/packages/react/package.json
index 16b72f194a..c3edac6428 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/react",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "React tools for MUD client.",
   "repository": {
     "type": "git",
diff --git a/packages/recs/CHANGELOG.md b/packages/recs/CHANGELOG.md
index efce5802fa..bbbd40ce39 100644
--- a/packages/recs/CHANGELOG.md
+++ b/packages/recs/CHANGELOG.md
@@ -1,5 +1,12 @@
 # Change Log
 
+## 2.2.17
+
+### Patch Changes
+
+- @latticexyz/schema-type@2.2.17
+- @latticexyz/utils@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/recs/package.json b/packages/recs/package.json
index f0f054d4f6..16388ce45f 100644
--- a/packages/recs/package.json
+++ b/packages/recs/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/recs",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "repository": {
     "type": "git",
     "url": "https://github.com/latticexyz/mud.git",
diff --git a/packages/schema-type/CHANGELOG.md b/packages/schema-type/CHANGELOG.md
index 37464097a4..5a663a5823 100644
--- a/packages/schema-type/CHANGELOG.md
+++ b/packages/schema-type/CHANGELOG.md
@@ -1,5 +1,7 @@
 # Change Log
 
+## 2.2.17
+
 ## 2.2.16
 
 ## 2.2.15
diff --git a/packages/schema-type/package.json b/packages/schema-type/package.json
index f2bd8b7456..094937c85a 100644
--- a/packages/schema-type/package.json
+++ b/packages/schema-type/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/schema-type",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "SchemaType enum for various languages",
   "repository": {
     "type": "git",
diff --git a/packages/solhint-config-mud/CHANGELOG.md b/packages/solhint-config-mud/CHANGELOG.md
index 63e46462ed..041e3a8076 100644
--- a/packages/solhint-config-mud/CHANGELOG.md
+++ b/packages/solhint-config-mud/CHANGELOG.md
@@ -1,5 +1,7 @@
 # Change Log
 
+## 2.2.17
+
 ## 2.2.16
 
 ## 2.2.15
diff --git a/packages/solhint-config-mud/package.json b/packages/solhint-config-mud/package.json
index 0260998766..1118e36133 100644
--- a/packages/solhint-config-mud/package.json
+++ b/packages/solhint-config-mud/package.json
@@ -1,6 +1,6 @@
 {
   "name": "solhint-config-mud",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "repository": {
     "type": "git",
     "url": "https://github.com/latticexyz/mud.git",
diff --git a/packages/solhint-plugin-mud/CHANGELOG.md b/packages/solhint-plugin-mud/CHANGELOG.md
index 63e46462ed..041e3a8076 100644
--- a/packages/solhint-plugin-mud/CHANGELOG.md
+++ b/packages/solhint-plugin-mud/CHANGELOG.md
@@ -1,5 +1,7 @@
 # Change Log
 
+## 2.2.17
+
 ## 2.2.16
 
 ## 2.2.15
diff --git a/packages/solhint-plugin-mud/package.json b/packages/solhint-plugin-mud/package.json
index a825721d57..f1144a99d7 100644
--- a/packages/solhint-plugin-mud/package.json
+++ b/packages/solhint-plugin-mud/package.json
@@ -1,6 +1,6 @@
 {
   "name": "solhint-plugin-mud",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "repository": {
     "type": "git",
     "url": "https://github.com/latticexyz/mud.git",
diff --git a/packages/stash/CHANGELOG.md b/packages/stash/CHANGELOG.md
index bb44f4efcd..ae9e7eb238 100644
--- a/packages/stash/CHANGELOG.md
+++ b/packages/stash/CHANGELOG.md
@@ -1,5 +1,18 @@
 # @latticexyz/stash
 
+## 2.2.17
+
+### Patch Changes
+
+- Updated dependencies [589fd3a]
+- Updated dependencies [dead80e]
+- Updated dependencies [7385948]
+  - @latticexyz/common@2.2.17
+  - @latticexyz/protocol-parser@2.2.17
+  - @latticexyz/config@2.2.17
+  - @latticexyz/store@2.2.17
+  - @latticexyz/schema-type@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/stash/package.json b/packages/stash/package.json
index 83da9b6888..f435aaf2f5 100644
--- a/packages/stash/package.json
+++ b/packages/stash/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/stash",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "High performance client store and query engine for MUD",
   "repository": {
     "type": "git",
diff --git a/packages/store-consumer/CHANGELOG.md b/packages/store-consumer/CHANGELOG.md
index 220c177ad1..5e7579a9a3 100644
--- a/packages/store-consumer/CHANGELOG.md
+++ b/packages/store-consumer/CHANGELOG.md
@@ -1,5 +1,16 @@
 # @latticexyz/store-consumer
 
+## 2.2.17
+
+### Patch Changes
+
+- Updated dependencies [94d82cf]
+- Updated dependencies [7c3df69]
+- Updated dependencies [56e65f6]
+  - @latticexyz/world@2.2.17
+  - @latticexyz/store@2.2.17
+  - @latticexyz/schema-type@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/store-consumer/package.json b/packages/store-consumer/package.json
index 1341ab9daa..8b18e0d353 100644
--- a/packages/store-consumer/package.json
+++ b/packages/store-consumer/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/store-consumer",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Store Consumer Contracts",
   "repository": {
     "type": "git",
diff --git a/packages/store-indexer/CHANGELOG.md b/packages/store-indexer/CHANGELOG.md
index d3a4b8ed6e..5b4bb57428 100644
--- a/packages/store-indexer/CHANGELOG.md
+++ b/packages/store-indexer/CHANGELOG.md
@@ -1,5 +1,28 @@
 # @latticexyz/store-indexer
 
+## 2.2.17
+
+### Patch Changes
+
+- 40aaf97: Added an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.
+
+  To enable this, use `INTERNAL__VALIDATE_BLOCK_RANGE=true` environment variable when starting up any of the indexers. This requires `RPC_HTTP_URL` to also be set.
+
+  Note that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.
+
+- Updated dependencies [5a9e238]
+- Updated dependencies [9321a5c]
+- Updated dependencies [589fd3a]
+- Updated dependencies [40aaf97]
+- Updated dependencies [227db4d]
+- Updated dependencies [dead80e]
+- Updated dependencies [7385948]
+  - @latticexyz/store-sync@2.2.17
+  - @latticexyz/block-logs-stream@2.2.17
+  - @latticexyz/common@2.2.17
+  - @latticexyz/protocol-parser@2.2.17
+  - @latticexyz/store@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/store-indexer/package.json b/packages/store-indexer/package.json
index a81c8777e9..a5a22ef3bc 100644
--- a/packages/store-indexer/package.json
+++ b/packages/store-indexer/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/store-indexer",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Minimal Typescript indexer for Store",
   "repository": {
     "type": "git",
diff --git a/packages/store-sync/CHANGELOG.md b/packages/store-sync/CHANGELOG.md
index 881b745b54..c7fa41a814 100644
--- a/packages/store-sync/CHANGELOG.md
+++ b/packages/store-sync/CHANGELOG.md
@@ -1,5 +1,70 @@
 # @latticexyz/store-sync
 
+## 2.2.17
+
+### Patch Changes
+
+- 5a9e238: Updated `waitForTransaction` to handle receipt status for user operations.
+- 9321a5c: Added an experimental option to help sync from load balanced RPCs, where nodes may be slightly out of sync, causing data inconsistencies while fetching logs.
+
+  To enable this, replace `publicClient: Client` with `internal_clientOptions: { chain: Chain, validateBlockRange: true }` when calling any sync method (e.g. `syncToStash`). For `<SyncProvider>`, only a `internal_validateBlockRange` prop is needed.
+
+  ```diff
+  -syncToStash({ publicClient, ... });
+  +syncToStash({ internal_clientOptions: { chain, validateBlockRange: true }, ... });
+  ```
+
+  ```diff
+  -<SyncProvider adapter={createSyncAdapter(...)}>
+  +<SyncProvider adapter={createSyncAdapter(...)} internal_validateBlockRange>
+  ```
+
+  Note that using this option makes an additional call to `eth_getBlockByNumber` for each `eth_getLogs` call and expects the RPC to support batched calls.
+
+- 227db4d: Added an RECS sync adapter to be used with `SyncProvider` in React apps.
+
+  ```tsx
+  import { WagmiProvider } from "wagmi";
+  import { QueryClientProvider } from "@tanstack/react-query";
+  import { SyncProvider } from "@latticexyz/store-sync/react";
+  import { createSyncAdapter } from "@latticexyz/store-sync/recs";
+  import { createWorld } from "@latticexyz/recs";
+  import config from "./mud.config";
+
+  const world = createWorld();
+  const { syncAdapter, components } = createSyncAdapter({ world, config });
+
+  export function App() {
+    return (
+      <WagmiProvider config={wagmiConfig}>
+        <QueryClientProvider client={queryClient}>
+          <SyncProvider chainId={chainId} address={worldAddress} startBlock={startBlock} adapter={syncAdapter}>
+            {children}
+          </SyncProvider>
+        </QueryClientProvider>
+      </WagmiProvider>
+    );
+  }
+  ```
+
+- Updated dependencies [94d82cf]
+- Updated dependencies [9321a5c]
+- Updated dependencies [589fd3a]
+- Updated dependencies [7c3df69]
+- Updated dependencies [40aaf97]
+- Updated dependencies [dead80e]
+- Updated dependencies [56e65f6]
+- Updated dependencies [7385948]
+  - @latticexyz/world@2.2.17
+  - @latticexyz/block-logs-stream@2.2.17
+  - @latticexyz/common@2.2.17
+  - @latticexyz/protocol-parser@2.2.17
+  - @latticexyz/config@2.2.17
+  - @latticexyz/stash@2.2.17
+  - @latticexyz/store@2.2.17
+  - @latticexyz/recs@2.2.17
+  - @latticexyz/schema-type@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/store-sync/package.json b/packages/store-sync/package.json
index a0649e4791..f1be37bbd3 100644
--- a/packages/store-sync/package.json
+++ b/packages/store-sync/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/store-sync",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Utilities to sync MUD Store events with a client or cache",
   "repository": {
     "type": "git",
diff --git a/packages/store/CHANGELOG.md b/packages/store/CHANGELOG.md
index 8d9eb3b4b9..3a378e0ed2 100644
--- a/packages/store/CHANGELOG.md
+++ b/packages/store/CHANGELOG.md
@@ -1,5 +1,17 @@
 # Change Log
 
+## 2.2.17
+
+### Patch Changes
+
+- Updated dependencies [589fd3a]
+- Updated dependencies [dead80e]
+- Updated dependencies [7385948]
+  - @latticexyz/common@2.2.17
+  - @latticexyz/protocol-parser@2.2.17
+  - @latticexyz/config@2.2.17
+  - @latticexyz/schema-type@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/store/package.json b/packages/store/package.json
index d6bad80fb9..0a4b8106f4 100644
--- a/packages/store/package.json
+++ b/packages/store/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/store",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Store",
   "repository": {
     "type": "git",
diff --git a/packages/utils/CHANGELOG.md b/packages/utils/CHANGELOG.md
index 11f63005e6..00143e8e22 100644
--- a/packages/utils/CHANGELOG.md
+++ b/packages/utils/CHANGELOG.md
@@ -1,5 +1,7 @@
 # Change Log
 
+## 2.2.17
+
 ## 2.2.16
 
 ## 2.2.15
diff --git a/packages/utils/package.json b/packages/utils/package.json
index 525370cc1b..747fce6888 100644
--- a/packages/utils/package.json
+++ b/packages/utils/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/utils",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "repository": {
     "type": "git",
     "url": "https://github.com/latticexyz/mud.git",
diff --git a/packages/vite-plugin-mud/CHANGELOG.md b/packages/vite-plugin-mud/CHANGELOG.md
index c83d325ee5..34ed3a3d8e 100644
--- a/packages/vite-plugin-mud/CHANGELOG.md
+++ b/packages/vite-plugin-mud/CHANGELOG.md
@@ -1,5 +1,7 @@
 # vite-plugin-mud
 
+## 2.2.17
+
 ## 2.2.16
 
 ## 2.2.15
diff --git a/packages/vite-plugin-mud/package.json b/packages/vite-plugin-mud/package.json
index a5e3c48557..0ee0d51549 100644
--- a/packages/vite-plugin-mud/package.json
+++ b/packages/vite-plugin-mud/package.json
@@ -1,6 +1,6 @@
 {
   "name": "vite-plugin-mud",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "repository": {
     "type": "git",
     "url": "https://github.com/latticexyz/mud.git",
diff --git a/packages/world-module-callwithsignature/CHANGELOG.md b/packages/world-module-callwithsignature/CHANGELOG.md
new file mode 100644
index 0000000000..bbf9d72bce
--- /dev/null
+++ b/packages/world-module-callwithsignature/CHANGELOG.md
@@ -0,0 +1,31 @@
+# @latticexyz/world-module-callwithsignature
+
+## 2.2.17
+
+### Patch Changes
+
+- ffefc8f: `CallWithSignature` module has been moved out of `@latticexyz/world-modules` and into its own package at `@latticexyz/world-module-callwithsignature`. This module is now installed by default during deploy as its needed by EntryKit.
+
+  If you previously had this module installed in your MUD config, you can now remove it.
+
+  ```diff
+   export default defineConfig({
+     tables: {
+       ...
+     },
+  -  modules: [
+  -    {
+  -      artifactPath:
+  -        "@latticexyz/world-modules/out/Unstable_CallWithSignatureModule.sol/Unstable_CallWithSignatureModule.json",
+  -      root: true,
+  -    },
+  -  ],
+   });
+  ```
+
+- Updated dependencies [94d82cf]
+- Updated dependencies [7c3df69]
+- Updated dependencies [56e65f6]
+  - @latticexyz/world@2.2.17
+  - @latticexyz/store@2.2.17
+  - @latticexyz/schema-type@2.2.17
diff --git a/packages/world-module-callwithsignature/package.json b/packages/world-module-callwithsignature/package.json
index 9475d760a8..814e81f4a1 100644
--- a/packages/world-module-callwithsignature/package.json
+++ b/packages/world-module-callwithsignature/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/world-module-callwithsignature",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "CallWithSignature world module",
   "repository": {
     "type": "git",
diff --git a/packages/world-module-erc20/CHANGELOG.md b/packages/world-module-erc20/CHANGELOG.md
index 31fb9fb865..d51159954e 100644
--- a/packages/world-module-erc20/CHANGELOG.md
+++ b/packages/world-module-erc20/CHANGELOG.md
@@ -1,5 +1,17 @@
 # @latticexyz/world-module-erc20
 
+## 2.2.17
+
+### Patch Changes
+
+- Updated dependencies [94d82cf]
+- Updated dependencies [7c3df69]
+- Updated dependencies [56e65f6]
+  - @latticexyz/world@2.2.17
+  - @latticexyz/store-consumer@2.2.17
+  - @latticexyz/store@2.2.17
+  - @latticexyz/schema-type@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/world-module-erc20/package.json b/packages/world-module-erc20/package.json
index f06a427acc..c9a21cfd61 100644
--- a/packages/world-module-erc20/package.json
+++ b/packages/world-module-erc20/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/world-module-erc20",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "ERC20 world module",
   "repository": {
     "type": "git",
diff --git a/packages/world-module-metadata/CHANGELOG.md b/packages/world-module-metadata/CHANGELOG.md
index 1fa4dfd2d8..52ea6fc8d5 100644
--- a/packages/world-module-metadata/CHANGELOG.md
+++ b/packages/world-module-metadata/CHANGELOG.md
@@ -1,5 +1,16 @@
 # @latticexyz/world-module-metadata
 
+## 2.2.17
+
+### Patch Changes
+
+- Updated dependencies [94d82cf]
+- Updated dependencies [7c3df69]
+- Updated dependencies [56e65f6]
+  - @latticexyz/world@2.2.17
+  - @latticexyz/store@2.2.17
+  - @latticexyz/schema-type@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/world-module-metadata/package.json b/packages/world-module-metadata/package.json
index 48c3e41151..a4529e1fec 100644
--- a/packages/world-module-metadata/package.json
+++ b/packages/world-module-metadata/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/world-module-metadata",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "Metadata world module",
   "repository": {
     "type": "git",
diff --git a/packages/world-modules/CHANGELOG.md b/packages/world-modules/CHANGELOG.md
index 578e8d3693..2ec2f5122c 100644
--- a/packages/world-modules/CHANGELOG.md
+++ b/packages/world-modules/CHANGELOG.md
@@ -1,5 +1,39 @@
 # Change Log
 
+## 2.2.17
+
+### Patch Changes
+
+- ffefc8f: `CallWithSignature` module has been moved out of `@latticexyz/world-modules` and into its own package at `@latticexyz/world-module-callwithsignature`. This module is now installed by default during deploy as its needed by EntryKit.
+
+  If you previously had this module installed in your MUD config, you can now remove it.
+
+  ```diff
+   export default defineConfig({
+     tables: {
+       ...
+     },
+  -  modules: [
+  -    {
+  -      artifactPath:
+  -        "@latticexyz/world-modules/out/Unstable_CallWithSignatureModule.sol/Unstable_CallWithSignatureModule.json",
+  -      root: true,
+  -    },
+  -  ],
+   });
+  ```
+
+- Updated dependencies [94d82cf]
+- Updated dependencies [589fd3a]
+- Updated dependencies [7c3df69]
+- Updated dependencies [56e65f6]
+- Updated dependencies [7385948]
+  - @latticexyz/world@2.2.17
+  - @latticexyz/common@2.2.17
+  - @latticexyz/config@2.2.17
+  - @latticexyz/store@2.2.17
+  - @latticexyz/schema-type@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/world-modules/package.json b/packages/world-modules/package.json
index 70aa46d6d5..0fc7befe22 100644
--- a/packages/world-modules/package.json
+++ b/packages/world-modules/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/world-modules",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "World modules",
   "repository": {
     "type": "git",
diff --git a/packages/world/CHANGELOG.md b/packages/world/CHANGELOG.md
index 1f04a5aeb2..70853fa8cf 100644
--- a/packages/world/CHANGELOG.md
+++ b/packages/world/CHANGELOG.md
@@ -1,5 +1,33 @@
 # Change Log
 
+## 2.2.17
+
+### Patch Changes
+
+- 94d82cf: Fixed an issue in system resolving helper used by CLI was not correctly comparing `namespaceLabel`s.
+- 7c3df69: Using `encodeSystemCall` (and others) with a world ABI and namespace-prefixed function name will now attempt to strip the prefix when encoding it as a system call.
+
+  It's recommended to use a system ABI with these functions rather than a world ABI.
+
+  ```ts
+  import systemAbi from "contracts/out/ISomeSystem.sol/ISomeSystem.sol.abi.json";
+  encodeSystemCall({ abi: systemAbi, ... });
+  ```
+
+- 56e65f6: Updated `callFrom` action to automatically translate `batchCall` to `batchCallFrom`.
+  Also fixed `encodeSystemCallFrom` and `encodeSystemCallsFrom` to return the right format for use with `batchCall` and `batchCallFrom` respectively.
+- Updated dependencies [9321a5c]
+- Updated dependencies [589fd3a]
+- Updated dependencies [40aaf97]
+- Updated dependencies [dead80e]
+- Updated dependencies [7385948]
+  - @latticexyz/block-logs-stream@2.2.17
+  - @latticexyz/common@2.2.17
+  - @latticexyz/protocol-parser@2.2.17
+  - @latticexyz/config@2.2.17
+  - @latticexyz/store@2.2.17
+  - @latticexyz/schema-type@2.2.17
+
 ## 2.2.16
 
 ### Patch Changes
diff --git a/packages/world/package.json b/packages/world/package.json
index b12b9f4ee7..258ac83533 100644
--- a/packages/world/package.json
+++ b/packages/world/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@latticexyz/world",
-  "version": "2.2.16",
+  "version": "2.2.17",
   "description": "World framework",
   "repository": {
     "type": "git",