Skip to content

Solana checks ​

What @bluprynt/sdk-chain-solana checks, step by step. For background, see the Solana page. For the report format, see Reading the report.

Methods ​

MethodCheckReads chain state
signature / solana_rawThe Ed25519 signature over the UTF-8 message verifies for the wallet's public keyNo
signature / solana_offchain_v0The signature verifies over the message wrapped in the legacy Solana off-chain message format (the format the Solana CLI signs)No
signature with no schemeTries both formats and notes which one matchedNo
admin_manualNot re-checkable. Reported as unverifiable—

Other signature schemes, contract signatures and transfers are not supported on Solana and are reported as unverifiable (see transfer proofs).

Authorities ​

  • mint_authority: the mint account's mint authority is the authority's address.
  • freeze_authority: the mint account's freeze authority is the authority's address.
  • Multisig: when the authority's account_type is "multisig", the SDK reads the SPL Token multisig account. It takes the first n signers, the slots in use, and compares them with the claimed signers as a set, so order doesn't matter. The threshold m is compared only when the claim has one.

Mint and multisig accounts can belong to SPL Token or Token-2022. Only the base mint's mint and freeze authorities are read. Token-2022 extensions, such as a permanent delegate or a transfer hook, are not checked. Squads vaults and other PDA authorities are not SPL Token multisigs and are not supported (see Solana quirks). An account owned by another program, an account that isn't a token mint, or one that isn't a token multisig fails the check. Other authority types are reported as unverifiable with no Solana check for <type>. If such an authority is a multisig, its signers and threshold are still read at "now": a mismatch makes it invalid, a match leaves it unverifiable. Otherwise it needs no RPC.

Steps ​

The steps the Solana checker can report. Their names are exact.

StepWhere
wallet is the authority or one of its signersproof
solana_raw signature verifies for walletproof and "now"
solana_offchain_v0 signature verifies for walletproof and "now"
signature verifies for wallet (scheme not recorded, matched solana_raw)proof and "now", when scheme is null. Ends in solana_offchain_v0 when that format matched
signature verifies for wallet (scheme not recorded)Same, when neither format matched
verification's authority is listed for the tokenproof, from verifyKyiToken and verifyKyiResponse
multisig account exists"now" (multisig authorities)
multisig is owned by a token program"now" (multisig authorities)
account is a token multisig"now" (multisig authorities)
multisig signers match claimed signers"now" (multisig authorities)
multisig threshold"now" (multisig authorities with a threshold)
mint account exists"now" (mint_authority, freeze_authority)
mint is owned by a token program"now" (mint_authority, freeze_authority)
account is a token mint"now" (mint_authority, freeze_authority)
mint authority"now" (mint_authority)
freeze authority"now" (freeze_authority)

Reasons ​

A failed step makes the result invalid with the reason <step> failed. These reasons leave a result unverifiable:

reasonWhen
proof material missingNo message or signature
signature:<scheme> is not supported on SolanaA signature with a non-Solana scheme
<method> is not supported on SolanaContract signatures and transfers, such as transfer:memo is not supported on Solana
admin_manual is not part of the public trust modeladmin_manual verifications
Solana RPC cannot read historical account stateAny moment other than "now", for verifications and for the authorities the SDK can check
no Solana check for <type>Authorities other than mint_authority and freeze_authority

Reasons from the SDK core apply on every chain. They're listed in Reading the report.

How a moment is read ​

Solana answers only "now". A Solana RPC can't read account state as of a past slot, so at every other moment, verifications and the authorities it can check are unverifiable with the reason Solana RPC cannot read historical account state. This applies to signature verifications too: the verification check itself skips past moments, even though a signature needs no chain state. It's a limit of the chain: the SDK can't tell either way.

At "now", the SDK reads accounts with getAccountInfo, at confirmed commitment, the default of Kit's createSolanaRpc. A result read on-chain has a position with the slot. A multisig mint or freeze authority reads two accounts, the multisig and the mint. They may be served from different slots. position.slot is the slot of the first read, the multisig account.