[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-aptos-write-contracts":3,"mdc-ai9da5-key":32,"related-org-aptos-write-contracts":2759,"related-repo-aptos-write-contracts":2917},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":27,"sourceUrl":30,"mdContent":31},"write-contracts","generate Aptos Move smart contracts","Generates secure Aptos Move V2 smart contracts with Object model, Digital Asset integration, security patterns, and storage type guidance. Includes comprehensive storage decision framework for optimal data structure selection. Triggers on: 'write contract', 'create NFT collection', 'build marketplace', 'implement minting', 'generate Move module', 'create token contract', 'build DAO', 'implement staking'. Ask storage questions when: 'store', 'track', 'registry', 'mapping', 'list', 'collection'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"aptos","Aptos Labs","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Faptos.png","aptos-labs",[13,17],{"name":14,"slug":15,"type":16},"Blockchain","blockchain","tag",{"name":18,"slug":19,"type":16},"Smart Contracts","smart-contracts",18,"https:\u002F\u002Fgithub.com\u002Faptos-labs\u002Faptos-agent-skills","2026-07-12T08:07:12.900133","MIT",8,[26,15],"agent-skills",{"repoUrl":21,"stars":20,"forks":24,"topics":28,"description":29},[26,15],"AI skills for building secure, modern Aptos dApps — Move contracts, TypeScript SDK, and frontend integration for Claude Code, Cursor, and Copilot.","https:\u002F\u002Fgithub.com\u002Faptos-labs\u002Faptos-agent-skills\u002Ftree\u002FHEAD\u002Fskills\u002Fmove\u002Fwrite-contracts","---\nname: write-contracts\ndescription:\n  \"Generates secure Aptos Move V2 smart contracts with Object model, Digital Asset integration, security patterns, and\n  storage type guidance. Includes comprehensive storage decision framework for optimal data structure selection.\n  Triggers on: 'write contract', 'create NFT collection', 'build marketplace', 'implement minting', 'generate Move\n  module', 'create token contract', 'build DAO', 'implement staking'. Ask storage questions when: 'store', 'track',\n  'registry', 'mapping', 'list', 'collection'.\"\nlicense: MIT\nmetadata:\n  author: aptos-labs\n  version: \"1.0\"\n  category: move\n  tags: [\"smart-contracts\", \"move\", \"nft\", \"defi\", \"objects\"]\n  priority: critical\n---\n\n# Write Contracts Skill\n\n## Core Rules\n\n### Digital Assets (NFTs) ⭐ CRITICAL\n\n1. **ALWAYS use Digital Asset (DA) standard** for ALL NFT-related contracts (collections, marketplaces, minting)\n2. **ALWAYS import** `aptos_token_objects::collection` and `aptos_token_objects::token` modules\n3. **ALWAYS use** `Object\u003CAptosToken>` for NFT references (NOT generic `Object\u003CT>`)\n4. **NEVER use legacy TokenV1** standard or `aptos_token::token` module (deprecated)\n5. See `..\u002F..\u002F..\u002Fpatterns\u002Fmove\u002FDIGITAL_ASSETS.md` for complete NFT patterns\n\n### Object Model\n\n6. **ALWAYS use** `Object\u003CT>` for all object references (NEVER raw addresses)\n7. **Generate all refs** (TransferRef, DeleteRef) in constructor before ConstructorRef destroyed\n8. **Return** `Object\u003CT>` from constructors (NEVER return ConstructorRef)\n9. **Verify ownership** with `object::owner(obj) == signer::address_of(user)`\n10. **Use** `object::generate_signer(&constructor_ref)` for object signers\n11. **Use named objects** for singletons: `object::create_named_object(creator, seed)`\n\n### Security\n\n12. **ALWAYS verify signer authority** in entry functions:\n    `assert!(signer::address_of(user) == expected, E_UNAUTHORIZED)`\n13. **ALWAYS validate inputs**: non-zero amounts, address validation, string length checks\n14. **NEVER expose** `&mut` references in public functions\n15. **NEVER skip** signer verification in entry functions\n\n### Modern Syntax\n\n16. **Use inline functions** and lambdas for iteration\n17. **Use receiver-style** method calls: `obj.is_owner(user)` (define first param as `self`)\n18. **Use vector indexing**: `vector[index]` instead of `vector::borrow()`\n19. **Use direct named addresses**: `@marketplace_addr` (NOT helper functions)\n\n### Required Patterns\n\n20. **Use init_module** for contract initialization on deployment\n21. **Emit events** for ALL significant activities (create, transfer, update, delete)\n22. **Define clear error constants** with descriptive names (E_NOT_OWNER, E_INSUFFICIENT_BALANCE)\n\n### Testability\n\n23. **Add accessor functions** for struct fields - tests in separate modules cannot access struct fields directly\n24. **Use `#[view]` annotation** for read-only accessor functions\n25. **Return tuples** from accessors for multi-field access: `(seller, price, timestamp)`\n26. **Place `#[view]` BEFORE doc comments** - `\u002F\u002F\u002F comment` before `#[view]` causes compiler warnings. Write `#[view]`\n    first, then `\u002F\u002F\u002F`\n\n## Quick Workflow\n\n1. **Create module structure** → Define structs, events, constants, init_module\n2. **Implement object creation** → Use proper constructor pattern with all refs generated upfront\n3. **Add access control** → Verify ownership and validate all inputs\n4. **Security check** → Use `security-audit` skill before deployment\n\n## Key Example: Object Creation Pattern\n\n```move\nstruct MyObject has key {\n    name: String,\n    transfer_ref: object::TransferRef,\n    delete_ref: object::DeleteRef,\n}\n\n\u002F\u002F Error constants\nconst E_NOT_OWNER: u64 = 1;\nconst E_EMPTY_STRING: u64 = 2;\nconst E_NAME_TOO_LONG: u64 = 3;\n\n\u002F\u002F Configuration constants\nconst MAX_NAME_LENGTH: u64 = 100;\n\n\u002F\u002F\u002F Create object with proper pattern\npublic fun create_my_object(creator: &signer, name: String): Object\u003CMyObject> {\n    \u002F\u002F 1. Create object\n    let constructor_ref = object::create_object(signer::address_of(creator));\n\n    \u002F\u002F 2. Generate ALL refs you'll need BEFORE constructor_ref is destroyed\n    let transfer_ref = object::generate_transfer_ref(&constructor_ref);\n    let delete_ref = object::generate_delete_ref(&constructor_ref);\n\n    \u002F\u002F 3. Get object signer\n    let object_signer = object::generate_signer(&constructor_ref);\n\n    \u002F\u002F 4. Store data in object\n    move_to(&object_signer, MyObject {\n        name,\n        transfer_ref,\n        delete_ref,\n    });\n\n    \u002F\u002F 5. Return typed object reference (ConstructorRef automatically destroyed)\n    object::object_from_constructor_ref\u003CMyObject>(&constructor_ref)\n}\n\n\u002F\u002F\u002F Update with ownership verification\npublic entry fun update_object(\n    owner: &signer,\n    obj: Object\u003CMyObject>,\n    new_name: String\n) acquires MyObject {\n    \u002F\u002F ✅ ALWAYS: Verify ownership\n    assert!(object::owner(obj) == signer::address_of(owner), E_NOT_OWNER);\n\n    \u002F\u002F ✅ ALWAYS: Validate inputs\n    assert!(string::length(&new_name) > 0, E_EMPTY_STRING);\n    assert!(string::length(&new_name) \u003C= MAX_NAME_LENGTH, E_NAME_TOO_LONG);\n\n    \u002F\u002F Safe to proceed\n    let obj_data = borrow_global_mut\u003CMyObject>(object::object_address(&obj));\n    obj_data.name = new_name;\n}\n```\n\n## Key Example: Accessor Functions for Testing\n\n```move\nstruct ListingInfo has store, drop, copy {\n    seller: address,\n    price: u64,\n    listed_at: u64,\n}\n\n\u002F\u002F\u002F Accessor function - tests cannot access struct fields directly\n\u002F\u002F\u002F Use tuple returns for multiple fields\n#[view]\npublic fun get_listing_details(nft_addr: address): (address, u64, u64) acquires Listings {\n    let listings = borrow_global\u003CListings>(get_marketplace_address());\n    assert!(table::contains(&listings.items, nft_addr), E_NOT_LISTED);\n    let listing = table::borrow(&listings.items, nft_addr);\n    (listing.seller, listing.price, listing.listed_at)\n}\n\n\u002F\u002F\u002F Single-field accessor when only one value needed\n#[view]\npublic fun get_staked_amount(user_addr: address): u64 acquires Stakes {\n    let stakes = borrow_global\u003CStakes>(get_vault_address());\n    if (table_with_length::contains(&stakes.items, user_addr)) {\n        table_with_length::borrow(&stakes.items, user_addr).amount\n    } else {\n        0\n    }\n}\n```\n\n## Module Structure Template\n\n```move\nmodule my_addr::my_module {\n    \u002F\u002F ============ Imports ============\n    use std::signer;\n    use std::string::String;\n    use aptos_framework::object::{Self, Object};\n    use aptos_framework::event;\n\n    \u002F\u002F ============ Events ============\n    #[event]\n    struct ItemCreated has drop, store {\n        item: address,\n        creator: address,\n    }\n\n    \u002F\u002F ============ Structs ============\n    \u002F\u002F Define your data structures\n\n    \u002F\u002F ============ Constants ============\n    const E_NOT_OWNER: u64 = 1;\n    const E_UNAUTHORIZED: u64 = 2;\n\n    \u002F\u002F ============ Init Module ============\n    fun init_module(deployer: &signer) {\n        \u002F\u002F Initialize global state, registries, etc.\n    }\n\n    \u002F\u002F ============ Public Entry Functions ============\n    \u002F\u002F User-facing functions\n\n    \u002F\u002F ============ Public Functions ============\n    \u002F\u002F Composable functions\n\n    \u002F\u002F ============ Private Functions ============\n    \u002F\u002F Internal helpers\n}\n```\n\n## Storage Type Selection\n\n⚠️ **When user mentions storage** (\"store\", \"track\", \"registry\", \"mapping\", \"list\", \"collection\"):\n\n### 1. Ask 2-3 Questions (see `references\u002Fstorage-decision-tree.md`)\n\n- **Access pattern?** (sequential vs key-value vs both)\n- **Expected size?** (small vs large vs unknown)\n- **Need `.length()`?** (conditional)\n\n### 2. Recommend from Patterns (`references\u002Fstorage-patterns.md`)\n\n| Pattern          | Recommended Storage                  |\n| ---------------- | ------------------------------------ |\n| User registry    | `Table\u003Caddress, UserInfo>`           |\n| Staking records  | `Table\u003Caddress, StakeInfo>`          |\n| Leaderboard      | `BigOrderedMap\u003Cu64, address>`        |\n| Transaction log  | `SmartVector\u003CTxRecord>` or `Vector`  |\n| Whitelist (\u003C100) | `Vector\u003Caddress>`                    |\n| Voting records   | `TableWithLength\u003Caddress, bool>`     |\n| Config (\u003C50)     | `OrderedMap\u003CString, Value>`          |\n| DAO proposals    | `BigOrderedMap\u003Cu64, Proposal>`       |\n| Asset collection | `Vector\u003CObject\u003CT>>` or `SmartVector` |\n\n### 3. Include Brief Gas Context\n\n**Example recommendations:**\n\n- \"For staking, I recommend `Table\u003Caddress, StakeInfo>` because you'll have unbounded users with concurrent operations\n  (separate slots enable parallel access)\"\n- \"For leaderboard, I recommend `BigOrderedMap\u003Cu64, address>` because you need sorted iteration (O(log n), use\n  `allocate_spare_slots` for production)\"\n\n### Storage Types Available\n\n- **Vector** - Small sequential (\u003C100 items)\n- **SmartVector** - Large sequential (100+ items)\n- **Table** - Unordered key-value lookups\n- **TableWithLength** - Table with count tracking\n- **OrderedMap** - Small sorted maps (\u003C100 items)\n- **BigOrderedMap** - Large sorted maps (100+ items)\n\n⚠️ **NEVER use SmartTable** (deprecated, use BigOrderedMap)\n\n**Details:** See `references\u002F` for decision tree, type comparisons, and gas optimization.\n\n## Anti-patterns\n\n1. ❌ **Never use legacy TokenV1** standard or import `aptos_token::token`\n2. ❌ **Never use resource accounts** (use named objects instead)\n3. ❌ **Never return ConstructorRef** from public functions\n4. ❌ **Never skip signer verification** in entry functions\n5. ❌ **Never skip input validation** (amounts, addresses, strings)\n6. ❌ **Never deploy without 100% test coverage**\n7. ❌ **Never create helper functions** that just return named addresses\n8. ❌ **Never skip event emission** for significant activities\n9. ❌ **Never use old syntax** when V2 syntax is available\n10. ❌ **Never skip init_module** for contracts that need initialization\n11. ❌ **Never hardcode real private keys** or secrets in code — use `@my_addr` named addresses and `\"0x...\"`\n    placeholders\n12. ❌ **Never read `.env` or `~\u002F.aptos\u002Fconfig.yaml`** — these contain private keys\n\n## Edge Cases to Handle\n\n| Scenario            | Check                                                   | Error Code         |\n| ------------------- | ------------------------------------------------------- | ------------------ |\n| Zero amounts        | `assert!(amount > 0, E_ZERO_AMOUNT)`                    | E_ZERO_AMOUNT      |\n| Excessive amounts   | `assert!(amount \u003C= MAX, E_AMOUNT_TOO_HIGH)`             | E_AMOUNT_TOO_HIGH  |\n| Empty vectors       | `assert!(vector::length(&v) > 0, E_EMPTY_VECTOR)`       | E_EMPTY_VECTOR     |\n| Empty strings       | `assert!(string::length(&s) > 0, E_EMPTY_STRING)`       | E_EMPTY_STRING     |\n| Strings too long    | `assert!(string::length(&s) \u003C= MAX, E_STRING_TOO_LONG)` | E_STRING_TOO_LONG  |\n| Zero address        | `assert!(addr != @0x0, E_ZERO_ADDRESS)`                 | E_ZERO_ADDRESS     |\n| Overflow            | `assert!(a \u003C= MAX_U64 - b, E_OVERFLOW)`                 | E_OVERFLOW         |\n| Underflow           | `assert!(a >= b, E_UNDERFLOW)`                          | E_UNDERFLOW        |\n| Division by zero    | `assert!(divisor > 0, E_DIVISION_BY_ZERO)`              | E_DIVISION_BY_ZERO |\n| Unauthorized access | `assert!(signer == expected, E_UNAUTHORIZED)`           | E_UNAUTHORIZED     |\n| Not object owner    | `assert!(object::owner(obj) == user, E_NOT_OWNER)`      | E_NOT_OWNER        |\n\n## References\n\n**Detailed Patterns (references\u002F folder):**\n\n- `references\u002Fstorage-decision-tree.md` - ⭐ Storage type selection framework (ask when storage mentioned)\n- `references\u002Fstorage-patterns.md` - ⭐ Use-case patterns and smart defaults\n- `references\u002Fstorage-types.md` - Detailed comparison of all 6 storage types\n- `references\u002Fstorage-gas-optimization.md` - Gas optimization strategies for storage\n- `references\u002Fobject-patterns.md` - Named objects, collections, nested objects\n- `references\u002Faccess-control.md` - RBAC and permission systems\n- `references\u002Fsafe-arithmetic.md` - Overflow\u002Funderflow prevention\n- `references\u002Finitialization.md` - init_module patterns and registry creation\n- `references\u002Fevents.md` - Event emission patterns\n- `references\u002Fv2-syntax.md` - Modern Move V2 features (method calls, indexing, lambdas)\n- `references\u002Fcomplete-example.md` - Full annotated NFT collection contract\n\n**Pattern Documentation (patterns\u002F folder):**\n\n- `..\u002F..\u002F..\u002Fpatterns\u002Fmove\u002FDIGITAL_ASSETS.md` - Digital Asset (NFT) standard - CRITICAL for NFTs\n- `..\u002F..\u002F..\u002Fpatterns\u002Fmove\u002FOBJECTS.md` - Comprehensive object model guide\n- `..\u002F..\u002F..\u002Fpatterns\u002Fmove\u002FSECURITY.md` - Security checklist and patterns\n- `..\u002F..\u002F..\u002Fpatterns\u002Fmove\u002FMOVE_V2_SYNTAX.md` - Modern syntax examples\n\n**Official Documentation:**\n\n- Digital Asset Standard: https:\u002F\u002Faptos.dev\u002Fbuild\u002Fsmart-contracts\u002Fdigital-asset\n- Object Model: https:\u002F\u002Faptos.dev\u002Fbuild\u002Fsmart-contracts\u002Fobject\n- Security Guidelines: https:\u002F\u002Faptos.dev\u002Fbuild\u002Fsmart-contracts\u002Fmove-security-guidelines\n\n**Related Skills:**\n\n- `search-aptos-examples` - Find similar examples in aptos-core (optional)\n- `generate-tests` - Write tests for contracts (use AFTER writing contracts)\n- `security-audit` - Audit contracts before deployment\n",{"data":33,"body":42},{"name":4,"description":6,"license":23,"metadata":34},{"author":11,"version":35,"category":36,"tags":37,"priority":41},"1.0","move",[19,36,38,39,40],"nft","defi","objects","critical",{"type":43,"children":44},"root",[45,54,61,68,167,173,267,273,330,336,416,422,456,462,555,561,612,618,1099,1105,1314,1320,1597,1603,1616,1629,1671,1684,1880,1886,1894,1929,1935,1996,2007,2025,2031,2199,2205,2474,2480,2488,2610,2618,2664,2672,2710,2718,2753],{"type":46,"tag":47,"props":48,"children":50},"element","h1",{"id":49},"write-contracts-skill",[51],{"type":52,"value":53},"text","Write Contracts Skill",{"type":46,"tag":55,"props":56,"children":58},"h2",{"id":57},"core-rules",[59],{"type":52,"value":60},"Core Rules",{"type":46,"tag":62,"props":63,"children":65},"h3",{"id":64},"digital-assets-nfts-critical",[66],{"type":52,"value":67},"Digital Assets (NFTs) ⭐ CRITICAL",{"type":46,"tag":69,"props":70,"children":71},"ol",{},[72,84,111,136,154],{"type":46,"tag":73,"props":74,"children":75},"li",{},[76,82],{"type":46,"tag":77,"props":78,"children":79},"strong",{},[80],{"type":52,"value":81},"ALWAYS use Digital Asset (DA) standard",{"type":52,"value":83}," for ALL NFT-related contracts (collections, marketplaces, minting)",{"type":46,"tag":73,"props":85,"children":86},{},[87,92,94,101,103,109],{"type":46,"tag":77,"props":88,"children":89},{},[90],{"type":52,"value":91},"ALWAYS import",{"type":52,"value":93}," ",{"type":46,"tag":95,"props":96,"children":98},"code",{"className":97},[],[99],{"type":52,"value":100},"aptos_token_objects::collection",{"type":52,"value":102}," and ",{"type":46,"tag":95,"props":104,"children":106},{"className":105},[],[107],{"type":52,"value":108},"aptos_token_objects::token",{"type":52,"value":110}," modules",{"type":46,"tag":73,"props":112,"children":113},{},[114,119,120,126,128,134],{"type":46,"tag":77,"props":115,"children":116},{},[117],{"type":52,"value":118},"ALWAYS use",{"type":52,"value":93},{"type":46,"tag":95,"props":121,"children":123},{"className":122},[],[124],{"type":52,"value":125},"Object\u003CAptosToken>",{"type":52,"value":127}," for NFT references (NOT generic ",{"type":46,"tag":95,"props":129,"children":131},{"className":130},[],[132],{"type":52,"value":133},"Object\u003CT>",{"type":52,"value":135},")",{"type":46,"tag":73,"props":137,"children":138},{},[139,144,146,152],{"type":46,"tag":77,"props":140,"children":141},{},[142],{"type":52,"value":143},"NEVER use legacy TokenV1",{"type":52,"value":145}," standard or ",{"type":46,"tag":95,"props":147,"children":149},{"className":148},[],[150],{"type":52,"value":151},"aptos_token::token",{"type":52,"value":153}," module (deprecated)",{"type":46,"tag":73,"props":155,"children":156},{},[157,159,165],{"type":52,"value":158},"See ",{"type":46,"tag":95,"props":160,"children":162},{"className":161},[],[163],{"type":52,"value":164},"..\u002F..\u002F..\u002Fpatterns\u002Fmove\u002FDIGITAL_ASSETS.md",{"type":52,"value":166}," for complete NFT patterns",{"type":46,"tag":62,"props":168,"children":170},{"id":169},"object-model",[171],{"type":52,"value":172},"Object Model",{"type":46,"tag":69,"props":174,"children":176},{"start":175},6,[177,192,202,218,234,251],{"type":46,"tag":73,"props":178,"children":179},{},[180,184,185,190],{"type":46,"tag":77,"props":181,"children":182},{},[183],{"type":52,"value":118},{"type":52,"value":93},{"type":46,"tag":95,"props":186,"children":188},{"className":187},[],[189],{"type":52,"value":133},{"type":52,"value":191}," for all object references (NEVER raw addresses)",{"type":46,"tag":73,"props":193,"children":194},{},[195,200],{"type":46,"tag":77,"props":196,"children":197},{},[198],{"type":52,"value":199},"Generate all refs",{"type":52,"value":201}," (TransferRef, DeleteRef) in constructor before ConstructorRef destroyed",{"type":46,"tag":73,"props":203,"children":204},{},[205,210,211,216],{"type":46,"tag":77,"props":206,"children":207},{},[208],{"type":52,"value":209},"Return",{"type":52,"value":93},{"type":46,"tag":95,"props":212,"children":214},{"className":213},[],[215],{"type":52,"value":133},{"type":52,"value":217}," from constructors (NEVER return ConstructorRef)",{"type":46,"tag":73,"props":219,"children":220},{},[221,226,228],{"type":46,"tag":77,"props":222,"children":223},{},[224],{"type":52,"value":225},"Verify ownership",{"type":52,"value":227}," with ",{"type":46,"tag":95,"props":229,"children":231},{"className":230},[],[232],{"type":52,"value":233},"object::owner(obj) == signer::address_of(user)",{"type":46,"tag":73,"props":235,"children":236},{},[237,242,243,249],{"type":46,"tag":77,"props":238,"children":239},{},[240],{"type":52,"value":241},"Use",{"type":52,"value":93},{"type":46,"tag":95,"props":244,"children":246},{"className":245},[],[247],{"type":52,"value":248},"object::generate_signer(&constructor_ref)",{"type":52,"value":250}," for object signers",{"type":46,"tag":73,"props":252,"children":253},{},[254,259,261],{"type":46,"tag":77,"props":255,"children":256},{},[257],{"type":52,"value":258},"Use named objects",{"type":52,"value":260}," for singletons: ",{"type":46,"tag":95,"props":262,"children":264},{"className":263},[],[265],{"type":52,"value":266},"object::create_named_object(creator, seed)",{"type":46,"tag":62,"props":268,"children":270},{"id":269},"security",[271],{"type":52,"value":272},"Security",{"type":46,"tag":69,"props":274,"children":276},{"start":275},12,[277,293,303,320],{"type":46,"tag":73,"props":278,"children":279},{},[280,285,287],{"type":46,"tag":77,"props":281,"children":282},{},[283],{"type":52,"value":284},"ALWAYS verify signer authority",{"type":52,"value":286}," in entry functions:\n",{"type":46,"tag":95,"props":288,"children":290},{"className":289},[],[291],{"type":52,"value":292},"assert!(signer::address_of(user) == expected, E_UNAUTHORIZED)",{"type":46,"tag":73,"props":294,"children":295},{},[296,301],{"type":46,"tag":77,"props":297,"children":298},{},[299],{"type":52,"value":300},"ALWAYS validate inputs",{"type":52,"value":302},": non-zero amounts, address validation, string length checks",{"type":46,"tag":73,"props":304,"children":305},{},[306,311,312,318],{"type":46,"tag":77,"props":307,"children":308},{},[309],{"type":52,"value":310},"NEVER expose",{"type":52,"value":93},{"type":46,"tag":95,"props":313,"children":315},{"className":314},[],[316],{"type":52,"value":317},"&mut",{"type":52,"value":319}," references in public functions",{"type":46,"tag":73,"props":321,"children":322},{},[323,328],{"type":46,"tag":77,"props":324,"children":325},{},[326],{"type":52,"value":327},"NEVER skip",{"type":52,"value":329}," signer verification in entry functions",{"type":46,"tag":62,"props":331,"children":333},{"id":332},"modern-syntax",[334],{"type":52,"value":335},"Modern Syntax",{"type":46,"tag":69,"props":337,"children":339},{"start":338},16,[340,350,375,399],{"type":46,"tag":73,"props":341,"children":342},{},[343,348],{"type":46,"tag":77,"props":344,"children":345},{},[346],{"type":52,"value":347},"Use inline functions",{"type":52,"value":349}," and lambdas for iteration",{"type":46,"tag":73,"props":351,"children":352},{},[353,358,360,366,368,374],{"type":46,"tag":77,"props":354,"children":355},{},[356],{"type":52,"value":357},"Use receiver-style",{"type":52,"value":359}," method calls: ",{"type":46,"tag":95,"props":361,"children":363},{"className":362},[],[364],{"type":52,"value":365},"obj.is_owner(user)",{"type":52,"value":367}," (define first param as ",{"type":46,"tag":95,"props":369,"children":371},{"className":370},[],[372],{"type":52,"value":373},"self",{"type":52,"value":135},{"type":46,"tag":73,"props":376,"children":377},{},[378,383,385,391,393],{"type":46,"tag":77,"props":379,"children":380},{},[381],{"type":52,"value":382},"Use vector indexing",{"type":52,"value":384},": ",{"type":46,"tag":95,"props":386,"children":388},{"className":387},[],[389],{"type":52,"value":390},"vector[index]",{"type":52,"value":392}," instead of ",{"type":46,"tag":95,"props":394,"children":396},{"className":395},[],[397],{"type":52,"value":398},"vector::borrow()",{"type":46,"tag":73,"props":400,"children":401},{},[402,407,408,414],{"type":46,"tag":77,"props":403,"children":404},{},[405],{"type":52,"value":406},"Use direct named addresses",{"type":52,"value":384},{"type":46,"tag":95,"props":409,"children":411},{"className":410},[],[412],{"type":52,"value":413},"@marketplace_addr",{"type":52,"value":415}," (NOT helper functions)",{"type":46,"tag":62,"props":417,"children":419},{"id":418},"required-patterns",[420],{"type":52,"value":421},"Required Patterns",{"type":46,"tag":69,"props":423,"children":425},{"start":424},20,[426,436,446],{"type":46,"tag":73,"props":427,"children":428},{},[429,434],{"type":46,"tag":77,"props":430,"children":431},{},[432],{"type":52,"value":433},"Use init_module",{"type":52,"value":435}," for contract initialization on deployment",{"type":46,"tag":73,"props":437,"children":438},{},[439,444],{"type":46,"tag":77,"props":440,"children":441},{},[442],{"type":52,"value":443},"Emit events",{"type":52,"value":445}," for ALL significant activities (create, transfer, update, delete)",{"type":46,"tag":73,"props":447,"children":448},{},[449,454],{"type":46,"tag":77,"props":450,"children":451},{},[452],{"type":52,"value":453},"Define clear error constants",{"type":52,"value":455}," with descriptive names (E_NOT_OWNER, E_INSUFFICIENT_BALANCE)",{"type":46,"tag":62,"props":457,"children":459},{"id":458},"testability",[460],{"type":52,"value":461},"Testability",{"type":46,"tag":69,"props":463,"children":465},{"start":464},23,[466,476,494,510],{"type":46,"tag":73,"props":467,"children":468},{},[469,474],{"type":46,"tag":77,"props":470,"children":471},{},[472],{"type":52,"value":473},"Add accessor functions",{"type":52,"value":475}," for struct fields - tests in separate modules cannot access struct fields directly",{"type":46,"tag":73,"props":477,"children":478},{},[479,492],{"type":46,"tag":77,"props":480,"children":481},{},[482,484,490],{"type":52,"value":483},"Use ",{"type":46,"tag":95,"props":485,"children":487},{"className":486},[],[488],{"type":52,"value":489},"#[view]",{"type":52,"value":491}," annotation",{"type":52,"value":493}," for read-only accessor functions",{"type":46,"tag":73,"props":495,"children":496},{},[497,502,504],{"type":46,"tag":77,"props":498,"children":499},{},[500],{"type":52,"value":501},"Return tuples",{"type":52,"value":503}," from accessors for multi-field access: ",{"type":46,"tag":95,"props":505,"children":507},{"className":506},[],[508],{"type":52,"value":509},"(seller, price, timestamp)",{"type":46,"tag":73,"props":511,"children":512},{},[513,525,527,533,535,540,542,547,549],{"type":46,"tag":77,"props":514,"children":515},{},[516,518,523],{"type":52,"value":517},"Place ",{"type":46,"tag":95,"props":519,"children":521},{"className":520},[],[522],{"type":52,"value":489},{"type":52,"value":524}," BEFORE doc comments",{"type":52,"value":526}," - ",{"type":46,"tag":95,"props":528,"children":530},{"className":529},[],[531],{"type":52,"value":532},"\u002F\u002F\u002F comment",{"type":52,"value":534}," before ",{"type":46,"tag":95,"props":536,"children":538},{"className":537},[],[539],{"type":52,"value":489},{"type":52,"value":541}," causes compiler warnings. Write ",{"type":46,"tag":95,"props":543,"children":545},{"className":544},[],[546],{"type":52,"value":489},{"type":52,"value":548},"\nfirst, then ",{"type":46,"tag":95,"props":550,"children":552},{"className":551},[],[553],{"type":52,"value":554},"\u002F\u002F\u002F",{"type":46,"tag":55,"props":556,"children":558},{"id":557},"quick-workflow",[559],{"type":52,"value":560},"Quick Workflow",{"type":46,"tag":69,"props":562,"children":563},{},[564,574,584,594],{"type":46,"tag":73,"props":565,"children":566},{},[567,572],{"type":46,"tag":77,"props":568,"children":569},{},[570],{"type":52,"value":571},"Create module structure",{"type":52,"value":573}," → Define structs, events, constants, init_module",{"type":46,"tag":73,"props":575,"children":576},{},[577,582],{"type":46,"tag":77,"props":578,"children":579},{},[580],{"type":52,"value":581},"Implement object creation",{"type":52,"value":583}," → Use proper constructor pattern with all refs generated upfront",{"type":46,"tag":73,"props":585,"children":586},{},[587,592],{"type":46,"tag":77,"props":588,"children":589},{},[590],{"type":52,"value":591},"Add access control",{"type":52,"value":593}," → Verify ownership and validate all inputs",{"type":46,"tag":73,"props":595,"children":596},{},[597,602,604,610],{"type":46,"tag":77,"props":598,"children":599},{},[600],{"type":52,"value":601},"Security check",{"type":52,"value":603}," → Use ",{"type":46,"tag":95,"props":605,"children":607},{"className":606},[],[608],{"type":52,"value":609},"security-audit",{"type":52,"value":611}," skill before deployment",{"type":46,"tag":55,"props":613,"children":615},{"id":614},"key-example-object-creation-pattern",[616],{"type":52,"value":617},"Key Example: Object Creation Pattern",{"type":46,"tag":619,"props":620,"children":624},"pre",{"className":621,"code":622,"language":36,"meta":623,"style":623},"language-move shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","struct MyObject has key {\n    name: String,\n    transfer_ref: object::TransferRef,\n    delete_ref: object::DeleteRef,\n}\n\n\u002F\u002F Error constants\nconst E_NOT_OWNER: u64 = 1;\nconst E_EMPTY_STRING: u64 = 2;\nconst E_NAME_TOO_LONG: u64 = 3;\n\n\u002F\u002F Configuration constants\nconst MAX_NAME_LENGTH: u64 = 100;\n\n\u002F\u002F\u002F Create object with proper pattern\npublic fun create_my_object(creator: &signer, name: String): Object\u003CMyObject> {\n    \u002F\u002F 1. Create object\n    let constructor_ref = object::create_object(signer::address_of(creator));\n\n    \u002F\u002F 2. Generate ALL refs you'll need BEFORE constructor_ref is destroyed\n    let transfer_ref = object::generate_transfer_ref(&constructor_ref);\n    let delete_ref = object::generate_delete_ref(&constructor_ref);\n\n    \u002F\u002F 3. Get object signer\n    let object_signer = object::generate_signer(&constructor_ref);\n\n    \u002F\u002F 4. Store data in object\n    move_to(&object_signer, MyObject {\n        name,\n        transfer_ref,\n        delete_ref,\n    });\n\n    \u002F\u002F 5. Return typed object reference (ConstructorRef automatically destroyed)\n    object::object_from_constructor_ref\u003CMyObject>(&constructor_ref)\n}\n\n\u002F\u002F\u002F Update with ownership verification\npublic entry fun update_object(\n    owner: &signer,\n    obj: Object\u003CMyObject>,\n    new_name: String\n) acquires MyObject {\n    \u002F\u002F ✅ ALWAYS: Verify ownership\n    assert!(object::owner(obj) == signer::address_of(owner), E_NOT_OWNER);\n\n    \u002F\u002F ✅ ALWAYS: Validate inputs\n    assert!(string::length(&new_name) > 0, E_EMPTY_STRING);\n    assert!(string::length(&new_name) \u003C= MAX_NAME_LENGTH, E_NAME_TOO_LONG);\n\n    \u002F\u002F Safe to proceed\n    let obj_data = borrow_global_mut\u003CMyObject>(object::object_address(&obj));\n    obj_data.name = new_name;\n}\n","",[625],{"type":46,"tag":95,"props":626,"children":627},{"__ignoreMap":623},[628,639,648,657,666,675,684,693,701,710,719,727,735,744,752,761,769,778,786,794,802,811,820,827,836,845,853,862,871,880,889,898,907,915,924,933,941,949,958,967,976,985,994,1003,1012,1021,1029,1038,1047,1056,1064,1073,1082,1091],{"type":46,"tag":629,"props":630,"children":633},"span",{"class":631,"line":632},"line",1,[634],{"type":46,"tag":629,"props":635,"children":636},{},[637],{"type":52,"value":638},"struct MyObject has key {\n",{"type":46,"tag":629,"props":640,"children":642},{"class":631,"line":641},2,[643],{"type":46,"tag":629,"props":644,"children":645},{},[646],{"type":52,"value":647},"    name: String,\n",{"type":46,"tag":629,"props":649,"children":651},{"class":631,"line":650},3,[652],{"type":46,"tag":629,"props":653,"children":654},{},[655],{"type":52,"value":656},"    transfer_ref: object::TransferRef,\n",{"type":46,"tag":629,"props":658,"children":660},{"class":631,"line":659},4,[661],{"type":46,"tag":629,"props":662,"children":663},{},[664],{"type":52,"value":665},"    delete_ref: object::DeleteRef,\n",{"type":46,"tag":629,"props":667,"children":669},{"class":631,"line":668},5,[670],{"type":46,"tag":629,"props":671,"children":672},{},[673],{"type":52,"value":674},"}\n",{"type":46,"tag":629,"props":676,"children":677},{"class":631,"line":175},[678],{"type":46,"tag":629,"props":679,"children":681},{"emptyLinePlaceholder":680},true,[682],{"type":52,"value":683},"\n",{"type":46,"tag":629,"props":685,"children":687},{"class":631,"line":686},7,[688],{"type":46,"tag":629,"props":689,"children":690},{},[691],{"type":52,"value":692},"\u002F\u002F Error constants\n",{"type":46,"tag":629,"props":694,"children":695},{"class":631,"line":24},[696],{"type":46,"tag":629,"props":697,"children":698},{},[699],{"type":52,"value":700},"const E_NOT_OWNER: u64 = 1;\n",{"type":46,"tag":629,"props":702,"children":704},{"class":631,"line":703},9,[705],{"type":46,"tag":629,"props":706,"children":707},{},[708],{"type":52,"value":709},"const E_EMPTY_STRING: u64 = 2;\n",{"type":46,"tag":629,"props":711,"children":713},{"class":631,"line":712},10,[714],{"type":46,"tag":629,"props":715,"children":716},{},[717],{"type":52,"value":718},"const E_NAME_TOO_LONG: u64 = 3;\n",{"type":46,"tag":629,"props":720,"children":722},{"class":631,"line":721},11,[723],{"type":46,"tag":629,"props":724,"children":725},{"emptyLinePlaceholder":680},[726],{"type":52,"value":683},{"type":46,"tag":629,"props":728,"children":729},{"class":631,"line":275},[730],{"type":46,"tag":629,"props":731,"children":732},{},[733],{"type":52,"value":734},"\u002F\u002F Configuration constants\n",{"type":46,"tag":629,"props":736,"children":738},{"class":631,"line":737},13,[739],{"type":46,"tag":629,"props":740,"children":741},{},[742],{"type":52,"value":743},"const MAX_NAME_LENGTH: u64 = 100;\n",{"type":46,"tag":629,"props":745,"children":747},{"class":631,"line":746},14,[748],{"type":46,"tag":629,"props":749,"children":750},{"emptyLinePlaceholder":680},[751],{"type":52,"value":683},{"type":46,"tag":629,"props":753,"children":755},{"class":631,"line":754},15,[756],{"type":46,"tag":629,"props":757,"children":758},{},[759],{"type":52,"value":760},"\u002F\u002F\u002F Create object with proper pattern\n",{"type":46,"tag":629,"props":762,"children":763},{"class":631,"line":338},[764],{"type":46,"tag":629,"props":765,"children":766},{},[767],{"type":52,"value":768},"public fun create_my_object(creator: &signer, name: String): Object\u003CMyObject> {\n",{"type":46,"tag":629,"props":770,"children":772},{"class":631,"line":771},17,[773],{"type":46,"tag":629,"props":774,"children":775},{},[776],{"type":52,"value":777},"    \u002F\u002F 1. Create object\n",{"type":46,"tag":629,"props":779,"children":780},{"class":631,"line":20},[781],{"type":46,"tag":629,"props":782,"children":783},{},[784],{"type":52,"value":785},"    let constructor_ref = object::create_object(signer::address_of(creator));\n",{"type":46,"tag":629,"props":787,"children":789},{"class":631,"line":788},19,[790],{"type":46,"tag":629,"props":791,"children":792},{"emptyLinePlaceholder":680},[793],{"type":52,"value":683},{"type":46,"tag":629,"props":795,"children":796},{"class":631,"line":424},[797],{"type":46,"tag":629,"props":798,"children":799},{},[800],{"type":52,"value":801},"    \u002F\u002F 2. Generate ALL refs you'll need BEFORE constructor_ref is destroyed\n",{"type":46,"tag":629,"props":803,"children":805},{"class":631,"line":804},21,[806],{"type":46,"tag":629,"props":807,"children":808},{},[809],{"type":52,"value":810},"    let transfer_ref = object::generate_transfer_ref(&constructor_ref);\n",{"type":46,"tag":629,"props":812,"children":814},{"class":631,"line":813},22,[815],{"type":46,"tag":629,"props":816,"children":817},{},[818],{"type":52,"value":819},"    let delete_ref = object::generate_delete_ref(&constructor_ref);\n",{"type":46,"tag":629,"props":821,"children":822},{"class":631,"line":464},[823],{"type":46,"tag":629,"props":824,"children":825},{"emptyLinePlaceholder":680},[826],{"type":52,"value":683},{"type":46,"tag":629,"props":828,"children":830},{"class":631,"line":829},24,[831],{"type":46,"tag":629,"props":832,"children":833},{},[834],{"type":52,"value":835},"    \u002F\u002F 3. Get object signer\n",{"type":46,"tag":629,"props":837,"children":839},{"class":631,"line":838},25,[840],{"type":46,"tag":629,"props":841,"children":842},{},[843],{"type":52,"value":844},"    let object_signer = object::generate_signer(&constructor_ref);\n",{"type":46,"tag":629,"props":846,"children":848},{"class":631,"line":847},26,[849],{"type":46,"tag":629,"props":850,"children":851},{"emptyLinePlaceholder":680},[852],{"type":52,"value":683},{"type":46,"tag":629,"props":854,"children":856},{"class":631,"line":855},27,[857],{"type":46,"tag":629,"props":858,"children":859},{},[860],{"type":52,"value":861},"    \u002F\u002F 4. Store data in object\n",{"type":46,"tag":629,"props":863,"children":865},{"class":631,"line":864},28,[866],{"type":46,"tag":629,"props":867,"children":868},{},[869],{"type":52,"value":870},"    move_to(&object_signer, MyObject {\n",{"type":46,"tag":629,"props":872,"children":874},{"class":631,"line":873},29,[875],{"type":46,"tag":629,"props":876,"children":877},{},[878],{"type":52,"value":879},"        name,\n",{"type":46,"tag":629,"props":881,"children":883},{"class":631,"line":882},30,[884],{"type":46,"tag":629,"props":885,"children":886},{},[887],{"type":52,"value":888},"        transfer_ref,\n",{"type":46,"tag":629,"props":890,"children":892},{"class":631,"line":891},31,[893],{"type":46,"tag":629,"props":894,"children":895},{},[896],{"type":52,"value":897},"        delete_ref,\n",{"type":46,"tag":629,"props":899,"children":901},{"class":631,"line":900},32,[902],{"type":46,"tag":629,"props":903,"children":904},{},[905],{"type":52,"value":906},"    });\n",{"type":46,"tag":629,"props":908,"children":910},{"class":631,"line":909},33,[911],{"type":46,"tag":629,"props":912,"children":913},{"emptyLinePlaceholder":680},[914],{"type":52,"value":683},{"type":46,"tag":629,"props":916,"children":918},{"class":631,"line":917},34,[919],{"type":46,"tag":629,"props":920,"children":921},{},[922],{"type":52,"value":923},"    \u002F\u002F 5. Return typed object reference (ConstructorRef automatically destroyed)\n",{"type":46,"tag":629,"props":925,"children":927},{"class":631,"line":926},35,[928],{"type":46,"tag":629,"props":929,"children":930},{},[931],{"type":52,"value":932},"    object::object_from_constructor_ref\u003CMyObject>(&constructor_ref)\n",{"type":46,"tag":629,"props":934,"children":936},{"class":631,"line":935},36,[937],{"type":46,"tag":629,"props":938,"children":939},{},[940],{"type":52,"value":674},{"type":46,"tag":629,"props":942,"children":944},{"class":631,"line":943},37,[945],{"type":46,"tag":629,"props":946,"children":947},{"emptyLinePlaceholder":680},[948],{"type":52,"value":683},{"type":46,"tag":629,"props":950,"children":952},{"class":631,"line":951},38,[953],{"type":46,"tag":629,"props":954,"children":955},{},[956],{"type":52,"value":957},"\u002F\u002F\u002F Update with ownership verification\n",{"type":46,"tag":629,"props":959,"children":961},{"class":631,"line":960},39,[962],{"type":46,"tag":629,"props":963,"children":964},{},[965],{"type":52,"value":966},"public entry fun update_object(\n",{"type":46,"tag":629,"props":968,"children":970},{"class":631,"line":969},40,[971],{"type":46,"tag":629,"props":972,"children":973},{},[974],{"type":52,"value":975},"    owner: &signer,\n",{"type":46,"tag":629,"props":977,"children":979},{"class":631,"line":978},41,[980],{"type":46,"tag":629,"props":981,"children":982},{},[983],{"type":52,"value":984},"    obj: Object\u003CMyObject>,\n",{"type":46,"tag":629,"props":986,"children":988},{"class":631,"line":987},42,[989],{"type":46,"tag":629,"props":990,"children":991},{},[992],{"type":52,"value":993},"    new_name: String\n",{"type":46,"tag":629,"props":995,"children":997},{"class":631,"line":996},43,[998],{"type":46,"tag":629,"props":999,"children":1000},{},[1001],{"type":52,"value":1002},") acquires MyObject {\n",{"type":46,"tag":629,"props":1004,"children":1006},{"class":631,"line":1005},44,[1007],{"type":46,"tag":629,"props":1008,"children":1009},{},[1010],{"type":52,"value":1011},"    \u002F\u002F ✅ ALWAYS: Verify ownership\n",{"type":46,"tag":629,"props":1013,"children":1015},{"class":631,"line":1014},45,[1016],{"type":46,"tag":629,"props":1017,"children":1018},{},[1019],{"type":52,"value":1020},"    assert!(object::owner(obj) == signer::address_of(owner), E_NOT_OWNER);\n",{"type":46,"tag":629,"props":1022,"children":1024},{"class":631,"line":1023},46,[1025],{"type":46,"tag":629,"props":1026,"children":1027},{"emptyLinePlaceholder":680},[1028],{"type":52,"value":683},{"type":46,"tag":629,"props":1030,"children":1032},{"class":631,"line":1031},47,[1033],{"type":46,"tag":629,"props":1034,"children":1035},{},[1036],{"type":52,"value":1037},"    \u002F\u002F ✅ ALWAYS: Validate inputs\n",{"type":46,"tag":629,"props":1039,"children":1041},{"class":631,"line":1040},48,[1042],{"type":46,"tag":629,"props":1043,"children":1044},{},[1045],{"type":52,"value":1046},"    assert!(string::length(&new_name) > 0, E_EMPTY_STRING);\n",{"type":46,"tag":629,"props":1048,"children":1050},{"class":631,"line":1049},49,[1051],{"type":46,"tag":629,"props":1052,"children":1053},{},[1054],{"type":52,"value":1055},"    assert!(string::length(&new_name) \u003C= MAX_NAME_LENGTH, E_NAME_TOO_LONG);\n",{"type":46,"tag":629,"props":1057,"children":1059},{"class":631,"line":1058},50,[1060],{"type":46,"tag":629,"props":1061,"children":1062},{"emptyLinePlaceholder":680},[1063],{"type":52,"value":683},{"type":46,"tag":629,"props":1065,"children":1067},{"class":631,"line":1066},51,[1068],{"type":46,"tag":629,"props":1069,"children":1070},{},[1071],{"type":52,"value":1072},"    \u002F\u002F Safe to proceed\n",{"type":46,"tag":629,"props":1074,"children":1076},{"class":631,"line":1075},52,[1077],{"type":46,"tag":629,"props":1078,"children":1079},{},[1080],{"type":52,"value":1081},"    let obj_data = borrow_global_mut\u003CMyObject>(object::object_address(&obj));\n",{"type":46,"tag":629,"props":1083,"children":1085},{"class":631,"line":1084},53,[1086],{"type":46,"tag":629,"props":1087,"children":1088},{},[1089],{"type":52,"value":1090},"    obj_data.name = new_name;\n",{"type":46,"tag":629,"props":1092,"children":1094},{"class":631,"line":1093},54,[1095],{"type":46,"tag":629,"props":1096,"children":1097},{},[1098],{"type":52,"value":674},{"type":46,"tag":55,"props":1100,"children":1102},{"id":1101},"key-example-accessor-functions-for-testing",[1103],{"type":52,"value":1104},"Key Example: Accessor Functions for Testing",{"type":46,"tag":619,"props":1106,"children":1108},{"className":621,"code":1107,"language":36,"meta":623,"style":623},"struct ListingInfo has store, drop, copy {\n    seller: address,\n    price: u64,\n    listed_at: u64,\n}\n\n\u002F\u002F\u002F Accessor function - tests cannot access struct fields directly\n\u002F\u002F\u002F Use tuple returns for multiple fields\n#[view]\npublic fun get_listing_details(nft_addr: address): (address, u64, u64) acquires Listings {\n    let listings = borrow_global\u003CListings>(get_marketplace_address());\n    assert!(table::contains(&listings.items, nft_addr), E_NOT_LISTED);\n    let listing = table::borrow(&listings.items, nft_addr);\n    (listing.seller, listing.price, listing.listed_at)\n}\n\n\u002F\u002F\u002F Single-field accessor when only one value needed\n#[view]\npublic fun get_staked_amount(user_addr: address): u64 acquires Stakes {\n    let stakes = borrow_global\u003CStakes>(get_vault_address());\n    if (table_with_length::contains(&stakes.items, user_addr)) {\n        table_with_length::borrow(&stakes.items, user_addr).amount\n    } else {\n        0\n    }\n}\n",[1109],{"type":46,"tag":95,"props":1110,"children":1111},{"__ignoreMap":623},[1112,1120,1128,1136,1144,1151,1158,1166,1174,1182,1190,1198,1206,1214,1222,1229,1236,1244,1251,1259,1267,1275,1283,1291,1299,1307],{"type":46,"tag":629,"props":1113,"children":1114},{"class":631,"line":632},[1115],{"type":46,"tag":629,"props":1116,"children":1117},{},[1118],{"type":52,"value":1119},"struct ListingInfo has store, drop, copy {\n",{"type":46,"tag":629,"props":1121,"children":1122},{"class":631,"line":641},[1123],{"type":46,"tag":629,"props":1124,"children":1125},{},[1126],{"type":52,"value":1127},"    seller: address,\n",{"type":46,"tag":629,"props":1129,"children":1130},{"class":631,"line":650},[1131],{"type":46,"tag":629,"props":1132,"children":1133},{},[1134],{"type":52,"value":1135},"    price: u64,\n",{"type":46,"tag":629,"props":1137,"children":1138},{"class":631,"line":659},[1139],{"type":46,"tag":629,"props":1140,"children":1141},{},[1142],{"type":52,"value":1143},"    listed_at: u64,\n",{"type":46,"tag":629,"props":1145,"children":1146},{"class":631,"line":668},[1147],{"type":46,"tag":629,"props":1148,"children":1149},{},[1150],{"type":52,"value":674},{"type":46,"tag":629,"props":1152,"children":1153},{"class":631,"line":175},[1154],{"type":46,"tag":629,"props":1155,"children":1156},{"emptyLinePlaceholder":680},[1157],{"type":52,"value":683},{"type":46,"tag":629,"props":1159,"children":1160},{"class":631,"line":686},[1161],{"type":46,"tag":629,"props":1162,"children":1163},{},[1164],{"type":52,"value":1165},"\u002F\u002F\u002F Accessor function - tests cannot access struct fields directly\n",{"type":46,"tag":629,"props":1167,"children":1168},{"class":631,"line":24},[1169],{"type":46,"tag":629,"props":1170,"children":1171},{},[1172],{"type":52,"value":1173},"\u002F\u002F\u002F Use tuple returns for multiple fields\n",{"type":46,"tag":629,"props":1175,"children":1176},{"class":631,"line":703},[1177],{"type":46,"tag":629,"props":1178,"children":1179},{},[1180],{"type":52,"value":1181},"#[view]\n",{"type":46,"tag":629,"props":1183,"children":1184},{"class":631,"line":712},[1185],{"type":46,"tag":629,"props":1186,"children":1187},{},[1188],{"type":52,"value":1189},"public fun get_listing_details(nft_addr: address): (address, u64, u64) acquires Listings {\n",{"type":46,"tag":629,"props":1191,"children":1192},{"class":631,"line":721},[1193],{"type":46,"tag":629,"props":1194,"children":1195},{},[1196],{"type":52,"value":1197},"    let listings = borrow_global\u003CListings>(get_marketplace_address());\n",{"type":46,"tag":629,"props":1199,"children":1200},{"class":631,"line":275},[1201],{"type":46,"tag":629,"props":1202,"children":1203},{},[1204],{"type":52,"value":1205},"    assert!(table::contains(&listings.items, nft_addr), E_NOT_LISTED);\n",{"type":46,"tag":629,"props":1207,"children":1208},{"class":631,"line":737},[1209],{"type":46,"tag":629,"props":1210,"children":1211},{},[1212],{"type":52,"value":1213},"    let listing = table::borrow(&listings.items, nft_addr);\n",{"type":46,"tag":629,"props":1215,"children":1216},{"class":631,"line":746},[1217],{"type":46,"tag":629,"props":1218,"children":1219},{},[1220],{"type":52,"value":1221},"    (listing.seller, listing.price, listing.listed_at)\n",{"type":46,"tag":629,"props":1223,"children":1224},{"class":631,"line":754},[1225],{"type":46,"tag":629,"props":1226,"children":1227},{},[1228],{"type":52,"value":674},{"type":46,"tag":629,"props":1230,"children":1231},{"class":631,"line":338},[1232],{"type":46,"tag":629,"props":1233,"children":1234},{"emptyLinePlaceholder":680},[1235],{"type":52,"value":683},{"type":46,"tag":629,"props":1237,"children":1238},{"class":631,"line":771},[1239],{"type":46,"tag":629,"props":1240,"children":1241},{},[1242],{"type":52,"value":1243},"\u002F\u002F\u002F Single-field accessor when only one value needed\n",{"type":46,"tag":629,"props":1245,"children":1246},{"class":631,"line":20},[1247],{"type":46,"tag":629,"props":1248,"children":1249},{},[1250],{"type":52,"value":1181},{"type":46,"tag":629,"props":1252,"children":1253},{"class":631,"line":788},[1254],{"type":46,"tag":629,"props":1255,"children":1256},{},[1257],{"type":52,"value":1258},"public fun get_staked_amount(user_addr: address): u64 acquires Stakes {\n",{"type":46,"tag":629,"props":1260,"children":1261},{"class":631,"line":424},[1262],{"type":46,"tag":629,"props":1263,"children":1264},{},[1265],{"type":52,"value":1266},"    let stakes = borrow_global\u003CStakes>(get_vault_address());\n",{"type":46,"tag":629,"props":1268,"children":1269},{"class":631,"line":804},[1270],{"type":46,"tag":629,"props":1271,"children":1272},{},[1273],{"type":52,"value":1274},"    if (table_with_length::contains(&stakes.items, user_addr)) {\n",{"type":46,"tag":629,"props":1276,"children":1277},{"class":631,"line":813},[1278],{"type":46,"tag":629,"props":1279,"children":1280},{},[1281],{"type":52,"value":1282},"        table_with_length::borrow(&stakes.items, user_addr).amount\n",{"type":46,"tag":629,"props":1284,"children":1285},{"class":631,"line":464},[1286],{"type":46,"tag":629,"props":1287,"children":1288},{},[1289],{"type":52,"value":1290},"    } else {\n",{"type":46,"tag":629,"props":1292,"children":1293},{"class":631,"line":829},[1294],{"type":46,"tag":629,"props":1295,"children":1296},{},[1297],{"type":52,"value":1298},"        0\n",{"type":46,"tag":629,"props":1300,"children":1301},{"class":631,"line":838},[1302],{"type":46,"tag":629,"props":1303,"children":1304},{},[1305],{"type":52,"value":1306},"    }\n",{"type":46,"tag":629,"props":1308,"children":1309},{"class":631,"line":847},[1310],{"type":46,"tag":629,"props":1311,"children":1312},{},[1313],{"type":52,"value":674},{"type":46,"tag":55,"props":1315,"children":1317},{"id":1316},"module-structure-template",[1318],{"type":52,"value":1319},"Module Structure Template",{"type":46,"tag":619,"props":1321,"children":1323},{"className":621,"code":1322,"language":36,"meta":623,"style":623},"module my_addr::my_module {\n    \u002F\u002F ============ Imports ============\n    use std::signer;\n    use std::string::String;\n    use aptos_framework::object::{Self, Object};\n    use aptos_framework::event;\n\n    \u002F\u002F ============ Events ============\n    #[event]\n    struct ItemCreated has drop, store {\n        item: address,\n        creator: address,\n    }\n\n    \u002F\u002F ============ Structs ============\n    \u002F\u002F Define your data structures\n\n    \u002F\u002F ============ Constants ============\n    const E_NOT_OWNER: u64 = 1;\n    const E_UNAUTHORIZED: u64 = 2;\n\n    \u002F\u002F ============ Init Module ============\n    fun init_module(deployer: &signer) {\n        \u002F\u002F Initialize global state, registries, etc.\n    }\n\n    \u002F\u002F ============ Public Entry Functions ============\n    \u002F\u002F User-facing functions\n\n    \u002F\u002F ============ Public Functions ============\n    \u002F\u002F Composable functions\n\n    \u002F\u002F ============ Private Functions ============\n    \u002F\u002F Internal helpers\n}\n",[1324],{"type":46,"tag":95,"props":1325,"children":1326},{"__ignoreMap":623},[1327,1335,1343,1351,1359,1367,1375,1382,1390,1398,1406,1414,1422,1429,1436,1444,1452,1459,1467,1475,1483,1490,1498,1506,1514,1521,1528,1536,1544,1551,1559,1567,1574,1582,1590],{"type":46,"tag":629,"props":1328,"children":1329},{"class":631,"line":632},[1330],{"type":46,"tag":629,"props":1331,"children":1332},{},[1333],{"type":52,"value":1334},"module my_addr::my_module {\n",{"type":46,"tag":629,"props":1336,"children":1337},{"class":631,"line":641},[1338],{"type":46,"tag":629,"props":1339,"children":1340},{},[1341],{"type":52,"value":1342},"    \u002F\u002F ============ Imports ============\n",{"type":46,"tag":629,"props":1344,"children":1345},{"class":631,"line":650},[1346],{"type":46,"tag":629,"props":1347,"children":1348},{},[1349],{"type":52,"value":1350},"    use std::signer;\n",{"type":46,"tag":629,"props":1352,"children":1353},{"class":631,"line":659},[1354],{"type":46,"tag":629,"props":1355,"children":1356},{},[1357],{"type":52,"value":1358},"    use std::string::String;\n",{"type":46,"tag":629,"props":1360,"children":1361},{"class":631,"line":668},[1362],{"type":46,"tag":629,"props":1363,"children":1364},{},[1365],{"type":52,"value":1366},"    use aptos_framework::object::{Self, Object};\n",{"type":46,"tag":629,"props":1368,"children":1369},{"class":631,"line":175},[1370],{"type":46,"tag":629,"props":1371,"children":1372},{},[1373],{"type":52,"value":1374},"    use aptos_framework::event;\n",{"type":46,"tag":629,"props":1376,"children":1377},{"class":631,"line":686},[1378],{"type":46,"tag":629,"props":1379,"children":1380},{"emptyLinePlaceholder":680},[1381],{"type":52,"value":683},{"type":46,"tag":629,"props":1383,"children":1384},{"class":631,"line":24},[1385],{"type":46,"tag":629,"props":1386,"children":1387},{},[1388],{"type":52,"value":1389},"    \u002F\u002F ============ Events ============\n",{"type":46,"tag":629,"props":1391,"children":1392},{"class":631,"line":703},[1393],{"type":46,"tag":629,"props":1394,"children":1395},{},[1396],{"type":52,"value":1397},"    #[event]\n",{"type":46,"tag":629,"props":1399,"children":1400},{"class":631,"line":712},[1401],{"type":46,"tag":629,"props":1402,"children":1403},{},[1404],{"type":52,"value":1405},"    struct ItemCreated has drop, store {\n",{"type":46,"tag":629,"props":1407,"children":1408},{"class":631,"line":721},[1409],{"type":46,"tag":629,"props":1410,"children":1411},{},[1412],{"type":52,"value":1413},"        item: address,\n",{"type":46,"tag":629,"props":1415,"children":1416},{"class":631,"line":275},[1417],{"type":46,"tag":629,"props":1418,"children":1419},{},[1420],{"type":52,"value":1421},"        creator: address,\n",{"type":46,"tag":629,"props":1423,"children":1424},{"class":631,"line":737},[1425],{"type":46,"tag":629,"props":1426,"children":1427},{},[1428],{"type":52,"value":1306},{"type":46,"tag":629,"props":1430,"children":1431},{"class":631,"line":746},[1432],{"type":46,"tag":629,"props":1433,"children":1434},{"emptyLinePlaceholder":680},[1435],{"type":52,"value":683},{"type":46,"tag":629,"props":1437,"children":1438},{"class":631,"line":754},[1439],{"type":46,"tag":629,"props":1440,"children":1441},{},[1442],{"type":52,"value":1443},"    \u002F\u002F ============ Structs ============\n",{"type":46,"tag":629,"props":1445,"children":1446},{"class":631,"line":338},[1447],{"type":46,"tag":629,"props":1448,"children":1449},{},[1450],{"type":52,"value":1451},"    \u002F\u002F Define your data structures\n",{"type":46,"tag":629,"props":1453,"children":1454},{"class":631,"line":771},[1455],{"type":46,"tag":629,"props":1456,"children":1457},{"emptyLinePlaceholder":680},[1458],{"type":52,"value":683},{"type":46,"tag":629,"props":1460,"children":1461},{"class":631,"line":20},[1462],{"type":46,"tag":629,"props":1463,"children":1464},{},[1465],{"type":52,"value":1466},"    \u002F\u002F ============ Constants ============\n",{"type":46,"tag":629,"props":1468,"children":1469},{"class":631,"line":788},[1470],{"type":46,"tag":629,"props":1471,"children":1472},{},[1473],{"type":52,"value":1474},"    const E_NOT_OWNER: u64 = 1;\n",{"type":46,"tag":629,"props":1476,"children":1477},{"class":631,"line":424},[1478],{"type":46,"tag":629,"props":1479,"children":1480},{},[1481],{"type":52,"value":1482},"    const E_UNAUTHORIZED: u64 = 2;\n",{"type":46,"tag":629,"props":1484,"children":1485},{"class":631,"line":804},[1486],{"type":46,"tag":629,"props":1487,"children":1488},{"emptyLinePlaceholder":680},[1489],{"type":52,"value":683},{"type":46,"tag":629,"props":1491,"children":1492},{"class":631,"line":813},[1493],{"type":46,"tag":629,"props":1494,"children":1495},{},[1496],{"type":52,"value":1497},"    \u002F\u002F ============ Init Module ============\n",{"type":46,"tag":629,"props":1499,"children":1500},{"class":631,"line":464},[1501],{"type":46,"tag":629,"props":1502,"children":1503},{},[1504],{"type":52,"value":1505},"    fun init_module(deployer: &signer) {\n",{"type":46,"tag":629,"props":1507,"children":1508},{"class":631,"line":829},[1509],{"type":46,"tag":629,"props":1510,"children":1511},{},[1512],{"type":52,"value":1513},"        \u002F\u002F Initialize global state, registries, etc.\n",{"type":46,"tag":629,"props":1515,"children":1516},{"class":631,"line":838},[1517],{"type":46,"tag":629,"props":1518,"children":1519},{},[1520],{"type":52,"value":1306},{"type":46,"tag":629,"props":1522,"children":1523},{"class":631,"line":847},[1524],{"type":46,"tag":629,"props":1525,"children":1526},{"emptyLinePlaceholder":680},[1527],{"type":52,"value":683},{"type":46,"tag":629,"props":1529,"children":1530},{"class":631,"line":855},[1531],{"type":46,"tag":629,"props":1532,"children":1533},{},[1534],{"type":52,"value":1535},"    \u002F\u002F ============ Public Entry Functions ============\n",{"type":46,"tag":629,"props":1537,"children":1538},{"class":631,"line":864},[1539],{"type":46,"tag":629,"props":1540,"children":1541},{},[1542],{"type":52,"value":1543},"    \u002F\u002F User-facing functions\n",{"type":46,"tag":629,"props":1545,"children":1546},{"class":631,"line":873},[1547],{"type":46,"tag":629,"props":1548,"children":1549},{"emptyLinePlaceholder":680},[1550],{"type":52,"value":683},{"type":46,"tag":629,"props":1552,"children":1553},{"class":631,"line":882},[1554],{"type":46,"tag":629,"props":1555,"children":1556},{},[1557],{"type":52,"value":1558},"    \u002F\u002F ============ Public Functions ============\n",{"type":46,"tag":629,"props":1560,"children":1561},{"class":631,"line":891},[1562],{"type":46,"tag":629,"props":1563,"children":1564},{},[1565],{"type":52,"value":1566},"    \u002F\u002F Composable functions\n",{"type":46,"tag":629,"props":1568,"children":1569},{"class":631,"line":900},[1570],{"type":46,"tag":629,"props":1571,"children":1572},{"emptyLinePlaceholder":680},[1573],{"type":52,"value":683},{"type":46,"tag":629,"props":1575,"children":1576},{"class":631,"line":909},[1577],{"type":46,"tag":629,"props":1578,"children":1579},{},[1580],{"type":52,"value":1581},"    \u002F\u002F ============ Private Functions ============\n",{"type":46,"tag":629,"props":1583,"children":1584},{"class":631,"line":917},[1585],{"type":46,"tag":629,"props":1586,"children":1587},{},[1588],{"type":52,"value":1589},"    \u002F\u002F Internal helpers\n",{"type":46,"tag":629,"props":1591,"children":1592},{"class":631,"line":926},[1593],{"type":46,"tag":629,"props":1594,"children":1595},{},[1596],{"type":52,"value":674},{"type":46,"tag":55,"props":1598,"children":1600},{"id":1599},"storage-type-selection",[1601],{"type":52,"value":1602},"Storage Type Selection",{"type":46,"tag":1604,"props":1605,"children":1606},"p",{},[1607,1609,1614],{"type":52,"value":1608},"⚠️ ",{"type":46,"tag":77,"props":1610,"children":1611},{},[1612],{"type":52,"value":1613},"When user mentions storage",{"type":52,"value":1615}," (\"store\", \"track\", \"registry\", \"mapping\", \"list\", \"collection\"):",{"type":46,"tag":62,"props":1617,"children":1619},{"id":1618},"_1-ask-2-3-questions-see-referencesstorage-decision-treemd",[1620,1622,1628],{"type":52,"value":1621},"1. Ask 2-3 Questions (see ",{"type":46,"tag":95,"props":1623,"children":1625},{"className":1624},[],[1626],{"type":52,"value":1627},"references\u002Fstorage-decision-tree.md",{"type":52,"value":135},{"type":46,"tag":1630,"props":1631,"children":1632},"ul",{},[1633,1643,1653],{"type":46,"tag":73,"props":1634,"children":1635},{},[1636,1641],{"type":46,"tag":77,"props":1637,"children":1638},{},[1639],{"type":52,"value":1640},"Access pattern?",{"type":52,"value":1642}," (sequential vs key-value vs both)",{"type":46,"tag":73,"props":1644,"children":1645},{},[1646,1651],{"type":46,"tag":77,"props":1647,"children":1648},{},[1649],{"type":52,"value":1650},"Expected size?",{"type":52,"value":1652}," (small vs large vs unknown)",{"type":46,"tag":73,"props":1654,"children":1655},{},[1656,1669],{"type":46,"tag":77,"props":1657,"children":1658},{},[1659,1661,1667],{"type":52,"value":1660},"Need ",{"type":46,"tag":95,"props":1662,"children":1664},{"className":1663},[],[1665],{"type":52,"value":1666},".length()",{"type":52,"value":1668},"?",{"type":52,"value":1670}," (conditional)",{"type":46,"tag":62,"props":1672,"children":1674},{"id":1673},"_2-recommend-from-patterns-referencesstorage-patternsmd",[1675,1677,1683],{"type":52,"value":1676},"2. Recommend from Patterns (",{"type":46,"tag":95,"props":1678,"children":1680},{"className":1679},[],[1681],{"type":52,"value":1682},"references\u002Fstorage-patterns.md",{"type":52,"value":135},{"type":46,"tag":1685,"props":1686,"children":1687},"table",{},[1688,1707],{"type":46,"tag":1689,"props":1690,"children":1691},"thead",{},[1692],{"type":46,"tag":1693,"props":1694,"children":1695},"tr",{},[1696,1702],{"type":46,"tag":1697,"props":1698,"children":1699},"th",{},[1700],{"type":52,"value":1701},"Pattern",{"type":46,"tag":1697,"props":1703,"children":1704},{},[1705],{"type":52,"value":1706},"Recommended Storage",{"type":46,"tag":1708,"props":1709,"children":1710},"tbody",{},[1711,1729,1746,1763,1788,1805,1822,1839,1856],{"type":46,"tag":1693,"props":1712,"children":1713},{},[1714,1720],{"type":46,"tag":1715,"props":1716,"children":1717},"td",{},[1718],{"type":52,"value":1719},"User registry",{"type":46,"tag":1715,"props":1721,"children":1722},{},[1723],{"type":46,"tag":95,"props":1724,"children":1726},{"className":1725},[],[1727],{"type":52,"value":1728},"Table\u003Caddress, UserInfo>",{"type":46,"tag":1693,"props":1730,"children":1731},{},[1732,1737],{"type":46,"tag":1715,"props":1733,"children":1734},{},[1735],{"type":52,"value":1736},"Staking records",{"type":46,"tag":1715,"props":1738,"children":1739},{},[1740],{"type":46,"tag":95,"props":1741,"children":1743},{"className":1742},[],[1744],{"type":52,"value":1745},"Table\u003Caddress, StakeInfo>",{"type":46,"tag":1693,"props":1747,"children":1748},{},[1749,1754],{"type":46,"tag":1715,"props":1750,"children":1751},{},[1752],{"type":52,"value":1753},"Leaderboard",{"type":46,"tag":1715,"props":1755,"children":1756},{},[1757],{"type":46,"tag":95,"props":1758,"children":1760},{"className":1759},[],[1761],{"type":52,"value":1762},"BigOrderedMap\u003Cu64, address>",{"type":46,"tag":1693,"props":1764,"children":1765},{},[1766,1771],{"type":46,"tag":1715,"props":1767,"children":1768},{},[1769],{"type":52,"value":1770},"Transaction log",{"type":46,"tag":1715,"props":1772,"children":1773},{},[1774,1780,1782],{"type":46,"tag":95,"props":1775,"children":1777},{"className":1776},[],[1778],{"type":52,"value":1779},"SmartVector\u003CTxRecord>",{"type":52,"value":1781}," or ",{"type":46,"tag":95,"props":1783,"children":1785},{"className":1784},[],[1786],{"type":52,"value":1787},"Vector",{"type":46,"tag":1693,"props":1789,"children":1790},{},[1791,1796],{"type":46,"tag":1715,"props":1792,"children":1793},{},[1794],{"type":52,"value":1795},"Whitelist (\u003C100)",{"type":46,"tag":1715,"props":1797,"children":1798},{},[1799],{"type":46,"tag":95,"props":1800,"children":1802},{"className":1801},[],[1803],{"type":52,"value":1804},"Vector\u003Caddress>",{"type":46,"tag":1693,"props":1806,"children":1807},{},[1808,1813],{"type":46,"tag":1715,"props":1809,"children":1810},{},[1811],{"type":52,"value":1812},"Voting records",{"type":46,"tag":1715,"props":1814,"children":1815},{},[1816],{"type":46,"tag":95,"props":1817,"children":1819},{"className":1818},[],[1820],{"type":52,"value":1821},"TableWithLength\u003Caddress, bool>",{"type":46,"tag":1693,"props":1823,"children":1824},{},[1825,1830],{"type":46,"tag":1715,"props":1826,"children":1827},{},[1828],{"type":52,"value":1829},"Config (\u003C50)",{"type":46,"tag":1715,"props":1831,"children":1832},{},[1833],{"type":46,"tag":95,"props":1834,"children":1836},{"className":1835},[],[1837],{"type":52,"value":1838},"OrderedMap\u003CString, Value>",{"type":46,"tag":1693,"props":1840,"children":1841},{},[1842,1847],{"type":46,"tag":1715,"props":1843,"children":1844},{},[1845],{"type":52,"value":1846},"DAO proposals",{"type":46,"tag":1715,"props":1848,"children":1849},{},[1850],{"type":46,"tag":95,"props":1851,"children":1853},{"className":1852},[],[1854],{"type":52,"value":1855},"BigOrderedMap\u003Cu64, Proposal>",{"type":46,"tag":1693,"props":1857,"children":1858},{},[1859,1864],{"type":46,"tag":1715,"props":1860,"children":1861},{},[1862],{"type":52,"value":1863},"Asset collection",{"type":46,"tag":1715,"props":1865,"children":1866},{},[1867,1873,1874],{"type":46,"tag":95,"props":1868,"children":1870},{"className":1869},[],[1871],{"type":52,"value":1872},"Vector\u003CObject\u003CT>>",{"type":52,"value":1781},{"type":46,"tag":95,"props":1875,"children":1877},{"className":1876},[],[1878],{"type":52,"value":1879},"SmartVector",{"type":46,"tag":62,"props":1881,"children":1883},{"id":1882},"_3-include-brief-gas-context",[1884],{"type":52,"value":1885},"3. Include Brief Gas Context",{"type":46,"tag":1604,"props":1887,"children":1888},{},[1889],{"type":46,"tag":77,"props":1890,"children":1891},{},[1892],{"type":52,"value":1893},"Example recommendations:",{"type":46,"tag":1630,"props":1895,"children":1896},{},[1897,1909],{"type":46,"tag":73,"props":1898,"children":1899},{},[1900,1902,1907],{"type":52,"value":1901},"\"For staking, I recommend ",{"type":46,"tag":95,"props":1903,"children":1905},{"className":1904},[],[1906],{"type":52,"value":1745},{"type":52,"value":1908}," because you'll have unbounded users with concurrent operations\n(separate slots enable parallel access)\"",{"type":46,"tag":73,"props":1910,"children":1911},{},[1912,1914,1919,1921,1927],{"type":52,"value":1913},"\"For leaderboard, I recommend ",{"type":46,"tag":95,"props":1915,"children":1917},{"className":1916},[],[1918],{"type":52,"value":1762},{"type":52,"value":1920}," because you need sorted iteration (O(log n), use\n",{"type":46,"tag":95,"props":1922,"children":1924},{"className":1923},[],[1925],{"type":52,"value":1926},"allocate_spare_slots",{"type":52,"value":1928}," for production)\"",{"type":46,"tag":62,"props":1930,"children":1932},{"id":1931},"storage-types-available",[1933],{"type":52,"value":1934},"Storage Types Available",{"type":46,"tag":1630,"props":1936,"children":1937},{},[1938,1947,1956,1966,1976,1986],{"type":46,"tag":73,"props":1939,"children":1940},{},[1941,1945],{"type":46,"tag":77,"props":1942,"children":1943},{},[1944],{"type":52,"value":1787},{"type":52,"value":1946}," - Small sequential (\u003C100 items)",{"type":46,"tag":73,"props":1948,"children":1949},{},[1950,1954],{"type":46,"tag":77,"props":1951,"children":1952},{},[1953],{"type":52,"value":1879},{"type":52,"value":1955}," - Large sequential (100+ items)",{"type":46,"tag":73,"props":1957,"children":1958},{},[1959,1964],{"type":46,"tag":77,"props":1960,"children":1961},{},[1962],{"type":52,"value":1963},"Table",{"type":52,"value":1965}," - Unordered key-value lookups",{"type":46,"tag":73,"props":1967,"children":1968},{},[1969,1974],{"type":46,"tag":77,"props":1970,"children":1971},{},[1972],{"type":52,"value":1973},"TableWithLength",{"type":52,"value":1975}," - Table with count tracking",{"type":46,"tag":73,"props":1977,"children":1978},{},[1979,1984],{"type":46,"tag":77,"props":1980,"children":1981},{},[1982],{"type":52,"value":1983},"OrderedMap",{"type":52,"value":1985}," - Small sorted maps (\u003C100 items)",{"type":46,"tag":73,"props":1987,"children":1988},{},[1989,1994],{"type":46,"tag":77,"props":1990,"children":1991},{},[1992],{"type":52,"value":1993},"BigOrderedMap",{"type":52,"value":1995}," - Large sorted maps (100+ items)",{"type":46,"tag":1604,"props":1997,"children":1998},{},[1999,2000,2005],{"type":52,"value":1608},{"type":46,"tag":77,"props":2001,"children":2002},{},[2003],{"type":52,"value":2004},"NEVER use SmartTable",{"type":52,"value":2006}," (deprecated, use BigOrderedMap)",{"type":46,"tag":1604,"props":2008,"children":2009},{},[2010,2015,2017,2023],{"type":46,"tag":77,"props":2011,"children":2012},{},[2013],{"type":52,"value":2014},"Details:",{"type":52,"value":2016}," See ",{"type":46,"tag":95,"props":2018,"children":2020},{"className":2019},[],[2021],{"type":52,"value":2022},"references\u002F",{"type":52,"value":2024}," for decision tree, type comparisons, and gas optimization.",{"type":46,"tag":55,"props":2026,"children":2028},{"id":2027},"anti-patterns",[2029],{"type":52,"value":2030},"Anti-patterns",{"type":46,"tag":69,"props":2032,"children":2033},{},[2034,2051,2062,2073,2084,2095,2104,2115,2126,2137,2148,2175],{"type":46,"tag":73,"props":2035,"children":2036},{},[2037,2039,2044,2046],{"type":52,"value":2038},"❌ ",{"type":46,"tag":77,"props":2040,"children":2041},{},[2042],{"type":52,"value":2043},"Never use legacy TokenV1",{"type":52,"value":2045}," standard or import ",{"type":46,"tag":95,"props":2047,"children":2049},{"className":2048},[],[2050],{"type":52,"value":151},{"type":46,"tag":73,"props":2052,"children":2053},{},[2054,2055,2060],{"type":52,"value":2038},{"type":46,"tag":77,"props":2056,"children":2057},{},[2058],{"type":52,"value":2059},"Never use resource accounts",{"type":52,"value":2061}," (use named objects instead)",{"type":46,"tag":73,"props":2063,"children":2064},{},[2065,2066,2071],{"type":52,"value":2038},{"type":46,"tag":77,"props":2067,"children":2068},{},[2069],{"type":52,"value":2070},"Never return ConstructorRef",{"type":52,"value":2072}," from public functions",{"type":46,"tag":73,"props":2074,"children":2075},{},[2076,2077,2082],{"type":52,"value":2038},{"type":46,"tag":77,"props":2078,"children":2079},{},[2080],{"type":52,"value":2081},"Never skip signer verification",{"type":52,"value":2083}," in entry functions",{"type":46,"tag":73,"props":2085,"children":2086},{},[2087,2088,2093],{"type":52,"value":2038},{"type":46,"tag":77,"props":2089,"children":2090},{},[2091],{"type":52,"value":2092},"Never skip input validation",{"type":52,"value":2094}," (amounts, addresses, strings)",{"type":46,"tag":73,"props":2096,"children":2097},{},[2098,2099],{"type":52,"value":2038},{"type":46,"tag":77,"props":2100,"children":2101},{},[2102],{"type":52,"value":2103},"Never deploy without 100% test coverage",{"type":46,"tag":73,"props":2105,"children":2106},{},[2107,2108,2113],{"type":52,"value":2038},{"type":46,"tag":77,"props":2109,"children":2110},{},[2111],{"type":52,"value":2112},"Never create helper functions",{"type":52,"value":2114}," that just return named addresses",{"type":46,"tag":73,"props":2116,"children":2117},{},[2118,2119,2124],{"type":52,"value":2038},{"type":46,"tag":77,"props":2120,"children":2121},{},[2122],{"type":52,"value":2123},"Never skip event emission",{"type":52,"value":2125}," for significant activities",{"type":46,"tag":73,"props":2127,"children":2128},{},[2129,2130,2135],{"type":52,"value":2038},{"type":46,"tag":77,"props":2131,"children":2132},{},[2133],{"type":52,"value":2134},"Never use old syntax",{"type":52,"value":2136}," when V2 syntax is available",{"type":46,"tag":73,"props":2138,"children":2139},{},[2140,2141,2146],{"type":52,"value":2038},{"type":46,"tag":77,"props":2142,"children":2143},{},[2144],{"type":52,"value":2145},"Never skip init_module",{"type":52,"value":2147}," for contracts that need initialization",{"type":46,"tag":73,"props":2149,"children":2150},{},[2151,2152,2157,2159,2165,2167,2173],{"type":52,"value":2038},{"type":46,"tag":77,"props":2153,"children":2154},{},[2155],{"type":52,"value":2156},"Never hardcode real private keys",{"type":52,"value":2158}," or secrets in code — use ",{"type":46,"tag":95,"props":2160,"children":2162},{"className":2161},[],[2163],{"type":52,"value":2164},"@my_addr",{"type":52,"value":2166}," named addresses and ",{"type":46,"tag":95,"props":2168,"children":2170},{"className":2169},[],[2171],{"type":52,"value":2172},"\"0x...\"",{"type":52,"value":2174},"\nplaceholders",{"type":46,"tag":73,"props":2176,"children":2177},{},[2178,2179,2197],{"type":52,"value":2038},{"type":46,"tag":77,"props":2180,"children":2181},{},[2182,2184,2190,2191],{"type":52,"value":2183},"Never read ",{"type":46,"tag":95,"props":2185,"children":2187},{"className":2186},[],[2188],{"type":52,"value":2189},".env",{"type":52,"value":1781},{"type":46,"tag":95,"props":2192,"children":2194},{"className":2193},[],[2195],{"type":52,"value":2196},"~\u002F.aptos\u002Fconfig.yaml",{"type":52,"value":2198}," — these contain private keys",{"type":46,"tag":55,"props":2200,"children":2202},{"id":2201},"edge-cases-to-handle",[2203],{"type":52,"value":2204},"Edge Cases to Handle",{"type":46,"tag":1685,"props":2206,"children":2207},{},[2208,2229],{"type":46,"tag":1689,"props":2209,"children":2210},{},[2211],{"type":46,"tag":1693,"props":2212,"children":2213},{},[2214,2219,2224],{"type":46,"tag":1697,"props":2215,"children":2216},{},[2217],{"type":52,"value":2218},"Scenario",{"type":46,"tag":1697,"props":2220,"children":2221},{},[2222],{"type":52,"value":2223},"Check",{"type":46,"tag":1697,"props":2225,"children":2226},{},[2227],{"type":52,"value":2228},"Error Code",{"type":46,"tag":1708,"props":2230,"children":2231},{},[2232,2254,2276,2298,2320,2342,2364,2386,2408,2430,2452],{"type":46,"tag":1693,"props":2233,"children":2234},{},[2235,2240,2249],{"type":46,"tag":1715,"props":2236,"children":2237},{},[2238],{"type":52,"value":2239},"Zero amounts",{"type":46,"tag":1715,"props":2241,"children":2242},{},[2243],{"type":46,"tag":95,"props":2244,"children":2246},{"className":2245},[],[2247],{"type":52,"value":2248},"assert!(amount > 0, E_ZERO_AMOUNT)",{"type":46,"tag":1715,"props":2250,"children":2251},{},[2252],{"type":52,"value":2253},"E_ZERO_AMOUNT",{"type":46,"tag":1693,"props":2255,"children":2256},{},[2257,2262,2271],{"type":46,"tag":1715,"props":2258,"children":2259},{},[2260],{"type":52,"value":2261},"Excessive amounts",{"type":46,"tag":1715,"props":2263,"children":2264},{},[2265],{"type":46,"tag":95,"props":2266,"children":2268},{"className":2267},[],[2269],{"type":52,"value":2270},"assert!(amount \u003C= MAX, E_AMOUNT_TOO_HIGH)",{"type":46,"tag":1715,"props":2272,"children":2273},{},[2274],{"type":52,"value":2275},"E_AMOUNT_TOO_HIGH",{"type":46,"tag":1693,"props":2277,"children":2278},{},[2279,2284,2293],{"type":46,"tag":1715,"props":2280,"children":2281},{},[2282],{"type":52,"value":2283},"Empty vectors",{"type":46,"tag":1715,"props":2285,"children":2286},{},[2287],{"type":46,"tag":95,"props":2288,"children":2290},{"className":2289},[],[2291],{"type":52,"value":2292},"assert!(vector::length(&v) > 0, E_EMPTY_VECTOR)",{"type":46,"tag":1715,"props":2294,"children":2295},{},[2296],{"type":52,"value":2297},"E_EMPTY_VECTOR",{"type":46,"tag":1693,"props":2299,"children":2300},{},[2301,2306,2315],{"type":46,"tag":1715,"props":2302,"children":2303},{},[2304],{"type":52,"value":2305},"Empty strings",{"type":46,"tag":1715,"props":2307,"children":2308},{},[2309],{"type":46,"tag":95,"props":2310,"children":2312},{"className":2311},[],[2313],{"type":52,"value":2314},"assert!(string::length(&s) > 0, E_EMPTY_STRING)",{"type":46,"tag":1715,"props":2316,"children":2317},{},[2318],{"type":52,"value":2319},"E_EMPTY_STRING",{"type":46,"tag":1693,"props":2321,"children":2322},{},[2323,2328,2337],{"type":46,"tag":1715,"props":2324,"children":2325},{},[2326],{"type":52,"value":2327},"Strings too long",{"type":46,"tag":1715,"props":2329,"children":2330},{},[2331],{"type":46,"tag":95,"props":2332,"children":2334},{"className":2333},[],[2335],{"type":52,"value":2336},"assert!(string::length(&s) \u003C= MAX, E_STRING_TOO_LONG)",{"type":46,"tag":1715,"props":2338,"children":2339},{},[2340],{"type":52,"value":2341},"E_STRING_TOO_LONG",{"type":46,"tag":1693,"props":2343,"children":2344},{},[2345,2350,2359],{"type":46,"tag":1715,"props":2346,"children":2347},{},[2348],{"type":52,"value":2349},"Zero address",{"type":46,"tag":1715,"props":2351,"children":2352},{},[2353],{"type":46,"tag":95,"props":2354,"children":2356},{"className":2355},[],[2357],{"type":52,"value":2358},"assert!(addr != @0x0, E_ZERO_ADDRESS)",{"type":46,"tag":1715,"props":2360,"children":2361},{},[2362],{"type":52,"value":2363},"E_ZERO_ADDRESS",{"type":46,"tag":1693,"props":2365,"children":2366},{},[2367,2372,2381],{"type":46,"tag":1715,"props":2368,"children":2369},{},[2370],{"type":52,"value":2371},"Overflow",{"type":46,"tag":1715,"props":2373,"children":2374},{},[2375],{"type":46,"tag":95,"props":2376,"children":2378},{"className":2377},[],[2379],{"type":52,"value":2380},"assert!(a \u003C= MAX_U64 - b, E_OVERFLOW)",{"type":46,"tag":1715,"props":2382,"children":2383},{},[2384],{"type":52,"value":2385},"E_OVERFLOW",{"type":46,"tag":1693,"props":2387,"children":2388},{},[2389,2394,2403],{"type":46,"tag":1715,"props":2390,"children":2391},{},[2392],{"type":52,"value":2393},"Underflow",{"type":46,"tag":1715,"props":2395,"children":2396},{},[2397],{"type":46,"tag":95,"props":2398,"children":2400},{"className":2399},[],[2401],{"type":52,"value":2402},"assert!(a >= b, E_UNDERFLOW)",{"type":46,"tag":1715,"props":2404,"children":2405},{},[2406],{"type":52,"value":2407},"E_UNDERFLOW",{"type":46,"tag":1693,"props":2409,"children":2410},{},[2411,2416,2425],{"type":46,"tag":1715,"props":2412,"children":2413},{},[2414],{"type":52,"value":2415},"Division by zero",{"type":46,"tag":1715,"props":2417,"children":2418},{},[2419],{"type":46,"tag":95,"props":2420,"children":2422},{"className":2421},[],[2423],{"type":52,"value":2424},"assert!(divisor > 0, E_DIVISION_BY_ZERO)",{"type":46,"tag":1715,"props":2426,"children":2427},{},[2428],{"type":52,"value":2429},"E_DIVISION_BY_ZERO",{"type":46,"tag":1693,"props":2431,"children":2432},{},[2433,2438,2447],{"type":46,"tag":1715,"props":2434,"children":2435},{},[2436],{"type":52,"value":2437},"Unauthorized access",{"type":46,"tag":1715,"props":2439,"children":2440},{},[2441],{"type":46,"tag":95,"props":2442,"children":2444},{"className":2443},[],[2445],{"type":52,"value":2446},"assert!(signer == expected, E_UNAUTHORIZED)",{"type":46,"tag":1715,"props":2448,"children":2449},{},[2450],{"type":52,"value":2451},"E_UNAUTHORIZED",{"type":46,"tag":1693,"props":2453,"children":2454},{},[2455,2460,2469],{"type":46,"tag":1715,"props":2456,"children":2457},{},[2458],{"type":52,"value":2459},"Not object owner",{"type":46,"tag":1715,"props":2461,"children":2462},{},[2463],{"type":46,"tag":95,"props":2464,"children":2466},{"className":2465},[],[2467],{"type":52,"value":2468},"assert!(object::owner(obj) == user, E_NOT_OWNER)",{"type":46,"tag":1715,"props":2470,"children":2471},{},[2472],{"type":52,"value":2473},"E_NOT_OWNER",{"type":46,"tag":55,"props":2475,"children":2477},{"id":2476},"references",[2478],{"type":52,"value":2479},"References",{"type":46,"tag":1604,"props":2481,"children":2482},{},[2483],{"type":46,"tag":77,"props":2484,"children":2485},{},[2486],{"type":52,"value":2487},"Detailed Patterns (references\u002F folder):",{"type":46,"tag":1630,"props":2489,"children":2490},{},[2491,2501,2511,2522,2533,2544,2555,2566,2577,2588,2599],{"type":46,"tag":73,"props":2492,"children":2493},{},[2494,2499],{"type":46,"tag":95,"props":2495,"children":2497},{"className":2496},[],[2498],{"type":52,"value":1627},{"type":52,"value":2500}," - ⭐ Storage type selection framework (ask when storage mentioned)",{"type":46,"tag":73,"props":2502,"children":2503},{},[2504,2509],{"type":46,"tag":95,"props":2505,"children":2507},{"className":2506},[],[2508],{"type":52,"value":1682},{"type":52,"value":2510}," - ⭐ Use-case patterns and smart defaults",{"type":46,"tag":73,"props":2512,"children":2513},{},[2514,2520],{"type":46,"tag":95,"props":2515,"children":2517},{"className":2516},[],[2518],{"type":52,"value":2519},"references\u002Fstorage-types.md",{"type":52,"value":2521}," - Detailed comparison of all 6 storage types",{"type":46,"tag":73,"props":2523,"children":2524},{},[2525,2531],{"type":46,"tag":95,"props":2526,"children":2528},{"className":2527},[],[2529],{"type":52,"value":2530},"references\u002Fstorage-gas-optimization.md",{"type":52,"value":2532}," - Gas optimization strategies for storage",{"type":46,"tag":73,"props":2534,"children":2535},{},[2536,2542],{"type":46,"tag":95,"props":2537,"children":2539},{"className":2538},[],[2540],{"type":52,"value":2541},"references\u002Fobject-patterns.md",{"type":52,"value":2543}," - Named objects, collections, nested objects",{"type":46,"tag":73,"props":2545,"children":2546},{},[2547,2553],{"type":46,"tag":95,"props":2548,"children":2550},{"className":2549},[],[2551],{"type":52,"value":2552},"references\u002Faccess-control.md",{"type":52,"value":2554}," - RBAC and permission systems",{"type":46,"tag":73,"props":2556,"children":2557},{},[2558,2564],{"type":46,"tag":95,"props":2559,"children":2561},{"className":2560},[],[2562],{"type":52,"value":2563},"references\u002Fsafe-arithmetic.md",{"type":52,"value":2565}," - Overflow\u002Funderflow prevention",{"type":46,"tag":73,"props":2567,"children":2568},{},[2569,2575],{"type":46,"tag":95,"props":2570,"children":2572},{"className":2571},[],[2573],{"type":52,"value":2574},"references\u002Finitialization.md",{"type":52,"value":2576}," - init_module patterns and registry creation",{"type":46,"tag":73,"props":2578,"children":2579},{},[2580,2586],{"type":46,"tag":95,"props":2581,"children":2583},{"className":2582},[],[2584],{"type":52,"value":2585},"references\u002Fevents.md",{"type":52,"value":2587}," - Event emission patterns",{"type":46,"tag":73,"props":2589,"children":2590},{},[2591,2597],{"type":46,"tag":95,"props":2592,"children":2594},{"className":2593},[],[2595],{"type":52,"value":2596},"references\u002Fv2-syntax.md",{"type":52,"value":2598}," - Modern Move V2 features (method calls, indexing, lambdas)",{"type":46,"tag":73,"props":2600,"children":2601},{},[2602,2608],{"type":46,"tag":95,"props":2603,"children":2605},{"className":2604},[],[2606],{"type":52,"value":2607},"references\u002Fcomplete-example.md",{"type":52,"value":2609}," - Full annotated NFT collection contract",{"type":46,"tag":1604,"props":2611,"children":2612},{},[2613],{"type":46,"tag":77,"props":2614,"children":2615},{},[2616],{"type":52,"value":2617},"Pattern Documentation (patterns\u002F folder):",{"type":46,"tag":1630,"props":2619,"children":2620},{},[2621,2631,2642,2653],{"type":46,"tag":73,"props":2622,"children":2623},{},[2624,2629],{"type":46,"tag":95,"props":2625,"children":2627},{"className":2626},[],[2628],{"type":52,"value":164},{"type":52,"value":2630}," - Digital Asset (NFT) standard - CRITICAL for NFTs",{"type":46,"tag":73,"props":2632,"children":2633},{},[2634,2640],{"type":46,"tag":95,"props":2635,"children":2637},{"className":2636},[],[2638],{"type":52,"value":2639},"..\u002F..\u002F..\u002Fpatterns\u002Fmove\u002FOBJECTS.md",{"type":52,"value":2641}," - Comprehensive object model guide",{"type":46,"tag":73,"props":2643,"children":2644},{},[2645,2651],{"type":46,"tag":95,"props":2646,"children":2648},{"className":2647},[],[2649],{"type":52,"value":2650},"..\u002F..\u002F..\u002Fpatterns\u002Fmove\u002FSECURITY.md",{"type":52,"value":2652}," - Security checklist and patterns",{"type":46,"tag":73,"props":2654,"children":2655},{},[2656,2662],{"type":46,"tag":95,"props":2657,"children":2659},{"className":2658},[],[2660],{"type":52,"value":2661},"..\u002F..\u002F..\u002Fpatterns\u002Fmove\u002FMOVE_V2_SYNTAX.md",{"type":52,"value":2663}," - Modern syntax examples",{"type":46,"tag":1604,"props":2665,"children":2666},{},[2667],{"type":46,"tag":77,"props":2668,"children":2669},{},[2670],{"type":52,"value":2671},"Official Documentation:",{"type":46,"tag":1630,"props":2673,"children":2674},{},[2675,2688,2699],{"type":46,"tag":73,"props":2676,"children":2677},{},[2678,2680],{"type":52,"value":2679},"Digital Asset Standard: ",{"type":46,"tag":2681,"props":2682,"children":2686},"a",{"href":2683,"rel":2684},"https:\u002F\u002Faptos.dev\u002Fbuild\u002Fsmart-contracts\u002Fdigital-asset",[2685],"nofollow",[2687],{"type":52,"value":2683},{"type":46,"tag":73,"props":2689,"children":2690},{},[2691,2693],{"type":52,"value":2692},"Object Model: ",{"type":46,"tag":2681,"props":2694,"children":2697},{"href":2695,"rel":2696},"https:\u002F\u002Faptos.dev\u002Fbuild\u002Fsmart-contracts\u002Fobject",[2685],[2698],{"type":52,"value":2695},{"type":46,"tag":73,"props":2700,"children":2701},{},[2702,2704],{"type":52,"value":2703},"Security Guidelines: ",{"type":46,"tag":2681,"props":2705,"children":2708},{"href":2706,"rel":2707},"https:\u002F\u002Faptos.dev\u002Fbuild\u002Fsmart-contracts\u002Fmove-security-guidelines",[2685],[2709],{"type":52,"value":2706},{"type":46,"tag":1604,"props":2711,"children":2712},{},[2713],{"type":46,"tag":77,"props":2714,"children":2715},{},[2716],{"type":52,"value":2717},"Related Skills:",{"type":46,"tag":1630,"props":2719,"children":2720},{},[2721,2732,2743],{"type":46,"tag":73,"props":2722,"children":2723},{},[2724,2730],{"type":46,"tag":95,"props":2725,"children":2727},{"className":2726},[],[2728],{"type":52,"value":2729},"search-aptos-examples",{"type":52,"value":2731}," - Find similar examples in aptos-core (optional)",{"type":46,"tag":73,"props":2733,"children":2734},{},[2735,2741],{"type":46,"tag":95,"props":2736,"children":2738},{"className":2737},[],[2739],{"type":52,"value":2740},"generate-tests",{"type":52,"value":2742}," - Write tests for contracts (use AFTER writing contracts)",{"type":46,"tag":73,"props":2744,"children":2745},{},[2746,2751],{"type":46,"tag":95,"props":2747,"children":2749},{"className":2748},[],[2750],{"type":52,"value":609},{"type":52,"value":2752}," - Audit contracts before deployment",{"type":46,"tag":2754,"props":2755,"children":2756},"style",{},[2757],{"type":52,"value":2758},"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":2760,"total":829},[2761,2773,2792,2806,2819,2833,2846,2858,2872,2887,2897,2907],{"slug":2762,"name":2762,"fn":2763,"description":2764,"org":2765,"tags":2766,"stars":20,"repoUrl":21,"updatedAt":2772},"analyze-gas-optimization","optimize Aptos Move contracts for gas","Analyze and optimize Aptos Move contracts for gas efficiency, identifying expensive operations and suggesting optimizations. Triggers on: 'optimize gas', 'reduce gas costs', 'gas analysis', 'make contract cheaper', 'gas efficiency', 'analyze gas usage', 'reduce transaction costs'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2767,2768,2771],{"name":14,"slug":15,"type":16},{"name":2769,"slug":2770,"type":16},"Performance","performance",{"name":18,"slug":19,"type":16},"2026-07-12T08:07:14.117466",{"slug":2774,"name":2774,"fn":2775,"description":2776,"org":2777,"tags":2778,"stars":20,"repoUrl":21,"updatedAt":2791},"create-aptos-project","scaffold new Aptos dApp projects","Scaffolds new Aptos projects using npx create-aptos-dapp. Supports fullstack (Vite or Next.js) and contract-only templates with network selection and optional API key. Triggers on: 'build app', 'create app', 'make app', 'new app', 'build dApp', 'create dApp', 'new dApp', 'build project', 'new project', 'create project', 'scaffold', 'start project', 'set up project', 'build me a', 'I want to build', 'make me a', 'help me build'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2779,2782,2785,2788],{"name":2780,"slug":2781,"type":16},"Next.js","next-js",{"name":2783,"slug":2784,"type":16},"TypeScript","typescript",{"name":2786,"slug":2787,"type":16},"Vite","vite",{"name":2789,"slug":2790,"type":16},"Web3","web3","2026-07-12T08:07:30.595111",{"slug":2793,"name":2793,"fn":2794,"description":2795,"org":2796,"tags":2797,"stars":20,"repoUrl":21,"updatedAt":2805},"deploy-contracts","deploy Move contracts to Aptos networks","Safely deploys Move contracts to Aptos networks (devnet, testnet, mainnet) with pre-deployment verification. Triggers on: 'deploy contract', 'publish to testnet', 'deploy to mainnet', 'how to deploy', 'publish module', 'deployment checklist', 'deploy to devnet'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2798,2801,2804],{"name":2799,"slug":2800,"type":16},"Deployment","deployment",{"name":2802,"slug":2803,"type":16},"Engineering","engineering",{"name":18,"slug":19,"type":16},"2026-07-12T08:07:16.798352",{"slug":2740,"name":2740,"fn":2807,"description":2808,"org":2809,"tags":2810,"stars":20,"repoUrl":21,"updatedAt":2818},"generate test suites for Move contracts","Creates comprehensive test suites for Move contracts with 100% coverage requirement. Triggers on: 'generate tests', 'create tests', 'write test suite', 'test this contract', 'how to test', 'add test coverage', 'write unit tests'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2811,2812,2815],{"name":2802,"slug":2803,"type":16},{"name":2813,"slug":2814,"type":16},"QA","qa",{"name":2816,"slug":2817,"type":16},"Testing","testing","2026-07-12T08:07:18.0205",{"slug":2820,"name":2820,"fn":2821,"description":2822,"org":2823,"tags":2824,"stars":20,"repoUrl":21,"updatedAt":2832},"modernize-move","modernize Move V1 contracts to V2","Detects and modernizes outdated Move V1 syntax, patterns, and APIs to Move V2+. Use when upgrading legacy contracts, migrating to modern syntax, or converting old patterns to current best practices. NOT for writing new contracts (use write-contracts) or fixing bugs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2825,2828,2829],{"name":2826,"slug":2827,"type":16},"Code Analysis","code-analysis",{"name":2802,"slug":2803,"type":16},{"name":2830,"slug":2831,"type":16},"Migration","migration","2026-07-12T08:07:10.226223",{"slug":2729,"name":2729,"fn":2834,"description":2835,"org":2836,"tags":2837,"stars":20,"repoUrl":21,"updatedAt":2845},"search Aptos reference implementations","Searches aptos-core and daily-move for reference implementations before writing contracts. Triggers on: 'search examples', 'find example', 'check aptos-core', 'is there an example', 'reference implementation', 'how does aptos implement', 'similar contract', 'daily-move'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2838,2839,2842],{"name":14,"slug":15,"type":16},{"name":2840,"slug":2841,"type":16},"Documentation","documentation",{"name":2843,"slug":2844,"type":16},"Search","search","2026-07-12T08:07:15.382039",{"slug":609,"name":609,"fn":2847,"description":2848,"org":2849,"tags":2850,"stars":20,"repoUrl":21,"updatedAt":2857},"audit Move smart contracts for security","Audits Move contracts for security vulnerabilities before deployment using 7-category checklist. Triggers on: 'audit contract', 'security check', 'review security', 'check for vulnerabilities', 'security audit', 'is this secure', 'find security issues'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2851,2854,2855,2856],{"name":2852,"slug":2853,"type":16},"Audit","audit",{"name":2826,"slug":2827,"type":16},{"name":272,"slug":269,"type":16},{"name":18,"slug":19,"type":16},"2026-07-12T08:07:11.680215",{"slug":2859,"name":2859,"fn":2860,"description":2861,"org":2862,"tags":2863,"stars":20,"repoUrl":21,"updatedAt":2871},"smoothsend-gasless","sponsor gas fees for Aptos dApps","How to sponsor gas fees for Aptos dApp users using SmoothSend. Paid commercial service: free on testnet, credit-based on mainnet. Covers 3-line wallet adapter integration (transactionSubmitter), Script Composer for fee-in-token stablecoin transfers. Triggers on: 'gasless', 'sponsor gas', 'users pay no APT', 'transactionSubmitter', 'SmoothSend', 'fee payer', 'pay gas for users', 'no gas required'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2864,2867,2870],{"name":2865,"slug":2866,"type":16},"API Development","api-development",{"name":2868,"slug":2869,"type":16},"Payments","payments",{"name":2789,"slug":2790,"type":16},"2026-07-12T08:07:31.843242",{"slug":2873,"name":2873,"fn":2874,"description":2875,"org":2876,"tags":2877,"stars":20,"repoUrl":21,"updatedAt":2886},"ts-sdk-account","manage Aptos accounts with TS SDK","How to create and use Account (signer) in @aptos-labs\u002Fts-sdk. Covers Account.generate(), fromPrivateKey(), fromDerivationPath(), Ed25519 vs SingleKey vs MultiKey vs Keyless, serialization (fromHex\u002FtoHex). Triggers on: 'Account.generate', 'Account.fromPrivateKey', 'Ed25519PrivateKey', 'SDK account', 'mnemonic', 'SingleKeyAccount', 'KeylessAccount'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2878,2881,2882,2885],{"name":2879,"slug":2880,"type":16},"Auth","auth",{"name":14,"slug":15,"type":16},{"name":2883,"slug":2884,"type":16},"SDK","sdk",{"name":2783,"slug":2784,"type":16},"2026-07-12T08:07:29.297415",{"slug":2888,"name":2888,"fn":2889,"description":2890,"org":2891,"tags":2892,"stars":20,"repoUrl":21,"updatedAt":2896},"ts-sdk-address","manage AccountAddress in Aptos TypeScript SDK","How to create and use AccountAddress in @aptos-labs\u002Fts-sdk. Covers address format (AIP-40), from\u002FfromString\u002FfromStrict, special addresses, LONG vs SHORT form, and derived addresses (object, resource, token, user-derived). Triggers on: 'AccountAddress', 'AccountAddress.from', 'AIP-40', 'derived address', 'createObjectAddress', 'createResourceAddress', 'createTokenAddress'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2893,2894,2895],{"name":14,"slug":15,"type":16},{"name":2883,"slug":2884,"type":16},{"name":2783,"slug":2784,"type":16},"2026-07-12T08:07:26.430378",{"slug":2898,"name":2898,"fn":2899,"description":2900,"org":2901,"tags":2902,"stars":20,"repoUrl":21,"updatedAt":2906},"ts-sdk-client","configure Aptos SDK clients","How to create and configure the Aptos client (Aptos, AptosConfig) in @aptos-labs\u002Fts-sdk. Covers Network, fullnode\u002Findexer\u002Ffaucet URLs, singleton pattern, and Bun compatibility. Triggers on: 'Aptos client', 'AptosConfig', 'SDK client', 'client setup', 'new Aptos(', 'Network.TESTNET', 'Network.MAINNET'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2903,2904,2905],{"name":2865,"slug":2866,"type":16},{"name":2883,"slug":2884,"type":16},{"name":2783,"slug":2784,"type":16},"2026-07-12T08:07:21.933342",{"slug":2908,"name":2908,"fn":2909,"description":2910,"org":2911,"tags":2912,"stars":20,"repoUrl":21,"updatedAt":2916},"ts-sdk-transactions","manage Aptos blockchain transactions","How to build, sign, submit, and simulate transactions in @aptos-labs\u002Fts-sdk. Covers build.simple(), signAndSubmitTransaction(), waitForTransaction(), simulate, sponsored (fee payer), and multi-agent. Triggers on: 'build.simple', 'signAndSubmitTransaction', 'transaction.build', 'waitForTransaction', 'signAsFeePayer', 'SDK transaction', 'sponsored transaction', 'multi-agent transaction'.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2913,2914,2915],{"name":2865,"slug":2866,"type":16},{"name":2783,"slug":2784,"type":16},{"name":2789,"slug":2790,"type":16},"2026-07-12T08:07:23.774257",{"items":2918,"total":771},[2919,2925,2932,2938,2944,2950,2956],{"slug":2762,"name":2762,"fn":2763,"description":2764,"org":2920,"tags":2921,"stars":20,"repoUrl":21,"updatedAt":2772},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2922,2923,2924],{"name":14,"slug":15,"type":16},{"name":2769,"slug":2770,"type":16},{"name":18,"slug":19,"type":16},{"slug":2774,"name":2774,"fn":2775,"description":2776,"org":2926,"tags":2927,"stars":20,"repoUrl":21,"updatedAt":2791},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2928,2929,2930,2931],{"name":2780,"slug":2781,"type":16},{"name":2783,"slug":2784,"type":16},{"name":2786,"slug":2787,"type":16},{"name":2789,"slug":2790,"type":16},{"slug":2793,"name":2793,"fn":2794,"description":2795,"org":2933,"tags":2934,"stars":20,"repoUrl":21,"updatedAt":2805},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2935,2936,2937],{"name":2799,"slug":2800,"type":16},{"name":2802,"slug":2803,"type":16},{"name":18,"slug":19,"type":16},{"slug":2740,"name":2740,"fn":2807,"description":2808,"org":2939,"tags":2940,"stars":20,"repoUrl":21,"updatedAt":2818},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2941,2942,2943],{"name":2802,"slug":2803,"type":16},{"name":2813,"slug":2814,"type":16},{"name":2816,"slug":2817,"type":16},{"slug":2820,"name":2820,"fn":2821,"description":2822,"org":2945,"tags":2946,"stars":20,"repoUrl":21,"updatedAt":2832},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2947,2948,2949],{"name":2826,"slug":2827,"type":16},{"name":2802,"slug":2803,"type":16},{"name":2830,"slug":2831,"type":16},{"slug":2729,"name":2729,"fn":2834,"description":2835,"org":2951,"tags":2952,"stars":20,"repoUrl":21,"updatedAt":2845},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2953,2954,2955],{"name":14,"slug":15,"type":16},{"name":2840,"slug":2841,"type":16},{"name":2843,"slug":2844,"type":16},{"slug":609,"name":609,"fn":2847,"description":2848,"org":2957,"tags":2958,"stars":20,"repoUrl":21,"updatedAt":2857},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[2959,2960,2961,2962],{"name":2852,"slug":2853,"type":16},{"name":2826,"slug":2827,"type":16},{"name":272,"slug":269,"type":16},{"name":18,"slug":19,"type":16}]