Skip to main content

Other Primitives

The SDK includes several additional primitives beyond the core CAT and NFT types. This page provides brief overviews of these primitives.

Vault

Vaults provide multi-signature custody for Chia assets. They enable secure storage patterns where multiple parties or conditions must be satisfied to spend funds.

use chia_wallet_sdk::prelude::*;

// Vault structure
let vault = Vault {
coin,
launcher_id,
proof,
custody_hash, // Defines spending requirements
};

// Spend a vault with a MIPS (Multi-Input Puzzle Spend)
vault.spend(ctx, &mips_spend)?;

// Compute the child vault after a spend
let child_vault = vault.child(new_custody_hash, new_amount);

For vault internals and specification, see CHIP-0043 (MIPS).

Use cases:

  • Multi-signature wallets requiring M-of-N approval
  • Time-locked custody arrangements
  • Institutional custody solutions
  • Escrow patterns

For the complete API, see Vault in docs.rs.


DID (Decentralized Identifiers)

DIDs provide on-chain identity management following the singleton pattern. A DID maintains a persistent identity that can be associated with metadata and used for authentication.

use chia_wallet_sdk::prelude::*;

// DID structure
let did = Did {
coin,
info: DidInfo {
launcher_id,
recovery_list_hash,
num_verifications_required,
metadata,
inner_puzzle_hash,
},
proof,
};

Use cases:

  • Creator verification for NFTs
  • On-chain identity for applications
  • Recovery mechanisms with trusted parties

For the complete API, see Did in docs.rs.


Option Contracts

Options enable on-chain derivatives trading where one party has the right (but not obligation) to buy or sell an asset at a predetermined price.

use chia_wallet_sdk::prelude::*;

// Option contract structure
let option = OptionContract {
coin,
info: OptionInfo {
launcher_id,
underlying,
option_type, // Call or Put
strike_price,
expiry,
},
proof,
};

Use cases:

  • Hedging price risk
  • Speculation on asset prices
  • Structured financial products

For the complete API, see OptionContract in docs.rs.


ClawbackV2

ClawbackV2 enables recoverable payments where the sender can reclaim funds within a specified time window if needed.

use chia_wallet_sdk::prelude::*;

// Clawback allows sender to recover funds before timeout
let clawback = ClawbackV2 {
coin,
sender_puzzle_hash,
recipient_puzzle_hash,
clawback_timeout, // Blocks until recipient can claim
};

Use cases:

  • Reversible payments for dispute resolution
  • Escrow with sender recovery option
  • Safe transfers to new/unverified addresses

For the complete API, see ClawbackV2 in docs.rs.


StreamedAsset

StreamedAsset implements time-locked or vesting payments where funds are released gradually over time.

use chia_wallet_sdk::prelude::*;

// Streamed payments release funds over time
let streamed = StreamedAsset {
coin,
start_timestamp,
end_timestamp,
recipient_puzzle_hash,
// Funds unlock linearly between start and end
};

Use cases:

  • Employee vesting schedules
  • Subscription payments
  • Gradual fund release for projects

For the complete API, see StreamedAsset in docs.rs.


Bulletin

Bulletin provides on-chain data storage using the singleton pattern. It allows storing arbitrary data that can be updated over time.

use chia_wallet_sdk::prelude::*;

// Bulletin for on-chain data storage
// Uses BulletinLayer for puzzle construction

Use cases:

  • On-chain configuration storage
  • Decentralized content publishing
  • Data availability proofs

For the complete API, see BulletinLayer in docs.rs.


Singleton

The Singleton primitive is the foundation for NFTs, DIDs, Vaults, and other unique assets. It ensures only one instance of an asset exists at any time.

use chia_wallet_sdk::prelude::*;

// Generic singleton structure
let singleton = Singleton {
coin,
info: SingletonInfo {
launcher_id, // Permanent unique identifier
inner_puzzle_hash,
},
proof,
};

Key properties:

  • Unique identity via launcher_id
  • Lineage proofs ensure authenticity
  • State persists across spends

For the complete API, see Singleton in docs.rs.


Launcher

Launchers are used to create new singletons (NFTs, DIDs, etc.). The launcher coin's ID becomes the permanent identifier for the singleton.

use chia_wallet_sdk::prelude::*;

// Create a launcher for minting singletons
let launcher = Launcher::new(parent_coin_id, amount);
let launcher_id = launcher.coin().coin_id();

// The launcher_id becomes the permanent identifier
// for the resulting NFT, DID, or other singleton

For the complete API, see Launcher in docs.rs.


Feature-Gated Primitives

Some primitives require feature flags to enable:

DataStore (chip-0035)

Data layer support for off-chain data with on-chain proofs:

chia-wallet-sdk = { version = "0.32", features = ["chip-0035"] }

Action Layer (action-layer)

High-level transaction builder for complex multi-asset operations:

chia-wallet-sdk = { version = "0.32", features = ["action-layer"] }

API Reference

For complete documentation on all primitives, see the chia-sdk-driver rustdocs.