(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8600],{40340:function(e,s,t){(window.__NEXT_P=window.__NEXT_P||[]).push(["/store/tables",function(){return t(74097)}])},73307:function(e,s,t){"use strict";t.d(s,{Z:function(){return i}});var n=t(7505),r=t(11689);let a={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,r.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 i=a},34722:function(e,s,t){"use strict";var n=t(7505),r=t(26736);t(98823);var a=t(64738);function i(e){let s=Object.assign({p:"p",em:"em"},(0,r.ah)(),e.components);return(0,n.jsx)(a.UW,{type:"warning",emoji:"⚠️",children:(0,n.jsxs)(s.p,{children:["Once a table is created its schema is ",(0,n.jsx)(s.em,{children:"immutable"}),". If you need to add fields to an existing table, create a new table\nwith the same key schema and the new fields in the value schema, and retrieve from both tables to get the complete\nvalue. If you need to delete fields, just have your code ignore them."]})})}s.Z=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:s}=Object.assign({},(0,r.ah)(),e.components);return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(i,{...e})}):i(e)}},74097:function(e,s,t){"use strict";t.r(s);var n=t(7505),r=t(42585),a=t(38288),i=t(73307);t(54693);var o=t(26736);t(98823);var l=t(64738),c=t(34722);let d={MDXContent:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{wrapper:s}=Object.assign({},(0,o.ah)(),e.components);return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(h,{...e})}):h(e)},pageOpts:{filePath:"pages/store/tables.mdx",route:"/store/tables",headings:[{depth:1,value:"Tables",id:"tables"},{depth:2,value:"Types of tables",id:"types-of-tables"},{depth:2,value:"Advanced",id:"advanced"},{depth:3,value:"Table ID",id:"table-id"},{depth:3,value:"The schemas",id:"the-schemas"},{depth:4,value:"Key schema",id:"key-schema"},{depth:4,value:"Value schema",id:"value-schema"},{depth:3,value:"Key and field names",id:"key-and-field-names"},{depth:3,value:"Field layout",id:"field-layout"},{depth:3,value:"Manually register a table",id:"manually-register-a-table"}],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",audits:"Audits",version:{title:"2.1.0",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:"Folder",name:"audits",route:"/audits",children:[{kind:"MdxPage",name:"2024-02-11-open-zeppelin",route:"/audits/2024-02-11-open-zeppelin"},{kind:"Meta",data:{"2024-02-11-open-zeppelin":"2024-02-11 OpenZeppelin",pdf:{display:"hidden"},icons:{display:"hidden"}}}]},{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",verify:"mud verify","dev-contracts":"mud dev-contracts","abi-ts":"mud abi-ts","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:"set-version",route:"/cli/set-version"},{kind:"MdxPage",name:"tablegen",route:"/cli/tablegen"},{kind:"MdxPage",name:"test",route:"/cli/test"},{kind:"MdxPage",name:"verify",route:"/cli/verify"},{kind:"MdxPage",name:"worldgen",route:"/cli/worldgen"}]},{kind:"Folder",name:"config",route:"/config",children:[{kind:"MdxPage",name:"reference",route:"/config/reference"},{kind:"Meta",data:{reference:"Reference"}}]},{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","adding-delegation":"Adding Delegation",emojimon:"Emojimon",testing:"Testing","best-practices":"Best Practices"}},{kind:"MdxPage",name:"adding-delegation",route:"/guides/adding-delegation"},{kind:"Folder",name:"best-practices",route:"/guides/best-practices",children:[{kind:"Meta",data:{"system-best-practices":"System Best Practices","deployment-settings":"Recommended Deployment Settings",kms:"Deploy production worlds using AWS KMS"}},{kind:"MdxPage",name:"deployment-settings",route:"/guides/best-practices/deployment-settings"},{kind:"MdxPage",name:"kms",route:"/guides/best-practices/kms"},{kind:"MdxPage",name:"system-best-practices",route:"/guides/best-practices/system-best-practices"}]},{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:"Folder",name:"extending-a-world",route:"/guides/extending-a-world",children:[{kind:"Meta",data:{index:"Extending a World Permissionlessly"}},{kind:"MdxPage",name:"index",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:"testing",route:"/guides/testing"}]},{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:"MdxPage",name:"2024-04-17-storeread-getdynamicfieldlength-bug",route:"/retrospectives/2024-04-17-storeread-getdynamicfieldlength-bug"},{kind:"Meta",data:{"2024-04-17-storeread-getdynamicfieldlength-bug":"2024-04-17 StoreRead.getDynamicFieldLength bug","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"}},{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:{contracts:"Contracts",vanilla:"Vanilla","react-ecs":"React-ECS",threejs:"Three.js",vue:"Vue"}},{kind:"MdxPage",name:"contracts",route:"/templates/typescript/contracts"},{kind:"MdxPage",name:"react-ecs",route:"/templates/typescript/react-ecs"},{kind:"MdxPage",name:"threejs",route:"/templates/typescript/threejs"},{kind:"MdxPage",name:"vanilla",route:"/templates/typescript/vanilla"},{kind:"MdxPage",name:"vue",route:"/templates/typescript/vue"}]},{kind:"MdxPage",name:"unity",route:"/templates/unity"}]},{kind:"Folder",name:"world",route:"/world",children:[{kind:"Meta",data:{introduction:"Introduction","resource-ids":"Resource Identifiers","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",upgrades:"Upgrading",modules:"Modules",reference:"Reference"}},{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:"resource-ids",route:"/world/resource-ids"},{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:"upgrades",route:"/world/upgrades"}]}],flexsearch:{codeblocks:!0},title:"Tables"},pageNextRoute:"/store/tables",nextraLayout:a.ZP,themeConfig:i.Z};function h(e){let s=Object.assign({h1:"h1",p:"p",code:"code",em:"em",a:"a",ul:"ul",li:"li",h2:"h2",strong:"strong",h3:"h3",pre:"pre",span:"span",h4:"h4"},(0,o.ah)(),e.components);return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.h1,{children:"Tables"}),"\n",(0,n.jsxs)(s.p,{children:["Each piece of data in ",(0,n.jsx)(s.code,{children:"Store"})," is stored as a ",(0,n.jsx)(s.em,{children:"record"})," in a ",(0,n.jsx)(s.em,{children:"table"}),".\nYou can think of tables in two ways, either ",(0,n.jsx)(s.a,{href:"./data-model",children:"as a relational database"})," or as a key-value store."]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Each table is identified by a unique ",(0,n.jsx)(s.code,{children:"ResourceId tableId"}),"."]}),"\n",(0,n.jsxs)(s.li,{children:["Each record in a table is identified by a unique ",(0,n.jsx)(s.code,{children:"bytes32[] keyTuple"}),".\nYou can think of the key tuple as a composite key in a relational database, or as a nested mapping in a key-value store."]}),"\n",(0,n.jsxs)(s.li,{children:["Each table has a value schema (all the ",(0,n.jsx)(s.code,{children:"schema"})," fields that aren't part of the ",(0,n.jsx)(s.code,{children:"key"}),") that defines the types of data stored in the table.\nYou can think of the value schema as the column types in a table in a relational database, or the type of structs stored in a key-value store."]}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["Tables are registered in the ",(0,n.jsx)(s.code,{children:"Store"})," contract at runtime.\nWhen a table is registered, its ID, key and value types, as well as key and field names are stored in the internal ",(0,n.jsx)(s.code,{children:"Tables"})," table.\nThis emits an event that can be used by ",(0,n.jsx)(s.a,{href:"../services/indexer",children:"offchain indexers"})," to start ",(0,n.jsx)(s.a,{href:"/guides/replicating-onchain-state",children:"replicating the state"})," of the new table."]}),"\n",(0,n.jsxs)(s.p,{children:["The recommended way of reading from tables and writing to tables is via the ",(0,n.jsx)(s.a,{href:"./table-libraries",children:"typed table libraries"}),".\nHowever, it is also possible to use the low-level ",(0,n.jsxs)(s.a,{href:"./reference/store",children:[(0,n.jsx)(s.code,{children:"IStore"})," (external)"]})," or ",(0,n.jsxs)(s.a,{href:"./reference/store-core",children:[(0,n.jsx)(s.code,{children:"StoreCore"})," (internal)"]})," API directly."]}),"\n",(0,n.jsx)(c.Z,{}),"\n",(0,n.jsx)(s.h2,{id:"types-of-tables",children:"Types of tables"}),"\n",(0,n.jsxs)(s.p,{children:["There are two types of tables in ",(0,n.jsx)(s.code,{children:"Store"}),": ",(0,n.jsx)(s.em,{children:"Onchain tables"})," and ",(0,n.jsx)(s.em,{children:"offchain tables"}),".\nWe often omit the prefix from onchain tables and just call them tables."]}),"\n",(0,n.jsxs)(s.p,{children:["As the name suggests, ",(0,n.jsx)(s.strong,{children:"onchain tables"})," store their state onchain, in the ",(0,n.jsx)(s.code,{children:"Store"})," contract.\nIn addition, an event is emitted on every write operation, to allow ",(0,n.jsx)(s.a,{href:"../services/indexer",children:"offchain indexers"})," to ",(0,n.jsx)(s.a,{href:"/guides/replicating-onchain-state",children:"replicate the onchain state"}),"."]}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"Offchain tables"})," on the other hand don't store any state onchain, but only emit the events for ",(0,n.jsx)(s.a,{href:"../services/indexer",children:"offchain indexers"}),".\nThis makes them suitable for use cases where data doesn't need to be retrieved onchain, but should still be synchronized from the ",(0,n.jsx)(s.code,{children:"Store"})," contract to ",(0,n.jsx)(s.a,{href:"../services/indexer",children:"offchain indexers"}),"."]}),"\n",(0,n.jsx)(s.p,{children:"Onchain you can write to offchain tables with the same methods as onchain tables, except for reading data and modifying partial data in a dynamic field."}),"\n",(0,n.jsx)(s.h2,{id:"advanced",children:"Advanced"}),"\n",(0,n.jsx)(l.UW,{type:"info",emoji:"ⓘ",children:(0,n.jsxs)(s.p,{children:["In practice, everything in this section is automatically handled by the ",(0,n.jsx)(s.a,{href:"./table-libraries",children:"typed table libraries"}),".\nRead on if you're curious about the inner workings."]})}),"\n",(0,n.jsx)(s.h3,{id:"table-id",children:"Table ID"}),"\n",(0,n.jsxs)(s.p,{children:["The table ID encodes the table's type and name in a 32-byte ",(0,n.jsx)(s.code,{children:"ResourceId"})," value and uniquely identifies a table."]}),"\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-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:"ResourceIdLib"}),(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:"RESOURCE_TABLE"}),(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_OFFCHAIN_TABLE"}),(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/storeResourceTypes.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-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:"// Using the `RESOURCE_TABLE` type makes it an onchain table"})}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"ResourceId tableId "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" ResourceIdLib."}),(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_TABLE"}),(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:'"Balance"'})]}),"\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:" "}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// Using the `RESOURCE_OFFCHAIN_TABLE` type makes it an offchain table"})}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"ResourceId offchainTableId "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" ResourceIdLib."}),(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_OFFCHAIN_TABLE"}),(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:'"Balance"'})]}),"\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.h3,{id:"the-schemas",children:"The schemas"}),"\n",(0,n.jsx)(s.p,{children:"Tables have two schemas, one for the key and the other for the values."}),"\n",(0,n.jsx)(s.h4,{id:"key-schema",children:"Key schema"}),"\n",(0,n.jsxs)(s.p,{children:["The key schema represents the data types of the (composite) key of the table.\nInternally the composite key is always handled as ",(0,n.jsx)(s.code,{children:"bytes32[]"}),", but the key schema allows ",(0,n.jsx)(s.a,{href:"../services/indexer",children:"offchain indexers"})," to create properly typed composite key columns, and allows MUD to generate ",(0,n.jsx)(s.a,{href:"./table-libraries",children:"typed table libraries"}),"."]}),"\n",(0,n.jsxs)(s.p,{children:["The key schema can contain up to 28 static (fixed length) data types.\nNote that no dynamic (variable length) data types (e.g. arrays, ",(0,n.jsx)(s.code,{children:"bytes"})," or ",(0,n.jsx)(s.code,{children:"string"}),") are supported in the key schema."]}),"\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-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:"Schema"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:", "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"SchemaLib"}),(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/Schema.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:"SchemaType"}),(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/schema-type/src/solidity/SchemaType.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-comment)"},children:"// "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"NOTE"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:": the key schema can only include static types"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"SchemaType[] "}),(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:" keySchemaTypes "}),(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:" SchemaType[]("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"1"}),(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:"keySchemaTypes["}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"] "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" SchemaType.ADDRESS;"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"Schema keySchema "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" SchemaLib."}),(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:"(keySchemaTypes);"})]})]})}),"\n",(0,n.jsx)(s.h4,{id:"value-schema",children:"Value schema"}),"\n",(0,n.jsxs)(s.p,{children:["The value schema represents the data types of the value fields of the table.\nSimilar to key schemas, it allows ",(0,n.jsx)(s.a,{href:"../services/indexer",children:"offchain indexers"})," to create properly typed value columns, and allows MUD to generate ",(0,n.jsx)(s.a,{href:"./table-libraries",children:"typed table libraries"}),"."]}),"\n",(0,n.jsxs)(s.p,{children:["The value schema can contain up to 28 fields in total, of which up to 5 can be dynamic (variable length) data types (e.g. arrays, ",(0,n.jsx)(s.code,{children:"bytes"}),", ",(0,n.jsx)(s.code,{children:"string"}),").\nAll static (fixed length) data types must come before the dynamic data types."]}),"\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-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:"Schema"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:", "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"SchemaLib"}),(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/Schema.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:"SchemaType"}),(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/schema-type/src/solidity/SchemaType.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-comment)"},children:"// "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"NOTE"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:": static types must come before dynamic types"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"SchemaType[] "}),(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:" valueSchemaTypes "}),(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:" SchemaType[]("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"1"}),(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:"valueSchemaTypes["}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"] "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" SchemaType.UINT256;"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"Schema valueSchema "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" SchemaLib."}),(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:"(valueSchemaTypes);"})]})]})}),"\n",(0,n.jsx)(s.h3,{id:"key-and-field-names",children:"Key and field names"}),"\n",(0,n.jsx)(s.p,{children:"Key and (value) field names are simple string arrays, and must have the same length as the key and value schemas respectively."}),"\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-token-constant)"},children:"string"}),(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:" keyNames "}),(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-constant)"},children:"string"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"[]("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"1"}),(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:"keyNames["}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"] "}),(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:'"owner"'}),(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-constant)"},children:"string"}),(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:" fieldNames "}),(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-constant)"},children:"string"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"[]("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"1"}),(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:"fieldNames["}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"] "}),(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:'"balance"'}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:";"})]})]})}),"\n",(0,n.jsx)(s.h3,{id:"field-layout",children:"Field layout"}),"\n",(0,n.jsx)(s.p,{children:"The field layout encodes the byte length of each static data type in the table.\nThis is mostly a way to save gas in onchain operations that require the length of static fields, as it avoids additional steps to translate the schema into the corresponding byte length."}),"\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-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:"FieldLayout"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:", "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"FieldLayoutLib"}),(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/FieldLayout.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-constant)"},children:"uint256"}),(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:" staticFields "}),(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-constant)"},children:"uint256"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"[]("}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"1"}),(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:"staticFields["}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-constant)"},children:"0"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"] "}),(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:"32"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"; "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-comment)"},children:"// The byte length of the first field"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"FieldLayout fieldLayout "}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:"="}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" FieldLayoutLib."}),(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:"(staticFields"}),(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:"0"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:");"})]})]})}),"\n",(0,n.jsx)(s.h3,{id:"manually-register-a-table",children:"Manually register a table"}),"\n",(0,n.jsxs)(s.p,{children:["Registering a table is a prerequisite for writing to the table, and allows ",(0,n.jsx)(s.a,{href:"../services/indexer",children:"offchain indexers"})," to ",(0,n.jsx)(s.a,{href:"/guides/replicating-onchain-state",children:"replicate the onchain state"}),"."]}),"\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-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.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:"IStore store "}),(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:"IStore"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"(STORE_ADDRESS);"})]}),"\n",(0,n.jsxs)(s.span,{className:"line",children:[(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"store."}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-function)"},children:"registerTable"}),(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:"  tableId"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" tableId"}),(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:"  fieldLayout"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" fieldLayout"}),(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:"  keySchema"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" keySchema"}),(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:"  valueSchema"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" valueSchema"}),(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:"  keyNames"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" keyNames"}),(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:"  fieldNames"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-token-keyword)"},children:":"}),(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:" fieldNames"})]}),"\n",(0,n.jsx)(s.span,{className:"line",children:(0,n.jsx)(s.span,{style:{color:"var(--shiki-color-text)"},children:"});"})})]})})]})}s.default=(0,r.j)(d)}},function(e){e.O(0,[3720,2888,179],function(){return e(e.s=40340)}),_N_E=e.O()}]);