Trust Stack Docs
Developers

Smart contracts

Map each Move module to its assets, objects, authorities, and events.

The core package is supra_trust_stack. Its framework dependency is pinned to commit 3fecf50d0701f38064faa83c980aabe5c63309fe; local tests use the reviewed Supra CLI container digest recorded in move/trust-stack/README.md.

Module map

ModuleAsset modelPersistent statePrimary authority
foundationNoneVersion marker onlyNone
token_factoryFungible AssetController at metadata objectCreator mint; holder self-burn when enabled
fixed_lockFungible AssetOne position and store objectBeneficiary after unlock
vestingFungible AssetOne schedule and store objectBeneficiary over schedule
batch_distributionFungible AssetEvents onlySender in one atomic transaction
merkle_airdropFungible AssetCampaign, claim set, store objectLeaf recipient; creator-only remainder destination
digital_asset_factory0x4 Digital AssetStandard collection and token objectsFirst owner after mint
digital_asset_lock0x4 Digital AssetLock object owning one tokenBeneficiary after unlock
payment_streamFungible AssetStream and store objectRecipient claims; creator cancel only if selected
staking_poolFungible AssetPool vaults and position objectsStaker; bounded creator reward recovery

The Dexlyn V1 dexlyn_lp_lock module is a separate package because it stores a legacy generic Coin<LP<X,Y,Curve>> and depends on an external protocol's type identity.

Design conventions

  • Creation and funding happen atomically.
  • Every custody position owns an untransferable object or vault.
  • Assets are bound by metadata or object identity, never by display symbol.
  • Chain time enforces schedules.
  • State is updated in a transfer-safe order and replay is rejected.
  • Terminal actions verify exact vault conservation.
  • Events are emitted only after successful state transitions.
  • Public views expose enough immutable terms and lifecycle state for the dApp to re-verify.

Package policy

Source presence does not imply deployment. The checked-in deployment manifest is authoritative for package address, chain ID, source commit, bytecode hashes, transaction evidence, and acceptance lifecycles. New modules require a fresh testnet publication or compatible upgrade record before their UI action can be described as live.

For value-bearing releases, prefer immutable packages deployed side by side. Existing positions continue under their original package and policy; migration should be a beneficiary-authorized withdrawal and new deposit, not an invisible global logic change.

On this page