use super::{
DeterministicS3StorageAdaptor, ProofLogAdaptor, S3PutRequest, SolanaProofLogAdaptor,
StorageAdaptor,
};
use crate::envelope::{Attestation, PublishEnvelope};
use crate::solana::{attestor_key_ref, init_solana_client, LocalAttestorSigner, SolanaConfig};
fn publish() -> PublishEnvelope {
PublishEnvelope {
schema_version: "1.0.0".to_string(),
envelope_type: "publish".to_string(),
issued_at: "2026-01-01T00:00:00Z".to_string(),
subject_id: "publish-1".to_string(),
dataset_id: "sst".to_string(),
dataset_version: "v1".to_string(),
input_refs: vec!["obj://in".to_string()],
output_refs: vec!["obj://out".to_string()],
published_artifacts: vec![crate::checkpoint::CheckpointArtifact {
artifact_id: "artifact-1".to_string(),
content_root_hash: "0000000000000000000000000000000000000000000000000000000000000000"
.to_string(),
content_descriptor_ref: None,
content_descriptor_hash: None,
media_type: "application/vnd+zarr".to_string(),
}],
primary_artifact_id: "artifact-1".to_string(),
checkpoint_manifest_ref: "checkpoint://1".to_string(),
checkpoint_manifest_hash:
"0000000000000000000000000000000000000000000000000000000000000000".to_string(),
checkpoint_id: "checkpoint-1".to_string(),
checkpoint_log_root_hash:
"0000000000000000000000000000000000000000000000000000000000000000".to_string(),
lineage_refs: vec!["capture://1".to_string()],
verification_policy_id: "verify-default".to_string(),
attestations: vec![Attestation {
signer_id: "s".to_string(),
key_id: "k".to_string(),
signature: "sig".to_string(),
signed_at: "2026-01-01T00:00:00Z".to_string(),
}],
key_id: "key-1".to_string(),
stac_refs: vec![],
ogc_refs: vec![],
c2pa_manifest_ref: None,
c2pa_manifest_hash: None,
c2pa_ingredients: vec![],
c2pa_actions: vec![],
reward_context_ref: None,
reward_context_hash: None,
provenance_start_mode: "transport_capture".to_string(),
bootstrap_origin_label: None,
reward_eligible: false,
}
}
#[test]
fn deterministic_s3_storage_adaptor_puts_bytes() {
let adaptor = DeterministicS3StorageAdaptor::new("bucket-a", Some("photos"));
let stored = adaptor
.put_bytes(&S3PutRequest {
key: adaptor.build_key("artifact.bin"),
bytes: b"hello".to_vec(),
content_type: "application/octet-stream".to_string(),
})
.expect("store object");
assert_eq!(stored.uri, "s3://bucket-a/photos/artifact.bin");
assert_eq!(stored.byte_length, 5);
}
#[test]
fn solana_proof_log_adaptor_logs_and_verifies() {
let client = init_solana_client(&SolanaConfig {
cluster: "solana-testnet".to_string(),
program_id: "program-1".to_string(),
});
let attestor_pubkey = LocalAttestorSigner::from_seed([7u8; 32]).attestor_pubkey();
let adaptor =
SolanaProofLogAdaptor::new(client, [7u8; 32], &attestor_key_ref(&attestor_pubkey));
let env = publish();
let result = adaptor
.log_publish_proof(&env, "2026-01-01T00:01:00Z", 1700000000, [0u8; 32])
.expect("log proof");
adaptor
.verify_publish_proof(&env, &result.commitment)
.expect("verify proof");
}
#[test]
fn solana_proof_log_adaptor_debug_redacts_signing_seed() {
let client = init_solana_client(&SolanaConfig {
cluster: "solana-testnet".to_string(),
program_id: "program-1".to_string(),
});
let seed = [0x7au8; 32];
let attestor_pubkey = LocalAttestorSigner::from_seed(seed).attestor_pubkey();
let adaptor = SolanaProofLogAdaptor::new(client, seed, &attestor_key_ref(&attestor_pubkey));
let debug = format!("{adaptor:?}");
assert!(debug.contains("<redacted>"));
assert!(debug.contains(&hex::encode(attestor_pubkey)));
assert!(!debug.contains(&format!("{seed:?}")));
assert!(!debug.contains(&hex::encode(seed)));
}