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
Packs Mining Protocol
Instructions 22
admin_ban
Admin bans a wallet, closes their miner account, prevents future mining
- adminsignerwritable
- config
- authority
- minerwritable
- ban_recordwritable
- system_program
admin_burn_treasury
Admin-only: burn PACKS from the treasury ATA. Used once during the mint-on-claim migration to torch the unallocated pre-mint surplus. Authority for the burn is the treasury PDA (signed via signer seeds). Does NOT touch treasury.packs_pool — that counter still represents the remaining cap on future round emissions.
- adminsigner
- config
- treasury
- packs_mintwritable
- treasury_token_accountwritable
- token_program
- amountu64
admin_claim
Admin forcibly claims a miner's unclaimed SOL + PACKS rewards to fee collector
- adminsignerwritable
- config
- authority
- minerwritable
- fee_collectorwritable
- treasury
- packs_mint
- treasury_token_accountwritable
- fee_collector_token_accountwritable
- token_program
admin_force_claim
Admin-only: distribute a miner's pending rewards_sol + rewards_packs directly to their wallet without requiring the user to sign. Used during the mint-on-claim migration to clear all pending entitlements before burning the treasury. Same payout mechanics as user-initiated claim() (drain treasury first, mint if exhausted); just no signer requirement.
- adminsignerwritable
- config
- minerwritable
- recipientwritable
- treasury
- packs_mintwritable
- treasury_token_accountwritable
- recipient_token_accountwritable
- system_program
- token_program
- associated_token_program
- rent
admin_unban
Admin unbans a wallet by closing their BanRecord
- adminsignerwritable
- config
- authority
- ban_recordwritable
auto_deploy
Auto-deploy for automation - called by executor on behalf of user
- executorsignerwritable
- authoritywritable
- config
- boardwritable
- roundwritable
- minerwritable
- automationwritable
- fee_collectorwritable
- ban_record
- system_program
automate
Create or update automation for auto-deploying
- authoritysignerwritable
- automationwritable
- executor
- system_program
- amount_per_tileu64
- executor_feeu64
- strategyu8
- tile_configu16
- depositu64
cancel_automation
Cancel automation and withdraw remaining balance
- authoritysignerwritable
- automationwritable
- system_program
checkpoint
Checkpoint a miner's rewards from a finished round
- signersignerwritable
- board
- roundwritable
- minerwritable
- system_program
claim
Claim all accumulated rewards (SOL + PACKS) in one transaction
- signersignerwritable
- minerwritable
- treasury
- packs_mintwritable
- treasury_token_accountwritable
- recipient_token_accountwritable
- system_program
- token_program
- associated_token_program
- rent
close_miner
Close miner account and return rent
- signersignerwritable
- minerwritable
- system_program
close_round
Close expired round and return rent + remaining funds
- signersignerwritable
- roundwritable
- rent_payerwritable
- system_program
create_first_round
Create the first round account - called after initialize
- payersignerwritable
- config
- board
- roundwritable
- system_program
create_metadata
Create token metadata - admin only, call once after initialize
- adminsignerwritable
- config
- treasury
- packs_mint
- metadatawritable
- token_metadata_program
- system_program
- namestring
- symbolstring
- uristring
deploy
Deploy SOL to selected tiles
- signersignerwritable
- config
- boardwritable
- roundwritable
- minerwritable
- fee_collectorwritable
- ban_record
- system_program
- amountu64
- tile_masku16
initialize
Initialize the program with config, board, treasury, and mint
- adminsignerwritable
- configwritable
- boardwritable
- treasurywritable
- packs_mint
- treasury_token_account
- system_program
- token_program
- associated_token_program
- rent
migrate_config
Migrate Config account from 73 → 81 bytes, adding packs_per_round field
- adminsignerwritable
- configwritable
- system_program
reset
Reset the round - admin only, provides random number
- adminsignerwritable
- config
- boardwritable
- roundwritable
- next_roundwritable
- treasurywritable
- fee_collectorwritable
- packs_mintwritable
- treasury_token_accountwritable
- motherlodewritable
- motherlode_token_accountwritable
- system_program
- token_program
- associated_token_program
- rent
- random_numberu64
set_admin
Set admin address - admin only
- adminsignerwritable
- configwritable
- new_adminpubkey
set_fee_collector
Set fee collector address - admin only
- adminsignerwritable
- configwritable
- new_fee_collectorpubkey
set_packs_per_round
Set packs_per_round - admin only
- adminsignerwritable
- configwritable
- amountu64
update_metadata
Update token metadata - admin only
- adminsignerwritable
- config
- packs_mint
- metadatawritable
- token_metadata_program
- namestring
- symbolstring
- uristring
Accounts 7
Automation
no fields
BanRecord
no fields
Board
no fields
Config
no fields
Miner
no fields
Round
no fields
Treasury
no fields
Types 7
Automationstruct
- authoritypubkey
- executorpubkey
- balanceu64
- amount_per_tileu64
- executor_feeu64
- strategyu8Strategy: 0 = Random, 1 = Preferred
- tile_configu16For Random: number of tiles (1-16). For Preferred: bitmask of tiles
- bumpu8
BanRecordstruct
- authoritypubkey
- bumpu8
Boardstruct
- round_idu64
- start_slotu64
- end_slotu64
- bumpu8
Configstruct
- adminpubkey
- fee_collectorpubkey
- bumpu8
- packs_per_roundu64
Minerstruct
- authoritypubkey
- deployed[u64; 16]
- cumulative[u64; 16]
- round_idu64
- checkpoint_idu64
- checkpoint_feeu64
- rewards_solu64
- rewards_packsu64
- lifetime_rewards_solu64
- lifetime_rewards_packsu64
- bumpu8
Roundstruct
- idu64
- deployed[u64; 16]
- count[u64; 16]
- winning_tileu8
- total_deployedu64
- total_winningsu64
- packs_rewardu64
- expires_atu64
- rent_payerpubkey
- bumpu8
Treasurystruct
- packs_poolu64
- total_packs_issuedu64
- bumpu8
Errors 17
- 6000InvalidRoundInvalid round
- 6001RoundNotActiveRound is not active
- 6002RoundNotEndedRound has not ended
- 6003NoTilesSelectedNo tiles selected
- 6004NotCheckpointedMiner has not checkpointed previous round
- 6005UnauthorizedUnauthorized
- 6006NothingToClaimNothing to claim
- 6007UnclaimedRewardsMust claim rewards before closing
- 6008BufferPeriodBuffer period active - wait for checkpointing to complete
- 6009InsufficientBalanceInsufficient balance
- 6010InvalidStrategyInvalid automation strategy
- 6011RoundNotExpiredRound has not expired yet
- 6012BannedAccount is banned
- 6013AlreadyMigratedConfig already migrated
- 6014AmountTooSmallDeploy amount per tile is below the minimum
- 6015RentExemptViolationAutomation balance would drop below rent-exempt minimum
- 6016WinningsOutstandingRound still holds unclaimed winnings; cannot close
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.
Tractioni
Code familyi
The recordi
| Event | When | Detail | Receipt |
|---|---|---|---|
| UPGRADE | 2d ago | slot 432,140,155 | poll…0155 |
| UPGRADE | 2d ago | slot 432,131,301 | poll…1301 |
| DEPLOY | 2d ago | slot 432,130,767 | poll…0767 |
| SIBLING DEPLOY | 3d ago | portfolio | same code, fresh id |
| SIBLING DEPLOY | 3d ago | Collateral Program | same code, fresh id |