(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2621],{9408:function(e,s,r){(window.__NEXT_P=window.__NEXT_P||[]).push(["/world/systems",function(){return r(7884)}])},2588:function(e,s){"use strict";s.Z={src:"/_next/static/media/world-table.39df342f.svg",height:1080,width:1920,blurWidth:0,blurHeight:0}},8986:function(e,s,r){"use strict";r.d(s,{C:function(){return i}});var n=r(7505),l=r(7765),t=r(4737),o=r.n(t);function i(e){let{children:s}=e,r=(0,l.useRef)(null),[t,i]=(0,l.useState)(!0);return(0,l.useEffect)(()=>{if(!r.current)return;let e=Array.from(r.current.querySelectorAll(".line")),s=[];e.forEach((e,r)=>{e.matches(".highlighted")&&s.push(r),/^\s+$/g.test(e.innerHTML)&&e.setAttribute("data-empty","")}),s.length&&e.forEach((e,r)=>{let n=s.reduce((e,s)=>Math.min(e,Math.abs(s-r)),1/0);e.setAttribute("data-highlight-distance",Math.min(n,4).toString())})},[t]),(0,n.jsx)("div",{ref:r,style:{marginTop:"1.5rem"},className:t?o().collapsed:o().expanded,onClick:e=>{e.target instanceof Element&&e.target.closest(".line")&&i(!t)},children:s})}},3307:function(e,s,r){"use strict";r.d(s,{Z:function(){return o}});var n=r(7505),l=r(1689);let t={logo:function(){return(0,n.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"0.25em",fontSize:"32px",fontFamily:"PP Supply Mono",textTransform:"uppercase"},children:[(0,n.jsx)("img",{src:"/images/logos/mud-white.svg",style:{height:"calc(var(--nextra-navbar-height) - 35px)"},alt:"MUD logo"}),"MUD"]})},useNextSeoProps(){let{asPath:e}=(0,l.useRouter)();return{titleTemplate:"/"===e?"MUD – a framework for ambitious Ethereum applications":"%s – MUD"}},project:{link:"https://github.com/latticexyz/mud"},docsRepositoryBase:"https://github.com/latticexyz/mud/tree/main/docs",head:(0,n.jsx)(n.Fragment,{children:(0,n.jsx)("meta",{property:"title",content:"MUD documentation"})}),darkMode:!1,nextThemes:{defaultTheme:"dark"},footer:{text:"MIT 2023 \xa9 MUD"},primaryHue:28,sidebar:{defaultMenuCollapseLevel:1}};var o=t},2824:function(e,s,r){"use strict";var n=r(7505),l=r(6736),t=r(8823),o=r.n(t),i=r(2588);function c(e){let s=Object.assign({p:"p",ol:"ol",li:"li",code:"code",a:"a"},(0,l.ah)(),e.components);return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.p,{children:(0,n.jsx)(o(),{alt:"Interaction between the World, a System, and a table",src:i.Z})}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:["An account calls a function called ",(0,n.jsx)(s.code,{children:"game__myFunc"})," on the ",(0,n.jsx)(s.code,{children:"World"}),".\n",(0,n.jsx)(s.a,{href:"./function-selectors",children:"This function was registered"})," by the owner of the ",(0,n.jsx)(s.code,{children:"game"})," namespace and points to the ",(0,n.jsx)(s.code,{children:"myFunc"})," function in one of the ",(0,n.jsx)(s.code,{children:"System"}),"s in the ",(0,n.jsx)(s.code,{children:"namespace"})," namespace."]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.code,{children:"World"})," verifies that access is permitted (for example, because ",(0,n.jsx)(s.code,{children:"game:System"})," is publicly accessible) and if so calls ",(0,n.jsx)(s.code,{children:"myFunc"})," on the ",(0,n.jsx)(s.code,{children:"game:System"})," contract with the provided parameters."]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:["At some point in its execution ",(0,n.jsx)(s.code,{children:"myFunc"})," decides to update the data in the table ",(0,n.jsx)(s.code,{children:"game:Items"}),".\nAs with all other tables, this table is stored in the ",(0,n.jsx)(s.code,{children:"World"}),"'s storage.\nTo modify it, ",(0,n.jsx)(s.code,{children:"function"})," calls a function on the ",(0,n.jsx)(s.code,{children:"World"})," contract."]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.code,{children:"World"})," verifies that access is permitted (by default it would be, because ",(0,n.jsx)(s.code,{children:"game:System"})," has access to the ",(0,n.jsx)(s.code,{children:"game"})," namespace).\nIf so, it modifies the data in the ",(0,n.jsx)(s.code,{children:"game:Items"})," table."]}),"\n"]}),"\n"]})]})}s.Z=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:s}=Object.assign({},(0,l.ah)(),e.components);return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},7884:function(e,s,r){"use strict";r.r(s);var n=r(7505),l=r(2585),t=r(6252),o=r(3307);r(4693);var i=r(6736);r(8823);var c=r(2824),a=r(8986);let d={MDXContent:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:s}=Object.assign({},(0,i.ah)(),e.components);return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(h,{...e})}):h(e)},pageOpts:{filePath:"pages/world/systems.mdx",route:"/world/systems",headings:[{depth:1,value:"Systems",id:"systems"},{depth:2,value:"Calling systems",id:"calling-systems"},{depth:3,value:"Using call",id:"using-call"},{depth:2,value:"Writing systems",id:"writing-systems"},{depth:3,value:"Calling one System from another",id:"calling-one-system-from-another"},{depth:4,value:"Calling from a root System",id:"calling-from-a-root-system"},{depth:2,value:"Registering systems",id:"registering-systems"},{depth:3,value:"Upgrading systems",id:"upgrading-systems"},{depth:2,value:"Access control",id:"access-control"},{depth:2,value:"Root systems",id:"root-systems"}],pageMap:[{kind:"Meta",data:{introduction:{title:"What is MUD?",theme:{breadcrumb:!1}},quickstart:{title:"Get started",theme:{breadcrumb:!1}},protocol:{title:"Protocol",type:"separator"},store:"Store",world:"World",framework:{title:"Framework",type:"separator"},config:"Config",cli:"CLI","state-query":"State Query",services:"Services","---":{title:"",type:"separator"},guides:"Guides",templates:"Templates",contribute:{title:"Contribute",theme:{breadcrumb:!1}},changelog:"Changelog",retrospectives:"Retrospectives",version:{title:"2.0.0-next.17",type:"menu",items:{changelog:{title:"Changelog",href:"/changelog"},contribute:{title:"Contribute",href:"/contribute"}}},status:{title:"Status",type:"page",href:"https://status.mud.dev",newWindow:!0},community:{title:"Community",type:"page",href:"https://community.mud.dev",newWindow:!0},twitter:{title:"Twitter",type:"page",href:"https://twitter.com/latticexyz",newWindow:!0},discord:{title:"Discord",type:"page",href:"https://lattice.xyz/discord",newWindow:!0}}},{kind:"MdxPage",name:"changelog",route:"/changelog"},{kind:"Folder",name:"cli",route:"/cli",children:[{kind:"Meta",data:{tablegen:"mud tablegen",worldgen:"mud worldgen",test:"mud test",deploy:"mud deploy","dev-contracts":"mud dev-contracts","abi-ts":"mud abi-ts",faucet:"mud faucet","set-version":"mud set-version"}},{kind:"MdxPage",name:"abi-ts",route:"/cli/abi-ts"},{kind:"MdxPage",name:"deploy",route:"/cli/deploy"},{kind:"MdxPage",name:"dev-contracts",route:"/cli/dev-contracts"},{kind:"MdxPage",name:"faucet",route:"/cli/faucet"},{kind:"MdxPage",name:"set-version",route:"/cli/set-version"},{kind:"MdxPage",name:"tablegen",route:"/cli/tablegen"},{kind:"MdxPage",name:"test",route:"/cli/test"},{kind:"MdxPage",name:"worldgen",route:"/cli/worldgen"}]},{kind:"MdxPage",name:"config",route:"/config"},{kind:"MdxPage",name:"contribute",route:"/contribute"},{kind:"Folder",name:"guides",route:"/guides",children:[{kind:"Meta",data:{"replicating-onchain-state":"Replicating onchain state","hello-world":"Hello World","extending-a-world":"Extending a World",emojimon:"Emojimon"}},{kind:"Folder",name:"emojimon",route:"/guides/emojimon",children:[{kind:"MdxPage",name:"1-preface-the-ecs-model",route:"/guides/emojimon/1-preface-the-ecs-model"},{kind:"MdxPage",name:"2-getting-started",route:"/guides/emojimon/2-getting-started"},{kind:"MdxPage",name:"3-players-and-movement",route:"/guides/emojimon/3-players-and-movement"},{kind:"MdxPage",name:"4-map-and-terrain",route:"/guides/emojimon/4-map-and-terrain"},{kind:"MdxPage",name:"5-a-wild-emojimon-appears",route:"/guides/emojimon/5-a-wild-emojimon-appears"},{kind:"MdxPage",name:"6-advanced",route:"/guides/emojimon/6-advanced"},{kind:"Meta",data:{"1-preface-the-ecs-model":"Preface: the ECS model","2-getting-started":"Getting started","3-players-and-movement":"Players and movement","4-map-and-terrain":"Map and terrain","5-a-wild-emojimon-appears":"A wild Emojimon appears","6-advanced":"Advanced features"}}]},{kind:"MdxPage",name:"emojimon",route:"/guides/emojimon"},{kind:"MdxPage",name:"extending-a-world",route:"/guides/extending-a-world"},{kind:"Folder",name:"hello-world",route:"/guides/hello-world",children:[{kind:"Meta",data:{"add-table":"Add a table","filter-sync":"Filter data synchronization","add-system":"Add a system",deploy:{title:"Deploy to a blockchain",href:"/cli/deploy"}}},{kind:"MdxPage",name:"add-system",route:"/guides/hello-world/add-system"},{kind:"MdxPage",name:"add-table",route:"/guides/hello-world/add-table"},{kind:"MdxPage",name:"filter-sync",route:"/guides/hello-world/filter-sync"}]},{kind:"MdxPage",name:"hello-world",route:"/guides/hello-world"},{kind:"MdxPage",name:"replicating-onchain-state",route:"/guides/replicating-onchain-state"}]},{kind:"MdxPage",name:"introduction",route:"/introduction"},{kind:"MdxPage",name:"quickstart",route:"/quickstart"},{kind:"Folder",name:"retrospectives",route:"/retrospectives",children:[{kind:"MdxPage",name:"2023-09-12-register-system-vulnerability",route:"/retrospectives/2023-09-12-register-system-vulnerability"},{kind:"Meta",data:{"2023-09-12-register-system-vulnerability":"2023-09-12 registerSystem vulnerability"}}]},{kind:"Folder",name:"services",route:"/services",children:[{kind:"Meta",data:{indexer:"Indexer",faucet:"Faucet"}},{kind:"MdxPage",name:"faucet",route:"/services/faucet"},{kind:"MdxPage",name:"indexer",route:"/services/indexer"}]},{kind:"Folder",name:"state-query",route:"/state-query",children:[{kind:"Meta",data:{typescript:"TypeScript"}},{kind:"Folder",name:"typescript",route:"/state-query/typescript",children:[{kind:"Meta",data:{recs:"RECS",zustand:"Zustand"}},{kind:"MdxPage",name:"recs",route:"/state-query/typescript/recs"},{kind:"MdxPage",name:"zustand",route:"/state-query/typescript/zustand"}]}]},{kind:"Folder",name:"store",route:"/store",children:[{kind:"Meta",data:{introduction:"Introduction","data-model":"Data model",tables:"Tables","table-libraries":"Table libraries",encoding:"Encoding","store-hooks":"Store hooks",reference:"Reference"}},{kind:"MdxPage",name:"data-model",route:"/store/data-model"},{kind:"MdxPage",name:"encoding",route:"/store/encoding"},{kind:"MdxPage",name:"introduction",route:"/store/introduction"},{kind:"Folder",name:"reference",route:"/store/reference",children:[{kind:"Meta",data:{"store-core":"StoreCore (internal)",store:"IStore (external)","store-hook":"StoreHook",misc:"Miscellaneous"}},{kind:"MdxPage",name:"misc",route:"/store/reference/misc"},{kind:"MdxPage",name:"store-core",route:"/store/reference/store-core"},{kind:"MdxPage",name:"store-hook",route:"/store/reference/store-hook"},{kind:"MdxPage",name:"store",route:"/store/reference/store"}]},{kind:"MdxPage",name:"store-hooks",route:"/store/store-hooks"},{kind:"MdxPage",name:"table-libraries",route:"/store/table-libraries"},{kind:"MdxPage",name:"tables",route:"/store/tables"}]},{kind:"Folder",name:"templates",route:"/templates",children:[{kind:"Meta",data:{typescript:"TypeScript",godot:"Godot",pwa:"Progressive Web App (for mobile)",swift:"Swift",svelte:"Svelte",unity:"Unity",disclaimer:{display:"hidden",title:"Disclaimer"}}},{kind:"MdxPage",name:"disclaimer",route:"/templates/disclaimer"},{kind:"MdxPage",name:"godot",route:"/templates/godot"},{kind:"MdxPage",name:"pwa",route:"/templates/pwa"},{kind:"MdxPage",name:"svelte",route:"/templates/svelte"},{kind:"MdxPage",name:"swift",route:"/templates/swift"},{kind:"Folder",name:"typescript",route:"/templates/typescript",children:[{kind:"Meta",data:{"getting-started":"Getting Started",contracts:"Contracts",vanilla:"Vanilla","react-ecs":"React-ECS",three:"Three.js"}},{kind:"MdxPage",name:"contracts",route:"/templates/typescript/contracts"},{kind:"MdxPage",name:"getting-started",route:"/templates/typescript/getting-started"},{kind:"MdxPage",name:"react-ecs",route:"/templates/typescript/react-ecs"},{kind:"MdxPage",name:"three",route:"/templates/typescript/three"},{kind:"MdxPage",name:"vanilla",route:"/templates/typescript/vanilla"}]},{kind:"MdxPage",name:"unity",route:"/templates/unity"}]},{kind:"Folder",name:"world",route:"/world",children:[{kind:"Meta",data:{introduction:"Introduction","namespaces-access-control":"Namespaces & Access Control",tables:"Tables",systems:"Systems","system-hooks":"System Hooks","function-selectors":"Function Selectors",balance:"Balance","account-delegation":"Account Delegation","batch-calls":"Batch Calls",modules:"Modules",reference:"Reference","world-table-illustration":{display:"hidden",title:"World Table Illustration"}}},{kind:"MdxPage",name:"account-delegation",route:"/world/account-delegation"},{kind:"MdxPage",name:"balance",route:"/world/balance"},{kind:"MdxPage",name:"batch-calls",route:"/world/batch-calls"},{kind:"MdxPage",name:"function-selectors",route:"/world/function-selectors"},{kind:"MdxPage",name:"introduction",route:"/world/introduction"},{kind:"Folder",name:"modules",route:"/world/modules",children:[{kind:"Meta",data:{keyswithvalue:"Keys with Value"}},{kind:"MdxPage",name:"keyswithvalue",route:"/world/modules/keyswithvalue"}]},{kind:"MdxPage",name:"modules",route:"/world/modules"},{kind:"MdxPage",name:"namespaces-access-control",route:"/world/namespaces-access-control"},{kind:"Folder",name:"reference",route:"/world/reference",children:[{kind:"Meta",data:{"delegation-external":"Delegation (interface)",module:"Modules","module-external":"Modules (interface)",system:"Systems","system-external":"Systems (interface)",world:"World","world-external":"World (interfaces)","world-context":"World context","world-context-external":"World context (interface)","resource-ids":"Resource IDs",misc:"Miscellaneous",internal:"Internals"}},{kind:"MdxPage",name:"delegation-external",route:"/world/reference/delegation-external"},{kind:"Folder",name:"internal",route:"/world/reference/internal",children:[{kind:"Meta",data:{"access-control":"Access Control",create:"Create2",delegation:"Delegation",erc165:"ERC165","erc165-external":"ERC165 (interface)","init-module":"Init Module","init-module-implementation":"Init Module Implementation",systemcall:"SystemCall"}},{kind:"MdxPage",name:"access-control",route:"/world/reference/internal/access-control"},{kind:"MdxPage",name:"create",route:"/world/reference/internal/create"},{kind:"MdxPage",name:"delegation",route:"/world/reference/internal/delegation"},{kind:"MdxPage",name:"erc165-external",route:"/world/reference/internal/erc165-external"},{kind:"MdxPage",name:"erc165",route:"/world/reference/internal/erc165"},{kind:"MdxPage",name:"init-module-implementation",route:"/world/reference/internal/init-module-implementation"},{kind:"MdxPage",name:"init-module",route:"/world/reference/internal/init-module"},{kind:"MdxPage",name:"systemcall",route:"/world/reference/internal/systemcall"}]},{kind:"MdxPage",name:"misc",route:"/world/reference/misc"},{kind:"MdxPage",name:"module-external",route:"/world/reference/module-external"},{kind:"MdxPage",name:"module",route:"/world/reference/module"},{kind:"MdxPage",name:"resource-ids",route:"/world/reference/resource-ids"},{kind:"MdxPage",name:"system-external",route:"/world/reference/system-external"},{kind:"MdxPage",name:"system",route:"/world/reference/system"},{kind:"MdxPage",name:"world-context-external",route:"/world/reference/world-context-external"},{kind:"MdxPage",name:"world-context",route:"/world/reference/world-context"},{kind:"MdxPage",name:"world-external",route:"/world/reference/world-external"},{kind:"MdxPage",name:"world",route:"/world/reference/world"}]},{kind:"MdxPage",name:"system-hooks",route:"/world/system-hooks"},{kind:"MdxPage",name:"systems",route:"/world/systems"},{kind:"MdxPage",name:"tables",route:"/world/tables"},{kind:"MdxPage",name:"world-table-illustration",route:"/world/world-table-illustration"}]}],flexsearch:{codeblocks:!0},title:"Systems"},pageNextRoute:"/world/systems",nextraLayout:t.ZP,themeConfig:o.Z};function h(e){let s=Object.assign({h1:"h1",p:"p",code:"code",a:"a",details:"details",summary:"summary",h2:"h2",ul:"ul",li:"li",h3:"h3",pre:"pre",span:"span",em:"em",table:"table",thead:"thead",tr:"tr",th:"th",tbody:"tbody",td:"td",h4:"h4",ol:"ol",strong:"strong"},(0,i.ah)(),e.components);return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.h1,{children:"Systems"}),"\n",(0,n.jsxs)(s.p,{children:["One of the design principles of MUD is to separate the state of the ",(0,n.jsx)(s.code,{children:"World"})," from the business logic.\nThe business logic is implemented in stateless ",(0,n.jsx)(s.code,{children:"System"})," contracts.\n",(0,n.jsx)(s.code,{children:"System"}),"s are called through the ",(0,n.jsx)(s.code,{children:"World"}),", and call back to the ",(0,n.jsx)(s.code,{children:"World"})," to read and write state from ",(0,n.jsx)(s.a,{href:"./tables",children:"tables"}),"."]}),"\n",(0,n.jsxs)(s.details,{children:[(0,n.jsx)(s.summary,{children:"Detailed illustration"}),(0,n.jsx)(c.Z,{})]}),"\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.code,{children:"World"})," serves as a central entry point and forwards calls to systems, which allows it to provide ",(0,n.jsx)(s.a,{href:"/world/namespaces-access-control",children:"access control"}),"."]}),"\n",(0,n.jsx)(s.h2,{id:"calling-systems",children:"Calling systems"}),"\n",(0,n.jsxs)(s.p,{children:["To call a ",(0,n.jsx)(s.code,{children:"System"}),", you call the ",(0,n.jsx)(s.code,{children:"World"})," in one of these ways:"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["If a ",(0,n.jsxs)(s.a,{href:"./function-selectors",children:["function selector for the ",(0,n.jsx)(s.code,{children:"System"})," is registered in the ",(0,n.jsx)(s.code,{children:"World"})]}),", you can call it via ",(0,n.jsx)(s.code,{children:"world.<namespace>__<function>(<arguments>)"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["You can use ",(0,n.jsx)(s.a,{href:"https://github.com/latticexyz/mud/blob/main/packages/world/src/World.sol#L333-L345",children:(0,n.jsx)(s.code,{children:"call"})}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["If you have ",(0,n.jsx)(s.a,{href:"/world/account-delegation",children:"the proper delegation"})," you can use ",(0,n.jsx)(s.a,{href:"https://github.com/latticexyz/mud/blob/main/packages/world/src/World.sol#L347-L388",children:(0,n.jsx)(s.code,{children:"callFrom"})}),"."]}),"\n"]}),"\n",(0,n.jsxs)(s.h3,{id:"using-call",children:["Using ",(0,n.jsx)(s.code,{children:"call"})]}),"\n",(0,n.jsxs)(s.p,{children:["To use ",(0,n.jsx)(s.code,{children:"call"})," you create the calldata to send the called ",(0,n.jsx)(s.code,{children:"System"})," and use that as a parameter."]}),"\n",(0,n.jsx)(a.C,{children:(0,n.jsx)(s.pre,{"data-language":"solidity","data-theme":"default",filename:"Call.s.sol",hasCopyCode:!0,children:(0,n.jsxs)(s.code,{"data-line-numbers":"","data-language":"solidity","data-theme":"default","data-line-numbers-max-digits":"2",children:[(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// SPDX-License-Identifier: MIT"})}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"pragma"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"solidity"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" >=0.8.24;"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"Script"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"forge-std/Script.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"console"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"forge-std/console.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"StoreSwitch"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"@latticexyz/store/src/StoreSwitch.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"IWorld"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"../src/codegen/world/IWorld.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"Tasks"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:", "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"TasksData"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"../src/codegen/index.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line highlighted",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"ResourceId"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:", "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"WorldResourceIdLib"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:", "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"WorldResourceIdInstance"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"@latticexyz/world/src/WorldResourceId.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsxs)(s.span,{className:"line highlighted",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"RESOURCE_SYSTEM"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"@latticexyz/world/src/worldResourceTypes.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"contract"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"Call"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"is"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"Script"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" {"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"run"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"() "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"external"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" {"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"address"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" worldAddress "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"0x256e6eAf6a6683aB771C576f2f5C8A774BdAC8e3"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Load the private key from the `PRIVATE_KEY` environment variable (in .env)"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"uint256"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" deployerPrivateKey "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" vm."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"envUint"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"PRIVATE_KEY"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:");"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Start broadcasting transactions from the deployer account"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    vm."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"startBroadcast"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(deployerPrivateKey);"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line highlighted",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    ResourceId systemId "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" WorldResourceIdLib."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"encode"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"({ typeId"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" RESOURCE_SYSTEM"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" namespace"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'""'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" name"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"TasksSystem"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" });"})]}),"\n",(0,n.jsx)(s.span,{className:"line highlighted",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line highlighted",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"bytes"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"memory"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" returnData "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"IWorld"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(worldAddress)."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"call"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("})]}),"\n",(0,n.jsxs)(s.span,{className:"line highlighted",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"      systemId"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,n.jsxs)(s.span,{className:"line highlighted",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"      abi."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"encodeWithSignature"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"addTask(string)"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"Test task"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:")"})]}),"\n",(0,n.jsx)(s.span,{className:"line highlighted",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    );"})}),"\n",(0,n.jsx)(s.span,{className:"line highlighted",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line highlighted",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    console."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"log"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"The return value is:"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:");"})]}),"\n",(0,n.jsxs)(s.span,{className:"line highlighted",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    console."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"logBytes"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(returnData);"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    vm."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"stopBroadcast"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"();"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  }"})}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"}"})})]})})}),"\n",(0,n.jsxs)(s.details,{children:[(0,n.jsx)(s.summary,{children:"Explanation"}),(0,n.jsx)(s.pre,{"data-language":"solidity","data-theme":"default",children:(0,n.jsxs)(s.code,{"data-language":"solidity","data-theme":"default",children:[(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"ResourceId"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:", "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"WorldResourceIdLib"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:", "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"WorldResourceIdInstance"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"@latticexyz/world/src/WorldResourceId.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"RESOURCE_SYSTEM"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"@latticexyz/world/src/worldResourceTypes.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"."})}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"."})}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"."})}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"ResourceId systemId "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" WorldResourceIdLib."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"encode"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"({"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  typeId"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" RESOURCE_SYSTEM"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  namespace"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'""'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  name"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"TasksSystem"'})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"});"})})]})}),(0,n.jsxs)(s.p,{children:["Create a ",(0,n.jsx)(s.code,{children:"ResourceId"})," for the ",(0,n.jsx)(s.code,{children:"System"}),"."]}),(0,n.jsx)(s.pre,{"data-language":"solidity","data-theme":"default",children:(0,n.jsxs)(s.code,{"data-language":"solidity","data-theme":"default",children:[(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"bytes"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"memory"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" returnData "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"IWorld"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(worldAddress)."})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"call"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(systemId"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" abi."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"encodeWithSignature"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"addTask(string)"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"Test task"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"));"})]})]})}),(0,n.jsxs)(s.p,{children:["Call the ",(0,n.jsx)(s.code,{children:"System"}),". The calldata is created using ",(0,n.jsx)(s.a,{href:"https://docs.soliditylang.org/en/latest/cheatsheet.html#index-1",children:(0,n.jsx)(s.code,{children:"abi.encodeWithSignature"})}),"."]}),(0,n.jsxs)(s.p,{children:["The return data is of type ",(0,n.jsx)(s.a,{href:"https://docs.soliditylang.org/en/latest/internals/layout_in_storage.html#bytes-and-string",children:(0,n.jsx)(s.code,{children:"bytes memory"})}),"."]})]}),"\n",(0,n.jsx)(s.h2,{id:"writing-systems",children:"Writing systems"}),"\n",(0,n.jsxs)(s.p,{children:["A ",(0,n.jsx)(s.code,{children:"System"})," should ",(0,n.jsx)(s.em,{children:"not"})," have any internal state, but store all of it in tables in the ",(0,n.jsx)(s.code,{children:"World"}),".\nThere are several reasons for this:"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["It allows a ",(0,n.jsx)(s.code,{children:"World"})," to enforce access controls."]}),"\n",(0,n.jsxs)(s.li,{children:["It allows the same ",(0,n.jsx)(s.code,{children:"System"})," to be used by multiple ",(0,n.jsx)(s.code,{children:"World"})," contracts."]}),"\n",(0,n.jsxs)(s.li,{children:["Upgrades are a lot simpler when all the state is centralized outside of the ",(0,n.jsx)(s.code,{children:"System"})," contract."]}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["Because calls to systems are proxied through the ",(0,n.jsx)(s.code,{children:"World"}),", some message fields don't reflect the original call.\nUse these substitutes:"]}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Vanilla Solidity"}),(0,n.jsxs)(s.th,{children:[(0,n.jsx)(s.code,{children:"System"})," replacement"]})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"msg.sender"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"_msgSender()"})})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"msg.value"})}),(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"_msgValue()"})})]})]})]}),"\n",(0,n.jsxs)(s.p,{children:["When calling other contracts from a ",(0,n.jsx)(s.code,{children:"System"}),", be aware that if you use ",(0,n.jsx)(s.code,{children:"delegatecall"})," the called contract inherits the ",(0,n.jsx)(s.code,{children:"System"}),"'s permissions and can modify data in the ",(0,n.jsx)(s.code,{children:"World"})," on behalf of the ",(0,n.jsx)(s.code,{children:"System"}),"."]}),"\n",(0,n.jsxs)(s.h3,{id:"calling-one-system-from-another",children:["Calling one ",(0,n.jsx)(s.code,{children:"System"})," from another"]}),"\n",(0,n.jsxs)(s.p,{children:["There are two ways to call one ",(0,n.jsx)(s.code,{children:"System"})," from another one."]}),"\n",(0,n.jsxs)(s.table,{children:[(0,n.jsx)(s.thead,{children:(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.th,{children:"Call type"}),(0,n.jsxs)(s.th,{children:[(0,n.jsx)(s.code,{children:"call"})," to the ",(0,n.jsx)(s.code,{children:"World"})]}),(0,n.jsxs)(s.th,{children:[(0,n.jsx)(s.code,{children:"delegatecall"})," directly to the ",(0,n.jsx)(s.code,{children:"System"})]})]})}),(0,n.jsxs)(s.tbody,{children:[(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Permissions"}),(0,n.jsxs)(s.td,{children:["those of the called ",(0,n.jsx)(s.code,{children:"System"})]}),(0,n.jsxs)(s.td,{children:["those of the calling ",(0,n.jsx)(s.code,{children:"System"})]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"_msgSender()"})}),(0,n.jsxs)(s.td,{children:["calling ",(0,n.jsx)(s.code,{children:"System"})," (unless you can use ",(0,n.jsx)(s.code,{children:"callFrom"}),", which is only available when the user ",(0,n.jsx)(s.a,{href:"/world/account-delegation",children:"delegates"})," to your ",(0,n.jsx)(s.code,{children:"System"}),")"]}),(0,n.jsxs)(s.td,{children:["can use ",(0,n.jsx)(s.a,{href:"https://github.com/latticexyz/mud/blob/main/packages/world/src/WorldContext.sol#L180-L203",children:(0,n.jsx)(s.code,{children:"WorldContextProvider"})})," to transfer the correct information"]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:(0,n.jsx)(s.code,{children:"_msgValue()"})}),(0,n.jsx)(s.td,{children:"zero"}),(0,n.jsxs)(s.td,{children:["can use ",(0,n.jsx)(s.a,{href:"https://github.com/latticexyz/mud/blob/main/packages/world/src/WorldContext.sol#L180-L203",children:(0,n.jsx)(s.code,{children:"WorldContextProvider"})})," to transfer the correct information"]})]}),(0,n.jsxs)(s.tr,{children:[(0,n.jsx)(s.td,{children:"Can be used by systems in the root namespace"}),(0,n.jsx)(s.td,{children:"No (it's a security measure)"}),(0,n.jsx)(s.td,{children:"Yes"})]})]})]}),"\n",(0,n.jsxs)(s.h4,{id:"calling-from-a-root-system",children:["Calling from a root ",(0,n.jsx)(s.code,{children:"System"})]}),"\n",(0,n.jsxs)(s.p,{children:["If you need to call a ",(0,n.jsx)(s.code,{children:"System"})," from a ",(0,n.jsx)(s.code,{children:"System"})," in the root namespace you can use ",(0,n.jsx)(s.a,{href:"https://github.com/latticexyz/mud/blob/main/packages/world-modules/src/utils/SystemSwitch.sol",children:(0,n.jsx)(s.code,{children:"SystemSwitch"})}),"."]}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:["Import ",(0,n.jsx)(s.code,{children:"SystemSwitch"}),"."]}),"\n",(0,n.jsx)(s.pre,{"data-language":"solidity","data-theme":"default",hasCopyCode:!0,children:(0,n.jsx)(s.code,{"data-language":"solidity","data-theme":"default",children:(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"SystemSwitch"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"@latticexyz/world-modules/src/utils/SystemSwitch.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]})})}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsx)(s.p,{children:"Import the interface for the system you wish to call."}),"\n",(0,n.jsx)(s.pre,{"data-language":"solidity","data-theme":"default",hasCopyCode:!0,children:(0,n.jsx)(s.code,{"data-language":"solidity","data-theme":"default",children:(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"IIncrementSystem"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"../codegen/world/IIncrementSystem.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]})})}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:["Call the function using ",(0,n.jsx)(s.code,{children:"SystemSwitch.call"}),".\nFor example, here is how you can call ",(0,n.jsx)(s.a,{href:"/templates/typescript/contracts#incrementsystemsol",children:(0,n.jsx)(s.code,{children:"IncrementSystem.increment()"})}),"."]}),"\n",(0,n.jsx)(s.pre,{"data-language":"solidity","data-theme":"default",hasCopyCode:!0,children:(0,n.jsxs)(s.code,{"data-language":"solidity","data-theme":"default",children:[(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"uint32"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" returnValue "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" abi."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"decode"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"   SystemSwitch."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"call"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"     abi."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"encodeCall"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(IIncrementSystem.increment"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" ())"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"   )"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"   ("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"uint32"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:")"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" );"})})]})}),"\n",(0,n.jsxs)(s.details,{children:[(0,n.jsx)(s.summary,{children:"Explanation"}),(0,n.jsx)(s.pre,{"data-language":"solidity","data-theme":"default",children:(0,n.jsx)(s.code,{"data-language":"solidity","data-theme":"default",children:(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"abi."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"encodeCall"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(IIncrementSystem.increment"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" ())"})]})})}),(0,n.jsxs)(s.p,{children:["Use ",(0,n.jsx)(s.a,{href:"https://docs.soliditylang.org/en/latest/cheatsheet.html#abi-encoding-and-decoding-functions",children:(0,n.jsx)(s.code,{children:"abi.encodeCall"})})," to create the calldata.\nThe first parameter is a pointer to the function.\nThe second parameter is a ",(0,n.jsx)(s.a,{href:"https://docs.soliditylang.org/en/latest/control-structures.html#destructuring-assignments-and-returning-multiple-values",children:"tuple"})," with the function parameters.\nIn this case, there aren't any."]}),(0,n.jsxs)(s.p,{children:["The advantage of ",(0,n.jsx)(s.code,{children:"abi.encodeCall"})," is that it checks the types of the function parameters are correct."]}),(0,n.jsx)(s.pre,{"data-language":"solidity","data-theme":"default",children:(0,n.jsxs)(s.code,{"data-language":"solidity","data-theme":"default",children:[(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"SystemSwitch."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"call"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"     abi."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"encodeCall"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(...)"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:")"})})]})}),(0,n.jsxs)(s.p,{children:["Using ",(0,n.jsx)(s.code,{children:"SystemSwitch.call"})," with the calldata created by ",(0,n.jsx)(s.code,{children:"abi.encodeCall"}),".\n",(0,n.jsx)(s.code,{children:"SystemSwitch.call"})," takes care of figuring out details, such as what type of call to use."]}),(0,n.jsx)(s.pre,{"data-language":"solidity","data-theme":"default",children:(0,n.jsxs)(s.code,{"data-language":"solidity","data-theme":"default",children:[(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"uint32"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" retval "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" abi."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"decode"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"   SystemSwitch."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"call"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(...)"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"   ("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"uint32"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:")"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:");"})})]})}),(0,n.jsxs)(s.p,{children:["Use ",(0,n.jsx)(s.a,{href:"https://docs.soliditylang.org/en/latest/cheatsheet.html#abi-encoding-and-decoding-functions",children:(0,n.jsx)(s.code,{children:"abi.decode"})})," to decode the call's return value.\nThe second parameter is the data type (or types if there are multiple return values)."]})]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"registering-systems",children:"Registering systems"}),"\n",(0,n.jsxs)(s.p,{children:["For a ",(0,n.jsx)(s.code,{children:"System"})," to be callable from a ",(0,n.jsx)(s.code,{children:"World"})," it has to be ",(0,n.jsx)(s.a,{href:"https://github.com/latticexyz/mud/blob/main/packages/world/src/modules/init/implementations/WorldRegistrationSystem.sol#L115-L178",children:"registered"}),".\nOnly the ",(0,n.jsx)(s.a,{href:"./namespaces-access-control#ownership",children:"namespace owner"})," can register a ",(0,n.jsx)(s.code,{children:"System"})," in a namespace."]}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"System"}),"s can be registered once per ",(0,n.jsx)(s.code,{children:"World"}),", but the same system can be registered in multiple ",(0,n.jsx)(s.code,{children:"World"}),"s.\nIf you need multiple instances of a ",(0,n.jsx)(s.code,{children:"System"})," in the same world, you can deploy the ",(0,n.jsx)(s.code,{children:"System"})," multiple times and register the individual deployments individually."]}),"\n",(0,n.jsx)(a.C,{children:(0,n.jsx)(s.pre,{"data-language":"solidity","data-theme":"default",filename:"MessagingExtension.s.sol",children:(0,n.jsxs)(s.code,{"data-line-numbers":"","data-language":"solidity","data-theme":"default","data-line-numbers-max-digits":"2",children:[(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// SPDX-License-Identifier: MIT"})}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"pragma"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:"solidity"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" >=0.8.21;"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"Script"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"forge-std/Script.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"console"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"forge-std/console.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"IBaseWorld"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"@latticexyz/world-modules/src/interfaces/IBaseWorld.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"WorldRegistrationSystem"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"@latticexyz/world/src/modules/core/implementations/WorldRegistrationSystem.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Create resource identifiers (for the namespace and system)"})}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"ResourceId"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"@latticexyz/store/src/ResourceId.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"WorldResourceIdLib"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"@latticexyz/world/src/WorldResourceId.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"RESOURCE_SYSTEM"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"@latticexyz/world/src/worldResourceTypes.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// For registering the table"})}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"Messages"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:", "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"MessagesTableId"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"../src/codegen/index.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"IStore"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"@latticexyz/store/src/IStore.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"StoreSwitch"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"@latticexyz/store/src/StoreSwitch.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// For deploying MessageSystem"})}),"\n",(0,n.jsxs)(s.span,{className:"line highlighted",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"import"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" { "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"MessageSystem"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" } "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"from"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"../src/systems/MessageSystem.sol"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"contract"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"MessagingExtension"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"is"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"Script"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" {"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"function"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"run"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"() "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"external"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" {"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"uint256"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" deployerPrivateKey "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" vm."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"envUint"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"PRIVATE_KEY"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:");"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"address"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" worldAddress "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" vm."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"envAddress"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"WORLD_ADDRESS"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:");"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    WorldRegistrationSystem world "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"WorldRegistrationSystem"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(worldAddress);"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    ResourceId namespaceResource "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" WorldResourceIdLib."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"encodeNamespace"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"bytes14"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"messaging"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"));"})]}),"\n",(0,n.jsxs)(s.span,{className:"line highlighted",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    ResourceId systemResource "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" WorldResourceIdLib."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"encode"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(RESOURCE_SYSTEM"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"messaging"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"MessageSystem"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:");"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    vm."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"startBroadcast"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(deployerPrivateKey);"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    world."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"registerNamespace"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(namespaceResource);"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    StoreSwitch."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"setStoreAddress"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(worldAddress);"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    Messages."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"register"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"();"})]}),"\n",(0,n.jsxs)(s.span,{className:"line highlighted",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    MessageSystem messageSystem "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"new"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"MessageSystem"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"();"})]}),"\n",(0,n.jsxs)(s.span,{className:"line highlighted",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    world."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"registerSystem"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(systemResource"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" messageSystem"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"true"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:");"})]}),"\n",(0,n.jsxs)(s.span,{className:"line highlighted",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    world."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"registerFunctionSelector"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(systemResource"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-punctuation)"},children:","}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-string-expression)"},children:'"incrementMessage(string)"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:");"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:" "}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"    vm."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"stopBroadcast"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"();"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"  }"})}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"}"})})]})})}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.code,{children:"System"})," registration requires several steps:"]}),"\n",(0,n.jsxs)(s.ol,{children:["\n",(0,n.jsxs)(s.li,{children:["Create the resource ID for the ",(0,n.jsx)(s.code,{children:"System"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["Deploy the ",(0,n.jsx)(s.code,{children:"System"})," contract."]}),"\n",(0,n.jsxs)(s.li,{children:["Use ",(0,n.jsx)(s.a,{href:"https://github.com/latticexyz/mud/blob/main/packages/world/src/modules/init/implementations/WorldRegistrationSystem.sol#L115-L178",children:(0,n.jsx)(s.code,{children:"WorldRegistrationSystem.registerSystem"})})," to register the ",(0,n.jsx)(s.code,{children:"System"}),".\nThis function takes three parameters:","\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["The ResourceId for the ",(0,n.jsx)(s.code,{children:"System"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["The address of the ",(0,n.jsx)(s.code,{children:"System"})," contract."]}),"\n",(0,n.jsxs)(s.li,{children:["Access control - whether access to the ",(0,n.jsx)(s.code,{children:"System"})," is public (",(0,n.jsx)(s.code,{children:"true"}),") or limited to entities with access either to the namespace or the ",(0,n.jsx)(s.code,{children:"System"})," itself (",(0,n.jsx)(s.code,{children:"false"}),").","\n",(0,n.jsx)("br",{}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["Optionally, register ",(0,n.jsx)(s.a,{href:"/world/function-selectors",children:"function selectors"})," for the ",(0,n.jsx)(s.code,{children:"System"}),"."]}),"\n"]}),"\n",(0,n.jsx)(s.h3,{id:"upgrading-systems",children:"Upgrading systems"}),"\n",(0,n.jsxs)(s.p,{children:["The namespace owner can upgrade a ",(0,n.jsx)(s.code,{children:"System"}),".\nThis is a two-step process: deploy the contract for the new ",(0,n.jsx)(s.code,{children:"System"})," and then call ",(0,n.jsx)(s.code,{children:"registerSystem"})," with the same ",(0,n.jsx)(s.code,{children:"ResourceId"})," as the old one and the new contract address."]}),"\n",(0,n.jsxs)(s.p,{children:["This upgrade process removes the old ",(0,n.jsx)(s.code,{children:"System"})," contract's access to the namespace, and gives access to the new contract.\nAny access granted ",(0,n.jsx)(s.em,{children:"manually"})," to the old ",(0,n.jsx)(s.code,{children:"System"})," is not revoked, nor granted to the upgraded ",(0,n.jsx)(s.code,{children:"System"}),"."]}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"Note:"})," You ",(0,n.jsx)(s.em,{children:"should"})," make sure to remove any such manually granted access.\nMUD access is based on the contract address, so somebody else could register a namespace they'd own, register the old ",(0,n.jsx)(s.code,{children:"System"})," contract as a system in their namespace, and then abuse those permissions (if the ",(0,n.jsx)(s.code,{children:"System"})," has code that can be used for that, of course)."]}),"\n",(0,n.jsx)(s.h2,{id:"access-control",children:"Access control"}),"\n",(0,n.jsxs)(s.p,{children:["When you register a ",(0,n.jsx)(s.code,{children:"System"}),", you can specify whether it is going to be private or public."]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:["A public ",(0,n.jsx)(s.code,{children:"System"})," has no access control checks, it can be called by anybody.\nThis is the main mechanism for user interaction with a MUD application."]}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["\n",(0,n.jsxs)(s.p,{children:["A private ",(0,n.jsx)(s.code,{children:"System"})," can only be called by accounts that have access.\nThis access can be the result of:"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Access permission to the namespace in which the ",(0,n.jsx)(s.code,{children:"System"})," is registered."]}),"\n",(0,n.jsxs)(s.li,{children:["Access permission specifically to the ",(0,n.jsx)(s.code,{children:"System"}),"."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["Note that ",(0,n.jsx)(s.code,{children:"System"}),"s have access to their own namespace by default, so public ",(0,n.jsx)(s.code,{children:"System"}),"s can call private ",(0,n.jsx)(s.code,{children:"System"}),"s in their namespace."]}),"\n",(0,n.jsx)(s.h2,{id:"root-systems",children:"Root systems"}),"\n",(0,n.jsxs)(s.p,{children:["The ",(0,n.jsx)(s.code,{children:"World"})," uses ",(0,n.jsx)(s.code,{children:"call"})," for systems in other namespaces, but ",(0,n.jsx)(s.code,{children:"delegatecall"})," for those in the root namespace (",(0,n.jsx)(s.code,{children:"bytes14(0)"}),").\nAs a result, root systems have access to the ",(0,n.jsx)(s.code,{children:"World"})," contract's storage.\nBecause of this access, root systems use ",(0,n.jsxs)(s.a,{href:"https://github.com/latticexyz/mud/blob/main/packages/store/src/StoreCore.sol",children:["the internal ",(0,n.jsx)(s.code,{children:"StoreCore"})," methods"]}),", which are slightly cheaper than calling ",(0,n.jsxs)(s.a,{href:"https://github.com/latticexyz/mud/blob/main/packages/store/src/IStore.sol",children:["the external ",(0,n.jsx)(s.code,{children:"IStore"})," methods"]})," used by other systems.\nNote that the table libraries abstract this difference, so normally there is no reason to be concerned about it."]}),"\n",(0,n.jsxs)(s.p,{children:["Another effect of having access to the storage of the ",(0,n.jsx)(s.code,{children:"World"})," is that root systems could, in theory, overwrite any information in any table regardless of access control.\nOnly the ",(0,n.jsx)(s.a,{href:"./namespaces-access-control",children:"owner of the root namespace"})," can register root systems.\nWe recommend to only use the root namespace when strictly necessary."]})]})}s.default=(0,l.j)(d)},4737:function(e){e.exports={collapsed:"CollapseCode_collapsed__D1CXB",expanded:"CollapseCode_expanded__x1xKU"}}},function(e){e.O(0,[1877,2888,179],function(){return e(e.s=9408)}),_N_E=e.O()}]);