Lineagei
Frameworki
What's Anchor?
Batteries-included Rust framework. Ships account-validation codegen, 8-byte instruction discriminators, and an on-chain IDL — the program describes itself.
Bigger binary and higher rent in exchange for safety rails, introspection, and dev speed. The choice of a team optimizing for correctness over on-chain footprint.
Originally Coral (Armani Ferrante); now community-maintained.
What it is
The de facto standard. Rust macros (#[program], #[derive(Accounts)]) eliminate boilerplate: it auto-generates 8-byte account and instruction discriminators — SHA256("account:<Name>")[..8] and SHA256("global:<ix>")[..8] — handles Borsh (de)serialization, enforces account constraints declaratively (mut, has_one, seeds, init), and emits a JSON IDL that client libraries consume directly. The cost: Borsh copies data on every deserialize (not zero-copy), and the macro machinery adds binary bloat and compute overhead — irrelevant for ~99% of programs.
When to pick it
Building a new protocol, moving fast, or wanting maximum ecosystem compatibility. It's the beginner default and stays the right call for most production programs.
How it looks on-chain
The most recognizable framework. Every account it owns begins with an 8-byte discriminator, and the IDL is often published on-chain at a PDA derived from the program id. Both are strong, reliable fingerprints — this is the only framework we can label with confidence.
Others in the wild: Steel (Ore team — near-native performance on solana-program), Seahorse (Python → Anchor), and Poseidon & Quasar (TypeScript → Rust). Transpilers inherit their lowering target's fingerprint: a Quasar or Poseidon program that compiles down to Anchor will look like Anchor on-chain — discriminators and all.
Anchor docsFootprinti
Recovered architecturei
Reachi
Controli
What's upgrade authority?
The upgrade authority is the account allowed to replace a program's code after it's deployed.
If it's set (mutable), that key can push new bytecode at any time — including malicious code, the classic "rug" vector. If it's null (immutable / frozen), the code can never change; what 's on-chain is final. A Squads multisig sits in between — upgrades are possible but need M-of-N signers, not one hot wallet. So mutable + single hot-wallet = highest risk; immutable or multisig = stronger guarantees.
What's a verified build?
A verified build proves the program running on-chain was compiled from the public source you can read — nothing hidden.
Someone re-compiles the source in a deterministic (Docker) environment and checks the resulting bytecode is byte-for-byte identical to what's deployed; tools like solana-verify do this and record it with a verification service. "Not verified" isn't a red flag by itself — most programs simply never submit one. It just means you're trusting the deployed bytecode as-is, with no source cross-check.
Convictioni
Interface — the on-chain IDLi
5 of 30 instructions used · 25 never called in this window
Asteri V4 marketplace for CTA cNFTs — USDC payments, on-chain bids, fee buyback to CTA
Instructions 30
accept_bid
- sellersignerwritable
- bidderwritable
- bid_statewritable
- bid_vaultwritable
- seller_usdcwritable
- fee_vaultwritable
- usdc_mint
- token_program
- tree_authoritywritable
- merkle_treewritable
- core_collection
- log_wrapper
- compression_program
- bubblegum_program
- program_config
- system_program
- argsAcceptBidArgs
accept_bid_listed
Variante de `accept_bid` quand le NFT est listé (leaf délégué à notre list_state PDA). Close atomiquement le listing avant le transfer pour éviter le double tx delist + accept_bid.
- sellersignerwritable
- bidderwritable
- bid_statewritable
- bid_vaultwritable
- list_statewritable
- seller_usdcwritable
- fee_vaultwritable
- usdc_mint
- token_program
- tree_authoritywritable
- merkle_treewritable
- core_collection
- log_wrapper
- compression_program
- bubblegum_program
- program_config
- system_program
- argsAcceptBidArgs
accept_collection_bid
- sellersignerwritable
- bidder
- coll_bidwritable
- coll_bid_vaultwritable
- seller_usdcwritable
- fee_vaultwritable
- usdc_mint
- token_program
- tree_authoritywritable
- merkle_treewritable
- core_collection
- log_wrapper
- compression_program
- bubblegum_program
- program_config
- system_program
- argsAcceptCollectionBidArgs
accept_counter
- biddersignerwritable
- bid_statewritable
- bid_vaultwritable
- bidder_usdcwritable
- usdc_mint
- token_program
- program_config
accept_trait_bid
- sellersignerwritable
- bidder
- trait_bidwritable
- trait_bid_vaultwritable
- seller_usdcwritable
- fee_vaultwritable
- usdc_mint
- token_program
- tree_authoritywritable
- merkle_treewritable
- core_collection
- log_wrapper
- compression_program
- bubblegum_program
- program_config
- system_program
- argsAcceptTraitBidArgs
admin_cancel_bid
- adminsignerwritable
- bidderwritable
- bid_statewritable
- bid_vaultwritable
- bidder_usdcwritable
- usdc_mint
- token_program
admin_cancel_collection_bid
- adminsignerwritable
- bidderwritable
- coll_bidwritable
- coll_bid_vaultwritable
- bidder_usdcwritable
- usdc_mint
- token_program
admin_cancel_trait_bid
- adminsignerwritable
- bidderwritable
- trait_bidwritable
- trait_bid_vaultwritable
- bidder_usdcwritable
- usdc_mint
- token_program
admin_delist
- adminsignerwritable
- ownerwritable
- list_statewritable
- system_program
buy
- buyersignerwritable
- sellerwritable
- list_statewritable
- owner
- buyer_usdcwritable
- seller_usdcwritable
- fee_vaultwritable
- usdc_mint
- token_program
- associated_token_program
- tree_authoritywritable
- merkle_treewritable
- core_collection
- log_wrapper
- compression_program
- bubblegum_program
- program_config
- system_program
- argsBuyArgs
buy_bundle
- buyersignerwritable
- sellerwritable
- bundlewritable
- buyer_usdcwritable
- seller_usdcwritable
- fee_vaultwritable
- usdc_mint
- token_program
- tree_authoritywritable
- merkle_treewritable
- core_collection
- log_wrapper
- compression_program
- bubblegum_program
- program_config
- system_program
- argsBuyBundleArgs
cancel_bid
- biddersignerwritable
- bid_statewritable
- bid_vaultwritable
- bidder_usdcwritable
- usdc_mint
- token_program
cancel_collection_bid
- biddersignerwritable
- coll_bidwritable
- coll_bid_vaultwritable
- bidder_usdcwritable
- usdc_mint
- token_program
cancel_trait_bid
- biddersignerwritable
- trait_bidwritable
- trait_bid_vaultwritable
- bidder_usdcwritable
- usdc_mint
- token_program
close_expired_listing
- callersignerwritable
- sellerwritable
- list_statewritable
- system_program
counter_offer
- sellersigner
- bidder
- bid_statewritable
- list_state
- program_config
- argsCounterOfferArgs
delist
- ownersignerwritable
- list_statewritable
- tree_authoritywritable
- merkle_treewritable
- log_wrapper
- compression_program
- bubblegum_program
- system_program
- argsDelistArgs
delist_bundle
- ownersignerwritable
- bundlewritable
- tree_authoritywritable
- merkle_treewritable
- log_wrapper
- compression_program
- bubblegum_program
- system_program
- argsDelistBundleArgs
edit
- ownersigner
- list_statewritable
- program_config
- argsEditArgs
initialize
- adminsignerwritable
- fee_vault_auth
- fee_vaultwritable
- burn_trackerwritable
- usdc_mint
- token_program
- associated_token_program
- system_program
- rent
list
- sellersignerwritable
- list_statewritable
- asset_id
- tree_authoritywritable
- merkle_treewritable
- log_wrapper
- compression_program
- bubblegum_program
- program_config
- system_program
- argsListArgs
list_bundle
- ownersignerwritable
- bundlewritable
- tree_authoritywritable
- merkle_treewritable
- log_wrapper
- compression_program
- bubblegum_program
- program_config
- system_program
- argsListBundleArgs
make_bid
- biddersignerwritable
- bid_statewritable
- bid_vaultwritable
- bidder_usdcwritable
- usdc_mint
- token_program
- program_config
- system_program
- rent
- argsMakeBidArgs
make_collection_bid
- biddersignerwritable
- coll_bidwritable
- coll_bid_vaultwritable
- bidder_usdcwritable
- usdc_mint
- token_program
- program_config
- system_program
- rent
- argsMakeCollectionBidArgs
make_trait_bid
- biddersignerwritable
- collection
- trait_bidwritable
- trait_bid_vaultwritable
- bidder_usdcwritable
- usdc_mint
- token_program
- program_config
- system_program
- rent
- argsMakeTraitBidArgs
record_burn_cycle
- adminsignerwritable
- burn_trackerwritable
- argsRecordBurnCycleArgs
release_delegate
LOW-04 V1 fix : seller récupère le contrôle d'un cNFT dont le delegate est resté stale après close_expired_listing.
- ownersignerwritable
- tree_authoritywritable
- merkle_treewritable
- log_wrapper
- compression_program
- bubblegum_program
- stale_delegate
- system_program
- argsReleaseDelegateArgs
set_pause
INFO-02 V1 fix : freeze toutes les ix d'écriture sans redeployer.
- adminsigner
- burn_trackerwritable
- pausedbool
update_trait_snapshot
- adminsignerwritable
- snapshotwritable
- system_program
- rent
- argsUpdateTraitSnapshotArgs
withdraw_fees
- adminsignerwritable
- fee_vault_auth
- fee_vaultwritable
- destinationwritable
- usdc_mint
- token_program
- argsWithdrawFeesArgs
Accounts 7
BidState
no fields
BundleState
no fields
BurnTrackerState
no fields
CollectionBidState
no fields
ListState
no fields
TraitBidState
no fields
TraitMerkleSnapshot
no fields
Types 51
AcceptBidArgsstruct
- root[u8; 32]
- data_hash[u8; 32]
- creator_hash[u8; 32]
- collection_hashOption<[u8; 32]>
- asset_data_hashOption<[u8; 32]>
- flagsOption<u8>
- nonceu64
- indexu32
- min_amountu64
AcceptCollectionBidArgsstruct
- asset_idpubkey
- root[u8; 32]
- data_hash[u8; 32]
- creator_hash[u8; 32]
- collection_hashOption<[u8; 32]>
- asset_data_hashOption<[u8; 32]>
- flagsOption<u8>
- nonceu64
- indexu32
AcceptTraitBidArgsstruct
- asset_idpubkey
- merkle_proofsVec<Vec<[u8; 32]>>1 à MAX_AXES proofs, dans le même ordre que `trait_bid.filter_hashes`. Chaque proof[i] doit prouver que asset_id ∈ snapshot[i].
- root[u8; 32]
- data_hash[u8; 32]
- creator_hash[u8; 32]
- collection_hashOption<[u8; 32]>
- asset_data_hashOption<[u8; 32]>
- flagsOption<u8>
- nonceu64
- indexu32
BidAcceptedstruct
- asset_idpubkey
- bidderpubkey
- sellerpubkey
- amountu64
- feeu64
BidCancelledstruct
- asset_idpubkey
- bidderpubkey
- refundedu64
BidPlacedstruct
- asset_idpubkey
- bidderpubkey
- amountu64
- expiryi64
BidStatestruct
- versionu8
- bump[u8; 1]
- bidderpubkey
- asset_idpubkey
- amountu64
- currencypubkey
- expiryi64
- created_ati64
- counter_amountu64
- counter_byOption<pubkey>
- reserved[u8; 32]
BundleDelistedstruct
- bundlepubkey
- ownerpubkey
BundleListedstruct
- bundlepubkey
- ownerpubkey
- total_amountu64
- asset_countu8
BundleSoldstruct
- bundlepubkey
- buyerpubkey
- sellerpubkey
- total_amountu64
- feeu64
BundleStatestruct
- versionu8
- bump[u8; 1]
- ownerpubkey
- asset_countu8
- asset_ids[pubkey; 5]
- total_amountu64
- currencypubkey
- expiryi64
- nonceu64
- created_ati64
- reserved[u8; 32]
BurnCycleRecordedstruct
- cycle_countu32
- usdc_amountu64
- cta_burnedu64
- cta_to_teamu64
- cta_to_asteriu64
- eth_tx_hash[u8; 32]
BurnTrackerStatestruct
- versionu8
- bump[u8; 1]
- authoritypubkey
- total_usdc_withdrawnu64
- total_cta_burnedu64
- total_cta_to_teamu64
- total_cta_to_asteriu64
- last_cycle_ati64
- last_cycle_tx_eth[u8; 32]
- cycle_countu32
- program_pausedboolINFO-02 fix : circuit breaker. Admin peut freeze toutes les opérations d'écriture (list/buy/bids) sans redeployer. Les opérations de recovery (cancel_*, delist, withdraw_fees) restent disponibles.
- reserved[u8; 63]
BuyArgsstruct
- root[u8; 32]
- data_hash[u8; 32]
- creator_hash[u8; 32]
- collection_hashOption<[u8; 32]>
- asset_data_hashOption<[u8; 32]>
- flagsOption<u8>
- nonceu64
- indexu32
- max_amountu64Anti-frontrun : on refuse si le prix actuel > max_amount.
BuyBundleArgsstruct
- max_totalu64
- leaf_metasVec<LeafMeta>
- proof_lengthsbytes
- root[u8; 32]
- collection_hashOption<[u8; 32]>
CollectionBidCancelledstruct
- coll_bidpubkey
- bidderpubkey
- refundedu64
CollectionBidFilledstruct
- coll_bidpubkey
- asset_idpubkey
- sellerpubkey
- amountu64
- feeu64
CollectionBidPlacedstruct
- coll_bidpubkey
- bidderpubkey
- collectionpubkey
- amountu64
- max_purchasesu32
CollectionBidStatestruct
- versionu8
- bump[u8; 1]
- bidderpubkey
- collectionpubkey
- amountu64
- max_purchasesu32
- purchases_doneu32
- currencypubkey
- expiryi64
- nonceu64
- created_ati64
- reserved[u8; 32]
CounterAcceptedstruct
- asset_idpubkey
- bidderpubkey
- new_amountu64
CounterOfferArgsstruct
- counter_amountu64
CounterOfferedstruct
- asset_idpubkey
- sellerpubkey
- counter_amountu64
DelegateReleasedstruct
- asset_idpubkey
- ownerpubkey
- stale_delegatepubkey
DelistArgsstruct
- root[u8; 32]
- data_hash[u8; 32]
- creator_hash[u8; 32]
- collection_hashOption<[u8; 32]>
- asset_data_hashOption<[u8; 32]>
- flagsOption<u8>
- nonceu64
- indexu32
DelistBundleArgsstruct
- leaf_metasVec<LeafMeta>
- proof_lengthsbytes
- root[u8; 32]
- collection_hashOption<[u8; 32]>
Delistedstruct
- asset_idpubkey
- ownerpubkey
EditArgsstruct
- amountu64
- expire_in_secOption<i64>
- private_takerOption<pubkey>
Editedstruct
- asset_idpubkey
- new_amountu64
- new_expiryi64
- new_private_takerOption<pubkey>
ExpiredClosedstruct
- asset_idpubkey
- closed_bypubkey
- incentive_paidu64
FeesWithdrawnstruct
- amountu64
- destinationpubkey
- by_adminpubkey
Initializedstruct
- adminpubkey
- fee_vaultpubkey
- burn_trackerpubkey
LeafMetastruct
- data_hash[u8; 32]
- creator_hash[u8; 32]
- asset_data_hashOption<[u8; 32]>
- flagsOption<u8>
- nonceu64
- indexu32
ListArgsstruct
- root[u8; 32]
- data_hash[u8; 32]
- creator_hash[u8; 32]
- collection_hashOption<[u8; 32]>
- asset_data_hashOption<[u8; 32]>
- flagsOption<u8>
- nonceu64
- indexu32
- amountu64
- currencypubkeyV1 : doit être USDC_MINT, le handler refuse sinon.
- expire_in_secOption<i64>None = pas d'expiry. Sinon en secondes depuis maintenant.
- private_takerOption<pubkey>
ListBundleArgsstruct
- asset_idsVec<pubkey>
- leaf_metasVec<LeafMeta>
- proof_lengthsbytes
- root[u8; 32]
- collection_hashOption<[u8; 32]>
- total_amountu64
- currencypubkey
- expire_in_secOption<i64>
- nonceu64
ListStatestruct
- versionu8
- bump[u8; 1]
- ownerpubkey
- asset_idpubkey
- amountu64
- currencypubkey
- expiryi64
- private_takerOption<pubkey>
- created_ati64
- reserved[u8; 32]
Listedstruct
- asset_idpubkey
- ownerpubkey
- amountu64
- currencypubkey
- expiryi64
- private_takerOption<pubkey>
MakeBidArgsstruct
- asset_idpubkey
- amountu64
- currencypubkey
- expire_in_seci64
MakeCollectionBidArgsstruct
- collectionpubkey
- amountu64
- max_purchasesu32
- expire_in_seci64
- nonceu64
MakeTraitBidArgsstruct
- filter_hashesVec<[u8; 32]>1 à MAX_AXES (3) filter_hashes, un par axe. L'ordre est conservé dans TraitBidState et doit matcher `remaining_accounts`.
- amountu64
- max_purchasesu32
- expire_in_seci64
- nonceu64
- expected_rootsVec<[u8; 32]>HIGH-04 : roots attendus au moment du bid, dans le même ordre que `filter_hashes`. Empêche le bidder de bid sur une snapshot updateée juste avant l'inclusion de sa tx (race).
PauseToggledstruct
- adminpubkey
- previous_statebool
- new_statebool
RecordBurnCycleArgsstruct
- usdc_amountu64
- cta_burnedu64
- cta_to_teamu64
- cta_to_asteriu64
- eth_tx_hash[u8; 32]
ReleaseDelegateArgsstruct
- asset_idpubkey
- stale_delegatepubkey
- root[u8; 32]
- data_hash[u8; 32]
- creator_hash[u8; 32]
- collection_hashOption<[u8; 32]>
- asset_data_hashOption<[u8; 32]>
- flagsOption<u8>
- nonceu64
- indexu32
Soldstruct
- asset_idpubkey
- buyerpubkey
- sellerpubkey
- amountu64
- feeu64
TraitBidCancelledstruct
- trait_bidpubkey
- bidderpubkey
- refundedu64
TraitBidFilledstruct
- trait_bidpubkey
- asset_idpubkey
- sellerpubkey
- amountu64
- feeu64
TraitBidPlacedstruct
- trait_bidpubkey
- bidderpubkey
- trait_filter_hash[u8; 32]
- amountu64
TraitBidStatestruct
- versionu8
- bump[u8; 1]
- bidderpubkey
- collectionpubkey
- amountu64
- max_purchasesu32
- purchases_doneu32
- currencypubkey
- expiryi64
- nonceu64
- created_ati64
- axes_countu8Nombre d'axes actifs (1 à MAX_AXES). Seuls les `axes_count` premiers éléments des arrays ci-dessous sont valides.
- filter_hashes[[u8; 32]; 3]trait_filter_hash de chaque axe.
- snapshots[pubkey; 3]PDA TraitMerkleSnapshot correspondant à chaque axe.
- expected_roots[[u8; 32]; 3]HIGH-03 : root capturé à `make_trait_bid` pour chaque axe, empêche l'admin rugpull (modifier la root entre make et accept).
- reserved[u8; 32]
TraitMerkleSnapshotstruct
- versionu8
- bump[u8; 1]
- authoritypubkey
- collectionpubkey
- trait_filter_hash[u8; 32]
- merkle_root[u8; 32]
- leaf_countu32
- valid_untili64
- created_ati64
- reserved[u8; 32]
TraitSnapshotUpdatedstruct
- collectionpubkey
- trait_filter_hash[u8; 32]
- merkle_root[u8; 32]
- leaf_countu32
UpdateTraitSnapshotArgsstruct
- collectionpubkey
- trait_filter_hash[u8; 32]
- merkle_root[u8; 32]
- leaf_countu32
- valid_for_seci64
WithdrawFeesArgsstruct
- amountu640 = withdraw tout le solde
Events 25
BidAccepted
no fields
BidCancelled
no fields
BidPlaced
no fields
BundleDelisted
no fields
BundleListed
no fields
BundleSold
no fields
BurnCycleRecorded
no fields
CollectionBidCancelled
no fields
CollectionBidFilled
no fields
CollectionBidPlaced
no fields
CounterAccepted
no fields
CounterOffered
no fields
DelegateReleased
no fields
Delisted
no fields
Edited
no fields
ExpiredClosed
no fields
FeesWithdrawn
no fields
Initialized
no fields
Listed
no fields
PauseToggled
no fields
Sold
no fields
TraitBidCancelled
no fields
TraitBidFilled
no fields
TraitBidPlaced
no fields
TraitSnapshotUpdated
no fields
Errors 26
- 6000InvalidPriceInvalid price (must be > MIN_PRICE_LAMPORTS)
- 6001InvalidExpiryInvalid expiry
- 6002ListingExpiredListing has expired
- 6003ListingNotExpiredListing not yet expired
- 6004BidExpiredBid has expired
- 6005PriceMismatchPrice mismatch (frontrun protection)
- 6006BidAmountTooLowBid amount too low (anti-frontrun guard)
- 6007PrivateListingMismatchPrivate listing — buyer not authorized
- 6008NotLeafOwnerCaller is not the leaf owner
- 6009NotBidOwnerCaller is not the bid owner
- 6010NotListingOwnerCaller is not the listing owner
- 6011CollectionMismatchAsset does not match collection
- 6012InvalidTraitSnapshotTrait snapshot expired or missing
- 6013InvalidTraitProofTrait Merkle proof invalid
- 6014BundleTooLargeBundle size exceeds maximum
- 6015BundleAlreadyConsumedBundle already consumed
- 6016NoCounterPendingCounter offer state mismatch
- 6017InsufficientEscrowInsufficient funds in escrow vault
- 6018UnauthorizedAdminUnauthorized admin operation
- 6019FeeOverflowFee split arithmetic overflow
- 6020UnsupportedCurrencyOnly USDC currency is supported in V1
- 6021WithdrawTooLargeWithdraw amount exceeds vault balance
- 6022InvariantViolationAnchor invariant violated (rent / system / bumps)
- 6023AssetIdMismatchAsset substitution detected (leaf args don't derive to expected asset_id)
- 6024InvalidBubblegumProgramBubblegum program ID mismatch (anti-spoofing)
- 6025ProgramPausedProgram is paused — only recovery operations (cancel/delist/withdraw) are available
What's an IDL?
An IDL — Interface Description Language — is a JSON spec that describes how to talk to a program: its instructions, the accounts each one needs, argument and account types, events, and errors.
Anchor auto-generates it at build time. A program can publish it on-chain at a PDA derived from its id, so any client or explorer can decode the program's transactions without its source code.
Why it's often missing
Publishing is opt-in — a courtesy, not a requirement. Many programs never do, and non-Anchor frameworks (Pinocchio, native, Steel) don't produce one at all; their interface lives in an off-chain Shank/Codama artifact, or nowhere public. Absence means you can't auto-decode it — not that anything is wrong.
5 of 30 instructions used · 25 never called in this window · +2 more
Tractioni
The recordi
| Event | When | Detail | Receipt |
|---|---|---|---|
| DEPLOY | 4d ago | slot 431,709,624 | back…9624 |