Skip to content

Commit 83583a5

Browse files
frolicalvrs
andauthored
feat: move forge build + abi + abi-ts to out (latticexyz#1483)
Co-authored-by: alvarius <[email protected]>
1 parent 639955b commit 83583a5

File tree

325 files changed

+131
-35048
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

325 files changed

+131
-35048
lines changed

.changeset/many-pumpkins-cry.md

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
---
2+
"@latticexyz/store": major
3+
"@latticexyz/world": major
4+
---
5+
6+
Store and World contract ABIs are now exported from the `out` directory. You'll need to update your imports like:
7+
8+
```diff
9+
- import IBaseWorldAbi from "@latticexyz/world/abi/IBaseWorld.sol/IBaseWorldAbi.json";
10+
+ import IBaseWorldAbi from "@latticexyz/world/out/IBaseWorld.sol/IBaseWorldAbi.json";
11+
```
12+
13+
`MudTest.sol` was also moved to the World package. You can update your import like:
14+
15+
```diff
16+
- import { MudTest } from "@latticexyz/store/src/MudTest.sol";
17+
+ import { MudTest } from "@latticexyz/world/test/MudTest.t.sol";
18+
```

.changeset/modern-trains-remain.md

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
"create-mud": minor
3+
---
4+
5+
Templates now use `out` for their `forge build` artifacts, including ABIs. If you have a project created from a previous template, you can update your `packages/contracts/package.json` with:
6+
7+
```diff
8+
- "build:abi": "rimraf abi && forge build --extra-output-files abi --out abi --skip test script MudTest.sol",
9+
- "build:abi-ts": "mud abi-ts --input 'abi/IWorld.sol/IWorld.abi.json' && prettier --write '**/*.abi.json.d.ts'",
10+
+ "build:abi": "forge clean && forge build --skip test script",
11+
+ "build:abi-ts": "mud abi-ts && prettier --write '**/*.abi.json.d.ts'",
12+
```
13+
14+
And your `packages/client/src/mud/setupNetwork` with:
15+
16+
```diff
17+
- import IWorldAbi from "contracts/abi/IWorld.sol/IWorld.abi.json";
18+
+ import IWorldAbi from "contracts/out/IWorld.sol/IWorld.abi.json";
19+
```

.changeset/sweet-kiwis-unite.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@latticexyz/cli": patch
3+
---
4+
5+
`deploy` and `dev-contracts` CLI commands now use `forge build --skip test script` before deploying and run `mud abi-ts` to generate strong types for ABIs.

.dockerignore

-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,5 @@ dist
88
**/cache/
99
**/bindings/
1010
**/artifacts/
11-
**/abi/
1211
**/broadcast/
1312
**/deploys/

.gitattributes

-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
11
# suppress diffs for codegen in PRs
2-
**/abi/**/*.json linguist-generated=true
3-
**/abi/**/*.json.d.ts linguist-generated=true
42
**/codegen/**/*.sol linguist-generated=true

e2e/packages/client-vanilla/src/mud/setupNetwork.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { createFaucetService } from "@latticexyz/services/faucet";
33
import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs";
44
import { getNetworkConfig } from "./getNetworkConfig";
55
import { world } from "./world";
6-
import IWorldAbi from "contracts/abi/IWorld.sol/IWorld.abi.json";
6+
import IWorldAbi from "contracts/out/IWorld.sol/IWorld.abi.json";
77
import { createBurnerAccount, createContract, transportObserver } from "@latticexyz/common";
88
import mudConfig from "contracts/mud.config";
99

e2e/packages/contracts/.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ cache/
33
node_modules/
44
bindings/
55
artifacts/
6-
abi/
76
broadcast/
87

98
# Ignore all deploy artifacts

e2e/packages/contracts/package.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
"license": "MIT",
66
"scripts": {
77
"build": "pnpm run build:mud && pnpm run build:abi && pnpm run build:abi-ts",
8-
"build:abi": "forge build --extra-output-files abi --out abi --skip test script MudTest.sol",
9-
"build:abi-ts": "mud abi-ts --input 'abi/IWorld.sol/IWorld.abi.json' && prettier --write '**/*.abi.json.d.ts'",
8+
"build:abi": "forge build --skip test script",
9+
"build:abi-ts": "mud abi-ts && prettier --write '**/*.abi.json.d.ts'",
1010
"build:mud": "mud tablegen && mud worldgen",
1111
"clean": "pnpm run clean:abi && pnpm run clean:mud",
12-
"clean:abi": "rimraf abi",
12+
"clean:abi": "forge clean",
1313
"clean:mud": "rimraf src/codegen",
1414
"deploy:local": "mud deploy",
1515
"test": "mud test",

e2e/packages/contracts/test/Worldgen.t.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: MIT
22
pragma solidity >=0.8.0;
33

4-
import { MudTest } from "@latticexyz/store/src/MudTest.sol";
4+
import { MudTest } from "@latticexyz/world/test/MudTest.t.sol";
55

66
import { ICustomErrorsSystem } from "../src/codegen/world/ICustomErrorsSystem.sol";
77
import { Position } from "../src/CustomTypes.sol";

e2e/packages/sync-test/data/callWorld.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Page } from "@playwright/test";
2-
import IWorldAbi from "../../contracts/abi/IWorld.sol/IWorld.abi.json";
2+
import IWorldAbi from "../../contracts/out/IWorld.sol/IWorld.abi.json";
33
import { GetContractReturnType, PublicClient, WalletClient } from "viem";
44
import { AbiParametersToPrimitiveTypes, ExtractAbiFunction, ExtractAbiFunctionNames } from "abitype";
55

e2e/packages/test-data/generate-test-data.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import { mudFoundry } from "@latticexyz/common/chains";
1616
import { createContract } from "@latticexyz/common";
1717
import { storeEventsAbi } from "@latticexyz/store";
1818
import { privateKeyToAccount } from "viem/accounts";
19-
import IWorldAbi from "../contracts/abi/IWorld.sol/IWorld.abi.json";
19+
import IWorldAbi from "../contracts/out/IWorld.sol/IWorld.abi.json";
2020

2121
const logsFilename = path.join(path.dirname(fileURLToPath(import.meta.url)), `../../../test-data/world-logs.json`);
2222

examples/minimal/packages/client-phaser/src/mud/setupNetwork.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { createFaucetService } from "@latticexyz/services/faucet";
33
import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs";
44
import { getNetworkConfig } from "./getNetworkConfig";
55
import { world } from "./world";
6-
import IWorldAbi from "contracts/abi/IWorld.sol/IWorld.abi.json";
6+
import IWorldAbi from "contracts/out/IWorld.sol/IWorld.abi.json";
77
import { createBurnerAccount, createContract, transportObserver, ContractWrite } from "@latticexyz/common";
88
import { Subject, share } from "rxjs";
99
import mudConfig from "contracts/mud.config";

examples/minimal/packages/client-react/src/mud/setupNetwork.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { createFaucetService } from "@latticexyz/services/faucet";
33
import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs";
44
import { getNetworkConfig } from "./getNetworkConfig";
55
import { world } from "./world";
6-
import IWorldAbi from "contracts/abi/IWorld.sol/IWorld.abi.json";
6+
import IWorldAbi from "contracts/out/IWorld.sol/IWorld.abi.json";
77
import { ContractWrite, createBurnerAccount, createContract, transportObserver } from "@latticexyz/common";
88
import { Subject, share } from "rxjs";
99
import mudConfig from "contracts/mud.config";

examples/minimal/packages/client-vanilla/src/mud/setupNetwork.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { createFaucetService } from "@latticexyz/services/faucet";
33
import { encodeEntity, syncToRecs } from "@latticexyz/store-sync/recs";
44
import { getNetworkConfig } from "./getNetworkConfig";
55
import { world } from "./world";
6-
import IWorldAbi from "contracts/abi/IWorld.sol/IWorld.abi.json";
6+
import IWorldAbi from "contracts/out/IWorld.sol/IWorld.abi.json";
77
import { createBurnerAccount, createContract, transportObserver, ContractWrite } from "@latticexyz/common";
88
import { Subject, share } from "rxjs";
99
import mudConfig from "contracts/mud.config";

examples/minimal/packages/contracts/.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ cache/
33
node_modules/
44
bindings/
55
artifacts/
6-
abi/
76
broadcast/
87

98
# Ignore MUD deploy artifacts

examples/minimal/packages/contracts/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
"license": "MIT",
66
"scripts": {
77
"build": "pnpm run build:mud && pnpm run build:abi && pnpm run build:abi-ts",
8-
"build:abi": "rimraf abi && forge build --extra-output-files abi --out abi --skip test script MudTest.sol",
9-
"build:abi-ts": "mud abi-ts --input 'abi/IWorld.sol/IWorld.abi.json' && prettier --write '**/*.abi.json.d.ts'",
8+
"build:abi": "forge clean && forge build --skip test script",
9+
"build:abi-ts": "mud abi-ts && prettier --write '**/*.abi.json.d.ts'",
1010
"build:mud": "mud tablegen && mud worldgen",
1111
"deploy:local": "pnpm run build && mud deploy",
1212
"deploy:testnet": "pnpm run build && mud deploy --profile=lattice-testnet",

examples/minimal/packages/contracts/test/ChatNamespaced.t.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
pragma solidity >=0.8.0;
33

44
import "forge-std/Test.sol";
5-
import { MudTest } from "@latticexyz/store/src/MudTest.sol";
5+
import { MudTest } from "@latticexyz/world/test/MudTest.t.sol";
66
import { getKeysWithValue } from "@latticexyz/world/src/modules/keyswithvalue/getKeysWithValue.sol";
77
import { StoreCore } from "@latticexyz/store/src/StoreCore.sol";
88

examples/minimal/packages/contracts/test/CounterTest.t.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
pragma solidity >=0.8.0;
33

44
import "forge-std/Test.sol";
5-
import { MudTest } from "@latticexyz/store/src/MudTest.sol";
5+
import { MudTest } from "@latticexyz/world/test/MudTest.t.sol";
66
import { getKeysWithValue } from "@latticexyz/world/src/modules/keyswithvalue/getKeysWithValue.sol";
77

88
import { IWorld } from "../src/codegen/world/IWorld.sol";

examples/minimal/packages/contracts/test/StructTest.t.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
pragma solidity >=0.8.0;
33

44
import "forge-std/Test.sol";
5-
import { MudTest } from "@latticexyz/store/src/MudTest.sol";
5+
import { MudTest } from "@latticexyz/world/test/MudTest.t.sol";
66
import { getKeysWithValue } from "@latticexyz/world/src/modules/keyswithvalue/getKeysWithValue.sol";
77

88
import { IWorld } from "../src/codegen/world/IWorld.sol";

examples/minimal/packages/plugin-example/.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,3 @@ out/
33
cache/
44
node_modules/
55
artifacts/
6-
abi/

packages/cli/foundry.toml

+4
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,7 @@ allow_paths = ["../../node_modules", "../"]
1010
src = "contracts/src"
1111
out = "contracts/out"
1212
test = "contracts/test"
13+
extra_output_files = [
14+
"abi",
15+
"evm.bytecode"
16+
]

packages/cli/src/commands/dev-contracts.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,10 @@ const commandModule: CommandModule<Options, Options> = {
141141
await worldgenHandler({ config, clean: true, srcDir: srcDirectory });
142142

143143
// Build the contracts
144-
await forge(["build"]);
144+
await forge(["build", "--skip", "test", "script"]);
145145

146-
// Generate TS-friendly ABI files
147-
// We rebuild into a separate dir to have a clean set of ABIs without test/script contracts
148-
await forge(["build", "--extra-output-files", "abi", "--out", "abi", "--skip", "test", "script", "MudTest.sol"]);
149-
await execa("mud", ["abi-ts"]);
146+
// Generate TS type definitions for ABIs
147+
await execa("mud", ["abi-ts"], { stdio: "inherit" });
150148
}
151149

152150
/** Run after codegen if either mud config or contracts changed */

packages/cli/src/commands/trace.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { MUDError } from "@latticexyz/common/errors";
77
import { cast, getRpcUrl, getSrcDirectory } from "@latticexyz/common/foundry";
88
import { StoreConfig } from "@latticexyz/store";
99
import { resolveWorldConfig, WorldConfig } from "@latticexyz/world";
10-
import IBaseWorldData from "@latticexyz/world/abi/IBaseWorld.sol/IBaseWorld.json" assert { type: "json" };
10+
import IBaseWorldData from "@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.json" assert { type: "json" };
1111
import worldConfig from "@latticexyz/world/mud.config.js";
1212
import { tableIdToHex } from "@latticexyz/common";
1313
import { getChainId, getExistingContracts } from "../utils";

packages/cli/src/utils/deploy.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ import { encodeSchema, getStaticByteLength } from "@latticexyz/schema-type/depre
1111
import { StoreConfig } from "@latticexyz/store";
1212
import { resolveAbiOrUserType } from "@latticexyz/store/codegen";
1313
import { WorldConfig, resolveWorldConfig } from "@latticexyz/world";
14-
import IBaseWorldData from "@latticexyz/world/abi/IBaseWorld.sol/IBaseWorld.json" assert { type: "json" };
15-
import WorldData from "@latticexyz/world/abi/World.sol/World.json" assert { type: "json" };
16-
import CoreModuleData from "@latticexyz/world/abi/CoreModule.sol/CoreModule.json" assert { type: "json" };
17-
import KeysWithValueModuleData from "@latticexyz/world/abi/KeysWithValueModule.sol/KeysWithValueModule.json" assert { type: "json" };
18-
import KeysInTableModuleData from "@latticexyz/world/abi/KeysInTableModule.sol/KeysInTableModule.json" assert { type: "json" };
19-
import UniqueEntityModuleData from "@latticexyz/world/abi/UniqueEntityModule.sol/UniqueEntityModule.json" assert { type: "json" };
14+
import IBaseWorldData from "@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.json" assert { type: "json" };
15+
import WorldData from "@latticexyz/world/out/World.sol/World.json" assert { type: "json" };
16+
import CoreModuleData from "@latticexyz/world/out/CoreModule.sol/CoreModule.json" assert { type: "json" };
17+
import KeysWithValueModuleData from "@latticexyz/world/out/KeysWithValueModule.sol/KeysWithValueModule.json" assert { type: "json" };
18+
import KeysInTableModuleData from "@latticexyz/world/out/KeysInTableModule.sol/KeysInTableModule.json" assert { type: "json" };
19+
import UniqueEntityModuleData from "@latticexyz/world/out/UniqueEntityModule.sol/UniqueEntityModule.json" assert { type: "json" };
2020
import { tableIdToHex } from "@latticexyz/common";
2121
import { fieldLayoutToHex } from "@latticexyz/protocol-parser";
2222

packages/cli/src/utils/deployHandler.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { forge, getRpcUrl, getSrcDirectory } from "@latticexyz/common/foundry";
99
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
1010
import { getChainId } from "../utils/getChainId";
1111
import { getExistingContracts } from "./getExistingContracts";
12+
import { execa } from "execa";
1213

1314
export type DeployOptions = {
1415
configPath?: string;
@@ -37,10 +38,15 @@ export async function deployHandler(args: DeployOptions) {
3738
)
3839
);
3940

40-
if (clean) await forge(["clean"], { profile });
41+
if (clean) {
42+
await forge(["clean"], { profile });
43+
}
4144

4245
// Run forge build
43-
if (!skipBuild) await forge(["build"], { profile });
46+
if (!skipBuild) {
47+
await forge(["build", "--skip", "test", "script"], { profile });
48+
await execa("mud", ["abi-ts"], { stdio: "inherit" });
49+
}
4450

4551
// Get a list of all contract names
4652
const srcDir = args?.srcDir ?? (await getSrcDirectory());

packages/gas-report/.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
cache
2-
abi
32
out
43
docs
54
_docs

packages/gas-report/.npmignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
*
22

3-
!abi/**
3+
!out/**/*.abi.json
4+
!out/**/*.abi.json.d.ts
45
!src/**
56
!ts/**
67
!package.json

packages/gas-report/foundry.toml

+4
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,7 @@ allow_paths= ["../../node_modules"]
99
src = "src"
1010
out = "out"
1111
bytecode_hash = "none"
12+
extra_output_files = [
13+
"abi",
14+
"evm.bytecode"
15+
]

packages/noise/foundry.toml

+4
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,7 @@ verbosity = 2
88
allow_paths = ["../../node_modules"]
99
src = "contracts"
1010
out = "out"
11+
extra_output_files = [
12+
"abi",
13+
"evm.bytecode"
14+
]

packages/schema-type/.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
cache
2-
abi
32
out
43
dist
54
docs

packages/schema-type/foundry.toml

+4
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,7 @@ allow_paths = ["../../node_modules"]
99
src = "src/solidity"
1010
out = "out/solidity"
1111
test = "test/solidity"
12+
extra_output_files = [
13+
"abi",
14+
"evm.bytecode"
15+
]

packages/store/.gitignore

-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,3 @@ artifacts
77
yarn-error.log
88
API
99
dist
10-
11-
# only check in ABIs
12-
abi/**/*.json
13-
!abi/**/*.abi.json

packages/store/.npmignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
*
22

3-
!abi/**
3+
!out/**/*.abi.json
4+
!out/**/*.abi.json.d.ts
45
!src/**
56
!ts/**
67
!package.json

packages/store/abi/Bytes.sol/Bytes.abi.json

-1
This file was deleted.

packages/store/abi/Callbacks.sol/Callbacks.abi.json

-1
This file was deleted.

packages/store/abi/DecodeSlice.sol/DecodeSlice.abi.json

-1
This file was deleted.

0 commit comments

Comments
 (0)