@latticexyz/cli 2.0.0-main-430e6b29 → 2.0.0-main-e3d2aef6

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.
@@ -0,0 +1,11 @@
1
+ import S from"chalk";import j from"path";import{MUDError as st}from"@latticexyz/common/errors";import{loadConfig as it}from"@latticexyz/config/node";import d from"chalk";import Ye from"path";import{ethers as $}from"ethers";import{getOutDirectory as ze,cast as Qe,getSrcDirectory as Xe,getRemappings as Ze}from"@latticexyz/common/foundry";import{resolveWorldConfig as et}from"@latticexyz/world";import Te from"chalk";import Fe from"@latticexyz/world/out/World.sol/World.json"assert{type:"json"};import Ie from"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json"assert{type:"json"};import G from"chalk";import{ethers as xe}from"ethers";import{MUDError as U}from"@latticexyz/common/errors";async function I(e){let{signer:t,nonce:r,maxPriorityFeePerGas:o,maxFeePerGas:n,debug:a,gasPrice:l,confirmations:p,contract:m}=e;try{let i=new xe.ContractFactory(m.abi,m.bytecode,t);console.log(G.gray(`executing deployment of ${m.name} with nonce ${r}`));let g=i.deploy({nonce:r,maxPriorityFeePerGas:o,maxFeePerGas:n,gasPrice:l}).then(s=>p?s:s.deployed()),{address:f}=await g;return console.log(G.green("Deployed",m.name,"to",f)),f}catch(i){throw a&&console.error(i),i?.message.includes("invalid bytecode")?new U(`Error deploying ${m.name}: invalid bytecode. Note that linking of public libraries is not supported yet, make sure none of your libraries use "external" functions.`):i?.message.includes("CreateContractLimit")?new U(`Error deploying ${m.name}: CreateContractLimit exceeded.`):i}}import{readFileSync as Pe}from"fs";import Se from"path";import{MUDError as N}from"@latticexyz/common/errors";function w(e,t){let r,o=Se.join(t,e+".sol",e+".json");try{r=JSON.parse(Pe(o,"utf8"))}catch{throw new N(`Error reading file at ${o}`)}let n=r?.bytecode?.object;if(!n)throw new N(`No bytecode found in ${o}`);let a=r?.abi;if(!a)throw new N(`No ABI found in ${o}`);return{abi:a,bytecode:n}}async function K(e){console.log(Te.blue("Deploying World"));let t=e.worldContractName?{name:"World",...w(e.worldContractName,e.forgeOutDirectory)}:{abi:Ie,bytecode:Fe.bytecode,name:"World"};return I({...e,nonce:e.nonce,contract:t})}import tt from"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json"assert{type:"json"};import ce from"@latticexyz/world/out/CoreModule.sol/CoreModule.json"assert{type:"json"};import L from"@latticexyz/world-modules/out/KeysWithValueModule.sol/KeysWithValueModule.json"assert{type:"json"};import H from"@latticexyz/world-modules/out/KeysInTableModule.sol/KeysInTableModule.json"assert{type:"json"};import J from"@latticexyz/world-modules/out/UniqueEntityModule.sol/UniqueEntityModule.json"assert{type:"json"};var R=[{name:"KeysWithValueModule",abi:L.abi,bytecode:L.bytecode},{name:"KeysInTableModule",abi:H.abi,bytecode:H.bytecode},{name:"UniqueEntityModule",abi:J.abi,bytecode:J.bytecode}];import{defaultAbiCoder as Me}from"ethers/lib/utils.js";import{resolveWithContext as ve}from"@latticexyz/config";async function _(e,t,r){let o=await e[t.name];if(!o)throw new Error(`Module ${t.name} not found`);let n=t.args.map(p=>ve(p,{tableIds:r})),a=n.map(p=>p.value),l=n.map(p=>p.type);return{func:t.root?"installRootModule":"installModule",args:[o,Me.encode(l,a)]}}function q(e,t){return t.filter(r=>!e.some(o=>o.name===r.name))}import{resourceIdToHex as Ne}from"@latticexyz/common";async function Y(e){let{systems:t,namespace:r,systemContracts:o}=e,n=[];for(let{name:a,accessListAddresses:l,accessListSystems:p}of t)l.map(async m=>n.push(V(a,r,m))),p.map(async m=>n.push(V(a,r,await o[m])));return n}function V(e,t,r){return{func:"grantAccess",args:[Ne({type:"system",namespace:t,name:e}),r]}}import{resourceIdToHex as X}from"@latticexyz/common";import{ethers as k}from"ethers";function A(e,t){let{abi:r}=w(e,t);return r.filter(o=>["fallback","function"].includes(o.type)).map(o=>`${o.name}${Q(o.inputs)}`)}function z(e){return Re(e)}function Q(e){return`(${e.map(r=>{let o=r.type.match(/tuple(.*)/);return o?Q(r.components)+o[1]:r.type})})`}function Re(e){return k.utils.hexDataSlice(k.utils.keccak256(k.utils.toUtf8Bytes(e)),0,4)}function Z(e){let t=[],{systemContractName:r,namespace:o,forgeOutDirectory:n,system:a}=e;if(a.registerFunctionSelectors){let l=A("System",n),p=A(r,n).filter(i=>r==="System"||!l.includes(i)),m=o==="";for(let i of p)t.push(ke({namespace:o,name:a.name,systemFunctionSignature:i,isRoot:m}))}return t}function ke(e){let{namespace:t,name:r,systemFunctionSignature:o,isRoot:n}=e;if(n){let a=z(o);return{func:"registerRootFunctionSelector",args:[X({type:"system",namespace:t,name:r}),o,a]}}else return{func:"registerFunctionSelector",args:[X({type:"system",namespace:t,name:r}),o]}}import{resourceIdToHex as Ae}from"@latticexyz/common";async function ee(e){let{namespace:t,systemContracts:r,systemKey:o,system:n}=e,a=await r[o];return{func:"registerSystem",args:[Ae({type:"system",namespace:t,name:n.name}),a,n.openAccess]}}import{encodeSchema as te,getStaticByteLength as Oe}from"@latticexyz/schema-type/deprecated";import{resolveAbiOrUserType as oe}from"@latticexyz/store/codegen";import{resourceIdToHex as $e}from"@latticexyz/common";import{fieldLayoutToHex as je}from"@latticexyz/protocol-parser";import{loadAndExtractUserTypes as We}from"@latticexyz/common/codegen";function re(e,t,r,o){let{name:n,valueSchema:a,keySchema:l}=e;if(!n)throw Error("Table missing name");let p=We(t.userTypes,r,o),m=Object.values(a).map(s=>{let{schemaType:u}=oe(s,t,p);return u}),i=m.map(s=>Oe(s)),g={staticFieldLengths:i.filter(s=>s>0),numDynamicFields:i.filter(s=>s===0).length},f=Object.values(l).map(s=>{let{schemaType:u}=oe(s,t,p);return u});return{func:"registerTable",args:[$e({type:e.offchainOnly?"offchainTable":"table",namespace:t.namespace,name:n}),je(g),te(f),te(m),Object.keys(l),Object.keys(a)]}}import{resourceIdToHex as Ee}from"@latticexyz/common";import{hexToBytes as Be}from"viem";function ne(e){let t={};for(let[r,{name:o,offchainOnly:n}]of Object.entries(e.tables))t[r]=Be(Ee({type:n?"offchainTable":"table",namespace:e.namespace,name:o}));return t}import Ge from"chalk";import{MUDError as Ue}from"@latticexyz/common/errors";async function ae(e,t,r){let o=await e.getTransactionCount(),n=0,a=100;for(;o!==t&&n<a;)console.log(Ge.gray(`Waiting for transactions to be included before executing postDeployScript (local nonce: ${t}, remote nonce: ${o}, retry number ${n}/${a})`)),await new Promise(l=>setTimeout(l,r)),n++,o=await e.getTransactionCount();if(o!==t)throw new Ue("Remote nonce doesn't match local nonce, indicating that not all deploy transactions were included.")}import Ke from"chalk";import{MUDError as Le}from"@latticexyz/common/errors";async function h(e){let{func:t,args:r,contract:o,signer:n,nonce:a,maxPriorityFeePerGas:l,maxFeePerGas:p,gasPrice:m,confirmations:i=1,debug:g}=e,f=`${t}(${r.map(s=>`'${s}'`).join(",")})`;try{let s=o.connect(n),u=await s.estimateGas[t].apply(null,r);return console.log(Ke.gray(`executing transaction: ${f} with nonce ${a}`)),s[t].apply(null,[...r,{gasLimit:u,nonce:a,maxPriorityFeePerGas:l,maxFeePerGas:p,gasPrice:m}]).then(D=>i===0?D:D.wait(i))}catch(s){throw g&&console.error(s),new Le(`Gas estimation error for ${f}: ${s?.reason}`)}}import{existsSync as He}from"fs";import Je from"path";import _e from"chalk";import{getScriptDirectory as qe,forge as Ve}from"@latticexyz/common/foundry";async function se(e,t,r,o){let n=Je.join(await qe(),e+".s.sol");He(n)?(console.log(_e.blue(`Executing post deploy script at ${n}`)),await Ve(["script",e,"--sig","run(address)",t,"--broadcast","--rpc-url",r,"-vvv"],{profile:o})):console.log(`No script at ${n}, skipping post deploy hook`)}import{MUDError as O}from"@latticexyz/common/errors";async function ie(e,t){let r=await e.provider.getFeeData(),o,n,a;if(r.lastBaseFeePerGas){if(!r.lastBaseFeePerGas.eq(0)&&(await e.getBalance()).eq(0))throw new O(`Attempting to deploy to a chain with non-zero base fee with an account that has no balance.
2
+ If you're deploying to the Lattice testnet, you can fund your account by running 'pnpm mud faucet --address ${await e.getAddress()}'`);o=r.lastBaseFeePerGas.eq(0)?0:Math.floor(15e8*t),n=r.lastBaseFeePerGas.mul(2).add(o)}else if(r.gasPrice){if(!r.gasPrice.eq(0)&&(await e.getBalance()).eq(0))throw new O("Attempting to deploy to a chain with non-zero gas price with an account that has no balance.");a=r.gasPrice}else throw new O("Can not fetch fee data from RPC");return{maxPriorityFeePerGas:o,maxFeePerGas:n,gasPrice:a}}import{resourceIdToHex as ot}from"@latticexyz/common";async function le(e,t,r){let o=Date.now(),{profile:n,rpc:a,privateKey:l,priorityFeeMultiplier:p,debug:m,worldAddress:i,disableTxWait:g,pollInterval:f}=r,s=et(e,t),u=await ze(n),D=await Ze(n),T=Ye.join(await Xe(n),e.codegenDirectory),E=new $.providers.StaticJsonRpcProvider(a);E.pollingInterval=f;let P=new $.Wallet(l,E);console.log("Deploying from",P.address);let y=await P.getTransactionCount();console.log("Initial nonce",y);let C={...await ie(P,p),signer:P,debug:!!m,disableTxWait:g,confirmations:g?0:1},B=Number(await Qe(["block-number","--rpc-url",a],{profile:n}));console.log("Start deployment at block",B);let ue=i?Promise.resolve(i):K({...C,nonce:y++,worldContractName:e.worldContractName,forgeOutDirectory:u}),de=q(R,e.modules).map(({name:c})=>{let{abi:b,bytecode:v}=w(c,u);return{name:c,abi:b,bytecode:v}}),ge=Object.keys(s.systems).map(c=>{let{abi:b,bytecode:v}=w(c,u);return{name:c,abi:b,bytecode:v}}),F=[{name:"CoreModule",abi:ce.abi,bytecode:ce.bytecode},...R,...de,...ge].reduce((c,b)=>(c[b.name]=I({...C,nonce:y++,contract:b}),c),{}),M=await ue,x=new $.Contract(M,tt);i||(console.log(d.blue("Installing CoreModule")),await h({...C,nonce:y++,contract:x,func:"initialize",args:[await F.CoreModule]}),console.log(d.green("Installed CoreModule"))),e.namespace&&(console.log(d.blue("Registering Namespace")),await h({...C,nonce:y++,contract:x,func:"registerNamespace",args:[ot({type:"namespace",namespace:e.namespace,name:""})]}),console.log(d.green("Namespace registered")));let ye=ne(e),be=Object.values(e.tables).map(c=>re(c,e,T,D));console.log(d.blue("Registering tables")),await Promise.all(be.map(c=>h({...C,nonce:y++,contract:x,...c}))),console.log(d.green("Tables registered")),console.log(d.blue("Registering Systems and Functions"));let Ce=await Promise.all(Object.entries(s.systems).map(([c,b])=>ee({systemContracts:F,systemKey:c,system:b,namespace:e.namespace}))),we=Object.entries(s.systems).flatMap(([c,b])=>Z({systemContractName:c,system:b,namespace:e.namespace,forgeOutDirectory:u}));await Promise.all([...Ce,...we].map(c=>h({...C,nonce:y++,contract:x,...c}))),console.log(d.green("Systems and Functions registered"));let he=await Y({systems:Object.values(s.systems),systemContracts:F,namespace:e.namespace});console.log(d.blue("Granting Access")),await Promise.all(he.map(c=>h({...C,nonce:y++,contract:x,...c}))),console.log(d.green("Access granted"));let De=await Promise.all(e.modules.map(c=>_(F,c,ye)));return console.log(d.blue("Installing User Modules")),await Promise.all(De.map(c=>h({...C,nonce:y++,contract:x,...c}))),console.log(d.green("User Modules Installed")),await ae(P,y,f),await se(e.postDeployScript,M,a,n),console.log(d.green("Deployment completed in",(Date.now()-o)/1e3,"seconds")),{worldAddress:M,blockNumber:B}}import{forge as fe,getRpcUrl as ct,getSrcDirectory as lt}from"@latticexyz/common/foundry";import{existsSync as mt,mkdirSync as pt,readFileSync as ft,writeFileSync as W}from"fs";import rt from"glob";import{basename as nt}from"path";function me(e){return rt.sync(`${e}/**/*.sol`).map(t=>({path:t,basename:nt(t,".sol")}))}import{execa as ut}from"execa";import{ethers as at}from"ethers";async function pe(e){let{result:t}=await at.utils.fetchJson(e,'{ "id": 42, "jsonrpc": "2.0", "method": "eth_chainId", "params": [ ] }');return Number(t)}async function nr(e){e.profile??=process.env.FOUNDRY_PROFILE;let{configPath:t,printConfig:r,profile:o,clean:n,skipBuild:a}=e,l=e.rpc??await ct(o);console.log(S.bgBlue(S.whiteBright(`
3
+ Deploying MUD contracts${o?" with profile "+o:""} to RPC ${l}
4
+ `))),n&&await fe(["clean"],{profile:o}),a||(await fe(["build","--skip","test","script"],{profile:o}),await ut("mud",["abi-ts"],{stdio:"inherit"}));let p=e?.srcDir??await lt(),m=me(p).map(({basename:s})=>s),i=await it(t);r&&console.log(S.green(`
5
+ Resolved config:
6
+ `),JSON.stringify(i,null,2));let g=process.env.PRIVATE_KEY;if(!g)throw new st(`Missing PRIVATE_KEY environment variable.
7
+ Run 'echo "PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" > .env'
8
+ in your contracts directory to use the default anvil private key.`);let f=await le(i,m,{...e,rpc:l,privateKey:g});if(e.saveDeployment){let s=await pe(l),u=j.join(i.deploysDirectory,s.toString());pt(u,{recursive:!0}),W(j.join(u,"latest.json"),JSON.stringify(f,null,2)),W(j.join(u,Date.now()+".json"),JSON.stringify(f,null,2));let D=[1337,31337],T=mt(i.worldsFile)?JSON.parse(ft(i.worldsFile,"utf-8")):{};T[s]={address:f.worldAddress,blockNumber:D.includes(s)?void 0:f.blockNumber},W(i.worldsFile,JSON.stringify(T,null,2)),console.log(S.bgGreen(S.whiteBright(`
9
+ Deployment result (written to ${i.worldsFile} and ${u}):
10
+ `)))}return console.log(f),f}export{me as a,pe as b,nr as c};
11
+ //# sourceMappingURL=chunk-JTPXIOF5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/deployHandler.ts","../src/utils/deploy.ts","../src/utils/world.ts","../src/utils/utils/deployContract.ts","../src/utils/utils/getContractData.ts","../src/utils/modules/constants.ts","../src/utils/modules/getInstallModuleCallData.ts","../src/utils/modules/getUserModules.ts","../src/utils/systems/getGrantAccessCallData.ts","../src/utils/systems/getRegisterFunctionSelectorsCallData.ts","../src/utils/systems/utils.ts","../src/utils/systems/getRegisterSystemCallData.ts","../src/utils/tables/getRegisterTableCallData.ts","../src/utils/tables/getTableIds.ts","../src/utils/utils/confirmNonce.ts","../src/utils/utils/fastTxExecute.ts","../src/utils/utils/postDeploy.ts","../src/utils/utils/setInternalFeePerGas.ts","../src/utils/getExistingContracts.ts","../src/utils/utils/getChainId.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport path from \"path\";\nimport { MUDError } from \"@latticexyz/common/errors\";\nimport { loadConfig } from \"@latticexyz/config/node\";\nimport { StoreConfig } from \"@latticexyz/store\";\nimport { WorldConfig } from \"@latticexyz/world\";\nimport { deploy } from \"../utils/deploy\";\nimport { forge, getRpcUrl, getSrcDirectory } from \"@latticexyz/common/foundry\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { getExistingContracts } from \"./getExistingContracts\";\nimport { execa } from \"execa\";\nimport { getChainId } from \"./utils/getChainId\";\n\nexport type DeployOptions = {\n configPath?: string;\n printConfig?: boolean;\n profile?: string;\n priorityFeeMultiplier: number;\n clean?: boolean;\n debug?: boolean;\n saveDeployment: boolean;\n rpc?: string;\n worldAddress?: string;\n srcDir?: string;\n disableTxWait: boolean;\n pollInterval: number;\n skipBuild?: boolean;\n};\n\nexport async function deployHandler(args: DeployOptions) {\n args.profile ??= process.env.FOUNDRY_PROFILE;\n const { configPath, printConfig, profile, clean, skipBuild } = args;\n\n const rpc = args.rpc ?? (await getRpcUrl(profile));\n console.log(\n chalk.bgBlue(\n chalk.whiteBright(`\\n Deploying MUD contracts${profile ? \" with profile \" + profile : \"\"} to RPC ${rpc} \\n`)\n )\n );\n\n if (clean) {\n await forge([\"clean\"], { profile });\n }\n\n // Run forge build\n if (!skipBuild) {\n await forge([\"build\", \"--skip\", \"test\", \"script\"], { profile });\n await execa(\"mud\", [\"abi-ts\"], { stdio: \"inherit\" });\n }\n\n // Get a list of all contract names\n const srcDir = args?.srcDir ?? (await getSrcDirectory());\n const existingContractNames = getExistingContracts(srcDir).map(({ basename }) => basename);\n\n // Load the config\n const mudConfig = (await loadConfig(configPath)) as StoreConfig & WorldConfig;\n\n if (printConfig) console.log(chalk.green(\"\\nResolved config:\\n\"), JSON.stringify(mudConfig, null, 2));\n\n const privateKey = process.env.PRIVATE_KEY;\n if (!privateKey)\n throw new MUDError(\n `Missing PRIVATE_KEY environment variable.\nRun 'echo \"PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\" > .env'\nin your contracts directory to use the default anvil private key.`\n );\n const deploymentInfo = await deploy(mudConfig, existingContractNames, { ...args, rpc, privateKey });\n\n if (args.saveDeployment) {\n // Write deployment result to file (latest and timestamp)\n const chainId = await getChainId(rpc);\n const outputDir = path.join(mudConfig.deploysDirectory, chainId.toString());\n mkdirSync(outputDir, { recursive: true });\n writeFileSync(path.join(outputDir, \"latest.json\"), JSON.stringify(deploymentInfo, null, 2));\n writeFileSync(path.join(outputDir, Date.now() + \".json\"), JSON.stringify(deploymentInfo, null, 2));\n\n const localChains = [1337, 31337];\n const deploys = existsSync(mudConfig.worldsFile) ? JSON.parse(readFileSync(mudConfig.worldsFile, \"utf-8\")) : {};\n deploys[chainId] = {\n address: deploymentInfo.worldAddress,\n // We expect the worlds file to be committed and since local deployments are often a consistent address but different block number, we'll ignore the block number.\n blockNumber: localChains.includes(chainId) ? undefined : deploymentInfo.blockNumber,\n };\n writeFileSync(mudConfig.worldsFile, JSON.stringify(deploys, null, 2));\n\n console.log(\n chalk.bgGreen(chalk.whiteBright(`\\n Deployment result (written to ${mudConfig.worldsFile} and ${outputDir}): \\n`))\n );\n }\n\n console.log(deploymentInfo);\n return deploymentInfo;\n}\n","import chalk from \"chalk\";\nimport path from \"path\";\nimport { ethers } from \"ethers\";\nimport { getOutDirectory, cast, getSrcDirectory, getRemappings } from \"@latticexyz/common/foundry\";\nimport { StoreConfig } from \"@latticexyz/store\";\nimport { WorldConfig, resolveWorldConfig } from \"@latticexyz/world\";\nimport { deployWorldContract } from \"./world\";\nimport IBaseWorldAbi from \"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json\" assert { type: \"json\" };\nimport CoreModuleData from \"@latticexyz/world/out/CoreModule.sol/CoreModule.json\" assert { type: \"json\" };\nimport { defaultModuleContracts } from \"./modules/constants\";\nimport { getInstallModuleCallData } from \"./modules/getInstallModuleCallData\";\nimport { getUserModules } from \"./modules/getUserModules\";\nimport { getGrantAccessCallData } from \"./systems/getGrantAccessCallData\";\nimport { getRegisterFunctionSelectorsCallData } from \"./systems/getRegisterFunctionSelectorsCallData\";\nimport { getRegisterSystemCallData } from \"./systems/getRegisterSystemCallData\";\nimport { getRegisterTableCallData } from \"./tables/getRegisterTableCallData\";\nimport { getTableIds } from \"./tables/getTableIds\";\nimport { confirmNonce } from \"./utils/confirmNonce\";\nimport { deployContract } from \"./utils/deployContract\";\nimport { fastTxExecute } from \"./utils/fastTxExecute\";\nimport { getContractData } from \"./utils/getContractData\";\nimport { postDeploy } from \"./utils/postDeploy\";\nimport { setInternalFeePerGas } from \"./utils/setInternalFeePerGas\";\nimport { ContractCode } from \"./utils/types\";\nimport { resourceIdToHex } from \"@latticexyz/common\";\n\nexport interface DeployConfig {\n profile?: string;\n rpc: string;\n privateKey: string;\n priorityFeeMultiplier: number;\n debug?: boolean;\n worldAddress?: string;\n disableTxWait: boolean;\n pollInterval: number;\n}\n\nexport interface DeploymentInfo {\n blockNumber: number;\n worldAddress: string;\n}\n\nexport async function deploy(\n mudConfig: StoreConfig & WorldConfig,\n existingContractNames: string[],\n deployConfig: DeployConfig\n): Promise<DeploymentInfo> {\n const startTime = Date.now();\n const { profile, rpc, privateKey, priorityFeeMultiplier, debug, worldAddress, disableTxWait, pollInterval } =\n deployConfig;\n const resolvedConfig = resolveWorldConfig(mudConfig, existingContractNames);\n const forgeOutDirectory = await getOutDirectory(profile);\n const remappings = await getRemappings(profile);\n const outputBaseDirectory = path.join(await getSrcDirectory(profile), mudConfig.codegenDirectory);\n\n // Set up signer for deployment\n const provider = new ethers.providers.StaticJsonRpcProvider(rpc);\n provider.pollingInterval = pollInterval;\n const signer = new ethers.Wallet(privateKey, provider);\n console.log(\"Deploying from\", signer.address);\n\n let nonce = await signer.getTransactionCount();\n console.log(\"Initial nonce\", nonce);\n\n const txParams = await setInternalFeePerGas(signer, priorityFeeMultiplier);\n\n const txConfig = {\n ...txParams,\n signer,\n debug: Boolean(debug),\n disableTxWait,\n confirmations: disableTxWait ? 0 : 1,\n };\n\n // Get block number before deploying\n const blockNumber = Number(await cast([\"block-number\", \"--rpc-url\", rpc], { profile }));\n console.log(\"Start deployment at block\", blockNumber);\n\n // Deploy the World contract. Non-blocking.\n const worldPromise: Promise<string> = worldAddress\n ? Promise.resolve(worldAddress)\n : deployWorldContract({\n ...txConfig,\n nonce: nonce++,\n worldContractName: mudConfig.worldContractName,\n forgeOutDirectory,\n });\n\n // Filters any default modules from config\n const userModules = getUserModules(defaultModuleContracts, mudConfig.modules);\n const userModuleContracts = userModules.map(({ name }) => {\n const { abi, bytecode } = getContractData(name, forgeOutDirectory);\n return {\n name,\n abi,\n bytecode,\n } as ContractCode;\n });\n\n const systemContracts = Object.keys(resolvedConfig.systems).map((name) => {\n const { abi, bytecode } = getContractData(name, forgeOutDirectory);\n return {\n name,\n abi,\n bytecode,\n } as ContractCode;\n });\n\n const contracts: ContractCode[] = [\n {\n name: \"CoreModule\",\n abi: CoreModuleData.abi,\n bytecode: CoreModuleData.bytecode,\n },\n ...defaultModuleContracts,\n ...userModuleContracts,\n ...systemContracts,\n ];\n\n // Deploy the System and Module contracts\n const deployedContracts = contracts.reduce<Record<string, Promise<string>>>((acc, contract) => {\n acc[contract.name] = deployContract({\n ...txConfig,\n nonce: nonce++,\n contract,\n });\n return acc;\n }, {});\n\n // Wait for world to be deployed\n const deployedWorldAddress = await worldPromise;\n const worldContract = new ethers.Contract(deployedWorldAddress, IBaseWorldAbi);\n\n // If an existing World is passed assume its coreModule is already installed - blocking to install if not\n if (!worldAddress) {\n console.log(chalk.blue(\"Installing CoreModule\"));\n await fastTxExecute({\n ...txConfig,\n nonce: nonce++,\n contract: worldContract,\n func: \"initialize\",\n args: [await deployedContracts[\"CoreModule\"]],\n });\n console.log(chalk.green(\"Installed CoreModule\"));\n }\n\n if (mudConfig.namespace) {\n console.log(chalk.blue(\"Registering Namespace\"));\n await fastTxExecute({\n ...txConfig,\n nonce: nonce++,\n contract: worldContract,\n func: \"registerNamespace\",\n args: [resourceIdToHex({ type: \"namespace\", namespace: mudConfig.namespace, name: \"\" })],\n });\n console.log(chalk.green(\"Namespace registered\"));\n }\n\n const tableIds = getTableIds(mudConfig);\n\n const registerTableCalls = Object.values(mudConfig.tables).map((table) =>\n getRegisterTableCallData(table, mudConfig, outputBaseDirectory, remappings)\n );\n\n console.log(chalk.blue(\"Registering tables\"));\n await Promise.all(\n registerTableCalls.map((call) =>\n fastTxExecute({\n ...txConfig,\n nonce: nonce++,\n contract: worldContract,\n ...call,\n })\n )\n );\n console.log(chalk.green(`Tables registered`));\n\n console.log(chalk.blue(\"Registering Systems and Functions\"));\n const systemCalls = await Promise.all(\n Object.entries(resolvedConfig.systems).map(([systemKey, system]) =>\n getRegisterSystemCallData({\n systemContracts: deployedContracts,\n systemKey,\n system,\n namespace: mudConfig.namespace,\n })\n )\n );\n const functionCalls = Object.entries(resolvedConfig.systems).flatMap(([systemKey, system]) =>\n getRegisterFunctionSelectorsCallData({\n systemContractName: systemKey,\n system,\n namespace: mudConfig.namespace,\n forgeOutDirectory,\n })\n );\n await Promise.all(\n [...systemCalls, ...functionCalls].map((call) =>\n fastTxExecute({\n ...txConfig,\n nonce: nonce++,\n contract: worldContract,\n ...call,\n })\n )\n );\n console.log(chalk.green(`Systems and Functions registered`));\n\n // Wait for System access to be granted before installing modules\n const grantCalls = await getGrantAccessCallData({\n systems: Object.values(resolvedConfig.systems),\n systemContracts: deployedContracts,\n namespace: mudConfig.namespace,\n });\n\n console.log(chalk.blue(\"Granting Access\"));\n await Promise.all(\n grantCalls.map((call) =>\n fastTxExecute({\n ...txConfig,\n nonce: nonce++,\n contract: worldContract,\n ...call,\n })\n )\n );\n console.log(chalk.green(`Access granted`));\n\n const moduleCalls = await Promise.all(\n mudConfig.modules.map((m) => getInstallModuleCallData(deployedContracts, m, tableIds))\n );\n\n console.log(chalk.blue(\"Installing User Modules\"));\n await Promise.all(\n moduleCalls.map((call) =>\n fastTxExecute({\n ...txConfig,\n nonce: nonce++,\n contract: worldContract,\n ...call,\n })\n )\n );\n console.log(chalk.green(`User Modules Installed`));\n\n // Double check that all transactions have been included by confirming the current nonce is the expected nonce\n await confirmNonce(signer, nonce, pollInterval);\n\n await postDeploy(mudConfig.postDeployScript, deployedWorldAddress, rpc, profile);\n\n console.log(chalk.green(\"Deployment completed in\", (Date.now() - startTime) / 1000, \"seconds\"));\n\n return { worldAddress: deployedWorldAddress, blockNumber };\n}\n","import chalk from \"chalk\";\n\nimport WorldData from \"@latticexyz/world/out/World.sol/World.json\" assert { type: \"json\" };\nimport IBaseWorldAbi from \"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json\" assert { type: \"json\" };\nimport { deployContract } from \"./utils/deployContract\";\nimport { getContractData } from \"./utils/getContractData\";\nimport { TxConfig } from \"./utils/types\";\n\nexport async function deployWorldContract(\n ip: TxConfig & {\n nonce: number;\n worldContractName: string | undefined;\n forgeOutDirectory: string;\n }\n): Promise<string> {\n console.log(chalk.blue(`Deploying World`));\n const contractData = ip.worldContractName\n ? {\n name: \"World\",\n ...getContractData(ip.worldContractName, ip.forgeOutDirectory),\n }\n : { abi: IBaseWorldAbi, bytecode: WorldData.bytecode, name: \"World\" };\n return deployContract({\n ...ip,\n nonce: ip.nonce,\n contract: contractData,\n });\n}\n","import chalk from \"chalk\";\nimport { ethers } from \"ethers\";\nimport { MUDError } from \"@latticexyz/common/errors\";\nimport { TxConfig, ContractCode } from \"./types\";\n\nexport async function deployContract(input: TxConfig & { nonce: number; contract: ContractCode }): Promise<string> {\n const { signer, nonce, maxPriorityFeePerGas, maxFeePerGas, debug, gasPrice, confirmations, contract } = input;\n\n try {\n const factory = new ethers.ContractFactory(contract.abi, contract.bytecode, signer);\n console.log(chalk.gray(`executing deployment of ${contract.name} with nonce ${nonce}`));\n const deployPromise = factory\n .deploy({\n nonce,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gasPrice,\n })\n .then((c) => (confirmations ? c : c.deployed()));\n const { address } = await deployPromise;\n console.log(chalk.green(\"Deployed\", contract.name, \"to\", address));\n return address;\n } catch (error: any) {\n if (debug) console.error(error);\n if (error?.message.includes(\"invalid bytecode\")) {\n throw new MUDError(\n `Error deploying ${contract.name}: invalid bytecode. Note that linking of public libraries is not supported yet, make sure none of your libraries use \"external\" functions.`\n );\n } else if (error?.message.includes(\"CreateContractLimit\")) {\n throw new MUDError(`Error deploying ${contract.name}: CreateContractLimit exceeded.`);\n } else throw error;\n }\n}\n","import { readFileSync } from \"fs\";\nimport path from \"path\";\nimport { Fragment } from \"ethers/lib/utils.js\";\nimport { MUDError } from \"@latticexyz/common/errors\";\n\n/**\n * Load the contract's abi and bytecode from the file system\n * @param contractName: Name of the contract to load\n */\nexport function getContractData(\n contractName: string,\n forgeOutDirectory: string\n): { bytecode: string; abi: Fragment[] } {\n let data: any;\n const contractDataPath = path.join(forgeOutDirectory, contractName + \".sol\", contractName + \".json\");\n try {\n data = JSON.parse(readFileSync(contractDataPath, \"utf8\"));\n } catch (error: any) {\n throw new MUDError(`Error reading file at ${contractDataPath}`);\n }\n\n const bytecode = data?.bytecode?.object;\n if (!bytecode) throw new MUDError(`No bytecode found in ${contractDataPath}`);\n\n const abi = data?.abi;\n if (!abi) throw new MUDError(`No ABI found in ${contractDataPath}`);\n\n return { abi, bytecode };\n}\n","import KeysWithValueModuleData from \"@latticexyz/world-modules/out/KeysWithValueModule.sol/KeysWithValueModule.json\" assert { type: \"json\" };\nimport KeysInTableModuleData from \"@latticexyz/world-modules/out/KeysInTableModule.sol/KeysInTableModule.json\" assert { type: \"json\" };\nimport UniqueEntityModuleData from \"@latticexyz/world-modules/out/UniqueEntityModule.sol/UniqueEntityModule.json\" assert { type: \"json\" };\nimport { ContractCode } from \"../utils/types\";\n\n// These modules are always deployed\nexport const defaultModuleContracts: ContractCode[] = [\n {\n name: \"KeysWithValueModule\",\n abi: KeysWithValueModuleData.abi,\n bytecode: KeysWithValueModuleData.bytecode,\n },\n {\n name: \"KeysInTableModule\",\n abi: KeysInTableModuleData.abi,\n bytecode: KeysInTableModuleData.bytecode,\n },\n {\n name: \"UniqueEntityModule\",\n abi: UniqueEntityModuleData.abi,\n bytecode: UniqueEntityModuleData.bytecode,\n },\n];\n","import { defaultAbiCoder } from \"ethers/lib/utils.js\";\nimport { resolveWithContext } from \"@latticexyz/config\";\nimport { Module } from \"./types\";\nimport { CallData } from \"../utils/types\";\nimport { TableIds } from \"../tables/types\";\n\nexport async function getInstallModuleCallData(\n moduleContracts: Record<string, Promise<string>>,\n module: Module,\n tableIds: TableIds\n): Promise<CallData> {\n const moduleAddress = await moduleContracts[module.name];\n if (!moduleAddress) throw new Error(`Module ${module.name} not found`);\n // Resolve arguments\n const resolvedArgs = module.args.map((arg) =>\n resolveWithContext(arg, {\n tableIds,\n })\n );\n const values = resolvedArgs.map((arg) => arg.value);\n const types = resolvedArgs.map((arg) => arg.type);\n\n return {\n func: module.root ? \"installRootModule\" : \"installModule\",\n args: [moduleAddress, defaultAbiCoder.encode(types, values)],\n };\n}\n","import { Module } from \"./types\";\n\nexport function getUserModules(defaultModules: { name: string }[], configModules: Module[]): Omit<Module, \"address\">[] {\n return configModules.filter((module) => !defaultModules.some((m) => m.name === module.name));\n}\n","import { System } from \"./types\";\nimport { CallData } from \"../utils/types\";\nimport { resourceIdToHex } from \"@latticexyz/common\";\n\nexport async function getGrantAccessCallData(input: {\n systems: System[];\n systemContracts: Record<string, Promise<string>>;\n namespace: string;\n}): Promise<CallData[]> {\n const { systems, namespace, systemContracts } = input;\n const calls: CallData[] = [];\n for (const { name, accessListAddresses, accessListSystems } of systems) {\n // Grant access to addresses\n accessListAddresses.map(async (address) => calls.push(getGrantSystemAccessCallData(name, namespace, address)));\n\n // Grant access to other systems\n accessListSystems.map(async (granteeSystem) =>\n calls.push(getGrantSystemAccessCallData(name, namespace, await systemContracts[granteeSystem]))\n );\n }\n return calls;\n}\n\nfunction getGrantSystemAccessCallData(name: string, namespace: string, address: string): CallData {\n return {\n func: \"grantAccess\",\n args: [resourceIdToHex({ type: \"system\", namespace, name }), address],\n };\n}\n","import { resourceIdToHex } from \"@latticexyz/common\";\nimport { System } from \"./types\";\nimport { loadFunctionSignatures, toFunctionSelector } from \"./utils\";\nimport { CallData } from \"../utils/types\";\n\nexport function getRegisterFunctionSelectorsCallData(input: {\n systemContractName: string;\n system: System;\n namespace: string;\n forgeOutDirectory: string;\n}): CallData[] {\n // Register system at route\n const callData: CallData[] = [];\n const { systemContractName, namespace, forgeOutDirectory, system } = input;\n\n if (system.registerFunctionSelectors) {\n const baseSystemFunctionSignatures = loadFunctionSignatures(\"System\", forgeOutDirectory);\n const systemFunctionSignatures = loadFunctionSignatures(systemContractName, forgeOutDirectory).filter(\n (functionSignature) =>\n systemContractName === \"System\" || !baseSystemFunctionSignatures.includes(functionSignature)\n );\n const isRoot = namespace === \"\";\n for (const systemFunctionSignature of systemFunctionSignatures) {\n callData.push(\n getRegisterFunctionSelectorCallData({\n namespace,\n name: system.name,\n systemFunctionSignature,\n isRoot,\n })\n );\n }\n }\n return callData;\n}\n\nfunction getRegisterFunctionSelectorCallData(input: {\n namespace: string;\n name: string;\n systemFunctionSignature: string;\n isRoot: boolean;\n}): CallData {\n const { namespace, name, systemFunctionSignature, isRoot } = input;\n\n if (isRoot) {\n const functionSelector = toFunctionSelector(systemFunctionSignature);\n return {\n func: \"registerRootFunctionSelector\",\n args: [resourceIdToHex({ type: \"system\", namespace, name }), systemFunctionSignature, functionSelector],\n };\n } else {\n return {\n func: \"registerFunctionSelector\",\n args: [resourceIdToHex({ type: \"system\", namespace, name }), systemFunctionSignature],\n };\n }\n}\n","import { ethers } from \"ethers\";\nimport { ParamType } from \"ethers/lib/utils.js\";\nimport { getContractData } from \"../utils/getContractData\";\n\nexport function loadFunctionSignatures(contractName: string, forgeOutDirectory: string): string[] {\n const { abi } = getContractData(contractName, forgeOutDirectory);\n\n return abi\n .filter((item) => [\"fallback\", \"function\"].includes(item.type))\n .map((item) => {\n return `${item.name}${parseComponents(item.inputs)}`;\n });\n}\n\n// TODO: move this to utils as soon as utils are usable inside cli\n// (see https://github.com/latticexyz/mud/issues/499)\nexport function toFunctionSelector(functionSignature: string): string {\n return sigHash(functionSignature);\n}\n\n/**\n * Recursively turn (nested) structs in signatures into tuples\n */\nfunction parseComponents(params: ParamType[]): string {\n const components = params.map((param) => {\n const tupleMatch = param.type.match(/tuple(.*)/);\n if (tupleMatch) {\n // there can be arrays of tuples,\n // `tupleMatch[1]` preserves the array brackets (or is empty string for non-arrays)\n return parseComponents(param.components) + tupleMatch[1];\n } else {\n return param.type;\n }\n });\n return `(${components})`;\n}\n\n// TODO: move this to utils as soon as utils are usable inside cli\n// (see https://github.com/latticexyz/mud/issues/499)\nfunction sigHash(signature: string) {\n return ethers.utils.hexDataSlice(ethers.utils.keccak256(ethers.utils.toUtf8Bytes(signature)), 0, 4);\n}\n","import { resourceIdToHex } from \"@latticexyz/common\";\nimport { System } from \"./types\";\nimport { CallData } from \"../utils/types\";\n\nexport async function getRegisterSystemCallData(input: {\n systemContracts: Record<string, Promise<string>>;\n systemKey: string;\n system: System;\n namespace: string;\n}): Promise<CallData> {\n const { namespace, systemContracts, systemKey, system } = input;\n const systemAddress = await systemContracts[systemKey];\n return {\n func: \"registerSystem\",\n args: [resourceIdToHex({ type: \"system\", namespace, name: system.name }), systemAddress, system.openAccess],\n };\n}\n","import { encodeSchema, getStaticByteLength } from \"@latticexyz/schema-type/deprecated\";\nimport { StoreConfig } from \"@latticexyz/store\";\nimport { resolveAbiOrUserType } from \"@latticexyz/store/codegen\";\nimport { resourceIdToHex } from \"@latticexyz/common\";\nimport { Table } from \"./types\";\nimport { fieldLayoutToHex } from \"@latticexyz/protocol-parser\";\nimport { CallData } from \"../utils/types\";\nimport { loadAndExtractUserTypes } from \"@latticexyz/common/codegen\";\n\nexport function getRegisterTableCallData(\n table: Table,\n storeConfig: StoreConfig,\n outputBaseDirectory: string,\n remappings: [string, string][]\n): CallData {\n const { name, valueSchema, keySchema } = table;\n if (!name) throw Error(\"Table missing name\");\n\n const solidityUserTypes = loadAndExtractUserTypes(storeConfig.userTypes, outputBaseDirectory, remappings);\n\n const schemaTypes = Object.values(valueSchema).map((abiOrUserType) => {\n const { schemaType } = resolveAbiOrUserType(abiOrUserType, storeConfig, solidityUserTypes);\n return schemaType;\n });\n\n const schemaTypeLengths = schemaTypes.map((schemaType) => getStaticByteLength(schemaType));\n const fieldLayout = {\n staticFieldLengths: schemaTypeLengths.filter((schemaTypeLength) => schemaTypeLength > 0),\n numDynamicFields: schemaTypeLengths.filter((schemaTypeLength) => schemaTypeLength === 0).length,\n };\n\n const keyTypes = Object.values(keySchema).map((abiOrUserType) => {\n const { schemaType } = resolveAbiOrUserType(abiOrUserType, storeConfig, solidityUserTypes);\n return schemaType;\n });\n\n return {\n func: \"registerTable\",\n args: [\n // TODO: add support for table namespaces (https://github.com/latticexyz/mud/issues/994)\n resourceIdToHex({ type: table.offchainOnly ? \"offchainTable\" : \"table\", namespace: storeConfig.namespace, name }),\n fieldLayoutToHex(fieldLayout),\n encodeSchema(keyTypes),\n encodeSchema(schemaTypes),\n Object.keys(keySchema),\n Object.keys(valueSchema),\n ],\n };\n}\n","import { StoreConfig } from \"@latticexyz/store\";\nimport { TableIds } from \"./types\";\nimport { resourceIdToHex } from \"@latticexyz/common\";\nimport { hexToBytes } from \"viem\";\n\nexport function getTableIds(storeConfig: StoreConfig): TableIds {\n const tableIds: TableIds = {};\n for (const [tableName, { name, offchainOnly }] of Object.entries(storeConfig.tables)) {\n tableIds[tableName] = hexToBytes(\n resourceIdToHex({\n type: offchainOnly ? \"offchainTable\" : \"table\",\n namespace: storeConfig.namespace,\n name,\n })\n );\n }\n return tableIds;\n}\n","import chalk from \"chalk\";\nimport { Wallet } from \"ethers\";\nimport { MUDError } from \"@latticexyz/common/errors\";\n\nexport async function confirmNonce(signer: Wallet, nonce: number, pollInterval: number): Promise<void> {\n let remoteNonce = await signer.getTransactionCount();\n let retryCount = 0;\n const maxRetries = 100;\n while (remoteNonce !== nonce && retryCount < maxRetries) {\n console.log(\n chalk.gray(\n `Waiting for transactions to be included before executing postDeployScript (local nonce: ${nonce}, remote nonce: ${remoteNonce}, retry number ${retryCount}/${maxRetries})`\n )\n );\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n retryCount++;\n remoteNonce = await signer.getTransactionCount();\n }\n if (remoteNonce !== nonce) {\n throw new MUDError(\n \"Remote nonce doesn't match local nonce, indicating that not all deploy transactions were included.\"\n );\n }\n}\n","import chalk from \"chalk\";\nimport { TransactionReceipt, TransactionResponse } from \"@ethersproject/providers\";\nimport { MUDError } from \"@latticexyz/common/errors\";\nimport { TxConfig } from \"./types\";\n\n/**\n * Only await gas estimation (for speed), only execute if gas estimation succeeds (for safety)\n */\nexport async function fastTxExecute<\n C extends { connect: any; estimateGas: any; [key: string]: any },\n F extends keyof C\n>(\n input: TxConfig & {\n nonce: number;\n contract: C;\n func: F;\n args: Parameters<C[F]>;\n confirmations: number;\n }\n): Promise<TransactionResponse | TransactionReceipt> {\n const {\n func,\n args,\n contract,\n signer,\n nonce,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gasPrice,\n confirmations = 1,\n debug,\n } = input;\n const functionName = `${func as string}(${args.map((arg) => `'${arg}'`).join(\",\")})`;\n try {\n const contractWithSigner = contract.connect(signer);\n const gasLimit = await contractWithSigner.estimateGas[func].apply(null, args);\n console.log(chalk.gray(`executing transaction: ${functionName} with nonce ${nonce}`));\n return contractWithSigner[func]\n .apply(null, [\n ...args,\n {\n gasLimit,\n nonce: nonce,\n maxPriorityFeePerGas: maxPriorityFeePerGas,\n maxFeePerGas: maxFeePerGas,\n gasPrice: gasPrice,\n },\n ])\n .then((tx: TransactionResponse) => {\n return confirmations === 0 ? tx : tx.wait(confirmations);\n });\n } catch (error: any) {\n if (debug) console.error(error);\n throw new MUDError(`Gas estimation error for ${functionName}: ${error?.reason}`);\n }\n}\n","import { existsSync } from \"fs\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport { getScriptDirectory, forge } from \"@latticexyz/common/foundry\";\n\nexport async function postDeploy(\n postDeployScript: string,\n worldAddress: string,\n rpc: string,\n profile: string | undefined\n): Promise<void> {\n // Execute postDeploy forge script\n const postDeployPath = path.join(await getScriptDirectory(), postDeployScript + \".s.sol\");\n if (existsSync(postDeployPath)) {\n console.log(chalk.blue(`Executing post deploy script at ${postDeployPath}`));\n await forge(\n [\"script\", postDeployScript, \"--sig\", \"run(address)\", worldAddress, \"--broadcast\", \"--rpc-url\", rpc, \"-vvv\"],\n {\n profile: profile,\n }\n );\n } else {\n console.log(`No script at ${postDeployPath}, skipping post deploy hook`);\n }\n}\n","import { BigNumber, Wallet } from \"ethers\";\nimport { MUDError } from \"@latticexyz/common/errors\";\n\n/**\n * Set the maxFeePerGas and maxPriorityFeePerGas based on the current base fee and the given multiplier.\n * The multiplier is used to allow replacing pending transactions.\n * @param multiplier Multiplier to apply to the base fee\n */\nexport async function setInternalFeePerGas(\n signer: Wallet,\n multiplier: number\n): Promise<{\n maxPriorityFeePerGas: number | undefined;\n maxFeePerGas: BigNumber | undefined;\n gasPrice: BigNumber | undefined;\n}> {\n // Compute maxFeePerGas and maxPriorityFeePerGas like ethers, but allow for a multiplier to allow replacing pending transactions\n const feeData = await signer.provider.getFeeData();\n let maxPriorityFeePerGas: number | undefined;\n let maxFeePerGas: BigNumber | undefined;\n let gasPrice: BigNumber | undefined;\n\n if (feeData.lastBaseFeePerGas) {\n if (!feeData.lastBaseFeePerGas.eq(0) && (await signer.getBalance()).eq(0)) {\n throw new MUDError(`Attempting to deploy to a chain with non-zero base fee with an account that has no balance.\n If you're deploying to the Lattice testnet, you can fund your account by running 'pnpm mud faucet --address ${await signer.getAddress()}'`);\n }\n\n // Set the priority fee to 0 for development chains with no base fee, to allow transactions from unfunded wallets\n maxPriorityFeePerGas = feeData.lastBaseFeePerGas.eq(0) ? 0 : Math.floor(1_500_000_000 * multiplier);\n maxFeePerGas = feeData.lastBaseFeePerGas.mul(2).add(maxPriorityFeePerGas);\n } else if (feeData.gasPrice) {\n // Legacy chains with gasPrice instead of maxFeePerGas\n if (!feeData.gasPrice.eq(0) && (await signer.getBalance()).eq(0)) {\n throw new MUDError(\n `Attempting to deploy to a chain with non-zero gas price with an account that has no balance.`\n );\n }\n\n gasPrice = feeData.gasPrice;\n } else {\n throw new MUDError(\"Can not fetch fee data from RPC\");\n }\n return {\n maxPriorityFeePerGas,\n maxFeePerGas,\n gasPrice,\n };\n}\n","import glob from \"glob\";\nimport { basename } from \"path\";\n\n/**\n * Get a list of all contract paths/names within the provided src directory\n */\nexport function getExistingContracts(srcDir: string) {\n return glob.sync(`${srcDir}/**/*.sol`).map((path) => ({\n path,\n basename: basename(path, \".sol\"),\n }));\n}\n","import { ethers } from \"ethers\";\n\n// TODO: Use viem's getChainId\nexport async function getChainId(rpc: string) {\n const { result: chainId } = await ethers.utils.fetchJson(\n rpc,\n '{ \"id\": 42, \"jsonrpc\": \"2.0\", \"method\": \"eth_chainId\", \"params\": [ ] }'\n );\n return Number(chainId);\n}\n"],"mappings":"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","names":["chalk","path","MUDError","loadConfig","chalk","path","ethers","getOutDirectory","cast","getSrcDirectory","getRemappings","resolveWorldConfig","chalk","WorldData","IBaseWorldAbi","chalk","ethers","MUDError","deployContract","input","signer","nonce","maxPriorityFeePerGas","maxFeePerGas","debug","gasPrice","confirmations","contract","factory","deployPromise","c","address","error","readFileSync","path","MUDError","getContractData","contractName","forgeOutDirectory","data","contractDataPath","bytecode","abi","deployWorldContract","ip","chalk","contractData","getContractData","IBaseWorldAbi","WorldData","deployContract","IBaseWorldAbi","CoreModuleData","KeysWithValueModuleData","KeysInTableModuleData","UniqueEntityModuleData","defaultModuleContracts","defaultAbiCoder","resolveWithContext","getInstallModuleCallData","moduleContracts","module","tableIds","moduleAddress","resolvedArgs","arg","values","types","getUserModules","defaultModules","configModules","module","m","resourceIdToHex","getGrantAccessCallData","input","systems","namespace","systemContracts","calls","name","accessListAddresses","accessListSystems","address","getGrantSystemAccessCallData","granteeSystem","resourceIdToHex","ethers","loadFunctionSignatures","contractName","forgeOutDirectory","abi","getContractData","item","parseComponents","toFunctionSelector","functionSignature","sigHash","params","param","tupleMatch","signature","ethers","getRegisterFunctionSelectorsCallData","input","callData","systemContractName","namespace","forgeOutDirectory","system","baseSystemFunctionSignatures","loadFunctionSignatures","systemFunctionSignatures","functionSignature","isRoot","systemFunctionSignature","getRegisterFunctionSelectorCallData","name","functionSelector","toFunctionSelector","resourceIdToHex","resourceIdToHex","getRegisterSystemCallData","input","namespace","systemContracts","systemKey","system","systemAddress","encodeSchema","getStaticByteLength","resolveAbiOrUserType","resourceIdToHex","fieldLayoutToHex","loadAndExtractUserTypes","getRegisterTableCallData","table","storeConfig","outputBaseDirectory","remappings","name","valueSchema","keySchema","solidityUserTypes","schemaTypes","abiOrUserType","schemaType","schemaTypeLengths","fieldLayout","schemaTypeLength","keyTypes","resourceIdToHex","hexToBytes","getTableIds","storeConfig","tableIds","tableName","name","offchainOnly","chalk","MUDError","confirmNonce","signer","nonce","pollInterval","remoteNonce","retryCount","maxRetries","resolve","chalk","MUDError","fastTxExecute","input","func","args","contract","signer","nonce","maxPriorityFeePerGas","maxFeePerGas","gasPrice","confirmations","debug","functionName","arg","contractWithSigner","gasLimit","tx","error","existsSync","path","chalk","getScriptDirectory","forge","postDeploy","postDeployScript","worldAddress","rpc","profile","postDeployPath","MUDError","setInternalFeePerGas","signer","multiplier","feeData","maxPriorityFeePerGas","maxFeePerGas","gasPrice","resourceIdToHex","deploy","mudConfig","existingContractNames","deployConfig","startTime","profile","rpc","privateKey","priorityFeeMultiplier","debug","worldAddress","disableTxWait","pollInterval","resolvedConfig","resolveWorldConfig","forgeOutDirectory","getOutDirectory","remappings","getRemappings","outputBaseDirectory","path","getSrcDirectory","provider","ethers","signer","nonce","txConfig","setInternalFeePerGas","blockNumber","cast","worldPromise","deployWorldContract","userModuleContracts","getUserModules","defaultModuleContracts","name","abi","bytecode","getContractData","systemContracts","deployedContracts","CoreModuleData","acc","contract","deployContract","deployedWorldAddress","worldContract","IBaseWorldAbi","chalk","fastTxExecute","tableIds","getTableIds","registerTableCalls","table","getRegisterTableCallData","call","systemCalls","systemKey","system","getRegisterSystemCallData","functionCalls","getRegisterFunctionSelectorsCallData","grantCalls","getGrantAccessCallData","moduleCalls","m","getInstallModuleCallData","confirmNonce","postDeploy","forge","getRpcUrl","getSrcDirectory","existsSync","mkdirSync","readFileSync","writeFileSync","glob","basename","getExistingContracts","srcDir","path","execa","ethers","getChainId","rpc","chainId","deployHandler","args","configPath","printConfig","profile","clean","skipBuild","rpc","getRpcUrl","chalk","forge","execa","srcDir","getSrcDirectory","existingContractNames","getExistingContracts","basename","mudConfig","loadConfig","privateKey","MUDError","deploymentInfo","deploy","chainId","getChainId","outputDir","path","mkdirSync","writeFileSync","localChains","deploys","existsSync","readFileSync"]}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{c as o}from"./chunk-TW3YGZ4D.js";export{o as deployHandler};
1
+ import{c as o}from"./chunk-JTPXIOF5.js";export{o as deployHandler};
2
2
  //# sourceMappingURL=index.js.map
package/dist/mud.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- import{a as k,b as R,c as y}from"./chunk-TW3YGZ4D.js";import Oo from"yargs";import{hideBin as Po}from"yargs/helpers";import Mo from"@latticexyz/gas-report";import So from"@latticexyz/abi-ts";import{rmSync as ae}from"fs";import{homedir as ce}from"os";import de from"path";import{execa as le}from"execa";var pe={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=ce();ae(de.join(o,".foundry","anvil","tmp"),{recursive:!0,force:!0});let t=["-b",String(e),"--block-base-fee-per-gas","0"];console.log(`Running: anvil ${t.join(" ")}`);let n=le("anvil",t,{stdio:["inherit","inherit","inherit"]});process.on("SIGINT",()=>{console.log(`
2
+ import{a as k,b as R,c as y}from"./chunk-JTPXIOF5.js";import Oo from"yargs";import{hideBin as Po}from"yargs/helpers";import Mo from"@latticexyz/gas-report";import So from"@latticexyz/abi-ts";import{rmSync as ae}from"fs";import{homedir as ce}from"os";import de from"path";import{execa as le}from"execa";var pe={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=ce();ae(de.join(o,".foundry","anvil","tmp"),{recursive:!0,force:!0});let t=["-b",String(e),"--block-base-fee-per-gas","0"];console.log(`Running: anvil ${t.join(" ")}`);let n=le("anvil",t,{stdio:["inherit","inherit","inherit"]});process.on("SIGINT",()=>{console.log(`
3
3
  gracefully shutting down from SIGINT (Crtl-C)`),n.kill(),process.exit()}),await n}},A=pe;import{FaucetServiceDefinition as me}from"@latticexyz/services/faucet";import{createChannel as fe,createClient as ge}from"nice-grpc-web";import E from"chalk";import{NodeHttpTransport as ue}from"@improbable-eng/grpc-web-node-http-transport";function ye(e){return ge(me,fe(e,ue()))}var he={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:t}){let n=ye(o);e&&(console.log(E.yellow("Dripping to",t)),await n.dripDev({address:t}),console.log(E.yellow("Success"))),process.exit(0)}},W=he;var be={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)}},$=be;import we from"path";import{loadConfig as ve}from"@latticexyz/config/node";import{tablegen as De}from"@latticexyz/store/codegen";import{getRemappings as Ce,getSrcDirectory as ke}from"@latticexyz/common/foundry";var xe={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 config file"}})},async handler({configPath:e}){let o=await ve(e),t=await ke(),n=await Ce();await De(o,we.join(t,o.codegenDirectory),n),process.exit(0)}},I=xe;import w from"chalk";import{ZodError as Me}from"zod";import{fromZodError as Se,ValidationError as Oe}from"zod-validation-error";import{NotInsideProjectError as Pe}from"@latticexyz/config";import{MUDError as je}from"@latticexyz/common/errors";function f(e){if(e instanceof Oe)console.log(w.redBright(e.message));else if(e instanceof Me){let o=Se(e,{prefixSeparator:`
4
4
  - `,issueSeparator:`
5
- - `});console.log(w.redBright(o.message))}else e instanceof Pe?(console.log(w.red(e.message)),console.log(""),console.log(w.blue("To learn more about MUD's configuration, please go to https://mud.dev/packages/cli/"))):e instanceof je?console.log(w.red(e)):console.log(e)}var S={configPath:{type:"string",desc:"Path to the config file"},clean:{type:"boolean",desc:"Remove the build forge artifacts and cache directories before building"},printConfig:{type:"boolean",desc:"Print the resolved config"},profile:{type:"string",desc:"The foundry profile to use"},debug:{type:"boolean",desc:"Print debug logs, like full error messages"},priorityFeeMultiplier:{type:"number",desc:"Multiply the estimated priority fee by the provided factor",default:1},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"},worldAddress:{type:"string",desc:"Deploy to an existing World at the given address"},srcDir:{type:"string",desc:"Source directory. Defaults to foundry src directory."},disableTxWait:{type:"boolean",desc:"Disable waiting for transactions to be confirmed.",default:!1},pollInterval:{type:"number",desc:"Interval in miliseconds to use to poll for transaction receipts / block inclusion",default:1e3},skipBuild:{type:"boolean",desc:"Skip rebuilding the contracts before deploying"}},Ue={command:"deploy",describe:"Deploy MUD contracts",builder(e){return e.options(S)},async handler(e){try{await y(e)}catch(o){f(o),process.exit(1)}process.exit(0)}},z=Ue;import{loadConfig as Re}from"@latticexyz/config/node";import{worldgen as Ae}from"@latticexyz/world/node";import{getSrcDirectory as Ee}from"@latticexyz/common/foundry";import T from"path";import{rmSync as We}from"fs";var $e={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 config file"},clean:{type:"boolean",desc:"Clear the worldgen directory before generating new interfaces (defaults to true)",default:!0}})},async handler(e){await O(e),process.exit(0)}};async function O(e){let o=e.srcDir??await Ee(),t=k(o),n=e.config??await Re(e.configPath),r=T.join(o,n.codegenDirectory);e.clean&&We(T.join(r,n.worldgenDirectory),{recursive:!0,force:!0}),await Ae(n,t,r)}var F=$e;import v from"chalk";import{readFileSync as Ne,writeFileSync as _e}from"fs";import j from"path";import{MUDError as h}from"@latticexyz/common/errors";var N={name:"@latticexyz/cli",version:"2.0.0-next.10",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:{"@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:*",chalk:"^5.0.1",chokidar:"^3.5.3",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",path:"^0.12.7","throttle-debounce":"^5.0.0",typescript:"5.1.6",viem:"1.14.0",yargs:"^17.7.1",zod:"^3.21.4","zod-validation-error":"^1.3.0"},devDependencies:{"@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/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.31.4"},gitHead:"914a1e0ae4a573d685841ca2ea921435057deb8f"};import Je from"glob";import{ZodError as ze,z as _}from"zod";var Te=_.object({MUD_PACKAGES:_.string().transform(e=>JSON.parse(e))});function Fe(){try{return Te.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/noise":{"localPath":"packages/noise"},"@latticexyz/phaserx":{"localPath":"packages/phaserx"},"@latticexyz/protocol-parser":{"localPath":"packages/protocol-parser"},"@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 ze){let{_errors:o,...t}=e.format();console.error(`
5
+ - `});console.log(w.redBright(o.message))}else e instanceof Pe?(console.log(w.red(e.message)),console.log(""),console.log(w.blue("To learn more about MUD's configuration, please go to https://mud.dev/packages/cli/"))):e instanceof je?console.log(w.red(e)):console.log(e)}var S={configPath:{type:"string",desc:"Path to the config file"},clean:{type:"boolean",desc:"Remove the build forge artifacts and cache directories before building"},printConfig:{type:"boolean",desc:"Print the resolved config"},profile:{type:"string",desc:"The foundry profile to use"},debug:{type:"boolean",desc:"Print debug logs, like full error messages"},priorityFeeMultiplier:{type:"number",desc:"Multiply the estimated priority fee by the provided factor",default:1},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"},worldAddress:{type:"string",desc:"Deploy to an existing World at the given address"},srcDir:{type:"string",desc:"Source directory. Defaults to foundry src directory."},disableTxWait:{type:"boolean",desc:"Disable waiting for transactions to be confirmed.",default:!1},pollInterval:{type:"number",desc:"Interval in miliseconds to use to poll for transaction receipts / block inclusion",default:1e3},skipBuild:{type:"boolean",desc:"Skip rebuilding the contracts before deploying"}},Ue={command:"deploy",describe:"Deploy MUD contracts",builder(e){return e.options(S)},async handler(e){try{await y(e)}catch(o){f(o),process.exit(1)}process.exit(0)}},z=Ue;import{loadConfig as Re}from"@latticexyz/config/node";import{worldgen as Ae}from"@latticexyz/world/node";import{getSrcDirectory as Ee}from"@latticexyz/common/foundry";import T from"path";import{rmSync as We}from"fs";var $e={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 config file"},clean:{type:"boolean",desc:"Clear the worldgen directory before generating new interfaces (defaults to true)",default:!0}})},async handler(e){await O(e),process.exit(0)}};async function O(e){let o=e.srcDir??await Ee(),t=k(o),n=e.config??await Re(e.configPath),r=T.join(o,n.codegenDirectory);e.clean&&We(T.join(r,n.worldgenDirectory),{recursive:!0,force:!0}),await Ae(n,t,r)}var F=$e;import v from"chalk";import{readFileSync as Ne,writeFileSync as _e}from"fs";import j from"path";import{MUDError as h}from"@latticexyz/common/errors";var N={name:"@latticexyz/cli",version:"2.0.0-next.11",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:{"@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:*",chalk:"^5.0.1",chokidar:"^3.5.3",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",path:"^0.12.7","throttle-debounce":"^5.0.0",typescript:"5.1.6",viem:"1.14.0",yargs:"^17.7.1",zod:"^3.21.4","zod-validation-error":"^1.3.0"},devDependencies:{"@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/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.31.4"},gitHead:"914a1e0ae4a573d685841ca2ea921435057deb8f"};import Je from"glob";import{ZodError as ze,z as _}from"zod";var Te=_.object({MUD_PACKAGES:_.string().transform(e=>JSON.parse(e))});function Fe(){try{return Te.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/noise":{"localPath":"packages/noise"},"@latticexyz/phaserx":{"localPath":"packages/phaserx"},"@latticexyz/protocol-parser":{"localPath":"packages/protocol-parser"},"@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 ze){let{_errors:o,...t}=e.format();console.error(`
6
6
  Missing or invalid environment variables:
7
7
 
8
8
  ${Object.keys(t).join(`
package/dist/mud.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mud.ts","../src/commands/index.ts","../src/commands/devnode.ts","../src/commands/faucet.ts","../src/commands/hello.ts","../src/commands/tablegen.ts","../src/utils/errors.ts","../src/commands/deploy.ts","../src/commands/worldgen.ts","../src/commands/set-version.ts","../package.json","../src/mudPackages.ts","../src/commands/test.ts","../src/commands/trace.ts","../src/commands/dev-contracts.ts","../src/utils/printMUD.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { commands } from \"./commands\";\nimport { logError } from \"./utils/errors\";\n\n// Load .env file into process.env\nimport * as dotenv from \"dotenv\";\nimport chalk from \"chalk\";\ndotenv.config();\n\nyargs(hideBin(process.argv))\n // Explicit name to display in help (by default it's the entry file, which may not be \"mud\" for e.g. ts-node)\n .scriptName(\"mud\")\n // Use the commands directory to scaffold\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- command array overload isn't typed, see https://github.com/yargs/yargs/blob/main/docs/advanced.md#esm-hierarchy\n .command(commands as any)\n // Enable strict mode.\n .strict()\n // Custom error handler\n .fail((msg, err) => {\n console.error(chalk.red(msg));\n if (msg.includes(\"Missing required argument\")) {\n console.log(\n chalk.yellow(`Run 'pnpm mud ${process.argv[2]} --help' for a list of available and required arguments.`)\n );\n }\n console.log(\"\");\n // Even though `.fail` type says we should get an `Error`, this can sometimes be undefined\n if (err != null) {\n logError(err);\n console.log(\"\");\n }\n\n process.exit(1);\n })\n // Useful aliases.\n .alias({ h: \"help\" }).argv;\n","import { CommandModule } from \"yargs\";\n\nimport gasReport from \"@latticexyz/gas-report\";\nimport abiTs from \"@latticexyz/abi-ts\";\n\nimport devnode from \"./devnode\";\nimport faucet from \"./faucet\";\nimport hello from \"./hello\";\nimport tablegen from \"./tablegen\";\nimport deploy from \"./deploy\";\nimport worldgen from \"./worldgen\";\nimport setVersion from \"./set-version\";\nimport test from \"./test\";\nimport trace from \"./trace\";\nimport devContracts from \"./dev-contracts\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Each command has different options\nexport const commands: CommandModule<any, any>[] = [\n deploy,\n devnode,\n faucet,\n gasReport as CommandModule,\n hello,\n tablegen,\n worldgen,\n setVersion,\n test,\n trace,\n devContracts,\n abiTs,\n];\n","import { rmSync } from \"fs\";\nimport { homedir } from \"os\";\nimport path from \"path\";\nimport type { CommandModule } from \"yargs\";\nimport { execa } from \"execa\";\n\ntype Options = {\n blocktime: number;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"devnode\",\n\n describe: \"Start a local Ethereum node for development\",\n\n builder(yargs) {\n return yargs.options({\n blocktime: { type: \"number\", default: 1, decs: \"Interval in which new blocks are produced\" },\n });\n },\n\n async handler({ blocktime }) {\n console.log(\"Clearing devnode history\");\n const userHomeDir = homedir();\n rmSync(path.join(userHomeDir, \".foundry\", \"anvil\", \"tmp\"), { recursive: true, force: true });\n\n const anvilArgs = [\"-b\", String(blocktime), \"--block-base-fee-per-gas\", \"0\"];\n console.log(`Running: anvil ${anvilArgs.join(\" \")}`);\n const child = execa(\"anvil\", anvilArgs, {\n stdio: [\"inherit\", \"inherit\", \"inherit\"],\n });\n\n process.on(\"SIGINT\", () => {\n console.log(\"\\ngracefully shutting down from SIGINT (Crtl-C)\");\n child.kill();\n process.exit();\n });\n await child;\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { FaucetServiceDefinition } from \"@latticexyz/services/faucet\";\nimport { createChannel, createClient } from \"nice-grpc-web\";\nimport chalk from \"chalk\";\nimport { NodeHttpTransport } from \"@improbable-eng/grpc-web-node-http-transport\";\n\ntype Options = {\n dripDev?: boolean;\n faucetUrl: string;\n address: string;\n};\n\n/**\n * Create a FaucetServiceClient\n * @param url FaucetService URL\n * @returns FaucetServiceClient\n */\nfunction createFaucetService(url: string) {\n return createClient(FaucetServiceDefinition, createChannel(url, NodeHttpTransport()));\n}\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"faucet\",\n\n describe: \"Interact with a MUD faucet\",\n\n builder(yargs) {\n return yargs.options({\n dripDev: {\n type: \"boolean\",\n desc: \"Request a drip from the dev endpoint (requires faucet to have dev mode enabled)\",\n default: true,\n },\n faucetUrl: {\n type: \"string\",\n desc: \"URL of the MUD faucet\",\n default: \"https://faucet.testnet-mud-services.linfra.xyz\",\n },\n address: {\n type: \"string\",\n desc: \"Ethereum address to fund\",\n required: true,\n },\n });\n },\n\n async handler({ dripDev, faucetUrl, address }) {\n const faucet = createFaucetService(faucetUrl);\n\n if (dripDev) {\n console.log(chalk.yellow(\"Dripping to\", address));\n await faucet.dripDev({ address });\n console.log(chalk.yellow(\"Success\"));\n }\n\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\n\ntype Options = {\n name: string;\n upper: boolean | undefined;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"hello <name>\",\n\n describe: \"Greet <name> with Hello\",\n\n builder(yargs) {\n return yargs\n .options({\n upper: { type: \"boolean\" },\n })\n .positional(\"name\", { type: \"string\", demandOption: true });\n },\n\n handler({ name }) {\n const greeting = `Gm, ${name}!`;\n console.log(greeting);\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import path from \"path\";\nimport type { CommandModule } from \"yargs\";\nimport { loadConfig } from \"@latticexyz/config/node\";\nimport { StoreConfig } from \"@latticexyz/store\";\nimport { tablegen } from \"@latticexyz/store/codegen\";\nimport { getRemappings, getSrcDirectory } from \"@latticexyz/common/foundry\";\n\ntype Options = {\n configPath?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"tablegen\",\n\n describe: \"Autogenerate MUD Store table libraries based on the config file\",\n\n builder(yargs) {\n return yargs.options({\n configPath: { type: \"string\", desc: \"Path to the config file\" },\n });\n },\n\n async handler({ configPath }) {\n const config = (await loadConfig(configPath)) as StoreConfig;\n const srcDir = await getSrcDirectory();\n const remappings = await getRemappings();\n\n await tablegen(config, path.join(srcDir, config.codegenDirectory), remappings);\n\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import chalk from \"chalk\";\nimport { ZodError } from \"zod\";\nimport { fromZodError, ValidationError } from \"zod-validation-error\";\nimport { NotInsideProjectError } from \"@latticexyz/config\";\nimport { MUDError } from \"@latticexyz/common/errors\";\n\nexport function logError(error: unknown) {\n if (error instanceof ValidationError) {\n console.log(chalk.redBright(error.message));\n } else if (error instanceof ZodError) {\n // TODO currently this error shouldn't happen, use `fromZodErrorCustom`\n // (see https://github.com/latticexyz/mud/issues/438)\n const validationError = fromZodError(error, {\n prefixSeparator: \"\\n- \",\n issueSeparator: \"\\n- \",\n });\n console.log(chalk.redBright(validationError.message));\n } else if (error instanceof NotInsideProjectError) {\n console.log(chalk.red(error.message));\n console.log(\"\");\n // TODO add docs to the website and update the link to the specific page\n // (see https://github.com/latticexyz/mud/issues/445)\n console.log(chalk.blue(`To learn more about MUD's configuration, please go to https://mud.dev/packages/cli/`));\n } else if (error instanceof MUDError) {\n console.log(chalk.red(error));\n } else {\n console.log(error);\n }\n}\n","import type { CommandModule, Options } from \"yargs\";\nimport { logError } from \"../utils/errors\";\nimport { DeployOptions, deployHandler } from \"../utils/deployHandler\";\n\nexport const yDeployOptions = {\n configPath: { type: \"string\", desc: \"Path to the config file\" },\n clean: { type: \"boolean\", desc: \"Remove the build forge artifacts and cache directories before building\" },\n printConfig: { type: \"boolean\", desc: \"Print the resolved config\" },\n profile: { type: \"string\", desc: \"The foundry profile to use\" },\n debug: { type: \"boolean\", desc: \"Print debug logs, like full error messages\" },\n priorityFeeMultiplier: {\n type: \"number\",\n desc: \"Multiply the estimated priority fee by the provided factor\",\n default: 1,\n },\n saveDeployment: { type: \"boolean\", desc: \"Save the deployment info to a file\", default: true },\n rpc: { type: \"string\", desc: \"The RPC URL to use. Defaults to the RPC url from the local foundry.toml\" },\n worldAddress: { type: \"string\", desc: \"Deploy to an existing World at the given address\" },\n srcDir: { type: \"string\", desc: \"Source directory. Defaults to foundry src directory.\" },\n disableTxWait: { type: \"boolean\", desc: \"Disable waiting for transactions to be confirmed.\", default: false },\n pollInterval: {\n type: \"number\",\n desc: \"Interval in miliseconds to use to poll for transaction receipts / block inclusion\",\n default: 1000,\n },\n skipBuild: { type: \"boolean\", desc: \"Skip rebuilding the contracts before deploying\" },\n} satisfies Record<keyof DeployOptions, Options>;\n\nconst commandModule: CommandModule<DeployOptions, DeployOptions> = {\n command: \"deploy\",\n\n describe: \"Deploy MUD contracts\",\n\n builder(yargs) {\n return yargs.options(yDeployOptions);\n },\n\n async handler(args) {\n try {\n await deployHandler(args);\n } catch (error: any) {\n logError(error);\n process.exit(1);\n }\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { loadConfig } from \"@latticexyz/config/node\";\nimport { StoreConfig } from \"@latticexyz/store\";\nimport { WorldConfig } from \"@latticexyz/world\";\nimport { worldgen } from \"@latticexyz/world/node\";\nimport { getSrcDirectory } from \"@latticexyz/common/foundry\";\nimport path from \"path\";\nimport { rmSync } from \"fs\";\nimport { getExistingContracts } from \"../utils/getExistingContracts\";\n\ntype Options = {\n configPath?: string;\n clean?: boolean;\n srcDir?: string;\n config?: StoreConfig & WorldConfig;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"worldgen\",\n\n describe: \"Autogenerate interfaces for Systems and World based on existing contracts and the config file\",\n\n builder(yargs) {\n return yargs.options({\n configPath: { type: \"string\", desc: \"Path to the config file\" },\n clean: {\n type: \"boolean\",\n desc: \"Clear the worldgen directory before generating new interfaces (defaults to true)\",\n default: true,\n },\n });\n },\n\n async handler(args) {\n await worldgenHandler(args);\n process.exit(0);\n },\n};\n\nexport async function worldgenHandler(args: Options) {\n const srcDir = args.srcDir ?? (await getSrcDirectory());\n\n const existingContracts = getExistingContracts(srcDir);\n\n // Load the config\n const mudConfig = args.config ?? ((await loadConfig(args.configPath)) as StoreConfig & WorldConfig);\n\n const outputBaseDirectory = path.join(srcDir, mudConfig.codegenDirectory);\n\n // clear the worldgen directory\n if (args.clean) rmSync(path.join(outputBaseDirectory, mudConfig.worldgenDirectory), { recursive: true, force: true });\n\n // generate new interfaces\n await worldgen(mudConfig, existingContracts, outputBaseDirectory);\n}\n\nexport default commandModule;\n","import chalk from \"chalk\";\nimport { readFileSync, writeFileSync } from \"fs\";\nimport path from \"path\";\nimport type { CommandModule } from \"yargs\";\nimport { MUDError } from \"@latticexyz/common/errors\";\nimport { logError } from \"../utils/errors\";\nimport localPackageJson from \"../../package.json\" assert { type: \"json\" };\nimport glob from \"glob\";\nimport { mudPackages } from \"../mudPackages\";\n\ntype Options = {\n backup?: boolean;\n force?: boolean;\n restore?: boolean;\n mudVersion?: string;\n tag?: string;\n commit?: string;\n link?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"set-version\",\n\n describe: \"Set MUD version in all package.json files and optionally backup the previously installed version\",\n\n builder(yargs) {\n return yargs.options({\n mudVersion: { alias: \"v\", type: \"string\", description: \"Set MUD to the given version\" },\n tag: {\n alias: \"t\",\n type: \"string\",\n description: \"Set MUD to the latest version with the given tag from npm\",\n },\n commit: {\n alias: \"c\",\n type: \"string\",\n description: \"Set MUD to the version based on a given git commit hash from npm\",\n },\n link: { alias: \"l\", type: \"string\", description: \"Relative path to the local MUD root directory to link\" },\n });\n },\n\n async handler(options) {\n try {\n const mutuallyExclusiveOptions = [\"mudVersion\", \"link\", \"tag\", \"commit\", \"restore\"];\n const numMutuallyExclusiveOptions = mutuallyExclusiveOptions.reduce(\n (acc, opt) => (options[opt] ? acc + 1 : acc),\n 0\n );\n\n if (numMutuallyExclusiveOptions === 0) {\n throw new MUDError(`You need to provide one these options: ${mutuallyExclusiveOptions.join(\", \")}`);\n }\n\n if (numMutuallyExclusiveOptions > 1) {\n throw new MUDError(`These options are mutually exclusive: ${mutuallyExclusiveOptions.join(\", \")}`);\n }\n\n // Resolve the version number from available options like `tag` or `commit`\n options.mudVersion = await resolveVersion(options);\n\n // Update all package.json below the current working directory (except in node_modules)\n const packageJsons = glob.sync(\"**/package.json\").filter((p) => !p.includes(\"node_modules\"));\n for (const packageJson of packageJsons) {\n updatePackageJson(packageJson, options);\n }\n } catch (e) {\n logError(e);\n } finally {\n process.exit(0);\n }\n },\n};\n\nasync function resolveVersion(options: Options) {\n // Backwards compatibility to previous behavior of this script where passing \"canary\" as the version resolved to the latest commit on main\n if (options.mudVersion === \"canary\") options.tag = \"main\";\n\n let npmResult;\n try {\n console.log(chalk.blue(`Fetching available versions`));\n npmResult = await (await fetch(`https://registry.npmjs.org/${localPackageJson.name}`)).json();\n } catch (e) {\n throw new MUDError(`Could not fetch available MUD versions`);\n }\n\n if (options.tag) {\n const version = npmResult[\"dist-tags\"][options.tag];\n if (!version) {\n throw new MUDError(`Could not find npm version with tag \"${options.tag}\"`);\n }\n console.log(chalk.green(`Latest version with tag ${options.tag}: ${version}`));\n return version;\n }\n\n if (options.commit) {\n // Find a version with this commit hash\n const commit = options.commit.substring(0, 8); // changesets uses the first 8 characters of the commit hash as version for prereleases/snapshot releases\n const version = Object.keys(npmResult[\"versions\"]).find((v) => (v as string).includes(commit));\n if (!version) {\n throw new MUDError(`Could not find npm version based on commit \"${options.commit}\"`);\n }\n console.log(chalk.green(`Version from commit ${options.commit}: ${version}`));\n return version;\n }\n\n // If neither a tag nor a commit option is given, return the `mudVersion`\n return options.mudVersion;\n}\n\nfunction updatePackageJson(filePath: string, options: Options): { workspaces?: string[] } {\n const { link } = options;\n let { mudVersion } = options;\n\n const packageJson = readPackageJson(filePath);\n const mudPackageNames = Object.keys(mudPackages);\n\n // Find all MUD dependencies\n const mudDependencies: Record<string, string> = {};\n for (const packageName in packageJson.dependencies) {\n if (mudPackageNames.includes(packageName)) {\n mudDependencies[packageName] = packageJson.dependencies[packageName];\n }\n }\n\n // Find all MUD devDependencies\n const mudDevDependencies: Record<string, string> = {};\n for (const packageName in packageJson.devDependencies) {\n if (mudPackageNames.includes(packageName)) {\n mudDevDependencies[packageName] = packageJson.devDependencies[packageName];\n }\n }\n\n // Update the dependencies\n for (const packageName in packageJson.dependencies) {\n if (mudPackageNames.includes(packageName)) {\n packageJson.dependencies[packageName] = resolveMudVersion(packageName, \"dependencies\");\n }\n }\n\n // Update the devDependencies\n for (const packageName in packageJson.devDependencies) {\n if (mudPackageNames.includes(packageName)) {\n packageJson.devDependencies[packageName] = resolveMudVersion(packageName, \"devDependencies\");\n }\n }\n\n // Write the updated package.json\n writeFileSync(filePath, JSON.stringify(packageJson, null, 2) + \"\\n\");\n\n console.log(`Updating ${filePath}`);\n logComparison(mudDependencies, packageJson.dependencies);\n logComparison(mudDevDependencies, packageJson.devDependencies);\n\n return packageJson;\n\n function resolveMudVersion(key: string, type: \"dependencies\" | \"devDependencies\") {\n if (link) mudVersion = resolveLinkPath(filePath, link, key);\n if (!mudVersion) return packageJson[type][key];\n return mudVersion;\n }\n}\n\nfunction readPackageJson(path: string): {\n workspaces?: string[];\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n} {\n try {\n const jsonString = readFileSync(path, \"utf8\");\n return JSON.parse(jsonString);\n } catch {\n throw new MUDError(\"Could not read JSON at \" + path);\n }\n}\n\nfunction logComparison(prev: Record<string, string>, curr: Record<string, string>) {\n for (const key in prev) {\n if (prev[key] !== curr[key]) {\n console.log(`${key}: ${chalk.red(prev[key])} -> ${chalk.green(curr[key])}`);\n }\n }\n}\n\n/**\n * Returns path of the package to link, given a path to a local MUD clone and a package\n */\nfunction resolveLinkPath(packageJsonPath: string, mudLinkPath: string, packageName: string) {\n const packageJsonToRootPath = path.relative(path.dirname(packageJsonPath), process.cwd());\n const linkPath = path.join(packageJsonToRootPath, mudLinkPath, mudPackages[packageName].localPath);\n return \"link:\" + linkPath;\n}\n\nexport default commandModule;\n","{\n \"name\": \"@latticexyz/cli\",\n \"version\": \"2.0.0-next.10\",\n \"description\": \"Command line interface for mud\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/latticexyz/mud.git\",\n \"directory\": \"packages/cli\"\n },\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"exports\": {\n \".\": \"./dist/index.js\"\n },\n \"types\": \"src/index.ts\",\n \"bin\": {\n \"mud\": \"./dist/mud.js\"\n },\n \"scripts\": {\n \"build\": \"pnpm run build:js && pnpm run build:test-tables\",\n \"build:js\": \"tsup && chmod +x ./dist/mud.js\",\n \"build:test-tables\": \"tsx ./scripts/generate-test-tables.ts\",\n \"clean\": \"pnpm run clean:js && pnpm run clean:test-tables\",\n \"clean:js\": \"rimraf dist\",\n \"clean:test-tables\": \"rimraf src/codegen\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint . --ext .ts\",\n \"prepare\": \"mkdir -p ./dist && touch ./dist/mud.js\",\n \"test\": \"tsc --noEmit && forge test\",\n \"test:ci\": \"pnpm run test\"\n },\n \"dependencies\": {\n \"@ethersproject/abi\": \"^5.7.0\",\n \"@ethersproject/providers\": \"^5.7.2\",\n \"@improbable-eng/grpc-web\": \"^0.15.0\",\n \"@improbable-eng/grpc-web-node-http-transport\": \"^0.15.0\",\n \"@latticexyz/abi-ts\": \"workspace:*\",\n \"@latticexyz/common\": \"workspace:*\",\n \"@latticexyz/config\": \"workspace:*\",\n \"@latticexyz/gas-report\": \"workspace:*\",\n \"@latticexyz/protocol-parser\": \"workspace:*\",\n \"@latticexyz/schema-type\": \"workspace:*\",\n \"@latticexyz/services\": \"workspace:*\",\n \"@latticexyz/store\": \"workspace:*\",\n \"@latticexyz/utils\": \"workspace:*\",\n \"@latticexyz/world\": \"workspace:*\",\n \"@latticexyz/world-modules\": \"workspace:*\",\n \"chalk\": \"^5.0.1\",\n \"chokidar\": \"^3.5.3\",\n \"dotenv\": \"^16.0.3\",\n \"ejs\": \"^3.1.8\",\n \"ethers\": \"^5.7.2\",\n \"execa\": \"^7.0.0\",\n \"glob\": \"^8.0.3\",\n \"nice-grpc-web\": \"^2.0.1\",\n \"openurl\": \"^1.1.1\",\n \"path\": \"^0.12.7\",\n \"throttle-debounce\": \"^5.0.0\",\n \"typescript\": \"5.1.6\",\n \"viem\": \"1.14.0\",\n \"yargs\": \"^17.7.1\",\n \"zod\": \"^3.21.4\",\n \"zod-validation-error\": \"^1.3.0\"\n },\n \"devDependencies\": {\n \"@types/ejs\": \"^3.1.1\",\n \"@types/glob\": \"^7.2.0\",\n \"@types/node\": \"^18.15.11\",\n \"@types/openurl\": \"^1.0.0\",\n \"@types/throttle-debounce\": \"^5.0.0\",\n \"@types/yargs\": \"^17.0.10\",\n \"ds-test\": \"https://github.com/dapphub/ds-test.git#e282159d5170298eb2455a6c05280ab5a73a4ef0\",\n \"forge-std\": \"https://github.com/foundry-rs/forge-std.git#74cfb77e308dd188d2f58864aaf44963ae6b88b1\",\n \"tsup\": \"^6.7.0\",\n \"tsx\": \"^3.12.6\",\n \"vitest\": \"0.31.4\"\n },\n \"gitHead\": \"914a1e0ae4a573d685841ca2ea921435057deb8f\"\n}\n","import { ZodError, z } from \"zod\";\nimport { MudPackages } from \"./common\";\n\nconst envSchema = z.object({\n MUD_PACKAGES: z.string().transform((value) => JSON.parse(value) as MudPackages),\n});\n\nfunction parseEnv(): z.infer<typeof envSchema> {\n try {\n return envSchema.parse({\n // tsup replaces the env vars with their values at compile time\n MUD_PACKAGES: process.env.MUD_PACKAGES,\n });\n } catch (error) {\n if (error instanceof ZodError) {\n const { _errors, ...invalidEnvVars } = error.format();\n console.error(`\\nMissing or invalid environment variables:\\n\\n ${Object.keys(invalidEnvVars).join(\"\\n \")}\\n`);\n process.exit(1);\n }\n throw error;\n }\n}\n\nexport const mudPackages = parseEnv().MUD_PACKAGES;\n","import type { CommandModule } from \"yargs\";\nimport { anvil, forge, getRpcUrl } from \"@latticexyz/common/foundry\";\nimport chalk from \"chalk\";\nimport { rmSync, writeFileSync } from \"fs\";\nimport { yDeployOptions } from \"./deploy\";\nimport { DeployOptions, deployHandler } from \"../utils/deployHandler\";\n\ntype Options = DeployOptions & { port?: number; worldAddress?: string; forgeOptions?: string };\n\nconst WORLD_ADDRESS_FILE = \".mudtest\";\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"test\",\n\n describe: \"Run tests in MUD contracts\",\n\n builder(yargs) {\n return yargs.options({\n ...yDeployOptions,\n port: { type: \"number\", description: \"Port to run internal node for fork testing on\", default: 4242 },\n worldAddress: {\n type: \"string\",\n description:\n \"Address of an existing world contract. If provided, deployment is skipped and the RPC provided in the foundry.toml is used for fork testing.\",\n },\n forgeOptions: { type: \"string\", description: \"Options to pass to forge test\" },\n });\n },\n\n async handler(args) {\n // Start an internal anvil process if no world address is provided\n if (!args.worldAddress) {\n const anvilArgs = [\"--block-base-fee-per-gas\", \"0\", \"--port\", String(args.port)];\n anvil(anvilArgs);\n }\n\n const forkRpc = args.worldAddress ? await getRpcUrl(args.profile) : `http://127.0.0.1:${args.port}`;\n\n const worldAddress =\n args.worldAddress ??\n (\n await deployHandler({\n ...args,\n saveDeployment: false,\n rpc: forkRpc,\n })\n ).worldAddress;\n\n console.log(chalk.blue(\"World address\", worldAddress));\n\n // Create a temporary file to pass the world address to the tests\n writeFileSync(WORLD_ADDRESS_FILE, worldAddress);\n\n const userOptions = args.forgeOptions?.replaceAll(\"\\\\\", \"\").split(\" \") ?? [];\n try {\n const testResult = await forge([\"test\", \"--fork-url\", forkRpc, ...userOptions], {\n profile: args.profile,\n });\n console.log(testResult);\n } catch (e) {\n console.error(e);\n rmSync(WORLD_ADDRESS_FILE);\n process.exit(1);\n }\n\n rmSync(WORLD_ADDRESS_FILE);\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import { existsSync, readFileSync } from \"fs\";\nimport type { CommandModule } from \"yargs\";\nimport { ethers } from \"ethers\";\n\nimport { loadConfig } from \"@latticexyz/config/node\";\nimport { MUDError } from \"@latticexyz/common/errors\";\nimport { cast, getRpcUrl, getSrcDirectory } from \"@latticexyz/common/foundry\";\nimport { StoreConfig } from \"@latticexyz/store\";\nimport { resolveWorldConfig, WorldConfig } from \"@latticexyz/world\";\nimport IBaseWorldAbi from \"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json\" assert { type: \"json\" };\nimport worldConfig from \"@latticexyz/world/mud.config.js\";\nimport { resourceIdToHex } from \"@latticexyz/common\";\nimport { getExistingContracts } from \"../utils/getExistingContracts\";\nimport { getChainId } from \"../utils/utils/getChainId\";\n\n// TODO account for multiple namespaces (https://github.com/latticexyz/mud/issues/994)\nconst systemsTableId = resourceIdToHex({\n type: \"system\",\n namespace: worldConfig.namespace,\n name: worldConfig.tables.Systems.name,\n});\n\ntype Options = {\n tx: string;\n worldAddress?: string;\n configPath?: string;\n profile?: string;\n srcDir?: string;\n rpc?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"trace\",\n\n describe: \"Display the trace of a transaction\",\n\n builder(yargs) {\n return yargs.options({\n tx: { type: \"string\", required: true, description: \"Transaction hash to replay\" },\n worldAddress: {\n type: \"string\",\n description: \"World contract address. Defaults to the value from worlds.json, based on rpc's chainId\",\n },\n configPath: { type: \"string\", description: \"Path to the config file\" },\n profile: { type: \"string\", description: \"The foundry profile to use\" },\n srcDir: { type: \"string\", description: \"Source directory. Defaults to foundry src directory.\" },\n rpc: { type: \"string\", description: \"json rpc endpoint. Defaults to foundry's configured eth_rpc_url\" },\n });\n },\n\n async handler(args) {\n args.profile ??= process.env.FOUNDRY_PROFILE;\n const { profile } = args;\n args.srcDir ??= await getSrcDirectory(profile);\n args.rpc ??= await getRpcUrl(profile);\n const { tx, configPath, srcDir, rpc } = args;\n\n const existingContracts = getExistingContracts(srcDir);\n\n // Load the config\n const mudConfig = (await loadConfig(configPath)) as StoreConfig & WorldConfig;\n\n const resolvedConfig = resolveWorldConfig(\n mudConfig,\n existingContracts.map(({ basename }) => basename)\n );\n\n // Get worldAddress either from args or from worldsFile\n const worldAddress = args.worldAddress ?? (await getWorldAddress(mudConfig.worldsFile, rpc));\n\n // Create World contract instance from deployed address\n const provider = new ethers.providers.StaticJsonRpcProvider(rpc);\n const WorldContract = new ethers.Contract(worldAddress, IBaseWorldAbi, provider);\n\n // TODO account for multiple namespaces (https://github.com/latticexyz/mud/issues/994)\n const namespace = mudConfig.namespace;\n const names = Object.values(resolvedConfig.systems).map(({ name }) => name);\n\n // Fetch system table field layout from chain\n const systemTableFieldLayout = await WorldContract.getFieldLayout(systemsTableId);\n const labels: { name: string; address: string }[] = [];\n for (const name of names) {\n const systemSelector = resourceIdToHex({ type: \"system\", namespace, name });\n // Get the first field of `Systems` table (the table maps system name to its address and other data)\n const address = await WorldContract.getField(systemsTableId, [systemSelector], 0, systemTableFieldLayout);\n labels.push({ name, address });\n }\n\n const result = await cast([\n \"run\",\n \"--label\",\n `${worldAddress}:World`,\n ...labels.map(({ name, address }) => [\"--label\", `${address}:${name}`]).flat(),\n `${tx}`,\n ]);\n console.log(result);\n\n process.exit(0);\n },\n};\n\nexport default commandModule;\n\nasync function getWorldAddress(worldsFile: string, rpc: string) {\n if (existsSync(worldsFile)) {\n const chainId = await getChainId(rpc);\n const deploys = JSON.parse(readFileSync(worldsFile, \"utf-8\"));\n\n if (!deploys[chainId]) {\n throw new MUDError(`chainId ${chainId} is missing in worldsFile \"${worldsFile}\"`);\n }\n return deploys[chainId].address as string;\n } else {\n throw new MUDError(\"worldAddress is not specified and worldsFile is missing\");\n }\n}\n","import type { CommandModule } from \"yargs\";\nimport {\n anvil,\n forge,\n getRemappings,\n getRpcUrl,\n getScriptDirectory,\n getSrcDirectory,\n} from \"@latticexyz/common/foundry\";\nimport chalk from \"chalk\";\nimport chokidar from \"chokidar\";\nimport { loadConfig, resolveConfigPath } from \"@latticexyz/config/node\";\nimport { StoreConfig } from \"@latticexyz/store\";\nimport { tablegen } from \"@latticexyz/store/codegen\";\nimport path from \"path\";\nimport { debounce } from \"throttle-debounce\";\nimport { worldgenHandler } from \"./worldgen\";\nimport { WorldConfig } from \"@latticexyz/world\";\nimport { homedir } from \"os\";\nimport { rmSync } from \"fs\";\nimport { execa } from \"execa\";\nimport { logError } from \"../utils/errors\";\nimport { deployHandler } from \"../utils/deployHandler\";\nimport { printMUD } from \"../utils/printMUD\";\n\ntype Options = {\n rpc?: string;\n configPath?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"dev-contracts\",\n\n describe: \"Start a development server for MUD contracts\",\n\n builder(yargs) {\n return yargs.options({\n rpc: {\n type: \"string\",\n decs: \"RPC endpoint of the development node. If none is provided, an anvil instance is spawned in the background on port 8545.\",\n },\n configPath: {\n type: \"string\",\n decs: \"Path to MUD config\",\n },\n });\n },\n\n async handler(args) {\n // Initial cleanup\n await forge([\"clean\"]);\n\n const rpc = args.rpc ?? (await getRpcUrl());\n const configPath = args.configPath ?? (await resolveConfigPath(args.configPath));\n const srcDirectory = await getSrcDirectory();\n const scriptDirectory = await getScriptDirectory();\n const remappings = await getRemappings();\n const initialConfig = (await loadConfig(configPath)) as StoreConfig & WorldConfig;\n\n // Initial run of all codegen steps before starting anvil\n // (so clients can wait for everything to be ready before starting)\n await handleConfigChange(initialConfig);\n await handleContractsChange(initialConfig);\n\n // Start an anvil instance in the background if no RPC url is provided\n if (!args.rpc) {\n console.log(chalk.gray(\"Cleaning devnode cache\"));\n const userHomeDir = homedir();\n rmSync(path.join(userHomeDir, \".foundry\", \"anvil\", \"tmp\"), { recursive: true, force: true });\n\n const anvilArgs = [\"--block-time\", \"1\", \"--block-base-fee-per-gas\", \"0\"];\n anvil(anvilArgs);\n }\n\n const changedSinceLastHandled = {\n config: false,\n contracts: false,\n };\n\n const changeInProgress = {\n current: false,\n };\n\n // Watch for changes\n const configWatcher = chokidar.watch([configPath, srcDirectory]);\n configWatcher.on(\"all\", async (_, updatePath) => {\n if (updatePath.includes(configPath)) {\n changedSinceLastHandled.config = true;\n // We trigger contract changes if the config changed here instead of\n // listening to changes in the codegen directory to avoid an infinite loop\n changedSinceLastHandled.contracts = true;\n }\n\n if (updatePath.includes(srcDirectory) || updatePath.includes(scriptDirectory)) {\n // Ignore changes to codegen files to avoid an infinite loop\n if (updatePath.includes(initialConfig.codegenDirectory)) return;\n changedSinceLastHandled.contracts = true;\n }\n\n // Trigger debounced onChange\n handleChange();\n });\n\n const handleChange = debounce(100, async () => {\n // Avoid handling changes multiple times in parallel\n if (changeInProgress.current) return;\n changeInProgress.current = true;\n\n // Reset dirty flags\n const { config, contracts } = changedSinceLastHandled;\n changedSinceLastHandled.config = false;\n changedSinceLastHandled.contracts = false;\n\n try {\n // Load latest config\n const mudConfig = (await loadConfig(configPath)) as StoreConfig & WorldConfig;\n\n // Handle changes\n if (config) await handleConfigChange(mudConfig);\n if (contracts) await handleContractsChange(mudConfig);\n\n await deploy();\n } catch (error) {\n console.error(chalk.red(\"MUD dev-contracts watcher failed to deploy config or contracts changes\\n\"));\n logError(error);\n }\n\n changeInProgress.current = false;\n if (changedSinceLastHandled.config || changedSinceLastHandled.contracts) {\n console.log(\"Detected change while handling the previous change\");\n handleChange();\n }\n\n printMUD();\n console.log(\"MUD watching for changes...\");\n });\n\n /** Codegen to run if config changes */\n async function handleConfigChange(config: StoreConfig & WorldConfig) {\n console.log(chalk.blue(\"mud.config.ts changed - regenerating tables and recs types\"));\n // Run tablegen to generate tables based on the config\n const outPath = path.join(srcDirectory, config.codegenDirectory);\n await tablegen(config, outPath, remappings);\n }\n\n /** Codegen to run if contracts changed */\n async function handleContractsChange(config: StoreConfig & WorldConfig) {\n console.log(chalk.blue(\"contracts changed - regenerating interfaces and contract types\"));\n\n // Run worldgen to generate interfaces based on the systems\n await worldgenHandler({ config, clean: true, srcDir: srcDirectory });\n\n // Build the contracts\n await forge([\"build\", \"--skip\", \"test\", \"script\"]);\n\n // Generate TS type definitions for ABIs\n await execa(\"mud\", [\"abi-ts\"], { stdio: \"inherit\" });\n }\n\n /** Run after codegen if either mud config or contracts changed */\n async function deploy() {\n console.log(chalk.blue(\"redeploying World\"));\n await deployHandler({\n configPath,\n skipBuild: true,\n priorityFeeMultiplier: 1,\n disableTxWait: true,\n pollInterval: 1000,\n saveDeployment: true,\n srcDir: srcDirectory,\n rpc,\n });\n }\n },\n};\n\nexport default commandModule;\n","import chalk from \"chalk\";\n\nexport function printMUD() {\n console.log(\n chalk.yellow(`\n.------..------..------.\n|M.--. ||U.--. ||D.--. |\n| (\\\\/) || (\\\\/) || :/\\\\: |\n| :\\\\/: || :\\\\/: || (__) |\n| '--'M|| '--'U|| '--'D|\n'------''------''------'\n`)\n );\n}\n"],"mappings":"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","names":["yargs","hideBin","gasReport","abiTs","rmSync","homedir","path","execa","commandModule","yargs","blocktime","userHomeDir","anvilArgs","child","devnode_default","FaucetServiceDefinition","createChannel","createClient","chalk","NodeHttpTransport","createFaucetService","url","commandModule","yargs","dripDev","faucetUrl","address","faucet","faucet_default","commandModule","yargs","name","greeting","hello_default","path","loadConfig","tablegen","getRemappings","getSrcDirectory","commandModule","yargs","configPath","config","srcDir","remappings","tablegen_default","chalk","ZodError","fromZodError","ValidationError","NotInsideProjectError","MUDError","logError","error","validationError","yDeployOptions","commandModule","yargs","args","deployHandler","error","logError","deploy_default","loadConfig","worldgen","getSrcDirectory","path","rmSync","commandModule","yargs","args","worldgenHandler","srcDir","getSrcDirectory","existingContracts","getExistingContracts","mudConfig","loadConfig","outputBaseDirectory","path","rmSync","worldgen","worldgen_default","chalk","readFileSync","writeFileSync","path","MUDError","package_default","glob","ZodError","z","envSchema","value","parseEnv","error","_errors","invalidEnvVars","mudPackages","commandModule","yargs","options","mutuallyExclusiveOptions","numMutuallyExclusiveOptions","acc","opt","MUDError","resolveVersion","packageJsons","glob","p","packageJson","updatePackageJson","e","logError","npmResult","chalk","package_default","version","commit","v","filePath","link","mudVersion","readPackageJson","mudPackageNames","mudPackages","mudDependencies","packageName","mudDevDependencies","resolveMudVersion","writeFileSync","logComparison","key","type","resolveLinkPath","path","jsonString","readFileSync","prev","curr","packageJsonPath","mudLinkPath","packageJsonToRootPath","set_version_default","anvil","forge","getRpcUrl","chalk","rmSync","writeFileSync","WORLD_ADDRESS_FILE","commandModule","yargs","yDeployOptions","args","anvilArgs","anvil","forkRpc","getRpcUrl","worldAddress","deployHandler","chalk","writeFileSync","userOptions","testResult","forge","e","rmSync","test_default","existsSync","readFileSync","ethers","loadConfig","MUDError","cast","getRpcUrl","getSrcDirectory","resolveWorldConfig","IBaseWorldAbi","worldConfig","resourceIdToHex","systemsTableId","resourceIdToHex","worldConfig","commandModule","yargs","args","profile","getSrcDirectory","getRpcUrl","tx","configPath","srcDir","rpc","existingContracts","getExistingContracts","mudConfig","loadConfig","resolvedConfig","resolveWorldConfig","basename","worldAddress","getWorldAddress","provider","ethers","WorldContract","IBaseWorldAbi","namespace","names","name","systemTableFieldLayout","labels","systemSelector","address","result","cast","trace_default","worldsFile","existsSync","chainId","getChainId","deploys","readFileSync","MUDError","anvil","forge","getRemappings","getRpcUrl","getScriptDirectory","getSrcDirectory","chalk","chokidar","loadConfig","resolveConfigPath","tablegen","path","debounce","homedir","rmSync","execa","chalk","printMUD","commandModule","yargs","args","forge","rpc","getRpcUrl","configPath","resolveConfigPath","srcDirectory","getSrcDirectory","scriptDirectory","getScriptDirectory","remappings","getRemappings","initialConfig","loadConfig","handleConfigChange","handleContractsChange","chalk","userHomeDir","homedir","rmSync","path","anvil","changedSinceLastHandled","changeInProgress","chokidar","_","updatePath","handleChange","debounce","config","contracts","mudConfig","deploy","error","logError","printMUD","outPath","tablegen","worldgenHandler","execa","deployHandler","dev_contracts_default","commands","deploy_default","devnode_default","faucet_default","gasReport","hello_default","tablegen_default","worldgen_default","set_version_default","test_default","trace_default","dev_contracts_default","abiTs","dotenv","chalk","yargs","hideBin","commands","msg","err","logError"]}
1
+ {"version":3,"sources":["../src/mud.ts","../src/commands/index.ts","../src/commands/devnode.ts","../src/commands/faucet.ts","../src/commands/hello.ts","../src/commands/tablegen.ts","../src/utils/errors.ts","../src/commands/deploy.ts","../src/commands/worldgen.ts","../src/commands/set-version.ts","../package.json","../src/mudPackages.ts","../src/commands/test.ts","../src/commands/trace.ts","../src/commands/dev-contracts.ts","../src/utils/printMUD.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\nimport { commands } from \"./commands\";\nimport { logError } from \"./utils/errors\";\n\n// Load .env file into process.env\nimport * as dotenv from \"dotenv\";\nimport chalk from \"chalk\";\ndotenv.config();\n\nyargs(hideBin(process.argv))\n // Explicit name to display in help (by default it's the entry file, which may not be \"mud\" for e.g. ts-node)\n .scriptName(\"mud\")\n // Use the commands directory to scaffold\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- command array overload isn't typed, see https://github.com/yargs/yargs/blob/main/docs/advanced.md#esm-hierarchy\n .command(commands as any)\n // Enable strict mode.\n .strict()\n // Custom error handler\n .fail((msg, err) => {\n console.error(chalk.red(msg));\n if (msg.includes(\"Missing required argument\")) {\n console.log(\n chalk.yellow(`Run 'pnpm mud ${process.argv[2]} --help' for a list of available and required arguments.`)\n );\n }\n console.log(\"\");\n // Even though `.fail` type says we should get an `Error`, this can sometimes be undefined\n if (err != null) {\n logError(err);\n console.log(\"\");\n }\n\n process.exit(1);\n })\n // Useful aliases.\n .alias({ h: \"help\" }).argv;\n","import { CommandModule } from \"yargs\";\n\nimport gasReport from \"@latticexyz/gas-report\";\nimport abiTs from \"@latticexyz/abi-ts\";\n\nimport devnode from \"./devnode\";\nimport faucet from \"./faucet\";\nimport hello from \"./hello\";\nimport tablegen from \"./tablegen\";\nimport deploy from \"./deploy\";\nimport worldgen from \"./worldgen\";\nimport setVersion from \"./set-version\";\nimport test from \"./test\";\nimport trace from \"./trace\";\nimport devContracts from \"./dev-contracts\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Each command has different options\nexport const commands: CommandModule<any, any>[] = [\n deploy,\n devnode,\n faucet,\n gasReport as CommandModule,\n hello,\n tablegen,\n worldgen,\n setVersion,\n test,\n trace,\n devContracts,\n abiTs,\n];\n","import { rmSync } from \"fs\";\nimport { homedir } from \"os\";\nimport path from \"path\";\nimport type { CommandModule } from \"yargs\";\nimport { execa } from \"execa\";\n\ntype Options = {\n blocktime: number;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"devnode\",\n\n describe: \"Start a local Ethereum node for development\",\n\n builder(yargs) {\n return yargs.options({\n blocktime: { type: \"number\", default: 1, decs: \"Interval in which new blocks are produced\" },\n });\n },\n\n async handler({ blocktime }) {\n console.log(\"Clearing devnode history\");\n const userHomeDir = homedir();\n rmSync(path.join(userHomeDir, \".foundry\", \"anvil\", \"tmp\"), { recursive: true, force: true });\n\n const anvilArgs = [\"-b\", String(blocktime), \"--block-base-fee-per-gas\", \"0\"];\n console.log(`Running: anvil ${anvilArgs.join(\" \")}`);\n const child = execa(\"anvil\", anvilArgs, {\n stdio: [\"inherit\", \"inherit\", \"inherit\"],\n });\n\n process.on(\"SIGINT\", () => {\n console.log(\"\\ngracefully shutting down from SIGINT (Crtl-C)\");\n child.kill();\n process.exit();\n });\n await child;\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { FaucetServiceDefinition } from \"@latticexyz/services/faucet\";\nimport { createChannel, createClient } from \"nice-grpc-web\";\nimport chalk from \"chalk\";\nimport { NodeHttpTransport } from \"@improbable-eng/grpc-web-node-http-transport\";\n\ntype Options = {\n dripDev?: boolean;\n faucetUrl: string;\n address: string;\n};\n\n/**\n * Create a FaucetServiceClient\n * @param url FaucetService URL\n * @returns FaucetServiceClient\n */\nfunction createFaucetService(url: string) {\n return createClient(FaucetServiceDefinition, createChannel(url, NodeHttpTransport()));\n}\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"faucet\",\n\n describe: \"Interact with a MUD faucet\",\n\n builder(yargs) {\n return yargs.options({\n dripDev: {\n type: \"boolean\",\n desc: \"Request a drip from the dev endpoint (requires faucet to have dev mode enabled)\",\n default: true,\n },\n faucetUrl: {\n type: \"string\",\n desc: \"URL of the MUD faucet\",\n default: \"https://faucet.testnet-mud-services.linfra.xyz\",\n },\n address: {\n type: \"string\",\n desc: \"Ethereum address to fund\",\n required: true,\n },\n });\n },\n\n async handler({ dripDev, faucetUrl, address }) {\n const faucet = createFaucetService(faucetUrl);\n\n if (dripDev) {\n console.log(chalk.yellow(\"Dripping to\", address));\n await faucet.dripDev({ address });\n console.log(chalk.yellow(\"Success\"));\n }\n\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\n\ntype Options = {\n name: string;\n upper: boolean | undefined;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"hello <name>\",\n\n describe: \"Greet <name> with Hello\",\n\n builder(yargs) {\n return yargs\n .options({\n upper: { type: \"boolean\" },\n })\n .positional(\"name\", { type: \"string\", demandOption: true });\n },\n\n handler({ name }) {\n const greeting = `Gm, ${name}!`;\n console.log(greeting);\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import path from \"path\";\nimport type { CommandModule } from \"yargs\";\nimport { loadConfig } from \"@latticexyz/config/node\";\nimport { StoreConfig } from \"@latticexyz/store\";\nimport { tablegen } from \"@latticexyz/store/codegen\";\nimport { getRemappings, getSrcDirectory } from \"@latticexyz/common/foundry\";\n\ntype Options = {\n configPath?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"tablegen\",\n\n describe: \"Autogenerate MUD Store table libraries based on the config file\",\n\n builder(yargs) {\n return yargs.options({\n configPath: { type: \"string\", desc: \"Path to the config file\" },\n });\n },\n\n async handler({ configPath }) {\n const config = (await loadConfig(configPath)) as StoreConfig;\n const srcDir = await getSrcDirectory();\n const remappings = await getRemappings();\n\n await tablegen(config, path.join(srcDir, config.codegenDirectory), remappings);\n\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import chalk from \"chalk\";\nimport { ZodError } from \"zod\";\nimport { fromZodError, ValidationError } from \"zod-validation-error\";\nimport { NotInsideProjectError } from \"@latticexyz/config\";\nimport { MUDError } from \"@latticexyz/common/errors\";\n\nexport function logError(error: unknown) {\n if (error instanceof ValidationError) {\n console.log(chalk.redBright(error.message));\n } else if (error instanceof ZodError) {\n // TODO currently this error shouldn't happen, use `fromZodErrorCustom`\n // (see https://github.com/latticexyz/mud/issues/438)\n const validationError = fromZodError(error, {\n prefixSeparator: \"\\n- \",\n issueSeparator: \"\\n- \",\n });\n console.log(chalk.redBright(validationError.message));\n } else if (error instanceof NotInsideProjectError) {\n console.log(chalk.red(error.message));\n console.log(\"\");\n // TODO add docs to the website and update the link to the specific page\n // (see https://github.com/latticexyz/mud/issues/445)\n console.log(chalk.blue(`To learn more about MUD's configuration, please go to https://mud.dev/packages/cli/`));\n } else if (error instanceof MUDError) {\n console.log(chalk.red(error));\n } else {\n console.log(error);\n }\n}\n","import type { CommandModule, Options } from \"yargs\";\nimport { logError } from \"../utils/errors\";\nimport { DeployOptions, deployHandler } from \"../utils/deployHandler\";\n\nexport const yDeployOptions = {\n configPath: { type: \"string\", desc: \"Path to the config file\" },\n clean: { type: \"boolean\", desc: \"Remove the build forge artifacts and cache directories before building\" },\n printConfig: { type: \"boolean\", desc: \"Print the resolved config\" },\n profile: { type: \"string\", desc: \"The foundry profile to use\" },\n debug: { type: \"boolean\", desc: \"Print debug logs, like full error messages\" },\n priorityFeeMultiplier: {\n type: \"number\",\n desc: \"Multiply the estimated priority fee by the provided factor\",\n default: 1,\n },\n saveDeployment: { type: \"boolean\", desc: \"Save the deployment info to a file\", default: true },\n rpc: { type: \"string\", desc: \"The RPC URL to use. Defaults to the RPC url from the local foundry.toml\" },\n worldAddress: { type: \"string\", desc: \"Deploy to an existing World at the given address\" },\n srcDir: { type: \"string\", desc: \"Source directory. Defaults to foundry src directory.\" },\n disableTxWait: { type: \"boolean\", desc: \"Disable waiting for transactions to be confirmed.\", default: false },\n pollInterval: {\n type: \"number\",\n desc: \"Interval in miliseconds to use to poll for transaction receipts / block inclusion\",\n default: 1000,\n },\n skipBuild: { type: \"boolean\", desc: \"Skip rebuilding the contracts before deploying\" },\n} satisfies Record<keyof DeployOptions, Options>;\n\nconst commandModule: CommandModule<DeployOptions, DeployOptions> = {\n command: \"deploy\",\n\n describe: \"Deploy MUD contracts\",\n\n builder(yargs) {\n return yargs.options(yDeployOptions);\n },\n\n async handler(args) {\n try {\n await deployHandler(args);\n } catch (error: any) {\n logError(error);\n process.exit(1);\n }\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import type { CommandModule } from \"yargs\";\nimport { loadConfig } from \"@latticexyz/config/node\";\nimport { StoreConfig } from \"@latticexyz/store\";\nimport { WorldConfig } from \"@latticexyz/world\";\nimport { worldgen } from \"@latticexyz/world/node\";\nimport { getSrcDirectory } from \"@latticexyz/common/foundry\";\nimport path from \"path\";\nimport { rmSync } from \"fs\";\nimport { getExistingContracts } from \"../utils/getExistingContracts\";\n\ntype Options = {\n configPath?: string;\n clean?: boolean;\n srcDir?: string;\n config?: StoreConfig & WorldConfig;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"worldgen\",\n\n describe: \"Autogenerate interfaces for Systems and World based on existing contracts and the config file\",\n\n builder(yargs) {\n return yargs.options({\n configPath: { type: \"string\", desc: \"Path to the config file\" },\n clean: {\n type: \"boolean\",\n desc: \"Clear the worldgen directory before generating new interfaces (defaults to true)\",\n default: true,\n },\n });\n },\n\n async handler(args) {\n await worldgenHandler(args);\n process.exit(0);\n },\n};\n\nexport async function worldgenHandler(args: Options) {\n const srcDir = args.srcDir ?? (await getSrcDirectory());\n\n const existingContracts = getExistingContracts(srcDir);\n\n // Load the config\n const mudConfig = args.config ?? ((await loadConfig(args.configPath)) as StoreConfig & WorldConfig);\n\n const outputBaseDirectory = path.join(srcDir, mudConfig.codegenDirectory);\n\n // clear the worldgen directory\n if (args.clean) rmSync(path.join(outputBaseDirectory, mudConfig.worldgenDirectory), { recursive: true, force: true });\n\n // generate new interfaces\n await worldgen(mudConfig, existingContracts, outputBaseDirectory);\n}\n\nexport default commandModule;\n","import chalk from \"chalk\";\nimport { readFileSync, writeFileSync } from \"fs\";\nimport path from \"path\";\nimport type { CommandModule } from \"yargs\";\nimport { MUDError } from \"@latticexyz/common/errors\";\nimport { logError } from \"../utils/errors\";\nimport localPackageJson from \"../../package.json\" assert { type: \"json\" };\nimport glob from \"glob\";\nimport { mudPackages } from \"../mudPackages\";\n\ntype Options = {\n backup?: boolean;\n force?: boolean;\n restore?: boolean;\n mudVersion?: string;\n tag?: string;\n commit?: string;\n link?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"set-version\",\n\n describe: \"Set MUD version in all package.json files and optionally backup the previously installed version\",\n\n builder(yargs) {\n return yargs.options({\n mudVersion: { alias: \"v\", type: \"string\", description: \"Set MUD to the given version\" },\n tag: {\n alias: \"t\",\n type: \"string\",\n description: \"Set MUD to the latest version with the given tag from npm\",\n },\n commit: {\n alias: \"c\",\n type: \"string\",\n description: \"Set MUD to the version based on a given git commit hash from npm\",\n },\n link: { alias: \"l\", type: \"string\", description: \"Relative path to the local MUD root directory to link\" },\n });\n },\n\n async handler(options) {\n try {\n const mutuallyExclusiveOptions = [\"mudVersion\", \"link\", \"tag\", \"commit\", \"restore\"];\n const numMutuallyExclusiveOptions = mutuallyExclusiveOptions.reduce(\n (acc, opt) => (options[opt] ? acc + 1 : acc),\n 0\n );\n\n if (numMutuallyExclusiveOptions === 0) {\n throw new MUDError(`You need to provide one these options: ${mutuallyExclusiveOptions.join(\", \")}`);\n }\n\n if (numMutuallyExclusiveOptions > 1) {\n throw new MUDError(`These options are mutually exclusive: ${mutuallyExclusiveOptions.join(\", \")}`);\n }\n\n // Resolve the version number from available options like `tag` or `commit`\n options.mudVersion = await resolveVersion(options);\n\n // Update all package.json below the current working directory (except in node_modules)\n const packageJsons = glob.sync(\"**/package.json\").filter((p) => !p.includes(\"node_modules\"));\n for (const packageJson of packageJsons) {\n updatePackageJson(packageJson, options);\n }\n } catch (e) {\n logError(e);\n } finally {\n process.exit(0);\n }\n },\n};\n\nasync function resolveVersion(options: Options) {\n // Backwards compatibility to previous behavior of this script where passing \"canary\" as the version resolved to the latest commit on main\n if (options.mudVersion === \"canary\") options.tag = \"main\";\n\n let npmResult;\n try {\n console.log(chalk.blue(`Fetching available versions`));\n npmResult = await (await fetch(`https://registry.npmjs.org/${localPackageJson.name}`)).json();\n } catch (e) {\n throw new MUDError(`Could not fetch available MUD versions`);\n }\n\n if (options.tag) {\n const version = npmResult[\"dist-tags\"][options.tag];\n if (!version) {\n throw new MUDError(`Could not find npm version with tag \"${options.tag}\"`);\n }\n console.log(chalk.green(`Latest version with tag ${options.tag}: ${version}`));\n return version;\n }\n\n if (options.commit) {\n // Find a version with this commit hash\n const commit = options.commit.substring(0, 8); // changesets uses the first 8 characters of the commit hash as version for prereleases/snapshot releases\n const version = Object.keys(npmResult[\"versions\"]).find((v) => (v as string).includes(commit));\n if (!version) {\n throw new MUDError(`Could not find npm version based on commit \"${options.commit}\"`);\n }\n console.log(chalk.green(`Version from commit ${options.commit}: ${version}`));\n return version;\n }\n\n // If neither a tag nor a commit option is given, return the `mudVersion`\n return options.mudVersion;\n}\n\nfunction updatePackageJson(filePath: string, options: Options): { workspaces?: string[] } {\n const { link } = options;\n let { mudVersion } = options;\n\n const packageJson = readPackageJson(filePath);\n const mudPackageNames = Object.keys(mudPackages);\n\n // Find all MUD dependencies\n const mudDependencies: Record<string, string> = {};\n for (const packageName in packageJson.dependencies) {\n if (mudPackageNames.includes(packageName)) {\n mudDependencies[packageName] = packageJson.dependencies[packageName];\n }\n }\n\n // Find all MUD devDependencies\n const mudDevDependencies: Record<string, string> = {};\n for (const packageName in packageJson.devDependencies) {\n if (mudPackageNames.includes(packageName)) {\n mudDevDependencies[packageName] = packageJson.devDependencies[packageName];\n }\n }\n\n // Update the dependencies\n for (const packageName in packageJson.dependencies) {\n if (mudPackageNames.includes(packageName)) {\n packageJson.dependencies[packageName] = resolveMudVersion(packageName, \"dependencies\");\n }\n }\n\n // Update the devDependencies\n for (const packageName in packageJson.devDependencies) {\n if (mudPackageNames.includes(packageName)) {\n packageJson.devDependencies[packageName] = resolveMudVersion(packageName, \"devDependencies\");\n }\n }\n\n // Write the updated package.json\n writeFileSync(filePath, JSON.stringify(packageJson, null, 2) + \"\\n\");\n\n console.log(`Updating ${filePath}`);\n logComparison(mudDependencies, packageJson.dependencies);\n logComparison(mudDevDependencies, packageJson.devDependencies);\n\n return packageJson;\n\n function resolveMudVersion(key: string, type: \"dependencies\" | \"devDependencies\") {\n if (link) mudVersion = resolveLinkPath(filePath, link, key);\n if (!mudVersion) return packageJson[type][key];\n return mudVersion;\n }\n}\n\nfunction readPackageJson(path: string): {\n workspaces?: string[];\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n} {\n try {\n const jsonString = readFileSync(path, \"utf8\");\n return JSON.parse(jsonString);\n } catch {\n throw new MUDError(\"Could not read JSON at \" + path);\n }\n}\n\nfunction logComparison(prev: Record<string, string>, curr: Record<string, string>) {\n for (const key in prev) {\n if (prev[key] !== curr[key]) {\n console.log(`${key}: ${chalk.red(prev[key])} -> ${chalk.green(curr[key])}`);\n }\n }\n}\n\n/**\n * Returns path of the package to link, given a path to a local MUD clone and a package\n */\nfunction resolveLinkPath(packageJsonPath: string, mudLinkPath: string, packageName: string) {\n const packageJsonToRootPath = path.relative(path.dirname(packageJsonPath), process.cwd());\n const linkPath = path.join(packageJsonToRootPath, mudLinkPath, mudPackages[packageName].localPath);\n return \"link:\" + linkPath;\n}\n\nexport default commandModule;\n","{\n \"name\": \"@latticexyz/cli\",\n \"version\": \"2.0.0-next.11\",\n \"description\": \"Command line interface for mud\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/latticexyz/mud.git\",\n \"directory\": \"packages/cli\"\n },\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"exports\": {\n \".\": \"./dist/index.js\"\n },\n \"types\": \"src/index.ts\",\n \"bin\": {\n \"mud\": \"./dist/mud.js\"\n },\n \"scripts\": {\n \"build\": \"pnpm run build:js && pnpm run build:test-tables\",\n \"build:js\": \"tsup && chmod +x ./dist/mud.js\",\n \"build:test-tables\": \"tsx ./scripts/generate-test-tables.ts\",\n \"clean\": \"pnpm run clean:js && pnpm run clean:test-tables\",\n \"clean:js\": \"rimraf dist\",\n \"clean:test-tables\": \"rimraf src/codegen\",\n \"dev\": \"tsup --watch\",\n \"lint\": \"eslint . --ext .ts\",\n \"prepare\": \"mkdir -p ./dist && touch ./dist/mud.js\",\n \"test\": \"tsc --noEmit && forge test\",\n \"test:ci\": \"pnpm run test\"\n },\n \"dependencies\": {\n \"@ethersproject/abi\": \"^5.7.0\",\n \"@ethersproject/providers\": \"^5.7.2\",\n \"@improbable-eng/grpc-web\": \"^0.15.0\",\n \"@improbable-eng/grpc-web-node-http-transport\": \"^0.15.0\",\n \"@latticexyz/abi-ts\": \"workspace:*\",\n \"@latticexyz/common\": \"workspace:*\",\n \"@latticexyz/config\": \"workspace:*\",\n \"@latticexyz/gas-report\": \"workspace:*\",\n \"@latticexyz/protocol-parser\": \"workspace:*\",\n \"@latticexyz/schema-type\": \"workspace:*\",\n \"@latticexyz/services\": \"workspace:*\",\n \"@latticexyz/store\": \"workspace:*\",\n \"@latticexyz/utils\": \"workspace:*\",\n \"@latticexyz/world\": \"workspace:*\",\n \"@latticexyz/world-modules\": \"workspace:*\",\n \"chalk\": \"^5.0.1\",\n \"chokidar\": \"^3.5.3\",\n \"dotenv\": \"^16.0.3\",\n \"ejs\": \"^3.1.8\",\n \"ethers\": \"^5.7.2\",\n \"execa\": \"^7.0.0\",\n \"glob\": \"^8.0.3\",\n \"nice-grpc-web\": \"^2.0.1\",\n \"openurl\": \"^1.1.1\",\n \"path\": \"^0.12.7\",\n \"throttle-debounce\": \"^5.0.0\",\n \"typescript\": \"5.1.6\",\n \"viem\": \"1.14.0\",\n \"yargs\": \"^17.7.1\",\n \"zod\": \"^3.21.4\",\n \"zod-validation-error\": \"^1.3.0\"\n },\n \"devDependencies\": {\n \"@types/ejs\": \"^3.1.1\",\n \"@types/glob\": \"^7.2.0\",\n \"@types/node\": \"^18.15.11\",\n \"@types/openurl\": \"^1.0.0\",\n \"@types/throttle-debounce\": \"^5.0.0\",\n \"@types/yargs\": \"^17.0.10\",\n \"ds-test\": \"https://github.com/dapphub/ds-test.git#e282159d5170298eb2455a6c05280ab5a73a4ef0\",\n \"forge-std\": \"https://github.com/foundry-rs/forge-std.git#74cfb77e308dd188d2f58864aaf44963ae6b88b1\",\n \"tsup\": \"^6.7.0\",\n \"tsx\": \"^3.12.6\",\n \"vitest\": \"0.31.4\"\n },\n \"gitHead\": \"914a1e0ae4a573d685841ca2ea921435057deb8f\"\n}\n","import { ZodError, z } from \"zod\";\nimport { MudPackages } from \"./common\";\n\nconst envSchema = z.object({\n MUD_PACKAGES: z.string().transform((value) => JSON.parse(value) as MudPackages),\n});\n\nfunction parseEnv(): z.infer<typeof envSchema> {\n try {\n return envSchema.parse({\n // tsup replaces the env vars with their values at compile time\n MUD_PACKAGES: process.env.MUD_PACKAGES,\n });\n } catch (error) {\n if (error instanceof ZodError) {\n const { _errors, ...invalidEnvVars } = error.format();\n console.error(`\\nMissing or invalid environment variables:\\n\\n ${Object.keys(invalidEnvVars).join(\"\\n \")}\\n`);\n process.exit(1);\n }\n throw error;\n }\n}\n\nexport const mudPackages = parseEnv().MUD_PACKAGES;\n","import type { CommandModule } from \"yargs\";\nimport { anvil, forge, getRpcUrl } from \"@latticexyz/common/foundry\";\nimport chalk from \"chalk\";\nimport { rmSync, writeFileSync } from \"fs\";\nimport { yDeployOptions } from \"./deploy\";\nimport { DeployOptions, deployHandler } from \"../utils/deployHandler\";\n\ntype Options = DeployOptions & { port?: number; worldAddress?: string; forgeOptions?: string };\n\nconst WORLD_ADDRESS_FILE = \".mudtest\";\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"test\",\n\n describe: \"Run tests in MUD contracts\",\n\n builder(yargs) {\n return yargs.options({\n ...yDeployOptions,\n port: { type: \"number\", description: \"Port to run internal node for fork testing on\", default: 4242 },\n worldAddress: {\n type: \"string\",\n description:\n \"Address of an existing world contract. If provided, deployment is skipped and the RPC provided in the foundry.toml is used for fork testing.\",\n },\n forgeOptions: { type: \"string\", description: \"Options to pass to forge test\" },\n });\n },\n\n async handler(args) {\n // Start an internal anvil process if no world address is provided\n if (!args.worldAddress) {\n const anvilArgs = [\"--block-base-fee-per-gas\", \"0\", \"--port\", String(args.port)];\n anvil(anvilArgs);\n }\n\n const forkRpc = args.worldAddress ? await getRpcUrl(args.profile) : `http://127.0.0.1:${args.port}`;\n\n const worldAddress =\n args.worldAddress ??\n (\n await deployHandler({\n ...args,\n saveDeployment: false,\n rpc: forkRpc,\n })\n ).worldAddress;\n\n console.log(chalk.blue(\"World address\", worldAddress));\n\n // Create a temporary file to pass the world address to the tests\n writeFileSync(WORLD_ADDRESS_FILE, worldAddress);\n\n const userOptions = args.forgeOptions?.replaceAll(\"\\\\\", \"\").split(\" \") ?? [];\n try {\n const testResult = await forge([\"test\", \"--fork-url\", forkRpc, ...userOptions], {\n profile: args.profile,\n });\n console.log(testResult);\n } catch (e) {\n console.error(e);\n rmSync(WORLD_ADDRESS_FILE);\n process.exit(1);\n }\n\n rmSync(WORLD_ADDRESS_FILE);\n process.exit(0);\n },\n};\n\nexport default commandModule;\n","import { existsSync, readFileSync } from \"fs\";\nimport type { CommandModule } from \"yargs\";\nimport { ethers } from \"ethers\";\n\nimport { loadConfig } from \"@latticexyz/config/node\";\nimport { MUDError } from \"@latticexyz/common/errors\";\nimport { cast, getRpcUrl, getSrcDirectory } from \"@latticexyz/common/foundry\";\nimport { StoreConfig } from \"@latticexyz/store\";\nimport { resolveWorldConfig, WorldConfig } from \"@latticexyz/world\";\nimport IBaseWorldAbi from \"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json\" assert { type: \"json\" };\nimport worldConfig from \"@latticexyz/world/mud.config.js\";\nimport { resourceIdToHex } from \"@latticexyz/common\";\nimport { getExistingContracts } from \"../utils/getExistingContracts\";\nimport { getChainId } from \"../utils/utils/getChainId\";\n\n// TODO account for multiple namespaces (https://github.com/latticexyz/mud/issues/994)\nconst systemsTableId = resourceIdToHex({\n type: \"system\",\n namespace: worldConfig.namespace,\n name: worldConfig.tables.Systems.name,\n});\n\ntype Options = {\n tx: string;\n worldAddress?: string;\n configPath?: string;\n profile?: string;\n srcDir?: string;\n rpc?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"trace\",\n\n describe: \"Display the trace of a transaction\",\n\n builder(yargs) {\n return yargs.options({\n tx: { type: \"string\", required: true, description: \"Transaction hash to replay\" },\n worldAddress: {\n type: \"string\",\n description: \"World contract address. Defaults to the value from worlds.json, based on rpc's chainId\",\n },\n configPath: { type: \"string\", description: \"Path to the config file\" },\n profile: { type: \"string\", description: \"The foundry profile to use\" },\n srcDir: { type: \"string\", description: \"Source directory. Defaults to foundry src directory.\" },\n rpc: { type: \"string\", description: \"json rpc endpoint. Defaults to foundry's configured eth_rpc_url\" },\n });\n },\n\n async handler(args) {\n args.profile ??= process.env.FOUNDRY_PROFILE;\n const { profile } = args;\n args.srcDir ??= await getSrcDirectory(profile);\n args.rpc ??= await getRpcUrl(profile);\n const { tx, configPath, srcDir, rpc } = args;\n\n const existingContracts = getExistingContracts(srcDir);\n\n // Load the config\n const mudConfig = (await loadConfig(configPath)) as StoreConfig & WorldConfig;\n\n const resolvedConfig = resolveWorldConfig(\n mudConfig,\n existingContracts.map(({ basename }) => basename)\n );\n\n // Get worldAddress either from args or from worldsFile\n const worldAddress = args.worldAddress ?? (await getWorldAddress(mudConfig.worldsFile, rpc));\n\n // Create World contract instance from deployed address\n const provider = new ethers.providers.StaticJsonRpcProvider(rpc);\n const WorldContract = new ethers.Contract(worldAddress, IBaseWorldAbi, provider);\n\n // TODO account for multiple namespaces (https://github.com/latticexyz/mud/issues/994)\n const namespace = mudConfig.namespace;\n const names = Object.values(resolvedConfig.systems).map(({ name }) => name);\n\n // Fetch system table field layout from chain\n const systemTableFieldLayout = await WorldContract.getFieldLayout(systemsTableId);\n const labels: { name: string; address: string }[] = [];\n for (const name of names) {\n const systemSelector = resourceIdToHex({ type: \"system\", namespace, name });\n // Get the first field of `Systems` table (the table maps system name to its address and other data)\n const address = await WorldContract.getField(systemsTableId, [systemSelector], 0, systemTableFieldLayout);\n labels.push({ name, address });\n }\n\n const result = await cast([\n \"run\",\n \"--label\",\n `${worldAddress}:World`,\n ...labels.map(({ name, address }) => [\"--label\", `${address}:${name}`]).flat(),\n `${tx}`,\n ]);\n console.log(result);\n\n process.exit(0);\n },\n};\n\nexport default commandModule;\n\nasync function getWorldAddress(worldsFile: string, rpc: string) {\n if (existsSync(worldsFile)) {\n const chainId = await getChainId(rpc);\n const deploys = JSON.parse(readFileSync(worldsFile, \"utf-8\"));\n\n if (!deploys[chainId]) {\n throw new MUDError(`chainId ${chainId} is missing in worldsFile \"${worldsFile}\"`);\n }\n return deploys[chainId].address as string;\n } else {\n throw new MUDError(\"worldAddress is not specified and worldsFile is missing\");\n }\n}\n","import type { CommandModule } from \"yargs\";\nimport {\n anvil,\n forge,\n getRemappings,\n getRpcUrl,\n getScriptDirectory,\n getSrcDirectory,\n} from \"@latticexyz/common/foundry\";\nimport chalk from \"chalk\";\nimport chokidar from \"chokidar\";\nimport { loadConfig, resolveConfigPath } from \"@latticexyz/config/node\";\nimport { StoreConfig } from \"@latticexyz/store\";\nimport { tablegen } from \"@latticexyz/store/codegen\";\nimport path from \"path\";\nimport { debounce } from \"throttle-debounce\";\nimport { worldgenHandler } from \"./worldgen\";\nimport { WorldConfig } from \"@latticexyz/world\";\nimport { homedir } from \"os\";\nimport { rmSync } from \"fs\";\nimport { execa } from \"execa\";\nimport { logError } from \"../utils/errors\";\nimport { deployHandler } from \"../utils/deployHandler\";\nimport { printMUD } from \"../utils/printMUD\";\n\ntype Options = {\n rpc?: string;\n configPath?: string;\n};\n\nconst commandModule: CommandModule<Options, Options> = {\n command: \"dev-contracts\",\n\n describe: \"Start a development server for MUD contracts\",\n\n builder(yargs) {\n return yargs.options({\n rpc: {\n type: \"string\",\n decs: \"RPC endpoint of the development node. If none is provided, an anvil instance is spawned in the background on port 8545.\",\n },\n configPath: {\n type: \"string\",\n decs: \"Path to MUD config\",\n },\n });\n },\n\n async handler(args) {\n // Initial cleanup\n await forge([\"clean\"]);\n\n const rpc = args.rpc ?? (await getRpcUrl());\n const configPath = args.configPath ?? (await resolveConfigPath(args.configPath));\n const srcDirectory = await getSrcDirectory();\n const scriptDirectory = await getScriptDirectory();\n const remappings = await getRemappings();\n const initialConfig = (await loadConfig(configPath)) as StoreConfig & WorldConfig;\n\n // Initial run of all codegen steps before starting anvil\n // (so clients can wait for everything to be ready before starting)\n await handleConfigChange(initialConfig);\n await handleContractsChange(initialConfig);\n\n // Start an anvil instance in the background if no RPC url is provided\n if (!args.rpc) {\n console.log(chalk.gray(\"Cleaning devnode cache\"));\n const userHomeDir = homedir();\n rmSync(path.join(userHomeDir, \".foundry\", \"anvil\", \"tmp\"), { recursive: true, force: true });\n\n const anvilArgs = [\"--block-time\", \"1\", \"--block-base-fee-per-gas\", \"0\"];\n anvil(anvilArgs);\n }\n\n const changedSinceLastHandled = {\n config: false,\n contracts: false,\n };\n\n const changeInProgress = {\n current: false,\n };\n\n // Watch for changes\n const configWatcher = chokidar.watch([configPath, srcDirectory]);\n configWatcher.on(\"all\", async (_, updatePath) => {\n if (updatePath.includes(configPath)) {\n changedSinceLastHandled.config = true;\n // We trigger contract changes if the config changed here instead of\n // listening to changes in the codegen directory to avoid an infinite loop\n changedSinceLastHandled.contracts = true;\n }\n\n if (updatePath.includes(srcDirectory) || updatePath.includes(scriptDirectory)) {\n // Ignore changes to codegen files to avoid an infinite loop\n if (updatePath.includes(initialConfig.codegenDirectory)) return;\n changedSinceLastHandled.contracts = true;\n }\n\n // Trigger debounced onChange\n handleChange();\n });\n\n const handleChange = debounce(100, async () => {\n // Avoid handling changes multiple times in parallel\n if (changeInProgress.current) return;\n changeInProgress.current = true;\n\n // Reset dirty flags\n const { config, contracts } = changedSinceLastHandled;\n changedSinceLastHandled.config = false;\n changedSinceLastHandled.contracts = false;\n\n try {\n // Load latest config\n const mudConfig = (await loadConfig(configPath)) as StoreConfig & WorldConfig;\n\n // Handle changes\n if (config) await handleConfigChange(mudConfig);\n if (contracts) await handleContractsChange(mudConfig);\n\n await deploy();\n } catch (error) {\n console.error(chalk.red(\"MUD dev-contracts watcher failed to deploy config or contracts changes\\n\"));\n logError(error);\n }\n\n changeInProgress.current = false;\n if (changedSinceLastHandled.config || changedSinceLastHandled.contracts) {\n console.log(\"Detected change while handling the previous change\");\n handleChange();\n }\n\n printMUD();\n console.log(\"MUD watching for changes...\");\n });\n\n /** Codegen to run if config changes */\n async function handleConfigChange(config: StoreConfig & WorldConfig) {\n console.log(chalk.blue(\"mud.config.ts changed - regenerating tables and recs types\"));\n // Run tablegen to generate tables based on the config\n const outPath = path.join(srcDirectory, config.codegenDirectory);\n await tablegen(config, outPath, remappings);\n }\n\n /** Codegen to run if contracts changed */\n async function handleContractsChange(config: StoreConfig & WorldConfig) {\n console.log(chalk.blue(\"contracts changed - regenerating interfaces and contract types\"));\n\n // Run worldgen to generate interfaces based on the systems\n await worldgenHandler({ config, clean: true, srcDir: srcDirectory });\n\n // Build the contracts\n await forge([\"build\", \"--skip\", \"test\", \"script\"]);\n\n // Generate TS type definitions for ABIs\n await execa(\"mud\", [\"abi-ts\"], { stdio: \"inherit\" });\n }\n\n /** Run after codegen if either mud config or contracts changed */\n async function deploy() {\n console.log(chalk.blue(\"redeploying World\"));\n await deployHandler({\n configPath,\n skipBuild: true,\n priorityFeeMultiplier: 1,\n disableTxWait: true,\n pollInterval: 1000,\n saveDeployment: true,\n srcDir: srcDirectory,\n rpc,\n });\n }\n },\n};\n\nexport default commandModule;\n","import chalk from \"chalk\";\n\nexport function printMUD() {\n console.log(\n chalk.yellow(`\n.------..------..------.\n|M.--. ||U.--. ||D.--. |\n| (\\\\/) || (\\\\/) || :/\\\\: |\n| :\\\\/: || :\\\\/: || (__) |\n| '--'M|| '--'U|| '--'D|\n'------''------''------'\n`)\n );\n}\n"],"mappings":"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","names":["yargs","hideBin","gasReport","abiTs","rmSync","homedir","path","execa","commandModule","yargs","blocktime","userHomeDir","anvilArgs","child","devnode_default","FaucetServiceDefinition","createChannel","createClient","chalk","NodeHttpTransport","createFaucetService","url","commandModule","yargs","dripDev","faucetUrl","address","faucet","faucet_default","commandModule","yargs","name","greeting","hello_default","path","loadConfig","tablegen","getRemappings","getSrcDirectory","commandModule","yargs","configPath","config","srcDir","remappings","tablegen_default","chalk","ZodError","fromZodError","ValidationError","NotInsideProjectError","MUDError","logError","error","validationError","yDeployOptions","commandModule","yargs","args","deployHandler","error","logError","deploy_default","loadConfig","worldgen","getSrcDirectory","path","rmSync","commandModule","yargs","args","worldgenHandler","srcDir","getSrcDirectory","existingContracts","getExistingContracts","mudConfig","loadConfig","outputBaseDirectory","path","rmSync","worldgen","worldgen_default","chalk","readFileSync","writeFileSync","path","MUDError","package_default","glob","ZodError","z","envSchema","value","parseEnv","error","_errors","invalidEnvVars","mudPackages","commandModule","yargs","options","mutuallyExclusiveOptions","numMutuallyExclusiveOptions","acc","opt","MUDError","resolveVersion","packageJsons","glob","p","packageJson","updatePackageJson","e","logError","npmResult","chalk","package_default","version","commit","v","filePath","link","mudVersion","readPackageJson","mudPackageNames","mudPackages","mudDependencies","packageName","mudDevDependencies","resolveMudVersion","writeFileSync","logComparison","key","type","resolveLinkPath","path","jsonString","readFileSync","prev","curr","packageJsonPath","mudLinkPath","packageJsonToRootPath","set_version_default","anvil","forge","getRpcUrl","chalk","rmSync","writeFileSync","WORLD_ADDRESS_FILE","commandModule","yargs","yDeployOptions","args","anvilArgs","anvil","forkRpc","getRpcUrl","worldAddress","deployHandler","chalk","writeFileSync","userOptions","testResult","forge","e","rmSync","test_default","existsSync","readFileSync","ethers","loadConfig","MUDError","cast","getRpcUrl","getSrcDirectory","resolveWorldConfig","IBaseWorldAbi","worldConfig","resourceIdToHex","systemsTableId","resourceIdToHex","worldConfig","commandModule","yargs","args","profile","getSrcDirectory","getRpcUrl","tx","configPath","srcDir","rpc","existingContracts","getExistingContracts","mudConfig","loadConfig","resolvedConfig","resolveWorldConfig","basename","worldAddress","getWorldAddress","provider","ethers","WorldContract","IBaseWorldAbi","namespace","names","name","systemTableFieldLayout","labels","systemSelector","address","result","cast","trace_default","worldsFile","existsSync","chainId","getChainId","deploys","readFileSync","MUDError","anvil","forge","getRemappings","getRpcUrl","getScriptDirectory","getSrcDirectory","chalk","chokidar","loadConfig","resolveConfigPath","tablegen","path","debounce","homedir","rmSync","execa","chalk","printMUD","commandModule","yargs","args","forge","rpc","getRpcUrl","configPath","resolveConfigPath","srcDirectory","getSrcDirectory","scriptDirectory","getScriptDirectory","remappings","getRemappings","initialConfig","loadConfig","handleConfigChange","handleContractsChange","chalk","userHomeDir","homedir","rmSync","path","anvil","changedSinceLastHandled","changeInProgress","chokidar","_","updatePath","handleChange","debounce","config","contracts","mudConfig","deploy","error","logError","printMUD","outPath","tablegen","worldgenHandler","execa","deployHandler","dev_contracts_default","commands","deploy_default","devnode_default","faucet_default","gasReport","hello_default","tablegen_default","worldgen_default","set_version_default","test_default","trace_default","dev_contracts_default","abiTs","dotenv","chalk","yargs","hideBin","commands","msg","err","logError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@latticexyz/cli",
3
- "version": "2.0.0-main-430e6b29",
3
+ "version": "2.0.0-main-e3d2aef6",
4
4
  "description": "Command line interface for mud",
5
5
  "repository": {
6
6
  "type": "git",
@@ -37,17 +37,17 @@
37
37
  "yargs": "^17.7.1",
38
38
  "zod": "^3.21.4",
39
39
  "zod-validation-error": "^1.3.0",
40
- "@latticexyz/abi-ts": "2.0.0-main-430e6b29",
41
- "@latticexyz/common": "2.0.0-main-430e6b29",
42
- "@latticexyz/config": "2.0.0-main-430e6b29",
43
- "@latticexyz/gas-report": "2.0.0-main-430e6b29",
44
- "@latticexyz/protocol-parser": "2.0.0-main-430e6b29",
45
- "@latticexyz/schema-type": "2.0.0-main-430e6b29",
46
- "@latticexyz/services": "2.0.0-main-430e6b29",
47
- "@latticexyz/store": "2.0.0-main-430e6b29",
48
- "@latticexyz/utils": "2.0.0-main-430e6b29",
49
- "@latticexyz/world": "2.0.0-main-430e6b29",
50
- "@latticexyz/world-modules": "2.0.0-main-430e6b29"
40
+ "@latticexyz/abi-ts": "2.0.0-main-e3d2aef6",
41
+ "@latticexyz/common": "2.0.0-main-e3d2aef6",
42
+ "@latticexyz/config": "2.0.0-main-e3d2aef6",
43
+ "@latticexyz/gas-report": "2.0.0-main-e3d2aef6",
44
+ "@latticexyz/protocol-parser": "2.0.0-main-e3d2aef6",
45
+ "@latticexyz/schema-type": "2.0.0-main-e3d2aef6",
46
+ "@latticexyz/services": "2.0.0-main-e3d2aef6",
47
+ "@latticexyz/store": "2.0.0-main-e3d2aef6",
48
+ "@latticexyz/utils": "2.0.0-main-e3d2aef6",
49
+ "@latticexyz/world": "2.0.0-main-e3d2aef6",
50
+ "@latticexyz/world-modules": "2.0.0-main-e3d2aef6"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@types/ejs": "^3.1.1",
@@ -88,7 +88,7 @@ export async function deploy(
88
88
 
89
89
  // Filters any default modules from config
90
90
  const userModules = getUserModules(defaultModuleContracts, mudConfig.modules);
91
- const userModuleContracts = Object.keys(userModules).map((name) => {
91
+ const userModuleContracts = userModules.map(({ name }) => {
92
92
  const { abi, bytecode } = getContractData(name, forgeOutDirectory);
93
93
  return {
94
94
  name,
@@ -1,11 +0,0 @@
1
- import S from"chalk";import $ from"path";import{MUDError as it}from"@latticexyz/common/errors";import{loadConfig as ct}from"@latticexyz/config/node";import u from"chalk";import ze from"path";import{ethers as A}from"ethers";import{getOutDirectory as Qe,cast as Xe,getSrcDirectory as Ze,getRemappings as et}from"@latticexyz/common/foundry";import{resolveWorldConfig as tt}from"@latticexyz/world";import Fe from"chalk";import Ie from"@latticexyz/world/out/World.sol/World.json"assert{type:"json"};import Me from"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json"assert{type:"json"};import G from"chalk";import{ethers as Pe}from"ethers";import{MUDError as U}from"@latticexyz/common/errors";async function I(e){let{signer:t,nonce:r,maxPriorityFeePerGas:o,maxFeePerGas:n,debug:a,gasPrice:l,confirmations:p,contract:m}=e;try{let i=new Pe.ContractFactory(m.abi,m.bytecode,t);console.log(G.gray(`executing deployment of ${m.name} with nonce ${r}`));let g=i.deploy({nonce:r,maxPriorityFeePerGas:o,maxFeePerGas:n,gasPrice:l}).then(s=>p?s:s.deployed()),{address:f}=await g;return console.log(G.green("Deployed",m.name,"to",f)),f}catch(i){throw a&&console.error(i),i?.message.includes("invalid bytecode")?new U(`Error deploying ${m.name}: invalid bytecode. Note that linking of public libraries is not supported yet, make sure none of your libraries use "external" functions.`):i?.message.includes("CreateContractLimit")?new U(`Error deploying ${m.name}: CreateContractLimit exceeded.`):i}}import{readFileSync as Se}from"fs";import Te from"path";import{MUDError as N}from"@latticexyz/common/errors";function w(e,t){let r,o=Te.join(t,e+".sol",e+".json");try{r=JSON.parse(Se(o,"utf8"))}catch{throw new N(`Error reading file at ${o}`)}let n=r?.bytecode?.object;if(!n)throw new N(`No bytecode found in ${o}`);let a=r?.abi;if(!a)throw new N(`No ABI found in ${o}`);return{abi:a,bytecode:n}}async function K(e){console.log(Fe.blue("Deploying World"));let t=e.worldContractName?{name:"World",...w(e.worldContractName,e.forgeOutDirectory)}:{abi:Me,bytecode:Ie.bytecode,name:"World"};return I({...e,nonce:e.nonce,contract:t})}import ot from"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json"assert{type:"json"};import ce from"@latticexyz/world/out/CoreModule.sol/CoreModule.json"assert{type:"json"};import L from"@latticexyz/world-modules/out/KeysWithValueModule.sol/KeysWithValueModule.json"assert{type:"json"};import H from"@latticexyz/world-modules/out/KeysInTableModule.sol/KeysInTableModule.json"assert{type:"json"};import J from"@latticexyz/world-modules/out/UniqueEntityModule.sol/UniqueEntityModule.json"assert{type:"json"};var R=[{name:"KeysWithValueModule",abi:L.abi,bytecode:L.bytecode},{name:"KeysInTableModule",abi:H.abi,bytecode:H.bytecode},{name:"UniqueEntityModule",abi:J.abi,bytecode:J.bytecode}];import{defaultAbiCoder as ve}from"ethers/lib/utils.js";import{resolveWithContext as Ne}from"@latticexyz/config";async function _(e,t,r){let o=await e[t.name];if(!o)throw new Error(`Module ${t.name} not found`);let n=t.args.map(p=>Ne(p,{tableIds:r})),a=n.map(p=>p.value),l=n.map(p=>p.type);return{func:t.root?"installRootModule":"installModule",args:[o,ve.encode(l,a)]}}function q(e,t){return t.filter(r=>!e.some(o=>o.name===r.name))}import{resourceIdToHex as Re}from"@latticexyz/common";async function Y(e){let{systems:t,namespace:r,systemContracts:o}=e,n=[];for(let{name:a,accessListAddresses:l,accessListSystems:p}of t)l.map(async m=>n.push(V(a,r,m))),p.map(async m=>n.push(V(a,r,await o[m])));return n}function V(e,t,r){return{func:"grantAccess",args:[Re({type:"system",namespace:t,name:e}),r]}}import{resourceIdToHex as X}from"@latticexyz/common";import{ethers as k}from"ethers";function O(e,t){let{abi:r}=w(e,t);return r.filter(o=>["fallback","function"].includes(o.type)).map(o=>`${o.name}${Q(o.inputs)}`)}function z(e){return ke(e)}function Q(e){return`(${e.map(r=>{let o=r.type.match(/tuple(.*)/);return o?Q(r.components)+o[1]:r.type})})`}function ke(e){return k.utils.hexDataSlice(k.utils.keccak256(k.utils.toUtf8Bytes(e)),0,4)}function Z(e){let t=[],{systemContractName:r,namespace:o,forgeOutDirectory:n,system:a}=e;if(a.registerFunctionSelectors){let l=O("System",n),p=O(r,n).filter(i=>r==="System"||!l.includes(i)),m=o==="";for(let i of p)t.push(Oe({namespace:o,name:a.name,systemFunctionSignature:i,isRoot:m}))}return t}function Oe(e){let{namespace:t,name:r,systemFunctionSignature:o,isRoot:n}=e;if(n){let a=z(o);return{func:"registerRootFunctionSelector",args:[X({type:"system",namespace:t,name:r}),o,a]}}else return{func:"registerFunctionSelector",args:[X({type:"system",namespace:t,name:r}),o]}}import{resourceIdToHex as je}from"@latticexyz/common";async function ee(e){let{namespace:t,systemContracts:r,systemKey:o,system:n}=e,a=await r[o];return{func:"registerSystem",args:[je({type:"system",namespace:t,name:n.name}),a,n.openAccess]}}import{encodeSchema as te,getStaticByteLength as Ae}from"@latticexyz/schema-type/deprecated";import{resolveAbiOrUserType as oe}from"@latticexyz/store/codegen";import{resourceIdToHex as $e}from"@latticexyz/common";import{fieldLayoutToHex as We}from"@latticexyz/protocol-parser";import{loadAndExtractUserTypes as Ee}from"@latticexyz/common/codegen";function re(e,t,r,o){let{name:n,valueSchema:a,keySchema:l}=e;if(!n)throw Error("Table missing name");let p=Ee(t.userTypes,r,o),m=Object.values(a).map(s=>{let{schemaType:d}=oe(s,t,p);return d}),i=m.map(s=>Ae(s)),g={staticFieldLengths:i.filter(s=>s>0),numDynamicFields:i.filter(s=>s===0).length},f=Object.values(l).map(s=>{let{schemaType:d}=oe(s,t,p);return d});return{func:"registerTable",args:[$e({type:e.offchainOnly?"offchainTable":"table",namespace:t.namespace,name:n}),We(g),te(f),te(m),Object.keys(l),Object.keys(a)]}}import{resourceIdToHex as Be}from"@latticexyz/common";import{hexToBytes as Ge}from"viem";function ne(e){let t={};for(let[r,{name:o,offchainOnly:n}]of Object.entries(e.tables))t[r]=Ge(Be({type:n?"offchainTable":"table",namespace:e.namespace,name:o}));return t}import Ue from"chalk";import{MUDError as Ke}from"@latticexyz/common/errors";async function ae(e,t,r){let o=await e.getTransactionCount(),n=0,a=100;for(;o!==t&&n<a;)console.log(Ue.gray(`Waiting for transactions to be included before executing postDeployScript (local nonce: ${t}, remote nonce: ${o}, retry number ${n}/${a})`)),await new Promise(l=>setTimeout(l,r)),n++,o=await e.getTransactionCount();if(o!==t)throw new Ke("Remote nonce doesn't match local nonce, indicating that not all deploy transactions were included.")}import Le from"chalk";import{MUDError as He}from"@latticexyz/common/errors";async function h(e){let{func:t,args:r,contract:o,signer:n,nonce:a,maxPriorityFeePerGas:l,maxFeePerGas:p,gasPrice:m,confirmations:i=1,debug:g}=e,f=`${t}(${r.map(s=>`'${s}'`).join(",")})`;try{let s=o.connect(n),d=await s.estimateGas[t].apply(null,r);return console.log(Le.gray(`executing transaction: ${f} with nonce ${a}`)),s[t].apply(null,[...r,{gasLimit:d,nonce:a,maxPriorityFeePerGas:l,maxFeePerGas:p,gasPrice:m}]).then(D=>i===0?D:D.wait(i))}catch(s){throw g&&console.error(s),new He(`Gas estimation error for ${f}: ${s?.reason}`)}}import{existsSync as Je}from"fs";import _e from"path";import qe from"chalk";import{getScriptDirectory as Ve,forge as Ye}from"@latticexyz/common/foundry";async function se(e,t,r,o){let n=_e.join(await Ve(),e+".s.sol");Je(n)?(console.log(qe.blue(`Executing post deploy script at ${n}`)),await Ye(["script",e,"--sig","run(address)",t,"--broadcast","--rpc-url",r,"-vvv"],{profile:o})):console.log(`No script at ${n}, skipping post deploy hook`)}import{MUDError as j}from"@latticexyz/common/errors";async function ie(e,t){let r=await e.provider.getFeeData(),o,n,a;if(r.lastBaseFeePerGas){if(!r.lastBaseFeePerGas.eq(0)&&(await e.getBalance()).eq(0))throw new j(`Attempting to deploy to a chain with non-zero base fee with an account that has no balance.
2
- If you're deploying to the Lattice testnet, you can fund your account by running 'pnpm mud faucet --address ${await e.getAddress()}'`);o=r.lastBaseFeePerGas.eq(0)?0:Math.floor(15e8*t),n=r.lastBaseFeePerGas.mul(2).add(o)}else if(r.gasPrice){if(!r.gasPrice.eq(0)&&(await e.getBalance()).eq(0))throw new j("Attempting to deploy to a chain with non-zero gas price with an account that has no balance.");a=r.gasPrice}else throw new j("Can not fetch fee data from RPC");return{maxPriorityFeePerGas:o,maxFeePerGas:n,gasPrice:a}}import{resourceIdToHex as rt}from"@latticexyz/common";async function le(e,t,r){let o=Date.now(),{profile:n,rpc:a,privateKey:l,priorityFeeMultiplier:p,debug:m,worldAddress:i,disableTxWait:g,pollInterval:f}=r,s=tt(e,t),d=await Qe(n),D=await et(n),T=ze.join(await Ze(n),e.codegenDirectory),E=new A.providers.StaticJsonRpcProvider(a);E.pollingInterval=f;let P=new A.Wallet(l,E);console.log("Deploying from",P.address);let y=await P.getTransactionCount();console.log("Initial nonce",y);let C={...await ie(P,p),signer:P,debug:!!m,disableTxWait:g,confirmations:g?0:1},B=Number(await Xe(["block-number","--rpc-url",a],{profile:n}));console.log("Start deployment at block",B);let de=i?Promise.resolve(i):K({...C,nonce:y++,worldContractName:e.worldContractName,forgeOutDirectory:d}),ue=q(R,e.modules),ge=Object.keys(ue).map(c=>{let{abi:b,bytecode:v}=w(c,d);return{name:c,abi:b,bytecode:v}}),ye=Object.keys(s.systems).map(c=>{let{abi:b,bytecode:v}=w(c,d);return{name:c,abi:b,bytecode:v}}),F=[{name:"CoreModule",abi:ce.abi,bytecode:ce.bytecode},...R,...ge,...ye].reduce((c,b)=>(c[b.name]=I({...C,nonce:y++,contract:b}),c),{}),M=await de,x=new A.Contract(M,ot);i||(console.log(u.blue("Installing CoreModule")),await h({...C,nonce:y++,contract:x,func:"initialize",args:[await F.CoreModule]}),console.log(u.green("Installed CoreModule"))),e.namespace&&(console.log(u.blue("Registering Namespace")),await h({...C,nonce:y++,contract:x,func:"registerNamespace",args:[rt({type:"namespace",namespace:e.namespace,name:""})]}),console.log(u.green("Namespace registered")));let be=ne(e),Ce=Object.values(e.tables).map(c=>re(c,e,T,D));console.log(u.blue("Registering tables")),await Promise.all(Ce.map(c=>h({...C,nonce:y++,contract:x,...c}))),console.log(u.green("Tables registered")),console.log(u.blue("Registering Systems and Functions"));let we=await Promise.all(Object.entries(s.systems).map(([c,b])=>ee({systemContracts:F,systemKey:c,system:b,namespace:e.namespace}))),he=Object.entries(s.systems).flatMap(([c,b])=>Z({systemContractName:c,system:b,namespace:e.namespace,forgeOutDirectory:d}));await Promise.all([...we,...he].map(c=>h({...C,nonce:y++,contract:x,...c}))),console.log(u.green("Systems and Functions registered"));let De=await Y({systems:Object.values(s.systems),systemContracts:F,namespace:e.namespace});console.log(u.blue("Granting Access")),await Promise.all(De.map(c=>h({...C,nonce:y++,contract:x,...c}))),console.log(u.green("Access granted"));let xe=await Promise.all(e.modules.map(c=>_(F,c,be)));return console.log(u.blue("Installing User Modules")),await Promise.all(xe.map(c=>h({...C,nonce:y++,contract:x,...c}))),console.log(u.green("User Modules Installed")),await ae(P,y,f),await se(e.postDeployScript,M,a,n),console.log(u.green("Deployment completed in",(Date.now()-o)/1e3,"seconds")),{worldAddress:M,blockNumber:B}}import{forge as fe,getRpcUrl as lt,getSrcDirectory as mt}from"@latticexyz/common/foundry";import{existsSync as pt,mkdirSync as ft,readFileSync as dt,writeFileSync as W}from"fs";import nt from"glob";import{basename as at}from"path";function me(e){return nt.sync(`${e}/**/*.sol`).map(t=>({path:t,basename:at(t,".sol")}))}import{execa as ut}from"execa";import{ethers as st}from"ethers";async function pe(e){let{result:t}=await st.utils.fetchJson(e,'{ "id": 42, "jsonrpc": "2.0", "method": "eth_chainId", "params": [ ] }');return Number(t)}async function nr(e){e.profile??=process.env.FOUNDRY_PROFILE;let{configPath:t,printConfig:r,profile:o,clean:n,skipBuild:a}=e,l=e.rpc??await lt(o);console.log(S.bgBlue(S.whiteBright(`
3
- Deploying MUD contracts${o?" with profile "+o:""} to RPC ${l}
4
- `))),n&&await fe(["clean"],{profile:o}),a||(await fe(["build","--skip","test","script"],{profile:o}),await ut("mud",["abi-ts"],{stdio:"inherit"}));let p=e?.srcDir??await mt(),m=me(p).map(({basename:s})=>s),i=await ct(t);r&&console.log(S.green(`
5
- Resolved config:
6
- `),JSON.stringify(i,null,2));let g=process.env.PRIVATE_KEY;if(!g)throw new it(`Missing PRIVATE_KEY environment variable.
7
- Run 'echo "PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" > .env'
8
- in your contracts directory to use the default anvil private key.`);let f=await le(i,m,{...e,rpc:l,privateKey:g});if(e.saveDeployment){let s=await pe(l),d=$.join(i.deploysDirectory,s.toString());ft(d,{recursive:!0}),W($.join(d,"latest.json"),JSON.stringify(f,null,2)),W($.join(d,Date.now()+".json"),JSON.stringify(f,null,2));let D=[1337,31337],T=pt(i.worldsFile)?JSON.parse(dt(i.worldsFile,"utf-8")):{};T[s]={address:f.worldAddress,blockNumber:D.includes(s)?void 0:f.blockNumber},W(i.worldsFile,JSON.stringify(T,null,2)),console.log(S.bgGreen(S.whiteBright(`
9
- Deployment result (written to ${i.worldsFile} and ${d}):
10
- `)))}return console.log(f),f}export{me as a,pe as b,nr as c};
11
- //# sourceMappingURL=chunk-TW3YGZ4D.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/deployHandler.ts","../src/utils/deploy.ts","../src/utils/world.ts","../src/utils/utils/deployContract.ts","../src/utils/utils/getContractData.ts","../src/utils/modules/constants.ts","../src/utils/modules/getInstallModuleCallData.ts","../src/utils/modules/getUserModules.ts","../src/utils/systems/getGrantAccessCallData.ts","../src/utils/systems/getRegisterFunctionSelectorsCallData.ts","../src/utils/systems/utils.ts","../src/utils/systems/getRegisterSystemCallData.ts","../src/utils/tables/getRegisterTableCallData.ts","../src/utils/tables/getTableIds.ts","../src/utils/utils/confirmNonce.ts","../src/utils/utils/fastTxExecute.ts","../src/utils/utils/postDeploy.ts","../src/utils/utils/setInternalFeePerGas.ts","../src/utils/getExistingContracts.ts","../src/utils/utils/getChainId.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport path from \"path\";\nimport { MUDError } from \"@latticexyz/common/errors\";\nimport { loadConfig } from \"@latticexyz/config/node\";\nimport { StoreConfig } from \"@latticexyz/store\";\nimport { WorldConfig } from \"@latticexyz/world\";\nimport { deploy } from \"../utils/deploy\";\nimport { forge, getRpcUrl, getSrcDirectory } from \"@latticexyz/common/foundry\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { getExistingContracts } from \"./getExistingContracts\";\nimport { execa } from \"execa\";\nimport { getChainId } from \"./utils/getChainId\";\n\nexport type DeployOptions = {\n configPath?: string;\n printConfig?: boolean;\n profile?: string;\n priorityFeeMultiplier: number;\n clean?: boolean;\n debug?: boolean;\n saveDeployment: boolean;\n rpc?: string;\n worldAddress?: string;\n srcDir?: string;\n disableTxWait: boolean;\n pollInterval: number;\n skipBuild?: boolean;\n};\n\nexport async function deployHandler(args: DeployOptions) {\n args.profile ??= process.env.FOUNDRY_PROFILE;\n const { configPath, printConfig, profile, clean, skipBuild } = args;\n\n const rpc = args.rpc ?? (await getRpcUrl(profile));\n console.log(\n chalk.bgBlue(\n chalk.whiteBright(`\\n Deploying MUD contracts${profile ? \" with profile \" + profile : \"\"} to RPC ${rpc} \\n`)\n )\n );\n\n if (clean) {\n await forge([\"clean\"], { profile });\n }\n\n // Run forge build\n if (!skipBuild) {\n await forge([\"build\", \"--skip\", \"test\", \"script\"], { profile });\n await execa(\"mud\", [\"abi-ts\"], { stdio: \"inherit\" });\n }\n\n // Get a list of all contract names\n const srcDir = args?.srcDir ?? (await getSrcDirectory());\n const existingContractNames = getExistingContracts(srcDir).map(({ basename }) => basename);\n\n // Load the config\n const mudConfig = (await loadConfig(configPath)) as StoreConfig & WorldConfig;\n\n if (printConfig) console.log(chalk.green(\"\\nResolved config:\\n\"), JSON.stringify(mudConfig, null, 2));\n\n const privateKey = process.env.PRIVATE_KEY;\n if (!privateKey)\n throw new MUDError(\n `Missing PRIVATE_KEY environment variable.\nRun 'echo \"PRIVATE_KEY=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\" > .env'\nin your contracts directory to use the default anvil private key.`\n );\n const deploymentInfo = await deploy(mudConfig, existingContractNames, { ...args, rpc, privateKey });\n\n if (args.saveDeployment) {\n // Write deployment result to file (latest and timestamp)\n const chainId = await getChainId(rpc);\n const outputDir = path.join(mudConfig.deploysDirectory, chainId.toString());\n mkdirSync(outputDir, { recursive: true });\n writeFileSync(path.join(outputDir, \"latest.json\"), JSON.stringify(deploymentInfo, null, 2));\n writeFileSync(path.join(outputDir, Date.now() + \".json\"), JSON.stringify(deploymentInfo, null, 2));\n\n const localChains = [1337, 31337];\n const deploys = existsSync(mudConfig.worldsFile) ? JSON.parse(readFileSync(mudConfig.worldsFile, \"utf-8\")) : {};\n deploys[chainId] = {\n address: deploymentInfo.worldAddress,\n // We expect the worlds file to be committed and since local deployments are often a consistent address but different block number, we'll ignore the block number.\n blockNumber: localChains.includes(chainId) ? undefined : deploymentInfo.blockNumber,\n };\n writeFileSync(mudConfig.worldsFile, JSON.stringify(deploys, null, 2));\n\n console.log(\n chalk.bgGreen(chalk.whiteBright(`\\n Deployment result (written to ${mudConfig.worldsFile} and ${outputDir}): \\n`))\n );\n }\n\n console.log(deploymentInfo);\n return deploymentInfo;\n}\n","import chalk from \"chalk\";\nimport path from \"path\";\nimport { ethers } from \"ethers\";\nimport { getOutDirectory, cast, getSrcDirectory, getRemappings } from \"@latticexyz/common/foundry\";\nimport { StoreConfig } from \"@latticexyz/store\";\nimport { WorldConfig, resolveWorldConfig } from \"@latticexyz/world\";\nimport { deployWorldContract } from \"./world\";\nimport IBaseWorldAbi from \"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json\" assert { type: \"json\" };\nimport CoreModuleData from \"@latticexyz/world/out/CoreModule.sol/CoreModule.json\" assert { type: \"json\" };\nimport { defaultModuleContracts } from \"./modules/constants\";\nimport { getInstallModuleCallData } from \"./modules/getInstallModuleCallData\";\nimport { getUserModules } from \"./modules/getUserModules\";\nimport { getGrantAccessCallData } from \"./systems/getGrantAccessCallData\";\nimport { getRegisterFunctionSelectorsCallData } from \"./systems/getRegisterFunctionSelectorsCallData\";\nimport { getRegisterSystemCallData } from \"./systems/getRegisterSystemCallData\";\nimport { getRegisterTableCallData } from \"./tables/getRegisterTableCallData\";\nimport { getTableIds } from \"./tables/getTableIds\";\nimport { confirmNonce } from \"./utils/confirmNonce\";\nimport { deployContract } from \"./utils/deployContract\";\nimport { fastTxExecute } from \"./utils/fastTxExecute\";\nimport { getContractData } from \"./utils/getContractData\";\nimport { postDeploy } from \"./utils/postDeploy\";\nimport { setInternalFeePerGas } from \"./utils/setInternalFeePerGas\";\nimport { ContractCode } from \"./utils/types\";\nimport { resourceIdToHex } from \"@latticexyz/common\";\n\nexport interface DeployConfig {\n profile?: string;\n rpc: string;\n privateKey: string;\n priorityFeeMultiplier: number;\n debug?: boolean;\n worldAddress?: string;\n disableTxWait: boolean;\n pollInterval: number;\n}\n\nexport interface DeploymentInfo {\n blockNumber: number;\n worldAddress: string;\n}\n\nexport async function deploy(\n mudConfig: StoreConfig & WorldConfig,\n existingContractNames: string[],\n deployConfig: DeployConfig\n): Promise<DeploymentInfo> {\n const startTime = Date.now();\n const { profile, rpc, privateKey, priorityFeeMultiplier, debug, worldAddress, disableTxWait, pollInterval } =\n deployConfig;\n const resolvedConfig = resolveWorldConfig(mudConfig, existingContractNames);\n const forgeOutDirectory = await getOutDirectory(profile);\n const remappings = await getRemappings(profile);\n const outputBaseDirectory = path.join(await getSrcDirectory(profile), mudConfig.codegenDirectory);\n\n // Set up signer for deployment\n const provider = new ethers.providers.StaticJsonRpcProvider(rpc);\n provider.pollingInterval = pollInterval;\n const signer = new ethers.Wallet(privateKey, provider);\n console.log(\"Deploying from\", signer.address);\n\n let nonce = await signer.getTransactionCount();\n console.log(\"Initial nonce\", nonce);\n\n const txParams = await setInternalFeePerGas(signer, priorityFeeMultiplier);\n\n const txConfig = {\n ...txParams,\n signer,\n debug: Boolean(debug),\n disableTxWait,\n confirmations: disableTxWait ? 0 : 1,\n };\n\n // Get block number before deploying\n const blockNumber = Number(await cast([\"block-number\", \"--rpc-url\", rpc], { profile }));\n console.log(\"Start deployment at block\", blockNumber);\n\n // Deploy the World contract. Non-blocking.\n const worldPromise: Promise<string> = worldAddress\n ? Promise.resolve(worldAddress)\n : deployWorldContract({\n ...txConfig,\n nonce: nonce++,\n worldContractName: mudConfig.worldContractName,\n forgeOutDirectory,\n });\n\n // Filters any default modules from config\n const userModules = getUserModules(defaultModuleContracts, mudConfig.modules);\n const userModuleContracts = Object.keys(userModules).map((name) => {\n const { abi, bytecode } = getContractData(name, forgeOutDirectory);\n return {\n name,\n abi,\n bytecode,\n } as ContractCode;\n });\n\n const systemContracts = Object.keys(resolvedConfig.systems).map((name) => {\n const { abi, bytecode } = getContractData(name, forgeOutDirectory);\n return {\n name,\n abi,\n bytecode,\n } as ContractCode;\n });\n\n const contracts: ContractCode[] = [\n {\n name: \"CoreModule\",\n abi: CoreModuleData.abi,\n bytecode: CoreModuleData.bytecode,\n },\n ...defaultModuleContracts,\n ...userModuleContracts,\n ...systemContracts,\n ];\n\n // Deploy the System and Module contracts\n const deployedContracts = contracts.reduce<Record<string, Promise<string>>>((acc, contract) => {\n acc[contract.name] = deployContract({\n ...txConfig,\n nonce: nonce++,\n contract,\n });\n return acc;\n }, {});\n\n // Wait for world to be deployed\n const deployedWorldAddress = await worldPromise;\n const worldContract = new ethers.Contract(deployedWorldAddress, IBaseWorldAbi);\n\n // If an existing World is passed assume its coreModule is already installed - blocking to install if not\n if (!worldAddress) {\n console.log(chalk.blue(\"Installing CoreModule\"));\n await fastTxExecute({\n ...txConfig,\n nonce: nonce++,\n contract: worldContract,\n func: \"initialize\",\n args: [await deployedContracts[\"CoreModule\"]],\n });\n console.log(chalk.green(\"Installed CoreModule\"));\n }\n\n if (mudConfig.namespace) {\n console.log(chalk.blue(\"Registering Namespace\"));\n await fastTxExecute({\n ...txConfig,\n nonce: nonce++,\n contract: worldContract,\n func: \"registerNamespace\",\n args: [resourceIdToHex({ type: \"namespace\", namespace: mudConfig.namespace, name: \"\" })],\n });\n console.log(chalk.green(\"Namespace registered\"));\n }\n\n const tableIds = getTableIds(mudConfig);\n\n const registerTableCalls = Object.values(mudConfig.tables).map((table) =>\n getRegisterTableCallData(table, mudConfig, outputBaseDirectory, remappings)\n );\n\n console.log(chalk.blue(\"Registering tables\"));\n await Promise.all(\n registerTableCalls.map((call) =>\n fastTxExecute({\n ...txConfig,\n nonce: nonce++,\n contract: worldContract,\n ...call,\n })\n )\n );\n console.log(chalk.green(`Tables registered`));\n\n console.log(chalk.blue(\"Registering Systems and Functions\"));\n const systemCalls = await Promise.all(\n Object.entries(resolvedConfig.systems).map(([systemKey, system]) =>\n getRegisterSystemCallData({\n systemContracts: deployedContracts,\n systemKey,\n system,\n namespace: mudConfig.namespace,\n })\n )\n );\n const functionCalls = Object.entries(resolvedConfig.systems).flatMap(([systemKey, system]) =>\n getRegisterFunctionSelectorsCallData({\n systemContractName: systemKey,\n system,\n namespace: mudConfig.namespace,\n forgeOutDirectory,\n })\n );\n await Promise.all(\n [...systemCalls, ...functionCalls].map((call) =>\n fastTxExecute({\n ...txConfig,\n nonce: nonce++,\n contract: worldContract,\n ...call,\n })\n )\n );\n console.log(chalk.green(`Systems and Functions registered`));\n\n // Wait for System access to be granted before installing modules\n const grantCalls = await getGrantAccessCallData({\n systems: Object.values(resolvedConfig.systems),\n systemContracts: deployedContracts,\n namespace: mudConfig.namespace,\n });\n\n console.log(chalk.blue(\"Granting Access\"));\n await Promise.all(\n grantCalls.map((call) =>\n fastTxExecute({\n ...txConfig,\n nonce: nonce++,\n contract: worldContract,\n ...call,\n })\n )\n );\n console.log(chalk.green(`Access granted`));\n\n const moduleCalls = await Promise.all(\n mudConfig.modules.map((m) => getInstallModuleCallData(deployedContracts, m, tableIds))\n );\n\n console.log(chalk.blue(\"Installing User Modules\"));\n await Promise.all(\n moduleCalls.map((call) =>\n fastTxExecute({\n ...txConfig,\n nonce: nonce++,\n contract: worldContract,\n ...call,\n })\n )\n );\n console.log(chalk.green(`User Modules Installed`));\n\n // Double check that all transactions have been included by confirming the current nonce is the expected nonce\n await confirmNonce(signer, nonce, pollInterval);\n\n await postDeploy(mudConfig.postDeployScript, deployedWorldAddress, rpc, profile);\n\n console.log(chalk.green(\"Deployment completed in\", (Date.now() - startTime) / 1000, \"seconds\"));\n\n return { worldAddress: deployedWorldAddress, blockNumber };\n}\n","import chalk from \"chalk\";\n\nimport WorldData from \"@latticexyz/world/out/World.sol/World.json\" assert { type: \"json\" };\nimport IBaseWorldAbi from \"@latticexyz/world/out/IBaseWorld.sol/IBaseWorld.abi.json\" assert { type: \"json\" };\nimport { deployContract } from \"./utils/deployContract\";\nimport { getContractData } from \"./utils/getContractData\";\nimport { TxConfig } from \"./utils/types\";\n\nexport async function deployWorldContract(\n ip: TxConfig & {\n nonce: number;\n worldContractName: string | undefined;\n forgeOutDirectory: string;\n }\n): Promise<string> {\n console.log(chalk.blue(`Deploying World`));\n const contractData = ip.worldContractName\n ? {\n name: \"World\",\n ...getContractData(ip.worldContractName, ip.forgeOutDirectory),\n }\n : { abi: IBaseWorldAbi, bytecode: WorldData.bytecode, name: \"World\" };\n return deployContract({\n ...ip,\n nonce: ip.nonce,\n contract: contractData,\n });\n}\n","import chalk from \"chalk\";\nimport { ethers } from \"ethers\";\nimport { MUDError } from \"@latticexyz/common/errors\";\nimport { TxConfig, ContractCode } from \"./types\";\n\nexport async function deployContract(input: TxConfig & { nonce: number; contract: ContractCode }): Promise<string> {\n const { signer, nonce, maxPriorityFeePerGas, maxFeePerGas, debug, gasPrice, confirmations, contract } = input;\n\n try {\n const factory = new ethers.ContractFactory(contract.abi, contract.bytecode, signer);\n console.log(chalk.gray(`executing deployment of ${contract.name} with nonce ${nonce}`));\n const deployPromise = factory\n .deploy({\n nonce,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gasPrice,\n })\n .then((c) => (confirmations ? c : c.deployed()));\n const { address } = await deployPromise;\n console.log(chalk.green(\"Deployed\", contract.name, \"to\", address));\n return address;\n } catch (error: any) {\n if (debug) console.error(error);\n if (error?.message.includes(\"invalid bytecode\")) {\n throw new MUDError(\n `Error deploying ${contract.name}: invalid bytecode. Note that linking of public libraries is not supported yet, make sure none of your libraries use \"external\" functions.`\n );\n } else if (error?.message.includes(\"CreateContractLimit\")) {\n throw new MUDError(`Error deploying ${contract.name}: CreateContractLimit exceeded.`);\n } else throw error;\n }\n}\n","import { readFileSync } from \"fs\";\nimport path from \"path\";\nimport { Fragment } from \"ethers/lib/utils.js\";\nimport { MUDError } from \"@latticexyz/common/errors\";\n\n/**\n * Load the contract's abi and bytecode from the file system\n * @param contractName: Name of the contract to load\n */\nexport function getContractData(\n contractName: string,\n forgeOutDirectory: string\n): { bytecode: string; abi: Fragment[] } {\n let data: any;\n const contractDataPath = path.join(forgeOutDirectory, contractName + \".sol\", contractName + \".json\");\n try {\n data = JSON.parse(readFileSync(contractDataPath, \"utf8\"));\n } catch (error: any) {\n throw new MUDError(`Error reading file at ${contractDataPath}`);\n }\n\n const bytecode = data?.bytecode?.object;\n if (!bytecode) throw new MUDError(`No bytecode found in ${contractDataPath}`);\n\n const abi = data?.abi;\n if (!abi) throw new MUDError(`No ABI found in ${contractDataPath}`);\n\n return { abi, bytecode };\n}\n","import KeysWithValueModuleData from \"@latticexyz/world-modules/out/KeysWithValueModule.sol/KeysWithValueModule.json\" assert { type: \"json\" };\nimport KeysInTableModuleData from \"@latticexyz/world-modules/out/KeysInTableModule.sol/KeysInTableModule.json\" assert { type: \"json\" };\nimport UniqueEntityModuleData from \"@latticexyz/world-modules/out/UniqueEntityModule.sol/UniqueEntityModule.json\" assert { type: \"json\" };\nimport { ContractCode } from \"../utils/types\";\n\n// These modules are always deployed\nexport const defaultModuleContracts: ContractCode[] = [\n {\n name: \"KeysWithValueModule\",\n abi: KeysWithValueModuleData.abi,\n bytecode: KeysWithValueModuleData.bytecode,\n },\n {\n name: \"KeysInTableModule\",\n abi: KeysInTableModuleData.abi,\n bytecode: KeysInTableModuleData.bytecode,\n },\n {\n name: \"UniqueEntityModule\",\n abi: UniqueEntityModuleData.abi,\n bytecode: UniqueEntityModuleData.bytecode,\n },\n];\n","import { defaultAbiCoder } from \"ethers/lib/utils.js\";\nimport { resolveWithContext } from \"@latticexyz/config\";\nimport { Module } from \"./types\";\nimport { CallData } from \"../utils/types\";\nimport { TableIds } from \"../tables/types\";\n\nexport async function getInstallModuleCallData(\n moduleContracts: Record<string, Promise<string>>,\n module: Module,\n tableIds: TableIds\n): Promise<CallData> {\n const moduleAddress = await moduleContracts[module.name];\n if (!moduleAddress) throw new Error(`Module ${module.name} not found`);\n // Resolve arguments\n const resolvedArgs = module.args.map((arg) =>\n resolveWithContext(arg, {\n tableIds,\n })\n );\n const values = resolvedArgs.map((arg) => arg.value);\n const types = resolvedArgs.map((arg) => arg.type);\n\n return {\n func: module.root ? \"installRootModule\" : \"installModule\",\n args: [moduleAddress, defaultAbiCoder.encode(types, values)],\n };\n}\n","import { Module } from \"./types\";\n\nexport function getUserModules(defaultModules: { name: string }[], configModules: Module[]): Omit<Module, \"address\">[] {\n return configModules.filter((module) => !defaultModules.some((m) => m.name === module.name));\n}\n","import { System } from \"./types\";\nimport { CallData } from \"../utils/types\";\nimport { resourceIdToHex } from \"@latticexyz/common\";\n\nexport async function getGrantAccessCallData(input: {\n systems: System[];\n systemContracts: Record<string, Promise<string>>;\n namespace: string;\n}): Promise<CallData[]> {\n const { systems, namespace, systemContracts } = input;\n const calls: CallData[] = [];\n for (const { name, accessListAddresses, accessListSystems } of systems) {\n // Grant access to addresses\n accessListAddresses.map(async (address) => calls.push(getGrantSystemAccessCallData(name, namespace, address)));\n\n // Grant access to other systems\n accessListSystems.map(async (granteeSystem) =>\n calls.push(getGrantSystemAccessCallData(name, namespace, await systemContracts[granteeSystem]))\n );\n }\n return calls;\n}\n\nfunction getGrantSystemAccessCallData(name: string, namespace: string, address: string): CallData {\n return {\n func: \"grantAccess\",\n args: [resourceIdToHex({ type: \"system\", namespace, name }), address],\n };\n}\n","import { resourceIdToHex } from \"@latticexyz/common\";\nimport { System } from \"./types\";\nimport { loadFunctionSignatures, toFunctionSelector } from \"./utils\";\nimport { CallData } from \"../utils/types\";\n\nexport function getRegisterFunctionSelectorsCallData(input: {\n systemContractName: string;\n system: System;\n namespace: string;\n forgeOutDirectory: string;\n}): CallData[] {\n // Register system at route\n const callData: CallData[] = [];\n const { systemContractName, namespace, forgeOutDirectory, system } = input;\n\n if (system.registerFunctionSelectors) {\n const baseSystemFunctionSignatures = loadFunctionSignatures(\"System\", forgeOutDirectory);\n const systemFunctionSignatures = loadFunctionSignatures(systemContractName, forgeOutDirectory).filter(\n (functionSignature) =>\n systemContractName === \"System\" || !baseSystemFunctionSignatures.includes(functionSignature)\n );\n const isRoot = namespace === \"\";\n for (const systemFunctionSignature of systemFunctionSignatures) {\n callData.push(\n getRegisterFunctionSelectorCallData({\n namespace,\n name: system.name,\n systemFunctionSignature,\n isRoot,\n })\n );\n }\n }\n return callData;\n}\n\nfunction getRegisterFunctionSelectorCallData(input: {\n namespace: string;\n name: string;\n systemFunctionSignature: string;\n isRoot: boolean;\n}): CallData {\n const { namespace, name, systemFunctionSignature, isRoot } = input;\n\n if (isRoot) {\n const functionSelector = toFunctionSelector(systemFunctionSignature);\n return {\n func: \"registerRootFunctionSelector\",\n args: [resourceIdToHex({ type: \"system\", namespace, name }), systemFunctionSignature, functionSelector],\n };\n } else {\n return {\n func: \"registerFunctionSelector\",\n args: [resourceIdToHex({ type: \"system\", namespace, name }), systemFunctionSignature],\n };\n }\n}\n","import { ethers } from \"ethers\";\nimport { ParamType } from \"ethers/lib/utils.js\";\nimport { getContractData } from \"../utils/getContractData\";\n\nexport function loadFunctionSignatures(contractName: string, forgeOutDirectory: string): string[] {\n const { abi } = getContractData(contractName, forgeOutDirectory);\n\n return abi\n .filter((item) => [\"fallback\", \"function\"].includes(item.type))\n .map((item) => {\n return `${item.name}${parseComponents(item.inputs)}`;\n });\n}\n\n// TODO: move this to utils as soon as utils are usable inside cli\n// (see https://github.com/latticexyz/mud/issues/499)\nexport function toFunctionSelector(functionSignature: string): string {\n return sigHash(functionSignature);\n}\n\n/**\n * Recursively turn (nested) structs in signatures into tuples\n */\nfunction parseComponents(params: ParamType[]): string {\n const components = params.map((param) => {\n const tupleMatch = param.type.match(/tuple(.*)/);\n if (tupleMatch) {\n // there can be arrays of tuples,\n // `tupleMatch[1]` preserves the array brackets (or is empty string for non-arrays)\n return parseComponents(param.components) + tupleMatch[1];\n } else {\n return param.type;\n }\n });\n return `(${components})`;\n}\n\n// TODO: move this to utils as soon as utils are usable inside cli\n// (see https://github.com/latticexyz/mud/issues/499)\nfunction sigHash(signature: string) {\n return ethers.utils.hexDataSlice(ethers.utils.keccak256(ethers.utils.toUtf8Bytes(signature)), 0, 4);\n}\n","import { resourceIdToHex } from \"@latticexyz/common\";\nimport { System } from \"./types\";\nimport { CallData } from \"../utils/types\";\n\nexport async function getRegisterSystemCallData(input: {\n systemContracts: Record<string, Promise<string>>;\n systemKey: string;\n system: System;\n namespace: string;\n}): Promise<CallData> {\n const { namespace, systemContracts, systemKey, system } = input;\n const systemAddress = await systemContracts[systemKey];\n return {\n func: \"registerSystem\",\n args: [resourceIdToHex({ type: \"system\", namespace, name: system.name }), systemAddress, system.openAccess],\n };\n}\n","import { encodeSchema, getStaticByteLength } from \"@latticexyz/schema-type/deprecated\";\nimport { StoreConfig } from \"@latticexyz/store\";\nimport { resolveAbiOrUserType } from \"@latticexyz/store/codegen\";\nimport { resourceIdToHex } from \"@latticexyz/common\";\nimport { Table } from \"./types\";\nimport { fieldLayoutToHex } from \"@latticexyz/protocol-parser\";\nimport { CallData } from \"../utils/types\";\nimport { loadAndExtractUserTypes } from \"@latticexyz/common/codegen\";\n\nexport function getRegisterTableCallData(\n table: Table,\n storeConfig: StoreConfig,\n outputBaseDirectory: string,\n remappings: [string, string][]\n): CallData {\n const { name, valueSchema, keySchema } = table;\n if (!name) throw Error(\"Table missing name\");\n\n const solidityUserTypes = loadAndExtractUserTypes(storeConfig.userTypes, outputBaseDirectory, remappings);\n\n const schemaTypes = Object.values(valueSchema).map((abiOrUserType) => {\n const { schemaType } = resolveAbiOrUserType(abiOrUserType, storeConfig, solidityUserTypes);\n return schemaType;\n });\n\n const schemaTypeLengths = schemaTypes.map((schemaType) => getStaticByteLength(schemaType));\n const fieldLayout = {\n staticFieldLengths: schemaTypeLengths.filter((schemaTypeLength) => schemaTypeLength > 0),\n numDynamicFields: schemaTypeLengths.filter((schemaTypeLength) => schemaTypeLength === 0).length,\n };\n\n const keyTypes = Object.values(keySchema).map((abiOrUserType) => {\n const { schemaType } = resolveAbiOrUserType(abiOrUserType, storeConfig, solidityUserTypes);\n return schemaType;\n });\n\n return {\n func: \"registerTable\",\n args: [\n // TODO: add support for table namespaces (https://github.com/latticexyz/mud/issues/994)\n resourceIdToHex({ type: table.offchainOnly ? \"offchainTable\" : \"table\", namespace: storeConfig.namespace, name }),\n fieldLayoutToHex(fieldLayout),\n encodeSchema(keyTypes),\n encodeSchema(schemaTypes),\n Object.keys(keySchema),\n Object.keys(valueSchema),\n ],\n };\n}\n","import { StoreConfig } from \"@latticexyz/store\";\nimport { TableIds } from \"./types\";\nimport { resourceIdToHex } from \"@latticexyz/common\";\nimport { hexToBytes } from \"viem\";\n\nexport function getTableIds(storeConfig: StoreConfig): TableIds {\n const tableIds: TableIds = {};\n for (const [tableName, { name, offchainOnly }] of Object.entries(storeConfig.tables)) {\n tableIds[tableName] = hexToBytes(\n resourceIdToHex({\n type: offchainOnly ? \"offchainTable\" : \"table\",\n namespace: storeConfig.namespace,\n name,\n })\n );\n }\n return tableIds;\n}\n","import chalk from \"chalk\";\nimport { Wallet } from \"ethers\";\nimport { MUDError } from \"@latticexyz/common/errors\";\n\nexport async function confirmNonce(signer: Wallet, nonce: number, pollInterval: number): Promise<void> {\n let remoteNonce = await signer.getTransactionCount();\n let retryCount = 0;\n const maxRetries = 100;\n while (remoteNonce !== nonce && retryCount < maxRetries) {\n console.log(\n chalk.gray(\n `Waiting for transactions to be included before executing postDeployScript (local nonce: ${nonce}, remote nonce: ${remoteNonce}, retry number ${retryCount}/${maxRetries})`\n )\n );\n await new Promise((resolve) => setTimeout(resolve, pollInterval));\n retryCount++;\n remoteNonce = await signer.getTransactionCount();\n }\n if (remoteNonce !== nonce) {\n throw new MUDError(\n \"Remote nonce doesn't match local nonce, indicating that not all deploy transactions were included.\"\n );\n }\n}\n","import chalk from \"chalk\";\nimport { TransactionReceipt, TransactionResponse } from \"@ethersproject/providers\";\nimport { MUDError } from \"@latticexyz/common/errors\";\nimport { TxConfig } from \"./types\";\n\n/**\n * Only await gas estimation (for speed), only execute if gas estimation succeeds (for safety)\n */\nexport async function fastTxExecute<\n C extends { connect: any; estimateGas: any; [key: string]: any },\n F extends keyof C\n>(\n input: TxConfig & {\n nonce: number;\n contract: C;\n func: F;\n args: Parameters<C[F]>;\n confirmations: number;\n }\n): Promise<TransactionResponse | TransactionReceipt> {\n const {\n func,\n args,\n contract,\n signer,\n nonce,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gasPrice,\n confirmations = 1,\n debug,\n } = input;\n const functionName = `${func as string}(${args.map((arg) => `'${arg}'`).join(\",\")})`;\n try {\n const contractWithSigner = contract.connect(signer);\n const gasLimit = await contractWithSigner.estimateGas[func].apply(null, args);\n console.log(chalk.gray(`executing transaction: ${functionName} with nonce ${nonce}`));\n return contractWithSigner[func]\n .apply(null, [\n ...args,\n {\n gasLimit,\n nonce: nonce,\n maxPriorityFeePerGas: maxPriorityFeePerGas,\n maxFeePerGas: maxFeePerGas,\n gasPrice: gasPrice,\n },\n ])\n .then((tx: TransactionResponse) => {\n return confirmations === 0 ? tx : tx.wait(confirmations);\n });\n } catch (error: any) {\n if (debug) console.error(error);\n throw new MUDError(`Gas estimation error for ${functionName}: ${error?.reason}`);\n }\n}\n","import { existsSync } from \"fs\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport { getScriptDirectory, forge } from \"@latticexyz/common/foundry\";\n\nexport async function postDeploy(\n postDeployScript: string,\n worldAddress: string,\n rpc: string,\n profile: string | undefined\n): Promise<void> {\n // Execute postDeploy forge script\n const postDeployPath = path.join(await getScriptDirectory(), postDeployScript + \".s.sol\");\n if (existsSync(postDeployPath)) {\n console.log(chalk.blue(`Executing post deploy script at ${postDeployPath}`));\n await forge(\n [\"script\", postDeployScript, \"--sig\", \"run(address)\", worldAddress, \"--broadcast\", \"--rpc-url\", rpc, \"-vvv\"],\n {\n profile: profile,\n }\n );\n } else {\n console.log(`No script at ${postDeployPath}, skipping post deploy hook`);\n }\n}\n","import { BigNumber, Wallet } from \"ethers\";\nimport { MUDError } from \"@latticexyz/common/errors\";\n\n/**\n * Set the maxFeePerGas and maxPriorityFeePerGas based on the current base fee and the given multiplier.\n * The multiplier is used to allow replacing pending transactions.\n * @param multiplier Multiplier to apply to the base fee\n */\nexport async function setInternalFeePerGas(\n signer: Wallet,\n multiplier: number\n): Promise<{\n maxPriorityFeePerGas: number | undefined;\n maxFeePerGas: BigNumber | undefined;\n gasPrice: BigNumber | undefined;\n}> {\n // Compute maxFeePerGas and maxPriorityFeePerGas like ethers, but allow for a multiplier to allow replacing pending transactions\n const feeData = await signer.provider.getFeeData();\n let maxPriorityFeePerGas: number | undefined;\n let maxFeePerGas: BigNumber | undefined;\n let gasPrice: BigNumber | undefined;\n\n if (feeData.lastBaseFeePerGas) {\n if (!feeData.lastBaseFeePerGas.eq(0) && (await signer.getBalance()).eq(0)) {\n throw new MUDError(`Attempting to deploy to a chain with non-zero base fee with an account that has no balance.\n If you're deploying to the Lattice testnet, you can fund your account by running 'pnpm mud faucet --address ${await signer.getAddress()}'`);\n }\n\n // Set the priority fee to 0 for development chains with no base fee, to allow transactions from unfunded wallets\n maxPriorityFeePerGas = feeData.lastBaseFeePerGas.eq(0) ? 0 : Math.floor(1_500_000_000 * multiplier);\n maxFeePerGas = feeData.lastBaseFeePerGas.mul(2).add(maxPriorityFeePerGas);\n } else if (feeData.gasPrice) {\n // Legacy chains with gasPrice instead of maxFeePerGas\n if (!feeData.gasPrice.eq(0) && (await signer.getBalance()).eq(0)) {\n throw new MUDError(\n `Attempting to deploy to a chain with non-zero gas price with an account that has no balance.`\n );\n }\n\n gasPrice = feeData.gasPrice;\n } else {\n throw new MUDError(\"Can not fetch fee data from RPC\");\n }\n return {\n maxPriorityFeePerGas,\n maxFeePerGas,\n gasPrice,\n };\n}\n","import glob from \"glob\";\nimport { basename } from \"path\";\n\n/**\n * Get a list of all contract paths/names within the provided src directory\n */\nexport function getExistingContracts(srcDir: string) {\n return glob.sync(`${srcDir}/**/*.sol`).map((path) => ({\n path,\n basename: basename(path, \".sol\"),\n }));\n}\n","import { ethers } from \"ethers\";\n\n// TODO: Use viem's getChainId\nexport async function getChainId(rpc: string) {\n const { result: chainId } = await ethers.utils.fetchJson(\n rpc,\n '{ \"id\": 42, \"jsonrpc\": \"2.0\", \"method\": \"eth_chainId\", \"params\": [ ] }'\n );\n return Number(chainId);\n}\n"],"mappings":"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","names":["chalk","path","MUDError","loadConfig","chalk","path","ethers","getOutDirectory","cast","getSrcDirectory","getRemappings","resolveWorldConfig","chalk","WorldData","IBaseWorldAbi","chalk","ethers","MUDError","deployContract","input","signer","nonce","maxPriorityFeePerGas","maxFeePerGas","debug","gasPrice","confirmations","contract","factory","deployPromise","c","address","error","readFileSync","path","MUDError","getContractData","contractName","forgeOutDirectory","data","contractDataPath","bytecode","abi","deployWorldContract","ip","chalk","contractData","getContractData","IBaseWorldAbi","WorldData","deployContract","IBaseWorldAbi","CoreModuleData","KeysWithValueModuleData","KeysInTableModuleData","UniqueEntityModuleData","defaultModuleContracts","defaultAbiCoder","resolveWithContext","getInstallModuleCallData","moduleContracts","module","tableIds","moduleAddress","resolvedArgs","arg","values","types","getUserModules","defaultModules","configModules","module","m","resourceIdToHex","getGrantAccessCallData","input","systems","namespace","systemContracts","calls","name","accessListAddresses","accessListSystems","address","getGrantSystemAccessCallData","granteeSystem","resourceIdToHex","ethers","loadFunctionSignatures","contractName","forgeOutDirectory","abi","getContractData","item","parseComponents","toFunctionSelector","functionSignature","sigHash","params","param","tupleMatch","signature","ethers","getRegisterFunctionSelectorsCallData","input","callData","systemContractName","namespace","forgeOutDirectory","system","baseSystemFunctionSignatures","loadFunctionSignatures","systemFunctionSignatures","functionSignature","isRoot","systemFunctionSignature","getRegisterFunctionSelectorCallData","name","functionSelector","toFunctionSelector","resourceIdToHex","resourceIdToHex","getRegisterSystemCallData","input","namespace","systemContracts","systemKey","system","systemAddress","encodeSchema","getStaticByteLength","resolveAbiOrUserType","resourceIdToHex","fieldLayoutToHex","loadAndExtractUserTypes","getRegisterTableCallData","table","storeConfig","outputBaseDirectory","remappings","name","valueSchema","keySchema","solidityUserTypes","schemaTypes","abiOrUserType","schemaType","schemaTypeLengths","fieldLayout","schemaTypeLength","keyTypes","resourceIdToHex","hexToBytes","getTableIds","storeConfig","tableIds","tableName","name","offchainOnly","chalk","MUDError","confirmNonce","signer","nonce","pollInterval","remoteNonce","retryCount","maxRetries","resolve","chalk","MUDError","fastTxExecute","input","func","args","contract","signer","nonce","maxPriorityFeePerGas","maxFeePerGas","gasPrice","confirmations","debug","functionName","arg","contractWithSigner","gasLimit","tx","error","existsSync","path","chalk","getScriptDirectory","forge","postDeploy","postDeployScript","worldAddress","rpc","profile","postDeployPath","MUDError","setInternalFeePerGas","signer","multiplier","feeData","maxPriorityFeePerGas","maxFeePerGas","gasPrice","resourceIdToHex","deploy","mudConfig","existingContractNames","deployConfig","startTime","profile","rpc","privateKey","priorityFeeMultiplier","debug","worldAddress","disableTxWait","pollInterval","resolvedConfig","resolveWorldConfig","forgeOutDirectory","getOutDirectory","remappings","getRemappings","outputBaseDirectory","path","getSrcDirectory","provider","ethers","signer","nonce","txConfig","setInternalFeePerGas","blockNumber","cast","worldPromise","deployWorldContract","userModules","getUserModules","defaultModuleContracts","userModuleContracts","name","abi","bytecode","getContractData","systemContracts","deployedContracts","CoreModuleData","acc","contract","deployContract","deployedWorldAddress","worldContract","IBaseWorldAbi","chalk","fastTxExecute","tableIds","getTableIds","registerTableCalls","table","getRegisterTableCallData","call","systemCalls","systemKey","system","getRegisterSystemCallData","functionCalls","getRegisterFunctionSelectorsCallData","grantCalls","getGrantAccessCallData","moduleCalls","m","getInstallModuleCallData","confirmNonce","postDeploy","forge","getRpcUrl","getSrcDirectory","existsSync","mkdirSync","readFileSync","writeFileSync","glob","basename","getExistingContracts","srcDir","path","execa","ethers","getChainId","rpc","chainId","deployHandler","args","configPath","printConfig","profile","clean","skipBuild","rpc","getRpcUrl","chalk","forge","execa","srcDir","getSrcDirectory","existingContractNames","getExistingContracts","basename","mudConfig","loadConfig","privateKey","MUDError","deploymentInfo","deploy","chainId","getChainId","outputDir","path","mkdirSync","writeFileSync","localChains","deploys","existsSync","readFileSync"]}