Version 2.2.14
Release date: Thu Oct 24 2024
Patch changes
fix(cli): support public library methods in modules (#3308) (opens in a new tab) (@latticexyz/cli)
Added support for deploying public libraries used within modules.
fix(cli): support public library methods in modules (#3308) (opens in a new tab) (@latticexyz/world-module-erc20, @latticexyz/world-modules)
Changed ERC20 and ERC721 related modules to use public library methods instead of manual delegatecall
s.
feat(stash): add useStash and improve other helpers (#3320) (opens in a new tab) (@latticexyz/stash)
Added useStash
React hook. It's heavily inspired by Zustand's useStore
and accepts a stash, a state selector, an an optional equality function to avoid unnecessary re-render cycles when returning unstable values.
Also updated getRecord
and getRecords
to each take either a stash
or state
object for more ergonomic use with useStash
.
import { useStash } from "@latticexyz/stash/react";
import { getRecord } from "@latticexyz/stash";
import config from "../mud.config";
const tables = config.namespaces.app.tables;
export function PlayerName({ playerId }) {
const record = useStash(stash, (state) => getRecord({ state, table: tables.Player, key: { playerId } }));
...
}
import isEqual from "fast-deep-equal";
import { useStash } from "@latticexyz/stash/react";
import { getRecords } from "@latticexyz/stash";
import config from "../mud.config";
export function PlayerNames() {
const record = useStash(stash, (state) => getRecords({ state, table: tables.Player }), { isEqual });
...
}
Version 2.2.13
Release date: Wed Oct 23 2024
Patch changes
fix(gas-report): include contract name in file of output (#3317) (opens in a new tab) (@latticexyz/gas-report)
Gas report output now include contract name as part of the file
to help with stable ordering when sorting output.
chore(world-module-erc20): export erc20 module from internal (#3319) (opens in a new tab) (@latticexyz/world-module-erc20)
The new ERC20 World Module provides a simpler alternative to the ERC20 Puppet Module, while also being structured in a more extendable way so users can create tokens with custom functionality.
To install this module, you can import and define the module configuration from the NPM package:
import { defineERC20Module } from "@latticexyz/world-module-erc20/internal";
// Add the output of this function to your World's modules
const erc20Module = defineERC20Module({ namespace: "erc20Namespace", name: "MyToken", symbol: "MTK" });
For detailed installation instructions, please check out the @latticexyz/world-module-erc20
README.md (opens in a new tab).
feat(explorer): multi-line sql editor (#3311) (opens in a new tab) (@latticexyz/explorer)
The SQL query editor now supports multi-line input.
feat(abi-ts): extension option (#3315) (opens in a new tab) (@latticexyz/abi-ts)
Added an --extension
option to customize the resulting TS or DTS output. It defaults to the previous behavior of .json.d.ts
, but can now be set to .d.json.ts
for compatibility with newer TS versions and .json.ts
or just .ts
for a pure TS file.
fix(store-sync): update latest block for live logs API (#3323) (opens in a new tab) (@latticexyz/store-sync)
Fixed an issue where the sync progress was not moving to "live" when synced from the MUD indexer's live logs API.
Version 2.2.12
Release date: Fri Oct 18 2024
Patch changes
feat(explorer): add functions filter to query state (#3268) (opens in a new tab) (@latticexyz/explorer)
Function filters in Interact
tab are now included as part of the URL.
feat(explorer): transaction timings (#3274) (opens in a new tab) (@latticexyz/explorer)
Transactions in Observe tab are now populated with timing metrics when using the observer
Viem decorator in local projects.
You can wire up your local project to use transaction timings with:
import { observer } from "@latticexyz/explorer/observer";
// Extend the Viem client that is performing writes
walletClient.extend(observer());
fix(faucet,store-indexer): add bin wrappers (#3296) (opens in a new tab) (@latticexyz/faucet, @latticexyz/store-indexer)
Added bin wrappers to resolve issues when installing the package locally as a dependency of another package.
feat(explorer): show ABI errors in interact page (#3303) (opens in a new tab) (@latticexyz/explorer)
Interact tab now displays decoded ABI errors for failed transactions.
chore: bump viem (#3273) (opens in a new tab) (@latticexyz/block-logs-stream, @latticexyz/cli, @latticexyz/common, @latticexyz/config, @latticexyz/dev-tools, @latticexyz/explorer, @latticexyz/faucet, @latticexyz/protocol-parser, @latticexyz/schema-type, @latticexyz/stash, @latticexyz/store-indexer, @latticexyz/store-sync, @latticexyz/store, @latticexyz/world, create-mud)
Bumped viem to v2.21.19.
MUD projects using these packages should do the same to ensure no type errors due to mismatched versions:
pnpm recursive up viem@2.21.19
fix(explorer): display nested inputs (#3266) (opens in a new tab) (@latticexyz/explorer)
Fixed inputs display in the transactions table row.
feat(common): add rhodolite chain (#3295) (opens in a new tab) (@latticexyz/common)
Added Rhodolite devnet chain config and removed the old and now-defunct Lattice testnet chain config.
feat(explorer): show explore table error message (#3286) (opens in a new tab) (@latticexyz/explorer)
Display error messages for failed queries within the Explore tab's table viewer.
feat(explorer): sql editor (#3276) (opens in a new tab) (@latticexyz/explorer)
Explore page now has a full-featured SQL editor with syntax highlighting, autocomplete, and query validation.
feat(explorer): front page (#3255) (opens in a new tab) (@latticexyz/explorer)
Each chain's home page now lets you find and pick a world to explore.
feat(store-sync): add support for watching pending logs (#3287) (opens in a new tab) (@latticexyz/store-sync)
Added experimental support for syncing state from pending logs.
fix(explorer): various fixes (#3299) (opens in a new tab) (@latticexyz/explorer)
- Not found page if invalid chain name.
- Only show selector for worlds if options exist.
- Remove "future time" from transactions table.
- Improved layout for Interact tab.
- Wrap long args in transactions table.
- New tables polling.
- Add logs (regression).
fix(common): allow overriding fees in writeContract and sendTransaction (#3288) (opens in a new tab) (@latticexyz/common)
The transactionQueue
decorator internally keeps an updated reference for the recommended baseFeePerGas
and maxPriorityFeePerGas
from the connected chain to avoid having to fetch it right before sending a transaction.
However, due to the way the fee values were overridden, it wasn't possible for users to explicitly pass in custom fee values.
Now explicitly provided fee values have precedence over the internally estimated fee values.
feat(explorer): global transactions listener (#3285) (opens in a new tab) (@latticexyz/explorer)
Transactions are now monitored across all tabs while the World Explorer is open.
Version 2.2.11
Release date: Mon Oct 07 2024
Patch changes
feat(explorer): show transactions (#3062) (opens in a new tab) (@latticexyz/explorer)
Observe tab is now populated by transactions flowing through the world, in addition to local transactions when using the observer
transport wrapper.
feat(cli,store): fetch table-specific logs (#3245) (opens in a new tab) (@latticexyz/block-logs-stream)
fetchLogs
and blockRangeToLogs
now accept a getLogs
option to override the default behavior.
feat(cli,store): fetch table-specific logs (#3245) (opens in a new tab) (@latticexyz/store)
Added getStoreLogs
and flattenStoreLogs
to aid in fetching data from store contracts. For now, these are internal exports and considered unstable/experimental.
feat(store-sync): add client support for streaming logs from indexer (#3226) (opens in a new tab) (@latticexyz/store-sync)
Added support for streaming logs from the indexer.
fix(explorer): expand selected transaction table row by hash/writeId (#3263) (opens in a new tab) (@latticexyz/explorer)
Fixed row expansion in the transactions table where an incorrect row would expand when new transactions appeared.
fix(cli): update state block in dev runner redeploy (#3243) (opens in a new tab) (@latticexyz/cli)
Fixed a dev runner bug where the state block of a previous deploy was not updated during a redeploy, causing failed deploys due to fetching outdated world state.
fix(explorer): allow overriding internal indexer env variables (#3237) (opens in a new tab) (@latticexyz/explorer)
It is now possible to pass in environment variables like RPC_HTTP_URL
to the internal local indexer when running the explorer locally.
feat(explorer): integrate rejected transactions (#3251) (opens in a new tab) (@latticexyz/explorer)
Observe tab is now populated by rejected transactions coming from the observer
transport wrapper.
feat(cli,store): fetch table-specific logs (#3245) (opens in a new tab) (@latticexyz/cli)
Deployer now has a better method for fetching store logs from the world that should be more efficient and resilient to block range errors and rate limiting.
feat(store): add unwrap() function to ResourceIdInstance (#3249) (opens in a new tab) (@latticexyz/store)
Added an unwrap
function to the ResourceIdInstance
library to make it easier to unwrap a ResourceId
with resourceId.unwrap()
.
feat(cli,store): fetch table-specific logs (#3245) (opens in a new tab) (@latticexyz/common)
Added logSort
method to help when sorting logs fetched from RPC, where they come back ordered relative to the topics used.
import { logSort } from "@latticexyz/common";
const logs = getLogs(...);
logs.sort(logSort);
feat(cli): mud pull (#3171) (opens in a new tab) (@latticexyz/cli)
Added a mud pull
command that downloads state from an existing world and uses it to generate a MUD config with tables and system interfaces. This makes it much easier to extend worlds.
mud pull --worldAddress 0x… --rpc https://…
Version 2.2.10
Release date: Thu Sep 26 2024
Patch changes
fix(world): resolve system namespace label (#3232) (opens in a new tab) (@latticexyz/world)
The namespace
field in a multi-namespace config is now correctly resolved for systems.
This fixes a bug with root systems in a multi-namespace project.
fix(explorer): construct sqlite table names (#3234) (opens in a new tab) (@latticexyz/explorer)
Fixed table name construction in the explorer query for root tables for SQLite.
fix(explorer): various fixes (#3235) (opens in a new tab) (@latticexyz/explorer)
- Tables can be searched by specific values.
- Improved handling of dynamic SQL queries.
- The "Connect" modal is triggered during a write action if the wallet is not connected.
- Toast messages are now dismissible.
fix(create-mud): upgrade mprocs (#3236) (opens in a new tab) (create-mud)
Upgraded mprocs to fix issues with it not running when started via npm script.
You can do the same in an existing MUD project with:
pnpm recursive up mprocs@latest
Version 2.2.9
Release date: Wed Sep 25 2024
Patch changes
feat(explorer): dozer integration (#3185) (opens in a new tab) (@latticexyz/explorer)
Exploring worlds on Redstone and Garnet chains will now retrieve data from the hosted SQL indexer.
feat(explorer): local indexer inside explorer (#3229) (opens in a new tab) (@latticexyz/explorer, create-mud)
Explorer now automatically starts a local indexer when using Anvil as the target chain.
If you previously had an indexer
entry in your mprocs.yaml
file, it can now be removed.
- indexer:
- cwd: packages/contracts
- shell: shx rm -rf $SQLITE_FILENAME && pnpm sqlite-indexer
- env:
- DEBUG: mud:*
- RPC_HTTP_URL: "http://127.0.0.1:8545"
- FOLLOW_BLOCK_TAG: "latest"
- SQLITE_FILENAME: "indexer.db"
feat(explorer): move filter state to url (#3225) (opens in a new tab) (@latticexyz/explorer)
Table filters are now included as part of the URL. This enables deep links and improves navigating between pages without losing search state.
refactor(cli): adjust deploy order (#3222) (opens in a new tab) (@latticexyz/cli)
Adjusted deploy order so that the world deploy happens before everything else to avoid spending gas on system contract deploys, etc. if a world cannot be created first.
Version 2.2.8
Release date: Mon Sep 23 2024
Patch changes
feat(store-sync): remove unused generics (#3218) (opens in a new tab) (@latticexyz/common, @latticexyz/store-sync)
Removed unused generics and ensure that we're only passing around the generics we need, when we need them. Hopefully this improves TS performance in MUD projects.
fix(create-mud): add missing three deps, fix types (#3221) (opens in a new tab) (create-mud)
Fixed types in threejs template after dependency bump.
feat(cli): paginate world deploy logs (#3217) (opens in a new tab) (@latticexyz/cli)
When deploying to an existing world, the deployer now paginates with fetchLogs
(opens in a new tab) to find the world deployment.
feat(cli): paginate world deploy logs (#3217) (opens in a new tab) (@latticexyz/block-logs-stream)
- For block range size errors,
fetchLogs
now reduces the max block range for subsequent requests in its loop. For block out of range or response size errors, only the current request's block range is reduced until the request succeeds, then it resets to the max block range. - Added
fetchBlockLogs
to find all matching logs of the given block range, grouped by block number, in a single async call. - Loosened the
publicClient
type and switched to tree shakable actions.
fix(cli): wait for world init before transferring ownership (#3220) (opens in a new tab) (@latticexyz/cli)
If the project is using a custom world, the deployer now waits for the init transaction to be confirmed before transferring ownership of the world.
Version 2.2.7
Release date: Fri Sep 20 2024
Patch changes
feat(cli): quieter automine (#3212) (opens in a new tab) (@latticexyz/cli)
Reduced the log noise from enabling/disabling automine on non-Anvil chains.
fix(explorer): better observer decorator types (#3206) (opens in a new tab) (@latticexyz/explorer)
Fixed observer
decorator types so it can be used in more places.
feat(explorer): filterable tables selector (#3203) (opens in a new tab) (@latticexyz/explorer)
Table selector of the Explore tab now has an input for searching/filtering tables by name.
fix(store): better enumValues type (#3211) (opens in a new tab) (@latticexyz/store)
Improved config output type of enumValues
.
refactor: waitForStateChange -> waitForTransaction (#3210) (opens in a new tab) (@latticexyz/explorer)
Renamed optional waitForStateChange
param in observer()
decorator to waitForTransaction
to better align with @latticexyz/store-sync
packages.
const { waitForTransaction } = syncToZustand(...);
-observer({ waitForStateChange: waitForTransaction });
+observer({ waitForTransaction });
Version 2.2.6
Release date: Thu Sep 19 2024
Patch changes
feat(stash): release package to npm (#3184) (opens in a new tab) (@latticexyz/stash)
Added @latticexyz/stash
package, a TypeScript client state library optimized for the MUD Store data model.
It uses the MUD store config to define local tables, which support writing, reading and subscribing to table updates.
It comes with a query engine optimized for "ECS-style" queries (similar to @latticexyz/recs
) but with native support for composite keys.
You can find usage examples in the @latticexyz/stash
README.md (opens in a new tab).
This package is experimental and will have breaking changes while we refine its APIs and implementation. All of its exports are temporarily under @latticexyz/stash/internal
until we consider it stable.
fix(cli): improve performance of linked library resolution during deployment (#3197) (opens in a new tab) (@latticexyz/cli)
Significantly improved the deployment performance for large projects with public libraries by implementing a more efficient algorithm to resolve public libraries during deployment. The local deployment time on a large reference project was reduced from over 10 minutes to 4 seconds.
feat(store-sync): add syncToStash util (#3192) (opens in a new tab) (@latticexyz/store-sync)
Added a syncToStash
util to hydrate a stash
client store from MUD contract state. This is currently exported from @latticexyz/store-sync/internal
while Stash package is unstable/experimental.
import { createClient, http } from "viem";
import { anvil } from "viem/chains";
import { createStash } from "@latticexyz/stash/internal";
import { syncToStash } from "@latticexyz/store-sync/internal";
import config from "../mud.config";
const client = createClient({
chain: anvil,
transport: http(),
});
const address = "0x...";
const stash = createStash(config);
const sync = await syncToStash({ stash, client, address });
Version 2.2.5
Release date: Thu Sep 19 2024
Patch changes
fix(explorer): various fixes (#3195) (opens in a new tab) (@latticexyz/explorer)
Refactored observer
initialization to reuse bridge iframes with the same url
.
fix(explorer): various fixes (#3195) (opens in a new tab) (@latticexyz/explorer)
Fixed favicon paths and fixed a few issues where we were incorrectly redirecting based on the chain name or ID.
fix(explorer): various fixes (#3195) (opens in a new tab) (@latticexyz/explorer)
Fixed an issue where the observer
Viem client decorator required an empty object arg when no options are used.
-client.extend(observer({}));
+client.extend(observer());
Version 2.2.4
Release date: Wed Sep 18 2024
Patch changes
feat(explorer): anvil connector, connect external wallets (#3164) (opens in a new tab) (@latticexyz/explorer)
World Explorer now supports connecting external wallets.
fix(common): use latest block tag in nonce manager (#3180) (opens in a new tab) (@latticexyz/common)
To reset an account's nonce, the nonce manager uses the eth_getTransactionCount
(opens in a new tab) RPC method,
which returns the number of transactions sent from the account.
When using the pending
block tag, this includes transactions in the mempool that have not been included in a block yet.
If an account submits a transaction with a nonce higher than the next valid nonce, this transaction will stay in the mempool until the nonce gap is closed and the transactions nonce is the next valid nonce.
This means if an account has gapped transactions "stuck in the mempool", the eth_getTransactionCount
method with pending
block tag can't be used to get the next valid nonce
(since it includes the number of transactions stuck in the mempool).
Since the nonce manager only resets the nonce on reload or in case of a nonce error, using the latest
block tag by default is the safer choice to be able to recover from nonce gaps.
Note that this change may reveal more "transaction underpriced" errors than before. These errors will now be retried automatically and should go through after the next block is mined.
feat: bump wevm packages (#3178) (opens in a new tab) (@latticexyz/block-logs-stream, @latticexyz/cli, @latticexyz/common, @latticexyz/config, @latticexyz/dev-tools, @latticexyz/explorer, @latticexyz/faucet, @latticexyz/protocol-parser, @latticexyz/schema-type, @latticexyz/stash, @latticexyz/store-indexer, @latticexyz/store-sync, @latticexyz/store, @latticexyz/world, create-mud)
Bumped viem, wagmi, and abitype packages to their latest release.
MUD projects using these packages should do the same to ensure no type errors due to mismatched versions:
pnpm recursive up viem@2.21.6 wagmi@2.12.11 @wagmi/core@2.13.5 abitype@1.0.6
feat(cli): register namespace labels (#3172) (opens in a new tab) (@latticexyz/cli)
Along with table and system labels, the MUD deployer now registers namespace labels. Additionally, labels will only be registered if they differ from the underlying resource name.
feat(explorer): active chain as dynamic param (#3181) (opens in a new tab) (@latticexyz/explorer)
Added ability to connect World Explorer to Redstone and Garnet chains. The active chain is now passed as a dynamic route parameter.
feat(explorer): write observer (#3169) (opens in a new tab) (@latticexyz/explorer)
World Explorer package now exports an observer
Viem decorator that can be used to get visibility into contract writes initiated from your app. You can watch these writes stream in on the new "Observe" tab of the World Explorer.
import { createClient, publicActions, walletActions } from "viem";
import { observer } from "@latticexyz/explorer/observer";
const client = createClient({ ... })
.extend(publicActions)
.extend(walletActions)
.extend(observer());
By default, the observer
action assumes the World Explorer is running at http://localhost:13690
, but this can be customized with the explorerUrl
option.
observer({
explorerUrl: "http://localhost:4444",
});
If you want to measure the timing of transaction-to-state-change, you can also pass in a waitForStateChange
function that takes a transaction hash and returns a partial TransactionReceipt
(opens in a new tab) with blockNumber
, status
, and transactionHash
. This mirrors the waitForTransaction
function signature returned by syncTo...
helper in @latticexyz/store-sync
.
observer({
async waitForStateChange(hash) {
return await waitForTransaction(hash);
},
});
fix(world): resolve module config (#3193) (opens in a new tab) (@latticexyz/world)
Added a config resolver to add default values for modules
in the world config.
feat(store-sync): add util to fetch snapshot from indexer with SQL API (#2996) (opens in a new tab) (@latticexyz/protocol-parser, @latticexyz/store-sync)
Added store-sync
helper libraries to interact with the indexer's experimental SQL API endpoint. Documentation is available at https://mud.dev/indexer/sql (opens in a new tab).
Version 2.2.3
Release date: Tue Sep 10 2024
Patch changes
feat(cli): deploy custom world (#3131) (opens in a new tab) (@latticexyz/cli, @latticexyz/world)
MUD config now supports a deploy.customWorld
option that, when used with the CLI, will deploy the specified custom World implementation.
Custom implementations must still follow the World protocol (opens in a new tab).
If you want to extend the world with new functions or override existing registered functions, we recommend using root systems (opens in a new tab). However, there are rare cases where this may not be enough to modify the native/internal World behavior. Note that deploying a custom World opts out of the world factory, deterministic world deploys, and upgradeable implementation proxy.
import { defineWorld } from "@latticexyz/world";
export default defineWorld({
customWorld: {
// path to custom world source from project root
sourcePath: "src/CustomWorld.sol",
// custom world contract name
name: "CustomWorld",
},
});
fix(explorer): world address cli option as hex (#3155) (opens in a new tab) (@latticexyz/explorer)
Fixed an issue with --worldAddress
CLI flag being incorrectly interpreted as a number rather a hex string. Additionally, added --hostname
option for specifying the hostname on which to start the application.
feat(cli): speed up dev deploy with temporary automine during deploy (#3130) (opens in a new tab) (@latticexyz/cli)
Speed up deployment in development by temporarily enabling automine mode for the duration of the deployment.
Version 2.2.2
Release date: Tue Sep 03 2024
Patch changes
style(explorer): format account balances (#3117) (opens in a new tab) (@latticexyz/explorer)
Format account balances with comma-separated thousands and trimmed decimal places for better readability.
feat(explorer): show error message in error page (#3121) (opens in a new tab) (@latticexyz/explorer)
Added error messages to error page to facilitate easier troubleshooting.
fix(cli): add missing await (#3119) (opens in a new tab) (@latticexyz/cli)
Fixed regression in 2.2.1 where deployment of modules already installed would throw an error instead of skipping.
Version 2.2.1
Release date: Sun Sep 01 2024
Patch changes
fix(store-sync): handle TransactionReceiptNotFoundError (#3115) (opens in a new tab) (@latticexyz/store-sync)
Improved error handling of TransactionReceiptNotFoundError
in waitForTransaction
when Viem versions aren't aligned.
fix(cli): deployer should wait for prereq txs (#3113) (opens in a new tab) (@latticexyz/cli)
Deployer now waits for prerequisite transactions before continuing.
fix(common): use pending block tag in tx queue (#3073) (opens in a new tab) (@latticexyz/common)
writeContract
and sendTransaction
actions now use pending
block tag when estimating gas. This aligns with previous behavior before changes in the last version.
Version 2.2.0
Release date: Fri Aug 30 2024
Minor changes
chore(explorer): update world explorer naming (#3069) (opens in a new tab) (@latticexyz/explorer)
Initial release of the @latticexyz/explorer
package. World Explorer is a standalone tool designed to explore and manage worlds. This initial release supports local worlds, with plans to extend support to any world in the future.
Read more on how to get started or contribute in the World Explorer README (opens in a new tab).
Patch changes
fix(common): route all actions through viem client (#3071) (opens in a new tab) (@latticexyz/common)
Updated all custom Viem actions to properly call other actions via getAction
so they can be composed.
build: use shx from dev deps (#3085) (opens in a new tab) (create-mud)
Templates now use shx
to run shell commands in scripts for better Windows compatibility.
feat(world): add namespaceLabel to system config (#3057) (opens in a new tab) (@latticexyz/config, @latticexyz/store)
Fixed a few type issues with namespaceLabel
in tables and added/clarified TSDoc for config input/output objects.
fix(create-mud): update changeset package name + description (#3066) (opens in a new tab) (create-mud)
New projects created with pnpm create mud
now include the World Explorer and SQLite indexer running as additional services.
feat(world): add namespaceLabel to system config (#3057) (opens in a new tab) (@latticexyz/cli, @latticexyz/world)
Add a strongly typed namespaceLabel
to the system config output.
It corresponds to the label
of the namespace the system belongs to and can't be set manually.
feat(cli,world): register system ABI onchain (#3050) (opens in a new tab) (@latticexyz/cli)
In addition to table labels, system labels and ABIs are now registered onchain during deploy.
Version 2.1.1
Release date: Tue Aug 20 2024
Patch changes
chore: upgrade zod to latest (#3020) (opens in a new tab) (@latticexyz/cli, @latticexyz/faucet, @latticexyz/store-indexer, @latticexyz/store-sync, @latticexyz/world-modules)
Upgrade zod
to 3.23.8
to avoid issues with excessively deep type instantiations (opens in a new tab).
chore: bump viem, abitype (#3038) (opens in a new tab) (@latticexyz/block-logs-stream, @latticexyz/cli, @latticexyz/common, @latticexyz/config, @latticexyz/dev-tools, @latticexyz/faucet, @latticexyz/protocol-parser, @latticexyz/query, @latticexyz/schema-type, @latticexyz/store-indexer, @latticexyz/store-sync, @latticexyz/store, @latticexyz/world, create-mud)
Bumped viem to 2.19.8
and abitype to 1.0.5
.
MUD projects using viem or abitype should do the same to ensure no type errors due to mismatched versions:
pnpm recursive up viem@2.19.8 abitype@1.0.5
refactor(world): make AccessControl lib usable outside of world package (#3034) (opens in a new tab) (@latticexyz/world-module-metadata, @latticexyz/world-modules, @latticexyz/world)
Refactored AccessControl
library exported from @latticexyz/world
to be usable outside of the world package and updated module packages to use it.
feat(world,cli): add system deploy config (#3011) (opens in a new tab) (@latticexyz/world)
Added deploy
config options to systems in the MUD config:
disabled
to toggle deploying the system (defaults tofalse
)registerWorldFunctions
to toggle registering namespace-prefixed system functions on the world (defaults totrue
)
import { defineWorld } from "@latticexyz/world";
export default defineWorld({
systems: {
HiddenSystem: {
deploy: {
registerWorldFunctions: false,
},
},
},
});
feat(world-module-metadata): add metadata module (#3026) (opens in a new tab) (@latticexyz/cli, @latticexyz/world-module-metadata)
Added metadata module to be automatically installed during world deploy. This module allows for tagging any resource with arbitrary metadata. Internally, we'll use this to tag resources with labels onchain so that we can use labels to create a MUD project from an existing world.
refactor(common): simplify writeContract/sendTransaction actions (#3043) (opens in a new tab) (@latticexyz/common)
Refactored writeContract
and sendTransaction
actions for simplicity and better error messages.
fix(world): worldgen should read system source from root dir (#3027) (opens in a new tab) (@latticexyz/world)
Fixed an issue with worldgen when using a different rootDir
from the current working directory, where worldgen would read system source files from the wrong place.
feat(config,store,world): add namespaceLabel to table config (#3039) (opens in a new tab) (@latticexyz/config, @latticexyz/store-sync, @latticexyz/store, @latticexyz/world)
Add a strongly typed namespaceLabel
to the table config output.
It corresponds to the label
of the namespace the table belongs to and can't be set manually.
Version 2.1.0
Release date: Mon Aug 05 2024
Minor changes
docs: update resource labels changeset (#2985) (opens in a new tab) (@latticexyz/config, @latticexyz/store, @latticexyz/world)
Tables and systems in config output now include a label
property. Labels are now used throughout the codebase as a user-friendly way to reference the given resource: config keys, contract names, generated libraries, etc.
Inside namespaces
config output, keys for tables and systems and their filenames will always correspond to their labels. This should make MUD tooling more intuitive and predictable. For backwards compatibility, tables
config output still uses namespace-prefixed keys.
Labels replace the previous resource name
usage, which is truncated to bytes16
to be used as part of the resource ID and, in the future, may not always be human-readable.
These labels will soon be registered onchain so that developers can initialize a new MUD project from an existing world, generating config and interfaces with user-friendly names.
docs: update namespaces changeset (#2989) (opens in a new tab) (@latticexyz/cli, @latticexyz/store, @latticexyz/world)
MUD projects can now use multiple namespaces via a new top-level namespaces
config option.
import { defineWorld } from "@latticexyz/world";
export default defineWorld({
namespaces: {
game: {
tables: {
Player: { ... },
Position: { ... },
},
},
guilds: {
tables: {
Guild: { ... },
},
systems: {
MembershipSystem: { ... },
TreasurySystem: { ... },
},
},
},
});
Once you use the top-level namespaces
config option, your project will be in "multiple namespaces mode", which expects a source directory structure similar to the config structure: a top-level namespaces
directory with nested namespace directories that correspond to each namespace label in the config.
~/guilds
├── mud.config.ts
└── src
└── namespaces
├── game
│ └── codegen
│ └── tables
│ ├── Player.sol
│ └── Position.sol
└── guilds
├── MembershipSystem.sol
├── TreasurySystem.sol
└── codegen
└── tables
└── Guild.sol
Patch changes
fix(cli,store): don't deploy disabled tables (#2982) (opens in a new tab) (@latticexyz/store)
Disabled deploy of Hooks
table, as this was meant to be a generic, codegen-only table.
refactor(store-sync): remove remaining refs to old config (#2938) (opens in a new tab) (@latticexyz/store-sync)
Refactored package to use the new Store/World configs under the hood, removing compatibility layers and improving performance.
refactor(store-sync): remove remaining refs to old config (#2938) (opens in a new tab) (@latticexyz/store-indexer)
Updated return values to match updated types in @latticexyz/store-sync
.
refactor(world): update worldgen with namespaces output (#2974) (opens in a new tab) (@latticexyz/world)
Refactored worldgen in preparation for multiple namespaces.
chore(store-sync): simplify types (#2946) (opens in a new tab) (@latticexyz/store-sync)
Adjusted SyncToRecsOptions
type intersection to improve TypeScript performance.
refactor(cli): move off of old config (#2941) (opens in a new tab) (@latticexyz/cli)
Refactored package to use the new Store/World configs under the hood, removing compatibility layers.
Removed --srcDir
option from all commands in favor of using sourceDirectory
in the project's MUD config.
fix: preserve JsDoc on defineWorld output, bump @arktype/util (#2815) (opens in a new tab) (@latticexyz/config, @latticexyz/query, @latticexyz/store, @latticexyz/world)
Bumped @arktype/util
and moved evaluate
/satisfy
usages to its show
/satisfy
helpers.
refactor(store-sync): use config namespaces for tables (#2963) (opens in a new tab) (@latticexyz/store-sync)
Refactored syncToRecs
and syncToZustand
to use tables from config namespaces output. This is a precursor for supporting multiple namespaces.
Note for library authors: If you were using createStorageAdapter
from @latticexyz/store-sync/recs
, this helper no longer appends MUD's built-in tables from Store and World packages. This behavior was moved into syncToRecs
for consistency with syncToZustand
and makes createStorageAdapter
less opinionated.
You can achieve the previous behavior with:
import { createStorageAdapter } from "@latticexyz/store-sync/recs";
+import { mudTables } from "@latticexyz/store-sync";
createStorageAdapter({
- tables,
+ tables: { ...tables, ...mudTables },
...
});
refactor(cli): move off of old config (#2941) (opens in a new tab) (@latticexyz/world)
Refactored how worldgen resolves systems from the config and filesystem.
fix(cli,store): don't deploy disabled tables (#2982) (opens in a new tab) (@latticexyz/cli)
mud deploy
will now correctly skip tables configured with deploy: { disabled: true }
.
refactor(cli): use config namespaces for tables (#2965) (opens in a new tab) (@latticexyz/cli)
Refactored CLI commands to use tables from config namespaces output. This is a precursor for supporting multiple namespaces.
fix: preserve JsDoc on defineWorld output, bump @arktype/util (#2815) (opens in a new tab) (@latticexyz/common)
Removed evaluate
and satisfy
type utils in favor of show
and satisfy
from @arktype/util
.
refactor(cli): move off of old config (#2941) (opens in a new tab) (@latticexyz/world-modules)
Moved build scripts to mud build
now that CLI doesn't depend on this package.
Removed generated world interfaces as this package isn't meant to be used as a "world", but as a set of individual modules.
refactor(store-sync): move syncToZustand to new config (#2936) (opens in a new tab) (@latticexyz/dev-tools)
Updated Zustand components after changes to syncToZustand
.
refactor(cli): remove last ethers usage (#2952) (opens in a new tab) (@latticexyz/cli)
Refactored mud trace
command to use Viem instead of Ethers and removed Ethers dependencies from the package.
refactor(store): update tablegen with namespaces output (#2972) (opens in a new tab) (@latticexyz/store)
Refactored tablegen in preparation for multiple namespaces and addressed a few edge cases:
- User types configured with a relative
filePath
are now resolved relative to the project root (where themud.config.ts
lives) rather than the current working directory. - User types inside libraries now need to be referenced with their fully-qualified code path (e.g.
LibraryName.UserTypeName
).
chore: bump glob (#2922) (opens in a new tab) (@latticexyz/abi-ts, @latticexyz/cli, @latticexyz/world-modules, @latticexyz/world, create-mud)
Bumped glob
dependency.
feat(common): throw instead of truncating namespace (#2917) (opens in a new tab) (@latticexyz/common)
resourceToHex
will now throw if provided namespace is >14 characters. Since namespaces are used to determine access control, it's not safe to automatically truncate to fit into bytes14
as that may change the indended namespace for resource access.
refactor(store,world): simplify table shorthands (#2969) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
Refactored how the config handles shorthand table definitions, greatly simplifying the codebase. This will make it easier to add support for multiple namespaces.
Version 2.0.12
Release date: Fri May 31 2024
Patch changes
feat(store,world): add option to codegen tables into namespace dirs (#2840) (opens in a new tab) (@latticexyz/store)
Internal tablegen
function (exported from @latticexyz/store/codegen
) now expects an object of options with a configPath
to use as a base path to resolve other relative paths from.
feat(store,world): add option to codegen tables into namespace dirs (#2840) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
Added sourceDirectory
as a top-level config option for specifying contracts source (i.e. Solidity) directory relative to the MUD config. This is used to resolve other paths in the config, like codegen and user types. Like foundry.toml
, this defaults to src
and should be kept in sync with foundry.toml
.
Also added a codegen.namespaceDirectories
option to organize codegen output (table libraries, etc.) into directories by namespace. For example, a Counter
table in the app
namespace will have codegen at codegen/app/tables/Counter.sol
. If not set, defaults to true
when using top-level namespaces
key, false
otherwise.
fix(cli,world): resolve table by just name (#2850) (opens in a new tab) (@latticexyz/cli, @latticexyz/world)
Fixed resolveTableId
usage within config's module args
to allow referencing both namespaced tables (e.g. resolveTableId("app_Tasks")
) as well as tables by just their name (e.g. resolveTableId("Tasks")
). Note that using just the table name requires it to be unique among all tables within the config.
This helper is now exported from @latticexyz/world
package as intended. The previous, deprecated export has been removed.
-import { resolveTableId } from "@latticexyz/config/library";
+import { resolveTableId } from "@latticexyz/world/internal";
fix(world-modules): register total supply table in erc20 module (#2877) (opens in a new tab) (@latticexyz/world-modules)
Fixed ERC20Module
to register the TotalSupply
table when creating a new token.
If you've deployed a world with the ERC20Module
, we recommend patching your world to register this table so that indexers can properly decode its record. You can do so with a simple Forge script:
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.24;
import { Script } from "forge-std/Script.sol";
import { StoreSwitch } from "@latticexyz/store/src/StoreSwitch.sol";
import { TotalSupply } from "@latticexyz/world-modules/src/modules/erc20-puppet/tables/TotalSupply.sol";
import { _totalSupplyTableId } from "@latticexyz/world-modules/src/modules/erc20-puppet/utils.sol";
contract RegisterTotalSupply is Script {
function run(address worldAddress, string memory namespaceString) external {
bytes14 namespace = bytes14(bytes(namespaceString));
StoreSwitch.setStoreAddress(worldAddress);
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
vm.startBroadcast(deployerPrivateKey);
TotalSupply.register(_totalSupplyTableId(namespace));
vm.stopBroadcast();
}
}
Then execute the transactions by running the following forge script
(opens in a new tab) command:
forge script ./script/RegisterTotalSupply.s.sol --sig "run(address,string)" $WORLD_ADDRESS $NAMESPACE_STRING
feat(common): export base tsconfig (#2873) (opens in a new tab) (@latticexyz/abi-ts, @latticexyz/block-logs-stream, @latticexyz/cli, @latticexyz/common, @latticexyz/config, @latticexyz/dev-tools, @latticexyz/faucet, @latticexyz/gas-report, @latticexyz/protocol-parser, @latticexyz/query, @latticexyz/react, @latticexyz/recs, @latticexyz/schema-type, @latticexyz/store-indexer, @latticexyz/store-sync, @latticexyz/store, @latticexyz/utils, @latticexyz/world-modules, @latticexyz/world, create-mud, solhint-config-mud, solhint-plugin-mud)
TS source has been removed from published packages in favor of DTS in an effort to improve TS performance. All packages now inherit from a base TS config in @latticexyz/common
to allow us to continue iterating on TS performance without requiring changes in your project code.
If you have a MUD project that you're upgrading, we suggest adding a tsconfig.json
file to your project workspace that extends this base config.
pnpm add -D @latticexyz/common
echo "{\n \"extends\": \"@latticexyz/common/tsconfig.base.json\"\n}" > tsconfig.json
Then in each package of your project, inherit from your workspace root's config.
For example, your TS config in packages/contracts/tsconfig.json
might look like:
{
"extends": "../../tsconfig.json"
}
And your TS config in packages/client/tsconfig.json
might look like:
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"types": ["vite/client"],
"target": "ESNext",
"lib": ["ESNext", "DOM"],
"jsx": "react-jsx",
"jsxImportSource": "react"
},
"include": ["src"]
}
You may need to adjust the above configs to include any additional TS options you've set. This config pattern may also reveal new TS errors that need to be fixed or rules disabled.
If you want to keep your existing TS configs, we recommend at least updating your moduleResolution
setting.
-"moduleResolution": "node"
+"moduleResolution": "Bundler"
feat(create-mud): clean up template scripts, add garnet/redstone (#2839) (opens in a new tab) (create-mud)
Removed unnecessary build step in scripts and added deploy scripts for Redstone and Garnet chains.
Version 2.0.11
Release date: Wed May 15 2024
Patch changes
build: bump to node 18.20.2, pnpm 9.1.1 (#2831) (opens in a new tab) (create-mud)
Added pnpm 9 to project's engines
.
fix(cli): fixed module artifactPath imports (#2832) (opens in a new tab) (@latticexyz/cli)
Fixed imports of module artifacts via artifactPath
and removed unused @latticexyz/world-modules
dependency.
Version 2.0.10
Release date: Tue May 14 2024
Patch changes
fix(cli): function selector lookup during deploy (#2800) (opens in a new tab) (@latticexyz/cli)
The deploy CLI now uses logs to find registered function selectors and their corresponding function signatures.
Previously only function signatures were fetched via logs and then mapped to function selectors via getRecord
calls,
but this approach failed for namespaced function selectors of non-root system,
because the function signature table includes both the namespaced and non-namespaced signature but the function selector table only includes the namespaced selector that is registered on the world.
feat(cli): deploy with external modules (#2803) (opens in a new tab) (@latticexyz/cli, @latticexyz/world)
Worlds can now be deployed with external modules, defined by a module's artifactPath
in your MUD config, resolved with Node's module resolution. This allows for modules to be published to and imported from npm.
defineWorld({
// …
modules: [
{
- name: "KeysWithValueModule",
+ artifactPath: "@latticexyz/world-modules/out/KeysWithValueModule.sol/KeysWithValueModule.json",
root: true,
args: [resolveTableId("Inventory")],
},
],
});
Note that the above assumes @latticexyz/world-modules
is included as a dependency of your project.
chore: upgrade to ejs 3.1.10 (#2786) (opens in a new tab) (@latticexyz/world-modules, @latticexyz/store, @latticexyz/cli)
Removed the unused ejs
dependency.
docs: fix create-mud package name in changeset (#2825) (opens in a new tab) (create-mud)
Templates now use an app
namespace by default, instead of the root namespace. This helps keep the root namespace clear for intentionally root-level things and avoids pitfalls with root systems calling other root systems.
chore: upgrade to ejs 3.1.10 (#2786) (opens in a new tab) (@latticexyz/world)
Upgraded the ejs
dependency to 3.1.10.
fix(store-indexer): fix distance from follow block metric (#2791) (opens in a new tab) (@latticexyz/store-indexer)
Fixed the distance_from_follow_block
gauge to be a positive number if the latest processed block is lagging behind the latest remote block.
fix(common): extend OP contracts, add redstone ones (#2792) (opens in a new tab) (@latticexyz/common)
Added OP predeploy contracts for Redstone and Garnet chain configs and added chain-specific contracts for Redstone chain config.
chore: remove cli faucet command and services package (#2811) (opens in a new tab) (@latticexyz/cli)
Removed broken mud faucet
command.
fix(world): config uses readonly arrays (#2805) (opens in a new tab) (@latticexyz/world)
Updated World config types to use readonly arrays.
docs(store-sync): add changeset for #2808 (#2809) (opens in a new tab) (@latticexyz/store-sync)
Both encodeEntity
and decodeEntity
now use an LRU cache to avoid repeating work during iterations of thousands of entities.
fix(store,world): throw on unexpected config keys (#2797) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
defineStore
and defineWorld
will now throw a type error if an unexpected config option is used.
chore: remove cli faucet command and services package (#2811) (opens in a new tab) (create-mud)
Removed usages of old testnet faucet in templates. The previous testnet faucet is broken, deprecated, and going offline soon. We'll be replacing the burner account pattern with something better very soon!
chore: bump zod (#2804) (opens in a new tab) (@latticexyz/cli, @latticexyz/config, @latticexyz/faucet, @latticexyz/store-indexer, @latticexyz/store-sync, @latticexyz/store, @latticexyz/world-modules, @latticexyz/world)
Bumped zod dependency to comply with abitype peer dependencies.
feat(store,world): usable enum values from config (#2807) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
defineStore
and defineWorld
now maps your enums
to usable, strongly-typed enums on enumValues
.
const config = defineStore({
enums: {
TerrainType: ["Water", "Grass", "Sand"],
},
});
config.enumValues.TerrainType.Water;
// ^? (property) Water: 0
config.enumValues.TerrainType.Grass;
// ^? (property) Grass: 1
This allows for easier referencing of enum values (i.e. uint8
equivalent) in contract calls.
writeContract({
// …
functionName: "setTerrainType",
args: [config.enumValues.TerrainType.Grass],
});
Version 2.0.9
Release date: Wed May 01 2024
Patch changes
fix(cli): do not require PRIVATE_KEY
if using KMS (#2765) (opens in a new tab) (@latticexyz/cli)
Fixed mud deploy
to not require the PRIVATE_KEY
environment variable when using a KMS signer.
feat(create-mud): redstone and garnet chains (#2776) (opens in a new tab) (create-mud)
Updated templates with Redstone and Garnet chains and removed the deprecated Lattice testnet chain.
feat(store-indexer): add metric for distance from block tag to follow (#2763) (opens in a new tab) (@latticexyz/store-indexer)
Added a distance_from_follow_block
metric to compare the latest stored block number with the block number corresponding to the block tag the indexer follows.
feat(cli): blockscout is default verifier (#2775) (opens in a new tab) (@latticexyz/cli)
mud verify
now defaults to blockscout if no --verifier
is provided.
fix(cli): run postdeploy with aws flag when kms is enabled (#2766) (opens in a new tab) (@latticexyz/cli)
Fixed mud deploy
to use the forge script --aws
flag when executing PostDeploy
with a KMS signer.
Note that you may need to update your PostDeploy.s.sol
script, with vm.startBroadcast
receiving no arguments instead of reading a private key from the environment:
-uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
-vm.startBroadcast(deployerPrivateKey);
+vm.startBroadcast();
feat(common): add indexer URL to chain configs (#2771) (opens in a new tab) (@latticexyz/store-sync)
Updated createStoreSync
to default to the chain's indexer URL when no indexerUrl
is passed in. To intentionally unset the value and not use the indexer at all, indexerUrl
can now also be false
.
fix(cli): remove postdeploy gas setting in favor of script options (#2756) (opens in a new tab) (@latticexyz/cli)
Removed manual gas setting in PostDeploy step of mud deploy
in favor of forge script
fetching it from the RPC.
If you still want to manually set gas, you can use mud deploy --forgeScriptOptions="--with-gas-price 1000000"
.
refactor(common,cli): kms deployer gets keyId from environment (#2760) (opens in a new tab) (@latticexyz/cli)
The key ID for deploying via KMS signer is now set via an AWS_KMS_KEY_ID
environment variable to better align with Foundry tooling. To enable KMS signing with this environment variable, use the --kms
flag.
-mud deploy --awsKmsKeyId [key ID]
+AWS_KMS_KEY_ID=[key ID] mud deploy --kms
feat(common): add indexer URL to chain configs (#2771) (opens in a new tab) (@latticexyz/common)
Added an optional indexerUrl
property to MUDChain
, and populated it in the Redstone and Garnet chain configs.
feat(common): add chain icons (#2778) (opens in a new tab) (@latticexyz/common)
Added chain icons to Redstone and Garnet chain configs via chain.iconUrls
.
Version 2.0.8
Release date: Sat Apr 27 2024
Patch changes
fix(store-indexer): allow empty env variable (#2746) (opens in a new tab) (@latticexyz/store-indexer)
Added support for an empty STORE_ADDRESS=
environment variable.
This previously would fail the input validation, now it behaves the same way as not setting the STORE_ADDRESS
variable at all.
fix(cli): fix verify with sourcify for dependencies (#2750) (opens in a new tab) (@latticexyz/cli)
Patched mud verify
to properly verify store, world, and world-modules contracts. Currently only sourcify
is fully supported and is the default verifier.
feat(common): add redstone chain config (#2749) (opens in a new tab) (@latticexyz/common)
Added Garnet testnet and Redstone mainnet chain configs and deprecated Lattice Testnet.
import { garnet, redstone } from "@latticexyz/common/chains";
Version 2.0.7
Release date: Thu Apr 25 2024
Patch changes
feat(store-indexer): add prometheus metrics (#2739) (opens in a new tab) (@latticexyz/store-indexer)
Add Prometheus metrics at /metrics
to the Postgres indexer backend and frontend, as well as the SQLite indexer.
fix(common): use feeRef for sendTransaction calls (#2725) (opens in a new tab) (@latticexyz/common)
Added asynchronous polling for current fees to sendTransaction
.
fix(block-logs-stream): handle proxyd errors (#2726) (opens in a new tab) (@latticexyz/block-logs-stream)
Added detection and handling for proxyd rate limit and block range errors.
feat(cli): deploy with kms (#2704) (opens in a new tab) (@latticexyz/cli)
Added a --awsKmsKeyId
flag to mud deploy
that deploys the world using an AWS KMS key as a transaction signer.
fix(store-sync): await fetchAndStoreLogs (#2702) (opens in a new tab) (@latticexyz/store-sync)
Partially revert #2665 (opens in a new tab) to guarantee logs are stored in order.
fix(cli): add retry to getLogs when getting resource ID's (#2709) (opens in a new tab) (@latticexyz/cli)
Deploying now retries on "block is out of range" errors, for cases where the RPC is load balanced and out of sync.
feat(cli): manually fetch gas price from rpc before PostDeploy runs (#2638) (opens in a new tab) (@latticexyz/cli)
Deploy will now fetch and set the gas price during execution of PostDeploy script. This should greatly reduce the fees paid for L2s.
fix(world-modules): properly concat baseURI and tokenURI in ERC721 module (#2686) (opens in a new tab) (@latticexyz/world-modules)
Fixed ERC721 module to properly encode token ID as part of token URI.
feat(cli): verify command (#2662) (opens in a new tab) (@latticexyz/cli)
Added a new mud verify
command which verifies all contracts in a project. This includes systems, modules, the WorldFactory and World.
fix(common): kms correctly serializes transactions (#2721) (opens in a new tab) (@latticexyz/common)
Added kmsKeyToAccount
, a viem custom account (opens in a new tab) that signs transactions using AWS KMS.
To use it, you must first install @aws-sdk/client-kms@3.x
and asn1.js@5.x
dependencies into your project. Then create a KMS account with:
import { kmsKeyToAccount } from "@latticexyz/common/kms";
const account = kmsKeyToAccount({ keyId: ... });
By default, a KMSClient
will be created, but you can also pass one in via the client
option. The default KMS client will use your environment's AWS SDK configuration (opens in a new tab).
fix(cli): fix deployer warning (#2683) (opens in a new tab) (@latticexyz/cli)
Fixed an issue where deploys were warning about mismatched bytecode when the bytecode was correct and what we expect.
fix(create-mud): make worlds.json address type more specific (#2685) (opens in a new tab) (create-mud)
Made worlds.json
's address
type more like viem's Hex
type so it's easy to pass through as an argument.
refactor(world,cli): rename useProxy
to upgradeableWorldImplementation
(#2732) (opens in a new tab) (@latticexyz/world, @latticexyz/cli)
Added a deploy.upgradeableWorldImplementation
option to the MUD config that deploys the World as an upgradeable proxy contract. The proxy behaves like a regular World contract, but the underlying implementation can be upgraded by calling setImplementation
.
fix(store): enforce unique table names across types (#2736) (opens in a new tab) (@latticexyz/store)
Added a check to registerTable
that prevents registering both an offchain and onchain table with the same name, making it easier to use human-readable names in indexers.
feat(world-modules): string systemId in callWithSignature
typehash (#2700) (opens in a new tab) (@latticexyz/world-modules, @latticexyz/world)
Replaced the systemId
field in the Unstable_CallWithSignatureSystem
typehash with individual systemNamespace
and systemName
string fields.
feat(cli): add user-specified PostDeploy forge options (#2703) (opens in a new tab) (@latticexyz/cli)
Added a --forgeScriptOptions
flag to deploy and dev commands to allow passing in additional CLI flags to forge script
command.
fix(common): make Resource
type props readonly (#2516) (opens in a new tab) (@latticexyz/common)
Resource
type props are now readonly.
Version 2.0.6
Release date: Wed Apr 17 2024
Patch changes
feat(store-indexer): add cache headers (#2669) (opens in a new tab) (@latticexyz/store-indexer)
Added Cache-Control
and Content-Type
headers to the postgres indexer API.
fix(common): latency improvements (#2641) (opens in a new tab) (@latticexyz/common)
Reduced the number of RPC requests before sending a transaction in the transactionQueue
viem decorator.
fix(store,world): fix StoreRead.getDynamicFieldLength (#2680) (opens in a new tab) (@latticexyz/store)
Patched StoreRead.getDynamicFieldLength
to properly read StoreCore.getDynamicFieldLength
.
Previously StoreRead.getDynamicFieldLength
incorrectly read from StoreCore.getFieldLength
, which expected a fieldIndex
instead of a dynamicFieldIndex
, and thereby returned an invalid result if the table had both static and dynamic fields (in which case fieldIndex
!= dynamicFieldIndex
). StoreRead
is used for external reads from the Store
/World
contract, so this bug only materialized in external table reads (ie from Systems
outside the root namespace) of the dynamic length of a field in a table with both static and dynamic fields.
feat(world-modules): callWithSignature chain id is salt (#2648) (opens in a new tab) (@latticexyz/world-modules)
Moved the chain ID in CallWithSignature
from the domain.chainId
to the domain.salt
field to allow for cross-chain signing without requiring wallets to switch networks. The value of this field should be the chain on which the world lives, rather than the chain the wallet is connected to.
refactor(store,world): refactor types, remove redundant casts (#2555) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
Internal type improvements.
chore: bump viem to 2.9.20 (#2681) (opens in a new tab) (@latticexyz/block-logs-stream, @latticexyz/cli, @latticexyz/common, @latticexyz/config, @latticexyz/dev-tools, @latticexyz/faucet, @latticexyz/protocol-parser, @latticexyz/query, @latticexyz/schema-type, @latticexyz/store-indexer, @latticexyz/store-sync, @latticexyz/store, @latticexyz/world, create-mud)
Bumped viem to 2.9.20.
docs: add changeset for #2645 (#2647) (opens in a new tab) (create-mud, @latticexyz/block-logs-stream, @latticexyz/protocol-parser, @latticexyz/store-indexer, @latticexyz/schema-type, @latticexyz/store-sync, @latticexyz/dev-tools, @latticexyz/common, @latticexyz/config, @latticexyz/faucet, @latticexyz/query, @latticexyz/store, @latticexyz/world, @latticexyz/cli)
Bumped viem to 2.9.16.
docs: add changeset for devtools top up (#2658) (opens in a new tab) (@latticexyz/dev-tools)
Added a "top up" button to account balance when running on anvil.
fix(store-sync): reduce latency in waitForTransaction (#2665) (opens in a new tab) (@latticexyz/store-sync)
Small optimizations in waitForTransaction
to parallelize network requests.
feat(store-sync): add status and block number to return type of waitForTransaction (#2668) (opens in a new tab) (@latticexyz/store-sync)
waitForTransaction
now returns a Promise<{ blockNumber: bigint, status: "success" | "reverted" }>
instead of Promise<void>
, to allow consumers to react to reverted transactions without refetching the transaction receipt.
Version 2.0.5
Release date: Fri Apr 12 2024
Patch changes
fix(world-modules): add missing interfaces (#2605) (opens in a new tab) (@latticexyz/world-modules)
Added missing system interfaces for ERC721, UniqueEntity, and CallWithSignature modules.
fix(common): pass through rest of nonce manager opts (#2616) (opens in a new tab) (@latticexyz/common)
Fixed getNonceManager
to correctly pass all options to createNonceManager
.
feat(world-modules): add validateCallWithSignature
to Unstable_CallWithSignatureModule
(#2614) (opens in a new tab) (@latticexyz/world-modules)
Added validateCallWithSignature
function to Unstable_CallWithSignatureModule
to validate a signature without executing the call.
fix(world-modules): explicitly export mud config (#2598) (opens in a new tab) (@latticexyz/world-modules)
Exported mud config as internal.
feat(create-mud): change anvil
to create a block every two seconds (#2635) (opens in a new tab) (create-mud)
Updated anvil
args with two second block time to better reflect L2s
fix(store): return zero for uninitialised static array elements (#2613) (opens in a new tab) (@latticexyz/store)
Fixed the behaviour of static arrays, so that they return zero for uninitialised values, to mirror the native Solidity behavior. Previously they reverted with Store_IndexOutOfBounds
if the index had not been set yet.
chore: changeset for callWithSignature
(#2601) (opens in a new tab) (@latticexyz/cli, @latticexyz/world-modules, @latticexyz/world)
Replaced the Unstable_DelegationWithSignatureModule
preview module with a more generalized Unstable_CallWithSignatureModule
that allows making arbitrary calls (similar to callFrom
).
This module is still marked as Unstable
, because it will be removed and included in the default World
deployment once it is audited.
Version 2.0.4
Release date: Tue Apr 02 2024
Patch changes
feat(common): allow specifying concurrency in transactionQueue (#2589) (opens in a new tab) (@latticexyz/common)
transactionQueue
now accepts a queueConcurrency
to allow adjusting the number of concurrent calls to the mempool. This defaults to 1
to ensure transactions are ordered and nonces are handled properly. Any number greater than that is likely to see nonce errors and transactions arriving out of order, but this may be an acceptable trade-off for some applications that can safely retry.
Version 2.0.3
Release date: Tue Apr 02 2024
Patch changes
feat(common,world): improvements for smart accounts (#2578) (opens in a new tab) (@latticexyz/common)
transactionQueue
decorator now accepts an optional publicClient
argument, which will be used in place of the extended viem client for making public action calls (getChainId
, getTransactionCount
, simulateContract
, call
). This helps in cases where the extended viem client is a smart account client, like in permissionless.js (opens in a new tab), where the transport is the bundler, not an RPC.
writeObserver
decorator now accepts any Client
, not just a WalletClient
.
createBurnerAccount
now returns a PrivateKeyAccount
, the more specific Account
type.
feat(common,world): improvements for smart accounts (#2578) (opens in a new tab) (@latticexyz/world)
callFrom
decorator now accepts any Client
, not just a WalletClient
. It also no longer attempts to wrap/redirect calls to call
, callFrom
, and registerDelegationWithSignature
.
Version 2.0.2
Release date: Mon Apr 01 2024
Patch changes
feat(world-modules): register delegation with signature (#2480) (opens in a new tab) (@latticexyz/cli, @latticexyz/world-modules, @latticexyz/world)
Added a new preview module, Unstable_DelegationWithSignatureModule
, which allows registering delegations with a signature.
Note: this module is marked as Unstable
, because it will be removed and included in the default World
deployment once it is audited.
chore: threejs template changeset (#2529) (opens in a new tab) (create-mud)
Changed the controls in the threejs
template from arrow keys to WASD and added text to explain what the app does.
docs: clarify callFrom
changelog (#2579) (opens in a new tab) (@latticexyz/world)
Added a viem client decorator for account delegation. By extending viem clients with this function after delegation, the delegation is automatically applied to World contract writes. This means that these writes are made on behalf of the delegator. Internally, it transforms the write arguments to use callFrom
.
This is an internal feature and is not ready for stable consumption yet, so it's not yet exported. Its API may change.
When using with a viem public client, system function selectors will be fetched from the world:
walletClient.extend(
callFrom({
worldAddress,
delegatorAddress,
publicClient,
}),
);
Alternatively, a worldFunctionToSystemFunction
handler can be passed in that will translate between world function selectors and system function selectors for cases where you want to provide your own behavior or use data already cached in e.g. Zustand or RECS.
walletClient.extend(
callFrom({
worldAddress,
delegatorAddress,
worldFunctionToSystemFunction: async (worldFunctionSelector) => {
const systemFunction = useStore.getState().getValue(tables.FunctionSelectors, { worldFunctionSelector })!;
return {
systemId: systemFunction.systemId,
systemFunctionSelector: systemFunction.systemFunctionSelector,
};
},
}),
);
refactor(cli): remove forge cache workaround (#2576) (opens in a new tab) (@latticexyz/cli)
Remove workaround for generating IWorld
interface from cached forge files as this was fixed by forge.
fix(create-mud): run anvil in its own process (#2538) (opens in a new tab) (create-mud)
Templates now run anvil in its own process (via mprocs) for better visibility into anvil logs.
Version 2.0.1
Release date: Thu Mar 21 2024
Patch changes
fix(store,world): minor config validation fixes (#2517) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
Minor fixes to config input validations:
systems.openAccess
incorrectly expectedtrue
as the only valid input. It now allowsboolean
.- The config complained if parts of it were defined
as const
outside the config input. This is now possible. - Shorthand inputs are now enabled.
Version 2.0.0
Release date: Thu Mar 21 2024
Version 2.0.0-next.18
Release date: Thu Mar 21 2024
Major changes
docs: add store/world config changesets (#2497) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
Store and World configs have been rebuilt with strong types. The shape of these configs have also changed slightly for clarity, the biggest change of which is merging of keySchema
and valueSchema
into a single schema
with a separate key
for a table's primary key.
To migrate, first update the imported config method:
-import { mudConfig } from "@latticexyz/world/register";
+import { defineWorld } from "@latticexyz/world";
-export default mudConfig({
+export default defineWorld({
Note that if you are only using Store, you will need to import defineStore
from @latticexyz/store
.
Then migrate the table key by renaming keySchema
to schema
and define the table key
with each field name from your key schema:
export default defineWorld({
tables: {
Position: {
- keySchema: {
+ schema: {
player: "address",
},
valueSchema: {
x: "int32",
y: "int32",
},
+ key: ['player'],
},
},
});
Now we can merge the valueSchema
into schema
.
export default defineWorld({
tables: {
Position: {
schema: {
player: "address",
- },
- valueSchema: {
x: "int32",
y: "int32",
},
key: ['player'],
},
},
});
If you previously used the table config shorthand without the full keySchema
and valueSchema
, some of the defaults have changed. Shorthands now use an id: "bytes32"
field by default rather than key: "bytes32"
and corresponding key: ["id"]
. To keep previous behavior, you may have to manually define your schema
with the previous key
and value
fields.
export default defineWorld({
tables: {
- OwnedBy: "address",
+ OwnedBy: {
+ schema: {
+ key: "bytes32",
+ value: "address",
+ },
+ key: ["key"],
+ },
},
});
Singleton tables are defined similarly, where an empty key
rather than keySchema
is provided:
-keySchema: {}
+key: []
Offchain tables are now defined as a table type
instead an offchainOnly
boolean:
-offchainOnly: true
+type: 'offchainTable'
All codegen options have moved under codegen
:
export default defineWorld({
- codegenDirectory: "…",
+ codegen: {
+ outputDirectory: "…",
+ },
tables: {
Position: {
schema: {
player: "address",
x: "int32",
y: "int32",
},
key: ['player'],
- directory: "…",
- dataStruct: false,
+ codegen: {
+ outputDirectory: "…",
+ dataStruct: false,
+ },
},
},
});
refactor: move table ID and field layout constants into table library (#2327) (opens in a new tab) (create-mud, @latticexyz/cli, @latticexyz/common, @latticexyz/store, @latticexyz/world, @latticexyz/world-modules)
Moved table ID and field layout constants in code-generated table libraries from the file level into the library, for clearer access and cleaner imports.
-import { SomeTable, SomeTableTableId } from "./codegen/tables/SomeTable.sol";
+import { SomeTable } from "./codegen/tables/SomeTable.sol";
-console.log(SomeTableTableId);
+console.log(SomeTable._tableId);
-console.log(SomeTable.getFieldLayout());
+console.log(SomeTable._fieldLayout);
feat(store,world): set protocol version, add tests (#2412) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
Set the protocol version to 2.0.0
for each Store and World.
refactor(schema-type,protocol-parser): explicit internal vs external exports (#2452) (opens in a new tab) (@latticexyz/protocol-parser, @latticexyz/schema-type)
Moved all existing exports to a /internal
import path to indicate that these are now internal-only and deprecated. We'll be replacing these types and functions with new ones that are compatible with our new, strongly-typed config.
feat(store): add field index to Store_SpliceDynamicData event (#2279) (opens in a new tab) (@latticexyz/store, @latticexyz/store-sync)
Added dynamicFieldIndex
to the Store_SpliceDynamicData
event. This enables indexers to store dynamic data as a blob per dynamic field without a schema lookup.
refactor: rename PackedCounter to EncodedLengths (#2490) (opens in a new tab) (@latticexyz/cli, @latticexyz/protocol-parser, @latticexyz/store, @latticexyz/world-modules, @latticexyz/world, create-mud)
Renamed PackedCounter
to EncodedLengths
for consistency.
feat(store-sync): adjust DB schema/table names for consistency (#2379) (opens in a new tab) (@latticexyz/store-indexer, @latticexyz/store-sync)
PostgreSQL sync/indexer now uses {storeAddress}
for its database schema names and {namespace}__{tableName}
for its database table names (or just {tableName}
for root namespace), to be more consistent with the rest of the MUD codebase.
For namespaced tables:
- SELECT * FROM 0xfff__some_ns.some_table
+ SELECT * FROM 0xfff.some_ns__some_table
For root tables:
- SELECT * FROM 0xfff__.some_table
+ SELECT * FROM 0xfff.some_table
SQLite sync/indexer now uses snake case for its table names and column names for easier writing of queries and to better match PostgreSQL sync/indexer naming.
- SELECT * FROM 0xfFf__someNS__someTable
+ SELECT * FROM 0xfff__some_ns__some_table
feat: use new config (#2483) (opens in a new tab) (@latticexyz/cli, @latticexyz/dev-tools, @latticexyz/store-sync, @latticexyz/store, @latticexyz/world-modules, @latticexyz/world, create-mud)
Migrated to new config format.
Minor changes
feat(cli): add a RPC batch option to cli (#2322) (opens in a new tab) (@latticexyz/cli)
Added an --rpcBatch
option to mud deploy
command to batch RPC calls for rate limited RPCs.
feat(store-sync,store-indexer): add followBlockTag option (#2315) (opens in a new tab) (@latticexyz/store-indexer, @latticexyz/store-sync)
Added a followBlockTag
option to configure which block number to follow when running createStoreSync
. It defaults to latest
(current behavior), which is recommended for individual clients so that you always have the latest chain state.
Indexers now default to safe
to avoid issues with reorgs and load-balanced RPCs being out of sync. This means indexers will be slightly behind the latest block number, but clients can quickly catch up. Indexers can override this setting using FOLLOW_BLOCK_TAG
environment variable.
refactor(world): registerRootFunctionSelector takes system signature (#2395) (opens in a new tab) (@latticexyz/world)
registerRootFunctionSelector
now expects a systemFunctionSignature
instead of a systemFunctionSelector
. Internally, we compute the selector from the signature. This allows us to track system function signatures that are registered at the root so we can later generate ABIs for these systems.
feat(common): add viem actions that work the same as the current wrappers (#2347) (opens in a new tab) (@latticexyz/common, create-mud)
Added viem custom client actions that work the same as MUD's now-deprecated getContract
, writeContract
, and sendTransaction
wrappers. Templates have been updated to reflect the new patterns.
You can migrate your own code like this:
-import { createWalletClient } from "viem";
-import { getContract, writeContract, sendTransaction } from "@latticexyz/common";
+import { createWalletClient, getContract } from "viem";
+import { transactionQueue, writeObserver } from "@latticexyz/common/actions";
-const walletClient = createWalletClient(...);
+const walletClient = createWalletClient(...)
+ .extend(transactionQueue())
+ .extend(writeObserver({ onWrite });
const worldContract = getContract({
client: { publicClient, walletClient },
- onWrite,
});
refactor(store): add StoreWrite and Store abstract contracts (#2411) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
Added an abstract
StoreKernel
contract, which includes all Store interfaces except for registration, and implements write methods, protocolVersion
and initializes StoreCore
. Store
extends StoreKernel
with the IStoreRegistration
interface. StoreData
is removed as a separate interface/contract. World
now extends StoreKernel
(since the registration methods are added via the InitModule
).
refactor(store): make static array length a constant (#2410) (opens in a new tab) (@latticexyz/store)
Replaced the static array length getters in table libraries with constants.
feat(gas-report): run gas report with --isolate (#2331) (opens in a new tab) (@latticexyz/gas-report)
Now uses --isolate
flag in forge test
for more accurate gas measurement.
feat(cli): link and deploy public libraries (#1910) (opens in a new tab) (@latticexyz/cli)
mud deploy
now supports public/linked libraries.
This helps with cases where system contracts would exceed the EVM bytecode size limit and logic would need to be split into many smaller systems.
Instead of the overhead and complexity of system-to-system calls, this logic can now be moved into public libraries that will be deployed alongside your systems and automatically delegatecall
ed.
refactor: hardcode key/value schema in table libraries (#2328) (opens in a new tab) (create-mud, @latticexyz/store, @latticexyz/world, @latticexyz/world-modules)
Moved key schema and value schema methods to constants in code-generated table libraries for less bytecode and less gas in register/install methods.
-console.log(SomeTable.getKeySchema());
+console.log(SomeTable._keySchema);
-console.log(SomeTable.getValueSchema());
+console.log(SomeTable._valueSchema);
feat: upgrade viem to v2 (#2284) (opens in a new tab) (@latticexyz/block-logs-stream, @latticexyz/cli, @latticexyz/common, @latticexyz/config, @latticexyz/dev-tools, @latticexyz/faucet, @latticexyz/protocol-parser, @latticexyz/schema-type, @latticexyz/store-indexer, @latticexyz/store-sync, @latticexyz/store, @latticexyz/world, create-mud)
Upgraded all packages and templates to viem v2.7.12 and abitype v1.0.0.
Some viem APIs have changed and we've updated getContract
to reflect those changes and keep it aligned with viem. It's one small code change:
const worldContract = getContract({
address: worldAddress,
abi: IWorldAbi,
- publicClient,
- walletClient,
+ client: { public: publicClient, wallet: walletClient },
});
Patch changes
fix(cli): throw error when deploying overlapping systems (#2325) (opens in a new tab) (@latticexyz/cli, @latticexyz/world)
Attempting to deploy multiple systems where there are overlapping system IDs now throws an error.
fix(common): use setTimeout
as fallback for requestIdleCallback
(#2406) (opens in a new tab) (@latticexyz/common)
waitForIdle
now falls back to setTimeout
for environments without requestIdleCallback
.
refactor: human-readable resource IDs use double underscore (#2310) (opens in a new tab) (@latticexyz/store-sync, @latticexyz/dev-tools, @latticexyz/common, @latticexyz/cli)
Updated all human-readable resource IDs to use {namespace}__{name}
for consistency with world function signatures.
chore: remove some unused files (#2398) (opens in a new tab) (@latticexyz/common, @latticexyz/react)
Removed some unused files, namely curry
in @latticexyz/common
and useDeprecatedComputedValue
from @latticexyz/react
.
fix(world-modules): token modules always register namespace (#2352) (opens in a new tab) (@latticexyz/world-modules)
ERC20 and ERC721 implementations now always register the token namespace, instead of checking if it has already been registered. This prevents issues with registering the namespace beforehand, namely that only the owner of a system can create a puppet for it.
refactor(store): store core imports store events (#2356) (opens in a new tab) (@latticexyz/store)
Refactored StoreCore
to import IStoreEvents
instead of defining the events twice.
feat(world): emit salt in WorldDeployed event (#2301) (opens in a new tab) (@latticexyz/world)
Added salt to the WorldDeployed
event.
chore: upgrade to typescript 5.4.2 (#2397) (opens in a new tab) (@latticexyz/cli, create-mud)
Bumped typescript
to 5.4.2
, eslint
to 8.57.0
, and both @typescript-eslint/eslint-plugin
and @typescript-eslint/parser
to 7.1.1
.
fix(common): remove underscore prefix from root namespace labels (#2400) (opens in a new tab) (@latticexyz/common)
resourceToLabel
now correctly returns just the resource name if its in the root namespace.
chore(noise): remove noise package (#2304) (opens in a new tab) (@latticexyz/noise)
Removed the @latticexyz/noise package.
refactor(store): event interfaces for Store libraries (#2348) (opens in a new tab) (@latticexyz/store)
Added interfaces for all errors that are used by StoreCore
, which includes FieldLayout
, PackedCounter
, Schema
, and Slice
. This interfaces are inherited by IStore
, ensuring that all possible errors are included in the IStore
ABI for proper decoding in the frontend.
docs: add missing changeset (#2374) (opens in a new tab) (@latticexyz/common)
Moved the transaction simulation step to just before sending the transaction in our transaction queue actions (sendTransaction
and writeContract
).
This helps avoid cascading transaction failures for deep queues or when a transaction succeeding depends on the value of the previous.
fix(store): restore bytesN helpers (#2403) (opens in a new tab) (@latticexyz/store)
Restored Bytes.sliceN
helpers that were previously (mistakenly) removed and renamed them to Bytes.getBytesN
.
If you're upgrading an existing MUD project, you can rerun codegen with mud build
to update your table libraries to the new function names.
chore: upgrade prettier to 3.2.5 and prettier-plugin-solidity to 1.3.1 (#2303) (opens in a new tab) (@latticexyz/common)
Upgraded prettier version to 3.2.5 and prettier-plugin-solidity version to 1.3.1.
feat(world): add system signatures to FunctionSignatures (#2392) (opens in a new tab) (@latticexyz/world)
Added system signatures to the FunctionSignatures
table, so they can be used to generate system ABIs and decode system calls made via the world.
fix(gas-report): update filename matcher (#2277) (opens in a new tab) (@latticexyz/gas-report)
Fixed gas report parsing for foundry versions released after 2024-02-15.
feat(create-mud): add additional recommended vscode extensions (#2440) (opens in a new tab) (create-mud)
Added dbaeumer.vscode-eslint
and esbenp.prettier-vscode
to recommended VSCode extensions.
refactor(world): add IWorldEvents with HelloWorld (#2358) (opens in a new tab) (@latticexyz/world)
Created an IWorldEvents
interface with HelloStore
, so all World events are defined in a single interface.
fix(store-sync): track changed records together in zustand (#2387) (opens in a new tab) (@latticexyz/store-sync)
Fixes an issue with Zustand store sync where multiple updates to a record for a key in the same block did not get tracked and applied properly.
refactor(store): hellostore in IStoreEvents (#2357) (opens in a new tab) (@latticexyz/store)
Moved the HelloStore
to IStoreEvents
so all Store events are defined in the same interface.
feat(world): world kernel inherits IModuleErrors
(#2380) (opens in a new tab) (@latticexyz/world)
IWorldKernel
now inherits IModuleErrors
so it can render the correct errors if the World reverts when delegatecalled with Module code.
feat(cli): deterministic deployer fallback (#2261) (opens in a new tab) (@latticexyz/cli)
Added a non-deterministic fallback for deploying to chains that have replay protection on and do not support pre-EIP-155 transactions (no chain ID).
If you're using mud deploy
and there's already a deterministic deployer (opens in a new tab) on your target chain, you can provide the address with --deployerAddress 0x...
to still get some determinism.
refactor(world): rename functionSelector to worldFunctionSelector (#2391) (opens in a new tab) (@latticexyz/world)
Renamed the functionSelector
key in the FunctionSelectors
table to worldFunctionSelector
. This clarifies that FunctionSelectors
is for world function selectors and can be used to generate the world ABI.
Version 2.0.0-next.17
Release date: Tue Feb 20 2024
Major changes
chore: upgrade to Solidity 0.8.24 (#2202) (opens in a new tab) (@latticexyz/world-modules, @latticexyz/schema-type, @latticexyz/gas-report, @latticexyz/common, @latticexyz/noise, @latticexyz/store, @latticexyz/world, @latticexyz/cli, create-mud)
Bumped Solidity version to 0.8.24.
feat(world): rename CoreModule to InitModule (#2227) (opens in a new tab) (@latticexyz/world)
Renamed CoreModule
to InitModule
and CoreRegistrationSystem
to RegistrationSystem
.
feat(cli,world): add user defined salt in WorldFactory.deployWorld() (#2219) (opens in a new tab) (@latticexyz/cli, @latticexyz/world)
WorldFactory
now expects a user-provided salt
when calling deployWorld(...)
(instead of the previous globally incrementing counter). This enables deterministic world addresses across different chains.
When using mud deploy
, you can provide a bytes32
hex-encoded salt using the --salt
option, otherwise it defaults to a random hex value.
feat(store): rename StoreCore.registerCoreTables to registerInternalTables (#2225) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
Renamed StoreCore
's registerCoreTables
method to registerInternalTables
.
Minor changes
fix(world-modules): SystemSwitch
properly calls systems from root (#2205) (opens in a new tab) (@latticexyz/world-modules)
Fixed SystemSwitch
to properly call non-root systems from root systems.
feat(store-sync): wait for idle after each chunk of logs in a block (#2254) (opens in a new tab) (@latticexyz/store-sync)
createStoreSync
now waits for idle (opens in a new tab) between each chunk of logs in a block to allow for downstream render cycles to trigger. This means that hydrating logs from an indexer will no longer block until hydration completes, but rather allow for onProgress
callbacks to trigger.
feat(world): deployment salt by msg.sender (#2210) (opens in a new tab) (@latticexyz/world)
WorldFactory
now derives a salt based on number of worlds deployed by msg.sender
, which should help with predictable world deployments across chains.
Patch changes
feat(cli): hardcode table ID with codegen (#2229) (opens in a new tab) (@latticexyz/cli, @latticexyz/common, @latticexyz/store, @latticexyz/world-modules, @latticexyz/world, create-mud)
Table libraries now hardcode the bytes32
table ID value rather than computing it in Solidity. This saves a bit of gas across all storage operations.
fix(store): reorder core table registration (#2164) (opens in a new tab) (@latticexyz/store)
Fixed a race condition when registering core tables, where we would set a record in the ResourceIds
table before the table was registered.
fix(world): check table exists for register store and system hook [L-09] (#2195) (opens in a new tab) (@latticexyz/world)
Updated WorldRegistrationSystem
to check that systems exist before registering system hooks.
fix(store-sync): fix overflowing column types, bump postgres sync version (#2270) (opens in a new tab) (@latticexyz/store-sync)
Bumped the Postgres column size for int32
, uint32
, int64
, and uint64
types to avoid overflows
feat(store-sync): bool array column types for decoded indexer (#2283) (opens in a new tab) (@latticexyz/store-sync)
Moved boolean array types to use array column types (instead of JSON columns) for the Postgres decoded indexer
docs: add missing changeset (#2282) (opens in a new tab) (@latticexyz/store-sync)
Moved numerical array types to use array column types (instead of JSON columns) for the Postgres decoded indexer
docs: changeset for #2187 (#2188) (opens in a new tab) (@latticexyz/cli)
Fixed registration of world signatures/selectors for namespaced systems. We changed these signatures in #2160 (opens in a new tab), but missed updating part of the deploy step.
fix(common): include only errors defined in the contract (#2194) (opens in a new tab) (@latticexyz/common)
Prevented errors not included in the contract (but present in the file) from being included in the interface by contractToInterface
refactor(store): push to StoreHooks with StoreCore method (#2201) (opens in a new tab) (@latticexyz/store)
Refactored StoreCore.registerStoreHook
to use StoreHooks._push
for gas efficiency.
refactor(world,world-modules): rename module args to encodedArgs (#2199) (opens in a new tab) (@latticexyz/world-modules, @latticexyz/world)
Renamed the Module args
parameter to encodedArgs
to better reflect that it is ABI-encoded arguments.
feat(world): rename CoreModule to InitModule (#2227) (opens in a new tab) (@latticexyz/cli)
Updated deployer with world's new InitModule
naming.
fix(world): prevent namespace from ending with underscore [M-05] (#2182) (opens in a new tab) (@latticexyz/world)
Added a check to prevent namespaces from ending with an underscore (which could cause problems with world function signatures).
fix(world): check table exists for register store and system hook [L-09] (#2195) (opens in a new tab) (@latticexyz/store)
Updated StoreCore
to check that tables exist before registering store hooks.
Version 2.0.0-next.16
Release date: Tue Jan 23 2024
Major changes
feat(world): remove system name from function signatures/selectors [M-05] (#2160) (opens in a new tab) (@latticexyz/world-modules, @latticexyz/world)
World function signatures for namespaced systems have changed from {namespace}_{systemName}_{functionName}
to {namespace}__{functionName}
(double underscore, no system name). This is more ergonomic and is more consistent with namespaced resources in other parts of the codebase (e.g. MUD config types, table names in the schemaful indexer).
If you have a project using the namespace
key in your mud.config.ts
or are manually registering systems and function selectors on a namespace, you will likely need to codegen your system interfaces (pnpm build
) and update any calls to these systems through the world's namespaced function signatures.
chore: add module addresses changeset (#2172) (opens in a new tab) (@latticexyz/world, @latticexyz/world-modules)
Refactored InstalledModules
to key modules by addresses instead of pre-defined names. Previously, modules could report arbitrary names, meaning misconfigured modules could be installed under a name intended for another module.
feat(world): require namespace to exist before registering systems/tables in it [C-01] (#2007) (opens in a new tab) (@latticexyz/cli, @latticexyz/world-modules, @latticexyz/world)
Previously registerSystem
and registerTable
had a side effect of registering namespaces if the system or table's namespace didn't exist yet.
This caused a possible frontrunning issue, where an attacker could detect a registerSystem
/registerTable
transaction in the mempool,
insert a registerNamespace
transaction before it, grant themselves access to the namespace, transfer ownership of the namespace to the victim,
so that the registerSystem
/registerTable
transactions still went through successfully.
To mitigate this issue, the side effect of registering a namespace in registerSystem
and registerTable
has been removed.
Calls to these functions now expect the respective namespace to exist and the caller to own the namespace, otherwise they revert.
Changes in consuming projects are only necessary if tables or systems are registered manually. If only the MUD deployer is used to register tables and systems, no changes are necessary, as the MUD deployer has been updated accordingly.
+ world.registerNamespace(namespaceId);
world.registerSystem(systemId, system, true);
+ world.registerNamespace(namespaceId);
MyTable.register();
refactor(cli,world,world-modules): split and separately deploy core systems (#2128) (opens in a new tab) (@latticexyz/cli)
Separated core systems deployment from CoreModule
, and added the systems as arguments to CoreModule
refactor(cli,world,world-modules): split and separately deploy core systems (#2128) (opens in a new tab) (@latticexyz/world)
- Split
CoreSystem
intoAccessManagementSystem
,BalanceTransferSystem
,BatchCallSystem
,CoreRegistrationSystem
- Changed
CoreModule
to receive the addresses of these systems as arguments, instead of deploying them - Replaced
CORE_SYSTEM_ID
constant withACCESS_MANAGEMENT_SYSTEM_ID
,BALANCE_TRANSFER_SYSTEM_ID
,BATCH_CALL_SYSTEM_ID
,CORE_REGISTRATION_SYSTEM_ID
, for each respective system
These changes separate the initcode of CoreModule
from the bytecode of core systems, which effectively removes a limit on the total bytecode of all core systems.
feat(world): prevent invalid namespace strings [M-05] (#2169) (opens in a new tab) (@latticexyz/world)
Namespaces are not allowed to contain double underscores ("__") anymore, as this sequence of characters is used to separate the namespace and function selector (opens in a new tab) in namespaced systems. This is to prevent signature clashes of functions in different namespaces.
(Example: If namespaces were allowed to contain this separator string, a function "function" in namespace "namespace__my" would result in the namespaced function selector "namespace__my__function", and would clash with a function "my__function" in namespace "namespace".)
fix(cli): mud set-version --link shouldn't fetch versions (#2000) (opens in a new tab) (@latticexyz/store-sync)
Postgres storage adapter now uses snake case for decoded table names and column names. This allows for better SQL ergonomics when querying these tables.
To avoid naming conflicts for now, schemas are still case-sensitive and need to be queried with double quotes. We may change this in the future with namespace validation (opens in a new tab).
Minor changes
feat(store): never allow empty FieldLayout (#2122) (opens in a new tab) (@latticexyz/store)
Removed allowEmpty
option from FieldLayout.validate()
as field layouts should never be empty.
feat(store): improve FieldLayout errors [N-03] (#2114) (opens in a new tab) (@latticexyz/store)
Improved error messages for invalid FieldLayout
s
-error FieldLayoutLib_InvalidLength(uint256 length);
+error FieldLayoutLib_TooManyFields(uint256 numFields, uint256 maxFields);
+error FieldLayoutLib_TooManyDynamicFields(uint256 numFields, uint256 maxFields);
+error FieldLayoutLib_Empty();
Patch changes
fix(store): emit event after calling beforeSetRecord hook [L-02] (#2017) (opens in a new tab) (@latticexyz/store)
Storage events are now emitted after "before" hooks, so that the resulting logs are now correctly ordered and reflect onchain logic. This resolves issues with store writes and event emissions happening in "before" hooks.
refactor(world-modules): simplify getUniqueEntity call (#2161) (opens in a new tab) (@latticexyz/world-modules)
Removed IUniqueEntitySystem
in favor of calling getUniqueEntity
via world.call
instead of the world function selector. This had a small gas improvement.
refactor(store,world): rename ambiguous elements [N-03] (#2091) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
Renamed the requireNoCallback
modifier to prohibitDirectCallback
.
refactor(world): use _getSystem when fetching system addresses [N-11] (#2022) (opens in a new tab) (@latticexyz/world)
Optimised StoreRegistrationSystem
and WorldRegistrationSystem
by fetching individual fields instead of entire records where possible.
fix(world): inline debug constants [L-11] (#1976) (opens in a new tab) (@latticexyz/world)
Removed ROOT_NAMESPACE_STRING
and ROOT_NAME_STRING
exports in favor of inlining these constants, to avoid reuse as they're meant for internal error messages and debugging.
refactor(store,world,world-modules): code suggestions [N-08] (#2140) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
Refactored various files to specify integers in a hex base instead of decimals.
fix(store): do not render push and pop for static arrays, use static length [M-02] (#2175) (opens in a new tab) (@latticexyz/store)
Updated codegen to not render push
and pop
methods for static arrays. The length
method now returns the hardcoded known length instead of calculating it like with a dynamic array.
fix(world): module supports world context consumer id [L-12] (#2032) (opens in a new tab) (@latticexyz/world)
Added the WorldContextConsumer interface ID to supportsInterface
in the Module contract.
fix(world): limit call context of CoreSystem
to delegatecall [C-02] (#2111) (opens in a new tab) (@latticexyz/world)
Systems are expected to be always called via the central World contract.
Depending on whether it is a root or non-root system, the call is performed via delegatecall
or call
.
Since Systems are expected to be stateless and only interact with the World state, it is not necessary to prevent direct calls to the systems.
However, since the CoreSystem
is known to always be registered as a root system in the World, it is always expected to be delegatecalled,
so we made this expectation explicit by reverting if it is not delegatecalled.
refactor(store,world,world-modules): code suggestions [N-08] (#2140) (opens in a new tab) (@latticexyz/world)
Made the coreModule
variable in WorldFactory
immutable.
refactor(store,world,world-modules): code suggestions [N-08] (#2140) (opens in a new tab) (@latticexyz/world)
Removed the unnecessary extcodesize
check from the Create2
library.
refactor(store,world,world-modules): code suggestions [N-08] (#2140) (opens in a new tab) (@latticexyz/world-modules, @latticexyz/store, @latticexyz/world)
Refactored ResourceId
to use a global Solidity using
statement.
refactor(store,world,world-modules): code suggestions [N-08] (#2140) (opens in a new tab) (@latticexyz/world-modules, @latticexyz/store, @latticexyz/world)
Refactored EIP165 usages to use the built-in interfaceId property instead of pre-defined constants.
fix(world): prevent initialising the world multiple times [L-05] (#2170) (opens in a new tab) (@latticexyz/world)
Added a table to track the CoreModule
address the world was initialised with.
fix(store-sync): improve syncToZustand hydration speed (#2145) (opens in a new tab) (@latticexyz/store-sync)
Improved syncToZustand
speed of hydrating from snapshot by only applying block logs once per block instead of once per log.
fix(store): revert if slice bound is invalid [L-10] (#2034) (opens in a new tab) (@latticexyz/store)
Added a custom error Store_InvalidBounds
for when the start:end
slice in getDynamicFieldSlice
is invalid (it used to revert with the default overflow error)
refactor(store): order load function arguments [N-02] (#2033) (opens in a new tab) (@latticexyz/store)
Aligned the order of function arguments in the Storage
library.
store(uint256 storagePointer, uint256 offset, bytes memory data)
store(uint256 storagePointer, uint256 offset, uint256 length, uint256 memoryPointer)
load(uint256 storagePointer, uint256 offset, uint256 length)
load(uint256 storagePointer, uint256 offset, uint256 length, uint256 memoryPointer)
fix(world): check namespace exists before balance transfer [L-03] (#2095) (opens in a new tab) (@latticexyz/world)
Namespace balances can no longer be transferred to non-existent namespaces.
fix(store): add missing FieldLayout and Schema validations [L-07] (#2046) (opens in a new tab) (@latticexyz/store)
Added more validation checks for FieldLayout
and Schema
.
fix(world): prevent misconfigured delegations, allow unregistering [L-04] (#2096) (opens in a new tab) (@latticexyz/world)
Prevented invalid delegations by performing full validation regardless of whether initCallData
is empty. Added an unregisterDelegation
function which allows explicit unregistration, as opposed of passing in zero bytes into registerDelegation
.
refactor(store,world,world-modules): code suggestions [N-08] (#2140) (opens in a new tab) (@latticexyz/world-modules, @latticexyz/store, @latticexyz/world)
Refactored various Solidity files to not explicitly initialise variables to zero.
refactor(store,world,world-modules): code suggestions [N-08] (#2140) (opens in a new tab) (@latticexyz/store)
Refactored some Store functions to use a right bit mask instead of left.
refactor(store,world,world-modules): code suggestions [N-08] (#2140) (opens in a new tab) (@latticexyz/store)
Simplified a check in Slice.getSubslice
.
refactor(store,world,world-modules): code suggestions [N-08] (#2140) (opens in a new tab) (@latticexyz/world)
Refactored WorldContext
to get the world address from WorldContextConsumerLib
instead of StoreSwitch
.
refactor(store,world,world-modules): code suggestions [N-08] (#2140) (opens in a new tab) (@latticexyz/store)
Optimised the Schema.validate
function to decrease gas use.
Version 2.0.0-next.15
Release date: Wed Jan 03 2024
Major changes
fix(store-sync,store-indexer): make last updated block number not null (#1972) (opens in a new tab) (@latticexyz/store-sync)
lastUpdatedBlockNumber
columns in Postgres storage adapters are no longer nullable
feat(store-indexer): clean database if outdated (#1984) (opens in a new tab) (@latticexyz/store-sync)
Renamed singleton chain
table to config
table for clarity.
feat(store-sync, store-indexer): order logs by logIndex (#2037) (opens in a new tab) (@latticexyz/store-indexer, @latticexyz/store-sync)
The postgres indexer is now storing the logIndex
of the last update of a record to be able to return the snapshot logs in the order they were emitted onchain.
feat(store-sync): fetch and store logs (#2003) (opens in a new tab) (@latticexyz/store-sync)
Previously, all store-sync
strategies were susceptible to a potential memory leak where the stream that fetches logs from the RPC would get ahead of the stream that stores the logs in the provided storage adapter. We saw this most often when syncing to remote Postgres servers, where inserting records was much slower than we retrieving them from the RPC. In these cases, the stream would build up a backlog of items until the machine ran out of memory.
This is now fixed by waiting for logs to be stored before fetching the next batch of logs from the RPC. To make this strategy work, we no longer return blockLogs$
(stream of logs fetched from RPC but before they're stored) and instead just return storedBlockLogs$
(stream of logs fetched from RPC after they're stored).
feat(store-sync,store-indexer): schemaless indexer (#1965) (opens in a new tab) (@latticexyz/store-sync)
syncToPostgres
from @latticexyz/store-sync/postgres
now uses a single table to store all records in their bytes form (staticData
, encodedLengths
, and dynamicData
), more closely mirroring onchain state and enabling more scalability and stability for automatic indexing of many worlds.
The previous behavior, where schemaful SQL tables are created and populated for each MUD table, has been moved to a separate @latticexyz/store-sync/postgres-decoded
export bundle. This approach is considered less stable and is intended to be used for analytics purposes rather than hydrating clients. Some previous metadata columns on these tables have been removed in favor of the bytes records table as the source of truth for onchain state.
This overhaul is considered breaking and we recommend starting a fresh database when syncing with either of these strategies.
feat(store-sync): snake case postgres names in decoded tables (#1989) (opens in a new tab) (@latticexyz/store-sync)
Postgres storage adapter now uses snake case for decoded table names and column names. This allows for better SQL ergonomics when querying these tables.
To avoid naming conflicts for now, schemas are still case-sensitive and need to be queried with double quotes. We may change this in the future with namespace validation (opens in a new tab).
Minor changes
feat(store-sync,store-indexer): sync from getLogs indexer endpoint (#1973) (opens in a new tab) (@latticexyz/store-sync)
Refactored how we fetch snapshots from an indexer, preferring the new getLogs
endpoint and falling back to the previous findAll
if it isn't available. This refactor also prepares for an easier entry point for adding client caching of snapshots.
The initialState
option for various sync methods (syncToPostgres
, syncToRecs
, etc.) is now deprecated in favor of initialBlockLogs
. For now, we'll automatically convert initialState
into initialBlockLogs
, but if you want to update your code, you can do:
import { tablesWithRecordsToLogs } from "@latticexyz/store-sync";
const initialBlockLogs = {
blockNumber: initialState.blockNumber,
logs: tablesWithRecordsToLogs(initialState.tables),
};
feat(create-mud): remove window global usage in vanilla template (#1774) (opens in a new tab) (create-mud)
Replaced usage of window
global in vanilla JS template with an event listener on the button.
feat(cli): add build command (#1990) (opens in a new tab) (@latticexyz/cli)
Added a mud build
command that generates table libraries, system interfaces, and typed ABIs.
feat(store-sync,store-indexer): schemaless indexer (#1965) (opens in a new tab) (@latticexyz/common)
Added unique
and groupBy
array helpers to @latticexyz/common/utils
.
import { unique } from "@latticexyz/common/utils";
unique([1, 2, 1, 4, 3, 2]);
// [1, 2, 4, 3]
import { groupBy } from "@latticexyz/common/utils";
const records = [
{ type: "cat", name: "Bob" },
{ type: "cat", name: "Spot" },
{ type: "dog", name: "Rover" },
];
Object.fromEntries(groupBy(records, (record) => record.type));
// {
// "cat": [{ type: "cat", name: "Bob" }, { type: "cat", name: "Spot" }],
// "dog: [{ type: "dog", name: "Rover" }]
// }
feat(store-sync,store-indexer): schemaless indexer (#1965) (opens in a new tab) (@latticexyz/store-indexer)
The findAll
method is now considered deprecated in favor of a new getLogs
method. This is only implemented in the Postgres indexer for now, with SQLite coming soon. The new getLogs
method will be an easier and more robust data source to hydrate the client and other indexers and will allow us to add streaming updates from the indexer in the near future.
For backwards compatibility, findAll
is now implemented on top of getLogs
, with record key/value decoding done in memory at request time. This may not scale for large databases, so use wisely.
feat(store-indexer): clean database if outdated (#1984) (opens in a new tab) (@latticexyz/store-indexer)
When the Postgres indexer starts up, it will now attempt to detect if the database is outdated and, if so, cleans up all MUD-related schemas and tables before proceeding.
feat(store-indexer, store-sync): improve query performance and enable compression, add new api (#2026) (opens in a new tab) (@latticexyz/common)
-
Added a
Result<Ok, Err>
type for more explicit and typesafe error handling (inspired by Rust (opens in a new tab)). -
Added a
includes
util as typesafe alternative toArray.prototype.includes()
(opens in a new tab).
docs: add changeset for zustand sync progress (#1931) (opens in a new tab) (@latticexyz/store-sync)
Added and populated syncProgress
key in Zustand store for sync progress, like we do for RECS sync. This will let apps using syncToZustand
render a loading state while initial client hydration is in progress.
const syncProgress = useStore((state) => state.syncProgress);
if (syncProgress.step !== SyncStep.LIVE) {
return <>Loading ({Math.floor(syncProgress.percentage)}%)</>;
}
feat(store-sync,store-indexer): sync from getLogs indexer endpoint (#1973) (opens in a new tab) (@latticexyz/common)
Updated chunk
types to use readonly arrays
feat(store-sync,store-indexer): sync from getLogs indexer endpoint (#1973) (opens in a new tab) (@latticexyz/store-indexer)
Added getLogs
query support to sqlite indexer
feat(store-indexer, store-sync): improve query performance and enable compression, add new api (#2026) (opens in a new tab) (@latticexyz/store-indexer, @latticexyz/store-sync)
- Improved query performance by 10x by moving from drizzle ORM to handcrafted SQL.
- Moved away from
trpc
for more granular control over the transport layer. Added an/api/logs
endpoint using the new query and gzip compression for 40x less data transferred over the wire. Deprecated the/trpc/getLogs
and/trpc/findAll
endpoints. - Added a
createIndexerClient
client for the new/api
indexer API exported from@latticexyz/store-sync/indexer-client
. ThecreateIndexerClient
export from@latticexyz/store-sync/trpc-indexer
is deprecated.
- import { createIndexerClient } from "@latticexyz/store-sync/trpc-indexer";
+ import { createIndexerClient } from "@latticexyz/store-sync/indexer-client";
- const indexer = createIndexerClient({ url: "https://indexer.holesky.redstone.xyz/trpc" });
+ const indexer = createIndexerClient({ url: "https://indexer.holesky.redstone.xyz" });
- const snapshot = indexer.getLogs.query(options);
+ const snapshot = indexer.getLogs(options);
feat(store-indexer): return a "not found" error when no snapshot is found for a /api/logs
request (#2043) (opens in a new tab) (@latticexyz/store-indexer)
The /api/logs
indexer endpoint is now returning a 404
snapshot not found error when no snapshot is found for the provided filter instead of an empty 200
response.
fix(cli): add worldAddress to dev-contracts (#1892) (opens in a new tab) (@latticexyz/store-indexer)
Added STORE_ADDRESS
environment variable to index only a specific MUD Store.
Patch changes
fix(store,world): exclude ERC165 interface ID from custom interface ID's [L-06] (#2014) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
Exclude ERC165 interface ID from custom interface ID's.
fix(store-sync,store-indexer): make last updated block number not null (#1972) (opens in a new tab) (@latticexyz/store-indexer)
Records are now ordered by lastUpdatedBlockNumber
at the Postgres SQL query level
fix(store): slice4 output should be bytes4 [M-03] (#2031) (opens in a new tab) (@latticexyz/store)
Changed the type of the output variable in the slice4
function to bytes4
.
fix(cli): mud set-version --link shouldn't fetch versions (#2000) (opens in a new tab) (@latticexyz/cli)
Using mud set-version --link
will no longer attempt to fetch the latest version from npm.
fix(store,world): fix mud config TS errors (#1974) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
Fixed an issue where mud.config.ts
source file was not included in the package, causing TS errors downstream.
feat(store-indexer): command to run decoded indexer (#2001) (opens in a new tab) (@latticexyz/store-indexer)
Added a script to run the decoded postgres indexer.
chore(store-indexer, store-sync): add explicit error logs (#2045) (opens in a new tab) (@latticexyz/store-indexer, @latticexyz/store-sync)
Added explicit error logs for unexpected situations.
Previously all debug
logs were going to stderr
, which made it hard to find the unexpected errors.
Now debug
logs go to stdout
and we can add explicit stderr
logs.
chore(common): log benchmark to stderr (#2047) (opens in a new tab) (@latticexyz/common)
The benchmark util now logs to stdout
instead of stderr
.
chore(world): add explicit visibility to coreSystem [N-07] (#2029) (opens in a new tab) (@latticexyz/world)
Added explicit internal
visibility to the coreSystem
variable in CoreModule
.
fix(world,world-modules): requireInterface correctly specifies ERC165 [M-02] (#2016) (opens in a new tab) (@latticexyz/world)
Fixed requireInterface
to correctly specify ERC165.
feat(world): add isInstalled to Module (#2056) (opens in a new tab) (@latticexyz/world-modules, @latticexyz/world)
Added isInstalled
and requireNotInstalled
helpers to Module
base contract.
fix(store-sync): create table registration logs from indexer records (#1919) (opens in a new tab) (@latticexyz/store-sync)
createStoreSync
now correctly creates table registration logs from indexer records.
chore(store-indexer): setup Sentry middleware in indexer (#2054) (opens in a new tab) (@latticexyz/store-indexer)
Added a Sentry middleware and SENTRY_DNS
environment variable to the postgres indexer.
fix(world): register FunctionSignatures table [L-01] (#1841) (opens in a new tab) (@latticexyz/world)
World
now correctly registers the FunctionSignatures
table.
feat(store-indexer): replace fastify with koa (#2006) (opens in a new tab) (@latticexyz/store-indexer)
Replaced Fastify with Koa for store-indexer frontends
fix(create-mud): include .gitignore
files in created projects (#1945) (opens in a new tab) (create-mud)
Templates now correctly include their respective .gitignore
files
fix(cli): always rebuild IWorld ABI (#1929) (opens in a new tab) (@latticexyz/cli)
Deploys will now always rebuild IWorld.sol
interface (a workaround for https://github.com/foundry-rs/foundry/issues/6241 (opens in a new tab))
build: allow use by TypeScript projects with bundler
/node16
config (#2084) (opens in a new tab) (@latticexyz/abi-ts, @latticexyz/block-logs-stream, @latticexyz/common, @latticexyz/config, @latticexyz/dev-tools, @latticexyz/faucet, @latticexyz/gas-report, @latticexyz/noise, @latticexyz/phaserx, @latticexyz/protocol-parser, @latticexyz/react, @latticexyz/recs, @latticexyz/schema-type, @latticexyz/services, @latticexyz/store-sync, @latticexyz/store, @latticexyz/utils, @latticexyz/world-modules, @latticexyz/world)
TS packages now generate their respective .d.ts
type definition files for better compatibility when using MUD with moduleResolution
set to bundler
or node16
and fixes issues around missing type declarations for dependent packages.
fix(store): onBeforeSpliceDynamicData receives the previous encoded lengths [M-01] (#2020) (opens in a new tab) (@latticexyz/store)
Fixed StoreCore
to pass previousEncodedLengths
into onBeforeSpliceDynamicData
.
fix(store-indexer): disable prepared statements (#2058) (opens in a new tab) (@latticexyz/store-indexer)
Disabled prepared statements for the postgres indexer, which led to issues in combination with pgBouncer
.
chore: pipe debug logs to stdout, add separate util to pipe to stderr (#2044) (opens in a new tab) (@latticexyz/abi-ts, @latticexyz/block-logs-stream, @latticexyz/cli, @latticexyz/common, @latticexyz/faucet, @latticexyz/store-indexer, @latticexyz/store-sync, @latticexyz/store)
Updated the debug
util to pipe to stdout
and added an additional util to explicitly pipe to stderr
when needed.
chore(store-indexer): stringify filter in error log (#2048) (opens in a new tab) (@latticexyz/store-indexer)
The error log if no data is found in /api/logs
is now stringifying the filter instead of logging [object Object]
.
fix(store): fix potential memory corruption [M-04] (#1978) (opens in a new tab) (@latticexyz/store)
Fixed M-04 Memory Corruption on Load From Storage
It only affected external use of Storage.load
with a memoryPointer
argument
chore(store,world): remove unused imports [N-05] (#2028) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
Removed unused imports from various files in the store
and world
packages.
fix(store-indexer): add postgres-decoded-indexer binary (#2062) (opens in a new tab) (@latticexyz/store-indexer)
Added a binary for the postgres-decoded
indexer.
fix(world-modules): rename token address fields (#1986) (opens in a new tab) (@latticexyz/world-modules)
Renamed token address fields in ERC20 and ERC721 modules to tokenAddress
fix(react): trigger useComponentValue on deleted records (#1959) (opens in a new tab) (@latticexyz/react)
Fixed an issue where useComponentValue
would not detect a change and re-render if the component value was immediately removed.
fix(store-sync): use dynamic data in postgres decoded indexer (#1983) (opens in a new tab) (@latticexyz/store-sync)
Fixed invalid value when decoding records in postgres-decoded
storage adapter
fix(faucet): use MUD's sendTransaction for better nonce handling (#2080) (opens in a new tab) (@latticexyz/faucet)
Updated to use MUD's sendTransaction
, which does a better of managing nonces for higher volumes of transactions.
Version 2.0.0-next.14
Release date: Fri Nov 10 2023
Major changes
feat(dev-tools): show zustand tables (#1891) (opens in a new tab) (@latticexyz/store-sync)
syncToZustand
now uses tables
argument to populate the Zustand store's tables
key, rather than the on-chain table registration events. This means we'll no longer store data into Zustand you haven't opted into receiving (e.g. other namespaces).
feat(store-indexer): separate postgres indexer/frontend services (#1887) (opens in a new tab) (@latticexyz/store-indexer)
Separated frontend server and indexer service for Postgres indexer. Now you can run the Postgres indexer with one writer and many readers.
If you were previously using the postgres-indexer
binary, you'll now need to run both postgres-indexer
and postgres-frontend
.
For consistency, the Postgres database logs are now disabled by default. If you were using these, please let us know so we can add them back in with an environment variable flag.
Minor changes
feat(cli): warn when contract is over or close to the size limit (#1894) (opens in a new tab) (@latticexyz/cli)
Deploys now validate contract size before deploying and warns when a contract is over or close to the size limit (24kb). This should help identify the most common cause of "evm revert" errors during system and module contract deploys.
fix(store): resolveUserTypes for static arrays (#1876) (opens in a new tab) (@latticexyz/schema-type)
Added isSchemaAbiType
helper function to check and narrow an unknown string to the SchemaAbiType
type
feat(dev-tools): show zustand tables (#1891) (opens in a new tab) (@latticexyz/dev-tools, create-mud)
Added Zustand support to Dev Tools:
const { syncToZustand } from "@latticexyz/store-sync";
const { mount as mountDevTools } from "@latticexyz/dev-tools";
const { useStore } = syncToZustand({ ... });
mountDevTools({
...
useStore,
});
docs: add changeset for SystemboundDelegationControl (#1906) (opens in a new tab) (@latticexyz/world-modules)
Added a new delegation control called SystemboundDelegationControl
that delegates control of a specific system for some maximum number of calls. It is almost identical to CallboundDelegationControl
except the delegatee can call the system with any function and args.
feat(store-indexer): add env var to index only one store (#1886) (opens in a new tab) (@latticexyz/store-indexer)
Added STORE_ADDRESS
environment variable to index only a specific MUD Store.
Patch changes
fix(create-mud): pin prettier-plugin-solidity (#1889) (opens in a new tab) (@latticexyz/common, create-mud)
Pinned prettier-plugin-solidity version to 1.1.3
fix(cli): add worldAddress to dev-contracts (#1892) (opens in a new tab) (@latticexyz/cli)
Added --worldAddress
argument to dev-contracts
CLI command so that you can develop against an existing world.
fix(store,world): explicit mud.config exports (#1900) (opens in a new tab) (@latticexyz/store, @latticexyz/world)
Added an explicit package export for mud.config
fix(store-sync): show TS error for non-existent tables when using zustand (#1896) (opens in a new tab) (@latticexyz/store-sync)
Fixed syncToZustand
types so that non-existent tables give an error and never
type instead of a generic Table
type.
fix(store): resolveUserTypes for static arrays (#1876) (opens in a new tab) (@latticexyz/store)
Fixed resolveUserTypes
for static arrays.
resolveUserTypes
is used by deploy
, which prevented deploying tables with static arrays.
docs(faucet): fix default port in readme (#1835) (opens in a new tab) (@latticexyz/cli)
The mud test
cli now exits with code 1 on test failure. It used to exit with code 0, which meant that CIs didn't notice test failures.
Version 2.0.0-next.13
Release date: Thu Nov 02 2023
Major changes
feat(utils): remove hash utils and ethers (#1783) (opens in a new tab) (@latticexyz/utils)
Removed keccak256
and keccak256Coord
hash utils in favor of viem's keccak256
(opens in a new tab).
- import { keccak256 } from "@latticexyz/utils";
+ import { keccak256, toHex } from "viem";
- const hash = keccak256("some string");
+ const hash = keccak256(toHex("some string"));
- import { keccak256Coord } from "@latticexyz/utils";
+ import { encodeAbiParameters, keccak256, parseAbiParameters } from "viem";
const coord = { x: 1, y: 1 };
- const hash = keccak256Coord(coord);
+ const hash = keccak256(encodeAbiParameters(parseAbiParameters("int32, int32"), [coord.x, coord.y]));
feat(store-indexer,store-sync): filter by table and key (#1794) (opens in a new tab) (@latticexyz/store-indexer)
Removed tableIds
filter option in favor of the more flexible filters
option that accepts tableId
and an optional key0
and/or key1
to filter data by tables and keys.
If you were using an indexer client directly, you'll need to update your query:
await indexer.findAll.query({
chainId,
address,
- tableIds: ['0x...'],
+ filters: [{ tableId: '0x...' }],
});
feat(create-mud): move react template to zustand, add react-ecs template (#1851) (opens in a new tab) (create-mud)
Replaced the react
template with a basic task list app using the new Zustand storage adapter and sync method. This new template better demonstrates the different ways of building with MUD and has fewer concepts to learn (i.e. just tables and records, no more ECS).
For ECS-based React apps, you can use react-ecs
template for the previous RECS storage adapter.
Minor changes
feat(create-mud): replace concurrently with mprocs (#1862) (opens in a new tab) (create-mud)
Updated templates to use mprocs (opens in a new tab) instead of concurrently (opens in a new tab) for running dev scripts.
feat(store-sync): extra table definitions (#1840) (opens in a new tab) (@latticexyz/store-sync)
Added an optional tables
option to syncToRecs
to allow you to sync from tables that may not be expressed by your MUD config. This will be useful for namespaced tables used by ERC20 (opens in a new tab) and ERC721 (opens in a new tab) token modules until the MUD config gains namespace support (opens in a new tab).
Here's how we use this in our example project with the KeysWithValue
module:
syncToRecs({
...
tables: {
KeysWithValue: {
namespace: "keywval",
name: "Inventory",
tableId: resourceToHex({ type: "table", namespace: "keywval", name: "Inventory" }),
keySchema: {
valueHash: { type: "bytes32" },
},
valueSchema: {
keysWithValue: { type: "bytes32[]" },
},
},
},
...
});
feat(world-modules): add ERC721 module (#1844) (opens in a new tab) (@latticexyz/world-modules)
Added the ERC721Module
to @latticexyz/world-modules
.
This module allows the registration of ERC721
tokens in an existing World.
Important note: this module has not been audited yet, so any production use is discouraged for now.
import { PuppetModule } from "@latticexyz/world-modules/src/modules/puppet/PuppetModule.sol";
import { ERC721MetadataData } from "@latticexyz/world-modules/src/modules/erc721-puppet/tables/ERC721Metadata.sol";
import { IERC721Mintable } from "@latticexyz/world-modules/src/modules/erc721-puppet/IERC721Mintable.sol";
import { registerERC721 } from "@latticexyz/world-modules/src/modules/erc721-puppet/registerERC721.sol";
// The ERC721 module requires the Puppet module to be installed first
world.installModule(new PuppetModule(), new bytes(0));
// After the Puppet module is installed, new ERC721 tokens can be registered
IERC721Mintable token = registerERC721(world, "myERC721", ERC721MetadataData({ name: "Token", symbol: "TKN", baseURI: "" }));```
feat(world-modules): add puppet module (#1793) (opens in a new tab) (@latticexyz/world-modules)
Added the PuppetModule
to @latticexyz/world-modules
. The puppet pattern allows an external contract to be registered as an external interface for a MUD system.
This allows standards like ERC20
(that require a specific interface and events to be emitted by a unique contract) to be implemented inside a MUD World.
The puppet serves as a proxy, forwarding all calls to the implementation system (also called the "puppet master"). The "puppet master" system can emit events from the puppet contract.
import { PuppetModule } from "@latticexyz/world-modules/src/modules/puppet/PuppetModule.sol";
import { createPuppet } from "@latticexyz/world-modules/src/modules/puppet/createPuppet.sol";
// Install the puppet module
world.installModule(new PuppetModule(), new bytes(0));
// Register a new puppet for any system
// The system must implement the `CustomInterface`,
// and the caller must own the system's namespace
CustomInterface puppet = CustomInterface(createPuppet(world, <systemId>));
feat(create-mud): enable MUD CLI debug logs (#1861) (opens in a new tab) (create-mud)
Enabled MUD CLI debug logs for all templates.
feat(store-indexer,store-sync): filter by table and key (#1794) (opens in a new tab) (@latticexyz/store-sync)
Added a filters
option to store sync to allow filtering client data on tables and keys. Previously, it was only possible to filter on tableIds
, but the new filter option allows for more flexible filtering by key.
If you are building a large MUD application, you can use positional keys as a way to shard data and make it possible to load only the data needed in the client for a particular section of your app. We're using this already in Sky Strife to load match-specific data into match pages without having to load data for all matches, greatly improving load time and client performance.
syncToRecs({
...
filters: [{ tableId: '0x...', key0: '0x...' }],
});
The tableIds
option is now deprecated and will be removed in the future, but is kept here for backwards compatibility.
feat(world-modules): add ERC20 module (#1789) (opens in a new tab) (@latticexyz/world-modules)
Added the ERC20Module
to @latticexyz/world-modules
.
This module allows the registration of ERC20
tokens in an existing World.
Important note: this module has not been audited yet, so any production use is discouraged for now.
import { PuppetModule } from "@latticexyz/world-modules/src/modules/puppet/PuppetModule.sol";
import { IERC20Mintable } from "@latticexyz/world-modules/src/modules/erc20-puppet/IERC20Mintable.sol";
import { registerERC20 } from "@latticexyz/world-modules/src/modules/erc20-puppet/registerERC20.sol";
// The ERC20 module requires the Puppet module to be installed first
world.installModule(new PuppetModule(), new bytes(0));
// After the Puppet module is installed, new ERC20 tokens can be registered
IERC20Mintable token = registerERC20(world, "myERC20", ERC20MetadataData({ decimals: 18, name: "Token", symbol: "TKN" }));
feat(store-sync): sync to zustand (#1843) (opens in a new tab) (@latticexyz/store-sync)
Added a Zustand storage adapter and corresponding syncToZustand
method for use in vanilla and React apps. It's used much like the other sync methods, except it returns a bound store and set of typed tables.
import { syncToZustand } from "@latticexyz/store-sync/zustand";
import config from "contracts/mud.config";
const { tables, useStore, latestBlock$, storedBlockLogs$, waitForTransaction } = await syncToZustand({
config,
...
});
// in vanilla apps
const positions = useStore.getState().getRecords(tables.Position);
// in React apps
const positions = useStore((state) => state.getRecords(tables.Position));
This change will be shortly followed by an update to our templates that uses Zustand as the default client data store and sync method.
feat(store): add experimental config resolve helper (#1826) (opens in a new tab) (@latticexyz/common)
Added a mapObject
helper to map the value of each property of an object to a new value.
Patch changes
fix(create-mud): set store address in PostDeploy script (#1817) (opens in a new tab) (create-mud)
Updated templates' PostDeploy script to set store address so that tables can be used directly inside PostDeploy.
fix(create-mud): workaround create-create-app templating (#1863) (opens in a new tab) (create-mud)
Fixed an issue when creating a new project from the react
app, where React's expressions were overlapping with Handlebars expressions (used by our template command).
fix(cli): change import order so .env file is loaded first (#1860) (opens in a new tab) (@latticexyz/cli)
Changed mud
CLI import order so that environment variables from the .env
file are loaded before other imports.
fix(common,config): remove chalk usage (#1824) (opens in a new tab) (@latticexyz/common, @latticexyz/config)
Removed chalk usage from modules imported in client fix downstream client builds (vite in particular).
Version 2.0.0-next.12
Release date: Fri Oct 20 2023
Major changes
feat(store): default off storeArgument (#1741) (opens in a new tab) (@latticexyz/cli, @latticexyz/store, @latticexyz/world-modules, @latticexyz/world, create-mud)
Store config now defaults storeArgument: false
for all tables. This means that table libraries, by default, will no longer include the extra functions with the _store
argument. This default was changed to clear up the confusion around using table libraries in tests, PostDeploy
scripts, etc.
If you are sure you need to manually specify a store when interacting with tables, you can still manually toggle it back on with storeArgument: true
in the table settings of your MUD config.
If you want to use table libraries in PostDeploy.s.sol
, you can add the following lines:
import { Script } from "forge-std/Script.sol";
import { console } from "forge-std/console.sol";
import { IWorld } from "../src/codegen/world/IWorld.sol";
+ import { StoreSwitch } from "@latticexyz/store/src/StoreSwitch.sol";
contract PostDeploy is Script {
function run(address worldAddress) external {
+ StoreSwitch.setStoreAddress(worldAddress);
+
+ SomeTable.get(someKey);
feat(cli): declarative deployment (#1702) (opens in a new tab) (@latticexyz/cli)
deploy
, test
, dev-contracts
were overhauled using a declarative deployment approach under the hood. Deploys are now idempotent and re-running them will introspect the world and figure out the minimal changes necessary to bring the world into alignment with its config: adding tables, adding/upgrading systems, changing access control, etc.
The following CLI arguments are now removed from these commands:
--debug
(you can now adjust CLI output withDEBUG
environment variable, e.g.DEBUG=mud:*
)--priorityFeeMultiplier
(now calculated automatically)--disableTxWait
(everything is now parallelized with smarter nonce management)--pollInterval
(we now lean on viem defaults and we don't wait/poll until the very end of the deploy)
Most deployment-in-progress logs are now behind a debug (opens in a new tab) flag, which you can enable with a DEBUG=mud:*
environment variable.
feat(world-modules): only install modules once (#1756) (opens in a new tab) (@latticexyz/world-modules)
Modules now revert with Module_AlreadyInstalled
if attempting to install more than once with the same calldata.
This is a temporary workaround for our deploy pipeline. We'll make these install steps more idempotent in the future.
Minor changes
docs(world): add changeset for system call helpers (#1747) (opens in a new tab) (@latticexyz/world)
Added TS helpers for calling systems dynamically via the World.
-
encodeSystemCall
forworld.call
worldContract.write.call(encodeSystemCall({ abi: worldContract.abi, systemId: resourceToHex({ ... }), functionName: "registerDelegation", args: [ ... ], }));
-
encodeSystemCallFrom
forworld.callFrom
worldContract.write.callFrom(encodeSystemCallFrom({ abi: worldContract.abi, from: "0x...", systemId: resourceToHex({ ... }), functionName: "registerDelegation", args: [ ... ], }));
-
encodeSystemCalls
forworld.batchCall
worldContract.write.batchCall(encodeSystemCalls(abi, [{ systemId: resourceToHex({ ... }), functionName: "registerDelegation", args: [ ... ], }]));
-
encodeSystemCallsFrom
forworld.batchCallFrom
worldContract.write.batchCallFrom(encodeSystemCallsFrom(abi, "0x...", [{ systemId: resourceToHex({ ... }), functionName: "registerDelegation", args: [ ... ], }]));
feat(world-modules): only install modules once (#1756) (opens in a new tab) (@latticexyz/world)
Added a Module_AlreadyInstalled
error to IModule
.
feat(common): add sendTransaction, add mempool queue to nonce manager (#1717) (opens in a new tab) (@latticexyz/common)
- Added a
sendTransaction
helper to mirror viem'ssendTransaction
, but with our nonce manager - Added an internal mempool queue to
sendTransaction
andwriteContract
for better nonce handling - Defaults block tag to
pending
for transaction simulation and transaction count (when initializing the nonce manager)
feat(cli): add --alwaysPostDeploy
flag to deploys (#1765) (opens in a new tab) (@latticexyz/cli)
Added a --alwaysRunPostDeploy
flag to deploys (deploy
, test
, dev-contracts
commands) to always run PostDeploy.s.sol
script after each deploy. By default, PostDeploy.s.sol
is only run once after a new world is deployed.
This is helpful if you want to continue a deploy that may not have finished (due to an error or otherwise) or to run deploys with an idempotent PostDeploy.s.sol
script.
feat(abi-ts): move logs to debug (#1736) (opens in a new tab) (@latticexyz/abi-ts)
Moves log output behind a debug flag. You can enable logging with DEBUG=abi-ts
environment variable.
feat(cli): remove forge clean from deploy (#1759) (opens in a new tab) (@latticexyz/cli)
CLI deploy
, test
, dev-contracts
no longer run forge clean
before each deploy. We previously cleaned to ensure no outdated artifacts were checked into git (ABIs, typechain types, etc.). Now that all artifacts are gitignored, we can let forge use its cache again.
feat(common): clarify resourceId (hex) from resource (object) (#1706) (opens in a new tab) (@latticexyz/common)
Renames resourceIdToHex
to resourceToHex
and hexToResourceId
to hexToResource
, to better distinguish between a resource ID (hex value) and a resource reference (type, namespace, name).
- resourceIdToHex({ type: 'table', namespace: '', name: 'Position' });
+ resourceToHex({ type: 'table', namespace: '', name: 'Position' });
- hexToResourceId('0x...');
+ hexToResource('0x...');
Previous methods still exist but are now deprecated to ease migration and reduce breaking changes. These will be removed in a future version.
Also removes the previously deprecated and unused table ID utils (replaced by these resource ID utils).
feat(cli): remove .mudtest file in favor of env var (#1722) (opens in a new tab) (@latticexyz/cli, @latticexyz/common, @latticexyz/world)
Replaced temporary .mudtest
file in favor of WORLD_ADDRESS
environment variable when running tests with MudTest
contract
feat(faucet,store-indexer): add k8s healthcheck endpoints (#1739) (opens in a new tab) (@latticexyz/faucet, @latticexyz/store-indexer)
Added /healthz
and /readyz
healthcheck endpoints for Kubernetes
feat(cli): add retries to deploy (#1766) (opens in a new tab) (@latticexyz/cli)
Transactions sent via deploy will now be retried a few times before giving up. This hopefully helps with large deploys on some chains.
Patch changes
fix(cli): don't bail dev-contracts during deploy failure (#1808) (opens in a new tab) (@latticexyz/cli)
dev-contracts
will no longer bail when there was an issue with deploying (e.g. typo in contracts) and instead wait for file changes before retrying.
feat(store): parallelize table codegen (#1754) (opens in a new tab) (@latticexyz/store)
Parallelized table codegen. Also put logs behind debug flag, which can be enabled using the DEBUG=mud:*
environment variable.
fix(cli): handle module already installed (#1769) (opens in a new tab) (@latticexyz/cli)
Deploys now continue if they detect a Module_AlreadyInstalled
revert error.
fix(cli): deploy systems/modules before registering/installing them (#1767) (opens in a new tab) (@latticexyz/cli)
Changed deploy order so that system/module contracts are fully deployed before registering/installing them on the world.
fix(cli): run worldgen with deploy (#1807) (opens in a new tab) (@latticexyz/cli)
Deploy commands (deploy
, dev-contracts
, test
) now correctly run worldgen
to generate system interfaces before deploying.
feat(store): parallelize table codegen (#1754) (opens in a new tab) (@latticexyz/common)
Moved some codegen to use fs/promises
for better parallelism.
fix(cli): support enums in deploy, only deploy modules/systems once (#1749) (opens in a new tab) (@latticexyz/cli)
Fixed a few issues with deploys:
- properly handle enums in MUD config
- only deploy each unique module/system once
- waits for transactions serially instead of in parallel, to avoid RPC errors
feat(cli,create-mud): use forge cache (#1777) (opens in a new tab) (@latticexyz/cli, create-mud)
Sped up builds by using more of forge's cache.
Previously we'd build only what we needed because we would check in ABIs and other build artifacts into git, but that meant that we'd get a lot of forge cache misses. Now that we no longer need these files visible, we can take advantage of forge's caching and greatly speed up builds, especially incremental ones.
feat(cli): declarative deployment (#1702) (opens in a new tab) (@latticexyz/world)
With resource types in resource IDs (opens in a new tab), the World config no longer requires table and system names to be unique.
feat(common): clarify resourceId (hex) from resource (object) (#1706) (opens in a new tab) (@latticexyz/cli, @latticexyz/dev-tools, @latticexyz/store-sync)
Moved to new resource ID utils.
Version 2.0.0-next.11
Major changes
feat(cli): remove backup/restore/force options from set-version (#1687) (opens in a new tab) (@latticexyz/cli)
Removes .mudbackup
file handling and --backup
, --restore
, and --force
options from mud set-version
command.
To revert to a previous MUD version, use git diff
to find the version that you changed from and want to revert to and run pnpm mud set-version <prior-version>
again.
Minor changes
feat(world-modules): add SystemSwitch util (#1665) (opens in a new tab) (@latticexyz/world-modules)
Since #1564 (opens in a new tab) the World can no longer call itself via an external call.
This made the developer experience of calling other systems via root systems worse, since calls from root systems are executed from the context of the World.
The recommended approach is to use delegatecall
to the system if in the context of a root system, and an external call via the World if in the context of a non-root system.
To bring back the developer experience of calling systems from other sysyems without caring about the context in which the call is executed, we added the SystemSwitch
util.
- // Instead of calling the system via an external call to world...
- uint256 value = IBaseWorld(_world()).callMySystem();
+ // ...you can now use the `SystemSwitch` util.
+ // This works independent of whether used in a root system or non-root system.
+ uint256 value = abi.decode(SystemSwitch.call(abi.encodeCall(IBaseWorld.callMySystem, ()), (uint256));
Note that if you already know your system is always executed as non-root system, you can continue to use the approach of calling other systems via the IBaseWorld(world)
.
refactor(common): move createContract
's internal write logic to writeContract
(#1693) (opens in a new tab) (@latticexyz/common)
- Moves contract write logic out of
createContract
into its ownwriteContract
method so that it can be used outside of the contract instance, and for consistency with viem. - Deprecates
createContract
in favor ofgetContract
for consistency with viem. - Reworks
createNonceManager
'sBroadcastChannel
setup and moves out the notion of a "nonce manager ID" togetNonceManagerId
so we can create an internal cache withgetNonceManager
for use inwriteContract
.
If you were using the createNonceManager
before, you'll just need to rename publicClient
argument to client
:
const publicClient = createPublicClient({ ... });
- const nonceManager = createNonceManager({ publicClient, ... });
+ const nonceManager = createNonceManager({ client: publicClient, ... });
feat(gas-reporter): allow gas-reporter to parse stdin (#1688) (opens in a new tab) (@latticexyz/gas-report)
Allow the gas-report
CLI to parse logs via stdin
, so it can be used with custom test commands (e.g. mud test
).
Usage:
# replace `forge test -vvv` with the custom test command
GAS_REPORTER_ENABLED=true forge test -vvv | pnpm gas-report --stdin
Patch changes
feat(store-sync): export postgres column type helpers (#1699) (opens in a new tab) (@latticexyz/store-sync)
Export postgres column type helpers from @latticexyz/store-sync
.
fix(common): workaround for zero base fee (#1689) (opens in a new tab) (@latticexyz/common)
Adds viem workaround for zero base fee used by MUD's anvil config
fix(world): register store namespace during initialization (#1712) (opens in a new tab) (@latticexyz/world)
Register the store
namespace in the CoreModule
.
Since namespaces are a World concept, registering the Store's internal tables does not automatically register the Store's namespace, so we do this manually during initialization in the CoreModule
.
build: bump viem and abitype (#1684) (opens in a new tab) (@latticexyz/block-logs-stream, @latticexyz/cli, @latticexyz/common, @latticexyz/dev-tools, @latticexyz/faucet, @latticexyz/protocol-parser, @latticexyz/schema-type, @latticexyz/store-indexer, @latticexyz/store-sync, @latticexyz/store, create-mud)
Bump viem to 1.14.0 and abitype to 0.9.8
feat(gas-report): add more logs to stdin piping (#1694) (opens in a new tab) (@latticexyz/gas-report)
Pass through stdin
logs in gas-report
. Since the script piping in logs to gas-report
can be long-running, it is useful to see its logs to know if it's stalling.
fix(protocol-parser): allow arbitrary key order when encoding values (#1674) (opens in a new tab) (@latticexyz/protocol-parser)
Allow arbitrary key order when encoding values
Version 2.0.0-next.10
Major changes
refactor(world): expose library for WorldContextConsumer (#1624) (opens in a new tab) (@latticexyz/world-modules, @latticexyz/world)
We now expose a WorldContextConsumerLib
library with the same functionality as the WorldContextConsumer
contract, but the ability to be used inside of internal libraries.
We also renamed the WorldContextProvider
library to WorldContextProviderLib
for consistency.
Minor changes
docs: changeset for indexer/store sync table IDs param (#1662) (opens in a new tab) (@latticexyz/store-indexer, @latticexyz/store-sync)
Added a tableIds
parameter to store sync methods and indexer to allow filtering data streams by table IDs. Store sync methods automatically include all internal table IDs from Store and World.
import { syncToRecs } from "@latticexyz/store-sync/recs";
import { resourceIdToHex } from "@latticexyz/common";
syncToRecs({
...
tableIds: [resourceIdToHex(...)],
});
import { createIndexerClient } from "@latticexyz/store-sync/trpc-indexer";
import { resourceIdToHex } from "@latticexyz/common";
const client = createIndexerClient({ ... });
client.findAll({
...
tableIds: [resourceIdToHex(...)],
});
feat(world): return world address from WorldFactory (#1675) (opens in a new tab) (@latticexyz/world)
Return address of the newly created World from WorldFactory.deployWorld
.
Patch changes
fix(cli): fix table IDs for module install (#1663) (opens in a new tab) (@latticexyz/cli)
Fix table IDs for module install step of deploy
fix(cli): register namespace with namespaceId (#1619) (opens in a new tab) (@latticexyz/cli)
We fixed a bug in the deploy script that would cause the deployment to fail if a non-root namespace was used in the config.
Version 2.0.0-next.9
Major changes
feat(world): move interfaces/factories to root (#1606) (opens in a new tab) (@latticexyz/world)
Moves World interfaces and factories files for consistency with our other packages.
If you import any World interfaces or factories directly, you'll need to update the import path:
- import { IBaseWorld } from "@latticexyz/world/src/interfaces/IBaseWorld.sol";
+ import { IBaseWorld } from "@latticexyz/world/src/IBaseWorld.sol";
- import { IBaseWorld } from "@latticexyz/world/src/factories/WorldFactory.sol";
+ import { IBaseWorld } from "@latticexyz/world/src/WorldFactory.sol";