[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-sui-walrus-move-integration":3,"mdc-q88qho-key":31,"related-repo-sui-walrus-move-integration":1506,"related-org-sui-walrus-move-integration":1593},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":22,"topics":26,"repo":27,"sourceUrl":29,"mdContent":30},"walrus-move-integration","integrate Walrus blobs in Sui Move","Referencing and wrapping Walrus blobs in Sui Move smart contracts. Use when the user needs to wrap a Walrus Blob object in a custom Move struct, add Walrus as a Move dependency, build a contract that depends on the Walrus package, or integrate on-chain logic with Walrus blob storage. Also use when the user asks about wrapped_blob.move, the Walrus Move package, or how to reference blobs from Move code.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"sui","Sui (Mysten Labs)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fsui.png","MystenLabs",[13,16,19],{"name":14,"slug":8,"type":15},"Sui","tag",{"name":17,"slug":18,"type":15},"Smart Contracts","smart-contracts",{"name":20,"slug":21,"type":15},"Storage","storage",1,"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus-skills","2026-07-16T06:02:53.633159",null,[],{"repoUrl":23,"stars":22,"forks":22,"topics":28,"description":25},[],"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus-skills\u002Ftree\u002FHEAD\u002Fwalrus-move-integration","---\nname: walrus-move-integration\ndescription: >\n  Referencing and wrapping Walrus blobs in Sui Move smart contracts. Use when the user\n  needs to wrap a Walrus Blob object in a custom Move struct, add Walrus as a Move\n  dependency, build a contract that depends on the Walrus package, or integrate on-chain\n  logic with Walrus blob storage. Also use when the user asks about wrapped_blob.move,\n  the Walrus Move package, or how to reference blobs from Move code.\n---\n\n# Walrus Move Integration\n\n> **Source constraint:** All information in this skill is sourced from the\n> [Walrus Move example](https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus\u002Ftree\u002Fmain\u002Fdocs\u002Fexamples\u002Fmove\u002Fwalrus_dep)\n> and the [Walrus documentation](https:\u002F\u002Fdocs.wal.app). When extending this skill,\n> only pull from these sources.\n\nWalrus blobs are represented on-chain as `walrus::blob::Blob` Sui objects. You can reference, wrap, or compose with these objects in your own Move contracts. This enables patterns like NFTs backed by Walrus-stored media, access-controlled document registries, or any on-chain logic that needs to track off-chain blob data.\n\nAll patterns in this skill are derived from:\n- https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus\u002Ftree\u002Fmain\u002Fdocs\u002Fexamples\u002Fmove\u002Fwalrus_dep\n- https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus\u002Ftree\u002Fmain\u002Fcontracts\u002Fwalrus\n\nIf unsure about the Walrus Move API, check the source contracts before answering.\n\n---\n\n## Related skills\n\n| Topic | Skill | Load when |\n|-------|-------|-----------|\n| Move fundamentals | `sui-move` | Writing Move code on Sui (abilities, TxContext, init) |\n| Object model | `object-model` | Ownership types, wrapping, dynamic fields |\n| Project setup | `sui-move-project` | Move.toml configuration, dependencies |\n| Blob lifecycle | `walrus-blob-lifecycle` | Extending, deleting, sharing blobs |\n| Encryption | `walrus-data-security` | Encrypting blob content before storage |\n\n---\n\n## Skill Content\n\n### Key concepts\n\n- **`walrus::blob::Blob`.** The core Move type representing a Walrus blob on-chain. It has the `key` ability (it is a Sui object) but not `store`, which means it cannot be placed inside other objects using direct field embedding in all contexts. Check the latest contract source for current abilities.\n\n- **Wrapping pattern.** Create a custom struct with `key` ability that contains a `Blob` field. This \"wraps\" the blob, giving your contract control over access and transfer. The wrapper struct needs its own `UID`.\n\n- **Wrapping blobs in shared objects.** A `Blob` can be wrapped into any Sui shared object you define, enabling multiple parties to fund and extend it. The Walrus contract provides `shared_blob::SharedBlob` as a reference implementation ([source](https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus\u002Ftree\u002Fmain\u002Fcontracts\u002Fwalrus\u002Fsources\u002Fsystem\u002Fshared_blob.move)), but you can create your own wrapper with custom access control, metadata, or business logic.\n\n### Move.toml setup\n\nAdd the Walrus package as a dependency in your `Move.toml`. The correct `subdir` and `rev` depend on whether you target **testnet** or **mainnet**:\n\n#### Testnet\n\n```toml\n[package]\nname = \"my_walrus_app\"\nedition = \"2024\"\n\n[dependencies]\nSui = { git = \"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fsui.git\", subdir = \"crates\u002Fsui-framework\u002Fpackages\u002Fsui-framework\", rev = \"testnet-v1.35.0\" }\nWalrus = { git = \"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus.git\", rev = \"testnet\", subdir = \"testnet-contracts\u002Fwalrus\" }\n\n[addresses]\nsui = \"0x2\"\nmy_walrus_app = \"0x0\"\n```\n\n#### Mainnet\n\n```toml\n[package]\nname = \"my_walrus_app\"\nedition = \"2024\"\n\n[dependencies]\nSui = { git = \"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fsui.git\", subdir = \"crates\u002Fsui-framework\u002Fpackages\u002Fsui-framework\", rev = \"mainnet-v1.35.0\" }\nWalrus = { git = \"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus.git\", rev = \"main\", subdir = \"contracts\u002Fwalrus\" }\n\n[addresses]\nsui = \"0x2\"\nmy_walrus_app = \"0x0\"\n```\n\n**Critical notes:**\n- Use `edition = \"2024\"`, not `\"2024.beta\"`. The beta edition is outdated.\n- For testnet, use `subdir = \"testnet-contracts\u002Fwalrus\"` (not `contracts\u002Fwalrus`). The testnet contracts are published from a different directory.\n- If you also need the WAL token type, add: `Wal = { git = \"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus.git\", rev = \"testnet\", subdir = \"testnet-contracts\u002Fwal\" }`\n- Pin `rev` to a specific commit hash for reproducible builds rather than using branch names.\n- The Sui framework `rev` must be compatible with the Walrus package's Sui dependency. Check the Walrus repo's `Move.toml` for the expected version.\n\n### Example: WrappedBlob\n\nThe canonical example wraps a `Blob` inside a custom object:\n\n```move\nmodule my_app::wrapped_blob {\n    use walrus::blob::Blob;\n\n    public struct WrappedBlob has key {\n        id: UID,\n        blob: Blob,\n    }\n\n    public fun wrap(blob: Blob, ctx: &mut TxContext): WrappedBlob {\n        WrappedBlob { id: object::new(ctx), blob }\n    }\n}\n```\n\nThis gives your module ownership of the blob. You can add access control, metadata, or business logic around it.\n\n### Building and testing\n\n```sh\n# Build the project\nsui move build\n\n# Run tests\nsui move test\n```\n\nThe Walrus dependency is fetched from Git during build. Ensure network access is available.\n\n### Rules\n\n1. **Pin the Walrus dependency revision.** Use a specific commit hash or tag in `Move.toml` rather than `main` for reproducible builds.\n2. **Match the Sui framework version.** The Sui framework `rev` in your `Move.toml` must be compatible with the Walrus package's Sui dependency. Check the Walrus repo's `Move.toml` for the expected Sui version.\n3. **Wrapped blobs need their own UID.** A wrapper struct must have `key` ability and its own `id: UID` field, not just the blob's UID.\n4. **Lifecycle operations go through the Walrus system contract.** To extend, delete, or certify blobs, interact with the Walrus system contract, not the `Blob` struct directly.\n5. **Blob content is off-chain.** The `Blob` Move object contains metadata (blob ID, size, epoch info). The actual data lives on Walrus storage nodes. To read content, use the CLI, SDK, or HTTP API.\n\n### Debugging `VMVerificationOrDeserializationError`\n\nThis error occurs when publishing or calling a contract that depends on Walrus. Common causes:\n\n1. **Wrong `subdir` for the network.** Testnet contracts are in `testnet-contracts\u002Fwalrus`, not `contracts\u002Fwalrus`. Using the wrong subdir means you build against a different package than what is deployed on-chain.\n2. **Wrong `rev`.** The commit must match a revision where the contracts are compatible with the deployed on-chain package. For testnet, use the `testnet` branch or a pinned commit from that branch.\n3. **Stale `published-at` or `original-id` in Move.lock.** Delete the `Move.lock` file and rebuild.\n4. **Package version mismatch.** Walrus uses versioned shared objects. If you call a function using an old package ID, you get `EWrongVersion` (abort code 1) from `system::inner_mut`. The Walrus SDK\u002FCLI auto-refreshes package IDs, but custom implementations must handle this.\n\nTo find the current package IDs:\n- Check `walrus info` output or the [available networks page](https:\u002F\u002Fdocs.wal.app\u002Fdocs\u002Fsystem-overview\u002Favailable-networks)\n- The client auto-infers package IDs from `system_object` and `staking_object`\n\n### SharedBlob API (reference implementation)\n\nThe `walrus::shared_blob` module is one example of wrapping a `Blob` in a shared object. Developers can freely wrap a `Blob` into their own shared object with custom logic instead.\n\n```move\n\u002F\u002F Create a shared blob from an owned Blob (must be permanent)\nwalrus::shared_blob::new(blob: Blob, ctx: &mut TxContext): SharedBlob\n\n\u002F\u002F Extend a shared blob's lifetime (anyone can call)\nwalrus::shared_blob::extend(shared_blob: &mut SharedBlob, ...)\n```\n\nThe built-in `SharedBlob` is a shared Sui object. Anyone can fund and extend it. It requires a permanent blob.\n\n### Common mistakes\n\n- **Trying to read blob content from Move.** Move contracts only see blob metadata (ID, size, epoch, storage info). Actual blob data is stored off-chain on Walrus storage nodes.\n- **Using `main` as the dependency rev in production.** The `main` branch can change at any time. Pin to a specific commit for stable builds.\n- **Using `contracts\u002Fwalrus` subdir for testnet.** Testnet uses `testnet-contracts\u002Fwalrus`. This is the number one cause of `VMVerificationOrDeserializationError` when publishing to testnet.\n- **Using `edition = \"2024.beta\"`.** Use `edition = \"2024\"`. The beta edition is outdated and can cause build errors.\n- **Mismatched Sui framework versions.** If your Sui framework version does not match what Walrus expects, the build fails with confusing dependency resolution errors. Check the Walrus repo's `Move.toml`.\n- **Forgetting to add the `Walrus` dependency address.** The `walrus` address is provided by the Walrus package dependency. You do not need to add it to `[addresses]`.\n- **Calling Walrus system functions with a stale package ID.** After a Walrus upgrade, the old package ID no longer works. The SDK\u002FCLI handle this automatically, but direct Move contract calls must use the current package. Query the system object to find the latest package ID.\n",{"data":32,"body":33},{"name":4,"description":6},{"type":34,"children":35},"root",[36,44,80,94,99,121,126,130,137,280,283,289,296,396,402,445,451,562,567,653,661,748,754,766,869,874,880,948,953,959,1077,1089,1094,1209,1214,1255,1261,1288,1334,1347,1353,1500],{"type":37,"tag":38,"props":39,"children":40},"element","h1",{"id":4},[41],{"type":42,"value":43},"text","Walrus Move Integration",{"type":37,"tag":45,"props":46,"children":47},"blockquote",{},[48],{"type":37,"tag":49,"props":50,"children":51},"p",{},[52,58,60,69,71,78],{"type":37,"tag":53,"props":54,"children":55},"strong",{},[56],{"type":42,"value":57},"Source constraint:",{"type":42,"value":59}," All information in this skill is sourced from the\n",{"type":37,"tag":61,"props":62,"children":66},"a",{"href":63,"rel":64},"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus\u002Ftree\u002Fmain\u002Fdocs\u002Fexamples\u002Fmove\u002Fwalrus_dep",[65],"nofollow",[67],{"type":42,"value":68},"Walrus Move example",{"type":42,"value":70},"\nand the ",{"type":37,"tag":61,"props":72,"children":75},{"href":73,"rel":74},"https:\u002F\u002Fdocs.wal.app",[65],[76],{"type":42,"value":77},"Walrus documentation",{"type":42,"value":79},". When extending this skill,\nonly pull from these sources.",{"type":37,"tag":49,"props":81,"children":82},{},[83,85,92],{"type":42,"value":84},"Walrus blobs are represented on-chain as ",{"type":37,"tag":86,"props":87,"children":89},"code",{"className":88},[],[90],{"type":42,"value":91},"walrus::blob::Blob",{"type":42,"value":93}," Sui objects. You can reference, wrap, or compose with these objects in your own Move contracts. This enables patterns like NFTs backed by Walrus-stored media, access-controlled document registries, or any on-chain logic that needs to track off-chain blob data.",{"type":37,"tag":49,"props":95,"children":96},{},[97],{"type":42,"value":98},"All patterns in this skill are derived from:",{"type":37,"tag":100,"props":101,"children":102},"ul",{},[103,112],{"type":37,"tag":104,"props":105,"children":106},"li",{},[107],{"type":37,"tag":61,"props":108,"children":110},{"href":63,"rel":109},[65],[111],{"type":42,"value":63},{"type":37,"tag":104,"props":113,"children":114},{},[115],{"type":37,"tag":61,"props":116,"children":119},{"href":117,"rel":118},"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus\u002Ftree\u002Fmain\u002Fcontracts\u002Fwalrus",[65],[120],{"type":42,"value":117},{"type":37,"tag":49,"props":122,"children":123},{},[124],{"type":42,"value":125},"If unsure about the Walrus Move API, check the source contracts before answering.",{"type":37,"tag":127,"props":128,"children":129},"hr",{},[],{"type":37,"tag":131,"props":132,"children":134},"h2",{"id":133},"related-skills",[135],{"type":42,"value":136},"Related skills",{"type":37,"tag":138,"props":139,"children":140},"table",{},[141,165],{"type":37,"tag":142,"props":143,"children":144},"thead",{},[145],{"type":37,"tag":146,"props":147,"children":148},"tr",{},[149,155,160],{"type":37,"tag":150,"props":151,"children":152},"th",{},[153],{"type":42,"value":154},"Topic",{"type":37,"tag":150,"props":156,"children":157},{},[158],{"type":42,"value":159},"Skill",{"type":37,"tag":150,"props":161,"children":162},{},[163],{"type":42,"value":164},"Load when",{"type":37,"tag":166,"props":167,"children":168},"tbody",{},[169,192,214,236,258],{"type":37,"tag":146,"props":170,"children":171},{},[172,178,187],{"type":37,"tag":173,"props":174,"children":175},"td",{},[176],{"type":42,"value":177},"Move fundamentals",{"type":37,"tag":173,"props":179,"children":180},{},[181],{"type":37,"tag":86,"props":182,"children":184},{"className":183},[],[185],{"type":42,"value":186},"sui-move",{"type":37,"tag":173,"props":188,"children":189},{},[190],{"type":42,"value":191},"Writing Move code on Sui (abilities, TxContext, init)",{"type":37,"tag":146,"props":193,"children":194},{},[195,200,209],{"type":37,"tag":173,"props":196,"children":197},{},[198],{"type":42,"value":199},"Object model",{"type":37,"tag":173,"props":201,"children":202},{},[203],{"type":37,"tag":86,"props":204,"children":206},{"className":205},[],[207],{"type":42,"value":208},"object-model",{"type":37,"tag":173,"props":210,"children":211},{},[212],{"type":42,"value":213},"Ownership types, wrapping, dynamic fields",{"type":37,"tag":146,"props":215,"children":216},{},[217,222,231],{"type":37,"tag":173,"props":218,"children":219},{},[220],{"type":42,"value":221},"Project setup",{"type":37,"tag":173,"props":223,"children":224},{},[225],{"type":37,"tag":86,"props":226,"children":228},{"className":227},[],[229],{"type":42,"value":230},"sui-move-project",{"type":37,"tag":173,"props":232,"children":233},{},[234],{"type":42,"value":235},"Move.toml configuration, dependencies",{"type":37,"tag":146,"props":237,"children":238},{},[239,244,253],{"type":37,"tag":173,"props":240,"children":241},{},[242],{"type":42,"value":243},"Blob lifecycle",{"type":37,"tag":173,"props":245,"children":246},{},[247],{"type":37,"tag":86,"props":248,"children":250},{"className":249},[],[251],{"type":42,"value":252},"walrus-blob-lifecycle",{"type":37,"tag":173,"props":254,"children":255},{},[256],{"type":42,"value":257},"Extending, deleting, sharing blobs",{"type":37,"tag":146,"props":259,"children":260},{},[261,266,275],{"type":37,"tag":173,"props":262,"children":263},{},[264],{"type":42,"value":265},"Encryption",{"type":37,"tag":173,"props":267,"children":268},{},[269],{"type":37,"tag":86,"props":270,"children":272},{"className":271},[],[273],{"type":42,"value":274},"walrus-data-security",{"type":37,"tag":173,"props":276,"children":277},{},[278],{"type":42,"value":279},"Encrypting blob content before storage",{"type":37,"tag":127,"props":281,"children":282},{},[],{"type":37,"tag":131,"props":284,"children":286},{"id":285},"skill-content",[287],{"type":42,"value":288},"Skill Content",{"type":37,"tag":290,"props":291,"children":293},"h3",{"id":292},"key-concepts",[294],{"type":42,"value":295},"Key concepts",{"type":37,"tag":100,"props":297,"children":298},{},[299,330,362],{"type":37,"tag":104,"props":300,"children":301},{},[302,312,314,320,322,328],{"type":37,"tag":53,"props":303,"children":304},{},[305,310],{"type":37,"tag":86,"props":306,"children":308},{"className":307},[],[309],{"type":42,"value":91},{"type":42,"value":311},".",{"type":42,"value":313}," The core Move type representing a Walrus blob on-chain. It has the ",{"type":37,"tag":86,"props":315,"children":317},{"className":316},[],[318],{"type":42,"value":319},"key",{"type":42,"value":321}," ability (it is a Sui object) but not ",{"type":37,"tag":86,"props":323,"children":325},{"className":324},[],[326],{"type":42,"value":327},"store",{"type":42,"value":329},", which means it cannot be placed inside other objects using direct field embedding in all contexts. Check the latest contract source for current abilities.",{"type":37,"tag":104,"props":331,"children":332},{},[333,338,340,345,347,353,355,361],{"type":37,"tag":53,"props":334,"children":335},{},[336],{"type":42,"value":337},"Wrapping pattern.",{"type":42,"value":339}," Create a custom struct with ",{"type":37,"tag":86,"props":341,"children":343},{"className":342},[],[344],{"type":42,"value":319},{"type":42,"value":346}," ability that contains a ",{"type":37,"tag":86,"props":348,"children":350},{"className":349},[],[351],{"type":42,"value":352},"Blob",{"type":42,"value":354}," field. This \"wraps\" the blob, giving your contract control over access and transfer. The wrapper struct needs its own ",{"type":37,"tag":86,"props":356,"children":358},{"className":357},[],[359],{"type":42,"value":360},"UID",{"type":42,"value":311},{"type":37,"tag":104,"props":363,"children":364},{},[365,370,372,377,379,385,387,394],{"type":37,"tag":53,"props":366,"children":367},{},[368],{"type":42,"value":369},"Wrapping blobs in shared objects.",{"type":42,"value":371}," A ",{"type":37,"tag":86,"props":373,"children":375},{"className":374},[],[376],{"type":42,"value":352},{"type":42,"value":378}," can be wrapped into any Sui shared object you define, enabling multiple parties to fund and extend it. The Walrus contract provides ",{"type":37,"tag":86,"props":380,"children":382},{"className":381},[],[383],{"type":42,"value":384},"shared_blob::SharedBlob",{"type":42,"value":386}," as a reference implementation (",{"type":37,"tag":61,"props":388,"children":391},{"href":389,"rel":390},"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus\u002Ftree\u002Fmain\u002Fcontracts\u002Fwalrus\u002Fsources\u002Fsystem\u002Fshared_blob.move",[65],[392],{"type":42,"value":393},"source",{"type":42,"value":395},"), but you can create your own wrapper with custom access control, metadata, or business logic.",{"type":37,"tag":290,"props":397,"children":399},{"id":398},"movetoml-setup",[400],{"type":42,"value":401},"Move.toml setup",{"type":37,"tag":49,"props":403,"children":404},{},[405,407,413,415,421,423,429,431,436,438,443],{"type":42,"value":406},"Add the Walrus package as a dependency in your ",{"type":37,"tag":86,"props":408,"children":410},{"className":409},[],[411],{"type":42,"value":412},"Move.toml",{"type":42,"value":414},". The correct ",{"type":37,"tag":86,"props":416,"children":418},{"className":417},[],[419],{"type":42,"value":420},"subdir",{"type":42,"value":422}," and ",{"type":37,"tag":86,"props":424,"children":426},{"className":425},[],[427],{"type":42,"value":428},"rev",{"type":42,"value":430}," depend on whether you target ",{"type":37,"tag":53,"props":432,"children":433},{},[434],{"type":42,"value":435},"testnet",{"type":42,"value":437}," or ",{"type":37,"tag":53,"props":439,"children":440},{},[441],{"type":42,"value":442},"mainnet",{"type":42,"value":444},":",{"type":37,"tag":446,"props":447,"children":448},"h4",{"id":435},[449],{"type":42,"value":450},"Testnet",{"type":37,"tag":452,"props":453,"children":458},"pre",{"className":454,"code":455,"language":456,"meta":457,"style":457},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[package]\nname = \"my_walrus_app\"\nedition = \"2024\"\n\n[dependencies]\nSui = { git = \"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fsui.git\", subdir = \"crates\u002Fsui-framework\u002Fpackages\u002Fsui-framework\", rev = \"testnet-v1.35.0\" }\nWalrus = { git = \"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus.git\", rev = \"testnet\", subdir = \"testnet-contracts\u002Fwalrus\" }\n\n[addresses]\nsui = \"0x2\"\nmy_walrus_app = \"0x0\"\n","toml","",[459],{"type":37,"tag":86,"props":460,"children":461},{"__ignoreMap":457},[462,472,481,490,500,509,518,527,535,544,553],{"type":37,"tag":463,"props":464,"children":466},"span",{"class":465,"line":22},"line",[467],{"type":37,"tag":463,"props":468,"children":469},{},[470],{"type":42,"value":471},"[package]\n",{"type":37,"tag":463,"props":473,"children":475},{"class":465,"line":474},2,[476],{"type":37,"tag":463,"props":477,"children":478},{},[479],{"type":42,"value":480},"name = \"my_walrus_app\"\n",{"type":37,"tag":463,"props":482,"children":484},{"class":465,"line":483},3,[485],{"type":37,"tag":463,"props":486,"children":487},{},[488],{"type":42,"value":489},"edition = \"2024\"\n",{"type":37,"tag":463,"props":491,"children":493},{"class":465,"line":492},4,[494],{"type":37,"tag":463,"props":495,"children":497},{"emptyLinePlaceholder":496},true,[498],{"type":42,"value":499},"\n",{"type":37,"tag":463,"props":501,"children":503},{"class":465,"line":502},5,[504],{"type":37,"tag":463,"props":505,"children":506},{},[507],{"type":42,"value":508},"[dependencies]\n",{"type":37,"tag":463,"props":510,"children":512},{"class":465,"line":511},6,[513],{"type":37,"tag":463,"props":514,"children":515},{},[516],{"type":42,"value":517},"Sui = { git = \"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fsui.git\", subdir = \"crates\u002Fsui-framework\u002Fpackages\u002Fsui-framework\", rev = \"testnet-v1.35.0\" }\n",{"type":37,"tag":463,"props":519,"children":521},{"class":465,"line":520},7,[522],{"type":37,"tag":463,"props":523,"children":524},{},[525],{"type":42,"value":526},"Walrus = { git = \"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus.git\", rev = \"testnet\", subdir = \"testnet-contracts\u002Fwalrus\" }\n",{"type":37,"tag":463,"props":528,"children":530},{"class":465,"line":529},8,[531],{"type":37,"tag":463,"props":532,"children":533},{"emptyLinePlaceholder":496},[534],{"type":42,"value":499},{"type":37,"tag":463,"props":536,"children":538},{"class":465,"line":537},9,[539],{"type":37,"tag":463,"props":540,"children":541},{},[542],{"type":42,"value":543},"[addresses]\n",{"type":37,"tag":463,"props":545,"children":547},{"class":465,"line":546},10,[548],{"type":37,"tag":463,"props":549,"children":550},{},[551],{"type":42,"value":552},"sui = \"0x2\"\n",{"type":37,"tag":463,"props":554,"children":556},{"class":465,"line":555},11,[557],{"type":37,"tag":463,"props":558,"children":559},{},[560],{"type":42,"value":561},"my_walrus_app = \"0x0\"\n",{"type":37,"tag":446,"props":563,"children":564},{"id":442},[565],{"type":42,"value":566},"Mainnet",{"type":37,"tag":452,"props":568,"children":570},{"className":454,"code":569,"language":456,"meta":457,"style":457},"[package]\nname = \"my_walrus_app\"\nedition = \"2024\"\n\n[dependencies]\nSui = { git = \"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fsui.git\", subdir = \"crates\u002Fsui-framework\u002Fpackages\u002Fsui-framework\", rev = \"mainnet-v1.35.0\" }\nWalrus = { git = \"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus.git\", rev = \"main\", subdir = \"contracts\u002Fwalrus\" }\n\n[addresses]\nsui = \"0x2\"\nmy_walrus_app = \"0x0\"\n",[571],{"type":37,"tag":86,"props":572,"children":573},{"__ignoreMap":457},[574,581,588,595,602,609,617,625,632,639,646],{"type":37,"tag":463,"props":575,"children":576},{"class":465,"line":22},[577],{"type":37,"tag":463,"props":578,"children":579},{},[580],{"type":42,"value":471},{"type":37,"tag":463,"props":582,"children":583},{"class":465,"line":474},[584],{"type":37,"tag":463,"props":585,"children":586},{},[587],{"type":42,"value":480},{"type":37,"tag":463,"props":589,"children":590},{"class":465,"line":483},[591],{"type":37,"tag":463,"props":592,"children":593},{},[594],{"type":42,"value":489},{"type":37,"tag":463,"props":596,"children":597},{"class":465,"line":492},[598],{"type":37,"tag":463,"props":599,"children":600},{"emptyLinePlaceholder":496},[601],{"type":42,"value":499},{"type":37,"tag":463,"props":603,"children":604},{"class":465,"line":502},[605],{"type":37,"tag":463,"props":606,"children":607},{},[608],{"type":42,"value":508},{"type":37,"tag":463,"props":610,"children":611},{"class":465,"line":511},[612],{"type":37,"tag":463,"props":613,"children":614},{},[615],{"type":42,"value":616},"Sui = { git = \"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fsui.git\", subdir = \"crates\u002Fsui-framework\u002Fpackages\u002Fsui-framework\", rev = \"mainnet-v1.35.0\" }\n",{"type":37,"tag":463,"props":618,"children":619},{"class":465,"line":520},[620],{"type":37,"tag":463,"props":621,"children":622},{},[623],{"type":42,"value":624},"Walrus = { git = \"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus.git\", rev = \"main\", subdir = \"contracts\u002Fwalrus\" }\n",{"type":37,"tag":463,"props":626,"children":627},{"class":465,"line":529},[628],{"type":37,"tag":463,"props":629,"children":630},{"emptyLinePlaceholder":496},[631],{"type":42,"value":499},{"type":37,"tag":463,"props":633,"children":634},{"class":465,"line":537},[635],{"type":37,"tag":463,"props":636,"children":637},{},[638],{"type":42,"value":543},{"type":37,"tag":463,"props":640,"children":641},{"class":465,"line":546},[642],{"type":37,"tag":463,"props":643,"children":644},{},[645],{"type":42,"value":552},{"type":37,"tag":463,"props":647,"children":648},{"class":465,"line":555},[649],{"type":37,"tag":463,"props":650,"children":651},{},[652],{"type":42,"value":561},{"type":37,"tag":49,"props":654,"children":655},{},[656],{"type":37,"tag":53,"props":657,"children":658},{},[659],{"type":42,"value":660},"Critical notes:",{"type":37,"tag":100,"props":662,"children":663},{},[664,685,706,717,729],{"type":37,"tag":104,"props":665,"children":666},{},[667,669,675,677,683],{"type":42,"value":668},"Use ",{"type":37,"tag":86,"props":670,"children":672},{"className":671},[],[673],{"type":42,"value":674},"edition = \"2024\"",{"type":42,"value":676},", not ",{"type":37,"tag":86,"props":678,"children":680},{"className":679},[],[681],{"type":42,"value":682},"\"2024.beta\"",{"type":42,"value":684},". The beta edition is outdated.",{"type":37,"tag":104,"props":686,"children":687},{},[688,690,696,698,704],{"type":42,"value":689},"For testnet, use ",{"type":37,"tag":86,"props":691,"children":693},{"className":692},[],[694],{"type":42,"value":695},"subdir = \"testnet-contracts\u002Fwalrus\"",{"type":42,"value":697}," (not ",{"type":37,"tag":86,"props":699,"children":701},{"className":700},[],[702],{"type":42,"value":703},"contracts\u002Fwalrus",{"type":42,"value":705},"). The testnet contracts are published from a different directory.",{"type":37,"tag":104,"props":707,"children":708},{},[709,711],{"type":42,"value":710},"If you also need the WAL token type, add: ",{"type":37,"tag":86,"props":712,"children":714},{"className":713},[],[715],{"type":42,"value":716},"Wal = { git = \"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus.git\", rev = \"testnet\", subdir = \"testnet-contracts\u002Fwal\" }",{"type":37,"tag":104,"props":718,"children":719},{},[720,722,727],{"type":42,"value":721},"Pin ",{"type":37,"tag":86,"props":723,"children":725},{"className":724},[],[726],{"type":42,"value":428},{"type":42,"value":728}," to a specific commit hash for reproducible builds rather than using branch names.",{"type":37,"tag":104,"props":730,"children":731},{},[732,734,739,741,746],{"type":42,"value":733},"The Sui framework ",{"type":37,"tag":86,"props":735,"children":737},{"className":736},[],[738],{"type":42,"value":428},{"type":42,"value":740}," must be compatible with the Walrus package's Sui dependency. Check the Walrus repo's ",{"type":37,"tag":86,"props":742,"children":744},{"className":743},[],[745],{"type":42,"value":412},{"type":42,"value":747}," for the expected version.",{"type":37,"tag":290,"props":749,"children":751},{"id":750},"example-wrappedblob",[752],{"type":42,"value":753},"Example: WrappedBlob",{"type":37,"tag":49,"props":755,"children":756},{},[757,759,764],{"type":42,"value":758},"The canonical example wraps a ",{"type":37,"tag":86,"props":760,"children":762},{"className":761},[],[763],{"type":42,"value":352},{"type":42,"value":765}," inside a custom object:",{"type":37,"tag":452,"props":767,"children":771},{"className":768,"code":769,"language":770,"meta":457,"style":457},"language-move shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","module my_app::wrapped_blob {\n    use walrus::blob::Blob;\n\n    public struct WrappedBlob has key {\n        id: UID,\n        blob: Blob,\n    }\n\n    public fun wrap(blob: Blob, ctx: &mut TxContext): WrappedBlob {\n        WrappedBlob { id: object::new(ctx), blob }\n    }\n}\n","move",[772],{"type":37,"tag":86,"props":773,"children":774},{"__ignoreMap":457},[775,783,791,798,806,814,822,830,837,845,853,860],{"type":37,"tag":463,"props":776,"children":777},{"class":465,"line":22},[778],{"type":37,"tag":463,"props":779,"children":780},{},[781],{"type":42,"value":782},"module my_app::wrapped_blob {\n",{"type":37,"tag":463,"props":784,"children":785},{"class":465,"line":474},[786],{"type":37,"tag":463,"props":787,"children":788},{},[789],{"type":42,"value":790},"    use walrus::blob::Blob;\n",{"type":37,"tag":463,"props":792,"children":793},{"class":465,"line":483},[794],{"type":37,"tag":463,"props":795,"children":796},{"emptyLinePlaceholder":496},[797],{"type":42,"value":499},{"type":37,"tag":463,"props":799,"children":800},{"class":465,"line":492},[801],{"type":37,"tag":463,"props":802,"children":803},{},[804],{"type":42,"value":805},"    public struct WrappedBlob has key {\n",{"type":37,"tag":463,"props":807,"children":808},{"class":465,"line":502},[809],{"type":37,"tag":463,"props":810,"children":811},{},[812],{"type":42,"value":813},"        id: UID,\n",{"type":37,"tag":463,"props":815,"children":816},{"class":465,"line":511},[817],{"type":37,"tag":463,"props":818,"children":819},{},[820],{"type":42,"value":821},"        blob: Blob,\n",{"type":37,"tag":463,"props":823,"children":824},{"class":465,"line":520},[825],{"type":37,"tag":463,"props":826,"children":827},{},[828],{"type":42,"value":829},"    }\n",{"type":37,"tag":463,"props":831,"children":832},{"class":465,"line":529},[833],{"type":37,"tag":463,"props":834,"children":835},{"emptyLinePlaceholder":496},[836],{"type":42,"value":499},{"type":37,"tag":463,"props":838,"children":839},{"class":465,"line":537},[840],{"type":37,"tag":463,"props":841,"children":842},{},[843],{"type":42,"value":844},"    public fun wrap(blob: Blob, ctx: &mut TxContext): WrappedBlob {\n",{"type":37,"tag":463,"props":846,"children":847},{"class":465,"line":546},[848],{"type":37,"tag":463,"props":849,"children":850},{},[851],{"type":42,"value":852},"        WrappedBlob { id: object::new(ctx), blob }\n",{"type":37,"tag":463,"props":854,"children":855},{"class":465,"line":555},[856],{"type":37,"tag":463,"props":857,"children":858},{},[859],{"type":42,"value":829},{"type":37,"tag":463,"props":861,"children":863},{"class":465,"line":862},12,[864],{"type":37,"tag":463,"props":865,"children":866},{},[867],{"type":42,"value":868},"}\n",{"type":37,"tag":49,"props":870,"children":871},{},[872],{"type":42,"value":873},"This gives your module ownership of the blob. You can add access control, metadata, or business logic around it.",{"type":37,"tag":290,"props":875,"children":877},{"id":876},"building-and-testing",[878],{"type":42,"value":879},"Building and testing",{"type":37,"tag":452,"props":881,"children":885},{"className":882,"code":883,"language":884,"meta":457,"style":457},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Build the project\nsui move build\n\n# Run tests\nsui move test\n","sh",[886],{"type":37,"tag":86,"props":887,"children":888},{"__ignoreMap":457},[889,898,917,924,932],{"type":37,"tag":463,"props":890,"children":891},{"class":465,"line":22},[892],{"type":37,"tag":463,"props":893,"children":895},{"style":894},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[896],{"type":42,"value":897},"# Build the project\n",{"type":37,"tag":463,"props":899,"children":900},{"class":465,"line":474},[901,906,912],{"type":37,"tag":463,"props":902,"children":904},{"style":903},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[905],{"type":42,"value":8},{"type":37,"tag":463,"props":907,"children":909},{"style":908},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[910],{"type":42,"value":911}," move",{"type":37,"tag":463,"props":913,"children":914},{"style":908},[915],{"type":42,"value":916}," build\n",{"type":37,"tag":463,"props":918,"children":919},{"class":465,"line":483},[920],{"type":37,"tag":463,"props":921,"children":922},{"emptyLinePlaceholder":496},[923],{"type":42,"value":499},{"type":37,"tag":463,"props":925,"children":926},{"class":465,"line":492},[927],{"type":37,"tag":463,"props":928,"children":929},{"style":894},[930],{"type":42,"value":931},"# Run tests\n",{"type":37,"tag":463,"props":933,"children":934},{"class":465,"line":502},[935,939,943],{"type":37,"tag":463,"props":936,"children":937},{"style":903},[938],{"type":42,"value":8},{"type":37,"tag":463,"props":940,"children":941},{"style":908},[942],{"type":42,"value":911},{"type":37,"tag":463,"props":944,"children":945},{"style":908},[946],{"type":42,"value":947}," test\n",{"type":37,"tag":49,"props":949,"children":950},{},[951],{"type":42,"value":952},"The Walrus dependency is fetched from Git during build. Ensure network access is available.",{"type":37,"tag":290,"props":954,"children":956},{"id":955},"rules",[957],{"type":42,"value":958},"Rules",{"type":37,"tag":960,"props":961,"children":962},"ol",{},[963,988,1018,1043,1060],{"type":37,"tag":104,"props":964,"children":965},{},[966,971,973,978,980,986],{"type":37,"tag":53,"props":967,"children":968},{},[969],{"type":42,"value":970},"Pin the Walrus dependency revision.",{"type":42,"value":972}," Use a specific commit hash or tag in ",{"type":37,"tag":86,"props":974,"children":976},{"className":975},[],[977],{"type":42,"value":412},{"type":42,"value":979}," rather than ",{"type":37,"tag":86,"props":981,"children":983},{"className":982},[],[984],{"type":42,"value":985},"main",{"type":42,"value":987}," for reproducible builds.",{"type":37,"tag":104,"props":989,"children":990},{},[991,996,998,1003,1005,1010,1011,1016],{"type":37,"tag":53,"props":992,"children":993},{},[994],{"type":42,"value":995},"Match the Sui framework version.",{"type":42,"value":997}," The Sui framework ",{"type":37,"tag":86,"props":999,"children":1001},{"className":1000},[],[1002],{"type":42,"value":428},{"type":42,"value":1004}," in your ",{"type":37,"tag":86,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":42,"value":412},{"type":42,"value":740},{"type":37,"tag":86,"props":1012,"children":1014},{"className":1013},[],[1015],{"type":42,"value":412},{"type":42,"value":1017}," for the expected Sui version.",{"type":37,"tag":104,"props":1019,"children":1020},{},[1021,1026,1028,1033,1035,1041],{"type":37,"tag":53,"props":1022,"children":1023},{},[1024],{"type":42,"value":1025},"Wrapped blobs need their own UID.",{"type":42,"value":1027}," A wrapper struct must have ",{"type":37,"tag":86,"props":1029,"children":1031},{"className":1030},[],[1032],{"type":42,"value":319},{"type":42,"value":1034}," ability and its own ",{"type":37,"tag":86,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":42,"value":1040},"id: UID",{"type":42,"value":1042}," field, not just the blob's UID.",{"type":37,"tag":104,"props":1044,"children":1045},{},[1046,1051,1053,1058],{"type":37,"tag":53,"props":1047,"children":1048},{},[1049],{"type":42,"value":1050},"Lifecycle operations go through the Walrus system contract.",{"type":42,"value":1052}," To extend, delete, or certify blobs, interact with the Walrus system contract, not the ",{"type":37,"tag":86,"props":1054,"children":1056},{"className":1055},[],[1057],{"type":42,"value":352},{"type":42,"value":1059}," struct directly.",{"type":37,"tag":104,"props":1061,"children":1062},{},[1063,1068,1070,1075],{"type":37,"tag":53,"props":1064,"children":1065},{},[1066],{"type":42,"value":1067},"Blob content is off-chain.",{"type":42,"value":1069}," The ",{"type":37,"tag":86,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":42,"value":352},{"type":42,"value":1076}," Move object contains metadata (blob ID, size, epoch info). The actual data lives on Walrus storage nodes. To read content, use the CLI, SDK, or HTTP API.",{"type":37,"tag":290,"props":1078,"children":1080},{"id":1079},"debugging-vmverificationordeserializationerror",[1081,1083],{"type":42,"value":1082},"Debugging ",{"type":37,"tag":86,"props":1084,"children":1086},{"className":1085},[],[1087],{"type":42,"value":1088},"VMVerificationOrDeserializationError",{"type":37,"tag":49,"props":1090,"children":1091},{},[1092],{"type":42,"value":1093},"This error occurs when publishing or calling a contract that depends on Walrus. Common causes:",{"type":37,"tag":960,"props":1095,"children":1096},{},[1097,1128,1150,1183],{"type":37,"tag":104,"props":1098,"children":1099},{},[1100,1112,1114,1120,1121,1126],{"type":37,"tag":53,"props":1101,"children":1102},{},[1103,1105,1110],{"type":42,"value":1104},"Wrong ",{"type":37,"tag":86,"props":1106,"children":1108},{"className":1107},[],[1109],{"type":42,"value":420},{"type":42,"value":1111}," for the network.",{"type":42,"value":1113}," Testnet contracts are in ",{"type":37,"tag":86,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":42,"value":1119},"testnet-contracts\u002Fwalrus",{"type":42,"value":676},{"type":37,"tag":86,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":42,"value":703},{"type":42,"value":1127},". Using the wrong subdir means you build against a different package than what is deployed on-chain.",{"type":37,"tag":104,"props":1129,"children":1130},{},[1131,1141,1143,1148],{"type":37,"tag":53,"props":1132,"children":1133},{},[1134,1135,1140],{"type":42,"value":1104},{"type":37,"tag":86,"props":1136,"children":1138},{"className":1137},[],[1139],{"type":42,"value":428},{"type":42,"value":311},{"type":42,"value":1142}," The commit must match a revision where the contracts are compatible with the deployed on-chain package. For testnet, use the ",{"type":37,"tag":86,"props":1144,"children":1146},{"className":1145},[],[1147],{"type":42,"value":435},{"type":42,"value":1149}," branch or a pinned commit from that branch.",{"type":37,"tag":104,"props":1151,"children":1152},{},[1153,1173,1175,1181],{"type":37,"tag":53,"props":1154,"children":1155},{},[1156,1158,1164,1165,1171],{"type":42,"value":1157},"Stale ",{"type":37,"tag":86,"props":1159,"children":1161},{"className":1160},[],[1162],{"type":42,"value":1163},"published-at",{"type":42,"value":437},{"type":37,"tag":86,"props":1166,"children":1168},{"className":1167},[],[1169],{"type":42,"value":1170},"original-id",{"type":42,"value":1172}," in Move.lock.",{"type":42,"value":1174}," Delete the ",{"type":37,"tag":86,"props":1176,"children":1178},{"className":1177},[],[1179],{"type":42,"value":1180},"Move.lock",{"type":42,"value":1182}," file and rebuild.",{"type":37,"tag":104,"props":1184,"children":1185},{},[1186,1191,1193,1199,1201,1207],{"type":37,"tag":53,"props":1187,"children":1188},{},[1189],{"type":42,"value":1190},"Package version mismatch.",{"type":42,"value":1192}," Walrus uses versioned shared objects. If you call a function using an old package ID, you get ",{"type":37,"tag":86,"props":1194,"children":1196},{"className":1195},[],[1197],{"type":42,"value":1198},"EWrongVersion",{"type":42,"value":1200}," (abort code 1) from ",{"type":37,"tag":86,"props":1202,"children":1204},{"className":1203},[],[1205],{"type":42,"value":1206},"system::inner_mut",{"type":42,"value":1208},". The Walrus SDK\u002FCLI auto-refreshes package IDs, but custom implementations must handle this.",{"type":37,"tag":49,"props":1210,"children":1211},{},[1212],{"type":42,"value":1213},"To find the current package IDs:",{"type":37,"tag":100,"props":1215,"children":1216},{},[1217,1237],{"type":37,"tag":104,"props":1218,"children":1219},{},[1220,1222,1228,1230],{"type":42,"value":1221},"Check ",{"type":37,"tag":86,"props":1223,"children":1225},{"className":1224},[],[1226],{"type":42,"value":1227},"walrus info",{"type":42,"value":1229}," output or the ",{"type":37,"tag":61,"props":1231,"children":1234},{"href":1232,"rel":1233},"https:\u002F\u002Fdocs.wal.app\u002Fdocs\u002Fsystem-overview\u002Favailable-networks",[65],[1235],{"type":42,"value":1236},"available networks page",{"type":37,"tag":104,"props":1238,"children":1239},{},[1240,1242,1248,1249],{"type":42,"value":1241},"The client auto-infers package IDs from ",{"type":37,"tag":86,"props":1243,"children":1245},{"className":1244},[],[1246],{"type":42,"value":1247},"system_object",{"type":42,"value":422},{"type":37,"tag":86,"props":1250,"children":1252},{"className":1251},[],[1253],{"type":42,"value":1254},"staking_object",{"type":37,"tag":290,"props":1256,"children":1258},{"id":1257},"sharedblob-api-reference-implementation",[1259],{"type":42,"value":1260},"SharedBlob API (reference implementation)",{"type":37,"tag":49,"props":1262,"children":1263},{},[1264,1266,1272,1274,1279,1281,1286],{"type":42,"value":1265},"The ",{"type":37,"tag":86,"props":1267,"children":1269},{"className":1268},[],[1270],{"type":42,"value":1271},"walrus::shared_blob",{"type":42,"value":1273}," module is one example of wrapping a ",{"type":37,"tag":86,"props":1275,"children":1277},{"className":1276},[],[1278],{"type":42,"value":352},{"type":42,"value":1280}," in a shared object. Developers can freely wrap a ",{"type":37,"tag":86,"props":1282,"children":1284},{"className":1283},[],[1285],{"type":42,"value":352},{"type":42,"value":1287}," into their own shared object with custom logic instead.",{"type":37,"tag":452,"props":1289,"children":1291},{"className":768,"code":1290,"language":770,"meta":457,"style":457},"\u002F\u002F Create a shared blob from an owned Blob (must be permanent)\nwalrus::shared_blob::new(blob: Blob, ctx: &mut TxContext): SharedBlob\n\n\u002F\u002F Extend a shared blob's lifetime (anyone can call)\nwalrus::shared_blob::extend(shared_blob: &mut SharedBlob, ...)\n",[1292],{"type":37,"tag":86,"props":1293,"children":1294},{"__ignoreMap":457},[1295,1303,1311,1318,1326],{"type":37,"tag":463,"props":1296,"children":1297},{"class":465,"line":22},[1298],{"type":37,"tag":463,"props":1299,"children":1300},{},[1301],{"type":42,"value":1302},"\u002F\u002F Create a shared blob from an owned Blob (must be permanent)\n",{"type":37,"tag":463,"props":1304,"children":1305},{"class":465,"line":474},[1306],{"type":37,"tag":463,"props":1307,"children":1308},{},[1309],{"type":42,"value":1310},"walrus::shared_blob::new(blob: Blob, ctx: &mut TxContext): SharedBlob\n",{"type":37,"tag":463,"props":1312,"children":1313},{"class":465,"line":483},[1314],{"type":37,"tag":463,"props":1315,"children":1316},{"emptyLinePlaceholder":496},[1317],{"type":42,"value":499},{"type":37,"tag":463,"props":1319,"children":1320},{"class":465,"line":492},[1321],{"type":37,"tag":463,"props":1322,"children":1323},{},[1324],{"type":42,"value":1325},"\u002F\u002F Extend a shared blob's lifetime (anyone can call)\n",{"type":37,"tag":463,"props":1327,"children":1328},{"class":465,"line":502},[1329],{"type":37,"tag":463,"props":1330,"children":1331},{},[1332],{"type":42,"value":1333},"walrus::shared_blob::extend(shared_blob: &mut SharedBlob, ...)\n",{"type":37,"tag":49,"props":1335,"children":1336},{},[1337,1339,1345],{"type":42,"value":1338},"The built-in ",{"type":37,"tag":86,"props":1340,"children":1342},{"className":1341},[],[1343],{"type":42,"value":1344},"SharedBlob",{"type":42,"value":1346}," is a shared Sui object. Anyone can fund and extend it. It requires a permanent blob.",{"type":37,"tag":290,"props":1348,"children":1350},{"id":1349},"common-mistakes",[1351],{"type":42,"value":1352},"Common mistakes",{"type":37,"tag":100,"props":1354,"children":1355},{},[1356,1366,1389,1419,1442,1458,1490],{"type":37,"tag":104,"props":1357,"children":1358},{},[1359,1364],{"type":37,"tag":53,"props":1360,"children":1361},{},[1362],{"type":42,"value":1363},"Trying to read blob content from Move.",{"type":42,"value":1365}," Move contracts only see blob metadata (ID, size, epoch, storage info). Actual blob data is stored off-chain on Walrus storage nodes.",{"type":37,"tag":104,"props":1367,"children":1368},{},[1369,1381,1382,1387],{"type":37,"tag":53,"props":1370,"children":1371},{},[1372,1374,1379],{"type":42,"value":1373},"Using ",{"type":37,"tag":86,"props":1375,"children":1377},{"className":1376},[],[1378],{"type":42,"value":985},{"type":42,"value":1380}," as the dependency rev in production.",{"type":42,"value":1069},{"type":37,"tag":86,"props":1383,"children":1385},{"className":1384},[],[1386],{"type":42,"value":985},{"type":42,"value":1388}," branch can change at any time. Pin to a specific commit for stable builds.",{"type":37,"tag":104,"props":1390,"children":1391},{},[1392,1403,1405,1410,1412,1417],{"type":37,"tag":53,"props":1393,"children":1394},{},[1395,1396,1401],{"type":42,"value":1373},{"type":37,"tag":86,"props":1397,"children":1399},{"className":1398},[],[1400],{"type":42,"value":703},{"type":42,"value":1402}," subdir for testnet.",{"type":42,"value":1404}," Testnet uses ",{"type":37,"tag":86,"props":1406,"children":1408},{"className":1407},[],[1409],{"type":42,"value":1119},{"type":42,"value":1411},". This is the number one cause of ",{"type":37,"tag":86,"props":1413,"children":1415},{"className":1414},[],[1416],{"type":42,"value":1088},{"type":42,"value":1418}," when publishing to testnet.",{"type":37,"tag":104,"props":1420,"children":1421},{},[1422,1433,1435,1440],{"type":37,"tag":53,"props":1423,"children":1424},{},[1425,1426,1432],{"type":42,"value":1373},{"type":37,"tag":86,"props":1427,"children":1429},{"className":1428},[],[1430],{"type":42,"value":1431},"edition = \"2024.beta\"",{"type":42,"value":311},{"type":42,"value":1434}," Use ",{"type":37,"tag":86,"props":1436,"children":1438},{"className":1437},[],[1439],{"type":42,"value":674},{"type":42,"value":1441},". The beta edition is outdated and can cause build errors.",{"type":37,"tag":104,"props":1443,"children":1444},{},[1445,1450,1452,1457],{"type":37,"tag":53,"props":1446,"children":1447},{},[1448],{"type":42,"value":1449},"Mismatched Sui framework versions.",{"type":42,"value":1451}," If your Sui framework version does not match what Walrus expects, the build fails with confusing dependency resolution errors. Check the Walrus repo's ",{"type":37,"tag":86,"props":1453,"children":1455},{"className":1454},[],[1456],{"type":42,"value":412},{"type":42,"value":311},{"type":37,"tag":104,"props":1459,"children":1460},{},[1461,1474,1475,1481,1483,1489],{"type":37,"tag":53,"props":1462,"children":1463},{},[1464,1466,1472],{"type":42,"value":1465},"Forgetting to add the ",{"type":37,"tag":86,"props":1467,"children":1469},{"className":1468},[],[1470],{"type":42,"value":1471},"Walrus",{"type":42,"value":1473}," dependency address.",{"type":42,"value":1069},{"type":37,"tag":86,"props":1476,"children":1478},{"className":1477},[],[1479],{"type":42,"value":1480},"walrus",{"type":42,"value":1482}," address is provided by the Walrus package dependency. You do not need to add it to ",{"type":37,"tag":86,"props":1484,"children":1486},{"className":1485},[],[1487],{"type":42,"value":1488},"[addresses]",{"type":42,"value":311},{"type":37,"tag":104,"props":1491,"children":1492},{},[1493,1498],{"type":37,"tag":53,"props":1494,"children":1495},{},[1496],{"type":42,"value":1497},"Calling Walrus system functions with a stale package ID.",{"type":42,"value":1499}," After a Walrus upgrade, the old package ID no longer works. The SDK\u002FCLI handle this automatically, but direct Move contract calls must use the current package. Query the system object to find the latest package ID.",{"type":37,"tag":1501,"props":1502,"children":1503},"style",{},[1504],{"type":42,"value":1505},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1507,"total":555},[1508,1519,1531,1547,1560,1575,1581],{"slug":252,"name":252,"fn":1509,"description":1510,"org":1511,"tags":1512,"stars":22,"repoUrl":23,"updatedAt":1518},"manage Walrus blob lifecycles","Managing Walrus blob lifecycles: epochs, lifetimes, extending blobs, deleting blobs, burning blob objects, sharing blobs, setting blob attributes, and handling large uploads. Use when the user needs to extend a blob's lifetime, delete or burn blobs, create shared blobs, set\u002Fget\u002Fremove blob attributes, plan large data uploads (>1 GiB), estimate storage costs, manage concurrent upload memory, or understand epoch-based expiration. For basic store\u002Fread, see `walrus-cli`. For quilts, see `walrus-quilts`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1513,1514,1515],{"name":20,"slug":21,"type":15},{"name":14,"slug":8,"type":15},{"name":1516,"slug":1517,"type":15},"Web3","web3","2026-07-16T06:01:49.056917",{"slug":1520,"name":1520,"fn":1521,"description":1522,"org":1523,"tags":1524,"stars":22,"repoUrl":23,"updatedAt":1530},"walrus-cli","manage Walrus blobs via CLI","Walrus CLI client for storing, reading, and managing blobs from the command line. Use when the user needs to run walrus store, walrus read, walrus blob-status, walrus extend, walrus delete, walrus share, or any other walrus CLI command. Also use for CLI installation, configuration (client_config.yaml), JSON mode for scripting, gas budgets, wallet configuration, and logging. For blob lifecycle management details, see `walrus-blob-lifecycle`. For quilts, see `walrus-quilts`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1525,1528,1529],{"name":1526,"slug":1527,"type":15},"CLI","cli",{"name":20,"slug":21,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:02:52.586222",{"slug":274,"name":274,"fn":1532,"description":1533,"org":1534,"tags":1535,"stars":22,"repoUrl":23,"updatedAt":1546},"encrypt and store data on Walrus","Encrypting data before storing on Walrus using Seal (threshold encryption with onchain access control). Use when the user needs to store private or sensitive data on Walrus, implement access control for blob content, encrypt blobs before uploading, use @mysten\u002Fseal for threshold encryption, or understand Walrus data security guarantees (availability, integrity, confidentiality). Also use when the user asks about Nautilus (TEE-based off-chain computation) in the context of Walrus data. All blobs on Walrus are public by default.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1536,1539,1541,1544,1545],{"name":1537,"slug":1538,"type":15},"Access Control","access-control",{"name":265,"slug":1540,"type":15},"encryption",{"name":1542,"slug":1543,"type":15},"Security","security",{"name":20,"slug":21,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:01:48.700594",{"slug":1548,"name":1548,"fn":1549,"description":1550,"org":1551,"tags":1552,"stars":22,"repoUrl":23,"updatedAt":1559},"walrus-http-api","store and read Walrus blobs via HTTP","Walrus publisher and aggregator REST API for storing and reading blobs over HTTP. Use when the user needs to store or read Walrus blobs using HTTP PUT\u002FGET requests, integrate Walrus from any programming language, configure storage options (epochs, deletable, permanent, send_object_to), or parse store\u002Fread API responses. Also use when troubleshooting HTTP API errors or CDN caching issues after upload. For quilt HTTP endpoints, see the `walrus-quilts` skill. For CLI usage, see `walrus-cli`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1553,1556,1557,1558],{"name":1554,"slug":1555,"type":15},"REST API","rest-api",{"name":20,"slug":21,"type":15},{"name":14,"slug":8,"type":15},{"name":1516,"slug":1517,"type":15},"2026-07-16T06:01:48.340552",{"slug":1561,"name":1561,"fn":1562,"description":1563,"org":1564,"tags":1565,"stars":22,"repoUrl":23,"updatedAt":1574},"walrus-memory","integrate persistent memory with Walrus","Walrus Memory (MemWal) — persistent, portable, encrypted memory for AI agents. Use when the user needs to give an AI agent persistent memory across sessions and apps, integrate the @mysten-incubation\u002Fmemwal TypeScript SDK or Python memwal SDK, set up the Walrus Memory MCP server for Cursor\u002FClaude\u002FCodex, configure remember\u002Frecall\u002Fanalyze\u002Frestore operations, manage memory spaces and namespaces, set up delegate keys and accounts, self-host the relayer, or use withMemWal AI middleware (Vercel AI SDK, LangChain, OpenAI SDK). Also use when the user asks about MemWal, Walrus Memory, agent memory, memory spaces, or the memwal-mcp package.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1566,1569,1570,1573],{"name":1567,"slug":1568,"type":15},"Agents","agents",{"name":265,"slug":1540,"type":15},{"name":1571,"slug":1572,"type":15},"Memory","memory",{"name":14,"slug":8,"type":15},"2026-07-29T05:39:21.825246",{"slug":4,"name":4,"fn":5,"description":6,"org":1576,"tags":1577,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1578,1579,1580],{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":14,"slug":8,"type":15},{"slug":1582,"name":1582,"fn":1583,"description":1584,"org":1585,"tags":1586,"stars":22,"repoUrl":23,"updatedAt":1592},"walrus-overview","provide overview of Walrus storage","High-level overview of Walrus: what it is, how it works, and which tool to use. Use when the user is new to Walrus, asks \"what is Walrus\", \"how does Walrus work\", \"what is a blob\", or needs to choose between CLI, HTTP API, TypeScript SDK, and Move integration. Also use when explaining Walrus architecture, comparing Walrus to AWS S3 or IPFS, explaining the publisher\u002Faggregator\u002Fupload relay distinction, or clarifying blob ID vs Sui object ID. This is the entry-point skill for Walrus newcomers.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1587,1590,1591],{"name":1588,"slug":1589,"type":15},"Documentation","documentation",{"name":20,"slug":21,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:02:52.247749",{"items":1594,"total":1756},[1595,1611,1620,1630,1643,1657,1670,1683,1704,1716,1727,1743],{"slug":1596,"name":1596,"fn":1597,"description":1598,"org":1599,"tags":1600,"stars":1608,"repoUrl":1609,"updatedAt":1610},"move-bytecode-comprehension","analyze and disassemble Move bytecode","Use when reading or reasoning about compiled Move bytecode or `sui move disassemble` output. Mental model for the binary format, what survives compilation (and what's lost), and how to read disassembly soundly. Trigger on \"what does this package do?\", \"read this .mv module\", \"interpret this disassembly\", or whenever an analysis needs to interpret bytecode faithfully.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1601,1604,1607],{"name":1602,"slug":1603,"type":15},"Code Analysis","code-analysis",{"name":1605,"slug":1606,"type":15},"Engineering","engineering",{"name":14,"slug":8,"type":15},7724,"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fsui","2026-07-16T05:59:32.904886",{"slug":1612,"name":1612,"fn":1613,"description":1614,"org":1615,"tags":1616,"stars":1608,"repoUrl":1609,"updatedAt":1619},"official-sui-skills","access official Sui development resources","Pointer to the official Mysten Labs skills for building on Sui — language fundamentals, object model, PTBs, SDKs, publishing, upgrades, frontend integration, accessing on-chain data. Maintained upstream at github.com\u002FMystenLabs\u002Fskills; pinned to the same ref the audit catalog derives from (see maintenance\u002FUPSTREAMS.md). Trigger on \"build a contract\", \"publish a package\", \"upgrade a module or package\", \"use the TypeScript SDK\", \"write a PTB\", \"set up a Sui client\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1617,1618],{"name":1588,"slug":1589,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:00:59.641382",{"slug":1621,"name":1621,"fn":1622,"description":1623,"org":1624,"tags":1625,"stars":1608,"repoUrl":1609,"updatedAt":1629},"sui-and-move-tools","disassemble Sui Move bytecode","Use to get bytecode for a deployed Sui package and produce a disassembled working view. One GraphQL call fetches every module's raw bytecode bytes; `sui move disassemble` (already on the system, running `sui prompt`) produces `.asm` files for analysis. Trigger on \"fetch this package's bytecode\", \"get me the .mv for package X\", \"disassemble this package\", or \"I need to read a deployed Sui package\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1626,1627,1628],{"name":1602,"slug":1603,"type":15},{"name":1605,"slug":1606,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:02:25.3633",{"slug":1631,"name":1631,"fn":1632,"description":1633,"org":1634,"tags":1635,"stars":1608,"repoUrl":1609,"updatedAt":1642},"sui-move-security-review","audit Sui Move smart contracts","Use when auditing, reviewing, or hunting for vulnerabilities in Move code on Sui. Applies equally to source code (.move files) and to disassembly of compiled bytecode (on-chain packages). A checklist of invariants whose VIOLATION causes exploitable bugs: access control & capabilities, struct abilities & type safety, object lifecycle & ownership, shared-object and PTB attack surface, dynamic fields & collections, arithmetic & coins, init\u002FOTW\u002Fpackage upgrades, hot-potato composability, time & on-chain randomness, and test-only code leakage. Trigger on \"audit this Move code\", \"find vulnerabilities in this Sui contract\", \"security review\", \"is this package safe?\", \"I suspect there's a bug in X\", \"something is wrong with this contract\", or when reasoning about whether a Move function can be abused.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1636,1639,1640,1641],{"name":1637,"slug":1638,"type":15},"Code Review","code-review",{"name":1542,"slug":1543,"type":15},{"name":17,"slug":18,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:02:55.691149",{"slug":1644,"name":1644,"fn":1645,"description":1646,"org":1647,"tags":1648,"stars":1654,"repoUrl":1655,"updatedAt":1656},"memwal","integrate Walrus Memory SDK","Walrus Memory SDK — portable agent memory that works across apps, sessions, and workflows.\n\nUse when users say:\n- \"add memory to my app\"\n- \"portable agent memory\"\n- \"integrate Walrus Memory\"\n- \"AI agent memory\"\n- \"memory across agents\"\n- \"Walrus memory storage\"\n- \"setup Walrus Memory\"\n- \"recall memories\"\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1649,1650,1651],{"name":1567,"slug":1568,"type":15},{"name":1571,"slug":1572,"type":15},{"name":1652,"slug":1653,"type":15},"SDK","sdk",57,"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002FMemWal","2026-07-16T06:02:39.838395",{"slug":1658,"name":1658,"fn":1659,"description":1660,"org":1661,"tags":1662,"stars":537,"repoUrl":1668,"updatedAt":1669},"accessing-data","read data from the Sui network","How to read data from the Sui network. Use when choosing or implementing a data access strategy — queries for on-chain state, indexing pipelines, historical lookups, event subscriptions, cross-chain reads, or off-chain blob storage. Covers the two live Sui APIs (gRPC and GraphQL RPC), the Archival Store, the General-Purpose Indexer, the `sui-indexer-alt` custom indexing framework, and Walrus for off-chain blobs.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1663,1666,1667],{"name":1664,"slug":1665,"type":15},"Data Analysis","data-analysis",{"name":14,"slug":8,"type":15},{"name":1516,"slug":1517,"type":15},"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fskills","2026-08-01T05:44:32.775598",{"slug":1671,"name":1671,"fn":1672,"description":1673,"org":1674,"tags":1675,"stars":537,"repoUrl":1668,"updatedAt":1682},"composable-move-functions","design composable Sui Move functions","Use when writing Move functions on Sui, especially public APIs. Applies to function visibility (public vs entry), parameter ordering, and return patterns. Use whenever designing function signatures or deciding whether functions should transfer objects or return them.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1676,1679,1680,1681],{"name":1677,"slug":1678,"type":15},"API Development","api-development",{"name":17,"slug":18,"type":15},{"name":14,"slug":8,"type":15},{"name":1516,"slug":1517,"type":15},"2026-07-16T06:02:49.198495",{"slug":1684,"name":1684,"fn":1685,"description":1686,"org":1687,"tags":1688,"stars":537,"repoUrl":1668,"updatedAt":1703},"frontend-apps","build Sui dApps with dapp-kit","Sui frontend \u002F dApp development with @mysten\u002Fdapp-kit-react (React) and @mysten\u002Fdapp-kit-core (Vue, vanilla JS, Svelte, Web Components, other frameworks). Use when building browser apps that connect Sui wallets, query on-chain state, or submit transactions. Covers wallet connection, network switching, transaction execution, query patterns with TanStack React Query, and the specific pitfalls of browser + wallet + async-indexer environments. Pair with the `sui-sdks` skill for @mysten\u002Fsui Transaction construction patterns and the `ptbs` skill for PTB semantics.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1689,1692,1695,1696,1699,1702],{"name":1690,"slug":1691,"type":15},"Frontend","frontend",{"name":1693,"slug":1694,"type":15},"React","react",{"name":14,"slug":8,"type":15},{"name":1697,"slug":1698,"type":15},"Svelte","svelte",{"name":1700,"slug":1701,"type":15},"Vue","vue",{"name":1516,"slug":1517,"type":15},"2026-08-01T05:44:28.958473",{"slug":1705,"name":1705,"fn":1706,"description":1707,"org":1708,"tags":1709,"stars":537,"repoUrl":1668,"updatedAt":1715},"generate-sui-agent-config","generate configuration files for Sui projects","Generate a CLAUDE.md or AGENT.md configuration file for Sui projects. Use when setting up a new Sui project, when user mentions \"CLAUDE.md\", \"AGENT.md\", \"agent config\", or when working on a Sui project that does not already have a CLAUDE.md or AGENT.md in the project root.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1710,1713,1714],{"name":1711,"slug":1712,"type":15},"Configuration","configuration",{"name":1588,"slug":1589,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:00:59.981056",{"slug":1717,"name":1717,"fn":1718,"description":1719,"org":1720,"tags":1721,"stars":537,"repoUrl":1668,"updatedAt":1726},"modern-move-syntax","write Move 2024 edition code for Sui","Use when writing Move code on Sui to ensure 2024 edition syntax is used. Applies to method calls, string literals, vector operations, option handling, loops, and struct unpacking. Use whenever writing Move code to avoid legacy function-call syntax patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1722,1723,1724,1725],{"name":1605,"slug":1606,"type":15},{"name":17,"slug":18,"type":15},{"name":14,"slug":8,"type":15},{"name":1516,"slug":1517,"type":15},"2026-07-16T06:02:43.277596",{"slug":1728,"name":1728,"fn":1729,"description":1730,"org":1731,"tags":1732,"stars":537,"repoUrl":1668,"updatedAt":1742},"move-unit-testing","write unit tests for Sui Move contracts","Use when writing unit tests for Move smart contracts on Sui. Applies to test function naming, assertions, test attributes, context usage, and cleanup patterns. Use whenever user asks to write tests, add tests, or test a Move module.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1733,1736,1737,1738,1741],{"name":1734,"slug":1735,"type":15},"QA","qa",{"name":17,"slug":18,"type":15},{"name":14,"slug":8,"type":15},{"name":1739,"slug":1740,"type":15},"Testing","testing",{"name":1516,"slug":1517,"type":15},"2026-08-01T05:44:30.788585",{"slug":1744,"name":1744,"fn":1745,"description":1746,"org":1747,"tags":1748,"stars":537,"repoUrl":1668,"updatedAt":1755},"naming-conventions","apply Sui Move naming conventions","Use when writing or reviewing Move smart contracts on Sui. Applies to naming structs, error constants, regular constants, events, getter functions, capability types, hot potato types, and dynamic field keys. Use whenever creating new types, functions, or constants in Move code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1749,1752,1753,1754],{"name":1750,"slug":1751,"type":15},"Best Practices","best-practices",{"name":17,"slug":18,"type":15},{"name":14,"slug":8,"type":15},{"name":1516,"slug":1517,"type":15},"2026-07-16T06:02:48.830052",37]