public/SKILLS/Web3 & Blockchain/object-model/SKILL.md
Expert on Aptos Object Model for composable, transferable assets. Covers ObjectCore, Object<T> wrapper, ConstructorRef, ExtendRef, DeleteRef, TransferRef capabilities, object ownership, named vs generated objects, and composability patterns.
npx skillsauth add eric861129/skills_all-in-one aptos-object-modelInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Expert on the Aptos Object Model for building composable, transferable on-chain assets.
The Object Model enables:
Every object has an ObjectCore:
struct ObjectCore has key {
owner: address,
allow_ungated_transfer: bool,
}
struct Object<phantom T> has copy, drop, store {
inner: address // Pointer to object
}
let constructor_ref = object::create_named_object(creator, b"SEED");
// Address = hash(creator_address, seed)
let constructor_ref = object::create_object(creator);
// Non-deterministic address
let constructor_ref = object::create_sticky_object(creator);
let constructor_ref = object::create_object(creator);
// Generate all other refs during creation
let extend_ref = object::generate_extend_ref(&constructor_ref);
let transfer_ref = object::generate_transfer_ref(&constructor_ref);
let delete_ref = object::generate_delete_ref(&constructor_ref);
let object_signer = object::generate_signer(&constructor_ref);
// Store refs at object address
move_to(&object_signer, Refs { extend_ref, transfer_ref, delete_ref });
// Get signer after creation
let object_signer = object::generate_signer_for_extending(&refs.extend_ref);
// Disable transfers (soul-bound)
object::disable_ungated_transfer(&refs.transfer_ref);
// Enable transfers
object::enable_ungated_transfer(&refs.transfer_ref);
// Force transfer
object::transfer_with_ref(&refs.transfer_ref, new_owner);
// Remove all resources first, then delete
let MyResource { value: _ } = move_from<MyResource>(object_addr);
object::delete(delete_ref);
// Get object info
let object_addr = object::object_address(&obj);
let owner = object::owner(obj);
let transferable = object::ungated_transfer_allowed(obj);
// User transfer (if allowed)
object::transfer(owner, obj, new_owner);
public fun create_sbt(creator: &signer, recipient: address) {
let constructor_ref = token::create_named_token(...);
let transfer_ref = object::generate_transfer_ref(&constructor_ref);
object::disable_ungated_transfer(&transfer_ref);
// One-time transfer to recipient
let linear_ref = object::generate_linear_transfer_ref(&transfer_ref);
object::transfer_with_ref(linear_ref, recipient);
// Don't store transfer_ref - permanently non-transferable
}
// Create parent
let parent_ref = token::create_named_token(...);
let parent_addr = object::address_from_constructor_ref(&parent_ref);
// Create child owned by parent
let child_ref = token::create_named_token(...);
let transfer_ref = object::generate_transfer_ref(&child_ref);
let linear_ref = object::generate_linear_transfer_ref(&transfer_ref);
object::transfer_with_ref(linear_ref, parent_addr);
public fun get_or_create_registry(creator: &signer): address {
let seed = b"REGISTRY";
let addr = object::create_object_address(&signer::address_of(creator), seed);
if (!object::object_exists<Registry>(addr)) {
let ref = object::create_named_object(creator, seed);
let signer = object::generate_signer(&ref);
move_to(&signer, Registry { items: simple_map::create() });
};
addr
}
struct DataRefs has key { extend_ref: ExtendRef }
public fun upgrade_config(new_config: Config) acquires DataRefs {
let refs = borrow_global<DataRefs>(data_addr);
let signer = object::generate_signer_for_extending(&refs.extend_ref);
// Modify resources at data_addr
}
assert!(object::object_exists<T>(addr), ERROR);
// Use TransferRef for forced transfer
object::transfer_with_ref(&refs.transfer_ref, recipient);
// Check existence before creating named object
if (!object::object_exists<ObjectCore>(addr)) {
object::create_named_object(creator, seed);
}
development
Run structured What-If scenario analysis with multi-branch possibility exploration. Use this skill when the user asks speculative questions like "what if...", "what would happen if...", "what are the possibilities", "explore scenarios", "scenario analysis", "possibility space", "what could go wrong", "best case / worst case", "risk analysis", "contingency planning", "strategic options", or any question about uncertain futures. Also trigger when the user faces a fork-in-the-road decision, wants to stress-test an idea, or needs to think through consequences before committing.
development
Access comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
development
Use when challenging ideas, plans, decisions, or proposals using structured critical reasoning. Invoke to play devil's advocate, run a pre-mortem, red team, or audit evidence and assumptions.
tools
Core skill for the deep research and writing tool. Write scientific manuscripts in full paragraphs (never bullet points). Use two-stage process with (1) section outlines with key points using research-lookup then (2) convert to flowing prose. IMRAD structure, citations (APA/AMA/Vancouver), figures/tables, reporting guidelines (CONSORT/STROBE/PRISMA), for research papers and journal submissions.