[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-sui-walrus-blob-lifecycle":3,"mdc-uob3c3-key":31,"related-repo-sui-walrus-blob-lifecycle":2198,"related-org-sui-walrus-blob-lifecycle":2283},{"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-blob-lifecycle","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},"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},"Web3","web3",{"name":20,"slug":21,"type":15},"Storage","storage",1,"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus-skills","2026-07-16T06:01:49.056917",null,[],{"repoUrl":23,"stars":22,"forks":22,"topics":28,"description":25},[],"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fwalrus-skills\u002Ftree\u002FHEAD\u002Fwalrus-blob-lifecycle","---\nname: walrus-blob-lifecycle\ndescription: >\n  Managing Walrus blob lifecycles: epochs, lifetimes, extending blobs, deleting blobs,\n  burning blob objects, sharing blobs, setting blob attributes, and handling large uploads.\n  Use when the user needs to extend a blob's lifetime, delete or burn blobs, create shared\n  blobs, set\u002Fget\u002Fremove blob attributes, plan large data uploads (>1 GiB), estimate storage\n  costs, manage concurrent upload memory, or understand epoch-based expiration. For basic\n  store\u002Fread, see `walrus-cli`. For quilts, see `walrus-quilts`.\n---\n\n# Walrus Blob Lifecycle\n\n> **Source constraint:** All information in this skill is sourced from the\n> [Walrus managing blobs documentation](https:\u002F\u002Fdocs.wal.app\u002Fdocs\u002Fwalrus-client\u002Fmanaging-blobs)\n> and the [large uploads guide](https:\u002F\u002Fdocs.wal.app\u002Fdocs\u002Flarge-uploads).\n> When extending this skill, only pull from these sources.\n\nWalrus blobs have finite lifetimes measured in epochs. This skill covers all post-storage operations: extending lifetimes, deleting, burning, sharing, setting attributes, and planning large data uploads.\n\nAll patterns in this skill are derived from:\n- https:\u002F\u002Fdocs.wal.app\u002Fdocs\u002Fwalrus-client\u002Fmanaging-blobs\n- https:\u002F\u002Fdocs.wal.app\u002Fdocs\u002Fwalrus-client\u002Fstoring-blobs (lifetime options)\n- https:\u002F\u002Fdocs.wal.app\u002Fdocs\u002Flarge-uploads\n\nIf unsure about any lifecycle operation, fetch the relevant page before answering.\n\n---\n\n## Reference files\n\n### large-uploads — Large Data Upload Patterns\n**Path:** `large-uploads.md`\n**Load when:** planning uploads larger than 1 GiB, estimating storage costs for large datasets, managing concurrent upload memory, or building ingestion pipelines.\n**Covers:** cost estimation, tuning for >1 GiB uploads, upload observability, pipeline state persistence, throughput management, memory overhead (4.5x blob size).\n\n---\n\n## Related skills\n\n| Topic | Skill | Load when |\n|-------|-------|-----------|\n| Basic store\u002Fread | `walrus-cli` | Storing and reading blobs |\n| HTTP API | `walrus-http-api` | Store\u002Fread via REST |\n| TypeScript SDK | `walrus-ts-sdk` | Programmatic blob management |\n| Quilts | `walrus-quilts` | Lifecycle operations on quilts (apply to whole quilt) |\n| Encryption | `walrus-data-security` | Encrypting before storage |\n| Move integration | `walrus-move-integration` | On-chain blob references |\n\n---\n\n## Routing guide\n\n| Task | Load |\n|------|------|\n| Extend a blob's lifetime | Skill Content |\n| Delete a deletable blob | Skill Content |\n| Burn a blob's Sui object | Skill Content |\n| Create or fund a shared blob | Skill Content |\n| Set\u002Fget\u002Fremove blob attributes | Skill Content |\n| Plan a large data upload (>1 GiB) | `large-uploads.md` |\n| Estimate storage costs | `large-uploads.md` |\n| Build an ingestion pipeline | `large-uploads.md` |\n| Manage concurrent upload memory | `large-uploads.md` |\n\n---\n\n## Skill Content\n\n### Key concepts\n\n- **Epochs and lifetimes.** Blob storage duration is measured in epochs. A Mainnet epoch is 14 days. Maximum storage is 53 epochs (approximately 2 years). A blob expires at the beginning of its end epoch. Use `walrus info` or `GET \u002Fv1\u002Finfo` on an aggregator to check the current epoch and duration.\n\n- **Blob ID vs Sui object ID.** A **blob ID** is a URL-safe base64 string derived from the blob content (content-addressed). The same content always produces the same blob ID. A **Sui object ID** is a `0x...` hex string identifying the on-chain `Blob` object. Each upload creates a new object ID even for identical content. Use blob ID for reading content, object ID for lifecycle operations (extend, delete, share).\n\n- **Deletable vs permanent.** Newly stored blobs are deletable by default. Deletable blobs can be removed by the Sui object owner before expiry. Permanent blobs cannot be deleted before expiry, even by the uploader.\n\n- **What happens when a blob expires.** When a blob's end epoch is reached, the data becomes unavailable. There is no grace period. Storage nodes discard slivers. You must re-upload the data to make it available again. Expired blobs cannot be extended.\n\n- **Wrapping blobs in shared objects.** A `Blob` object can be wrapped into any Sui shared object, allowing multiple parties to fund and extend it. The Walrus contract provides `shared_blob::SharedBlob` as one reference implementation of this pattern, but developers are free to create their own shared wrapper with custom logic (access control, metadata, etc.).\n\n- **Storage pools.** A storage pool is the recommended way to manage blob storage going forward. Instead of purchasing storage resources per-blob, you fund a pool and blobs draw from it. This simplifies lifecycle management—blobs in a pool can be extended or renewed without individual storage resource tracking. Use `walrus store --storage-pool \u003CPOOL_ID>` to store against a pool.\n\n- **Blob attributes.** Key-value metadata pairs stored on the blob's Sui object. Certain keys (`content-type`, `content-disposition`, and others) are recognized by the aggregator and returned as HTTP headers when reading by object ID.\n\n- **Per-blob storage overhead.** Each blob incurs approximately 64 MB of metadata overhead regardless of size. For blobs smaller than ~10 MB, this metadata cost dominates. Use quilts for batching many small blobs to amortize this overhead.\n\n### Extend blob lifetime\n\n```sh\n# Extend by blob Sui object ID\nwalrus extend --blob-obj-id \u003CBLOB_OBJECT_ID>\n\n# Extend with a specific new end epoch\nwalrus extend --blob-obj-id \u003CBLOB_OBJECT_ID> --end-epoch \u003CEPOCH>\n\n# Extend a shared blob (requires --shared flag)\nwalrus extend --blob-obj-id \u003CBLOB_OBJECT_ID> --shared\n```\n\n- The blob must not be expired.\n- Both owned and shared blobs can be extended.\n- Only the owner can extend owned blobs. Anyone can extend shared blobs.\n- You need the blob's Sui object ID (not the blob ID).\n\n### Delete blobs\n\n```sh\n# Delete by blob ID\nwalrus delete --blob-id \u003CBLOB_ID>\n\n# Delete by file (derives blob ID)\nwalrus delete --file \u003CPATH>\n\n# Delete by Sui object ID\nwalrus delete --object-id \u003CSUI_ID>\n\n# Skip confirmation prompt\nwalrus delete --blob-id \u003CBLOB_ID> --yes\n\n# Skip post-delete status check\nwalrus delete --blob-id \u003CBLOB_ID> --yes --no-status-check\n```\n\n**Important caveats:**\n- Only the owner of the Sui `Blob` object can delete a deletable blob.\n- Delete reclaims the storage resource, which is reused automatically.\n- Delete only removes slivers from current and future storage nodes. If another copy of the same blob exists (uploaded by someone else), the data remains accessible.\n- Delete has limited utility for privacy. All blobs are public. Cached or previously downloaded copies are not affected.\n\n### Burn blobs\n\nBurning removes the blob's Sui object without deleting data from Walrus and without refunding storage:\n\n```sh\n# Burn a specific blob by object ID\nwalrus burn-blobs --object-ids \u003CBLOB_OBJECT_ID>\n\n# Burn all blob objects owned by the current wallet\nwalrus burn-blobs --all\n\n# Burn all expired blob objects\nwalrus burn-blobs --all-expired\n```\n\nAfter burning, you cannot extend permanent blobs or extend\u002Fdelete deletable blobs. You lose all control of the blob.\n\n### Shared blobs\n\nA blob can be wrapped into a Sui shared object so that anyone can fund and extend it. The Walrus contract provides `shared_blob::SharedBlob` as one reference implementation, but you can also wrap a `Blob` into your own custom shared object with whatever logic you need.\n\nUsing the built-in `SharedBlob` via the CLI:\n\n```sh\n# Share an existing blob using the built-in SharedBlob\nwalrus share --blob-obj-id \u003CSUI_OBJ_ID>\n\n# Fund an existing shared blob\nwalrus fund-shared-blob --blob-obj-id \u003CSHARED_OBJ_ID> --amount \u003CWAL_AMOUNT>\n\n# Store and share in one step\nwalrus store myfile.png --epochs 10 --share\n```\n\nBuilt-in shared blobs:\n- Can only contain permanent blobs\n- Cannot be deleted before expiry\n- Anyone can fund and extend them\n\nFor more control, consider wrapping the `Blob` in your own shared object (see `walrus-move-integration`).\n\n### Storage pools\n\nStorage pools are the recommended way to manage blob storage. Instead of purchasing individual storage resources per blob, you fund a pool and blobs draw from it.\n\n```sh\n# Store a blob using a storage pool\nwalrus store myfile.png --epochs 10 --storage-pool \u003CPOOL_ID>\n```\n\nBenefits:\n- Simplifies lifecycle management—no individual storage resource tracking\n- Blobs in a pool can be extended or renewed from the pool's funds\n- Multiple blobs can share a single funding source\n\n### Blob attributes\n\n```sh\n# Set attributes (multiple key-value pairs supported)\nwalrus set-blob-attribute \u003CBLOB_OBJECT_ID> --attr \"content-type\" \"image\u002Fpng\" --attr \"creator\" \"myapp\"\n\n# Get attributes\nwalrus get-blob-attribute \u003CBLOB_OBJECT_ID>\n\n# Remove all attributes\nwalrus remove-blob-attribute \u003CBLOB_OBJECT_ID>\n\n# Remove specific keys\nwalrus remove-blob-attribute-fields \u003CBLOB_OBJECT_ID> --keys \"creator\"\n```\n\nRecognized HTTP header attribute keys: `content-disposition`, `content-encoding`, `content-language`, `content-location`, `content-type`, `link`. These are returned as HTTP headers when reading by object ID.\n\n### Rules\n\n1. **Blobs expire at the beginning of the end epoch.** A blob with end epoch 314 becomes unavailable at the start of epoch 314. Plan accordingly.\n2. **You cannot extend expired blobs.** Extend before expiration. Monitor expiration with `walrus blob-status`.\n3. **Delete does not guarantee data removal.** Other copies of the same blob might exist. Caches and past storage nodes are not affected.\n4. **Shared blobs must be permanent.** You cannot share a deletable blob. Convert to permanent first or store as permanent with `--share`.\n5. **Burn is irreversible.** Burning a blob object forfeits all control with no storage refund. Use `--all-expired` to clean up expired blobs safely.\n6. **Maximum blob size is approximately 13.6 GiB.** For large uploads, see the `large-uploads.md` reference file.\n\n### Common mistakes\n\n- **Extending with the blob ID instead of the object ID.** The `extend` command requires `--blob-obj-id` (Sui object ID), not the blob ID.\n- **Trying to extend an expired blob.** Once expired, a blob cannot be extended. You must re-upload.\n- **Expecting delete to make data completely unavailable.** If another user uploaded the same content, it persists. Encryption is the only reliable privacy mechanism.\n- **Burning blobs that still have value.** Burning is permanent, forfeits storage, and provides no refund. Use `delete` to reclaim storage instead.\n- **Sharing a deletable blob.** Shared blobs require permanent blobs. Store with `--permanent --share` or ensure the blob is permanent before sharing.\n- **Storing with `--epochs 1` near an epoch boundary.** The blob expires almost immediately. Use generous epoch counts.\n",{"data":32,"body":33},{"name":4,"description":6},{"type":34,"children":35},"root",[36,44,80,85,90,122,127,131,138,145,176,179,185,350,353,359,506,509,514,520,687,693,887,910,916,1174,1182,1212,1218,1223,1333,1338,1344,1363,1376,1543,1548,1566,1585,1591,1596,1656,1661,1679,1685,1937,1983,1989,2083,2089,2192],{"type":37,"tag":38,"props":39,"children":40},"element","h1",{"id":4},[41],{"type":42,"value":43},"text","Walrus Blob Lifecycle",{"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\u002Fdocs.wal.app\u002Fdocs\u002Fwalrus-client\u002Fmanaging-blobs",[65],"nofollow",[67],{"type":42,"value":68},"Walrus managing blobs documentation",{"type":42,"value":70},"\nand the ",{"type":37,"tag":61,"props":72,"children":75},{"href":73,"rel":74},"https:\u002F\u002Fdocs.wal.app\u002Fdocs\u002Flarge-uploads",[65],[76],{"type":42,"value":77},"large uploads guide",{"type":42,"value":79},".\nWhen extending this skill, only pull from these sources.",{"type":37,"tag":49,"props":81,"children":82},{},[83],{"type":42,"value":84},"Walrus blobs have finite lifetimes measured in epochs. This skill covers all post-storage operations: extending lifetimes, deleting, burning, sharing, setting attributes, and planning large data uploads.",{"type":37,"tag":49,"props":86,"children":87},{},[88],{"type":42,"value":89},"All patterns in this skill are derived from:",{"type":37,"tag":91,"props":92,"children":93},"ul",{},[94,103,114],{"type":37,"tag":95,"props":96,"children":97},"li",{},[98],{"type":37,"tag":61,"props":99,"children":101},{"href":63,"rel":100},[65],[102],{"type":42,"value":63},{"type":37,"tag":95,"props":104,"children":105},{},[106,112],{"type":37,"tag":61,"props":107,"children":110},{"href":108,"rel":109},"https:\u002F\u002Fdocs.wal.app\u002Fdocs\u002Fwalrus-client\u002Fstoring-blobs",[65],[111],{"type":42,"value":108},{"type":42,"value":113}," (lifetime options)",{"type":37,"tag":95,"props":115,"children":116},{},[117],{"type":37,"tag":61,"props":118,"children":120},{"href":73,"rel":119},[65],[121],{"type":42,"value":73},{"type":37,"tag":49,"props":123,"children":124},{},[125],{"type":42,"value":126},"If unsure about any lifecycle operation, fetch the relevant page before answering.",{"type":37,"tag":128,"props":129,"children":130},"hr",{},[],{"type":37,"tag":132,"props":133,"children":135},"h2",{"id":134},"reference-files",[136],{"type":42,"value":137},"Reference files",{"type":37,"tag":139,"props":140,"children":142},"h3",{"id":141},"large-uploads-large-data-upload-patterns",[143],{"type":42,"value":144},"large-uploads — Large Data Upload Patterns",{"type":37,"tag":49,"props":146,"children":147},{},[148,153,155,162,167,169,174],{"type":37,"tag":53,"props":149,"children":150},{},[151],{"type":42,"value":152},"Path:",{"type":42,"value":154}," ",{"type":37,"tag":156,"props":157,"children":159},"code",{"className":158},[],[160],{"type":42,"value":161},"large-uploads.md",{"type":37,"tag":53,"props":163,"children":164},{},[165],{"type":42,"value":166},"Load when:",{"type":42,"value":168}," planning uploads larger than 1 GiB, estimating storage costs for large datasets, managing concurrent upload memory, or building ingestion pipelines.\n",{"type":37,"tag":53,"props":170,"children":171},{},[172],{"type":42,"value":173},"Covers:",{"type":42,"value":175}," cost estimation, tuning for >1 GiB uploads, upload observability, pipeline state persistence, throughput management, memory overhead (4.5x blob size).",{"type":37,"tag":128,"props":177,"children":178},{},[],{"type":37,"tag":132,"props":180,"children":182},{"id":181},"related-skills",[183],{"type":42,"value":184},"Related skills",{"type":37,"tag":186,"props":187,"children":188},"table",{},[189,213],{"type":37,"tag":190,"props":191,"children":192},"thead",{},[193],{"type":37,"tag":194,"props":195,"children":196},"tr",{},[197,203,208],{"type":37,"tag":198,"props":199,"children":200},"th",{},[201],{"type":42,"value":202},"Topic",{"type":37,"tag":198,"props":204,"children":205},{},[206],{"type":42,"value":207},"Skill",{"type":37,"tag":198,"props":209,"children":210},{},[211],{"type":42,"value":212},"Load when",{"type":37,"tag":214,"props":215,"children":216},"tbody",{},[217,240,262,284,306,328],{"type":37,"tag":194,"props":218,"children":219},{},[220,226,235],{"type":37,"tag":221,"props":222,"children":223},"td",{},[224],{"type":42,"value":225},"Basic store\u002Fread",{"type":37,"tag":221,"props":227,"children":228},{},[229],{"type":37,"tag":156,"props":230,"children":232},{"className":231},[],[233],{"type":42,"value":234},"walrus-cli",{"type":37,"tag":221,"props":236,"children":237},{},[238],{"type":42,"value":239},"Storing and reading blobs",{"type":37,"tag":194,"props":241,"children":242},{},[243,248,257],{"type":37,"tag":221,"props":244,"children":245},{},[246],{"type":42,"value":247},"HTTP API",{"type":37,"tag":221,"props":249,"children":250},{},[251],{"type":37,"tag":156,"props":252,"children":254},{"className":253},[],[255],{"type":42,"value":256},"walrus-http-api",{"type":37,"tag":221,"props":258,"children":259},{},[260],{"type":42,"value":261},"Store\u002Fread via REST",{"type":37,"tag":194,"props":263,"children":264},{},[265,270,279],{"type":37,"tag":221,"props":266,"children":267},{},[268],{"type":42,"value":269},"TypeScript SDK",{"type":37,"tag":221,"props":271,"children":272},{},[273],{"type":37,"tag":156,"props":274,"children":276},{"className":275},[],[277],{"type":42,"value":278},"walrus-ts-sdk",{"type":37,"tag":221,"props":280,"children":281},{},[282],{"type":42,"value":283},"Programmatic blob management",{"type":37,"tag":194,"props":285,"children":286},{},[287,292,301],{"type":37,"tag":221,"props":288,"children":289},{},[290],{"type":42,"value":291},"Quilts",{"type":37,"tag":221,"props":293,"children":294},{},[295],{"type":37,"tag":156,"props":296,"children":298},{"className":297},[],[299],{"type":42,"value":300},"walrus-quilts",{"type":37,"tag":221,"props":302,"children":303},{},[304],{"type":42,"value":305},"Lifecycle operations on quilts (apply to whole quilt)",{"type":37,"tag":194,"props":307,"children":308},{},[309,314,323],{"type":37,"tag":221,"props":310,"children":311},{},[312],{"type":42,"value":313},"Encryption",{"type":37,"tag":221,"props":315,"children":316},{},[317],{"type":37,"tag":156,"props":318,"children":320},{"className":319},[],[321],{"type":42,"value":322},"walrus-data-security",{"type":37,"tag":221,"props":324,"children":325},{},[326],{"type":42,"value":327},"Encrypting before storage",{"type":37,"tag":194,"props":329,"children":330},{},[331,336,345],{"type":37,"tag":221,"props":332,"children":333},{},[334],{"type":42,"value":335},"Move integration",{"type":37,"tag":221,"props":337,"children":338},{},[339],{"type":37,"tag":156,"props":340,"children":342},{"className":341},[],[343],{"type":42,"value":344},"walrus-move-integration",{"type":37,"tag":221,"props":346,"children":347},{},[348],{"type":42,"value":349},"On-chain blob references",{"type":37,"tag":128,"props":351,"children":352},{},[],{"type":37,"tag":132,"props":354,"children":356},{"id":355},"routing-guide",[357],{"type":42,"value":358},"Routing guide",{"type":37,"tag":186,"props":360,"children":361},{},[362,378],{"type":37,"tag":190,"props":363,"children":364},{},[365],{"type":37,"tag":194,"props":366,"children":367},{},[368,373],{"type":37,"tag":198,"props":369,"children":370},{},[371],{"type":42,"value":372},"Task",{"type":37,"tag":198,"props":374,"children":375},{},[376],{"type":42,"value":377},"Load",{"type":37,"tag":214,"props":379,"children":380},{},[381,394,406,418,430,442,458,474,490],{"type":37,"tag":194,"props":382,"children":383},{},[384,389],{"type":37,"tag":221,"props":385,"children":386},{},[387],{"type":42,"value":388},"Extend a blob's lifetime",{"type":37,"tag":221,"props":390,"children":391},{},[392],{"type":42,"value":393},"Skill Content",{"type":37,"tag":194,"props":395,"children":396},{},[397,402],{"type":37,"tag":221,"props":398,"children":399},{},[400],{"type":42,"value":401},"Delete a deletable blob",{"type":37,"tag":221,"props":403,"children":404},{},[405],{"type":42,"value":393},{"type":37,"tag":194,"props":407,"children":408},{},[409,414],{"type":37,"tag":221,"props":410,"children":411},{},[412],{"type":42,"value":413},"Burn a blob's Sui object",{"type":37,"tag":221,"props":415,"children":416},{},[417],{"type":42,"value":393},{"type":37,"tag":194,"props":419,"children":420},{},[421,426],{"type":37,"tag":221,"props":422,"children":423},{},[424],{"type":42,"value":425},"Create or fund a shared blob",{"type":37,"tag":221,"props":427,"children":428},{},[429],{"type":42,"value":393},{"type":37,"tag":194,"props":431,"children":432},{},[433,438],{"type":37,"tag":221,"props":434,"children":435},{},[436],{"type":42,"value":437},"Set\u002Fget\u002Fremove blob attributes",{"type":37,"tag":221,"props":439,"children":440},{},[441],{"type":42,"value":393},{"type":37,"tag":194,"props":443,"children":444},{},[445,450],{"type":37,"tag":221,"props":446,"children":447},{},[448],{"type":42,"value":449},"Plan a large data upload (>1 GiB)",{"type":37,"tag":221,"props":451,"children":452},{},[453],{"type":37,"tag":156,"props":454,"children":456},{"className":455},[],[457],{"type":42,"value":161},{"type":37,"tag":194,"props":459,"children":460},{},[461,466],{"type":37,"tag":221,"props":462,"children":463},{},[464],{"type":42,"value":465},"Estimate storage costs",{"type":37,"tag":221,"props":467,"children":468},{},[469],{"type":37,"tag":156,"props":470,"children":472},{"className":471},[],[473],{"type":42,"value":161},{"type":37,"tag":194,"props":475,"children":476},{},[477,482],{"type":37,"tag":221,"props":478,"children":479},{},[480],{"type":42,"value":481},"Build an ingestion pipeline",{"type":37,"tag":221,"props":483,"children":484},{},[485],{"type":37,"tag":156,"props":486,"children":488},{"className":487},[],[489],{"type":42,"value":161},{"type":37,"tag":194,"props":491,"children":492},{},[493,498],{"type":37,"tag":221,"props":494,"children":495},{},[496],{"type":42,"value":497},"Manage concurrent upload memory",{"type":37,"tag":221,"props":499,"children":500},{},[501],{"type":37,"tag":156,"props":502,"children":504},{"className":503},[],[505],{"type":42,"value":161},{"type":37,"tag":128,"props":507,"children":508},{},[],{"type":37,"tag":132,"props":510,"children":512},{"id":511},"skill-content",[513],{"type":42,"value":393},{"type":37,"tag":139,"props":515,"children":517},{"id":516},"key-concepts",[518],{"type":42,"value":519},"Key concepts",{"type":37,"tag":91,"props":521,"children":522},{},[523,549,589,599,609,633,651,677],{"type":37,"tag":95,"props":524,"children":525},{},[526,531,533,539,541,547],{"type":37,"tag":53,"props":527,"children":528},{},[529],{"type":42,"value":530},"Epochs and lifetimes.",{"type":42,"value":532}," Blob storage duration is measured in epochs. A Mainnet epoch is 14 days. Maximum storage is 53 epochs (approximately 2 years). A blob expires at the beginning of its end epoch. Use ",{"type":37,"tag":156,"props":534,"children":536},{"className":535},[],[537],{"type":42,"value":538},"walrus info",{"type":42,"value":540}," or ",{"type":37,"tag":156,"props":542,"children":544},{"className":543},[],[545],{"type":42,"value":546},"GET \u002Fv1\u002Finfo",{"type":42,"value":548}," on an aggregator to check the current epoch and duration.",{"type":37,"tag":95,"props":550,"children":551},{},[552,557,559,564,566,571,573,579,581,587],{"type":37,"tag":53,"props":553,"children":554},{},[555],{"type":42,"value":556},"Blob ID vs Sui object ID.",{"type":42,"value":558}," A ",{"type":37,"tag":53,"props":560,"children":561},{},[562],{"type":42,"value":563},"blob ID",{"type":42,"value":565}," is a URL-safe base64 string derived from the blob content (content-addressed). The same content always produces the same blob ID. A ",{"type":37,"tag":53,"props":567,"children":568},{},[569],{"type":42,"value":570},"Sui object ID",{"type":42,"value":572}," is a ",{"type":37,"tag":156,"props":574,"children":576},{"className":575},[],[577],{"type":42,"value":578},"0x...",{"type":42,"value":580}," hex string identifying the on-chain ",{"type":37,"tag":156,"props":582,"children":584},{"className":583},[],[585],{"type":42,"value":586},"Blob",{"type":42,"value":588}," object. Each upload creates a new object ID even for identical content. Use blob ID for reading content, object ID for lifecycle operations (extend, delete, share).",{"type":37,"tag":95,"props":590,"children":591},{},[592,597],{"type":37,"tag":53,"props":593,"children":594},{},[595],{"type":42,"value":596},"Deletable vs permanent.",{"type":42,"value":598}," Newly stored blobs are deletable by default. Deletable blobs can be removed by the Sui object owner before expiry. Permanent blobs cannot be deleted before expiry, even by the uploader.",{"type":37,"tag":95,"props":600,"children":601},{},[602,607],{"type":37,"tag":53,"props":603,"children":604},{},[605],{"type":42,"value":606},"What happens when a blob expires.",{"type":42,"value":608}," When a blob's end epoch is reached, the data becomes unavailable. There is no grace period. Storage nodes discard slivers. You must re-upload the data to make it available again. Expired blobs cannot be extended.",{"type":37,"tag":95,"props":610,"children":611},{},[612,617,618,623,625,631],{"type":37,"tag":53,"props":613,"children":614},{},[615],{"type":42,"value":616},"Wrapping blobs in shared objects.",{"type":42,"value":558},{"type":37,"tag":156,"props":619,"children":621},{"className":620},[],[622],{"type":42,"value":586},{"type":42,"value":624}," object can be wrapped into any Sui shared object, allowing multiple parties to fund and extend it. The Walrus contract provides ",{"type":37,"tag":156,"props":626,"children":628},{"className":627},[],[629],{"type":42,"value":630},"shared_blob::SharedBlob",{"type":42,"value":632}," as one reference implementation of this pattern, but developers are free to create their own shared wrapper with custom logic (access control, metadata, etc.).",{"type":37,"tag":95,"props":634,"children":635},{},[636,641,643,649],{"type":37,"tag":53,"props":637,"children":638},{},[639],{"type":42,"value":640},"Storage pools.",{"type":42,"value":642}," A storage pool is the recommended way to manage blob storage going forward. Instead of purchasing storage resources per-blob, you fund a pool and blobs draw from it. This simplifies lifecycle management—blobs in a pool can be extended or renewed without individual storage resource tracking. Use ",{"type":37,"tag":156,"props":644,"children":646},{"className":645},[],[647],{"type":42,"value":648},"walrus store --storage-pool \u003CPOOL_ID>",{"type":42,"value":650}," to store against a pool.",{"type":37,"tag":95,"props":652,"children":653},{},[654,659,661,667,669,675],{"type":37,"tag":53,"props":655,"children":656},{},[657],{"type":42,"value":658},"Blob attributes.",{"type":42,"value":660}," Key-value metadata pairs stored on the blob's Sui object. Certain keys (",{"type":37,"tag":156,"props":662,"children":664},{"className":663},[],[665],{"type":42,"value":666},"content-type",{"type":42,"value":668},", ",{"type":37,"tag":156,"props":670,"children":672},{"className":671},[],[673],{"type":42,"value":674},"content-disposition",{"type":42,"value":676},", and others) are recognized by the aggregator and returned as HTTP headers when reading by object ID.",{"type":37,"tag":95,"props":678,"children":679},{},[680,685],{"type":37,"tag":53,"props":681,"children":682},{},[683],{"type":42,"value":684},"Per-blob storage overhead.",{"type":42,"value":686}," Each blob incurs approximately 64 MB of metadata overhead regardless of size. For blobs smaller than ~10 MB, this metadata cost dominates. Use quilts for batching many small blobs to amortize this overhead.",{"type":37,"tag":139,"props":688,"children":690},{"id":689},"extend-blob-lifetime",[691],{"type":42,"value":692},"Extend blob lifetime",{"type":37,"tag":694,"props":695,"children":700},"pre",{"className":696,"code":697,"language":698,"meta":699,"style":699},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Extend by blob Sui object ID\nwalrus extend --blob-obj-id \u003CBLOB_OBJECT_ID>\n\n# Extend with a specific new end epoch\nwalrus extend --blob-obj-id \u003CBLOB_OBJECT_ID> --end-epoch \u003CEPOCH>\n\n# Extend a shared blob (requires --shared flag)\nwalrus extend --blob-obj-id \u003CBLOB_OBJECT_ID> --shared\n","sh","",[701],{"type":37,"tag":156,"props":702,"children":703},{"__ignoreMap":699},[704,715,758,768,777,833,841,850],{"type":37,"tag":705,"props":706,"children":708},"span",{"class":707,"line":22},"line",[709],{"type":37,"tag":705,"props":710,"children":712},{"style":711},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[713],{"type":42,"value":714},"# Extend by blob Sui object ID\n",{"type":37,"tag":705,"props":716,"children":718},{"class":707,"line":717},2,[719,725,731,736,742,747,753],{"type":37,"tag":705,"props":720,"children":722},{"style":721},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[723],{"type":42,"value":724},"walrus",{"type":37,"tag":705,"props":726,"children":728},{"style":727},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[729],{"type":42,"value":730}," extend",{"type":37,"tag":705,"props":732,"children":733},{"style":727},[734],{"type":42,"value":735}," --blob-obj-id",{"type":37,"tag":705,"props":737,"children":739},{"style":738},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[740],{"type":42,"value":741}," \u003C",{"type":37,"tag":705,"props":743,"children":744},{"style":727},[745],{"type":42,"value":746},"BLOB_OBJECT_I",{"type":37,"tag":705,"props":748,"children":750},{"style":749},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[751],{"type":42,"value":752},"D",{"type":37,"tag":705,"props":754,"children":755},{"style":738},[756],{"type":42,"value":757},">\n",{"type":37,"tag":705,"props":759,"children":761},{"class":707,"line":760},3,[762],{"type":37,"tag":705,"props":763,"children":765},{"emptyLinePlaceholder":764},true,[766],{"type":42,"value":767},"\n",{"type":37,"tag":705,"props":769,"children":771},{"class":707,"line":770},4,[772],{"type":37,"tag":705,"props":773,"children":774},{"style":711},[775],{"type":42,"value":776},"# Extend with a specific new end epoch\n",{"type":37,"tag":705,"props":778,"children":780},{"class":707,"line":779},5,[781,785,789,793,797,801,805,810,815,819,824,829],{"type":37,"tag":705,"props":782,"children":783},{"style":721},[784],{"type":42,"value":724},{"type":37,"tag":705,"props":786,"children":787},{"style":727},[788],{"type":42,"value":730},{"type":37,"tag":705,"props":790,"children":791},{"style":727},[792],{"type":42,"value":735},{"type":37,"tag":705,"props":794,"children":795},{"style":738},[796],{"type":42,"value":741},{"type":37,"tag":705,"props":798,"children":799},{"style":727},[800],{"type":42,"value":746},{"type":37,"tag":705,"props":802,"children":803},{"style":749},[804],{"type":42,"value":752},{"type":37,"tag":705,"props":806,"children":807},{"style":738},[808],{"type":42,"value":809},">",{"type":37,"tag":705,"props":811,"children":812},{"style":727},[813],{"type":42,"value":814}," --end-epoch",{"type":37,"tag":705,"props":816,"children":817},{"style":738},[818],{"type":42,"value":741},{"type":37,"tag":705,"props":820,"children":821},{"style":727},[822],{"type":42,"value":823},"EPOC",{"type":37,"tag":705,"props":825,"children":826},{"style":749},[827],{"type":42,"value":828},"H",{"type":37,"tag":705,"props":830,"children":831},{"style":738},[832],{"type":42,"value":757},{"type":37,"tag":705,"props":834,"children":836},{"class":707,"line":835},6,[837],{"type":37,"tag":705,"props":838,"children":839},{"emptyLinePlaceholder":764},[840],{"type":42,"value":767},{"type":37,"tag":705,"props":842,"children":844},{"class":707,"line":843},7,[845],{"type":37,"tag":705,"props":846,"children":847},{"style":711},[848],{"type":42,"value":849},"# Extend a shared blob (requires --shared flag)\n",{"type":37,"tag":705,"props":851,"children":853},{"class":707,"line":852},8,[854,858,862,866,870,874,878,882],{"type":37,"tag":705,"props":855,"children":856},{"style":721},[857],{"type":42,"value":724},{"type":37,"tag":705,"props":859,"children":860},{"style":727},[861],{"type":42,"value":730},{"type":37,"tag":705,"props":863,"children":864},{"style":727},[865],{"type":42,"value":735},{"type":37,"tag":705,"props":867,"children":868},{"style":738},[869],{"type":42,"value":741},{"type":37,"tag":705,"props":871,"children":872},{"style":727},[873],{"type":42,"value":746},{"type":37,"tag":705,"props":875,"children":876},{"style":749},[877],{"type":42,"value":752},{"type":37,"tag":705,"props":879,"children":880},{"style":738},[881],{"type":42,"value":809},{"type":37,"tag":705,"props":883,"children":884},{"style":727},[885],{"type":42,"value":886}," --shared\n",{"type":37,"tag":91,"props":888,"children":889},{},[890,895,900,905],{"type":37,"tag":95,"props":891,"children":892},{},[893],{"type":42,"value":894},"The blob must not be expired.",{"type":37,"tag":95,"props":896,"children":897},{},[898],{"type":42,"value":899},"Both owned and shared blobs can be extended.",{"type":37,"tag":95,"props":901,"children":902},{},[903],{"type":42,"value":904},"Only the owner can extend owned blobs. Anyone can extend shared blobs.",{"type":37,"tag":95,"props":906,"children":907},{},[908],{"type":42,"value":909},"You need the blob's Sui object ID (not the blob ID).",{"type":37,"tag":139,"props":911,"children":913},{"id":912},"delete-blobs",[914],{"type":42,"value":915},"Delete blobs",{"type":37,"tag":694,"props":917,"children":919},{"className":696,"code":918,"language":698,"meta":699,"style":699},"# Delete by blob ID\nwalrus delete --blob-id \u003CBLOB_ID>\n\n# Delete by file (derives blob ID)\nwalrus delete --file \u003CPATH>\n\n# Delete by Sui object ID\nwalrus delete --object-id \u003CSUI_ID>\n\n# Skip confirmation prompt\nwalrus delete --blob-id \u003CBLOB_ID> --yes\n\n# Skip post-delete status check\nwalrus delete --blob-id \u003CBLOB_ID> --yes --no-status-check\n",[920],{"type":37,"tag":156,"props":921,"children":922},{"__ignoreMap":699},[923,931,965,972,980,1013,1020,1028,1061,1069,1078,1115,1123,1132],{"type":37,"tag":705,"props":924,"children":925},{"class":707,"line":22},[926],{"type":37,"tag":705,"props":927,"children":928},{"style":711},[929],{"type":42,"value":930},"# Delete by blob ID\n",{"type":37,"tag":705,"props":932,"children":933},{"class":707,"line":717},[934,938,943,948,952,957,961],{"type":37,"tag":705,"props":935,"children":936},{"style":721},[937],{"type":42,"value":724},{"type":37,"tag":705,"props":939,"children":940},{"style":727},[941],{"type":42,"value":942}," delete",{"type":37,"tag":705,"props":944,"children":945},{"style":727},[946],{"type":42,"value":947}," --blob-id",{"type":37,"tag":705,"props":949,"children":950},{"style":738},[951],{"type":42,"value":741},{"type":37,"tag":705,"props":953,"children":954},{"style":727},[955],{"type":42,"value":956},"BLOB_I",{"type":37,"tag":705,"props":958,"children":959},{"style":749},[960],{"type":42,"value":752},{"type":37,"tag":705,"props":962,"children":963},{"style":738},[964],{"type":42,"value":757},{"type":37,"tag":705,"props":966,"children":967},{"class":707,"line":760},[968],{"type":37,"tag":705,"props":969,"children":970},{"emptyLinePlaceholder":764},[971],{"type":42,"value":767},{"type":37,"tag":705,"props":973,"children":974},{"class":707,"line":770},[975],{"type":37,"tag":705,"props":976,"children":977},{"style":711},[978],{"type":42,"value":979},"# Delete by file (derives blob ID)\n",{"type":37,"tag":705,"props":981,"children":982},{"class":707,"line":779},[983,987,991,996,1000,1005,1009],{"type":37,"tag":705,"props":984,"children":985},{"style":721},[986],{"type":42,"value":724},{"type":37,"tag":705,"props":988,"children":989},{"style":727},[990],{"type":42,"value":942},{"type":37,"tag":705,"props":992,"children":993},{"style":727},[994],{"type":42,"value":995}," --file",{"type":37,"tag":705,"props":997,"children":998},{"style":738},[999],{"type":42,"value":741},{"type":37,"tag":705,"props":1001,"children":1002},{"style":727},[1003],{"type":42,"value":1004},"PAT",{"type":37,"tag":705,"props":1006,"children":1007},{"style":749},[1008],{"type":42,"value":828},{"type":37,"tag":705,"props":1010,"children":1011},{"style":738},[1012],{"type":42,"value":757},{"type":37,"tag":705,"props":1014,"children":1015},{"class":707,"line":835},[1016],{"type":37,"tag":705,"props":1017,"children":1018},{"emptyLinePlaceholder":764},[1019],{"type":42,"value":767},{"type":37,"tag":705,"props":1021,"children":1022},{"class":707,"line":843},[1023],{"type":37,"tag":705,"props":1024,"children":1025},{"style":711},[1026],{"type":42,"value":1027},"# Delete by Sui object ID\n",{"type":37,"tag":705,"props":1029,"children":1030},{"class":707,"line":852},[1031,1035,1039,1044,1048,1053,1057],{"type":37,"tag":705,"props":1032,"children":1033},{"style":721},[1034],{"type":42,"value":724},{"type":37,"tag":705,"props":1036,"children":1037},{"style":727},[1038],{"type":42,"value":942},{"type":37,"tag":705,"props":1040,"children":1041},{"style":727},[1042],{"type":42,"value":1043}," --object-id",{"type":37,"tag":705,"props":1045,"children":1046},{"style":738},[1047],{"type":42,"value":741},{"type":37,"tag":705,"props":1049,"children":1050},{"style":727},[1051],{"type":42,"value":1052},"SUI_I",{"type":37,"tag":705,"props":1054,"children":1055},{"style":749},[1056],{"type":42,"value":752},{"type":37,"tag":705,"props":1058,"children":1059},{"style":738},[1060],{"type":42,"value":757},{"type":37,"tag":705,"props":1062,"children":1064},{"class":707,"line":1063},9,[1065],{"type":37,"tag":705,"props":1066,"children":1067},{"emptyLinePlaceholder":764},[1068],{"type":42,"value":767},{"type":37,"tag":705,"props":1070,"children":1072},{"class":707,"line":1071},10,[1073],{"type":37,"tag":705,"props":1074,"children":1075},{"style":711},[1076],{"type":42,"value":1077},"# Skip confirmation prompt\n",{"type":37,"tag":705,"props":1079,"children":1081},{"class":707,"line":1080},11,[1082,1086,1090,1094,1098,1102,1106,1110],{"type":37,"tag":705,"props":1083,"children":1084},{"style":721},[1085],{"type":42,"value":724},{"type":37,"tag":705,"props":1087,"children":1088},{"style":727},[1089],{"type":42,"value":942},{"type":37,"tag":705,"props":1091,"children":1092},{"style":727},[1093],{"type":42,"value":947},{"type":37,"tag":705,"props":1095,"children":1096},{"style":738},[1097],{"type":42,"value":741},{"type":37,"tag":705,"props":1099,"children":1100},{"style":727},[1101],{"type":42,"value":956},{"type":37,"tag":705,"props":1103,"children":1104},{"style":749},[1105],{"type":42,"value":752},{"type":37,"tag":705,"props":1107,"children":1108},{"style":738},[1109],{"type":42,"value":809},{"type":37,"tag":705,"props":1111,"children":1112},{"style":727},[1113],{"type":42,"value":1114}," --yes\n",{"type":37,"tag":705,"props":1116,"children":1118},{"class":707,"line":1117},12,[1119],{"type":37,"tag":705,"props":1120,"children":1121},{"emptyLinePlaceholder":764},[1122],{"type":42,"value":767},{"type":37,"tag":705,"props":1124,"children":1126},{"class":707,"line":1125},13,[1127],{"type":37,"tag":705,"props":1128,"children":1129},{"style":711},[1130],{"type":42,"value":1131},"# Skip post-delete status check\n",{"type":37,"tag":705,"props":1133,"children":1135},{"class":707,"line":1134},14,[1136,1140,1144,1148,1152,1156,1160,1164,1169],{"type":37,"tag":705,"props":1137,"children":1138},{"style":721},[1139],{"type":42,"value":724},{"type":37,"tag":705,"props":1141,"children":1142},{"style":727},[1143],{"type":42,"value":942},{"type":37,"tag":705,"props":1145,"children":1146},{"style":727},[1147],{"type":42,"value":947},{"type":37,"tag":705,"props":1149,"children":1150},{"style":738},[1151],{"type":42,"value":741},{"type":37,"tag":705,"props":1153,"children":1154},{"style":727},[1155],{"type":42,"value":956},{"type":37,"tag":705,"props":1157,"children":1158},{"style":749},[1159],{"type":42,"value":752},{"type":37,"tag":705,"props":1161,"children":1162},{"style":738},[1163],{"type":42,"value":809},{"type":37,"tag":705,"props":1165,"children":1166},{"style":727},[1167],{"type":42,"value":1168}," --yes",{"type":37,"tag":705,"props":1170,"children":1171},{"style":727},[1172],{"type":42,"value":1173}," --no-status-check\n",{"type":37,"tag":49,"props":1175,"children":1176},{},[1177],{"type":37,"tag":53,"props":1178,"children":1179},{},[1180],{"type":42,"value":1181},"Important caveats:",{"type":37,"tag":91,"props":1183,"children":1184},{},[1185,1197,1202,1207],{"type":37,"tag":95,"props":1186,"children":1187},{},[1188,1190,1195],{"type":42,"value":1189},"Only the owner of the Sui ",{"type":37,"tag":156,"props":1191,"children":1193},{"className":1192},[],[1194],{"type":42,"value":586},{"type":42,"value":1196}," object can delete a deletable blob.",{"type":37,"tag":95,"props":1198,"children":1199},{},[1200],{"type":42,"value":1201},"Delete reclaims the storage resource, which is reused automatically.",{"type":37,"tag":95,"props":1203,"children":1204},{},[1205],{"type":42,"value":1206},"Delete only removes slivers from current and future storage nodes. If another copy of the same blob exists (uploaded by someone else), the data remains accessible.",{"type":37,"tag":95,"props":1208,"children":1209},{},[1210],{"type":42,"value":1211},"Delete has limited utility for privacy. All blobs are public. Cached or previously downloaded copies are not affected.",{"type":37,"tag":139,"props":1213,"children":1215},{"id":1214},"burn-blobs",[1216],{"type":42,"value":1217},"Burn blobs",{"type":37,"tag":49,"props":1219,"children":1220},{},[1221],{"type":42,"value":1222},"Burning removes the blob's Sui object without deleting data from Walrus and without refunding storage:",{"type":37,"tag":694,"props":1224,"children":1226},{"className":696,"code":1225,"language":698,"meta":699,"style":699},"# Burn a specific blob by object ID\nwalrus burn-blobs --object-ids \u003CBLOB_OBJECT_ID>\n\n# Burn all blob objects owned by the current wallet\nwalrus burn-blobs --all\n\n# Burn all expired blob objects\nwalrus burn-blobs --all-expired\n",[1227],{"type":37,"tag":156,"props":1228,"children":1229},{"__ignoreMap":699},[1230,1238,1271,1278,1286,1302,1309,1317],{"type":37,"tag":705,"props":1231,"children":1232},{"class":707,"line":22},[1233],{"type":37,"tag":705,"props":1234,"children":1235},{"style":711},[1236],{"type":42,"value":1237},"# Burn a specific blob by object ID\n",{"type":37,"tag":705,"props":1239,"children":1240},{"class":707,"line":717},[1241,1245,1250,1255,1259,1263,1267],{"type":37,"tag":705,"props":1242,"children":1243},{"style":721},[1244],{"type":42,"value":724},{"type":37,"tag":705,"props":1246,"children":1247},{"style":727},[1248],{"type":42,"value":1249}," burn-blobs",{"type":37,"tag":705,"props":1251,"children":1252},{"style":727},[1253],{"type":42,"value":1254}," --object-ids",{"type":37,"tag":705,"props":1256,"children":1257},{"style":738},[1258],{"type":42,"value":741},{"type":37,"tag":705,"props":1260,"children":1261},{"style":727},[1262],{"type":42,"value":746},{"type":37,"tag":705,"props":1264,"children":1265},{"style":749},[1266],{"type":42,"value":752},{"type":37,"tag":705,"props":1268,"children":1269},{"style":738},[1270],{"type":42,"value":757},{"type":37,"tag":705,"props":1272,"children":1273},{"class":707,"line":760},[1274],{"type":37,"tag":705,"props":1275,"children":1276},{"emptyLinePlaceholder":764},[1277],{"type":42,"value":767},{"type":37,"tag":705,"props":1279,"children":1280},{"class":707,"line":770},[1281],{"type":37,"tag":705,"props":1282,"children":1283},{"style":711},[1284],{"type":42,"value":1285},"# Burn all blob objects owned by the current wallet\n",{"type":37,"tag":705,"props":1287,"children":1288},{"class":707,"line":779},[1289,1293,1297],{"type":37,"tag":705,"props":1290,"children":1291},{"style":721},[1292],{"type":42,"value":724},{"type":37,"tag":705,"props":1294,"children":1295},{"style":727},[1296],{"type":42,"value":1249},{"type":37,"tag":705,"props":1298,"children":1299},{"style":727},[1300],{"type":42,"value":1301}," --all\n",{"type":37,"tag":705,"props":1303,"children":1304},{"class":707,"line":835},[1305],{"type":37,"tag":705,"props":1306,"children":1307},{"emptyLinePlaceholder":764},[1308],{"type":42,"value":767},{"type":37,"tag":705,"props":1310,"children":1311},{"class":707,"line":843},[1312],{"type":37,"tag":705,"props":1313,"children":1314},{"style":711},[1315],{"type":42,"value":1316},"# Burn all expired blob objects\n",{"type":37,"tag":705,"props":1318,"children":1319},{"class":707,"line":852},[1320,1324,1328],{"type":37,"tag":705,"props":1321,"children":1322},{"style":721},[1323],{"type":42,"value":724},{"type":37,"tag":705,"props":1325,"children":1326},{"style":727},[1327],{"type":42,"value":1249},{"type":37,"tag":705,"props":1329,"children":1330},{"style":727},[1331],{"type":42,"value":1332}," --all-expired\n",{"type":37,"tag":49,"props":1334,"children":1335},{},[1336],{"type":42,"value":1337},"After burning, you cannot extend permanent blobs or extend\u002Fdelete deletable blobs. You lose all control of the blob.",{"type":37,"tag":139,"props":1339,"children":1341},{"id":1340},"shared-blobs",[1342],{"type":42,"value":1343},"Shared blobs",{"type":37,"tag":49,"props":1345,"children":1346},{},[1347,1349,1354,1356,1361],{"type":42,"value":1348},"A blob can be wrapped into a Sui shared object so that anyone can fund and extend it. The Walrus contract provides ",{"type":37,"tag":156,"props":1350,"children":1352},{"className":1351},[],[1353],{"type":42,"value":630},{"type":42,"value":1355}," as one reference implementation, but you can also wrap a ",{"type":37,"tag":156,"props":1357,"children":1359},{"className":1358},[],[1360],{"type":42,"value":586},{"type":42,"value":1362}," into your own custom shared object with whatever logic you need.",{"type":37,"tag":49,"props":1364,"children":1365},{},[1366,1368,1374],{"type":42,"value":1367},"Using the built-in ",{"type":37,"tag":156,"props":1369,"children":1371},{"className":1370},[],[1372],{"type":42,"value":1373},"SharedBlob",{"type":42,"value":1375}," via the CLI:",{"type":37,"tag":694,"props":1377,"children":1379},{"className":696,"code":1378,"language":698,"meta":699,"style":699},"# Share an existing blob using the built-in SharedBlob\nwalrus share --blob-obj-id \u003CSUI_OBJ_ID>\n\n# Fund an existing shared blob\nwalrus fund-shared-blob --blob-obj-id \u003CSHARED_OBJ_ID> --amount \u003CWAL_AMOUNT>\n\n# Store and share in one step\nwalrus store myfile.png --epochs 10 --share\n",[1380],{"type":37,"tag":156,"props":1381,"children":1382},{"__ignoreMap":699},[1383,1391,1424,1431,1439,1495,1502,1510],{"type":37,"tag":705,"props":1384,"children":1385},{"class":707,"line":22},[1386],{"type":37,"tag":705,"props":1387,"children":1388},{"style":711},[1389],{"type":42,"value":1390},"# Share an existing blob using the built-in SharedBlob\n",{"type":37,"tag":705,"props":1392,"children":1393},{"class":707,"line":717},[1394,1398,1403,1407,1411,1416,1420],{"type":37,"tag":705,"props":1395,"children":1396},{"style":721},[1397],{"type":42,"value":724},{"type":37,"tag":705,"props":1399,"children":1400},{"style":727},[1401],{"type":42,"value":1402}," share",{"type":37,"tag":705,"props":1404,"children":1405},{"style":727},[1406],{"type":42,"value":735},{"type":37,"tag":705,"props":1408,"children":1409},{"style":738},[1410],{"type":42,"value":741},{"type":37,"tag":705,"props":1412,"children":1413},{"style":727},[1414],{"type":42,"value":1415},"SUI_OBJ_I",{"type":37,"tag":705,"props":1417,"children":1418},{"style":749},[1419],{"type":42,"value":752},{"type":37,"tag":705,"props":1421,"children":1422},{"style":738},[1423],{"type":42,"value":757},{"type":37,"tag":705,"props":1425,"children":1426},{"class":707,"line":760},[1427],{"type":37,"tag":705,"props":1428,"children":1429},{"emptyLinePlaceholder":764},[1430],{"type":42,"value":767},{"type":37,"tag":705,"props":1432,"children":1433},{"class":707,"line":770},[1434],{"type":37,"tag":705,"props":1435,"children":1436},{"style":711},[1437],{"type":42,"value":1438},"# Fund an existing shared blob\n",{"type":37,"tag":705,"props":1440,"children":1441},{"class":707,"line":779},[1442,1446,1451,1455,1459,1464,1468,1472,1477,1481,1486,1491],{"type":37,"tag":705,"props":1443,"children":1444},{"style":721},[1445],{"type":42,"value":724},{"type":37,"tag":705,"props":1447,"children":1448},{"style":727},[1449],{"type":42,"value":1450}," fund-shared-blob",{"type":37,"tag":705,"props":1452,"children":1453},{"style":727},[1454],{"type":42,"value":735},{"type":37,"tag":705,"props":1456,"children":1457},{"style":738},[1458],{"type":42,"value":741},{"type":37,"tag":705,"props":1460,"children":1461},{"style":727},[1462],{"type":42,"value":1463},"SHARED_OBJ_I",{"type":37,"tag":705,"props":1465,"children":1466},{"style":749},[1467],{"type":42,"value":752},{"type":37,"tag":705,"props":1469,"children":1470},{"style":738},[1471],{"type":42,"value":809},{"type":37,"tag":705,"props":1473,"children":1474},{"style":727},[1475],{"type":42,"value":1476}," --amount",{"type":37,"tag":705,"props":1478,"children":1479},{"style":738},[1480],{"type":42,"value":741},{"type":37,"tag":705,"props":1482,"children":1483},{"style":727},[1484],{"type":42,"value":1485},"WAL_AMOUN",{"type":37,"tag":705,"props":1487,"children":1488},{"style":749},[1489],{"type":42,"value":1490},"T",{"type":37,"tag":705,"props":1492,"children":1493},{"style":738},[1494],{"type":42,"value":757},{"type":37,"tag":705,"props":1496,"children":1497},{"class":707,"line":835},[1498],{"type":37,"tag":705,"props":1499,"children":1500},{"emptyLinePlaceholder":764},[1501],{"type":42,"value":767},{"type":37,"tag":705,"props":1503,"children":1504},{"class":707,"line":843},[1505],{"type":37,"tag":705,"props":1506,"children":1507},{"style":711},[1508],{"type":42,"value":1509},"# Store and share in one step\n",{"type":37,"tag":705,"props":1511,"children":1512},{"class":707,"line":852},[1513,1517,1522,1527,1532,1538],{"type":37,"tag":705,"props":1514,"children":1515},{"style":721},[1516],{"type":42,"value":724},{"type":37,"tag":705,"props":1518,"children":1519},{"style":727},[1520],{"type":42,"value":1521}," store",{"type":37,"tag":705,"props":1523,"children":1524},{"style":727},[1525],{"type":42,"value":1526}," myfile.png",{"type":37,"tag":705,"props":1528,"children":1529},{"style":727},[1530],{"type":42,"value":1531}," --epochs",{"type":37,"tag":705,"props":1533,"children":1535},{"style":1534},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[1536],{"type":42,"value":1537}," 10",{"type":37,"tag":705,"props":1539,"children":1540},{"style":727},[1541],{"type":42,"value":1542}," --share\n",{"type":37,"tag":49,"props":1544,"children":1545},{},[1546],{"type":42,"value":1547},"Built-in shared blobs:",{"type":37,"tag":91,"props":1549,"children":1550},{},[1551,1556,1561],{"type":37,"tag":95,"props":1552,"children":1553},{},[1554],{"type":42,"value":1555},"Can only contain permanent blobs",{"type":37,"tag":95,"props":1557,"children":1558},{},[1559],{"type":42,"value":1560},"Cannot be deleted before expiry",{"type":37,"tag":95,"props":1562,"children":1563},{},[1564],{"type":42,"value":1565},"Anyone can fund and extend them",{"type":37,"tag":49,"props":1567,"children":1568},{},[1569,1571,1576,1578,1583],{"type":42,"value":1570},"For more control, consider wrapping the ",{"type":37,"tag":156,"props":1572,"children":1574},{"className":1573},[],[1575],{"type":42,"value":586},{"type":42,"value":1577}," in your own shared object (see ",{"type":37,"tag":156,"props":1579,"children":1581},{"className":1580},[],[1582],{"type":42,"value":344},{"type":42,"value":1584},").",{"type":37,"tag":139,"props":1586,"children":1588},{"id":1587},"storage-pools",[1589],{"type":42,"value":1590},"Storage pools",{"type":37,"tag":49,"props":1592,"children":1593},{},[1594],{"type":42,"value":1595},"Storage pools are the recommended way to manage blob storage. Instead of purchasing individual storage resources per blob, you fund a pool and blobs draw from it.",{"type":37,"tag":694,"props":1597,"children":1599},{"className":696,"code":1598,"language":698,"meta":699,"style":699},"# Store a blob using a storage pool\nwalrus store myfile.png --epochs 10 --storage-pool \u003CPOOL_ID>\n",[1600],{"type":37,"tag":156,"props":1601,"children":1602},{"__ignoreMap":699},[1603,1611],{"type":37,"tag":705,"props":1604,"children":1605},{"class":707,"line":22},[1606],{"type":37,"tag":705,"props":1607,"children":1608},{"style":711},[1609],{"type":42,"value":1610},"# Store a blob using a storage pool\n",{"type":37,"tag":705,"props":1612,"children":1613},{"class":707,"line":717},[1614,1618,1622,1626,1630,1634,1639,1643,1648,1652],{"type":37,"tag":705,"props":1615,"children":1616},{"style":721},[1617],{"type":42,"value":724},{"type":37,"tag":705,"props":1619,"children":1620},{"style":727},[1621],{"type":42,"value":1521},{"type":37,"tag":705,"props":1623,"children":1624},{"style":727},[1625],{"type":42,"value":1526},{"type":37,"tag":705,"props":1627,"children":1628},{"style":727},[1629],{"type":42,"value":1531},{"type":37,"tag":705,"props":1631,"children":1632},{"style":1534},[1633],{"type":42,"value":1537},{"type":37,"tag":705,"props":1635,"children":1636},{"style":727},[1637],{"type":42,"value":1638}," --storage-pool",{"type":37,"tag":705,"props":1640,"children":1641},{"style":738},[1642],{"type":42,"value":741},{"type":37,"tag":705,"props":1644,"children":1645},{"style":727},[1646],{"type":42,"value":1647},"POOL_I",{"type":37,"tag":705,"props":1649,"children":1650},{"style":749},[1651],{"type":42,"value":752},{"type":37,"tag":705,"props":1653,"children":1654},{"style":738},[1655],{"type":42,"value":757},{"type":37,"tag":49,"props":1657,"children":1658},{},[1659],{"type":42,"value":1660},"Benefits:",{"type":37,"tag":91,"props":1662,"children":1663},{},[1664,1669,1674],{"type":37,"tag":95,"props":1665,"children":1666},{},[1667],{"type":42,"value":1668},"Simplifies lifecycle management—no individual storage resource tracking",{"type":37,"tag":95,"props":1670,"children":1671},{},[1672],{"type":42,"value":1673},"Blobs in a pool can be extended or renewed from the pool's funds",{"type":37,"tag":95,"props":1675,"children":1676},{},[1677],{"type":42,"value":1678},"Multiple blobs can share a single funding source",{"type":37,"tag":139,"props":1680,"children":1682},{"id":1681},"blob-attributes",[1683],{"type":42,"value":1684},"Blob attributes",{"type":37,"tag":694,"props":1686,"children":1688},{"className":696,"code":1687,"language":698,"meta":699,"style":699},"# Set attributes (multiple key-value pairs supported)\nwalrus set-blob-attribute \u003CBLOB_OBJECT_ID> --attr \"content-type\" \"image\u002Fpng\" --attr \"creator\" \"myapp\"\n\n# Get attributes\nwalrus get-blob-attribute \u003CBLOB_OBJECT_ID>\n\n# Remove all attributes\nwalrus remove-blob-attribute \u003CBLOB_OBJECT_ID>\n\n# Remove specific keys\nwalrus remove-blob-attribute-fields \u003CBLOB_OBJECT_ID> --keys \"creator\"\n",[1689],{"type":37,"tag":156,"props":1690,"children":1691},{"__ignoreMap":699},[1692,1700,1791,1798,1806,1834,1841,1849,1877,1884,1892],{"type":37,"tag":705,"props":1693,"children":1694},{"class":707,"line":22},[1695],{"type":37,"tag":705,"props":1696,"children":1697},{"style":711},[1698],{"type":42,"value":1699},"# Set attributes (multiple key-value pairs supported)\n",{"type":37,"tag":705,"props":1701,"children":1702},{"class":707,"line":717},[1703,1707,1712,1716,1720,1724,1728,1733,1738,1742,1747,1751,1756,1760,1764,1768,1773,1777,1781,1786],{"type":37,"tag":705,"props":1704,"children":1705},{"style":721},[1706],{"type":42,"value":724},{"type":37,"tag":705,"props":1708,"children":1709},{"style":727},[1710],{"type":42,"value":1711}," set-blob-attribute",{"type":37,"tag":705,"props":1713,"children":1714},{"style":738},[1715],{"type":42,"value":741},{"type":37,"tag":705,"props":1717,"children":1718},{"style":727},[1719],{"type":42,"value":746},{"type":37,"tag":705,"props":1721,"children":1722},{"style":749},[1723],{"type":42,"value":752},{"type":37,"tag":705,"props":1725,"children":1726},{"style":738},[1727],{"type":42,"value":809},{"type":37,"tag":705,"props":1729,"children":1730},{"style":727},[1731],{"type":42,"value":1732}," --attr",{"type":37,"tag":705,"props":1734,"children":1735},{"style":738},[1736],{"type":42,"value":1737}," \"",{"type":37,"tag":705,"props":1739,"children":1740},{"style":727},[1741],{"type":42,"value":666},{"type":37,"tag":705,"props":1743,"children":1744},{"style":738},[1745],{"type":42,"value":1746},"\"",{"type":37,"tag":705,"props":1748,"children":1749},{"style":738},[1750],{"type":42,"value":1737},{"type":37,"tag":705,"props":1752,"children":1753},{"style":727},[1754],{"type":42,"value":1755},"image\u002Fpng",{"type":37,"tag":705,"props":1757,"children":1758},{"style":738},[1759],{"type":42,"value":1746},{"type":37,"tag":705,"props":1761,"children":1762},{"style":727},[1763],{"type":42,"value":1732},{"type":37,"tag":705,"props":1765,"children":1766},{"style":738},[1767],{"type":42,"value":1737},{"type":37,"tag":705,"props":1769,"children":1770},{"style":727},[1771],{"type":42,"value":1772},"creator",{"type":37,"tag":705,"props":1774,"children":1775},{"style":738},[1776],{"type":42,"value":1746},{"type":37,"tag":705,"props":1778,"children":1779},{"style":738},[1780],{"type":42,"value":1737},{"type":37,"tag":705,"props":1782,"children":1783},{"style":727},[1784],{"type":42,"value":1785},"myapp",{"type":37,"tag":705,"props":1787,"children":1788},{"style":738},[1789],{"type":42,"value":1790},"\"\n",{"type":37,"tag":705,"props":1792,"children":1793},{"class":707,"line":760},[1794],{"type":37,"tag":705,"props":1795,"children":1796},{"emptyLinePlaceholder":764},[1797],{"type":42,"value":767},{"type":37,"tag":705,"props":1799,"children":1800},{"class":707,"line":770},[1801],{"type":37,"tag":705,"props":1802,"children":1803},{"style":711},[1804],{"type":42,"value":1805},"# Get attributes\n",{"type":37,"tag":705,"props":1807,"children":1808},{"class":707,"line":779},[1809,1813,1818,1822,1826,1830],{"type":37,"tag":705,"props":1810,"children":1811},{"style":721},[1812],{"type":42,"value":724},{"type":37,"tag":705,"props":1814,"children":1815},{"style":727},[1816],{"type":42,"value":1817}," get-blob-attribute",{"type":37,"tag":705,"props":1819,"children":1820},{"style":738},[1821],{"type":42,"value":741},{"type":37,"tag":705,"props":1823,"children":1824},{"style":727},[1825],{"type":42,"value":746},{"type":37,"tag":705,"props":1827,"children":1828},{"style":749},[1829],{"type":42,"value":752},{"type":37,"tag":705,"props":1831,"children":1832},{"style":738},[1833],{"type":42,"value":757},{"type":37,"tag":705,"props":1835,"children":1836},{"class":707,"line":835},[1837],{"type":37,"tag":705,"props":1838,"children":1839},{"emptyLinePlaceholder":764},[1840],{"type":42,"value":767},{"type":37,"tag":705,"props":1842,"children":1843},{"class":707,"line":843},[1844],{"type":37,"tag":705,"props":1845,"children":1846},{"style":711},[1847],{"type":42,"value":1848},"# Remove all attributes\n",{"type":37,"tag":705,"props":1850,"children":1851},{"class":707,"line":852},[1852,1856,1861,1865,1869,1873],{"type":37,"tag":705,"props":1853,"children":1854},{"style":721},[1855],{"type":42,"value":724},{"type":37,"tag":705,"props":1857,"children":1858},{"style":727},[1859],{"type":42,"value":1860}," remove-blob-attribute",{"type":37,"tag":705,"props":1862,"children":1863},{"style":738},[1864],{"type":42,"value":741},{"type":37,"tag":705,"props":1866,"children":1867},{"style":727},[1868],{"type":42,"value":746},{"type":37,"tag":705,"props":1870,"children":1871},{"style":749},[1872],{"type":42,"value":752},{"type":37,"tag":705,"props":1874,"children":1875},{"style":738},[1876],{"type":42,"value":757},{"type":37,"tag":705,"props":1878,"children":1879},{"class":707,"line":1063},[1880],{"type":37,"tag":705,"props":1881,"children":1882},{"emptyLinePlaceholder":764},[1883],{"type":42,"value":767},{"type":37,"tag":705,"props":1885,"children":1886},{"class":707,"line":1071},[1887],{"type":37,"tag":705,"props":1888,"children":1889},{"style":711},[1890],{"type":42,"value":1891},"# Remove specific keys\n",{"type":37,"tag":705,"props":1893,"children":1894},{"class":707,"line":1080},[1895,1899,1904,1908,1912,1916,1920,1925,1929,1933],{"type":37,"tag":705,"props":1896,"children":1897},{"style":721},[1898],{"type":42,"value":724},{"type":37,"tag":705,"props":1900,"children":1901},{"style":727},[1902],{"type":42,"value":1903}," remove-blob-attribute-fields",{"type":37,"tag":705,"props":1905,"children":1906},{"style":738},[1907],{"type":42,"value":741},{"type":37,"tag":705,"props":1909,"children":1910},{"style":727},[1911],{"type":42,"value":746},{"type":37,"tag":705,"props":1913,"children":1914},{"style":749},[1915],{"type":42,"value":752},{"type":37,"tag":705,"props":1917,"children":1918},{"style":738},[1919],{"type":42,"value":809},{"type":37,"tag":705,"props":1921,"children":1922},{"style":727},[1923],{"type":42,"value":1924}," --keys",{"type":37,"tag":705,"props":1926,"children":1927},{"style":738},[1928],{"type":42,"value":1737},{"type":37,"tag":705,"props":1930,"children":1931},{"style":727},[1932],{"type":42,"value":1772},{"type":37,"tag":705,"props":1934,"children":1935},{"style":738},[1936],{"type":42,"value":1790},{"type":37,"tag":49,"props":1938,"children":1939},{},[1940,1942,1947,1948,1954,1955,1961,1962,1968,1969,1974,1975,1981],{"type":42,"value":1941},"Recognized HTTP header attribute keys: ",{"type":37,"tag":156,"props":1943,"children":1945},{"className":1944},[],[1946],{"type":42,"value":674},{"type":42,"value":668},{"type":37,"tag":156,"props":1949,"children":1951},{"className":1950},[],[1952],{"type":42,"value":1953},"content-encoding",{"type":42,"value":668},{"type":37,"tag":156,"props":1956,"children":1958},{"className":1957},[],[1959],{"type":42,"value":1960},"content-language",{"type":42,"value":668},{"type":37,"tag":156,"props":1963,"children":1965},{"className":1964},[],[1966],{"type":42,"value":1967},"content-location",{"type":42,"value":668},{"type":37,"tag":156,"props":1970,"children":1972},{"className":1971},[],[1973],{"type":42,"value":666},{"type":42,"value":668},{"type":37,"tag":156,"props":1976,"children":1978},{"className":1977},[],[1979],{"type":42,"value":1980},"link",{"type":42,"value":1982},". These are returned as HTTP headers when reading by object ID.",{"type":37,"tag":139,"props":1984,"children":1986},{"id":1985},"rules",[1987],{"type":42,"value":1988},"Rules",{"type":37,"tag":1990,"props":1991,"children":1992},"ol",{},[1993,2003,2021,2031,2048,2066],{"type":37,"tag":95,"props":1994,"children":1995},{},[1996,2001],{"type":37,"tag":53,"props":1997,"children":1998},{},[1999],{"type":42,"value":2000},"Blobs expire at the beginning of the end epoch.",{"type":42,"value":2002}," A blob with end epoch 314 becomes unavailable at the start of epoch 314. Plan accordingly.",{"type":37,"tag":95,"props":2004,"children":2005},{},[2006,2011,2013,2019],{"type":37,"tag":53,"props":2007,"children":2008},{},[2009],{"type":42,"value":2010},"You cannot extend expired blobs.",{"type":42,"value":2012}," Extend before expiration. Monitor expiration with ",{"type":37,"tag":156,"props":2014,"children":2016},{"className":2015},[],[2017],{"type":42,"value":2018},"walrus blob-status",{"type":42,"value":2020},".",{"type":37,"tag":95,"props":2022,"children":2023},{},[2024,2029],{"type":37,"tag":53,"props":2025,"children":2026},{},[2027],{"type":42,"value":2028},"Delete does not guarantee data removal.",{"type":42,"value":2030}," Other copies of the same blob might exist. Caches and past storage nodes are not affected.",{"type":37,"tag":95,"props":2032,"children":2033},{},[2034,2039,2041,2047],{"type":37,"tag":53,"props":2035,"children":2036},{},[2037],{"type":42,"value":2038},"Shared blobs must be permanent.",{"type":42,"value":2040}," You cannot share a deletable blob. Convert to permanent first or store as permanent with ",{"type":37,"tag":156,"props":2042,"children":2044},{"className":2043},[],[2045],{"type":42,"value":2046},"--share",{"type":42,"value":2020},{"type":37,"tag":95,"props":2049,"children":2050},{},[2051,2056,2058,2064],{"type":37,"tag":53,"props":2052,"children":2053},{},[2054],{"type":42,"value":2055},"Burn is irreversible.",{"type":42,"value":2057}," Burning a blob object forfeits all control with no storage refund. Use ",{"type":37,"tag":156,"props":2059,"children":2061},{"className":2060},[],[2062],{"type":42,"value":2063},"--all-expired",{"type":42,"value":2065}," to clean up expired blobs safely.",{"type":37,"tag":95,"props":2067,"children":2068},{},[2069,2074,2076,2081],{"type":37,"tag":53,"props":2070,"children":2071},{},[2072],{"type":42,"value":2073},"Maximum blob size is approximately 13.6 GiB.",{"type":42,"value":2075}," For large uploads, see the ",{"type":37,"tag":156,"props":2077,"children":2079},{"className":2078},[],[2080],{"type":42,"value":161},{"type":42,"value":2082}," reference file.",{"type":37,"tag":139,"props":2084,"children":2086},{"id":2085},"common-mistakes",[2087],{"type":42,"value":2088},"Common mistakes",{"type":37,"tag":91,"props":2090,"children":2091},{},[2092,2118,2128,2138,2156,2174],{"type":37,"tag":95,"props":2093,"children":2094},{},[2095,2100,2102,2108,2110,2116],{"type":37,"tag":53,"props":2096,"children":2097},{},[2098],{"type":42,"value":2099},"Extending with the blob ID instead of the object ID.",{"type":42,"value":2101}," The ",{"type":37,"tag":156,"props":2103,"children":2105},{"className":2104},[],[2106],{"type":42,"value":2107},"extend",{"type":42,"value":2109}," command requires ",{"type":37,"tag":156,"props":2111,"children":2113},{"className":2112},[],[2114],{"type":42,"value":2115},"--blob-obj-id",{"type":42,"value":2117}," (Sui object ID), not the blob ID.",{"type":37,"tag":95,"props":2119,"children":2120},{},[2121,2126],{"type":37,"tag":53,"props":2122,"children":2123},{},[2124],{"type":42,"value":2125},"Trying to extend an expired blob.",{"type":42,"value":2127}," Once expired, a blob cannot be extended. You must re-upload.",{"type":37,"tag":95,"props":2129,"children":2130},{},[2131,2136],{"type":37,"tag":53,"props":2132,"children":2133},{},[2134],{"type":42,"value":2135},"Expecting delete to make data completely unavailable.",{"type":42,"value":2137}," If another user uploaded the same content, it persists. Encryption is the only reliable privacy mechanism.",{"type":37,"tag":95,"props":2139,"children":2140},{},[2141,2146,2148,2154],{"type":37,"tag":53,"props":2142,"children":2143},{},[2144],{"type":42,"value":2145},"Burning blobs that still have value.",{"type":42,"value":2147}," Burning is permanent, forfeits storage, and provides no refund. Use ",{"type":37,"tag":156,"props":2149,"children":2151},{"className":2150},[],[2152],{"type":42,"value":2153},"delete",{"type":42,"value":2155}," to reclaim storage instead.",{"type":37,"tag":95,"props":2157,"children":2158},{},[2159,2164,2166,2172],{"type":37,"tag":53,"props":2160,"children":2161},{},[2162],{"type":42,"value":2163},"Sharing a deletable blob.",{"type":42,"value":2165}," Shared blobs require permanent blobs. Store with ",{"type":37,"tag":156,"props":2167,"children":2169},{"className":2168},[],[2170],{"type":42,"value":2171},"--permanent --share",{"type":42,"value":2173}," or ensure the blob is permanent before sharing.",{"type":37,"tag":95,"props":2175,"children":2176},{},[2177,2190],{"type":37,"tag":53,"props":2178,"children":2179},{},[2180,2182,2188],{"type":42,"value":2181},"Storing with ",{"type":37,"tag":156,"props":2183,"children":2185},{"className":2184},[],[2186],{"type":42,"value":2187},"--epochs 1",{"type":42,"value":2189}," near an epoch boundary.",{"type":42,"value":2191}," The blob expires almost immediately. Use generous epoch counts.",{"type":37,"tag":2193,"props":2194,"children":2195},"style",{},[2196],{"type":42,"value":2197},"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":2199,"total":1080},[2200,2206,2217,2233,2245,2260,2271],{"slug":4,"name":4,"fn":5,"description":6,"org":2201,"tags":2202,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2203,2204,2205],{"name":20,"slug":21,"type":15},{"name":14,"slug":8,"type":15},{"name":17,"slug":18,"type":15},{"slug":234,"name":234,"fn":2207,"description":2208,"org":2209,"tags":2210,"stars":22,"repoUrl":23,"updatedAt":2216},"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},[2211,2214,2215],{"name":2212,"slug":2213,"type":15},"CLI","cli",{"name":20,"slug":21,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:02:52.586222",{"slug":322,"name":322,"fn":2218,"description":2219,"org":2220,"tags":2221,"stars":22,"repoUrl":23,"updatedAt":2232},"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},[2222,2225,2227,2230,2231],{"name":2223,"slug":2224,"type":15},"Access Control","access-control",{"name":313,"slug":2226,"type":15},"encryption",{"name":2228,"slug":2229,"type":15},"Security","security",{"name":20,"slug":21,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:01:48.700594",{"slug":256,"name":256,"fn":2234,"description":2235,"org":2236,"tags":2237,"stars":22,"repoUrl":23,"updatedAt":2244},"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},[2238,2241,2242,2243],{"name":2239,"slug":2240,"type":15},"REST API","rest-api",{"name":20,"slug":21,"type":15},{"name":14,"slug":8,"type":15},{"name":17,"slug":18,"type":15},"2026-07-16T06:01:48.340552",{"slug":2246,"name":2246,"fn":2247,"description":2248,"org":2249,"tags":2250,"stars":22,"repoUrl":23,"updatedAt":2259},"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},[2251,2254,2255,2258],{"name":2252,"slug":2253,"type":15},"Agents","agents",{"name":313,"slug":2226,"type":15},{"name":2256,"slug":2257,"type":15},"Memory","memory",{"name":14,"slug":8,"type":15},"2026-07-29T05:39:21.825246",{"slug":344,"name":344,"fn":2261,"description":2262,"org":2263,"tags":2264,"stars":22,"repoUrl":23,"updatedAt":2270},"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},[2265,2268,2269],{"name":2266,"slug":2267,"type":15},"Smart Contracts","smart-contracts",{"name":20,"slug":21,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:02:53.633159",{"slug":2272,"name":2272,"fn":2273,"description":2274,"org":2275,"tags":2276,"stars":22,"repoUrl":23,"updatedAt":2282},"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},[2277,2280,2281],{"name":2278,"slug":2279,"type":15},"Documentation","documentation",{"name":20,"slug":21,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:02:52.247749",{"items":2284,"total":2446},[2285,2301,2310,2320,2333,2347,2360,2373,2394,2406,2417,2433],{"slug":2286,"name":2286,"fn":2287,"description":2288,"org":2289,"tags":2290,"stars":2298,"repoUrl":2299,"updatedAt":2300},"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},[2291,2294,2297],{"name":2292,"slug":2293,"type":15},"Code Analysis","code-analysis",{"name":2295,"slug":2296,"type":15},"Engineering","engineering",{"name":14,"slug":8,"type":15},7724,"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fsui","2026-07-16T05:59:32.904886",{"slug":2302,"name":2302,"fn":2303,"description":2304,"org":2305,"tags":2306,"stars":2298,"repoUrl":2299,"updatedAt":2309},"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},[2307,2308],{"name":2278,"slug":2279,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:00:59.641382",{"slug":2311,"name":2311,"fn":2312,"description":2313,"org":2314,"tags":2315,"stars":2298,"repoUrl":2299,"updatedAt":2319},"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},[2316,2317,2318],{"name":2292,"slug":2293,"type":15},{"name":2295,"slug":2296,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:02:25.3633",{"slug":2321,"name":2321,"fn":2322,"description":2323,"org":2324,"tags":2325,"stars":2298,"repoUrl":2299,"updatedAt":2332},"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},[2326,2329,2330,2331],{"name":2327,"slug":2328,"type":15},"Code Review","code-review",{"name":2228,"slug":2229,"type":15},{"name":2266,"slug":2267,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:02:55.691149",{"slug":2334,"name":2334,"fn":2335,"description":2336,"org":2337,"tags":2338,"stars":2344,"repoUrl":2345,"updatedAt":2346},"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},[2339,2340,2341],{"name":2252,"slug":2253,"type":15},{"name":2256,"slug":2257,"type":15},{"name":2342,"slug":2343,"type":15},"SDK","sdk",57,"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002FMemWal","2026-07-16T06:02:39.838395",{"slug":2348,"name":2348,"fn":2349,"description":2350,"org":2351,"tags":2352,"stars":1063,"repoUrl":2358,"updatedAt":2359},"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},[2353,2356,2357],{"name":2354,"slug":2355,"type":15},"Data Analysis","data-analysis",{"name":14,"slug":8,"type":15},{"name":17,"slug":18,"type":15},"https:\u002F\u002Fgithub.com\u002FMystenLabs\u002Fskills","2026-08-01T05:44:32.775598",{"slug":2361,"name":2361,"fn":2362,"description":2363,"org":2364,"tags":2365,"stars":1063,"repoUrl":2358,"updatedAt":2372},"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},[2366,2369,2370,2371],{"name":2367,"slug":2368,"type":15},"API Development","api-development",{"name":2266,"slug":2267,"type":15},{"name":14,"slug":8,"type":15},{"name":17,"slug":18,"type":15},"2026-07-16T06:02:49.198495",{"slug":2374,"name":2374,"fn":2375,"description":2376,"org":2377,"tags":2378,"stars":1063,"repoUrl":2358,"updatedAt":2393},"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},[2379,2382,2385,2386,2389,2392],{"name":2380,"slug":2381,"type":15},"Frontend","frontend",{"name":2383,"slug":2384,"type":15},"React","react",{"name":14,"slug":8,"type":15},{"name":2387,"slug":2388,"type":15},"Svelte","svelte",{"name":2390,"slug":2391,"type":15},"Vue","vue",{"name":17,"slug":18,"type":15},"2026-08-01T05:44:28.958473",{"slug":2395,"name":2395,"fn":2396,"description":2397,"org":2398,"tags":2399,"stars":1063,"repoUrl":2358,"updatedAt":2405},"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},[2400,2403,2404],{"name":2401,"slug":2402,"type":15},"Configuration","configuration",{"name":2278,"slug":2279,"type":15},{"name":14,"slug":8,"type":15},"2026-07-16T06:00:59.981056",{"slug":2407,"name":2407,"fn":2408,"description":2409,"org":2410,"tags":2411,"stars":1063,"repoUrl":2358,"updatedAt":2416},"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},[2412,2413,2414,2415],{"name":2295,"slug":2296,"type":15},{"name":2266,"slug":2267,"type":15},{"name":14,"slug":8,"type":15},{"name":17,"slug":18,"type":15},"2026-07-16T06:02:43.277596",{"slug":2418,"name":2418,"fn":2419,"description":2420,"org":2421,"tags":2422,"stars":1063,"repoUrl":2358,"updatedAt":2432},"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},[2423,2426,2427,2428,2431],{"name":2424,"slug":2425,"type":15},"QA","qa",{"name":2266,"slug":2267,"type":15},{"name":14,"slug":8,"type":15},{"name":2429,"slug":2430,"type":15},"Testing","testing",{"name":17,"slug":18,"type":15},"2026-08-01T05:44:30.788585",{"slug":2434,"name":2434,"fn":2435,"description":2436,"org":2437,"tags":2438,"stars":1063,"repoUrl":2358,"updatedAt":2445},"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},[2439,2442,2443,2444],{"name":2440,"slug":2441,"type":15},"Best Practices","best-practices",{"name":2266,"slug":2267,"type":15},{"name":14,"slug":8,"type":15},{"name":17,"slug":18,"type":15},"2026-07-16T06:02:48.830052",37]