skills/aptos/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 raintree-technology/claude-starter 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
Whop platform expert for digital products, memberships, and community monetization. Covers memberships API, payments, courses, forums, webhooks, OAuth apps, and checkout integration. Build SaaS, course platforms, and gated communities. Triggers on Whop, memberships, digital products, course platform, community monetization, Whop API, license keys.
development
Token-Oriented Object Notation (TOON) format expert for 30-60% token savings on structured data. Auto-applies to arrays with 5+ items, tables, logs, API responses, database results. Supports tabular, inline, and expanded formats with comma/tab/pipe delimiters. Triggers on large JSON, data optimization, token reduction, structured data, arrays, tables, logs, metrics, TOON.
development
Plaid banking API expert for financial data integration. Covers Plaid Link, Auth (account/routing numbers), Transactions, Identity verification, Balance checking, and webhooks. Build fintech apps with bank connections, ACH transfers, and transaction history. Triggers on Plaid, banking API, Plaid Link, bank connection, ACH, financial data, transaction history.
development
Helius Solana RPC and API expert. High-performance infrastructure for Solana including RPC nodes, DAS API for NFTs/tokens, LaserStream real-time streaming, webhooks, Priority Fee API, Enhanced Transactions, and ZK Compression. Triggers on Helius, Solana RPC, DAS API, Digital Asset Standard, NFT metadata, Solana webhooks, priority fees, LaserStream, ZK compression.