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.
Security.txti
What's a security.txt?
A block of contact info a developer embeds directly in the program binary — the Neodyme convention — so whitehats know how to report a vulnerability.
It carries contacts, a disclosure policy, auditors, and a source link. It's self-declared, so treat it as a claim, not proof — but its presence signals a team that expects scrutiny and wants to be reachable.
Convictioni
Interface — the on-chain IDLi
3 of 13 instructions used · 10 never called in this window
Instructions 13
initialize
- adminsignerwritable
- systemProgram
- configurationwritable
- tokenMetadataswritable
- oracleTwapswritable
- oraclePriceswritable
- oracleMappingswritable
- feedNamestring
refreshPriceList
- oraclePriceswritable
- oracleMappings
- oracleTwapswritable
- instructionSysvarAccountInfo
- tokensVec<u16>
refreshChainlinkPrice
- usersigner
- oraclePriceswritable
- oracleMappings
- oracleTwapswritable
- verifierAccount
- accessController
- configAccount
- verifierProgramId
- tokenu16
- serializedChainlinkReportbytes
refreshPythLazerPrice
IMPORTANT: we assume the tokens passed in to this ix are in the same order in which they are found in the message payload. Thus, we rely on the client to do this work
- usersignerwritable
- oraclePriceswritable
- oracleMappings
- oracleTwapswritable
- pythProgram
- pythStorage
- pythTreasurywritable
- systemProgram
- instructionsSysvar
- tokensVec<u16>
- serializedPythMessagebytes
- ed25519InstructionIndexu16
updateMappingAndMetadata
- adminsigner
- configuration
- oracleMappingswritable
- tokensMetadatawritable
- oraclePriceswritable
- oracleTwapswritable
- feedNamestring
- updatesVec<UpdateOracleMappingAndMetadataEntriesWithId>
resetTwap
- adminsigner
- configuration
- oracleTwapswritable
- instructionSysvarAccountInfo
- tokenu64
- feedNamestring
setAdminCached
- adminsigner
- configurationwritable
- newAdminpublicKey
- feedNamestring
approveAdminCached
- adminCachedsigner
- configurationwritable
- feedNamestring
createMintMap
- adminsignerwritable
- configuration
- mappingswritable
- systemProgram
- seedPkpublicKey
- seedIdu64
- bumpu8
- scopeChainsVec<[u16; 4]>
closeMintMap
- adminsignerwritable
- configuration
- mappingswritable
- systemProgram
resumeChainlinkxPrice
- adminsigner
- configuration
- oraclePriceswritable
- oracleMappings
- tokensMetadata
- tokenu16
- feedNamestring
freezePrice
- authoritysigner
- configuration
- oracleMappingswritable
- tokenu16
- feedNamestring
- freezebool
setEmergencyCouncil
- adminsigner
- configurationwritable
- newEmergencyCouncilpublicKey
- feedNamestring
Accounts 6
Configurationstruct
- adminpublicKey
- oracleMappingspublicKey
- oraclePricespublicKey
- tokensMetadatapublicKey
- oracleTwapspublicKey
- adminCachedpublicKey
- emergencyCouncilpublicKey
- padding[u64; 1251]
MintsToScopeChainsstruct
- oraclePricespublicKey
- seedPkpublicKey
- seedIdu64
- bumpu8
- mappingVec<MintToScopeChain>
OracleMappingsstruct
- priceInfoAccounts[publicKey; 512]
- priceTypes[u8; 512]
- twapSourceOrRefPriceToleranceBps[u16; 512]
- twapEnabledBitmask[TwapEnabledBitmask; 512]
- refPrice[u16; 512]
- generic[[u8; 20]; 512]
OraclePricesstruct
- oracleMappingspublicKey
- prices[DatedPrice; 512]
OracleTwapsstruct
- oraclePricespublicKey
- oracleMappingspublicKey
- twaps[EmaTwap; 512]
TokenMetadatasstruct
- metadatasArray[TokenMetadata; 512]
Types 37
UpdateOracleMappingAndMetadataEntriesWithIdstruct
- entryIdu16
- updatesVec<UpdateOracleMappingAndMetadataEntry>
CappedFlooredDatastruct
- sourceEntryu16
- capEntryOption<u16>
- floorEntryOption<u16>
CappedMostRecentOfDatastruct
- sourceEntries[u16; 4]
- maxDivergenceBpsu16
- sourcesMaxAgeSu64
- capEntryu16
V3struct
- confidenceFactoru32
V8V10struct
- marketStatusBehaviorMarketStatusBehavior
ChainlinkStandardPriceDatastruct
- observationsTimestampu64
ChainlinkXPriceDatastruct
- observationsTimestampu64
- suspendedbool
- activationDateTimeu64
ConditionalDatastruct
- conditionu8
- toleranceBpsu16
- sources[u16; 3]Extension-prone source list is stored last so future versioned layouts can add more sources without shifting earlier scalar fields.
DiscountToMaturityDatastruct
- discountPerYearBpsu16
- maturityTimestampi64
MostRecentOfDatastruct
- sourceEntries[u16; 4]
- maxDivergenceBpsu16
- sourcesMaxAgeSu64
Feestruct
- basisPointsu32
LiqPoolstruct
- lpMintpublicKey
- lpMintAuthorityBumpSeedu8
- solLegBumpSeedu8
- msolLegAuthorityBumpSeedu8
- msolLegpublicKey
- lpLiquidityTargetu64Liquidity target. If the Liquidity reach this amount, the fee reaches lp_min_discount_fee
- lpMaxFeeFeeLiquidity pool max fee
- lpMinFeeFeeSOL/mSOL Liquidity pool min fee
- treasuryCutFeeTreasury cut
- lpSupplyu64
- lentFromSolLegu64
- liquiditySolCapu64
Liststruct
- accountpublicKey
- itemSizeu32
- countu32
- newAccountpublicKey
- copiedCountu32
StakeSystemstruct
- stakeListList
- delayedUnstakeCoolingDownu64
- stakeDepositBumpSeedu8
- stakeWithdrawBumpSeedu8
- slotsForStakeDeltau64set by admin, how much slots before the end of the epoch, stake-delta can start
- lastStakeDeltaEpochu64Marks the start of stake-delta operations, meaning that if somebody starts a delayed-unstake ticket after this var is set with epoch_num the ticket will have epoch_created = current_epoch+1 (the user must wait one more epoch, because their unstake-delta will be execute in this epoch)
- minStakeu64
- extraStakeDeltaRunsu32can be set by validator-manager-auth to allow a second run of stake-delta to stake late stakers in the last minute of the epoch so we maximize user's rewards
ValidatorSystemstruct
- validatorListList
- managerAuthoritypublicKey
- totalValidatorScoreu32
- totalActiveBalanceu64sum of all active lamports staked
- autoAddValidatorEnabledu8allow & auto-add validator when a user deposits a stake-account of a non-listed validator
Statestruct
- msolMintpublicKey
- adminAuthoritypublicKey
- operationalSolAccountpublicKey
- treasuryMsolAccountpublicKey
- reserveBumpSeedu8
- msolMintAuthorityBumpSeedu8
- rentExemptForTokenAccu64
- rewardFeeFee
- stakeSystemStakeSystem
- validatorSystemValidatorSystem
- liqPoolLiqPool
- availableReserveBalanceu64
- msolSupplyu64
- msolPriceu64
- circulatingTicketCountu64count tickets for delayed-unstake
- circulatingTicketBalanceu64total lamports amount of generated and not claimed yet tickets
- lentFromReserveu64
- minDepositu64
- minWithdrawu64
- stakingSolCapu64
- emergencyCoolingDownu64
MultiplicationChainDatastruct
- sourceEntries[u16; 6]
- sourcesMaxAgeSu64
PythLazerDatastruct
- feedIdu16
- exponentu8
- confidenceFactoru32
- emaEnabledbool
- emaConfidenceFactoru32
PythLazerEmaRefDatastruct
- sourceEntryu16Token index of the source `PythLazer` entry to read the EMA from.
PythLazerStoredDatastruct
- spotFeedUpdateTimestampUsu64
- emaPriceValueu64
- emaFeedUpdateTimestampUsu64
Pricestruct
- valueu64
- expu64
DatedPricestruct
- pricePrice
- lastUpdatedSlotu64
- unixTimestampu64
- genericData[u8; 24]
MintToScopeChainstruct
- mintpublicKey
- scopeChain[u16; 4]
EmaTwapstruct
- lastUpdateSlotu64
- lastUpdateUnixTimestampu64
- currentEma1hu128
- updatesTracker1hu64The sample tracker is a 64 bit number where each bit represents a point in time.
- updatesTracker7du64
- currentEma8hu128
- currentEma24hu128
- updatesTracker8hu64
- updatesTracker24hu64
- currentEma7du128
- padding1[u128; 35]
TwapEnabledBitmaskstruct
- bitmasku8
TokenMetadatastruct
- name[u8; 32]
- maxAgePriceSlotsu64
- groupIdsBitsetu64
- reserved[u64; 15]
UpdateOracleMappingAndMetadataEntryenum
- RemoveEntry
- MappingConfig
- MappingTwapEntry
- MappingTwapEnabledBitmask
- MappingRefPrice
- MetadataName
- MetadataMaxPriceAgeSlots
- MetadataGroupIdsBitset
ReportDataMarketStatusenum
- Unknown
- Closed
- Open
MarketStatusBehaviorenum
- AllUpdates
- Open
- OpenAndPrePost
ReportDataV9RipcordFlagenum
- Normal
- Paused
PriceUpdateResultenum
- Updated
- SuspendExistingPrice
Conditionenum
- Gt
- Gte
- Lt
- Lte
- Eq
- Neq
- WithinRangeAbs
- OutsideRangeAbs
- WithinRangeBps
- OutsideRangeBps
- NonZero
TokenTypesenum
- TokenA
- TokenB
RefPriceToleranceOrTwapSourceenum
- None
- RefPriceToleranceBps
- TwapSource
EmaTypeenum
- Ema1h
- Ema8h
- Ema24h
- Ema7d
OracleTypeenum
- Unused
- DeprecatedPlaceholder1
- DeprecatedPlaceholder2
- DeprecatedPlaceholder3
- DeprecatedPlaceholder4
- SplStake
- KToken
- DeprecatedPlaceholder5
- MsolStake
- KTokenToTokenA
- KTokenToTokenB
- JupiterLpFetch
- ScopeTwap1h
- OrcaWhirlpoolAtoB
- OrcaWhirlpoolBtoA
- RaydiumAmmV3AtoB
- RaydiumAmmV3BtoA
- DeprecatedPlaceholder6
- MeteoraDlmmAtoB
- MeteoraDlmmBtoA
- DeprecatedPlaceholder7
- PythPull
- PythPullEMA
- FixedPrice
- SwitchboardOnDemand
- JitoRestaking
- Chainlink
- DiscountToMaturity
- MostRecentOf
- PythLazer
- RedStone
- AdrenaLp
- Securitize
- CappedFloored
- ChainlinkRWA
- ChainlinkNAV
- FlashtradeLp
- ChainlinkX
- ChainlinkExchangeRate
- CappedMostRecentOf
- ScopeTwap8h
- ScopeTwap24h
- ScopeTwap7d
- MultiplicationChain
- SplBalance
- StakedSolBalance
- TotalMintSupply
- Conditional
- PythLazerEMA
ScopeChainErrorenum
- PriceChainTooLong
- PriceChainConversionFailure
- NoChainForToken
- InvalidPricesInChain
- MathOverflow
- IntegerConversionOverflow
Errors 73
- 6000IntegerOverflowInteger overflow
- 6001ConversionFailureConversion failure
- 6002MathOverflowMathematical operation with overflow
- 6003OutOfRangeIntegralConversionOut of range integral conversion attempted
- 6004UnexpectedAccountUnexpected account in instruction
- 6005PriceNotValidPrice is not valid
- 6006AccountsAndTokenMismatchThe number of tokens is different from the number of received accounts
- 6007BadTokenNbThe token index received is out of range
- 6008BadTokenTypeThe token type received is invalid
- 6009SwitchboardV2ErrorThere was an error with the Switchboard V2 retrieval
- 6010InvalidAccountDiscriminatorInvalid account discriminator
- 6011UnableToDeserializeAccountUnable to deserialize account
- 6012BadScopeChainOrPricesError while computing price with ScopeChain
- 6013RefreshInCPIRefresh price instruction called in a CPI
- 6014RefreshWithUnexpectedIxsRefresh price instruction preceded by unexpected ixs
- 6015InvalidUpdateSequenceOrAccountsInvalid update sequence or accounts
- 6016UnableToDerivePDAUnable to derive PDA address
- 6017BadTimestampInvalid timestamp
- 6018BadSlotInvalid slot
- 6019PriceAccountNotExpectedReceived a price account when none is expected
- 6020TwapSourceIndexOutOfRangeTWAP source index out of range
- 6021TwapSampleTooFrequentTWAP sample is too close to the previous one
- 6022UnexpectedJlpConfigurationUnexpected JLP configuration
- 6023TwapNotEnoughSamplesInPeriodNot enough price samples in period to compute TWAP
- 6024EmptyTokenListThe provided token list to refresh is empty
- 6025StakeFeeTooHighThe stake pool fee is higher than the maximum allowed
- 6026KTokenUnderlyingPriceNotValidCannot get a valid price for the tokens composing the Ktoken
- 6027KTokenHoldingsCalculationErrorError while computing the Ktoken pool holdings
- 6028CannotResizeAccountCannot resize the account we only allow it to grow in size
- 6029FixedPriceInvalidThe provided fixed price is invalid
- 6030SwitchboardOnDemandErrorSwitchboard On Demand price derive error
- 6031ConfidenceIntervalCheckFailedConfidence interval check failed
- 6032InvalidGenericDataInvalid generic data
- 6033NoChainlinkReportDataNo valid Chainlink report data found
- 6034InvalidChainlinkReportDataInvalid Chainlink report data format
- 6035OracleConfigInvalidSourceIndicesOracle config must contain at least one valid source index
- 6036MostRecentOfInvalidMaxDivergenceInvalid max divergence (bps) for MostRecentOf oracle
- 6037CompositeOracleInvalidMaxAgeInvalid max age (s) for composite oracle
- 6038CompositeOracleMaxAgeViolatedMax age constraint violated for composite oracle
- 6039MostRecentOfMaxDivergenceBpsViolatedMax divergence bps constraint violated for MostRecentOf oracle
- 6040PythLazerVerifyIxFailedThe invoked pyth lazer verify instruction failed
- 6041PythLazerInvalidFeedIDInvalid feed id passed in to PythLazer oracle
- 6042PythLazerInvalidExponentInvalid exponent passed in to PythLazer oracle
- 6043PythLazerInvalidConfidenceFactorInvalid confidence factor passed in to PythLazer oracle
- 6044PythLazerInvalidMessagePayloadReceived an invalid message payload in the PythLazer oracle when refreshing price
- 6045PythLazerInvalidChannelReceived an invalid channel in the PythLazer payload when refreshing price
- 6046PythLazerInvalidFeedsLengthPayload should have a single feed in the PythLazer payload when refreshing price
- 6047PythLazerInvalidFeedIdInvalid feed id in the PythLazer payload when refreshing price
- 6048PythLazerPriceNotPresentProperty fields in the feed of the PythLazer payload do not contain a price
- 6049PythLazerBestBidPriceNotPresentProperty fields in the feed of the PythLazer payload do not contain a best bid price
- 6050PythLazerBestAskPriceNotPresentProperty fields in the feed of the PythLazer payload do not contain a best ask price
- 6051PythLazerInvalidAskBidPricesInvalid ask/bid prices provided in the feed of the PythLazer payload
- 6052ExpectedPriceAccountPrice account expected when updating mapping
- 6053WrongAccountOwnerProvided account has a different owner than expected
- 6054CompositeOracleInvalidSourceIndexProvided source index is invalid
- 6055CappedFlooredBothCapAndFloorAreNoneCan't set both cap and floor to None for CappedFloored oracle
- 6056MissingPriceAccountMissing price account for Oracle Mapping update
- 6057ChainlinkXPriceNotSuspendedCannot resume a ChainlinkX price that was not suspended
- 6058OutsideMarketHoursPrice update rejected as outside of market hours
- 6059PythLazerExponentNotPresentProperty fields in the feed of the PythLazer payload do not contain an exponent
- 6060PythLazerUnexpectedExponentThe exponent provided in the feed of the PythLazer payload is not the expected one
- 6061InvalidConversionToEmaTypeForOracleTypeCannot convert oracle type to EMA type
- 6062TwapEnabledBitmaskConversionFailureInvalid TWAP enabled bitmask value
- 6063OperationNotSupportedThis operation is not supported
- 6064TwapSourceIndexNotSetTWAP source index not set
- 6065PythLazerFeedUpdateTimestampNotPresentProperty fields in the feed of the PythLazer payload do not contain a feed update timestamp
- 6066PriceFrozenCannot update a frozen price entry
- 6067PriceAlreadyFrozenPrice entry is already frozen
- 6068PriceNotFrozenPrice entry is not frozen
- 6069UnauthorizedFreezeSigner is not authorized to freeze/unfreeze
- 6070PythLazerEmaPriceNotPresentProperty fields in the feed of the PythLazer payload do not contain an EMA price
- 6071PythLazerEmaConfidenceNotPresentProperty fields in the feed of the PythLazer payload do not contain an EMA confidence
- 6072PythLazerEmaNotEnabledOnSourcePythLazerEMA source entry does not have EMA enabled
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.
3 of 13 instructions used · 10 never called in this window
Tractioni
The recordi
| Event | When | Detail | Receipt |
|---|---|---|---|
| DEPLOY | 3d ago | slot 432,013,062 | poll…3062 |