Configuration
The MUD configuration file is packages/contracts/mud.config.ts.
The configuration file is mainly used for:
Defining the project’s namespace
namespace.Defining tables
tablesin the project.Defining systems
systemsin the project.Defining modules
modulesto be installed.Configuring code generation
Configuring deployment
For detailed explanations about namespace, tables, systems, and modules in the configuration file, please refer to their respective sections.
Here’s a brief explanation of code generation and deployment configurations.
codegen:object. Code generation configuration.worldInterfaceName:string, default:"IWorld". Autonomous world interface name.worldgenDirectory:string, default:"world". Directory for storing autonomous world interface.worldImportPath:string, default:"@latticexyz/world/src". Import path for World protocol related code.outputDirectory:string, default:"codegen". Output directory for generated code.indexFilename:string, default:"index.sol". Table index filename.storeImportPath:string, default:"@latticexyz/store/src". Import path for Store protocol related code.userTypesFilename:string, default:"common.sol". User types filename.
deploy:object. Deployment configuration.postDeployScript:string, default:"PostDeploy". Name of the script to run after deployment. Script filename must end with.s.sol.deploysDirectory:string, default:"deploys". Directory for storing deployment information.worldsFile:string, default:"worlds.json". A JSON file summarizing autonomous world addresses and their respective chains.upgradeableWorldImplementation:boolean, default:false. Whether to allow upgrading the core implementation of the autonomous world. Officially recommended to set totrue.
Complete configuration file example:
import { defineWorld } from "@latticexyz/world";
import { encodeAbiParameters, parseAbiParameters, toHex } from 'viem';
export default defineWorld({
// should be consistent with foundry's configuration
sourceDirectory: "src",
namespace: "muddoc",
// for multiple namespaces, which is conflict with `namespace`
namespaces: {
muddoc: {
tables: {},
systems: {},
},
},
enums: {
UserStatus: ["active", "inactive"],
},
userTypes: {
ShortString: {
type: "bytes32",
filePath: "@openzeppelin/contracts/utils/ShortStrings.sol",
}
},
tables: {
Users: {
name: "Users",
type: "table",
schema: {
addr: "address",
data: "uint256",
description: "string",
},
key: ["addr"],
codegen: {
outputDirectory: "tables",
dataStruct: false,
tableIdArgument: false,
storeArgument: false,
},
deploy: {
disabled: true,
},
},
}
systems: {
SimpleStorageSystem: {
name: "SimpleStorage",
openAccess: false,
accessList: [],
deploy: {
disabled: false,
registerWorldFunctions: true,
},
},
},
excludeSystems: [],
modules: [
{
artifactPath: "@latticexyz/world-modules/out/ERC20Module.sol/ERC20Module.json",
root: false,
args: [
{type: "bytes", value: encodeAbiParameters(
parseAbiParameters('bytes14 namespace, (uint8 decimals, string name, string symbol)'),
[toHex("token", { size: 14 }), {decimals: 18, name: "muddoc", symbol: "MUDOC"}],
)}
],
},
],
codegen: {
worldInterfaceName: "IWorld",
worldgenDirectory: "world",
worldImportPath: "@latticexyz/world/src",
outputDirectory: "codegen",
indexFilename: "index.sol",
storeImportPath: "@latticexyz/store/src",
userTypesFilename: "common.sol",
},
deploy: {
postDeployScript: "PostDeploy",
deploysDirectory: "./deploys",
worldsFile: "./worlds.json",
upgradeableWorldImplementation: false,
},
});