Using Store without World
Installation
Install @latticexyz/store
via NPM or Yarn, and add the correct remapping into your Forge config.
If you store your contracts in packages/contract
, this would look like this:
// remappings.txt
@latticexyz/=./node_modules/@latticexyz/
If you want to use code-generation for libraries, install the MUD cli: yarn install -D mud
and the schema types: yarn install -D @latticexyz/schema-type
Import Store and extend your contract with the Store
contract:
// src/Contract.sol
import { Store } from "@latticexyz/store/src/Store.sol";
contract Contract is Store {
[...]
}
Inheriting Store
will bootstrap the internal tables in the contract’s constructor. You can initialize default tables in your contract constructor if needed.
Initializing tables in the constructor with code-generated librarie
create a MUD config at the root of your project named mud.config.mts
// mud.config.mts
import { mudConfig } from "@latticexyz/store/register";
export default mudConfig({
tables: {
MyTable: {
schema: {
field1: "uint256",
field2: "uint256",
},
},
},
});
export default config;
Then run mud tablegen
in the folder where your MUD config is located. It will output a single library: MyTable.sol
at ./src/tables/MyTable.sol
import { Store } from "@latticexyz/store/src/Store.sol";
import { MyTable } from "./codegen/tables/MyTable.sol";
contract Contract is Store {
constructor() {
MyTable.registerSchema();
// Setting metadata is optional. It helps off-chain actors name columns
MyTable.setMetadata();
}
}
Initializing tables in the constructor with the low-level API
import { Store } from "@latticexyz/store/src/Store.sol";
import { StoreCore } from "@latticexyz/store/src/StoreCore.sol";
contract Contract is Store {
constructor() {
Schema keySchema = SchemaLib.encode(SchemaType.UINT256);
Schema schema = SchemaLib.encode(SchemaType.UINT256, SchemaType.UINT256);
uint256 table = uint256(keccak256("MyTable"));
StoreCore.registerSchema(table, schema, keySchema);
// Setting metadata is optional. It helps off-chain actors name columns
string[] memory fieldNames = new string[](2);
fieldNames[0] = "field1";
fieldNames[1] = "field2";
StoreSwitch.setMetadata(table, "MyTable", fieldNames);
}
}