Adamant Move.
Move with privacy. Objects are typed resources with an explicit mutability declaration. Functions annotated #[shielded] run inside a Halo 2 circuit; their state transitions ship as zero-knowledge proofs alongside the transaction.
Minimal module.
module example::token {
use adamant::object::{Self, ObjectId};
use adamant::shielded;
/// A shielded token note.
#[mutability = IMMUTABLE]
struct Note has key, store {
id: ObjectId,
amount: u64,
owner_view_key_hint: vector<u8>,
}
/// Transfer a note shielded: prove correctness inside Halo 2.
#[shielded]
public fun transfer(note: Note, new_owner_hint: vector<u8>): Note {
Note { id: object::new(), amount: note.amount, owner_view_key_hint: new_owner_hint }
}
} Shielded functions compile to a Halo 2 circuit; the prover (local or via the prover market) generates the proof; the chain verifies. Outside the circuit, observers see only the input/output object commitments and the validity proof.
Declared at creation.
| Declaration | What it means |
|---|---|
| IMMUTABLE | Object cannot be changed after creation. Code cannot upgrade itself. |
| OWNER_UPGRADEABLE | Designated owner key may mutate / upgrade. |
| VOTE_UPGRADEABLE | Token-holder vote with declared threshold. |
| UPGRADEABLE_UNTIL_FROZEN | Mutable until explicitly frozen by the owner; immovable thereafter. |
| CUSTOM | Validation logic declared at creation, fixed. |
Mutability declarations are always cleartext, regardless of whether the object is shielded. Users must be able to determine mutability without trust (WP §2.5, §7.8.3).
Adamant Move is a narrow smart-contract platform. Every function pays gas; every shielded function carries a proof. There is no off-chain compute drain, no arbitrary state explosion. This is the trade-off for being a base layer that holds money.
— WP §6