@latticexyz/cli 2.0.8-not-npmignore-cache-5d3a93b8 → 2.0.8-not-npmignore-cache-2d3a1a18

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.
package/dist/mud.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import*as i from"dotenv";i.config();async function l(){let{default:r}=await import("yargs"),{default:o}=await import("chalk"),{hideBin:e}=await import("yargs/helpers"),{logError:s}=await import("./errors-MZURIB7V.js"),{commands:t}=await import("./commands-VJAW6WWR.js");r(e(process.argv)).scriptName("mud").command(t).strict().fail((a,n)=>{console.error(o.red(a)),a.includes("Missing required argument")&&console.log(o.yellow(`Run 'pnpm mud ${process.argv[2]} --help' for a list of available and required arguments.`)),console.log(""),n!=null&&(s(n),console.log("")),process.exit(1)}).alias({h:"help"}).argv}l();
2
+ import*as i from"dotenv";i.config();async function l(){let{default:r}=await import("yargs"),{default:o}=await import("chalk"),{hideBin:e}=await import("yargs/helpers"),{logError:s}=await import("./errors-MZURIB7V.js"),{commands:t}=await import("./commands-L6ZRKSMG.js");r(e(process.argv)).scriptName("mud").command(t).strict().fail((a,n)=>{console.error(o.red(a)),a.includes("Missing required argument")&&console.log(o.yellow(`Run 'pnpm mud ${process.argv[2]} --help' for a list of available and required arguments.`)),console.log(""),n!=null&&(s(n),console.log("")),process.exit(1)}).alias({h:"help"}).argv}l();
3
3
  //# sourceMappingURL=mud.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@latticexyz/cli",
3
- "version": "2.0.8-not-npmignore-cache-5d3a93b8",
3
+ "version": "2.0.8-not-npmignore-cache-2d3a1a18",
4
4
  "description": "Command line interface for mud",
5
5
  "repository": {
6
6
  "type": "git",
@@ -44,17 +44,17 @@
44
44
  "yargs": "^17.7.1",
45
45
  "zod": "^3.21.4",
46
46
  "zod-validation-error": "^1.3.0",
47
- "@latticexyz/abi-ts": "2.0.8-not-npmignore-cache-5d3a93b8",
48
- "@latticexyz/common": "2.0.8-not-npmignore-cache-5d3a93b8",
49
- "@latticexyz/config": "2.0.8-not-npmignore-cache-5d3a93b8",
50
- "@latticexyz/gas-report": "2.0.8-not-npmignore-cache-5d3a93b8",
51
- "@latticexyz/protocol-parser": "2.0.8-not-npmignore-cache-5d3a93b8",
52
- "@latticexyz/schema-type": "2.0.8-not-npmignore-cache-5d3a93b8",
53
- "@latticexyz/services": "2.0.8-not-npmignore-cache-5d3a93b8",
54
- "@latticexyz/store": "2.0.8-not-npmignore-cache-5d3a93b8",
55
- "@latticexyz/utils": "2.0.8-not-npmignore-cache-5d3a93b8",
56
- "@latticexyz/world": "2.0.8-not-npmignore-cache-5d3a93b8",
57
- "@latticexyz/world-modules": "2.0.8-not-npmignore-cache-5d3a93b8"
47
+ "@latticexyz/abi-ts": "2.0.8-not-npmignore-cache-2d3a1a18",
48
+ "@latticexyz/common": "2.0.8-not-npmignore-cache-2d3a1a18",
49
+ "@latticexyz/config": "2.0.8-not-npmignore-cache-2d3a1a18",
50
+ "@latticexyz/gas-report": "2.0.8-not-npmignore-cache-2d3a1a18",
51
+ "@latticexyz/protocol-parser": "2.0.8-not-npmignore-cache-2d3a1a18",
52
+ "@latticexyz/schema-type": "2.0.8-not-npmignore-cache-2d3a1a18",
53
+ "@latticexyz/services": "2.0.8-not-npmignore-cache-2d3a1a18",
54
+ "@latticexyz/store": "2.0.8-not-npmignore-cache-2d3a1a18",
55
+ "@latticexyz/utils": "2.0.8-not-npmignore-cache-2d3a1a18",
56
+ "@latticexyz/world": "2.0.8-not-npmignore-cache-2d3a1a18",
57
+ "@latticexyz/world-modules": "2.0.8-not-npmignore-cache-2d3a1a18"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@types/debug": "^4.1.7",
package/src/verify.ts CHANGED
@@ -7,6 +7,7 @@ import { getDeployer } from "./deploy/getDeployer";
7
7
  import { MUDError } from "@latticexyz/common/errors";
8
8
  import { salt } from "./deploy/common";
9
9
  import { getStorageAt } from "viem/actions";
10
+ import { execa } from "execa";
10
11
 
11
12
  type VerifyOptions = {
12
13
  client: Client<Transport, Chain | undefined>;
@@ -73,94 +74,114 @@ export async function verify({
73
74
  ),
74
75
  );
75
76
 
76
- Object.entries(
77
- usesProxy ? getWorldProxyFactoryContracts(deployerAddress) : getWorldFactoryContracts(deployerAddress),
78
- ).map(([name, { bytecode }]) =>
79
- verifyQueue.add(() =>
80
- verifyContract(
81
- {
82
- name,
83
- rpc,
84
- verifier,
85
- verifierUrl,
86
- address: getCreate2Address({
87
- from: deployerAddress,
88
- bytecode: bytecode,
89
- salt,
90
- }),
91
- },
92
- {
93
- profile: foundryProfile,
94
- cwd: "node_modules/@latticexyz/world",
95
- },
96
- ).catch((error) => {
97
- console.error(`Error verifying world factory contract ${name}:`, error);
98
- }),
99
- ),
100
- );
77
+ {
78
+ const cwd = "node_modules/@latticexyz/world";
101
79
 
102
- modules.map(({ name, bytecode }) =>
103
- verifyQueue.add(() =>
104
- verifyContract(
105
- {
106
- name: name,
107
- rpc,
108
- verifier,
109
- verifierUrl,
110
- address: getCreate2Address({
111
- from: deployerAddress,
112
- bytecode: bytecode,
113
- salt,
114
- }),
115
- },
116
- {
117
- profile: foundryProfile,
118
- cwd: "node_modules/@latticexyz/world-modules",
119
- },
120
- ).catch((error) => {
121
- console.error(`Error verifying module contract ${name}:`, error);
122
- }),
123
- ),
124
- );
80
+ await execa("npm", ["install"], {
81
+ cwd,
82
+ });
125
83
 
126
- // If the world was deployed as a Proxy, verify the proxy and implementation.
127
- if (usesProxy) {
128
- const implementationAddress = sliceHex(implementationStorage, -20);
129
-
130
- verifyQueue.add(() =>
131
- verifyContract(
132
- { name: "WorldProxy", rpc, verifier, verifierUrl, address: worldAddress },
133
- {
134
- profile: foundryProfile,
135
- cwd: "node_modules/@latticexyz/world",
136
- },
137
- ).catch((error) => {
138
- console.error(`Error verifying WorldProxy contract:`, error);
139
- }),
84
+ Object.entries(
85
+ usesProxy ? getWorldProxyFactoryContracts(deployerAddress) : getWorldFactoryContracts(deployerAddress),
86
+ ).map(([name, { bytecode }]) =>
87
+ verifyQueue.add(() =>
88
+ verifyContract(
89
+ {
90
+ name,
91
+ rpc,
92
+ verifier,
93
+ verifierUrl,
94
+ address: getCreate2Address({
95
+ from: deployerAddress,
96
+ bytecode: bytecode,
97
+ salt,
98
+ }),
99
+ },
100
+ {
101
+ profile: foundryProfile,
102
+ cwd,
103
+ },
104
+ ).catch((error) => {
105
+ console.error(`Error verifying world factory contract ${name}:`, error);
106
+ }),
107
+ ),
140
108
  );
109
+ }
141
110
 
142
- verifyQueue.add(() =>
143
- verifyContract(
144
- { name: "World", rpc, verifier, verifierUrl, address: implementationAddress },
145
- {
146
- profile: foundryProfile,
147
- cwd: "node_modules/@latticexyz/world",
148
- },
149
- ).catch((error) => {
150
- console.error(`Error verifying World contract:`, error);
151
- }),
152
- );
153
- } else {
154
- verifyQueue.add(() =>
155
- verifyContract(
156
- { name: "World", rpc, verifier, verifierUrl, address: worldAddress },
157
- {
158
- profile: foundryProfile,
159
- cwd: "node_modules/@latticexyz/world",
160
- },
161
- ).catch((error) => {
162
- console.error(`Error verifying World contract:`, error);
163
- }),
111
+ {
112
+ const cwd = "node_modules/@latticexyz/world-modules";
113
+
114
+ await execa("npm", ["install"], {
115
+ cwd,
116
+ });
117
+
118
+ modules.map(({ name, bytecode }) =>
119
+ verifyQueue.add(() =>
120
+ verifyContract(
121
+ {
122
+ name: name,
123
+ rpc,
124
+ verifier,
125
+ verifierUrl,
126
+ address: getCreate2Address({
127
+ from: deployerAddress,
128
+ bytecode: bytecode,
129
+ salt,
130
+ }),
131
+ },
132
+ {
133
+ profile: foundryProfile,
134
+ cwd,
135
+ },
136
+ ).catch((error) => {
137
+ console.error(`Error verifying module contract ${name}:`, error);
138
+ }),
139
+ ),
164
140
  );
165
141
  }
142
+
143
+ {
144
+ const cwd = "node_modules/@latticexyz/world";
145
+
146
+ // If the world was deployed as a Proxy, verify the proxy and implementation.
147
+ if (usesProxy) {
148
+ const implementationAddress = sliceHex(implementationStorage, -20);
149
+
150
+ verifyQueue.add(() =>
151
+ verifyContract(
152
+ { name: "WorldProxy", rpc, verifier, verifierUrl, address: worldAddress },
153
+ {
154
+ profile: foundryProfile,
155
+ cwd,
156
+ },
157
+ ).catch((error) => {
158
+ console.error(`Error verifying WorldProxy contract:`, error);
159
+ }),
160
+ );
161
+
162
+ verifyQueue.add(() =>
163
+ verifyContract(
164
+ { name: "World", rpc, verifier, verifierUrl, address: implementationAddress },
165
+ {
166
+ profile: foundryProfile,
167
+ cwd,
168
+ },
169
+ ).catch((error) => {
170
+ console.error(`Error verifying World contract:`, error);
171
+ }),
172
+ );
173
+ } else {
174
+ verifyQueue.add(() =>
175
+ verifyContract(
176
+ { name: "World", rpc, verifier, verifierUrl, address: worldAddress },
177
+ {
178
+ profile: foundryProfile,
179
+ cwd: "node_modules/@latticexyz/world",
180
+ },
181
+ ).catch((error) => {
182
+ console.error(`Error verifying World contract:`, error);
183
+ }),
184
+ );
185
+ }
186
+ }
166
187
  }
@@ -1,38 +0,0 @@
1
- import{a as K}from"./chunk-QXUPZVZL.js";import Zs from"@latticexyz/gas-report";import Xs from"@latticexyz/abi-ts";import{loadConfig as Zo}from"@latticexyz/config/node";import{getSrcDirectory as Xo}from"@latticexyz/common/foundry";import _o from"node:path";import{tablegen as Ko}from"@latticexyz/store/codegen";import{worldgen as Jo}from"@latticexyz/world/node";import{worldToV1 as qo}from"@latticexyz/world/config/v2";import{forge as Yo,getRemappings as Go}from"@latticexyz/common/foundry";import Lo from"glob";import{basename as Vo}from"path";function k(e){return Lo.sync(`${e}/**/*.sol`).map(o=>({path:o,basename:Vo(o,".sol")}))}import{execa as Qo}from"execa";async function J({config:e,srcDir:o,foundryProfile:n=process.env.FOUNDRY_PROFILE}){let t=qo(e),r=_o.join(o,t.codegenDirectory),s=await Go(n);await Promise.all([Ko(e,r,s),Jo(e,k(o),r)]),await Yo(["build"],{profile:n}),await Qo("mud",["abi-ts"],{stdio:"inherit"})}var et={command:"build",describe:"Build contracts and generate MUD artifacts (table libraries, world interface, ABI)",builder(e){return e.options({configPath:{type:"string",desc:"Path to the MUD config file"},profile:{type:"string",desc:"The foundry profile to use"}})},async handler({configPath:e,profile:o}){let n=await Zo(e),t=await Xo();await J({config:n,srcDir:t,foundryProfile:o}),process.exit(0)}},Ae=et;import{rmSync as ot}from"fs";import{homedir as tt}from"os";import rt from"path";import{execa as nt}from"execa";var st={command:"devnode",describe:"Start a local Ethereum node for development",builder(e){return e.options({blocktime:{type:"number",default:1,decs:"Interval in which new blocks are produced"}})},async handler({blocktime:e}){console.log("Clearing devnode history");let o=tt();ot(rt.join(o,".foundry","anvil","tmp"),{recursive:!0,force:!0});let n=["-b",String(e),"--block-base-fee-per-gas","0"];console.log(`Running: anvil ${n.join(" ")}`);let t=nt("anvil",n,{stdio:["inherit","inherit","inherit"]});process.on("SIGINT",()=>{console.log(`
2
- gracefully shutting down from SIGINT (Crtl-C)`),t.kill(),process.exit()}),await t}},ke=st;import{FaucetServiceDefinition as at}from"@latticexyz/services/faucet";import{createChannel as it,createClient as dt}from"nice-grpc-web";import Ie from"chalk";import{NodeHttpTransport as ct}from"@improbable-eng/grpc-web-node-http-transport";function lt(e){return dt(at,it(e,ct()))}var mt={command:"faucet",describe:"Interact with a MUD faucet",builder(e){return e.options({dripDev:{type:"boolean",desc:"Request a drip from the dev endpoint (requires faucet to have dev mode enabled)",default:!0},faucetUrl:{type:"string",desc:"URL of the MUD faucet",default:"https://faucet.testnet-mud-services.linfra.xyz"},address:{type:"string",desc:"Ethereum address to fund",required:!0}})},async handler({dripDev:e,faucetUrl:o,address:n}){let t=lt(o);e&&(console.log(Ie.yellow("Dripping to",n)),await t.dripDev({address:n}),console.log(Ie.yellow("Success"))),process.exit(0)}},Pe=mt;var pt={command:"hello <name>",describe:"Greet <name> with Hello",builder(e){return e.options({upper:{type:"boolean"}}).positional("name",{type:"string",demandOption:!0})},handler({name:e}){let o=`Gm, ${e}!`;console.log(o),process.exit(0)}},Oe=pt;import ft from"path";import{loadConfig as yt}from"@latticexyz/config/node";import{tablegen as ut}from"@latticexyz/store/codegen";import{getRemappings as gt,getSrcDirectory as bt}from"@latticexyz/common/foundry";var ht={command:"tablegen",describe:"Autogenerate MUD Store table libraries based on the config file",builder(e){return e.options({configPath:{type:"string",desc:"Path to the MUD config file"}})},async handler({configPath:e}){let o=await yt(e),n=await bt(),t=await gt();await ut(o,ft.join(n,o.codegen.outputDirectory),t),process.exit(0)}},Be=ht;import xe from"node:path";import{existsSync as xn,mkdirSync as Sn,readFileSync as Cn,writeFileSync as Se}from"node:fs";import{getBalance as vt,sendRawTransaction as Tt,sendTransaction as je,waitForTransactionReceipt as Me}from"viem/actions";var T={gasPrice:1e11,gasLimit:1e5,signerAddress:"3fab184622dc19b6109349b94811493bf2a45362",transaction:"f8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222",address:"4e59b44847b379578588920ca78fbf26c0b4956c",creationCode:"604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"};import We from"debug";var q=We("mud:cli"),xt=We("mud:cli");q.log=console.debug.bind(console);xt.log=console.error.bind(console);var m=q.extend("deploy"),St=q.extend("deploy");m.log=console.debug.bind(console);St.log=console.error.bind(console);import{sliceHex as Ct}from"viem";import{getBytecode as Dt}from"viem/actions";var Y=`0x${T.address}`;async function G(e){let o=await Dt(e,{address:Y});if(o)return m("found CREATE2 deployer at",Y),o!==Ct(`0x${T.creationCode}`,14)&&console.warn(`
3
- \u26A0\uFE0F Bytecode for deployer at ${Y} did not match the expected CREATE2 bytecode. You may have unexpected results.
4
- `),Y}var ye=`0x${T.address}`;async function Re(e){let o=await G(e);if(o!==void 0)return o;let n=BigInt(T.gasLimit)*BigInt(T.gasPrice),t=await vt(e,{address:`0x${T.signerAddress}`}),r=n-t;if(r>0){m("sending gas for CREATE2 deployer to signer at",T.signerAddress);let a=await je(e,{chain:e.chain??null,to:`0x${T.signerAddress}`,value:r}),d=await Me(e,{hash:a});if(d.status!=="success")throw console.error("failed to send gas to deployer signer",d),new Error("failed to send gas to deployer signer")}m("deploying CREATE2 deployer at",ye);let s=await Tt(e,{serializedTransaction:`0x${T.transaction}`}).catch(a=>{if(String(a).includes("only replay-protected (EIP-155) transactions allowed over RPC"))return console.warn(`
5
- \u26A0\uFE0F Your chain or RPC does not allow for non EIP-155 signed transactions, so your deploys will not be determinstic and contract addresses may change between deploys.
6
-
7
- We recommend running your chain's node with \`--rpc.allow-unprotected-txs\` to enable determinstic deployments.
8
- `),m("deploying CREATE2 deployer"),je(e,{chain:e.chain??null,data:`0x${T.creationCode}`});throw a}),i=await Me(e,{hash:s});if(!i.contractAddress)throw new Error("Deploy receipt did not have contract address, was the deployer not deployed?");return i.contractAddress!==ye&&console.warn(`
9
- \u26A0\uFE0F CREATE2 deployer created at ${i.contractAddress} does not match the CREATE2 determinstic deployer we expected (${ye})`),i.contractAddress}import{waitForTransactionReceipt as nr}from"viem/actions";import{waitForTransactionReceipt as Ut}from"viem/actions";import{concatHex as Ht,getCreate2Address as Ft}from"viem";import{getBytecode as $t}from"viem/actions";import{padHex as kt}from"viem";import It from"@latticexyz/store/mud.config";import Pt from"@latticexyz/world/mud.config";import Ot from"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json"assert{type:"json"};import Bt from"@latticexyz/world-modules/out/IModule.sol/IModule.abi.json"assert{type:"json"};import{resourceToHex as At}from"@latticexyz/common";import{resolveUserTypes as He}from"@latticexyz/store/internal";function z(e){let o={...e.userTypes,...Object.fromEntries(Object.entries(e.enums).map(([n])=>[n,{internalType:"uint8"}]))};return Object.fromEntries(Object.entries(e.tables).map(([n,t])=>[`${e.namespace}_${n}`,{namespace:e.namespace,name:t.name,tableId:At({type:t.offchainOnly?"offchainTable":"table",namespace:e.namespace,name:t.name}),keySchema:He(t.keySchema,o),valueSchema:He(t.valueSchema,o)}]))}import{helloStoreEvent as Wt}from"@latticexyz/store";import{helloWorldEvent as jt}from"@latticexyz/world";import{storeToV1 as Mt}from"@latticexyz/store/config/v2";import{worldToV1 as Rt}from"@latticexyz/world/config/v2";var C=kt("0x",{size:32}),N=parseInt("6000",16),H=z(Mt(It)),A=z(Rt(Pt)),Q=[Wt,jt],v=[...Ot,...Bt],Fe=["2.0.0","2.0.1","2.0.2"],$e=["2.0.0","2.0.1","2.0.2"];import{sendTransaction as Et}from"@latticexyz/common";import zt from"p-retry";import{wait as Nt}from"@latticexyz/common/utils";async function Ee({client:e,deployerAddress:o,bytecode:n,deployedBytecodeSize:t,label:r="contract"}){if(n.includes("__$"))throw new Error(`Found unlinked public library in ${r} bytecode`);let s=Ft({from:o,salt:C,bytecode:n});return await $t(e,{address:s,blockTag:"pending"})?(m("found",r,"at",s),[]):(t>N?console.warn(`
10
- Bytecode for ${r} (${t} bytes) is over the contract size limit (${N} bytes). Run \`forge build --sizes\` for more info.
11
- `):t>N*.95&&console.warn(`
12
- Bytecode for ${r} (${t} bytes) is almost over the contract size limit (${N} bytes). Run \`forge build --sizes\` for more info.
13
- `),m("deploying",r,"at",s),[await zt(()=>Et(e,{chain:e.chain??null,to:o,data:Ht([C,n])}),{retries:3,onFailedAttempt:async a=>{let d=a.attemptNumber*500;m(`failed to deploy ${r}, retrying in ${d}ms...`),await Nt(d)}})])}import{uniqueBy as Lt}from"@latticexyz/common/utils";async function P({client:e,deployerAddress:o,contracts:n}){let t=Lt(n,s=>s.bytecode),r=(await Promise.all(t.map(s=>Ee({client:e,deployerAddress:o,...s})))).flat();if(r.length){m("waiting for contracts");for(let s of r)await Ut(e,{hash:s})}return r}import _e from"@latticexyz/world/out/WorldFactory.sol/WorldFactory.json"assert{type:"json"};import Kt from"@latticexyz/world/out/WorldFactory.sol/WorldFactory.abi.json"assert{type:"json"};import{getCreate2Address as Jt,encodeDeployData as qt,size as Yt}from"viem";import ze from"@latticexyz/world/out/AccessManagementSystem.sol/AccessManagementSystem.json"assert{type:"json"};import Ne from"@latticexyz/world/out/BalanceTransferSystem.sol/BalanceTransferSystem.json"assert{type:"json"};import Ue from"@latticexyz/world/out/BatchCallSystem.sol/BatchCallSystem.json"assert{type:"json"};import Le from"@latticexyz/world/out/RegistrationSystem.sol/RegistrationSystem.json"assert{type:"json"};import Ve from"@latticexyz/world/out/InitModule.sol/InitModule.json"assert{type:"json"};import Vt from"@latticexyz/world/out/InitModule.sol/InitModule.abi.json"assert{type:"json"};import{getCreate2Address as U,encodeDeployData as _t,size as L}from"viem";function Z(e){let o=L(ze.deployedBytecode.object),n=ze.bytecode.object,t=U({from:e,bytecode:n,salt:C}),r=L(Ne.deployedBytecode.object),s=Ne.bytecode.object,i=U({from:e,bytecode:s,salt:C}),a=L(Ue.deployedBytecode.object),d=Ue.bytecode.object,c=U({from:e,bytecode:d,salt:C}),y=L(Le.deployedBytecode.object),u=Le.bytecode.object,g=U({from:e,bytecode:u,salt:C}),b=L(Ve.deployedBytecode.object),p=_t({bytecode:Ve.bytecode.object,abi:Vt,args:[t,i,c,g]}),l=U({from:e,bytecode:p,salt:C});return{AccessManagementSystem:{bytecode:n,deployedBytecodeSize:o,label:"access management system",address:t},BalanceTransferSystem:{bytecode:s,deployedBytecodeSize:r,label:"balance transfer system",address:i},BatchCallSystem:{bytecode:d,deployedBytecodeSize:a,label:"batch call system",address:c},RegistrationSystem:{bytecode:u,deployedBytecodeSize:y,label:"core registration system",address:g},InitModule:{bytecode:p,deployedBytecodeSize:b,label:"core module",address:l}}}function X(e){let o=Z(e),n=Yt(_e.deployedBytecode.object),t=qt({bytecode:_e.bytecode.object,abi:Kt,args:[o.InitModule.address]}),r=Jt({from:e,bytecode:t,salt:C});return{...o,WorldFactory:{bytecode:t,deployedBytecodeSize:n,label:"world factory",address:r}}}import Ke from"@latticexyz/world/out/WorldProxyFactory.sol/WorldProxyFactory.json"assert{type:"json"};import Gt from"@latticexyz/world/out/WorldProxyFactory.sol/WorldProxyFactory.abi.json"assert{type:"json"};import{getCreate2Address as Qt,encodeDeployData as Zt,size as Xt}from"viem";function ee(e){let o=Z(e),n=Xt(Ke.deployedBytecode.object),t=Zt({bytecode:Ke.bytecode.object,abi:Gt,args:[o.InitModule.address]}),r=Qt({from:e,bytecode:t,salt:C});return{...o,WorldProxyFactory:{bytecode:t,deployedBytecodeSize:n,label:"world proxy factory",address:r}}}async function oe(e,o,n){if(n){let r=ee(o);return await P({client:e,deployerAddress:o,contracts:Object.values(r)}),r.WorldProxyFactory.address}let t=X(o);return await P({client:e,deployerAddress:o,contracts:Object.values(t)}),t.WorldFactory.address}import sr from"@latticexyz/world/out/WorldFactory.sol/WorldFactory.abi.json"assert{type:"json"};import{writeContract as ar}from"@latticexyz/common";import{AbiEventSignatureNotFoundError as er,decodeEventLog as or,hexToString as Je,parseAbi as tr}from"viem";import{isDefined as rr}from"@latticexyz/common/utils";function te(e){let o=e.map(i=>{try{return{...i,...or({strict:!0,abi:tr(Q),topics:i.topics,data:i.data})}}catch(a){if(a instanceof er)return;throw a}}).filter(rr),{address:n,deployBlock:t,worldVersion:r,storeVersion:s}=o.reduce((i,a)=>({...i,address:a.address,deployBlock:a.blockNumber,...a.eventName==="HelloWorld"?{worldVersion:Je(a.args.worldVersion).replace(/\0+$/,"")}:null,...a.eventName==="HelloStore"?{storeVersion:Je(a.args.storeVersion).replace(/\0+$/,"")}:null}),{});if(n==null)throw new Error("could not find world address");if(t==null)throw new Error("could not find world deploy block number");if(r==null)throw new Error("could not find world version");if(s==null)throw new Error("could not find store version");return{address:n,deployBlock:t,worldVersion:r,storeVersion:s}}async function qe(e,o,n,t){let r=await oe(e,o,t);m("deploying world");let s=await ar(e,{chain:e.chain??null,address:r,abi:sr,functionName:"deployWorld",args:[n]});m("waiting for world deploy");let i=await nr(e,{hash:s});if(i.status!=="success")throw console.error("world deploy failed",i),new Error("world deploy failed");let a=te(i.logs);return m("deployed world to",a.address,"at block",a.deployBlock),{...a,stateBlock:a.deployBlock}}import{resourceToLabel as ue,writeContract as fr}from"@latticexyz/common";import{valueSchemaToFieldLayoutHex as yr,keySchemaToHex as ur,valueSchemaToHex as gr}from"@latticexyz/protocol-parser/internal";import{parseAbiItem as ir,decodeAbiParameters as Ye,parseAbiParameters as Ge}from"viem";import{hexToResource as dr}from"@latticexyz/common";import{storeSetRecordEvent as cr}from"@latticexyz/store";import{getLogs as lr}from"viem/actions";import{decodeKey as mr,decodeValueArgs as pr,hexToSchema as Qe}from"@latticexyz/protocol-parser/internal";async function Ze({client:e,worldDeploy:o}){m("looking up tables for",o.address);let t=(await lr(e,{strict:!0,fromBlock:o.deployBlock,toBlock:o.stateBlock,address:o.address,event:ir(cr),args:{tableId:H.store_Tables.tableId}})).map(r=>{let{tableId:s}=mr(H.store_Tables.keySchema,r.args.keyTuple),{namespace:i,name:a}=dr(s),d=pr(H.store_Tables.valueSchema,r.args),c=Qe(d.keySchema),y=Qe(d.valueSchema),u=Ye(Ge("string[]"),d.abiEncodedKeyNames)[0],g=Ye(Ge("string[]"),d.abiEncodedFieldNames)[0],b=[...y.staticFields,...y.dynamicFields],p=Object.fromEntries(c.staticFields.map((S,x)=>[u[x],S])),l=Object.fromEntries(b.map((S,x)=>[g[x],S]));return{namespace:i,name:a,tableId:s,keySchema:p,valueSchema:l}});return m("found",t.length,"tables for",o.address),t}import br from"p-retry";import{wait as hr}from"@latticexyz/common/utils";async function Xe({client:e,worldDeploy:o,tables:n}){let r=(await Ze({client:e,worldDeploy:o})).map(a=>a.tableId),s=n.filter(a=>r.includes(a.tableId));s.length&&m("existing tables",s.map(ue).join(", "));let i=n.filter(a=>!r.includes(a.tableId));return i.length?(m("registering tables",i.map(ue).join(", ")),await Promise.all(i.map(a=>br(()=>fr(e,{chain:e.chain??null,address:o.address,abi:v,functionName:"registerTable",args:[a.tableId,yr(a.valueSchema),ur(a.keySchema),gr(a.valueSchema),Object.keys(a.keySchema),Object.keys(a.valueSchema)]}),{retries:3,onFailedAttempt:async d=>{let c=d.attemptNumber*500;m(`failed to register table ${ue(a)}, retrying in ${c}ms...`),await hr(c)}})))):[]}import{getAddress as B}from"viem";import{writeContract as ge,resourceToLabel as V}from"@latticexyz/common";import{parseAbiItem as wr,HttpRequestError as xr}from"viem";import{getLogs as Sr}from"viem/actions";import{storeSpliceStaticDataEvent as Cr}from"@latticexyz/store";import Dr from"p-retry";async function re({client:e,worldDeploy:o}){m("looking up resource IDs for",o.address);let t=(await Dr(()=>Sr(e,{strict:!0,address:o.address,fromBlock:o.deployBlock,toBlock:o.stateBlock,event:wr(Cr),args:{tableId:H.store_ResourceIds.tableId}}),{retries:3,onFailedAttempt:async r=>{if(!(r instanceof xr&&r.status===400&&r.message.includes("block is out of range")))throw r}})).map(r=>r.args.keyTuple[0]);return m("found",t.length,"resource IDs for",o.address),t}import{hexToResource as $r,resourceToLabel as Er}from"@latticexyz/common";import{decodeValueArgs as vr,encodeKey as Tr}from"@latticexyz/protocol-parser/internal";import{readContract as Ar}from"viem/actions";async function O({client:e,worldDeploy:o,table:n,key:t}){let[r,s,i]=await Ar(e,{blockNumber:o.stateBlock,address:o.address,abi:v,functionName:"getRecord",args:[n.tableId,Tr(n.keySchema,t)]});return vr(n.valueSchema,{staticData:r,encodedLengths:s,dynamicData:i})}import{toFunctionSelector as kr,parseAbiItem as Ir}from"viem";import{storeSetRecordEvent as Pr}from"@latticexyz/store";import{getLogs as Or}from"viem/actions";import{decodeValueArgs as Br}from"@latticexyz/protocol-parser/internal";import{hexToResource as Wr}from"@latticexyz/common";async function ne({client:e,worldDeploy:o}){m("looking up function signatures for",o.address);let t=(await Or(e,{strict:!0,fromBlock:o.deployBlock,toBlock:o.stateBlock,address:o.address,event:Ir(Pr),args:{tableId:A.world_FunctionSignatures.tableId}})).map(s=>Br(A.world_FunctionSignatures.valueSchema,s.args).functionSignature);return m("found",t.length,"function signatures for",o.address),await Promise.all(t.map(async s=>{let i=kr(s),{systemId:a,systemFunctionSelector:d}=await O({client:e,worldDeploy:o,table:A.world_FunctionSelectors,key:{worldFunctionSelector:i}}),{namespace:c,name:y}=Wr(a),u=c===""?s:s.replace(`${c}_${y}_`,"");return{signature:s,selector:i,systemId:a,systemFunctionSignature:u,systemFunctionSelector:d}}))}import{parseAbiItem as jr,getAddress as Mr}from"viem";import{storeSpliceStaticDataEvent as Rr}from"@latticexyz/store";import{getLogs as Hr}from"viem/actions";import{decodeKey as Fr}from"@latticexyz/protocol-parser/internal";async function se({client:e,worldDeploy:o}){m("looking up resource access for",o.address);let t=(await Hr(e,{strict:!0,fromBlock:o.deployBlock,toBlock:o.stateBlock,address:o.address,event:jr(Rr),args:{tableId:A.world_ResourceAccess.tableId}})).map(s=>Fr(A.world_ResourceAccess.keySchema,s.args.keyTuple)),r=(await Promise.all(t.map(async s=>[s,await O({client:e,worldDeploy:o,table:A.world_ResourceAccess,key:s})]))).filter(([,s])=>s.access).map(([s])=>({resourceId:s.resourceId,address:Mr(s.caller)}));return m("found",r.length,"resource<>address access pairs"),r}async function eo({client:e,worldDeploy:o}){let[n,t,r]=await Promise.all([re({client:e,worldDeploy:o}),ne({client:e,worldDeploy:o}),se({client:e,worldDeploy:o})]),s=n.map($r).filter(i=>i.type==="system");return m("looking up systems",s.map(Er).join(", ")),await Promise.all(s.map(async i=>{let{system:a,publicAccess:d}=await O({client:e,worldDeploy:o,table:A.world_Systems,key:{systemId:i.resourceId}}),c=t.filter(y=>y.systemId===i.resourceId);return{address:a,namespace:i.namespace,name:i.name,systemId:i.resourceId,allowAll:d,allowedAddresses:r.filter(({resourceId:y})=>y===i.resourceId).map(({address:y})=>y),functions:c}}))}import{wait as be}from"@latticexyz/common/utils";import he from"p-retry";async function oo({client:e,deployerAddress:o,libraries:n,worldDeploy:t,systems:r}){let[s,i]=await Promise.all([eo({client:e,worldDeploy:t}),se({client:e,worldDeploy:t})]),a=r.filter(f=>s.some(h=>h.systemId===f.systemId&&B(h.address)===B(f.prepareDeploy(o,n).address)));a.length&&m("existing systems",a.map(V).join(", "));let d=a.map(f=>f.systemId),c=r.filter(f=>!d.includes(f.systemId));if(!c.length)return[];let y=c.filter(f=>s.some(h=>h.systemId===f.systemId&&B(h.address)!==B(f.prepareDeploy(o,n).address)));y.length&&m("upgrading systems",y.map(V).join(", "));let u=c.filter(f=>!s.some(h=>h.systemId===f.systemId));u.length&&m("registering new systems",u.map(V).join(", ")),await P({client:e,deployerAddress:o,contracts:c.map(f=>({bytecode:f.prepareDeploy(o,n).bytecode,deployedBytecodeSize:f.deployedBytecodeSize,label:`${V(f)} system`}))});let g=await Promise.all(c.map(f=>he(()=>ge(e,{chain:e.chain??null,address:t.address,abi:v,functionName:"registerSystem",args:[f.systemId,f.prepareDeploy(o,n).address,f.allowAll]}),{retries:3,onFailedAttempt:async h=>{let w=h.attemptNumber*500;m(`failed to register system ${V(f)}, retrying in ${w}ms...`),await be(w)}}))),b=r.map(f=>f.systemId),p=i.filter(({resourceId:f})=>b.includes(f)),l=[...r.flatMap(f=>f.allowedAddresses.map(h=>({resourceId:f.systemId,address:h}))),...r.flatMap(f=>f.allowedSystemIds.map(h=>({resourceId:f.systemId,address:s.find(w=>w.systemId===h)?.address??r.find(w=>w.systemId===h)?.prepareDeploy(o,n).address})).filter(h=>h.address!=null))],S=l.filter(f=>!p.some(({resourceId:h,address:w})=>h===f.resourceId&&B(w)===B(f.address))),x=p.filter(f=>!l.some(({resourceId:h,address:w})=>h===f.resourceId&&B(w)===B(f.address)));x.length&&m("revoking",x.length,"access grants"),S.length&&m("adding",S.length,"access grants");let D=await Promise.all([...x.map(f=>he(()=>ge(e,{chain:e.chain??null,address:t.address,abi:v,functionName:"revokeAccess",args:[f.resourceId,f.address]}),{retries:3,onFailedAttempt:async h=>{let w=h.attemptNumber*500;m(`failed to revoke access, retrying in ${w}ms...`),await be(w)}})),...S.map(f=>he(()=>ge(e,{chain:e.chain??null,address:t.address,abi:v,functionName:"grantAccess",args:[f.resourceId,f.address]}),{retries:3,onFailedAttempt:async h=>{let w=h.attemptNumber*500;m(`failed to grant access, retrying in ${w}ms...`),await be(w)}}))]);return[...g,...D]}import{waitForTransactionReceipt as uo}from"viem/actions";import{getAddress as zr,parseAbi as Nr}from"viem";import{getBlockNumber as Ur,getLogs as Lr}from"viem/actions";var to=new Map;async function ro(e,o){let n=zr(o),t=to.get(n);if(t!=null)return t;m("looking up world deploy for",n);let r=await Ur(e),s=await Lr(e,{strict:!0,address:n,events:Nr(Q),fromBlock:"earliest",toBlock:r});return t={...te(s),stateBlock:r},to.set(n,t),m("found world deploy for",n,"at block",t.deployBlock),t}import{hexToResource as Vr,writeContract as no}from"@latticexyz/common";import so from"p-retry";import{wait as ao}from"@latticexyz/common/utils";async function io({client:e,worldDeploy:o,functions:n}){let t=await ne({client:e,worldDeploy:o}),r=Object.fromEntries(t.map(a=>[a.selector,a])),s=n.filter(a=>r[a.selector]),i=n.filter(a=>!s.includes(a));if(s.length){m("functions already registered:",s.map(d=>d.signature).join(", "));let a=s.filter(d=>d.systemId!==r[d.selector]?.systemId);a.length&&console.warn("found",a.length,"functions already registered but pointing at a different system ID:",a.map(d=>d.signature).join(", "))}return i.length?(m("registering functions:",i.map(a=>a.signature).join(", ")),Promise.all(i.map(a=>{let{namespace:d}=Vr(a.systemId);return d===""?so(()=>no(e,{chain:e.chain??null,address:o.address,abi:v,functionName:"registerRootFunctionSelector",args:[a.systemId,a.systemFunctionSignature,a.systemFunctionSignature]}),{retries:3,onFailedAttempt:async c=>{let y=c.attemptNumber*500;m(`failed to register function ${a.signature}, retrying in ${y}ms...`),await ao(y)}}):so(()=>no(e,{chain:e.chain??null,address:o.address,abi:v,functionName:"registerFunctionSelector",args:[a.systemId,a.systemFunctionSignature]}),{retries:3,onFailedAttempt:async c=>{let y=c.attemptNumber*500;m(`failed to register function ${a.signature}, retrying in ${y}ms...`),await ao(y)}})}))):[]}import{BaseError as _r}from"viem";import{writeContract as co}from"@latticexyz/common";import{isDefined as Kr,wait as Jr}from"@latticexyz/common/utils";import qr from"p-retry";async function lo({client:e,deployerAddress:o,libraries:n,worldDeploy:t,modules:r}){return r.length?(await P({client:e,deployerAddress:o,contracts:r.map(s=>({bytecode:s.prepareDeploy(o,n).bytecode,deployedBytecodeSize:s.deployedBytecodeSize,label:`${s.name} module`}))}),m("installing modules:",r.map(s=>s.name).join(", ")),(await Promise.all(r.map(s=>qr(async()=>{try{let i=s.prepareDeploy(o,n).address;return s.installAsRoot?await co(e,{chain:e.chain??null,address:t.address,abi:v,functionName:"installRootModule",args:[i,s.installData]}):await co(e,{chain:e.chain??null,address:t.address,abi:v,functionName:"installModule",args:[i,s.installData]})}catch(i){if(i instanceof _r&&i.message.includes("Module_AlreadyInstalled")){m(`module ${s.name} already installed`);return}throw i}},{retries:3,onFailedAttempt:async i=>{let a=i.attemptNumber*500;m(`failed to install module ${s.name}, retrying in ${a}ms...`),await Jr(a)}})))).filter(Kr)):[]}import{getAddress as mo}from"viem";import{hexToResource as po,resourceToHex as fo,writeContract as Yr}from"@latticexyz/common";async function yo({client:e,worldDeploy:o,resourceIds:n}){let t=Array.from(new Set(n.map(u=>po(u).namespace))),r=await re({client:e,worldDeploy:o}),s=new Set(r.map(u=>po(u).namespace));s.size&&m("found",s.size,"existing namespaces:",Array.from(s).map(u=>u===""?"<root>":u).join(", "));let i=t.filter(u=>s.has(u)),d=(await Promise.all(i.map(async u=>{let{owner:g}=await O({client:e,worldDeploy:o,table:A.world_NamespaceOwner,key:{namespaceId:fo({type:"namespace",namespace:u,name:""})}});return[u,g]}))).filter(([,u])=>mo(u)!==mo(e.account.address)).map(([u])=>u);if(d.length)throw new Error(`You are attempting to deploy to namespaces you do not own: ${d.join(", ")}`);let c=t.filter(u=>!s.has(u));return c.length>0&&m("registering namespaces",Array.from(c).join(", ")),Promise.all(c.map(u=>Yr(e,{chain:e.chain??null,address:o.address,abi:v,functionName:"registerNamespace",args:[fo({namespace:u,type:"namespace",name:""})]})))}import{resourceToLabel as Gr}from"@latticexyz/common";import{randomBytes as Qr}from"crypto";async function go({client:e,config:o,salt:n,worldAddress:t,deployerAddress:r,withWorldProxy:s}){let i=Object.values(o.tables),a=r??await Re(e);await oe(e,a,s),await P({client:e,deployerAddress:a,contracts:[...o.libraries.map(l=>({bytecode:l.prepareDeploy(a,o.libraries).bytecode,deployedBytecodeSize:l.deployedBytecodeSize,label:`${l.path}:${l.name} library`})),...o.systems.map(l=>({bytecode:l.prepareDeploy(a,o.libraries).bytecode,deployedBytecodeSize:l.deployedBytecodeSize,label:`${Gr(l)} system`})),...o.modules.map(l=>({bytecode:l.prepareDeploy(a,o.libraries).bytecode,deployedBytecodeSize:l.deployedBytecodeSize,label:`${l.name} module`}))]});let d=t?await ro(e,t):await qe(e,a,n??`0x${Qr(32).toString("hex")}`,s);if(!Fe.includes(d.storeVersion))throw new Error(`Unsupported Store version: ${d.storeVersion}`);if(!$e.includes(d.worldVersion))throw new Error(`Unsupported World version: ${d.worldVersion}`);let c=await yo({client:e,worldDeploy:d,resourceIds:[...i.map(l=>l.tableId),...o.systems.map(l=>l.systemId)]});m("waiting for all namespace registration transactions to confirm");for(let l of c)await uo(e,{hash:l});let y=await Xe({client:e,worldDeploy:d,tables:i}),u=await oo({client:e,deployerAddress:a,libraries:o.libraries,worldDeploy:d,systems:o.systems}),g=await io({client:e,worldDeploy:d,functions:o.systems.flatMap(l=>l.functions)}),b=await lo({client:e,deployerAddress:a,libraries:o.libraries,worldDeploy:d,modules:o.modules}),p=[...y,...u,...g,...b];m("waiting for all transactions to confirm");for(let l of p)await uo(e,{hash:l});return m("deploy complete"),d}import{createWalletClient as Dn,http as vn,isHex as Tn}from"viem";import{privateKeyToAccount as An}from"viem/accounts";import{loadConfig as kn}from"@latticexyz/config/node";import{worldToV1 as In}from"@latticexyz/world/config/v2";import{getOutDirectory as Pn,getRpcUrl as On,getSrcDirectory as Bn}from"@latticexyz/common/foundry";import F from"chalk";import{MUDError as vo}from"@latticexyz/common/errors";import an from"path";import{resolveWorldConfig as dn}from"@latticexyz/world/internal";import{resourceToHex as we}from"@latticexyz/common";import{resolveWithContext as cn}from"@latticexyz/config/library";import{encodeField as ln}from"@latticexyz/protocol-parser/internal";import{hexToBytes as mn,bytesToHex as pn,toFunctionSelector as wo,toFunctionSignature as xo}from"viem";import ae from"@latticexyz/world-modules/out/KeysWithValueModule.sol/KeysWithValueModule.json"assert{type:"json"};import ie from"@latticexyz/world-modules/out/KeysInTableModule.sol/KeysInTableModule.json"assert{type:"json"};import de from"@latticexyz/world-modules/out/UniqueEntityModule.sol/UniqueEntityModule.json"assert{type:"json"};import ce from"@latticexyz/world-modules/out/Unstable_CallWithSignatureModule.sol/Unstable_CallWithSignatureModule.json"assert{type:"json"};import{size as le}from"viem";function M(e){return Object.entries(e).flatMap(([o,n])=>Object.entries(n).flatMap(([t,r])=>r.map(s=>({path:o,name:t,start:s.start,length:s.length}))))}var me=[{name:"KeysWithValueModule",abi:ae.abi,bytecode:ae.bytecode.object,placeholders:M(ae.bytecode.linkReferences),deployedBytecodeSize:le(ae.deployedBytecode.object)},{name:"KeysInTableModule",abi:ie.abi,bytecode:ie.bytecode.object,placeholders:M(ie.bytecode.linkReferences),deployedBytecodeSize:le(ie.deployedBytecode.object)},{name:"UniqueEntityModule",abi:de.abi,bytecode:de.bytecode.object,placeholders:M(de.bytecode.linkReferences),deployedBytecodeSize:le(de.deployedBytecode.object)},{name:"Unstable_CallWithSignatureModule",abi:ce.abi,bytecode:ce.bytecode.object,placeholders:M(ce.bytecode.linkReferences),deployedBytecodeSize:le(ce.deployedBytecode.object)}];import{readFileSync as Zr}from"fs";import Xr from"path";import{MUDError as pe}from"@latticexyz/common/errors";import{size as en}from"viem";function W(e,o,n){let t,r=Xr.join(n,e,o+".json");try{t=JSON.parse(Zr(r,"utf8"))}catch{throw new pe(`Error reading file at ${r}`)}let s=t?.bytecode?.object;if(!s)throw new pe(`No bytecode found in ${r}`);let i=t?.deployedBytecode?.object;if(!i)throw new pe(`No deployed bytecode found in ${r}`);let a=t?.abi;if(!a)throw new pe(`No ABI found in ${r}`);let d=M(t?.bytecode?.linkReferences??{});return{abi:a,bytecode:s,placeholders:d,deployedBytecodeSize:en(i)}}import{groupBy as fn}from"@latticexyz/common/utils";import{readFileSync as tn}from"fs";import rn from"glob";import on from"toposort";function bo(e,o,n){let t=on(e.flatMap(r=>n(r).map(s=>[o(r),s])));return[...e].sort((r,s)=>t.indexOf(o(r))-t.indexOf(o(s)))}function ho(e){let n=rn.sync(`${e}/**/*.json`,{ignore:"**/*.abi.json"}).map(t=>JSON.parse(tn(t,"utf8"))).flatMap(t=>{if(!t.metadata)return[];let r=Object.keys(t.metadata.settings.compilationTarget)[0],s=t.metadata.settings.compilationTarget[r],i=t.bytecode.linkReferences;return Object.entries(i).flatMap(([a,d])=>Object.keys(d).map(c=>({path:a,name:c,dependentPath:r,dependentName:s})))});return bo(n,t=>`${t.path}:${t.name}`,t=>[`${t.dependentPath}:${t.dependentName}`])}import{spliceHex as nn}from"@latticexyz/common";import{getCreate2Address as sn}from"viem";function fe(e,o){return function(t,r){let s=e;for(let i of o){let a=r.find(d=>d.path===i.path&&d.name===i.name);if(!a)throw new Error(`Could not find library for bytecode placeholder ${i.path}:${i.name}`);s=nn(s,i.start,i.length,a.prepareDeploy(t,r).address)}return{bytecode:s,address:sn({from:t,bytecode:s,salt:C})}}}function So({config:e,forgeSourceDir:o,forgeOutDir:n}){let t=ho(n).map(p=>{let l=W(an.basename(p.path),p.name,n);return{path:p.path,name:p.name,abi:l.abi,prepareDeploy:fe(l.bytecode,l.placeholders),deployedBytecodeSize:l.deployedBytecodeSize}}),r=z(e),s=k(o).map(({basename:p})=>p),i=dn(e,s),d=W("System.sol","System",n).abi.filter(p=>p.type==="function").map(xo),c=Object.entries(i.systems).map(([p,l])=>{let S=e.namespace,x=l.name,D=we({type:"system",namespace:S,name:x}),f=W(`${p}.sol`,p,n),h=f.abi.filter(w=>w.type==="function").map(xo).filter(w=>!d.includes(w)).map(w=>{let Te=S===""?w:`${S}__${w}`;return{signature:Te,selector:wo(Te),systemId:D,systemFunctionSignature:w,systemFunctionSelector:wo(w)}});return{namespace:S,name:x,systemId:D,allowAll:l.openAccess,allowedAddresses:l.accessListAddresses,allowedSystemIds:l.accessListSystems.map(w=>we({type:"system",namespace:S,name:i.systems[w].name})),prepareDeploy:fe(f.bytecode,f.placeholders),deployedBytecodeSize:f.deployedBytecodeSize,abi:f.abi,functions:h}}),y=fn(c,p=>p.systemId),u=Array.from(y.values()).filter(p=>p.length>1).flat();if(u.length){let p=u.map(l=>l.name);throw new Error(`Found systems with overlapping system ID: ${p.join(", ")}.
14
-
15
- System IDs are generated from the first 16 bytes of the name, so you may need to rename them to avoid the overlap.`)}let g={tableIds:Object.fromEntries(Object.entries(e.tables).map(([p,l])=>[p,mn(we({type:l.offchainOnly?"offchainTable":"table",namespace:e.namespace,name:l.name}))]))},b=e.modules.map(p=>{let l=me.find(x=>x.name===p.name)??W(`${p.name}.sol`,p.name,n),S=p.args.map(x=>cn(x,g)).map(x=>{let D=x.value instanceof Uint8Array?pn(x.value):x.value;return ln(x.type,D)});if(S.length>1)throw new Error(`${p.name} module should only have 0-1 args, but had ${S.length} args.`);return{name:p.name,installAsRoot:p.root,installData:S.length===0?"0x":S[0],prepareDeploy:fe(l.bytecode,l.placeholders),deployedBytecodeSize:l.deployedBytecodeSize,abi:l.abi}});return{tables:r,systems:c,modules:b,libraries:t}}import{getChainId as Wn}from"viem/actions";import{existsSync as yn}from"fs";import un from"path";import Co from"chalk";import{getScriptDirectory as gn,forge as bn}from"@latticexyz/common/foundry";import{execSync as hn}from"child_process";import{formatGwei as wn}from"viem";async function Do(e,o,n,t,r){let s=r?.replaceAll("\\","").split(" ")??[],i=un.join(await gn(),e+".s.sol");if(!yn(i)){console.log(`No script at ${i}, skipping post deploy hook`);return}let a=BigInt(hn(`cast gas-price --rpc-url ${n}`,{encoding:"utf-8"}).trim());console.log(Co.blue(`Executing post deploy script at ${i}`)),console.log(Co.blue(` using gas price of ${wn(a)} gwei`)),await bn(["script",e,"--broadcast","--sig","run(address)",o,"--with-gas-price",a.toString(),"--rpc-url",n,"-vvv",...s],{profile:t})}import{kmsKeyToAccount as jn}from"@latticexyz/common/kms";var I={configPath:{type:"string",desc:"Path to the MUD config file"},printConfig:{type:"boolean",desc:"Print the resolved config"},profile:{type:"string",desc:"The foundry profile to use"},saveDeployment:{type:"boolean",desc:"Save the deployment info to a file",default:!0},rpc:{type:"string",desc:"The RPC URL to use. Defaults to the RPC url from the local foundry.toml"},rpcBatch:{type:"boolean",desc:"Enable batch processing of RPC requests in viem client (defaults to batch size of 100 and wait of 1s)"},deployerAddress:{type:"string",desc:"Deploy using an existing deterministic deployer (https://github.com/Arachnid/deterministic-deployment-proxy)"},worldAddress:{type:"string",desc:"Deploy to an existing World at the given address"},srcDir:{type:"string",desc:"Source directory. Defaults to foundry src directory."},skipBuild:{type:"boolean",desc:"Skip rebuilding the contracts before deploying"},alwaysRunPostDeploy:{type:"boolean",desc:"Always run PostDeploy.s.sol after each deploy (including during upgrades). By default, PostDeploy.s.sol is only run once after a new world is deployed."},forgeScriptOptions:{type:"string",description:"Options to pass to forge script PostDeploy.s.sol"},salt:{type:"string",desc:"The deployment salt to use. Defaults to a random salt."},awsKmsKeyId:{type:"string",desc:"Optional AWS KMS key ID. If set, the World is deployed using a KMS signer instead of local private key."}};async function $(e){let o=e.salt;if(o!=null&&!Tn(o))throw new vo("Expected hex string for salt");let n=e.profile??process.env.FOUNDRY_PROFILE,t=await kn(e.configPath),r=In(t);e.printConfig&&console.log(F.green(`
16
- Resolved config:
17
- `),JSON.stringify(r,null,2));let s=e.srcDir??await Bn(n),i=await Pn(n),a=e.rpc??await On(n);console.log(F.bgBlue(F.whiteBright(`
18
- Deploying MUD contracts${n?" with profile "+n:""} to RPC ${a}
19
- `))),e.skipBuild||await J({config:t,srcDir:s,foundryProfile:n});let d=process.env.PRIVATE_KEY;if(!d)throw new vo(`Missing PRIVATE_KEY environment variable.
20
- Run 'echo "PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" > .env'
21
- in your contracts directory to use the default anvil private key.`);let c=So({config:r,forgeSourceDir:s,forgeOutDir:i}),y=e.awsKmsKeyId??process.env.AWS_KMS_KEY_ID,u=y?await jn({keyId:y}):An(d),g=Dn({transport:vn(a,{batch:e.rpcBatch?{batchSize:100,wait:1e3}:void 0}),account:u});console.log("Deploying from",g.account.address);let b=Date.now(),p=await go({deployerAddress:e.deployerAddress,salt:o,worldAddress:e.worldAddress,client:g,config:c,withWorldProxy:t.deploy.upgradeableWorldImplementation});(e.worldAddress==null||e.alwaysRunPostDeploy)&&await Do(r.postDeployScript,p.address,a,n,e.forgeScriptOptions),console.log(F.green("Deployment completed in",(Date.now()-b)/1e3,"seconds"));let l={worldAddress:p.address,blockNumber:Number(p.deployBlock)};if(e.saveDeployment){let S=await Wn(g),x=xe.join(r.deploysDirectory,S.toString());Sn(x,{recursive:!0}),Se(xe.join(x,"latest.json"),JSON.stringify(l,null,2)),Se(xe.join(x,Date.now()+".json"),JSON.stringify(l,null,2));let D=[1337,31337],f=xn(r.worldsFile)?JSON.parse(Cn(r.worldsFile,"utf-8")):{};f[S]={address:l.worldAddress,blockNumber:D.includes(S)?void 0:l.blockNumber},Se(r.worldsFile,JSON.stringify(f,null,2)),console.log(F.bgGreen(F.whiteBright(`
22
- Deployment result (written to ${r.worldsFile} and ${x}):
23
- `)))}return console.log(l),p}var Mn={command:"deploy",describe:"Deploy MUD contracts",builder(e){return e.options(I)},async handler(e){try{await $(e)}catch(o){K(o),process.exit(1)}process.exit(0)}},To=Mn;import{loadConfig as Rn}from"@latticexyz/config/node";import{worldgen as Hn}from"@latticexyz/world/node";import{getSrcDirectory as Fn}from"@latticexyz/common/foundry";import Ao from"path";import{rmSync as $n}from"fs";var En={command:"worldgen",describe:"Autogenerate interfaces for Systems and World based on existing contracts and the config file",builder(e){return e.options({configPath:{type:"string",desc:"Path to the MUD config file"},clean:{type:"boolean",desc:"Clear the worldgen directory before generating new interfaces (defaults to true)",default:!0}})},async handler(e){await zn(e),process.exit(0)}};async function zn(e){let o=e.srcDir??await Fn(),n=k(o),t=e.config??await Rn(e.configPath),r=Ao.join(o,t.codegen.outputDirectory);e.clean&&$n(Ao.join(r,t.codegen.worldgenDirectory),{recursive:!0,force:!0}),await Hn(t,n,r)}var ko=En;import _ from"chalk";import{readFileSync as _n,writeFileSync as Kn}from"fs";import De from"path";import{MUDError as E}from"@latticexyz/common/errors";var Io={name:"@latticexyz/cli",version:"2.0.7",description:"Command line interface for mud",repository:{type:"git",url:"https://github.com/latticexyz/mud.git",directory:"packages/cli"},license:"MIT",type:"module",exports:{".":"./dist/index.js"},types:"src/index.ts",bin:{mud:"./dist/mud.js"},scripts:{build:"pnpm run build:js && pnpm run build:test-tables","build:js":"tsup && chmod +x ./dist/mud.js","build:test-tables":"tsx ./scripts/generate-test-tables.ts",clean:"pnpm run clean:js && pnpm run clean:test-tables","clean:js":"rimraf dist","clean:test-tables":"rimraf src/codegen",dev:"tsup --watch",lint:"eslint . --ext .ts",prepare:"mkdir -p ./dist && touch ./dist/mud.js",test:"tsc --noEmit && forge test","test:ci":"pnpm run test"},dependencies:{"@aws-sdk/client-kms":"^3.556.0","@ethersproject/abi":"^5.7.0","@ethersproject/providers":"^5.7.2","@improbable-eng/grpc-web":"^0.15.0","@improbable-eng/grpc-web-node-http-transport":"^0.15.0","@latticexyz/abi-ts":"workspace:*","@latticexyz/common":"workspace:*","@latticexyz/config":"workspace:*","@latticexyz/gas-report":"workspace:*","@latticexyz/protocol-parser":"workspace:*","@latticexyz/schema-type":"workspace:*","@latticexyz/services":"workspace:*","@latticexyz/store":"workspace:*","@latticexyz/utils":"workspace:*","@latticexyz/world":"workspace:*","@latticexyz/world-modules":"workspace:*","asn1.js":"^5.4.1",chalk:"^5.0.1",chokidar:"^3.5.3",debug:"^4.3.4",dotenv:"^16.0.3",ejs:"^3.1.8",ethers:"^5.7.2",execa:"^7.0.0",glob:"^8.0.3","nice-grpc-web":"^2.0.1",openurl:"^1.1.1","p-queue":"^7.4.1","p-retry":"^5.1.2",path:"^0.12.7",rxjs:"7.5.5","throttle-debounce":"^5.0.0",toposort:"^2.0.2",typescript:"5.4.2",viem:"2.9.20",yargs:"^17.7.1",zod:"^3.21.4","zod-validation-error":"^1.3.0"},devDependencies:{"@types/debug":"^4.1.7","@types/ejs":"^3.1.1","@types/glob":"^7.2.0","@types/node":"^18.15.11","@types/openurl":"^1.0.0","@types/throttle-debounce":"^5.0.0","@types/toposort":"^2.0.6","@types/yargs":"^17.0.10","ds-test":"https://github.com/dapphub/ds-test.git#e282159d5170298eb2455a6c05280ab5a73a4ef0","forge-std":"https://github.com/foundry-rs/forge-std.git#74cfb77e308dd188d2f58864aaf44963ae6b88b1",tsup:"^6.7.0",tsx:"^3.12.6",vitest:"0.34.6"}};import Jn from"glob";import{ZodError as Un,z as Po}from"zod";var Ln=Po.object({MUD_PACKAGES:Po.string().transform(e=>JSON.parse(e))});function Vn(){try{return Ln.parse({MUD_PACKAGES:'{"@latticexyz/abi-ts":{"localPath":"packages/abi-ts"},"@latticexyz/block-logs-stream":{"localPath":"packages/block-logs-stream"},"@latticexyz/cli":{"localPath":"packages/cli"},"@latticexyz/common":{"localPath":"packages/common"},"@latticexyz/config":{"localPath":"packages/config"},"create-mud":{"localPath":"packages/create-mud"},"@latticexyz/dev-tools":{"localPath":"packages/dev-tools"},"@latticexyz/faucet":{"localPath":"packages/faucet"},"@latticexyz/gas-report":{"localPath":"packages/gas-report"},"@latticexyz/protocol-parser":{"localPath":"packages/protocol-parser"},"@latticexyz/query":{"localPath":"packages/query"},"@latticexyz/react":{"localPath":"packages/react"},"@latticexyz/recs":{"localPath":"packages/recs"},"@latticexyz/schema-type":{"localPath":"packages/schema-type"},"@latticexyz/services":{"localPath":"packages/services"},"solhint-config-mud":{"localPath":"packages/solhint-config-mud"},"solhint-plugin-mud":{"localPath":"packages/solhint-plugin-mud"},"@latticexyz/store-indexer":{"localPath":"packages/store-indexer"},"@latticexyz/store-sync":{"localPath":"packages/store-sync"},"@latticexyz/store":{"localPath":"packages/store"},"@latticexyz/utils":{"localPath":"packages/utils"},"@latticexyz/world-modules":{"localPath":"packages/world-modules"},"@latticexyz/world":{"localPath":"packages/world"}}'})}catch(e){if(e instanceof Un){let{...o}=e.format();console.error(`
24
- Missing or invalid environment variables:
25
-
26
- ${Object.keys(o).join(`
27
- `)}
28
- `),process.exit(1)}throw e}}var Ce=Vn().MUD_PACKAGES;var qn={command:"set-version",describe:"Set MUD version in all package.json files and optionally backup the previously installed version",builder(e){return e.options({mudVersion:{alias:"v",type:"string",description:"Set MUD to the given version"},tag:{alias:"t",type:"string",description:"Set MUD to the latest version with the given tag from npm"},commit:{alias:"c",type:"string",description:"Set MUD to the version based on a given git commit hash from npm"},link:{alias:"l",type:"string",description:"Relative path to the local MUD root directory to link"}})},async handler(e){try{let o=["mudVersion","link","tag","commit","restore"],n=o.reduce((r,s)=>e[s]?r+1:r,0);if(n===0)throw new E(`You need to provide one these options: ${o.join(", ")}`);if(n>1)throw new E(`These options are mutually exclusive: ${o.join(", ")}`);e.link||(e.mudVersion=await Yn(e));let t=Jn.sync("**/package.json").filter(r=>!r.includes("node_modules"));for(let r of t)Gn(r,e)}catch(o){K(o)}finally{process.exit(0)}}};async function Yn(e){e.mudVersion==="canary"&&(e.tag="main");let o;try{console.log(_.blue("Fetching available versions")),o=await(await fetch(`https://registry.npmjs.org/${Io.name}`)).json()}catch{throw new E("Could not fetch available MUD versions")}if(e.tag){let n=o["dist-tags"][e.tag];if(!n)throw new E(`Could not find npm version with tag "${e.tag}"`);return console.log(_.green(`Latest version with tag ${e.tag}: ${n}`)),n}if(e.commit){let n=e.commit.substring(0,8),t=Object.keys(o.versions).find(r=>r.includes(n));if(!t)throw new E(`Could not find npm version based on commit "${e.commit}"`);return console.log(_.green(`Version from commit ${e.commit}: ${t}`)),t}return e.mudVersion}function Gn(e,o){let{link:n}=o,{mudVersion:t}=o,r=Qn(e),s=Object.keys(Ce),i={};for(let c in r.dependencies)s.includes(c)&&(i[c]=r.dependencies[c]);let a={};for(let c in r.devDependencies)s.includes(c)&&(a[c]=r.devDependencies[c]);for(let c in r.dependencies)s.includes(c)&&(r.dependencies[c]=d(c,"dependencies"));for(let c in r.devDependencies)s.includes(c)&&(r.devDependencies[c]=d(c,"devDependencies"));return Kn(e,JSON.stringify(r,null,2)+`
29
- `),console.log(`Updating ${e}`),Oo(i,r.dependencies),Oo(a,r.devDependencies),r;function d(c,y){return n&&(t=Zn(e,n,c)),t||r[y][c]}}function Qn(e){try{let o=_n(e,"utf8");return JSON.parse(o)}catch{throw new E("Could not read JSON at "+e)}}function Oo(e,o){for(let n in e)e[n]!==o[n]&&console.log(`${n}: ${_.red(e[n])} -> ${_.green(o[n])}`)}function Zn(e,o,n){let t=De.relative(De.dirname(e),process.cwd());return"link:"+De.join(t,o,Ce[n].localPath)}var Bo=qn;import{anvil as Xn,forge as es,getRpcUrl as os}from"@latticexyz/common/foundry";import ts from"chalk";var rs={...I,port:{type:"number",description:"Port to run internal node for fork testing on",default:4242},worldAddress:{type:"string",description:"Address of an existing world contract. If provided, deployment is skipped and the RPC provided in the foundry.toml is used for fork testing."},forgeOptions:{type:"string",description:"Options to pass to forge test"}},ns={command:"test",describe:"Run tests in MUD contracts",builder(e){return e.options(rs)},async handler(e){if(!e.worldAddress){let r=["--block-base-fee-per-gas","0","--port",String(e.port)];Xn(r)}let o=e.worldAddress?await os(e.profile):`http://127.0.0.1:${e.port}`,n=e.worldAddress??(await $({...e,saveDeployment:!1,rpc:o})).address;console.log(ts.blue("World address",n));let t=e.forgeOptions?.replaceAll("\\","").split(" ")??[];try{await es(["test","--fork-url",o,...t],{profile:e.profile,env:{WORLD_ADDRESS:n}}),process.exit(0)}catch(r){console.error(r),process.exit(1)}}},Wo=ns;import{existsSync as ss,readFileSync as as}from"fs";import{ethers as jo}from"ethers";import{loadConfig as is}from"@latticexyz/config/node";import{MUDError as Mo}from"@latticexyz/common/errors";import{cast as ds,getRpcUrl as cs,getSrcDirectory as ls}from"@latticexyz/common/foundry";import{resolveWorldConfig as ms}from"@latticexyz/world/internal";import ps from"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json"assert{type:"json"};import Ro from"@latticexyz/world/mud.config";import{resourceToHex as Fo}from"@latticexyz/common";import{createClient as fs,http as ys}from"viem";import{getChainId as us}from"viem/actions";import{worldToV1 as gs}from"@latticexyz/world/config/v2";var Ho=Fo({type:"system",namespace:Ro.namespace,name:Ro.tables.world__Systems.name}),bs={command:"trace",describe:"Display the trace of a transaction",builder(e){return e.options({tx:{type:"string",required:!0,description:"Transaction hash to replay"},worldAddress:{type:"string",description:"World contract address. Defaults to the value from worlds.json, based on rpc's chainId"},configPath:{type:"string",description:"Path to the MUD config file"},profile:{type:"string",description:"The foundry profile to use"},srcDir:{type:"string",description:"Source directory. Defaults to foundry src directory."},rpc:{type:"string",description:"json rpc endpoint. Defaults to foundry's configured eth_rpc_url"}})},async handler(e){e.profile??=process.env.FOUNDRY_PROFILE;let{profile:o}=e;e.srcDir??=await ls(o),e.rpc??=await cs(o);let{tx:n,configPath:t,srcDir:r,rpc:s}=e,i=k(r),a=await is(t),d=gs(a),c=ms(d,i.map(({basename:D})=>D)),y=e.worldAddress??await hs(d.worldsFile,s),u=new jo.providers.StaticJsonRpcProvider(s),g=new jo.Contract(y,ps,u),b=d.namespace,p=Object.values(c.systems).map(({name:D})=>D),l=await g.getFieldLayout(Ho),S=[];for(let D of p){let f=Fo({type:"system",namespace:b,name:D}),h=await g.getField(Ho,[f],0,l);S.push({name:D,address:h})}let x=await ds(["run","--label",`${y}:World`,...S.map(({name:D,address:f})=>["--label",`${f}:${D}`]).flat(),`${n}`]);console.log(x),process.exit(0)}},$o=bs;async function hs(e,o){if(ss(e)){let n=fs({transport:ys(o)}),t=await us(n),r=JSON.parse(as(e,"utf-8"));if(!r[t])throw new Mo(`chainId ${t} is missing in worldsFile "${e}"`);return r[t].address}else throw new Mo("worldAddress is not specified and worldsFile is missing")}import{anvil as ws,getScriptDirectory as xs,getSrcDirectory as Ss}from"@latticexyz/common/foundry";import j from"chalk";import Cs from"chokidar";import{loadConfig as Ds,resolveConfigPath as vs}from"@latticexyz/config/node";import Ts from"path";import{homedir as As}from"os";import{rmSync as ks}from"fs";import{BehaviorSubject as Is,debounceTime as Ps,exhaustMap as Os,filter as Bs}from"rxjs";import{isDefined as Ws}from"@latticexyz/common/utils";var js={rpc:I.rpc,configPath:I.configPath,alwaysRunPostDeploy:I.alwaysRunPostDeploy,forgeScriptOptions:I.forgeScriptOptions,worldAddress:I.worldAddress},Ms={command:"dev-contracts",describe:"Start a development server for MUD contracts",builder(e){return e.options(js)},async handler(e){let o=e.rpc,n=e.configPath??await vs(e.configPath),t=await Ss(),r=await xs(),s=await Ds(n);if(!e.rpc){console.log(j.gray("Cleaning devnode cache"));let c=As();ks(Ts.join(c,".foundry","anvil","tmp"),{recursive:!0,force:!0}),ws(["--block-time","1","--block-base-fee-per-gas","0"]),o="http://127.0.0.1:8545"}let i=new Is(Date.now());Cs.watch([n,t,r],{ignoreInitial:!0}).on("all",async(c,y)=>{y.includes(n)&&(console.log(j.blue("Config changed, queuing deploy\u2026")),i.next(Date.now())),(y.includes(t)||y.includes(r))&&(y.includes(s.codegen.outputDirectory)||(console.log(j.blue("Contracts changed, queuing deploy\u2026")),i.next(Date.now())))});let a=e.worldAddress;i.pipe(Ps(200),Os(async c=>{a&&console.log(j.blue("Rebuilding and upgrading world\u2026"));try{let y=await $({...e,configPath:n,rpc:o,rpcBatch:!1,skipBuild:!1,printConfig:!1,profile:void 0,saveDeployment:!0,deployerAddress:void 0,worldAddress:a,srcDir:t,salt:"0x",awsKmsKeyId:void 0});return a=y.address,c<i.value?i.next(i.value):console.log(j.gray(`
30
- Waiting for file changes\u2026
31
- `)),y}catch(y){console.error(j.bgRed(j.whiteBright(`
32
- Error while attempting deploy
33
- `))),console.error(y),console.log(j.gray(`
34
- Waiting for file changes\u2026
35
- `))}}),Bs(Ws)).subscribe()}},Eo=Ms;import{getCreate2Address as ve,sliceHex as Hs,zeroHash as Fs}from"viem";import{forge as Rs}from"@latticexyz/common/foundry";async function R(e,o){let n=["verify-contract",e.address,e.name,"--rpc-url",e.rpc];e.verifier&&n.push("--verifier",e.verifier),e.verifierUrl&&n.push("--verifier-url",e.verifierUrl),await Rs(n,o)}import $s from"p-queue";import{MUDError as Es}from"@latticexyz/common/errors";import{getStorageAt as zs}from"viem/actions";var Ns="0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc";async function zo({client:e,rpc:o,foundryProfile:n=process.env.FOUNDRY_PROFILE,systems:t,modules:r,worldAddress:s,deployerAddress:i,verifier:a,verifierUrl:d}){let c=i??await G(e);if(!c)throw new Es("No deployer");let y=await zs(e,{address:s,slot:Ns}),u=y&&y!==Fs,g=new $s({concurrency:1});if(t.map(({name:b,bytecode:p})=>g.add(()=>R({name:b,rpc:o,verifier:a,verifierUrl:d,address:ve({from:c,bytecode:p,salt:C})},{profile:n}).catch(l=>{console.error(`Error verifying system contract ${b}:`,l)}))),Object.entries(u?ee(c):X(c)).map(([b,{bytecode:p}])=>g.add(()=>R({name:b,rpc:o,verifier:a,verifierUrl:d,address:ve({from:c,bytecode:p,salt:C})},{profile:n,cwd:"node_modules/@latticexyz/world"}).catch(l=>{console.error(`Error verifying world factory contract ${b}:`,l)}))),r.map(({name:b,bytecode:p})=>g.add(()=>R({name:b,rpc:o,verifier:a,verifierUrl:d,address:ve({from:c,bytecode:p,salt:C})},{profile:n,cwd:"node_modules/@latticexyz/world-modules"}).catch(l=>{console.error(`Error verifying module contract ${b}:`,l)}))),u){let b=Hs(y,-20);g.add(()=>R({name:"WorldProxy",rpc:o,verifier:a,verifierUrl:d,address:s},{profile:n,cwd:"node_modules/@latticexyz/world"}).catch(p=>{console.error("Error verifying WorldProxy contract:",p)})),g.add(()=>R({name:"World",rpc:o,verifier:a,verifierUrl:d,address:b},{profile:n,cwd:"node_modules/@latticexyz/world"}).catch(p=>{console.error("Error verifying World contract:",p)}))}else g.add(()=>R({name:"World",rpc:o,verifier:a,verifierUrl:d,address:s},{profile:n,cwd:"node_modules/@latticexyz/world"}).catch(b=>{console.error("Error verifying World contract:",b)}))}import{loadConfig as Us}from"@latticexyz/config/node";import{resolveWorldConfig as Ls}from"@latticexyz/world/internal";import{worldToV1 as Vs}from"@latticexyz/world/config/v2";import{getOutDirectory as _s,getRpcUrl as Ks,getSrcDirectory as Js}from"@latticexyz/common/foundry";import{createWalletClient as qs,http as Ys}from"viem";import No from"chalk";var Gs={deployerAddress:{type:"string",desc:"Deploy using an existing deterministic deployer (https://github.com/Arachnid/deterministic-deployment-proxy)"},worldAddress:{type:"string",required:!0,desc:"Verify an existing World at the given address"},configPath:{type:"string",desc:"Path to the MUD config file"},profile:{type:"string",desc:"The foundry profile to use"},rpc:{type:"string",desc:"The RPC URL to use. Defaults to the RPC url from the local foundry.toml"},rpcBatch:{type:"boolean",desc:"Enable batch processing of RPC requests in viem client (defaults to batch size of 100 and wait of 1s)"},srcDir:{type:"string",desc:"Source directory. Defaults to foundry src directory."},verifier:{type:"string",desc:"The verifier to use"},verifierUrl:{type:"string",desc:"The verification provider."}},Qs={command:"verify",describe:"Verify contracts",builder(e){return e.options(Gs)},async handler(e){let o=e.profile??process.env.FOUNDRY_PROFILE,n=await Us(e.configPath),t=Vs(n),r=e.srcDir??await Js(o),s=await _s(o),i=e.rpc??await Ks(o);console.log(No.bgBlue(No.whiteBright(`
36
- Verifying MUD contracts${o?" with profile "+o:""} to RPC ${i}
37
- `)));let a=qs({transport:Ys(i,{batch:e.rpcBatch?{batchSize:100,wait:1e3}:void 0})}),d=k(r).map(({basename:g})=>g),c=Ls(t,d),y=Object.keys(c.systems).map(g=>{let b=W(`${g}.sol`,g,s);return{name:g,bytecode:b.bytecode}}),u=t.modules.map(g=>{let b=me.find(p=>p.name===g.name)??W(`${g.name}.sol`,g.name,s);return{name:g.name,bytecode:b.bytecode}});await zo({client:a,rpc:i,foundryProfile:o,systems:y,modules:u,deployerAddress:e.deployerAddress,worldAddress:e.worldAddress,verifier:e.verifier,verifierUrl:e.verifierUrl})}},Uo=Qs;var xy=[Ae,To,ke,Pe,Zs,Oe,Be,ko,Bo,Wo,$o,Eo,Xs,Uo];export{xy as commands};
38
- //# sourceMappingURL=commands-VJAW6WWR.js.map