{ "file": "docs/SPL_MEMO_MATRIX.json", "version": 10, "matrixVersion": 4, "scope": "SPL Memo v1, v3 et v4", "bot3Migration": { "decoderModule": "kb_lib::decoder::spl::memo", "publicDecoder": "kb_lib::SplMemoDecoder", "decoderStatus": "ported_in_0.1.0-pre.005", "publicMaterializer": "kb_lib::TransactionAnnotationMaterializer", "materializerStatus": "ported_in_0.1.0-pre.011", "executorStatus": "pending_later_tranche" }, "interface": { "crate": "spl-memo-interface", "requestedVersion": "^2.1", "auditedPublishedVersion": "2.1.0", "lockfilePresentInInputArchive": false, "builder": "spl_memo_interface::instruction::build_memo", "builderAcceptsExplicitProgramId": true, "wire": "octets exacts du message, sans préfixe ni discriminator", "accountMetas": "ordre fourni, readonly, signer=true" }, "generations": [ { "generation": "v1", "programId": "Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo", "surfaceCode": "spl_memo_v1", "status": "historique immuable", "instructionData": "octets UTF-8 bruts", "emptyPayload": "accepte", "accounts": "acceptes mais ignores par le runtime v1", "signerRequirement": "aucune", "accountOrder": "sans effet runtime mais conserve par le decodeur", "duplicateAccounts": "sans effet runtime mais conserves par le decodeur", "runtimeLogs": [], "utf8Failure": "InvalidInstructionData", "builderOfficial": "builder generique 2.1.0 avec program ID v1 explicite", "currentInvocation": { "mainnet": "transactions reelles observees et rejouees; aucun envoi execute dans cette tranche", "devnet": "non verifie", "localnet": "binaire historique non embarque" }, "realCorpusSignatures": [ "imGSCgR83S3tFPTcZPqWLWRcL1piFX1vkYMRVsRdJeBM4p7viDb4V6Hq2x51ovTmbMgGBMdn8kyeNiAg9Ph6MfE", "65J2cmiZAB5h7B3kyzhponNZQzMCbbxVn1A8cydvKKq1FYxYLEarG7ydjuuxFatXCG7Foju21XMUdRkT96jYBS3C" ] }, { "generation": "v3", "programId": "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr", "surfaceCode": "spl_memo_v3", "status": "historique encore largement observe", "instructionData": "octets UTF-8 bruts", "emptyPayload": "accepte", "accounts": "zero ou plusieurs; chaque compte fourni doit etre signer", "signerRequirement": "tous les comptes fournis", "accountOrder": "ordre de parcours et de logs conserve", "duplicateAccounts": "parcourus et journalises dans leur ordre; aucun rejet dedie", "runtimeLogs": [ "Signed by pour chaque compte signer", "Invalid UTF-8, from byte en cas d'erreur", "Memo (len ): en cas de succes" ], "utf8Failure": "InvalidInstructionData", "missingSignerFailure": "MissingRequiredSignature avant validation UTF-8", "builderOfficial": "builder generique 2.1.0 avec program ID v3 explicite", "currentInvocation": { "mainnet": "transactions reelles observees et rejouees; aucun envoi execute dans cette tranche", "devnet": "non verifie", "localnet": "possible avec binaire officiel, non execute" }, "realCorpusSignatures": [ "2DkiJJVAyJ1aJHn2ff8JhKA5C8wbakw76LZvgxmcQ1qtHNDprGvA6TntXXK5FSAeRMZyrDt8ujAkGMgBVcEhjsmT", "3G18ZUSP29Aw12NwnAYRYgix87fa559nMzaBa3LSkCQZjJ5AYEjSDnQHLbgU3QZax2efmeJHdxu1LamSCxCJzg37" ] }, { "generation": "v4", "programId": "Memo4c2pN8afCj432Lb7RMVKi9PbQnnW7ewFFaV3oAH", "surfaceCode": "spl_memo_v4", "status": "generation courante publiee avec implementation Pinocchio", "instructionData": "octets UTF-8 bruts", "emptyPayload": "accepte", "accounts": "zero ou plusieurs; chaque compte fourni doit etre signer", "signerRequirement": "tous les comptes fournis", "accountOrder": "ordre de parcours et de logs conserve", "duplicateAccounts": "aucun rejet dedie prouve; ordre et doublons conserves", "runtimeLogs": [ "signataires puis diagnostic UTF-8 ou memo selon l'implementation officielle" ], "utf8Failure": "InvalidInstructionData", "missingSignerFailure": "MissingRequiredSignature avant validation UTF-8", "builderOfficial": "builder generique 2.1.0 avec program ID v4 explicite", "currentInvocation": { "mainnet": "transactions reelles observees et rejouees; aucun envoi execute dans cette tranche", "devnet": "simulation et trois executions v4 confirmees avec post-validation complete le 2026-07-15", "localnet": "binaire officiel disponible, non execute" }, "realCorpusSignatures": [ "2vgR56q2NR6ehu1uNnpt3te3RqhX2sXryXi4SpBHKUyVaeERr1HLYSLvDFRzd3eDeNejjLX9hVZJZ5GvtsTtBr1c", "53aHhj6rt77hCkadHedpWS7GstdER5XqQrHDutZ7gAQrDvAxcDcktrUtwxZcCbTV2FnLzELqfwoJgvabjdLPWkQ5", "3NxmPdF9W3GBiD8qF2VzvUhEDrTM48EEkaosTtzVceRhQc4sGEojDFppBsXYgqK9GCrCUo4wzAWciprsqZEmRyee", "2njzDJUBar6TTPPcuwEDdkiW8kVLUsZXfdvUQNP7TC6La44E4kZtLFfdJ1Q8nPNJbKa9Vuby4TtiuLX2rQQTa65C" ] } ], "decoderContract": { "maximumRetainedPayloadBytes": 4096, "diagnosticHexPrefixBytes": 32, "completeTextRetainedWhenUtf8Valid": true, "failedTransactionRuntimeValidation": "not_proven_transaction_failed", "failedTransactionCommitted": false, "unknownProgramProducesObservation": false }, "materializationContract": { "crate": "kb-lib", "component": "materializer.transaction.annotations", "processorName": "transaction_annotations", "materializedFamily": "transaction_annotation", "acceptedEntries": ["add_memo", "memo_intent", "invalid_memo_attempt"], "projectedEntry": "add_memo", "transactionPolicy": "SuccessfulCommittedOnly", "failedOrUncommittedOutput": false, "store": "kb_sol_mat_events", "newMigrationRequired": false, "idempotence": "ledger processor/version/input hash plus deterministic output key", "readModel": { "contract": "DecodePipelineStore.list_materialized_events", "demo": "demo_decode_replay transaction annotation journal", "boundedMaximumRows": 500, "filters": ["processor exact", "family exact", "partial signature"], "visualization": "table journal, not OHLC" }, "decodedOnlyFields": [ "complete accounts and writable flags", "payload hex diagnostic prefix", "UTF-8 error offset", "transaction error", "decoder proof" ] }, "executorContract": { "crate": "kb_executor_spl_memo", "operationCode": "spl_memo.add_memo", "typedIntent": "SplMemoExecutionIntent", "officialBuilder": "spl_memo_interface::instruction::build_memo", "supportedGenerations": ["v4"], "decodeOnlyGenerations": ["v1", "v3"], "maximumMessageBytes": 566, "maximumSignerOccurrences": 32, "preserveSignerOrderAndDuplicates": true, "inventWritableAccounts": false, "requestedSpendLamports": 0, "simulationRequired": true, "dryRunDefault": true, "allClustersConstructible": true, "historicalGenerationSendEnabled": false, "mainnetSendGovernedByCommonPolicy": true, "clusterAvailabilityProvenBySimulation": true, "demoCluster": "devnet", "demoGeneration": "v4", "postExecutionValidation": [ "canonical_insert", "core_extraction", "memo_decode_replay", "transaction_annotation_materialization" ] }, "requiredCorpusCases": [ "empty_payload", "ascii", "unicode_multibyte", "near_practical_transaction_limit", "invalid_utf8", "zero_signer", "one_signer", "multiple_signers", "non_signer_account", "duplicate_accounts", "additional_writable_account", "outer_instruction", "inner_instruction", "successful_transaction", "failed_transaction", "malformed_base64", "payload_over_decoder_limit" ], "mainnetReplayValidation": { "date": "2026-07-14", "acquisition": { "programCampaigns": 3, "canonicalTransactionsInserted": 300, "missingTransactions": 0 }, "coreExtraction": { "selected": 300, "extracted": 300, "failed": 0 }, "generations": [ { "generation": "v1", "decodedInstructions": 102, "materializedAnnotations": 69, "refusedUncommittedIntents": 33 }, { "generation": "v3", "decodedInstructions": 439, "materializedAnnotations": 422, "refusedUncommittedIntents": 17, "secondNonForcedReplaySelected": 0 }, { "generation": "v4", "decodedInstructions": 100, "materializedAnnotations": 100, "refusedUncommittedIntents": 0 } ], "decodeFailures": 0, "unmatchedInstructions": 0, "operationalErrorLogEntries": 0 }, "devnetExecutionValidation": { "date": "2026-07-15", "generation": "v4", "programId": "Memo4c2pN8afCj432Lb7RMVKi9PbQnnW7ewFFaV3oAH", "simulationOnlyValidated": true, "submittedTransactions": 3, "confirmedTransactions": 3, "canonicalTransactionsInserted": 3, "coreTransactionsExtracted": 3, "decodedInstructions": 3, "materializedAnnotations": 3, "annotationPayloadLengthBytes": 34, "secondReplaySkipped": 3, "secondReplayNewMaterializedOutputs": 0, "decodeFailures": 0, "materializationRefusals": 0, "signatures": [ "53aHhj6rt77hCkadHedpWS7GstdER5XqQrHDutZ7gAQrDvAxcDcktrUtwxZcCbTV2FnLzELqfwoJgvabjdLPWkQ5", "3NxmPdF9W3GBiD8qF2VzvUhEDrTM48EEkaosTtzVceRhQc4sGEojDFppBsXYgqK9GCrCUo4wzAWciprsqZEmRyee", "2njzDJUBar6TTPPcuwEDdkiW8kVLUsZXfdvUQNP7TC6La44E4kZtLFfdJ1Q8nPNJbKa9Vuby4TtiuLX2rQQTa65C" ] }, "sources": [ { "kind": "official_interface_source", "url": "https://docs.rs/spl-memo-interface/2.1.0/src/spl_memo_interface/instruction.rs.html" }, { "kind": "official_interface_ids", "url": "https://docs.rs/spl-memo-interface/2.1.0/src/spl_memo_interface/lib.rs.html" }, { "kind": "official_v1_historical_source", "url": "https://github.com/solana-program/memo/commit/479839141a99b7d0c3a35bc648c0fa1e4704ea3e" }, { "kind": "official_v3_published_source", "url": "https://docs.rs/spl-memo/3.0.0/src/spl_memo/processor.rs.html" }, { "kind": "official_current_source", "url": "https://github.com/solana-program/memo/blob/main/program/src/processor.rs" } ], "documentedLimitations": [ "v1 et v3 restent decodees depuis un corpus Mainnet reel et leur wire officiel reste audite, mais l'executeur les classe decode-only et ne construit que v4", "l'invocabilite Localnet depend du deploiement explicite du binaire de generation demande", "les differences de cout v3/v4 ne sont pas transformees en garantie statique; chaque plan reste soumis a la simulation et au plafond de frais" ] }