create-mud 2.0.0-next.1 → 2.0.0-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/dist/cli.js +1 -1
  2. package/dist/templates/phaser/packages/client/package.json +2 -1
  3. package/dist/templates/phaser/packages/client/src/index.tsx +0 -2
  4. package/dist/templates/phaser/packages/client/src/layers/network/createNetworkLayer.ts +2 -6
  5. package/dist/templates/phaser/packages/client/src/mud/setupNetwork.ts +8 -7
  6. package/dist/templates/phaser/packages/client/src/ui/App.tsx +20 -3
  7. package/dist/templates/phaser/packages/client/src/ui/LoadingScreen/LoadingScreen.tsx +2 -1
  8. package/dist/templates/phaser/packages/contracts/package.json +2 -2
  9. package/dist/templates/react/packages/client/package.json +2 -1
  10. package/dist/templates/react/packages/client/src/index.tsx +18 -3
  11. package/dist/templates/react/packages/client/src/mud/setupNetwork.ts +8 -7
  12. package/dist/templates/react/packages/contracts/package.json +2 -2
  13. package/dist/templates/threejs/packages/client/package.json +2 -1
  14. package/dist/templates/threejs/packages/client/src/index.tsx +18 -3
  15. package/dist/templates/threejs/packages/client/src/mud/setupNetwork.ts +8 -7
  16. package/dist/templates/threejs/packages/contracts/package.json +2 -2
  17. package/dist/templates/vanilla/packages/client/package.json +2 -1
  18. package/dist/templates/vanilla/packages/client/src/index.ts +17 -2
  19. package/dist/templates/vanilla/packages/client/src/mud/setupNetwork.ts +8 -7
  20. package/dist/templates/vanilla/packages/contracts/package.json +2 -2
  21. package/package.json +1 -1
  22. package/dist/templates/phaser/packages/client/src/mud/contractComponents.ts +0 -27
  23. package/dist/templates/react/packages/client/src/mud/contractComponents.ts +0 -27
  24. package/dist/templates/threejs/packages/client/src/mud/contractComponents.ts +0 -29
  25. package/dist/templates/vanilla/packages/client/src/mud/contractComponents.ts +0 -27
package/dist/cli.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var t=require("create-create-app"),a=require("path");var e={name:"create-mud",version:"2.0.0-next.1",description:"Create a new MUD project",license:"MIT",author:"Lattice <mud@lattice.xyz>",bin:"dist/cli.js",files:["dist"],scripts:{build:"pnpm run build:js","build:js":"tsup && ./scripts/copy-templates.sh",clean:"pnpm run clean:js","clean:js":"rimraf dist",dev:"tsup --watch",prepublishOnly:"npm run clean && npm run build",test:"pnpm run test:vanilla && pnpm run test:react && pnpm run test:phaser && pnpm run test:threejs","test:phaser":"dist/cli.js test-project --template phaser && rimraf test-project","test:react":"dist/cli.js test-project --template react && rimraf test-project","test:threejs":"dist/cli.js test-project --template threejs && rimraf test-project","test:vanilla":"dist/cli.js test-project --template vanilla && rimraf test-project"},dependencies:{"create-create-app":"git+https://github.com/holic/create-create-app#74376c59b48a04aabbe94d9cacfe9cb1cecccd63"},devDependencies:{"@types/node":"^18.15.11",tsup:"^6.7.0"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},gitHead:"914a1e0ae4a573d685841ca2ea921435057deb8f"};var i=(0,a.resolve)(__dirname,"..","dist","templates");(0,t.create)("create-mud",{templateRoot:i,defaultTemplate:"vanilla",defaultPackageManager:"pnpm",promptForDescription:!1,promptForAuthor:!1,promptForEmail:!1,promptForLicense:!1,promptForTemplate:!0,caveat:({answers:r,packageManager:s})=>`Done! Play in the MUD with \`cd ${r.name}\` and \`${s} run dev\``,extra:{"mud-version":{type:"input",describe:"The version of MUD packages to use, defaults to latest",default:e.version}}});
2
+ "use strict";var t=require("create-create-app"),a=require("path");var e={name:"create-mud",version:"2.0.0-next.2",description:"Create a new MUD project",license:"MIT",author:"Lattice <mud@lattice.xyz>",bin:"dist/cli.js",files:["dist"],scripts:{build:"pnpm run build:js","build:js":"tsup && ./scripts/copy-templates.sh",clean:"pnpm run clean:js","clean:js":"rimraf dist",dev:"tsup --watch",prepublishOnly:"npm run clean && npm run build",test:"pnpm run test:vanilla && pnpm run test:react && pnpm run test:phaser && pnpm run test:threejs","test:phaser":"dist/cli.js test-project --template phaser && rimraf test-project","test:react":"dist/cli.js test-project --template react && rimraf test-project","test:threejs":"dist/cli.js test-project --template threejs && rimraf test-project","test:vanilla":"dist/cli.js test-project --template vanilla && rimraf test-project"},dependencies:{"create-create-app":"git+https://github.com/holic/create-create-app#74376c59b48a04aabbe94d9cacfe9cb1cecccd63"},devDependencies:{"@types/node":"^18.15.11",tsup:"^6.7.0"},publishConfig:{access:"public",registry:"https://registry.npmjs.org"},gitHead:"914a1e0ae4a573d685841ca2ea921435057deb8f"};var i=(0,a.resolve)(__dirname,"..","dist","templates");(0,t.create)("create-mud",{templateRoot:i,defaultTemplate:"vanilla",defaultPackageManager:"pnpm",promptForDescription:!1,promptForAuthor:!1,promptForEmail:!1,promptForLicense:!1,promptForTemplate:!0,caveat:({answers:r,packageManager:s})=>`Done! Play in the MUD with \`cd ${r.name}\` and \`${s} run dev\``,extra:{"mud-version":{type:"input",describe:"The version of MUD packages to use, defaults to latest",default:e.version}}});
@@ -28,10 +28,11 @@
28
28
  "lodash": "^4.17.21",
29
29
  "react": "^18.2.0",
30
30
  "react-dom": "^18.2.0",
31
+ "rxjs": "7.5.5",
31
32
  "simplex-noise": "^4.0.1",
32
33
  "styled-components": "^5.3.10",
33
34
  "use-resize-observer": "^9.1.0",
34
- "viem": "1.3.1",
35
+ "viem": "1.6.0",
35
36
  "zustand": "^4.3.8"
36
37
  },
37
38
  "devDependencies": {
@@ -1,11 +1,9 @@
1
1
  import React from "react";
2
2
  import ReactDOM from "react-dom/client";
3
3
  import { App } from "./ui/App";
4
- import { mount as mountDevTools } from "@latticexyz/dev-tools";
5
4
 
6
5
  const rootElement = document.getElementById("react-root");
7
6
  if (!rootElement) throw new Error("React root not found");
8
7
  const root = ReactDOM.createRoot(rootElement);
9
8
 
10
9
  root.render(<App />);
11
- mountDevTools();
@@ -4,16 +4,12 @@ import { setup } from "../../mud/setup";
4
4
  export type NetworkLayer = Awaited<ReturnType<typeof createNetworkLayer>>;
5
5
 
6
6
  export const createNetworkLayer = async () => {
7
- const { components, systemCalls } = await setup();
8
-
9
- // Give components a Human-readable ID
10
- Object.entries(components).forEach(([name, component]) => {
11
- component.id = name;
12
- });
7
+ const { components, systemCalls, network } = await setup();
13
8
 
14
9
  return {
15
10
  world,
16
11
  systemCalls,
17
12
  components,
13
+ network,
18
14
  };
19
15
  };
@@ -2,16 +2,15 @@ import { createPublicClient, fallback, webSocket, http, createWalletClient, Hex,
2
2
  import { createFaucetService } from "@latticexyz/network";
3
3
  import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs";
4
4
  import { getNetworkConfig } from "./getNetworkConfig";
5
- import { defineContractComponents } from "./contractComponents";
6
5
  import { world } from "./world";
7
6
  import { IWorld__factory } from "contracts/types/ethers-contracts/factories/IWorld__factory";
8
- import storeConfig from "contracts/mud.config";
9
- import { createBurnerAccount, createContract, transportObserver } from "@latticexyz/common";
7
+ import { createBurnerAccount, createContract, transportObserver, ContractWrite } from "@latticexyz/common";
8
+ import { Subject, share } from "rxjs";
9
+ import mudConfig from "contracts/mud.config";
10
10
 
11
11
  export type SetupNetworkResult = Awaited<ReturnType<typeof setupNetwork>>;
12
12
 
13
13
  export async function setupNetwork() {
14
- const contractComponents = defineContractComponents(world);
15
14
  const networkConfig = await getNetworkConfig();
16
15
 
17
16
  const clientOptions = {
@@ -28,19 +27,20 @@ export async function setupNetwork() {
28
27
  account: burnerAccount,
29
28
  });
30
29
 
30
+ const write$ = new Subject<ContractWrite>();
31
31
  const worldContract = createContract({
32
32
  address: networkConfig.worldAddress as Hex,
33
33
  abi: IWorld__factory.abi,
34
34
  publicClient,
35
35
  walletClient: burnerWalletClient,
36
+ onWrite: (write) => write$.next(write),
36
37
  });
37
38
 
38
39
  const { components, latestBlock$, blockStorageOperations$, waitForTransaction } = await syncToRecs({
39
40
  world,
40
- config: storeConfig,
41
+ config: mudConfig,
41
42
  address: networkConfig.worldAddress as Hex,
42
43
  publicClient,
43
- components: contractComponents,
44
44
  startBlock: BigInt(networkConfig.initialBlockNumber),
45
45
  });
46
46
 
@@ -74,9 +74,10 @@ export async function setupNetwork() {
74
74
  playerEntity: encodeEntity({ address: "address" }, { address: burnerWalletClient.account.address }),
75
75
  publicClient,
76
76
  walletClient: burnerWalletClient,
77
- worldContract,
78
77
  latestBlock$,
79
78
  blockStorageOperations$,
80
79
  waitForTransaction,
80
+ worldContract,
81
+ write$: write$.asObservable().pipe(share()),
81
82
  };
82
83
  }
@@ -3,20 +3,37 @@ import { useNetworkLayer } from "./hooks/useNetworkLayer";
3
3
  import { useStore } from "../store";
4
4
  import { PhaserLayer } from "./PhaserLayer";
5
5
  import { UIRoot } from "./UIRoot";
6
+ import mudConfig from "contracts/mud.config";
6
7
 
7
8
  export const App = () => {
8
9
  const networkLayer = useNetworkLayer();
9
10
 
10
11
  useEffect(() => {
11
- if (networkLayer) {
12
- useStore.setState({ networkLayer });
12
+ if (!networkLayer) return;
13
+
14
+ useStore.setState({ networkLayer });
15
+
16
+ // https://vitejs.dev/guide/env-and-mode.html
17
+ if (import.meta.env.DEV) {
18
+ import("@latticexyz/dev-tools").then(({ mount: mountDevTools }) =>
19
+ mountDevTools({
20
+ config: mudConfig,
21
+ publicClient: networkLayer.network.publicClient,
22
+ walletClient: networkLayer.network.walletClient,
23
+ latestBlock$: networkLayer.network.latestBlock$,
24
+ blockStorageOperations$: networkLayer.network.blockStorageOperations$,
25
+ worldAddress: networkLayer.network.worldContract.address,
26
+ worldAbi: networkLayer.network.worldContract.abi,
27
+ write$: networkLayer.network.write$,
28
+ recsWorld: networkLayer.world,
29
+ })
30
+ );
13
31
  }
14
32
  }, [networkLayer]);
15
33
 
16
34
  return (
17
35
  <div>
18
36
  <PhaserLayer networkLayer={networkLayer} />
19
-
20
37
  <UIRoot />
21
38
  </div>
22
39
  );
@@ -4,7 +4,8 @@ import { LoadingBar } from "./LoadingBar";
4
4
  import { BootScreen } from "./BootScreen";
5
5
  import { useComponentValue } from "@latticexyz/react";
6
6
  import { useMUD } from "../../store";
7
- import { SyncStep, singletonEntity } from "@latticexyz/store-sync/recs";
7
+ import { singletonEntity } from "@latticexyz/store-sync/recs";
8
+ import { SyncStep } from "@latticexyz/store-sync";
8
9
 
9
10
  export const LoadingScreen = () => {
10
11
  const {
@@ -6,11 +6,11 @@
6
6
  "scripts": {
7
7
  "build": "pnpm run build:mud && pnpm run build:abi && pnpm run build:typechain",
8
8
  "build:abi": "forge clean && forge build",
9
- "build:mud": "mud tablegen && mud worldgen && mud tsgen --configPath mud.config.ts --out ../client/src/mud",
9
+ "build:mud": "mud tablegen && mud worldgen",
10
10
  "build:typechain": "rimraf types && typechain --target=ethers-v5 out/IWorld.sol/IWorld.json",
11
11
  "deploy:local": "pnpm run build && mud deploy",
12
12
  "deploy:testnet": "pnpm run build && mud deploy --profile=lattice-testnet",
13
- "dev": "pnpm mud dev-contracts --tsgenOutput ../client/src/mud",
13
+ "dev": "pnpm mud dev-contracts",
14
14
  "lint": "pnpm run prettier && pnpm run solhint",
15
15
  "prettier": "prettier --write 'src/**/*.sol'",
16
16
  "solhint": "solhint --config ./.solhint.json 'src/**/*.sol' --fix",
@@ -26,7 +26,8 @@
26
26
  "ethers": "^5.7.2",
27
27
  "react": "^18.2.0",
28
28
  "react-dom": "^18.2.0",
29
- "viem": "1.3.1"
29
+ "rxjs": "7.5.5",
30
+ "viem": "1.6.0"
30
31
  },
31
32
  "devDependencies": {
32
33
  "@types/react": "^18.2.6",
@@ -1,19 +1,34 @@
1
1
  import ReactDOM from "react-dom/client";
2
- import { mount as mountDevTools } from "@latticexyz/dev-tools";
3
2
  import { App } from "./App";
4
3
  import { setup } from "./mud/setup";
5
4
  import { MUDProvider } from "./MUDContext";
5
+ import mudConfig from "contracts/mud.config";
6
6
 
7
7
  const rootElement = document.getElementById("react-root");
8
8
  if (!rootElement) throw new Error("React root not found");
9
9
  const root = ReactDOM.createRoot(rootElement);
10
10
 
11
11
  // TODO: figure out if we actually want this to be async or if we should render something else in the meantime
12
- setup().then((result) => {
12
+ setup().then(async (result) => {
13
13
  root.render(
14
14
  <MUDProvider value={result}>
15
15
  <App />
16
16
  </MUDProvider>
17
17
  );
18
- mountDevTools();
18
+
19
+ // https://vitejs.dev/guide/env-and-mode.html
20
+ if (import.meta.env.DEV) {
21
+ const { mount: mountDevTools } = await import("@latticexyz/dev-tools");
22
+ mountDevTools({
23
+ config: mudConfig,
24
+ publicClient: result.network.publicClient,
25
+ walletClient: result.network.walletClient,
26
+ latestBlock$: result.network.latestBlock$,
27
+ blockStorageOperations$: result.network.blockStorageOperations$,
28
+ worldAddress: result.network.worldContract.address,
29
+ worldAbi: result.network.worldContract.abi,
30
+ write$: result.network.write$,
31
+ recsWorld: result.network.world,
32
+ });
33
+ }
19
34
  });
@@ -2,16 +2,15 @@ import { createPublicClient, fallback, webSocket, http, createWalletClient, Hex,
2
2
  import { createFaucetService } from "@latticexyz/network";
3
3
  import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs";
4
4
  import { getNetworkConfig } from "./getNetworkConfig";
5
- import { defineContractComponents } from "./contractComponents";
6
5
  import { world } from "./world";
7
6
  import { IWorld__factory } from "contracts/types/ethers-contracts/factories/IWorld__factory";
8
- import storeConfig from "contracts/mud.config";
9
- import { createBurnerAccount, createContract, transportObserver } from "@latticexyz/common";
7
+ import { createBurnerAccount, createContract, transportObserver, ContractWrite } from "@latticexyz/common";
8
+ import { Subject, share } from "rxjs";
9
+ import mudConfig from "contracts/mud.config";
10
10
 
11
11
  export type SetupNetworkResult = Awaited<ReturnType<typeof setupNetwork>>;
12
12
 
13
13
  export async function setupNetwork() {
14
- const contractComponents = defineContractComponents(world);
15
14
  const networkConfig = await getNetworkConfig();
16
15
 
17
16
  const clientOptions = {
@@ -28,19 +27,20 @@ export async function setupNetwork() {
28
27
  account: burnerAccount,
29
28
  });
30
29
 
30
+ const write$ = new Subject<ContractWrite>();
31
31
  const worldContract = createContract({
32
32
  address: networkConfig.worldAddress as Hex,
33
33
  abi: IWorld__factory.abi,
34
34
  publicClient,
35
35
  walletClient: burnerWalletClient,
36
+ onWrite: (write) => write$.next(write),
36
37
  });
37
38
 
38
39
  const { components, latestBlock$, blockStorageOperations$, waitForTransaction } = await syncToRecs({
39
40
  world,
40
- config: storeConfig,
41
+ config: mudConfig,
41
42
  address: networkConfig.worldAddress as Hex,
42
43
  publicClient,
43
- components: contractComponents,
44
44
  startBlock: BigInt(networkConfig.initialBlockNumber),
45
45
  });
46
46
 
@@ -74,9 +74,10 @@ export async function setupNetwork() {
74
74
  playerEntity: encodeEntity({ address: "address" }, { address: burnerWalletClient.account.address }),
75
75
  publicClient,
76
76
  walletClient: burnerWalletClient,
77
- worldContract,
78
77
  latestBlock$,
79
78
  blockStorageOperations$,
80
79
  waitForTransaction,
80
+ worldContract,
81
+ write$: write$.asObservable().pipe(share()),
81
82
  };
82
83
  }
@@ -6,11 +6,11 @@
6
6
  "scripts": {
7
7
  "build": "pnpm run build:mud && pnpm run build:abi && pnpm run build:typechain",
8
8
  "build:abi": "forge clean && forge build",
9
- "build:mud": "mud tablegen && mud worldgen && mud tsgen --configPath mud.config.ts --out ../client/src/mud",
9
+ "build:mud": "mud tablegen && mud worldgen",
10
10
  "build:typechain": "rimraf types && typechain --target=ethers-v5 out/IWorld.sol/IWorld.json",
11
11
  "deploy:local": "pnpm run build && mud deploy",
12
12
  "deploy:testnet": "pnpm run build && mud deploy --profile=lattice-testnet",
13
- "dev": "pnpm mud dev-contracts --tsgenOutput ../client/src/mud",
13
+ "dev": "pnpm mud dev-contracts",
14
14
  "lint": "pnpm run prettier && pnpm run solhint",
15
15
  "prettier": "prettier --write 'src/**/*.sol'",
16
16
  "solhint": "solhint --config ./.solhint.json 'src/**/*.sol' --fix",
@@ -27,7 +27,8 @@
27
27
  "ethers": "^5.7.2",
28
28
  "react": "^18.2.0",
29
29
  "react-dom": "^18.2.0",
30
- "viem": "1.3.1"
30
+ "rxjs": "7.5.5",
31
+ "viem": "1.6.0"
31
32
  },
32
33
  "devDependencies": {
33
34
  "@types/react": "^18.2.6",
@@ -1,19 +1,34 @@
1
1
  import ReactDOM from "react-dom/client";
2
- import { mount as mountDevTools } from "@latticexyz/dev-tools";
3
2
  import { App } from "./App";
4
3
  import { setup } from "./mud/setup";
5
4
  import { MUDProvider } from "./MUDContext";
5
+ import mudConfig from "contracts/mud.config";
6
6
 
7
7
  const rootElement = document.getElementById("react-root");
8
8
  if (!rootElement) throw new Error("React root not found");
9
9
  const root = ReactDOM.createRoot(rootElement);
10
10
 
11
11
  // TODO: figure out if we actually want this to be async or if we should render something else in the meantime
12
- setup().then((result) => {
12
+ setup().then(async (result) => {
13
13
  root.render(
14
14
  <MUDProvider value={result}>
15
15
  <App />
16
16
  </MUDProvider>
17
17
  );
18
- mountDevTools();
18
+
19
+ // https://vitejs.dev/guide/env-and-mode.html
20
+ if (import.meta.env.DEV) {
21
+ const { mount: mountDevTools } = await import("@latticexyz/dev-tools");
22
+ mountDevTools({
23
+ config: mudConfig,
24
+ publicClient: result.network.publicClient,
25
+ walletClient: result.network.walletClient,
26
+ latestBlock$: result.network.latestBlock$,
27
+ blockStorageOperations$: result.network.blockStorageOperations$,
28
+ worldAddress: result.network.worldContract.address,
29
+ worldAbi: result.network.worldContract.abi,
30
+ write$: result.network.write$,
31
+ recsWorld: result.network.world,
32
+ });
33
+ }
19
34
  });
@@ -2,16 +2,15 @@ import { createPublicClient, fallback, webSocket, http, createWalletClient, Hex,
2
2
  import { createFaucetService } from "@latticexyz/network";
3
3
  import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs";
4
4
  import { getNetworkConfig } from "./getNetworkConfig";
5
- import { defineContractComponents } from "./contractComponents";
6
5
  import { world } from "./world";
7
6
  import { IWorld__factory } from "contracts/types/ethers-contracts/factories/IWorld__factory";
8
- import storeConfig from "contracts/mud.config";
9
- import { createBurnerAccount, createContract, transportObserver } from "@latticexyz/common";
7
+ import { createBurnerAccount, createContract, transportObserver, ContractWrite } from "@latticexyz/common";
8
+ import { Subject, share } from "rxjs";
9
+ import mudConfig from "contracts/mud.config";
10
10
 
11
11
  export type SetupNetworkResult = Awaited<ReturnType<typeof setupNetwork>>;
12
12
 
13
13
  export async function setupNetwork() {
14
- const contractComponents = defineContractComponents(world);
15
14
  const networkConfig = await getNetworkConfig();
16
15
 
17
16
  const clientOptions = {
@@ -28,19 +27,20 @@ export async function setupNetwork() {
28
27
  account: burnerAccount,
29
28
  });
30
29
 
30
+ const write$ = new Subject<ContractWrite>();
31
31
  const worldContract = createContract({
32
32
  address: networkConfig.worldAddress as Hex,
33
33
  abi: IWorld__factory.abi,
34
34
  publicClient,
35
35
  walletClient: burnerWalletClient,
36
+ onWrite: (write) => write$.next(write),
36
37
  });
37
38
 
38
39
  const { components, latestBlock$, blockStorageOperations$, waitForTransaction } = await syncToRecs({
39
40
  world,
40
- config: storeConfig,
41
+ config: mudConfig,
41
42
  address: networkConfig.worldAddress as Hex,
42
43
  publicClient,
43
- components: contractComponents,
44
44
  startBlock: BigInt(networkConfig.initialBlockNumber),
45
45
  });
46
46
 
@@ -74,9 +74,10 @@ export async function setupNetwork() {
74
74
  playerEntity: encodeEntity({ address: "address" }, { address: burnerWalletClient.account.address }),
75
75
  publicClient,
76
76
  walletClient: burnerWalletClient,
77
- worldContract,
78
77
  latestBlock$,
79
78
  blockStorageOperations$,
80
79
  waitForTransaction,
80
+ worldContract,
81
+ write$: write$.asObservable().pipe(share()),
81
82
  };
82
83
  }
@@ -6,11 +6,11 @@
6
6
  "scripts": {
7
7
  "build": "pnpm run build:mud && pnpm run build:abi && pnpm run build:typechain",
8
8
  "build:abi": "forge clean && forge build",
9
- "build:mud": "mud tablegen && mud worldgen && mud tsgen --configPath mud.config.ts --out ../client/src/mud",
9
+ "build:mud": "mud tablegen && mud worldgen",
10
10
  "build:typechain": "rimraf types && typechain --target=ethers-v5 out/IWorld.sol/IWorld.json",
11
11
  "deploy:local": "pnpm run build && mud deploy",
12
12
  "deploy:testnet": "pnpm run build && mud deploy --profile=lattice-testnet",
13
- "dev": "pnpm mud dev-contracts --tsgenOutput ../client/src/mud",
13
+ "dev": "pnpm mud dev-contracts",
14
14
  "lint": "pnpm run prettier && pnpm run solhint",
15
15
  "prettier": "prettier --write 'src/**/*.sol'",
16
16
  "solhint": "solhint --config ./.solhint.json 'src/**/*.sol' --fix",
@@ -23,7 +23,8 @@
23
23
  "@latticexyz/world": "{{mud-version}}",
24
24
  "contracts": "workspace:*",
25
25
  "ethers": "^5.7.2",
26
- "viem": "1.3.1"
26
+ "rxjs": "7.5.5",
27
+ "viem": "1.6.0"
27
28
  },
28
29
  "devDependencies": {
29
30
  "vite": "^4.2.1",
@@ -1,9 +1,10 @@
1
- import { mount as mountDevTools } from "@latticexyz/dev-tools";
2
1
  import { setup } from "./mud/setup";
2
+ import mudConfig from "contracts/mud.config";
3
3
 
4
4
  const {
5
5
  components,
6
6
  systemCalls: { increment },
7
+ network,
7
8
  } = await setup();
8
9
 
9
10
  // Components expose a stream that triggers when the component is updated.
@@ -19,4 +20,18 @@ components.Counter.update$.subscribe((update) => {
19
20
  console.log("new counter value:", await increment());
20
21
  };
21
22
 
22
- mountDevTools();
23
+ // https://vitejs.dev/guide/env-and-mode.html
24
+ if (import.meta.env.DEV) {
25
+ const { mount: mountDevTools } = await import("@latticexyz/dev-tools");
26
+ mountDevTools({
27
+ config: mudConfig,
28
+ publicClient: network.publicClient,
29
+ walletClient: network.walletClient,
30
+ latestBlock$: network.latestBlock$,
31
+ blockStorageOperations$: network.blockStorageOperations$,
32
+ worldAddress: network.worldContract.address,
33
+ worldAbi: network.worldContract.abi,
34
+ write$: network.write$,
35
+ recsWorld: network.world,
36
+ });
37
+ }
@@ -2,16 +2,15 @@ import { createPublicClient, fallback, webSocket, http, createWalletClient, Hex,
2
2
  import { createFaucetService } from "@latticexyz/network";
3
3
  import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs";
4
4
  import { getNetworkConfig } from "./getNetworkConfig";
5
- import { defineContractComponents } from "./contractComponents";
6
5
  import { world } from "./world";
7
6
  import { IWorld__factory } from "contracts/types/ethers-contracts/factories/IWorld__factory";
8
- import storeConfig from "contracts/mud.config";
9
- import { createBurnerAccount, createContract, transportObserver } from "@latticexyz/common";
7
+ import { createBurnerAccount, createContract, transportObserver, ContractWrite } from "@latticexyz/common";
8
+ import { Subject, share } from "rxjs";
9
+ import mudConfig from "contracts/mud.config";
10
10
 
11
11
  export type SetupNetworkResult = Awaited<ReturnType<typeof setupNetwork>>;
12
12
 
13
13
  export async function setupNetwork() {
14
- const contractComponents = defineContractComponents(world);
15
14
  const networkConfig = await getNetworkConfig();
16
15
 
17
16
  const clientOptions = {
@@ -28,19 +27,20 @@ export async function setupNetwork() {
28
27
  account: burnerAccount,
29
28
  });
30
29
 
30
+ const write$ = new Subject<ContractWrite>();
31
31
  const worldContract = createContract({
32
32
  address: networkConfig.worldAddress as Hex,
33
33
  abi: IWorld__factory.abi,
34
34
  publicClient,
35
35
  walletClient: burnerWalletClient,
36
+ onWrite: (write) => write$.next(write),
36
37
  });
37
38
 
38
39
  const { components, latestBlock$, blockStorageOperations$, waitForTransaction } = await syncToRecs({
39
40
  world,
40
- config: storeConfig,
41
+ config: mudConfig,
41
42
  address: networkConfig.worldAddress as Hex,
42
43
  publicClient,
43
- components: contractComponents,
44
44
  startBlock: BigInt(networkConfig.initialBlockNumber),
45
45
  });
46
46
 
@@ -74,9 +74,10 @@ export async function setupNetwork() {
74
74
  playerEntity: encodeEntity({ address: "address" }, { address: burnerWalletClient.account.address }),
75
75
  publicClient,
76
76
  walletClient: burnerWalletClient,
77
- worldContract,
78
77
  latestBlock$,
79
78
  blockStorageOperations$,
80
79
  waitForTransaction,
80
+ worldContract,
81
+ write$: write$.asObservable().pipe(share()),
81
82
  };
82
83
  }
@@ -6,11 +6,11 @@
6
6
  "scripts": {
7
7
  "build": "pnpm run build:mud && pnpm run build:abi && pnpm run build:typechain",
8
8
  "build:abi": "forge clean && forge build",
9
- "build:mud": "mud tablegen && mud worldgen && mud tsgen --configPath mud.config.ts --out ../client/src/mud",
9
+ "build:mud": "mud tablegen && mud worldgen",
10
10
  "build:typechain": "rimraf types && typechain --target=ethers-v5 out/IWorld.sol/IWorld.json",
11
11
  "deploy:local": "pnpm run build && mud deploy",
12
12
  "deploy:testnet": "pnpm run build && mud deploy --profile=lattice-testnet",
13
- "dev": "pnpm mud dev-contracts --tsgenOutput ../client/src/mud",
13
+ "dev": "pnpm mud dev-contracts",
14
14
  "lint": "pnpm run prettier && pnpm run solhint",
15
15
  "prettier": "prettier --write 'src/**/*.sol'",
16
16
  "solhint": "solhint --config ./.solhint.json 'src/**/*.sol' --fix",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-mud",
3
- "version": "2.0.0-next.1",
3
+ "version": "2.0.0-next.2",
4
4
  "description": "Create a new MUD project",
5
5
  "license": "MIT",
6
6
  "author": "Lattice <mud@lattice.xyz>",
@@ -1,27 +0,0 @@
1
- /* Autogenerated file. Do not edit manually. */
2
-
3
- import {
4
- defineComponent,
5
- Type as RecsType,
6
- type World,
7
- } from "@latticexyz/recs";
8
-
9
- export function defineContractComponents(world: World) {
10
- return {
11
- Counter: defineComponent(
12
- world,
13
- {
14
- value: RecsType.Number,
15
- },
16
- {
17
- id: "0x00000000000000000000000000000000436f756e746572000000000000000000",
18
- metadata: {
19
- componentName: "Counter",
20
- tableName: ":Counter",
21
- keySchema: {},
22
- valueSchema: { value: "uint32" },
23
- },
24
- } as const
25
- ),
26
- };
27
- }
@@ -1,27 +0,0 @@
1
- /* Autogenerated file. Do not edit manually. */
2
-
3
- import {
4
- defineComponent,
5
- Type as RecsType,
6
- type World,
7
- } from "@latticexyz/recs";
8
-
9
- export function defineContractComponents(world: World) {
10
- return {
11
- Counter: defineComponent(
12
- world,
13
- {
14
- value: RecsType.Number,
15
- },
16
- {
17
- id: "0x00000000000000000000000000000000436f756e746572000000000000000000",
18
- metadata: {
19
- componentName: "Counter",
20
- tableName: ":Counter",
21
- keySchema: {},
22
- valueSchema: { value: "uint32" },
23
- },
24
- } as const
25
- ),
26
- };
27
- }
@@ -1,29 +0,0 @@
1
- /* Autogenerated file. Do not edit manually. */
2
-
3
- import {
4
- defineComponent,
5
- Type as RecsType,
6
- type World,
7
- } from "@latticexyz/recs";
8
-
9
- export function defineContractComponents(world: World) {
10
- return {
11
- Position: defineComponent(
12
- world,
13
- {
14
- x: RecsType.Number,
15
- y: RecsType.Number,
16
- z: RecsType.Number,
17
- },
18
- {
19
- id: "0x00000000000000000000000000000000506f736974696f6e0000000000000000",
20
- metadata: {
21
- componentName: "Position",
22
- tableName: ":Position",
23
- keySchema: { key: "bytes32" },
24
- valueSchema: { x: "int32", y: "int32", z: "int32" },
25
- },
26
- } as const
27
- ),
28
- };
29
- }
@@ -1,27 +0,0 @@
1
- /* Autogenerated file. Do not edit manually. */
2
-
3
- import {
4
- defineComponent,
5
- Type as RecsType,
6
- type World,
7
- } from "@latticexyz/recs";
8
-
9
- export function defineContractComponents(world: World) {
10
- return {
11
- Counter: defineComponent(
12
- world,
13
- {
14
- value: RecsType.Number,
15
- },
16
- {
17
- id: "0x00000000000000000000000000000000436f756e746572000000000000000000",
18
- metadata: {
19
- componentName: "Counter",
20
- tableName: ":Counter",
21
- keySchema: {},
22
- valueSchema: { value: "uint32" },
23
- },
24
- } as const
25
- ),
26
- };
27
- }