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
| Method | Check | Reads chain state |
|---|---|---|
signature / solana_raw | The Ed25519 signature over the UTF-8 message verifies for the wallet's public key | No |
signature / solana_offchain_v0 | The signature verifies over the message wrapped in the legacy Solana off-chain message format (the format the Solana CLI signs) | No |
signature with no scheme | Tries both formats and notes which one matched | No |
admin_manual | Not 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_typeis"multisig", the SDK reads the SPL Token multisig account. It takes the firstnsigners, the slots in use, and compares them with the claimed signers as a set, so order doesn't matter. The thresholdmis 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.
| Step | Where |
|---|---|
wallet is the authority or one of its signers | proof |
solana_raw signature verifies for wallet | proof and "now" |
solana_offchain_v0 signature verifies for wallet | proof 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 token | proof, 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:
reason | When |
|---|---|
proof material missing | No message or signature |
signature:<scheme> is not supported on Solana | A signature with a non-Solana scheme |
<method> is not supported on Solana | Contract signatures and transfers, such as transfer:memo is not supported on Solana |
admin_manual is not part of the public trust model | admin_manual verifications |
Solana RPC cannot read historical account state | Any 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.