276 lines
11 KiB
JSON
276 lines
11 KiB
JSON
{
|
|
"file": "docs/SPL_MEMO_MATRIX.json",
|
|
"version": 11,
|
|
"matrixVersion": 4,
|
|
"scope": "SPL Memo v1, v3 et v4",
|
|
"bot3Migration": {
|
|
"decoderModule": "ks-lib/src/decoder/spl/memo",
|
|
"publicDecoder": "ks_lib::DcSplMemoDecoder",
|
|
"decoderStatus": "ported_in_0.1.0-pre.005",
|
|
"publicMaterializer": "ks_lib::MtTransactionAnnotationMaterializer",
|
|
"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 <pubkey> pour chaque compte signer",
|
|
"Invalid UTF-8, from byte <offset> en cas d'erreur",
|
|
"Memo (len <octets>): <texte> 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": "ks-lib",
|
|
"component": "materializer.transaction.annotations",
|
|
"processorName": "materializer.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-lib.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"
|
|
]
|
|
}
|